aboutsummaryrefslogtreecommitdiff
path: root/Source/Evolve
diff options
context:
space:
mode:
Diffstat (limited to 'Source/Evolve')
-rw-r--r--Source/Evolve/WarpXEvolveEM.cpp80
1 files changed, 68 insertions, 12 deletions
diff --git a/Source/Evolve/WarpXEvolveEM.cpp b/Source/Evolve/WarpXEvolveEM.cpp
index 32a4747db..531cd6a56 100644
--- a/Source/Evolve/WarpXEvolveEM.cpp
+++ b/Source/Evolve/WarpXEvolveEM.cpp
@@ -135,7 +135,7 @@ WarpX::EvolveEM (int numsteps)
bool to_make_plot = (plot_int > 0) && ((step+1) % plot_int == 0);
// slice generation //
- bool to_make_slice_plot = (slice_plot_int > 0) && ( (step+1)% slice_plot_int == 0);
+ bool to_make_slice_plot = (slice_plot_int > 0) && ( (step+1)% slice_plot_int == 0);
bool do_insitu = ((step+1) >= insitu_start) &&
(insitu_int > 0) && ((step+1) % insitu_int == 0);
@@ -145,7 +145,7 @@ WarpX::EvolveEM (int numsteps)
// We might need to move j because we are going to make a plotfile.
int num_moved = MoveWindow(move_j);
-
+
if (max_level == 0) {
int num_redistribute_ghost = num_moved + 1;
mypc->RedistributeLocal(num_redistribute_ghost);
@@ -228,7 +228,7 @@ WarpX::EvolveEM (int numsteps)
// End loop on time steps
}
- bool write_plot_file = plot_int > 0 && istep[0] > last_plot_file_step
+ bool write_plot_file = plot_int > 0 && istep[0] > last_plot_file_step
&& (max_time_reached || istep[0] >= max_step);
bool do_insitu = (insitu_start >= istep[0]) && (insitu_int > 0) &&
@@ -255,7 +255,7 @@ WarpX::EvolveEM (int numsteps)
UpdateInSitu();
}
- if (check_int > 0 && istep[0] > last_check_file_step &&
+ if (check_int > 0 && istep[0] > last_check_file_step &&
(max_time_reached || istep[0] >= max_step)) {
WriteCheckPointFile();
}
@@ -302,19 +302,75 @@ WarpX::OneStep_nosub (Real cur_time)
FillBoundaryE();
FillBoundaryB();
#else
+ // amrex::Print()<< "WarpXEvolveEM.cpp : before CopyJinPMLs "<<std::endl;
+ if (do_pml && pml_has_particles){
+ // do current deposition in PMLs
+ // copy current computed on mother grid to PMLs
+ // amrex::Print()<< "WarpXEvolveEM.cpp : IN CopyJinPMLs "<<std::endl;
+ for (int lev = 0; lev <= finest_level; ++lev)
+ {
+ if (pml[lev]->ok()){
+ pml[lev]->CopyJinPMLs({ current_fp[lev][0].get(),
+ current_fp[lev][1].get(),
+ current_fp[lev][2].get() },
+ { current_cp[lev][0].get(),
+ current_cp[lev][1].get(),
+ current_cp[lev][2].get() });
+ }
+ }
+ }
+
+ if (do_pml && do_pml_j_damping){
+ // amrex::Print()<< "WarpXEvolveEM.cpp : DampJ "<<std::endl;
+ // damp current in pmls
+ // amrex::Print() << "===== DAMPING IN PMLs =====" << std::endl;
+
+ // amrex::Print()<< "===== DAMPING J ====="<< std::endl;
+ // amrex::Print()<< "[AV DAMP] max_Jx_pml = "<< pml[0]->Getj_fp()[0]->min(0) << std::endl;
+ DampJPML();
+ // amrex::Print()<< "[AP DAMP] max_Jx_pml = "<< pml[0]->Getj_fp()[0]->min(0) << std::endl;
+ }
+
EvolveF(0.5*dt[0], DtType::FirstHalf);
FillBoundaryF();
EvolveB(0.5*dt[0]); // We now have B^{n+1/2}
FillBoundaryB();
+
EvolveE(dt[0]); // We now have E^{n+1}
FillBoundaryE();
EvolveF(0.5*dt[0], DtType::SecondHalf);
+
+ // amrex::Print()<< "WarpXEvolveEM.cpp : before CopyJinReg "<<std::endl;
+ if (do_pml && pml_has_particles){
+ // do current deposition in PMLs
+ // copy current computed on mother grid to PMLs
+ // amrex::Print()<< "WarpXEvolveEM.cpp : IN CopyJinReg "<<std::endl;
+ for (int lev = 0; lev <= finest_level; ++lev)
+ {
+ if (pml[lev]->ok()){
+ // amrex::Print()<< "[AV COPY] max_Jx = "<< current_fp[lev][0].get()->min(0) << std::endl;
+ // amrex::Print()<< "[AV COPY] max_Jx_pml = "<< pml[lev]->Getj_fp()[0]->min(0) << std::endl;
+ // amrex::Print()<< "===== Copy J from PML to Reg ====="<< std::endl;
+ pml[lev]->CopyJinReg({ current_fp[lev][0].get(),
+ current_fp[lev][1].get(),
+ current_fp[lev][2].get() },
+ { current_cp[lev][0].get(),
+ current_cp[lev][1].get(),
+ current_cp[lev][2].get() });
+ // amrex::Print()<< "[AP COPY] max_Jx = "<< current_fp[lev][0].get()->min(0) << std::endl;
+
+ }
+ }
+ }
+
EvolveB(0.5*dt[0]); // We now have B^{n+1}
if (do_pml) {
+ // amrex::Print()<< "WarpXEvolveEM.cpp : Damp "<<std::endl;
DampPML();
FillBoundaryE();
}
FillBoundaryB();
+
#endif
}
@@ -524,13 +580,13 @@ WarpX::ComputeDt ()
/* \brief computes max_step for wakefield simulation in boosted frame.
* \param geom: Geometry object that contains simulation domain.
- *
- * max_step is set so that the simulation stop when the lower corner of the
+ *
+ * max_step is set so that the simulation stop when the lower corner of the
* simulation box passes input parameter zmax_plasma_to_compute_max_step.
*/
void
WarpX::computeMaxStepBoostAccelerator(amrex::Geometry a_geom){
- // Sanity checks: can use zmax_plasma_to_compute_max_step only if
+ // Sanity checks: can use zmax_plasma_to_compute_max_step only if
// the moving window and the boost are all in z direction.
AMREX_ALWAYS_ASSERT_WITH_MESSAGE(
WarpX::moving_window_dir == AMREX_SPACEDIM-1,
@@ -547,7 +603,7 @@ WarpX::computeMaxStepBoostAccelerator(amrex::Geometry a_geom){
"Can use zmax_plasma_to_compute_max_step only if " +
"warpx.boost_direction = z. TODO: all directions.");
- // Lower end of the simulation domain. All quantities are given in boosted
+ // Lower end of the simulation domain. All quantities are given in boosted
// frame except zmax_plasma_to_compute_max_step.
const Real zmin_domain_boost = a_geom.ProbLo(AMREX_SPACEDIM-1);
// End of the plasma: Transform input argument
@@ -555,7 +611,7 @@ WarpX::computeMaxStepBoostAccelerator(amrex::Geometry a_geom){
const Real len_plasma_boost = zmax_plasma_to_compute_max_step/gamma_boost;
// Plasma velocity
const Real v_plasma_boost = -beta_boost * PhysConst::c;
- // Get time at which the lower end of the simulation domain passes the
+ // Get time at which the lower end of the simulation domain passes the
// upper end of the plasma (in the z direction).
const Real interaction_time_boost = (len_plasma_boost-zmin_domain_boost)/
(moving_window_v-v_plasma_boost);
@@ -568,7 +624,7 @@ WarpX::computeMaxStepBoostAccelerator(amrex::Geometry a_geom){
/* \brief Apply perfect mirror condition inside the box (not at a boundary).
* In practice, set all fields to 0 on a section of the simulation domain
- * (as for a perfect conductor with a given thickness).
+ * (as for a perfect conductor with a given thickness).
* The mirror normal direction has to be parallel to the z axis.
*/
void
@@ -585,10 +641,10 @@ WarpX::applyMirrors(Real time){
}
// Loop over levels
for(int lev=0; lev<=finest_level; lev++){
- // Make sure that the mirror contains at least
+ // Make sure that the mirror contains at least
// mirror_z_npoints[i_mirror] cells
Real dz = WarpX::CellSize(lev)[2];
- Real z_max = std::max(z_max_tmp,
+ Real z_max = std::max(z_max_tmp,
z_min+mirror_z_npoints[i_mirror]*dz);
// Get fine patch field MultiFabs
MultiFab& Ex = *Efield_fp[lev][0].get();