From 16d1ca457abaa8d057018b69adaa1c3b54d6f995 Mon Sep 17 00:00:00 2001 From: Remi Lehe Date: Mon, 28 Jun 2021 16:09:04 -0700 Subject: Multi-J scheme (#1828) * Introduce new option skip_deposition * Properly implement the option to skip deposition * Skip deposition for electrostatic solver * Correct typo * Add Index Enumerator and Equations for F/G Without Averaging * Define new functions for current deposition and charge deposition * Disable interpolation between levels * Correct compilation error in RZ mode * Add argument for relative time * Add Index Enumerator and Equations for F/G With Averaging * [skip ci] Add new OneStep function * Fix compilation errors * Correct more compilation errors * [skip ci] Fix compilation * Split the PSATD push into separate functions * Add guards for rho field * [skip ci] Use new functions in OneStep * [skip ci] Separate the inverse transform of E_avg, B_avg * Add deposition of rho * [skip ci] Prevent deposition of rho if unallocated * Fix error in deposition function * Add subcycling of current deposition * [skip ci] Add inverse transform of averaged fields * [skip ci] Move component of rho * Add function to copy J * Temporarily deactivate contribution from F * [skip ci] Implement call to linear in J * Add psatd time averaging for multiJ * [skip ci] Fix implementation of averaging * [skip ci] Implement divE cleaning * Fix Bug for RZ Builds * Fix Bug for RZ Builds * Fix Bug in Init of PML Spectral Solvers * Cleaning * Cleaning * Add div(B) Cleaning (G Equation) * Multi-J Not Implemented with Galilean PSATD or PMLs * Add 2D CI Test Using Multi-J Scheme * Add More Inline Comments * Add More Inline Comments & Doxygen * Add Doxygen for Constructor of SpectralSolver * More Doxygen in Class SpectralSolver * Add Doxygen for New Functions in WarpXPushFieldsEM.cpp * Add Doxygen for New Functions in WarpX/MultiParticleContainer * do_dive/b_cleaning Must Be True With linear_in_J Option * Cast multij_n_depose to Real in Divisions * New Input Syntax * Add const where Possible, Fix Warnings * Docs for New Input Syntax, Fix Abort Messages * Consistent Use of Idx, IdxAvg, IdxLin * Improve Documentation of psatd.J_linear_in_time * Use const Type Qualifier whenever Possible * Simplify Initialization of Pointer ion_lev * Improve Doxygen * Update documentation * Add Note on NCI to Docs * Make warpx.do_multi_J_n_depositions Not Optional * Simplify Logic in getRequiredNumberOfFields * Use More const Type Qualifiers Co-authored-by: Edoardo Zoni --- Source/Particles/MultiParticleContainer.H | 33 +++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) (limited to 'Source/Particles/MultiParticleContainer.H') diff --git a/Source/Particles/MultiParticleContainer.H b/Source/Particles/MultiParticleContainer.H index cad602e58..bc0d65e24 100644 --- a/Source/Particles/MultiParticleContainer.H +++ b/Source/Particles/MultiParticleContainer.H @@ -137,6 +137,39 @@ public: */ std::unique_ptr GetZeroChargeDensity(const int lev); + /** + * \brief Deposit charge density. + * + * \param[in,out] rho vector of charge densities (one pointer to MultiFab per mesh refinement level) + * \param[in] relative_t Time at which to deposit rho, relative to the time + * of the current positions of the particles (expressed as + * a fraction of dt). When different than 0, the particle + * position will be temporarily modified to match the time + * of the deposition. + * \param[in] icomp component of the MultiFab where rho is deposited (old, new) + */ + void + DepositCharge (amrex::Vector >& rho, + const amrex::Real relative_t, const int icomp = 0); + + /** + * \brief Deposit current density. + * + * \param[in,out] J vector of current densities (one three-dimensional array of pointers + * to MultiFabs per mesh refinement level) + * \param[in] dt: Time step for particle level (is used when temporarily + * modifying the particle positions, either within the + * Esirkepov or when `relative_t` is different than 0 + * \param[in] relative_t: Time at which to deposit J, relative to the time of + * the current positions of the particles (expressed as + * a fraction of dt). When different than 0, the particle + * position will be temporarily modified to match the + * time of the deposition. + */ + void + DepositCurrent (amrex::Vector, 3 > >& J, + const amrex::Real dt, const amrex::Real relative_t); + /// /// This deposits the particle charge onto a node-centered MultiFab and returns a unique ptr /// to it. The charge density is accumulated over all the particles in the MultiParticleContainer -- cgit v1.2.3