120 int lev_min,
int ncomp,
int finest_level,
130 amrex::PhysBCFunct cphysbc, fphysbc;
131 int lo_bc[] = {INT_DIR, INT_DIR, INT_DIR};
132 int hi_bc[] = {INT_DIR, INT_DIR, INT_DIR};
133 amrex::Vector<amrex::BCRec> bcs(1, amrex::BCRec(lo_bc, hi_bc));
134 amrex::PCInterp mapper;
137 for (
int lev = lev_min; lev <= finest_level; ++lev) {
138 const AmrGrid_t& ba = mf_to_be_filled[lev]->boxArray();
139 const AmrProcMap_t& dm = mf_to_be_filled[lev]->DistributionMap();
141 tmp[lev]->setVal(0.0);
144 for (
int lev = lev_min; lev <= finest_level; ++lev) {
147 if (lev < finest_level) {
148 amrex::InterpFromCoarseLevel(*tmp[lev+1], 0.0, *mf_to_be_filled[lev],
149 rho_index, rho_index, ncomp,
150 layout_p->Geom(lev), layout_p->Geom(lev+1),
152 layout_p->refRatio(lev), &mapper, bcs);
159 amrex::sum_fine_to_coarse(*mf_to_be_filled[lev],
160 *mf_to_be_filled[lev-1],
161 rho_index, 1, layout_p->refRatio(lev-1),
162 layout_p->Geom(lev-1), layout_p->Geom(lev));
165 mf_to_be_filled[lev]->plus(*tmp[lev], rho_index, ncomp, 0);
168 for (
int lev = finest_level - 1; lev >= lev_min; --lev) {
169 amrex::average_down(*mf_to_be_filled[lev+1],
170 *mf_to_be_filled[lev], rho_index, ncomp, layout_p->refRatio(lev));
194 if (layout_p->OnSameGrids(level, mf_to_be_filled)) {
197 mf_pointer = &mf_to_be_filled;
202 mf_pointer =
new AmrField_t(layout_p->ParticleBoxArray(level),
203 layout_p->ParticleDistributionMap(level),
204 ncomp, mf_to_be_filled.nGrow());
211 if (mf_pointer->nGrow() < 1)
212 throw OpalException(
"BoxLibParticle::AssignCellDensitySingleLevelFort()",
213 "Must have at least one ghost cell when in AssignCellDensitySingleLevelFort");
220 if (gm.isAnyPeriodic() && ! gm.isAllPeriodic()) {
221 throw OpalException(
"BoxLibParticle::AssignCellDensitySingleLevelFort()",
222 "Problem must be periodic in no or all directions");
225 for (amrex::MFIter mfi(*mf_pointer); mfi.isValid(); ++mfi) {
226 (*mf_pointer)[mfi].setVal(0);
231 size_t lBegin = LocalNumPerLevel.
begin(level);
232 size_t lEnd = LocalNumPerLevel.
end(level);
234 AmrReal_t inv_dx[3] = { 1.0 / dx[0], 1.0 / dx[1], 1.0 / dx[2] };
235 double lxyz[3] = { 0.0, 0.0, 0.0 };
236 double wxyz_hi[3] = { 0.0, 0.0, 0.0 };
237 double wxyz_lo[3] = { 0.0, 0.0, 0.0 };
238 int ijk[3] = {0, 0, 0};
240 for (
size_t ip = lBegin; ip < lEnd; ++ip) {
242 if ( bin > -1 && pbin[ip] != bin )
245 const int grid = this->
Grid[ip];
250 for (
int i = 0; i < 3; ++i) {
251 lxyz[i] = ( this->
R[ip](i) - plo[i] ) * inv_dx[i] + 0.5;
253 wxyz_hi[i] = lxyz[i] - ijk[i];
254 wxyz_lo[i] = 1.0 - wxyz_hi[i];
270 fab(i1, 0) += wxyz_lo[0]*wxyz_lo[1]*wxyz_lo[2]*pa[ip];
271 fab(i2, 0) += wxyz_lo[0]*wxyz_lo[1]*wxyz_hi[2]*pa[ip];
272 fab(i3, 0) += wxyz_lo[0]*wxyz_hi[1]*wxyz_lo[2]*pa[ip];
273 fab(i4, 0) += wxyz_lo[0]*wxyz_hi[1]*wxyz_hi[2]*pa[ip];
274 fab(i5, 0) += wxyz_hi[0]*wxyz_lo[1]*wxyz_lo[2]*pa[ip];
275 fab(i6, 0) += wxyz_hi[0]*wxyz_lo[1]*wxyz_hi[2]*pa[ip];
276 fab(i7, 0) += wxyz_hi[0]*wxyz_hi[1]*wxyz_lo[2]*pa[ip];
277 fab(i8, 0) += wxyz_hi[0]*wxyz_hi[1]*wxyz_hi[2]*pa[ip];
281 mf_pointer->SumBoundary(gm.periodicity());
286 const AmrReal_t vol = D_TERM(dx[0], *dx[1], *dx[2]);
288 mf_pointer->mult(1.0/vol, 0, 1, mf_pointer->nGrow());
293 if (mf_pointer != &mf_to_be_filled) {
294 mf_to_be_filled.copy(*mf_pointer,0,0,ncomp);
320 for (std::size_t i = 0; i < mesh_data.size(); ++i) {
321 if (mesh_data[i]->nGrow() < 1)
322 throw OpalException(
"BoxLibParticle::InterpolateSingleLevelFort()",
323 "Must have at least one ghost cell when in InterpolateSingleLevelFort");
334 size_t lBegin = LocalNumPerLevel.
begin(lev);
335 size_t lEnd = LocalNumPerLevel.
end(lev);
338 for (std::size_t i = 0; i < mesh_data.size(); ++i) {
339 mesh_data[i]->FillBoundary(gm.periodicity());
342 AmrReal_t inv_dx[3] = { 1.0 / dx[0], 1.0 / dx[1], 1.0 / dx[2] };
343 double lxyz[3] = { 0.0, 0.0, 0.0 };
344 double wxyz_hi[3] = { 0.0, 0.0, 0.0 };
345 double wxyz_lo[3] = { 0.0, 0.0, 0.0 };
346 int ijk[3] = {0, 0, 0};
347 for (
size_t ip = lBegin; ip < lEnd; ++ip) {
349 const int grid = this->
Grid[ip];
356 for (
int i = 0; i < 3; ++i) {
357 lxyz[i] = ( this->
R[ip](i) - plo[i] ) * inv_dx[i] + 0.5;
359 wxyz_hi[i] = lxyz[i] - ijk[i];
360 wxyz_lo[i] = 1.0 - wxyz_hi[i];
376 pa[ip](0) = wxyz_lo[0]*wxyz_lo[1]*wxyz_lo[2]*exfab(i1) +
377 wxyz_lo[0]*wxyz_lo[1]*wxyz_hi[2]*exfab(i2) +
378 wxyz_lo[0]*wxyz_hi[1]*wxyz_lo[2]*exfab(i3) +
379 wxyz_lo[0]*wxyz_hi[1]*wxyz_hi[2]*exfab(i4) +
380 wxyz_hi[0]*wxyz_lo[1]*wxyz_lo[2]*exfab(i5) +
381 wxyz_hi[0]*wxyz_lo[1]*wxyz_hi[2]*exfab(i6) +
382 wxyz_hi[0]*wxyz_hi[1]*wxyz_lo[2]*exfab(i7) +
383 wxyz_hi[0]*wxyz_hi[1]*wxyz_hi[2]*exfab(i8);
385 pa[ip](1) = wxyz_lo[0]*wxyz_lo[1]*wxyz_lo[2]*eyfab(i1) +
386 wxyz_lo[0]*wxyz_lo[1]*wxyz_hi[2]*eyfab(i2) +
387 wxyz_lo[0]*wxyz_hi[1]*wxyz_lo[2]*eyfab(i3) +
388 wxyz_lo[0]*wxyz_hi[1]*wxyz_hi[2]*eyfab(i4) +
389 wxyz_hi[0]*wxyz_lo[1]*wxyz_lo[2]*eyfab(i5) +
390 wxyz_hi[0]*wxyz_lo[1]*wxyz_hi[2]*eyfab(i6) +
391 wxyz_hi[0]*wxyz_hi[1]*wxyz_lo[2]*eyfab(i7) +
392 wxyz_hi[0]*wxyz_hi[1]*wxyz_hi[2]*eyfab(i8);
394 pa[ip](2) = wxyz_lo[0]*wxyz_lo[1]*wxyz_lo[2]*ezfab(i1) +
395 wxyz_lo[0]*wxyz_lo[1]*wxyz_hi[2]*ezfab(i2) +
396 wxyz_lo[0]*wxyz_hi[1]*wxyz_lo[2]*ezfab(i3) +
397 wxyz_lo[0]*wxyz_hi[1]*wxyz_hi[2]*ezfab(i4) +
398 wxyz_hi[0]*wxyz_lo[1]*wxyz_lo[2]*ezfab(i5) +
399 wxyz_hi[0]*wxyz_lo[1]*wxyz_hi[2]*ezfab(i6) +
400 wxyz_hi[0]*wxyz_hi[1]*wxyz_lo[2]*ezfab(i7) +
401 wxyz_hi[0]*wxyz_hi[1]*wxyz_hi[2]*ezfab(i8);
413 for (std::size_t i = 0; i < mesh_data[lev].size(); ++i) {
414 if (mesh_data[lev][i]->nGrow() < 1)
415 throw OpalException(
"BoxLibParticle::InterpolateMultiLevelFort()",
416 "Must have at least one ghost cell when in InterpolateMultiLevelFort");
424 const AmrReal_t* cdx = layout_p->Geom(lev-1).CellSize();
425 const AmrReal_t* cplo = layout_p->Geom(lev-1).ProbLo();
429 size_t lBegin = LocalNumPerLevel.
begin(lev);
430 size_t lEnd = LocalNumPerLevel.
end(lev);
433 for (std::size_t i = 0; i < mesh_data[lev].size(); ++i) {
434 mesh_data[lev][i]->FillBoundary(gm.periodicity());
437 AmrReal_t inv_fdx[3] = { 1.0 / fdx[0], 1.0 / fdx[1], 1.0 / fdx[2] };
438 AmrReal_t inv_cdx[3] = { 1.0 / cdx[0], 1.0 / cdx[1], 1.0 / cdx[2] };
439 double lxyz[3] = { 0.0, 0.0, 0.0 };
440 double wxyz_hi[3] = { 0.0, 0.0, 0.0 };
441 double wxyz_lo[3] = { 0.0, 0.0, 0.0 };
442 int ijk[3] = { 0, 0, 0 };
444 const AmrGrid_t& fba = mesh_data[lev][0]->boxArray();
445 const AmrProcMap_t& fdmap = mesh_data[lev][0]->DistributionMap();
450 mesh_data[lev][0]->nComp(),
451 mesh_data[lev][0]->nGrow());
453 cmesh_exdata.setVal(0.0, 0, 1, mesh_data[lev][0]->nGrow());
454 cmesh_exdata.copy(*mesh_data[lev-1][0], 0, 0, 1, 1, 1);
455 cmesh_exdata.FillBoundary(gm.periodicity());
458 mesh_data[lev][1]->nComp(),
459 mesh_data[lev][1]->nGrow());
460 cmesh_eydata.setVal(0.0, 0, 1, mesh_data[lev][1]->nGrow());
461 cmesh_eydata.copy(*mesh_data[lev-1][1], 0, 0, 1, 1, 1);
462 cmesh_eydata.FillBoundary(gm.periodicity());
465 mesh_data[lev][2]->nComp(),
466 mesh_data[lev][2]->nGrow());
467 cmesh_ezdata.setVal(0.0, 0, 1, mesh_data[lev][2]->nGrow());
468 cmesh_ezdata.copy(*mesh_data[lev-1][2], 0, 0, 1, 1, 1);
469 cmesh_ezdata.FillBoundary(gm.periodicity());
471 for (
size_t ip = lBegin; ip < lEnd; ++ip) {
473 const int grid = this->
Grid[ip];
483 const typename PLayout::basefab_t& mfab = (*layout_p->getLevelMask(lev))[grid];
487 for (
int ii = 0; ii < 3; ++ii) {
488 lxyz[ii] = ( this->
R[ip](ii) - plo[ii] ) * inv_fdx[ii] + 0.5;
490 wxyz_hi[ii] = lxyz[ii] - ijk[ii];
491 wxyz_lo[ii] = 1.0 - wxyz_hi[ii];
498 bool use_coarse =
false;
503 for (
int ii = 0; ii < 3; ++ii) {
504 lxyz[ii] = ( this->
R[ip](ii) - cplo[ii] ) * inv_cdx[ii] + 0.5;
506 wxyz_hi[ii] = lxyz[ii] - ijk[ii];
507 wxyz_lo[ii] = 1.0 - wxyz_hi[ii];
522 pa[ip](0) = wxyz_lo[0] * wxyz_lo[1] * wxyz_lo[2] * cexfab(i1) +
523 wxyz_lo[0] * wxyz_hi[1] * wxyz_lo[2] * cexfab(i3) +
524 wxyz_hi[0] * wxyz_lo[1] * wxyz_lo[2] * cexfab(i5) +
525 wxyz_hi[0] * wxyz_hi[1] * wxyz_lo[2] * cexfab(i7) +
526 wxyz_lo[0] * wxyz_lo[1] * wxyz_hi[2] * cexfab(i2) +
527 wxyz_lo[0] * wxyz_hi[1] * wxyz_hi[2] * cexfab(i4) +
528 wxyz_hi[0] * wxyz_lo[1] * wxyz_hi[2] * cexfab(i6) +
529 wxyz_hi[0] * wxyz_hi[1] * wxyz_hi[2] * cexfab(i8);
531 pa[ip](1) = wxyz_lo[0] * wxyz_lo[1] * wxyz_lo[2] * ceyfab(i1) +
532 wxyz_lo[0] * wxyz_hi[1] * wxyz_lo[2] * ceyfab(i3) +
533 wxyz_hi[0] * wxyz_lo[1] * wxyz_lo[2] * ceyfab(i5) +
534 wxyz_hi[0] * wxyz_hi[1] * wxyz_lo[2] * ceyfab(i7) +
535 wxyz_lo[0] * wxyz_lo[1] * wxyz_hi[2] * ceyfab(i2) +
536 wxyz_lo[0] * wxyz_hi[1] * wxyz_hi[2] * ceyfab(i4) +
537 wxyz_hi[0] * wxyz_lo[1] * wxyz_hi[2] * ceyfab(i6) +
538 wxyz_hi[0] * wxyz_hi[1] * wxyz_hi[2] * ceyfab(i8);
540 pa[ip](2) = wxyz_lo[0] * wxyz_lo[1] * wxyz_lo[2] * cezfab(i1) +
541 wxyz_lo[0] * wxyz_hi[1] * wxyz_lo[2] * cezfab(i3) +
542 wxyz_hi[0] * wxyz_lo[1] * wxyz_lo[2] * cezfab(i5) +
543 wxyz_hi[0] * wxyz_hi[1] * wxyz_lo[2] * cezfab(i7) +
544 wxyz_lo[0] * wxyz_lo[1] * wxyz_hi[2] * cezfab(i2) +
545 wxyz_lo[0] * wxyz_hi[1] * wxyz_hi[2] * cezfab(i4) +
546 wxyz_hi[0] * wxyz_lo[1] * wxyz_hi[2] * cezfab(i6) +
547 wxyz_hi[0] * wxyz_hi[1] * wxyz_hi[2] * cezfab(i8);
549 pa[ip](0) = wxyz_lo[0] * wxyz_lo[1] * wxyz_lo[2] * exfab(i1) +
550 wxyz_lo[0] * wxyz_hi[1] * wxyz_lo[2] * exfab(i3) +
551 wxyz_hi[0] * wxyz_lo[1] * wxyz_lo[2] * exfab(i5) +
552 wxyz_hi[0] * wxyz_hi[1] * wxyz_lo[2] * exfab(i7) +
553 wxyz_lo[0] * wxyz_lo[1] * wxyz_hi[2] * exfab(i2) +
554 wxyz_lo[0] * wxyz_hi[1] * wxyz_hi[2] * exfab(i4) +
555 wxyz_hi[0] * wxyz_lo[1] * wxyz_hi[2] * exfab(i6) +
556 wxyz_hi[0] * wxyz_hi[1] * wxyz_hi[2] * exfab(i8);
558 pa[ip](1) = wxyz_lo[0] * wxyz_lo[1] * wxyz_lo[2] * eyfab(i1) +
559 wxyz_lo[0] * wxyz_hi[1] * wxyz_lo[2] * eyfab(i3) +
560 wxyz_hi[0] * wxyz_lo[1] * wxyz_lo[2] * eyfab(i5) +
561 wxyz_hi[0] * wxyz_hi[1] * wxyz_lo[2] * eyfab(i7) +
562 wxyz_lo[0] * wxyz_lo[1] * wxyz_hi[2] * eyfab(i2) +
563 wxyz_lo[0] * wxyz_hi[1] * wxyz_hi[2] * eyfab(i4) +
564 wxyz_hi[0] * wxyz_lo[1] * wxyz_hi[2] * eyfab(i6) +
565 wxyz_hi[0] * wxyz_hi[1] * wxyz_hi[2] * eyfab(i8);
567 pa[ip](2) = wxyz_lo[0] * wxyz_lo[1] * wxyz_lo[2] * ezfab(i1) +
568 wxyz_lo[0] * wxyz_hi[1] * wxyz_lo[2] * ezfab(i3) +
569 wxyz_hi[0] * wxyz_lo[1] * wxyz_lo[2] * ezfab(i5) +
570 wxyz_hi[0] * wxyz_hi[1] * wxyz_lo[2] * ezfab(i7) +
571 wxyz_lo[0] * wxyz_lo[1] * wxyz_hi[2] * ezfab(i2) +
572 wxyz_lo[0] * wxyz_hi[1] * wxyz_hi[2] * ezfab(i4) +
573 wxyz_hi[0] * wxyz_lo[1] * wxyz_hi[2] * ezfab(i6) +
574 wxyz_hi[0] * wxyz_hi[1] * wxyz_hi[2] * ezfab(i8);