@@ -43,6 +43,7 @@ MLEBNodeFDLaplacian::setSigma (Array<Real,AMREX_SPACEDIM> const& a_sigma) noexce
4343void
4444MLEBNodeFDLaplacian::setSigma (int amrlev, MultiFab const & a_sigma)
4545{
46+ m_needs_update = true ;
4647 m_has_sigma_mf = true ;
4748 m_sigma_mf[amrlev][0 ] = std::make_unique<MultiFab>
4849 (this ->m_grids [amrlev][0 ], this ->m_dmap [amrlev][0 ], 1 , 1 , MFInfo{},
@@ -318,47 +319,7 @@ MLEBNodeFDLaplacian::prepareForSolve ()
318319#endif
319320
320321 if (m_has_sigma_mf) {
321- AMREX_D_TERM (m_sigma[0 ] = Real (1.0 );,
322- m_sigma[1 ] = Real (1.0 );,
323- m_sigma[2 ] = Real (1.0 ));
324- AMREX_ALWAYS_ASSERT (this ->m_num_amr_levels == 1 );
325- for (int amrlev = 0 ; amrlev < this ->m_num_amr_levels ; ++amrlev) {
326- for (int mglev = 1 ; mglev < this ->m_num_mg_levels [amrlev]; ++mglev) {
327- m_sigma_mf[amrlev][mglev] = std::make_unique<MultiFab>
328- (this ->m_grids [amrlev][mglev], this ->m_dmap [amrlev][mglev], 1 , 1 ,
329- MFInfo{}, *(this ->m_factory [amrlev][mglev]));
330- IntVect const ratio = (amrlev > 0 ) ? IntVect (2 )
331- : this ->mg_coarsen_ratio_vec [mglev-1 ];
332- #ifdef AMREX_USE_EB
333- amrex::EB_average_down
334- #else
335- amrex::average_down
336- #endif
337- (*m_sigma_mf[amrlev][mglev-1 ],
338- *m_sigma_mf[amrlev][mglev], 0 , 1 , ratio);
339- }
340-
341- for (int mglev = 0 ; mglev < this ->m_num_mg_levels [amrlev]; ++mglev) {
342- auto const & geom = this ->m_geom [amrlev][mglev];
343- auto & sigma = *m_sigma_mf[amrlev][mglev];
344- sigma.FillBoundary (geom.periodicity ());
345-
346- const Box& domain = geom.Domain ();
347- const auto lobc = LoBC ();
348- const auto hibc = HiBC ();
349-
350- MFItInfo mfi_info;
351- if (Gpu::notInLaunchRegion ()) { mfi_info.SetDynamic (true ); }
352- #ifdef AMREX_USE_OMP
353- #pragma omp parallel if (Gpu::notInLaunchRegion())
354- #endif
355- for (MFIter mfi (sigma, mfi_info); mfi.isValid (); ++mfi)
356- {
357- Array4<Real> const & sfab = sigma.array (mfi);
358- mlndlap_fillbc_cc<Real>(mfi.validbox (),sfab,domain,lobc,hibc);
359- }
360- }
361- }
322+ update_sigma ();
362323 }
363324}
364325
@@ -792,4 +753,65 @@ MLEBNodeFDLaplacian::postSolve (Vector<MultiFab*> const& sol) const
792753#endif
793754}
794755
756+ void
757+ MLEBNodeFDLaplacian::update ()
758+ {
759+ if (MLNodeLinOp::needsUpdate ()) {
760+ MLNodeLinOp::update ();
761+ }
762+
763+ if (m_needs_update && m_has_sigma_mf) {
764+ update_sigma ();
765+ }
766+ m_needs_update = false ;
767+ }
768+
769+ void
770+ MLEBNodeFDLaplacian::update_sigma ()
771+ {
772+ AMREX_D_TERM (m_sigma[0 ] = Real (1.0 );,
773+ m_sigma[1 ] = Real (1.0 );,
774+ m_sigma[2 ] = Real (1.0 ));
775+ AMREX_ALWAYS_ASSERT (this ->m_num_amr_levels == 1 );
776+ for (int amrlev = 0 ; amrlev < this ->m_num_amr_levels ; ++amrlev) {
777+ for (int mglev = 1 ; mglev < this ->m_num_mg_levels [amrlev]; ++mglev) {
778+ if (m_sigma_mf[amrlev][mglev] == nullptr ) {
779+ m_sigma_mf[amrlev][mglev] = std::make_unique<MultiFab>
780+ (this ->m_grids [amrlev][mglev], this ->m_dmap [amrlev][mglev], 1 , 1 ,
781+ MFInfo{}, *(this ->m_factory [amrlev][mglev]));
782+ }
783+ IntVect const ratio = (amrlev > 0 ) ? IntVect (2 )
784+ : this ->mg_coarsen_ratio_vec [mglev-1 ];
785+ #ifdef AMREX_USE_EB
786+ amrex::EB_average_down
787+ #else
788+ amrex::average_down
789+ #endif
790+ (*m_sigma_mf[amrlev][mglev-1 ],
791+ *m_sigma_mf[amrlev][mglev], 0 , 1 , ratio);
792+ }
793+
794+ for (int mglev = 0 ; mglev < this ->m_num_mg_levels [amrlev]; ++mglev) {
795+ auto const & geom = this ->m_geom [amrlev][mglev];
796+ auto & sigma = *m_sigma_mf[amrlev][mglev];
797+ sigma.FillBoundary (geom.periodicity ());
798+
799+ const Box& domain = geom.Domain ();
800+ const auto lobc = LoBC ();
801+ const auto hibc = HiBC ();
802+
803+ MFItInfo mfi_info;
804+ if (Gpu::notInLaunchRegion ()) { mfi_info.SetDynamic (true ); }
805+ #ifdef AMREX_USE_OMP
806+ #pragma omp parallel if (Gpu::notInLaunchRegion())
807+ #endif
808+ for (MFIter mfi (sigma, mfi_info); mfi.isValid (); ++mfi)
809+ {
810+ Array4<Real> const & sfab = sigma.array (mfi);
811+ mlndlap_fillbc_cc<Real>(mfi.validbox (),sfab,domain,lobc,hibc);
812+ }
813+ }
814+ }
815+ }
816+
795817}
0 commit comments