Skip to content
This repository was archived by the owner on Jun 27, 2024. It is now read-only.

Commit 5ff8854

Browse files
authored
add another eb test with multiple levels (#17)
* add a test for EB with multiple levels * shift the box * fix the size in y-direction
1 parent af00cf0 commit 5ff8854

File tree

8 files changed

+567
-12
lines changed

8 files changed

+567
-12
lines changed

inputs/inputs.tstPOneMultiEB

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
#amr
2+
max_level = 1
3+
ref_ratio = 2
4+
n_cell = 64
5+
max_grid_size = 32
6+
7+
plot_file_name = "pltMultiEB"
8+
9+
#mlmg
10+
composite_solve = 1
11+
use_hypre = 0
12+
verbose = 0
13+
bottom_verbose = 0
14+
max_iter = 20
15+
max_fmg_iter = 0
16+
max_coarsening_level = 30
17+
reltol = 1.e-6
18+
abstol = 1.e-6
19+
bottom_reltol = 1.e-6
20+
bottom_abstol = 1.e-6
21+
linop_maxorder = 2
22+
agglomeration = 1
23+
consolidation = 0
24+
25+
lo_bc = Periodic Periodic Periodic
26+
hi_bc = Periodic Periodic Periodic

src/AMRParam.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ struct AMRParam
2121
std::string plot_file_name_;
2222

2323
AMREX_GPU_HOST
24-
AMRParam(const amrex::ParmParse& pp) : pp_(pp)
24+
AMRParam(amrex::ParmParse const& pp) : pp_(pp)
2525
{
2626
pp_.query("max_level", max_level_);
2727
pp_.query("ref_ratio", ref_ratio_);

src/POneMultiEB.hpp

Lines changed: 162 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,162 @@
1+
#ifndef PONEMULTIEB_HPP
2+
#define PONEMULTIEB_HPP
3+
4+
#include <AMRParam.hpp>
5+
#include <AMReX_FArrayBox.H>
6+
#include <AMReX_MLEBABecLap.H>
7+
#include <AMReX_MLMG.H>
8+
#include <AMReX_MultiFabUtil.H>
9+
#include <AMReX_ParmParse.H>
10+
#include <MLMGParam.hpp>
11+
12+
namespace PeleRad
13+
{
14+
15+
class POneMultiEB
16+
{
17+
private:
18+
MLMGParam mlmgpp_;
19+
20+
amrex::LPInfo info_;
21+
22+
public:
23+
amrex::Vector<amrex::Geometry>& geom_;
24+
amrex::Vector<amrex::BoxArray>& grids_;
25+
amrex::Vector<amrex::DistributionMapping>& dmap_;
26+
27+
amrex::Vector<std::unique_ptr<amrex::EBFArrayBoxFactory>> const& factory_;
28+
29+
amrex::Vector<amrex::MultiFab>& solution_;
30+
amrex::Vector<amrex::MultiFab> const& rhs_;
31+
amrex::Vector<amrex::MultiFab> const& acoef_;
32+
amrex::Vector<amrex::Array<amrex::MultiFab, AMREX_SPACEDIM>> const& bcoef_;
33+
34+
amrex::Vector<amrex::MultiFab> const& robin_a_;
35+
amrex::Vector<amrex::MultiFab> const& robin_b_;
36+
amrex::Vector<amrex::MultiFab> const& robin_f_;
37+
38+
amrex::Real const ascalar_ = 1.0;
39+
amrex::Real const bscalar_ = 1.0 / 3.0;
40+
41+
POneMultiEB() = delete;
42+
43+
POneMultiEB(POneMultiEB const&) = delete;
44+
45+
// constructor
46+
POneMultiEB(MLMGParam const& mlmgpp, amrex::Vector<amrex::Geometry>& geom,
47+
amrex::Vector<amrex::BoxArray>& grids,
48+
amrex::Vector<amrex::DistributionMapping>& dmap,
49+
amrex::Vector<std::unique_ptr<amrex::EBFArrayBoxFactory>>& factory,
50+
amrex::Vector<amrex::MultiFab>& solution,
51+
amrex::Vector<amrex::MultiFab> const& rhs,
52+
amrex::Vector<amrex::MultiFab> const& acoef,
53+
amrex::Vector<amrex::Array<amrex::MultiFab, AMREX_SPACEDIM>> const&
54+
bcoef,
55+
amrex::Vector<amrex::MultiFab> const& robin_a,
56+
amrex::Vector<amrex::MultiFab> const& robin_b,
57+
amrex::Vector<amrex::MultiFab> const& robin_f)
58+
: mlmgpp_(mlmgpp),
59+
geom_(geom),
60+
grids_(grids),
61+
dmap_(dmap),
62+
factory_(factory),
63+
solution_(solution),
64+
rhs_(rhs),
65+
acoef_(acoef),
66+
bcoef_(bcoef),
67+
robin_a_(robin_a),
68+
robin_b_(robin_b),
69+
robin_f_(robin_f)
70+
{
71+
auto const max_coarsening_level = mlmgpp_.max_coarsening_level_;
72+
auto const agglomeration = mlmgpp_.agglomeration_;
73+
auto const consolidation = mlmgpp_.consolidation_;
74+
info_.setAgglomeration(agglomeration);
75+
info_.setConsolidation(consolidation);
76+
info_.setMaxCoarseningLevel(max_coarsening_level);
77+
}
78+
79+
void solve()
80+
{
81+
auto const nlevels = geom_.size();
82+
83+
auto const linop_maxorder = mlmgpp_.linop_maxorder_;
84+
85+
auto const& lobc = mlmgpp_.lobc_;
86+
auto const& hibc = mlmgpp_.hibc_;
87+
88+
amrex::MLEBABecLap mlabec(
89+
geom_, grids_, dmap_, info_, amrex::GetVecOfConstPtrs(factory_));
90+
91+
mlabec.setDomainBC(lobc, hibc);
92+
mlabec.setScalars(ascalar_, bscalar_);
93+
mlabec.setMaxOrder(linop_maxorder);
94+
95+
auto const max_iter = mlmgpp_.max_iter_;
96+
auto const max_fmg_iter = mlmgpp_.max_fmg_iter_;
97+
auto const verbose = mlmgpp_.verbose_;
98+
auto const bottom_verbose = mlmgpp_.bottom_verbose_;
99+
auto const use_hypre = mlmgpp_.use_hypre_;
100+
auto const bottom_reltol = mlmgpp_.bottom_reltol_;
101+
auto const bottom_abstol = mlmgpp_.bottom_abstol_;
102+
103+
amrex::MLMG mlmg(mlabec);
104+
mlmg.setMaxIter(max_iter);
105+
mlmg.setMaxFmgIter(max_fmg_iter);
106+
mlmg.setVerbose(verbose);
107+
mlmg.setBottomVerbose(bottom_verbose);
108+
mlmg.setBottomSolver(amrex::BottomSolver::bicgstab);
109+
if (use_hypre) mlmg.setBottomSolver(amrex::MLMG::BottomSolver::hypre);
110+
mlmg.setBottomTolerance(bottom_reltol);
111+
mlmg.setBottomToleranceAbs(bottom_abstol);
112+
113+
for (int ilev = 0; ilev < nlevels; ++ilev)
114+
{
115+
116+
auto const& geom = geom_[ilev];
117+
auto& solution = solution_[ilev];
118+
auto const& acoef = acoef_[ilev];
119+
auto const& bcoef = bcoef_[ilev];
120+
auto const& robin_a = robin_a_[ilev];
121+
auto const& robin_b = robin_b_[ilev];
122+
auto const& robin_f = robin_f_[ilev];
123+
124+
// mlabec.setLevelBC(ilev, &solution, &robin_a, &robin_b, &robin_f);
125+
mlabec.setLevelBC(ilev, &solution);
126+
127+
mlabec.setACoeffs(ilev, acoef);
128+
/*
129+
amrex::Array<amrex::MultiFab, AMREX_SPACEDIM>
130+
face_bcoef; for (int idim = 0; idim < AMREX_SPACEDIM; ++idim)
131+
{
132+
amrex::BoxArray const& ba = amrex::convert(
133+
bcoef.boxArray(),
134+
amrex::IntVect::TheDimensionVector(idim));
135+
face_bcoef[idim].define(ba, bcoef.DistributionMap(),
136+
1, 0);
137+
}
138+
amrex::average_cellcenter_to_face(
139+
GetArrOfPtrs(face_bcoef), bcoef, geom);
140+
mlabec.setBCoeffs(ilev,
141+
amrex::GetArrOfConstPtrs(face_bcoef));
142+
}
143+
*/
144+
145+
mlabec.setBCoeffs(ilev, amrex::GetArrOfConstPtrs(bcoef));
146+
147+
amrex::MultiFab beta(grids_[ilev], dmap_[ilev], 1, 1,
148+
amrex::MFInfo(), *factory_[ilev]);
149+
beta.setVal(1.0);
150+
151+
mlabec.setEBDirichlet(ilev, solution, beta);
152+
}
153+
auto const tol_rel = mlmgpp_.reltol_;
154+
auto const tol_abs = mlmgpp_.abstol_;
155+
156+
mlmg.solve(
157+
GetVecOfPtrs(solution_), GetVecOfConstPtrs(rhs_), tol_rel, tol_abs);
158+
}
159+
};
160+
}
161+
162+
#endif

src/POneSingleEB.hpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ class POneSingleEB
2929
amrex::MultiFab& solution_;
3030
amrex::MultiFab const& rhs_;
3131
amrex::MultiFab const& acoef_;
32-
amrex::Array<amrex::MultiFab, AMREX_SPACEDIM>& bcoef_;
32+
amrex::Array<amrex::MultiFab, AMREX_SPACEDIM> const& bcoef_;
3333

3434
amrex::MultiFab const& robin_a_;
3535
amrex::MultiFab const& robin_b_;
@@ -44,7 +44,7 @@ class POneSingleEB
4444
std::unique_ptr<amrex::EBFArrayBoxFactory> const& factory,
4545
amrex::MultiFab& solution, amrex::MultiFab const& rhs,
4646
amrex::MultiFab const& acoef,
47-
amrex::Array<amrex::MultiFab, AMREX_SPACEDIM>& bcoef,
47+
amrex::Array<amrex::MultiFab, AMREX_SPACEDIM> const& bcoef,
4848
amrex::MultiFab const& robin_a, amrex::MultiFab const& robin_b,
4949
amrex::MultiFab const& robin_f)
5050
: mlmgpp_(mlmgpp),
@@ -95,7 +95,7 @@ class POneSingleEB
9595

9696
mlabec.setDomainBC(lobc, hibc);
9797

98-
// mlabec.setLevelBC(0, &solution, &robin_a, &robin_b, &robin_f);
98+
// mlabec.setLevelBC(0, &solution, &robin_a, &robin_b, &robin_f);
9999
mlabec.setLevelBC(0, nullptr);
100100

101101
mlabec.setScalars(ascalar, bscalar);
@@ -125,7 +125,7 @@ class POneSingleEB
125125
// mlabec.setBCoeffs(0, amrex::GetArrOfConstPtrs(face_bcoef));
126126
mlabec.setBCoeffs(0, amrex::GetArrOfConstPtrs(bcoef));
127127

128-
// this is the BCoef associated iwth an EB face
128+
// this is the BCoef associated with an EB face
129129
amrex::MultiFab beta(grids, dmap, 1, 0, amrex::MFInfo(), *factory);
130130
beta.setVal(1.0);
131131

src/PlanckMean.hpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,12 @@ class PlanckMean
3131
AMREX_GPU_HOST
3232
PlanckMean(std::string data_path) { load(data_path); }
3333

34+
AMREX_GPU_HOST
35+
PlanckMean(PlanckMean const&) = delete;
36+
37+
AMREX_GPU_HOST
38+
PlanckMean& operator=(PlanckMean const&) = delete;
39+
3440
AMREX_GPU_HOST
3541
void load(std::string data_path)
3642
{

tests/CMakeLists.txt

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,12 @@ target_include_directories(PeleRad_POneSingleEB.exe PUBLIC ${AMREX_HOME_DIR}/Src
3737
target_link_libraries(PeleRad_POneSingleEB.exe PRIVATE PeleRad Boost::unit_test_framework amrex)
3838
target_compile_definitions(PeleRad_POneSingleEB.exe PRIVATE BOOST_TEST_DYN_LINK)
3939
add_test(NAME PeleRad_POneSingleEB_Test COMMAND ${MPIEXEC_EXECUTABLE} ${MPIEXEC_NUMPROC_FLAG} ${MPIEXEC_MAX_NUMPROCS} ${MPIEXEC_PREFLAGS} ./PeleRad_POneSingleEB.exe "${CMAKE_SOURCE_DIR}/inputs/inputs.tstPOneSingleEB")
40+
41+
add_executable(PeleRad_POneMultiEB.exe tstPOneMultiEB.cpp ut_main.cpp)
42+
target_include_directories(PeleRad_POneMultiEB.exe PUBLIC ${AMREX_HOME_DIR}/Src/Base ${AMREX_HOME_DIR}/Src/LinearSolvers/MLMG ${AMREX_HOME_DIR}/Src/EB)
43+
target_link_libraries(PeleRad_POneMultiEB.exe PRIVATE PeleRad Boost::unit_test_framework amrex)
44+
target_compile_definitions(PeleRad_POneMultiEB.exe PRIVATE BOOST_TEST_DYN_LINK)
45+
add_test(NAME PeleRad_POneMultiEB_Test COMMAND ${MPIEXEC_EXECUTABLE} ${MPIEXEC_NUMPROC_FLAG} ${MPIEXEC_MAX_NUMPROCS} ${MPIEXEC_PREFLAGS} ./PeleRad_POneMultiEB.exe "${CMAKE_SOURCE_DIR}/inputs/inputs.tstPOneMultiEB")
4046
endif()
4147

4248
add_executable(PeleRad_POneMulti.exe tstPOneMulti.cpp ut_main.cpp)
@@ -78,6 +84,12 @@ target_include_directories(PeleRad_POneSingleEB.exe PUBLIC ${AMREX_HOME_DIR}/Src
7884
target_link_libraries(PeleRad_POneSingleEB.exe PRIVATE PeleRad Boost::unit_test_framework amrex)
7985
target_compile_definitions(PeleRad_POneSingleEB.exe PRIVATE BOOST_TEST_DYN_LINK)
8086
add_test(NAME PeleRad_POneSingleEB_Test COMMAND ./PeleRad_POneSingleEB.exe "${CMAKE_SOURCE_DIR}/inputs/inputs.tstPOneSingleEB" )
87+
88+
add_executable(PeleRad_POneMultiEB.exe tstPOneMultiEB.cpp ut_main.cpp)
89+
target_include_directories(PeleRad_POneMultiEB.exe PUBLIC ${AMREX_HOME_DIR}/Src/Base ${AMREX_HOME_DIR}/Src/LinearSolvers/MLMG ${AMREX_HOME_DIR}/Src/EB)
90+
target_link_libraries(PeleRad_POneMultiEB.exe PRIVATE PeleRad Boost::unit_test_framework amrex)
91+
target_compile_definitions(PeleRad_POneMultiEB.exe PRIVATE BOOST_TEST_DYN_LINK)
92+
add_test(NAME PeleRad_POneMultiEB_Test COMMAND ./PeleRad_POneMultiEB.exe "${CMAKE_SOURCE_DIR}/inputs/inputs.tstPOneMultiEB")
8193
endif()
8294

8395
add_executable(PeleRad_POneMulti.exe tstPOneMulti.cpp ut_main.cpp)
@@ -107,6 +119,7 @@ setup_target_for_cuda_compilation(PeleRad_BoostReadDatabase.exe)
107119
setup_target_for_cuda_compilation(PeleRad_AmrexGetRadProp.exe)
108120
setup_target_for_cuda_compilation(PeleRad_POneSingle.exe)
109121
setup_target_for_cuda_compilation(PeleRad_POneSingleEB.exe)
122+
setup_target_for_cuda_compilation(PeleRad_POneMultiEB.exe)
110123
setup_target_for_cuda_compilation(PeleRad_POneMulti.exe)
111124
setup_target_for_cuda_compilation(PeleRad_POneSingleAF.exe)
112125
setup_target_for_cuda_compilation(PeleRad_POneMultiAF.exe)

0 commit comments

Comments
 (0)