@@ -38,7 +38,7 @@ ERF::create_random_perturbations(const int lev,
3838 [=] AMREX_GPU_DEVICE (int i, int j, int k, int n,
3939 const amrex::RandomEngine& engine) noexcept
4040 {
41- pert_arr (i,j,k,n) = amrex::Random (engine);
41+ pert_arr (i,j,k,n) = amrex::Real ( 2.0 ) * amrex:: Random (engine) - amrex::Real ( 1.0 );
4242 });
4343 }
4444}
@@ -195,6 +195,10 @@ void ApplyNeumannBCs(const Geometry& geom,
195195 // -------------------------------------------------
196196 const Box& domain = geom.Domain ();
197197
198+ const bool periodic_x = geom.isPeriodic (0 );
199+ const bool periodic_y = geom.isPeriodic (1 );
200+ const bool periodic_z = geom.isPeriodic (2 );
201+
198202 for (MFIter mfi (mf_cc, TilingIfNotGPU ()); mfi.isValid (); ++mfi)
199203 {
200204 const Box& gbx = mfi.growntilebox (); // includes ghost cells
@@ -212,15 +216,20 @@ void ApplyNeumannBCs(const Geometry& geom,
212216 int jj = j;
213217 int kk = k;
214218
215- // Clamp to domain interior (FOExtrap)
216- ii = amrex::max (domain.smallEnd (0 ),
217- amrex::min (i, domain.bigEnd (0 )));
219+ if (!periodic_x) {
220+ ii = amrex::max (domain.smallEnd (0 ),
221+ amrex::min (i, domain.bigEnd (0 )));
222+ }
218223
219- jj = amrex::max (domain.smallEnd (1 ),
220- amrex::min (j, domain.bigEnd (1 )));
224+ if (!periodic_y) {
225+ jj = amrex::max (domain.smallEnd (1 ),
226+ amrex::min (j, domain.bigEnd (1 )));
227+ }
221228
222- kk = amrex::max (domain.smallEnd (2 ),
223- amrex::min (k, domain.bigEnd (2 )));
229+ if (!periodic_z) {
230+ kk = amrex::max (domain.smallEnd (2 ),
231+ amrex::min (k, domain.bigEnd (2 )));
232+ }
224233
225234 arr (i,j,k,n) = arr (ii,jj,kk,n);
226235 });
@@ -573,7 +582,8 @@ MakeFinalMultiFabs (const MultiFab& mf_cc_fine,
573582 MultiFab& cons_pert,
574583 MultiFab& xvel_pert,
575584 MultiFab& yvel_pert,
576- MultiFab& zvel_pert)
585+ MultiFab& zvel_pert,
586+ const int n_qstate_moist)
577587{
578588
579589 for (MFIter mfi (cons_pert, TilingIfNotGPU ()); mfi.isValid (); ++mfi)
@@ -592,9 +602,9 @@ MakeFinalMultiFabs (const MultiFab& mf_cc_fine,
592602 Real tmp_qrain = mf_cc_fine_arr (i,j,k,7 );
593603 cons_pert_arr (i,j,k,Rho_comp) = tmp_rho;
594604 cons_pert_arr (i,j,k,RhoTheta_comp) = tmp_rho*tmp_theta;
595- cons_pert_arr (i,j,k,RhoQ1_comp) = tmp_rho*tmp_qv;
596- cons_pert_arr (i,j,k,RhoQ2_comp) = tmp_rho*tmp_qc;
597- cons_pert_arr (i,j,k,RhoQ3_comp) = tmp_rho*tmp_qrain;
605+ if (n_qstate_moist > 0 ) cons_pert_arr (i,j,k,RhoQ1_comp) = tmp_rho*tmp_qv;
606+ if (n_qstate_moist > 1 ) cons_pert_arr (i,j,k,RhoQ2_comp) = tmp_rho*tmp_qc;
607+ if (n_qstate_moist > 2 ) cons_pert_arr (i,j,k,RhoQ3_comp) = tmp_rho*tmp_qrain;
598608 });
599609 }
600610
@@ -732,5 +742,11 @@ ERF::create_background_state_for_ensemble (int lev,
732742 AddPertToBckgnd (mf_cc_fine, mf_cc_pert, solverChoice.ens_pert_amplitude );
733743 ApplyNeumannBCs (geom_fine, mf_cc_fine);
734744
735- MakeFinalMultiFabs (mf_cc_fine, cons_pert, xvel_pert, yvel_pert, zvel_pert);
745+ bool use_moisture = (solverChoice.moisture_type != MoistureType::None);
746+ int n_qstate_moist = 0 ;
747+ if (use_moisture) {
748+ n_qstate_moist = micro->Get_Qstate_Moist_Size ();
749+ }
750+
751+ MakeFinalMultiFabs (mf_cc_fine, cons_pert, xvel_pert, yvel_pert, zvel_pert, n_qstate_moist);
736752}
0 commit comments