@@ -190,15 +190,15 @@ public:
190190 Array<FAB*,AMREX_SPACEDIM> const & flux,
191191 FAB const & sol, int face_only, int ncomp);
192192
193- protected:
194-
195- bool m_needs_update = true ;
196-
197193 RT m_a_scalar = std::numeric_limits<RT>::quiet_NaN();
198194 RT m_b_scalar = std::numeric_limits<RT>::quiet_NaN();
199195 Vector<Vector<MF> > m_a_coeffs;
200196 Vector<Vector<Array<MF,AMREX_SPACEDIM> > > m_b_coeffs;
201197
198+ protected:
199+
200+ bool m_needs_update = true ;
201+
202202 Vector<int > m_is_singular;
203203
204204 [[nodiscard]] bool supportRobinBC () const noexcept override { return true ; }
@@ -474,29 +474,29 @@ MLABecLaplacianT<MF>::applyMetricTermsCoeffs ()
474474// \tilde{alpha}_i = alpha_i + (1-B) beta_{i+1/2} / h^2
475475// \tilde{rhs}_i = rhs_i + A beta_{i+1/2} / h^2
476476//
477- template < typename MF>
478- void
479- MLABecLaplacianT<MF>:: applyRobinBCTermsCoeffs ()
477+ namespace detail {
478+ template < typename LP>
479+ void applyRobinBCTermsCoeffs (LP& linop )
480480{
481- if (!( this -> hasRobinBC ())) { return ; }
481+ using RT = typename LP::RT;
482482
483- const int ncomp = this -> getNComp ();
483+ const int ncomp = linop. getNComp ();
484484 bool reset_alpha = false ;
485- if (m_a_scalar == RT (0.0 )) {
486- m_a_scalar = RT (1.0 );
485+ if (linop. m_a_scalar == RT (0.0 )) {
486+ linop. m_a_scalar = RT (1.0 );
487487 reset_alpha = true ;
488488 }
489- const RT bovera = m_b_scalar/m_a_scalar;
489+ const RT bovera = linop. m_b_scalar /linop. m_a_scalar ;
490490
491- for (int amrlev = 0 ; amrlev < this -> m_num_amr_levels ; ++amrlev) {
491+ for (int amrlev = 0 ; amrlev < linop. NAMRLevels () ; ++amrlev) {
492492 const int mglev = 0 ;
493- const Box& domain = this -> m_geom [ amrlev][ mglev] .Domain ();
494- const RT dxi = static_cast <RT>(this -> m_geom [ amrlev][ mglev] .InvCellSize (0 ));
495- const RT dyi = static_cast <RT>((AMREX_SPACEDIM >= 2 ) ? this -> m_geom [ amrlev][ mglev] .InvCellSize (1 ) : Real (1.0 ));
496- const RT dzi = static_cast <RT>((AMREX_SPACEDIM == 3 ) ? this -> m_geom [ amrlev][ mglev] .InvCellSize (2 ) : Real (1.0 ));
493+ const Box& domain = linop. Geom ( amrlev, mglev) .Domain ();
494+ const RT dxi = static_cast <RT>(linop. Geom ( amrlev, mglev) .InvCellSize (0 ));
495+ const RT dyi = static_cast <RT>((AMREX_SPACEDIM >= 2 ) ? linop. Geom ( amrlev, mglev) .InvCellSize (1 ) : Real (1.0 ));
496+ const RT dzi = static_cast <RT>((AMREX_SPACEDIM == 3 ) ? linop. Geom ( amrlev, mglev) .InvCellSize (2 ) : Real (1.0 ));
497497
498498 if (reset_alpha) {
499- m_a_coeffs[amrlev][mglev].setVal (RT (0.0 ));
499+ linop. m_a_coeffs [amrlev][mglev].setVal (RT (0.0 ));
500500 }
501501
502502 MFItInfo mfi_info;
@@ -505,20 +505,20 @@ MLABecLaplacianT<MF>::applyRobinBCTermsCoeffs ()
505505#ifdef AMREX_USE_OMP
506506#pragma omp parallel if (Gpu::notInLaunchRegion())
507507#endif
508- for (MFIter mfi (m_a_coeffs[amrlev][mglev], mfi_info); mfi.isValid (); ++mfi)
508+ for (MFIter mfi (linop. m_a_coeffs [amrlev][mglev], mfi_info); mfi.isValid (); ++mfi)
509509 {
510510 const Box& vbx = mfi.validbox ();
511- auto const & afab = m_a_coeffs[amrlev][mglev].array (mfi);
511+ auto const & afab = linop. m_a_coeffs [amrlev][mglev].array (mfi);
512512 for (int idim = 0 ; idim < AMREX_SPACEDIM; ++idim) {
513- auto const & bfab = m_b_coeffs[amrlev][mglev][idim].const_array (mfi);
513+ auto const & bfab = linop. m_b_coeffs [amrlev][mglev][idim].const_array (mfi);
514514 const Box& blo = amrex::adjCellLo (vbx,idim);
515515 const Box& bhi = amrex::adjCellHi (vbx,idim);
516516 bool outside_domain_lo = !(domain.contains (blo));
517517 bool outside_domain_hi = !(domain.contains (bhi));
518518 if ((!outside_domain_lo) && (!outside_domain_hi)) { continue ; }
519519 for (int icomp = 0 ; icomp < ncomp; ++icomp) {
520- auto const & rbc = (*(this -> m_robin_bcval [amrlev]))[mfi].const_array (icomp*3 );
521- if (this -> m_lobc_orig [icomp][idim] == LinOpBCType::Robin && outside_domain_lo)
520+ auto const & rbc = (*(linop. m_robin_bcval [amrlev]))[mfi].const_array (icomp*3 );
521+ if (linop. m_lobc_orig [icomp][idim] == LinOpBCType::Robin && outside_domain_lo)
522522 {
523523 if (idim == 0 ) {
524524 RT fac = bovera*dxi*dxi;
@@ -546,7 +546,7 @@ MLABecLaplacianT<MF>::applyRobinBCTermsCoeffs ()
546546 });
547547 }
548548 }
549- if (this -> m_hibc_orig [icomp][idim] == LinOpBCType::Robin && outside_domain_hi)
549+ if (linop. m_hibc_orig [icomp][idim] == LinOpBCType::Robin && outside_domain_hi)
550550 {
551551 if (idim == 0 ) {
552552 RT fac = bovera*dxi*dxi;
@@ -579,6 +579,16 @@ MLABecLaplacianT<MF>::applyRobinBCTermsCoeffs ()
579579 }
580580 }
581581}
582+ } // namespace detail
583+
584+ template <typename MF>
585+ void
586+ MLABecLaplacianT<MF>::applyRobinBCTermsCoeffs ()
587+ {
588+ if (this ->hasRobinBC ()) {
589+ detail::applyRobinBCTermsCoeffs (*this );
590+ }
591+ }
582592
583593template <typename MF>
584594void
0 commit comments