From 12053bff2770d49640ec30f849ef48a03388915b Mon Sep 17 00:00:00 2001 From: "Aaron M. Lattanzi" <103702284+AMLattanzi@users.noreply.github.com> Date: Thu, 10 Oct 2024 16:50:53 -0700 Subject: [PATCH 01/35] Fix wsp calc in YSU. (#1872) --- Source/PBL/ERF_ComputeDiffusivityYSU.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Source/PBL/ERF_ComputeDiffusivityYSU.cpp b/Source/PBL/ERF_ComputeDiffusivityYSU.cpp index 3a9c92839..92503e5f7 100644 --- a/Source/PBL/ERF_ComputeDiffusivityYSU.cpp +++ b/Source/PBL/ERF_ComputeDiffusivityYSU.cpp @@ -121,7 +121,8 @@ ComputeDiffusivityYSU (const MultiFab& xvel, while (!above_critical and bx.contains(i,j,kpbl+1)) { kpbl += 1; const Real zval = use_terrain ? Compute_Zrel_AtCellCenter(i,j,kpbl,z_nd_arr) : gdata.ProbLo(2) + (kpbl + 0.5)*gdata.CellSize(2); - const Real ws2_level = 0.25*((uvel(i,j,kpbl)+uvel(i+1,j,kpbl))*(uvel(i,j,kpbl)+uvel(i+1,j,kpbl)) + (vvel(i,j,kpbl)+vvel(i,j+1,kpbl))*(uvel(i,j,kpbl)+uvel(i,j+1,kpbl))); + const Real ws2_level = 0.25*( (uvel(i,j,kpbl)+uvel(i+1,j ,kpbl))*(uvel(i,j,kpbl)+uvel(i+1,j ,kpbl)) + + (vvel(i,j,kpbl)+vvel(i ,j+1,kpbl))*(vvel(i,j,kpbl)+vvel(i ,j+1,kpbl)) ); const Real theta = cell_data(i,j,kpbl,RhoTheta_comp) / cell_data(i,j,kpbl,Rho_comp); Rib_dn = Rib_up; Rib_up = (theta-base_theta)/base_theta * CONST_GRAV * zval / ws2_level; From 57e722df617d9ded34543d766a86d5884c59c2bf Mon Sep 17 00:00:00 2001 From: Ann Almgren Date: Thu, 10 Oct 2024 20:45:04 -0700 Subject: [PATCH 02/35] fix some small issues (#1873) --- Source/BoundaryConditions/ERF_FillPatch.cpp | 49 ++++++------------- Source/Diffusion/ERF_ComputeStrain_N.cpp | 4 +- Source/Diffusion/ERF_ComputeStrain_T.cpp | 7 +-- Source/ERF_make_new_arrays.cpp | 3 ++ Source/ERF_make_new_level.cpp | 2 +- Source/TimeIntegration/ERF_advance_dycore.cpp | 7 +-- Source/Utils/ERF_VelocityToMomentum.cpp | 20 +++----- 7 files changed, 36 insertions(+), 56 deletions(-) diff --git a/Source/BoundaryConditions/ERF_FillPatch.cpp b/Source/BoundaryConditions/ERF_FillPatch.cpp index 4a98a01ba..6836eba2e 100644 --- a/Source/BoundaryConditions/ERF_FillPatch.cpp +++ b/Source/BoundaryConditions/ERF_FillPatch.cpp @@ -43,20 +43,9 @@ ERF::FillPatch (int lev, Real time, FPr_c[lev-1].FillSet(*mfs_vel[Vars::cons], time, null_bc, domain_bcs_type); } if (cf_set_width >= 0 && !cons_only) { - // - // This is an optimization since we won't need more than one ghost - // cell of momentum in the integrator if not using NumDiff - // - //IntVect ngu = (solverChoice.use_NumDiff) ? IntVect(1,1,1) : mfs_vel[Vars::xvel]->nGrowVect(); - //IntVect ngv = (solverChoice.use_NumDiff) ? IntVect(1,1,1) : mfs_vel[Vars::yvel]->nGrowVect(); - //IntVect ngw = (solverChoice.use_NumDiff) ? IntVect(1,1,0) : mfs_vel[Vars::zvel]->nGrowVect(); - IntVect ngu = IntVect::TheZeroVector(); - IntVect ngv = IntVect::TheZeroVector(); - IntVect ngw = IntVect::TheZeroVector(); - - VelocityToMomentum(*mfs_vel[Vars::xvel], ngu, - *mfs_vel[Vars::yvel], ngv, - *mfs_vel[Vars::zvel], ngw, + VelocityToMomentum(*mfs_vel[Vars::xvel], IntVect{0}, + *mfs_vel[Vars::yvel], IntVect{0}, + *mfs_vel[Vars::zvel], IntVect{0}, *mfs_vel[Vars::cons], *mfs_mom[IntVars::xmom], *mfs_mom[IntVars::ymom], @@ -545,16 +534,12 @@ ERF::FillIntermediatePatch (int lev, Real time, // We always come in to this call with momenta so we need to leave with momenta! // We need to make sure we convert back on all ghost cells/faces because this is // how velocity from fine-fine copies (as well as physical and interpolated bcs) will be filled - if (!cons_only) { - IntVect ngu = mfs_vel[Vars::xvel]->nGrowVect(); - IntVect ngv = mfs_vel[Vars::yvel]->nGrowVect(); - IntVect ngw = mfs_vel[Vars::zvel]->nGrowVect(); - - if (!solverChoice.use_NumDiff) { - ngu = IntVect(1,1,1); - ngv = IntVect(1,1,1); - ngw = IntVect(1,1,1); - } + if (!cons_only) + { + IntVect ngu = (!solverChoice.use_NumDiff) ? IntVect(1,1,1) : mfs_vel[Vars::xvel]->nGrowVect(); + IntVect ngv = (!solverChoice.use_NumDiff) ? IntVect(1,1,1) : mfs_vel[Vars::yvel]->nGrowVect(); + IntVect ngw = (!solverChoice.use_NumDiff) ? IntVect(1,1,0) : mfs_vel[Vars::zvel]->nGrowVect(); + VelocityToMomentum(*mfs_vel[Vars::xvel], ngu, *mfs_vel[Vars::yvel], ngv, *mfs_vel[Vars::zvel], ngw, @@ -600,13 +585,9 @@ ERF::FillCoarsePatch (int lev, Real time) // Convert velocity to momentum at the COARSE level // ************************************************ // - IntVect ngu = IntVect(0,0,0); - IntVect ngv = IntVect(0,0,0); - IntVect ngw = IntVect(0,0,0); - - VelocityToMomentum(vars_new[lev-1][Vars::xvel], ngu, - vars_new[lev-1][Vars::yvel], ngv, - vars_new[lev-1][Vars::zvel], ngw, + VelocityToMomentum(vars_new[lev-1][Vars::xvel], IntVect{0}, + vars_new[lev-1][Vars::yvel], IntVect{0}, + vars_new[lev-1][Vars::zvel], IntVect{0}, vars_new[lev-1][Vars::cons], rU_new[lev-1], rV_new[lev-1], @@ -640,7 +621,7 @@ ERF::FillCoarsePatch (int lev, Real time) // with InterpFromCoarseLevel which ASSUMES that all ghost cells have already been filled // ************************************************************************************************ // - InterpFromCoarseLevel(rU_new[lev], ngu, IntVect(0,0,0), rU_new[lev-1], 0, 0, 1, + InterpFromCoarseLevel(rU_new[lev], IntVect{0}, IntVect{0}, rU_new[lev-1], 0, 0, 1, geom[lev-1], geom[lev], refRatio(lev-1), mapper_f, domain_bcs_type, BCVars::xvel_bc); @@ -650,7 +631,7 @@ ERF::FillCoarsePatch (int lev, Real time) // with InterpFromCoarseLevel which ASSUMES that all ghost cells have already been filled // ************************************************************************************************ // - InterpFromCoarseLevel(rV_new[lev], ngv, IntVect(0,0,0), rV_new[lev-1], 0, 0, 1, + InterpFromCoarseLevel(rV_new[lev], IntVect{0}, IntVect{0}, rV_new[lev-1], 0, 0, 1, geom[lev-1], geom[lev], refRatio(lev-1), mapper_f, domain_bcs_type, BCVars::yvel_bc); @@ -658,7 +639,7 @@ ERF::FillCoarsePatch (int lev, Real time) // Interpolate z-momentum from coarse to fine level // with InterpFromCoarseLevel which ASSUMES that all ghost cells have already been filled // ************************************************************************************************ - InterpFromCoarseLevel(rW_new[lev], ngw, IntVect(0,0,0), rW_new[lev-1], 0, 0, 1, + InterpFromCoarseLevel(rW_new[lev], IntVect{0}, IntVect{0}, rW_new[lev-1], 0, 0, 1, geom[lev-1], geom[lev], refRatio(lev-1), mapper_f, domain_bcs_type, BCVars::zvel_bc); // diff --git a/Source/Diffusion/ERF_ComputeStrain_N.cpp b/Source/Diffusion/ERF_ComputeStrain_N.cpp index 996851723..6fbafdd5c 100644 --- a/Source/Diffusion/ERF_ComputeStrain_N.cpp +++ b/Source/Diffusion/ERF_ComputeStrain_N.cpp @@ -208,8 +208,8 @@ ComputeStrain_N (Box bxcc, Box tbxxy, Box tbxxz, Box tbxyz, Box domain, //*********************************************************************************** // Cell centered strains ParallelFor(bxcc, [=] AMREX_GPU_DEVICE (int i, int j, int k) noexcept { - tau11(i,j,k) = (u(i+1, j , k )/mf_u(i+1,j,0) - u(i, j, k)/mf_u(i,j,0))*dxInv[0]*mf_u(i,j,0)*mf_u(i,j,0); - tau22(i,j,k) = (v(i , j+1, k )/mf_v(i,j+1,0) - v(i, j, k)/mf_v(i,j,0))*dxInv[1]*mf_v(i,j,0)*mf_v(i,j,0); + tau11(i,j,k) = (u(i+1, j , k )/mf_u(i+1,j,0) - u(i, j, k)/mf_u(i,j,0))*dxInv[0]*mf_m(i,j,0)*mf_m(i,j,0); + tau22(i,j,k) = (v(i , j+1, k )/mf_v(i,j+1,0) - v(i, j, k)/mf_v(i,j,0))*dxInv[1]*mf_m(i,j,0)*mf_m(i,j,0); tau33(i,j,k) = (w(i , j , k+1) - w(i, j, k))*dxInv[2]; }); diff --git a/Source/Diffusion/ERF_ComputeStrain_T.cpp b/Source/Diffusion/ERF_ComputeStrain_T.cpp index 450d4317d..377a6a782 100644 --- a/Source/Diffusion/ERF_ComputeStrain_T.cpp +++ b/Source/Diffusion/ERF_ComputeStrain_T.cpp @@ -25,6 +25,7 @@ using namespace amrex; * @param[in] z_nd nodal array of physical z heights * @param[in] bc_ptr container with boundary condition types * @param[in] dxInv inverse cell size array + * @param[in] mf_m map factor at cell center * @param[in] mf_u map factor at x-face * @param[in] mf_v map factor at y-face */ @@ -38,7 +39,7 @@ ComputeStrain_T (Box bxcc, Box tbxxy, Box tbxxz, Box tbxyz, Box domain, const Array4& z_nd, const Array4& detJ, const BCRec* bc_ptr, const GpuArray& dxInv, - const Array4& /*mf_m*/, + const Array4& mf_m, const Array4& mf_u, const Array4& mf_v) { @@ -452,9 +453,9 @@ ComputeStrain_T (Box bxcc, Box tbxxy, Box tbxxz, Box tbxyz, Box domain, met_h_zeta = detJ(i,j,k); tau11(i,j,k) = ( (u(i+1, j, k)/mf_u(i+1,j,0) - u(i, j, k)/mf_u(i,j,0))*dxInv[0] - - (met_h_xi/met_h_zeta)*GradUz ) * mf_u(i,j,0)*mf_u(i,j,0); + - (met_h_xi/met_h_zeta)*GradUz ) * mf_m(i,j,0)*mf_m(i,j,0); tau22(i,j,k) = ( (v(i, j+1, k)/mf_v(i,j+1,0) - v(i, j, k)/mf_v(i,j,0))*dxInv[1] - - (met_h_eta/met_h_zeta)*GradVz ) * mf_v(i,j,0)*mf_v(i,j,0); + - (met_h_eta/met_h_zeta)*GradVz ) * mf_m(i,j,0)*mf_m(i,j,0); tau33(i,j,k) = (w(i, j, k+1) - w(i, j, k))*dxInv[2]/met_h_zeta; }); diff --git a/Source/ERF_make_new_arrays.cpp b/Source/ERF_make_new_arrays.cpp index ed9f652bd..68630c53a 100644 --- a/Source/ERF_make_new_arrays.cpp +++ b/Source/ERF_make_new_arrays.cpp @@ -147,6 +147,9 @@ ERF::init_stuff (int lev, const BoxArray& ba, const DistributionMapping& dm, rW_new[lev].define(convert(ba, IntVect(0,0,1)), dm, 1, ngrow_vels); // We do this here just so they won't be undefined in the initial FillPatch + rU_old[lev].setVal(1.2e21); + rV_old[lev].setVal(3.4e22); + rW_old[lev].setVal(5.6e23); rU_new[lev].setVal(1.2e21); rV_new[lev].setVal(3.4e22); rW_new[lev].setVal(5.6e23); diff --git a/Source/ERF_make_new_level.cpp b/Source/ERF_make_new_level.cpp index 2de79276f..52d59ba27 100644 --- a/Source/ERF_make_new_level.cpp +++ b/Source/ERF_make_new_level.cpp @@ -26,7 +26,7 @@ void ERF::MakeNewLevelFromScratch (int lev, Real time, const BoxArray& ba_in, BoxArray ba; DistributionMapping dm; Box domain(Geom(0).Domain()); - if (lev == 0 && + if (lev == 0 && restart_chkfile.empty() && (max_grid_size[0][0] >= domain.length(0)) && (max_grid_size[0][1] >= domain.length(1)) && ba_in.size() != ParallelDescriptor::NProcs()) diff --git a/Source/TimeIntegration/ERF_advance_dycore.cpp b/Source/TimeIntegration/ERF_advance_dycore.cpp index 2872007e8..4761c8646 100644 --- a/Source/TimeIntegration/ERF_advance_dycore.cpp +++ b/Source/TimeIntegration/ERF_advance_dycore.cpp @@ -252,9 +252,10 @@ void ERF::advance_dycore(int level, // This is an optimization since we won't need more than one ghost // cell of momentum in the integrator if not using NumDiff // - IntVect ngu = (solverChoice.use_NumDiff) ? IntVect(1,1,1) : xvel_old.nGrowVect(); - IntVect ngv = (solverChoice.use_NumDiff) ? IntVect(1,1,1) : yvel_old.nGrowVect(); - IntVect ngw = (solverChoice.use_NumDiff) ? IntVect(1,1,0) : zvel_old.nGrowVect(); + IntVect ngu = (!solverChoice.use_NumDiff) ? IntVect(1,1,1) : xvel_old.nGrowVect(); + IntVect ngv = (!solverChoice.use_NumDiff) ? IntVect(1,1,1) : yvel_old.nGrowVect(); + IntVect ngw = (!solverChoice.use_NumDiff) ? IntVect(1,1,0) : zvel_old.nGrowVect(); + VelocityToMomentum(xvel_old, ngu, yvel_old, ngv, zvel_old, ngw, density, state_old[IntVars::xmom], state_old[IntVars::ymom], diff --git a/Source/Utils/ERF_VelocityToMomentum.cpp b/Source/Utils/ERF_VelocityToMomentum.cpp index 271356276..213572e41 100644 --- a/Source/Utils/ERF_VelocityToMomentum.cpp +++ b/Source/Utils/ERF_VelocityToMomentum.cpp @@ -54,19 +54,9 @@ void VelocityToMomentum (const MultiFab& xvel_in, tby = mfi.tilebox(IntVect(0,1,0),yvel_ngrow); tbz = mfi.tilebox(IntVect(0,0,1),zvel_ngrow); -#if 0 - if (l_use_ndiff) { - tbx = mfi.tilebox(IntVect(1,0,0),xvel_ngrow); - tby = mfi.tilebox(IntVect(0,1,0),yvel_ngrow); - tbz = mfi.tilebox(IntVect(0,0,1),zvel_ngrow); - } else { - tbx = mfi.tilebox(IntVect(1,0,0),IntVect(1,1,1)); - if (tbx.smallEnd(2) < 0) tbx.setSmall(2,0); - tby = mfi.tilebox(IntVect(0,1,0),IntVect(1,1,1)); - if (tby.smallEnd(2) < 0) tby.setSmall(2,0); - tbz = mfi.tilebox(IntVect(0,0,1),IntVect(1,1,0)); - } -#endif + // Don't actually try to fill w above or below the domain + if (tbz.smallEnd(2) < domain.smallEnd(2)) tbz.setSmall(2,domain.smallEnd(2)); + if (tbz.bigEnd(2) > domain.bigEnd(2)+1) tbz.setBig(2,domain.bigEnd(2)+1); // Conserved/state variables on cell centers -- we use this for density const Array4& dens_arr = density.array(mfi); @@ -81,6 +71,8 @@ void VelocityToMomentum (const MultiFab& xvel_in, const Array4& vely = yvel_in.const_array(mfi); const Array4& velz = zvel_in.const_array(mfi); + // ******************************************************************************************** + ParallelFor(tbx, tby, tbz, [=] AMREX_GPU_DEVICE (int i, int j, int k) { momx(i,j,k) = velx(i,j,k) * 0.5 * (dens_arr(i,j,k,Rho_comp) + dens_arr(i-1,j,k,Rho_comp)); @@ -92,6 +84,8 @@ void VelocityToMomentum (const MultiFab& xvel_in, momz(i,j,k) = velz(i,j,k) * 0.5 * (dens_arr(i,j,k,Rho_comp) + dens_arr(i,j,k-1,Rho_comp)); }); + // ******************************************************************************************** + if ( (bx.smallEnd(0) == domain.smallEnd(0)) && (bc_ptr_h[BCVars::cons_bc].lo(0) == ERFBCType::ext_dir) ) { ParallelFor(makeSlab(tbx,0,domain.smallEnd(0)), [=] AMREX_GPU_DEVICE (int i, int j, int k) { From 4ce47d36008734d28ed326394d803f3ccbaae246 Mon Sep 17 00:00:00 2001 From: Mukul Dave Date: Sat, 12 Oct 2024 08:47:41 -0700 Subject: [PATCH 03/35] Remove multiblock code and do not include main.cpp in library (#1874) * remove multiblock container and evolve stuff * remove multiblock container files from build, include main.cpp only in executable build and not in the lib build --- CMake/BuildERFExe.cmake | 33 +++++-------- Source/ERF.H | 10 ++-- Source/ERF.cpp | 99 -------------------------------------- Source/main.cpp | 104 ---------------------------------------- 4 files changed, 18 insertions(+), 228 deletions(-) diff --git a/CMake/BuildERFExe.cmake b/CMake/BuildERFExe.cmake index dc9c4208c..e67a27fae 100644 --- a/CMake/BuildERFExe.cmake +++ b/CMake/BuildERFExe.cmake @@ -18,15 +18,8 @@ function(build_erf_lib erf_lib_name) target_compile_definitions(${erf_lib_name} PUBLIC ERF_USE_MOISTURE) if(ERF_ENABLE_MULTIBLOCK) - target_sources(${erf_lib_name} PRIVATE - ${SRC_DIR}/MultiBlock/ERF_MultiBlockContainer.cpp) target_compile_definitions(${erf_lib_name} PUBLIC ERF_USE_MULTIBLOCK) -# if(NOT ERF_MB_EXTERN) - target_sources(${erf_lib_name} PRIVATE - ${SRC_DIR}/MultiBlock/ERF_MultiBlockContainer.cpp) - target_include_directories(${erf_lib_name} PRIVATE $) -# endif() - endif() + endif() if(ERF_ENABLE_WARM_NO_PRECIP) target_compile_definitions(${erf_lib_name} PUBLIC ERF_USE_WARM_NO_PRECIP) @@ -91,10 +84,10 @@ function(build_erf_lib erf_lib_name) ${CMAKE_SOURCE_DIR}/Submodules/RRTMGP/cpp/extensions/fluxes_byband/mo_fluxes_byband_kernels.cpp ) - # The interface code needs to know about the RRTMGP includes + # The interface code needs to know about the RRTMGP includes target_compile_definitions(${erf_lib_name} PUBLIC ERF_USE_RRTMGP) - target_include_directories(${erf_lib_name} SYSTEM PUBLIC + target_include_directories(${erf_lib_name} SYSTEM PUBLIC ${CMAKE_SOURCE_DIR}/Submodules/RRTMGP/cpp/extensions/fluxes_byband ${CMAKE_SOURCE_DIR}/Submodules/RRTMGP/cpp/extensions/cloud_optics ${CMAKE_SOURCE_DIR}/Submodules/RRTMGP/cpp/examples @@ -161,7 +154,7 @@ function(build_erf_lib erf_lib_name) ${SRC_DIR}/PBL/ERF_ComputeDiffusivityMYNN25.cpp ${SRC_DIR}/PBL/ERF_ComputeDiffusivityYSU.cpp ${SRC_DIR}/SourceTerms/ERF_ApplySpongeZoneBCs.cpp - ${SRC_DIR}/SourceTerms/ERF_ApplySpongeZoneBCs_ReadFromFile.cpp + ${SRC_DIR}/SourceTerms/ERF_ApplySpongeZoneBCs_ReadFromFile.cpp ${SRC_DIR}/SourceTerms/ERF_make_buoyancy.cpp ${SRC_DIR}/SourceTerms/ERF_add_thin_body_sources.cpp ${SRC_DIR}/SourceTerms/ERF_make_mom_sources.cpp @@ -205,13 +198,6 @@ function(build_erf_lib erf_lib_name) ${SRC_DIR}/LandSurfaceModel/MM5/ERF_MM5.cpp ) - if(NOT "${erf_exe_name}" STREQUAL "erf_unit_tests") - target_sources(${erf_lib_name} - PRIVATE - ${SRC_DIR}/main.cpp - ) - endif() - include(AMReXBuildInfo) generate_buildinfo(${erf_lib_name} ${CMAKE_SOURCE_DIR}) if (${ERF_USE_INTERNAL_AMREX}) @@ -250,7 +236,7 @@ endif() target_include_directories(${erf_lib_name} PUBLIC $) target_include_directories(${erf_lib_name} PUBLIC $) target_include_directories(${erf_lib_name} PUBLIC $) - target_include_directories(${erf_lib_name} PUBLIC $) + target_include_directories(${erf_lib_name} PUBLIC $) target_include_directories(${erf_lib_name} PUBLIC $) target_include_directories(${erf_lib_name} PUBLIC $) target_include_directories(${erf_lib_name} PUBLIC $) @@ -261,7 +247,7 @@ endif() target_include_directories(${erf_lib_name} PUBLIC $) target_include_directories(${erf_lib_name} PUBLIC $) target_include_directories(${erf_lib_name} PUBLIC $) - + if(ERF_ENABLE_RRTMGP) target_link_libraries(${erf_lib_name} PUBLIC yakl) target_link_libraries(${erf_lib_name} PUBLIC rrtmgp) @@ -296,6 +282,13 @@ function(build_erf_exe erf_exe_name) set(SRC_DIR ${CMAKE_SOURCE_DIR}/Source) + if(NOT "${erf_exe_name}" STREQUAL "erf_unit_tests") + target_sources(${erf_exe_name} + PRIVATE + ${SRC_DIR}/main.cpp + ) + endif() + target_link_libraries(${erf_exe_name} PUBLIC ${erf_lib_name}) include(${CMAKE_SOURCE_DIR}/CMake/SetERFCompileFlags.cmake) set_erf_compile_flags(${erf_exe_name}) diff --git a/Source/ERF.H b/Source/ERF.H index 9f3f71d28..0a8230110 100644 --- a/Source/ERF.H +++ b/Source/ERF.H @@ -368,9 +368,6 @@ public: // Advance a block specified number of time steps void Evolve_MB (int MBstep, int max_block_step); - // Advance a block specified number of time steps - void Evolve_MB (MultiBlockContainer* mbc, int MBstep, int max_block_step); - // get the current time values amrex::Real get_t_old() {return t_old[0];} amrex::Real get_t_new() {return t_new[0];} @@ -383,15 +380,14 @@ public: // Public data copy for MB std::vector domain_p; - MultiBlockContainer *m_mbc = nullptr; amrex::Vector > vars_new; amrex::Vector > vars_old; // Velocity time averaged field amrex::Vector> vel_t_avg; amrex::Vector t_avg_cnt; - #endif + std::string pp_prefix {"erf"}; void fill_from_bndryregs (const amrex::Vector& mfs, @@ -947,6 +943,10 @@ private: #endif +#ifdef ERF_USE_MULTIBLOCK + MultiBlockContainer *m_mbc = nullptr; +#endif + static int verbose; static int mg_verbose; static bool use_heffte; diff --git a/Source/ERF.cpp b/Source/ERF.cpp index 332b068c6..db10aefb4 100644 --- a/Source/ERF.cpp +++ b/Source/ERF.cpp @@ -14,14 +14,6 @@ #include #include -#ifdef ERF_USE_MULTIBLOCK -#ifndef ERF_MB_EXTERN // enter only if multiblock does not involve an external class -#include -#else -#include -#endif -#endif - using namespace amrex; Real ERF::startCPUTime = 0.0; @@ -568,17 +560,6 @@ ERF::InitData () { BL_PROFILE_VAR("ERF::InitData()", InitData); InitData_pre(); -#if 0 -#ifdef ERF_USE_MULTIBLOCK -#ifndef ERF_MB_EXTERN // enter only if multiblock does not involve an external class - // Multiblock: hook to set BL & comms once ba/dm are known - if(domain_p[0].bigEnd(0) < 500 ) { - m_mbc->SetBoxLists(); - m_mbc->SetBlockCommMetaData(); - } -#endif -#endif -#endif InitData_post(); BL_PROFILE_VAR_STOP(InitData); } @@ -2010,86 +1991,6 @@ ERF::ERF (const RealBox& rb, int max_level_in, } #endif -#ifdef ERF_USE_MULTIBLOCK -// advance solution over specified block steps -void -ERF::Evolve_MB (int MBstep, int max_block_step) -{ - Real cur_time = t_new[0]; - - int step; - - // Take one coarse timestep by calling timeStep -- which recursively calls timeStep - // for finer levels (with or without subcycling) - for (int Bstep(0); Bstep < max_block_step && cur_time < stop_time; ++Bstep) - { - step = Bstep + MBstep - 1; - - Print() << "\nCoarse STEP " << step+1 << " starts ..." << std::endl; - - ComputeDt(step); - - // Make sure we have read enough of the boundary plane data to make it through this timestep - if (input_bndry_planes) - { - m_r2d->read_input_files(cur_time,dt[0],m_bc_extdir_vals); - } - - int lev = 0; - int iteration = 1; - timeStep(lev, cur_time, iteration); - -#ifndef ERF_MB_EXTERN - // DEBUG - // Multiblock: hook for erf2 to fill from erf1 - if(domain_p[0].bigEnd(0) < 500) { - for (int var_idx = 0; var_idx < Vars::NumTypes; ++var_idx) - m_mbc->FillPatchBlocks(var_idx,var_idx); - } -#endif - - cur_time += dt[0]; - - Print() << "Coarse STEP " << step+1 << " ends." << " TIME = " << cur_time - << " DT = " << dt[0] << std::endl; - - post_timestep(step, cur_time, dt[0]); - - if (writeNow(cur_time, dt[0], step+1, m_plot_int_1, m_plot_per_1)) { - last_plot_file_step_1 = step+1; - WritePlotFile(1,plot_var_names_1); - } - - if (writeNow(cur_time, dt[0], step+1, m_plot_int_2, m_plot_per_2)) { - last_plot_file_step_2 = step+1; - WritePlotFile(2,plot_var_names_2); - } - - if (writeNow(cur_time, dt[0], step+1, m_check_int, m_check_per)) { - last_check_file_step = step+1; -#ifdef ERF_USE_NETCDF - if (check_type == "netcdf") { - WriteNCCheckpointFile(); - } -#endif - if (check_type == "native") { - WriteCheckpointFile(); - } - } - -#ifdef AMREX_MEM_PROFILING - { - std::ostringstream ss; - ss << "[STEP " << step+1 << "]"; - MemProfiler::report(ss.str()); - } -#endif - - if (cur_time >= stop_time - 1.e-6*dt[0]) break; - } -} -#endif - bool ERF::writeNow(const Real cur_time, const Real dt_lev, const int nstep, const int plot_int, const Real plot_per) { diff --git a/Source/main.cpp b/Source/main.cpp index aaf932679..4cd2ee0b3 100644 --- a/Source/main.cpp +++ b/Source/main.cpp @@ -7,14 +7,6 @@ //#include "IO.H" #include "ERF.H" -#ifdef ERF_USE_MULTIBLOCK -#ifndef ERF_MB_EXTERN // enter only if multiblock does not involve an external class -#include -#else -#include -#endif -#endif - #ifdef ERF_USE_WW3_COUPLING #include #include @@ -124,101 +116,6 @@ int main (int argc, char* argv[]) // wallclock time const Real strt_total = amrex::second(); -#ifdef ERF_USE_MULTIBLOCK - { - // Vector of constructor parameters for MultiBlock - std::vector rb_v; - std::vector max_level_v; - std::vector coord_v; - std::vector> n_cell_v; - std::vector> is_per_v; - std::vector> ref_rat_v; - std::vector prefix_v; - int max_step{1}; - - // Local constructor parameters for vector - RealBox rb; - int max_level{0}; - int coord{0}; - amrex::Vector n_cell = {1,1,1}; - amrex::Array is_per = {1,1,1}; - amrex::Vector ref_rat = {amrex::IntVect(1,1,1)}; - - // Parse max steps for the block - { - ParmParse pp; - pp.query("max_step", max_step); - } - - // Parse data for erf1 constructor - { - ParmParse pp("erf1"); - amrex::Vector lo = {0.,0.,0.}; - amrex::Vector hi = {0.,0.,0.}; - amrex::Vector periodicity = {1,1,1}; - pp.queryarr("prob_lo",lo); - pp.queryarr("prob_hi",hi); - rb.setLo(lo); - rb.setHi(hi); - pp.query("max_level",max_level); - pp.query("coord",coord); - pp.queryarr("n_cell",n_cell); - pp.queryarr("is_periodic",periodicity); - { - for( int i(0); i lo = {0.,0.,0.}; - amrex::Vector hi = {0.,0.,0.}; - amrex::Vector periodicity = {1,1,1}; - pp.queryarr("prob_lo",lo); - pp.queryarr("prob_hi",hi); - rb.setLo(lo); - rb.setHi(hi); - pp.query("max_level",max_level); - pp.query("coord",coord); - pp.queryarr("n_cell",n_cell); - pp.queryarr("is_periodic",periodicity); - { - for( int i(0); i Date: Mon, 14 Oct 2024 19:34:28 -0700 Subject: [PATCH 04/35] This version runs both compressible and anelastic with factor 2 refinement of the DC problem to 900s (#1877) --- .../ERF_BoundaryConditions_cons.cpp | 20 ++--- Source/BoundaryConditions/ERF_FillPatch.cpp | 78 +++---------------- Source/BoundaryConditions/ERF_PhysBCFunct.H | 2 +- Source/BoundaryConditions/ERF_PhysBCFunct.cpp | 73 +++++++++++++---- Source/DataStructs/ERF_DataStruct.H | 42 +++++----- Source/ERF.H | 3 - Source/ERF.cpp | 15 +--- Source/ERF_make_new_level.cpp | 7 +- Source/IO/ERF_Plotfile.cpp | 9 ++- .../Microphysics/ERF_EulerianMicrophysics.H | 3 - Source/TimeIntegration/ERF_Advance.cpp | 18 +++-- Source/TimeIntegration/ERF_TI_utils.H | 19 ++++- Source/TimeIntegration/ERF_slow_rhs_pre.cpp | 5 +- 13 files changed, 141 insertions(+), 153 deletions(-) diff --git a/Source/BoundaryConditions/ERF_BoundaryConditions_cons.cpp b/Source/BoundaryConditions/ERF_BoundaryConditions_cons.cpp index b46c5f466..738d69fa5 100644 --- a/Source/BoundaryConditions/ERF_BoundaryConditions_cons.cpp +++ b/Source/BoundaryConditions/ERF_BoundaryConditions_cons.cpp @@ -15,7 +15,7 @@ using namespace amrex; */ void ERFPhysBCFunct_cons::impose_lateral_cons_bcs (const Array4& dest_arr, const Box& bx, const Box& domain, - int icomp, int ncomp, int ngz) + int icomp, int ncomp, IntVect ng) { BL_PROFILE_VAR("impose_lateral_cons_bcs()",impose_lateral_cons_bcs); const auto& dom_lo = lbound(domain); @@ -70,6 +70,7 @@ void ERFPhysBCFunct_cons::impose_lateral_cons_bcs (const Array4& dest_arr, { Box bx_xlo(bx); bx_xlo.setBig (0,dom_lo.x-1); Box bx_xhi(bx); bx_xhi.setSmall(0,dom_hi.x+1); + ParallelFor( bx_xlo, ncomp, [=] AMREX_GPU_DEVICE (int i, int j, int k, int n) { @@ -108,6 +109,7 @@ void ERFPhysBCFunct_cons::impose_lateral_cons_bcs (const Array4& dest_arr, { Box bx_ylo(bx); bx_ylo.setBig (1,dom_lo.y-1); Box bx_yhi(bx); bx_yhi.setSmall(1,dom_hi.y+1); + ParallelFor( bx_ylo, ncomp, [=] AMREX_GPU_DEVICE (int i, int j, int k, int n) { @@ -147,10 +149,10 @@ void ERFPhysBCFunct_cons::impose_lateral_cons_bcs (const Array4& dest_arr, // Populate ghost cells on lo-x and hi-x domain boundaries Box bx_xlo(bx); bx_xlo.setBig (0,dom_lo.x-1); Box bx_xhi(bx); bx_xhi.setSmall(0,dom_hi.x+1); - if (bx_xlo.smallEnd(2) != domain.smallEnd(2)) bx_xlo.growLo(2,ngz); - if (bx_xlo.bigEnd(2) != domain.bigEnd(2)) bx_xlo.growHi(2,ngz); - if (bx_xhi.smallEnd(2) != domain.smallEnd(2)) bx_xhi.growLo(2,ngz); - if (bx_xhi.bigEnd(2) != domain.bigEnd(2)) bx_xhi.growHi(2,ngz); + if (bx_xlo.smallEnd(2) != domain.smallEnd(2)) bx_xlo.growLo(2,ng[2]); + if (bx_xlo.bigEnd(2) != domain.bigEnd(2)) bx_xlo.growHi(2,ng[2]); + if (bx_xhi.smallEnd(2) != domain.smallEnd(2)) bx_xhi.growLo(2,ng[2]); + if (bx_xhi.bigEnd(2) != domain.bigEnd(2)) bx_xhi.growHi(2,ng[2]); ParallelFor( bx_xlo, ncomp, [=] AMREX_GPU_DEVICE (int i, int j, int k, int n) { @@ -196,10 +198,10 @@ void ERFPhysBCFunct_cons::impose_lateral_cons_bcs (const Array4& dest_arr, // Populate ghost cells on lo-y and hi-y domain boundaries Box bx_ylo(bx); bx_ylo.setBig (1,dom_lo.y-1); Box bx_yhi(bx); bx_yhi.setSmall(1,dom_hi.y+1); - if (bx_ylo.smallEnd(2) != domain.smallEnd(2)) bx_ylo.growLo(2,ngz); - if (bx_ylo.bigEnd(2) != domain.bigEnd(2)) bx_ylo.growHi(2,ngz); - if (bx_yhi.smallEnd(2) != domain.smallEnd(2)) bx_yhi.growLo(2,ngz); - if (bx_yhi.bigEnd(2) != domain.bigEnd(2)) bx_yhi.growHi(2,ngz); + if (bx_ylo.smallEnd(2) != domain.smallEnd(2)) bx_ylo.growLo(2,ng[2]); + if (bx_ylo.bigEnd(2) != domain.bigEnd(2)) bx_ylo.growHi(2,ng[2]); + if (bx_yhi.smallEnd(2) != domain.smallEnd(2)) bx_yhi.growLo(2,ng[2]); + if (bx_yhi.bigEnd(2) != domain.bigEnd(2)) bx_yhi.growHi(2,ng[2]); ParallelFor( bx_ylo, ncomp, [=] AMREX_GPU_DEVICE (int i, int j, int k, int n) { diff --git a/Source/BoundaryConditions/ERF_FillPatch.cpp b/Source/BoundaryConditions/ERF_FillPatch.cpp index 6836eba2e..352ee01a5 100644 --- a/Source/BoundaryConditions/ERF_FillPatch.cpp +++ b/Source/BoundaryConditions/ERF_FillPatch.cpp @@ -84,24 +84,18 @@ ERF::FillPatch (int lev, Real time, FillPatchSingleLevel(*mfs_vel[Vars::cons], ngvect_cons, time, fmf, IntVect(0,0,0), ftime, 0, 0, ncomp, geom[lev]); - (*physbcs_cons[lev])(*mfs_vel[Vars::cons],0,ncomp,ngvect_cons,time,BCVars::cons_bc); - if (!cons_only) { fmf = {&vars_old[lev][Vars::xvel], &vars_new[lev][Vars::xvel]}; FillPatchSingleLevel(*mfs_vel[Vars::xvel], ngvect_vels, time, fmf, IntVect(0,0,0), ftime, 0, 0, 1, geom[lev]); - (*physbcs_u[lev])(*mfs_vel[Vars::xvel],0,1,ngvect_vels,time,BCVars::xvel_bc); fmf = {&vars_old[lev][Vars::yvel], &vars_new[lev][Vars::yvel]}; FillPatchSingleLevel(*mfs_vel[Vars::yvel], ngvect_vels, time, fmf, IntVect(0,0,0), ftime, 0, 0, 1, geom[lev]); - (*physbcs_v[lev])(*mfs_vel[Vars::yvel],0,1,ngvect_vels,time,BCVars::xvel_bc); fmf = {&vars_old[lev][Vars::zvel], &vars_new[lev][Vars::zvel]}; FillPatchSingleLevel(*mfs_vel[Vars::zvel], ngvect_vels, time, fmf, IntVect(0,0,0), ftime, 0, 0, 1, geom[lev]); - (*physbcs_w[lev])(*mfs_vel[Vars::zvel],*mfs_vel[Vars::xvel],*mfs_vel[Vars::yvel], - ngvect_vels,time,BCVars::zvel_bc); } // !cons_only } else { @@ -115,13 +109,10 @@ ERF::FillPatch (int lev, Real time, mapper = &cell_cons_interp; // Impose physical bc's on coarse data (note time and 0 are not used) + // Note that we call FillBoundary inside the physbcs call (*physbcs_cons[lev-1])(vars_old[lev-1][Vars::cons],0,mf_c.nComp(),ngvect_cons,time,BCVars::cons_bc); (*physbcs_cons[lev-1])(vars_new[lev-1][Vars::cons],0,mf_c.nComp(),ngvect_cons,time,BCVars::cons_bc); - // Make sure internal ghost cells are filled as well - vars_old[lev-1][Vars::cons].FillBoundary(geom[lev-1].periodicity()); - vars_new[lev-1][Vars::cons].FillBoundary(geom[lev-1].periodicity()); - // Call FillPatchTwoLevels which ASSUMES that all ghost cells have already been filled FillPatchTwoLevels(mf_c, ngvect_cons, IntVect(0,0,0), time, cmf, ctime, fmf, ftime, @@ -129,9 +120,6 @@ ERF::FillPatch (int lev, Real time, refRatio(lev-1), mapper, domain_bcs_type, BCVars::cons_bc); - // Impose physical bc's on fine data - (*physbcs_cons[lev])(mf_c,0,mf_c.nComp(),ngvect_cons,time,BCVars::cons_bc); - if (!cons_only) { mapper = &face_cons_linear_interp; @@ -143,13 +131,10 @@ ERF::FillPatch (int lev, Real time, // ********************************************************************** // Impose physical bc's on coarse data (note time and 0 are not used) + // Note that we call FillBoundary inside the physbcs call (*physbcs_u[lev-1])(vars_old[lev-1][Vars::xvel],0,1,ngvect_vels,time,BCVars::xvel_bc); (*physbcs_u[lev-1])(vars_new[lev-1][Vars::xvel],0,1,ngvect_vels,time,BCVars::xvel_bc); - // Make sure internal ghost cells are filled as well - vars_old[lev-1][Vars::xvel].FillBoundary(geom[lev-1].periodicity()); - vars_new[lev-1][Vars::xvel].FillBoundary(geom[lev-1].periodicity()); - fmf = {&vars_old[lev ][Vars::xvel], &vars_new[lev ][Vars::xvel]}; cmf = {&vars_old[lev-1][Vars::xvel], &vars_new[lev-1][Vars::xvel]}; @@ -160,19 +145,13 @@ ERF::FillPatch (int lev, Real time, refRatio(lev-1), mapper, domain_bcs_type, BCVars::xvel_bc); - // Impose physical bc's on fine data - (*physbcs_u[lev])(vars_new[lev][Vars::xvel],0,mf_u.nComp(),ngvect_vels,time,BCVars::xvel_bc); - // ********************************************************************** // Impose physical bc's on coarse data (note time and 0 are not used) + // Note that we call FillBoundary inside the physbcs call (*physbcs_v[lev-1])(vars_old[lev-1][Vars::yvel],0,1,ngvect_vels,time,BCVars::yvel_bc); (*physbcs_v[lev-1])(vars_new[lev-1][Vars::yvel],0,1,ngvect_vels,time,BCVars::yvel_bc); - // Make sure internal ghost cells are filled as well - vars_old[lev-1][Vars::yvel].FillBoundary(geom[lev-1].periodicity()); - vars_new[lev-1][Vars::yvel].FillBoundary(geom[lev-1].periodicity()); - fmf = {&vars_old[lev ][Vars::yvel], &vars_new[lev ][Vars::yvel]}; cmf = {&vars_old[lev-1][Vars::yvel], &vars_new[lev-1][Vars::yvel]}; @@ -183,12 +162,10 @@ ERF::FillPatch (int lev, Real time, refRatio(lev-1), mapper, domain_bcs_type, BCVars::yvel_bc); - // Impose physical bc's on fine data - (*physbcs_v[lev])(vars_new[lev][Vars::yvel],0,1,ngvect_vels,time,BCVars::yvel_bc); - // ********************************************************************** // Impose physical bc's on coarse data (note time and 0 are not used) + // Note that we call FillBoundary inside the physbcs call (*physbcs_w[lev-1])(vars_old[lev-1][Vars::zvel], vars_old[lev-1][Vars::xvel], vars_old[lev-1][Vars::yvel], @@ -198,10 +175,6 @@ ERF::FillPatch (int lev, Real time, vars_new[lev-1][Vars::yvel], ngvect_vels,time,BCVars::zvel_bc); - // Make sure internal ghost cells are filled as well - vars_old[lev-1][Vars::zvel].FillBoundary(geom[lev-1].periodicity()); - vars_new[lev-1][Vars::zvel].FillBoundary(geom[lev-1].periodicity()); - fmf = {&vars_old[lev ][Vars::zvel], &vars_new[lev ][Vars::zvel]}; cmf = {&vars_old[lev-1][Vars::zvel], &vars_new[lev-1][Vars::zvel]}; @@ -211,12 +184,6 @@ ERF::FillPatch (int lev, Real time, 0, 0, 1, geom[lev-1], geom[lev], refRatio(lev-1), mapper, domain_bcs_type, BCVars::zvel_bc); - - - // Impose physical bc's on fine data -- note the u and v have been filled above - (*physbcs_w[lev])(*mfs_vel[Vars::zvel],*mfs_vel[Vars::xvel],*mfs_vel[Vars::yvel], - ngvect_vels,time,BCVars::zvel_bc); - } // !cons_only } // lev > 0 @@ -236,6 +203,7 @@ ERF::FillPatch (int lev, Real time, if (m_r2d) fill_from_bndryregs(mfs_vel,time); // We call these even if init_type == real because these will fill the vertical bcs + // Note that we call FillBoundary inside the physbcs call (*physbcs_cons[lev])(*mfs_vel[Vars::cons],icomp_cons,ncomp_cons,ngvect_cons,time,BCVars::cons_bc); if (!cons_only) { (*physbcs_u[lev])(*mfs_vel[Vars::xvel],0,1,ngvect_vels,time,BCVars::xvel_bc); @@ -245,37 +213,6 @@ ERF::FillPatch (int lev, Real time, } } -/* - * Fill ghost cells of qmoist - * - * @param[in] lev level of refinement at which to fill the data - * @param[in] time time at which the data should be filled - * @param[out] mf MultiFab to be filled (qmoist[lev]) - */ -void -ERF::FillPatchMoistVars (int lev, MultiFab& mf) -{ - BL_PROFILE_VAR("ERF::FillPatchMoistVars()",ERF_FillPatchMoistVars); - // *************************************************************************** - // Physical bc's at domain boundary - // *************************************************************************** - int icomp_cons = 0; - int ncomp_cons = 1; // We only fill qv, the first component - - // Note that we are filling qv, stored in qmoist[lev], with the input data (if there is any), stored - // in RhoQ1_comp. - - if (!use_real_bcs) { - Real time = Real(0.0); - IntVect ngvect_cons = mf.nGrowVect(); - int bccomp_cons = BCVars::RhoQ1_bc_comp; - - (*physbcs_cons[lev])(mf,icomp_cons,ncomp_cons,ngvect_cons,time,bccomp_cons); - } - - mf.FillBoundary(geom[lev].periodicity()); -} - /* * Fill valid and ghost data * This version fills mfs in valid regions with the values in "mfs" when it is passed in; @@ -549,7 +486,10 @@ ERF::FillIntermediatePatch (int lev, Real time, domain_bcs_type); } - mfs_mom[Vars::cons]->FillBoundary(geom[lev].periodicity()); + mfs_mom[IntVars::cons]->FillBoundary(geom[lev].periodicity()); + mfs_mom[IntVars::xmom]->FillBoundary(geom[lev].periodicity()); + mfs_mom[IntVars::ymom]->FillBoundary(geom[lev].periodicity()); + mfs_mom[IntVars::zmom]->FillBoundary(geom[lev].periodicity()); } /* diff --git a/Source/BoundaryConditions/ERF_PhysBCFunct.H b/Source/BoundaryConditions/ERF_PhysBCFunct.H index ea5ae9b00..ff09ff93a 100644 --- a/Source/BoundaryConditions/ERF_PhysBCFunct.H +++ b/Source/BoundaryConditions/ERF_PhysBCFunct.H @@ -56,7 +56,7 @@ public: void impose_lateral_cons_bcs (const amrex::Array4& dest_arr, const amrex::Box& bx, const amrex::Box& domain, - int icomp, int ncomp, int ngz); + int icomp, int ncomp, amrex::IntVect ng); void impose_vertical_cons_bcs (const amrex::Array4& dest_arr, const amrex::Box& bx, const amrex::Box& domain, const amrex::Array4& z_nd, diff --git a/Source/BoundaryConditions/ERF_PhysBCFunct.cpp b/Source/BoundaryConditions/ERF_PhysBCFunct.cpp index 06becebfc..a5c6048ca 100644 --- a/Source/BoundaryConditions/ERF_PhysBCFunct.cpp +++ b/Source/BoundaryConditions/ERF_PhysBCFunct.cpp @@ -46,6 +46,12 @@ void ERFPhysBCFunct_cons::operator() (MultiFab& mf, int icomp, int ncomp, z_nd_mf_loc.nGrowVect()); } + // + // We fill all of the interior and periodic ghost cells first, so we can fill + // those directly inside the lateral and vertical calls. + // + mf.FillBoundary(m_geom.periodicity()); + #ifdef AMREX_USE_OMP #pragma omp parallel if (Gpu::notInLaunchRegion()) #endif @@ -77,9 +83,11 @@ void ERFPhysBCFunct_cons::operator() (MultiFab& mf, int icomp, int ncomp, if (!m_use_real_bcs) { - impose_lateral_cons_bcs(cons_arr,cbx1,domain,icomp,ncomp,nghost[2]); + // We send a box with ghost cells in the lateral directions only + impose_lateral_cons_bcs(cons_arr,cbx1,domain,icomp,ncomp,nghost); } + // We send the full FAB box with ghost cells impose_vertical_cons_bcs(cons_arr,cbx2,domain,z_nd_arr,dxInv,icomp,ncomp); } @@ -118,6 +126,12 @@ void ERFPhysBCFunct_u::operator() (MultiFab& mf, int /*icomp*/, int /*ncomp*/, z_nd_mf_loc.nGrowVect()); } + // + // We fill all of the interior and periodic ghost cells first, so we can fill + // those directly inside the lateral and vertical calls. + // + mf.FillBoundary(m_geom.periodicity()); + #ifdef AMREX_USE_OMP #pragma omp parallel if (Gpu::notInLaunchRegion()) #endif @@ -133,7 +147,10 @@ void ERFPhysBCFunct_u::operator() (MultiFab& mf, int /*icomp*/, int /*ncomp*/, // // These are the boxes we use to test on relative to the domain // - Box xbx1 = surroundingNodes(bx,0); xbx1.grow(IntVect(nghost[0],nghost[1],0)); + Box xbx1 = surroundingNodes(bx,0); xbx1.grow(nghost); + if(xbx1.smallEnd(2) < domain.smallEnd(2)) xbx1.setSmall(2,domain.smallEnd(2)); + if(xbx1.bigEnd(2) > domain.bigEnd(2)) xbx1.setBig(2,domain.bigEnd(2)); + Box xbx2 = surroundingNodes(bx,0); xbx2.grow(nghost); Array4 z_nd_arr; @@ -157,7 +174,6 @@ void ERFPhysBCFunct_u::operator() (MultiFab& mf, int /*icomp*/, int /*ncomp*/, impose_vertical_xvel_bcs(velx_arr,xbx2,domain,z_nd_arr,dxInv,bccomp,time); } - } // MFIter } // OpenMP } // operator() @@ -193,6 +209,12 @@ void ERFPhysBCFunct_v::operator() (MultiFab& mf, int /*icomp*/, int /*ncomp*/, z_nd_mf_loc.nGrowVect()); } + // + // We fill all of the interior and periodic ghost cells first, so we can fill + // those directly inside the lateral and vertical calls. + // + mf.FillBoundary(m_geom.periodicity()); + #ifdef AMREX_USE_OMP #pragma omp parallel if (Gpu::notInLaunchRegion()) #endif @@ -208,7 +230,10 @@ void ERFPhysBCFunct_v::operator() (MultiFab& mf, int /*icomp*/, int /*ncomp*/, // // These are the boxes we use to test on relative to the domain // - Box ybx1 = surroundingNodes(bx,1); ybx1.grow(IntVect(nghost[0],nghost[1],0)); + Box ybx1 = surroundingNodes(bx,1); ybx1.grow(nghost); + if (ybx1.smallEnd(2) < domain.smallEnd(2)) ybx1.setSmall(2,domain.smallEnd(2)); + if (ybx1.bigEnd(2) > domain.bigEnd(2)) ybx1.setBig(2,domain.bigEnd(2)); + Box ybx2 = surroundingNodes(bx,1); ybx2.grow(nghost); Array4 z_nd_arr; @@ -272,6 +297,12 @@ void ERFPhysBCFunct_w::operator() (MultiFab& mf, MultiFab& xvel, MultiFab& yvel, } z_nd_mf_loc.FillBoundary(m_geom.periodicity()); + // + // We fill all of the interior and periodic ghost cells first, so we can fill + // those directly inside the lateral and vertical calls. + // + mf.FillBoundary(m_geom.periodicity()); + #ifdef AMREX_USE_OMP #pragma omp parallel if (Gpu::notInLaunchRegion()) #endif @@ -287,8 +318,17 @@ void ERFPhysBCFunct_w::operator() (MultiFab& mf, MultiFab& xvel, MultiFab& yvel, // // These are the boxes we use to test on relative to the domain // - Box zbx = surroundingNodes(bx,2); zbx.grow(0,nghost[0]); - zbx.grow(1,nghost[1]); + Box zbx1 = surroundingNodes(bx,2); zbx1.grow(nghost); + if (zbx1.smallEnd(2) < domain.smallEnd(2)) zbx1.setSmall(2,domain.smallEnd(2)); + if (zbx1.bigEnd(2) > domain.bigEnd(2)) zbx1.setBig(2,domain.bigEnd(2)+1); + + Box zbx2 = surroundingNodes(bx,2); zbx2.grow(nghost); + + // + // These are the boxes we use to test on relative to the domain + // + // Box zbx = surroundingNodes(bx,2); zbx.grow(0,nghost[0]); + // zbx.grow(1,nghost[1]); Array4 z_nd_arr; if (m_z_phys_nd) @@ -296,20 +336,21 @@ void ERFPhysBCFunct_w::operator() (MultiFab& mf, MultiFab& xvel, MultiFab& yvel, z_nd_arr = z_nd_mf_loc.const_array(mfi); } - Array4 const& velx_arr = xvel.const_array(mfi); - Array4 const& vely_arr = yvel.const_array(mfi); - Array4< Real> const& velz_arr = mf.array(mfi); - - if (!m_use_real_bcs) + if (!gdomainz.contains(zbx2)) { - if (!gdomainz.contains(zbx)) + Array4 const& velx_arr = xvel.const_array(mfi); + Array4 const& vely_arr = yvel.const_array(mfi); + Array4< Real> const& velz_arr = mf.array(mfi); + + if (!m_use_real_bcs) { - impose_lateral_zvel_bcs(velz_arr,velx_arr,vely_arr,zbx,domain,z_nd_arr,dxInv,bccomp_w); + if (!gdomainz.contains(zbx1)) + { + impose_lateral_zvel_bcs(velz_arr,velx_arr,vely_arr,zbx1,domain,z_nd_arr,dxInv,bccomp_w); + } } - } // m_use_real_bcs - if (!gdomainz.contains(zbx)) { - impose_vertical_zvel_bcs(velz_arr,velx_arr,vely_arr,zbx,domain,z_nd_arr,dxInv, + impose_vertical_zvel_bcs(velz_arr,velx_arr,vely_arr,zbx2,domain,z_nd_arr,dxInv, bccomp_u, bccomp_v, bccomp_w, m_terrain_type); } } // MFIter diff --git a/Source/DataStructs/ERF_DataStruct.H b/Source/DataStructs/ERF_DataStruct.H index 9e7cc1470..5a94ec286 100644 --- a/Source/DataStructs/ERF_DataStruct.H +++ b/Source/DataStructs/ERF_DataStruct.H @@ -430,35 +430,35 @@ struct SolverChoice { amrex::Print() << "use_coriolis : " << use_coriolis << std::endl; amrex::Print() << "use_gravity : " << use_gravity << std::endl; - if (coupling_type == CouplingType::TwoWay) { - amrex::Print() << "Using two-way coupling " << std::endl; - } else if (coupling_type == CouplingType::OneWay) { - amrex::Print() << "Using one-way coupling " << std::endl; - } - + amrex::Print() << "Terrain Type: " << std::endl; if (terrain_type == TerrainType::Static) { - amrex::Print() << "Using static terrain " << std::endl; + amrex::Print() << " Static" << std::endl; } else if (terrain_type == TerrainType::Moving) { - amrex::Print() << "Using moving terrain " << std::endl; + amrex::Print() << " Moving" << std::endl; } else { - amrex::Print() << "No terrain " << std::endl; + amrex::Print() << " None" << std::endl; } + amrex::Print() << "ABL Driver Type: " << std::endl; if (abl_driver_type == ABLDriverType::None) { - amrex::Print() << "ABL Driver Type: " << "None" << std::endl; - amrex::Print() << "No ABL driver selected " << std::endl; + amrex::Print() << " None" << std::endl; } else if (abl_driver_type == ABLDriverType::PressureGradient) { - amrex::Print() << "ABL Driver Type: " << "PressureGradient" << std::endl; - amrex::Print() << "Driving abl_pressure_grad: ("; - for (int i = 0; i < AMREX_SPACEDIM; ++i) - amrex::Print() << abl_pressure_grad[i] << " "; - amrex::Print() << ")" << std::endl; + amrex::Print() << " Pressure Gradient " + << amrex::RealVect(abl_pressure_grad[0],abl_pressure_grad[1],abl_pressure_grad[2]) + << std::endl; } else if (abl_driver_type == ABLDriverType::GeostrophicWind) { - amrex::Print() << "ABL Driver Type: " << "GeostrophicWind" << std::endl; - amrex::Print() << "Driving abl_geo_forcing: ("; - for (int i = 0; i < AMREX_SPACEDIM; ++i) - amrex::Print() << abl_geo_forcing[i] << " "; - amrex::Print() << ")" << std::endl; + amrex::Print() << " Geostrophic Wind " + << amrex::RealVect(abl_geo_forcing[0],abl_geo_forcing[1],abl_geo_forcing[2]) + << std::endl; + } + + if (max_level > 0) { + amrex::Print() << "Coupling Type: " << std::endl; + if (coupling_type == CouplingType::TwoWay) { + amrex::Print() << " Two-way" << std::endl; + } else if (coupling_type == CouplingType::OneWay) { + amrex::Print() << " One-way" << std::endl; + } } amrex::Print() << "Buoyancy_type : " << buoyancy_type << std::endl; diff --git a/Source/ERF.H b/Source/ERF.H index 0a8230110..e9ed7ad52 100644 --- a/Source/ERF.H +++ b/Source/ERF.H @@ -492,9 +492,6 @@ private: const amrex::Vector& mfs_mom, bool fillset=true, bool cons_only=false); - // Compute a new MultiFab by copying from valid region and filling ghost cells - - void FillPatchMoistVars (int lev, amrex::MultiFab& mf); - // Compute new multifabs by copying data from valid region and filling ghost cells. // Unlike FillPatch, FillIntermediatePatch will use the supplied multifabs instead of fine level data. // This is to support filling boundary cells at an intermediate time between old/new times diff --git a/Source/ERF.cpp b/Source/ERF.cpp index db10aefb4..427582722 100644 --- a/Source/ERF.cpp +++ b/Source/ERF.cpp @@ -719,17 +719,6 @@ ERF::InitData_post () for (int lev(0); lev <= max_level; ++lev) { make_physbcs(lev); } - - // TODO: Check if this is needed. I don't think it is since we now - // advect all the scalars... - - // Need to fill ghost cells here since we will use this qmoist in advance - if (solverChoice.moisture_type != MoistureType::None) - { - for (int lev = 0; lev <= finest_level; lev++) { - if (qmoist[lev].size() > 0) FillPatchMoistVars(lev, *(qmoist[lev][0])); // qv component - } - } } #ifdef ERF_USE_PARTICLES @@ -1697,7 +1686,6 @@ ERF::MakeHorizontalAverages () auto fab_arr = mf.array(mfi); auto const hse_arr = base_state[lev].const_array(mfi); auto const cons_arr = vars_new[lev][Vars::cons].const_array(mfi); - auto const qv_arr = qmoist[lev][0]->const_array(mfi); int ncomp = vars_new[lev][Vars::cons].nComp(); ParallelFor(bx, [=] AMREX_GPU_DEVICE (int i, int j, int k) { @@ -1705,7 +1693,8 @@ ERF::MakeHorizontalAverages () if (is_anelastic) { fab_arr(i,j,k,2) = hse_arr(i,j,k,1); } else { - fab_arr(i, j, k, 2) = getPgivenRTh(cons_arr(i, j, k, RhoTheta_comp), qv_arr(i,j,k)); + Real qv = cons_arr(i, j, k, RhoQ1_comp) / dens; + fab_arr(i, j, k, 2) = getPgivenRTh(cons_arr(i, j, k, RhoTheta_comp), qv); } fab_arr(i, j, k, 3) = (ncomp > RhoQ1_comp ? cons_arr(i, j, k, RhoQ1_comp) / dens : 0.0); fab_arr(i, j, k, 4) = (ncomp > RhoQ2_comp ? cons_arr(i, j, k, RhoQ2_comp) / dens : 0.0); diff --git a/Source/ERF_make_new_level.cpp b/Source/ERF_make_new_level.cpp index 52d59ba27..7fbcae895 100644 --- a/Source/ERF_make_new_level.cpp +++ b/Source/ERF_make_new_level.cpp @@ -283,7 +283,7 @@ ERF::MakeNewLevelFromCoarse (int lev, Real time, const BoxArray& ba, void ERF::RemakeLevel (int lev, Real time, const BoxArray& ba, const DistributionMapping& dm) { - // amrex::Print() <<" REMAKING WITH NEW BA AT LEVEL " << lev << " " << ba << std::endl; + amrex::Print() <<" REMAKING WITH NEW BA AT LEVEL " << lev << " " << ba << std::endl; AMREX_ALWAYS_ASSERT(lev > 0); AMREX_ALWAYS_ASSERT(solverChoice.terrain_type != TerrainType::Moving); @@ -332,9 +332,10 @@ ERF::RemakeLevel (int lev, Real time, const BoxArray& ba, const DistributionMapp // ***************************************************************************************************** make_physbcs(lev); - // ******************************************************************************************** + // ************************************************************************************************* // This will fill the temporary MultiFabs with data from vars_new - // ******************************************************************************************** + // NOTE: the momenta here are only used as scratch space, the momenta themselves are not fillpatched + // ************************************************************************************************* FillPatch(lev, time, {&temp_lev_new[Vars::cons],&temp_lev_new[Vars::xvel], &temp_lev_new[Vars::yvel],&temp_lev_new[Vars::zvel]}, {&temp_lev_new[Vars::cons],&rU_new[lev],&rV_new[lev],&rW_new[lev]}, diff --git a/Source/IO/ERF_Plotfile.cpp b/Source/IO/ERF_Plotfile.cpp index 5bdcf5831..e26ee2ec3 100644 --- a/Source/IO/ERF_Plotfile.cpp +++ b/Source/IO/ERF_Plotfile.cpp @@ -199,6 +199,7 @@ ERF::WritePlotFile (int which, Vector plot_var_names) // We Fillpatch here because some of the derived quantities require derivatives // which require ghost cells to be filled. We do not need to call FillPatcher // because we don't need to set interior fine points. + // NOTE: the momenta here are only used as scratch space, the momenta themselves are not fillpatched for (int lev = 0; lev <= finest_level; ++lev) { bool fillset = false; FillPatch(lev, t_new[lev], {&vars_new[lev][Vars::cons], &vars_new[lev][Vars::xvel], @@ -1511,10 +1512,10 @@ ERF::WriteMultiLevelPlotfileWithTerrain (const std::string& plotfilename, int nl const Vector& mf, const Vector& mf_nd, const Vector& varnames, - const Vector& geom, + const Vector& my_geom, Real time, const Vector& level_steps, - const Vector& ref_ratio, + const Vector& rr, const std::string &versionName, const std::string &levelPrefix, const std::string &mfPrefix, @@ -1523,7 +1524,7 @@ ERF::WriteMultiLevelPlotfileWithTerrain (const std::string& plotfilename, int nl BL_PROFILE("WriteMultiLevelPlotfileWithTerrain()"); AMREX_ALWAYS_ASSERT(nlevels <= mf.size()); - AMREX_ALWAYS_ASSERT(nlevels <= ref_ratio.size()+1); + AMREX_ALWAYS_ASSERT(nlevels <= rr.size()+1); AMREX_ALWAYS_ASSERT(nlevels <= level_steps.size()); AMREX_ALWAYS_ASSERT(mf[0]->nComp() == varnames.size()); @@ -1553,7 +1554,7 @@ ERF::WriteMultiLevelPlotfileWithTerrain (const std::string& plotfilename, int nl std::ofstream::binary); if( ! HeaderFile.good()) FileOpenFailed(HeaderFileName); WriteGenericPlotfileHeaderWithTerrain(HeaderFile, nlevels, boxArrays, varnames, - geom, time, level_steps, ref_ratio, versionName, + my_geom, time, level_steps, rr, versionName, levelPrefix, mfPrefix); }; diff --git a/Source/Microphysics/ERF_EulerianMicrophysics.H b/Source/Microphysics/ERF_EulerianMicrophysics.H index 9892a30fe..cb91854b4 100644 --- a/Source/Microphysics/ERF_EulerianMicrophysics.H +++ b/Source/Microphysics/ERF_EulerianMicrophysics.H @@ -31,14 +31,11 @@ public: a_model_type == MoistureType::SAM_NoIce || a_model_type == MoistureType::SAM_NoPrecip_NoIce) { SetModel(); - amrex::Print() << "SAM moisture model!\n"; } else if (a_model_type == MoistureType::Kessler || a_model_type == MoistureType::Kessler_NoRain) { SetModel(); - amrex::Print() << "Kessler moisture model!\n"; } else if (a_model_type == MoistureType::None) { SetModel(); - amrex::Print() << "No moisture model!\n"; } else { amrex::Abort("EulerianMicrophysics: Dont know this moisture_type!") ; } diff --git a/Source/TimeIntegration/ERF_Advance.cpp b/Source/TimeIntegration/ERF_Advance.cpp index c5c4ca369..db7cbf1a0 100644 --- a/Source/TimeIntegration/ERF_Advance.cpp +++ b/Source/TimeIntegration/ERF_Advance.cpp @@ -92,14 +92,20 @@ ERF::Advance (int lev, Real time, Real dt_lev, int iteration, int /*ncycle*/) V_new.setVal(1.e34,V_new.nGrowVect()); W_new.setVal(1.e34,W_new.nGrowVect()); + // + // NOTE: the momenta here are not fillpatched (they are only used as scratch space) + // FillPatch(lev, time, {&S_old, &U_old, &V_old, &W_old}, {&S_old, &rU_old[lev], &rV_old[lev], &rW_old[lev]}); - - if (solverChoice.moisture_type != MoistureType::None) { - // TODO: This is only qv - if (qmoist[lev].size() > 0) FillPatchMoistVars(lev, *(qmoist[lev][0])); - } - + // + // So we must convert the fillpatched to momenta, including the ghost values + // + VelocityToMomentum(U_old, rU_old[lev].nGrowVect(), + V_old, rV_old[lev].nGrowVect(), + W_old, rW_old[lev].nGrowVect(), + S_old, rU_old[lev], rV_old[lev], rW_old[lev], + Geom(lev).Domain(), + domain_bcs_type); #if defined(ERF_USE_WINDFARM) if (solverChoice.windfarm_type != WindFarmType::None) { diff --git a/Source/TimeIntegration/ERF_TI_utils.H b/Source/TimeIntegration/ERF_TI_utils.H index 21c330bc9..7870508a4 100644 --- a/Source/TimeIntegration/ERF_TI_utils.H +++ b/Source/TimeIntegration/ERF_TI_utils.H @@ -15,19 +15,32 @@ const Box& gbx = mfi.growntilebox(ng); const Array4& cons_arr = cons_state.array(mfi); const Array4< Real>& prim_arr = S_prim.array(mfi); - const Array4< Real>& pi_stage_arr = pi_stage.array(mfi); - const Real rdOcp = solverChoice.rdOcp; + // + // We may need > one ghost cells of prim in order to compute higher order advective terms + // amrex::ParallelFor(gbx, [=] AMREX_GPU_DEVICE (int i, int j, int k) noexcept { Real rho = cons_arr(i,j,k,Rho_comp); Real rho_theta = cons_arr(i,j,k,RhoTheta_comp); prim_arr(i,j,k,PrimTheta_comp) = rho_theta / rho; - pi_stage_arr(i,j,k) = getExnergivenRTh(rho_theta, rdOcp); for (int n = 1; n < ncomp_prim; ++n) { prim_arr(i,j,k,PrimTheta_comp + n) = cons_arr(i,j,k,RhoTheta_comp + n) / rho; } }); + + // + // We only use one ghost cell of pi_stage so we only fill one here + // + const Box& gbx1 = mfi.growntilebox(1); + + const Array4< Real>& pi_stage_arr = pi_stage.array(mfi); + const Real rdOcp = solverChoice.rdOcp; + + amrex::ParallelFor(gbx1, [=] AMREX_GPU_DEVICE (int i, int j, int k) noexcept + { + pi_stage_arr(i,j,k) = getExnergivenRTh(cons_arr(i,j,k,RhoTheta_comp), rdOcp); + }); } // mfi }; diff --git a/Source/TimeIntegration/ERF_slow_rhs_pre.cpp b/Source/TimeIntegration/ERF_slow_rhs_pre.cpp index 7cb16958b..7ec8b392c 100644 --- a/Source/TimeIntegration/ERF_slow_rhs_pre.cpp +++ b/Source/TimeIntegration/ERF_slow_rhs_pre.cpp @@ -373,8 +373,9 @@ void erf_slow_rhs_pre (int level, int finest_level, // Now create Omega with momentum (not velocity) with z_t subtracted if moving terrain if (l_use_terrain) { - Box gbxo_lo = gbxo; gbxo_lo.setBig(2,0); - if (gbxo_lo.smallEnd(2) <= 0) { + Box gbxo_lo = gbxo; gbxo_lo.setBig(2,domain.smallEnd(2)); + int lo_z_face = domain.smallEnd(2); + if (gbxo_lo.smallEnd(2) <= lo_z_face) { ParallelFor(gbxo_lo, [=] AMREX_GPU_DEVICE (int i, int j, int k) noexcept { omega_arr(i,j,k) = 0.; }); From 5007d9f6960632265af65c193d985ec1dc2407a1 Mon Sep 17 00:00:00 2001 From: Ann Almgren Date: Mon, 14 Oct 2024 20:08:08 -0700 Subject: [PATCH 05/35] change default coupling type to OneWay (#1878) --- Source/DataStructs/ERF_DataStruct.H | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/DataStructs/ERF_DataStruct.H b/Source/DataStructs/ERF_DataStruct.H index 5a94ec286..e44795be1 100644 --- a/Source/DataStructs/ERF_DataStruct.H +++ b/Source/DataStructs/ERF_DataStruct.H @@ -339,7 +339,7 @@ struct SolverChoice { // Which type of multilevel coupling - coupling_type = CouplingType::TwoWay; // Default + coupling_type = CouplingType::OneWay; // Default pp.query_enum_case_insensitive("coupling_type",coupling_type); // Which type of windfarm model From 8368bf0008537d3786b32786f34b24f5bfd0f826 Mon Sep 17 00:00:00 2001 From: Mahesh Natarajan Date: Mon, 14 Oct 2024 20:10:06 -0700 Subject: [PATCH 06/35] Docs for generalized actuator disk model (#1876) * Adding docs for generalized actuator disk * Removing whitespaces and tabs --------- Co-authored-by: Mahesh Natarajan Co-authored-by: Mahesh Natarajan --- Docs/sphinx_doc/figures/GAD_Schematic.png | Bin 0 -> 194168 bytes Docs/sphinx_doc/theory/WindFarmModels.rst | 137 +++++++++++++++++++++- 2 files changed, 135 insertions(+), 2 deletions(-) create mode 100644 Docs/sphinx_doc/figures/GAD_Schematic.png diff --git a/Docs/sphinx_doc/figures/GAD_Schematic.png b/Docs/sphinx_doc/figures/GAD_Schematic.png new file mode 100644 index 0000000000000000000000000000000000000000..f487beaed274678403cac031c986f3a428152e2c GIT binary patch literal 194168 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niua4oze+mtl*>W&iZI3hP^Fd20 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�t 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 MQ8|$!q1T`OA7N3z8vp Date: Tue, 15 Oct 2024 12:07:24 -0700 Subject: [PATCH 07/35] Some updates to docs (#1880) * Some changes to docs * Removing whitespaces and tabs --------- Co-authored-by: Mahesh Natarajan Co-authored-by: Mahesh Natarajan --- Docs/sphinx_doc/figures/GAD_Schematic.png | Bin 194168 -> 195249 bytes Docs/sphinx_doc/theory/Buoyancy.rst | 2 +- Docs/sphinx_doc/theory/WindFarmModels.rst | 46 ++++++++++++++++++---- 3 files changed, 39 insertions(+), 9 deletions(-) diff --git a/Docs/sphinx_doc/figures/GAD_Schematic.png b/Docs/sphinx_doc/figures/GAD_Schematic.png index f487beaed274678403cac031c986f3a428152e2c..99c662b36e8d9c3b14c08a43fe8535be5834bedb 100644 GIT binary patch literal 195249 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

-sirS9yW zLey!g01Cek<7w=$N1Ezl+-@W|`3g79M-mB0w?EoQ3?y8cr|ka1FuQbNhmg2s%dUBT zg(0{dCn=~d&$sT13{;-zCaMq0Fbl#`h9!C4)r<5XKFYW`Le}pMX&v6L#~eN@vKhf$ zzz0lD41zYg?N#54#?nW~;ytHYZW|mO)W>ZYZ1Ln?A1G69=g3Uf5ft~&bZIp#M2_y3)K`K5EP}vD-$)%OuYQ+qi-7-q0#dj9{DHsgnXT#_! z02kD!3GxgxHFR#|C)zpP=F~yF3M3Jmi+KS2&v>x6M>uQq`w3A6vnoAbX{lRJ8o42f zF@pEdnyN5A5hwZS##h&hl>r8tyN~;S-t}0|=~|i5lwWDjWpOU{nmkjhuZ{|0Dd_I5 zX%^nswyk^_QLi1Vp@wFD;QV#>8PRPOz3fAc&Gz4b!3Q2Ml}E(ckpEmwoR<)1AJnrn z!?Wil$4P`J;7j~MW`b=g$g$s-6V|asyg~w5y~(_v{@OQ9F#;ea(v6ZQo<+4lIk?V(z51#l-8Xn z@07qGEt`Gb+DF#%_o=Z=1l##?f0^jbGZ6I7ul&SldI`Ct!TDF=8{@GJid!KrGfmjF z@Qypo{Fw?98WO+RR|A-@6_LcwOZS401~Z}~w|c^}g?B1H)Y&hF=^tnF5G#@w z5=Sx!P8X6ywN?mjm-45FX^qbl}8A=PQ>{QTtS)$G)5}R8UwJcaSqPt)9 zYT3CkxFKV)(Xzdf(d?I%p-Oqk3l)aAG(KtO;!}6ogrSC?{@crlz>RkFzu(7yZgS{H zUP-4W_kuPvWP9Km;k$9sqhw9pF>zv&5^U#J9`UN)e>E=F$S_FUH7l~#&nUyx;fl5! z7;Cut<|6osNwq&oTI8wpL_nJGUYy*jP+>bCHh)=rB0g~Z1T6jl2Pdvq6c#eU z%SU`zkJuC05U7H__+IEXE%O$*Os-R94Fm zjh#jgFM2MAvtZwDjpM6m*@Az2OGQhX#LY@e%@}vKGDO32#D6`o??|t-W01{+U-f37 zWOI19lgl6UjnWUFqYwWQY#M-;Yh`ybU9 z#=9Ruf43s{MI=lSZZy@SVsL3KF-IFlV(Qj3#MVzxE=1cfoigkSF=x+X*n2=beCkM- zC6*=YyL&TnpHqTQWHOc&$*dm|g1{Csy>|EP&tL@qIf= znvIa7QP*B1KQeKh+fJ!JBKK!sq4_+eQI-DG#zz>(1MBtUowecGE7=lfdz}2`jgkqQ z1aOC+LHKe0R3MUiar2YDZvhu>*{?;dFr-UsW>z|BtQWIq$!CV?z9|QP4nb1Q3PVZ$ z#L<_!f^bl(8Y>D)5MwB{M z{`EUI5OW6BvJiRst`lx`%MFnd$(7e!Ms632X&|4Ij4V)&{)HOAVIknSQXj)%AxXP@ zuU7alC3%)%c|ckI^9-jM#ol`2DN%#lhco!^UUn!ZJdoKkgGl z^UMD{@J}GHCO=(E)GALZ?49%^VsDH7`k~>7+EnqEMp-$y-@}>3YMo7n%5PkD z%^0HX_oBzV1m%>m^xgh?eZXCN66Xosbw7GNRAcgmh%8CX+%kguKivs`2uAVzoysUQ z5qeq}U-Wd~lY%){5(W~_K}LTic*N4kQ$DJVmT#mzM#H)=(|fBgXz)Toy&x&EeREQ| z0QQlfLBI;-=OmS!lD{?00HOSlv#D0n&|*=7LM-h~abauVpg_fUbMfwpubRQfAwm-?Y?iL=Ag{2LrhzWt~`?mWP- z>3=@fKfqH`<|(UjAdagh#)XZkv|Wr~<^cBAFLT|B28{wNS^pYhBp#-8J%PWD#ruaI z{KJz73OAaTy(-W>+yNW8eNBWAGWYd< z>l?rTopImK%K!Z77SRUQ=0gw^g2+2V$YMkaWZr$24*;+q1*D3Sjd%Jtl` z=AeU6ALwf$_>kG8Lm}eeMh8gq(@?>q6JuB7a_y9lEVp6FNiXkaZN*P)vEKNR1}h!X z2#m9DE|4jtclbNom3JjIZ1jk^rM*`=;2x3^e!1788{$FKGSU1Eh#g4xFq>UQx*^F4 zXb&2DZMP>C_KC7TPL*yH9l`x~(B{|06d!Z>#CvN?-deh)dYgRoaFn`yq^Alk+l$n8qa`YD>|mhiTB?zRIOD6!GJ?cG!bLRwxZC=GP( zbR}>a$<3u)gYbj#BT6rlC;GnAo`=2EwM8eCxI7E54;ck09Qk&&+0KMm)xufC)t;v@ z(h_*QE)*;|IVqB1M=%aDN=w zw_jbHY%edz>pjEfEnc$%0Eu#;_Bm$q?M(H7l&5Dm4iIl0w=P!`1;dEP)gEd0uUJkJ zRXqa+u!&V%uK)i_qb06&u_4@=f|#h#&5y zo1X>5+5^Dmz6UvROvQ#$QA1jRXIq%LWoklz3ns!ny;4J6n@ABo2!=!^7bON`+ymNn zDf*BW(h{JwG!3!?cBTU%UXtJ-PM-|-MzNo04#qaTl^!o@Xb(|I*0;5GmIqY6F$|x1r1RyX9UOGz`qKSL-dQ@!~jxC z5Ag^JG@A$DVPG*(r}zrf>O$A)8A%Qxc>o)&?F$i-4;I|58>*s)5b-B(zIE1a^sZmO z0YX_c(b8i4KKlVf0AwJ(!m%h@$zIORHUAu zX8UlC_4|Y4K;|{lXk-&RJ?%Znt_cv>#W1FNDqD=^lQ6Lq{WCZG{DdSjv@Zy`z%Y_; zwrBD=9#QWGsmV4XyP_9c+|>tNEJMdw7l-xW?^+S^ww-q+mKep`(;a@fRQbUs2xhwy zqMCwjrcHJG(7_i7?A5GS+mgMkLsreDVw&?JJoVtnm=3>TLOw=$L0e3$4q(+fbGm~kIpiKg9P5|mHzL1q-oh8 zTLCEQA=x4Ph7yCoKHIwWiNKEf5dp48@wpcejDL&m!4j4q8x|Fmx<^iJ(KD6)Iwg51 zQFOG35!Qeco^9~eQU+W&(w+EpQBx2!Z1`XVj!9wTHI(*jxG;q~iRZDt`VXJT=I*Wq!%gP;C=5f`qm7cs)-B^;4KTH$$8#x&@Z#J z5YBPGqvhv5c$Iu=JN#R1=wVEYtu-}?Nv45+_R(vEKIT-9TSpN|ggZ7g@J` z8b;n>t;_ZooAL28T!P^ex#Y||){l%fHR}vb#Lx3j0469$rX~OJ+Y{>h+%6hPa;YLZ zeL{ylOKWcUr}*sS?6p0sP*&2kRUo{N=bd$<)gK0F+Mg)B&!{s+H+&=BCc6QVd=_wF zejC*YqR5uDxR|@Wm@VomsE!U(*R>;05_ZKVy$$8P0nmp@;V6hKw5eO9UOY+IZnt0O zb`{Riz*jhh6Q5MP_ig}gn=!wb`zh!j6)Bgj{=rgbn+Lpd&KuZ^EK)B7^nGCODWDxc zf$-e2jw~T?PPFm*Jg?+eYlGK#B#tg7Fc$8_2MjLK|L+2~o?A-fS#sZ>p4xHCGjabj ziG(EjUag=h)x+$%wXAK4`$L*+1ZF>x5kjBf4VS%BX_9oZ z+Bj4>?GQdH?wJ(IV=?>^NEC=&WqIO?z1e*D&7q`8^kqrrT~pD ziEPR(2eGLMgw!UWu3_a8`1xjnEY`UWBzw@dWK^Vt$A{Q#%joZ_=q61X&9+?fEG&* zv4E8{p|U39QwhRcj2Vi6H=hxlE%ZUKqma@|xqNXPfl`o}a0t@Woxv5_eb6AKV&DSK znG1`S7fKq`&#Y_Av)cH{Pux~N&7=!!bjA#~7#!{aq8Tg-!AK{lZYzmqJ$D8YncD0A znbRhu5uka1w@`IZ95gYQfb8*g(iX!upswl$yCi2|)cVMw+Kv+9`=x`OSDu9ZlFso&p|L>zg0Npczj0yoBJC0b-Qwfnop%;8P z^Alb`{7gXT>S$=Om;T#HanS%aM;#RqT5~0FD6h#x;^}>S55{lRJT)F0_*xB{a7Mm} zqYzlTPU+*$7pRZ;u9P=@xOb3-rMX)l^Y;beN^hw;G&dDc7w$d4T+&4u=fx@HHK-2D z@DUoWu5%*yI6~KAkUpe)Q=~fs5d!&C+&XoVs1fdeW)&)VG=wu6doib(-!4Bm3<_5R zS^&|J1rlvga42u9KO7&X<$L>gbEfd4SZqEk>HogS@+Px5)9UTw|9b`491A-du59vP z&MZHfV;wIBR}%(Mk+Z$8&XvE4Auq1n6|tKyL`$L&Kqim`i2^m#9=r8@-vfm~VB?%d zuKth|mT;Oa!3n#6E5QzD5Nsf#bdfa()}x|oIU0IZcXA_Sr1rD9iG7;JbftBXA!;lr z&@HkN;C%e1ovzb3viIMBRszl+(t2gDTj)(e>C4i|)UoLY=s^gWW&dJOsY)PVew6}O z?>mt>kPc|R!Y0lpPR?tSJneNl^X>3V`~8I_>qi4{HfWferKX+A3wZu482_;^T@seM z@$a7Fh6kdA!*$ZW6;-1!hMHXz@t>1ZwFgqPqmg>->2pv7g3o9d82>g)%LE;K)NdfnmcB>Ze8fm#$1gm%}V5kx@C_kU8 zaYc!}K`TBbo7ORX0CFj)fNwOmcBh7AzH!RQ>}Ib8hs&TDjeEk+09*sVJpDjSN~)m6)=WUXw*G!} zjsXbecK}m-H+U~t)IeN~$BVK-?Mdk5a@FZ3n0(?M*;GCEzPWN8I^kbUrafEmY$GxI zS``FM&;X|(Lt^4r|5U>eUHw3gMtP)F z5UBmKN*D@<#N8i6Th(o*p9Z_SF^CZk#=N9$8K&5=2Wet>`?~4mc4&@}PgRu&%s8K$ zt4b2?lNf(zWR$+=h^Z?3jQP9lZl(*{-ezDqDs|peJAChoF>Rn$%}MmsUme(Ife=P{l5`NP0fLMy821zRx91TTUIYXze`t8R;=t_s=!mfi2W z-?L$_PQN@!8M`qyjifjlDIsmb^Z7W1wsjL^-=t$~3Ny&2Nga>0zHpUX$ZQ|;#)F@zz*K?vqD9^inh(4paGa1{5fhgFwqC;`1DID4c|PWU23slI(y#tSWFSA|8^a_KHubsCU2%b z$Ko^v{@xX`9r}i3iL>T%MdYhiN6ZqWyLL{^;D+Y74F)?s0*5MB|6?>xMlpTAgyRm{ z$PT9LZ}d)y#+By@+^7 zZQJns8(v+q* zadSV3w9%*J<;YDXE|Dw9G#)KqYu#M}AtH<~Rvq7QY<;H;t;x=_b?Qxe)m4Vs@YLwf zSOYNLS+#9R(|$*-AG1(Zp~~5%Z;o{7jADzVWiQi@GOK^(ZN(C4{wgm(zo%Meu9PFR zlUlK(IO#y6GpixLCS#QqL{MpSBo&Tj0YI#8_sGoplD{A2k`3V;{m`j(d8L3~+nW|S z$t<=WY8=$CF5{iWhA}OGH%8EFa8tG%sufT0UAMmG`%ojrdq3D?bxk|_(i&;DmrT|r zhLiRO=al7153|r|d3~xvV8-g254f%xPbMv6PlT;B%vtVd6&S_LO33H{bZ6)6$?TY} z$Ln`~4BD};!l{B4@*~QE-i+6zU;`JYIy9?nJ)Q_ZhR9(UjDxX6Abg)L=32b44Dq$h zB(5`~F@}Zh?6Gy{@*6xmPq1+H3J-|;397wk+!zoKBIPm;5f`4Mk*NnMUmIa8g^-SL zfl_Y7@gW=)C&8?5J*mQ9Me~W0=B3hPy3D)Affb(M&3mLz6%lA6^4@Gmf!pasxpKM@ zgPpr%<$Kv>s&eC{(AK11%^#VvgB~0=VNgC6UVo=6IQgneC|p1C`mC{S|L&r95Vro# z5pq!^0EL2ka$EIzQ=>)CLOk+(qJmf{yJarArI^dtoteuO*T-*OsVUDk^s{)Z?r7A& zxxll<6c?+tUTzJf>AN-KXurL6Q(xuOA=tEl@Vu|vo#GmE5P4!GmT6kobtNX_cF?~xU$&T9u!{O7|`g}w!h+i5F(xMc#Mc=%4Mp@4*w}O@5V2+XMM{~(hxNes!=(0 z3iQ+86~*zp~enXw0TM{4yKJGIn#!SJynJ<&r=Y@$LMOkvy;yCSM)3!h;dt%rJaY0_F^O!d2Q zosqO?u$Rww`!kQci5Ps;Foh?TJ1)=sA)C`UWaT`tUmoTppYHF9LQQlt3tOE)bcaIL zvjzdgz1f>yk=(OH)tJ)>zpmNn@;Wufgo zBFDZdPC&(`+ZWWT#ZU)pmf~dk*yYIpjJe15kkvXNHj7q&b8hmxRQH|Bozhdvm+=5C z{xcB^Vj_M3)wY7qvw3djY>DY07>HO-0^GIg+wqc?<~E;nqJ0pp8caytthVIZl$hzd zA?5Xn!Bfv|9zE-H(Eb8>|IX-xG!$0Lqia?hU5&fe6Q%TTMsxa_NZaNXsFMc>v`GT# zw{^R>rJssNx@;3h>D5wVv%Gf@h3l^R<1lY#^? z9HEX%;YM&_6?gcTe;#t(o|JnR?_?1E{9zzZL^P#g!t7yt#9VbHt_nMVhInxfnrrUR zsHd=NSv$kJ^V=X`=@c5C;TGJ-ByPe*i#N#h}Kp&9A z^_KqV>+9{f!J{FP%@4e@=063cGe3OOYmaV+@oQy`Hqz|%iu@QA$?8{{B@Slxn7dwF z$LjtpHi|!9t~H^@{${q4fw>&Pl68HTW95sPdXaI7=$Evu!NpkNZCaBe?X0csdA8Hi ziXZ$cS~*f={6hp4ul{C4qejq*6Kp|E>#N$sXS#HI)i??d`;z^D(L?)?@a@dpw6>l_ zfh?-G?L@cQ%F4Wh)nDg3CKybFk;NmgtzHGd%cEfvh@G(Xo`uJ(^r5tdD}0jfjc8^~2IQ54nUsI{NpCeH%#DWX1{9Y!uN*fbZ4$RT zK(>9=`NG+69GdJkF4pR`r$yi!%#+2?V~ecQe*5l|wLyvJnb^ddl{VWe&O7L8*1s`A zQ8468?Oht6E2ljkZPv7#(JebNw#e<`MNEK^Hsn3S?<^lTRrWp za&A*BbGe_92agD**Fl;|4kBNPY6ZeV@J0Y<3r5I zQ6DFGHUcVPn&Wk!BsYVN5$3fTOU`ESBbyMurpQoDAL6%J)DupBqI2z7qtn6><^iemds}!*BpWz|p(Lll`@TkJli~6qo&hUF@W##q0 z$){|@Ns)txQDt^5u1}ZNKBvj7xqoj5iCPX=3w~Dx!N8JPeOdwbl(ws6?(1ZM$#eHZ z`J_T+4vPnSE4w$(aaHRs-McQj9-BzpnI)(g8P`^)`d)4Bb`|O>xGUu4Y*l7IzL4G~ zuD8c#n~hP*eMz$HjY050G zv=whRvVS5_#FX)UlWg02pL&bVpT4n!+lratQ42kQ$MQ&cLfqchk?vh|O;x*klA8Wa zhucLUiFjPD9_>xUK&T7F`%_$J-!UW`$b9<5Lci6y*jPf{pl`5v@zSF*5G5?s{cO;g zp|hm(GDj&x+~gh~ul<6gYm3KG1|VJxTGNaH7OKC+h$wEt8zuat{pAYWoQ3WJ2NJm9 zE3(#V5Mh9u^Y|wX=~elJzc4;%ECE45SPwb!U7CaR(=htQT&hg4$3*%9Zk3oQ=VVr@ z555Z(8r;ylC;2!*eI&N$IO&VTYlnc})j6COM)Dw?Cu!zu2?B)dn*x}@#m>`MsCR%b4)P67V9tV>-q$+XIpqo>A(EF=>}W?nEJe@D zlqUt+FWUGjWiEa!KzH+3e9h@wvVX-0-p4jS#jqK%K!Y`Vx~e9ScNG(K9+gA^l~9TN;iA(#C@|-6w&}HxsWf$j2QqlK#!0m zRh!Wdl7EWq@il^6P^}4n-Pc8ifZe!!AfR5!uw)I{NQ0YC?-h6HT9cbT$pI*(%mdBr zQ&z^5onJ71Q*XdaTi>CM(tpbTp?HUyB@ot5;n8DFye*OGXIa{FTX&j+f{s;nte-Us zd{*LWc&tahDs?SjyL}Ky@SZpDK14SWvl!ygwU|IIj-yR@R_VtFn+LU6Ibgt0Zz4C! zDORdw`q?1xNt`ZiHLs{ac{Rlq_U;k;22E(pr^%3Z9+L_BE z2&HJO4v27UtY|SXtu7@d2>aD%p_A50F4XI27eUlr!5sk{Jep|YLgf~0S#d9li!Uwn z4q&dK3RKVq{_Gl7(a9Rh*=&>NHory5u(Szc9c&J&0Ev;fFbZrCz5=h}*$YNZ0a=iB3=2@43TSaAtMv% zjte>VBydu9V_*vdH9U4AhoHipA_fq@t|-ZCmUfPhleP+WSv6uECnflmeIO;o62Rs> z7gzc?DZo|A9FjN~te@77H*MMv+uo^1mlYOD?Zma({_^YWAYW4uA<=Y$N|WnWF3=@- zO^%Kn>W5Yu;9Jr+$Ua#|J9{^0cIq10XgOf@ftv7llRnjxW_o1zU-Z}0xyqJ&;*k}& z;^c41wuC)mD?KO=YYt}TXu~bd{#BE?2O$x88t$Z9PgNkpFmB|F*cv0kwhF(R<@7)cO)_G@t}yE4L=MD2tVeQ+#P9;e8AO# zU0(6cWig{Hh;l%gY~8r&(eyJO*08~aCUY+6-m(=24&+4m#a-}M-|S8qb;WU5b8oZk z1|mU9<>Y2l$j7bfB@{^E1R2#g zOSXR@=F=j~i>sXq-C#Nf#HleKkxyE?eLck0>CApvPgGm*g#&WDfrNdZFCo(GSbNU! zE8;ueV)_e0+&+`9ng!qG`iJw~!S8s5V%KeIWDBG8cE~HgnfR`}X?glEs7xaxRpny% zpv&93%tP49cqEd!-0IkfNO%$}XNuO~N1H>_#dSNgYAvsmuHY==MZ5C7?!Vrdx8Hr6 zg_^aHoDhnDH~ zUz3x23V5lLt1%phQ)NQ&S)C*m;!G_E@=m3+Rzq};IpTF(64wZ?mCCal^*g~zX##`< zHs0IN*JbWy=BZUX)pmGnYcBzPB3bL<_+w32$Qa~wrmL@2t$yT9KMnl^aD2t1Yo2e+ zY%fD9UgB@(vVY43E-+^3FU>MpPL&4WNj1F-H54@T0=q@j0Qq1xzVU%xD*W9yIS^J3YDpM=eSMDVDg-Se9c&J-E)1gh4Fm_7pa_M5 ze1~$W5#f(5S>(_47Sy3IPX?u~VcytDq4a?wO=Uon4mSIG=T=Mh1DyhEo1Lguv606)X|Cp%mav|mH?aX z0urmO)7gTiovI)^iA1k@H__eqSP|vZn+fyw6{45EA+zSMhP7khxZFdCsVdbv8Tn~{CMuOTBQFD5abkoM^Ca2@wxzjV!S zlaGx7{Rpoin){KyjUH&(^@SFTv%J}>Tx&`w(UY%3&407kBj{tNhq3vsC(!Nf5uewu z=Ik#*?xhnFm^;({yGh(ct2wReS*_aHZZ#Q=Qjscmh@OLyzWNKNQ82Sc@z-t)8+3aS zk^ry0sDt}nue0LvD5|)qxJQLMv}!|3MU&GIqRD<}AH(4toa@@96B%u!mK6D#z&sM& zm-FdHIrcQIU7LmKthAii1hK&uAn*bECv{QoFt8x}hVC~!@=;GBaY~H;hoJ_qdufR8 zRc{!4*B5i?8Dn^Ghs9sd0zXDf;56-=n@LGrTf0)nc|_He=2=|mZ!oNi8${xm`4dam z`!nQv8R$FQBiKZg^3xybFA#d*e4rH7ZJN=l^1YHpaP_WNR;-2c;q43u)H{`#1Zv4^ z9pwNijzGKw1we60siyV&zW_0_E{+5-BPb1fz$WSRu-D8$@pBS zfj{ke;>6d2!Ut~WV?&^KCu)Swe;}hE4COq`jB-KCRJ<;T;-+DHwtlLL=eB?C7Js$? z=~m6$EB%!ATT&0$(XfSaBg;k-lV&DZN4_5>JN79}*7O4TGoHr{@-q2Z=_}zpO+;io z&;k?ls+>f;?R@5W!s~|#7yep#JX5H@D6ES8Othe{s@-Q-@jLO;r^{AC?W?0onk9Wz z+6iPQyxpp~E-b|Q%;ZPs#j8CyDqphy`!at{@tuHZ)#9Gqh?v_>!M0iqZ~po*eln7X z<)x^H@_gTQ$EUz`=L&3L(W|5Aw}U2`ivs+QMW)Xfdd+XBG>+blIWmtc%hZb8Wzqi)UScn5(%%>wd_a1{ z>^lU8`0x6I@jXqmc?Ij|ILhC%a_@MDpuIN7@Pr4}jIJ@8_=xZ(Di!aBitC?J#A>E} z^VbLvhAIPgW1Tnit_Q|oD@3ThYeI)oZE}gV#i5DBYNnxblUAvoVr$py0t}uF zIB+G29T31>m2T$5PmU5hMIV3s1FfV1Xr=Au2V?nn7_rRPsBLkaXEp6;$F~}l>55h^ z(2-M%A-7;^`k8W+yDwAZquq9y)A}!s8oUZQ(?A$dDe9#-{gS~8f`M6rB#%COZcy_` ztZLsik4R>XKYgUlWqT66_#IH&1fN306+Y2OO*>o@2^Yse0gv>-xedU?sBTTmTCHJ( zGY-&5Sd9844e0MCMntHs}g~hg!_{|1MEUKuSc&NaqJ{^~W(p4$OsMR|*WD=tU#iB_W z%Hhdbb+}eon~N%wUZxNHKX~c6vfW*O?Qoo`lbK&?*4O8>TBjoNltu+koD1o%y&4;p zt8DrkM)}`D(J2AHIO9fcjI66qm4o&D$o}ibmytnA<+(n@KVyBB8C3uVBQr!UX7quA z@bR0T#WqPH27mH-)OL_~Az7~837E*+xoJ5r2pt4ka1kWSysLs?5vCJDsRH#K9;sn| zVub=W<-7hoB7#>lZMB=D@y)|j752{qsCm>HMEvgdx4Des_c#z_UBBnBebO*SN$tqr z*C+Vvv`MiX!Ld+L?xQ`dx;nrC3m%uD|B%_V`fyU>6NjY^Urulw|2Ak%m&Ao$1KAML zAdXQgm&q&B;CzwuwG3ZQV5ii5O(}(>byJ@Nf_zC_d|0NrkF4Ro$V$V>am%-TfVgI$ z4q`RRBp`^Q>I9o`)_s*6J@4u2Z{OqD+ni@+OJ&#(FopF*CO+}_eC9JC8KGytXuliz zIRy5>T=8H8y!l=s8tXI|_W($Jr4KiNUU!VAL zDC4E>8ZAVUmyJ^`eq52eUx(9|#H&ybB&k^Gm%C8PYDMI^?9oDV5v5$!Eqnt+!;L5%8De z){A9B@+!c{4k>I4q2!&m3z*0I?gf#>RZPa*1d_`a4}z0}{iPyaiuW(HhR>W2-gj$e zrpZ7W?A4PyAcj)yAVhAdh;`NgDim-~bz2iGjDQc#5YPLPu{?E!6z}tO=5c07;WR0a z#nPysjMsFMIck0o+4E)tY}0vhaF(r2arX-?ek8dHHc>Hc1`*ukiXwtRFi_Nqwp9?L zBxOfSK)$mOJH6p0ezlyJvQxrU!yl z3gK#49w|?5x&Du2s^2x~0yR)KlZU&AnLWJPMuTR@Ua;6IS+{0%KV9oLuD%+F-DW6^0qMs+pn^y(+!upgY(v)6r<}dsY-2-X!9RPMjP>eGV^dBPym9wN# zIH@gmj$!B&x7NHrUs1%E@Db~6D}5>1d5 zA+*M2+k%1NNs~_<@LNL`wFTQk4+{DWQC};;RLg2G}LBh)h+uJv5xrFyvO@{br zAs{K?TQ^pv+4xI}q*iIH;>%m*=*)il?!4M>fn)f2I)L$QNcNb(Z8YwsAab$w!?zB| zfx^4!HHsezhj0~(iNiM*fS~rV+=;~aK2AcQD_^>8G1fWAaKHMIz&AbGq>1gXl!Ih| zL8R38!#A|hyalAUqUL{s^ZkNxh0+{};pV;h{#npeV-(bqvgaB|cpm!1!MD@iQ-tMO zu@VWpon*gGB2vA=Js|UYP=p=gnI>K)j?-o6EHsTG(2v0&0Tj4+xs#cq7-Mf{DI%Gz zE{XP@6Evl$c6joZshu3yM#C^LqUzDMQpa+KfAqVuIVvaV7Fk`rCFCR%%2Y0Dpnr{M za{S&Z<1sjfEVcCx+F$T%_3;Jw9P>kuPUTq5TA8i>9`gvW=2ytY}?`0OI)R(_t`(qLWP>A*R-LwF(a&*L0NQ$F_2 zyl%ALiZrEjc|Rfe*XJ;k-nakZO+T6E9eT}o>b4v`SM9? z)L2cHG37FYjfJ?F7kfH9sPr*r;oS?*ufiJNB}<##!FhywehT9I(ABeU+X#li;`d#ki9EHB6l3h-c$0XbUC|?lRl90nsTz|5;|IzA4#?i6TN!H`c15JQ=N@IB(3|<1J^{box27ZZ|OxAoc66v{Kyu(W3~lU zleIn-#r99~07tGxp{9l_B7yEB%M{`?FZt-E6r}bmSK+Lw1G!jBO_1ZsZ*g$+*x5c{ zig?IL0}p!iGh4A=GgIL6`j@Nr)UK(wheK)v$dr7Egr1r+SzD^>tz*W9O%0}$$Plh) zC(DEVg!ztJ4NxCgM01yF*J$CLUYJNt#A#Pj%rCWy>n4vZ7kZ7-Qe{gYr3!B!&VC2e z)EUHOvCyjlB-hg0P!Vh*z{eBq!NN|hZtA-!d@k(|XHYLvZ#n%42)1mE^Cr-B?B{IPb{Sv?JZD6*MKVQ8B8;?W>RUnHX~b{B?)gi|3IuN5r9zob~+qk z`b+2do^Y1%gfD2$8CS(0<^=5Jdd_4c}g}e5%Myoo+z8-xyAxAH6oMxUo~0xG@mPMBpVvwTqr% z3wO-rsKXPlzlZJS|2Y0Uto!{3_?I_0REauTuK<0rkmJ^`Fc>+jo4zky|GYBD=9*@Lu zAD9E>BWA-oj#um1srNNZu+>cf>s4?LMuHCr|8vkrfj_8|;3EMz3FiyULJ(8Po5X4K znapR6Wm2*}fwldb|6wEdvsH-w9hQ*!((XALR2tbmG~t8SDFP!~oM>rSDE(k=Fh3z| zz6#J{he#7^+xbo1&-bJn5VLCb3Za8N_q00?qCFw^HNm(}zEZVgPxhVPYeExk`&hz% ztmD2MyK$>hF(f?y;Bh{zqJUntou`uhu_WJNV_#H!yafOa^Dv_byq$F_2>Q}-eTaYGi%p*I_YDqH7*P=lo7T-)ijMN-1<>luRUQ@1oXeCo-W7gFG8<|_qn~vm^_aEOuxj4xi7KkUQv@Twe5xzjlDzlx8@IRg1d4VV?A73o^I%97$ zzQ&SH{3x@+BD+pA;mz~(PbFIlr@WOctITc)itR zrkEbYN&tPbk910-!H<)7FNDb~#W^l9rY+M7DClNXbBgmjAHz4$qc;+)+LliC z_gqkzwAG#&@2 zwDBAI3%VIWL!RL_k{N*RvWA40?ZWWtZeSOHV9BR~whjse);)Lq*H1F;-?M*@+H ztBy+=*%@Ct3d7D-foJkbGdVS`LAfKyv(tWodrgIVR+}I(hnQ`fPEY8S_y-D@a%U`mH$Qf7^Ka2jO^KYo0~)dt~AB!ZQ+NF z&%6uHYKbA)>8$(Ae0lH~&$vKzl-siuJK#h~asY54SCObjKVScS-6Y(YJu<=7fjg6$ zb#5gpK^}pML7V37HzIsR?h*G^Q@r7X_$YxC(qE;Lu6G|j#F%uMo|{kX-)dEV5?<;v6E$UT?}-P2H+Ppj;Ev2*N=kP&U z^NEAMYktL!A5!KfmdonO5~p6~5ruLh)Rg*2DBg{TUE_go{~J%<^Xnkcy5gKbAj(V6a zg$oQeb>@~R)$_rRB(PNGZ=`(tvFkhnj-H0`rjpF5I zoq?Tik|3Q1N?&A7to}`2c%B_}!Wzmw%CTK<)8Qd6P~i58kJ^fjS^3XiQL6jp{W>_-oTpw;g< zs8kZr&iNcy5PkL{Yi&+1^YQQ?|YB#)h)gqN`HCw(PS|en8kF;6b;)V>^DEu_PUjS zHE+vDmmWF?Gq}{QpAigG2&d0+Ug*)}!HcpGqk{$5#+CE0`nZ%aPF*uM;l+>xO-1hI zBMQ}(#6b_0P$H^(EJ6~KAHKMgBS=R5VdnO7Wva2-05@DY4qD~oGavIzFX;Sr+~h9$ zTyLP^@V&i2kxKSW)9JuE_eZx>xFyY*`~4kh8=1V+v5>1v+)oN-?ILt_sg*WNqqM?5 za~0W7pc-6EnBy7k;UgC^CCAhbbJ&MRgMJ zKW#jfFmm~ZG~3x-qTdVMN5mPzsDt&r1)6*7>}rV}(T9U-ot~izaEh~1x4o?pdYA8? z4ZSX58k(7%Pt2dI-E)6!yq9Nqn;pYn)05V+Fp*AdKU~Ce&=o#7lJV$ZwlFBEf5mv5 zj!R=vkGQ{gOe&UFH?d6W`&yg^;&1YR5+DQmXE4Y=(I9Bn*v>?u>1)MF(q5Yx&M)~4k*h=B4S8}Y zov+=D17p9tuvoGNlVkrxxERD@vS?~NqBW1tH~>4#Bg+m%o!ox|D$gKp{oiRzos&G8 zxvl**dXxTRq)|h8rFAe~yk_qY!;pPj*(^gp{7GCveCECj2$7(w#80R<&AzNV{(5Ag zCPE#Y^S|f^&AqpmueYuS^Oo{!cOT@b6PL*M*J*W)KQisC6Bk=2BL9M-Ff#lmNE&db5H5qtP zGdmE^EK#8NY>BW&zP?cv(W+O0T7Fs$%^NzAe-(q5D<%62E!Bj@Xjj=U`Uu9h-MX>= zRil-=v0ZKJ-Vb9NM&Pj$8}6p{Y8m#(a3}I%S39;yciAR7UUE#IOCr96fKsi_a{Q$|^b( zYL)T}>qRpiztN3SMi)6hl{cElw$s99l79YbH^v5RLmU`&lWd6DG~cZBBpR`Lezqpt z;`kSM{+Z-^K6mr8P*J6pRAlYhcH%{ehO=e$zlk9~(1s6eTWwqdiZs$xei6mP+|qZo zQCc4#(GB$K-^M99VE9#Ux^&V~7RG<5^?X!rU>q%w%s4ju(u&y3VpO{X0~`qRtK+u8 z*N7hib4e%anRd6I6&M4e{+#F&y{y;WGD_|KE_A4EYP8qt$JQ94fMHA9Fj8I_Wp9no zJJ9sh@mkj+kc=$peKwCVq`KA54SF1z)FS-frOyeTME+yU;e?ED?+_mk%2jgjJwv#k z*#G-}GL91~j>p^lX4%SZ@WwPRR10__?In7HZ-0G3KQ@n#9gCDV%-lW)iB9K{?z*Rw z4oVYCxFW+5Z$U;8b1Ago2A7MNLsL@g)ajR+h--LOD@X(iiSxbMd8%|O`XFkC`(2sF zSS5syI9UDXn~2D*hl57y$g-!jd1djo zWA4va2MgNPyCEs(t%XN6)m)zshU~YbH}XO`{{mBlUco(P>1mQGt1>Fv>KI^Zyfy2R z;ow72CfIxp-j{UbemC#NtZ0d@sRLH5KDXRtRlmdL2^mq~iBgt2cwZ9}wTcLTkhkza zyQbiV?L-8o`PBLbb|Da=S}gXz2SWArWQX7)y^TiD^>>>`tI6jBKidGExu9vhM_><~ zcI+44(Z7XR)<+AHlJ0-JOZxPs$kmZbqJVR5GC(k!;u9JE{!2hCjIVaBd_0dK66m) zGITN}dh>z|lW1o5;ke{M7Tw$|bytOyLC|z~i{vw_2)@1$V%Z18d1huMJJquJ(ehyl zvBZb$$hGYm>22}{$nf~@%X(p|Y010V_-(-GLJM%d+i*nmquJ4-B4AMK1T?crUuurm z6}xVo1_&4?i0TKC^bV4_>P74~Lk(-{`5M$f&=BkxD*c~lHH21Yy+b$%!%W7t@R436 zjr?=f;D-8MfwLsIalYGOX5{lhUs8h;3dm}sL%cSK2k$rhRJfi;WCua&B?IM6F>P)i zOm|K4_wstM((>zJxvovZ<5`SbBc|~XWr^#LrS<lL)TUD^eAzB=ddXbz=FV1S9fP33E+^kKb~#|Qyk-!EXPt*ote-Hij=b0?7C_V7b^ zL2Ir8BZMCv@oO6p%)CURfL)J`iFvS!|M#B&VA`l`%yCLjn%tHEkvk@@WV<#@{^Jaw zN47nN(r8^fIBG4v2+Pib6}?1=r7`;1-meAe3sG)p*N2k_=jm(*zlf8T25#zOnpvY!sXRJU=J&x`0HJ|5R69zD{R91}vV=p7nw%}`= zpuGnhd$+2(4!z}AA&)!oozx*%|8s4M!RWt&a0HjuFEsBXtL_TvdD4xxrmSQkWZ@vS2(6B33m*`6hWKY2mBPO+0`!cpK6cnl ziXS)pu5LAPXrErD)O9W0CCj?6v65W=-F+!^?=DksJ$EZnz7qxazJ*+0WhZ5 zm^}P%LeWcF{mR<8E$)rIVu5KUnEF|L=lq{sIQ#;UOXSpRmxN8j$;L+S{MbzgJ zc84G55P90v%djdOY@0l|fWK9~s+ZUbCk-d#TWc=XoOul6EUI2N{s3?*yC2W2#-H3? zr6l(kKwD)DSamyr4`m5Jq|qQ6W@M{g1$55(QsYpHXhTnT*nrEm%Y!nECaCprin%7@1kWJiukjNF+4(4EJeK{zMCDxXaw3;*eqK`by5t9N zLJkYIc!RNl4$W`Q^_u0io-UIIPBw+Q&$;$nT?%UoK6?*sLI!<<<6Q$KFrq`^}?qu zRSRJ(#vn}vMHU9+Hl2X7p#^kLG${1~$RKy7<7yv+-mOn?R4_Z)Aq@2QzAYy12a`o6 z=$zvMrSB>X6V=5x|IVyYrvi@F&Wr3TCEbmH~;mJ+Mx{}B^u5-H|{#@ ztF#_&y2{M^1&c@SR&f3=1%(>(vh3LRD4|BaVakDO>DXNUer;B6S!1Tt)3?zgkpgZn zhjTd7b;;RE&1|<8zpJT&z)k$>9Sbax5*4|#&lXLFB}I+GUsFfFuKpbQE&;DLex0w^ zs0-j=)1S#8%T^Znjg5iosMPDirFyHh+Zae)K-m)^f3Etyrsh@PxQYjYiC4GkBLKja z8noQ`t*{$D0;I$4=j+*7z((5{=705{OQQ<6xLi;_YX+tEc~P_cU|tEyADobi7DZPh z$YN8GQR8%u4Hge`{*39BIS@Ti`91|WP+mSjsVFc$`Yf7tW7gQ6cH_=HQ*gRd$fT~y z@oC+mQ(J6Xl*-~~(u#tU(2C-Z8aIkvHW0{SSm=*V5RG)=Udmy^d@%Jw52L?``u3{I znn_-c0{}E~B2Z(1P7)OWsL|erFQ^r0%7AnB^|VhiaQ;T!#<~J)_i~6!IHO@GgRdE(AY(Fpj{0^kq@u>mpKwuRC$AA# zE|;y05D#nrOpclqB27tB#uDV?5=JT@KCDH6%J7@J_ghozg1fTT*&40H0p4DP6$_VH zL(w9ASomtKlp!J8f?)gKnM!~CdOyXGbkVn%%Tc^--9)?<^1De}6(5EF^|K`x6pL$h z!?}S;-k!_ftv{}{O2P<_Q)KsUZ;!_3TNL2-SipmO3-{_>si|F;hyph2?V04;p~z9j zrsCm>?eyR}28+vD8fZ~mLO{h9Cy~hHulLmakeo*}7<^ZI@a$lY z8JCFD?q(^rvlRs;6Nw@d0oC$U{Cr)4as7Z^WrYR`($8Y|Z zI{X;`TO~n8mo3{YhPoBS#R44_Xfg6f6aKM?RVNs+0qM!HiYn|POP9xCDVd_o$P9qZ z^H-(>6gX!BVX@tU>^ByxZ#bOWE+>s&g%J`))4zUOk84DJ7iPSpxAoJ_qJlavF5F>X zs%}3;j|3OG!YL@%t5vZ6g0IQXv^MxfvXQl~Bi;nfoQcA~8?vGeDCnC2L!o;1=?R+# z*X1jNP$hZFoBlsu^dEPu%-a;iML2PVxuuNkfG)itQkrIA%QJ3kKS43?hE*vzaY2Yi}ty zIj=vSav+i4FVs}|TwbuPVMxLNU7?+si&e4shy^iGzjx^xbGjubPHC)@+u*aZn#^|% zO8eG)7$44^^!{b1^%5$JfU*C7 zdP13KIz@Gs#x%U{iN+iVgw?^ITKvBTrH2Y_x2ai@zg^FHfp2A6F5F0zGNbxWJL8xJ z+T|E7V}ED=kxX^Cqx+Qtpsl*@Cw&J>hRE4B_JER{zz|_~B9_f+s?zQLel~QJT2qkw zz$QXTMZ*92v&~XpsctNC#3CVrwDAJ;n=3*hMgyVFm}b&2k%Acu%zSA;DH=OKz({Kd z2Ys{GmBD`TEO+{3Ua6$8hG7v0{hwR#@I!bEWLG2=lj)dRGiGBVJi3VcAJVwaGRTjR z@`(t1*Pz<(a0jRZLDFQT$WOT5In7KO10pL&^v$zoT88tT##w_CCo1L9{Ll{^E6*=* zh^NGPw~#elnzSO6ZFMb0Et^c{hQta)YJ=npB_8UtuYkJKrLAyGN$&zrvj$U9tb4WO z|5{c!5@hk^bc3h|)|oBhUILp?!B3>pbS8yAe0SkgkkJfM9Zi=nMRm@ERS%vmIXOwg z>CNe-1?lg;1xjR7X^6{O-b4dp^?04Klhg8cAoNB&z#^UPT}-!#AadJcwasfaxa!Q= z)oC#*DPkOi$MT$&yiZ?sYS03C&h_tP`Zt$UI4>s3Vdegt<1I5y zNkz5SwU9eChJq=$_kR9_;i z(=`6NEt)x;%E1UHt>1Zf=ZXg&+z}Zdz#H`*Ac*i4*RfQyY%#GjB33A((MgtNcxb#* zL09ammfR1_Cp7hZXt4g}&`)|JMXpMoUD^}L75QE0N`#+KHG*24RFDvj`aH1ob2L>1 znoy~pbO5t>Ye{xN}%Ulg(W7WXh1E+yH_kjfZi`(Q4r)}5C^rZVkB zat8#z&@MNH6$nBWZus%;z>iuT@nI3x6!%h;LT&(J_hWq5tp9$|Isf#5UM?Y zjbeA-+T>i6^Ek78g{~t^YDspA>(9yP(27&`0CQ-eg9%0t;qn*Q`IWcvnS)V}X2)?wlI#9SJ$pUQR{KNUg#6D(|Es7$8${F?#-ur}SjGPES>}pEqN;}{ zpF@kr>)r>)#*2+2<8skT@qMLSNQf<;DM#A-$Vy;?mD&J2viAI+Y@nx>#R{GM$d3E1 z1*7}rNfx6*L%~)_gQfmzuY@=RP7K9hwA3XW`Rk$DL-2qv! zYThF_?U*8jq?1~%w~6=2>upu7@lWFZ%?TZ@0*Tgd&XYl$yv<>R%`_K}w`^R(Vf^D& zQLZ5c`?UO$Df{Y1B^g83K7Hl58D9Kh7m*CV_tla+nblzEb9(|@qg+H?uXZ72iWp+= zrFusMTnG@jZ!Zfe#cV@)>>Z`hXg*#)hNT;>eo^kg_xmFKaYx{?$is}U8q3US9!v4) z3dhfUEJ*ovI=|@K@>_by2M>fJx`OxY%wh9Yha@Y>ELxSuTWk^|2jGOKYb&eZgpq)G zS~DzT3T}UrMgXq?X<&>hX;z@5@dH8H$22ac8^+uvcB$YZl!(b1wN&Jvi0TB~^&wAR zpv|yn?WhU}3!j`7ybt17?{25-jy{b(O#Zu*`TNbj5Aht{cis)*#+4h63O<)^bv5xdsc4O0TPRQ^gVLnZKBL|MKRgXvN&43S3;S1Vt zAfpW)S~1@qtJN$^yct#NmD{wYp=Jc9Uy@o}qqW!lb)lizm$6r{sR5l`KH2&_5fXg| zry+R@+3s_IP9?iWt5>;&OCQR46^tn<&{AZYF>$Z?DOV(M2f2^J($@S+&*BTOB$G}96pTblDRF%i*F--yj4aUFsRr~V3v?y*w*y-VBw^=$BuVa89{WCqSorG)O? zStg1+Weakvg4zDGcHc_#?v2ljP|U*_Ioze_1;2tV)0Z327X2Z&i4f4!DFi}_8j@G% z8^nwHTXc7BtMRR`R{O!1B@U!|4KzQPcW|M!6J@bzc-_+GScCBpakyeXKB=06S!qw9 zEAQ0a#AZrQ8Qo$m?wlss>F2*h(u)zh)u*HTG;8YHoCSMp-fuzXvvPO8|>LqKcAv$ zhyLsK6TkziY^-MI+9*?l_0lUkiiMSb!sawd+PKL97xG(s$@yQ7Fu@}DA7gx5puu~r z4pe&td|D*JE}K2{MMKRqtU@Iz{IIw>=qQ!hJsd{#2FPeanam20kFzC_)%M3>zUb;6 zOxIxHv&eao@X8M}_Dy+1P{lt|2?G@M8iqMU4SS9Mn^MQ|e%SN#Ol5XKq=*q|o6vL& zOZXF2Mav)=+a?ajJIu}-9@5H!u62VhIQ(o+xClSe*E|Q|whi6UY#Fm)(r(r`p3;`R z;6U|-Q<=s_G`#@K_9}TUeU#Y{oXW3vHWYI25xMKNM)RXqX}rIszki~T>^J9uy~8TB zer>6(*NZJ7x2E=AH%kCrVSrn3EvdHAYmBaKl<)fb&!s9C=XEQ=R>%)6gpC*9XwH4# zC67q~_uQF(P0R)tSVX{UI+qo~kBL`7`E!#74$EDEEVbQ^yfAn$+m{G?{pK*Ef_q>&X1EmzmEJA#?@RoT(}#sInK&q>FwVcpePdYr)03Od#m+7?;ZML6 z<$x4K9PlIIEhSqCLVE4kV-NSLoO<}FMAFIHXx_wuNFPoIGthSpTjtKb`k_C(zb$bd zL-wtuK~C@sH2*M9c2~&ucY2wqoJVoA9g1A%Cro+U@yyfNUohQ=#Y)-j{1UIeIn*jM zwEi+C4TfQH`oCG(Td;NvEW^8U_9Ck{LCZn|cID@<6tspvBi}5b00!c@etsQi33l>y z3l2RiQZM(G9B71nw0}@P23G8vqkH^zyu`^>?*6mTP+5OpgHUf2uQx*OBe?YWQRyIw zTS)bC1)8`OTuPvwiE!P=k!I*mY~S$5TTBjlCZ2~(+_dg)pS$hkHT^d=gV%xCZtL0% z;oB>miV8LeYj(X?A0S-#g993dg3fnS%$-VgGEC%9EVoLf%&DS+fLP9dm|^n{+_e() zYDdy1^7Cq8jiF8}`Li)RhzjQgo~Nh=yGTx-A!xk3dvnN4%ec8OY}G9A(FRA=v)ysy zX+e(5KsvX^XO&eRt}p)`Zg+Mqxlg@ayHEotEwWp__|JHsB>X4568<)JG?z|W+S8?` zIpf`9tJ(+Gk3##miJS!wwQ6yXbjxD~K3Kw0o{i+g>CmvtFOh%T?%{3x(1z+sp$&5h zT(#ewvFV}WwNYwyXr+@tfjd?I{(`j0($hw?VT$%)Ux+K!=NvkOb- zk^u%oci$RrV8nh+p`Q$8ZATvqDtD8cYF0oAbK3ja_C7@*A%m{Ck=Z5mLN9C|4Q%UE`Yg4z11AHY6lbYMvN|VR7yQ*F6&p7^D0E`l)xvL@P&+8U0 zh49ff?+#7<9kaX^iL^rS5SgsvP2aC8rZ!hsW#m(RKz?)TvmLWm3!IM{go=8f^Kf3+ zY}RF(ypdewalxJ(!W6^sT=XN~gy)25ng{(n1=YTEt}1FR#}PZ`&${?ThIAx3R##gjp6_ zaHl(K5i*n#j^~OOOYf*T?FB*7hruf#|9q+as!m-zY3M7-%h=A1hrp3V0$t%IQoguC z8B1c%JK{6+10lEpJgXWj9aXZL29;x^0)y}Bdm;3eEv|Vr`N41xx8|R(@NtA(-40M2 zK;!UisRxE;zM$XGJ)r;V^6?1}K4X@2#`7C|<_8d^Rrh>5Ug+h8b&=r)+se{|E z5on`uDbwW|Kh1s#Gsl6h_c{w`63&z_GQNlNzh>Urk%)UH9Q2j$`r{|rT;AcEcf8_u zOWy7b>)gCNgezHMYuYqlkOg4W>Hiarc>RG6ZNK;S@Jt28N-I5GMGP1EpZe_(rFgyH z&-rVRDgV-?7KJa~1oeY8d&!U-uCAIZm9FHLmG8bFE-nP6(LhQwx$bAk`%j)Kjr3sq zql99sbtkP@c!x~;)EVz*$W_$5G!FH5#RbooOg~ix;ONUgz1U9sEb+g`^I%|skm%47 z<1tH^&3G=U?qu;gnmegFn*P1#Aih2PX1FsXgPP9N1hE%={@rFg=lZad_Qk`=4ycpuvm4RS>ys#Qx|iF2>G6LK3^IR}A5RrdDhrQ76g9z) z_}?T4-em_$bDAF&F2BM5u z?W0Vy-L~h0Kv9`Xb41kVR6ODFdFZgKG`Aknt6fR4Q?%zdphW$`P>fRxrMQdJl5 zB`+rU+YCq0XW=OSTW-8Tk-5I8wo7%Nd>6zm<(!2|^i}fXv%kW2wLK(5#SYS-w2LbP z>Zw2>Ig=L}Q+Mvn}>#91hryTt^xpX{l@|BXB- zuOS62!U9NRja_b$N6jvDU%0pBTB!b5qZoSey6dyCeWwY!pFOlqt|fl?RI{MZ<1>S? z;rx!^Dg2M4F-`1-UD^pTEG|V%dCP3&dc-Hl!_T2nT}L;9GVZHq&s-umEP|cT*X8*_1;5^-dAxNJ{ZH9QfP*keGrP_C)NFoTy}>=c``3{vHmt>QEd2%wtLr5l zpojJcOsk>?v39>6Y$y zirX3P&MLEu@tQNtc+*C&^zY7pUGTr{QVk(@!M-(50l)fVS5TS_NK?6eQBjwub)P8~ zs__BNv?H+draN10Z8TAc`z@ST1})r=LOO}n>tthK1yC!nx|~x1!S2tDhW%*|y4Eq2 zXLv6gvKmeGEEtL&gnviB$z6gav^_TYLbVs4wIQS<(TUN4f!U;1z(dF>c^>`(brY7d@eCuXDe9RUQv^~X8>$JCoI zrutE;b0H!y#e7;X zHR^h6IJ*^qE&Kt=Bem9C7G|Mx*<;JbTjn;Tj(0)LoF&C7A( zX{7qFAg4{Z_k9C~KFRuWW*6wbDU+SWNuYBgiOTAFjYff_=_iLpob1G7Wr){np*YQE z@EO9N;5qztb~`g+NV*D#eYfhv%B_PovrBK$Y*iBowtJZUpu^)R&$iL>9qeX z)kUz2klQMvCEtM0YCqeveC;{}pkr%ivA)JqRLBopufKks3_OFLg7R3ysM>(q(4)`? z*zO+4R7**M4!*(b0|I*x|;Q6D_pbd`3uDt|4oEFA*TXs;*DNoD6U8CSSS~IY&NU# zYuOrS(`~Rb0IBSM>4S$#14z!7gB`&Bj~3wZ1;Y0EaA%{E4o8q6X0i1K)pQ z+Hi$rHek*s;J`e0#(DmbD1zRfxC4&RN!N_p2>!JwJ*R4B_(R%fBJJh(lpb)+^7RM);}wr*Fu=AWWW+mUz#xI-b!savGSQ`Lr#& zQ|HGk=Yf=IGK?Ww)IJ=WGk=gtS z>J$6jNuUyg*8=2aKKsWUA#mxSo&)@kHrTT0OyS~q{1n^MFy&nh9I23No?Ol|8ntQ^ zaI2Y2o{r{QRu?7?l_2%9L`_Jhn0mf-2IIUC4OXcy;8rI#O^HWTJG8Oy@;G(zz5lAk zOm$!%_RQOmRlhf!w;D~xZ~$7FfvnT;JG;{ph3x63=2p5=Q`?i2WbKbekBChjVI7}N zxcKh;Z&w2}>v5n-n}>FoA6J@PFpnaOC5W##=emYfQ3czONhR?Dbcsx^457c{F`(OH z%Rd;)$C`INk=$TqVw9DYHJU6Y1UrLdGf#-4eeqBqx8Y8KiT3mi-A?!0$l-Z1OXp z51O!NTGO@yJYCZ?CEk2SfKZP|ruL)p44N+BWFc>Occ2~q@_@)d{<{hWSR?T&V8Xu4 zdFmQwZ}O zSIEu6?Yl4DE{5}G4K3KGi{|q%4~-Qx34%OjQ>`u*ubmy9_aPQw>pl%OwKoA~LK`TM z{_}A_g+vHlVMJa)HdCXhQNhp)Tc%|cr@s_Q)x!^{x6LV2fU?Y_0v7=KwgDGvK#X!> z4mgv`S1z)c(MzbdM{}J5O6+Y@aI#?2L9|;?+};4m$F4N_-Kr5yU7cD-Yj@u)lP^0z~(|w9B*d09y$vXW;{DGk1ys>-M=2u zz;hCK=@F!r&mcVH0+-0p)OQextK*h%Y;JSa_lF4Z{=WaNt(F9Ng@jv7W??Sx;3i5# zs{ESGW-e|JOs42Km8 zoO{;CH##5a#ZxLnSo4Th^4{?uJ=Wq@_`X8I1Kp3Hs{*Gun|Edh`J-UT>F zCg9#W=fWsU^{KXq+9671LRBUv(TF!Tp=Eu7MXOOBcCyxkRW_5xQTbZ>)An7Yiw09( zOA^l`;U{zG`_04qfQF^qWslVs4PF(-1HaDGMWmp$U9?Agu)x(_!tt19BmM=b((}pE zq*A;=i+a?jtLa72SyKMStHLl$*XeT42>Q&O=l_kX1WE9@x@1~oCh)sc8|szw@o%yE zKFelDKJ?#+ut$qD7v?)L`I?9gIv?8t0HXO2e=PN@fmGLH1OW3sB9RRbF|)2?2I>;3 zRN<1&sN7kas5&I){nS;n-hf+1puq2GYjFqagg(COp%?MtxxJA)TzXqbxP(3w$k^xL7fvQKr69^YY%|5D;Gq=#V0W#gn_7@1B2d z%uyRBS{?xse%s{7E^&6Ez1e^e`m&bh;bEYj)Tn7s1hfy!u?G0tZ{S1Eb zNtF8Y^;eKuECc3+QlVyWZKr_fwq{K%(Bx^ZwqDV}2y?x8XQWY(ARLAl0zT2yg%p5! z?qN$31qLh<>-2;Z3JiXeBLl*2EX+ATcV`Je0IiV-FZe;~Y6jhZp%H#32=ydd@bLMN z84ZY%IWTE9%)oT*PeGiuzI&zh(6|}t)85Qk_&)^~4uFo>x8$ABS?&LD zxMH8rzM6}pdxCWu>#Jk|RC>Z4IUh1I-P21NOR&lr>KhhaWi-?>ZxxGl+m;0wgq8qY zx{{^6T}S(HvAGg9qJv$u?KP^PUZ&c-P*V8iTcUG+yB;996Cul!WPiBGCy~NAg{dvL z8o^C!5mFvU^5uevz;0`}Jt4*a1)zIs2fk~!;TbNwUMhOfQ&g=73a!zY5If~ErC@*k z(B7FSJvCH%7*f>Em&|5H1J*$O@BHVFoOuk~GC``ZK+n-w_2;b9MslSVW@oKP8$tjF zi7on)>GkQBJ&TUl2%vST^9bW5JRo}C&P=xSx+R(}swP0|wE|}fiB6cmBH&Cea{{yS z2_aUOVIY=7NVD38CR*qvav0&{27E?k+G{uX5pX=#2|gcYRI)l!F3tbjqi<3j184;y$paHDS_8p0j=@Rk0=ZW z)(R&i)PFv(ejh^$GCSl)J<}-|Jm@hJzVj|l;9lhBUhpW4XN!~b5QhHK=luNxpJX`b zFK*7SQb7hEP)9Uv14i2S(fEQQ{QOF*bdh?CB(6S;~p*PS#pxm48 zvnXnRp8cIp=R1v?=?+$1VS&2kX@|s(fYG-RWZcp?sjlUFIP{qsRg1d z=MVE&RMUJhavFLC>X1*ka1Gr-0r;%vfq}+2KU`@?I)OpRSkd%cNu>aR)q(o(&E9lx zVW#i1Y$2Q*jlqoQxr582mE@Wyl+-Bg>>4^!Mn_#+7eN2xgUT+#q*`5^T+4@_v2mEr z%gL>PAgHKZ%XngfKTNaH2C0HW;O3Vn^rK(>H<+7B3ie#orbp|<`#GGQ}h=1g>5QdgLnd(6z>O<-wjAnbVz7Q zO;+If{XFS0Cxg3OVmt@gJD7CACU$2Dq59+6z#mJ@jrcnK$YskahgVh%AQMP z+lWjYD(sH#75N!`wmHdbZJ+(U>;nkXd)El4&gJ6Fq!VJ-$Rwvmh=keS3wKYB=1z!) zjd~ce)jMF5biq+)P4Q&&!6Nqdgr*15q%<97w?k%G+~I;i_AzdEG%F|p(K>=E9`;Kj zcspKjs1ZruaZ`?_-v7K4d`BS_BM`-_gi?IRm6vgiq!2N&uziu)dlg}C2#dj_Ut3C} z`3&*38W0BhS4s^Jjmko#T7GepjB~dAiV#keilMDrxGjD%Qi=Q0;?Pu4L9C-R;CpSp zTHBMb3jbi@*w-bbdx^a-M3@&JncHiAA3OmUZAQnZfQ*noOav<8x&(o%g}+YFcD+!& z8}@mc9%Ca|JeR6xnfJeO7t0&WRR6-J>%SQpUar*)lhdc}Foz+NJ7h7J#BSsE(eV3rvq5fC-$8nc!{z+JIL`k(sREHb2IrUBr<_GES2Fe+IJ^PE>pHmx zfdn)WPk!lT#}a1HCZs@BI+~%6>m=Tv5vG++`sP3(ncN!5+lgKr`YRtmn&gGng9Hw1 z>LLTL9lw@FF2T8UK3aqMGeP{*66E*xv^!4>$hLYIzM zs8h=DKMOW<>=Ew}mSuk(qFK)i%WfYqQV3E`>sl4`9UR;aVJ-lCG66s@Xmx+s%t7Lv z@e+Bno?HOF`%SPMKq{BEYC3lc@H3C|mZM39Hc^L~i0wNo0;MI6pT5Rq(}^H5Uv<9( zEW%tlNe-InBI8a=EwCGEHim7?Cw#K zE_C5D^&lysz#VwA$f=9&+-9c*B5F)E#i(@>OeNAd{}s(Cy3?t{S62rH(iBfZ$y3Pz z;G}tB_{0}mV%~gkvgNwtwr@^YnPV|%?#9Ciry;U#ewF;}cL8V*vwet~JG7Dp8ZfxV z3|9A`*}6G`D}3^rZa5oJ%`f}kbpr_s5o9#Q4Yc!Z;ILVq#^ZC&%s<`mENf73j)KkiLs!Y79Ul#$GYp}4Ffb%0Ki4lDhH?4$7Ft+x_ zqg&~^!cUbcrP9XGts425x-jx~-3>SU9CabR>XDeeg87&;(?+Q$HT zdVvlJ8+i|)4V>o7S0_s+?I1Kges@^s*ve!_Agpo zaz_~IQ?2v?z0XuW}EnA?e zJI~!EaXF%(3l%jUUtP$jN`HRPd?LKi1JE9N^Taz<&JYqN57dI3)UndEu(uIpEWI&7 z+M8~VzLKDb{$Osye0Wb*<_J&Ks%P~3qIP`OwsW|w;c$LbGOikde`|mgeDeG7p-AzA z-h9TL^oFBEiMYJ1?8wF&%GjJy*Be~`*!p|d0{k${0ByR0d4Cz}WFb4A$7JlJd_D`R zkzGjU#7t!98bALrDCa+H^ta!x-T{8VCm!f>e{%tBLE_@Lzq~cJ8SC{P%jj^>)^W=a zqLT+$mYK7-YJYUo7eH{wdS`tp-xqJe!2K#q=~PthmGu2_gI*U}qx&O_ByKmA2gVrV zd{~r5lLky6wR_Bwss^j`Zsk=G;FuLFQ4zfgO_;^xN@)Nw{Q1F#V1bQJ*?NS#E44F_ zmP>mr5ueufzRULe>RtFwGG?Ufh0yi^Zyb~KosL)oWkRHsCnneRNE5ITlpl~veAZ7l z!uLLJ#P9Y3rEv2x+Fpgt?>{Vtg!6`@$-p7=g}5SbuPA%EtI%lGo?)6VjUWk+h-hz; zef>X)FqjBhDzunPzq}j}Ythg>H=~Q||0KIy__j{3_d`7!)CQq3!e-{nl*k4_cqKGI z90>j+4$&>ysQ#?uO30wKpP4WKOtm1f%tDn!Ux6mkp8i)Kp@Gez%=EbhHthCo;R4HL zaT~V^I$t0;H7Q?V$_#J1uxdI)tos8bLJc`l)I~yMKt%>q3g1gn0$Bi#nTrD&nwzf**1u=FDAgOD9#b)+Cb}fLYYQ_l0BAuBV6R5d@{=g_|9#Q zwm%)iu6eVOqruCT+3W(u?co z-Pv_X<=mDhP`CR2<{Y+x2DHZO7|BY?Be2O!vMJexjlsMqnF+8u^(iOtEaTR03E-Y6hui(4_W|+YLq4H z0SVxKlEl6jBQ1G;Qb9AkKlC2hN10Sj)oMzt5~ofH=|!34E`|0(=lM;5F$Uw6%4wE# zss^Y%`|f7nNs#VY^e@rSC+Q_=NgS(VeQP{Xi{*6Y;ca-8P?+MG>;C)EphQD{x>Ze( z9kvq&dH}&Pmy;oI>a)qA*6FE}7rGK$1|DoCVWBCL~X#Ov` z`YodvOV#Z3ak)~~6~Gh>$Hi8e`2an!T;3NAwUzj>=%S1H9Ezze?uAgy8`+j`wEN#b z7DOrSkgW=WObH&7f!5p{t+=iYo{K2!p;eIJVa7iI>NjW?^IJaxsjZJuxu9UA2m zlI~A)zEf3ZJBiuJ`tHY>v+RnsR0N`~)C_ONYz3NgxqhfKkT6fGnFVZAVuDqd?``TV zMq-V`)JEL^_fN?)YMptYckuzl<>V_cj+${lbMs9B?bF&e9CK2=y7Lp)!nW_K#iUoE zQ3vci5h5OB45Y}=Pq?~TBkDo6MZ)Oi)Mn`2WU4EU(;#N4Fku3m0jnQmFy?$}-95B|^-@ zBiZ6P?x5s@3`h#%YAy*+cVIjcX5LjTH(E0D#G+ASO{)+{L-3dPQIc+x0C}ih(t{$i zf!vK!U5af1-E!GxL^acNaxCLLFLJJIQSm#X3Y%Ov~hSBed1J)0AX~!2_dI_Qq_>&$1EV@Sm@>!hu@u;idnD6z;rK!5$$v{*CHMU95% zV{n*?zXwcBFym1zV9vt&<>Eb0_+XjGy?YGkP#K0CG~8Ge+;$;oA`*rT+8!+n&A2Io zUZ}cx`>;TK*W^Q5%vFWIjx7|gunw5 zybZID=PFOQmfzEggyNjLel){l0+dFLS8Y@%={W$~YX549+2ih4yu4ZmfSlVE7AbkP zOAwvAH69(FXZ7&CJ(=Dd`6>H?TxVRF?Q5R;b>EiqsOaPNk$ug=*VckAEPY_9o z%o7rKM@$NZcctHGZ3n^$KTZE|D%*%&s4FTaJma}seALJea%5}e7T3!qKX*G$Sfb*9 ze5NgNjTCGVU`#R&^G-R(@H{Ek9QM01PRFYyJAsP?L@}0V`N+zjs!dNMA9TfgOn}I( zd_&Id@p6U)RRrhB110tCwx}0v7?y@3p;q!LRWvJa3fow|;(#JzArLiI-{pn%Hk<;uK`y)=}5O0I||9kn(uWiPYJ1YGU-XIqd-Y}F=~mR;ERFvAEO>? zF^a!xqge$T3Ws5o3EvTG-?yPlR|}>Cj)>uX>2Y%Ye!yzF1>`^y81sNWPQMDz)hhag z6RKVtgE%BB-WYi7exexjy`xbKXv#pRHuP@>z=Um zHk^&$8;eUlBnAc0p4Ocsd*B*rRod=0BxRy9T;-s8?-6$u0PKO5y5?K(o-?d28?c8T z6iMg^KJ;FNWgd0`oL9~s`R*Li%n}o=m!;NQB;f^+f;o@eT>F6z>dOyqyvjihV&m3R zFaA@utC_-#e;c7FRUp3a8~hvw7c>rES9ylgZNsib1@&$iv%~Tapcl#@$ zFiL`9)(g!^$90PFHw>xOkT@X7JZa|>124QRJiy`}?oXV|;b4Cq=O{-1y-ZKa<~|sQ z?LEdDnWk@)7GrwzpbKACRHKxcC5VQ)1J+8aIxrl}9`rHMIJ%+)la!0Kyxiu5f{*;; zOASgwBd%@gL6wbM7f^kT&SHf&kqb`V?@TfuJsV}?#yQcfxEXQRwk01YUTr z^lF5X-Ze)Ux&A|}dQrF=1I!Hp;(oc}Bfg3nXWklnm*A5!2?Uf0p2I8El`oD|mId}| z4Bo?KbhP9+yXm`a*)yU%G2M9i?{cZd&(rQWIg#pP(qR6W>VQP3-d2REe1h&N7UrF zPIDW;ByBcML8Nzju&_`_Y!~#LTt~GA{sIurw;O*W)(y~)s)j;$upicF3k1WkJdn$A zxW!V)cVnXI{0xaWFMT|aC}eb`=2DV)9NlvRR!Op*14*o_Sb#W?-HdtFlx`sW1!#Tb z1EQ6w5;Hw>BHqBk4O6yt4xTV5;{93I9(}IkNS6V*J0Ng6xq|}c8q@*GBo@!w>yryq z1sPGH^q+yHYj| zzmR`tETRPTkkKx=Vmx=4$OyTaX_t-f)Wrs(91u(RgvkJNPU<_I z2Qys@nf8WO8TFcn^22FlIA1ywY@x;5`g3U5sQ!BTzkw)P zl*`iE1-}H$VyQeYKZuLp;c-5FQ+}zpFpyH>lWY}rv}#KxQNa|>9^ zEBQS1u2Tzz+*l4YeiTBszhN*WC;%?huMVg*HiC5gtfZCWX&a$d?o>)90#<^V>@cJE z7k-)5o^*)dj5&d#?OzQUkP5R~GpOuNU6<7j+~l<;F})C8m)N(#`we3aN0Hf}Z8Dk1 zR4VD_${Z%m5K2*-U9kQ1?v5B#I|I>NU_pW;vdPkKAicJ7y#{T~?fv~$H_OsqM-W*l znF1L!8ay1#c3g7t=a9z@N;o$*l(8e;(zMtWrfnKzKVRUop)0Vddkk=6Ke}mgUAn?% za{NaU`uBi`T$~q|2YM&npy^z5_EFctOpTnjRoQ5tugF6=CDnxa4d3I5QeziaT%<#@ z8tW_JeKm0OY`#=cN!G~^tg~IT&PTk%?43|GOSu!F$0{s8GFgk1tjb}>P_|7_Ep1ddaW$wt zKD!NT`gEo>nj3joS?~w3{`I$J)!u;jXN4{U z_v~RoVi1p2?OU4%ku+W)Ck+j`BUm?qT`DyNQ?W|~iK`?0(_g17itS-36kZ}?aOXQa zd7ZxzE`yL!`@J1iNNT%gd;iLOpvvJ8poRE=q|{NlPM+DG=63Hmu)~wqhabD;$klby zI*Jx&gwWwWb65(1B z5(|kM;NIg6N0q6&A6<~^oAVIq!D&~Y`IQjt<`Pnb<(p#qG^rKb6GsFbb~l8W&qeK9 zL9$ZXw{^!_9re=K11xAO#WRRFA4J|vmx#v;GXD=y}TGc zSq%*(SFVh%OM18%Bvv8t0J5OPHI6ozQBEme1apFpD@UcOph%DWJ_TgT(T2UKzzB2* z4^KO0O0;Gg`=_WTgtW|4#ookIX3G8ivug|(^FG-E>Zk@4JQumEBXUe`c?v%DhNt2M zPUraWN(+vA81ZxLu$*y&`~ZEM@sdf1{k9GLDfKC*j4IsdEsAIyO}ct9;7|Ey{=$om zCKE@~Y%=mfseH8lxNVbpr4K=@F==te;Cu&9777jaOr{%hRs@1vvx@($m#K04U`>FhQwv zkYON??SSF;vPdXyG7?j_w}|_bY`U5m(=xT@XTWfM=B(D-Wt1Ug+1G@1(DH>^D^FyHwv+JBZoFvOx=Kh~}84MZyED8M9 z@j>K#{w2TWEk>{!ThyrEwH8Hi%B_}hqdA3}bG$8&w``q36MypfAxDSE{g!#v_%i}PbxTU_QGb#UU0Fu;yiD{sFlVwko)%)K-s*x zqLEOkUmy<|T-+Lri} znoiE*<2B!_k#3S8;dj_6lK=Lq{60W}=7BxnRzbJi96@(=hi>!bWEc|SpLZM>?6ZCL zWOQ}Q9ruO6<0jXJPnv9qg$ z@z}uyfF|XSdjj84B%2c1u<~qadFwvfX1|oz1`rEk2O3};zu)XP$mkJzamp~gX=B*Y zMVbAOK`<`DNmobIG}8%{_P_jkP1H<$`vHar;(=W+t)3-Bqfv48Hl#t$QXez5QW(lq;9=zIWWO7*DwV$k!% zwwv_<-5GcCMjip=-}1k3k{~TXO`B^Tx`%NdwV1a~9Spg4E*5`n`VwR#yrHgrARF)t zBXQ6Df+*6l)0NU!^!-}61DZYme)2q?S~y+??bT*xLaitt&k1B~g)P@6TU&`;Cya)X z(EzGD4%VV`V*>x-jsEY8fEmVQgQgx~=H;bJQJq-mE*;NH%RK?fOs(DZR9d;a4^?Pf{JIpf91V0S7~vyr3>CEJmKhodAK%*q-ivopSQW7 zOu9cV=x|t;JHz~(Y1J}vSeIyi2a+c%4Xpk^2!CKxFB06)Rg|W>X<{0+QzD>%`MuXr zJq{_jc+GeA%Jr<(pcCq329{229@kXU{Ax8jju{wOq&;99YL^#p0Ei$Y;A{o0wAX$enAcg^q0zO%tzCYe2<(x;s+e8z$M)T zMIu7&|7-87-=f~$wFOa1fdK@h80otXeTtzi$J}2xeEtKw2W9)0>D;5$?E%qMpL+ghKO*Mta&!LUAJk~hYA0kxW> zeSH!Fu;>U~jXhGtm1+<322Rq|foQk^@0!rlPWSrjHabp_bKQ{@uuR7zlKccq?wp3T}#cPj`82qvY&ijIiwN>CBT;uD!So zP98F~4n{>msm6^VI@r6Sh~So!b@sdQksUNXOn}u>-0??O5v&vJrg`v#2 zz-#a0w~i}gUciYy&v=gxQY00ex3{F;BNwVVGh(;L{3_b&cOre;g7B{=P;Afx(kYuc zQ;E^D9gx3x3HZP(y}D+X2zPSgYM(GE*|(r>R9#a4u|qTmWT{)78gdupTt~vZCSs9? z8>mYzJBNvX?BFjaQvyLU3y+lL(qa6RG3}HyU8mE0%NkyPS{LeqaPAio~4#C6A&y>u4~J)XI*y!NNaV{QX+#k=KA9XU)jR*G?wnWzo+44hm^BtfKBYDD zSHcGYx4_}_`#qpop!6{l5$q%*Lm9g=&)mU)*XN*xciHLShcCP8?zd z5zORt(q{Fqx6&pxKW+o#8^?$6cvc!2j}#y+{VHH1%3x3_C0YZDhX3u1sAL5)hP{^Boo0-7W8l%wFxEt>Vdp1phetmZKVyvfgFG?n6ixNU@> z5Wru8%#qW%*Q@$eDcrN-cD4OxO+^^wDL`$jj(vj-brU9Ujs~O8>i{phH z&+(ntVKdG{bD6kr3xF+7jwf2Y1i+H*2mqWIV*W)zCXKiSKrlunt-d3bOZGeOMN6ZL z&P^3^Z`xGLo`^Vz1HN*#A8xtg|EH;Z5X8VMtNQubwfR9R=Z1j%%q7rTL8rNW_@Cng zqs`&Wjxz33>H)Y&&A8pcvZT7i?{FHAkaauI|91;L^Nc_z74RfQ^!O1dVoZMO zZy{$(l2QB@jE3-3AcytBHB`@IuF@#VgAd37hk^!dms%8qe57}DQ>>>@-{6#^ImT`oGN< zES*Q$j#yxw?EhV1buFF{u|RcKr^bBqKOd!#XlpV*YT?{`Yx~aKYTZbe*mjGzn&r!B z4-f+dmws0~%oP7nPWFOv|5X2@eITr@3s#kv@B<2C0AMT5fvP`$3HvM;Eb?3cfQ`(b zOPDLfYf+?J$Pl|4tGP(P$e?6rAAw)CpMh2Let=ntVb%`)qUM_dlQQ6mW`QfjfZ{ z>^)hBsdSofhs^8yvk<24S6Tt*N3ouHDmZF@9g#h_RcF5;A6y*)mWR#MKLU`^atnur zhE(Kx7=kE|%kSWvn)wU?V1NxE8<28Z-$8)L1AM?5mbyazlkxX8$C2jjZZTES5k@w5 zYpfT9!zl!2A$W{O&Wt&;4bvpH9?Lgp0Q>kHG|$~Hi%5Q7R#qu`BTf8t$f0m$RbmN1s< zz0&7K7~$O2(}zQ>vc>mhysuGpS#ObRR}4>G{eWWdxV zx{HcsUo58K1U9+A-x18Ufo-hi<`e9VM?=yGNqo&F&{R_a#D^lw23mSq0B0`O6Rp}4 z$KczSYd%@?y4-mc2d4gzC0y#G2SjXlN}EoS=k%3})dB!W{rqEPYle3%8@^dBSfDiJ z=(Da(vl}zh;Pe?d4;-P z;jP3=@BvI(F@Q_r6?KpDYX$UBxdM5*sSB|pYupqVBZ5%}PymF=zraaeA}E?6#fG=dwf_bu~pTm_?rP zw@Z8=Gl;5Gwk84>>on@?kOa+id#G^K5!G|&&ZiQKXXaBi{R9}i9+%DE6LEXQr~M?e zelAHfa2`+}#Q{JT!LGg-z$v^*=M4c8_qw~&bv52Z5Qwh!8kl@DDJgrml~2wmbpaB! z&F%H+62SEbx{KkZFkj=306l8+UA+;S^5}2zEMdUUJ^-9GNpq(n+5dEbnl7*x>mwjG zztOU6*I=Cqc0LWEQ@KZ*hXLLymq2;|CtCd5pUUO0DvmN3ov|s?{FwX>kOvo#4!Pa8 zeFpSvT0hLyBHZc|VL{D0WT-C2@Xu(UCF2?U&jil*JANWFD>#Eti$^`C$r0U^#Q^4h zfYY4?yyAGZ86hqG+a}jzfoMSiwx@CblMpt726OjmG6^i$=55Zne^)#Ij2iooDPwZ~!s6|LA? zIwf-`U+mF|-ix<0IyilRr~mr@Gj&9l?-dfjsy4M1b$g&)zs$ePCIz+Ek1^C%W0kR6 zQbbfO3H81>FjFagaNqOxdke*mN00Mvl5rc5-s2c=MRo zM@#TI^SM>SHe|t_%?p#Bn%0M7Jw@>Me=GjcT#-#Lu~cTXkvYsUc*oR6bg)R!mUemW zW*7l}AVMApG;DFBaF~=)Efq3Je*l^pV_y*3-Mbj2@(3$zQjl6#tulrn5M_XtjS41U z*b-sFvVzP)?<6wUCbc7*+)gLU!-1_ij1cgRd7h9)gJ+yTTjzA-bVLpw+MB3EQhgl7 zFfm^7w|4+@UCM|F9#(2zvp8mNd2H^Q7%HN{`NTD|X6)pafbzs}L0|fEzFbXNb z5Dy4wJb|A;aC8i3QajRcyFonPUk3W07nBC*`Ja0}X?fuRjMAHA0Dy2}Wun5M1MDunhD!sUMT7|Mu}AkQ_c{;)2%|c%xyZ-Md;+VZ35dYgOyN2*6}v%uGMAz=>WY zf*jSjoI$6))U`^zvmq3fw_o_rJvtSX4iS2KMEI1|Fh$G`Z7wDkbk zDuI%E1^C#VOIne@2emgBTXG3_3#5Foz2I+P{lcPHwJqWG#h3xJco83Fc&Gg7*cOkhn@*zN1}pd4cY3$jk2372tyF9ZK%!uDwSbaSnnx7=l0r>$W_1ZZMW zaJI>6Uz?9!4XEVaIkX>Y&={KrKJzE$-b*j{uK9qOXxZ{`)vUDD*xIZ07c(sq0=7nu zYjVX`AUqKFL;<130CE&^#LP=#0eIY#?&3YMCabPx9M>B2317roZGar^xVgS0ix%ea zTLFMteqNC206^qj%eobUxrMYVVAN%Rm#EJBq2F_&Groph0CHcSMonu`S_#H7(VOwY zD3ULJm~c>tV<4wFZx?_c-)6zkUmE{xeY^(P1wCLGY@ZlV)C&+Ye3504ec{dThNr+E zhEG{G^qa)uK2FNBR&R8E9?z`m3#bAU?@0oY%3BMynz+@zT1F&8%_foGg1Bj3!=3;z zllTB@ST#m!XDM)f6x%P_Nu^7hH3dj^=7H?1pst`?46?%A1!-q>PxJ-#Vz4m-X+Q_S zoA`pQD&r*A0MOQIl;L5RfwzkYMq17b_lAqr$G(2|c7Z(UM3&JL52+4kJ1rwb%Cuf+ zcLtYeu+Gj10mntUL{oHL>_m5qtTY;^VHwkZNUa#6L-lOo$yL4mhA&7Irp9K!QY;*S zx4Z-vt5@9{1Ub}Mdd;3{ol}nN9BmI`JL&b~BbJ04n99fFZ__YJ2t?NT+nU^>!S$Zk z?V$y(k=Eou;`5H?5(EfoCd&G-ad|R0Ol*NZ-oqxuz*aNpA<6wZ0sq(|7Tq#fyr)2!>Xlat8vzfQ-|b z@wacu0O1b2SO$~G^;uvDN_&KN%yr+B7v`@lI1jAmSLPBay1(=3R+--y*|TDg7HmX0 z%6+APhV#=mVkj$ch;Z8Fcz1?p_T$Dw$A)G=TPh||zt=QTaztPAqGXmxd6JsCX0yb$ zNv;U7x+mwA=gtW*4kf_zR(#(bE~n;SJ_pF4l535#_{!j{6o*(1T>(`ymFvtlI4R+L zL&h%W)exRy3((*w$XDeI0g<I;W^f;h+P6PkM| zRnQNU%^nTFe&RJt!T(i=fR~bh05z25qZ9^N@(}>Bg92~^)OK0o7)Wd|vFtLkhyh?s zF@cVThbdC82}Q7~hQTC8-$(+f@v9Iie$4XfShrW1CV&%A2yzWaZ8a1{fZcmr+I&$s zw3w0%wjFJPCC@QtwD0>|>RwfO6PcZ=y$yHJ8tR#E^V_LW!+8hxJe6+|Fe$wTzb65; znw{=a+k9m?tzuHnIJ)orcg6lcK4%9~2G3BI``n%1>+4k5Ykm*8B{W_M>>_!(b(B=~ zRS=$t5+f+M>rl5wbKFF+wI=LkxLiq-K}C-%@c^mZQU?PG*~dSf-{YdQt^#143lSOp zY;YQzu5hZu5_ghfrZ~rUgJ08?NyYDz$9-X+%JrA(Jg+a_%z%>f935+txOY~c012jk zhs%NQnh+50Ov3I#U5|`&Sg_3(gwzwp4JI8vYI{s%dv4?;41)wfQ$elHHfJcF9qHAg zC_dQqo-i~@R>INe!e%zgoHG;5bvQCAwh2}dDNYWxKNeG;WrX;_&Z3XOmR%ru#mr@~ zi0cYGcy{1}$63HND|-#xv6z90NQq&eZsKoqDSpyHrY$#h&O1;LpaC~nvS?VDXTkB(Wb+RWG zT+4+^Zl8)x;)2ywEA(wv2LX2^XKCw9sqzrOpSyDOS=f~!fe7}0-Yi%_J_1n6=DO>M zB3YDku6hP2b--O9QSRE*HJz^~L&Xu>bEVXK7%eihVW~$uvg$2e=8H~%G!>jbSG$cKkG(}u=?ciK%C~Hr!6v;U~ zLl)-=&#xwDMNWdK%kr>VWNF;srjK{sS3;CK}cA((qEM9 z@1tO#q-0C9ZpjPF+OiV?HWLq&UwU0Kvb@UTiBGS*y^Hj~qZ65LS^O}zkD>e>-N3CAoQjt*hBt?tgto@$hZqYj%PENvExX5Z1bk91()AilcM&5p z2iRCMsHgnlM?BYgZxzBFB;DU#gxbsv_d1`NC)vOzRMlEz-j9>4;e~MU;;9DZ2mK7Z z6F+j6Zaq7AgL8-FSWijWgC3ch^6y_|SU6~ryWhpnFW&Hl^3?CB?KVd9-`+Gj%ttz4 zQqTLby#HmeGuupp%Wd#Hf{rpXuN+0a_l!BS2cy^R%P(Ac*XYqOdsP@UxS9+wCDQdj)`|J(s5tTYefZGpf zqGZ+I`8<7QTB4p7t9aB0a^}X7yH9!UMYCrA2uAG=70@mdVA$>(*(@;Chu@cST!l#d9x(tJxLw7?C*Dmw^m$S9R>-DPm0cMDW z_WrUB7Vg(xNiAzR1zQ{sW@fmh?@V{4Fk!*DA$F)^_*L>|*jTDIxQ(~x5*8a3Yxhv=JS=&D8@r+q%ldz&fc{PwR zhzlKO{Q3-qN#1thZ3ef)&P@+0G%7eIc=z6*&$ZH|1P?*PN}YTr>VBxbQ(yT*Hnzk@WU=^a)MEo zwiHx;NmPz$kkfPqA1^IgZGEBnvx5sO-4V`;SYdO%0OTD^_1$E?1^$SW9u`bE@sSzq z8`UmsYd`!>n1o7UH16}qawCcPdGcH9$!NjefBzEvPJ<&~AJIHG=Cq?e4T>8x29A4(??w_&9=Fv*E9Jsu{PI* zHgk=N9lQO}@veHKX%wQL_tPEC6H#zl>ulqTzT4J5Qz>gb zT_2>`4SSI+5vdn3`CQV7AL=S4`UA1zoU;(f1I_(74lDlkVW1SKyPWaYI%P?I;~I+H z0w87vXftu<+K(3luOo_K>s(9WFXZ1#)G3D=*p?2OZT8UyaGU<1yipvIP$!x|gNOpw zP*@OxVpOo63W^I?Q^Aj>Xmqd+QM-fJ*SUJd1p(=xEYBMSXZn_hp>L<^*Bhpq{vQM9 zta4^g>y7OniXs)k)11aB((AhY`f0J2GxZ-|Cw&aC-Cyj=yb)hk>5i5)EiQ6g3}NVw z)W6VnUIj1jOgW=NCln;*XJ>C$|$`Q?k+0SIu? z5muI&d6U=e320Hvdj1`i0e?V(SsXR2Zb1kNbk%H4k9?48uIWWJX$2wS^yl zibPPEDvM6zxJ!+^49&!EWPE)r-l>nVET|jjn8E+=bf3E)&cm1abHp?s6n5ZBM z?C)Qra>y=+9?RVkr^gL@+LNlY&6TAB--gy?-P>P?$)K1D-I?mRU*6?vUZLX3!T&0y zyT+ijnzP{8Oa`5AtJlQ{ov#ZPu^w+TEe16tUVIR_N>$;X@6%iNIu5I#yJ9jJLbK?3 z1j3IuAiTRMjb&v(MxGo0{4~s~>Y$S7y&j?Onh%OFBe8%V$xtR3;fI6J_TPg|IOlOI z^I8DL4tf}Q43n8LXbD-b6x!}((PR-b4mPJdFNR=!n~#}3@DT>z@V%w0 zZ`Hz?dBjwu)6?~=e-9BLV*GSPU(RrA8>6tmI+8z@vHo;AKCxCpM20c@b+%yyu8!w( zb$RI9uj@wFMP@!`PNc4c=d(%;qD7rV>52m}^-)=l!1ab~TjrF8@Bo+=DPZZ#y8=jq zX73`%x_LJyVY#NGb^d1KdL)lO}Pf*Cy!6}0P0+P z_=!1Z!4pa^!1^N4GCeqjsnaRgP-%RW5=yA{0bChtY8hpy1&~sC(iTxUYx<>__e5dW zrV}ELg7n;kB8bdUMdb$Ef)(efgy0QpBs=)l9ft zIb)h|rculF$rs}~;moxUB3K2+soWv|a97@FMHDCp6hBVuqLnW$;2u&uBM^@hl1)3O zi2d^cr4kBj`-FZm%9h1S9rbY)NgGt2m+D=H<(k0XTO#~@%9)y4X{PXi$LS0qX+5C) zs{1)9nZO1B4{_%dXqd&_eVk{lBt{p@A?&0la+<^K+HEZIoA@{kPiL? z%fQ1&u2~W-#;jQt`Eqe1v`6}KgGT?%xhRp%`~*F_xA>h-(6n3Ll^(!PEnF|BAFrKV zDa0yL7+8>Yb8{HwH@vU$?H^9riF@Sq<9@lQxx5UD8ZtNxmIeG|9c=K2a7=LC+>}DV zGC1&B4vTZ%JB}t9EyGmd>%uZazrwQrY7#MZ7jeOC3^Lxv6ewMNYA=5;baZHVopn$w z4nzVrx$_NZoSp*)C}tgPKbaY>$uH8K`mGX7lf|q{i@D~eJOXKGaWy)hG-%Jz90c0y zMOXlNwwgK65?QJY*Z|Cdxp9**B5jbL*%N1trgGVhCeoa@0ihEGx0|WCoA^f37Jv@F zRJab#EmYEfUm@IvMpZRVPIuIKb}al)Hw^ofgtn}#9yidmB>b(W0?UQkqyFf)?v{UU zjlyekt>vmB$+5sdjT^}vDW#R8EIQOY!l%=Erv;2-olB&&fS5o#HaRaRbO0E*vhDgKWsPWD>HH26Kpaa#REgKQ zDVCcd!y&{QQxeJnID#Ieodm?b<36b5L?wKnM<{n%eG$(1F z&n7{0H4lE)j`^%;Grf}gnOYTNws#opMLGyR%S9y-7e(NKl7-Mhzy?mKzGK8^rWtc8 zrikxWP^0NMVNl?bABECTM4!nJ7RrzJkLZmAF=j>1j33A+alelAW3n4|+FaO@Ym58s=v4zheZScz^eJ99dYWE@(mtZvML3Nv)U4lq3lSSfZYZ2Sp7*rV$WW zdeW8yhD@2PZ=jtJ{hA5GlsKA;cy-GsTwP#_ePx(pK@cSbqm(iNea?kSVIu)KF*L#G zU#a+Z!Mrg4w=_Y?{IK^g#c5>Jfx_BiQ(0aQxm!_Tj(W<^yJnl)uqzk-^-q3<^=n1& z)CnM-kdmB`Ut#(S)v!P93LFBeoABGx&G5E6ckoyxVM2<`42numk3MLzn5@A{XTT@W zSN!gXyHM!SejdGic`pw--y^Db41dpN!14GPQhx9+{)>0jD{T-5c_&S0n%kUet zHVrtjf^s0Dr(36c6aE4o-19P93>y=tFK+q}Xym087Ard9jrzRw%1d)hW|+|$#!y(G zA_m=Zo_dYJ7sw9}_3%`S!6`!a+~zLR8Q$p>C>8uX1as$0&{gH_+DT}+GAJk*s}1Zu z`Al)m2o+~9)?K)R&KCeX()#y>8$~%#Dx?%Rcgf({qSl@}M*SGV&w2XwGIJo!v1TB` z<>wk9OUbc?@%4S&`E5=Sc+3kHl5#wB0Yj$o2Q_{V3ql0V5OE%wrWDcyj4Mc;@%5Y| z5W{Amw6T@xM7A@Y=PpPA~(mTHAE`laQZq_7BU39Rm5jIh%-J2M>D;AznHQEs%N*4}MA zgoo}WMZ)-PT7U(b^IC$SpRTAcN#12T+v$g)^}#e^A53f|+CEy%;y#J5O4EbzfIlK2 zY}%@QwMdwB2%`X&_tR^8ygXeZef>rvsur-LjSDLVK+nxoDqIvz0nb02 zY%p8ma=UVXeU0_Xy3O}qGZ59?AMbxPH{EhFX%;ZUK1V}pzcUFXC*f)@ty@k0aRc+C z+=gA}FNx6NK=4L_nUi9b&lf(I!BTLD z>JI2&yN#nR8Wbo+{1kDm{~XEvv{_)2=Mi3Z#VF}>Js2;+YRl!!UPXOZhU9vP+L0opl`qgB zJdX75(0Ninr}1%kv*d@g)(eATh1)g;kv;`K2!^4jOG=NDKFnlL{dE_DER?HwxkPcB zIQgugSwc>!u>1`>aj-+}o)pPphTCr469x{GE~%Wz%YG}**hvQA0Z@ymZ^XzzVa!d|O>NgA7b^(D+gJvBfW(#!S`vEa4 zbg`~+>`sLmmCz$^Q3G$f)mjiEw#^`LF1c+Sk=h0$MJ$7t(K2qvnP4hyTm*<3($c6G zo*)FJt5I|jN6wR2*0#|gmuU~#QnkB-UTBg?F#MC!>$sTEN&c4G>%AA3@fW{=NLu)q zzGjxbl<3-rgCd}2u-^oMC^CnB9Givmzuu(?oJor-yM#HUSyKtYP;6D^4DibYpDTqb4wN447F2vbL`$3A_|; zj!V6|#wxYmu7wZ_2EQBRPO+#-VxZG32)zDqgT*>n3q(ZDK!_ z^@vuC8p#t^SR0wyiso{iI^f=wl`oc=xfI|^GAN@C$PUw=xF(0y9wXr~riReL<5HrMPi`XQ9R(*6w`hHCW2#t6&K2);hd zX;;C6C#nJR1Pvg9kS6+@(~dgt;`b^@r>tARyPpB_haJ$cmo}@Mjs(Svudi&B+Q# z#&ZIyoI!`|3w>>MWl4ADUyobUvvc85PRqQSS>^^~pK+GMrjWn|^4qI50Uo@&A{k95 zliyWo6FbsbvO1H9)|qX4XMis7E?{dr5)3Y`%eLtC!)TobMG5b{DH57`AH}Cf@^Zf? ziE#nAVlE?-Wn?>ZdjQr0akGYr!{Tf@%QY3<2JZj!cRHV*)i}i%Ywf(R^+U^+i;+@! zyCh1y?G(QKYmR7UhqPDpf`L77p1o~m)9?FfOy*#M=}6DUg{Rd%VK*yqIWa)W(bPwu z;y;i$Wl9mSN4=#>$dG0q^Frv^(Ua8JN(0`Lwpq@-Y|X(8w-vWtaj#Ru(6h!lkr+}jO1S#+n*%X^Oz7W@%(*(l6iNJ8j$S^j4o63)?QEmsFRG{2cfacIfGSzA9|s~;(oOk?pyJ?V6@ zB@dPy$2+9Kpt>r@;s}nl%>1+aeJ~=E8^d9QHuj}^Uy*~Q23#`m0_1T_DG-o|1l-QoRvy7-El0@gkbaScp zr%+-YXl6fuw)l8Xw-bs&(JbBv`iw7MIscw7BixNb)p(5O(Ne1nzuQL8c5hZS!V@Tz z!*J}V+hRO}&9|T6nm~LZSIp3~DUdr<=3->1#>sLD%)*TN?T$_vxQ#|vpuR;p$#(Gv z&u&sgyqf2>liXw{36?nTqSW`rG6X@7vHura%7-FJCoN5Xd6DL2Qiv|_D=p1V)MHv03kk)gCqVt&;-J`$vdT6pLDfF{HDcPCD&cZ^Q*9jqXH6zZ7Eg zdfEnad&2!*ge4h=jpbOH%=pB}2mq{V+)~tYAIcVnv|hYMm=K=_3WW3vul0>sRQpt$ zk5tDX+>Ep|y!@qP+qw35%g`xji%pTZo8bIH8^1~z>KlF18czFj2Z1qZC^crTY{o8* zHuFwgij^Ec%m;_dXDLYnBXuXjf-@C@d{Wbk0n4y`xZux7v-?OlCsCwnn%8WJ`^_oP z9BETc%WQq1>x1?*%MB;{;$(;9BrMTzqh*m1#~%Yml~v?y7@ot0sZRUt-omHf=5<7A zOarMb)OY2m$M3$kp0tC9M{N7pjFU(8($`vU+z@xhxG?V|(Nu)w(`Qw3(rlxU2vt?s z8#AlF6VYis32qHpUGYrB9PBdf_1}|u7prCjdrln=1k-R<#nyd~0nK_E^qO9@5QeMP zTIIF*8qrg7OB)`}-0$}yqFa}yadq!LN7lc`D3r)7AH6efGY{!+Y9G_zX}YMl zvzm;uQNC{2_}VZS2)C#yuuE~QT8k`+97}PZn<&*xGqZ|vw9q6=a+_4+ptvm0pZa+- zmwww~lzKfrlLy7_y)_k!FV+N9SEm`ir>PraYrQBbP@m#}A8&1KUhL`nMuzY-Y%g!tJD6;~ zdzpa-C`+IhaShqL|L+#qUq3OG@upy}zlZ5JzclCGvu|B#sQ&VM(3NfF=#<&S))cl7 z8SN0pEd3a$$!g=? z6|b~G_xtm_EyCzXvec>3q2Y;+<7w6s)#V~XIkG`B0nPSNuRTkt=TMrXFR`gSdT%7^O7d00E+W_SH$jTJW~PNB$wEpA3H3t5IE9sJLWp-;O$FX9$8>e!zp9Xbb#`ASd;6!0(F~*fyNUPDpS&dj zZ_unfWl0Hlz&}aR LH?R_69pC>4qYY#A literal 194168 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niua4oze+mtl*>W&iZI3hP^Fd20 z-t@TklG!ZexkDKqKZ^)K(|&%ROPk7asg_{xnjB`S=VRd@>@LG}fI;S(<`BEulvODWW0FkU!hDv9GTqx3$=V*Cr3)gUc(VIrlJBtF;|HHNO^%}oVS|STx!_IM| z_4r?F00kT410Nrs(bq2OlICD^)#-FAcF!K@aK8FrB#xdd9z`0}iR+dE-xc0wwS(|j zo5~w27p}=Ls#Cq9r3J1#7K>W#9_oYRCU=HNwC^7HSt&B`oUe6>ACIgzAB=o$4naD# zq>b@j?)A5_lGQ(@-xqN8ZzV%(rT9+t!rh{U>*C2{tLEjCpNBIHWC{?T3}IBxn7&xi zE9;4GHp9fOQ!y$;0xW2}Hoqu;MQHmUb?`E~3nxKpMg@00q;67|IzsdTLEhR1l`sYr z(TU)a$p@|m3;q_-APebi+`}=H`q$Di!@N>ciPri*-$!18^5#9zqAv%EnfV_wfdm3F z8X8)3=Gc+RghjK}(POKl@-vrbkfNIl0Zy*Dt+35u6F6wSRd*6%cM@KAJR)jM1(%Tk z>gSgl?g<-@*`T+G0kNifYSp9f2Z#d42Nsy^;qf&y;~2_+U1+(ne4v`SCNlNk_g3xE zI%Lj7^!fA|ZLmI?lB;*sLDd@{c|)l?vxdB7?R3ce z4%mVe*et2cV2dxXWC=x(}GW$0*7R6lN3<~r^sP7O zLwP^&IFMf5D^w#V{Qb80f>=Spa++dW$H6F$(*;ts2Ub9cs+XeS-1xck!S@qvg_>5q zek;h?*1OvI)^V;R+2txO&sP~79>!%$!EX&t=UOc~_uxNkS=$+jEU#ysteyA+&}2XX zo9O~|Eo>K^D!$QTmK(HX9*RW}isUI|FRkG7QUlv$gB9F~=gF$lzi;vkJnAs_S*F3b zKd}pBoa8RvVCCQ!7YK~rFp@i^V8qP;7O`zimS&11dm8X4 z-s?Diu2H+T@PVBLJPFAnV%Ip8d82sVSlExPx-V=vToLp*I0vMX>vl#HD5zwOqwpd> z-?5d=#}mRFZX}PPD70}I?Q4<;#Nqh!*)pPK(OH=Gwj3j!hb58oC3k~6rqq0s>Rx7F zyk~}ZBfZ**VlJen5Vi*mxTf|R+x1A$e1LEvqDg}9E)8?hYwqjH0I&nT${iWFXr1$r zvh3ej5X^8TLW9h?!uny*uNBd68OaYjM#@akM)?ep-=)uWt%oDqqu|hqFSJvQ8m7g{+`bLYcFjaYP(?{AU4F8V@5Y+Y?`1dDAyJ z96x)^X>s4N9&X>&3&H(enehvD)G@lY^jBJGuac=JN`nXT>XA`f1T+>zUfPgHvQ}GI zI2n}kW3AMMsWKZ^8RS%yGY(Q0jCIo#z~Zyw6xoxR3iGq!;@QJjNwVu?vS%l1?0K$* zveVPkcz}l04#W%mK}_uUb?7Vz(k5e&=SP?C3w#Bz9Z36kUW3}^s#+FG@y`*l)0*!d z6l>OGY%PM#D7XrEVqbgO@_^jbm+Vm(j0Tdl?I#iPslP&2#Ui|2(Y&tEbR%8ZBi!#H zpYi_Knz#@MBq6@%l*jOj5{}R}u3;(b0o^Clz8vFY8}X!v-@gSAw~_u=IeL1Q-@FwnfIDhc}r3QbZ1i*ARk#!=xbG_Jd0E z>6|zPAUj5OeSH$oVry?N0#sba6ij02RL6bb!^cyD$n?q4@!xrMO}GMTh^JJMI(OPz z6sp+ZOdqbAku=FUJMnDuGXJyYE~2nsx8D7miu&9A{3^0Ef{$kWjqJl_W@hZpUvOIB zgLOMpn)OZ?FIWT6=6W!FY@on9Y!UhSXRbL zZgl|!#@oO@D~+EhK&Hal?Z{)Mo2YrBZ{z9OEwhnU8XA#&cGv;p<)r$laf8aER*V z?7=%<&K~QpIUv3_Wl%Q2UPERPRs=_dr_Rj)GOK+1%O{L9(TfWi-UjOo1mB?ZV1o}L z5fPE{S5Y4(P!b8%*sPX(=z9jDKFQ22W(kc(`4<#gkPeMco*%7B*+W4=lV`5bwF%Jq z{(2Ua!zT}@b&J5;7?-rh|MTpL7lC0*KwMKk|JRQn{@{IH9vEtQy|oB7K}wyQeY4X5 z96y(r9pro?z@s`pfG;)j9zZOsss_@u=6}$rRXC7TnqN~ zjZ(jUWdd&24`8rgr1$prAT}#VV4V{-x8GOT`zeIw2eg!^e_uQK7jPov-l6E8`LVg8i^=Mwb2=0%q^_9m z7>i$OGcyV4&ZHXpkv8-u%R$=P{n5h&z7@b^{a&cf3KI0!3K+m2LQ%Zrl2=`Cx4GpBAYShLo~wBg$3Q}>gokBq95=+v=jy-1$`83 zzsu>_$N3GG!A@i*1)R}zEfEx4&_58FApWE7Pl~WLF(^y;5Gz4GgbAJx;CY6fS{<$Q zWOBy1O9<<(M@d~Qt%rS4BgOF`nwwft4)pU&1G;F{o_CEXC0XK8LSfrKG7-UVkvkVb zB%uA^T`OT4$TlI)M_DK{;-GYphUb7W<-jJ7NE$^-AXWSvD2zVh@%!`GLAu>Zih=kS z55m+0$qPc$1L%L=dYYgRGOybO`lm%=DU}}3Z%U-M9|J<>;I9U4hqt(cx5Bi{)-Brf znx6PX<#|D9)2bZKvGGhgq5$J%u~`wfTSRxGzdu7w_e3_Jok6UxZi*0oH5R3@ArM4wdR_0uC>&W zz!nAQqQJcAJn{sA@Af5z+8|}+MAyF>8G{ZXI)u1J2tN6Sofn;4T^ByKwY5p~v%l-{6KBcp!ek2OV40OoF9fN@CdNZ zH*NEpR<%=kZ8tu=er4~t#5=Bf?GcPAaXSEDWa~{KdgW$JLViRLjGzxh=5U>#eC+=o zL$5cds-0HRfrwTXiig@xXg+GT1Zw*1hV?L(uV25Wz(IV(WW79(VNX#>T2YwZ__FOz zZY>^ex#DYCG$>3SW7^U%JS?*uv)=QBtwu1f{7HK+Zk#{iqY%u;$Sr?ziX{6*V!pc@ z^4{t%BHu`ElJxi+H6R3k{vjXlU*9MJrgxj9d;qFRJz2{{DKG z={^!Sa0%&rN4CHuo4p)}X}}L-{jJ?ou4vV|`2&NHUC9H?mq;P1?QYff|KHbEbE>u1 z1Wef~l35lbrDqC@UuuPa%Y(s*Z|A?lp%=Ac*fW=%0RDLXXZ+I{HZA?B;xDaHjDbo; z5tR}E2;PHtabkA%b(FAKf3{M&yTRPew$@wL6JB^9eHZqRu*p8bFsKg+yejU&Qh{H8 zMY1SFL8NK&`19%z!1V*#d465b<8+CMj)sQD?E3LlF>5m0(^JwG%g)=a*t0Sn^<5! z#bdBvJy{6H_xAQiT;V8*62w)r$YBy;a|AZhVM81CwQm*`%WC=10odV5rkmSP7+msS6F4`p5d{oo%~Mxb{|ZXRkQEHQb;9 zvKgZ--(~y9Rom&-6rUSm?nJ{hc9I+>Fx2fa?3S%>Yhx_#*xm&%sNP_{ZpeqX@ZscT z>qwCIevJ^WO6)<$xS^>IBEzcH#~Z)cp5M`e=BhXBXV8NoqaiLlYZF>|5}jdy;j+{F zV68$R_=*?K7-{pJx=DVW+>v5icR6O0L5?A=-zeHV7o-{?be=Hjsc+w~pgf*BOd-1k z)|CciCC7;HxcGIkC^Bel2FqX~zDCR7P1*??SOF{UP^p_w}>Ls@o#d0|e))qoc?6q#rfWBW!rak%e6&qmt zZ77gM!~*w@Q_!Req@eAM??eCONqAN#JUu;OoW3@e4PYNbs6cAncKYN^LF^DpIE@*nMrl zLUn9v({%yI@MA7BDcd{&rt8G!x)Xl$w?@8H8*;R#>(DWOA8p=q5Esr`5@d@18y7;H zupodN@?nr^dgj(EP6K%2*L$(HxJ7_KPIe-^)- z3fCdqoi@M_*6=!QjXCzzy1Ta42-wet%!38+G;FVV2E7kiw7tjzTV~Zlk)8Nagb4Ox zgflIbWljG3<<*xWSMkl>yP@O9hCD4AU9>EBsts$Js>#)0kf$B@hXY+u4Ryj*b*+D_|I;)jlbu?mJfL3DO*%TceKoNLcX*xqtjq;MhPbh^PI<@l!ukr()ox5!wk; z924i~KEugsD!Cr~7hDkZCdJv_*~y|Uf*k=kj3BW)ySQZ2R;ZO(210gMz4+1N8fI-w z{&`+}?S^A>f%2m6K?rPtO17K%$n+@#@>_@$)311F!wA1$V}5P$7@!Oyn#-e0&KLgu z{b+bi74;hnpOx;!L(H9oX;s8spYwHvOCr=@wMqz`^u>UwTa<;pyI(_p8~{CDJBui zK?`Hw@}lGs#V|fT-oB-1UBJ8BJZ?Ag&gztr^x?v@bVq>bVsO3S{)9ceO@)t?L4w+V zUfr*39)~V-A^2DI@>B7@V(*{d`ik+#_fGOwTlK<-mzZ{1bsleAX|hrY)bKN{zcy6r zhr7&_J|%V$GJYVjz!DRR$1})2vy2R$^OTH$v(eeVd`_fuqPJhGAC-L(PSsj|^ zfje1$`}DgsU6!fomw;&>LtOX@TX4mb_}$~=|;d`p=(Lwgy>QS^s6vf`Wo7rwH|D#*Hi|8|8BP2u#fA9K^n# zwzRR0g;tEa*4Ecy0xSi6%Zw0G+{Pe3Dgv(zsZ!tv{cmN-39Lz}iT)g9Gjs*sha z7}hORIn(}<^BUrN@Zm{JOsv!=l$?o6)+s)6yZY8u;9b3pQctSE4o^jKNXR+JTVg{& z6nAbPGolx+Bdj1Jk!9+y=ZZHN1!1DpL4b$+ueXWU6yOycj1PA^)rY50F*;ots_LIh zBP5`zkC1ZL*D8Um~1YdD6mbQZN~9DIWEq%`)!^A(CNr5Mzh}(6X=)Y|BAR##EWb(Hb zyYuI^Fa9nT)&@WQyrqJCurk7I5D{V@KR*IRq+a?q)AkR!i+mMc^plU#;E*Y(@*qpj zfI+jTkA^*;_VaxbST=x&QCl0gmza%1k+l%H1nHK zm5_ixkY-=z{O0f9kuN_1xAbA9eHOf+u_}^x@7`6q8g?aK2KGoanpHD|O`CtLpmflA zcT)4`whLpJnPlpl{StCpl!RHpr|EbkSu{O_PbMW?JMsI2|EHPg_*IqF!{QByU9dBC z0@QY5whRah0L3AZhtf(C2TT#V2#P;LOYmcT|6~Ebr%D>@r*8^-bD`<3D;S5L+BI(`IX2EEvoB#YD2zL5JMTU@+pe1e38WNa0; zzruFU#7$tG4b?gOv_HI(+Tb|~my;+Fv2_W?BT;{*i4W~}W~6+NME#f$?BBQe_Yo89 zC4{ID$8DtyV0pM0w<}5D^F3=jJB5zd;1VKYQWR{$_N(M=(alWqq*OZ{f2wYVjos3k zuA3i5hsss)?I>(=(-1OG&z|20CORS`O^PGUjB3cBk3rFw4+99-O2!W9V$f!$&j>aq|C~9s`s>e>!!yG5IK^`u>%8v4Gh`;P z`Tauvgg>1(^#Fm{T{q2%nkww)!kWk0qgVofI!gu`sx^W!ym_^NbD}4FhLl&Ie)DqO zNqRAC=D2PmXFJ1ZZyMKmeqDZLxH54yobkt&fO^EQ6zXI3>#h6=v)+Rjcw9Gg3n)Iq z*|Nu9T3mbqJWn=rJRn_aSQS<|rQcg&aOAwtV@9%%p>?&y4Da-c3jPL@oqusmjIA~l zd>#l?NpfwD{gplhd*OuB&3$pzy7l{o{r*dn_XMM4kcA2D4bVe%3T47s^L=?a2=rW%BCP9R}B(whe7wokRCoT1)S}~4a-6TS>@X&w9{m)}YQ$V~J?_GER9&vKg zjFv)WlFfW6%P$<>skM6)e|(KS{#dOVx{;CC{-(pV2)6IKCM28m=-!ZZvL=!P0sZ1`k<)t&WM=^Yh(Ru(nP3oV8gw$InDbrD{|XZqnLc&) z_ahq2{L7}V5L8-|1nSy6AHbH3dg!!`0GnzX;J37(uXA($NP%rKK*FXa0zvsYc;CQ; zM00=7_IjUt7;_U4sX2@HDuUTf;QomO?;StkNiq1n+cw`-|NDC{Bb86K3lCCj@LeA; zTRT?)2pq6#nWg52wWd||&ojF=ESoNx!ogAB*z*;XBpZj4#4(>=V0`7nO7OzQ-u|Yc zlf=Xd;8u}3j{_>rIWTx3i$W(Mb(vnlwMHN&_?88sTazlVY~u`v=gtMax#aGvLii`MV%P(aud|sdZ>na=@;AOH;%)Q7MwJH62rv5IBz5`i3%2y z!@hRFV2~i<+Fx{!uz^g3?4ZJ%j9}Fqp6(vma_`ZbxWr?IpI!EG`^4O+{^sX-x(5w` zT#S@x6OwbSAAi#VvNYice{R0`ap-J6gMz;UIt}h6uoMdWNn6Z`cc>gk?qZ16g!l!WZ+Uf4tgR0gIDn zPk8RWURw22W2sQH}4R)%jMp_s@fAN0+uc%XJn1F-r+>bjiXkAAdNm)%%>uRJ4dws(T~`y+$lc?S~=^lpRSWR^wWlLz_z@ za!{#`zM-8+(M%5mO`;D`BV}n7k6qUV&c-=$bzk!A-Sou#d)>6c(4St z2~Mn1VDht;kZ-e_E8}@ST)?*}&xEFrzyV~~fZ6DF-;*J%guH0l-AE;QW;pR(;6d#l zES8O6F&85qw!g8MY<-$nbaZsKAGPXlGi&6Tp;NY^oWMF)?C#f=5qW(lvIhP3AU= ztPpNj){x~;;XQ+@n7Cc2z^}XfG;Xcqc64;KYy4mtJ0M)C65Mqre|93vilTz4}`GF~M=1!gS;WInco$ zj3488<;Pv`;m6cVgg>TJVzA{y z;($fwwN3(Tl- zQ}B@jH{#2DZDx8JW&0vM5bhZ#EG5KtxMYTrzIm~{!f}NH2C1j!f{c?LJycRzLX2I&}Z^;fIX;6BZd&a7$Ef*vsJSX zxe^HflOQpw2*pFvZ2)%Iif3<8Dj8a5nS_Pr-^N2rnLM3;Uk!Lhfv#wpi)m7#y+5eSKf?sMwi4^rPHvB%(deks^o_5{9odCWID?O=x zc$2M5z@|`_Cn#;)1)-N z#x2_5R^(PUK^>ZMZ~4aRR`{)bK44p-#vAPxwYi} z43C58WN-vG+!nVMjM}@O#D50@j=|~YQZd)jKt5CAG>1}*{1M5e+xFs@ zt?IqdwqY_>!^WKZGl>b&`K@B}A$hECR43_vek3b>5cMg1q1P--mpWF0pneF98)+UOHl%C+2r0dX5b#c~9MV z@Rw=@L3c2~i`js-xfyo2zot;^z)-89!x~Jd2)aOvujwIa#kWTQU{r+W#MOIKErH~I zSB0PI{Frzb@{)$2&tE1=v_V7S!$&4n#*O)Y1#Hz~yGj(j(XX*5%TJr{0Oyr zsd?1XA^{4lG|>QNHrg$F*Z>HuqW}{OSOAGUo3>C&`ks$dSYR0a1B$6eo3{6r&g*p3 z@7!VMlGIX0)zaa?o~eIKy^6FI$L`*yuijc`$NA)NAf{ zpp48OBCv5YzJ8CRH;q`<803%GHK}mA!0aJHt_d4}0OA%5s;uVFX^~R((Cy5fXl70> z*tP+bie5eR;ZhFWBuGAAl#f;izO-bZ6inwhvhGkjSWfTJ4c#YT4n5HZIInNzY459B{$aF|hW#EXk4ejMBPWi%UiFUpPQ$LCCvC$1{cwtu63E+L;abQOW*GOp`mwpGEE>yUfVbp> znMp$}V*0*y&2)gv6=zgDV*ng`x$}b}r&*yEy^m#Kup^R{N+TrDHXnAHeIG{yL0D`(hqTt*RO^l9b}WX9G58sf`WTja?Jla zNx%M4C*5naemEcY1`0!Ub7mOB?eV7Pl)Yzha-dL01H18t$Z569XRmcN=oYY0ZoL7t zHLqnNDMso{fE7V3=U0^(%3J>#KsPay}BLN~8a4!d4A-Y4>6?1__ac&dl= z2lf0)<6~05*ei<7V%L;x;2x8Zt&Ab2nOVB8lE$ufqBWVNz_2??`qbx4teVq6$teoB zw45yq-~77XC7`lC53|^sSmSo~!8?|H%Ty>s+^%<8*r@*+QJ!|C?;F!Kzwd8BPHq@3pFpxs%6ed~mOTP0}xx1HE z9ixHrwHooCrzJRfF2scq>Sa)+C8SR=UVQr*wR3YRr8wJ9Az2Wu zCS@@I!yD2E(f~N$8n#L)X&Y-6X3|?`rH%R+uWG<$?2TiLKi*%cQrLww_Zxm7y~O+I zG_*}{I+DhXyuD*1E1B4~)!){JE8my_=0Ca_M*SScET6igLvjGHiXC20Ejp(?RL98&-evJ9F~SvQ?$DTYyud@KQY@?Es%-n-o%>K;qoDHu_# zns_Y2O{A?H+}bSHL^Ly_$b7*5@PwRB@@?BjM=&OJ1DERB0&Inn`v|f8)QEu_8>cVe zuk@(X;prpOiQ@U(|s^{szRzkJQF$JcX#2%+&OGg>IwZCQuYKf=X{2md^x6Q?&YOhA24brlNRK=MrF6U2>R+~G9$ zOT;t;gBG-#$Q#5eW-GR3V@M46VqT!(xyosiCXqnujKjvM1*Nc6zm2&`2}sJ)&HBvKB; z53e<7Tj@D1Xn3d{%o@1b+QBawk2e8s86gM%bWE>egT;tAjiL%VvOBg?VD=+oE>y&C z>9hI2)h8gKsnDEHu*8ysan6^SoEG13<0XnnTv-g1zN_9(p5Z^-*fdBo@CL)mS428B z=*l%g>==U7WOCr#R>Ge$0H;h;mN}90iM;;X-pcFZED5wiJg&xT-Q&QXvWyv+)FPE% zEpSNUu{XeRs8N0$>e}?E{pT??G-yx3{v^a<0u9P<;>J)WXG@3k`g48ujU7B1q~%H_ zCg>*Xw0GPog`#0(4?-`BN3$jjKZtsjqft@VUJv--WU2YktM?`w1r3)~_{Bq{MrpT+ zx%BCK1ryF>d{4g-ulXmO(0Cy{xYtL8znNO_TR#xwz?t^0!?Z#9vpARMe5R?QE~b!y z7qRiQkSz!kwUYzvYfgF|vLbCtHSMH--_ua+A8VAF9QR>QwC?FeQfxXO?yyMecTb_* zkYFJragj*j3NxYdzN{c!yFlPOT4ENBHyLv=Jfc)0BMS2jt(`<+`Q12_w|^eU;okWG z|L&TeO9#=&{@JQhRMZ}jj@H1v1q{i*PoSy>Jc^DZ@TZ`cMGE?A#(0AN6!anGSj*#e z!H5-rGKe|HFiV2{Ct?^cG>`1-&;jpdn+Hr@Osae!UnlYsCEfbivF&~62dNjZz1cq?kVs_O#IX5nma0Xx&tmxQ@^$DRJS8Ihb3B zAMQN0sNnpjZz-6Jbs-8uC&FzoG3NU4hRt0lkjPL3M-!!YW0pdu=wj*a4GeB&1slra z;^`gSSBdK`iN~<>ABLh2V-*I?=t8|&?z;7swalp8{m(1_|GrNE6vCPTX<>+D);?Lr z9VC;{0q+AcN9-&G-!o7{$oC-pV$XFT6)jEZ*7++>$+78uxYueH`*WhRmlUcVS(JSE z47A;KlU^F|Xp3#((H5m4#kKXPavS}z0{Y31PpquqX9a|VsX?4qd?4Z{ z34<)9ytdvbCH_`Tb+z@zyb=P)+-Ia%z8TC9*TGWq5~&G@nLnU#j=2~{Q(EJ;Bac-_ zgTbihy8AP0{u+dfCe{sSn6cxuQnQ7)S#DZ=8J#9I;}+f5d{-Y>VtWZ`76jb;OaM{Y zx?UO`+hzYmQ=LdJOp9r>H+?wZ>N-L5I`uORxd;c<7tbSiCl{CbGX__%CN(F(9WdLS z@)%F_E$jwE%8RXAgX_3?VAYIzNPb=C1Y%Vq)yBi%W~ZA*JAN`YtWa0R6RuOk`3y!WQ0XzZt)yF z@%qEXCL!Y(pq2PXngJiCOzM2@ShkBtJXD$0eE*E7IL@Ghggg%O7w#^6<#YNWxK$5e zLO6h!Me&>%-YWnB8jgItNQV`8=B0bfyQ=U1`m}s2cub3Xhc=u4`PPC27jVv=Rc`)b zz{r^uKs|KY1$?3QOd~=Z6i~>&*FG0PP|6 zUH%nvqu*-rpC8ub?bY`rRImdAjP=aN%Tr`D=Mza(GnWTTj;bs0!!F|dyYj_B`oLi;zn(Z@@mFg{v(+1&UUyp$~IbduQ;%4flb z6tWFvgv9<qMXX@}BKxcA$dfP{c<<9xX&DJ^)Qh$+X*5JZ>3MY7;f?fFOX{J*k21YO`-FIY$bM-$*z(|0$ z5truJ<=p(|@&7s$URY?jj}&ts%CR`pA!S1V{AKmQ1&b|cjYAk?^RY@IpjQe_leRBT z&&*)QCiOMm0sR9R4ZWVognF;@jkqtP=0`QRCo4vOm zExzVZYOs%UyEc_p`T|vyCLK30O{zW$Zgr2yC*YyKh%|7@$eC_{VOtc-25gRJjEs!H zK?@eL|7k|4kAOFvp;-Qp-u|27SwlY_M-(Xx2A6!K>1yTur4Mjkx=St8!6}S&=Hkuk z+#fQ^>YUd_4ah*N0!gL?;GV-w95~>?aU_jpgIL^nqo7;G%L2?r`sA=Z;g~;|1&c>& zW+VUa5cKD{w&96WigHM%5wU8J`r%*UsuCFlMhqdjKo!OOl=)1lne|w zWE`k^z|NrvwSNNGHKkat!UykPkb%4~69|e+jcJFkfZB7-%F*|aXbWh?Lu z*+l?0c+=sc-kqPCErCMi;=U+h=a3Q`>@)T@5Xp#bbkt=%Q&9tQ^p<4qt#J|UMBJI#SW z$vMy{(QZkc!hkgQI8J zN`3tBCe`5Al@oveWfuAOfmRWbvg=_YRo!`#9BW=C+O1!K|oKNa&qO`PT8-iQAiZ`vOru< z>RXSCAnyM4P|d}4Aa~4y7VuIIFjWCu@-(Sf0wkiV(n8R0P2ep%(>chMxdy#T;(?TH zGGRJ0NS~L8!A>!R!yHPPl)F#tTMEMg#30rnx%Elo-;Yu7F5JrSbMt(^Oi}+lS{)K} z2;=vFGwauYBoTxx!vy8{9t6_sh}5kQ?;b$m!bdJ@!t8d9SR|4b4bSe{S3u_yjp37Y_V4o>QqM&B^?@2ohI+6%V?H!xY z`0GW$KgJP+EQUa#_7yIycp~2|fWbaUWl%4PbkfZ*36W>{ueZ@Bz1Df$*C-K6g+*hR z2_a;#!j3*eD%J+hS- zcLL6kE6}?KN)I-40}DZG5Moe3>^>G@cY2{0E3!lZAW1yG`*5Fb*mP-qy%&BiB=_=@&?Tf1Z1AYX zx#og+H98bxjUZ{*K%;{aZ+B16d1%CHgt2D*SL|uNT$_oc#e%CI)}Z;F^S?E34>2i^ zb#k_3IG2Um;z-$p{^|nz>pM9Qz{}#~he0@v~c(jK@^N0U|$K?%v80Yeckb`eLVNXhRaJQ$6MIqj+l zHCMO_ljJ9@8W$y&2WGY>xaI55B6Q8;xF*K`emh)x%6C3&wcB^Gv`?NUJ(uq93ms}8 z&SiT9a7yOho12iZ&yNA8yi$MTP`)k(IIZkyQ9~D0MWv&%!e7Kc!++!8Xh@GmkRsUR zi6O85JP@f7hH}E1FOmafF>3{%kol$OE%^%G?E3F@pjFe*s161oZM2XZV&^}G85saO z1IH<4g8zg2#2<+-yh58@>9HDGjzg-IaV32#%l_nDF@6Z2Z&ls&!~rF z3Ho}D`&8iC_K~;qTzAVB+XykbqI|Hy#7TiV;Zz;?3iUU~OKRCGR zu#cMi3?N|8Kr;sB0N{Wji_>)vDHso(-Y=ebBwPO;;oDcqo96y|^fs^MBP|x1@xYTz zZLdzjl`j|%C|Hf{STg}N8)gv!%kwba0tE3F8`g-lYQu*uOId(K#)r#k2byAyPtROM ziykxvK%%S~QDBpsX8!`nOCj`&;0S%+5%ujJAfLR$J(E#mY^&Ox@8qyVXJAnZ$f5uU z6LCvM*jVP8h-souIR47tk)1)O4E>k+A($eN;*N_B2>*{KFhg64rf zxxqmY*oOJV6;f*Gp7f|Yo;wQ~xJduz3EeAeF)!61BPwM?V2&c>zbQ_c98B?mx8E@m z#X$FlqgZw;^;fsjaOI`6mCZZk_CgAtD)vf*Y;d zvR1y{68V4;^%nnQeDhD>7qrK;9Ir*{ZPh|#7+9IpGbkK#nB$e-s0kI?4l?L;ArEzZ ztZ1cT0m~AANS?a!m)g8hF2kgUVEakwP?e?JgirT(SD*;}&-DQ;yeKjOu?cFQ!c;f{ zX}k*%x>5lPfkzLvG>f}m;=&t@gIKcpsD+@*ZR)l)bu0DI-ZUX7=^MXFBzr*J z1}e_eeSWrw`IOKw>jUY~m)vN%5wr@M-Jd2K<9ItO&4BOvZlOHe)?TZXWcRn=xt^6= zk1F8j=SR}hTkX2HAK6sJAhwD66VOshK34rSdBb`gFh#3_e`sHvL?jbYZ{`E5&YOYy zs9NYIV;}eudeI*6t9;9iv%OzhIbNsCgt6NSOdpDt-0?iT1Q4PbtOcu}z(>BDT3&uz z=meSb2{@PPJ3Bikbq&7Q)}ge*#;)1`(~G6 zl*^lyG|rjH7^idHwSxbTY6Q#?OY$8`c7UtzlMVVwi)ocl4KteYpz4@O(_~c#W&$W8&f$ zH{XByq_9;D_-@|O9r#qLCGyqruuFB|DS8UIXO7}V@u%KugHdQWISpOOwL-4jR%`oe zvQ4s(Q5(Tiau=U`St+N$sGDLp=b%J@>$>xc?u8ILk$oVrAC^z4t_yA2*xEj~e~TC~ z&R*d+@4R{%-sBBqp>Xk*5DT>*QkM~+bCTsD@m%d~US4ug?u`1KQQdI8&p=VeVRmVr z+Jj>mPNQLP4HONJiAVi!TE%_>(a!vlz+5*v|H++?PZQaGD%GmoarxOjrgGa8yhe|+ zT;r+5&ORo_DJ&Pj9!xxO!?M^D>wkH&vS>>}mr-P#S$?T^P=yciGodAWcBqIRU<&@u zHDfrLh4BBH?<~_SS2QcV?*#91GL|ycSBX+@l#DU{h>}H-I7acAwG|-_@?t^ZGytQH z!l$+;00xBaGF!|-@36+P4~)ZU-xlYdmrCRt(wpG7zoL+*T8IMm z>=dP>*-O*!==dBfz*!3>jQ4rCjC}7(y29#2E&0xbOwgrjc2kx71g`73EEVX8E6$I5 zvGT1hpzuRHCgBH8)p^N|k3vudv|UAJ$$+(6??Sor{x&DvQGMg|39S#ZQILu6l-0NtPB2MI#}} zp^oQQ1Nqb9Md-lzj4kL zeXS1rTb@0zos9M@&0ZTXnIBN$qkn4|H0?bG!xJRsZw#z=n#PjXb3`^BFl-Zy%P-PA%cPXU%iTvAv$&YYmyf>&k86OiXHAQ z$|Qv!vHg)E#Wbweb%zbOf=gmwrHb4o=*&$Kb|3dr1(gI4KHk zuKQfF5a;`B%>ckXMYS3CKadKFJ`wr?H?E)`s0j1X@}6m@xf_w+Qv1u~(5?Uq4&Q5g z58Zo0g^F+Q-M zzPX?NDRkihh5W=sNs#O;=%}6*i?S-{OVjdFMm@X}6SlED#BgpL@@Z2UPZtSOGD*1! z)C~w|?oKh({+8m>M4R%HVj}KN_Yp76as0>$Bb_BFMbM9+2{391X9goAU40;!Bo&amgX$cXL`B0IU6_b=1?9G$;oQp@m2y zrMs#Gn4eEDPH%-{4UD&@)HzI^z414-n(J{TbsZYoLsgtG&spNF#9n_zK%Fd5D~Hz4 zq@PWIkGjh=o|TqOeQqYR7~sxFd!B6qWrx%h102B<=;ypnU{ap&zDq;t$N`>En*gO) zjSgcWsb$IO`_iYP)IMAlO1_OlIjV?lu!}=|j(*fPGPwQIxT-(B)^qjxt@hd1SXLIT z5htk7^dbLdKya3k`g{PmECv$A!p)lwv)%71E{D5vdWNaz7Ja;ZZGacuLH|K`r=Y+{B-fbbrwKT9Lk|wKie-S zMst}DPUPxWFCb>3W^gKSF%ALIP(^mz-uS-O;1lLZRKfHEfc+VJm-g1H*MVAkDYd#& zU3lqKh?mkg@pE2+L4Ay+z9Qp%Z4Y=(cIBpMD4F0)!O zgYLl>`c0U5Hn=5zpqzio5O+b8Mfc#4e(|nG;Tai9St3lIx(7M0@P~Z`Nzu$0LswUH zf2@-|8Y{CJkNEyZ<;9C7HM6I_4#JW0Y)-mQVp|`by*-=k>wrd_8&-`(3qr9=HX{ zpX3)jS{Uf$+vro!Eo;r8L08doPT!fjazr{b47|e!GNbtO&Pn9I&mbD|5Wh+2KxHE8 z{qoy=X|z}($*ZhwVOq*O&;9gCJSLyp;-fpCub-r2Ggr*UM2|GEp)OMbU?CmE@Nw<# zliXRoFHTcu0CFFo67mV1dqT{9=F^bO*^(1SgEf6lBg-#R?!~Ciewfr0Xq&G>(`6pY zj}ldUd2#>w4Z`9}Suz3Sfs#=yh1R%|yB?oz;AS-93yeZPJb%p6+a%}jWT{;t(UaTv zR7YF;HDj>a6J3|*^wvaFX|lS^-d4PS0c%kf_`fj(kgI-inuAxwT{iY8&N0@OZ)ZBZ zQ z3Z>h6?quzGTv_uti1obH%0#g@c-3vcR)HcIKs{#V9Owqq zNZzYGbBZ<*!@W)5H5o>{^6e!P(;Tnhsh?WU$;)=16ND;i2OPLA7Wjpd5=KqGy+$hb zrt(P~teJah*L8>6+=+DsjyvbTeMV>P<+17atjwwlN-%yoBQ5S`r2iBN-RQGejfN){ z$syM3)8P-EIwX9kT6kMU)v>L=^4e!KCBe3xv90ou&|i3$S=?7n-mMx)=G}m%L}>cy zD>m(KkL-!heWGM6l?>?TR;ZXwig>fciLV(vN#v=lROo9$rqYHv_Dvv2vJWV!L~hD0 z2e#}8Me@*J`94f`*9VDmf1Vc?X7QAY4IYL2Pr0IxC*y)7UB>yAia*5@1#z8f%TB`d zcEhC{ot6x8A)=L4Z3xu!W>5}{w$-fPn%@b2?yNr+yHgZ4^IRw@kkgl`wf$aHl&%SE z*<(bTy>{CYD=j+ae3Z|tXYGn*)~O}=;B_Atzi>(tNIdR=NR_oH2e~UI{e56twHtTe zqV1TcQSneKyEXqhRetz&ZU9`^k%uH6ZQn0=&U#^-y`JR0smjsi`HEEVxm6}j$0gNS zR2*u^VJeWja?<8iut*VrV7?JUMinn4^#4e?p4Lls&fuwPY|(yyo`(U9v`~zd?p5~k zdc>~bw%Tk6#U>-M;&7`|%Dtg|;|xVkPy}lx5%RP}Le22V?Cgl%vKv zP~TWDFz7xu2bz8FaD6$!Y103Dq>9!mt3r_O@|@i_`ka_-TN?r02Fx2e^P`hJEr0dN0_D>XRBl#q0rwaJ2lkF?S?z8#CY$^!fnYh~7o(Qe0N;A> zQgi~xttWQP5tqwa-I#3YWIo#3-4zhMq6p3e@$b&Ia*V#_Ltm4)X7>#kyM~>XNPLah zzOa8z5j-wgIrQfel&hjtLHoUCEtVQ#*GSnYWVlWx+F01+xk1v5=qh3@jumB*HH%l# zu(@ZhF;reLUFmgYU;vCKoh6^O$RBlVle9xQ#qq7w6taA6{K^9&KN0rlHHtkplCtu- zaruf24V{D!_;kViP@R9Za)Vj*w14b?>RJBniHN{Lt#tRzp%z3`WVGzHXH)SgeD438 zYHWs$}&?BYu@M@t2aL*Cn+eJ@J%T*kX_r-|sDoR0{OX(+P9R>WX20Cv#^* zajW(mb86lCWNNu{+9a))wL*1QP-yfyG%Pw-hz-IY3(4_vWcv2R}ariX`R#I9;d}M$Rd3LkP!Vd8TDn(pOLkm)oU4)|%U0b+!(qeDWp5 zZp)LZ&p~;8pD^PicX-Rd;#IVJ3GEYsnCUM?#wFxMP3=mx0yfHv+&?slRO%lodnoRZ-5EI)~&co zgpVlVt;fOc_x#4QH#kVnPF-9So>CU%4U}Nzx*4SLKGow}ri%BDqKfu5USG5{ft5Qk z-!g}p$~euxn8UlB{>Om2RmHt)&6;lTeDrxk?$r{DfsNYaBj37I>efvH%zcOt`!{*= zWYC{5kHUPI@q?w)Qz;v0s&1(Jg<*ZSg$D0d&6}otxkApZ^7ZPVCp!-J#Uic?QsCL= zadUM4cxxsG3H6{lT&xg2CHZ_Vcktu8h-(7PuAw| z^P8}PB6MN;G5~nZTWY8U>^DUiOX{pVp4}#t#-vfdVgMLKf1j{Zr3{)v!BFEn09w*p*wb|-YsjE#zI1tbE=IwVwN0avh{n87<{ekQ}mSzL-`FCaC z?_T%?uz$zc)?lwMQ;R`MzC;Fh$FUx-7`bRyFBWzXxHuNGldmsCsL_g1Zr@_8z~xBs zq19o*?Dg<-NfI;D4cRJx6ZfX|Q3+R=bfIMq)kwFMftg%r0ok=eu~J>EgyOnJqRWof zf$#ORQXL|rxU}5yw>!4GmY$9juSG`c-h0;SvGje!cg#5c+?6AzYP%|39$oGiPtVe- zcQ*(Jg?Z*yzV7dwmqsY9RXOz?=|$EE92UhY)o%=64hs+M{Pk_xDuW&7_h1 zICJ0dS4fC04i55;Ch&fa$GzLb<@96XrrEipE6e5|X&WA{PskR_X+JBptoZ)Y>~0-1 z$Hp!D+3xPz!p=n){(`D2jOhtb(I{N*At;pfznHm!{W6z=)3ZO2(6U%^5(=&7i`3ax zo`+qYhwHwa6*58h=m{eC4SZ&}1ab_#31ljq2Co7k{)KbNEbaujr=be=;%@ zbVuTEQKNQSfhwaHsl>*QkeyDx zZ+bjq+bWqmP?I>A(LlY;A^zeQ3E0>?YOO~b$u!uNoqM}g>s{?HmXzg%&wW)B*)PuP z0YY3(vm!XzUrOjbB*2O4`C`+S9e@ru7mxCsNUK zUPSGj#6-);3PJ-nq)z?Q?N-~HmbpHj;|Bx4#*)q?-G1`@b8pwN7x<5q`(a|hm8oUo z+M}*8xuUX`V!P`%#ML#S!gYH88`EVn8fMGG`}F}eWx^cqlXZ#eJF=IbzK|%!9GuAKw+v5G`UBcOlk-n=5Z*Lo`lN@h{(&3)wd!qxwSy_LZc^XZ%QT zeB~{h0{JGNx9kGDNBTA8_LGc5hM^XWqq^%-$pFzwZ5m$Ha=dno2c%6|nX=xC7`&s5 zfM%#<{0R_-xSD%sc>jZMEI>JlcbxApbC^66x2CR$Xm$MP$HZ|g*HP+(@^IO{$5U*% zK76lQ|D*k^?7WkXjl92j(B8x!-72mr@trd!ndO zp3Oin?|*NY#3d4WH41@hPx>9o5{WnBKg(((%ky~9iOM4N0YeXgSvkc0{NZU>M{m21walo)4{7xp<7&6}$&Qk{ zp}Xf6?v=ka6Fy41ol?es-!Oa|GTnQXlazl&Q^8UsJ;(hntoTyg&$w(r*G;@;-DSnc zFZxTZ=TQS3!QER$1{u^?EBvmKoQd@4tQfHZT+HNKfY1$KsbW`GUT?3oc=j<3g3>i? zATRAAdUyTmmwPq!oq%A8M1Q_NTNtASrB9DXRKE*oIhhPTzj*FjIsw*TVDpjt!K^Lw z5zvO795!MzN-noz?}sb?pQj;pjXz(@h9(lW>gD# zcpKh<7Bep_rh4T?Wv>y!t)g;`{)F^v*~_~9qnJ6tneLs%&hbs=rAr%p*suJ!i0wnu zDs0xz)+o$9%Xefr@wLCiHx`l?&43B`8|;N&w}(VP^A zPbPvGjZRux9IvvWkW+3^%evIN<=*1FWOZ&^t|N$x7*nRJiK+6$Bx2N#6uGRQo}rpQ zCo5>GpDUE%D{NJg><|s;=gvZqzYp!(Sc&^IR}k3z1f65(>w-Adl2`t6s*BxJ-LLe= zYiQPRo8NQQ_q2X8if=T;$)ry@@_2CB6{1UNi2dD%iZX81B;3pC?hEXK8wrsno-O2N zPbPKJsDOe3#;~e)t*G^_o{KVkO+u-CmkaCQX-WSjiQ1`LK`#9fmGZH5 zf&7PsvGM^rw=we{IPxgih03PWa=F%px``>rB1UYEw3Zin7Ubvd4+?axeQJ6CfPx{163~Ji`aA7GVo>oLpgp1 zjhFQ?F%>pi!A+a`jrh$<&Du)hKX>+awrh_pAc=4{_#tqJ?1YJ#R7RaO6-eAyH; z{#2!tt$Ue->w=YfVI_7apbyf1}23|x2|*K;N$B*Zmnns&OC+L($vTuYF@p{mrO28@xUw| z0**|B&d{-UNc3zpH!Rtg15fwYaKk6YqyV9_!W%&amE9w6l!s+XzB~4781oZKt|XOn z)HjxNR{Ig-a$KSxz8lAS`L84sTP(za42e^Pai_1t>X9~kcAgI_bYoMvIkp1-l_w?6qLGAm7=X#+BNAVUr{RbozwvB|sXc{3D#?nr+ zM6&Am0-YPeu-2L-Q4b?EW}k^r6pj}f)ipI0;GMS-6lj=%D7j3fiQH$Vs^` zMoPIrlVhcruT?HZJTJpFtkhkhmL!h96kUDqlkxYNSS!cH`gu`+IZY>m?E96t4bL(i z{On(rCi-Q?JA^@QMjDT#8wyqlZ(<~OG9e215fblT@%XPfmmZy;{d^nX-G%$T=l=ai zwDPcI7oX${Xtq!>Fz(vAtxIC+A!D*T9UWoCT5^ZdAI>kTsNo+%!nVweiFBe~1$STm zM#z4(1Y@~U5f)yurE$3Ddu&p^fz$V&bo0+r^4QJD=szwmr}DXPnDA)Vq!+kNZ?%{r zci2Z??z=u?)S!ZtAIGAqdBPVKRoSr0^0Mxa!rQ}BB4=TY{OyIC9NPw&DL;Adqx?@N z7?XTJCUTiLgipMBOswf8^9y<|q<#D7z%{v3$?sVaBpAN%OY`x43sa8!TsA7szAH%k zj>j^MP^?Vq=8eB@MAA4S&BOHf#lGF9we0bLrq)K#eZ@qb1Dpat9 z<>+g9haN}cwC1Ht2eY1s>G(fM9rNj2YWGG~I!oz`n#e)QAmCG z4{wHKMSy^QUQ2cO>-HLg_mg?buNcewBvFfGnPLagLCcH6h@FEKPphY=$cY3CA?wBT zY4@g27Zj9)Y)<*&SO09s)`)X^3t49J1224O+h8U&lXJ2}F$NYX`s(wLTTEfUT5gWC z=TYa4B*h#hk+kQJSAbHSitHjN z>+1#Q?&Iz=O55iy5a#S%ZtWa}i}ZbRIAw(4_%GmV5$`+IT^no2VB6UEtR!C-bB)}d zoVZo}^~8d8ydaiu>~OT=U(YLy02s=Ox)Q@pKFIz96%8n~^6XvFE&$_Cjqr+BiY# z#cN__ZD)sR)up`3Wo{^+k=4B4^5*7Y_7ocH@}V?3!=Ir?Vp5hvN~ENbp-nbs$S>A2 z$~w91ieDzA0uS#4=XJ)Prwg|-K7@JUH89&^!4ZrFDr7@N;LmTIo+gJI>7uE9uPTGC zFnf1F=e(WnPT=}gwfjqU$`?F_{QBSNxt1q&kOW(poPb%(pTYSQEKp(OW*L0|BXEW* zjlrdV&~C@W183Ob&w};un9P^YaE6YX#7UmG>WH&+a+kIJf`;_1RAM>4_m{gCGHm^% z*2W*7mC&5ehzD>xBDA+y#46i_N6L!5Bn~w|+Hdy&rFXu#skl6RHy>IhaBRsaXrFu+ zy|f8+2_|Rw#=UMkncQFcE}4YNY)UQLd4`99dJ1{Mn);y#hfm;$n2<=O0aGKd1sXQ^ zYv)SkxJ*1DjbjYSNe(k8Cpjl5xy@K{+r5=Z${@6M)nj`EqoKXL3{=3#szAZumQ5gs zTqwU!fBo;Ei5RUO%65=l&2-2swanip69P4IRXuxd(7w3?8op7h#kmo}s_E*2PGjLt z%Zho{l3vy{06xS+=+A92O(Ytn`)J1y@+@Ofkh#OLvVq5ZL89>>N{7yh6|1QaXv%zY z)Mj6qN+U|7&49b39A`bj8M&|n^@knMRK+&;ycR;`#z57NvpM-uXL^Eb8x-nvCWbpw zV~(y&NaVF|yjg>QDt&J5TYp$fCErybX1IK@h-4lhDy(>M2WeKKC`jbV&A4+)uiVz~ zPC?lhA=vUKXa+o~-){BY6Ij(B+SqjH07ZNpuVf2UH&hVj_7r^nb1rkD?> zWXAvNjI)x-ZbIg=jm%fYut@5a(Ax9zANBb9FYhS09PZ5Ow|}1jt89TJ0*Y-xCW}E= z$Z9^ia+6cjFZkwfDQ83CAj4A9v&~w#{tL*Q;U@Al`_YPl0Ci)0QOM!K80Z~OQq=%-zUemg(_94LO^ z8Xa@x{tZ~BK7_qyBt>@>uf&@DZAoDfY*-d-AzJ#?YV9|KIOZ^&@}9fO#!uFZ5)V$5 z))2n^@2$NhX1NNj$E=piXQ|g8)9lx|SoR2Xj2#_1&DIb%=)@9ISP&QlR!2I*^;h1}Bp&wS7R z)?i*@;Y1%-{A>5Wadw5r4AV82ll6;1?0ITZl#N;r=q&-as6HJrds%;A#zGNfoI+_P z2W8*ElZr8BKX!~nPU_b6yE9P#!lTKqaEc;V`r+e(eyve(@0cf%d^(~Q9}4@R!4!bP zXA+bP^MUt~@!O`5Lj)^^#uz)$6VNaZN6H>fdQt*r)LCB@e*w7C)*OwGwkyXBhXW!4 ztY6o?A$oD?&4B*m8@A96d&W^1J0Va^QGKZ;ZW}@g9rKdIphaXM zXF1$O==pfJCz&*;ncA%*k;+xX^U$3Kn!=K9ODq}Qaa%4=H~IQ5mmj1m;L>AYHAiOp zRdQxW12HVxs`lVo?mo5K;)Hfw0E~)SO5naLSxG$G8B5AmZ*mHfw)wGk50C$rUrzGF zdw5@AW!3LlveV+*ZQUb+;-2}*mz<6(eJbTH9b?896X}OZ)_U)o6R=RD{G_2UiMGgk z;)dPNiD&7j-GPd2`S|VOOiOB|P;w9m%_78!47&Y72r`sVFi6H;m4}->yzcc+&Rr$^ zn!Cn=xI5%JRn7%HiXv}H=yO5qayVBHsaWpRv}Y}@xu6px+u;k*2G&yx&qfCb}$bo*5z&IYk&?a*c=(KC!WEZ-9nR5+w&8eqKR z6H!du+^Dh=w&mfp)cl!Eil%_MWYX}aOC z%M47vWIaGVEpnr5Tc;X7^hjiurF7bYMaX*jj2?fxdTWS1&sl2ZW*KW{bE^TZf;GAr z>+bS~ac9i8;Z$haS~K3%;zg@)3M`i21S^*WF3B;l;3#L@Qy>Aq8vom3=NW)*@y0GS zjV!6K{*`oLQe>=QIkP43!d3IariR!z+;A~Z4t>dJ(0-9#whYNQ)J)+9s|TlsKF)$=^-V; z1d0Z{NZK_{hKKeGgP#o+;d^@8dmgc4BMozBf7_%CHk9Yl-dMcXdJFxlC?rt+E*1(h zqQIFKl%^~{$b_~h<~uiPUsx-Dmw&!`J*f;Aob3t14r6f6NK9+QMi zq*X3vd7?QdO6*_ue1{-tuN8RMG0>(`aDwShvCDjBddK}|R7OzH5+aZ3^A^)USUBy? zT`3oXen;Yey&9xg@6k>wep;?GA0#gm18&8arHJ3=r0xQ!F;(^k+u`g)S`szRV{b7< zVln~y406#&Rm2uRP>B0jj^M>Ku)@g57$fK>_}Z`qj{XzKdx0j61z7jpcikgLCCdg= zf6h^&7;oN#hO9==9%2T8&WO&ZpLJ+Frxpd{2?wgy+Stg}JI>7%jf;lg9?t<*MXT5Q#qh6mc{q+Q3M@X2xVNlSB(2u&~NbH7Z?G{0#X@8Ch zj4+?P6$gkj8oCTMo*QG_1_X@fDDXr~iZJM<)Iq==IQShdv+>3-QE2&rHx-2Dq)0=c zjZY>y)Z79;*FQMp074?MK-#NL;k!Z(tWA)ctQ6_5zY64EvKfZPYP3~J|Ds1o2n4JHr&cWafsVUes(q^IdCZT3ap;>k-#&t9^&u4>92~!+`(CkE9nG?Xa;0nBLt#- zEI*hy>uJsL`G!>paNcggX}q}g;q9<>P zAf&MeTVFZ#ciK2WGzV{)Ks~@su?QYO8-8})TMK$e0{k}RG7BS>rO_fDuH5+ueH+4P zGZhPY(iQU3qtj>Fx) z+Uro^O{591^x~lJgw_FfvlC8l>5`?7XOY1Rz6TAsh~-OG$3QxbhdJI}$;9WLDnZ5x zP*|UjMgN-E|4)veg$89ym4Yo-t`y5-9Ed+og>lmuMNEgrB%>JK)8a7EsSpwV%7^jASl)h zf)G7uH+CbQVA4_wdn~p}7*vAvl^&^cSbo9Rh#{6Zg$0iA5At8E%-{d{S>_%T7I%e1 zBA~YeMw}9TbpyQLp4ke%b zd(9yP#ZBGy`WbahLDflsI!|8QAYc(dJu;)P`k_AJ%)oae=_eAn8spJ#_$NW<^M?9% z4Eb4O0QUt&;bh6!Log;W2J~uoU$z=&p-{an!v#yRq=$IE8eg45-_JMEzb8aBii6;m zC6FdR`LDeG_s5euaH}>xNy{~WKvY1kPkM0?7$+88B75e{lW~qiCTY-$f%O}qrINKZ zmUjp(fsw_O?5S*uS7=FG5>n7fldih{=YO++|2jZ#ZpOFz&1aJN_`r~t@l^y$<4`*% zy?oXSpVJWw;HncAo#N{U)s4IpG}rKdk*2$^_k? zqY>)=Y<<*iC3R%mxW!=zn$=nfwa3B)i9IVj09Yi1-sbRubN~53TKGW9?iY&x^nu>$ zsKNv&E_*?21A~?Bzk{rr>S19!2M>}jYiEX_7K;dKQ2ncOQT<;ha~-~pFM&AucL?;C z0?;7-QsYqx#J)gcn*^X57un6qsi_HWlz1U{&@WbuqyO5dOhLu!ZEIh#34}1YZ`^?U z4-)DnHj0Ki?#0Q8D)5kvV9in(6Bo>Faa^%`k;E;HLroNyR58?efdnk>aG#$X`IBAz zhx`1WQ=p|Wqc}_T*B_W8e{kSVM)iOGfj5Jk_+BiziFo!bg!`YBA(&*?_(RKo^y1$d;y*vZfOofHsL2fd*S+L`ds**s&Hoh2@cKQ(4+b(X z5BL*TAtTQNV=k_O2jHe^C(l4M1H&_}0vK>o{l*GT+yCl(zi=@__!hh7e;?Qrgw%c| z5kJ{Std;l+1nNBqAM16Pg5`wW!;*$Yf~@Y{-i2Y0go^ea1bEfb{wvQt#eyPfi~#Yu=Y@+1OgTU6jc6WfC0#DH`Bpo zoZw<)dlx!naXAg!JgXEL_d4DIHda3ZGo_^L19}a?Rr?(ou3ojytpJ6ylW3P^AYgG1D&j{K*+(|*7-Qj z8GDyD$o30&038BJ7KCmeFmqOKgaFhIkYXU>*n9WYk_RHXxwW{n{}JF{FJ;mqa!e!i z#`TN{;`F8AP<|}NMeqfh9Tp`)=Z(h{mM{ya0|1sRT#TE~L}BU%#5jITS2IdSL;>1m z&gb|3UrPt&OGrA5GEu;eLj|@hb=M%86z%8h_24s$QNV)%7GQMsY%C0L+HQc0#tR>A zw|y4EQAl&K^$#?MR|>>b6Df&Kdb={u@bRc(Eip~4)Ty!rJXk7x{!-4Aovvf@8A3TK(k)Kw{8}s zG2`ClMLY{8nLU7c4Bk*v90MJ82N#FSd&A3DnilivkLX`+4kc*d+J1H^Q$NgMK6t7y{kd zg|s_jVG8^NaS!uD;KW5ky!u%L^FK>7G4kWCLmef3U`WDtiH#l+u-rox=9SN-#SY^x ze9ksj&DXVn!c78!NoX`00|kXKp!3W2km4hG(F6O38r=VABg-L!$Xd$WiIm-K3ep~@O#-v=s)2Yw##bNvVnIBXzm4<8O@b!eAa zzc$ldbq3V@zjrW60YP_dq4y{WGWfiYaE={2I=a*prTU*Pql+WhUguQCnpek$bt)`#Fb_6rc9+(m4e9IQ)DbjvgyE~}g(#6UK(Zns@OhJ_{&`|Y1VmV0DR7cS`TRq*kN z(Pp7fp)iV{_3obcjv_+Lp2LUJ7(NRDppF%T{J?LW~Fbjn|4?7ct zwYG$HEgj#cfklxE<}vC}&?IPX7f?8l!lm_sZ~o<upjJQcfcBK>R~#DmBtXYV<<8t(q_*t~=nwU#p`l^pDyQS3 zSb#8F%P7PpD7ogF@EzKIUl}aay9$?}to0?)04)I(3T^o&IWdC~#l?Qb{<{K%8RTI$ zdzNx~U;-2#@>&kVSf-^As$wV(E<^h9L5?n!0;1kxP^S+Y`G9%-VQldlnFF+3V*YJG z$ohP>yy|4j+`QHZaT8#9;~F8vC|nY;x&$kSdS5)($rsGU&~6asyWfWXIiH}{o5Oe= z79!hsq@<+u#*i_tF#--*P#>!1_37jz>6xBuCgoS=nPh$B|2!}P+){Xh_4cuE^aMg! zD9rmJ24*w?i*Fq`QzhW@Lq`P}Akr$qhB^Q#JR5Rt0uY7S1iQpvP6Girpm=&i^|$i# zPiszQj>#6EZ145S#-I~_J*0n~8G#)9{6t^6IogL^Y@DeqVH&QV3&~r_J{a?;1`T%G z9dcukKKr1wx^O84VO*7)U~l@jf~X|zh!NN=fAarhx0GSG_%>N7yvI)xl;PzumtXV} zqedf5E>4qk--2$T`cnFCnRkUA~Wwrp8iX3D&67wLir~v)$t#wG-9#{FllVVR) z#F!Ad)BPbaUSfP`++p9F@!W*C0kEczWg+Y++-ce$O%zrw)cm1waf{kL(2@a3nPll! zS1g=yb1kl1u8?*-Hd{6o7)tfS1hOa#F$y%(hQ+d)RR7lFWPFas03BPjV*=NK*=ye^dW@kD!?t#8Sveu6@@!B zU!M_s6;FilPm!!MgFVuHsZ5P}O$>)3pk*s@%-bBTq@>gb*rs~3U#kKTuRUm;s?K*sqw<^0bTXb&0PjDt`Zb-d>TQtg8CbE}?HAf>&HK9e50-$fOVjw_VoopM`Zi z{FpaIehMp&_eXp8DA5-_6P zlUaoJ-~GQ94R>SpMl?6U4+*cj08Cey4}2Oefj@j&r@{a6X;0wOIKx$QEJYpCEVI|m$LgJEg!Lr`zekDV36R-B^#^J#(~H{fwy z7UdJDQRK^-qLm25XiuP>kNJ7arNDZAm!*b`V=I>*6ziL)YQy2ZXtzx7!KGCoz@qj# z`KC$u&!=g}pTOf)3Tda%RfM$GQvp1wu&JkTe;gw@9)Fwo4@*k$ToG$jtKnhur<^hp zxZ9B;~ZNwl!gbGHKA{(M@j4j&$Oel0_e>r4;lKw*66`Y~@Zf^jUC69U0Ze|$JC zK{BeU^m$KUs)h|K+zF1#cnNwhvForK`=?aW zN?XC6FkR)^M8;;Y=ZjJu5+=~xxFM?Qja-@NaSSUSCgw? z)^EW=eKKs${`oYn^Tj$h{Qv)=|9QLqKXcK;aHA@>Z)?5N6#bf#t7T|eBI2|h;iw^6 zsVpk%=D8v=SBJ&ewcqi%a5{$hHY;oYE4@2%awDbrw{Hg#5$DS5&DVHnSC!qZKV%Kw zHKB>*U`*E5Xgy@z8#CT1&E*Vt{t1Qw2QD!&a{WK` zTqXYF&U+K!N4ag?$sSM_H8af9;by#746i|7*2O{5tw$Ew`>qZ-i51*!VQ21Rw_Nc4f*5W$k2^0x(cVJr23q>v zpPI8F$;;(O(#AI1+;*+O;bHp5>=?J2#`_C<#$UIRO8LyaW2=f&l*H#AvU}+teE+F$ z7-wB&UvKlNK(d`h^%5t)^=Xt17$>H@ir6MVA@{*_q|2CaQyN5z4IX5G<>Sv9$vFu55O^6!VkOL|?Jc1^nl1K|bz30#W@+^KOTChnJG%1y^h2Wkrj@(TtE zZTgD~z~k55Zqit9I?0y0q-8eE(z+|PCv&H8s91g`PvMLca_v`Z(A+eo6r0zSt* zoZ6Up18iHlP@66CkaHcaR&TS%pV%>@UY~=zs;Ory36_=Uc^?=kx->u^znds$wtGYL z*JnCH`Pbc|iym2T#hWy&Y2mw_ENVI(@1PmSS`%|s=Jb~@z40!^;!|$;y$MF0C�t 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 MQ8|$!q1T`OA7N3z8vp Date: Tue, 15 Oct 2024 13:52:40 -0700 Subject: [PATCH 08/35] update yml files, replacing ubuntu-latest by ubuntu-22.04 (#1881) --- .github/workflows/c-linter.yml | 2 +- .github/workflows/cleanup-cache-postpr.yml | 2 +- .github/workflows/cleanup-cache.yml | 2 +- .github/workflows/codespell.yml | 2 +- .github/workflows/docs.yml | 2 +- .github/workflows/draft-pdf.yml | 2 +- .github/workflows/post-pr.yml | 2 +- .github/workflows/style.yml | 4 ++-- .github/workflows/sycl.yml | 2 +- 9 files changed, 10 insertions(+), 10 deletions(-) diff --git a/.github/workflows/c-linter.yml b/.github/workflows/c-linter.yml index 2a7d447b7..685a4120b 100644 --- a/.github/workflows/c-linter.yml +++ b/.github/workflows/c-linter.yml @@ -3,7 +3,7 @@ name: cpp-linter on: [pull_request] jobs: cpp-linter: - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 steps: - uses: actions/checkout@v4 with: diff --git a/.github/workflows/cleanup-cache-postpr.yml b/.github/workflows/cleanup-cache-postpr.yml index 5e9a70cd5..8ae436be8 100644 --- a/.github/workflows/cleanup-cache-postpr.yml +++ b/.github/workflows/cleanup-cache-postpr.yml @@ -9,7 +9,7 @@ on: jobs: CleanUpCcacheCachePostPR: name: Clean Up Ccache Cache Post PR - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 permissions: actions: write contents: read diff --git a/.github/workflows/cleanup-cache.yml b/.github/workflows/cleanup-cache.yml index 8779271c2..99592dc78 100644 --- a/.github/workflows/cleanup-cache.yml +++ b/.github/workflows/cleanup-cache.yml @@ -9,7 +9,7 @@ on: jobs: CleanUpCcacheCache: name: Clean Up Ccache Cache for ${{ github.event.workflow_run.name }} - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 permissions: actions: write contents: read diff --git a/.github/workflows/codespell.yml b/.github/workflows/codespell.yml index bec24c5c7..3d2b5d5a5 100644 --- a/.github/workflows/codespell.yml +++ b/.github/workflows/codespell.yml @@ -8,7 +8,7 @@ concurrency: jobs: codespell: - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 steps: - uses: actions/checkout@v4 diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 0ee3edc8b..33f594a2b 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -8,7 +8,7 @@ concurrency: jobs: build-and-deploy: - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 steps: - name: Checkout uses: actions/checkout@v4 diff --git a/.github/workflows/draft-pdf.yml b/.github/workflows/draft-pdf.yml index 3504eab14..e69bc4927 100644 --- a/.github/workflows/draft-pdf.yml +++ b/.github/workflows/draft-pdf.yml @@ -2,7 +2,7 @@ on: [push] jobs: paper: - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 name: Paper Draft steps: - name: Checkout diff --git a/.github/workflows/post-pr.yml b/.github/workflows/post-pr.yml index 5f0b15349..23b06df6f 100644 --- a/.github/workflows/post-pr.yml +++ b/.github/workflows/post-pr.yml @@ -10,7 +10,7 @@ on: jobs: noop: - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 steps: - name: No OP run: echo "This workflow is going to trigger CleanUpCachePostPR." diff --git a/.github/workflows/style.yml b/.github/workflows/style.yml index 5b5af5e8d..5756fdb27 100644 --- a/.github/workflows/style.yml +++ b/.github/workflows/style.yml @@ -8,14 +8,14 @@ concurrency: jobs: tabs: - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 steps: - uses: actions/checkout@v4 - name: Tabs run: .github/workflows/style/check_tabs.sh trailing_whitespaces: - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 steps: - uses: actions/checkout@v4 - name: Trailing Whitespaces diff --git a/.github/workflows/sycl.yml b/.github/workflows/sycl.yml index 471978d8c..f7ad7b22d 100644 --- a/.github/workflows/sycl.yml +++ b/.github/workflows/sycl.yml @@ -18,7 +18,7 @@ concurrency: jobs: Build-And-Test-SYCL: name: oneAPI SYCL - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 steps: - uses: actions/checkout@v4 with: From 778f8525f2c969a3a991dc7a16075fbd584cd4bb Mon Sep 17 00:00:00 2001 From: Ann Almgren Date: Tue, 15 Oct 2024 16:01:46 -0700 Subject: [PATCH 09/35] fix bug introduced in previous PR (#1883) --- Source/BoundaryConditions/ERF_PhysBCFunct.cpp | 26 +++++++++---------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/Source/BoundaryConditions/ERF_PhysBCFunct.cpp b/Source/BoundaryConditions/ERF_PhysBCFunct.cpp index a5c6048ca..fcfaa91b8 100644 --- a/Source/BoundaryConditions/ERF_PhysBCFunct.cpp +++ b/Source/BoundaryConditions/ERF_PhysBCFunct.cpp @@ -279,7 +279,9 @@ void ERFPhysBCFunct_w::operator() (MultiFab& mf, MultiFab& xvel, MultiFab& yvel, gdomainz.grow(i, nghost[i]); } } + // // We want to make sure we impose the z-vels at k=0 if the box includes k=0 + // if (gdomainz.smallEnd(2) == 0) gdomainz.setSmall(2,1); Box ndomain = convert(domain,IntVect(1,1,1)); @@ -318,17 +320,10 @@ void ERFPhysBCFunct_w::operator() (MultiFab& mf, MultiFab& xvel, MultiFab& yvel, // // These are the boxes we use to test on relative to the domain // - Box zbx1 = surroundingNodes(bx,2); zbx1.grow(nghost); - if (zbx1.smallEnd(2) < domain.smallEnd(2)) zbx1.setSmall(2,domain.smallEnd(2)); - if (zbx1.bigEnd(2) > domain.bigEnd(2)) zbx1.setBig(2,domain.bigEnd(2)+1); + Box zbx = surroundingNodes(bx,2); zbx.grow(nghost); + if (zbx.smallEnd(2) < domain.smallEnd(2)) zbx.setSmall(2,domain.smallEnd(2)); + if (zbx.bigEnd(2) > domain.bigEnd(2)) zbx.setBig(2,domain.bigEnd(2)+1); - Box zbx2 = surroundingNodes(bx,2); zbx2.grow(nghost); - - // - // These are the boxes we use to test on relative to the domain - // - // Box zbx = surroundingNodes(bx,2); zbx.grow(0,nghost[0]); - // zbx.grow(1,nghost[1]); Array4 z_nd_arr; if (m_z_phys_nd) @@ -336,7 +331,10 @@ void ERFPhysBCFunct_w::operator() (MultiFab& mf, MultiFab& xvel, MultiFab& yvel, z_nd_arr = z_nd_mf_loc.const_array(mfi); } - if (!gdomainz.contains(zbx2)) + // + // Recall that gdomainz.smallEnd(2) = 1 not 0! + // + if (!gdomainz.contains(zbx)) { Array4 const& velx_arr = xvel.const_array(mfi); Array4 const& vely_arr = yvel.const_array(mfi); @@ -344,13 +342,13 @@ void ERFPhysBCFunct_w::operator() (MultiFab& mf, MultiFab& xvel, MultiFab& yvel, if (!m_use_real_bcs) { - if (!gdomainz.contains(zbx1)) + if (!gdomainz.contains(zbx)) { - impose_lateral_zvel_bcs(velz_arr,velx_arr,vely_arr,zbx1,domain,z_nd_arr,dxInv,bccomp_w); + impose_lateral_zvel_bcs(velz_arr,velx_arr,vely_arr,zbx,domain,z_nd_arr,dxInv,bccomp_w); } } - impose_vertical_zvel_bcs(velz_arr,velx_arr,vely_arr,zbx2,domain,z_nd_arr,dxInv, + impose_vertical_zvel_bcs(velz_arr,velx_arr,vely_arr,zbx,domain,z_nd_arr,dxInv, bccomp_u, bccomp_v, bccomp_w, m_terrain_type); } } // MFIter From 15d6a2e32bea8c23a18f1dc830707126a6413abb Mon Sep 17 00:00:00 2001 From: Ann Almgren Date: Tue, 15 Oct 2024 18:50:47 -0700 Subject: [PATCH 10/35] remove some extra FillBoundary calls (#1884) * remove some extra FillBoundary calls * remove unused --- Source/BoundaryConditions/ERF_FillPatch.cpp | 233 +++++++++----------- 1 file changed, 106 insertions(+), 127 deletions(-) diff --git a/Source/BoundaryConditions/ERF_FillPatch.cpp b/Source/BoundaryConditions/ERF_FillPatch.cpp index 352ee01a5..4761a43c3 100644 --- a/Source/BoundaryConditions/ERF_FillPatch.cpp +++ b/Source/BoundaryConditions/ERF_FillPatch.cpp @@ -110,7 +110,8 @@ ERF::FillPatch (int lev, Real time, // Impose physical bc's on coarse data (note time and 0 are not used) // Note that we call FillBoundary inside the physbcs call - (*physbcs_cons[lev-1])(vars_old[lev-1][Vars::cons],0,mf_c.nComp(),ngvect_cons,time,BCVars::cons_bc); + // We should not need to call this on old data since that would have been filled before the timestep started + // (*physbcs_cons[lev-1])(vars_old[lev-1][Vars::cons],0,mf_c.nComp(),ngvect_cons,time,BCVars::cons_bc); (*physbcs_cons[lev-1])(vars_new[lev-1][Vars::cons],0,mf_c.nComp(),ngvect_cons,time,BCVars::cons_bc); // Call FillPatchTwoLevels which ASSUMES that all ghost cells have already been filled @@ -130,9 +131,12 @@ ERF::FillPatch (int lev, Real time, // ********************************************************************** + cmf = {&vars_old[lev-1][Vars::xvel], &vars_new[lev-1][Vars::xvel]}; + // Impose physical bc's on coarse data (note time and 0 are not used) // Note that we call FillBoundary inside the physbcs call - (*physbcs_u[lev-1])(vars_old[lev-1][Vars::xvel],0,1,ngvect_vels,time,BCVars::xvel_bc); + // We should not need to call this on old data since that would have been filled before the timestep started + // (*physbcs_u[lev-1])(vars_old[lev-1][Vars::xvel],0,1,ngvect_vels,time,BCVars::xvel_bc); (*physbcs_u[lev-1])(vars_new[lev-1][Vars::xvel],0,1,ngvect_vels,time,BCVars::xvel_bc); fmf = {&vars_old[lev ][Vars::xvel], &vars_new[lev ][Vars::xvel]}; @@ -147,9 +151,12 @@ ERF::FillPatch (int lev, Real time, // ********************************************************************** + cmf = {&vars_old[lev-1][Vars::yvel], &vars_new[lev-1][Vars::yvel]}; + // Impose physical bc's on coarse data (note time and 0 are not used) // Note that we call FillBoundary inside the physbcs call - (*physbcs_v[lev-1])(vars_old[lev-1][Vars::yvel],0,1,ngvect_vels,time,BCVars::yvel_bc); + // We should not need to call this on old data since that would have been filled before the timestep started + // (*physbcs_v[lev-1])(vars_old[lev-1][Vars::yvel],0,1,ngvect_vels,time,BCVars::yvel_bc); (*physbcs_v[lev-1])(vars_new[lev-1][Vars::yvel],0,1,ngvect_vels,time,BCVars::yvel_bc); fmf = {&vars_old[lev ][Vars::yvel], &vars_new[lev ][Vars::yvel]}; @@ -164,12 +171,15 @@ ERF::FillPatch (int lev, Real time, // ********************************************************************** + cmf = {&vars_old[lev-1][Vars::zvel], &vars_new[lev-1][Vars::zvel]}; + // Impose physical bc's on coarse data (note time and 0 are not used) // Note that we call FillBoundary inside the physbcs call - (*physbcs_w[lev-1])(vars_old[lev-1][Vars::zvel], - vars_old[lev-1][Vars::xvel], - vars_old[lev-1][Vars::yvel], - ngvect_vels,time,BCVars::zvel_bc); + // We should not need to call this on old data since that would have been filled before the timestep started + // (*physbcs_w[lev-1])(vars_old[lev-1][Vars::zvel], + // vars_old[lev-1][Vars::xvel], + // vars_old[lev-1][Vars::yvel], + // ngvect_vels,time,BCVars::zvel_bc); (*physbcs_w[lev-1])(vars_new[lev-1][Vars::zvel], vars_new[lev-1][Vars::xvel], vars_new[lev-1][Vars::yvel], @@ -239,7 +249,6 @@ ERF::FillIntermediatePatch (int lev, Real time, bool allow_most_bcs) { BL_PROFILE_VAR("FillIntermediatePatch()",FillIntermediatePatch); - int bccomp; Interpolater* mapper; // @@ -290,55 +299,42 @@ ERF::FillIntermediatePatch (int lev, Real time, Geom(lev).Domain(), domain_bcs_type); } + // // We now start working on conserved quantities + VELOCITY - for (int var_idx = 0; var_idx < Vars::NumTypes; ++var_idx) + // + if (lev == 0) + { + // We don't do anything here because we will call the physbcs routines below, + // which calls FillBoundary and fills other domain boundary conditions + // Physical boundaries will be filled below + } + else { - if (cons_only && var_idx != Vars::cons) continue; + MultiFab& mf = *mfs_vel[Vars::cons]; - MultiFab& mf = *mfs_vel[var_idx]; + Vector fmf = {&mf,&mf}; + Vector cmf = {&vars_old[lev-1][Vars::cons], &vars_new[lev-1][Vars::cons]}; + Vector ctime = {t_old[lev-1], t_new[lev-1]}; + Vector ftime = {time,time}; - IntVect ngvect; - int icomp, ncomp; - if (var_idx == Vars::cons) - { - bccomp = icomp_cons; - mapper = &cell_cons_interp; - ngvect = IntVect(ng_cons,ng_cons,ng_cons); - icomp = icomp_cons; - ncomp = ncomp_cons; - } - else if (var_idx == IntVars::xmom) - { - bccomp = BCVars::xvel_bc; - mapper = &face_cons_linear_interp; - ngvect = IntVect(ng_vel,ng_vel,ng_vel); - icomp = 0; - ncomp = 1; - } - else if (var_idx == IntVars::ymom) - { - bccomp = BCVars::yvel_bc; - mapper = &face_cons_linear_interp; - ngvect = IntVect(ng_vel,ng_vel,ng_vel); - icomp = 0; - ncomp = 1; - } - else if (var_idx == IntVars::zmom) + // Impose physical bc's on coarse data (note time and 0 are not used) + (*physbcs_cons[lev-1])(vars_old[lev-1][Vars::cons],0,ncomp_cons,IntVect{ng_cons},time,BCVars::cons_bc); + (*physbcs_cons[lev-1])(vars_new[lev-1][Vars::cons],0,ncomp_cons,IntVect{ng_cons},time,BCVars::cons_bc); + + // Call FillPatchTwoLevels which ASSUMES that all ghost cells have already been filled + mapper = &cell_cons_interp; + FillPatchTwoLevels(mf, IntVect{ng_cons}, IntVect(0,0,0), + time, cmf, ctime, fmf, ftime, + 0, 0, ncomp_cons, geom[lev-1], geom[lev], + refRatio(lev-1), mapper, domain_bcs_type, + icomp_cons); + + // ***************************************************************************************** + + if (!cons_only) { - bccomp = BCVars::zvel_bc; mapper = &face_cons_linear_interp; - ngvect = IntVect(ng_vel,ng_vel,ng_vel); - icomp = 0; - ncomp = 1; - } - if (lev == 0) - { - // This fills fine-fine ghost values of cons and VELOCITY (not momentum) - mf.FillBoundary(icomp,ncomp,ngvect,geom[lev].periodicity()); - } - else - { // // NOTE: All interpolation here happens on velocities not momenta; // note we only do the interpolation and FillBoundary here, @@ -347,83 +343,66 @@ ERF::FillIntermediatePatch (int lev, Real time, // NOTE: This will only fill velocity from coarse grid *outside* the fine grids // unlike the FillSet calls above which filled momenta on the coarse/fine bdy // - Vector fmf = {&mf,&mf}; - Vector cmf = {&vars_old[lev-1][var_idx], &vars_new[lev-1][var_idx]}; - Vector ctime = {t_old[lev-1], t_new[lev-1]}; - Vector ftime = {time,time}; - - if (var_idx == Vars::cons) { - // Impose physical bc's on coarse data (note time and 0 are not used) - (*physbcs_cons[lev-1])(vars_old[lev-1][Vars::cons],0,ncomp,ngvect,time,BCVars::cons_bc); - (*physbcs_cons[lev-1])(vars_new[lev-1][Vars::cons],0,ncomp,ngvect,time,BCVars::cons_bc); - - // Call FillPatchTwoLevels which ASSUMES that all ghost cells have already been filled - FillPatchTwoLevels(mf, ngvect, IntVect(0,0,0), - time, cmf, ctime, fmf, ftime, - 0, 0, ncomp, geom[lev-1], geom[lev], - refRatio(lev-1), mapper, domain_bcs_type, - bccomp); - - // Impose physical bc's on fine data - (*physbcs_cons[lev])(mf,0,ncomp,ngvect,time,BCVars::cons_bc); - - } else if (var_idx == Vars::xvel) { - - // Impose physical bc's on coarse data (note time and 0 are not used) - (*physbcs_u[lev-1])(vars_old[lev-1][Vars::xvel],0,1,ngvect,time,BCVars::xvel_bc); - (*physbcs_u[lev-1])(vars_new[lev-1][Vars::xvel],0,1,ngvect,time,BCVars::xvel_bc); - - // Call FillPatchTwoLevels which ASSUMES that all ghost cells have already been filled - FillPatchTwoLevels(mf, ngvect, IntVect(0,0,0), - time, cmf, ctime, fmf, ftime, - 0, 0, ncomp, geom[lev-1], geom[lev], - refRatio(lev-1), mapper, domain_bcs_type, - bccomp); - - // Impose physical bc's on fine data - (*physbcs_u[lev])(mf,0,1,ngvect,time,BCVars::xvel_bc); - - } else if (var_idx == Vars::yvel) { - - // Impose physical bc's on coarse data (note time and 0 are not used) - (*physbcs_v[lev-1])(vars_old[lev-1][Vars::yvel],0,1,ngvect,time,BCVars::yvel_bc); - (*physbcs_v[lev-1])(vars_new[lev-1][Vars::yvel],0,1,ngvect,time,BCVars::yvel_bc); - - // Call FillPatchTwoLevels which ASSUMES that all ghost cells have already been filled - FillPatchTwoLevels(mf, ngvect, IntVect(0,0,0), - time, cmf, ctime, fmf, ftime, - 0, 0, 1, geom[lev-1], geom[lev], - refRatio(lev-1), mapper, domain_bcs_type, - bccomp); - - // Impose physical bc's on fine data - (*physbcs_v[lev])(mf,0,1,ngvect,time,BCVars::yvel_bc); - - } else if (var_idx == Vars::zvel) { - - // Impose physical bc's on coarse data (note time and 0 are not used) - (*physbcs_w[lev-1])(vars_old[lev-1][Vars::zvel], - vars_old[lev-1][Vars::xvel], - vars_old[lev-1][Vars::yvel], - ngvect,time,BCVars::zvel_bc); - (*physbcs_w[lev-1])(vars_new[lev-1][Vars::zvel], - vars_new[lev-1][Vars::xvel], - vars_new[lev-1][Vars::yvel], - ngvect,time,BCVars::zvel_bc); - - // Call FillPatchTwoLevels which ASSUMES that all ghost cells have already been filled - FillPatchTwoLevels(mf, ngvect, IntVect(0,0,0), - time, cmf, ctime, fmf, ftime, - 0, 0, 1, geom[lev-1], geom[lev], - refRatio(lev-1), mapper, domain_bcs_type, - bccomp); - - // Impose physical bc's on fine data - (*physbcs_w[lev])(*mfs_vel[Vars::zvel],*mfs_vel[Vars::xvel],*mfs_vel[Vars::yvel], - ngvect,time,BCVars::zvel_bc); - } - } // lev > 0 - } // var_idx + + MultiFab& mfu = *mfs_vel[Vars::xvel]; + + fmf = {&mfu,&mfu}; + cmf = {&vars_old[lev-1][Vars::xvel], &vars_new[lev-1][Vars::xvel]}; + + // Impose physical bc's on coarse data (note time and 0 are not used) + (*physbcs_u[lev-1])(vars_old[lev-1][Vars::xvel],0,1,IntVect{ng_vel},time,BCVars::xvel_bc); + (*physbcs_u[lev-1])(vars_new[lev-1][Vars::xvel],0,1,IntVect{ng_vel},time,BCVars::xvel_bc); + + // Call FillPatchTwoLevels which ASSUMES that all ghost cells have already been filled + FillPatchTwoLevels(mfu, IntVect{ng_vel}, IntVect(0,0,0), + time, cmf, ctime, fmf, ftime, + 0, 0, ncomp_cons, geom[lev-1], geom[lev], + refRatio(lev-1), mapper, domain_bcs_type, + BCVars::xvel_bc); + + // ***************************************************************************************** + + MultiFab& mfv = *mfs_vel[Vars::yvel]; + + fmf = {&mfv,&mfv}; + cmf = {&vars_old[lev-1][Vars::yvel], &vars_new[lev-1][Vars::yvel]}; + + // Impose physical bc's on coarse data (note time and 0 are not used) + (*physbcs_v[lev-1])(vars_old[lev-1][Vars::yvel],0,1,IntVect{ng_vel},time,BCVars::yvel_bc); + (*physbcs_v[lev-1])(vars_new[lev-1][Vars::yvel],0,1,IntVect{ng_vel},time,BCVars::yvel_bc); + + // Call FillPatchTwoLevels which ASSUMES that all ghost cells have already been filled + FillPatchTwoLevels(mfv, IntVect{ng_vel}, IntVect(0,0,0), + time, cmf, ctime, fmf, ftime, + 0, 0, 1, geom[lev-1], geom[lev], + refRatio(lev-1), mapper, domain_bcs_type, + BCVars::yvel_bc); + + // ***************************************************************************************** + + MultiFab& mfw = *mfs_vel[Vars::zvel]; + + fmf = {&mfw,&mfw}; + cmf = {&vars_old[lev-1][Vars::zvel], &vars_new[lev-1][Vars::zvel]}; + + // Impose physical bc's on coarse data (note time and 0 are not used) + (*physbcs_w[lev-1])(vars_old[lev-1][Vars::zvel], + vars_old[lev-1][Vars::xvel], + vars_old[lev-1][Vars::yvel], + IntVect{ng_vel},time,BCVars::zvel_bc); + (*physbcs_w[lev-1])(vars_new[lev-1][Vars::zvel], + vars_new[lev-1][Vars::xvel], + vars_new[lev-1][Vars::yvel], + IntVect{ng_vel},time,BCVars::zvel_bc); + + // Call FillPatchTwoLevels which ASSUMES that all ghost cells have already been filled + FillPatchTwoLevels(mfw, IntVect{ng_vel}, IntVect(0,0,0), + time, cmf, ctime, fmf, ftime, + 0, 0, 1, geom[lev-1], geom[lev], + refRatio(lev-1), mapper, domain_bcs_type, + BCVars::zvel_bc); + } // !cons_only + } // lev > 0 // *************************************************************************** // Physical bc's at domain boundary From 511b06d037fd87822f2f1db04d56375f92174fe0 Mon Sep 17 00:00:00 2001 From: Mahesh Natarajan Date: Wed, 16 Oct 2024 09:46:18 -0700 Subject: [PATCH 11/35] Correcting link error for docs (#1882) Co-authored-by: Mahesh Natarajan Co-authored-by: Ann Almgren --- Docs/sphinx_doc/theory/WindFarmModels.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Docs/sphinx_doc/theory/WindFarmModels.rst b/Docs/sphinx_doc/theory/WindFarmModels.rst index d412c25d4..5fc8f25fa 100644 --- a/Docs/sphinx_doc/theory/WindFarmModels.rst +++ b/Docs/sphinx_doc/theory/WindFarmModels.rst @@ -311,7 +311,7 @@ An iterative procedure is needed to compute the source terms, and is as follows: Different views of the GAD showing the forces and angles involved: Blade cross section showing the normal (:math:`V_n`) and tangential (:math:`V_t`) components of velocity with the normal (:math:`a_n`) and tangential (:math:`a_t`) induction factors, relative wind velocity :math:`V_r`, blade twist angle :math:`\xi`, angle of relative wind :math:`\psi`, blade pitch angle :math:`\phi`, lift (:math:`L`) and drag (:math:`D`) forces, and normal (:math:`F_n`) and tangential (:math:`F_t`) forces; top view showing the flow direction and inclination angle :math:`\Phi`; and front view showing the actuator disk rotating clockwise. -.. _`Mirocha et. al. 2014`: https://doi.org/10.1063/1.4861061 +.. _`Mirocha et. al. 2014`: https://n2t.org/ark:/85065/d7ww7jmh .. _`Small Wind Turbines`: https://doi.org/10.1007/978-1-84996-175-2 .. _`turbine specifications`: https://github.com/NREL/openfast-turbine-models/blob/main/IEA-scaled/NREL-2.8-127/NREL-2.82-127_performance.csv .. _`details of the blade geometry`: https://github.com/NREL/openfast-turbine-models/blob/main/IEA-scaled/NREL-2.8-127/20_monolithic_opt2/OpenFAST/NREL-2p8-127_AeroDyn15_blade.dat From 6aaf0c5acf9989b57d2c89269ae03867e0f72c4b Mon Sep 17 00:00:00 2001 From: Ann Almgren Date: Wed, 16 Oct 2024 10:38:03 -0700 Subject: [PATCH 12/35] fix for real_bcs, remove some more fb calls (#1885) * fix for real_bcs, remove some more fb calls * try different https --- Docs/sphinx_doc/theory/WindFarmModels.rst | 2 +- .../ERF_BoundaryConditions_realbdy.cpp | 2 + Source/BoundaryConditions/ERF_FillPatch.cpp | 66 +++++++++---------- Source/BoundaryConditions/ERF_PhysBCFunct.H | 12 ++-- Source/BoundaryConditions/ERF_PhysBCFunct.cpp | 27 +++++--- 5 files changed, 60 insertions(+), 49 deletions(-) diff --git a/Docs/sphinx_doc/theory/WindFarmModels.rst b/Docs/sphinx_doc/theory/WindFarmModels.rst index 5fc8f25fa..3fff9f6dd 100644 --- a/Docs/sphinx_doc/theory/WindFarmModels.rst +++ b/Docs/sphinx_doc/theory/WindFarmModels.rst @@ -311,7 +311,7 @@ An iterative procedure is needed to compute the source terms, and is as follows: Different views of the GAD showing the forces and angles involved: Blade cross section showing the normal (:math:`V_n`) and tangential (:math:`V_t`) components of velocity with the normal (:math:`a_n`) and tangential (:math:`a_t`) induction factors, relative wind velocity :math:`V_r`, blade twist angle :math:`\xi`, angle of relative wind :math:`\psi`, blade pitch angle :math:`\phi`, lift (:math:`L`) and drag (:math:`D`) forces, and normal (:math:`F_n`) and tangential (:math:`F_t`) forces; top view showing the flow direction and inclination angle :math:`\Phi`; and front view showing the actuator disk rotating clockwise. -.. _`Mirocha et. al. 2014`: https://n2t.org/ark:/85065/d7ww7jmh +.. _`Mirocha et. al. 2014`: https://opensky.ucar.edu/islandora/object/articles:13295 .. _`Small Wind Turbines`: https://doi.org/10.1007/978-1-84996-175-2 .. _`turbine specifications`: https://github.com/NREL/openfast-turbine-models/blob/main/IEA-scaled/NREL-2.8-127/NREL-2.82-127_performance.csv .. _`details of the blade geometry`: https://github.com/NREL/openfast-turbine-models/blob/main/IEA-scaled/NREL-2.8-127/20_monolithic_opt2/OpenFAST/NREL-2p8-127_AeroDyn15_blade.dat diff --git a/Source/BoundaryConditions/ERF_BoundaryConditions_realbdy.cpp b/Source/BoundaryConditions/ERF_BoundaryConditions_realbdy.cpp index 289349d90..5d6be8b7d 100644 --- a/Source/BoundaryConditions/ERF_BoundaryConditions_realbdy.cpp +++ b/Source/BoundaryConditions/ERF_BoundaryConditions_realbdy.cpp @@ -67,6 +67,8 @@ ERF::fill_from_realbdy (const Vector& mfs, { MultiFab& mf = *mfs[var_idx]; + mf.FillBoundary(geom[lev].periodicity()); + // // Note that "domain" is mapped onto the type of box the data is in // diff --git a/Source/BoundaryConditions/ERF_FillPatch.cpp b/Source/BoundaryConditions/ERF_FillPatch.cpp index 4761a43c3..d8e86b166 100644 --- a/Source/BoundaryConditions/ERF_FillPatch.cpp +++ b/Source/BoundaryConditions/ERF_FillPatch.cpp @@ -111,8 +111,7 @@ ERF::FillPatch (int lev, Real time, // Impose physical bc's on coarse data (note time and 0 are not used) // Note that we call FillBoundary inside the physbcs call // We should not need to call this on old data since that would have been filled before the timestep started - // (*physbcs_cons[lev-1])(vars_old[lev-1][Vars::cons],0,mf_c.nComp(),ngvect_cons,time,BCVars::cons_bc); - (*physbcs_cons[lev-1])(vars_new[lev-1][Vars::cons],0,mf_c.nComp(),ngvect_cons,time,BCVars::cons_bc); + (*physbcs_cons[lev-1])(vars_new[lev-1][Vars::cons],0,mf_c.nComp(),ngvect_cons,time,BCVars::cons_bc,true); // Call FillPatchTwoLevels which ASSUMES that all ghost cells have already been filled FillPatchTwoLevels(mf_c, ngvect_cons, IntVect(0,0,0), @@ -136,8 +135,7 @@ ERF::FillPatch (int lev, Real time, // Impose physical bc's on coarse data (note time and 0 are not used) // Note that we call FillBoundary inside the physbcs call // We should not need to call this on old data since that would have been filled before the timestep started - // (*physbcs_u[lev-1])(vars_old[lev-1][Vars::xvel],0,1,ngvect_vels,time,BCVars::xvel_bc); - (*physbcs_u[lev-1])(vars_new[lev-1][Vars::xvel],0,1,ngvect_vels,time,BCVars::xvel_bc); + (*physbcs_u[lev-1])(vars_new[lev-1][Vars::xvel],0,1,ngvect_vels,time,BCVars::xvel_bc,true); fmf = {&vars_old[lev ][Vars::xvel], &vars_new[lev ][Vars::xvel]}; cmf = {&vars_old[lev-1][Vars::xvel], &vars_new[lev-1][Vars::xvel]}; @@ -156,8 +154,7 @@ ERF::FillPatch (int lev, Real time, // Impose physical bc's on coarse data (note time and 0 are not used) // Note that we call FillBoundary inside the physbcs call // We should not need to call this on old data since that would have been filled before the timestep started - // (*physbcs_v[lev-1])(vars_old[lev-1][Vars::yvel],0,1,ngvect_vels,time,BCVars::yvel_bc); - (*physbcs_v[lev-1])(vars_new[lev-1][Vars::yvel],0,1,ngvect_vels,time,BCVars::yvel_bc); + (*physbcs_v[lev-1])(vars_new[lev-1][Vars::yvel],0,1,ngvect_vels,time,BCVars::yvel_bc,true); fmf = {&vars_old[lev ][Vars::yvel], &vars_new[lev ][Vars::yvel]}; cmf = {&vars_old[lev-1][Vars::yvel], &vars_new[lev-1][Vars::yvel]}; @@ -176,14 +173,10 @@ ERF::FillPatch (int lev, Real time, // Impose physical bc's on coarse data (note time and 0 are not used) // Note that we call FillBoundary inside the physbcs call // We should not need to call this on old data since that would have been filled before the timestep started - // (*physbcs_w[lev-1])(vars_old[lev-1][Vars::zvel], - // vars_old[lev-1][Vars::xvel], - // vars_old[lev-1][Vars::yvel], - // ngvect_vels,time,BCVars::zvel_bc); (*physbcs_w[lev-1])(vars_new[lev-1][Vars::zvel], vars_new[lev-1][Vars::xvel], vars_new[lev-1][Vars::yvel], - ngvect_vels,time,BCVars::zvel_bc); + ngvect_vels,time,BCVars::zvel_bc,true); fmf = {&vars_old[lev ][Vars::zvel], &vars_new[lev ][Vars::zvel]}; cmf = {&vars_old[lev-1][Vars::zvel], &vars_new[lev-1][Vars::zvel]}; @@ -203,10 +196,13 @@ ERF::FillPatch (int lev, Real time, int icomp_cons = 0; int ncomp_cons = mfs_vel[Vars::cons]->nComp(); + bool do_fb = true; + #ifdef ERF_USE_NETCDF // We call this here because it is an ERF routine if (use_real_bcs && (lev==0)) { fill_from_realbdy(mfs_vel,time,cons_only,icomp_cons,ncomp_cons,ngvect_cons,ngvect_vels); + do_fb = false; } #endif @@ -214,12 +210,12 @@ ERF::FillPatch (int lev, Real time, // We call these even if init_type == real because these will fill the vertical bcs // Note that we call FillBoundary inside the physbcs call - (*physbcs_cons[lev])(*mfs_vel[Vars::cons],icomp_cons,ncomp_cons,ngvect_cons,time,BCVars::cons_bc); + (*physbcs_cons[lev])(*mfs_vel[Vars::cons],icomp_cons,ncomp_cons,ngvect_cons,time,BCVars::cons_bc, do_fb); if (!cons_only) { - (*physbcs_u[lev])(*mfs_vel[Vars::xvel],0,1,ngvect_vels,time,BCVars::xvel_bc); - (*physbcs_v[lev])(*mfs_vel[Vars::yvel],0,1,ngvect_vels,time,BCVars::yvel_bc); + (*physbcs_u[lev])(*mfs_vel[Vars::xvel],0,1,ngvect_vels,time,BCVars::xvel_bc, do_fb); + (*physbcs_v[lev])(*mfs_vel[Vars::yvel],0,1,ngvect_vels,time,BCVars::yvel_bc, do_fb); (*physbcs_w[lev])(*mfs_vel[Vars::zvel],*mfs_vel[Vars::xvel],*mfs_vel[Vars::yvel], - ngvect_vels,time,BCVars::zvel_bc); + ngvect_vels,time,BCVars::zvel_bc, do_fb); } } @@ -318,8 +314,8 @@ ERF::FillIntermediatePatch (int lev, Real time, Vector ftime = {time,time}; // Impose physical bc's on coarse data (note time and 0 are not used) - (*physbcs_cons[lev-1])(vars_old[lev-1][Vars::cons],0,ncomp_cons,IntVect{ng_cons},time,BCVars::cons_bc); - (*physbcs_cons[lev-1])(vars_new[lev-1][Vars::cons],0,ncomp_cons,IntVect{ng_cons},time,BCVars::cons_bc); + (*physbcs_cons[lev-1])(vars_old[lev-1][Vars::cons],0,ncomp_cons,IntVect{ng_cons},time,BCVars::cons_bc,true); + (*physbcs_cons[lev-1])(vars_new[lev-1][Vars::cons],0,ncomp_cons,IntVect{ng_cons},time,BCVars::cons_bc,true); // Call FillPatchTwoLevels which ASSUMES that all ghost cells have already been filled mapper = &cell_cons_interp; @@ -350,8 +346,8 @@ ERF::FillIntermediatePatch (int lev, Real time, cmf = {&vars_old[lev-1][Vars::xvel], &vars_new[lev-1][Vars::xvel]}; // Impose physical bc's on coarse data (note time and 0 are not used) - (*physbcs_u[lev-1])(vars_old[lev-1][Vars::xvel],0,1,IntVect{ng_vel},time,BCVars::xvel_bc); - (*physbcs_u[lev-1])(vars_new[lev-1][Vars::xvel],0,1,IntVect{ng_vel},time,BCVars::xvel_bc); + (*physbcs_u[lev-1])(vars_old[lev-1][Vars::xvel],0,1,IntVect{ng_vel},time,BCVars::xvel_bc,true); + (*physbcs_u[lev-1])(vars_new[lev-1][Vars::xvel],0,1,IntVect{ng_vel},time,BCVars::xvel_bc,true); // Call FillPatchTwoLevels which ASSUMES that all ghost cells have already been filled FillPatchTwoLevels(mfu, IntVect{ng_vel}, IntVect(0,0,0), @@ -368,8 +364,8 @@ ERF::FillIntermediatePatch (int lev, Real time, cmf = {&vars_old[lev-1][Vars::yvel], &vars_new[lev-1][Vars::yvel]}; // Impose physical bc's on coarse data (note time and 0 are not used) - (*physbcs_v[lev-1])(vars_old[lev-1][Vars::yvel],0,1,IntVect{ng_vel},time,BCVars::yvel_bc); - (*physbcs_v[lev-1])(vars_new[lev-1][Vars::yvel],0,1,IntVect{ng_vel},time,BCVars::yvel_bc); + (*physbcs_v[lev-1])(vars_old[lev-1][Vars::yvel],0,1,IntVect{ng_vel},time,BCVars::yvel_bc,true); + (*physbcs_v[lev-1])(vars_new[lev-1][Vars::yvel],0,1,IntVect{ng_vel},time,BCVars::yvel_bc,true); // Call FillPatchTwoLevels which ASSUMES that all ghost cells have already been filled FillPatchTwoLevels(mfv, IntVect{ng_vel}, IntVect(0,0,0), @@ -389,11 +385,11 @@ ERF::FillIntermediatePatch (int lev, Real time, (*physbcs_w[lev-1])(vars_old[lev-1][Vars::zvel], vars_old[lev-1][Vars::xvel], vars_old[lev-1][Vars::yvel], - IntVect{ng_vel},time,BCVars::zvel_bc); + IntVect{ng_vel},time,BCVars::zvel_bc,true); (*physbcs_w[lev-1])(vars_new[lev-1][Vars::zvel], vars_new[lev-1][Vars::xvel], vars_new[lev-1][Vars::yvel], - IntVect{ng_vel},time,BCVars::zvel_bc); + IntVect{ng_vel},time,BCVars::zvel_bc,true); // Call FillPatchTwoLevels which ASSUMES that all ghost cells have already been filled FillPatchTwoLevels(mfw, IntVect{ng_vel}, IntVect(0,0,0), @@ -410,22 +406,25 @@ ERF::FillIntermediatePatch (int lev, Real time, IntVect ngvect_cons = IntVect(ng_cons,ng_cons,ng_cons); IntVect ngvect_vels = IntVect(ng_vel ,ng_vel ,ng_vel); + bool do_fb = true; + #ifdef ERF_USE_NETCDF // We call this here because it is an ERF routine if (use_real_bcs && (lev==0)) { fill_from_realbdy(mfs_vel,time,cons_only,icomp_cons,ncomp_cons,ngvect_cons, ngvect_vels); + do_fb = false; } #endif if (m_r2d) fill_from_bndryregs(mfs_vel,time); // We call this even if init_type == real because this routine will fill the vertical bcs - (*physbcs_cons[lev])(*mfs_vel[Vars::cons],icomp_cons,ncomp_cons,ngvect_cons,time,BCVars::cons_bc); + (*physbcs_cons[lev])(*mfs_vel[Vars::cons],icomp_cons,ncomp_cons,ngvect_cons,time,BCVars::cons_bc, do_fb); if (!cons_only) { - (*physbcs_u[lev])(*mfs_vel[Vars::xvel],0,1,ngvect_vels,time,BCVars::xvel_bc); - (*physbcs_v[lev])(*mfs_vel[Vars::yvel],0,1,ngvect_vels,time,BCVars::yvel_bc); + (*physbcs_u[lev])(*mfs_vel[Vars::xvel],0,1,ngvect_vels,time,BCVars::xvel_bc, do_fb); + (*physbcs_v[lev])(*mfs_vel[Vars::yvel],0,1,ngvect_vels,time,BCVars::yvel_bc, do_fb); (*physbcs_w[lev])(*mfs_vel[Vars::zvel],*mfs_vel[Vars::xvel],*mfs_vel[Vars::yvel], - ngvect_vels,time,BCVars::zvel_bc); + ngvect_vels,time,BCVars::zvel_bc, do_fb); } // *************************************************************************** @@ -579,21 +578,16 @@ ERF::FillCoarsePatch (int lev, Real time) domain_bcs_type); } - vars_new[lev][Vars::cons].FillBoundary(geom[lev].periodicity()); - vars_new[lev][Vars::xvel].FillBoundary(geom[lev].periodicity()); - vars_new[lev][Vars::yvel].FillBoundary(geom[lev].periodicity()); - vars_new[lev][Vars::zvel].FillBoundary(geom[lev].periodicity()); - // *************************************************************************** // Physical bc's at domain boundary // *************************************************************************** IntVect ngvect_vels = vars_new[lev][Vars::xvel].nGrowVect(); - (*physbcs_cons[lev])(vars_new[lev][Vars::cons],0,ncomp_cons,ngvect_cons,time,BCVars::cons_bc); - ( *physbcs_u[lev])(vars_new[lev][Vars::xvel],0,1 ,ngvect_vels,time,BCVars::xvel_bc); - ( *physbcs_v[lev])(vars_new[lev][Vars::yvel],0,1 ,ngvect_vels,time,BCVars::yvel_bc); + (*physbcs_cons[lev])(vars_new[lev][Vars::cons],0,ncomp_cons,ngvect_cons,time,BCVars::cons_bc,true); + ( *physbcs_u[lev])(vars_new[lev][Vars::xvel],0,1 ,ngvect_vels,time,BCVars::xvel_bc,true); + ( *physbcs_v[lev])(vars_new[lev][Vars::yvel],0,1 ,ngvect_vels,time,BCVars::yvel_bc,true); ( *physbcs_w[lev])(vars_new[lev][Vars::zvel],vars_new[lev][Vars::xvel],vars_new[lev][Vars::yvel], - ngvect_vels,time,BCVars::zvel_bc); + ngvect_vels,time,BCVars::zvel_bc,true); // *************************************************************************** // Since lev > 0 here we don't worry about m_r2d or wrfbdy data diff --git a/Source/BoundaryConditions/ERF_PhysBCFunct.H b/Source/BoundaryConditions/ERF_PhysBCFunct.H index ff09ff93a..d74a9834e 100644 --- a/Source/BoundaryConditions/ERF_PhysBCFunct.H +++ b/Source/BoundaryConditions/ERF_PhysBCFunct.H @@ -52,7 +52,8 @@ public: * @param[in] use_real_bcs if true then we fill boundary conditions for interior locations */ void operator() (amrex::MultiFab& mf, int icomp, int ncomp, - amrex::IntVect const& nghost, const amrex::Real time, int bccomp_cons); + amrex::IntVect const& nghost, const amrex::Real time, int bccomp_cons, + bool do_fb); void impose_lateral_cons_bcs (const amrex::Array4& dest_arr, const amrex::Box& bx, const amrex::Box& domain, @@ -106,7 +107,8 @@ public: * @param[in] use_real_bcs if true then we fill boundary conditions for interior locations */ void operator() (amrex::MultiFab& mf, int icomp, int ncomp, - amrex::IntVect const& nghost, const amrex::Real time, int bccomp); + amrex::IntVect const& nghost, const amrex::Real time, int bccomp, + bool do_fb); void impose_lateral_xvel_bcs (const amrex::Array4& dest_arr, const amrex::Box& bx, const amrex::Box& domain, @@ -164,7 +166,8 @@ public: * @param[in] use_real_bcs if true then we fill boundary conditions for interior locations */ void operator() (amrex::MultiFab& mf, int icomp, int ncomp, - amrex::IntVect const& nghost, const amrex::Real time, int bccomp); + amrex::IntVect const& nghost, const amrex::Real time, int bccomp, + bool do_fb); void impose_lateral_yvel_bcs (const amrex::Array4& dest_arr, const amrex::Box& bx, const amrex::Box& domain, @@ -222,7 +225,8 @@ public: * @param[in] use_real_bcs if true then we fill boundary conditions for interior locations */ void operator() (amrex::MultiFab& mf, amrex::MultiFab& xvel, amrex::MultiFab& yvel, - amrex::IntVect const& nghost, const amrex::Real time, int bccomp); + amrex::IntVect const& nghost, const amrex::Real time, int bccomp, + bool do_fb); void impose_lateral_zvel_bcs (const amrex::Array4& dest_arr, const amrex::Array4& xvel_arr, diff --git a/Source/BoundaryConditions/ERF_PhysBCFunct.cpp b/Source/BoundaryConditions/ERF_PhysBCFunct.cpp index fcfaa91b8..5ab47fb88 100644 --- a/Source/BoundaryConditions/ERF_PhysBCFunct.cpp +++ b/Source/BoundaryConditions/ERF_PhysBCFunct.cpp @@ -14,7 +14,8 @@ using namespace amrex; */ void ERFPhysBCFunct_cons::operator() (MultiFab& mf, int icomp, int ncomp, - IntVect const& nghost, const Real /*time*/, int /*bccomp*/) + IntVect const& nghost, const Real /*time*/, int /*bccomp*/, + bool do_fb) { BL_PROFILE("ERFPhysBCFunct_cons::()"); @@ -50,7 +51,9 @@ void ERFPhysBCFunct_cons::operator() (MultiFab& mf, int icomp, int ncomp, // We fill all of the interior and periodic ghost cells first, so we can fill // those directly inside the lateral and vertical calls. // - mf.FillBoundary(m_geom.periodicity()); + if (do_fb) { + mf.FillBoundary(m_geom.periodicity()); + } #ifdef AMREX_USE_OMP #pragma omp parallel if (Gpu::notInLaunchRegion()) @@ -96,7 +99,8 @@ void ERFPhysBCFunct_cons::operator() (MultiFab& mf, int icomp, int ncomp, } // operator() void ERFPhysBCFunct_u::operator() (MultiFab& mf, int /*icomp*/, int /*ncomp*/, - IntVect const& nghost, const Real time, int bccomp) + IntVect const& nghost, const Real time, int bccomp, + bool do_fb) { BL_PROFILE("ERFPhysBCFunct_u::()"); @@ -130,7 +134,9 @@ void ERFPhysBCFunct_u::operator() (MultiFab& mf, int /*icomp*/, int /*ncomp*/, // We fill all of the interior and periodic ghost cells first, so we can fill // those directly inside the lateral and vertical calls. // - mf.FillBoundary(m_geom.periodicity()); + if (do_fb) { + mf.FillBoundary(m_geom.periodicity()); + } #ifdef AMREX_USE_OMP #pragma omp parallel if (Gpu::notInLaunchRegion()) @@ -179,7 +185,8 @@ void ERFPhysBCFunct_u::operator() (MultiFab& mf, int /*icomp*/, int /*ncomp*/, } // operator() void ERFPhysBCFunct_v::operator() (MultiFab& mf, int /*icomp*/, int /*ncomp*/, - IntVect const& nghost, const Real /*time*/, int bccomp) + IntVect const& nghost, const Real /*time*/, int bccomp, + bool do_fb) { BL_PROFILE("ERFPhysBCFunct_v::()"); @@ -213,7 +220,9 @@ void ERFPhysBCFunct_v::operator() (MultiFab& mf, int /*icomp*/, int /*ncomp*/, // We fill all of the interior and periodic ghost cells first, so we can fill // those directly inside the lateral and vertical calls. // - mf.FillBoundary(m_geom.periodicity()); + if (do_fb) { + mf.FillBoundary(m_geom.periodicity()); + } #ifdef AMREX_USE_OMP #pragma omp parallel if (Gpu::notInLaunchRegion()) @@ -261,7 +270,7 @@ void ERFPhysBCFunct_v::operator() (MultiFab& mf, int /*icomp*/, int /*ncomp*/, void ERFPhysBCFunct_w::operator() (MultiFab& mf, MultiFab& xvel, MultiFab& yvel, IntVect const& nghost, const Real /*time*/, - const int bccomp_w) + const int bccomp_w, bool do_fb) { BL_PROFILE("ERFPhysBCFunct_w::()"); @@ -303,7 +312,9 @@ void ERFPhysBCFunct_w::operator() (MultiFab& mf, MultiFab& xvel, MultiFab& yvel, // We fill all of the interior and periodic ghost cells first, so we can fill // those directly inside the lateral and vertical calls. // - mf.FillBoundary(m_geom.periodicity()); + if (do_fb) { + mf.FillBoundary(m_geom.periodicity()); + } #ifdef AMREX_USE_OMP #pragma omp parallel if (Gpu::notInLaunchRegion()) From a547d3df36efcaf173ffbca6696863596a3a227c Mon Sep 17 00:00:00 2001 From: Ann Almgren Date: Wed, 16 Oct 2024 11:52:52 -0700 Subject: [PATCH 13/35] remove old file (#1886) --- CMake/BuildERFExe.cmake | 1 - 1 file changed, 1 deletion(-) diff --git a/CMake/BuildERFExe.cmake b/CMake/BuildERFExe.cmake index e67a27fae..ff8610da5 100644 --- a/CMake/BuildERFExe.cmake +++ b/CMake/BuildERFExe.cmake @@ -27,7 +27,6 @@ function(build_erf_lib erf_lib_name) if(ERF_ENABLE_POISSON_SOLVE) target_sources(${erf_lib_name} PRIVATE - ${SRC_DIR}/TimeIntegration/ERF_slow_rhs_inc.cpp ${SRC_DIR}/Utils/ERF_PoissonSolve.cpp ${SRC_DIR}/Utils/ERF_PoissonSolve_tb.cpp) target_compile_definitions(${erf_lib_name} PUBLIC ERF_USE_POISSON_SOLVE) From e8de2eb5680fa0775e3f40b7b35e47a43973355a Mon Sep 17 00:00:00 2001 From: Ann Almgren Date: Wed, 16 Oct 2024 12:12:29 -0700 Subject: [PATCH 14/35] fix typo (#1887) --- .../DensityCurrent/inputs_crse_outflow | 64 ------------------- .../DensityCurrent/inputs_crse_periodic | 60 ----------------- Source/BoundaryConditions/ERF_FillPatch.cpp | 2 +- 3 files changed, 1 insertion(+), 125 deletions(-) delete mode 100644 Exec/RegTests/DensityCurrent/inputs_crse_outflow delete mode 100644 Exec/RegTests/DensityCurrent/inputs_crse_periodic diff --git a/Exec/RegTests/DensityCurrent/inputs_crse_outflow b/Exec/RegTests/DensityCurrent/inputs_crse_outflow deleted file mode 100644 index d94b3bb2a..000000000 --- a/Exec/RegTests/DensityCurrent/inputs_crse_outflow +++ /dev/null @@ -1,64 +0,0 @@ -# ------------------ INPUTS TO MAIN PROGRAM ------------------- -max_step = 999999 -stop_time = 900.0 - -amrex.fpe_trap_invalid = 1 - -fabarray.mfiter_tile_size = 1024 1024 1024 - -# PROBLEM SIZE & GEOMETRY -geometry.prob_lo = -25600. 0. 0. -geometry.prob_hi = 25600. 400. 6400. - -amr.n_cell = 2048 4 256 # dx=dy=dz=25 m, Straka et al 1993 / Xue et al 2000 -amr.n_cell = 512 4 64 # dx=dy=dz=100 m, Straka et al 1993 / Xue et al 2000 - -# periodic in x to match WRF setup -# - as an alternative, could use symmetry at x=0 and outflow at x=25600 -geometry.is_periodic = 0 1 0 - -xlo.type = "Outflow" -xhi.type = "Outflow" - -zlo.type = "SlipWall" -zhi.type = "SlipWall" - -# TIME STEP CONTROL -erf.fixed_dt = 1.0 # fixed time step [s] -- Straka et al 1993 -erf.fixed_fast_dt = 0.25 # fixed time step [s] -- Straka et al 1993 - -# DIAGNOSTICS & VERBOSITY -erf.sum_interval = 1 # timesteps between computing mass -erf.v = 1 # verbosity in ERF.cpp -amr.v = 1 # verbosity in Amr.cpp - -# REFINEMENT / REGRIDDING -amr.max_level = 0 # maximum level number allowed - -# CHECKPOINT FILES -erf.check_file = chk # root name of checkpoint file -erf.check_int = -57600 # number of timesteps between checkpoints - -# PLOTFILES -erf.plot_file_1 = plt # prefix of plotfile name -erf.plot_int_1 = 1000 # number of timesteps between plotfiles -erf.plot_vars_1 = density x_velocity y_velocity z_velocity pressure theta pres_hse dens_hse pert_pres pert_dens - -# SOLVER CHOICE -erf.use_gravity = true -erf.use_coriolis = false - -erf.les_type = "None" -# -# Diffusion coefficient from Straka, K = 75 m^2/s -# -erf.molec_diff_type = "ConstantAlpha" # where alpha == "K" in Straka et al 1993 -erf.rho0_trans = 1.0 # [kg/m^3], used to convert input diffusivities -erf.dynamicViscosity = 75.0 # [kg/(m-s)] ==> alpha = 75.0 m^2/s -erf.alpha_T = 75.0 # [m^2/s] - -erf.c_p = 1004.0 - -# PROBLEM PARAMETERS (optional) -prob.T_0 = 300.0 -prob.U_0 = 0.0 diff --git a/Exec/RegTests/DensityCurrent/inputs_crse_periodic b/Exec/RegTests/DensityCurrent/inputs_crse_periodic deleted file mode 100644 index 776f36d0c..000000000 --- a/Exec/RegTests/DensityCurrent/inputs_crse_periodic +++ /dev/null @@ -1,60 +0,0 @@ -# ------------------ INPUTS TO MAIN PROGRAM ------------------- -max_step = 999999 -stop_time = 900.0 - -amrex.fpe_trap_invalid = 1 - -fabarray.mfiter_tile_size = 1024 1024 1024 - -# PROBLEM SIZE & GEOMETRY -geometry.prob_lo = -25600. 0. 0. -geometry.prob_hi = 25600. 400. 6400. - -amr.n_cell = 2048 4 256 # dx=dy=dz=25 m, Straka et al 1993 / Xue et al 2000 -amr.n_cell = 512 4 64 # dx=dy=dz=100 m, Straka et al 1993 / Xue et al 2000 - -# periodic in x to match WRF setup -# - as an alternative, could use symmetry at x=0 and outflow at x=25600 -geometry.is_periodic = 1 1 0 -zlo.type = "SlipWall" -zhi.type = "SlipWall" - -# TIME STEP CONTROL -erf.fixed_dt = 1.0 # fixed time step [s] -- Straka et al 1993 -erf.fixed_fast_dt = 0.25 # fixed time step [s] -- Straka et al 1993 - -# DIAGNOSTICS & VERBOSITY -erf.sum_interval = 1 # timesteps between computing mass -erf.v = 1 # verbosity in ERF.cpp -amr.v = 1 # verbosity in Amr.cpp - -# REFINEMENT / REGRIDDING -amr.max_level = 0 # maximum level number allowed - -# CHECKPOINT FILES -erf.check_file = chk # root name of checkpoint file -erf.check_int = -57600 # number of timesteps between checkpoints - -# PLOTFILES -erf.plot_file_1 = plt # prefix of plotfile name -erf.plot_int_1 = 1000 # number of timesteps between plotfiles -erf.plot_vars_1 = density x_velocity y_velocity z_velocity pressure theta pres_hse dens_hse pert_pres pert_dens - -# SOLVER CHOICE -erf.use_gravity = true -erf.use_coriolis = false - -erf.les_type = "None" -# -# Diffusion coefficient from Straka, K = 75 m^2/s -# -erf.molec_diff_type = "ConstantAlpha" # where alpha == "K" in Straka et al 1993 -erf.rho0_trans = 1.0 # [kg/m^3], used to convert input diffusivities -erf.dynamicViscosity = 75.0 # [kg/(m-s)] ==> alpha = 75.0 m^2/s -erf.alpha_T = 75.0 # [m^2/s] - -erf.c_p = 1004.0 - -# PROBLEM PARAMETERS (optional) -prob.T_0 = 300.0 -prob.U_0 = 0.0 diff --git a/Source/BoundaryConditions/ERF_FillPatch.cpp b/Source/BoundaryConditions/ERF_FillPatch.cpp index d8e86b166..cce4a2977 100644 --- a/Source/BoundaryConditions/ERF_FillPatch.cpp +++ b/Source/BoundaryConditions/ERF_FillPatch.cpp @@ -352,7 +352,7 @@ ERF::FillIntermediatePatch (int lev, Real time, // Call FillPatchTwoLevels which ASSUMES that all ghost cells have already been filled FillPatchTwoLevels(mfu, IntVect{ng_vel}, IntVect(0,0,0), time, cmf, ctime, fmf, ftime, - 0, 0, ncomp_cons, geom[lev-1], geom[lev], + 0, 0, 1, geom[lev-1], geom[lev], refRatio(lev-1), mapper, domain_bcs_type, BCVars::xvel_bc); From f2ce1bddc3346de619d4a0f7143e44da4f616f42 Mon Sep 17 00:00:00 2001 From: "Aaron M. Lattanzi" <103702284+AMLattanzi@users.noreply.github.com> Date: Wed, 16 Oct 2024 14:03:00 -0700 Subject: [PATCH 15/35] CPU matched benchmark with 4 ranks. (#1888) --- Source/Initialization/ERF_Metgrid_utils.H | 85 -------- .../Initialization/ERF_init_from_metgrid.cpp | 202 ++++++++++++++---- 2 files changed, 163 insertions(+), 124 deletions(-) diff --git a/Source/Initialization/ERF_Metgrid_utils.H b/Source/Initialization/ERF_Metgrid_utils.H index dad42f7c9..b0ed1f4b2 100644 --- a/Source/Initialization/ERF_Metgrid_utils.H +++ b/Source/Initialization/ERF_Metgrid_utils.H @@ -99,91 +99,6 @@ init_base_state_from_metgrid (const bool use_moisture, const amrex::Vector& NC_psfc_fab, amrex::Vector>& fabs_for_bcs); -AMREX_FORCE_INLINE -AMREX_GPU_DEVICE -void -calc_rho_p (const int& kmax, - const int& flag_psfc, - const amrex::Real& psfc, - const amrex::Real& grav, - amrex::Real* Thetad_vec, - amrex::Real* Thetam_vec, - amrex::Real* Q_vec, - amrex::Real* z_vec, - amrex::Real* Rhod_vec, - amrex::Real* Rhom_vec, - amrex::Real* Pd_vec, - amrex::Real* Pm_vec) -{ - const int maxiter = 10; - const amrex::Real tol = 1.0e-10; - - // Calculate or use moist pressure at the surface. - amrex::Real Psurf; - if (flag_psfc == 1) { - Psurf = psfc; - } else { - amrex::Real t_0 = 290.0; // WRF's model_config_rec%base_temp - amrex::Real a = 50.0; // WRF's model_config_rec%base_lapse - Psurf = p_0*exp(-t_0/a+std::pow((std::pow(t_0/a, 2)-2.0*grav*z_vec[0]/(a*R_d)), 0.5)); - } - - // Iterations for the first CC point that is 1/2 dz off the surface - { - amrex::Real half_dz = z_vec[0]; - amrex::Real qvf = 1.0+(R_v/R_d)*Q_vec[0]; - Thetam_vec[0] = Thetad_vec[0]*qvf; - for (int it=0; ittol) HSEutils::Newton_Raphson_hse(tol, R_d/Cp_d, dz, - grav, C, Thetad_vec[k], - Q_vec[k], Q_vec[k], - Pm_vec[k], Rhom_vec[k], F); - } // k - - // integrate from the top back down to get dry pressure and density. - Pd_vec[kmax] = Pm_vec[kmax]; - Rhod_vec[kmax] = (p_0/(R_d*Thetam_vec[kmax]))*std::pow(Pd_vec[kmax]/p_0, iGamma); - for (int k=kmax-1; k>=0; k--) { - amrex::Real dz = z_vec[k+1]-z_vec[k]; - Rhod_vec[k] = Rhod_vec[k+1]; // an initial guess. - for (int it=0; it z_vec_d(kmax+2,0); Real* z_vec = z_vec_d.data(); - Gpu::DeviceVector Thetad_vec_d(kmax+1,0); Real* Thetad_vec = Thetad_vec_d.data(); - Gpu::DeviceVector Thetam_vec_d(kmax+1,0); Real* Thetam_vec = Thetam_vec_d.data(); - Gpu::DeviceVector Rhod_vec_d(kmax+1,0); Real* Rhod_vec = Rhod_vec_d.data(); - Gpu::DeviceVector Rhom_vec_d(kmax+1,0); Real* Rhom_vec = Rhom_vec_d.data(); - Gpu::DeviceVector Pd_vec_d(kmax+1,0); Real* Pd_vec = Pd_vec_d.data(); - Gpu::DeviceVector Pm_vec_d(kmax+1,0); Real* Pm_vec = Pm_vec_d.data(); - Gpu::DeviceVector Q_vec_d(kmax+1,0); Real* Q_vec = Q_vec_d.data(); - // Device vectors for psfc flags Gpu::DeviceVectorflag_psfc_d(flag_psfc.size()); Gpu::copy(Gpu::hostToDevice, flag_psfc.begin(), flag_psfc.end(), flag_psfc_d.begin()); @@ -819,8 +809,8 @@ init_base_state_from_metgrid (const bool use_moisture, // Define the arena to be used for data allocation Arena* Arena_Used = The_Arena(); #ifdef AMREX_USE_GPU - // Make sure this lives on CPU and GPU - Arena_Used = The_Pinned_Arena(); + // Inside MFiter use async arena + Arena_Used = The_Async_Arena(); #endif // Expose for copy to GPU Real grav = CONST_GRAV; @@ -829,6 +819,7 @@ init_base_state_from_metgrid (const bool use_moisture, const Array4& r_hse_arr = r_hse_fab.array(); const Array4& p_hse_arr = p_hse_fab.array(); const Array4& pi_hse_arr = pi_hse_fab.array(); + auto psfc_flag = flag_psfc_vec[0]; // ******************************************************** // calculate dry density and dry pressure @@ -842,20 +833,86 @@ init_base_state_from_metgrid (const bool use_moisture, ParallelFor(valid_bx2d, [=] AMREX_GPU_DEVICE (int i, int j, int) noexcept { - for (int k=0; k<=kmax; k++) { - z_vec[k] = new_z(i,j,k); - Thetad_vec[k] = new_data(i,j,k,RhoTheta_comp); - Q_vec[k] = (use_moisture) ? new_data(i,j,k,RhoQ_comp) : 0.0; + const int maxiter = 10; + const amrex::Real tol = 1.0e-10; + + // Low and Hi column variables + Real psurf; + Real z_lo, z_hi; + Real p_lo, p_hi; + Real qv_lo, qv_hi; + Real rd_lo, rd_hi; + Real thetad_lo, thetad_hi; + + // Calculate or use pressure at the surface. + if (psfc_flag == 1) { + psurf = orig_psfc(i,j,0); + } else { + z_lo = new_z(i,j,0); + Real t_0 = 290.0; // WRF's model_config_rec%base_temp + Real a = 50.0; // WRF's model_config_rec%base_lapse + psurf = p_0*exp(-t_0/a+std::pow((std::pow(t_0/a, 2.)-2.0*grav*z_lo/(a*R_d)), 0.5)); } - z_vec[kmax+1] = new_z(i,j,kmax+1); - calc_rho_p(kmax, flag_psfc_vec[0], orig_psfc(i,j,0), - grav, Thetad_vec, Thetam_vec, Q_vec, z_vec, - Rhod_vec, Rhom_vec, Pd_vec, Pm_vec); + // Iterations for the first CC point that is 1/2 dz off the surface + { + z_lo = new_z(i,j,0); + qv_lo = (use_moisture) ? new_data(i,j,0,RhoQ_comp) : 0.0; + rd_lo = 0.0; // initial guess + thetad_lo = new_data(i,j,0,RhoTheta_comp); + Real half_dz = z_lo; + Real qvf = 1.0+(R_v/R_d)*qv_lo; + Real thetam = thetad_lo*qvf; + for (int it=0; ittol) HSEutils::Newton_Raphson_hse(tol, R_d/Cp_d, dz, + grav, C, thetad_hi, + qv_hi, qv_hi, p_hi, + rd_hi, F); + + // Copy solution to base state + p_hse_arr(i,j,k) = p_hi; + r_hse_arr(i,j,k) = rd_hi; + + // Copy hi to lo + z_lo = z_hi; + p_lo = p_hi; + qv_lo = qv_hi; + rd_lo = rd_hi; + thetad_lo = thetad_hi; } }); @@ -926,10 +983,11 @@ init_base_state_from_metgrid (const bool use_moisture, } int ntimes = NC_psfc_fab.size(); - for (int it=0; it{}; + auto Theta_arr = fabs_for_bcs[itime][MetGridBdyVars::T].array(); + auto Q_arr = (use_moisture ) ? fabs_for_bcs[itime][MetGridBdyVars::QV].array() : Array4{}; auto p_hse_arr = p_hse_bcs_fab.array(); ParallelFor(valid_bx2d, [=] AMREX_GPU_DEVICE (int i, int j, int) noexcept { - for (int k=0; k<=kmax; k++) { - z_vec[k] = new_z(i,j,k); - Thetad_vec[k] = Theta_arr(i,j,k); - Q_vec[k] = (use_moisture) ? Q_arr(i,j,k) : 0.0; + const int maxiter = 10; + const amrex::Real tol = 1.0e-10; + + // Low and Hi column variables + Real psurf; + Real z_lo, z_hi; + Real p_lo, p_hi; + Real qv_lo, qv_hi; + Real rd_lo, rd_hi; + Real thetad_lo, thetad_hi; + + // Calculate or use pressure at the surface. + if (psfc_flag == 1) { + psurf = orig_psfc(i,j,0); + } else { + z_lo = new_z(i,j,0); + Real t_0 = 290.0; // WRF's model_config_rec%base_temp + Real a = 50.0; // WRF's model_config_rec%base_lapse + psurf = p_0*exp(-t_0/a+std::pow((std::pow(t_0/a, 2.)-2.0*grav*z_lo/(a*R_d)), 0.5)); + } + + // Iterations for the first CC point that is 1/2 dz off the surface + { + z_lo = new_z(i,j,0); + qv_lo = (use_moisture) ? Q_arr(i,j,0) : 0.0; + rd_lo = 0.0; // initial guess + thetad_lo = Theta_arr(i,j,0); + Real half_dz = z_lo; + Real qvf = 1.0+(R_v/R_d)*qv_lo; + Real thetam = thetad_lo*qvf; + for (int it=0; ittol) HSEutils::Newton_Raphson_hse(tol, R_d/Cp_d, dz, + grav, C, thetad_hi, + qv_hi, qv_hi, p_hi, + rd_hi, F); + + // Copy solution to base state + p_hse_arr(i,j,k) = p_hi; + + // Copy hi to lo + z_lo = z_hi; + p_lo = p_hi; + qv_lo = qv_hi; + rd_lo = rd_hi; + thetad_lo = thetad_hi; + } - for (int k=0; k<=kmax; k++) { - p_hse_arr(i,j,k) = Pm_vec[k]; - } // k }); - } // it + } // itime } From d5448bb976471ac790e8587d8c97fabe32958c53 Mon Sep 17 00:00:00 2001 From: Ann Almgren Date: Wed, 16 Oct 2024 20:05:20 -0700 Subject: [PATCH 16/35] remove deprecated use_native_mri flag (#1890) --- Docs/sphinx_doc/Inputs.rst | 5 ++--- Exec/AWAKEN/inputs_All_EWP | 1 - Exec/AWAKEN/inputs_KingPlains_EWP | 1 - Exec/AWAKEN/inputs_KingPlains_Fitch | 1 - Exec/AWAKEN/inputs_KingPlains_SimpleAD | 1 - Exec/EWP/inputs_1WT_lat_lon | 1 - Exec/EWP/inputs_1WT_x_y | 1 - Exec/EWP/inputs_WindFarm_lat_lon | 1 - Exec/EWP/inputs_WindFarm_x_y | 1 - Exec/Radiation/inputs_radiation | 1 - Exec/RegTests/TaylorGreenVortex/inputs_multilevel | 2 -- Exec/SimpleActuatorDisk/inputs_1WT_lat_lon | 1 - Exec/SimpleActuatorDisk/inputs_1WT_x_y | 1 - Exec/SimpleActuatorDisk/inputs_WindFarm_lat_lon | 1 - Exec/SimpleActuatorDisk/inputs_WindFarm_x_y | 1 - Exec/SquallLine_2D/inputs_ml | 1 - Exec/SquallLine_2D/inputs_moisture_Gabersek | 1 - Exec/SquallLine_2D/inputs_moisture_SAM | 1 - Exec/SquallLine_2D/inputs_moisture_WRF | 1 - Exec/SuperCell/inputs_moisture | 1 - Exec/SuperCell_3D/inputs_Supercell_3D | 1 - 21 files changed, 2 insertions(+), 24 deletions(-) diff --git a/Docs/sphinx_doc/Inputs.rst b/Docs/sphinx_doc/Inputs.rst index b8f033ab1..791e4d1b9 100644 --- a/Docs/sphinx_doc/Inputs.rst +++ b/Docs/sphinx_doc/Inputs.rst @@ -428,9 +428,8 @@ List of Parameters | | cfl or other | | | | | settings | | | +----------------------------+----------------------+----------------+-------------------+ -| **erf.fixed_fast_dt** | set fast dt | Real > 0 | only relevant | -| | as this value | | if use_native_mri | -| | | | is true | +| **erf.fixed_fast_dt** | set fast dt | Real > 0 | | +| | as this value | | | +----------------------------+----------------------+----------------+-------------------+ | **erf.fixed_mri_dt_ratio** | set fast dt | even int > 0 | only relevant | | | as slow dt / | | if no_substepping | diff --git a/Exec/AWAKEN/inputs_All_EWP b/Exec/AWAKEN/inputs_All_EWP index e5b6f096f..cda4dff42 100644 --- a/Exec/AWAKEN/inputs_All_EWP +++ b/Exec/AWAKEN/inputs_All_EWP @@ -49,7 +49,6 @@ yhi.type = "Outflow" # TIME STEP CONTROL -erf.use_native_mri = 1 erf.fixed_dt = 0.125 # fixed time step depending on grid resolution #erf.fixed_fast_dt = 0.0025 diff --git a/Exec/AWAKEN/inputs_KingPlains_EWP b/Exec/AWAKEN/inputs_KingPlains_EWP index 26ea72b16..653b75e3c 100644 --- a/Exec/AWAKEN/inputs_KingPlains_EWP +++ b/Exec/AWAKEN/inputs_KingPlains_EWP @@ -39,7 +39,6 @@ ylo.type = "Outflow" yhi.type = "Outflow" # TIME STEP CONTROL -erf.use_native_mri = 1 erf.fixed_dt = 0.125 # fixed time step depending on grid resolution #erf.fixed_fast_dt = 0.0025 diff --git a/Exec/AWAKEN/inputs_KingPlains_Fitch b/Exec/AWAKEN/inputs_KingPlains_Fitch index 2e7ae4565..169f2a8d5 100644 --- a/Exec/AWAKEN/inputs_KingPlains_Fitch +++ b/Exec/AWAKEN/inputs_KingPlains_Fitch @@ -39,7 +39,6 @@ ylo.type = "Outflow" yhi.type = "Outflow" # TIME STEP CONTROL -erf.use_native_mri = 1 erf.fixed_dt = 0.125 # fixed time step depending on grid resolution #erf.fixed_fast_dt = 0.0025 diff --git a/Exec/AWAKEN/inputs_KingPlains_SimpleAD b/Exec/AWAKEN/inputs_KingPlains_SimpleAD index 0cccad7aa..9b1822545 100644 --- a/Exec/AWAKEN/inputs_KingPlains_SimpleAD +++ b/Exec/AWAKEN/inputs_KingPlains_SimpleAD @@ -41,7 +41,6 @@ ylo.type = "Outflow" yhi.type = "Outflow" # TIME STEP CONTROL -erf.use_native_mri = 1 erf.fixed_dt = 0.125 # fixed time step depending on grid resolution #erf.fixed_fast_dt = 0.0025 diff --git a/Exec/EWP/inputs_1WT_lat_lon b/Exec/EWP/inputs_1WT_lat_lon index fe77134fb..215618298 100644 --- a/Exec/EWP/inputs_1WT_lat_lon +++ b/Exec/EWP/inputs_1WT_lat_lon @@ -51,7 +51,6 @@ xlo.theta = 300. # TIME STEP CONTROL -erf.use_native_mri = 1 erf.fixed_dt = 3.0 # fixed time step depending on grid resolution #erf.fixed_fast_dt = 0.0025 diff --git a/Exec/EWP/inputs_1WT_x_y b/Exec/EWP/inputs_1WT_x_y index ee14f42cf..e9c1296ef 100644 --- a/Exec/EWP/inputs_1WT_x_y +++ b/Exec/EWP/inputs_1WT_x_y @@ -49,7 +49,6 @@ xlo.theta = 300. # TIME STEP CONTROL -erf.use_native_mri = 1 erf.fixed_dt = 3.0 # fixed time step depending on grid resolution #erf.fixed_fast_dt = 0.0025 diff --git a/Exec/EWP/inputs_WindFarm_lat_lon b/Exec/EWP/inputs_WindFarm_lat_lon index b3a549ceb..0b4b92a4b 100644 --- a/Exec/EWP/inputs_WindFarm_lat_lon +++ b/Exec/EWP/inputs_WindFarm_lat_lon @@ -36,7 +36,6 @@ ylo.type = "Outflow" yhi.type = "Outflow" # TIME STEP CONTROL -erf.use_native_mri = 1 erf.fixed_dt = 0.25 # fixed time step depending on grid resolution #erf.fixed_fast_dt = 0.0025 diff --git a/Exec/EWP/inputs_WindFarm_x_y b/Exec/EWP/inputs_WindFarm_x_y index 19b931695..1f102dc4d 100644 --- a/Exec/EWP/inputs_WindFarm_x_y +++ b/Exec/EWP/inputs_WindFarm_x_y @@ -34,7 +34,6 @@ ylo.type = "Outflow" yhi.type = "Outflow" # TIME STEP CONTROL -erf.use_native_mri = 1 erf.fixed_dt = 0.25 # fixed time step depending on grid resolution #erf.fixed_fast_dt = 0.0025 diff --git a/Exec/Radiation/inputs_radiation b/Exec/Radiation/inputs_radiation index 9a3fdcf60..12fcd8e87 100644 --- a/Exec/Radiation/inputs_radiation +++ b/Exec/Radiation/inputs_radiation @@ -18,7 +18,6 @@ zlo.type = "SlipWall" zhi.type = "SlipWall" # TIME STEP CONTROL -erf.use_native_mri = 1 erf.fixed_dt = 1.0 # fixed time step [s] -- Straka et al 1993 erf.fixed_fast_dt = 0.25 # fixed time step [s] -- Straka et al 1993 diff --git a/Exec/RegTests/TaylorGreenVortex/inputs_multilevel b/Exec/RegTests/TaylorGreenVortex/inputs_multilevel index e4cb00b3d..e53115628 100644 --- a/Exec/RegTests/TaylorGreenVortex/inputs_multilevel +++ b/Exec/RegTests/TaylorGreenVortex/inputs_multilevel @@ -18,8 +18,6 @@ zhi.type = "SlipWall" erf.fixed_dt = 4e-2 # fixed time step erf.mri_fixed_dt_ratio = 4 -erf.use_native_mri = 0 - # DIAGNOSTICS & VERBOSITY erf.sum_interval = 1 # timesteps between computing mass erf.v = 1 # verbosity in ERF.cpp diff --git a/Exec/SimpleActuatorDisk/inputs_1WT_lat_lon b/Exec/SimpleActuatorDisk/inputs_1WT_lat_lon index a5d799cfd..ff237b1cc 100644 --- a/Exec/SimpleActuatorDisk/inputs_1WT_lat_lon +++ b/Exec/SimpleActuatorDisk/inputs_1WT_lat_lon @@ -51,7 +51,6 @@ xlo.theta = 300. # TIME STEP CONTROL -erf.use_native_mri = 1 erf.fixed_dt = 3.0 # fixed time step depending on grid resolution #erf.fixed_fast_dt = 0.0025 diff --git a/Exec/SimpleActuatorDisk/inputs_1WT_x_y b/Exec/SimpleActuatorDisk/inputs_1WT_x_y index 6a7986956..4796a2cf4 100644 --- a/Exec/SimpleActuatorDisk/inputs_1WT_x_y +++ b/Exec/SimpleActuatorDisk/inputs_1WT_x_y @@ -49,7 +49,6 @@ xlo.theta = 300. # TIME STEP CONTROL -erf.use_native_mri = 1 erf.fixed_dt = 0.1 # fixed time step depending on grid resolution #erf.fixed_fast_dt = 0.0025 diff --git a/Exec/SimpleActuatorDisk/inputs_WindFarm_lat_lon b/Exec/SimpleActuatorDisk/inputs_WindFarm_lat_lon index e6ebae87b..8fe3e2e82 100644 --- a/Exec/SimpleActuatorDisk/inputs_WindFarm_lat_lon +++ b/Exec/SimpleActuatorDisk/inputs_WindFarm_lat_lon @@ -36,7 +36,6 @@ ylo.type = "Outflow" yhi.type = "Outflow" # TIME STEP CONTROL -erf.use_native_mri = 1 erf.fixed_dt = 0.25 # fixed time step depending on grid resolution #erf.fixed_fast_dt = 0.0025 diff --git a/Exec/SimpleActuatorDisk/inputs_WindFarm_x_y b/Exec/SimpleActuatorDisk/inputs_WindFarm_x_y index 7fbed1830..72e9af156 100644 --- a/Exec/SimpleActuatorDisk/inputs_WindFarm_x_y +++ b/Exec/SimpleActuatorDisk/inputs_WindFarm_x_y @@ -34,7 +34,6 @@ ylo.type = "Outflow" yhi.type = "Outflow" # TIME STEP CONTROL -erf.use_native_mri = 1 erf.fixed_dt = 0.25 # fixed time step depending on grid resolution #erf.fixed_fast_dt = 0.0025 diff --git a/Exec/SquallLine_2D/inputs_ml b/Exec/SquallLine_2D/inputs_ml index 9169252c4..4a4f50617 100644 --- a/Exec/SquallLine_2D/inputs_ml +++ b/Exec/SquallLine_2D/inputs_ml @@ -20,7 +20,6 @@ zlo.type = "SlipWall" zhi.type = "SlipWall" # TIME STEP CONTROL -erf.use_native_mri = 1 erf.fixed_dt = 1.0 # fixed time step [s] -- Straka et al 1993 erf.fixed_fast_dt = 0.5 # fixed time step [s] -- Straka et al 1993 diff --git a/Exec/SquallLine_2D/inputs_moisture_Gabersek b/Exec/SquallLine_2D/inputs_moisture_Gabersek index 235ef5941..8c4ac7e2e 100644 --- a/Exec/SquallLine_2D/inputs_moisture_Gabersek +++ b/Exec/SquallLine_2D/inputs_moisture_Gabersek @@ -19,7 +19,6 @@ zlo.type = "SlipWall" zhi.type = "HO_Outflow" # TIME STEP CONTROL -erf.use_native_mri = 1 erf.fixed_dt = 0.25 # fixed time step [s] -- Straka et al 1993 erf.fixed_fast_dt = 0.125 # fixed time step [s] -- Straka et al 1993 diff --git a/Exec/SquallLine_2D/inputs_moisture_SAM b/Exec/SquallLine_2D/inputs_moisture_SAM index b920bbe5f..3f7ea21b1 100644 --- a/Exec/SquallLine_2D/inputs_moisture_SAM +++ b/Exec/SquallLine_2D/inputs_moisture_SAM @@ -19,7 +19,6 @@ zlo.type = "SlipWall" zhi.type = "Outflow" # TIME STEP CONTROL -erf.use_native_mri = 1 erf.fixed_dt = 1.0 # fixed time step [s] -- Straka et al 1993 erf.fixed_fast_dt = 0.5 # fixed time step [s] -- Straka et al 1993 diff --git a/Exec/SquallLine_2D/inputs_moisture_WRF b/Exec/SquallLine_2D/inputs_moisture_WRF index 677d5380b..b1fea7fdb 100644 --- a/Exec/SquallLine_2D/inputs_moisture_WRF +++ b/Exec/SquallLine_2D/inputs_moisture_WRF @@ -19,7 +19,6 @@ zlo.type = "SlipWall" zhi.type = "HO_Outflow" # TIME STEP CONTROL -erf.use_native_mri = 1 erf.fixed_dt = 1.0 # fixed time step [s] -- Straka et al 1993 erf.fixed_fast_dt = 0.5 # fixed time step [s] -- Straka et al 1993 diff --git a/Exec/SuperCell/inputs_moisture b/Exec/SuperCell/inputs_moisture index b363a84cb..92e812fe7 100644 --- a/Exec/SuperCell/inputs_moisture +++ b/Exec/SuperCell/inputs_moisture @@ -18,7 +18,6 @@ zlo.type = "SlipWall" zhi.type = "SlipWall" # TIME STEP CONTROL -erf.use_native_mri = 1 erf.fixed_dt = 1.0 # fixed time step [s] -- Straka et al 1993 erf.fixed_fast_dt = 0.25 # fixed time step [s] -- Straka et al 1993 diff --git a/Exec/SuperCell_3D/inputs_Supercell_3D b/Exec/SuperCell_3D/inputs_Supercell_3D index 3f2daff82..55a6955c5 100644 --- a/Exec/SuperCell_3D/inputs_Supercell_3D +++ b/Exec/SuperCell_3D/inputs_Supercell_3D @@ -22,7 +22,6 @@ zlo.type = "SlipWall" zhi.type = "HO_Outflow" # TIME STEP CONTROL -erf.use_native_mri = 1 erf.fixed_dt = 0.25 # fixed time step [s] -- Straka et al 1993 erf.fixed_fast_dt = 0.125 # fixed time step [s] -- Straka et al 1993 From 093c383331a5dbb848037ca931b6a43647a9410f Mon Sep 17 00:00:00 2001 From: Ann Almgren Date: Wed, 16 Oct 2024 21:00:24 -0700 Subject: [PATCH 17/35] modify dry buoyancy type 2 to use base state not horiz averages (#1891) --- Source/SourceTerms/ERF_make_buoyancy.cpp | 76 ++++-------------------- 1 file changed, 12 insertions(+), 64 deletions(-) diff --git a/Source/SourceTerms/ERF_make_buoyancy.cpp b/Source/SourceTerms/ERF_make_buoyancy.cpp index 4cb518a29..d9ec30a53 100644 --- a/Source/SourceTerms/ERF_make_buoyancy.cpp +++ b/Source/SourceTerms/ERF_make_buoyancy.cpp @@ -92,7 +92,6 @@ void make_buoyancy (Vector& S_data, // ****************************************************************************************** if (solverChoice.moisture_type == MoistureType::None) { - if (solverChoice.buoyancy_type == 1) { #ifdef _OPENMP #pragma omp parallel if (amrex::Gpu::notInLaunchRegion()) @@ -119,11 +118,14 @@ void make_buoyancy (Vector& S_data, } // mfi } -#if 0 - else + else // (buoyancy_type != 1) { - // We use the base state rather than planar average because we don't want to average over - // the limited region of the fine level + // We now use the base state rather than planar average because + // 1) we don't want to average over the limited region of the fine level if doing multilevel. + // 2) it's cheaper to use the base state than to compute the horizontal averages + // 3) when running in a smallish domain, the horizontal average may evolve over time, + // which is not necessarily the intended behavior + // #ifdef _OPENMP #pragma omp parallel if (amrex::Gpu::notInLaunchRegion()) #endif @@ -147,7 +149,7 @@ void make_buoyancy (Vector& S_data, Real rt0_hi = getRhoThetagivenP(p0_arr(i,j,k)); Real t0_hi = getTgivenPandTh(p0_arr(i,j,k), rt0_hi/r0_arr(i,j,k), rd_over_cp); Real t_hi = getTgivenRandRTh(cell_data(i,j,k ,Rho_comp), cell_data(i,j,k ,RhoTheta_comp)); - Real qplus = (t_hi-t0_hi)/t0_hi; + Real qplus = (t_hi-t0_hi)/t0_hi; Real rt0_lo = getRhoThetagivenP(p0_arr(i,j,k-1)); Real t0_lo = getTgivenPandTh(p0_arr(i,j,k-1), rt0_lo/r0_arr(i,j,k-1), rd_over_cp); @@ -158,61 +160,6 @@ void make_buoyancy (Vector& S_data, buoyancy_fab(i, j, k) = -r0_q_avg * grav_gpu[2]; }); } // mfi - } -#else - else if (solverChoice.buoyancy_type == 2 || solverChoice.buoyancy_type == 3) - { - PlaneAverage state_ave(&(S_data[IntVars::cons]), geom, solverChoice.ave_plane); - PlaneAverage prim_ave(&S_prim, geom, solverChoice.ave_plane); - - int ncell = state_ave.ncell_line(); - - state_ave.compute_averages(ZDir(), state_ave.field()); - prim_ave.compute_averages(ZDir(), prim_ave.field()); - - Gpu::HostVector rho_h(ncell), theta_h(ncell); - state_ave.line_average(Rho_comp, rho_h); - prim_ave.line_average(PrimTheta_comp, theta_h); - - Gpu::DeviceVector rho_d(ncell); - Gpu::DeviceVector theta_d(ncell); - - Gpu::copyAsync(Gpu::hostToDevice, rho_h.begin(), rho_h.end(), rho_d.begin()); - Gpu::copyAsync(Gpu::hostToDevice, theta_h.begin(), theta_h.end(), theta_d.begin()); - - Real* rho_d_ptr = rho_d.data(); - Real* theta_d_ptr = theta_d.data(); - -#ifdef _OPENMP -#pragma omp parallel if (amrex::Gpu::notInLaunchRegion()) -#endif - for ( MFIter mfi(buoyancy,TilingIfNotGPU()); mfi.isValid(); ++mfi) - { - Box tbz = mfi.tilebox(); - - // We don't compute a source term for z-momentum on the bottom or top boundary - if (tbz.smallEnd(2) == klo) tbz.growLo(2,-1); - if (tbz.bigEnd(2) == khi) tbz.growHi(2,-1); - - const Array4 & cell_data = S_data[IntVars::cons].array(mfi); - const Array4< Real> & buoyancy_fab = buoyancy.array(mfi); - - ParallelFor(tbz, [=] AMREX_GPU_DEVICE (int i, int j, int k) - { - Real tempp1d = getTgivenRandRTh(rho_d_ptr[k ], rho_d_ptr[k ]*theta_d_ptr[k ]); - Real tempp3d = getTgivenRandRTh(cell_data(i,j,k ,Rho_comp), cell_data(i,j,k ,RhoTheta_comp)); - Real qplus = (tempp3d-tempp1d)/tempp1d; - - Real tempm1d = getTgivenRandRTh(rho_d_ptr[k-1], rho_d_ptr[k-1]*theta_d_ptr[k-1]); - Real tempm3d = getTgivenRandRTh(cell_data(i,j,k-1,Rho_comp), cell_data(i,j,k-1,RhoTheta_comp)); - Real qminus = (tempm3d-tempm1d)/tempm1d; - - Real r0_q_avg = Real(0.5) * (rho_d_ptr[k]*qplus + rho_d_ptr[k-1]*qminus); - - buoyancy_fab(i, j, k) = -r0_q_avg * grav_gpu[2]; - }); - } // mfi -#endif } // buoyancy_type } // moisture type else @@ -224,7 +171,7 @@ void make_buoyancy (Vector& S_data, if ( (solverChoice.moisture_type == MoistureType::Kessler_NoRain) || (solverChoice.moisture_type == MoistureType::SAM) || (solverChoice.moisture_type == MoistureType::SAM_NoPrecip_NoIce) ) - { + { AMREX_ALWAYS_ASSERT(solverChoice.buoyancy_type == 1); } @@ -269,7 +216,7 @@ void make_buoyancy (Vector& S_data, // Compute horizontal averages of all components of each field state_ave.compute_averages(ZDir(), state_ave.field()); - prim_ave.compute_averages(ZDir(), prim_ave.field()); + prim_ave.compute_averages(ZDir(), prim_ave.field()); int ncell = state_ave.ncell_line(); @@ -290,7 +237,7 @@ void make_buoyancy (Vector& S_data, Gpu::DeviceVector qv_d(ncell,0.0), qc_d(ncell,0.0), qp_d(ncell,0.0); if (n_qstate >=1) { prim_ave.line_average(PrimQ1_comp, qv_h); - Gpu::copyAsync(Gpu::hostToDevice, qv_h.begin(), qv_h.end(), qv_d.begin()); + Gpu::copyAsync(Gpu::hostToDevice, qv_h.begin(), qv_h.end(), qv_d.begin()); } if (n_qstate >=2) { prim_ave.line_average(PrimQ2_comp, qc_h); @@ -305,6 +252,7 @@ void make_buoyancy (Vector& S_data, Real* qp_d_ptr = qp_d.data(); if (solverChoice.buoyancy_type == 2 || solverChoice.buoyancy_type == 4 ) { + #ifdef _OPENMP #pragma omp parallel if (amrex::Gpu::notInLaunchRegion()) #endif From 29bcfe8dcdc827d0afa965c742fc7a04a333f250 Mon Sep 17 00:00:00 2001 From: Ann Almgren Date: Wed, 16 Oct 2024 21:19:25 -0700 Subject: [PATCH 18/35] add ML inputs for DC (#1892) --- Exec/RegTests/DensityCurrent/inputs_amr | 87 +++++++++++++++++++ Exec/RegTests/DensityCurrent/inputs_anelastic | 86 ------------------ .../DensityCurrent/inputs_crse_halfdomain | 68 +++++++-------- 3 files changed, 121 insertions(+), 120 deletions(-) create mode 100644 Exec/RegTests/DensityCurrent/inputs_amr delete mode 100644 Exec/RegTests/DensityCurrent/inputs_anelastic diff --git a/Exec/RegTests/DensityCurrent/inputs_amr b/Exec/RegTests/DensityCurrent/inputs_amr new file mode 100644 index 000000000..11a5373d4 --- /dev/null +++ b/Exec/RegTests/DensityCurrent/inputs_amr @@ -0,0 +1,87 @@ +# ------------------ INPUTS TO MAIN PROGRAM ------------------- +stop_time = 900.0 + +amr.blocking_factor_x = 16 +amr.blocking_factor_y = 1 +amr.blocking_factor_z = 16 + +#erf.anelastic = 1 +#erf.check_file = chka +#erf.plot_file_1 = plta + +erf.anelastic = 0 +erf.check_file = chk +erf.plot_file_1 = plt + +erf.buoyancy_type = 2 + +amrex.fpe_trap_invalid = 1 + +fabarray.mfiter_tile_size = 1024 1024 1024 + +# PROBLEM SIZE & GEOMETRY +geometry.prob_lo = 0. 0. 0. +geometry.prob_hi = 25600. 100. 6400. + +xlo.type = "Symmetry" +xhi.type = "Outflow" + +zlo.type = "SlipWall" +zhi.type = "SlipWall" + +geometry.is_periodic = 0 1 0 + +amr.max_level = 1 # maximum level number allowed + +amr.n_cell = 128 1 32 # dx=dy=dz=100 m, Straka et al 1993 / Xue et al 2000 +erf.fixed_dt = 2.0 # fixed time step [s] -- Straka et al 1993 +erf.fixed_fast_dt = 0.5 # fixed time step [s] -- Straka et al 1993 +erf.plot_int_1 = 100 # number of timesteps between plotfiles +erf.check_int =-1000 # number of timesteps between checkpoints + +# DIAGNOSTICS & VERBOSITY +erf.sum_interval =-1 # timesteps between computing mass +erf.v = 0 # verbosity in ERF.cpp +amr.v = 1 # verbosity in Amr.cpp + +# CHECKPOINT FILES + +# PLOTFILES +erf.plotfile_type = amrex +erf.plot_vars_1 = density x_velocity y_velocity z_velocity pressure theta pres_hse dens_hse pert_pres pert_dens + +# SOLVER CHOICE +erf.use_gravity = true +erf.use_coriolis = false +erf.use_terrain = false + +erf.les_type = "None" +# +# Diffusion coefficient from Straka, K = 75 m^2/s +# +erf.molec_diff_type = "ConstantAlpha" # where alpha == "K" in Straka et al 1993 +erf.rho0_trans = 1.0 # [kg/m^3], used to convert input diffusivities +erf.dynamicViscosity = 75.0 # [kg/(m-s)] ==> alpha = 75.0 m^2/s +erf.alpha_T = 75.0 # [m^2/s] + +erf.c_p = 1004.0 + +# PROBLEM PARAMETERS (optional) +prob.T_0 = 300.0 +prob.U_0 = 0.0 + +################################ MULTILEVEL ################################ +amr.ref_ratio_vect = 2 1 2 + +erf.coupling_type = "OneWay" +erf.regrid_int = 10 + +erf.refinement_indicators = lo_theta + +erf.lo_theta.max_level = 1 +erf.lo_theta.field_name = theta +erf.lo_theta.value_less = 299.0 + +amr.n_error_buf = 6 6 +amr.grid_eff = 0.8 +################################ MULTILEVEL ################################ diff --git a/Exec/RegTests/DensityCurrent/inputs_anelastic b/Exec/RegTests/DensityCurrent/inputs_anelastic deleted file mode 100644 index b555097ca..000000000 --- a/Exec/RegTests/DensityCurrent/inputs_anelastic +++ /dev/null @@ -1,86 +0,0 @@ -# ------------------ INPUTS TO MAIN PROGRAM ------------------- -stop_time = 900.0 - -erf.anelastic = 1 - -erf.use_terrain = false - -amrex.fpe_trap_invalid = 1 - -fabarray.mfiter_tile_size = 1024 1024 1024 - -#SYMMETRY / OUTFLOW VERSION -geometry.prob_lo = 0. 0. 0. -geometry.prob_hi = 25600. 100. 6400. -geometry.is_periodic = 0 1 0 -amr.n_cell = 256 1 64 # dx=dy=dz=100 m, Straka et al 1993 / Xue et al 2000 -xlo.type = "Symmetry" -xhi.type = "HO_Outflow" - -#DOUBLY PERIODIC VERSION -#geometry.prob_lo = -25600. 0. 0. -#geometry.prob_hi = 25600. 100. 6400. -#geometry.is_periodic = 1 1 0 -#amr.n_cell = 512 1 64 # dx=dy=dz=100 m, Straka et al 1993 / Xue et al 2000 - -zlo.type = "SlipWall" -zhi.type = "SlipWall" - -# TIME STEP CONTROL -erf.fixed_dt = 1.0 # fixed time step [s] -- Straka et al 1993 - -# DIAGNOSTICS & VERBOSITY -erf.sum_interval = 1 # timesteps between computing mass -erf.v = 1 # verbosity in ERF.cpp -amr.v = 1 # verbosity in Amr.cpp -erf.mg_v = 1 # verbosity in ERF.cpp - -# REFINEMENT / REGRIDDING -amr.max_level = 0 # maximum level number allowed - -# CHECKPOINT FILES -erf.check_file = chk # root name of checkpoint file -erf.check_int = -1000 # number of timesteps between checkpoints - -# PLOTFILES -erf.plotfile_type = netcdf # prefix of plotfile name -erf.plotfile_type = amrex # prefix of plotfile name -erf.plot_file_1 = plta # prefix of plotfile name -erf.plot_int_1 = 100 # number of timesteps between plotfiles -erf.plot_vars_1 = density x_velocity y_velocity z_velocity pressure theta pres_hse dens_hse pert_pres pert_dens - -# SOLVER CHOICE -erf.use_gravity = true -erf.use_coriolis = false - -erf.les_type = "None" -# -# Diffusion coefficient from Straka, K = 75 m^2/s -# -erf.molec_diff_type = "ConstantAlpha" # where alpha == "K" in Straka et al 1993 -erf.rho0_trans = 1.0 # [kg/m^3], used to convert input diffusivities -erf.dynamicViscosity = 75.0 # [kg/(m-s)] ==> alpha = 75.0 m^2/s -erf.alpha_T = 75.0 # [m^2/s] - -erf.c_p = 1004.0 - -# PROBLEM PARAMETERS (optional) -prob.T_0 = 300.0 -prob.U_0 = 0.0 - -################################ MULTILEVEL ################################ -amr.max_level = 0 -amr.ref_ratio_vect = 2 1 2 - -erf.coupling_type = "TwoWay" -erf.regrid_int = 2 - -erf.refinement_indicators = lo_theta - -erf.lo_theta.max_level = 1 -erf.lo_theta.field_name = theta -erf.lo_theta.value_less = 299.9 - -amr.n_error_buf = 5 5 -amr.grid_eff = 0.8 -################################ MULTILEVEL ################################ diff --git a/Exec/RegTests/DensityCurrent/inputs_crse_halfdomain b/Exec/RegTests/DensityCurrent/inputs_crse_halfdomain index a1ad57079..ef296b8fd 100644 --- a/Exec/RegTests/DensityCurrent/inputs_crse_halfdomain +++ b/Exec/RegTests/DensityCurrent/inputs_crse_halfdomain @@ -1,7 +1,13 @@ # ------------------ INPUTS TO MAIN PROGRAM ------------------- stop_time = 900.0 -erf.use_terrain = false +erf.anelastic = 1 +erf.check_file = chka +erf.plot_file_1 = plta + +#erf.anelastic = 0 +#erf.check_file = chk +#erf.plot_file_1 = plt erf.buoyancy_type = 2 @@ -16,38 +22,49 @@ geometry.prob_hi = 25600. 100. 6400. xlo.type = "Symmetry" xhi.type = "Outflow" -geometry.is_periodic = 0 1 0 - -amr.n_cell = 256 1 64 # dx=dy=dz=100 m, Straka et al 1993 / Xue et al 2000 - zlo.type = "SlipWall" zhi.type = "SlipWall" -# TIME STEP CONTROL -erf.fixed_dt = 1.0 # fixed time step [s] -- Straka et al 1993 -erf.fixed_fast_dt = 0.25 # fixed time step [s] -- Straka et al 1993 +geometry.is_periodic = 0 1 0 + +amr.max_level = 0 # maximum level number allowed + +#fine +#amr.n_cell = 512 1 128 # dx=dy=dz=50 m, Straka et al 1993 / Xue et al 2000 +#erf.fixed_dt = 0.5 # fixed time step [s] -- Straka et al 1993 +#erf.fixed_fast_dt = 0.125 # fixed time step [s] -- Straka et al 1993 +#erf.plot_int_1 = 200 # number of timesteps between plotfiles +#erf.check_int = 200 # number of timesteps between checkpoints + +#crse +amr.n_cell = 256 1 64 # dx=dy=dz=100 m, Straka et al 1993 / Xue et al 2000 +erf.fixed_dt = 1.0 # fixed time step [s] -- Straka et al 1993 +erf.fixed_fast_dt = 0.25 # fixed time step [s] -- Straka et al 1993 +erf.plot_int_1 = 300 # number of timesteps between plotfiles +erf.check_int =-1000 # number of timesteps between checkpoints + +#crser +#amr.n_cell = 128 1 32 # dx=dy=dz=100 m, Straka et al 1993 / Xue et al 2000 +#erf.fixed_dt = 2.0 # fixed time step [s] -- Straka et al 1993 +#erf.fixed_fast_dt = 0.5 # fixed time step [s] -- Straka et al 1993 +#erf.plot_int_1 = 150 # number of timesteps between plotfiles +#erf.check_int = 1 # number of timesteps between checkpoints # DIAGNOSTICS & VERBOSITY -erf.sum_interval = 1 # timesteps between computing mass +erf.sum_interval =-1 # timesteps between computing mass erf.v = 1 # verbosity in ERF.cpp amr.v = 1 # verbosity in Amr.cpp -# REFINEMENT / REGRIDDING -amr.max_level = 0 # maximum level number allowed - # CHECKPOINT FILES -erf.check_file = chk # root name of checkpoint file -erf.check_int = -1000 # number of timesteps between checkpoints # PLOTFILES erf.plotfile_type = amrex # prefix of plotfile name -erf.plot_file_1 = pltc # prefix of plotfile name -erf.plot_int_1 = 1000 # number of timesteps between plotfiles erf.plot_vars_1 = density x_velocity y_velocity z_velocity pressure theta pres_hse dens_hse pert_pres pert_dens # SOLVER CHOICE -erf.use_gravity = true +erf.use_gravity = true erf.use_coriolis = false +erf.use_terrain = false erf.les_type = "None" # @@ -63,20 +80,3 @@ erf.c_p = 1004.0 # PROBLEM PARAMETERS (optional) prob.T_0 = 300.0 prob.U_0 = 0.0 - -################################ MULTILEVEL ################################ -amr.max_level = 0 -amr.ref_ratio_vect = 2 1 2 - -erf.coupling_type = "TwoWay" -erf.regrid_int = 2 - -erf.refinement_indicators = lo_theta - -erf.lo_theta.max_level = 1 -erf.lo_theta.field_name = theta -erf.lo_theta.value_less = 299.9 - -amr.n_error_buf = 5 5 -amr.grid_eff = 0.8 -################################ MULTILEVEL ################################ From 96fba75936ca1e02f68a2bd61c24a556289efb0d Mon Sep 17 00:00:00 2001 From: Mahesh Natarajan Date: Wed, 16 Oct 2024 21:53:28 -0700 Subject: [PATCH 19/35] Adding docs for AMReX-Kokkos on Perlmutter (#1889) Co-authored-by: Mahesh Natarajan --- Docs/sphinx_doc/building.rst | 93 ++++++++++++++++++++++++++++++++++++ 1 file changed, 93 insertions(+) diff --git a/Docs/sphinx_doc/building.rst b/Docs/sphinx_doc/building.rst index eb50a4ba2..1777e9419 100644 --- a/Docs/sphinx_doc/building.rst +++ b/Docs/sphinx_doc/building.rst @@ -334,6 +334,99 @@ Finally, you can prepare your SLURM job script, using the following as a guide: To submit your job script, do ``sbatch [your job script]`` and you can check its status by doing ``squeue -u [your username]``. +AMReX--Kokkos on `Perlmutter`_ (NERSC) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +There is an `example in amrex-devtests`_ of how one can build `Kokkos`_ and `AMReX`_. This uses ``cmake`` to first compile +Kokkos and AMReX, and then the example is built. This section describes the build procedure on `Perlmutter`_, though this can be used as +a template for other machines as well. + +Load the following modules, and specify ``MPI_INCLUDE_PATH`` in ``~/.bash_profile``. The ``cmake`` version has to be ``3.24.3``. + +.. code-block:: bash + + module load cray-mpich + module load PrgEnv-gnu + module load cudatoolkit/12.2 + module load cmake/3.24.3 + + export MPI_INCLUDE_PATH=/opt/cray/pe/mpich/8.1.28/ofi/gnu/12.3/include + +Make sure to do ``source ~/.bash_profile``. + +**Kokkos installation on Perlmutter** + +To install `Kokkos`_, execute the following commands. In the ``cmake`` command, specify the path where the Kokkos installation should reside +``-DCMAKE_INSTALL_PREFIX=``. The full path to the ``kokkos`` directory has to be specified in +``-DCMAKE_CXX_COMPILER=/bin/nvcc_wrapper``. + +.. code-block:: bash + + git clone https://github.com/kokkos/kokkos.git + cd kokkos + mkdir build + cd build + cmake .. -DCMAKE_INSTALL_PREFIX= -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_STANDARD=17 -DKokkos_ENABLE_CUDA=ON -DCMAKE_CXX_COMPILER=/bin/nvcc_wrapper -DKokkos_ENABLE_CUDA_RELOCATABLE_DEVICE_CODE=ON -DKokkos_ARCH_PASCAL60=ON + make -j8 + make install + +**AMReX installation on Perlmutter** + +.. note:: + + After cloning the repository in the first step below, add the following lines to ``amrex/CMakeLists.txt`` for MPI installation. + + .. code-block:: bash + + # Find MPI + find_package(MPI REQUIRED) + + # Include MPI headers + include_directories(${MPI_INCLUDE_PATH}) + +To install `AMReX`_, execute the following commands. In the ``cmake`` command, specify the path where the installation AMReX installation should reside +``-DCMAKE_INSTALL_PREFIX=``. + +.. code-block:: bash + + git clone https://github.com/AMReX-Codes/amrex.git + cd amrex + mkdir build + cd build + cmake .. -DCMAKE_INSTALL_PREFIX= -DAMReX_GPU_BACKEND=CUDA -DAMReX_CUDA_ARCH=60 -DAMReX_MPI=OFF -DCMAKE_PREFIX_PATH=/opt/nvidia/hpc_sdk/Linux_x86_64/23.9/math_libs/12.2/lib64 -DAMReX_MPI=ON -DCMAKE_C_COMPILER=mpicc -DCMAKE_CXX_COMPILER=mpicxx -DMPI_INCLUDE_PATH=/opt/cray/pe/mpich/8.1.28/ofi/gnu/12.3/include + make -j8 + make install + +**Compiling the AMReX-Kokkos example on Perlmutter** + +.. note:: + + After cloning the repository in the first step below, add the following lines to ``amrex-devtests/kokkos/CMakeLists.txt`` for MPI installation. + + .. code-block:: bash + + # Find MPI + find_package(MPI REQUIRED) + + # Include MPI headers + include_directories(${MPI_INCLUDE_PATH}) + +To compile the AMReX-Kokkos example, execute the following commands. In the ``cmake`` command, specify the full path to the amrex installation +directory ``-DAMReX_ROOT=``, and the Kokkos installation directory ``-DKokkos_ROOT=``. + +.. code-block:: bash + + git clone https://github.com/WeiqunZhang/amrex-devtests.git + cd amrex-devtests/kokkos + mkdir build + cd build + cmake .. -DENABLE_CUDA=ON -DAMReX_ROOT= -DKokkos_ROOT= -DCMAKE_CUDA_ARCHITECTURES=60 -DMPI_INCLUDE_PATH=/opt/cray/pe/mpich/8.1.28/ofi/gnu/12.3/include + make -j8 + +.. _`example in amrex-devtests`: https://github.com/WeiqunZhang/amrex-devtests/tree/main/kokkos +.. _`Kokkos`: https://github.com/kokkos/kokkos +.. _`AMReX`: https://github.com/AMReX-Codes/amrex +.. _`Perlmutter`: https://docs.nersc.gov/systems/perlmutter/architecture/ Kestrel (NREL) ~~~~~~~~~~~~~~ From 1d631fe2a263ed58af32dbb70f24884b02725b2c Mon Sep 17 00:00:00 2001 From: Mahesh Natarajan Date: Wed, 16 Oct 2024 21:53:50 -0700 Subject: [PATCH 20/35] WIP: Generalized actuator disk (#1875) * First version of generalized actuator disk * Reading in blade specification table * Reading in files for generalized actuator disk * Finalizing generalized actuator disk * Correcting Windows error * Correcting SYCL error * Reading in table for rpm and blade pitch * Correcting SYCL error * Correcting unused variable error * Correcting spelling error * Correcting docs errors * Correcting indexing error --------- Co-authored-by: Mahesh Natarajan Co-authored-by: Mahesh Natarajan Co-authored-by: Mahesh Natarajan Co-authored-by: Mahesh Natarajan Co-authored-by: Ann Almgren Co-authored-by: Mahesh Natarajan --- Docs/sphinx_doc/theory/WindFarmModels.rst | 4 +- Source/DataStructs/ERF_DataStruct.H | 5 +- Source/ERF_make_new_arrays.cpp | 2 +- Source/IO/ERF_Plotfile.cpp | 14 +- Source/Initialization/ERF_init_windfarm.cpp | 6 +- .../ERF_InitWindFarm.cpp | 148 +++++++ Source/WindFarmParametrization/ERF_WindFarm.H | 36 +- .../ERF_AdvanceGeneralAD.cpp | 414 ++++++++++++++++-- .../GeneralActuatorDisk/ERF_GeneralAD.H | 9 + .../Null/ERF_NullWindFarm.H | 64 +++ 10 files changed, 651 insertions(+), 51 deletions(-) diff --git a/Docs/sphinx_doc/theory/WindFarmModels.rst b/Docs/sphinx_doc/theory/WindFarmModels.rst index 3fff9f6dd..d4ab0a183 100644 --- a/Docs/sphinx_doc/theory/WindFarmModels.rst +++ b/Docs/sphinx_doc/theory/WindFarmModels.rst @@ -127,7 +127,7 @@ The EWP model does not have a concept of intersected area by the turbine rotor l .. _actuator_disk_model_simplified: Simplified actuator disk model -================================= +----------------------------------- A simplified actuator disk model based on one-dimensional momentum theory is implemented (See Section 3.2 in `Wind Energy Handbook 2nd edition`_). A schematic of the actuator disk is shown in Fig. :numref:`fig:ActuatorDisk_Schematic`. The model is implemented as source terms in the equations for the horizontal velocity components (ie. `x` and `y` directions). The thrust force from the one-dimensional momentum theory is given by @@ -185,7 +185,7 @@ where :math:`dA` is the area of the actuator disk in the mesh cell (see Fig. :nu .. _generalized_actuator_disk_model: Generalized actuator disk model -=============================== +------------------------------------ The generalized actuator model (GAD) based on blade element theory (`Mirocha et. al. 2014`_, see Chapter 3 of `Small Wind Turbines`_) is implemented. Similar to the simplified actuator disk model, GAD also models the wind turbine as a disk, but takes into account the details of the blade geometry (see Fig. :numref:`fig:GAD_Schematic`). The forces on the blades in the x, y, z directions are computed, and that contributes to the source terms for the fluid momentum equations. The source terms in a mesh cell inside the actuator disk are given as: diff --git a/Source/DataStructs/ERF_DataStruct.H b/Source/DataStructs/ERF_DataStruct.H index e44795be1..b3e2992ae 100644 --- a/Source/DataStructs/ERF_DataStruct.H +++ b/Source/DataStructs/ERF_DataStruct.H @@ -353,7 +353,8 @@ struct SolverChoice { pp.query("windfarm_loc_table", windfarm_loc_table); pp.query("windfarm_spec_table", windfarm_spec_table); pp.query("windfarm_blade_table", windfarm_blade_table); - pp.query("windfarm_airofil_tables", windfarm_airfoil_tables); + pp.query("windfarm_airfoil_tables", windfarm_airfoil_tables); + pp.query("windfarm_spec_table_extra", windfarm_spec_table_extra); // Sampling distance upstream of the turbine to find the // incoming free stream velocity as a factor of the diameter of the @@ -647,7 +648,7 @@ struct SolverChoice { // if SAM, then it will be set to RhoQ4 int RhoQr_comp {-1}; - std::string windfarm_loc_table, windfarm_spec_table; + std::string windfarm_loc_table, windfarm_spec_table, windfarm_spec_table_extra; std::string windfarm_blade_table, windfarm_airfoil_tables; amrex::Real sampling_distance_by_D = -1.0; amrex::Real turb_disk_angle = -1.0; diff --git a/Source/ERF_make_new_arrays.cpp b/Source/ERF_make_new_arrays.cpp index 68630c53a..a20f4517e 100644 --- a/Source/ERF_make_new_arrays.cpp +++ b/Source/ERF_make_new_arrays.cpp @@ -239,7 +239,7 @@ ERF::init_stuff (int lev, const BoxArray& ba, const DistributionMapping& dm, vars_windfarm[lev].define(ba, dm, 2, ngrow_state);// dudt, dvdt } if (solverChoice.windfarm_type == WindFarmType::GeneralAD) { - vars_windfarm[lev].define(ba, dm, 2, ngrow_state);// dudt, dvdt + vars_windfarm[lev].define(ba, dm, 3, ngrow_state);// dudt, dvdt, dwdt } Nturb[lev].define(ba, dm, 1, ngrow_state); // Number of turbines in a cell SMark[lev].define(ba, dm, 2, ngrow_state); // Free stream velocity/source term diff --git a/Source/IO/ERF_Plotfile.cpp b/Source/IO/ERF_Plotfile.cpp index e26ee2ec3..75557acd4 100644 --- a/Source/IO/ERF_Plotfile.cpp +++ b/Source/IO/ERF_Plotfile.cpp @@ -101,13 +101,9 @@ ERF::setPlotVariables (const std::string& pp_plot_var_names, Vector tmp_plot_names.push_back(derived_names[i]); } } - if(solverChoice.windfarm_type == WindFarmType::SimpleAD) { - if(derived_names[i] == "num_turb" or derived_names[i] == "SMark0" or derived_names[i] == "Smark1") { - tmp_plot_names.push_back(derived_names[i]); - } - } - if(solverChoice.windfarm_type == WindFarmType::GeneralAD) { - if(derived_names[i] == "num_turb" or derived_names[i] == "SMark1") { + if( solverChoice.windfarm_type == WindFarmType::SimpleAD or + solverChoice.windfarm_type == WindFarmType::GeneralAD ) { + if(derived_names[i] == "num_turb" or derived_names[i] == "SMark0" or derived_names[i] == "SMark1") { tmp_plot_names.push_back(derived_names[i]); } } @@ -486,8 +482,8 @@ ERF::WritePlotFile (int which, Vector plot_var_names) mf_comp ++; } - if(containerHasElement(plot_var_names, "SMark0") and - solverChoice.windfarm_type == WindFarmType::SimpleAD) { + if( containerHasElement(plot_var_names, "SMark0") and + (solverChoice.windfarm_type == WindFarmType::SimpleAD or solverChoice.windfarm_type == WindFarmType::GeneralAD) ) { for ( MFIter mfi(mf[lev],TilingIfNotGPU()); mfi.isValid(); ++mfi) { const Box& bx = mfi.tilebox(); diff --git a/Source/Initialization/ERF_init_windfarm.cpp b/Source/Initialization/ERF_init_windfarm.cpp index bf7d3dcc2..bc41acf57 100644 --- a/Source/Initialization/ERF_init_windfarm.cpp +++ b/Source/Initialization/ERF_init_windfarm.cpp @@ -43,8 +43,10 @@ ERF::init_windfarm (int lev) } if(solverChoice.windfarm_type == WindFarmType::GeneralAD) { - //windfarm->read_windfarm_blade_table(solverChoice.windfarm_blade_table); - //windfarm->read_airfoil_tables + windfarm->read_windfarm_blade_table(solverChoice.windfarm_blade_table); + windfarm->read_windfarm_airfoil_tables(solverChoice.windfarm_airfoil_tables, + solverChoice.windfarm_blade_table); + windfarm->read_windfarm_spec_table_extra(solverChoice.windfarm_spec_table_extra); } } diff --git a/Source/WindFarmParametrization/ERF_InitWindFarm.cpp b/Source/WindFarmParametrization/ERF_InitWindFarm.cpp index 32fae15ce..99a6f2f20 100644 --- a/Source/WindFarmParametrization/ERF_InitWindFarm.cpp +++ b/Source/WindFarmParametrization/ERF_InitWindFarm.cpp @@ -3,6 +3,8 @@ */ #include +#include +#include // For POSIX directory handling using namespace amrex; @@ -123,6 +125,14 @@ WindFarm::init_windfarm_lat_lon (const std::string windfarm_loc_table, xloc[it] = xloc[it] - xloc_min + windfarm_x_shift; yloc[it] = yloc[it] - yloc_min + windfarm_y_shift; } + + FILE* file_xy_loc; + file_xy_loc = fopen("file_xy_loc_KingPlains.txt","w"); + + for(int it = 0;it> var1 >> temp >> temp >> temp >> var2 >> var3 >> temp) { + bld_rad_loc.push_back(var1); + bld_twist.push_back(var2); + bld_chord.push_back(var3); + //int idx = bld_rad_loc.size()-1; + //printf("Values are = %0.15g %0.15g %0.15g\n", bld_rad_loc[idx], bld_twist[idx], bld_chord[idx]); + } + set_blade_spec(bld_rad_loc, bld_twist, bld_chord); + n_bld_sections = bld_rad_loc.size(); + } +} + +void +WindFarm::read_windfarm_spec_table_extra(const std::string windfarm_spec_table_extra) +{ + // Open the file + std::ifstream file(windfarm_spec_table_extra); + + // Check if file opened successfully + if (!file.is_open()) { + Abort("Error: You are using generalized wind farms option. This requires an input file erf.windfarm_spec_table_extra." + " Either this entry is missing in the inputs or the file specified -" + windfarm_spec_table_extra + " does" + " not exist. Exiting..."); + } else { + printf("Reading in windfarm_spec_table_extra %s", windfarm_spec_table_extra.c_str()); + } + + // Ignore the first line (header) + std::string header; + std::getline(file, header); + + // Variables to hold each row's values + double V, Cp, Ct, rpm, pitch, temp; + + // Read the file row by row + while (file >> V) { + char comma; // To ignore the commas + file >> comma >> Cp >> comma >> Ct >> comma >> temp >> comma >> temp >> comma + >> temp >> comma >> rpm >> comma >> pitch >> comma >> temp; + + velocity.push_back(V); + C_P.push_back(Cp); + C_T.push_back(Ct); + rotor_RPM.push_back(rpm); + blade_pitch.push_back(pitch); + } + + set_turb_spec_extra(velocity, C_P, C_T, rotor_RPM, blade_pitch); +} + + +void +WindFarm::read_windfarm_airfoil_tables(const std::string windfarm_airfoil_tables, + const std::string windfarm_blade_table) +{ + DIR* dir; + struct dirent* entry; + std::vector files; + + // Check if directory exists + if ((dir = opendir(windfarm_airfoil_tables.c_str())) == nullptr) { + Abort("You are using a generalized actuator disk model based on blade element theory. This needs info of airfoil" + " cross sections over the span of the blade. There needs to be an entry erf.airfoil_tables which is the directory that" + " contains the angle of attack, Cl, Cd data for each airfoil cross-section. Either the entry is missing or the directory specified" + " in the entry - " + windfarm_airfoil_tables + " is missing. Exiting..."); + } + + // Loop through directory entries and collect filenames + while ((entry = readdir(dir)) != nullptr) { + // Skip special directory entries "." and ".." + if (std::string(entry->d_name) == "." || std::string(entry->d_name) == "..") { + continue; + } + files.emplace_back(windfarm_airfoil_tables + "/" + entry->d_name); // Add file path to vector } + + // Close the directory + closedir(dir); + + if (files.empty()) { + Abort("It seems the directory containing the info of airfoil cross sections of the blades - " + windfarm_airfoil_tables + + " is empty. Exiting..."); + } + + if(files.size() != static_cast(n_bld_sections)) { + printf("There are %d airfoil sections in the last column of %s. But the number" + " of files in %s is only %ld.\n", n_bld_sections, windfarm_blade_table.c_str(), + windfarm_airfoil_tables.c_str(), files.size()); + Abort("The number of blade sections from " + windfarm_blade_table + " should match the number of" + " files in " + windfarm_airfoil_tables + ". Exiting..."); + } + + // Sort filenames in lexicographical (alphabetical) order + std::sort(files.begin(), files.end()); + + // Process each file + int count = 0; + bld_airfoil_aoa.resize(n_bld_sections); + bld_airfoil_Cl.resize(n_bld_sections); + bld_airfoil_Cd.resize(n_bld_sections); + for (const auto& filePath : files) { + std::ifstream filename(filePath.c_str()); + + if (!filename.is_open()) { + std::cerr << "Failed to open file: " << filePath << std::endl; + continue; // Move on to the next file + } + + std::cout << "Reading file: " << filePath << std::endl; + + std::string line; + for (int i = 0; i < 54; ++i) { + if (std::getline(filename, line)) { // Read one line into the array + } + } + + Real var1, var2, var3, temp; + + while(filename >> var1 >> var2 >> var3 >> temp) { + bld_airfoil_aoa[count].push_back(var1); + bld_airfoil_Cl[count].push_back(var2); + bld_airfoil_Cd[count].push_back(var3); + //int idx = bld_airfoil_aoa.size()-1; + //printf("Values are = %0.15g %0.15g %0.15g\n", bld_airfoil_aoa[idx], bld_airfoil_Cl[idx], bld_airfoil_Cd[idx]); + } + count++; + } + + set_blade_airfoil_spec(bld_airfoil_aoa, bld_airfoil_Cl, bld_airfoil_Cd); } void diff --git a/Source/WindFarmParametrization/ERF_WindFarm.H b/Source/WindFarmParametrization/ERF_WindFarm.H index ee7742de9..100a81f0a 100644 --- a/Source/WindFarmParametrization/ERF_WindFarm.H +++ b/Source/WindFarmParametrization/ERF_WindFarm.H @@ -65,7 +65,10 @@ public: void read_windfarm_blade_table(const std::string windfarm_blade_table); - void read_windfarm_airofil_tables(const std::string windfarm_airfoils_tables); + void read_windfarm_airfoil_tables(const std::string windfarm_airfoil_tables, + const std::string windfarm_blade_table); + + void read_windfarm_spec_table_extra(const std::string windfarm_spec_table_extra); void fill_Nturb_multifab(const amrex::Geometry& geom, amrex::MultiFab& mf_Nturb); @@ -108,9 +111,32 @@ public: m_windfarm_model[0]->set_turb_loc(a_xloc, a_yloc); } - void set_turb_disk_angle (const amrex::Real& turb_disk_angle) override + void set_turb_disk_angle (const amrex::Real& a_turb_disk_angle) override + { + m_windfarm_model[0]->set_turb_disk_angle(a_turb_disk_angle); + } + + void set_blade_spec (const amrex::Vector& a_bld_rad_loc, + const amrex::Vector& a_bld_twist, + const amrex::Vector& a_bld_chord) override + { + m_windfarm_model[0]->set_blade_spec(a_bld_rad_loc, a_bld_twist, a_bld_chord); + } + + void set_blade_airfoil_spec (const amrex::Vector>& a_bld_airfoil_aoa, + const amrex::Vector>& a_bld_airfoil_Cl, + const amrex::Vector>& a_bld_airfoil_Cd) override + { + m_windfarm_model[0]->set_blade_airfoil_spec(a_bld_airfoil_aoa, a_bld_airfoil_Cl, a_bld_airfoil_Cd); + } + + void set_turb_spec_extra (const amrex::Vector& a_velocity, + const amrex::Vector& a_C_P, + const amrex::Vector& a_C_T, + const amrex::Vector& a_rotor_RPM, + const amrex::Vector& a_blade_pitch) override { - m_windfarm_model[0]->set_turb_disk_angle(turb_disk_angle); + m_windfarm_model[0]->set_turb_spec_extra(a_velocity, a_C_P, a_C_T, a_rotor_RPM, a_blade_pitch); } protected: @@ -119,6 +145,10 @@ protected: amrex::Real my_turb_disk_angle; amrex::Real hub_height, rotor_rad, thrust_coeff_standing, nominal_power; amrex::Vector wind_speed, thrust_coeff, power; + amrex::Vector bld_rad_loc, bld_twist, bld_chord; + amrex::Vector> bld_airfoil_aoa, bld_airfoil_Cl, bld_airfoil_Cd; + int n_bld_sections; + amrex::Vector velocity, C_P, C_T, rotor_RPM, blade_pitch; /*! \brief Create and set the specified windfarm model */ template diff --git a/Source/WindFarmParametrization/GeneralActuatorDisk/ERF_AdvanceGeneralAD.cpp b/Source/WindFarmParametrization/GeneralActuatorDisk/ERF_AdvanceGeneralAD.cpp index 96243d29b..42f9d4be3 100644 --- a/Source/WindFarmParametrization/GeneralActuatorDisk/ERF_AdvanceGeneralAD.cpp +++ b/Source/WindFarmParametrization/GeneralActuatorDisk/ERF_AdvanceGeneralAD.cpp @@ -1,6 +1,7 @@ #include #include #include +#include using namespace amrex; @@ -18,14 +19,17 @@ GeneralAD::advance (const Geometry& geom, AMREX_ALWAYS_ASSERT(W_old.nComp() > 0); AMREX_ALWAYS_ASSERT(mf_Nturb.nComp() > 0); AMREX_ALWAYS_ASSERT(mf_vars_generalAD.nComp() > 0); + compute_freestream_velocity(cons_in, U_old, V_old, mf_SMark); source_terms_cellcentered(geom, cons_in, mf_SMark, mf_vars_generalAD); - update(dt_advance, cons_in, U_old, V_old, mf_vars_generalAD); + update(dt_advance, cons_in, U_old, V_old, W_old, mf_vars_generalAD); } void GeneralAD::update (const Real& dt_advance, MultiFab& cons_in, - MultiFab& U_old, MultiFab& V_old, + MultiFab& U_old, + MultiFab& V_old, + MultiFab& W_old, const MultiFab& mf_vars_generalAD) { @@ -33,12 +37,14 @@ GeneralAD::update (const Real& dt_advance, Box tbx = mfi.nodaltilebox(0); Box tby = mfi.nodaltilebox(1); + Box tbz = mfi.nodaltilebox(2); auto generalAD_array = mf_vars_generalAD.array(mfi); auto u_vel = U_old.array(mfi); auto v_vel = V_old.array(mfi); + auto w_vel = W_old.array(mfi); - ParallelFor(tbx, tby, + ParallelFor(tbx, tby, tbz, [=] AMREX_GPU_DEVICE(int i, int j, int k) noexcept { u_vel(i,j,k) = u_vel(i,j,k) + (generalAD_array(i-1,j,k,0) + generalAD_array(i,j,k,0))/2.0*dt_advance; @@ -46,10 +52,235 @@ GeneralAD::update (const Real& dt_advance, [=] AMREX_GPU_DEVICE(int i, int j, int k) noexcept { v_vel(i,j,k) = v_vel(i,j,k) + (generalAD_array(i,j-1,k,1) + generalAD_array(i,j,k,1))/2.0*dt_advance; + }, + [=] AMREX_GPU_DEVICE(int i, int j, int k) noexcept + { + w_vel(i,j,k) = w_vel(i,j,k) + (generalAD_array(i,j,k-1,2) + generalAD_array(i,j,k,2))/2.0*dt_advance; }); + } } +void GeneralAD::compute_freestream_velocity(const MultiFab& cons_in, + const MultiFab& U_old, + const MultiFab& V_old, + const MultiFab& mf_SMark) +{ + get_turb_loc(xloc, yloc); + freestream_velocity.clear(); + freestream_phi.clear(); + disk_cell_count.clear(); + freestream_velocity.resize(xloc.size(),0.0); + freestream_phi.resize(xloc.size(),0.0); + disk_cell_count.resize(xloc.size(),0.0); + + Gpu::DeviceVector d_freestream_velocity(xloc.size()); + Gpu::DeviceVector d_freestream_phi(yloc.size()); + Gpu::DeviceVector d_disk_cell_count(yloc.size()); + Gpu::copy(Gpu::hostToDevice, freestream_velocity.begin(), freestream_velocity.end(), d_freestream_velocity.begin()); + Gpu::copy(Gpu::hostToDevice, freestream_phi.begin(), freestream_phi.end(), d_freestream_phi.begin()); + Gpu::copy(Gpu::hostToDevice, disk_cell_count.begin(), disk_cell_count.end(), d_disk_cell_count.begin()); + + Real* d_freestream_velocity_ptr = d_freestream_velocity.data(); + Real* d_freestream_phi_ptr = d_freestream_phi.data(); + Real* d_disk_cell_count_ptr = d_disk_cell_count.data(); + + + for ( MFIter mfi(cons_in,TilingIfNotGPU()); mfi.isValid(); ++mfi) { + + auto SMark_array = mf_SMark.array(mfi); + auto u_vel = U_old.array(mfi); + auto v_vel = V_old.array(mfi); + Box tbx = mfi.nodaltilebox(0); + + ParallelFor(tbx, [=] AMREX_GPU_DEVICE(int i, int j, int k) noexcept { + + if(SMark_array(i,j,k,0) != -1.0) { + int turb_index = static_cast(SMark_array(i,j,k,0)); + Real phi = std::atan2(v_vel(i,j,k),u_vel(i,j,k)); // Wind direction w.r.t the x-dreiction + Gpu::Atomic::Add(&d_freestream_velocity_ptr[turb_index],std::pow(u_vel(i,j,k)*u_vel(i,j,k) + v_vel(i,j,k)*v_vel(i,j,k),0.5)); + Gpu::Atomic::Add(&d_disk_cell_count_ptr[turb_index],1.0); + Gpu::Atomic::Add(&d_freestream_phi_ptr[turb_index],phi); + } + }); + } + + // Copy back to host + Gpu::copy(Gpu::deviceToHost, d_freestream_velocity.begin(), d_freestream_velocity.end(), freestream_velocity.begin()); + Gpu::copy(Gpu::deviceToHost, d_freestream_phi.begin(), d_freestream_phi.end(), freestream_phi.begin()); + Gpu::copy(Gpu::deviceToHost, d_disk_cell_count.begin(), d_disk_cell_count.end(), disk_cell_count.begin()); + + // Reduce the data on every processor + amrex::ParallelAllReduce::Sum(freestream_velocity.data(), + freestream_velocity.size(), + amrex::ParallelContext::CommunicatorAll()); + + amrex::ParallelAllReduce::Sum(freestream_phi.data(), + freestream_phi.size(), + amrex::ParallelContext::CommunicatorAll()); + + + amrex::ParallelAllReduce::Sum(disk_cell_count.data(), + disk_cell_count.size(), + amrex::ParallelContext::CommunicatorAll()); + + get_turb_loc(xloc, yloc); + + + if (ParallelDescriptor::IOProcessor()){ + for(int it=0; it rad) { + index = i; + break; + } + } + } + if(index == -1 and rad > bld_rad_loc[n_bld_sections-1]) { + index = n_bld_sections-1; + } + if(index == -1) { + //printf("The radial section is at %0.15g m\n",rad); + Abort("Could not find index of the radial section."); + } + + return index; +} + +AMREX_FORCE_INLINE +AMREX_GPU_DEVICE +std::array +compute_source_terms_Fn_Ft (const Real rad, + const Real avg_vel, + const Real* bld_rad_loc, + const Real* bld_twist, + const Real* bld_chord, + int n_bld_sections, + const Real* bld_airfoil_aoa, + const Real* bld_airfoil_Cl, + const Real* bld_airfoil_Cd, + const int n_pts_airfoil, + const Real* velocity, + const Real* rotor_RPM, + const Real* blade_pitch, + const int n_spec_extra) +{ + + Real rpm = interpolate_1d(velocity, rotor_RPM, avg_vel, n_spec_extra); + Real pitch = interpolate_1d(velocity, blade_pitch, avg_vel, n_spec_extra); + + Real Omega = rpm/60.0*2.0*PI; + Real rho = 1.226; + + Real B = 3.0; + Real rhub = 2.0; + Real rtip = 63.5; + + Real twist = interpolate_1d(bld_rad_loc, bld_twist, rad, n_bld_sections); + Real c = interpolate_1d(bld_rad_loc, bld_chord, rad, n_bld_sections); + + // Iteration procedure + + Real s = 0.5*c*B/(PI*rad); + + Real at, an, V1, Vt, Vr, psi, L, D, Cn, Ct; + Real ftip, fhub, F, Cl, Cd, at_new, an_new; + + at = 0.1; + an = 0.1; + + bool is_converged = false; + + for(int i=0;i<100;i++) { + V1 = avg_vel*(1-an); + Vt = Omega*(1.0+at)*rad; + Vr = std::pow(V1*V1+Vt*Vt,0.5); + + psi = std::atan2(V1,Vt); + + Real aoa = psi*180.0/PI - twist + pitch; + + Cl = interpolate_1d(bld_airfoil_aoa, bld_airfoil_Cl, aoa, n_pts_airfoil); + Cd = interpolate_1d(bld_airfoil_aoa, bld_airfoil_Cd, aoa, n_pts_airfoil); + + //Cl = 1.37; + //Cd = 0.014; + + //printf("rad, aoa, Cl, Cd = %0.15g %0.15g %0.15g %0.15g\n", rad, aoa, Cl, Cd); + + Cn = Cl*std::cos(psi) + Cd*std::sin(psi); + Ct = Cl*std::sin(psi) - Cd*std::cos(psi); + + ftip = B*(rtip-rad)/(2.0*rad*std::sin(psi)+1e-10); + fhub = B*(rad-rhub)/(2.0*rad*std::sin(psi)+1e-10); + + AMREX_ALWAYS_ASSERT(std::fabs(std::exp(-fhub))<=1.0); + AMREX_ALWAYS_ASSERT(std::fabs(std::exp(-ftip))<=1.0); + + F = 1.0;//2.0/PI*(std::acos(std::exp(-ftip)) + std::acos(std::exp(-fhub)) ); + + at_new = 1.0/ ( 4.0*F*std::sin(psi)*std::cos(psi)/(s*Ct+1e-10) - 1.0 ); + an_new = 1.0/ ( 1.0 + 4.0*F*std::pow(std::sin(psi),2)/(s*Cn + 1e-10) ); + at_new = std::max(0.0, at_new); + + if(std::fabs(at_new-at) < 1e-5 and std::fabs(an_new-an) < 1e-5) { + //printf("Converged at, an = %d %0.15g %0.15g %0.15g\n",i, at, an, psi); + at = at_new; + an = an_new; + is_converged = true; + break; + } + at = at_new; + an = an_new; + //printf("Iteration, at, an = %0.15g %0.15g %0.15g\n",at, an, psi); + } + + if(!is_converged) { + Abort("The iteration procedure for the generalized actuator disk did not converge. Exiting..."); + } + + // Iterations converged. Now compute Ft, Fn + + L = 0.5*rho*Vr*Vr*c*Cl; + D = 0.5*rho*Vr*Vr*c*Cd; + + Real Fn = L*std::cos(psi) + D*std::sin(psi); + Real Ft = L*std::sin(psi) - D*std::cos(psi); + + //printf("Fn and Ft %0.15g %0.15g %0.15g %0.15g\n", L, D, std::cos(psi), std::sin(psi)); + + std::array Fn_and_Ft; + Fn_and_Ft[0] = Fn; + Fn_and_Ft[1] = Ft; + + return Fn_and_Ft; + + //exit(0); +} + + void GeneralAD::source_terms_cellcentered (const Geometry& geom, const MultiFab& cons_in, @@ -58,9 +289,19 @@ GeneralAD::source_terms_cellcentered (const Geometry& geom, { get_turb_loc(xloc, yloc); + get_turb_spec(rotor_rad, hub_height, thrust_coeff_standing, wind_speed, thrust_coeff, power); + get_blade_spec(bld_rad_loc,bld_twist,bld_chord); + + get_blade_airfoil_spec(bld_airfoil_aoa, bld_airfoil_Cl, bld_airfoil_Cd); + + get_turb_spec_extra(velocity, C_P, C_T, rotor_RPM, blade_pitch); + + Real d_hub_height = hub_height; + Real d_rotor_rad = rotor_rad; + Gpu::DeviceVector d_xloc(xloc.size()); Gpu::DeviceVector d_yloc(yloc.size()); Gpu::copy(Gpu::hostToDevice, xloc.begin(), xloc.end(), d_xloc.begin()); @@ -70,6 +311,7 @@ GeneralAD::source_terms_cellcentered (const Geometry& geom, // Domain valid box const amrex::Box& domain = geom.Domain(); + auto ProbLoArr = geom.ProbLoArray(); int domlo_x = domain.smallEnd(0); int domhi_x = domain.bigEnd(0) + 1; int domlo_y = domain.smallEnd(1); @@ -80,23 +322,85 @@ GeneralAD::source_terms_cellcentered (const Geometry& geom, // The order of variables are - Vabs dVabsdt, dudt, dvdt, dTKEdt mf_vars_generalAD.setVal(0.0); - long unsigned int nturbs = xloc.size(); + long unsigned int nturbs = xloc.size(); + // This is the angle phi in Fig. 10 in Mirocha et. al. 2014 + // set_turb_disk angle in ERF_InitWindFarm.cpp sets this phi as + // the turb_disk_angle get_turb_disk_angle(turb_disk_angle); - Real nx = -std::cos(turb_disk_angle); - Real ny = -std::sin(turb_disk_angle); Real d_turb_disk_angle = turb_disk_angle; - Gpu::DeviceVector d_wind_speed(wind_speed.size()); - Gpu::DeviceVector d_thrust_coeff(thrust_coeff.size()); + Gpu::DeviceVector d_freestream_velocity(nturbs); + Gpu::DeviceVector d_disk_cell_count(nturbs); + Gpu::copy(Gpu::hostToDevice, freestream_velocity.begin(), freestream_velocity.end(), d_freestream_velocity.begin()); + Gpu::copy(Gpu::hostToDevice, disk_cell_count.begin(), disk_cell_count.end(), d_disk_cell_count.begin()); + + Real* d_xloc_ptr = d_xloc.data(); + Real* d_yloc_ptr = d_yloc.data(); + Real* d_freestream_velocity_ptr = d_freestream_velocity.data(); + Real* d_disk_cell_count_ptr = d_disk_cell_count.data(); + + int n_bld_sections = bld_rad_loc.size(); + + Gpu::DeviceVector d_bld_rad_loc(n_bld_sections); + Gpu::DeviceVector d_bld_twist(n_bld_sections); + Gpu::DeviceVector d_bld_chord(n_bld_sections); + + Gpu::copy(Gpu::hostToDevice, bld_rad_loc.begin(), bld_rad_loc.end(), d_bld_rad_loc.begin()); + Gpu::copy(Gpu::hostToDevice, bld_twist.begin(), bld_twist.end(), d_bld_twist.begin()); + Gpu::copy(Gpu::hostToDevice, bld_chord.begin(), bld_chord.end(), d_bld_chord.begin()); - // Copy data from host vectors to device vectors - Gpu::copy(Gpu::hostToDevice, wind_speed.begin(), wind_speed.end(), d_wind_speed.begin()); - Gpu::copy(Gpu::hostToDevice, thrust_coeff.begin(), thrust_coeff.end(), d_thrust_coeff.begin()); + Real* bld_rad_loc_ptr = d_bld_rad_loc.data(); + Real* bld_twist_ptr = d_bld_twist.data(); + Real* bld_chord_ptr = d_bld_chord.data(); - const Real* wind_speed_d = d_wind_speed.dataPtr(); - const Real* thrust_coeff_d = d_thrust_coeff.dataPtr(); - const int n_spec_table = d_wind_speed.size(); + Vector> d_bld_airfoil_aoa(n_bld_sections); + Vector> d_bld_airfoil_Cl(n_bld_sections); + Vector> d_bld_airfoil_Cd(n_bld_sections); + + int n_pts_airfoil = bld_airfoil_aoa[0].size(); + + for(int i=0;i hp_bld_airfoil_aoa, hp_bld_airfoil_Cl, hp_bld_airfoil_Cd; + for (auto & v :d_bld_airfoil_aoa) { + hp_bld_airfoil_aoa.push_back(v.data()); + } + for (auto & v :d_bld_airfoil_Cl) { + hp_bld_airfoil_Cl.push_back(v.data()); + } + for (auto & v :d_bld_airfoil_Cd) { + hp_bld_airfoil_Cd.push_back(v.data()); + } + + Gpu::AsyncArray aoa(hp_bld_airfoil_aoa.data(), n_bld_sections); + Gpu::AsyncArray Cl(hp_bld_airfoil_Cl.data(), n_bld_sections); + Gpu::AsyncArray Cd(hp_bld_airfoil_Cd.data(), n_bld_sections); + + auto d_bld_airfoil_aoa_ptr = aoa.data(); + auto d_bld_airfoil_Cl_ptr = Cl.data(); + auto d_bld_airfoil_Cd_ptr = Cd.data(); + + int n_spec_extra = velocity.size(); + + Gpu::DeviceVector d_velocity(n_spec_extra); + Gpu::DeviceVector d_rotor_RPM(n_spec_extra); + Gpu::DeviceVector d_blade_pitch(n_spec_extra); + + Gpu::copy(Gpu::hostToDevice, velocity.begin(), velocity.end(), d_velocity.begin()); + Gpu::copy(Gpu::hostToDevice, rotor_RPM.begin(), rotor_RPM.end(), d_rotor_RPM.begin()); + Gpu::copy(Gpu::hostToDevice, blade_pitch.begin(), blade_pitch.end(), d_blade_pitch.begin()); + + auto d_velocity_ptr = d_velocity.data(); + auto d_rotor_RPM_ptr = d_rotor_RPM.data(); + auto d_blade_pitch_ptr = d_blade_pitch.data(); for ( MFIter mfi(cons_in,TilingIfNotGPU()); mfi.isValid(); ++mfi) { @@ -109,34 +413,79 @@ GeneralAD::source_terms_cellcentered (const Geometry& geom, int jj = amrex::min(amrex::max(j, domlo_y), domhi_y); int kk = amrex::min(amrex::max(k, domlo_z), domhi_z); + Real x = ProbLoArr[0] + (ii+0.5)*dx[0]; + Real y = ProbLoArr[1] + (jj+0.5)*dx[1]; + Real z = ProbLoArr[2] + (kk+0.5)*dx[2]; + // ?? Density needed here + Real inv_dens_vol = 1.0/(1.0*dx[0]*dx[1]*dx[2]); + int check_int = 0; - Real source_x = 0.0; - Real source_y = 0.0; + Real source_x = 0.0, source_y = 0.0, source_z = 0.0; + std::array Fn_and_Ft; for(long unsigned int it=0;it(it)) { check_int++; - if(C_T <= 1) { - source_x = -2.0*std::pow(Uinfty_dot_nhat, 2.0)*a*(1.0-a)*dx[1]*dx[2]*std::cos(d_turb_disk_angle)/(dx[0]*dx[1]*dx[2])*std::cos(phi); - source_y = -2.0*std::pow(Uinfty_dot_nhat, 2.0)*a*(1.0-a)*dx[1]*dx[2]*std::cos(d_turb_disk_angle)/(dx[0]*dx[1]*dx[2])*std::sin(phi); - } - else { - source_x = -0.5*C_T*std::pow(Uinfty_dot_nhat, 2.0)*dx[1]*dx[2]*std::cos(d_turb_disk_angle)/(dx[0]*dx[1]*dx[2])*std::cos(phi); - source_y = -0.5*C_T*std::pow(Uinfty_dot_nhat, 2.0)*dx[1]*dx[2]*std::cos(d_turb_disk_angle)/(dx[0]*dx[1]*dx[2])*std::sin(phi); + + // Find radial distance of the point and the zeta angle + Real rad = std::pow( (x-d_xloc_ptr[it])*(x-d_xloc_ptr[it]) + + (y-d_yloc_ptr[it])*(y-d_yloc_ptr[it]) + + (z-d_hub_height)*(z-d_hub_height), 0.5 ); + + int index = find_rad_loc_index(rad, bld_rad_loc_ptr, n_bld_sections); + + // This if check makes sure it is a point with radial distance + // between the hub radius and the rotor radius. + // ?? hub radius needed here + if(rad >= 2.0 and rad <= d_rotor_rad) { + //AMREX_ASSERT( (z-d_hub_height) <= rad ); + // Consider the vector that joines the point and the turbine center. + // Dot it on to the vector that joins the turbine center and along + // the plane of the disk. See fig. 10 in Mirocha et. al. 2014. + + Real vec_proj = (x-d_xloc_ptr[it])*(std::sin(phi)) + + (y-d_yloc_ptr[it])*(-std::cos(phi)); + + + Real zeta = std::atan2(z-d_hub_height, vec_proj); + //printf("zeta val is %0.15g\n", zeta*180.0/PI); + Fn_and_Ft = compute_source_terms_Fn_Ft(rad, avg_vel, + bld_rad_loc_ptr, + bld_twist_ptr, + bld_chord_ptr, + n_bld_sections, + d_bld_airfoil_aoa_ptr[index], + d_bld_airfoil_Cl_ptr[index], + d_bld_airfoil_Cd_ptr[index], + n_pts_airfoil, + d_velocity_ptr, + d_rotor_RPM_ptr, + d_blade_pitch_ptr, + n_spec_extra); + + Real Fn = Fn_and_Ft[0]; + Real Ft = Fn_and_Ft[1]; + // Compute the source terms - pass in radial distance, free stream velocity + + Real Fx = Fn*std::cos(phi) + Ft*std::sin(zeta)*std::sin(phi); + Real Fy = Fn*std::sin(phi) - Ft*std::sin(zeta)*std::cos(phi); + Real Fz = -Ft*std::cos(zeta); + + source_x = -Fx*inv_dens_vol; + source_y = -Fy*inv_dens_vol; + source_z = -Fz*inv_dens_vol; + + + //printf("Val source_x, is %0.15g, %0.15g, %0.15g %0.15g %0.15g %0.15g\n", rad, Fn, Ft, source_x, source_y, source_z); } } } + if(check_int > 1){ amrex::Error("Actuator disks are overlapping. Visualize actuator_disks.vtk " "and check the windturbine locations input file. Exiting.."); @@ -144,6 +493,7 @@ GeneralAD::source_terms_cellcentered (const Geometry& geom, generalAD_array(i,j,k,0) = source_x; generalAD_array(i,j,k,1) = source_y; + generalAD_array(i,j,k,2) = source_z; }); } } diff --git a/Source/WindFarmParametrization/GeneralActuatorDisk/ERF_GeneralAD.H b/Source/WindFarmParametrization/GeneralActuatorDisk/ERF_GeneralAD.H index f3ab40227..593b16a48 100644 --- a/Source/WindFarmParametrization/GeneralActuatorDisk/ERF_GeneralAD.H +++ b/Source/WindFarmParametrization/GeneralActuatorDisk/ERF_GeneralAD.H @@ -23,6 +23,11 @@ public: const amrex::MultiFab& mf_Nturb, const amrex::MultiFab& mf_SMark) override; + void compute_freestream_velocity (const amrex::MultiFab& cons_in, + const amrex::MultiFab& U_old, + const amrex::MultiFab& V_old, + const amrex::MultiFab& mf_SMark); + void source_terms_cellcentered (const amrex::Geometry& geom, const amrex::MultiFab& cons_in, const amrex::MultiFab& mf_Smark, @@ -32,6 +37,7 @@ public: amrex::MultiFab& cons_in, amrex::MultiFab& U_old, amrex::MultiFab& V_old, + amrex::MultiFab& W_old, const amrex::MultiFab& mf_vars); protected: @@ -40,6 +46,9 @@ protected: amrex::Real hub_height, rotor_rad, thrust_coeff_standing, nominal_power; amrex::Vector wind_speed, thrust_coeff, power; amrex::Vector freestream_velocity, freestream_phi, disk_cell_count; + amrex::Vector bld_rad_loc, bld_twist, bld_chord; + amrex::Vector> bld_airfoil_aoa, bld_airfoil_Cl, bld_airfoil_Cd; + amrex::Vector velocity, C_P, C_T, rotor_RPM, blade_pitch; }; #endif diff --git a/Source/WindFarmParametrization/Null/ERF_NullWindFarm.H b/Source/WindFarmParametrization/Null/ERF_NullWindFarm.H index 934832b19..2daea0aa5 100644 --- a/Source/WindFarmParametrization/Null/ERF_NullWindFarm.H +++ b/Source/WindFarmParametrization/Null/ERF_NullWindFarm.H @@ -49,6 +49,37 @@ public: m_turb_disk_angle = turb_disk_angle; } + virtual void set_blade_spec(const amrex::Vector& bld_rad_loc, + const amrex::Vector& bld_twist, + const amrex::Vector& bld_chord) + { + m_bld_rad_loc = bld_rad_loc; + m_bld_twist = bld_twist; + m_bld_chord = bld_chord; + } + + virtual void set_blade_airfoil_spec(const amrex::Vector>& bld_airfoil_aoa, + const amrex::Vector>& bld_airfoil_Cl, + const amrex::Vector>& bld_airfoil_Cd) + { + m_bld_airfoil_aoa = bld_airfoil_aoa; + m_bld_airfoil_Cl = bld_airfoil_Cl; + m_bld_airfoil_Cd = bld_airfoil_Cd; + } + + virtual void set_turb_spec_extra(const amrex::Vector& velocity, + const amrex::Vector& C_P, + const amrex::Vector& C_T, + const amrex::Vector& rotor_RPM, + const amrex::Vector& blade_pitch) + { + m_velocity = velocity; + m_C_P = C_P; + m_C_T = C_T; + m_rotor_RPM = rotor_RPM; + m_blade_pitch = blade_pitch; + } + void get_turb_spec (amrex::Real& rotor_rad, amrex::Real& hub_height, amrex::Real& thrust_coeff_standing, amrex::Vector& wind_speed, amrex::Vector& thrust_coeff, amrex::Vector& power) @@ -73,6 +104,36 @@ public: turb_disk_angle = m_turb_disk_angle; } + void get_blade_spec(amrex::Vector& bld_rad_loc, + amrex::Vector& bld_twist, + amrex::Vector& bld_chord) + { + bld_rad_loc = m_bld_rad_loc; + bld_twist = m_bld_twist; + bld_chord = m_bld_chord; + } + + void get_blade_airfoil_spec(amrex::Vector>& bld_airfoil_aoa, + amrex::Vector>& bld_airfoil_Cl, + amrex::Vector>& bld_airfoil_Cd) + { + bld_airfoil_aoa = m_bld_airfoil_aoa; + bld_airfoil_Cl = m_bld_airfoil_Cl; + bld_airfoil_Cd = m_bld_airfoil_Cd; + } + + void get_turb_spec_extra(amrex::Vector& velocity, + amrex::Vector& C_P, + amrex::Vector& C_T, + amrex::Vector& rotor_RPM, + amrex::Vector& blade_pitch) + { + velocity = m_velocity; + C_P = m_C_P; + C_T = m_C_T; + rotor_RPM = m_rotor_RPM; + blade_pitch = m_blade_pitch; + } static AMREX_GPU_DEVICE bool find_if_marked(amrex::Real x1, amrex::Real x2, amrex::Real y1, amrex::Real y2, @@ -121,6 +182,9 @@ protected: amrex::Real m_turb_disk_angle; amrex::Real m_hub_height, m_rotor_rad, m_thrust_coeff_standing, m_nominal_power; amrex::Vector m_wind_speed, m_thrust_coeff, m_power; + amrex::Vector m_bld_rad_loc, m_bld_twist, m_bld_chord; + amrex::Vector> m_bld_airfoil_aoa, m_bld_airfoil_Cl, m_bld_airfoil_Cd; + amrex::Vector m_velocity, m_C_P, m_C_T, m_rotor_RPM, m_blade_pitch; }; From 966119d9212ea7a259153d765f9cdecf510ec30d Mon Sep 17 00:00:00 2001 From: Ann Almgren Date: Thu, 17 Oct 2024 08:02:56 -0700 Subject: [PATCH 21/35] make default be anelastic off (#1893) --- Exec/RegTests/DensityCurrent/inputs_crse_halfdomain | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Exec/RegTests/DensityCurrent/inputs_crse_halfdomain b/Exec/RegTests/DensityCurrent/inputs_crse_halfdomain index ef296b8fd..4a0a211fc 100644 --- a/Exec/RegTests/DensityCurrent/inputs_crse_halfdomain +++ b/Exec/RegTests/DensityCurrent/inputs_crse_halfdomain @@ -1,13 +1,13 @@ # ------------------ INPUTS TO MAIN PROGRAM ------------------- stop_time = 900.0 -erf.anelastic = 1 -erf.check_file = chka -erf.plot_file_1 = plta +#erf.anelastic = 1 +#erf.check_file = chka +#erf.plot_file_1 = plta -#erf.anelastic = 0 -#erf.check_file = chk -#erf.plot_file_1 = plt +erf.anelastic = 0 +erf.check_file = chk +erf.plot_file_1 = plt erf.buoyancy_type = 2 From fd923adff6c884612c1fe228319907c56667cdab Mon Sep 17 00:00:00 2001 From: Ann Almgren Date: Thu, 17 Oct 2024 14:46:03 -0700 Subject: [PATCH 22/35] make init_type an InitType enum (#1894) --- Source/BoundaryConditions/ERF_FillPatch.cpp | 4 +- Source/ERF.H | 14 ++++-- Source/ERF.cpp | 43 +++++++------------ Source/ERF_Tagging.cpp | 4 +- Source/ERF_make_new_arrays.cpp | 2 +- Source/ERF_make_new_level.cpp | 16 +++---- Source/ERF_prob_common.H | 2 +- Source/IO/ERF_Checkpoint.cpp | 4 +- .../Initialization/ERF_init_from_wrfinput.cpp | 4 +- 9 files changed, 44 insertions(+), 49 deletions(-) diff --git a/Source/BoundaryConditions/ERF_FillPatch.cpp b/Source/BoundaryConditions/ERF_FillPatch.cpp index cce4a2977..8c7b369d4 100644 --- a/Source/BoundaryConditions/ERF_FillPatch.cpp +++ b/Source/BoundaryConditions/ERF_FillPatch.cpp @@ -208,7 +208,7 @@ ERF::FillPatch (int lev, Real time, if (m_r2d) fill_from_bndryregs(mfs_vel,time); - // We call these even if init_type == real because these will fill the vertical bcs + // We call these even if init_type == InitType::Real because these will fill the vertical bcs // Note that we call FillBoundary inside the physbcs call (*physbcs_cons[lev])(*mfs_vel[Vars::cons],icomp_cons,ncomp_cons,ngvect_cons,time,BCVars::cons_bc, do_fb); if (!cons_only) { @@ -418,7 +418,7 @@ ERF::FillIntermediatePatch (int lev, Real time, if (m_r2d) fill_from_bndryregs(mfs_vel,time); - // We call this even if init_type == real because this routine will fill the vertical bcs + // We call this even if init_type == InitType::Real because this routine will fill the vertical bcs (*physbcs_cons[lev])(*mfs_vel[Vars::cons],icomp_cons,ncomp_cons,ngvect_cons,time,BCVars::cons_bc, do_fb); if (!cons_only) { (*physbcs_u[lev])(*mfs_vel[Vars::xvel],0,1,ngvect_vels,time,BCVars::xvel_bc, do_fb); diff --git a/Source/ERF.H b/Source/ERF.H index e9ed7ad52..d4f19f592 100644 --- a/Source/ERF.H +++ b/Source/ERF.H @@ -66,6 +66,13 @@ class MultiBlockContainer; #endif +/** + * Enum of possible initialization types +*/ +AMREX_ENUM(InitType, + None, Input_Sounding, Ideal, Real, Metgrid, Uniform +); + /** * Enum of possible coarse/fine interpolation options */ @@ -956,13 +963,12 @@ private: // Native or NetCDF static std::string plotfile_type; - // init_type: "ideal", "real", "input_sounding", "metgrid" or "" - static std::string init_type; + static InitType init_type; // sponge_type: "input_sponge" static std::string sponge_type; - // use_real_bcs: only true if 1) ( (init_type == real) or (init_type == metgrid) ) + // use_real_bcs: only true if 1) ( (init_type == InitType::Real) or (init_type == InitType::Metgrid) ) // AND 2) we want to use the bc's from the WRF bdy file static bool use_real_bcs; @@ -975,7 +981,7 @@ private: int real_set_width{0}; // Flag to trigger initialization from input_sounding like WRF's ideal.exe - // used with init_type == "input_sounding" + // used with init_type == InitType::Input_Sounding static bool init_sounding_ideal; // 1D CDF output (for ingestion in AMR-Wind) diff --git a/Source/ERF.cpp b/Source/ERF.cpp index 427582722..590cb8e27 100644 --- a/Source/ERF.cpp +++ b/Source/ERF.cpp @@ -43,10 +43,9 @@ int ERF::pert_interval = -1; // Native AMReX vs NetCDF std::string ERF::plotfile_type = "amrex"; -// init_type: "uniform", "ideal", "real", "input_sounding", "metgrid" or "" -std::string ERF::init_type; +InitType ERF::init_type; -// use_real_bcs: only true if 1) ( (init_type == real) or (init_type == metgrid) ) +// use_real_bcs: only true if 1) ( (init_type == InitType::Real) or (init_type == InitGrid::Metgrid) ) // AND 2) we want to use the bc's from the WRF bdy file bool ERF::use_real_bcs; @@ -610,7 +609,7 @@ ERF::InitData_post () { if (restart_chkfile.empty()) { if (solverChoice.use_terrain) { - if (init_type == "ideal") { + if (init_type == InitType::Ideal) { Abort("We do not currently support init_type = ideal with terrain"); } } @@ -818,7 +817,7 @@ ERF::InitData_post () solverChoice.rayleigh_damp_W ||solverChoice.rayleigh_damp_T) { initRayleigh(); - if (init_type == "input_sounding") + if (init_type == InitType::Input_Sounding) { // Overwrite ubar, vbar, and thetabar with input profiles; // wbar is assumed to be 0. Note: the tau coefficient set by @@ -1250,7 +1249,7 @@ ERF::init_only (int lev, Real time) // Map the words in the inputs file to BC types, then translate // those types into what they mean for each variable // This must be called before initHSE (where the base state is initialized) - if (lev == 0 && init_type != "ideal") { + if (lev == 0 && init_type != InitType::Ideal) { init_bcs(); } @@ -1267,7 +1266,7 @@ ERF::init_only (int lev, Real time) lev_new[Vars::zvel].setVal(0.0); lev_old[Vars::zvel].setVal(0.0); // Initialize background flow (optional) - if (init_type == "input_sounding") { + if (init_type == InitType::Input_Sounding) { // The base state is initialized by integrating vertically through the // input sounding, if the init_sounding_ideal flag is set; otherwise // it is set by initHSE() @@ -1288,23 +1287,23 @@ ERF::init_only (int lev, Real time) } #ifdef ERF_USE_NETCDF - } else if (init_type == "ideal" || init_type == "real") { + } else if (init_type == InitType::Ideal || init_type == InitType::Real) { // The base state is initialized from WRF wrfinput data, output by // ideal.exe or real.exe init_from_wrfinput(lev); // The physbc's need the terrain but are needed for initHSE - if (init_type == "ideal") { + if (init_type == InitType::Ideal) { make_physbcs(lev); initHSE(lev); } - } else if (init_type == "metgrid") { + } else if (init_type == InitType::Metgrid) { // The base state is initialized from data output by WPS metgrid; // we will rebalance after interpolation init_from_metgrid(lev); #endif - } else if (init_type == "uniform") { + } else if (init_type == InitType::Uniform) { // Initialize a uniform background field and base state based on the // problem-specified reference density and temperature @@ -1419,11 +1418,12 @@ ERF::ReadParameters () pp.query("fixed_mri_dt_ratio", fixed_mri_dt_ratio); // How to initialize - pp.query("init_type",init_type); + init_type = InitType::None; + pp.query_enum_case_insensitive("init_type",init_type); // Should we use the bcs we've read in from wrfbdy or metgrid files? // We default to yes if we have them, but the user can override that option - use_real_bcs = ( (init_type == "real") || (init_type == "metgrid") ); + use_real_bcs = ( (init_type == InitType::Real) || (init_type == InitType::Metgrid) ); pp.query("use_real_bcs",use_real_bcs); // We use this to keep track of how many boxes we read in from WRF initialization @@ -1530,7 +1530,7 @@ ERF::ReadParameters () // No moving terrain with init real (we must do this after init_params // because that is where we set terrain_type - if (init_type == "real" && solverChoice.terrain_type == TerrainType::Moving) { + if (init_type == InitType::Real && solverChoice.terrain_type == TerrainType::Moving) { Abort("Moving terrain is not supported with init real"); } @@ -1562,8 +1562,8 @@ ERF::ParameterSanityChecks () { AMREX_ALWAYS_ASSERT(cfl > 0. || fixed_dt[0] > 0.); - // We don't allow use_real_bcs to be true if init_type is not either real or metgrid - AMREX_ALWAYS_ASSERT(!use_real_bcs || ((init_type == "real") || (init_type == "metgrid")) ); + // We don't allow use_real_bcs to be true if init_type is not either InitType::Rreal or InitType::Metgrid + AMREX_ALWAYS_ASSERT(!use_real_bcs || ((init_type == InitType::Real) || (init_type == InitType::Metgrid)) ); AMREX_ALWAYS_ASSERT(real_width >= 0); AMREX_ALWAYS_ASSERT(real_set_width >= 0); @@ -1590,17 +1590,6 @@ ERF::ParameterSanityChecks () Abort("Dont know this plotfile_type"); } - // Enforce the init_type is one we know - if (!init_type.empty() && - init_type != "uniform" && - init_type != "ideal" && - init_type != "real" && - init_type != "metgrid" && - init_type != "input_sounding") - { - Error("if specified, init_type must be uniform, ideal, real, metgrid or input_sounding"); - } - // If fixed_mri_dt_ratio is set, it must be even if (fixed_mri_dt_ratio > 0 && (fixed_mri_dt_ratio%2 != 0) ) { diff --git a/Source/ERF_Tagging.cpp b/Source/ERF_Tagging.cpp index 5bfb5f08c..2203ac2bb 100644 --- a/Source/ERF_Tagging.cpp +++ b/Source/ERF_Tagging.cpp @@ -223,7 +223,7 @@ ERF::refinement_criteria_setup () boxes_at_level[lev_for_box].push_back(bx); Print() << "Saving in 'boxes at level' as " << bx << std::endl; } // lev - if (init_type == "real" || init_type == "metgrid") { + if (init_type == InitType::Real || init_type == InitType::Metgrid) { if (num_boxes_at_level[lev_for_box] != num_files_at_level[lev_for_box]) { amrex::Error("Number of boxes doesn't match number of input files"); @@ -261,7 +261,7 @@ ERF::refinement_criteria_setup () boxes_at_level[lev_for_box].push_back(bx); Print() << "Saving in 'boxes at level' as " << bx << std::endl; } // lev - if (init_type == "real" || init_type == "metgrid") { + if (init_type == InitType::Real || init_type == InitType::Metgrid) { if (num_boxes_at_level[lev_for_box] != num_files_at_level[lev_for_box]) { amrex::Error("Number of boxes doesn't match number of input files"); diff --git a/Source/ERF_make_new_arrays.cpp b/Source/ERF_make_new_arrays.cpp index a20f4517e..78a249141 100644 --- a/Source/ERF_make_new_arrays.cpp +++ b/Source/ERF_make_new_arrays.cpp @@ -445,7 +445,7 @@ ERF::init_zphys (int lev, Real time) { if (solverChoice.use_terrain) { - if (init_type != "real" && init_type != "metgrid") + if (init_type != InitType::Real && init_type != InitType::Metgrid) { if (lev > 0) { // diff --git a/Source/ERF_make_new_level.cpp b/Source/ERF_make_new_level.cpp index 7fbcae895..64e458e80 100644 --- a/Source/ERF_make_new_level.cpp +++ b/Source/ERF_make_new_level.cpp @@ -47,7 +47,7 @@ void ERF::MakeNewLevelFromScratch (int lev, Real time, const BoxArray& ba_in, // Define dmap[lev] to be dm SetDistributionMap(lev, dm); - // amrex::Print() <<" BA FROM SCRATCH AT LEVEL " << lev << " " << ba << std::endl; + amrex::Print() <<" BA FROM SCRATCH AT LEVEL " << lev << " " << ba << std::endl; if (lev == 0) init_bcs(); @@ -113,14 +113,14 @@ void ERF::MakeNewLevelFromScratch (int lev, Real time, const BoxArray& ba_in, // ******************************************************************************************** // Initialize the data itself - // If (init_type == "real") then we are initializing terrain and the initial data in - // the same call so we must call init_only before update_terrain_arrays - // If (init_type != "real") then we want to initialize the terrain before the initial data - // since we may need to use the grid information before constructing - // initial idealized data + // If (init_type == InitType::Real) then we are initializing terrain and the initial data in + // the same call so we must call init_only before update_terrain_arrays + // If (init_type != InitType::Real) then we want to initialize the terrain before the initial data + // since we may need to use the grid information before constructing + // initial idealized data // ******************************************************************************************** if (restart_chkfile.empty()) { - if ((init_type == "real") || (init_type == "metgrid")) { + if ((init_type == InitType::Real) || (init_type == InitType::Metgrid)) { init_only(lev, start_time); init_zphys(lev, time); update_terrain_arrays(lev); @@ -128,7 +128,7 @@ void ERF::MakeNewLevelFromScratch (int lev, Real time, const BoxArray& ba_in, } else { init_zphys(lev, time); update_terrain_arrays(lev); - // Note that for init_type != real or metgrid, + // Note that for init_type != InitType::Real or InitType::Metgrid, // make_physbcs is called inside init_only init_only(lev, start_time); } diff --git a/Source/ERF_prob_common.H b/Source/ERF_prob_common.H index 070835c63..b9318abc2 100644 --- a/Source/ERF_prob_common.H +++ b/Source/ERF_prob_common.H @@ -468,7 +468,7 @@ protected: /** * Function to update default base parameters, currently only used for - * init_type=='uniform' + * init_type == InitType::Uniform */ void init_base_parms (amrex::Real rho_0, amrex::Real T_0) { base_parms.rho_0 = rho_0; diff --git a/Source/IO/ERF_Checkpoint.cpp b/Source/IO/ERF_Checkpoint.cpp index e67032d59..7a3452a51 100644 --- a/Source/IO/ERF_Checkpoint.cpp +++ b/Source/IO/ERF_Checkpoint.cpp @@ -221,7 +221,7 @@ ERF::WriteCheckpointFile () const #ifdef ERF_USE_NETCDF // Write bdy_data files - if (ParallelDescriptor::IOProcessor() && ((init_type=="real") || (init_type=="metgrid"))) { + if (ParallelDescriptor::IOProcessor() && ((init_type==InitType::Real) || (init_type==InitType::Metgrid))) { // Vector dimensions int num_time = bdy_data_xlo.size(); @@ -462,7 +462,7 @@ ERF::ReadCheckpointFile () #ifdef ERF_USE_NETCDF // Read bdy_data files - if ((init_type=="real") || (init_type=="metgrid")) { + if ((init_type==InitType::Real) || (init_type==InitType::Metgrid)) { int ioproc = ParallelDescriptor::IOProcessorNumber(); // I/O rank int num_time; int num_var; diff --git a/Source/Initialization/ERF_init_from_wrfinput.cpp b/Source/Initialization/ERF_init_from_wrfinput.cpp index 7c3a1d062..3e9cef97e 100644 --- a/Source/Initialization/ERF_init_from_wrfinput.cpp +++ b/Source/Initialization/ERF_init_from_wrfinput.cpp @@ -277,7 +277,7 @@ ERF::init_from_wrfinput (int lev) IntVect ng = p_hse.nGrowVect(); const Real l_rdOcp = solverChoice.rdOcp; - if (init_type == "real") { + if (init_type == InitType::Real) { for ( MFIter mfi(lev_new[Vars::cons], TilingIfNotGPU()); mfi.isValid(); ++mfi ) { FArrayBox& cons_fab = lev_new[Vars::cons][mfi]; @@ -297,7 +297,7 @@ ERF::init_from_wrfinput (int lev) pi_hse.FillBoundary(geom[lev].periodicity()); } - if (init_type == "real" && (lev == 0)) { + if (init_type == InitType::Real && (lev == 0)) { if (nc_bdy_file.empty()) { amrex::Error("NetCDF boundary file name must be provided via input"); } From 1cbd7034660ff03ab689746a82201b95af044801 Mon Sep 17 00:00:00 2001 From: Ann Almgren Date: Fri, 18 Oct 2024 08:55:05 -0700 Subject: [PATCH 23/35] fix compile (#1895) --- Source/TimeIntegration/ERF_TI_slow_rhs_fun.H | 6 ++---- Source/Utils/ERF_InteriorGhostCells.cpp | 4 +--- Source/Utils/ERF_Utils.H | 3 +-- 3 files changed, 4 insertions(+), 9 deletions(-) diff --git a/Source/TimeIntegration/ERF_TI_slow_rhs_fun.H b/Source/TimeIntegration/ERF_TI_slow_rhs_fun.H index c9f963c68..994379325 100644 --- a/Source/TimeIntegration/ERF_TI_slow_rhs_fun.H +++ b/Source/TimeIntegration/ERF_TI_slow_rhs_fun.H @@ -249,8 +249,7 @@ // Populate RHS for relaxation zones if using real bcs if (use_real_bcs && (level == 0)) { if (real_width>0) { - realbdy_compute_interior_ghost_rhs(init_type, - bdy_time_interval, start_bdy_time, new_stage_time, slow_dt, + realbdy_compute_interior_ghost_rhs(bdy_time_interval, start_bdy_time, new_stage_time, slow_dt, real_width, real_set_width, fine_geom, S_rhs, S_old, S_data, bdy_data_xlo, bdy_data_xhi, @@ -459,8 +458,7 @@ // Populate RHS for relaxation zones if using real bcs if (use_real_bcs && (level == 0)) { if (real_width>0) { - realbdy_compute_interior_ghost_rhs(init_type, - bdy_time_interval, start_bdy_time, new_stage_time, slow_dt, + realbdy_compute_interior_ghost_rhs(bdy_time_interval, start_bdy_time, new_stage_time, slow_dt, real_width, real_set_width, fine_geom, S_rhs, S_old, S_data, bdy_data_xlo, bdy_data_xhi, diff --git a/Source/Utils/ERF_InteriorGhostCells.cpp b/Source/Utils/ERF_InteriorGhostCells.cpp index 1cdfafcc7..76a57beea 100644 --- a/Source/Utils/ERF_InteriorGhostCells.cpp +++ b/Source/Utils/ERF_InteriorGhostCells.cpp @@ -89,7 +89,6 @@ compute_interior_ghost_bxs_xy (const Box& bx, /** * Compute the RHS in the relaxation zone * - * @param[in] init_type initialization method for this simulation * @param[in] bdy_time_interval time interval between boundary condition time stamps * @param[in] time current time * @param[in] delta_t timestep @@ -105,8 +104,7 @@ compute_interior_ghost_bxs_xy (const Box& bx, * @param[in] start_bdy_time time of the first boundary data read in */ void -realbdy_compute_interior_ghost_rhs (const std::string& /*init_type*/, - const Real& bdy_time_interval, +realbdy_compute_interior_ghost_rhs (const Real& bdy_time_interval, const Real& start_bdy_time, const Real& time, const Real& delta_t, diff --git a/Source/Utils/ERF_Utils.H b/Source/Utils/ERF_Utils.H index 0362866b9..f713347f2 100644 --- a/Source/Utils/ERF_Utils.H +++ b/Source/Utils/ERF_Utils.H @@ -88,8 +88,7 @@ void compute_interior_ghost_bxs_xy (const amrex::Box& bx, /* * Compute relaxation region RHS with wrfbdy */ -void realbdy_compute_interior_ghost_rhs (const std::string& init_type, - const amrex::Real& bdy_time_interval, +void realbdy_compute_interior_ghost_rhs (const amrex::Real& bdy_time_interval, const amrex::Real& start_bdy_time, const amrex::Real& time, const amrex::Real& delta_t, From 6a3cdfbe82b7f2a4dca151a862a544873fe64563 Mon Sep 17 00:00:00 2001 From: Ann Almgren Date: Fri, 18 Oct 2024 10:27:46 -0700 Subject: [PATCH 24/35] include fewer files with POISSON build (#1896) --- CMake/SetAmrexOptions.cmake | 2 ++ Exec/Make.ERF | 4 +++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/CMake/SetAmrexOptions.cmake b/CMake/SetAmrexOptions.cmake index c902bef72..9c43e753a 100644 --- a/CMake/SetAmrexOptions.cmake +++ b/CMake/SetAmrexOptions.cmake @@ -30,6 +30,8 @@ set(AMReX_FORTRAN OFF) set(AMReX_LINEAR_SOLVERS OFF) if(ERF_ENABLE_POISSON_SOLVE) set(AMReX_LINEAR_SOLVERS ON) + set(AMReX_LINEAR_SOLVERS_EM OFF) + set(AMReX_LINEAR_SOLVERS_INCFLO OFF) endif() set(AMReX_PARTICLES OFF) diff --git a/Exec/Make.ERF b/Exec/Make.ERF index 6c8a8328e..a704e7b69 100644 --- a/Exec/Make.ERF +++ b/Exec/Make.ERF @@ -112,7 +112,9 @@ AMReXdirs += EB endif ifeq ($(USE_POISSON_SOLVE),TRUE) -AMReXdirs += LinearSolvers/MLMG +USE_LINEAR_SOLVERS_INCFLO = FALSE +USE_LINEAR_SOLVERS_EM = FALSE +AMReXdirs += LinearSolvers endif ifeq ($(USE_HDF5),TRUE) From 18457a8d6348a8a3a149fd3a25fd81c7cbc19269 Mon Sep 17 00:00:00 2001 From: Mukul Dave Date: Sat, 19 Oct 2024 20:00:38 -0700 Subject: [PATCH 25/35] add get_dt accessor function for multiblock (#1898) * add get_dt accessor function for multiblock * add level as input to accessors --- Source/ERF.H | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/Source/ERF.H b/Source/ERF.H index d4f19f592..e3e5d0c1f 100644 --- a/Source/ERF.H +++ b/Source/ERF.H @@ -375,9 +375,10 @@ public: // Advance a block specified number of time steps void Evolve_MB (int MBstep, int max_block_step); - // get the current time values - amrex::Real get_t_old() {return t_old[0];} - amrex::Real get_t_new() {return t_new[0];} + // get the current time values and dt + amrex::Real get_t_old (int lev) { return t_old[lev]; } + amrex::Real get_t_new (int lev) { return t_new[lev]; } + amrex::Real get_dt (int lev) { return dt[lev]; } // Set parmparse prefix for MultiBlock void SetParmParsePrefix (std::string name) { pp_prefix = name; } From feb78433e0d2df2a66abe1e5e47fe0bf06ef3767 Mon Sep 17 00:00:00 2001 From: Ann Almgren Date: Sat, 19 Oct 2024 22:07:14 -0700 Subject: [PATCH 26/35] add option for explicit substepping (#1899) * add option for explicit substepping * update location of Radiation dir * clean up fast routines a little * remove unused --- Docs/sphinx_doc/TimeAdvance.rst | 14 +- Exec/CMakeLists.txt | 6 +- Exec/{ => DevTests}/Radiation/CMakeLists.txt | 0 Exec/{ => DevTests}/Radiation/ERF_prob.H | 0 Exec/{ => DevTests}/Radiation/ERF_prob.cpp | 0 Exec/{ => DevTests}/Radiation/GNUmakefile | 0 Exec/{ => DevTests}/Radiation/Make.package | 0 Exec/{ => DevTests}/Radiation/README | 0 .../{ => DevTests}/Radiation/inputs_radiation | 0 Source/TimeIntegration/ERF_MRI.H | 4 + Source/TimeIntegration/ERF_TI_fast_headers.H | 9 +- Source/TimeIntegration/ERF_TI_fast_rhs_fun.H | 20 +- Source/TimeIntegration/ERF_advance_dycore.cpp | 1 + Source/TimeIntegration/ERF_fast_rhs_MT.cpp | 65 +-- Source/TimeIntegration/ERF_fast_rhs_N.cpp | 409 ++++++++++-------- Source/TimeIntegration/ERF_fast_rhs_T.cpp | 55 +-- 16 files changed, 322 insertions(+), 261 deletions(-) rename Exec/{ => DevTests}/Radiation/CMakeLists.txt (100%) rename Exec/{ => DevTests}/Radiation/ERF_prob.H (100%) rename Exec/{ => DevTests}/Radiation/ERF_prob.cpp (100%) rename Exec/{ => DevTests}/Radiation/GNUmakefile (100%) rename Exec/{ => DevTests}/Radiation/Make.package (100%) rename Exec/{ => DevTests}/Radiation/README (100%) rename Exec/{ => DevTests}/Radiation/inputs_radiation (100%) diff --git a/Docs/sphinx_doc/TimeAdvance.rst b/Docs/sphinx_doc/TimeAdvance.rst index e6d12ef33..872c41409 100644 --- a/Docs/sphinx_doc/TimeAdvance.rst +++ b/Docs/sphinx_doc/TimeAdvance.rst @@ -135,8 +135,14 @@ Then the acoustic substepping evolves the equations in the form - \frac{\partial (\beta_1 W^{\prime \prime, \tau} + \beta_2 W^{\prime \prime, \tau + \delta \tau})}{\partial z} + R^t_{\rho} \right) -where :math:`\beta_1 = 0.5 (1 - \beta_s)` and :math:`\beta_2 = 0.5 (1 + \beta_s)` with :math:`\beta_s = 0.1`. -:math:`\beta_s` is the acoustic step off-centering coefficient and 0.1 is the typical WRF value. This off-centering is intended to provide damping of both horizontally and vertically propagating sound waves by biasing the time average toward the future time step. +where :math:`\beta_1 = 0.5 (1 - \beta_s)` and :math:`\beta_2 = 0.5 (1 + \beta_s)`. + +:math:`\beta_s` is the acoustic step off-centering coefficient. When we do implicit substepping, we use +the typical WRF value of 0.1. This off-centering is intended to provide damping of both horizontally +and vertically propagating sound waves by biasing the time average toward the future time step. + +When we do fully explicit substepping, we set :math:`\beta_s = -1.0`, which sets +:math:`\beta_1 = 1` and :math:`\beta_2 = 0`. To solve the coupled system, we first evolve the equations for :math:`U^{\prime \prime, \tau + \delta \tau}` and :math:`V^{\prime \prime, \tau + \delta \tau}` explicitly using :math:`\Theta^{\prime \prime, \tau}` which is already known. @@ -149,10 +155,10 @@ to control horizontally propagating sound waves. .. math:: p^{\prime\prime,\tau*} = p^{\prime\prime,\tau} - + \beta_d \left( p^{\prime\prime,\tau} + p^{\prime\prime,\tau-\delta\tau} \right) + + \beta_d \left( p^{\prime\prime,\tau} - p^{\prime\prime,\tau-\delta\tau} \right) where :math:`\tau*` is the forward projected value used in RHS of the acoustic substepping equations for horizontal momentum. According to Skamarock et al, -This is equivalent to including a horizontal diffusion term in the continuity +this is equivalent to including a horizontal diffusion term in the continuity equation. A typical damping coefficient of :math:`\beta_d = 0.1` is used, as in WRF. diff --git a/Exec/CMakeLists.txt b/Exec/CMakeLists.txt index fd00cc297..a5b384ebd 100644 --- a/Exec/CMakeLists.txt +++ b/Exec/CMakeLists.txt @@ -20,7 +20,6 @@ elseif (ERF_ENABLE_REGRESSION_TESTS_ONLY) else () add_subdirectory(ABL) add_subdirectory(SuperCell) - add_subdirectory(Radiation) add_subdirectory(SquallLine_2D) add_subdirectory(RegTests/Bubble) add_subdirectory(RegTests/Couette_Poiseuille) @@ -35,9 +34,10 @@ else () add_subdirectory(RegTests/WPS_Test) add_subdirectory(RegTests/Bomex) add_subdirectory(RegTests/TurbulentInflow) - add_subdirectory(DevTests/MovingTerrain) - add_subdirectory(DevTests/MetGrid) add_subdirectory(DevTests/LandSurfaceModel) + add_subdirectory(DevTests/MetGrid) + add_subdirectory(DevTests/MovingTerrain) + add_subdirectory(DevTests/Radiation) add_subdirectory(DevTests/TemperatureSource) add_subdirectory(DevTests/TropicalCyclone) endif() diff --git a/Exec/Radiation/CMakeLists.txt b/Exec/DevTests/Radiation/CMakeLists.txt similarity index 100% rename from Exec/Radiation/CMakeLists.txt rename to Exec/DevTests/Radiation/CMakeLists.txt diff --git a/Exec/Radiation/ERF_prob.H b/Exec/DevTests/Radiation/ERF_prob.H similarity index 100% rename from Exec/Radiation/ERF_prob.H rename to Exec/DevTests/Radiation/ERF_prob.H diff --git a/Exec/Radiation/ERF_prob.cpp b/Exec/DevTests/Radiation/ERF_prob.cpp similarity index 100% rename from Exec/Radiation/ERF_prob.cpp rename to Exec/DevTests/Radiation/ERF_prob.cpp diff --git a/Exec/Radiation/GNUmakefile b/Exec/DevTests/Radiation/GNUmakefile similarity index 100% rename from Exec/Radiation/GNUmakefile rename to Exec/DevTests/Radiation/GNUmakefile diff --git a/Exec/Radiation/Make.package b/Exec/DevTests/Radiation/Make.package similarity index 100% rename from Exec/Radiation/Make.package rename to Exec/DevTests/Radiation/Make.package diff --git a/Exec/Radiation/README b/Exec/DevTests/Radiation/README similarity index 100% rename from Exec/Radiation/README rename to Exec/DevTests/Radiation/README diff --git a/Exec/Radiation/inputs_radiation b/Exec/DevTests/Radiation/inputs_radiation similarity index 100% rename from Exec/Radiation/inputs_radiation rename to Exec/DevTests/Radiation/inputs_radiation diff --git a/Source/TimeIntegration/ERF_MRI.H b/Source/TimeIntegration/ERF_MRI.H index 58302b1a9..0a38cc63c 100644 --- a/Source/TimeIntegration/ERF_MRI.H +++ b/Source/TimeIntegration/ERF_MRI.H @@ -273,6 +273,10 @@ public: nsubsteps = 1; dtau = timestep; } else { nsubsteps = substep_ratio; dtau = sub_timestep; + + // STRT HACK -- this hack can be used to approximate the no-substepping algorithm + // nsubsteps = 1; dtau = timestep; + // END HACK } time_stage = time + timestep; } diff --git a/Source/TimeIntegration/ERF_TI_fast_headers.H b/Source/TimeIntegration/ERF_TI_fast_headers.H index 4504db371..5c470d9da 100644 --- a/Source/TimeIntegration/ERF_TI_fast_headers.H +++ b/Source/TimeIntegration/ERF_TI_fast_headers.H @@ -37,7 +37,8 @@ void erf_fast_rhs_N (int step, int nrk, int level, int finest_level, std::unique_ptr& mapfac_v, amrex::YAFluxRegister* fr_as_crse, amrex::YAFluxRegister* fr_as_fine, - bool l_use_moisture, bool l_reflux); + bool l_use_moisture, bool l_reflux, + bool l_implicit_substepping); /** * Function for computing the fast RHS with fixed terrain @@ -64,7 +65,8 @@ void erf_fast_rhs_T (int step, int nrk, int level, int finest_level, std::unique_ptr& mapfac_v, amrex::YAFluxRegister* fr_as_crse, amrex::YAFluxRegister* fr_as_fine, - bool l_use_moisture, bool l_reflux); + bool l_use_moisture, bool l_reflux, + bool l_implicit_substepping); /** * Function for computing the fast RHS with moving terrain @@ -98,7 +100,8 @@ void erf_fast_rhs_MT (int step, int nrk, int level, int finest_level, std::unique_ptr& mapfac_v, amrex::YAFluxRegister* fr_as_crse, amrex::YAFluxRegister* fr_as_fine, - bool l_use_moisture, bool l_reflux); + bool l_use_moisture, bool l_reflux, + bool l_implicit_substepping); /** * Function for computing the coefficients for the tridiagonal solver used in the fast diff --git a/Source/TimeIntegration/ERF_TI_fast_rhs_fun.H b/Source/TimeIntegration/ERF_TI_fast_rhs_fun.H index f61dba333..c3fa90a70 100644 --- a/Source/TimeIntegration/ERF_TI_fast_rhs_fun.H +++ b/Source/TimeIntegration/ERF_TI_fast_rhs_fun.H @@ -20,7 +20,13 @@ auto fast_rhs_fun = [&](int fast_step, int /*n_sub*/, int nrk, // Per p2902 of Klemp-Skamarock-Dudhia-2007 // beta_s = -1.0 : fully explicit // beta_s = 1.0 : fully implicit - Real beta_s = 0.1; + Real beta_s; + if (solverChoice.substepping_type[level] == SubsteppingType::Implicit) + { + beta_s = 0.1; + } else { // Fully explicit + beta_s = -1.0; + } // ************************************************************************* // Set up flux registers if using two_way coupling @@ -99,7 +105,7 @@ auto fast_rhs_fun = [&](int fast_step, int /*n_sub*/, int nrk, detJ_cc[level], detJ_cc_new[level], detJ_cc_src[level], dtau, beta_s, inv_fac, mapfac_m[level], mapfac_u[level], mapfac_v[level], - fr_as_crse, fr_as_fine, l_use_moisture, l_reflux); + fr_as_crse, fr_as_fine, l_use_moisture, l_reflux, l_implicit_substepping); } else { // If this is not the first substep we pass in S_data as the previous step's solution erf_fast_rhs_MT(fast_step, nrk, level, finest_level, @@ -111,7 +117,7 @@ auto fast_rhs_fun = [&](int fast_step, int /*n_sub*/, int nrk, detJ_cc[level], detJ_cc_new[level], detJ_cc_src[level], dtau, beta_s, inv_fac, mapfac_m[level], mapfac_u[level], mapfac_v[level], - fr_as_crse, fr_as_fine, l_use_moisture, l_reflux); + fr_as_crse, fr_as_fine, l_use_moisture, l_reflux, l_implicit_substepping); } } else if (solverChoice.use_terrain && solverChoice.terrain_type == TerrainType::Static) { if (fast_step == 0) { @@ -127,7 +133,7 @@ auto fast_rhs_fun = [&](int fast_step, int /*n_sub*/, int nrk, S_data, S_scratch, fine_geom, solverChoice.gravity, Omega, z_phys_nd[level], detJ_cc[level], dtau, beta_s, inv_fac, mapfac_m[level], mapfac_u[level], mapfac_v[level], - fr_as_crse, fr_as_fine, l_use_moisture, l_reflux); + fr_as_crse, fr_as_fine, l_use_moisture, l_reflux, l_implicit_substepping); } else { // If this is not the first substep we pass in S_data as the previous step's solution erf_fast_rhs_T(fast_step, nrk, level, finest_level, @@ -135,7 +141,7 @@ auto fast_rhs_fun = [&](int fast_step, int /*n_sub*/, int nrk, S_data, S_scratch, fine_geom, solverChoice.gravity, Omega, z_phys_nd[level], detJ_cc[level], dtau, beta_s, inv_fac, mapfac_m[level], mapfac_u[level], mapfac_v[level], - fr_as_crse, fr_as_fine, l_use_moisture, l_reflux); + fr_as_crse, fr_as_fine, l_use_moisture, l_reflux, l_implicit_substepping); } } else { if (fast_step == 0) { @@ -151,7 +157,7 @@ auto fast_rhs_fun = [&](int fast_step, int /*n_sub*/, int nrk, S_data, S_scratch, fine_geom, solverChoice.gravity, dtau, beta_s, inv_fac, mapfac_m[level], mapfac_u[level], mapfac_v[level], - fr_as_crse, fr_as_fine, l_use_moisture, l_reflux); + fr_as_crse, fr_as_fine, l_use_moisture, l_reflux, l_implicit_substepping); } else { // If this is not the first substep we pass in S_data as the previous step's solution erf_fast_rhs_N(fast_step, nrk, level, finest_level, @@ -159,7 +165,7 @@ auto fast_rhs_fun = [&](int fast_step, int /*n_sub*/, int nrk, S_data, S_scratch, fine_geom, solverChoice.gravity, dtau, beta_s, inv_fac, mapfac_m[level], mapfac_u[level], mapfac_v[level], - fr_as_crse, fr_as_fine, l_use_moisture, l_reflux); + fr_as_crse, fr_as_fine, l_use_moisture, l_reflux, l_implicit_substepping); } } diff --git a/Source/TimeIntegration/ERF_advance_dycore.cpp b/Source/TimeIntegration/ERF_advance_dycore.cpp index 4761c8646..8c78fcfb3 100644 --- a/Source/TimeIntegration/ERF_advance_dycore.cpp +++ b/Source/TimeIntegration/ERF_advance_dycore.cpp @@ -90,6 +90,7 @@ void ERF::advance_dycore(int level, bool l_use_kturb = ( (tc.les_type != LESType::None) || (tc.pbl_type != PBLType::None) ); bool l_use_moisture = ( solverChoice.moisture_type != MoistureType::None ); + bool l_implicit_substepping = ( solverChoice.substepping_type[level] == SubsteppingType::Implicit ); const bool use_most = (m_most != nullptr); const bool exp_most = (solverChoice.use_explicit_most); diff --git a/Source/TimeIntegration/ERF_fast_rhs_MT.cpp b/Source/TimeIntegration/ERF_fast_rhs_MT.cpp index 1ff3b524b..1843a7d8f 100644 --- a/Source/TimeIntegration/ERF_fast_rhs_MT.cpp +++ b/Source/TimeIntegration/ERF_fast_rhs_MT.cpp @@ -7,38 +7,40 @@ using namespace amrex; * Function for computing the fast RHS with moving terrain * * @param[in] step which fast time step within each Runge-Kutta step - * @param[in] nrk which Runge-Kutta step - * @param[in] level level of resolution - * @param[in] finest_level finest level of resolution - * @param[in] S_slow_rhs slow RHS computed in erf_slow_rhs_pre - * @param[in] S_prev previous solution - * @param[in] S_stg_data solution at previous RK stage - * @param[in] S_stg_prim primitive variables at previous RK stage - * @param[in] pi_stage Exner function at previous RK stage - * @param[in] fast_coeffs coefficients for the tridiagonal solve used in the fast integrator - * @param[out] S_data current solution - * @param[in] S_scratch scratch space - * @param[in] geom container for geometric information - * @param[in] gravity Magnitude of gravity - * @param[in] use_lagged_delta_rt define lagged_delta_rt for our next step - * @param[in] Omega component of the momentum normal to the z-coordinate surface - * @param[in] z_t_rk rate of change of grid height -- only relevant for moving terrain - * @param[in] z_t_pert rate of change of grid height -- interpolated between RK stages - * @param[in] z_phys_nd_old height coordinate at nodes at old time - * @param[in] z_phys_nd_new height coordinate at nodes at new time - * @param[in] z_phys_nd_stg height coordinate at nodes at previous stage - * @param[in] detJ_cc_old Jacobian of the metric transformation at old time - * @param[in] detJ_cc_new Jacobian of the metric transformation at new time - * @param[in] detJ_cc_stg Jacobian of the metric transformation at previous stage - * @param[in] dtau fast time step - * @param[in] beta_s Coefficient which determines how implicit vs explicit the solve is - * @param[in] facinv inverse factor for time-averaging the momenta - * @param[in] mapfac_m map factor at cell centers - * @param[in] mapfac_u map factor at x-faces - * @param[in] mapfac_v map factor at y-faces + * @param[in ] nrk which Runge-Kutta step + * @param[in ] level level of resolution + * @param[in ] finest_level finest level of resolution + * @param[in ] S_slow_rhs slow RHS computed in erf_slow_rhs_pre + * @param[in ] S_prev previous solution + * @param[in ] S_stg_data solution at previous RK stage + * @param[in ] S_stg_prim primitive variables at previous RK stage + * @param[in ] pi_stage Exner function at previous RK stage + * @param[in ] fast_coeffs coefficients for the tridiagonal solve used in the fast integrator + * @param[ out] S_data current solution + * @param[in ] S_scratch scratch space + * @param[in ] geom container for geometric information + * @param[in ] gravity Magnitude of gravity + * @param[in ] use_lagged_delta_rt define lagged_delta_rt for our next step + * @param[in ] Omega component of the momentum normal to the z-coordinate surface + * @param[in ] z_t_rk rate of change of grid height -- only relevant for moving terrain + * @param[in ] z_t_pert rate of change of grid height -- interpolated between RK stages + * @param[in ] z_phys_nd_old height coordinate at nodes at old time + * @param[in ] z_phys_nd_new height coordinate at nodes at new time + * @param[in ] z_phys_nd_stg height coordinate at nodes at previous stage + * @param[in ] detJ_cc_old Jacobian of the metric transformation at old time + * @param[in ] detJ_cc_new Jacobian of the metric transformation at new time + * @param[in ] detJ_cc_stg Jacobian of the metric transformation at previous stage + * @param[in ] dtau fast time step + * @param[in ] beta_s Coefficient which determines how implicit vs explicit the solve is + * @param[in ] facinv inverse factor for time-averaging the momenta + * @param[in ] mapfac_m map factor at cell centers + * @param[in ] mapfac_u map factor at x-faces + * @param[in ] mapfac_v map factor at y-faces * @param[inout] fr_as_crse YAFluxRegister at level l at level l / l+1 interface * @param[inout] fr_as_fine YAFluxRegister at level l at level l-1 / l interface - * @param[in] l_reflux should we add fluxes to the FluxRegisters? + * @param[in ] l_use_moisture + * @param[in ] l_reflux should we add fluxes to the FluxRegisters? + * @param[in ] l_implicit_substepping */ void erf_fast_rhs_MT (int step, int nrk, @@ -71,7 +73,8 @@ void erf_fast_rhs_MT (int step, int nrk, YAFluxRegister* fr_as_crse, YAFluxRegister* fr_as_fine, bool l_use_moisture, - bool l_reflux) + bool l_reflux, + bool /*l_implicit_substepping*/) { BL_PROFILE_REGION("erf_fast_rhs_MT()"); diff --git a/Source/TimeIntegration/ERF_fast_rhs_N.cpp b/Source/TimeIntegration/ERF_fast_rhs_N.cpp index fec38e38e..5bafd34bf 100644 --- a/Source/TimeIntegration/ERF_fast_rhs_N.cpp +++ b/Source/TimeIntegration/ERF_fast_rhs_N.cpp @@ -6,39 +6,41 @@ using namespace amrex; /** * Function for computing the fast RHS with no terrain * - * @param[in] step which fast time step within each Runge-Kutta step - * @param[in] nrk which Runge-Kutta step - * @param[in] level level of resolution - * @param[in] finest_level finest level of resolution - * @param[in] S_slow_rhs slow RHS computed in erf_slow_rhs_pre - * @param[in] S_prev previous solution - * @param[in] S_stage_data solution at previous RK stage - * @param[in] S_stage_prim primitive variables at previous RK stage - * @param[in] pi_stage Exner function at previous RK stage - * @param[in] fast_coeffs coefficients for the tridiagonal solve used in the fast integrator - * @param[out] S_data current solution - * @param[in] S_scratch scratch space - * @param[in] geom container for geometric information - * @param[in] gravity magnitude of gravity - * @param[in] dtau fast time step - * @param[in] beta_s Coefficient which determines how implicit vs explicit the solve is - * @param[in] facinv inverse factor for time-averaging the momenta - * @param[in] mapfac_m map factor at cell centers - * @param[in] mapfac_u map factor at x-faces - * @param[in] mapfac_v map factor at y-faces - * @param[inout] fr_as_crse YAFluxRegister at level l at level l / l+1 interface - * @param[inout] fr_as_fine YAFluxRegister at level l at level l-1 / l interface - * @param[in] l_reflux should we add fluxes to the FluxRegisters? + * @param[in ] step which fast time step within each Runge-Kutta step + * @param[in ] nrk which Runge-Kutta step + * @param[in ] level level of resolution + * @param[in ] finest_level finest level of resolution + * @param[in ] S_slow_rhs slow RHS computed in erf_slow_rhs_pre + * @param[in ] S_prev if step == 0, this is S_old, else the previous fast solution + * @param[in ] S_stage_data solution at previous RK stage + * @param[in ] S_stage_prim primitive variables at previous RK stage + * @param[in ] pi_stage Exner function at previous RK stage + * @param[in ] fast_coeffs coefficients for the tridiagonal solve used in the fast integrator + * @param[ out] S_data current solution + * @param[in ] S_scratch scratch space + * @param[in ] geom container for geometric information + * @param[in ] gravity magnitude of gravity + * @param[in ] dtau fast time step + * @param[in ] beta_s Coefficient which determines how implicit vs explicit the solve is + * @param[in ] facinv inverse factor for time-averaging the momenta + * @param[in ] mapfac_m map factor at cell centers + * @param[in ] mapfac_u map factor at x-faces + * @param[in ] mapfac_v map factor at y-faces + * @param[inout] fr_as_crse YAFluxRegister at level l at level l / l+1 interface + * @param[inout] fr_as_fine YAFluxRegister at level l at level l-1 / l interface + * @param[in ] l_use_moisture + * @param[in ] l_reflux should we add fluxes to the FluxRegisters? + * @param[in ] l_implicit_substepping */ void erf_fast_rhs_N (int step, int nrk, int level, int finest_level, Vector& S_slow_rhs, // the slow RHS already computed const Vector& S_prev, // if step == 0, this is S_old, else the previous solution - Vector& S_stage_data, // S_bar = S^n, S^* or S^** - const MultiFab& S_stage_prim, // Primitive version of S_stage_data[IntVars::cons] - const MultiFab& pi_stage, // Exner function evaluated at last stage - const MultiFab& fast_coeffs, // Coeffs for tridiagonal solve + Vector& S_stage_data, // S_stage = S^n, S^* or S^** + const MultiFab & S_stage_prim, // Primitive version of S_stage_data[IntVars::cons] + const MultiFab & pi_stage, // Exner function evaluated at last stage + const MultiFab &fast_coeffs, // Coeffs for tridiagonal solve Vector& S_data, // S_sum = most recent full solution Vector& S_scratch, // S_sum_old at most recent fast timestep for (rho theta) const Geometry geom, @@ -51,8 +53,13 @@ void erf_fast_rhs_N (int step, int nrk, YAFluxRegister* fr_as_crse, YAFluxRegister* fr_as_fine, bool l_use_moisture, - bool l_reflux) + bool l_reflux, + bool l_implicit_substepping) { + // + // NOTE: for step > 0, S_data and S_prev point to the same MultiFab data!! + // + BL_PROFILE_REGION("erf_fast_rhs_N()"); Real beta_1 = 0.5 * (1.0 - beta_s); // multiplies explicit terms @@ -71,9 +78,8 @@ void erf_fast_rhs_N (int step, int nrk, const auto& ba = S_stage_data[IntVars::cons].boxArray(); const auto& dm = S_stage_data[IntVars::cons].DistributionMap(); - MultiFab Delta_rho_w( convert(ba,IntVect(0,0,1)), dm, 1, IntVect(1,1,0)); - MultiFab Delta_rho ( ba , dm, 1, 1); MultiFab Delta_rho_theta( ba , dm, 1, 1); + MultiFab Delta_rho_w (convert(ba,IntVect(0,0,1)), dm, 1, IntVect(1,1,0)); MultiFab coeff_A_mf(fast_coeffs, make_alias, 0, 1); MultiFab inv_coeff_B_mf(fast_coeffs, make_alias, 1, 1); @@ -96,6 +102,9 @@ void erf_fast_rhs_N (int step, int nrk, MultiFab temp_cur_xmom(S_stage_data[IntVars::xmom].boxArray(),S_stage_data[IntVars::xmom].DistributionMap(),1,0); MultiFab temp_cur_ymom(S_stage_data[IntVars::ymom].boxArray(),S_stage_data[IntVars::ymom].DistributionMap(),1,0); + // We assume that in the first step (nrk == 0) we are only doing one substep. + AMREX_ALWAYS_ASSERT(nrk > 0 || step == 0); + // ************************************************************************* // First set up some arrays we'll need // ************************************************************************* @@ -105,61 +114,40 @@ void erf_fast_rhs_N (int step, int nrk, #endif for ( MFIter mfi(S_stage_data[IntVars::cons],TilingIfNotGPU()); mfi.isValid(); ++mfi) { - const Array4 & cur_cons = S_data[IntVars::cons].array(mfi); const Array4& prev_cons = S_prev[IntVars::cons].const_array(mfi); - const Array4& stage_cons = S_stage_data[IntVars::cons].const_array(mfi); - const Array4& lagged_delta_rt = S_scratch[IntVars::cons].array(mfi); - - const Array4& old_drho = Delta_rho.array(mfi); - const Array4& old_drho_w = Delta_rho_w.array(mfi); - const Array4& old_drho_theta = Delta_rho_theta.array(mfi); + const Array4& prev_zmom = S_prev[IntVars::zmom].const_array(mfi); - const Array4& prev_zmom = S_prev[IntVars::zmom].const_array(mfi); + const Array4& stage_cons = S_stage_data[IntVars::cons].const_array(mfi); const Array4& stage_zmom = S_stage_data[IntVars::zmom].const_array(mfi); - Box gbx = mfi.tilebox(); gbx.grow(1); - - if (step == 0) { - ParallelFor(gbx, [=] AMREX_GPU_DEVICE (int i, int j, int k) noexcept - { - cur_cons(i,j,k,Rho_comp) = prev_cons(i,j,k,Rho_comp); - cur_cons(i,j,k,RhoTheta_comp) = prev_cons(i,j,k,RhoTheta_comp); - }); - } // step = 0 - - Box gtbz = mfi.nodaltilebox(2); - gtbz.grow(IntVect(1,1,0)); - ParallelFor(gtbz, [=] AMREX_GPU_DEVICE (int i, int j, int k) noexcept { - old_drho_w(i,j,k) = prev_zmom(i,j,k) - stage_zmom(i,j,k); - }); - + const Array4& prev_drho_w = Delta_rho_w.array(mfi); + const Array4& prev_drho_theta = Delta_rho_theta.array(mfi); + const Array4& lagged_delta_rt = S_scratch[IntVars::cons].array(mfi); const Array4& theta_extrap = extrap.array(mfi); - ParallelFor(gbx, [=] AMREX_GPU_DEVICE (int i, int j, int k) noexcept { - old_drho(i,j,k) = cur_cons(i,j,k,Rho_comp) - stage_cons(i,j,k,Rho_comp); - old_drho_theta(i,j,k) = cur_cons(i,j,k,RhoTheta_comp) - stage_cons(i,j,k,RhoTheta_comp); + + Box gbx = mfi.growntilebox(1); + ParallelFor(gbx, [=] AMREX_GPU_DEVICE (int i, int j, int k) noexcept + { + prev_drho_theta(i,j,k) = prev_cons(i,j,k,RhoTheta_comp) - stage_cons(i,j,k,RhoTheta_comp); if (step == 0) { - theta_extrap(i,j,k) = old_drho_theta(i,j,k); + theta_extrap(i,j,k) = prev_drho_theta(i,j,k); } else { - theta_extrap(i,j,k) = old_drho_theta(i,j,k) + beta_d * - ( old_drho_theta(i,j,k) - lagged_delta_rt(i,j,k,RhoTheta_comp) ); + theta_extrap(i,j,k) = prev_drho_theta(i,j,k) + beta_d * + ( prev_drho_theta(i,j,k) - lagged_delta_rt(i,j,k,RhoTheta_comp) ); } - }); - } // mfi - -#ifdef _OPENMP -#pragma omp parallel if (Gpu::notInLaunchRegion()) -#endif - for ( MFIter mfi(S_stage_data[IntVars::cons],TilingIfNotGPU()); mfi.isValid(); ++mfi) - { - // We define lagged_delta_rt for our next step as the current delta_rt - Box gbx = mfi.tilebox(); gbx.grow(1); - const Array4& lagged_delta_rt = S_scratch[IntVars::cons].array(mfi); - const Array4& old_drho_theta = Delta_rho_theta.array(mfi); + // We define lagged_delta_rt for our next step as the current delta_rt + // (after using it above to extrapolate theta for this step) + lagged_delta_rt(i,j,k,RhoTheta_comp) = prev_drho_theta(i,j,k); + }); - ParallelFor(gbx, [=] AMREX_GPU_DEVICE (int i, int j, int k) noexcept { - lagged_delta_rt(i,j,k,RhoTheta_comp) = old_drho_theta(i,j,k); + // NOTE: We must do this here because for step > 0, prev_zmom and cur_zmom both point to the same data, + // so by the time we would use prev_zmom to define zflux, it would have already been over-written. + Box gtbz = mfi.nodaltilebox(2); + gtbz.grow(IntVect(1,1,0)); + ParallelFor(gtbz, [=] AMREX_GPU_DEVICE (int i, int j, int k) noexcept { + prev_drho_w(i,j,k) = prev_zmom(i,j,k) - stage_zmom(i,j,k); }); } // mfi @@ -203,56 +191,69 @@ void erf_fast_rhs_N (int step, int nrk, // ********************************************************************* // Define updates in the RHS of {x, y, z}-momentum equations // ********************************************************************* - { - BL_PROFILE("fast_rhs_xymom"); - ParallelFor(tbx, tby, - [=] AMREX_GPU_DEVICE (int i, int j, int k) - { - // Add (negative) gradient of (rho theta) multiplied by lagged "pi" - Real gpx = (theta_extrap(i,j,k) - theta_extrap(i-1,j,k))*dxi; - gpx *= mf_u(i,j,0); - - if (l_use_moisture) { - Real q = 0.5 * ( prim(i,j,k,PrimQ1_comp) + prim(i-1,j,k,PrimQ1_comp) - +prim(i,j,k,PrimQ2_comp) + prim(i-1,j,k,PrimQ2_comp) ); - gpx /= (1.0 + q); - } - - Real pi_c = 0.5 * (pi_stage_ca(i-1,j,k,0) + pi_stage_ca(i,j,k,0)); + if (nrk == 0 and step == 0) { + ParallelFor(tbx, tby, + [=] AMREX_GPU_DEVICE (int i, int j, int k) + { + Real new_drho_u = prev_xmom(i,j,k) - stage_xmom(i,j,k) + dtau * slow_rhs_rho_u(i,j,k); + avg_xmom(i,j,k) += facinv*new_drho_u; + temp_cur_xmom_arr(i,j,k) = stage_xmom(i,j,k) + new_drho_u; + }, + [=] AMREX_GPU_DEVICE (int i, int j, int k) + { + Real new_drho_v = prev_ymom(i,j,k) - stage_ymom(i,j,k) + dtau * slow_rhs_rho_v(i,j,k); + avg_ymom(i,j,k) += facinv*new_drho_v; + temp_cur_ymom_arr(i,j,k) = stage_ymom(i,j,k) + new_drho_v; + }); + } else { + ParallelFor(tbx, tby, + [=] AMREX_GPU_DEVICE (int i, int j, int k) + { + // Add (negative) gradient of (rho theta) multiplied by lagged "pi" + Real gpx = (theta_extrap(i,j,k) - theta_extrap(i-1,j,k))*dxi; + gpx *= mf_u(i,j,0); + + if (l_use_moisture) { + Real q = 0.5 * ( prim(i,j,k,PrimQ1_comp) + prim(i-1,j,k,PrimQ1_comp) + +prim(i,j,k,PrimQ2_comp) + prim(i-1,j,k,PrimQ2_comp) ); + gpx /= (1.0 + q); + } - Real fast_rhs_rho_u = -Gamma * R_d * pi_c * gpx; + Real pi_c = 0.5 * (pi_stage_ca(i-1,j,k,0) + pi_stage_ca(i,j,k,0)); - Real new_drho_u = prev_xmom(i,j,k) - stage_xmom(i,j,k) - + dtau * fast_rhs_rho_u + dtau * slow_rhs_rho_u(i,j,k); + Real fast_rhs_rho_u = -Gamma * R_d * pi_c * gpx; - avg_xmom(i,j,k) += facinv*new_drho_u; + Real new_drho_u = prev_xmom(i,j,k) - stage_xmom(i,j,k) + + dtau * fast_rhs_rho_u + dtau * slow_rhs_rho_u(i,j,k); - temp_cur_xmom_arr(i,j,k) = stage_xmom(i,j,k) + new_drho_u; - }, - [=] AMREX_GPU_DEVICE (int i, int j, int k) - { - // Add (negative) gradient of (rho theta) multiplied by lagged "pi" - Real gpy = (theta_extrap(i,j,k) - theta_extrap(i,j-1,k))*dyi; - gpy *= mf_v(i,j,0); + avg_xmom(i,j,k) += facinv*new_drho_u; - if (l_use_moisture) { - Real q = 0.5 * ( prim(i,j,k,PrimQ1_comp) + prim(i,j-1,k,PrimQ1_comp) - +prim(i,j,k,PrimQ2_comp) + prim(i,j-1,k,PrimQ2_comp) ); - gpy /= (1.0 + q); - } + temp_cur_xmom_arr(i,j,k) = stage_xmom(i,j,k) + new_drho_u; + }, + [=] AMREX_GPU_DEVICE (int i, int j, int k) + { + // Add (negative) gradient of (rho theta) multiplied by lagged "pi" + Real gpy = (theta_extrap(i,j,k) - theta_extrap(i,j-1,k))*dyi; + gpy *= mf_v(i,j,0); + + if (l_use_moisture) { + Real q = 0.5 * ( prim(i,j,k,PrimQ1_comp) + prim(i,j-1,k,PrimQ1_comp) + +prim(i,j,k,PrimQ2_comp) + prim(i,j-1,k,PrimQ2_comp) ); + gpy /= (1.0 + q); + } - Real pi_c = 0.5 * (pi_stage_ca(i,j-1,k,0) + pi_stage_ca(i,j,k,0)); + Real pi_c = 0.5 * (pi_stage_ca(i,j-1,k,0) + pi_stage_ca(i,j,k,0)); - Real fast_rhs_rho_v = -Gamma * R_d * pi_c * gpy; + Real fast_rhs_rho_v = -Gamma * R_d * pi_c * gpy; - Real new_drho_v = prev_ymom(i,j,k) - stage_ymom(i,j,k) - + dtau * fast_rhs_rho_v + dtau * slow_rhs_rho_v(i,j,k); + Real new_drho_v = prev_ymom(i,j,k) - stage_ymom(i,j,k) + + dtau * fast_rhs_rho_v + dtau * slow_rhs_rho_v(i,j,k); - avg_ymom(i,j,k) += facinv*new_drho_v; + avg_ymom(i,j,k) += facinv*new_drho_v; - temp_cur_ymom_arr(i,j,k) = stage_ymom(i,j,k) + new_drho_v; - }); - } //profile + temp_cur_ymom_arr(i,j,k) = stage_ymom(i,j,k) + new_drho_v; + }); + } // nrk > 0 and/or step > 0 } //mfi #ifdef _OPENMP @@ -268,24 +269,25 @@ void erf_fast_rhs_N (int step, int nrk, Box vbx = mfi.validbox(); const auto& vbx_hi = ubound(vbx); - const Array4 & stage_xmom = S_stage_data[IntVars::xmom].const_array(mfi); - const Array4 & stage_ymom = S_stage_data[IntVars::ymom].const_array(mfi); - const Array4 & stage_zmom = S_stage_data[IntVars::zmom].const_array(mfi); + const Array4& stage_xmom = S_stage_data[IntVars::xmom].const_array(mfi); + const Array4& stage_ymom = S_stage_data[IntVars::ymom].const_array(mfi); + const Array4& stage_zmom = S_stage_data[IntVars::zmom].const_array(mfi); const Array4 & prim = S_stage_prim.const_array(mfi); - const Array4& old_drho_w = Delta_rho_w.array(mfi); - const Array4& old_drho = Delta_rho.array(mfi); - const Array4& old_drho_theta = Delta_rho_theta.array(mfi); + const Array4& prev_drho_theta = Delta_rho_theta.array(mfi); + + const Array4& prev_cons = S_prev[IntVars::cons].const_array(mfi); + const Array4& stage_cons = S_stage_data[IntVars::cons].const_array(mfi); const Array4& slow_rhs_cons = S_slow_rhs[IntVars::cons].const_array(mfi); const Array4& slow_rhs_rho_w = S_slow_rhs[IntVars::zmom].const_array(mfi); - const Array4& cur_zmom = S_data[IntVars::zmom].array(mfi); + const Array4& prev_zmom = S_prev[IntVars::zmom].const_array(mfi); + const Array4< Real>& cur_zmom = S_data[IntVars::zmom].array(mfi); const Array4& temp_cur_xmom_arr = temp_cur_xmom.array(mfi); const Array4& temp_cur_ymom_arr = temp_cur_ymom.array(mfi); - const Array4& prev_zmom = S_prev[IntVars::zmom].const_array(mfi); // These store the advection momenta which we will use to update the slow variables const Array4< Real>& avg_zmom = S_scratch[IntVars::zmom].array(mfi); @@ -368,8 +370,6 @@ void erf_fast_rhs_N (int step, int nrk, // ********************************************************************* // fast_loop_on_shrunk // ********************************************************************* - { - BL_PROFILE("fast_loop_on_shrunk"); //Note we don't act on the bottom or top boundaries of the domain ParallelFor(bx_shrunk_in_k, [=] AMREX_GPU_DEVICE (int i, int j, int k) { @@ -392,8 +392,10 @@ void erf_fast_rhs_N (int step, int nrk, Real Omega_km1 = prev_zmom(i,j,k-1) - stage_zmom(i,j,k-1); // line 2 last two terms (order dtau) - Real R0_tmp = coeff_P * old_drho_theta(i,j,k) + coeff_Q * old_drho_theta(i,j,k-1) - - halfg * ( old_drho(i,j,k) + old_drho(i,j,k-1) ); + Real old_drho_k = prev_cons(i,j,k ,Rho_comp) - stage_cons(i,j,k ,Rho_comp); + Real old_drho_km1 = prev_cons(i,j,k-1,Rho_comp) - stage_cons(i,j,k-1,Rho_comp); + Real R0_tmp = coeff_P * prev_drho_theta(i,j,k) + coeff_Q * prev_drho_theta(i,j,k-1) + - halfg * ( old_drho_k + old_drho_km1 ); // lines 3-5 residuals (order dtau^2) 1.0 <-> beta_2 Real R1_tmp = halfg * (-slow_rhs_cons(i,j,k ,Rho_comp) @@ -409,94 +411,114 @@ void erf_fast_rhs_N (int step, int nrk, // line 1 RHS_a(i,j,k) = Omega_k + dtau * (slow_rhs_rho_w(i,j,k) + R0_tmp + dtau * beta_2 * R1_tmp); - }); - } // end profile + + }); // bx_shrunk_in_k Box b2d = tbz; // Copy constructor b2d.setRange(2,0); - { - BL_PROFILE("fast_rhs_b2d_loop"); -#ifdef AMREX_USE_GPU auto const lo = lbound(bx); auto const hi = ubound(bx); + ParallelFor(b2d, [=] AMREX_GPU_DEVICE (int i, int j, int) { // w at bottom boundary of grid is 0 if at domain boundary, otherwise w = w_old + dtau * slow_rhs - RHS_a(i,j,lo.z) = dtau * slow_rhs_rho_w(i,j,lo.z); + RHS_a (i,j,lo.z ) = prev_zmom(i,j,lo.z ) - stage_zmom(i,j,lo.z) + + dtau * slow_rhs_rho_w(i,j,lo.z); // w at top boundary of grid is 0 if at domain boundary, otherwise w = w_old + dtau * slow_rhs - // TODO TODO: Note that if we ever change this, we will need to include it in avg_zmom at the top - RHS_a(i,j,hi.z+1) = dtau * slow_rhs_rho_w(i,j,hi.z+1); + RHS_a (i,j,hi.z+1) = prev_zmom(i,j,hi.z+1) - stage_zmom(i,j,hi.z+1) + + dtau * slow_rhs_rho_w(i,j,hi.z+1); + }); // b2d - // w = specified Dirichlet value at k = lo.z - soln_a(i,j,lo.z) = RHS_a(i,j,lo.z) * inv_coeffB_a(i,j,lo.z); - cur_zmom(i,j,lo.z) = stage_zmom(i,j,lo.z) + soln_a(i,j,lo.z); +#ifdef AMREX_USE_GPU + if (l_implicit_substepping) { - for (int k = lo.z+1; k <= hi.z+1; k++) { - soln_a(i,j,k) = (RHS_a(i,j,k)-coeffA_a(i,j,k)*soln_a(i,j,k-1)) * inv_coeffB_a(i,j,k); - } + ParallelFor(b2d, [=] AMREX_GPU_DEVICE (int i, int j, int) + { + // w = specified Dirichlet value at k = lo.z + soln_a(i,j,lo.z) = RHS_a(i,j,lo.z) * inv_coeffB_a(i,j,lo.z); + cur_zmom(i,j,lo.z) = stage_zmom(i,j,lo.z) + soln_a(i,j,lo.z); - cur_zmom(i,j,hi.z+1) = stage_zmom(i,j,hi.z+1) + soln_a(i,j,hi.z+1); + for (int k = lo.z+1; k <= hi.z+1; k++) { + soln_a(i,j,k) = (RHS_a(i,j,k)-coeffA_a(i,j,k)*soln_a(i,j,k-1)) * inv_coeffB_a(i,j,k); + } - for (int k = hi.z; k >= lo.z; k--) { - soln_a(i,j,k) -= ( coeffC_a(i,j,k) * inv_coeffB_a(i,j,k) ) *soln_a(i,j,k+1); - cur_zmom(i,j,k) = stage_zmom(i,j,k) + soln_a(i,j,k); - } - }); // b2d + cur_zmom(i,j,hi.z+1) = stage_zmom(i,j,hi.z+1) + soln_a(i,j,hi.z+1); + + for (int k = hi.z; k >= lo.z; k--) { + soln_a(i,j,k) -= ( coeffC_a(i,j,k) * inv_coeffB_a(i,j,k) ) *soln_a(i,j,k+1); + cur_zmom(i,j,k) = stage_zmom(i,j,k) + soln_a(i,j,k); + } + }); // b2d + + } else { // explicit substepping (beta_1 = 1; beta_2 = 0) + + ParallelFor(b2d, [=] AMREX_GPU_DEVICE (int i, int j, int) + { + for (int k = lo.z; k <= hi.z+1; k++) { + soln_a(i,j,k) = RHS_a(i,j,k); + cur_zmom(i,j,k) = stage_zmom(i,j,k) + soln_a(i,j,k); + } + }); // b2d + } // end of explicit substepping #else - auto const lo = lbound(bx); - auto const hi = ubound(bx); - for (int j = lo.y; j <= hi.y; ++j) { - AMREX_PRAGMA_SIMD - for (int i = lo.x; i <= hi.x; ++i) { - // w at bottom boundary of grid is 0 if at domain boundary, otherwise w_old + dtau * slow_rhs - RHS_a (i,j,lo.z) = dtau * slow_rhs_rho_w(i,j,lo.z); - soln_a(i,j,lo.z) = RHS_a(i,j,lo.z) * inv_coeffB_a(i,j,lo.z); - } - } - // Note that if we ever change this, we will need to include it in avg_zmom at the top - for (int j = lo.y; j <= hi.y; ++j) { - AMREX_PRAGMA_SIMD - for (int i = lo.x; i <= hi.x; ++i) { - RHS_a (i,j,hi.z+1) = dtau * slow_rhs_rho_w(i,j,hi.z+1); - } - } - for (int k = lo.z+1; k <= hi.z+1; ++k) { + if (l_implicit_substepping) { + for (int j = lo.y; j <= hi.y; ++j) { AMREX_PRAGMA_SIMD for (int i = lo.x; i <= hi.x; ++i) { - soln_a(i,j,k) = (RHS_a(i,j,k)-coeffA_a(i,j,k)*soln_a(i,j,k-1)) * inv_coeffB_a(i,j,k); + soln_a(i,j,lo.z) = RHS_a(i,j,lo.z) * inv_coeffB_a(i,j,lo.z); } } - } - for (int j = lo.y; j <= hi.y; ++j) { - AMREX_PRAGMA_SIMD - for (int i = lo.x; i <= hi.x; ++i) { - cur_zmom(i,j,hi.z+1) = stage_zmom(i,j,hi.z+1) + soln_a(i,j,hi.z+1); + for (int k = lo.z+1; k <= hi.z+1; ++k) { + for (int j = lo.y; j <= hi.y; ++j) { + AMREX_PRAGMA_SIMD + for (int i = lo.x; i <= hi.x; ++i) { + soln_a(i,j,k) = (RHS_a(i,j,k)-coeffA_a(i,j,k)*soln_a(i,j,k-1)) * inv_coeffB_a(i,j,k); + } + } } - } - for (int k = hi.z; k >= lo.z; --k) { for (int j = lo.y; j <= hi.y; ++j) { AMREX_PRAGMA_SIMD for (int i = lo.x; i <= hi.x; ++i) { - soln_a(i,j,k) -= ( coeffC_a(i,j,k) * inv_coeffB_a(i,j,k) ) * soln_a(i,j,k+1); - cur_zmom(i,j,k) = stage_zmom(i,j,k) + soln_a(i,j,k); + cur_zmom(i,j,hi.z+1) = stage_zmom(i,j,hi.z+1) + soln_a(i,j,hi.z+1); } } - } + for (int k = hi.z; k >= lo.z; --k) { + for (int j = lo.y; j <= hi.y; ++j) { + AMREX_PRAGMA_SIMD + for (int i = lo.x; i <= hi.x; ++i) { + soln_a(i,j,k) -= ( coeffC_a(i,j,k) * inv_coeffB_a(i,j,k) ) * soln_a(i,j,k+1); + cur_zmom(i,j,k) = stage_zmom(i,j,k) + soln_a(i,j,k); + } + } + } + } else { // explicit substepping (beta_1 = 1; beta_2 = 0) + + for (int k = lo.z; k <= hi.z+1; ++k) { + for (int j = lo.y; j <= hi.y; ++j) { + AMREX_PRAGMA_SIMD + for (int i = lo.x; i <= hi.x; ++i) { + + soln_a(i,j,k) = RHS_a(i,j,k); + + cur_zmom(i,j,k) = stage_zmom(i,j,k) + soln_a(i,j,k); + } + } + } + + } // end of explicit substepping #endif - } // end profile // ************************************************************************** // Define updates in the RHS of rho and (rho theta) // ************************************************************************** - { - BL_PROFILE("fast_rho_final_update"); + const Array4& prev_drho_w = Delta_rho_w.array(mfi); ParallelFor(bx, [=] AMREX_GPU_DEVICE (int i, int j, int k) noexcept { - Real zflux_lo = beta_2 * soln_a(i,j,k ) + beta_1 * old_drho_w(i,j,k ); - Real zflux_hi = beta_2 * soln_a(i,j,k+1) + beta_1 * old_drho_w(i,j,k+1); + Real zflux_lo = beta_2 * soln_a(i,j,k ) + beta_1 * prev_drho_w(i,j,k ); + Real zflux_hi = beta_2 * soln_a(i,j,k+1) + beta_1 * prev_drho_w(i,j,k+1); avg_zmom(i,j,k) += facinv*zflux_lo / (mf_m(i,j,0) * mf_m(i,j,0)); (flx_arr[2])(i,j,k,0) = zflux_lo / (mf_m(i,j,0) * mf_m(i,j,0)); @@ -512,7 +534,6 @@ void erf_fast_rhs_N (int step, int nrk, temp_rhs_arr(i,j,k,RhoTheta_comp) += 0.5 * dzi * ( zflux_hi * (prim(i,j,k) + prim(i,j,k+1)) - zflux_lo * (prim(i,j,k) + prim(i,j,k-1)) ); }); - } // end profile // We only add to the flux registers in the final RK step if (l_reflux && nrk == 2) { @@ -546,15 +567,29 @@ void erf_fast_rhs_N (int step, int nrk, { const Box& bx = mfi.tilebox(); - int cons_dycore{2}; - const Array4& cur_cons = S_data[IntVars::cons].array(mfi); + const Array4< Real>& cur_cons = S_data[IntVars::cons].array(mfi); + const Array4& prev_cons = S_prev[IntVars::cons].const_array(mfi); auto const& temp_rhs_arr = temp_rhs.const_array(mfi); auto const& slow_rhs_cons = S_slow_rhs[IntVars::cons].const_array(mfi); - ParallelFor(bx, cons_dycore, [=] AMREX_GPU_DEVICE (int i, int j, int k, int n) noexcept - { - cur_cons(i,j,k,n) += dtau * (slow_rhs_cons(i,j,k,n) - temp_rhs_arr(i,j,k,n)); - }); + if (step == 0) { + ParallelFor(bx, [=] AMREX_GPU_DEVICE (int i, int j, int k) noexcept + { + cur_cons(i,j,k,Rho_comp) = prev_cons(i,j,k,Rho_comp) + + dtau * (slow_rhs_cons(i,j,k,Rho_comp) - temp_rhs_arr(i,j,k,Rho_comp)); + cur_cons(i,j,k,RhoTheta_comp) = prev_cons(i,j,k,RhoTheta_comp) + + dtau * (slow_rhs_cons(i,j,k,RhoTheta_comp) - temp_rhs_arr(i,j,k,RhoTheta_comp)); + }); + } else { + ParallelFor(bx, [=] AMREX_GPU_DEVICE (int i, int j, int k) noexcept + { + // + // We didn't need to set cur_cons = prev_cons above because they point to the same data for step > 0 + // + cur_cons(i,j,k,Rho_comp) += dtau * (slow_rhs_cons(i,j,k,Rho_comp) - temp_rhs_arr(i,j,k,Rho_comp)); + cur_cons(i,j,k,RhoTheta_comp) += dtau * (slow_rhs_cons(i,j,k,RhoTheta_comp) - temp_rhs_arr(i,j,k,RhoTheta_comp)); + }); + } // step = 0 const Array4& cur_xmom = S_data[IntVars::xmom].array(mfi); const Array4& cur_ymom = S_data[IntVars::ymom].array(mfi); diff --git a/Source/TimeIntegration/ERF_fast_rhs_T.cpp b/Source/TimeIntegration/ERF_fast_rhs_T.cpp index a26289176..ed97b8469 100644 --- a/Source/TimeIntegration/ERF_fast_rhs_T.cpp +++ b/Source/TimeIntegration/ERF_fast_rhs_T.cpp @@ -6,39 +6,41 @@ using namespace amrex; /** * Function for computing the fast RHS with fixed terrain * - * @param[in] step which fast time step within each Runge-Kutta step - * @param[in] nrk which Runge-Kutta step - * @param[in] level level of resolution - * @param[in] finest_level finest level of resolution - * @param[in] S_slow_rhs slow RHS computed in erf_slow_rhs_pre - * @param[in] S_prev previous solution - * @param[in] S_stage_data solution at previous RK stage - * @param[in] S_stage_prim primitive variables at previous RK stage - * @param[in] pi_stage Exner function at previous RK stage - * @param[in] fast_coeffs coefficients for the tridiagonal solve used in the fast integrator - * @param[out] S_data current solution - * @param[in] S_scratch scratch space - * @param[in] geom container for geometric information - * @param[in] gravity magnitude of gravity - * @param[in] Omega component of the momentum normal to the z-coordinate surface - * @param[in] z_phys_nd height coordinate at nodes - * @param[in] detJ_cc Jacobian of the metric transformation - * @param[in] dtau fast time step - * @param[in] beta_s Coefficient which determines how implicit vs explicit the solve is - * @param[in] facinv inverse factor for time-averaging the momenta - * @param[in] mapfac_m map factor at cell centers - * @param[in] mapfac_u map factor at x-faces - * @param[in] mapfac_v map factor at y-faces + * @param[in ] step which fast time step within each Runge-Kutta step + * @param[in ] nrk which Runge-Kutta step + * @param[in ] level level of resolution + * @param[in ] finest_level finest level of resolution + * @param[in ] S_slow_rhs slow RHS computed in erf_slow_rhs_pre + * @param[in ] S_prev previous solution + * @param[in ] S_stage_data solution at previous RK stage + * @param[in ] S_stage_prim primitive variables at previous RK stage + * @param[in ] pi_stage Exner function at previous RK stage + * @param[in ] fast_coeffs coefficients for the tridiagonal solve used in the fast integrator + * @param[ out] S_data current solution + * @param[in ] S_scratch scratch space + * @param[in ] geom container for geometric information + * @param[in ] gravity magnitude of gravity + * @param[in ] Omega component of the momentum normal to the z-coordinate surface + * @param[in ] z_phys_nd height coordinate at nodes + * @param[in ] detJ_cc Jacobian of the metric transformation + * @param[in ] dtau fast time step + * @param[in ] beta_s Coefficient which determines how implicit vs explicit the solve is + * @param[in ] facinv inverse factor for time-averaging the momenta + * @param[in ] mapfac_m map factor at cell centers + * @param[in ] mapfac_u map factor at x-faces + * @param[in ] mapfac_v map factor at y-faces * @param[inout] fr_as_crse YAFluxRegister at level l at level l / l+1 interface * @param[inout] fr_as_fine YAFluxRegister at level l at level l-1 / l interface - * @param[in] l_reflux should we add fluxes to the FluxRegisters? + * @param[in ] l_use_moisture + * @param[in ] l_reflux should we add fluxes to the FluxRegisters? + * @param[in ] l_implicit_substepping */ void erf_fast_rhs_T (int step, int nrk, int level, int finest_level, Vector& S_slow_rhs, // the slow RHS already computed const Vector& S_prev, // if step == 0, this is S_old, else the previous solution - Vector& S_stage_data, // S_bar = S^n, S^* or S^** + Vector& S_stage_data, // S_stage = S^n, S^* or S^** const MultiFab& S_stage_prim, // Primitive version of S_stage_data[IntVars::cons] const MultiFab& pi_stage, // Exner function evaluated at last stage const MultiFab& fast_coeffs, // Coeffs for tridiagonal solve @@ -57,7 +59,8 @@ void erf_fast_rhs_T (int step, int nrk, YAFluxRegister* fr_as_crse, YAFluxRegister* fr_as_fine, bool l_use_moisture, - bool l_reflux) + bool l_reflux, + bool /*l_implicit_substepping*/) { BL_PROFILE_REGION("erf_fast_rhs_T()"); From 291c02c223616b4fe59393acc41e4d3632cfe98e Mon Sep 17 00:00:00 2001 From: Ann Almgren Date: Sun, 20 Oct 2024 11:49:58 -0700 Subject: [PATCH 27/35] fix index bug in fillpatching (#1900) --- .../ERF_BoundaryConditions_basestate.cpp | 2 +- Source/BoundaryConditions/ERF_BoundaryConditions_cons.cpp | 2 +- Source/BoundaryConditions/ERF_FillPatch.cpp | 2 +- Source/TimeIntegration/ERF_TI_fast_rhs_fun.H | 8 ++++++-- 4 files changed, 9 insertions(+), 5 deletions(-) diff --git a/Source/BoundaryConditions/ERF_BoundaryConditions_basestate.cpp b/Source/BoundaryConditions/ERF_BoundaryConditions_basestate.cpp index ede2449c1..e7a47ad52 100644 --- a/Source/BoundaryConditions/ERF_BoundaryConditions_basestate.cpp +++ b/Source/BoundaryConditions/ERF_BoundaryConditions_basestate.cpp @@ -13,7 +13,7 @@ using namespace amrex; void ERFPhysBCFunct_base::impose_lateral_basestate_bcs (const Array4& dest_arr, const Box& bx, const Box& domain) { - BL_PROFILE_VAR("impose_lateral_cons_bcs()",impose_lateral_cons_bcs); + BL_PROFILE_VAR("impose_lateral_base_bcs()",impose_lateral_base_bcs); int icomp = 0; int ncomp = 3; diff --git a/Source/BoundaryConditions/ERF_BoundaryConditions_cons.cpp b/Source/BoundaryConditions/ERF_BoundaryConditions_cons.cpp index 738d69fa5..1a2edbd1c 100644 --- a/Source/BoundaryConditions/ERF_BoundaryConditions_cons.cpp +++ b/Source/BoundaryConditions/ERF_BoundaryConditions_cons.cpp @@ -263,7 +263,7 @@ void ERFPhysBCFunct_cons::impose_vertical_cons_bcs (const Array4& dest_arr const GpuArray dxInv, int icomp, int ncomp) { - BL_PROFILE_VAR("impose_lateral_cons_bcs()",impose_lateral_cons_bcs); + BL_PROFILE_VAR("impose_vertical_cons_bcs()",impose_vertical_cons_bcs); const auto& dom_lo = lbound(domain); const auto& dom_hi = ubound(domain); diff --git a/Source/BoundaryConditions/ERF_FillPatch.cpp b/Source/BoundaryConditions/ERF_FillPatch.cpp index 8c7b369d4..e1526fcac 100644 --- a/Source/BoundaryConditions/ERF_FillPatch.cpp +++ b/Source/BoundaryConditions/ERF_FillPatch.cpp @@ -321,7 +321,7 @@ ERF::FillIntermediatePatch (int lev, Real time, mapper = &cell_cons_interp; FillPatchTwoLevels(mf, IntVect{ng_cons}, IntVect(0,0,0), time, cmf, ctime, fmf, ftime, - 0, 0, ncomp_cons, geom[lev-1], geom[lev], + icomp_cons, icomp_cons, ncomp_cons, geom[lev-1], geom[lev], refRatio(lev-1), mapper, domain_bcs_type, icomp_cons); diff --git a/Source/TimeIntegration/ERF_TI_fast_rhs_fun.H b/Source/TimeIntegration/ERF_TI_fast_rhs_fun.H index c3fa90a70..1213b8cf6 100644 --- a/Source/TimeIntegration/ERF_TI_fast_rhs_fun.H +++ b/Source/TimeIntegration/ERF_TI_fast_rhs_fun.H @@ -128,6 +128,7 @@ auto fast_rhs_fun = [&](int fast_step, int /*n_sub*/, int nrk, detJ_cc[level], r0, pi0, dtau, beta_s, phys_bc_type); // If this is the first substep we pass in S_old as the previous step's solution + // and S_data is the new-time solution to be defined here erf_fast_rhs_T(fast_step, nrk, level, finest_level, S_slow_rhs, S_old, S_stage, S_prim, pi_stage, fast_coeffs, S_data, S_scratch, fine_geom, solverChoice.gravity, Omega, @@ -135,7 +136,8 @@ auto fast_rhs_fun = [&](int fast_step, int /*n_sub*/, int nrk, mapfac_m[level], mapfac_u[level], mapfac_v[level], fr_as_crse, fr_as_fine, l_use_moisture, l_reflux, l_implicit_substepping); } else { - // If this is not the first substep we pass in S_data as the previous step's solution + // If this is not the first substep we pass in S_data as both the previous step's solution + // and as the new-time solution to be defined here erf_fast_rhs_T(fast_step, nrk, level, finest_level, S_slow_rhs, S_data, S_stage, S_prim, pi_stage, fast_coeffs, S_data, S_scratch, fine_geom, solverChoice.gravity, Omega, @@ -152,6 +154,7 @@ auto fast_rhs_fun = [&](int fast_step, int /*n_sub*/, int nrk, detJ_cc[level], r0, pi0, dtau, beta_s, phys_bc_type); // If this is the first substep we pass in S_old as the previous step's solution + // and S_data is the new-time solution to be defined here erf_fast_rhs_N(fast_step, nrk, level, finest_level, S_slow_rhs, S_old, S_stage, S_prim, pi_stage, fast_coeffs, S_data, S_scratch, fine_geom, solverChoice.gravity, @@ -159,7 +162,8 @@ auto fast_rhs_fun = [&](int fast_step, int /*n_sub*/, int nrk, mapfac_m[level], mapfac_u[level], mapfac_v[level], fr_as_crse, fr_as_fine, l_use_moisture, l_reflux, l_implicit_substepping); } else { - // If this is not the first substep we pass in S_data as the previous step's solution + // If this is not the first substep we pass in S_data as both the previous step's solution + // and as the new-time solution to be defined here erf_fast_rhs_N(fast_step, nrk, level, finest_level, S_slow_rhs, S_data, S_stage, S_prim, pi_stage, fast_coeffs, S_data, S_scratch, fine_geom, solverChoice.gravity, From 1ea11db850117d791d8b40f2fc7aeff15338e110 Mon Sep 17 00:00:00 2001 From: Ann Almgren Date: Sun, 20 Oct 2024 15:58:44 -0700 Subject: [PATCH 28/35] enable build with AMReX FFT (instead of heffte) (#1901) --- Build/cmake_with_poisson.sh | 1 - Exec/Make.ERF | 18 +- Source/ERF.H | 12 +- Source/ERF.cpp | 4 +- Source/Utils/ERF_PoissonSolve.cpp | 65 ++++++- Source/Utils/ERF_solve_with_heffte.cpp | 243 ------------------------- Source/Utils/Make.package | 3 - 7 files changed, 69 insertions(+), 277 deletions(-) delete mode 100644 Source/Utils/ERF_solve_with_heffte.cpp diff --git a/Build/cmake_with_poisson.sh b/Build/cmake_with_poisson.sh index ab455182f..a883fcb7f 100755 --- a/Build/cmake_with_poisson.sh +++ b/Build/cmake_with_poisson.sh @@ -8,7 +8,6 @@ cmake -DCMAKE_INSTALL_PREFIX:PATH=./install \ -DCMAKE_Fortran_COMPILER:STRING=mpifort \ -DMPIEXEC_PREFLAGS:STRING=--oversubscribe \ -DCMAKE_BUILD_TYPE:STRING=Release \ - -DAMREX_LINEAR_SOLVERS:BOOL=ON \ -DERF_DIM:STRING=3 \ -DERF_ENABLE_MPI:BOOL=ON \ -DERF_ENABLE_TESTS:BOOL=ON \ diff --git a/Exec/Make.ERF b/Exec/Make.ERF index a704e7b69..4205dafa6 100644 --- a/Exec/Make.ERF +++ b/Exec/Make.ERF @@ -183,22 +183,8 @@ INCLUDE_LOCATIONS += $(ERF_WINDFARM_GENERALAD_DIR) endif -ifeq ($(USE_HEFFTE),TRUE) -DEFINES += -DERF_USE_HEFFTE -VPATH_LOCATIONS += $(HEFFTE_HOME)/include -INCLUDE_LOCATIONS += $(HEFFTE_HOME)/include -LIBRARY_LOCATIONS += $(HEFFTE_HOME)/lib -LIBRARIES += -lheffte -ifeq ($(USE_CUDA),TRUE) - libraries += -lcufft -else ifeq ($(USE_HIP),TRUE) - # Use rocFFT. ROC_PATH is defined in amrex - INCLUDE_LOCATIONS += $(ROC_PATH)/rocfft/include - LIBRARY_LOCATIONS += $(ROC_PATH)/rocfft/lib - LIBRARIES += -L$(ROC_PATH)/rocfft/lib -lrocfft -else - libraries += -lfftw3_mpi -lfftw3f -lfftw3 -endif +ifeq ($(USE_FFT),TRUE) +DEFINES += -DERF_USE_FFT endif ifeq ($(USE_WW3_COUPLING), TRUE) diff --git a/Source/ERF.H b/Source/ERF.H index e3e5d0c1f..26c1f01a4 100644 --- a/Source/ERF.H +++ b/Source/ERF.H @@ -22,6 +22,10 @@ #include #include +#ifdef ERF_USE_FFT +#include +#endif + #ifdef AMREX_MEM_PROFILING #include #endif @@ -143,8 +147,6 @@ public: // Project the velocities to be divergence-free -- this is only relevant if anelastic == 1 void project_velocities (int lev, amrex::Real dt, amrex::Vector& vars, amrex::MultiFab& p); - void solve_with_heffte (int lev, amrex::MultiFab& rhs, amrex::MultiFab& soln, - amrex::Array& fluxes); // Project the velocities to be divergence-free with a thin body void project_velocities_tb (int lev, amrex::Real dt, amrex::Vector& vars, amrex::MultiFab& p); @@ -954,7 +956,7 @@ private: static int verbose; static int mg_verbose; - static bool use_heffte; + static bool use_fft; // Diagnostic output interval static int sum_interval; @@ -1302,6 +1304,10 @@ private: { return 4; } #endif +#ifdef ERF_USE_FFT + std::unique_ptr> m_poisson; +#endif + public: void writeJobInfo (const std::string& dir) const; static void writeBuildInfo (std::ostream& os); diff --git a/Source/ERF.cpp b/Source/ERF.cpp index 590cb8e27..85ffb5aec 100644 --- a/Source/ERF.cpp +++ b/Source/ERF.cpp @@ -32,7 +32,7 @@ int ERF::fixed_mri_dt_ratio = 0; // Dictate verbosity in screen output int ERF::verbose = 0; int ERF::mg_verbose = 0; -bool ERF::use_heffte = false; +bool ERF::use_fft = false; // Frequency of diagnostic output int ERF::sum_interval = -1; @@ -1390,7 +1390,7 @@ ERF::ReadParameters () // Verbosity pp.query("v", verbose); pp.query("mg_v", mg_verbose); - pp.query("use_heffte", use_heffte); + pp.query("use_fft", use_fft); // Frequency of diagnostic output pp.query("sum_interval", sum_interval); diff --git a/Source/Utils/ERF_PoissonSolve.cpp b/Source/Utils/ERF_PoissonSolve.cpp index 283f73025..d5a82fbc4 100644 --- a/Source/Utils/ERF_PoissonSolve.cpp +++ b/Source/Utils/ERF_PoissonSolve.cpp @@ -119,10 +119,57 @@ void ERF::project_velocities (int lev, Real l_dt, Vector& mom_mf, Mult Real start_step = static_cast(ParallelDescriptor::second()); -#ifdef ERF_USE_HEFFTE - if (use_heffte) { - solve_with_heffte(lev, rhs[0], phi[0], fluxes[0]); - } else +#ifdef ERF_USE_FFT + if (use_fft) { + AMREX_ALWAYS_ASSERT(lev == 0); + if (!m_poisson) { + m_poisson = std::make_unique>(Geom(0)); + } + m_poisson->solve(phi[lev], rhs[lev]); + + phi[lev].FillBoundary(geom[lev].periodicity()); + + auto dxInv = geom[lev].InvCellSizeArray(); + +#ifdef _OPENMP +#pragma omp parallel if (Gpu::notInLaunchRegion()) +#endif + for (MFIter mfi(phi[lev], TilingIfNotGPU()); mfi.isValid(); ++mfi) + { + Array4 const& p_arr = phi[lev].array(mfi); + + Box const& xbx = mfi.nodaltilebox(0); + const Real dx_inv = dxInv[0]; + Array4 const& fx_arr = fluxes[lev][0].array(mfi); + ParallelFor(xbx, [=] AMREX_GPU_DEVICE (int i, int j, int k) noexcept + { + fx_arr(i,j,k) = -(p_arr(i,j,k) - p_arr(i-1,j,k)) * dx_inv; + }); + + Box const& ybx = mfi.nodaltilebox(1); + const Real dy_inv = dxInv[1]; + Array4 const& fy_arr = fluxes[lev][1].array(mfi); + ParallelFor(ybx, [=] AMREX_GPU_DEVICE (int i, int j, int k) noexcept + { + fy_arr(i,j,k) = -(p_arr(i,j,k) - p_arr(i,j-1,k)) * dy_inv; + }); + + auto const dom_lo = lbound(geom[lev].Domain()); + auto const dom_hi = ubound(geom[lev].Domain()); + + Box const& zbx = mfi.nodaltilebox(2); + const Real dz_inv = dxInv[2]; + Array4 const& fz_arr = fluxes[lev][2].array(mfi); + ParallelFor(zbx, [=] AMREX_GPU_DEVICE (int i, int j, int k) noexcept + { + if (k == dom_lo.z || k == dom_hi.z+1) { + fz_arr(i,j,k) = 0.0; + } else { + fz_arr(i,j,k) = -(p_arr(i,j,k) - p_arr(i,j,k-1)) * dz_inv; + } + }); + } // mfi + } else #endif { // Initialize phi to 0 @@ -142,11 +189,6 @@ void ERF::project_velocities (int lev, Real l_dt, Vector& mom_mf, Mult mlmg.getFluxes(GetVecOfArrOfPtrs(fluxes)); } - Real end_step = static_cast(ParallelDescriptor::second()); - if (mg_verbose > 0) { - amrex::Print() << "Time in solve " << end_step - start_step << std::endl; - } - // Subtract dt grad(phi) from the momenta MultiFab::Add(mom_mf[IntVars::xmom],fluxes[0][0],0,0,1,0); MultiFab::Add(mom_mf[IntVars::ymom],fluxes[0][1],0,0,1,0); @@ -156,6 +198,11 @@ void ERF::project_velocities (int lev, Real l_dt, Vector& mom_mf, Mult MultiFab::Saxpy(pmf, 1.0/l_dt, phi[0],0,0,1,0); pmf.FillBoundary(geom[lev].periodicity()); + Real end_step = static_cast(ParallelDescriptor::second()); + if (mg_verbose > 0) { + amrex::Print() << "Time in solve " << end_step - start_step << std::endl; + } + #ifdef _OPENMP #pragma omp parallel if (Gpu::notInLaunchRegion()) #endif diff --git a/Source/Utils/ERF_solve_with_heffte.cpp b/Source/Utils/ERF_solve_with_heffte.cpp deleted file mode 100644 index e95025ff1..000000000 --- a/Source/Utils/ERF_solve_with_heffte.cpp +++ /dev/null @@ -1,243 +0,0 @@ -#include "ERF.H" -#include -#include -#include "ERF_Utils.H" -#ifdef ERF_USE_HEFFTE -#include "heffte.h" -#endif - -#ifdef ERF_USE_HEFFTE - -using namespace amrex; - -void ERF::solve_with_heffte (int lev, MultiFab& rhs, MultiFab& phi, - Array& fluxes) -{ - BoxArray ba(rhs.boxArray()); - DistributionMapping dm(rhs.DistributionMap()); - - // The heffte solve uses a solution array with no ghost cells - MultiFab soln(ba,dm,1,0); - - // Determine the domain length in each direction - Real L_x = geom[lev].ProbHi(0) - geom[lev].ProbLo(0); - Real L_y = geom[lev].ProbHi(1) - geom[lev].ProbLo(1); - Real L_z = geom[lev].ProbHi(2) - geom[lev].ProbLo(2); - - Box domain = geom[lev].Domain(); - auto const& domlo = lbound(domain); - auto const& domhi = ubound(domain); - - int n_cell_x = domain.length(0); - int n_cell_y = domain.length(1); - int n_cell_z = domain.length(2); - - auto dx = geom[lev].CellSize(); - auto dxinv = geom[lev].InvCellSize(); - - // Since there is 1 MPI rank per box, here each MPI rank obtains its local box and the associated boxid - Box local_box; - int local_boxid; - { - for (int i = 0; i < ba.size(); ++i) { - Box b = ba[i]; - // each MPI rank has its own local_box Box and local_boxid ID - if (ParallelDescriptor::MyProc() == dm[i]) { - local_box = b; - local_boxid = i; - } - } - } - - // Now each MPI rank works on its own box - // Ror real->complex fft's, the fft is stored in an (nx/2+1) x ny x nz dataset - - // start by coarsening each box by 2 in the x-direction - Box c_local_box = amrex::coarsen(local_box, IntVect(AMREX_D_DECL(2,1,1))); - - // If the coarsened box's high-x index is even, we shrink the size in 1 in x - // this avoids overlap between coarsened boxes - if (c_local_box.bigEnd(0) * 2 == local_box.bigEnd(0)) { - c_local_box.setBig(0,c_local_box.bigEnd(0)-1); - } - // For any boxes that touch the hi-x domain we increase the size of boxes by 1 in x - // This makes the overall fft dataset have size (Nx/2+1 x Ny x Nz) - if (local_box.bigEnd(0) == geom[lev].Domain().bigEnd(0)) { - c_local_box.growHi(0,1); - } - - // Each MPI rank gets storage for its piece of the fft - BaseFab > spectral_field(c_local_box, 1, The_Device_Arena()); - - // Create real->complex fft objects with the appropriate backend and data about - // the domain size and its local box size - - bool do_2d_solves = false; - - // ******************************************************************************************** - // ******************************************************************************************** - // ******************************************************************************************** - - // ******************************************************************************************** - // NOTE: THIS IS A WIP - IT DOES NOT WORK YET - // ******************************************************************************************** - if (do_2d_solves) { - -#ifdef AMREX_USE_CUDA - heffte::fft2d_r2c fft -#elif AMREX_USE_HIP - heffte::fft2d_r2c fft -#else - heffte::fft2d_r2c fft -#endif - ({{local_box.smallEnd(0),local_box.smallEnd(1),0}, - {local_box.bigEnd(0) ,local_box.bigEnd(1) ,0}}, - {{c_local_box.smallEnd(0),c_local_box.smallEnd(1),0}, - {c_local_box.bigEnd(0) ,c_local_box.bigEnd(1) ,0}}, - 0, ParallelDescriptor::Communicator()); - - using heffte_complex = typename heffte::fft_output::type; - heffte_complex* spectral_data = (heffte_complex*) spectral_field.dataPtr(); - - // ******************************************************************************************** - - for (int k = domlo.z; k <= domhi.z; k++) { - int offset = k * (n_cell_x*n_cell_y); - fft.forward(rhs[local_boxid].dataPtr(offset), spectral_data); - } - - // ******************************************************************************************** - - // Now we take the standard FFT and scale it by 1/k^2 - Array4< GpuComplex > spectral = spectral_field.array(); - - ParallelFor(c_local_box, [=] AMREX_GPU_DEVICE(int i, int j, int k) - { - Real a = 2.*M_PI*i / L_x; - Real b = 2.*M_PI*j / L_y; - Real c = 2.*M_PI*k / L_z; - - // the values in the upper-half of the spectral array in y and z are here interpreted as negative wavenumbers - if (j >= n_cell_y/2) b = 2.*M_PI*(n_cell_y-j) / L_y; - if (k >= n_cell_z/2) c = 2.*M_PI*(n_cell_z-k) / L_z; - - Real k2 = 2.0*(std::cos(a*dx[0])-1.)*(dxinv[0]*dxinv[0]) + - 2.0*(std::cos(b*dx[1])-1.)*(dxinv[1]*dxinv[1]) ; - if (k2 != 0.) { - spectral(i,j,k) /= k2; - } else { - spectral(i,j,k) *= 0.; // interpretation here is that the average value of the solution is zero - } - }); - - // ******************************************************************************************** - - for (int k = domlo.z; k <= domhi.z; k++) { - int offset = k * (n_cell_x*n_cell_y); - fft.backward(spectral_data, soln[local_boxid].dataPtr(offset)); - } - - // ******************************************************************************************** - - } else { - -#ifdef AMREX_USE_CUDA - heffte::fft3d_r2c fft -#elif AMREX_USE_HIP - heffte::fft3d_r2c fft -#else - heffte::fft3d_r2c fft -#endif - ({{local_box.smallEnd(0),local_box.smallEnd(1),local_box.smallEnd(2)}, - {local_box.bigEnd(0) ,local_box.bigEnd(1) ,local_box.bigEnd(2)}}, - {{c_local_box.smallEnd(0),c_local_box.smallEnd(1),c_local_box.smallEnd(2)}, - {c_local_box.bigEnd(0) ,c_local_box.bigEnd(1) ,c_local_box.bigEnd(2)}}, - 0, ParallelDescriptor::Communicator()); - - using heffte_complex = typename heffte::fft_output::type; - heffte_complex* spectral_data = (heffte_complex*) spectral_field.dataPtr(); - - // ******************************************************************************************** - - fft.forward(rhs[local_boxid].dataPtr(), spectral_data); - - // ******************************************************************************************** - - // Now we take the standard FFT and scale it by 1/k^2 - Array4< GpuComplex > spectral = spectral_field.array(); - - ParallelFor(c_local_box, [=] AMREX_GPU_DEVICE(int i, int j, int k) - { - Real a = 2.*M_PI*i / L_x; - Real b = 2.*M_PI*j / L_y; - Real c = 2.*M_PI*k / L_z; - - // the values in the upper-half of the spectral array in y and z are here interpreted as negative wavenumbers - if (j >= n_cell_y/2) b = 2.*M_PI*(n_cell_y-j) / L_y; - if (k >= n_cell_z/2) c = 2.*M_PI*(n_cell_z-k) / L_z; - - Real k2 = 2.0*(std::cos(a*dx[0])-1.)*(dxinv[0]*dxinv[0]) + - 2.0*(std::cos(b*dx[1])-1.)*(dxinv[1]*dxinv[1]) + - 2.0*(std::cos(c*dx[2])-1.)*(dxinv[2]*dxinv[2]); - if (k2 != 0.) { - spectral(i,j,k) /= k2; - } else { - spectral(i,j,k) *= 0.; // interpretation here is that the average value of the solution is zero - } - }); - - // ******************************************************************************************** - - fft.backward(spectral_data, soln[local_boxid].dataPtr()); - - // ******************************************************************************************** - - } // 3d solve - - // ******************************************************************************************** - // ******************************************************************************************** - // ******************************************************************************************** - - // Scale by 1/npts (both forward and inverse need sqrt(npts) scaling so I am doing it all here) - Real npts = static_cast(ba.numPts()); - soln.mult(1./npts); - - // ******************************************************************************************** - - phi.copy(soln); - phi.FillBoundary(geom[lev].periodicity()); - -#ifdef _OPENMP -#pragma omp parallel if (Gpu::notInLaunchRegion()) -#endif - for (MFIter mfi(soln, TilingIfNotGPU()); mfi.isValid(); ++mfi) - { - Array4 const& p_arr = phi.array(mfi); - - Box const& xbx = mfi.nodaltilebox(0); - const Real dx_inv = dxinv[0]; - Array4 const& fx_arr = fluxes[0].array(mfi); - ParallelFor(xbx, [=] AMREX_GPU_DEVICE (int i, int j, int k) noexcept - { - fx_arr(i,j,k) = -(p_arr(i,j,k) - p_arr(i-1,j,k)) * dx_inv; - }); - - Box const& ybx = mfi.nodaltilebox(1); - const Real dy_inv = dxinv[1]; - Array4 const& fy_arr = fluxes[1].array(mfi); - ParallelFor(ybx, [=] AMREX_GPU_DEVICE (int i, int j, int k) noexcept - { - fy_arr(i,j,k) = -(p_arr(i,j,k) - p_arr(i,j-1,k)) * dy_inv; - }); - - Box const& zbx = mfi.nodaltilebox(2); - const Real dz_inv = dxinv[2]; - Array4 const& fz_arr = fluxes[2].array(mfi); - ParallelFor(zbx, [=] AMREX_GPU_DEVICE (int i, int j, int k) noexcept - { - fz_arr(i,j,k) = -(p_arr(i,j,k) - p_arr(i,j-1,k)) * dz_inv; - }); - } // mfi -} - -#endif diff --git a/Source/Utils/Make.package b/Source/Utils/Make.package index e6a103db0..f757c99f9 100644 --- a/Source/Utils/Make.package +++ b/Source/Utils/Make.package @@ -25,6 +25,3 @@ CEXE_sources += ERF_Time_Avg_Vel.cpp CEXE_sources += ERF_PoissonSolve.cpp CEXE_sources += ERF_PoissonSolve_tb.cpp -ifeq ($(USE_HEFFTE),TRUE) -CEXE_sources += ERF_solve_with_heffte.cpp -endif From e3adba1b3d9e5cd9b890fae33422aae504e72366 Mon Sep 17 00:00:00 2001 From: Ann Almgren Date: Sun, 20 Oct 2024 16:17:23 -0700 Subject: [PATCH 29/35] update amrex submodule (#1902) --- Submodules/AMReX | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Submodules/AMReX b/Submodules/AMReX index 6239d2576..62c2a81ea 160000 --- a/Submodules/AMReX +++ b/Submodules/AMReX @@ -1 +1 @@ -Subproject commit 6239d2576489a3178d753471f988908f5499577c +Subproject commit 62c2a81eac7862d526e5861ef2befc00b7f5b759 From be89c40b5dd92e93be589a5039c0a6605de9de69 Mon Sep 17 00:00:00 2001 From: "Aaron M. Lattanzi" <103702284+AMLattanzi@users.noreply.github.com> Date: Mon, 21 Oct 2024 15:40:15 -0700 Subject: [PATCH 30/35] Data Sampler for Plane/Line Output (#1897) * Super rough but it plotted a line. * Need to test on multi-proc. * codespell fix. * Plot T and Wsp and clean up the realBox location. * Bump AMReX hash. --- Docs/sphinx_doc/Inputs.rst | 68 ++++++ Exec/ABL/inputs_DataSampler | 74 +++++++ Source/ERF.H | 6 + Source/ERF.cpp | 15 ++ Source/IO/ERF_SampleData.H | 412 ++++++++++++++++++++++++++++++++++++ Source/IO/Make.package | 2 + Submodules/AMReX | 2 +- 7 files changed, 578 insertions(+), 1 deletion(-) create mode 100644 Exec/ABL/inputs_DataSampler create mode 100644 Source/IO/ERF_SampleData.H diff --git a/Docs/sphinx_doc/Inputs.rst b/Docs/sphinx_doc/Inputs.rst index 791e4d1b9..b3559ff68 100644 --- a/Docs/sphinx_doc/Inputs.rst +++ b/Docs/sphinx_doc/Inputs.rst @@ -718,6 +718,74 @@ The requested output files have the following columns: #. SGS turbulence dissipation, :math:`\epsilon` (m2/s3) +Data Sampling Outputs +================== + +Data along query lines or planes may be output during the simulation if +``erf.do_line_sampling = true`` or ``erf.do_plane_sampling = true``, respectively. +The potential temperature and wind-speed will be written to native ``plt_line/plane`` +at the step frequency dictated by ``erf.sampler_interval = ``. For line sampling, +users must prescribe ``sample_line_lo`` and ``sample_line_hi`` inputs which are 3 integer +values corresponding to the (i,j,k) indices at the beginning and end of the line. +Additionally, users must specify ``sample_line_dir`` to prescribed the direction of +the line. The same inputs are used for the plane sampling except that ``sample_plane_lo/hi`` +must be the physical locations of the plane corners. This output functionality has +not been implemented for terrain. + +.. _list-of-parameters-10b: + + +List of Parameters +------------------ + ++-------------------------------+------------------+----------------+----------------+ +| Parameter | Definition | Acceptable | Default | +| | | Values | | ++===============================+==================+================+================+ +| **erf.sampler_interval** | Output | Integer | -1 | +| | frequency | | | ++-------------------------------+------------------+----------------+----------------+ +| **erf.do_line_sampling** | Flag to do line | Boolean | false | +| | sampling | | | +| | | | | ++-------------------------------+------------------+----------------+----------------+ +| **erf.do_plane_sampling** | Flag to do plane | Boolean | false | +| | sampling | | | +| | | | | ++-------------------------------+------------------+----------------+----------------+ +| **erf.sample_line_dir** | Directionality | Integer | None | +| | of the line | | | ++-------------------------------+------------------+----------------+----------------+ +| **erf.sample_plane_dir** | Directionality | Integer | None | +| | of the plane | | | ++-------------------------------+------------------+----------------+----------------+ +| **erf.sample_line_lo/hi** | Bounding (i,j,k) | 3 Integers per | None | +| | on the line(s) | line | | ++-------------------------------+------------------+----------------+----------------+ +| **erf.sample_plane_lo/hi** | Bounding point | 3 Reals per | None | +| | on the plane(s) | plane | | ++-------------------------------+------------------+----------------+----------------+ + +.. _examples-of-usage-10b: + +Example of Usage +----------------- + +:: + + erf.sampler_interval = 1 # Write plt files every step + + erf.do_line_sampling = true # Do line sampling + erf.sample_line_lo = 5 32 5 10 32 5 # Lo points for two lines + erf.sample_line_hi = 5 32 25 1000 32 5 # Hi points for two lines + erf.sample_line_dir = 2 0 # One line in z and one in x + + erf.do_plane_sampling = true # Do plane sampling + erf.sample_plane_lo = 48.0 48.0 32.0 # Lo points for one plane + erf.sample_plane_hi = 320.0 320.0 32.0 # Hi points for one plane + erf.sample_plane_dir = 2 # One plane with z normal + + Advection Schemes ================= diff --git a/Exec/ABL/inputs_DataSampler b/Exec/ABL/inputs_DataSampler new file mode 100644 index 000000000..ac46484c4 --- /dev/null +++ b/Exec/ABL/inputs_DataSampler @@ -0,0 +1,74 @@ +# ------------------ INPUTS TO MAIN PROGRAM ------------------- +max_step = 4000 + +amrex.fpe_trap_invalid = 1 + +fabarray.mfiter_tile_size = 1024 1024 1024 + +# PROBLEM SIZE & GEOMETRY +geometry.prob_extent = 1024 1024 1024 +amr.n_cell = 64 64 64 + +geometry.is_periodic = 1 1 0 + +zlo.type = "NoSlipWall" +zhi.type = "SlipWall" + +# TIME STEP CONTROL +erf.fixed_dt = 0.1 # fixed time step depending on grid resolution + +# DIAGNOSTICS & VERBOSITY +erf.sum_interval = 1 # timesteps between computing mass +erf.v = 1 # verbosity in ERF.cpp +amr.v = 1 # verbosity in Amr.cpp + +erf.data_log = my_data_file + +erf.sampler_interval = 1 +erf.do_line_sampling = true +erf.sample_line_lo = 5 32 5 10 32 5 +erf.sample_line_hi = 5 32 25 1000 32 5 +erf.sample_line_dir = 2 0 + +erf.do_plane_sampling = true +erf.sample_plane_lo = 48.0 48.0 32.0 +erf.sample_plane_hi = 320.0 320.0 32.0 +erf.sample_plane_dir = 2 + +# REFINEMENT / REGRIDDING +amr.max_level = 0 # maximum level number allowed + +# CHECKPOINT FILES +erf.check_file = chk # root name of checkpoint file +erf.check_int = 100 # number of timesteps between checkpoints + +# PLOTFILES +erf.plot_file_1 = plt # prefix of plotfile name +erf.plot_int_1 = 10 # number of timesteps between plotfiles +erf.plot_vars_1 = density rhoadv_0 x_velocity y_velocity z_velocity pressure temp theta + +# SOLVER CHOICE +erf.alpha_T = 0.0 +erf.alpha_C = 1.0 +erf.use_gravity = false + +erf.molec_diff_type = "None" +erf.les_type = "Smagorinsky" +erf.Cs = 0.1 + +erf.init_type = "uniform" + +# PROBLEM PARAMETERS +prob.rho_0 = 1.0 +prob.A_0 = 1.0 + +prob.U_0 = 10.0 +prob.V_0 = 0.0 +prob.W_0 = 0.0 +prob.T_0 = 300.0 + +# Higher values of perturbations lead to instability +# Instability seems to be coming from BC +prob.U_0_Pert_Mag = 0.08 +prob.V_0_Pert_Mag = 0.08 # +prob.W_0_Pert_Mag = 0.0 diff --git a/Source/ERF.H b/Source/ERF.H index 26c1f01a4..a977fa35a 100644 --- a/Source/ERF.H +++ b/Source/ERF.H @@ -44,6 +44,7 @@ #include #include #include +#include #ifdef ERF_USE_PARTICLES #include "ERF_ParticleData.H" @@ -1263,6 +1264,11 @@ private: amrex::ParallelDescriptor::Barrier("ERF::setRecordSampleLineInfo"); } + // Data sampler for line and plane output + int sampler_interval = -1; + amrex::Real sampler_per = -1.0; + std::unique_ptr data_sampler = nullptr; + amrex::Vector > datalog; amrex::Vector datalogname; diff --git a/Source/ERF.cpp b/Source/ERF.cpp index 85ffb5aec..ef6ec5bfc 100644 --- a/Source/ERF.cpp +++ b/Source/ERF.cpp @@ -538,6 +538,12 @@ ERF::post_timestep (int nstep, Real time, Real dt_lev0) } } + // Write plane/line sampler data + if (is_it_time_for_action(nstep, time, dt_lev0, sampler_interval, sampler_per) && (data_sampler) ) { + data_sampler->get_sample_data(geom, vars_new); + data_sampler->write_sample_data(t_new, istep, ref_ratio, geom); + } + // Moving terrain if ( solverChoice.use_terrain && (solverChoice.terrain_type == TerrainType::Moving) ) { @@ -1167,6 +1173,11 @@ ERF::InitData_post () } + // Create object to do line and plane sampling if needed + bool do_line = false; bool do_plane = false; + pp.query("do_line_sampling",do_line); pp.query("do_plane_sampling",do_plane); + if (do_line || do_plane) { data_sampler = std::make_unique(do_line, do_plane); } + #ifdef ERF_USE_EB bool write_eb_surface = false; pp.query("write_eb_surface", write_eb_surface); @@ -1495,6 +1506,10 @@ ERF::ReadParameters () pp.query("column_loc_y", column_loc_y); pp.query("column_file_name", column_file_name); + // Sampler output frequency + pp.query("sampler_per", sampler_per); + pp.query("sampler_interval", sampler_interval); + // Specify information about outputting planes of data pp.query("output_bndry_planes", output_bndry_planes); pp.query("bndry_output_planes_interval", bndry_output_planes_interval); diff --git a/Source/IO/ERF_SampleData.H b/Source/IO/ERF_SampleData.H new file mode 100644 index 000000000..30ddd9454 --- /dev/null +++ b/Source/IO/ERF_SampleData.H @@ -0,0 +1,412 @@ +#ifndef ERF_SAMPLEDATA_H +#define ERF_SAMPLEDATA_H + +#include + +#include +#include +#include +#include + +#include + +struct LineSampler +{ + LineSampler () + { + amrex::ParmParse pp("erf"); + + // Count number of lo and hi points define the line + int n_line_lo = pp.countval("sample_line_lo") / AMREX_SPACEDIM; + int n_line_hi = pp.countval("sample_line_hi") / AMREX_SPACEDIM; + int n_line_dir = pp.countval("sample_line_dir"); + AMREX_ALWAYS_ASSERT( (n_line_lo==n_line_hi ) && + (n_line_lo==n_line_dir) ); + + // Parse the data + if (n_line_lo > 0) { + // Parse lo + amrex::Vector idx_lo; idx_lo.resize(n_line_lo*AMREX_SPACEDIM); + amrex::Vector iv_lo; iv_lo.resize(n_line_lo); + pp.queryarr("sample_line_lo",idx_lo,0,n_line_lo*AMREX_SPACEDIM); + for (int i(0); i < n_line_lo; i++) { + amrex::IntVect iv(idx_lo[AMREX_SPACEDIM*i+0], + idx_lo[AMREX_SPACEDIM*i+1], + idx_lo[AMREX_SPACEDIM*i+2]); + iv_lo[i] = iv; + } + + // Parse hi + amrex::Vector idx_hi; idx_hi.resize(n_line_hi*AMREX_SPACEDIM); + amrex::Vector iv_hi; iv_hi.resize(n_line_hi); + pp.queryarr("sample_line_hi",idx_hi,0,n_line_hi*AMREX_SPACEDIM); + for (int i(0); i < n_line_hi; i++) { + amrex::IntVect iv(idx_hi[AMREX_SPACEDIM*i+0], + idx_hi[AMREX_SPACEDIM*i+1], + idx_hi[AMREX_SPACEDIM*i+2]); + iv_hi[i] = iv; + } + + // Construct vector of bounding boxes + m_bnd_bx.resize(n_line_lo); + for (int i = 0; i < n_line_hi; i++){ + amrex::Box lbx(iv_lo[i],iv_hi[i]); + m_bnd_bx[i] = lbx; + } + + // Parse directionality + m_dir.resize(n_line_dir); + pp.queryarr("sample_line_dir",m_dir,0,n_line_dir); + + // Allocate space for level indicator + m_lev.resize(n_line_dir,0); + + // Allocate space for MF pointers + m_ls_mf.resize(n_line_lo); + } + } + + void + get_line_mfs (amrex::Vector>& vars_new) + { + int nlev = vars_new.size(); + int nline = m_bnd_bx.size(); + int ncomp = 2; + + // Loop over each line + for (int iline(0); iline=0; --ilev) { + + // Construct CC velocities + amrex::MultiFab mf_cc_vel; + auto ba = vars_new[ilev][Vars::cons].boxArray(); + auto dm = vars_new[ilev][Vars::cons].DistributionMap(); + mf_cc_vel.define(ba, dm, AMREX_SPACEDIM, amrex::IntVect(1,1,1)); + average_face_to_cellcenter(mf_cc_vel,0, + amrex::Array{&vars_new[ilev][Vars::xvel], + &vars_new[ilev][Vars::yvel], + &vars_new[ilev][Vars::zvel]}); + + // Construct vector of MFs holding T and WSP + amrex::MultiFab mf_cc_data; + mf_cc_data.define(ba, dm, ncomp, 1); +#ifdef _OPENMP +#pragma omp parallel if (amrex::Gpu::notInLaunchRegion()) +#endif + for (amrex::MFIter mfi(mf_cc_data, amrex::TilingIfNotGPU()); mfi.isValid(); ++mfi) { + const amrex::Box& tbx = mfi.tilebox(); + auto const& dfab = mf_cc_data.array(mfi); + auto const& tfab = vars_new[ilev][Vars::cons].array(mfi); + auto const& wfab = mf_cc_vel.array(mfi); + amrex::ParallelFor(tbx, [=] AMREX_GPU_DEVICE(int i, int j, int k) noexcept + { + dfab(i,j,k,0) = tfab(i,j,k,1)/tfab(i,j,k,0); + dfab(i,j,k,1) = std::sqrt(wfab(i,j,k,0)*wfab(i,j,k,0) + + wfab(i,j,k,1)*wfab(i,j,k,1) + + wfab(i,j,k,2)*wfab(i,j,k,2)) ; + }); + + } + + m_lev[iline] = ilev; + m_ls_mf[iline] = get_line_data(mf_cc_data, dir, cell, bnd_bx); + + // We can stop if we got the entire line + auto min_bnd_bx = m_ls_mf[iline].boxArray().minimalBox(); + if (bnd_bx == min_bnd_bx) { continue; } + + } // ilev + }// iline + } + + void + write_line_mfs (amrex::Vector& time, + amrex::Vector& level_steps, + amrex::Vector& ref_ratio, + amrex::Vector& geom) + { + std::string name_base = "plt_line_"; + amrex::Vector varnames = {"T", "Wsp"}; + + int nline = m_ls_mf.size(); + for (int iline(0); iline m_level_steps = {level_steps[lev]}; + amrex::Vector m_ref_ratio = {ref_ratio[lev]}; + + // Create modified geometry object corresponding to the line + auto plo = geom[lev].ProbLo(); + auto dx = geom[lev].CellSize(); + amrex::Vector m_geom; m_geom.resize(1); + amrex::Vector is_per(AMREX_SPACEDIM,0); + amrex::Box m_dom = m_bnd_bx[iline]; + amrex::RealBox m_rb; + for (int d(0); d mf = {&(m_ls_mf[iline])}; + + // Write each line + WriteMultiLevelPlotfile(plotfilename, 1, mf, + varnames, m_geom, m_time, + m_level_steps, m_ref_ratio); + } + } + + amrex::Vector m_dir; + amrex::Vector m_lev; + amrex::Vector m_bnd_bx; + amrex::Vector m_ls_mf; +}; + + +struct PlaneSampler +{ + PlaneSampler () + { + amrex::ParmParse pp("erf"); + + // Count number of lo and hi points define the plane + int n_plane_lo = pp.countval("sample_plane_lo") / AMREX_SPACEDIM; + int n_plane_hi = pp.countval("sample_plane_hi") / AMREX_SPACEDIM; + int n_plane_dir = pp.countval("sample_plane_dir"); + AMREX_ALWAYS_ASSERT( (n_plane_lo==n_plane_hi ) && + (n_plane_lo==n_plane_dir) ); + + // Parse the data + if (n_plane_lo > 0) { + // Parse lo + amrex::Vector r_lo; r_lo.resize(n_plane_lo*AMREX_SPACEDIM); + amrex::Vector> rv_lo; + pp.queryarr("sample_plane_lo",r_lo,0,n_plane_lo*AMREX_SPACEDIM); + for (int i(0); i < n_plane_lo; i++) { + amrex::Vector rv = {r_lo[AMREX_SPACEDIM*i+0], + r_lo[AMREX_SPACEDIM*i+1], + r_lo[AMREX_SPACEDIM*i+2]}; + rv_lo.push_back(rv); + } + + // Parse hi + amrex::Vector r_hi; r_hi.resize(n_plane_hi*AMREX_SPACEDIM); + amrex::Vector> rv_hi; + pp.queryarr("sample_plane_hi",r_hi,0,n_plane_hi*AMREX_SPACEDIM); + for (int i(0); i < n_plane_hi; i++) { + amrex::Vector rv = {r_hi[AMREX_SPACEDIM*i+0], + r_hi[AMREX_SPACEDIM*i+1], + r_hi[AMREX_SPACEDIM*i+2]}; + rv_hi.push_back(rv); + } + + // Construct vector of bounding real boxes + m_bnd_rbx.resize(n_plane_lo); + for (int i(0); i < n_plane_hi; i++){ + amrex::RealBox rbx(rv_lo[i].data(),rv_hi[i].data()); + m_bnd_rbx[i] = rbx; + } + + // Parse directionality + m_dir.resize(n_plane_dir); + pp.queryarr("sample_plane_dir",m_dir,0,n_plane_dir); + + // Allocate space for level indicator + m_lev.resize(n_plane_dir,0); + + // Allocate space for MF pointers + m_ps_mf.resize(n_plane_lo); + } + } + + // This must match what is in AMReX_MultiFabUtil.H + amrex::Box + getIndexBox (const amrex::RealBox& real_box, + const amrex::Geometry& geom) { + amrex::IntVect slice_lo, slice_hi; + + AMREX_D_TERM(slice_lo[0]=static_cast(std::floor((real_box.lo(0) - geom.ProbLo(0))/geom.CellSize(0)));, + slice_lo[1]=static_cast(std::floor((real_box.lo(1) - geom.ProbLo(1))/geom.CellSize(1)));, + slice_lo[2]=static_cast(std::floor((real_box.lo(2) - geom.ProbLo(2))/geom.CellSize(2)));); + + AMREX_D_TERM(slice_hi[0]=static_cast(std::floor((real_box.hi(0) - geom.ProbLo(0))/geom.CellSize(0)));, + slice_hi[1]=static_cast(std::floor((real_box.hi(1) - geom.ProbLo(1))/geom.CellSize(1)));, + slice_hi[2]=static_cast(std::floor((real_box.hi(2) - geom.ProbLo(2))/geom.CellSize(2)));); + + return amrex::Box(slice_lo, slice_hi) & geom.Domain(); + } + + void + get_plane_mfs (amrex::Vector& geom, + amrex::Vector>& vars_new) + { + int nlev = vars_new.size(); + int nplane = m_bnd_rbx.size(); + int ncomp = 2; + bool interpolate = true; + + // Loop over each plane + for (int iplane(0); iplane=0; --ilev) { + + // Construct CC velocities + amrex::MultiFab mf_cc_vel; + auto ba = vars_new[ilev][Vars::cons].boxArray(); + auto dm = vars_new[ilev][Vars::cons].DistributionMap(); + mf_cc_vel.define(ba, dm, AMREX_SPACEDIM, amrex::IntVect(1,1,1)); + average_face_to_cellcenter(mf_cc_vel,0, + amrex::Array{&vars_new[ilev][Vars::xvel], + &vars_new[ilev][Vars::yvel], + &vars_new[ilev][Vars::zvel]}); + + // Construct vector of MFs holding T and WSP + amrex::MultiFab mf_cc_data; + mf_cc_data.define(ba, dm, ncomp, 1); +#ifdef _OPENMP +#pragma omp parallel if (amrex::Gpu::notInLaunchRegion()) +#endif + for (amrex::MFIter mfi(mf_cc_data, amrex::TilingIfNotGPU()); mfi.isValid(); ++mfi) { + const amrex::Box& tbx = mfi.tilebox(); + auto const& dfab = mf_cc_data.array(mfi); + auto const& tfab = vars_new[ilev][Vars::cons].array(mfi); + auto const& wfab = mf_cc_vel.array(mfi); + amrex::ParallelFor(tbx, [=] AMREX_GPU_DEVICE(int i, int j, int k) noexcept + { + dfab(i,j,k,0) = tfab(i,j,k,1)/tfab(i,j,k,0); + dfab(i,j,k,1) = std::sqrt(wfab(i,j,k,0)*wfab(i,j,k,0) + + wfab(i,j,k,1)*wfab(i,j,k,1) + + wfab(i,j,k,2)*wfab(i,j,k,2)) ; + }); + + } + + m_lev[iplane] = ilev; + m_ps_mf[iplane] = get_slice_data(dir, point, mf_cc_data, geom[ilev], + 0, ncomp, interpolate, bnd_rbx); + + // We can stop if we got the entire plane + auto min_bnd_bx = m_ps_mf[iplane]->boxArray().minimalBox(); + amrex::Box bnd_bx = getIndexBox(bnd_rbx, geom[ilev]); + if (bnd_bx == min_bnd_bx) { continue; } + + } // ilev + }// iplane + } + + void + write_plane_mfs (amrex::Vector& time, + amrex::Vector& level_steps, + amrex::Vector& ref_ratio, + amrex::Vector& geom) + { + std::string name_base = "plt_plane_"; + amrex::Vector varnames = {"T", "Wsp"}; + + int nplane = m_ps_mf.size(); + for (int iplane(0); iplane m_level_steps = {level_steps[lev]}; + amrex::Vector m_ref_ratio = {ref_ratio[lev]}; + + // Create modified geometry object corresponding to the plane + amrex::RealBox m_rb = m_bnd_rbx[iplane]; + amrex::Box m_dom = getIndexBox(m_rb, geom[lev]); + amrex::Real point = m_rb.hi(dir); + amrex::Vector is_per(AMREX_SPACEDIM,0); + for (int d(0); d m_geom; m_geom.resize(1); + m_geom[0].define(m_dom, &m_rb, geom[lev].Coord(), is_per.data()); + + // Create plotfile name + std::string name_plane = amrex::Concatenate(name_base, iplane , 5); + name_plane += "_step_"; + std::string plotfilename = amrex::Concatenate(name_plane, m_level_steps[0], 5); + + // Get the data + amrex::Vector mf = {m_ps_mf[iplane].get()}; + + // Write each plane + WriteMultiLevelPlotfile(plotfilename, 1, mf, + varnames, m_geom, m_time, + m_level_steps, m_ref_ratio); + } // iplane + } + + amrex::Vector m_dir; + amrex::Vector m_lev; + amrex::Vector m_bnd_rbx; + amrex::Vector> m_ps_mf; +}; + + +class SampleData +{ +public: + explicit SampleData (bool do_line=false, + bool do_plane=false) + { + if(do_line) m_ls = std::make_unique(); + if(do_plane) m_ps = std::make_unique(); + } + + void + get_sample_data (amrex::Vector& geom, + amrex::Vector>& vars_new) + { + if (m_ls) m_ls->get_line_mfs(vars_new); + if (m_ps) m_ps->get_plane_mfs(geom, vars_new); + } + + void + write_sample_data (amrex::Vector& time, + amrex::Vector& level_steps, + amrex::Vector& ref_ratio, + amrex::Vector& geom) + { + if (m_ls) m_ls->write_line_mfs(time, level_steps, ref_ratio, geom); + if (m_ls) m_ps->write_plane_mfs(time, level_steps, ref_ratio, geom); + } + +private: + + // Structures for getting line MFs + std::unique_ptr m_ls = nullptr; + + // Structures for getting plane MFs + std::unique_ptr m_ps = nullptr; +}; +#endif diff --git a/Source/IO/Make.package b/Source/IO/Make.package index 4f6f079c9..d2369a85f 100644 --- a/Source/IO/Make.package +++ b/Source/IO/Make.package @@ -14,6 +14,8 @@ CEXE_sources += ERF_WriteScalarProfiles.cpp CEXE_sources += ERF_console_io.cpp +CEXE_headers += ERF_SampleData.H + ifeq ($(USE_NETCDF), TRUE) CEXE_sources += ERF_ReadFromWRFBdy.cpp CEXE_sources += ERF_ReadFromWRFInput.cpp diff --git a/Submodules/AMReX b/Submodules/AMReX index 62c2a81ea..c333708d5 160000 --- a/Submodules/AMReX +++ b/Submodules/AMReX @@ -1 +1 @@ -Subproject commit 62c2a81eac7862d526e5861ef2befc00b7f5b759 +Subproject commit c333708d59f01ab664363ba426e85ad24c1fb23d From 8941a5459a9787bb08ac1aaca1354085251e8ce7 Mon Sep 17 00:00:00 2001 From: David Gardner Date: Wed, 23 Oct 2024 15:33:00 -0700 Subject: [PATCH 31/35] Add initial LC GitLab CI (#1904) Co-authored-by: Cole Kendrick --- .gitlab/LC/.gitlab-ci.yml | 95 +++++++++++++++++++++++++++++++++ .gitlab/LC/gitlab_test.sh | 99 +++++++++++++++++++++++++++++++++++ .gitlab/LC/runners/dane.yml | 59 +++++++++++++++++++++ .gitlab/LC/runners/lassen.yml | 34 ++++++++++++ .gitlab/LC/runners/tioga.yml | 60 +++++++++++++++++++++ CMakeLists.txt | 18 +++++-- Tests/CMakeLists.txt | 15 ++++-- Tests/CTestList.cmake | 4 +- 8 files changed, 373 insertions(+), 11 deletions(-) create mode 100644 .gitlab/LC/.gitlab-ci.yml create mode 100755 .gitlab/LC/gitlab_test.sh create mode 100644 .gitlab/LC/runners/dane.yml create mode 100644 .gitlab/LC/runners/lassen.yml create mode 100644 .gitlab/LC/runners/tioga.yml diff --git a/.gitlab/LC/.gitlab-ci.yml b/.gitlab/LC/.gitlab-ci.yml new file mode 100644 index 000000000..c42d6f952 --- /dev/null +++ b/.gitlab/LC/.gitlab-ci.yml @@ -0,0 +1,95 @@ +variables: + CUSTOM_CI_BUILDS_DIR: "/usr/workspace/$$USER/erf_gitlab_runner" + + GIT_STRATEGY: fetch + GIT_SUBMODULE_STRATEGY: recursive + GIT_DEPTH: 1 + GIT_SUBMODULE_DEPTH: 1 + + DEFAULT_BRANCH: llnl/development + + ALLOC_NAME: ${CI_PROJECT_NAME}_ci_${CI_PIPELINE_ID} + ALLOC_QUEUE: pci + ALLOC_TIME: 30 + ALLOC_BANK: accatm + + TEST_SCRIPT: .gitlab/LC/gitlab_test.sh + + # Uncomment to disable testing on particular system + #ON_LASSEN: "OFF" + #ON_DANE: "OFF" + #ON_TIOGA: "OFF" + +stages: + - style + - allocate + - build + - release + +workflow: + rules: + # skip running branch pipelines if a MR is open for the branch + - if: $CI_COMMIT_BRANCH && $CI_OPEN_MERGE_REQUESTS && $CI_PIPELINE_SOURCE == "push" + when: never + - if: $CI_PIPELINE_SOURCE == 'merge_request_event' + - if: $CI_PIPELINE_SOURCE == 'web' + - if: $CI_COMMIT_TAG + - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH + # test the upstream branch + - if: $CI_COMMIT_BRANCH == 'development' + # branches starting with "gitlab" + - if: $CI_COMMIT_BRANCH =~ /^gitlab.*/ + +include: + # This include is required for LC with Gitlab 17+ + # Refer to https://hpc.llnl.gov/technical-bulletins/bulletin-568 + - project: 'lc-templates/id_tokens' + file: 'id_tokens.yml' + - .gitlab/LC/runners/lassen.yml + - .gitlab/LC/runners/dane.yml + - .gitlab/LC/runners/tioga.yml + +# Define actual CI jobs here: +check_style: + extends: .on_dane + stage: style + rules: + # always run the style check on any push event + - if: $CI_PIPELINE_SOURCE == "push" + - when: on_success + script: + - echo "Running check_tabs.sh" + - .github/workflows/style/check_tabs.sh + - echo "Running check_trailing_whitespaces.sh" + - .github/workflows/style/check_trailing_whitespaces.sh + +dane_gcc_12_1_1: + variables: + MODULE_LIST: cmake gcc/12.1.1 + extends: .job_on_dane + +lassen_gcc_12_2_1: + variables: + MODULE_LIST: cmake/3.23.1 gcc/12.2.1 + extends: .job_on_lassen + +lassen_gcc_12_2_1_cuda: + variables: + MODULE_LIST: cmake/3.23.1 gcc/12.2.1 cuda/12.2.2 + ERF_ENABLE_CUDA: "ON" + # NOTE: c++ and cc are used here over mpicxx/mpicc due to cmake issue finding mpi with cuda? + CMAKE_CXX_COMPILER: c++ + CMAKE_C_COMPILER: cc + CUDA_ARCH: "70" + ERF_TEST_FCOMPARE_RTOL: "1.0e-8" + ERF_TEST_FCOMPARE_ATOL: "1.0e-9" + extends: .job_on_lassen + +tioga_hip_5.7.1: + variables: + MODULE_LIST: cmake/3.24.2 rocm/6.1.2 rocmcc/6.1.2-cce-18.0.0-magic craype-accel-amd-gfx90a + ERF_ENABLE_HIP: "ON" + AMD_ARCH: "gfx90a" + # NOTE: Running with Debug build type causes AMD linking errors with AMReX plotfiles=ON + BUILD_TYPE: "RelWithDebInfo" + extends: .job_on_tioga diff --git a/.gitlab/LC/gitlab_test.sh b/.gitlab/LC/gitlab_test.sh new file mode 100755 index 000000000..9ca01fbc1 --- /dev/null +++ b/.gitlab/LC/gitlab_test.sh @@ -0,0 +1,99 @@ +#!/usr/bin/env bash + +set -o errexit +set -o nounset +set -o pipefail + +modules=${MODULE_LIST:-""} +mpiexec_executable=${MPIEXEC_EXECUTABLE:-"srun"} +# If using flux, append "run" after the flux executable path +if [[ "${mpiexec_executable}" == "flux" ]] +then + mpiexec_executable="$(which ${mpiexec_executable}) run" + flux jobs + flux resource list +else + mpiexec_executable="$(which ${mpiexec_executable})" +fi + +mpiexec_preflags=${MPIEXEC_PREFLAGS:-""} +host=$(hostname) +build_type=${BUILD_TYPE:-"Debug"} + +ERF_ENABLE_CUDA=${ERF_ENABLE_CUDA:-"OFF"} + +basehost=${host//[[:digit:]]/} + +echo ${host} + +build_dir=build_${host}_${CI_PIPELINE_ID}_$(date +%F_%H_%M_%S) + +if [[ -n ${modules} ]] +then + module load ${modules} +fi + +# Temporary workaround for CUDA builds: +# AMReX fcompare seems to not work as expected if compiled with CUDA. +# This builds a CPU version first and uses that fcompare executable during the +# testing for the CUDA build +if [[ "${ERF_ENABLE_CUDA}" == "ON" ]] +then + echo "=====================================================" + echo "Building CPU version first to get fcompare executable" + echo "=====================================================" + mkdir "${build_dir}_cpu" + cd "${build_dir}_cpu" + pwd + + cmake -DCMAKE_INSTALL_PREFIX:PATH=./install \ + -DCMAKE_CXX_COMPILER:STRING=${CMAKE_CXX_COMPILER:-"mpicxx"} \ + -DCMAKE_C_COMPILER:STRING=${CMAKE_C_COMPILER:-"mpicc"} \ + -DCMAKE_Fortran_COMPILER:STRING=${CMAKE_Fortran_COMPILER:-"mpifort"} \ + -DCMAKE_BUILD_TYPE:STRING=Release \ + -DERF_DIM:STRING=3 \ + -DERF_ENABLE_MPI:BOOL=ON \ + -DERF_ENABLE_CUDA:BOOL=OFF \ + -DERF_ENABLE_TESTS:BOOL=OFF \ + -DERF_ENABLE_FCOMPARE:BOOL=ON \ + -DERF_ENABLE_DOCUMENTATION:BOOL=OFF \ + -DCMAKE_EXPORT_COMPILE_COMMANDS:BOOL=ON .. + make -j fcompare + + FCOMPARE_EXE="$(pwd)/Submodules/AMReX/Tools/Plotfile/amrex_fcompare" + + cd ../ + + echo "=====================================================" + echo "Using fcompare executable at: ${FCOMPARE_EXE}" + echo "=====================================================" +fi + +mkdir ${build_dir} +cd ${build_dir} +pwd + +cmake -DCMAKE_INSTALL_PREFIX:PATH=./install \ + -DCMAKE_CXX_COMPILER:STRING=${CMAKE_CXX_COMPILER:-"mpicxx"} \ + -DCMAKE_C_COMPILER:STRING=${CMAKE_C_COMPILER:-"mpicc"} \ + -DCMAKE_Fortran_COMPILER:STRING=${CMAKE_Fortran_COMPILER:-"mpifort"} \ + -DMPIEXEC_EXECUTABLE="${mpiexec_executable}" \ + -DMPIEXEC_PREFLAGS:STRING="${mpiexec_preflags}" \ + -DCMAKE_BUILD_TYPE:STRING="${build_type}" \ + -DERF_DIM:STRING=3 \ + -DERF_ENABLE_MPI:BOOL=ON \ + -DERF_ENABLE_CUDA:BOOL="${ERF_ENABLE_CUDA}" \ + -DAMReX_CUDA_ARCH:STRING="${CUDA_ARCH:-""}" \ + -DERF_ENABLE_HIP:BOOL="${ERF_ENABLE_HIP:-"OFF"}" \ + -DAMReX_AMD_ARCH:STRING="${AMD_ARCH:-""}" \ + -DERF_ENABLE_TESTS:BOOL=ON \ + -DERF_TEST_NRANKS:STRING=${ERF_TEST_NRANKS:-"4"} \ + -DERF_ENABLE_FCOMPARE:BOOL=ON \ + -DERF_ENABLE_DOCUMENTATION:BOOL=OFF \ + -DFCOMPARE_EXE="${FCOMPARE_EXE:-"$(pwd)/Submodules/AMReX/Tools/Plotfile/amrex_fcompare"}" \ + -DERF_TEST_FCOMPARE_RTOL="${ERF_TEST_FCOMPARE_RTOL:-"5.0e-9"}" \ + -DERF_TEST_FCOMPARE_ATOL="${ERF_TEST_FCOMPARE_ATOL:-"2.0e-10"}" \ + -DCMAKE_EXPORT_COMPILE_COMMANDS:BOOL=ON \ + .. +make -j ${OMP_NUM_THREADS:-16} +ctest -VV --output-on-failure diff --git a/.gitlab/LC/runners/dane.yml b/.gitlab/LC/runners/dane.yml new file mode 100644 index 000000000..5dfa29f33 --- /dev/null +++ b/.gitlab/LC/runners/dane.yml @@ -0,0 +1,59 @@ +.retry: + retry: + max: 2 + when: + - runner_system_failure + +.on_dane: + extends: + - .retry + tags: + - dane + - shell + rules: + - if: '$ON_DANE == "OFF"' + when: never + # test the upstream branch + - if: $CI_COMMIT_BRANCH == 'development' + # branches starting with "gitlab" + - if: $CI_COMMIT_BRANCH =~ /^gitlab.*/ + - if: $CI_PIPELINE_SOURCE == "push" + when: never + - if: $CI_PIPELINE_SOURCE == "merge_request_event" + - if: $CI_COMMIT_BRANCH == $DEFAULT_BRANCH + - if: '$CI_JOB_NAME =~ /release_resources_dane/' + when: always + - when: on_success + +allocate_resources_dane: + variables: + GIT_STRATEGY: none + extends: + - .on_dane + stage: allocate + script: + - salloc -N 1 --reservation=ci -A ${ALLOC_BANK} --time=${ALLOC_TIME} --no-shell --job-name=${ALLOC_NAME} + +release_resources_dane: + variables: + GIT_STRATEGY: none + extends: + - .on_dane + stage: release + script: + - export JOBID=$(squeue -h --name=${ALLOC_NAME} --format=%A) + - ([[ -n "${JOBID}" ]] && scancel ${JOBID}) + when: always + +.job_on_dane: + extends: .on_dane + stage: build + needs: ["allocate_resources_dane"] + variables: + MPIEXEC_EXECUTABLE: srun + MPIEXEC_PREFLAGS: "--cpu-bind=cores -v" + script: + - echo "JOB NAME ${ALLOC_NAME}" + - export JOBID=$(squeue -h --name=${ALLOC_NAME} --format=%A) + - echo "SLURM ID ${JOBID}" + - srun $( [[ -n "${JOBID}" ]] && echo "--jobid=${JOBID}" ) -N 1 -t ${ALLOC_TIME} -v --overlap ${TEST_SCRIPT} diff --git a/.gitlab/LC/runners/lassen.yml b/.gitlab/LC/runners/lassen.yml new file mode 100644 index 000000000..bdefb3f85 --- /dev/null +++ b/.gitlab/LC/runners/lassen.yml @@ -0,0 +1,34 @@ +.retry: + retry: + max: 2 + when: + - runner_system_failure + +.on_lassen: + extends: + - .retry + tags: + - lassen + - shell + rules: + - if: '$ON_LASSEN == "OFF"' + when: never + # test the upstream branch + - if: $CI_COMMIT_BRANCH == 'development' + # branches starting with "gitlab" + - if: $CI_COMMIT_BRANCH =~ /^gitlab.*/ + - if: $CI_PIPELINE_SOURCE == "push" + when: never + - if: $CI_PIPELINE_SOURCE == "merge_request_event" + - if: $CI_COMMIT_BRANCH == $DEFAULT_BRANCH + - when: on_success + +.job_on_lassen: + extends: .on_lassen + stage: build + needs: [] + variables: + MPIEXEC_EXECUTABLE: jsrun + MPIEXEC_PREFLAGS: "-a 1 -c 1 -g 1" + script: + - bsub -q ${ALLOC_QUEUE} -W ${ALLOC_TIME} -G ${ALLOC_BANK} -J ${ALLOC_NAME} -nnodes 1 -Is ${TEST_SCRIPT} diff --git a/.gitlab/LC/runners/tioga.yml b/.gitlab/LC/runners/tioga.yml new file mode 100644 index 000000000..eecf7f9a3 --- /dev/null +++ b/.gitlab/LC/runners/tioga.yml @@ -0,0 +1,60 @@ +.retry: + retry: + max: 2 + when: + - runner_system_failure + +.on_tioga: + extends: + - .retry + tags: + - tioga + - shell + rules: + - if: '$ON_TIOGA == "OFF"' + when: never + # test the upstream branch + - if: $CI_COMMIT_BRANCH == 'development' + # branches starting with "gitlab" + - if: $CI_COMMIT_BRANCH =~ /^gitlab.*/ + - if: $CI_PIPELINE_SOURCE == "push" + when: never + - if: $CI_PIPELINE_SOURCE == "merge_request_event" + - if: $CI_COMMIT_BRANCH == $DEFAULT_BRANCH + - if: '$CI_JOB_NAME =~ /release_resources_tioga/' + when: always + - when: on_success + +allocate_resources_tioga: + variables: + GIT_STRATEGY: none + extends: + - .on_tioga + stage: allocate + script: + - flux alloc -N 1 -q ${ALLOC_QUEUE} -t=${ALLOC_TIME} --bg --exclusive --job-name=${ALLOC_NAME} + +release_resources_tioga: + variables: + GIT_STRATEGY: none + extends: + - .on_tioga + stage: release + script: + - export JOBID=$(flux jobs -n --name=${ALLOC_NAME} --format="{id}") + - ([[ -n "${JOBID}" ]] && flux cancel ${JOBID}) + when: always + +.job_on_tioga: + extends: .on_tioga + stage: build + needs: ["allocate_resources_tioga"] + variables: + # Note: "flux" gets expanded to "flux run" inside build script + MPIEXEC_EXECUTABLE: flux + MPIEXEC_PREFLAGS: "-c 1 -g 1 -o mpi-spectrum -o cpu-affinity=per-task -o gpu-affinity=per-task -vv" + script: + - echo "JOB NAME ${ALLOC_NAME}" + - export JOBID=$(flux jobs -n --name=${ALLOC_NAME} --format="{id}") + - echo "FLUX ID ${JOBID}" + - flux proxy $( [[ -n "${JOBID}" ]] && echo "${JOBID}" ) flux run -N 1 -n 1 -c 16 -vv ${TEST_SCRIPT} diff --git a/CMakeLists.txt b/CMakeLists.txt index 1e59c3c5b..03fb265ad 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -78,8 +78,13 @@ if (${ERF_USE_INTERNAL_AMREX}) ########################### AMReX ##################################### add_subdirectory(${AMREX_SUBMOD_LOCATION}) - set(FCOMPARE_EXE ${CMAKE_BINARY_DIR}/Submodules/AMReX/Tools/Plotfile/amrex_fcompare - CACHE INTERNAL "Path to fcompare executable for regression tests") + if(WIN32) + set(FCOMPARE_EXE ${CMAKE_BINARY_DIR}/Submodules/AMReX/Tools/Plotfile/*/amrex_fcompare.exe + CACHE STRING "Path to fcompare executable for regression tests") + else() + set(FCOMPARE_EXE ${CMAKE_BINARY_DIR}/Submodules/AMReX/Tools/Plotfile/amrex_fcompare + CACHE STRING "Path to fcompare executable for regression tests") + endif() else() set(CMAKE_PREFIX_PATH ${AMREX_DIR} ${CMAKE_PREFIX_PATH}) list(APPEND AMREX_COMPONENTS @@ -109,8 +114,13 @@ else() find_package(AMReX CONFIG REQUIRED COMPONENTS ${AMREX_COMPONENTS}) message(STATUS "Found AMReX = ${AMReX_DIR}") - set(FCOMPARE_EXE ${AMReX_DIR}/../../../bin/amrex_fcompare - CACHE INTERNAL "Path to fcompare executable for regression tests") + if(WIN32) + set(FCOMPARE_EXE ${AMReX_DIR}/../../../*/amrex_fcompare.exe + CACHE STRING "Path to fcompare executable for regression tests") + else() + set(FCOMPARE_EXE ${AMReX_DIR}/../../../bin/amrex_fcompare + CACHE STRING "Path to fcompare executable for regression tests") + endif() endif() ########################## NETCDF ################################## diff --git a/Tests/CMakeLists.txt b/Tests/CMakeLists.txt index 1e1dbaf82..4a5aa706a 100644 --- a/Tests/CMakeLists.txt +++ b/Tests/CMakeLists.txt @@ -1,7 +1,12 @@ -if(WIN32) - set(FCOMPARE_EXE ${CMAKE_BINARY_DIR}/Submodules/AMReX/Tools/Plotfile/*/amrex_fcompare.exe CACHE INTERNAL "Path to fcompare executable for regression tests") -else() - set(FCOMPARE_EXE ${CMAKE_BINARY_DIR}/Submodules/AMReX/Tools/Plotfile/amrex_fcompare CACHE INTERNAL "Path to fcompare executable for regression tests") -endif() +# Additional testing options set(ERF_TEST_NRANKS 2 CACHE STRING "Number of MPI ranks to use for each test") +set(ERF_TEST_FCOMPARE_RTOL "2.0e-10" CACHE STRING "fcompare relative tolerance") +set(ERF_TEST_FCOMPARE_ATOL "2.0e-10" CACHE STRING "fcompare absolute tolerance") + +message(STATUS "ERF testing configuration summary:") +message(STATUS " Number of ranks = ${ERF_TEST_NRANKS}") +message(STATUS " fcompare executable = ${FCOMPARE_EXE}") +message(STATUS " comparison relative tolerance = ${ERF_TEST_FCOMPARE_RTOL}") +message(STATUS " comparison absolute tolerance = ${ERF_TEST_FCOMPARE_ATOL}") + include(${CMAKE_CURRENT_SOURCE_DIR}/CTestList.cmake) diff --git a/Tests/CTestList.cmake b/Tests/CTestList.cmake index 62428e1f5..231bdf855 100644 --- a/Tests/CTestList.cmake +++ b/Tests/CTestList.cmake @@ -43,7 +43,7 @@ function(add_test_r TEST_NAME TEST_EXE PLTFILE) endif() set(TEST_EXE ${CMAKE_BINARY_DIR}/Exec/${TEST_EXE}) - set(FCOMPARE_TOLERANCE "-r 2e-10 --abs_tol 2.0e-10") + set(FCOMPARE_TOLERANCE "-r ${ERF_TEST_FCOMPARE_RTOL} --abs_tol ${ERF_TEST_FCOMPARE_ATOL}") set(FCOMPARE_FLAGS "--abort_if_not_all_found -a ${FCOMPARE_TOLERANCE}") set(test_command sh -c "${MPI_COMMANDS} ${TEST_EXE} ${CURRENT_TEST_BINARY_DIR}/${TEST_NAME}.i ${RUNTIME_OPTIONS} > ${TEST_NAME}.log && ${MPI_FCOMP_COMMANDS} ${FCOMPARE_EXE} ${FCOMPARE_FLAGS} ${PLOT_GOLD} ${CURRENT_TEST_BINARY_DIR}/${PLTFILE}") @@ -85,7 +85,7 @@ function(add_test_0 TEST_NAME TEST_EXE PLTFILE) set(TEST_EXE ${CMAKE_BINARY_DIR}/Exec/${TEST_EXE}) set(FCOMPARE_TOLERANCE "-r 1e-14 --abs_tol 1.0e-14") set(FCOMPARE_FLAGS "-a ${FCOMPARE_TOLERANCE}") - set(test_command sh -c "${MPI_COMMANDS} ${TEST_EXE} ${CURRENT_TEST_BINARY_DIR}/${TEST_NAME}.i erf.input_sounding_file=${CURRENT_TEST_BINARY_DIR}/input_sounding > ${TEST_NAME}.log && ${FCOMPARE_EXE} ${FCOMPARE_FLAGS} ${CURRENT_TEST_BINARY_DIR}/plt00000 ${CURRENT_TEST_BINARY_DIR}/${PLTFILE}") + set(test_command sh -c "${MPI_COMMANDS} ${TEST_EXE} ${CURRENT_TEST_BINARY_DIR}/${TEST_NAME}.i erf.input_sounding_file=${CURRENT_TEST_BINARY_DIR}/input_sounding > ${TEST_NAME}.log && ${MPI_FCOMP_COMMANDS} ${FCOMPARE_EXE} ${FCOMPARE_FLAGS} ${CURRENT_TEST_BINARY_DIR}/plt00000 ${CURRENT_TEST_BINARY_DIR}/${PLTFILE}") add_test(${TEST_NAME} ${test_command}) set_tests_properties(${TEST_NAME} From 9618d133c88aa3e11b5b1f1639b123cfe12a8d4d Mon Sep 17 00:00:00 2001 From: Mahesh Natarajan Date: Wed, 23 Oct 2024 15:33:15 -0700 Subject: [PATCH 32/35] Changing actuator disk model names (#1903) Co-authored-by: Mahesh Natarajan --- Source/DataStructs/ERF_DataStruct.H | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Source/DataStructs/ERF_DataStruct.H b/Source/DataStructs/ERF_DataStruct.H index b3e2992ae..c8f639a4a 100644 --- a/Source/DataStructs/ERF_DataStruct.H +++ b/Source/DataStructs/ERF_DataStruct.H @@ -42,7 +42,7 @@ AMREX_ENUM(MoistureType, ); AMREX_ENUM(WindFarmType, - Fitch, EWP, SimpleActuatorDisk, GeneralActuatorDisk, None + Fitch, EWP, SimpleAD, GeneralAD, None ); AMREX_ENUM(WindFarmLocType, @@ -393,14 +393,14 @@ struct SolverChoice { // // Wind farm checks // - if (windfarm_type==WindFarmType::SimpleActuatorDisk and sampling_distance_by_D < 0.0) { + if (windfarm_type==WindFarmType::SimpleAD and sampling_distance_by_D < 0.0) { amrex::Abort("To use simplified actuator disks, you need to provide a variable" " erf.sampling_distance_by_D in the inputs which specifies the upstream" " distance as a factor of the turbine diameter at which the incoming free stream" " velocity will be computed at."); } - if ( (windfarm_type==WindFarmType::SimpleActuatorDisk || - windfarm_type==WindFarmType::GeneralActuatorDisk ) && turb_disk_angle < 0.0) { + if ( (windfarm_type==WindFarmType::SimpleAD || + windfarm_type==WindFarmType::GeneralAD ) && turb_disk_angle < 0.0) { amrex::Abort("To use simplified actuator disks, you need to provide a variable" " erf.turb_disk_angle_from_x in the inputs which is the angle of the face of the" " turbine disk from the x-axis. A turbine facing an oncoming flow in the x-direction" From 5ddedcc7f5b402cb5e72972d1500204cff4f796b Mon Sep 17 00:00:00 2001 From: Ann Almgren Date: Wed, 23 Oct 2024 15:46:20 -0700 Subject: [PATCH 33/35] split ERF_FillPatch.cpp into four files (#1906) --- CMake/BuildERFExe.cmake | 3 + .../BoundaryConditions/ERF_FillBdyCCVels.cpp | 100 ++++ .../ERF_FillCoarsePatch.cpp | 132 +++++ .../ERF_FillIntermediatePatch.cpp | 261 ++++++++++ Source/BoundaryConditions/ERF_FillPatch.cpp | 471 +----------------- Source/BoundaryConditions/Make.package | 3 + 6 files changed, 501 insertions(+), 469 deletions(-) create mode 100644 Source/BoundaryConditions/ERF_FillBdyCCVels.cpp create mode 100644 Source/BoundaryConditions/ERF_FillCoarsePatch.cpp create mode 100644 Source/BoundaryConditions/ERF_FillIntermediatePatch.cpp diff --git a/CMake/BuildERFExe.cmake b/CMake/BuildERFExe.cmake index ff8610da5..7bc51f20a 100644 --- a/CMake/BuildERFExe.cmake +++ b/CMake/BuildERFExe.cmake @@ -118,6 +118,9 @@ function(build_erf_lib erf_lib_name) ${SRC_DIR}/BoundaryConditions/ERF_BoundaryConditions_bndryreg.cpp ${SRC_DIR}/BoundaryConditions/ERF_BoundaryConditions_realbdy.cpp ${SRC_DIR}/BoundaryConditions/ERF_FillPatch.cpp + ${SRC_DIR}/BoundaryConditions/ERF_FillCoarsePatch.cpp + ${SRC_DIR}/BoundaryConditions/ERF_FillIntermediatePatch.cpp + ${SRC_DIR}/BoundaryConditions/ERF_FillBdyCCVels.cpp ${SRC_DIR}/BoundaryConditions/ERF_FillPatcher.cpp ${SRC_DIR}/BoundaryConditions/ERF_PhysBCFunct.cpp ${SRC_DIR}/Diffusion/ERF_DiffusionSrcForMom_N.cpp diff --git a/Source/BoundaryConditions/ERF_FillBdyCCVels.cpp b/Source/BoundaryConditions/ERF_FillBdyCCVels.cpp new file mode 100644 index 000000000..5726d06c0 --- /dev/null +++ b/Source/BoundaryConditions/ERF_FillBdyCCVels.cpp @@ -0,0 +1,100 @@ +#include +#include +#include +#include +#include +#include + +using namespace amrex; + +void +ERF::FillBdyCCVels (Vector& mf_cc_vel) +{ + // Impose bc's at domain boundaries + for (int lev = 0; lev <= finest_level; ++lev) + { + Box domain(Geom(lev).Domain()); + + int ihi = domain.bigEnd(0); + int jhi = domain.bigEnd(1); + int khi = domain.bigEnd(2); + + // Impose periodicity first + mf_cc_vel[lev].FillBoundary(geom[lev].periodicity()); + + for (MFIter mfi(mf_cc_vel[lev], TilingIfNotGPU()); mfi.isValid(); ++mfi) + { + // Note that we don't fill corners here -- only the cells that share a face + // with interior cells -- this is all that is needed to calculate vorticity + const Box& bx = mfi.tilebox(); + const Array4& vel_arr = mf_cc_vel[lev].array(mfi); + + if (!Geom(lev).isPeriodic(0)) { + // Low-x side + if (bx.smallEnd(0) <= domain.smallEnd(0)) { + Real mult = (phys_bc_type[0] == ERF_BC::no_slip_wall) ? -1. : 1.; + ParallelFor(makeSlab(bx,0,0), [=] AMREX_GPU_DEVICE(int , int j, int k) noexcept + { + vel_arr(-1,j,k,1) = mult*vel_arr(0,j,k,1); // v + vel_arr(-1,j,k,2) = mult*vel_arr(0,j,k,2); // w + }); + } + + // High-x side + if (bx.bigEnd(0) >= domain.bigEnd(0)) { + Real mult = (phys_bc_type[3] == ERF_BC::no_slip_wall) ? -1. : 1.; + ParallelFor(makeSlab(bx,0,0), [=] AMREX_GPU_DEVICE(int , int j, int k) noexcept + { + vel_arr(ihi+1,j,k,1) = mult*vel_arr(ihi,j,k,1); // v + vel_arr(ihi+1,j,k,2) = mult*vel_arr(ihi,j,k,2); // w + }); + } + } // !periodic + + if (!Geom(lev).isPeriodic(1)) { + // Low-y side + if (bx.smallEnd(1) <= domain.smallEnd(1)) { + Real mult = (phys_bc_type[1] == ERF_BC::no_slip_wall) ? -1. : 1.; + ParallelFor(makeSlab(bx,1,0), [=] AMREX_GPU_DEVICE(int i, int , int k) noexcept + { + vel_arr(i,-1,k,0) = mult*vel_arr(i,0,k,0); // u + vel_arr(i,-1,k,2) = mult*vel_arr(i,0,k,2); // w + }); + } + + // High-y side + if (bx.bigEnd(1) >= domain.bigEnd(1)) { + Real mult = (phys_bc_type[4] == ERF_BC::no_slip_wall) ? -1. : 1.; + ParallelFor(makeSlab(bx,1,0), [=] AMREX_GPU_DEVICE(int i, int , int k) noexcept + { + vel_arr(i,jhi+1,k,0) = mult*vel_arr(i,jhi,k,0); // u + vel_arr(i,jhi+1,k,2) = mult*-vel_arr(i,jhi,k,2); // w + }); + } + } // !periodic + + if (!Geom(lev).isPeriodic(2)) { + // Low-z side + if (bx.smallEnd(2) <= domain.smallEnd(2)) { + Real mult = (phys_bc_type[2] == ERF_BC::no_slip_wall) ? -1. : 1.; + ParallelFor(makeSlab(bx,2,0), [=] AMREX_GPU_DEVICE(int i, int j, int) noexcept + { + vel_arr(i,j,-1,0) = mult*vel_arr(i,j,0,0); // u + vel_arr(i,j,-1,1) = mult*vel_arr(i,j,0,1); // v + }); + } + + // High-z side + if (bx.bigEnd(2) >= domain.bigEnd(2)) { + Real mult = (phys_bc_type[5] == ERF_BC::no_slip_wall) ? -1. : 1.; + ParallelFor(makeSlab(bx,2,0), [=] AMREX_GPU_DEVICE(int i, int j, int) noexcept + { + vel_arr(i,j,khi+1,0) = mult*vel_arr(i,j,khi,0); // u + vel_arr(i,j,khi+1,1) = mult*vel_arr(i,j,khi,1); // v + }); + } + } // !periodic + } // MFIter + + } // lev +} diff --git a/Source/BoundaryConditions/ERF_FillCoarsePatch.cpp b/Source/BoundaryConditions/ERF_FillCoarsePatch.cpp new file mode 100644 index 000000000..9815d050a --- /dev/null +++ b/Source/BoundaryConditions/ERF_FillCoarsePatch.cpp @@ -0,0 +1,132 @@ +#include +#include +#include +#include +#include +#include + +using namespace amrex; + +/* + * Fill valid and ghost data. + * This version fills an entire MultiFab by interpolating from the coarser level -- this is used + * only when a new level of refinement is being created during a run (i.e not at initialization) + * This will never be used with static refinement. + * + * @param[in] lev level of refinement at which to fill the data + * @param[in] time time at which the data should be filled + * @param[out] mfs Vector of MultiFabs to be filled containing, in order: cons, xvel, yvel, and zvel data + */ +void +ERF::FillCoarsePatch (int lev, Real time) +{ + BL_PROFILE_VAR("FillCoarsePatch()",FillCoarsePatch); + AMREX_ASSERT(lev > 0); + + // + //**************************************************************************************************************** + // First fill velocities and density at the COARSE level so we can convert velocity to momenta at the COARSE level + //**************************************************************************************************************** + // + bool cons_only = false; + FillPatch(lev-1, time, {&vars_new[lev-1][Vars::cons], &vars_new[lev-1][Vars::xvel], + &vars_new[lev-1][Vars::yvel], &vars_new[lev-1][Vars::zvel]}, + {&vars_new[lev-1][Vars::cons], + &rU_new[lev-1], &rV_new[lev-1], &rW_new[lev-1]}, + false, cons_only); + + // + // ************************************************ + // Convert velocity to momentum at the COARSE level + // ************************************************ + // + VelocityToMomentum(vars_new[lev-1][Vars::xvel], IntVect{0}, + vars_new[lev-1][Vars::yvel], IntVect{0}, + vars_new[lev-1][Vars::zvel], IntVect{0}, + vars_new[lev-1][Vars::cons], + rU_new[lev-1], + rV_new[lev-1], + rW_new[lev-1], + Geom(lev).Domain(), + domain_bcs_type); + // + // ***************************************************************** + // Interpolate all cell-centered variables from coarse to fine level + // ***************************************************************** + // + Interpolater* mapper_c = &cell_cons_interp; + Interpolater* mapper_f = &face_cons_linear_interp; + + // + //************************************************************************************************ + // Interpolate cell-centered data from coarse to fine level + // with InterpFromCoarseLevel which ASSUMES that all ghost cells have already been filled + // ************************************************************************************************ + IntVect ngvect_cons = vars_new[lev][Vars::cons].nGrowVect(); + int ncomp_cons = vars_new[lev][Vars::cons].nComp(); + + InterpFromCoarseLevel(vars_new[lev ][Vars::cons], ngvect_cons, IntVect(0,0,0), + vars_new[lev-1][Vars::cons], 0, 0, ncomp_cons, + geom[lev-1], geom[lev], + refRatio(lev-1), mapper_c, domain_bcs_type, BCVars::cons_bc); + + // + //************************************************************************************************ + // Interpolate x-momentum from coarse to fine level + // with InterpFromCoarseLevel which ASSUMES that all ghost cells have already been filled + // ************************************************************************************************ + // + InterpFromCoarseLevel(rU_new[lev], IntVect{0}, IntVect{0}, rU_new[lev-1], 0, 0, 1, + geom[lev-1], geom[lev], + refRatio(lev-1), mapper_f, domain_bcs_type, BCVars::xvel_bc); + + // + //************************************************************************************************ + // Interpolate y-momentum from coarse to fine level + // with InterpFromCoarseLevel which ASSUMES that all ghost cells have already been filled + // ************************************************************************************************ + // + InterpFromCoarseLevel(rV_new[lev], IntVect{0}, IntVect{0}, rV_new[lev-1], 0, 0, 1, + geom[lev-1], geom[lev], + refRatio(lev-1), mapper_f, domain_bcs_type, BCVars::yvel_bc); + + //************************************************************************************************ + // Interpolate z-momentum from coarse to fine level + // with InterpFromCoarseLevel which ASSUMES that all ghost cells have already been filled + // ************************************************************************************************ + InterpFromCoarseLevel(rW_new[lev], IntVect{0}, IntVect{0}, rW_new[lev-1], 0, 0, 1, + geom[lev-1], geom[lev], + refRatio(lev-1), mapper_f, domain_bcs_type, BCVars::zvel_bc); + // + // ********************************************************* + // After interpolation of momentum, convert back to velocity + // ********************************************************* + // + for (int which_lev = lev-1; which_lev <= lev; which_lev++) + { + MomentumToVelocity(vars_new[which_lev][Vars::xvel], + vars_new[which_lev][Vars::yvel], + vars_new[which_lev][Vars::zvel], + vars_new[which_lev][Vars::cons], + rU_new[which_lev], + rV_new[which_lev], + rW_new[which_lev], + Geom(lev).Domain(), + domain_bcs_type); + } + + // *************************************************************************** + // Physical bc's at domain boundary + // *************************************************************************** + IntVect ngvect_vels = vars_new[lev][Vars::xvel].nGrowVect(); + + (*physbcs_cons[lev])(vars_new[lev][Vars::cons],0,ncomp_cons,ngvect_cons,time,BCVars::cons_bc,true); + ( *physbcs_u[lev])(vars_new[lev][Vars::xvel],0,1 ,ngvect_vels,time,BCVars::xvel_bc,true); + ( *physbcs_v[lev])(vars_new[lev][Vars::yvel],0,1 ,ngvect_vels,time,BCVars::yvel_bc,true); + ( *physbcs_w[lev])(vars_new[lev][Vars::zvel],vars_new[lev][Vars::xvel],vars_new[lev][Vars::yvel], + ngvect_vels,time,BCVars::zvel_bc,true); + + // *************************************************************************** + // Since lev > 0 here we don't worry about m_r2d or wrfbdy data + // *************************************************************************** +} diff --git a/Source/BoundaryConditions/ERF_FillIntermediatePatch.cpp b/Source/BoundaryConditions/ERF_FillIntermediatePatch.cpp new file mode 100644 index 000000000..99be97002 --- /dev/null +++ b/Source/BoundaryConditions/ERF_FillIntermediatePatch.cpp @@ -0,0 +1,261 @@ +#include +#include +#include +#include +#include +#include + +using namespace amrex; + +/* + * Fill valid and ghost data + * This version fills mfs in valid regions with the values in "mfs" when it is passed in; + * it is used only to compute ghost values for intermediate stages of a time integrator. + * + * @param[in] lev level of refinement at which to fill the data + * @param[in] time time at which the data should be filled + * @param[out] mfs_vel Vector of MultiFabs to be filled containing, in order: cons, xvel, yvel, and zvel + * @param[out] mfs_mom Vector of MultiFabs to be filled containing, in order: cons, xmom, ymom, and zmom + * @param[in] ng_cons number of ghost cells to be filled for conserved (cell-centered) variables + * @param[in] ng_vel number of ghost cells to be filled for velocity components + * @param[in] cons_only if 1 then only fill conserved variables + * @param[in] icomp_cons starting component for conserved variables + * @param[in] ncomp_cons number of components for conserved variables + * @param[in] eddyDiffs diffusion coefficients for LES turbulence models + * @param[in] allow_most_bcs if true then use MOST bcs at the low boundary + */ +void +ERF::FillIntermediatePatch (int lev, Real time, + const Vector& mfs_vel, // This includes cc quantities and VELOCITIES + const Vector& mfs_mom, // This includes cc quantities and MOMENTA + int ng_cons, int ng_vel, bool cons_only, + int icomp_cons, int ncomp_cons, + bool allow_most_bcs) +{ + BL_PROFILE_VAR("FillIntermediatePatch()",FillIntermediatePatch); + Interpolater* mapper; + + PhysBCFunctNoOp null_bc; + + // + // *************************************************************************** + // The first thing we do is interpolate the momenta on the "valid" faces of + // the fine grids (where the interface is coarse/fine not fine/fine) -- this + // will not be over-written by interpolation below because the FillPatch + // operators see these as valid faces. But we must have these interpolated + // values in the fine data before we call FillPatchTwoLevels. + // + // Also -- note that we might be filling values by interpolation at physical boundaries + // here but that's ok because we will overwrite those values when we impose + // the physical bc's below + // *************************************************************************** + if (lev>0) { + if (cf_set_width > 0) { + // We note that mfs_vel[Vars::cons] and mfs_mom[Vars::cons] are in fact the same pointer + FPr_c[lev-1].FillSet(*mfs_vel[Vars::cons], time, null_bc, domain_bcs_type); + } + if ( !cons_only && (cf_set_width >= 0) ) { + FPr_u[lev-1].FillSet(*mfs_mom[IntVars::xmom], time, null_bc, domain_bcs_type); + FPr_v[lev-1].FillSet(*mfs_mom[IntVars::ymom], time, null_bc, domain_bcs_type); + FPr_w[lev-1].FillSet(*mfs_mom[IntVars::zmom], time, null_bc, domain_bcs_type); + } + } + + AMREX_ALWAYS_ASSERT(mfs_mom.size() == IntVars::NumTypes); + AMREX_ALWAYS_ASSERT(mfs_vel.size() == Vars::NumTypes); + + // Enforce no penetration for thin immersed body + if (xflux_imask[lev]) { + ApplyMask(*mfs_mom[IntVars::xmom], *xflux_imask[lev]); + } + if (yflux_imask[lev]) { + ApplyMask(*mfs_mom[IntVars::ymom], *yflux_imask[lev]); + } + if (zflux_imask[lev]) { + ApplyMask(*mfs_mom[IntVars::zmom], *zflux_imask[lev]); + } + + // We always come in to this call with updated momenta but we need to create updated velocity + // in order to impose the rest of the bc's + if (!cons_only) { + // This only fills VALID region of velocity + MomentumToVelocity(*mfs_vel[Vars::xvel], *mfs_vel[Vars::yvel], *mfs_vel[Vars::zvel], + *mfs_vel[Vars::cons], + *mfs_mom[IntVars::xmom], *mfs_mom[IntVars::ymom], *mfs_mom[IntVars::zmom], + Geom(lev).Domain(), domain_bcs_type); + } + + // + // We now start working on conserved quantities + VELOCITY + // + if (lev == 0) + { + // We don't do anything here because we will call the physbcs routines below, + // which calls FillBoundary and fills other domain boundary conditions + // Physical boundaries will be filled below + } + else + { + MultiFab& mf = *mfs_vel[Vars::cons]; + + Vector fmf = {&mf,&mf}; + Vector cmf = {&vars_old[lev-1][Vars::cons], &vars_new[lev-1][Vars::cons]}; + Vector ctime = {t_old[lev-1], t_new[lev-1]}; + Vector ftime = {time,time}; + + // Impose physical bc's on coarse data (note time and 0 are not used) + (*physbcs_cons[lev-1])(vars_old[lev-1][Vars::cons],0,ncomp_cons,IntVect{ng_cons},time,BCVars::cons_bc,true); + (*physbcs_cons[lev-1])(vars_new[lev-1][Vars::cons],0,ncomp_cons,IntVect{ng_cons},time,BCVars::cons_bc,true); + + // Call FillPatchTwoLevels which ASSUMES that all ghost cells have already been filled + mapper = &cell_cons_interp; + FillPatchTwoLevels(mf, IntVect{ng_cons}, IntVect(0,0,0), + time, cmf, ctime, fmf, ftime, + icomp_cons, icomp_cons, ncomp_cons, geom[lev-1], geom[lev], + refRatio(lev-1), mapper, domain_bcs_type, + icomp_cons); + + // ***************************************************************************************** + + if (!cons_only) + { + mapper = &face_cons_linear_interp; + + // + // NOTE: All interpolation here happens on velocities not momenta; + // note we only do the interpolation and FillBoundary here, + // physical bc's are imposed later + // + // NOTE: This will only fill velocity from coarse grid *outside* the fine grids + // unlike the FillSet calls above which filled momenta on the coarse/fine bdy + // + + MultiFab& mfu = *mfs_vel[Vars::xvel]; + + fmf = {&mfu,&mfu}; + cmf = {&vars_old[lev-1][Vars::xvel], &vars_new[lev-1][Vars::xvel]}; + + // Impose physical bc's on coarse data (note time and 0 are not used) + (*physbcs_u[lev-1])(vars_old[lev-1][Vars::xvel],0,1,IntVect{ng_vel},time,BCVars::xvel_bc,true); + (*physbcs_u[lev-1])(vars_new[lev-1][Vars::xvel],0,1,IntVect{ng_vel},time,BCVars::xvel_bc,true); + + // Call FillPatchTwoLevels which ASSUMES that all ghost cells have already been filled + FillPatchTwoLevels(mfu, IntVect{ng_vel}, IntVect(0,0,0), + time, cmf, ctime, fmf, ftime, + 0, 0, 1, geom[lev-1], geom[lev], + refRatio(lev-1), mapper, domain_bcs_type, + BCVars::xvel_bc); + + // ***************************************************************************************** + + MultiFab& mfv = *mfs_vel[Vars::yvel]; + + fmf = {&mfv,&mfv}; + cmf = {&vars_old[lev-1][Vars::yvel], &vars_new[lev-1][Vars::yvel]}; + + // Impose physical bc's on coarse data (note time and 0 are not used) + (*physbcs_v[lev-1])(vars_old[lev-1][Vars::yvel],0,1,IntVect{ng_vel},time,BCVars::yvel_bc,true); + (*physbcs_v[lev-1])(vars_new[lev-1][Vars::yvel],0,1,IntVect{ng_vel},time,BCVars::yvel_bc,true); + + // Call FillPatchTwoLevels which ASSUMES that all ghost cells have already been filled + FillPatchTwoLevels(mfv, IntVect{ng_vel}, IntVect(0,0,0), + time, cmf, ctime, fmf, ftime, + 0, 0, 1, geom[lev-1], geom[lev], + refRatio(lev-1), mapper, domain_bcs_type, + BCVars::yvel_bc); + + // ***************************************************************************************** + + MultiFab& mfw = *mfs_vel[Vars::zvel]; + + fmf = {&mfw,&mfw}; + cmf = {&vars_old[lev-1][Vars::zvel], &vars_new[lev-1][Vars::zvel]}; + + // Impose physical bc's on coarse data (note time and 0 are not used) + (*physbcs_w[lev-1])(vars_old[lev-1][Vars::zvel], + vars_old[lev-1][Vars::xvel], + vars_old[lev-1][Vars::yvel], + IntVect{ng_vel},time,BCVars::zvel_bc,true); + (*physbcs_w[lev-1])(vars_new[lev-1][Vars::zvel], + vars_new[lev-1][Vars::xvel], + vars_new[lev-1][Vars::yvel], + IntVect{ng_vel},time,BCVars::zvel_bc,true); + + // Call FillPatchTwoLevels which ASSUMES that all ghost cells have already been filled + FillPatchTwoLevels(mfw, IntVect{ng_vel}, IntVect(0,0,0), + time, cmf, ctime, fmf, ftime, + 0, 0, 1, geom[lev-1], geom[lev], + refRatio(lev-1), mapper, domain_bcs_type, + BCVars::zvel_bc); + } // !cons_only + } // lev > 0 + + // *************************************************************************** + // Physical bc's at domain boundary + // *************************************************************************** + IntVect ngvect_cons = IntVect(ng_cons,ng_cons,ng_cons); + IntVect ngvect_vels = IntVect(ng_vel ,ng_vel ,ng_vel); + + bool do_fb = true; + +#ifdef ERF_USE_NETCDF + // We call this here because it is an ERF routine + if (use_real_bcs && (lev==0)) { + fill_from_realbdy(mfs_vel,time,cons_only,icomp_cons,ncomp_cons,ngvect_cons, ngvect_vels); + do_fb = false; + } +#endif + + if (m_r2d) fill_from_bndryregs(mfs_vel,time); + + // We call this even if init_type == InitType::Real because this routine will fill the vertical bcs + (*physbcs_cons[lev])(*mfs_vel[Vars::cons],icomp_cons,ncomp_cons,ngvect_cons,time,BCVars::cons_bc, do_fb); + if (!cons_only) { + (*physbcs_u[lev])(*mfs_vel[Vars::xvel],0,1,ngvect_vels,time,BCVars::xvel_bc, do_fb); + (*physbcs_v[lev])(*mfs_vel[Vars::yvel],0,1,ngvect_vels,time,BCVars::yvel_bc, do_fb); + (*physbcs_w[lev])(*mfs_vel[Vars::zvel],*mfs_vel[Vars::xvel],*mfs_vel[Vars::yvel], + ngvect_vels,time,BCVars::zvel_bc, do_fb); + } + // *************************************************************************** + + // MOST boundary conditions + if (!(cons_only && ncomp_cons == 1) && m_most && allow_most_bcs) { + m_most->impose_most_bcs(lev,mfs_vel, + Tau11_lev[lev].get(), + Tau22_lev[lev].get(), + Tau33_lev[lev].get(), + Tau12_lev[lev].get(), Tau21_lev[lev].get(), + Tau13_lev[lev].get(), Tau31_lev[lev].get(), + Tau23_lev[lev].get(), Tau32_lev[lev].get(), + SFS_hfx1_lev[lev].get(), + SFS_hfx2_lev[lev].get(), + SFS_hfx3_lev[lev].get(), + SFS_q1fx1_lev[lev].get(), + SFS_q1fx2_lev[lev].get(), + SFS_q1fx3_lev[lev].get(), + z_phys_nd[lev].get()); + } + + // We always come in to this call with momenta so we need to leave with momenta! + // We need to make sure we convert back on all ghost cells/faces because this is + // how velocity from fine-fine copies (as well as physical and interpolated bcs) will be filled + if (!cons_only) + { + IntVect ngu = (!solverChoice.use_NumDiff) ? IntVect(1,1,1) : mfs_vel[Vars::xvel]->nGrowVect(); + IntVect ngv = (!solverChoice.use_NumDiff) ? IntVect(1,1,1) : mfs_vel[Vars::yvel]->nGrowVect(); + IntVect ngw = (!solverChoice.use_NumDiff) ? IntVect(1,1,0) : mfs_vel[Vars::zvel]->nGrowVect(); + + VelocityToMomentum(*mfs_vel[Vars::xvel], ngu, + *mfs_vel[Vars::yvel], ngv, + *mfs_vel[Vars::zvel], ngw, + *mfs_vel[Vars::cons], + *mfs_mom[IntVars::xmom], *mfs_mom[IntVars::ymom], *mfs_mom[IntVars::zmom], + Geom(lev).Domain(), + domain_bcs_type); + } + + mfs_mom[IntVars::cons]->FillBoundary(geom[lev].periodicity()); + mfs_mom[IntVars::xmom]->FillBoundary(geom[lev].periodicity()); + mfs_mom[IntVars::ymom]->FillBoundary(geom[lev].periodicity()); + mfs_mom[IntVars::zmom]->FillBoundary(geom[lev].periodicity()); +} diff --git a/Source/BoundaryConditions/ERF_FillPatch.cpp b/Source/BoundaryConditions/ERF_FillPatch.cpp index e1526fcac..03f272b55 100644 --- a/Source/BoundaryConditions/ERF_FillPatch.cpp +++ b/Source/BoundaryConditions/ERF_FillPatch.cpp @@ -7,8 +7,6 @@ using namespace amrex; -PhysBCFunctNoOp null_bc; - /* * Fill valid and ghost data with the "state data" at the given time * NOTE: THIS OPERATES ON VELOCITY (MOMENTA ARE JUST TEMPORARIES) @@ -27,6 +25,8 @@ ERF::FillPatch (int lev, Real time, BL_PROFILE_VAR("ERF::FillPatch()",ERF_FillPatch); Interpolater* mapper = nullptr; + PhysBCFunctNoOp null_bc; + // // *************************************************************************** // The first thing we do is interpolate the momenta on the "valid" faces of @@ -218,470 +218,3 @@ ERF::FillPatch (int lev, Real time, ngvect_vels,time,BCVars::zvel_bc, do_fb); } } - -/* - * Fill valid and ghost data - * This version fills mfs in valid regions with the values in "mfs" when it is passed in; - * it is used only to compute ghost values for intermediate stages of a time integrator. - * - * @param[in] lev level of refinement at which to fill the data - * @param[in] time time at which the data should be filled - * @param[out] mfs_vel Vector of MultiFabs to be filled containing, in order: cons, xvel, yvel, and zvel - * @param[out] mfs_mom Vector of MultiFabs to be filled containing, in order: cons, xmom, ymom, and zmom - * @param[in] ng_cons number of ghost cells to be filled for conserved (cell-centered) variables - * @param[in] ng_vel number of ghost cells to be filled for velocity components - * @param[in] cons_only if 1 then only fill conserved variables - * @param[in] icomp_cons starting component for conserved variables - * @param[in] ncomp_cons number of components for conserved variables - * @param[in] eddyDiffs diffusion coefficients for LES turbulence models - * @param[in] allow_most_bcs if true then use MOST bcs at the low boundary - */ -void -ERF::FillIntermediatePatch (int lev, Real time, - const Vector& mfs_vel, // This includes cc quantities and VELOCITIES - const Vector& mfs_mom, // This includes cc quantities and MOMENTA - int ng_cons, int ng_vel, bool cons_only, - int icomp_cons, int ncomp_cons, - bool allow_most_bcs) -{ - BL_PROFILE_VAR("FillIntermediatePatch()",FillIntermediatePatch); - Interpolater* mapper; - - // - // *************************************************************************** - // The first thing we do is interpolate the momenta on the "valid" faces of - // the fine grids (where the interface is coarse/fine not fine/fine) -- this - // will not be over-written by interpolation below because the FillPatch - // operators see these as valid faces. But we must have these interpolated - // values in the fine data before we call FillPatchTwoLevels. - // - // Also -- note that we might be filling values by interpolation at physical boundaries - // here but that's ok because we will overwrite those values when we impose - // the physical bc's below - // *************************************************************************** - if (lev>0) { - if (cf_set_width > 0) { - // We note that mfs_vel[Vars::cons] and mfs_mom[Vars::cons] are in fact the same pointer - FPr_c[lev-1].FillSet(*mfs_vel[Vars::cons], time, null_bc, domain_bcs_type); - } - if ( !cons_only && (cf_set_width >= 0) ) { - FPr_u[lev-1].FillSet(*mfs_mom[IntVars::xmom], time, null_bc, domain_bcs_type); - FPr_v[lev-1].FillSet(*mfs_mom[IntVars::ymom], time, null_bc, domain_bcs_type); - FPr_w[lev-1].FillSet(*mfs_mom[IntVars::zmom], time, null_bc, domain_bcs_type); - } - } - - AMREX_ALWAYS_ASSERT(mfs_mom.size() == IntVars::NumTypes); - AMREX_ALWAYS_ASSERT(mfs_vel.size() == Vars::NumTypes); - - // Enforce no penetration for thin immersed body - if (xflux_imask[lev]) { - ApplyMask(*mfs_mom[IntVars::xmom], *xflux_imask[lev]); - } - if (yflux_imask[lev]) { - ApplyMask(*mfs_mom[IntVars::ymom], *yflux_imask[lev]); - } - if (zflux_imask[lev]) { - ApplyMask(*mfs_mom[IntVars::zmom], *zflux_imask[lev]); - } - - // We always come in to this call with updated momenta but we need to create updated velocity - // in order to impose the rest of the bc's - if (!cons_only) { - // This only fills VALID region of velocity - MomentumToVelocity(*mfs_vel[Vars::xvel], *mfs_vel[Vars::yvel], *mfs_vel[Vars::zvel], - *mfs_vel[Vars::cons], - *mfs_mom[IntVars::xmom], *mfs_mom[IntVars::ymom], *mfs_mom[IntVars::zmom], - Geom(lev).Domain(), domain_bcs_type); - } - - // - // We now start working on conserved quantities + VELOCITY - // - if (lev == 0) - { - // We don't do anything here because we will call the physbcs routines below, - // which calls FillBoundary and fills other domain boundary conditions - // Physical boundaries will be filled below - } - else - { - MultiFab& mf = *mfs_vel[Vars::cons]; - - Vector fmf = {&mf,&mf}; - Vector cmf = {&vars_old[lev-1][Vars::cons], &vars_new[lev-1][Vars::cons]}; - Vector ctime = {t_old[lev-1], t_new[lev-1]}; - Vector ftime = {time,time}; - - // Impose physical bc's on coarse data (note time and 0 are not used) - (*physbcs_cons[lev-1])(vars_old[lev-1][Vars::cons],0,ncomp_cons,IntVect{ng_cons},time,BCVars::cons_bc,true); - (*physbcs_cons[lev-1])(vars_new[lev-1][Vars::cons],0,ncomp_cons,IntVect{ng_cons},time,BCVars::cons_bc,true); - - // Call FillPatchTwoLevels which ASSUMES that all ghost cells have already been filled - mapper = &cell_cons_interp; - FillPatchTwoLevels(mf, IntVect{ng_cons}, IntVect(0,0,0), - time, cmf, ctime, fmf, ftime, - icomp_cons, icomp_cons, ncomp_cons, geom[lev-1], geom[lev], - refRatio(lev-1), mapper, domain_bcs_type, - icomp_cons); - - // ***************************************************************************************** - - if (!cons_only) - { - mapper = &face_cons_linear_interp; - - // - // NOTE: All interpolation here happens on velocities not momenta; - // note we only do the interpolation and FillBoundary here, - // physical bc's are imposed later - // - // NOTE: This will only fill velocity from coarse grid *outside* the fine grids - // unlike the FillSet calls above which filled momenta on the coarse/fine bdy - // - - MultiFab& mfu = *mfs_vel[Vars::xvel]; - - fmf = {&mfu,&mfu}; - cmf = {&vars_old[lev-1][Vars::xvel], &vars_new[lev-1][Vars::xvel]}; - - // Impose physical bc's on coarse data (note time and 0 are not used) - (*physbcs_u[lev-1])(vars_old[lev-1][Vars::xvel],0,1,IntVect{ng_vel},time,BCVars::xvel_bc,true); - (*physbcs_u[lev-1])(vars_new[lev-1][Vars::xvel],0,1,IntVect{ng_vel},time,BCVars::xvel_bc,true); - - // Call FillPatchTwoLevels which ASSUMES that all ghost cells have already been filled - FillPatchTwoLevels(mfu, IntVect{ng_vel}, IntVect(0,0,0), - time, cmf, ctime, fmf, ftime, - 0, 0, 1, geom[lev-1], geom[lev], - refRatio(lev-1), mapper, domain_bcs_type, - BCVars::xvel_bc); - - // ***************************************************************************************** - - MultiFab& mfv = *mfs_vel[Vars::yvel]; - - fmf = {&mfv,&mfv}; - cmf = {&vars_old[lev-1][Vars::yvel], &vars_new[lev-1][Vars::yvel]}; - - // Impose physical bc's on coarse data (note time and 0 are not used) - (*physbcs_v[lev-1])(vars_old[lev-1][Vars::yvel],0,1,IntVect{ng_vel},time,BCVars::yvel_bc,true); - (*physbcs_v[lev-1])(vars_new[lev-1][Vars::yvel],0,1,IntVect{ng_vel},time,BCVars::yvel_bc,true); - - // Call FillPatchTwoLevels which ASSUMES that all ghost cells have already been filled - FillPatchTwoLevels(mfv, IntVect{ng_vel}, IntVect(0,0,0), - time, cmf, ctime, fmf, ftime, - 0, 0, 1, geom[lev-1], geom[lev], - refRatio(lev-1), mapper, domain_bcs_type, - BCVars::yvel_bc); - - // ***************************************************************************************** - - MultiFab& mfw = *mfs_vel[Vars::zvel]; - - fmf = {&mfw,&mfw}; - cmf = {&vars_old[lev-1][Vars::zvel], &vars_new[lev-1][Vars::zvel]}; - - // Impose physical bc's on coarse data (note time and 0 are not used) - (*physbcs_w[lev-1])(vars_old[lev-1][Vars::zvel], - vars_old[lev-1][Vars::xvel], - vars_old[lev-1][Vars::yvel], - IntVect{ng_vel},time,BCVars::zvel_bc,true); - (*physbcs_w[lev-1])(vars_new[lev-1][Vars::zvel], - vars_new[lev-1][Vars::xvel], - vars_new[lev-1][Vars::yvel], - IntVect{ng_vel},time,BCVars::zvel_bc,true); - - // Call FillPatchTwoLevels which ASSUMES that all ghost cells have already been filled - FillPatchTwoLevels(mfw, IntVect{ng_vel}, IntVect(0,0,0), - time, cmf, ctime, fmf, ftime, - 0, 0, 1, geom[lev-1], geom[lev], - refRatio(lev-1), mapper, domain_bcs_type, - BCVars::zvel_bc); - } // !cons_only - } // lev > 0 - - // *************************************************************************** - // Physical bc's at domain boundary - // *************************************************************************** - IntVect ngvect_cons = IntVect(ng_cons,ng_cons,ng_cons); - IntVect ngvect_vels = IntVect(ng_vel ,ng_vel ,ng_vel); - - bool do_fb = true; - -#ifdef ERF_USE_NETCDF - // We call this here because it is an ERF routine - if (use_real_bcs && (lev==0)) { - fill_from_realbdy(mfs_vel,time,cons_only,icomp_cons,ncomp_cons,ngvect_cons, ngvect_vels); - do_fb = false; - } -#endif - - if (m_r2d) fill_from_bndryregs(mfs_vel,time); - - // We call this even if init_type == InitType::Real because this routine will fill the vertical bcs - (*physbcs_cons[lev])(*mfs_vel[Vars::cons],icomp_cons,ncomp_cons,ngvect_cons,time,BCVars::cons_bc, do_fb); - if (!cons_only) { - (*physbcs_u[lev])(*mfs_vel[Vars::xvel],0,1,ngvect_vels,time,BCVars::xvel_bc, do_fb); - (*physbcs_v[lev])(*mfs_vel[Vars::yvel],0,1,ngvect_vels,time,BCVars::yvel_bc, do_fb); - (*physbcs_w[lev])(*mfs_vel[Vars::zvel],*mfs_vel[Vars::xvel],*mfs_vel[Vars::yvel], - ngvect_vels,time,BCVars::zvel_bc, do_fb); - } - // *************************************************************************** - - // MOST boundary conditions - if (!(cons_only && ncomp_cons == 1) && m_most && allow_most_bcs) { - m_most->impose_most_bcs(lev,mfs_vel, - Tau11_lev[lev].get(), - Tau22_lev[lev].get(), - Tau33_lev[lev].get(), - Tau12_lev[lev].get(), Tau21_lev[lev].get(), - Tau13_lev[lev].get(), Tau31_lev[lev].get(), - Tau23_lev[lev].get(), Tau32_lev[lev].get(), - SFS_hfx1_lev[lev].get(), - SFS_hfx2_lev[lev].get(), - SFS_hfx3_lev[lev].get(), - SFS_q1fx1_lev[lev].get(), - SFS_q1fx2_lev[lev].get(), - SFS_q1fx3_lev[lev].get(), - z_phys_nd[lev].get()); - } - - // We always come in to this call with momenta so we need to leave with momenta! - // We need to make sure we convert back on all ghost cells/faces because this is - // how velocity from fine-fine copies (as well as physical and interpolated bcs) will be filled - if (!cons_only) - { - IntVect ngu = (!solverChoice.use_NumDiff) ? IntVect(1,1,1) : mfs_vel[Vars::xvel]->nGrowVect(); - IntVect ngv = (!solverChoice.use_NumDiff) ? IntVect(1,1,1) : mfs_vel[Vars::yvel]->nGrowVect(); - IntVect ngw = (!solverChoice.use_NumDiff) ? IntVect(1,1,0) : mfs_vel[Vars::zvel]->nGrowVect(); - - VelocityToMomentum(*mfs_vel[Vars::xvel], ngu, - *mfs_vel[Vars::yvel], ngv, - *mfs_vel[Vars::zvel], ngw, - *mfs_vel[Vars::cons], - *mfs_mom[IntVars::xmom], *mfs_mom[IntVars::ymom], *mfs_mom[IntVars::zmom], - Geom(lev).Domain(), - domain_bcs_type); - } - - mfs_mom[IntVars::cons]->FillBoundary(geom[lev].periodicity()); - mfs_mom[IntVars::xmom]->FillBoundary(geom[lev].periodicity()); - mfs_mom[IntVars::ymom]->FillBoundary(geom[lev].periodicity()); - mfs_mom[IntVars::zmom]->FillBoundary(geom[lev].periodicity()); -} - -/* - * Fill valid and ghost data. - * This version fills an entire MultiFab by interpolating from the coarser level -- this is used - * only when a new level of refinement is being created during a run (i.e not at initialization) - * This will never be used with static refinement. - * - * @param[in] lev level of refinement at which to fill the data - * @param[in] time time at which the data should be filled - * @param[out] mfs Vector of MultiFabs to be filled containing, in order: cons, xvel, yvel, and zvel data - */ -void -ERF::FillCoarsePatch (int lev, Real time) -{ - BL_PROFILE_VAR("FillCoarsePatch()",FillCoarsePatch); - AMREX_ASSERT(lev > 0); - - // - //**************************************************************************************************************** - // First fill velocities and density at the COARSE level so we can convert velocity to momenta at the COARSE level - //**************************************************************************************************************** - // - bool cons_only = false; - FillPatch(lev-1, time, {&vars_new[lev-1][Vars::cons], &vars_new[lev-1][Vars::xvel], - &vars_new[lev-1][Vars::yvel], &vars_new[lev-1][Vars::zvel]}, - {&vars_new[lev-1][Vars::cons], - &rU_new[lev-1], &rV_new[lev-1], &rW_new[lev-1]}, - false, cons_only); - - // - // ************************************************ - // Convert velocity to momentum at the COARSE level - // ************************************************ - // - VelocityToMomentum(vars_new[lev-1][Vars::xvel], IntVect{0}, - vars_new[lev-1][Vars::yvel], IntVect{0}, - vars_new[lev-1][Vars::zvel], IntVect{0}, - vars_new[lev-1][Vars::cons], - rU_new[lev-1], - rV_new[lev-1], - rW_new[lev-1], - Geom(lev).Domain(), - domain_bcs_type); - // - // ***************************************************************** - // Interpolate all cell-centered variables from coarse to fine level - // ***************************************************************** - // - Interpolater* mapper_c = &cell_cons_interp; - Interpolater* mapper_f = &face_cons_linear_interp; - - // - //************************************************************************************************ - // Interpolate cell-centered data from coarse to fine level - // with InterpFromCoarseLevel which ASSUMES that all ghost cells have already been filled - // ************************************************************************************************ - IntVect ngvect_cons = vars_new[lev][Vars::cons].nGrowVect(); - int ncomp_cons = vars_new[lev][Vars::cons].nComp(); - - InterpFromCoarseLevel(vars_new[lev ][Vars::cons], ngvect_cons, IntVect(0,0,0), - vars_new[lev-1][Vars::cons], 0, 0, ncomp_cons, - geom[lev-1], geom[lev], - refRatio(lev-1), mapper_c, domain_bcs_type, BCVars::cons_bc); - - // - //************************************************************************************************ - // Interpolate x-momentum from coarse to fine level - // with InterpFromCoarseLevel which ASSUMES that all ghost cells have already been filled - // ************************************************************************************************ - // - InterpFromCoarseLevel(rU_new[lev], IntVect{0}, IntVect{0}, rU_new[lev-1], 0, 0, 1, - geom[lev-1], geom[lev], - refRatio(lev-1), mapper_f, domain_bcs_type, BCVars::xvel_bc); - - // - //************************************************************************************************ - // Interpolate y-momentum from coarse to fine level - // with InterpFromCoarseLevel which ASSUMES that all ghost cells have already been filled - // ************************************************************************************************ - // - InterpFromCoarseLevel(rV_new[lev], IntVect{0}, IntVect{0}, rV_new[lev-1], 0, 0, 1, - geom[lev-1], geom[lev], - refRatio(lev-1), mapper_f, domain_bcs_type, BCVars::yvel_bc); - - //************************************************************************************************ - // Interpolate z-momentum from coarse to fine level - // with InterpFromCoarseLevel which ASSUMES that all ghost cells have already been filled - // ************************************************************************************************ - InterpFromCoarseLevel(rW_new[lev], IntVect{0}, IntVect{0}, rW_new[lev-1], 0, 0, 1, - geom[lev-1], geom[lev], - refRatio(lev-1), mapper_f, domain_bcs_type, BCVars::zvel_bc); - // - // ********************************************************* - // After interpolation of momentum, convert back to velocity - // ********************************************************* - // - for (int which_lev = lev-1; which_lev <= lev; which_lev++) - { - MomentumToVelocity(vars_new[which_lev][Vars::xvel], - vars_new[which_lev][Vars::yvel], - vars_new[which_lev][Vars::zvel], - vars_new[which_lev][Vars::cons], - rU_new[which_lev], - rV_new[which_lev], - rW_new[which_lev], - Geom(lev).Domain(), - domain_bcs_type); - } - - // *************************************************************************** - // Physical bc's at domain boundary - // *************************************************************************** - IntVect ngvect_vels = vars_new[lev][Vars::xvel].nGrowVect(); - - (*physbcs_cons[lev])(vars_new[lev][Vars::cons],0,ncomp_cons,ngvect_cons,time,BCVars::cons_bc,true); - ( *physbcs_u[lev])(vars_new[lev][Vars::xvel],0,1 ,ngvect_vels,time,BCVars::xvel_bc,true); - ( *physbcs_v[lev])(vars_new[lev][Vars::yvel],0,1 ,ngvect_vels,time,BCVars::yvel_bc,true); - ( *physbcs_w[lev])(vars_new[lev][Vars::zvel],vars_new[lev][Vars::xvel],vars_new[lev][Vars::yvel], - ngvect_vels,time,BCVars::zvel_bc,true); - - // *************************************************************************** - // Since lev > 0 here we don't worry about m_r2d or wrfbdy data - // *************************************************************************** -} - -void -ERF::FillBdyCCVels (Vector& mf_cc_vel) -{ - // Impose bc's at domain boundaries - for (int lev = 0; lev <= finest_level; ++lev) - { - Box domain(Geom(lev).Domain()); - - int ihi = domain.bigEnd(0); - int jhi = domain.bigEnd(1); - int khi = domain.bigEnd(2); - - // Impose periodicity first - mf_cc_vel[lev].FillBoundary(geom[lev].periodicity()); - - for (MFIter mfi(mf_cc_vel[lev], TilingIfNotGPU()); mfi.isValid(); ++mfi) - { - // Note that we don't fill corners here -- only the cells that share a face - // with interior cells -- this is all that is needed to calculate vorticity - const Box& bx = mfi.tilebox(); - const Array4& vel_arr = mf_cc_vel[lev].array(mfi); - - if (!Geom(lev).isPeriodic(0)) { - // Low-x side - if (bx.smallEnd(0) <= domain.smallEnd(0)) { - Real mult = (phys_bc_type[0] == ERF_BC::no_slip_wall) ? -1. : 1.; - ParallelFor(makeSlab(bx,0,0), [=] AMREX_GPU_DEVICE(int , int j, int k) noexcept - { - vel_arr(-1,j,k,1) = mult*vel_arr(0,j,k,1); // v - vel_arr(-1,j,k,2) = mult*vel_arr(0,j,k,2); // w - }); - } - - // High-x side - if (bx.bigEnd(0) >= domain.bigEnd(0)) { - Real mult = (phys_bc_type[3] == ERF_BC::no_slip_wall) ? -1. : 1.; - ParallelFor(makeSlab(bx,0,0), [=] AMREX_GPU_DEVICE(int , int j, int k) noexcept - { - vel_arr(ihi+1,j,k,1) = mult*vel_arr(ihi,j,k,1); // v - vel_arr(ihi+1,j,k,2) = mult*vel_arr(ihi,j,k,2); // w - }); - } - } // !periodic - - if (!Geom(lev).isPeriodic(1)) { - // Low-y side - if (bx.smallEnd(1) <= domain.smallEnd(1)) { - Real mult = (phys_bc_type[1] == ERF_BC::no_slip_wall) ? -1. : 1.; - ParallelFor(makeSlab(bx,1,0), [=] AMREX_GPU_DEVICE(int i, int , int k) noexcept - { - vel_arr(i,-1,k,0) = mult*vel_arr(i,0,k,0); // u - vel_arr(i,-1,k,2) = mult*vel_arr(i,0,k,2); // w - }); - } - - // High-y side - if (bx.bigEnd(1) >= domain.bigEnd(1)) { - Real mult = (phys_bc_type[4] == ERF_BC::no_slip_wall) ? -1. : 1.; - ParallelFor(makeSlab(bx,1,0), [=] AMREX_GPU_DEVICE(int i, int , int k) noexcept - { - vel_arr(i,jhi+1,k,0) = mult*vel_arr(i,jhi,k,0); // u - vel_arr(i,jhi+1,k,2) = mult*-vel_arr(i,jhi,k,2); // w - }); - } - } // !periodic - - if (!Geom(lev).isPeriodic(2)) { - // Low-z side - if (bx.smallEnd(2) <= domain.smallEnd(2)) { - Real mult = (phys_bc_type[2] == ERF_BC::no_slip_wall) ? -1. : 1.; - ParallelFor(makeSlab(bx,2,0), [=] AMREX_GPU_DEVICE(int i, int j, int) noexcept - { - vel_arr(i,j,-1,0) = mult*vel_arr(i,j,0,0); // u - vel_arr(i,j,-1,1) = mult*vel_arr(i,j,0,1); // v - }); - } - - // High-z side - if (bx.bigEnd(2) >= domain.bigEnd(2)) { - Real mult = (phys_bc_type[5] == ERF_BC::no_slip_wall) ? -1. : 1.; - ParallelFor(makeSlab(bx,2,0), [=] AMREX_GPU_DEVICE(int i, int j, int) noexcept - { - vel_arr(i,j,khi+1,0) = mult*vel_arr(i,j,khi,0); // u - vel_arr(i,j,khi+1,1) = mult*vel_arr(i,j,khi,1); // v - }); - } - } // !periodic - } // MFIter - - } // lev -} diff --git a/Source/BoundaryConditions/Make.package b/Source/BoundaryConditions/Make.package index ca1133adb..2c02b46cb 100644 --- a/Source/BoundaryConditions/Make.package +++ b/Source/BoundaryConditions/Make.package @@ -10,6 +10,9 @@ CEXE_headers += ERF_ABLMost.H CEXE_sources += ERF_ABLMost.cpp CEXE_sources += ERF_FillPatch.cpp +CEXE_sources += ERF_FillCoarsePatch.cpp +CEXE_sources += ERF_FillIntermediatePatch.cpp +CEXE_sources += ERF_FillBdyCCVels.cpp CEXE_sources += ERF_FillPatcher.cpp CEXE_sources += ERF_PhysBCFunct.cpp From dda97206944aa6ec3e0c6bec824d65fd8445d0c6 Mon Sep 17 00:00:00 2001 From: Ann Almgren Date: Wed, 23 Oct 2024 15:47:31 -0700 Subject: [PATCH 34/35] remove assertion of no moisture with anelastic (#1907) --- Source/TimeIntegration/ERF_slow_rhs_pre.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/Source/TimeIntegration/ERF_slow_rhs_pre.cpp b/Source/TimeIntegration/ERF_slow_rhs_pre.cpp index 7ec8b392c..51890a8cd 100644 --- a/Source/TimeIntegration/ERF_slow_rhs_pre.cpp +++ b/Source/TimeIntegration/ERF_slow_rhs_pre.cpp @@ -165,7 +165,6 @@ void erf_slow_rhs_pre (int level, int finest_level, // We cannot use anelastic with terrain or with moisture AMREX_ALWAYS_ASSERT(!l_use_terrain || !l_anelastic); - AMREX_ALWAYS_ASSERT(!l_use_moisture || !l_anelastic); const Box& domain = geom.Domain(); const int domhi_z = domain.bigEnd(2); From 4cd3dddc4347096f91cd83f0642eb17668d0925c Mon Sep 17 00:00:00 2001 From: Akash Dhruv Date: Thu, 24 Oct 2024 13:40:40 -0500 Subject: [PATCH 35/35] Interface for NOAH-MP Landsurface model (#1835) * Add inital interface for NOAH-M * Update NOAH module and the corresponding FindNetCDF cmake recipe * Initial interface for NOAH LSM * Initial interface for NOAH-MP land surface model * Add linker options * Updates to cmake configuration to include NOAH * Update CMakeLists and move Fortran linkage to Noah-MP: * Update .gitmodules * Updates to NOAH-MP interface * Saving some interface work * udpate gitmodules * checkpoint changes for merge * Update Noah-MP submodules to resolve cmake errors * Resolve style errors * Update gmake interface for noahmp and add a dev test --- .gitmodules | 6 +++- CMake/BuildERFExe.cmake | 10 ++++++ CMake/FindNetCDF.cmake | 36 +++++++++++++++++++- CMakeLists.txt | 15 +++++++++ Exec/DevTests/NoahMP/CMakeLists.txt | 4 +++ Exec/DevTests/NoahMP/GNUmakefile | 33 ++++++++++++++++++ Exec/Make.ERF | 19 +++++++++++ Source/DataStructs/ERF_DataStruct.H | 2 +- Source/ERF.cpp | 5 +++ Source/LandSurfaceModel/ERF_LandSurface.H | 4 +++ Source/LandSurfaceModel/NOAH/ERF_NOAH.H | 41 +++++++++++++++++++++++ Source/LandSurfaceModel/NOAH/ERF_NOAH.cpp | 30 +++++++++++++++++ Source/LandSurfaceModel/NOAH/Make.package | 2 ++ Submodules/NOAH-MP | 1 + 14 files changed, 205 insertions(+), 3 deletions(-) create mode 100644 Exec/DevTests/NoahMP/CMakeLists.txt create mode 100644 Exec/DevTests/NoahMP/GNUmakefile create mode 100644 Source/LandSurfaceModel/NOAH/ERF_NOAH.H create mode 100644 Source/LandSurfaceModel/NOAH/ERF_NOAH.cpp create mode 100644 Source/LandSurfaceModel/NOAH/Make.package create mode 160000 Submodules/NOAH-MP diff --git a/.gitmodules b/.gitmodules index f96430215..ba9b4da82 100644 --- a/.gitmodules +++ b/.gitmodules @@ -9,7 +9,11 @@ [submodule "Submodules/RRTMGP"] path = Submodules/RRTMGP url = https://github.com/E3SM-Project/rte-rrtmgp - shallow = true + shallow = true +[submodule "Submodules/NOAH-MP"] + path = Submodules/NOAH-MP + url = https://github.com/AIEADA/noahmp.git + shallow=true [submodule "Submodules/WW3"] path = Submodules/WW3 url = https://github.com/erf-model/WW3 diff --git a/CMake/BuildERFExe.cmake b/CMake/BuildERFExe.cmake index 7bc51f20a..6c5d6195d 100644 --- a/CMake/BuildERFExe.cmake +++ b/CMake/BuildERFExe.cmake @@ -67,6 +67,16 @@ function(build_erf_lib erf_lib_name) target_compile_definitions(${erf_lib_name} PUBLIC ERF_USE_NETCDF) endif() + if(ERF_ENABLE_NOAH) + target_include_directories(${erf_lib_name} PUBLIC + $ + $) + target_sources(${erf_lib_name} PRIVATE + ${SRC_DIR}/LandSurfaceModel/NOAH/ERF_NOAH.cpp) + target_compile_definitions(${erf_lib_name} PUBLIC ERF_USE_NOAH) + target_link_libraries_system(${erf_lib_name} PUBLIC NoahMP::noahmp) + endif() + if(ERF_ENABLE_RRTMGP) target_sources(${erf_lib_name} PRIVATE ${SRC_DIR}/Utils/ERF_Orbit.cpp diff --git a/CMake/FindNetCDF.cmake b/CMake/FindNetCDF.cmake index 3e54ea3e8..6fac102b3 100644 --- a/CMake/FindNetCDF.cmake +++ b/CMake/FindNetCDF.cmake @@ -23,10 +23,44 @@ endif (NETCDF_INCLUDES AND NETCDF_LIBRARIES) find_package(PkgConfig REQUIRED QUIET) pkg_check_modules(NETCDF REQUIRED IMPORTED_TARGET netcdf) +find_path(NETCDF_INCLUDES netcdf.h + HINTS NETCDF_DIR/include ENV NETCDF_DIR) + +find_library(NETCDF_LIBRARIES_C NAMES netcdf HINTS NETCDF_DIR/lib ENV NETCDF_DIR) +mark_as_advanced(NETCDF_LIBRARIES_C) + +set(NetCDF_has_interfaces "YES") # will be set to NO if we're missing any interfaces +set(NetCDF_libs "${NETCDF_LIBRARIES_C}") + +get_filename_component(NetCDF_lib_dirs "${NETCDF_LIBRARIES_C}" PATH) + +macro(NetCDF_check_interface lang header libs) + if(NETCDF_${lang}) + find_path(NETCDF_INCLUDES_${lang} NAMES ${header} + HINTS "${NETCDF_INCLUDES}" NO_DEFAULT_PATH) + find_library(NETCDF_LIBRARIES_${lang} NAMES ${libs} + HINTS "${NetCDF_lib_dirs}" NO_DEFAULT_PATH) + mark_as_advanced(NETCDF_INCLUDES_${lang} NETCDF_LIBRARIES_${lang}) + + if(NETCDF_INCLUDES_${lang} AND NETCDF_LIBRARIES_${lang}) + list(INSERT NetCDF_libs 0 ${NETCDF_LIBRARIES_${lang}}) # prepend so that -lnetcdf is last + else(NETCDF_INCLUDES_${lang} AND NETCDF_LIBRARIES_${lang}) + set(NetCDF_has_interfaces "NO") + message(STATUS "Failed to find NetCDF interface for ${lang}") + endif(NETCDF_INCLUDES_${lang} AND NETCDF_LIBRARIES_${lang}) + endif(NETCDF_${lang}) +endmacro(NetCDF_check_interface) + +NetCDF_check_interface(CXX netcdfcpp.h netcdf_c++) +NetCDF_check_interface(F77 netcdf.inc netcdff) +NetCDF_check_interface(F90 netcdf.mod netcdff) + +set(NETCDF_LIBRARIES "${NetCDF_libs}" CACHE STRING "All NetCDF libraries required for interface level") + # handle the QUIETLY and REQUIRED arguments and set NETCDF_FOUND to TRUE if # all listed variables are TRUE include (FindPackageHandleStandardArgs) -find_package_handle_standard_args (NetCDF DEFAULT_MSG NETCDF_LIBRARIES NETCDF_LINK_LIBRARIES NETCDF_INCLUDE_DIRS) +find_package_handle_standard_args (NetCDF DEFAULT_MSG NETCDF_LIBRARIES NETCDF_LINK_LIBRARIES NETCDF_INCLUDE_DIRS NETCDF_INCLUDES NetCDF_has_interfaces) mark_as_advanced (NETCDF_LIBRARIES NETCDF_INCLUDES) diff --git a/CMakeLists.txt b/CMakeLists.txt index 03fb265ad..e045d2eb6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -33,6 +33,9 @@ option(ERF_ENABLE_CUDA "Enable CUDA" OFF) option(ERF_ENABLE_HIP "Enable HIP" OFF) option(ERF_ENABLE_SYCL "Enable SYCL" OFF) +#Options for NOAH-MP +option(ERF_ENABLE_NOAH "Enable Noah-MP" OFF) + #Options for C++ set(CMAKE_CXX_STANDARD 14) set(CMAKE_CXX_EXTENSIONS OFF) @@ -134,6 +137,18 @@ if(ERF_ENABLE_NETCDF) endif() endif() +########################## NOAH-MP ################################## + +if(ERF_ENABLE_NOAH) + if(ERF_ENABLE_NETCDF) + set(NOAHMP_HOME ${CMAKE_SOURCE_DIR}/Submodules/NOAH-MP) + set(NOAHMP_BIN ${CMAKE_BINARY_DIR}/Submodules/NOAH-MP) + add_subdirectory(${NOAHMP_HOME} ${NOAHMP_BIN}) + else() + message(FATAL_ERROR "Noah-MP requires NetCDF be enabled") + endif() +endif() + ########################### RRTMGP ################################# if(ERF_ENABLE_RRTMGP) diff --git a/Exec/DevTests/NoahMP/CMakeLists.txt b/Exec/DevTests/NoahMP/CMakeLists.txt new file mode 100644 index 000000000..995474bb5 --- /dev/null +++ b/Exec/DevTests/NoahMP/CMakeLists.txt @@ -0,0 +1,4 @@ +set(erf_exe_name erf_noahmp) +add_executable(${erf_exe_name} "") +include(${CMAKE_SOURCE_DIR}/CMake/BuildERFExe.cmake) +build_erf_exe(${erf_exe_name}) diff --git a/Exec/DevTests/NoahMP/GNUmakefile b/Exec/DevTests/NoahMP/GNUmakefile new file mode 100644 index 000000000..04aafbb6d --- /dev/null +++ b/Exec/DevTests/NoahMP/GNUmakefile @@ -0,0 +1,33 @@ +# AMReX +COMP = gnu +PRECISION = DOUBLE + +# Profiling +PROFILE = FALSE +TINY_PROFILE = FALSE +COMM_PROFILE = FALSE +TRACE_PROFILE = FALSE +MEM_PROFILE = FALSE +USE_GPROF = FALSE + +# Performance +USE_MPI = TRUE +USE_OMP = FALSE + +USE_CUDA = FALSE +USE_HIP = FALSE +USE_SYCL = FALSE + +# Debugging +DEBUG = FALSE + +# Land model +USE_NETCDF = TRUE +USE_NOAH = TRUE + +# GNU Make +Bpack := ./Make.package +Blocs := . +ERF_HOME := ../../.. +ERF_PROBLEM_DIR = $(ERF_HOME)/Exec/ABL +include $(ERF_HOME)/Exec/Make.ERF diff --git a/Exec/Make.ERF b/Exec/Make.ERF index 4205dafa6..7aca7d619 100644 --- a/Exec/Make.ERF +++ b/Exec/Make.ERF @@ -206,6 +206,25 @@ include $(ERF_LSM_SLM_DIR)/Make.package VPATH_LOCATIONS += $(ERF_LSM_SLM_DIR) INCLUDE_LOCATIONS += $(ERF_LSM_SLM_DIR) +# If using NOAH-MP model, then compile relevant source and headers +ifeq ($(USE_NOAH), TRUE) + ifneq ($(USE_NETCDF), TRUE) + $(error USE_NETCDF must be true for using NOAH-MP interface) + else + DEFINES += -DERF_USE_NOAH + includes += $(shell pkg-config --cflags netcdf-fortran) + LIBRARIES += $(shell pkg-config --libs netcdf-fortran) + NOAH_HOME ?= $(ERF_HOME)/Submodules/NOAH-MP + VPATH_LOCATIONS += $(NOAH_HOME)/drivers/hrldas + INCLUDE_LOCATIONS += $(NOAH_HOME)/drivers/hrldas + ERF_LSM_NOAH_DIR = $(ERF_SOURCE_DIR)/LandSurfaceModel/NOAH + include $(ERF_LSM_NOAH_DIR)/Make.package + VPATH_LOCATIONS += $(ERF_LSM_NOAH_DIR) + INCLUDE_LOCATIONS += $(ERF_LSM_NOAH_DIR) + endif +endif + + ERF_LSM_MM5_DIR = $(ERF_SOURCE_DIR)/LandSurfaceModel/MM5 include $(ERF_LSM_MM5_DIR)/Make.package VPATH_LOCATIONS += $(ERF_LSM_MM5_DIR) diff --git a/Source/DataStructs/ERF_DataStruct.H b/Source/DataStructs/ERF_DataStruct.H index c8f639a4a..645b5c7a5 100644 --- a/Source/DataStructs/ERF_DataStruct.H +++ b/Source/DataStructs/ERF_DataStruct.H @@ -50,7 +50,7 @@ AMREX_ENUM(WindFarmLocType, ); AMREX_ENUM(LandSurfaceType, - SLM, MM5, None + SLM, MM5, None, NOAH ); AMREX_ENUM(PerturbationType, diff --git a/Source/ERF.cpp b/Source/ERF.cpp index ef6ec5bfc..97ffabcfd 100644 --- a/Source/ERF.cpp +++ b/Source/ERF.cpp @@ -1557,6 +1557,11 @@ ERF::ReadParameters () } else if (solverChoice.lsm_type == LandSurfaceType::MM5) { lsm.SetModel(); Print() << "MM5 land surface model!\n"; +#ifdef ERF_USE_NOAH + } else if (solverChoice.lsm_type == LandSurfaceType::NOAH) { + lsm.SetModel(); + Print() << "NOAH land surface model!\n"; +#endif } else if (solverChoice.lsm_type == LandSurfaceType::None) { lsm.SetModel(); Print() << "Null land surface model!\n"; diff --git a/Source/LandSurfaceModel/ERF_LandSurface.H b/Source/LandSurfaceModel/ERF_LandSurface.H index 9db80be66..56ad3b2ea 100644 --- a/Source/LandSurfaceModel/ERF_LandSurface.H +++ b/Source/LandSurfaceModel/ERF_LandSurface.H @@ -7,6 +7,10 @@ #include #include +#if ERF_USE_NOAH +#include +#endif + class LandSurface { public: diff --git a/Source/LandSurfaceModel/NOAH/ERF_NOAH.H b/Source/LandSurfaceModel/NOAH/ERF_NOAH.H new file mode 100644 index 000000000..962c2dd2b --- /dev/null +++ b/Source/LandSurfaceModel/NOAH/ERF_NOAH.H @@ -0,0 +1,41 @@ +#ifndef NOAH_H +#define NOAH_H + +#include +#include +#include + +#include +#include +#include + +#include +#include +#include +#include + +// External include from the noahmp library +#include + +class NOAH : public NullSurf { +public: + // Constructor + NOAH () {} + + // Destructor + virtual ~NOAH () = default; + + // Initialize data structures + void + Init (const amrex::MultiFab& cons_in, + const amrex::Geometry& geom, + const amrex::Real& dt) override; + + +private: + + // C++ variable for NoahmpIO struct + NoahmpIO_struct noahmpio; + +}; +#endif diff --git a/Source/LandSurfaceModel/NOAH/ERF_NOAH.cpp b/Source/LandSurfaceModel/NOAH/ERF_NOAH.cpp new file mode 100644 index 000000000..3e4acf206 --- /dev/null +++ b/Source/LandSurfaceModel/NOAH/ERF_NOAH.cpp @@ -0,0 +1,30 @@ + +#include + +#include +#include + +using namespace amrex; + +/* Initialize lsm data structures */ +void +NOAH::Init (const MultiFab& cons_in, + const Geometry& geom, + const Real& dt) +{ + // Initialize Noahmp IO + amrex::Print() << "Initializing Noahmp IO" << std::endl; + + /* + * noahmpio.xstart = 1; + * noahmpio.xend = 4; + * noahmpio.ystart = 1; + * noahmpio.yend = 2; + * + */ + + NoahmpIOVarInitDefault(&noahmpio); + NoahmpInitMain(&noahmpio); + + amrex::Print() << "Noahmp IO Initialized" << std::endl; +}; diff --git a/Source/LandSurfaceModel/NOAH/Make.package b/Source/LandSurfaceModel/NOAH/Make.package new file mode 100644 index 000000000..4f1e6f483 --- /dev/null +++ b/Source/LandSurfaceModel/NOAH/Make.package @@ -0,0 +1,2 @@ +CEXE_sources += ERF_NOAH.cpp +CEXE_headers += ERF_NOAH.H diff --git a/Submodules/NOAH-MP b/Submodules/NOAH-MP new file mode 160000 index 000000000..482646ac5 --- /dev/null +++ b/Submodules/NOAH-MP @@ -0,0 +1 @@ +Subproject commit 482646ac5641492048973f7706db57145a3db11a