104 info.setAgglomeration(
true);
105 info.setConsolidation(
true);
106 info.setMaxCoarseningLevel(10);
110 int nlevels = finestLevel - baseLevel + 1;
117 for (
int ilev = 0; ilev < nlevels; ++ilev) {
118 geom_p[ilev] = geom[ilev + baseLevel];
119 ba[ilev] = rho[ilev + baseLevel]->boxArray();
120 dm[ilev] = rho[ilev + baseLevel]->DistributionMap();
121 rho_p[ilev] = rho[ilev + baseLevel].get();
122 phi_p[ilev] = phi[ilev + baseLevel].get();
125 amrex::MLPoisson mlpoisson(geom_p, ba, dm, info);
127 mlpoisson.setMaxOrder(3);
129 mlpoisson.setDomainBC({AMREX_D_DECL(amrex::LinOpBCType::Dirichlet,
130 amrex::LinOpBCType::Dirichlet,
131 amrex::LinOpBCType::Dirichlet)},
132 {AMREX_D_DECL(amrex::LinOpBCType::Dirichlet,
133 amrex::LinOpBCType::Dirichlet,
134 amrex::LinOpBCType::Dirichlet)});
136 for (
int ilev = 0; ilev < nlevels; ++ilev) {
137 mlpoisson.setLevelBC(ilev, phi[ilev].get());
140 amrex::MLMG mlmg(mlpoisson);
141 mlmg.setMaxIter(200);
142 mlmg.setMaxFmgIter(0);
144 mlmg.setCGVerbose(0);
151 amrex::Vector<std::array<AmrField_t*, AMREX_SPACEDIM> > grad(nlevels);
153 for (
int i = 0; i < nlevels; ++i) {
154 for (
int j = 0; j < AMREX_SPACEDIM; ++j) {
155 grad[i][j] = efield[i][j].get();
159 mlmg.getGradSolution(grad);
161 for (
int i = 0; i < nlevels; ++i) {
162 for (
int j = 0; j < AMREX_SPACEDIM; ++j) {
163 efield[i][j]->mult(-1.0, 0, 1, 1);
void solve(AmrScalarFieldContainer_t &rho, AmrScalarFieldContainer_t &phi, AmrVectorFieldContainer_t &efield, unsigned short baseLevel, unsigned short finestLevel, bool prevAsGuess=true)