From fe784c74aabdd6ca96036036a55a1ed1d9427196 Mon Sep 17 00:00:00 2001 From: MaxThevenet Date: Sat, 30 May 2020 06:27:35 -0700 Subject: [PATCH] Delete more deprecated code after in-situ uses new diagnostics format (#1041) * move ascent to new diagnostics * move Sensei to the new diagnostics * minor cleaning in new diagnostics * Delete more deprecated code after in-situ uses new diags * remove deprecated input options from subcycling test * Finish updating the doc for Sensei and Ascent with the new diags --- Docs/source/running_cpp/parameters.rst | 32 +- Examples/Tests/subcycling/inputs_2d | 2 - Source/Diagnostics/FieldIO.H | 8 - Source/Diagnostics/FieldIO.cpp | 393 +------------------------ Source/WarpX.H | 7 - Source/WarpX.cpp | 44 +-- 6 files changed, 23 insertions(+), 463 deletions(-) diff --git a/Docs/source/running_cpp/parameters.rst b/Docs/source/running_cpp/parameters.rst index 076fb760294..f43068bc477 100644 --- a/Docs/source/running_cpp/parameters.rst +++ b/Docs/source/running_cpp/parameters.rst @@ -1133,6 +1133,9 @@ Boundary conditions Diagnostics and output ---------------------- +In-situ visualization +^^^^^^^^^^^^^^^^^^^^^ + WarpX has three types of diagnostics: ``FullDiagnostics`` consist in dumps of fields and particles at given iterations, ``BackTransformedDiagnostics`` are used when running a simulation in a boosted frame, to reconstruct output data to the lab frame, and @@ -1148,6 +1151,7 @@ Similar to what is done for physical species, WarpX has a class Diagnostics that The user specifies the number of diagnostics and the name of each of them, and then specifies options for each of them separately. Note that some parameter (those that do not start with a ``.`` prefix) apply to all diagnostics. This should be changed in the future. +In-situ capabilities can be used by turning on Sensei or Ascent (provided they are installed) through the output format, see below. * ``diagnostics.diags_names`` (list of `string` optional, default `empty`) Name of each diagnostics. @@ -1175,8 +1179,18 @@ This should be changed in the future. * ``ascent`` for in-situ visualization using Ascent. + * ``sensei`` for in-situ visualization using Sensei. + example: ``diag1.format = openpmd``. +* ``.sensei_config`` (`string`) + Only read if ``.format = sensei``. + Points to the SENSEI XML file which selects and configures the desired back end. + +* ``.sensei_pin_mesh`` (`integer`; 0 by default) + Only read if ``.format = sensei``. + When 1 lower left corner of the mesh is pinned to 0.,0.,0. + * ``.openpmd_backend`` (``bp``, ``h5`` or ``json``) optional, only used if ``.format = openpmd`` `I/O backend `_ for `openPMD `_ data dumps. ``bp`` is the `ADIOS I/O library `_, ``h5`` is the `HDF5 format `_, and ``json`` is a `simple text format `_. @@ -1530,24 +1544,6 @@ Reduced Diagnostics The separator between row values in the output file. The default separator is a whitespace. -In-situ visualization -^^^^^^^^^^^^^^^^^^^^^ - -Besides the diagnostics described above, WarpX has in-situ visualization capabilities. -This is controlled by the following option(s): - -* ``insitu.int`` (`integer`; 0 by default) - Turns in situ processing on or off and controls how often data is processed. - -* ``insitu.start`` (`integer`; 0 by default) - Controls when in situ processing starts. - -* ``insitu.config`` (`string`) - Points to the SENSEI XML file which selects and configures the desired back end. - -* ``insitu.pin_mesh`` (`integer`; 0 by default) - when 1 lower left corner of the mesh is pinned to 0.,0.,0. - Lookup tables and other settings for QED modules (implementation in progress) ----------------------------------------------------------------------------- diff --git a/Examples/Tests/subcycling/inputs_2d b/Examples/Tests/subcycling/inputs_2d index f879c5aaeef..6c50b9c0ba1 100644 --- a/Examples/Tests/subcycling/inputs_2d +++ b/Examples/Tests/subcycling/inputs_2d @@ -25,8 +25,6 @@ warpx.use_filter = 1 warpx.do_pml = 1 warpx.do_subcycling = 1 warpx.refine_plasma = 0 -warpx.plot_finepatch = 1 -warpx.plot_crsepatch = 1 warpx.n_current_deposition_buffer = 0 warpx.n_field_gather_buffer = 0 diff --git a/Source/Diagnostics/FieldIO.H b/Source/Diagnostics/FieldIO.H index 3d386c2077c..7533c847b37 100644 --- a/Source/Diagnostics/FieldIO.H +++ b/Source/Diagnostics/FieldIO.H @@ -82,14 +82,6 @@ getInterpolatedVector( const int r_ratio, const amrex::Real* dx, const int ngrow ); -void -coarsenCellCenteredFields( - amrex::Vector& coarse_mf, - amrex::Vector& coarse_geom, - const amrex::Vector& source_mf, - const amrex::Vector& source_geom, - int coarse_ratio, int finest_level ); - #ifdef WARPX_USE_OPENPMD void setOpenPMDUnit( openPMD::Mesh mesh, const std::string field_name ); diff --git a/Source/Diagnostics/FieldIO.cpp b/Source/Diagnostics/FieldIO.cpp index 177126b1cf8..beff4828ed0 100644 --- a/Source/Diagnostics/FieldIO.cpp +++ b/Source/Diagnostics/FieldIO.cpp @@ -140,6 +140,7 @@ ConstructTotalRZScalarField (MultiFab& scalar_total, * (representing the x, y, z components of a vector), * averages it to the cell center, and stores the * resulting MultiFab in mf_avg (in the components dcomp to dcomp+2) + * Should only be used for BTD now. */ void AverageAndPackVectorField( MultiFab& mf_avg, @@ -177,27 +178,6 @@ AverageAndPackVectorField( MultiFab& mf_avg, CoarsenIO::Coarsen( mf_avg, *(vector_total[2]), dcomp+2, 0, 1, ngrow ); } -/** \brief Takes all of the components of the three fields and - * averages and packs them into the MultiFab mf_avg. - */ -void -AverageAndPackVectorFieldComponents (MultiFab& mf_avg, - const std::array< std::unique_ptr, 3 >& vector_field, - const DistributionMapping& dm, - int& dcomp, const int ngrow ) -{ - if (vector_field[0]->nComp() > 1) { - std::array,3> vector_field_component; - for (int icomp=0 ; icomp < vector_field[0]->nComp() ; icomp++) { - vector_field_component[0].reset(new MultiFab(*vector_field[0], amrex::make_alias, icomp, 1)); - vector_field_component[1].reset(new MultiFab(*vector_field[1], amrex::make_alias, icomp, 1)); - vector_field_component[2].reset(new MultiFab(*vector_field[2], amrex::make_alias, icomp, 1)); - AverageAndPackVectorField(mf_avg, vector_field_component, dm, dcomp, ngrow); - dcomp += 3; - } - } -} - /** \brief Take a MultiFab `scalar_field` * averages it to the cell center, and stores the * resulting MultiFab in mf_avg (in the components dcomp) @@ -236,350 +216,6 @@ AverageAndPackScalarField (MultiFab& mf_avg, } } -/** \brief Takes the specified component of the scalar and - * averages and packs it into the MultiFab mf_avg. - */ -void -AverageAndPackScalarFieldComponent (MultiFab& mf_avg, - const MultiFab& scalar_field, - const DistributionMapping& dm, - const int icomp, - const int dcomp, const int ngrow ) -{ - MultiFab scalar_field_component(scalar_field, amrex::make_alias, icomp, 1); - AverageAndPackScalarField(mf_avg, scalar_field_component, dm, dcomp, ngrow); -} - -/** \brief Generate mode variable name - */ -std::string -ComponentName (std::string fieldname, int mode, std::string type) -{ - if (type == "real") { - return fieldname + "_" + std::to_string(mode) + "_" + "real"; - } else if (type == "imag") { - return fieldname + "_" + std::to_string(mode) + "_" + "imag"; - } else { - AMREX_ALWAYS_ASSERT( false ); - } - // This should never be done - return ""; -} - -/* \brief Copy vector field component data into the MultiFab that will be written out - */ -void -CopyVectorFieldComponentsToMultiFab (int lev, amrex::Vector& mf_avg, MultiFab& mf_tmp, - int icomp, int& dcomp, int ngrow, - std::string fieldname, Vector& varnames) -{ - if (mf_tmp.nComp() > 3) { - if (lev==0) varnames.push_back(ComponentName(fieldname, 0, "real")); - MultiFab::Copy( mf_avg[lev], mf_tmp, 3+icomp, dcomp++, 1, ngrow); - int const nmodes = mf_tmp.nComp()/6; - for (int mode=1 ; mode < nmodes ; mode++) { - if (lev==0) varnames.push_back(ComponentName(fieldname, mode, "real")); - MultiFab::Copy( mf_avg[lev], mf_tmp, 3*2*mode+icomp, dcomp++, 1, ngrow); - if (lev==0) varnames.push_back(ComponentName(fieldname, mode, "imag")); - MultiFab::Copy( mf_avg[lev], mf_tmp, 3*2*mode+3+icomp, dcomp++, 1, ngrow); - } - } -} - -/* \brief Copy scalar field component data into the MultiFab that will be written out - */ -void -CopyScalarFieldComponentsToMultiFab (int lev, amrex::Vector& mf_avg, MultiFab& mf_tmp, - const DistributionMapping& dm, - int& dcomp, int ngrow, int n_rz_azimuthal_modes, - std::string fieldname, Vector& varnames) -{ - if (n_rz_azimuthal_modes > 1) { - if (lev==0) varnames.push_back(ComponentName(fieldname, 0, "real")); - AverageAndPackScalarFieldComponent(mf_avg[lev], mf_tmp, dm, 0, dcomp++, ngrow); - for (int mode=1 ; mode < n_rz_azimuthal_modes ; mode++) { - if (lev==0) varnames.push_back(ComponentName(fieldname, mode, "real")); - AverageAndPackScalarFieldComponent(mf_avg[lev], mf_tmp, dm, 2*mode-1, dcomp++, ngrow); - if (lev==0) varnames.push_back(ComponentName(fieldname, mode, "imag")); - AverageAndPackScalarFieldComponent(mf_avg[lev], mf_tmp, dm, 2*mode , dcomp++, ngrow); - } - } -} - -/** \brief Add variable names to the list. - */ -void -AddToVarNames (Vector& varnames, - std::string name, std::string suffix) { - auto coords = {"x", "y", "z"}; - for(auto coord:coords) varnames.push_back(name+coord+suffix); -} - -/** \brief Add RZ variable names to the list. - */ -void -AddToVarNamesRZ (Vector& varnames, - std::string name, std::string suffix) { - auto coords = {"r", "theta", "z"}; - for(auto coord:coords) varnames.push_back(name+coord+suffix); -} - -/** \brief Write the different fields that are meant for output, - * into the vector of MultiFab `mf_avg` (one MultiFab per level) - * after averaging them to the cell centers. - */ -void -WarpX::AverageAndPackFields ( Vector& varnames, - amrex::Vector& mf_avg, const int ngrow) const -{ - // Count how many different fields should be written (ncomp) - int ncomp = fields_to_plot.size() - + static_cast(plot_finepatch)*6 - + static_cast(plot_crsepatch)*6; - - // Add in the RZ modes - if (n_rz_azimuthal_modes > 1) { - for (std::string field : fields_to_plot) { - if (WarpXUtilStr::is_in({"Ex", "Ey", "Ez", "Bx", "By", "Bz", "jx", "jy", "jz", "rho", "F"}, field)) { - ncomp += 2*n_rz_azimuthal_modes - 1; - } - } - if (plot_finepatch) { - ncomp += 6*(2*n_rz_azimuthal_modes - 1); - } - } - - int nvecs = 3; - if (n_rz_azimuthal_modes > 1) { - nvecs += 3*(2*n_rz_azimuthal_modes - 1); - } - - // Loop over levels of refinement - for (int lev = 0; lev <= finest_level; ++lev) - { - // Allocate pointers to the `ncomp` fields that will be added - mf_avg.push_back( MultiFab(grids[lev], dmap[lev], ncomp, ngrow)); - - // For E, B and J, if at least one component is requested, - // build cell-centered temporary MultiFab with 3 comps - MultiFab mf_tmp_E, mf_tmp_B, mf_tmp_J; - // Build mf_tmp_E is at least one component of E is requested - if (WarpXUtilStr::is_in(fields_to_plot, {"Ex", "Ey", "Ez"} )){ - // Allocate temp MultiFab with 3 components - mf_tmp_E = MultiFab(grids[lev], dmap[lev], nvecs, ngrow); - // Fill MultiFab mf_tmp_E with averaged E - AverageAndPackVectorField (mf_tmp_E, Efield_aux[lev], dmap[lev], 0, ngrow); - int dcomp = 3; - AverageAndPackVectorFieldComponents(mf_tmp_E, Efield_aux[lev], dmap[lev], dcomp, ngrow); - } - // Same for B - if (WarpXUtilStr::is_in(fields_to_plot, {"Bx", "By", "Bz"} )){ - mf_tmp_B = MultiFab(grids[lev], dmap[lev], nvecs, ngrow); - AverageAndPackVectorField(mf_tmp_B, Bfield_aux[lev], dmap[lev], 0, ngrow); - int dcomp = 3; - AverageAndPackVectorFieldComponents(mf_tmp_B, Bfield_aux[lev], dmap[lev], dcomp, ngrow); - } - // Same for J - if (WarpXUtilStr::is_in(fields_to_plot, {"jx", "jy", "jz"} )){ - mf_tmp_J = MultiFab(grids[lev], dmap[lev], nvecs, ngrow); - AverageAndPackVectorField(mf_tmp_J, current_fp[lev], dmap[lev], 0, ngrow); - int dcomp = 3; - AverageAndPackVectorFieldComponents(mf_tmp_J, current_fp[lev], dmap[lev], dcomp, ngrow); - } - - int dcomp; - // Go through the different fields in fields_to_plot, pack them into - // mf_avg[lev] add the corresponding names to `varnames`. - // plot_fine_patch and plot_coarse_patch are treated separately - // (after this for loop). - dcomp = 0; - for (int ifield=0; ifieldIncrement(temp_dat, lev); - AverageAndPackScalarField( mf_avg[lev], temp_dat, dmap[lev], dcomp++, ngrow ); - } else if (fieldname == "part_per_grid"){ - const Vector& npart_in_grid = mypc->NumberOfParticlesInGrid(lev); - // MultiFab containing number of particles per grid - // (stored as constant for all cells in each grid) -#ifdef _OPENMP -#pragma omp parallel -#endif - for (MFIter mfi(mf_avg[lev]); mfi.isValid(); ++mfi) { - (mf_avg[lev])[mfi].setVal(static_cast(npart_in_grid[mfi.index()])); - } - dcomp++; - } else if (fieldname == "part_per_proc"){ - const Vector& npart_in_grid = mypc->NumberOfParticlesInGrid(lev); - // MultiFab containing number of particles per process - // (stored as constant for all cells in each grid) - long n_per_proc = 0; -#ifdef _OPENMP -#pragma omp parallel reduction(+:n_per_proc) -#endif - for (MFIter mfi(mf_avg[lev]); mfi.isValid(); ++mfi) { - n_per_proc += npart_in_grid[mfi.index()]; - } - mf_avg[lev].setVal(static_cast(n_per_proc),dcomp++,1); - } else if (fieldname == "proc_number"){ - // MultiFab containing the Processor ID -#ifdef _OPENMP -#pragma omp parallel -#endif - mf_avg[lev].setVal(static_cast(ParallelDescriptor::MyProc()),dcomp++,1); - } else if (fieldname == "divB"){ - if (do_nodal) amrex::Abort("TODO: do_nodal && plot divb"); - ComputeDivB(mf_avg[lev], dcomp++, - {Bfield_aux[lev][0].get(), - Bfield_aux[lev][1].get(), - Bfield_aux[lev][2].get()}, - WarpX::CellSize(lev) ); - } else if (fieldname == "divE"){ - const BoxArray& ba = amrex::convert(boxArray(lev),IntVect::TheUnitVector()); - MultiFab divE( ba, DistributionMap(lev), 1, 0 ); -#ifdef WARPX_USE_PSATD - spectral_solver_fp[lev]->ComputeSpectralDivE( Efield_aux[lev], divE ); -#else - m_fdtd_solver_fp[lev]->ComputeDivE( Efield_aux[lev], divE ); -#endif - AverageAndPackScalarField( mf_avg[lev], divE, dmap[lev], dcomp++, ngrow ); - } else { - amrex::Abort("unknown field in fields_to_plot: " + fieldname); - } - } - if (plot_finepatch) - { - AverageAndPackVectorField( mf_avg[lev], Efield_fp[lev], dmap[lev], dcomp, ngrow ); - dcomp += 3; - AverageAndPackVectorFieldComponents(mf_avg[lev], Efield_fp[lev], dmap[lev], dcomp, ngrow); - if (lev == 0) { - AddToVarNames(varnames, "E", "_fp"); - if (n_rz_azimuthal_modes > 1) { - AddToVarNamesRZ(varnames, "E", ComponentName("_fp", 0, "real")); - for (int mode=1 ; mode < n_rz_azimuthal_modes ; mode++) { - AddToVarNamesRZ(varnames, "E", ComponentName("_fp", mode, "real")); - AddToVarNamesRZ(varnames, "E", ComponentName("_fp", mode, "imag")); - } - } - } - AverageAndPackVectorField( mf_avg[lev], Bfield_fp[lev], dmap[lev], dcomp, ngrow ); - dcomp += 3; - AverageAndPackVectorFieldComponents(mf_avg[lev], Bfield_fp[lev], dmap[lev], dcomp, ngrow); - if (lev == 0) { - AddToVarNames(varnames, "B", "_fp"); - if (n_rz_azimuthal_modes > 1) { - AddToVarNamesRZ(varnames, "B", ComponentName("_fp", 0, "real")); - for (int mode=1 ; mode < n_rz_azimuthal_modes ; mode++) { - AddToVarNamesRZ(varnames, "B", ComponentName("_fp", mode, "real")); - AddToVarNamesRZ(varnames, "B", ComponentName("_fp", mode, "imag")); - } - } - } - } - - if (plot_crsepatch) - { - if (lev == 0) - { - mf_avg[lev].setVal(0.0, dcomp, 3, ngrow); - } - else - { - if (do_nodal) amrex::Abort("TODO: do_nodal && plot_crsepatch"); - std::array, 3> E = getInterpolatedE(lev); - AverageAndPackVectorField( mf_avg[lev], E, dmap[lev], dcomp, ngrow ); - - } - if (lev == 0) AddToVarNames(varnames, "E", "_cp"); - dcomp += 3; - - // now the magnetic field - if (lev == 0) - { - mf_avg[lev].setVal(0.0, dcomp, 3, ngrow); - } - else - { - if (do_nodal) amrex::Abort("TODO: do_nodal && plot_crsepatch"); - std::array, 3> B = getInterpolatedB(lev); - AverageAndPackVectorField( mf_avg[lev], B, dmap[lev], dcomp, ngrow ); - } - if (lev == 0) AddToVarNames(varnames, "B", "_cp"); - dcomp += 3; - } - - BL_ASSERT(dcomp == ncomp); - } // end loop over levels of refinement - -}; - -/** \brief Reduce the size of all the fields in `source_mf` - * by `coarse_ratio` and store the results in `coarse_mf`. - * Calculate the corresponding coarse Geometry from `source_geom` - * and store the results in `coarse_geom` */ -void -coarsenCellCenteredFields( - Vector& coarse_mf, Vector& coarse_geom, - const Vector& source_mf, const Vector& source_geom, - int coarse_ratio, int finest_level ) -{ - // Check that the Vectors to be filled have an initial size of 0 - AMREX_ALWAYS_ASSERT( coarse_mf.size()==0 ); - AMREX_ALWAYS_ASSERT( coarse_geom.size()==0 ); - - // Fill the vectors with one element per level - int ncomp = source_mf[0].nComp(); - for (int lev=0; lev<=finest_level; lev++) { - AMREX_ALWAYS_ASSERT( source_mf[lev].is_cell_centered() ); - - coarse_geom.push_back(amrex::coarsen( source_geom[lev], IntVect(coarse_ratio))); - - BoxArray small_ba = amrex::coarsen(source_mf[lev].boxArray(), coarse_ratio); - coarse_mf.push_back( MultiFab(small_ba, source_mf[lev].DistributionMap(), ncomp, 0) ); - CoarsenIO::Coarsen( coarse_mf[lev], source_mf[lev], 0, 0, ncomp, 0, IntVect(coarse_ratio) ); - } -}; - - /** \brief Write the data from MultiFab `F` into the file `filename` * as a raw field (i.e. no interpolation to cell centers). * Write guard cells if `plot_guards` is True. @@ -847,30 +483,3 @@ getInterpolatedVector( } return interpolated_F; } - -std::array, 3> WarpX::getInterpolatedE(int lev) const -{ - - const int ngrow = 0; - const DistributionMapping& dm = DistributionMap(lev); - const Real* dx = Geom(lev-1).CellSize(); - const int r_ratio = refRatio(lev-1)[0]; - - return getInterpolatedVector( - Efield_cp[lev][0], Efield_cp[lev][1], Efield_cp[lev][2], - Efield_fp[lev][0], Efield_fp[lev][1], Efield_fp[lev][2], - dm, r_ratio, dx, ngrow ); -} - -std::array, 3> WarpX::getInterpolatedB(int lev) const -{ - const int ngrow = 0; - const DistributionMapping& dm = DistributionMap(lev); - const Real* dx = Geom(lev-1).CellSize(); - const int r_ratio = refRatio(lev-1)[0]; - - return getInterpolatedVector( - Bfield_cp[lev][0], Bfield_cp[lev][1], Bfield_cp[lev][2], - Bfield_fp[lev][0], Bfield_fp[lev][1], Bfield_fp[lev][2], - dm, r_ratio, dx, ngrow ); -} diff --git a/Source/WarpX.H b/Source/WarpX.H index acc5f90e189..e15acbc7bf2 100644 --- a/Source/WarpX.H +++ b/Source/WarpX.H @@ -587,10 +587,6 @@ private: std::unique_ptr GetCellCenteredData(); - std::array, 3> getInterpolatedE(int lev) const; - - std::array, 3> getInterpolatedB(int lev) const; - void ExchangeWithPmlB (int lev); void ExchangeWithPmlE (int lev); void ExchangeWithPmlF (int lev); @@ -736,9 +732,6 @@ private: std::string restart_chkfile; bool plot_rho = false; - bool plot_finepatch = false; - bool plot_crsepatch = false; - amrex::Vector fields_to_plot; amrex::VisMF::Header::Version plotfile_headerversion = amrex::VisMF::Header::Version_v1; amrex::VisMF::Header::Version slice_plotfile_headerversion = amrex::VisMF::Header::Version_v1; diff --git a/Source/WarpX.cpp b/Source/WarpX.cpp index 38837ec54b4..476474b9dc7 100644 --- a/Source/WarpX.cpp +++ b/Source/WarpX.cpp @@ -508,41 +508,6 @@ WarpX::ReadParameters () amrex::Abort("J-damping can only be done when PML are inside simulation domain (do_pml_in_domain=1)"); } - // only used for in-situ - bool user_fields_to_plot; - user_fields_to_plot = pp.queryarr("fields_to_plot", fields_to_plot); - if (not user_fields_to_plot){ - // If not specified, set default values - fields_to_plot = {"Ex", "Ey", "Ez", "Bx", "By", - "Bz", "jx", "jy", "jz", - "part_per_cell"}; - } - // set plot_rho to true of the users requests it, so that - // rho is computed at each iteration. - if (std::find(fields_to_plot.begin(), fields_to_plot.end(), "rho") - != fields_to_plot.end()){ - plot_rho = true; - } - // Sanity check if user requests to plot F - if (std::find(fields_to_plot.begin(), fields_to_plot.end(), "F") - != fields_to_plot.end()){ - AMREX_ALWAYS_ASSERT_WITH_MESSAGE(do_dive_cleaning, - "plot F only works if warpx.do_dive_cleaning = 1"); - } - // If user requests to plot proc_number for a serial run, - // delete proc_number from fields_to_plot - if (ParallelDescriptor::NProcs() == 1){ - fields_to_plot.erase(std::remove(fields_to_plot.begin(), - fields_to_plot.end(), - "proc_number"), - fields_to_plot.end()); - } - - pp.query("plot_finepatch", plot_finepatch); - if (maxLevel() > 0) { - pp.query("plot_crsepatch", plot_crsepatch); - } - { // Parameters below control all plotfile diagnostics bool plotfile_min_max = true; @@ -704,7 +669,14 @@ WarpX::BackwardCompatibility () amrex::Abort("warpx.fields_to_plot is not supported anymore. " "Please use the new syntax for diagnostics, see documentation."); } - + if (ppw.query("plot_finepatch", backward_int)){ + amrex::Abort("warpx.plot_finepatch is not supported anymore. " + "Please use the new syntax for diagnostics, see documentation."); + } + if (ppw.query("plot_crsepatch", backward_int)){ + amrex::Abort("warpx.plot_crsepatch is not supported anymore. " + "Please use the new syntax for diagnostics, see documentation."); + } } // This is a virtual function.