aboutsummaryrefslogtreecommitdiff
path: root/Source/FieldSolver/FiniteDifferenceSolver
diff options
context:
space:
mode:
authorGravatar Remi Lehe <remi.lehe@normalesup.org> 2020-01-10 14:11:57 -0800
committerGravatar Remi Lehe <remi.lehe@normalesup.org> 2020-01-10 14:11:57 -0800
commitb178920da516e66a21a283c8b794a63b491d24a2 (patch)
tree8d20a64ad808662554c35b74f53c4f1c3df1c6ab /Source/FieldSolver/FiniteDifferenceSolver
parent9035ee165054e25aedf98d97f16786d8d5f2965a (diff)
downloadWarpX-b178920da516e66a21a283c8b794a63b491d24a2.tar.gz
WarpX-b178920da516e66a21a283c8b794a63b491d24a2.tar.zst
WarpX-b178920da516e66a21a283c8b794a63b491d24a2.zip
Update Evolve B
Diffstat (limited to 'Source/FieldSolver/FiniteDifferenceSolver')
-rw-r--r--Source/FieldSolver/FiniteDifferenceSolver/EvolveB.cpp10
-rw-r--r--Source/FieldSolver/FiniteDifferenceSolver/FiniteDifferenceAlgorithms/YeeAlgorithm.H22
-rw-r--r--Source/FieldSolver/FiniteDifferenceSolver/FiniteDifferenceSolver.H24
-rw-r--r--Source/FieldSolver/FiniteDifferenceSolver/FiniteDifferenceSolver.cpp15
4 files changed, 41 insertions, 30 deletions
diff --git a/Source/FieldSolver/FiniteDifferenceSolver/EvolveB.cpp b/Source/FieldSolver/FiniteDifferenceSolver/EvolveB.cpp
index e5514c697..1bba6b317 100644
--- a/Source/FieldSolver/FiniteDifferenceSolver/EvolveB.cpp
+++ b/Source/FieldSolver/FiniteDifferenceSolver/EvolveB.cpp
@@ -6,18 +6,18 @@ FiniteDifferenceSolver::EvolveB ( VectorField Bfield,
// Select algorithm (The choice of algorithm is a runtime option,
// but we compile code for each algorithm, using templates)
if (fdtd_algo == MaxwellSolverAlgo::Yee){
- EvolveB <YeeAlgorithm> ( Bfield, Efield, dt );
+ EvolveBwithAlgo <YeeAlgorithm> ( Bfield, Efield, dt );
} else if (fdtd_algo == MaxwellSolverAlgo::CKC) {
- EvolveB <CKCAlgorithm> ( Bfield, Efield, dt );
+ EvolveBwithAlgo <CKCAlgorithm> ( Bfield, Efield, dt );
} else {
amrex::Abort("Unknown algorithm");
}
)
template<typename algo>
-FiniteDifferenceSolver::EvolveB ( VectorField Bfield,
- ConstVectorField Efield,
- amrex::Real dt ) {
+FiniteDifferenceSolver::EvolveBwithAlgo ( VectorField Bfield,
+ ConstVectorField Efield,
+ amrex::Real dt ) {
// Loop through the grids, and over the tiles within each grid
#ifdef _OPENMP
diff --git a/Source/FieldSolver/FiniteDifferenceSolver/FiniteDifferenceAlgorithms/YeeAlgorithm.H b/Source/FieldSolver/FiniteDifferenceSolver/FiniteDifferenceAlgorithms/YeeAlgorithm.H
index 7c9572298..6ea2f440d 100644
--- a/Source/FieldSolver/FiniteDifferenceSolver/FiniteDifferenceAlgorithms/YeeAlgorithm.H
+++ b/Source/FieldSolver/FiniteDifferenceSolver/FiniteDifferenceAlgorithms/YeeAlgorithm.H
@@ -22,7 +22,7 @@ struct YeeAlgorithm {
Array4 const F, int const i, int const j, int const k,
Real const* coefs_x, int const n_coefs_x ) {
- amrex::Real inv_dx = coefs_x[0];
+ amrex::Real const inv_dx = coefs_x[0];
return inv_dx*( F(i+1,j,k) - F(i,j,k) );
};
@@ -31,7 +31,7 @@ struct YeeAlgorithm {
Array4 const F, int const i, int const j, int const k,
Real const* coefs_x, int const n_coefs_x ) {
- amrex::Real inv_dx = coefs_x[0];
+ amrex::Real const inv_dx = coefs_x[0];
return inv_dx*( F(i,j,k) - F(i-1,j,k) );
};
@@ -41,7 +41,7 @@ struct YeeAlgorithm {
Real const* coefs_y, int const n_coefs_y ) {
#if defined WARPX_DIM_3D
- amrex::Real inv_dy = coefs_y[0];
+ amrex::Real const inv_dy = coefs_y[0];
return inv_dy*( F(i,j+1,k) - F(i,j,k) );
#elif (defined WARPX_DIM_XZ)
return 0; // 2D Cartesian: derivative along y is 0
@@ -54,7 +54,7 @@ struct YeeAlgorithm {
Real const* coefs_y, int const n_coefs_y ) {
#if defined WARPX_DIM_3D
- amrex::Real inv_dy = coefs_y[0];
+ amrex::Real const inv_dy = coefs_y[0];
return inv_dy*( F(i,j,k) - F(i,j-1,k) );
#elif (defined WARPX_DIM_XZ)
return 0; // 2D Cartesian: derivative along y is 0
@@ -66,7 +66,7 @@ struct YeeAlgorithm {
Array4 const F, int const i, int const j, int const k,
Real const* coefs_z, int const n_coefs_z ) {
- amrex::Real inv_dz = coefs_z[0];
+ amrex::Real const inv_dz = coefs_z[0];
#if defined WARPX_DIM_3D
return inv_dz*( F(i,j,k+1) - F(i,j,k) );
#elif (defined WARPX_DIM_XZ)
@@ -74,6 +74,18 @@ struct YeeAlgorithm {
#endif
};
+ AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
+ amrex::Real DownwardDz(
+ Array4 const F, int const i, int const j, int const k,
+ Real const* coefs_z, int const n_coefs_z ) {
+
+ amrex::Real const inv_dz = coefs_z[0];
+ #if defined WARPX_DIM_3D
+ return inv_dz*( F(i,j,k) - F(i,j,k-1) );
+ #elif (defined WARPX_DIM_XZ)
+ return inv_dz*( F(i,j,k) - F(i,j-1,k) );
+ #endif
+ };
}
diff --git a/Source/FieldSolver/FiniteDifferenceSolver/FiniteDifferenceSolver.H b/Source/FieldSolver/FiniteDifferenceSolver/FiniteDifferenceSolver.H
index c1fdef5dd..98a34e634 100644
--- a/Source/FieldSolver/FiniteDifferenceSolver/FiniteDifferenceSolver.H
+++ b/Source/FieldSolver/FiniteDifferenceSolver/FiniteDifferenceSolver.H
@@ -14,11 +14,23 @@ class FiniteDifferenceSolver
using ConstVectorField = std::array< std::unique_ptr<amrex::MultiFab const>, 3 >;
// Constructor
- void FiniteDifferenceSolver( std::array<Real,3> dx );
+ void FiniteDifferenceSolver::FiniteDifferenceSolver ( std::array<Real,3> cell_size ) {
+ // Select algorithm (The choice of algorithm is a runtime option,
+ // but we compile code for each algorithm, using templates)
+ if (fdtd_algo == MaxwellSolverAlgo::Yee){
+ YeeAlgorithm::InitializeStencilCoefficients( cell_size,
+ stencil_coefs_x, stencil_coefs_y, stencil_coefs_z );
+ } else if (fdtd_algo == MaxwellSolverAlgo::CKC) {
+ CKCAlgorithm::InitializeStencilCoefficients( cell_size,
+ stencil_coefs_x, stencil_coefs_y, stencil_coefs_z );
+ } else {
+ amrex::Abort("Unknown algorithm");
+ }
+ };
- void EvolveB( VectorField Bfield,
- ConstVectorField Efield,
- amrex::Real dt ) const;
+ void EvolveB ( VectorField Bfield,
+ ConstVectorField Efield,
+ amrex::Real dt ) const;
};
@@ -31,7 +43,9 @@ class FiniteDifferenceSolver
amrex::Gpu::ManagedVector<amrex::Real> stencil_coefs_z;
template< typename fdtd_algo >
- void EvolveB
+ void EvolveBwithAlgo ( VectorField Bfield,
+ ConstVectorField Efield,
+ amrex::Real dt ) const;
};
diff --git a/Source/FieldSolver/FiniteDifferenceSolver/FiniteDifferenceSolver.cpp b/Source/FieldSolver/FiniteDifferenceSolver/FiniteDifferenceSolver.cpp
deleted file mode 100644
index a146b66b1..000000000
--- a/Source/FieldSolver/FiniteDifferenceSolver/FiniteDifferenceSolver.cpp
+++ /dev/null
@@ -1,15 +0,0 @@
-
-
-void FiniteDifferenceSolver::FiniteDifferenceSolver ( std::array<Real,3> cell_size ) {
- // Select algorithm (The choice of algorithm is a runtime option,
- // but we compile code for each algorithm, using templates)
- if (fdtd_algo == MaxwellSolverAlgo::Yee){
- YeeAlgorithm::InitializeStencilCoefficients( cell_size,
- stencil_coefs_x, stencil_coefs_y, stencil_coefs_z );
- } else if (fdtd_algo == MaxwellSolverAlgo::CKC) {
- CKCAlgorithm::InitializeStencilCoefficients( cell_size,
- stencil_coefs_x, stencil_coefs_y, stencil_coefs_z );
- } else {
- amrex::Abort("Unknown algorithm");
- }
-};