aboutsummaryrefslogtreecommitdiff
path: root/Source/FieldSolver/SpectralSolver
diff options
context:
space:
mode:
authorGravatar Edoardo Zoni <59625522+EZoni@users.noreply.github.com> 2021-12-02 08:45:35 -0800
committerGravatar GitHub <noreply@github.com> 2021-12-02 08:45:35 -0800
commit3610edb9b40a4aceed0e25adeb5a4bd70518619b (patch)
tree2ece61a0511ac509283b4018705c201c923d5686 /Source/FieldSolver/SpectralSolver
parent0e809732a2ef032801ee9a64b5266edcd75a0213 (diff)
downloadWarpX-3610edb9b40a4aceed0e25adeb5a4bd70518619b.tar.gz
WarpX-3610edb9b40a4aceed0e25adeb5a4bd70518619b.tar.zst
WarpX-3610edb9b40a4aceed0e25adeb5a4bd70518619b.zip
div(E,B) Cleaning Options for PSATD (#2403)
* Implement div(E)/div(B) Cleaning with Standard PSATD * Cleaning * Update Benchmark * Add Nodal Synchronization of F,G * OneStep_multiJ: Nodal Syncs, Damp PML * OneStep_multiJ: Push PSATD Fields in PML * div Cleaning Defaults (Domain v. PML) * Include Fix of #2429 until Merged * Reset Benchmark of Langmuir_multi_psatd_div_cleaning * Multi-J: Remove PML Support * Include Fix of #2474 Until Merged * Exchange All Guard Cells for F,G * Fix Defaults * Update Test, Reset Benchmark * Fix Defaults * Cleaning * Default update_with_rho=1 if do_dive_cleaning=1 * Update CI Test pml_psatd_dive_divb_cleaning * Replace Warning with Abort
Diffstat (limited to 'Source/FieldSolver/SpectralSolver')
-rw-r--r--Source/FieldSolver/SpectralSolver/SpectralAlgorithms/PsatdAlgorithm.cpp52
-rw-r--r--Source/FieldSolver/SpectralSolver/SpectralFieldData.cpp14
2 files changed, 33 insertions, 33 deletions
diff --git a/Source/FieldSolver/SpectralSolver/SpectralAlgorithms/PsatdAlgorithm.cpp b/Source/FieldSolver/SpectralSolver/SpectralAlgorithms/PsatdAlgorithm.cpp
index 395f164cc..1f3c67629 100644
--- a/Source/FieldSolver/SpectralSolver/SpectralAlgorithms/PsatdAlgorithm.cpp
+++ b/Source/FieldSolver/SpectralSolver/SpectralAlgorithms/PsatdAlgorithm.cpp
@@ -103,14 +103,14 @@ PsatdAlgorithm::PsatdAlgorithm(
InitializeSpectralCoefficientsAvgLin(spectral_kspace, dm, dt);
}
- if (dive_cleaning && !J_linear_in_time)
+ if (dive_cleaning && m_is_galilean)
{
- amrex::Abort("PSATD: warpx.do_dive_cleaning = 1 implemented only with psatd.J_linear_in_time = 1");
+ amrex::Abort("warpx.do_dive_cleaning = 1 not implemented for Galilean PSATD algorithms");
}
- if (divb_cleaning && !J_linear_in_time)
+ if (divb_cleaning && m_is_galilean)
{
- amrex::Abort("PSATD: warpx.do_divb_cleaning = 1 implemented only with psatd.J_linear_in_time = 1");
+ amrex::Abort("warpx.do_divb_cleaning = 1 not implemented for Galilean PSATD algorithms");
}
if (time_averaging && !update_with_rho)
{
@@ -296,6 +296,30 @@ PsatdAlgorithm::pushSpectralFields (SpectralFieldData& f) const
- I * T2 * S_ck * (kx * Ey_old - ky * Ex_old)
+ I * X1 * (kx * Jy - ky * Jx);
+ if (dive_cleaning)
+ {
+ const Complex k_dot_J = kx * Jx + ky * Jy + kz * Jz;
+ const Complex k_dot_E = kx * Ex_old + ky * Ey_old + kz * Ez_old;
+
+ fields(i,j,k,Idx.Ex) += I * c2 * S_ck * F_old * kx;
+ fields(i,j,k,Idx.Ey) += I * c2 * S_ck * F_old * ky;
+ fields(i,j,k,Idx.Ez) += I * c2 * S_ck * F_old * kz;
+
+ fields(i,j,k,Idx.F) = C * F_old + S_ck * (I * k_dot_E - rho_old * inv_ep0)
+ - X1 * ((rho_new - rho_old) / dt + I * k_dot_J);
+ }
+
+ if (divb_cleaning)
+ {
+ const Complex k_dot_B = kx * Bx_old + ky * By_old + kz * Bz_old;
+
+ fields(i,j,k,Idx.Bx) += I * S_ck * G_old * kx;
+ fields(i,j,k,Idx.By) += I * S_ck * G_old * ky;
+ fields(i,j,k,Idx.Bz) += I * S_ck * G_old * kz;
+
+ fields(i,j,k,Idx.G) = C * G_old + I * c2 * S_ck * k_dot_B;
+ }
+
if (J_linear_in_time)
{
const Complex Jx_new = fields(i,j,k,Idx.Jx_new);
@@ -312,27 +336,9 @@ PsatdAlgorithm::pushSpectralFields (SpectralFieldData& f) const
if (dive_cleaning)
{
- const Complex k_dot_J = kx * Jx + ky * Jy + kz * Jz;
const Complex k_dot_dJ = kx * (Jx_new - Jx) + ky * (Jy_new - Jy) + kz * (Jz_new - Jz);
- const Complex k_dot_E = kx * Ex_old + ky * Ey_old + kz * Ez_old;
-
- fields(i,j,k,Idx.Ex) += I * c2 * S_ck * F_old * kx;
- fields(i,j,k,Idx.Ey) += I * c2 * S_ck * F_old * ky;
- fields(i,j,k,Idx.Ez) += I * c2 * S_ck * F_old * kz;
-
- fields(i,j,k,Idx.F) = C * F_old + S_ck * (I * k_dot_E - rho_old * inv_ep0)
- - X1 * ((rho_new - rho_old) / dt + I * k_dot_J) - I * X2/c2 * k_dot_dJ;
- }
-
- if (divb_cleaning)
- {
- const Complex k_dot_B = kx * Bx_old + ky * By_old + kz * Bz_old;
-
- fields(i,j,k,Idx.Bx) += I * S_ck * G_old * kx;
- fields(i,j,k,Idx.By) += I * S_ck * G_old * ky;
- fields(i,j,k,Idx.Bz) += I * S_ck * G_old * kz;
- fields(i,j,k,Idx.G) = C * G_old + I * c2 * S_ck * k_dot_B;
+ fields(i,j,k,Idx.F) += -I * X2/c2 * k_dot_dJ;
}
if (time_averaging)
diff --git a/Source/FieldSolver/SpectralSolver/SpectralFieldData.cpp b/Source/FieldSolver/SpectralSolver/SpectralFieldData.cpp
index ebb720854..f16fc3aa2 100644
--- a/Source/FieldSolver/SpectralSolver/SpectralFieldData.cpp
+++ b/Source/FieldSolver/SpectralSolver/SpectralFieldData.cpp
@@ -62,19 +62,13 @@ SpectralFieldIndex::SpectralFieldIndex (const bool update_with_rho,
Bx_avg = c++; By_avg = c++; Bz_avg = c++;
}
+ if (dive_cleaning) F = c++;
+
+ if (divb_cleaning) G = c++;
+
if (J_linear_in_time)
{
Jx_new = c++; Jy_new = c++; Jz_new = c++;
-
- if (dive_cleaning)
- {
- F = c++;
- }
-
- if (divb_cleaning)
- {
- G = c++;
- }
}
}
else // PML