diff options
author | 2018-10-04 14:56:50 -0700 | |
---|---|---|
committer | 2018-10-04 14:56:50 -0700 | |
commit | f98df173fb6c97d6c1cd13e204ee37f478f6680a (patch) | |
tree | 568be5571bb8cd3bdb0b2ec280d975b103730020 /Source/WarpXComm.cpp | |
parent | 05ce0b2b6ad15a989308bf9705b07562550103c1 (diff) | |
parent | 28f765dc6274f3c2b0bb32b7d62eb07f3f930ca9 (diff) | |
download | WarpX-f98df173fb6c97d6c1cd13e204ee37f478f6680a.tar.gz WarpX-f98df173fb6c97d6c1cd13e204ee37f478f6680a.tar.zst WarpX-f98df173fb6c97d6c1cd13e204ee37f478f6680a.zip |
Merge pull request #10 from RemiLehe/charge_buffers
Implement charge buffers
Diffstat (limited to 'Source/WarpXComm.cpp')
-rw-r--r-- | Source/WarpXComm.cpp | 31 |
1 files changed, 29 insertions, 2 deletions
diff --git a/Source/WarpXComm.cpp b/Source/WarpXComm.cpp index 435a430b0..23ce0ce0b 100644 --- a/Source/WarpXComm.cpp +++ b/Source/WarpXComm.cpp @@ -499,7 +499,8 @@ WarpX::SyncRho (amrex::Vector<std::unique_ptr<amrex::MultiFab> >& rhof, Vector<std::unique_ptr<MultiFab> > rho_f_g(finest_level+1); Vector<std::unique_ptr<MultiFab> > rho_c_g(finest_level+1); - + Vector<std::unique_ptr<MultiFab> > rho_buf_g(finest_level+1); + if (WarpX::use_filter) { for (int lev = 0; lev <= finest_level; ++lev) { const int ncomp = rhof[lev]->nComp(); @@ -521,6 +522,18 @@ WarpX::SyncRho (amrex::Vector<std::unique_ptr<amrex::MultiFab> >& rhof, applyFilter(*rho_c_g[lev], *rhoc[lev]); std::swap(rho_c_g[lev], rhoc[lev]); } + for (int lev = 1; lev <= finest_level; ++lev) { + if (charge_buf[lev]) { + const int ncomp = charge_buf[lev]->nComp(); + IntVect ng = charge_buf[lev]->nGrowVect(); + ng += 1; + rho_buf_g[lev].reset(new MultiFab(charge_buf[lev]->boxArray(), + charge_buf[lev]->DistributionMap(), + ncomp, ng)); + applyFilter(*rho_buf_g[lev], *charge_buf[lev]); + std::swap(*rho_buf_g[lev], *charge_buf[lev]); + } + } } // Sum up fine patch @@ -537,7 +550,14 @@ WarpX::SyncRho (amrex::Vector<std::unique_ptr<amrex::MultiFab> >& rhof, const int ncomp = rhoc[lev+1]->nComp(); const IntVect& ngsrc = rhoc[lev+1]->nGrowVect(); const IntVect ngdst = IntVect::TheZeroVector(); - rhof[lev]->copy(*rhoc[lev+1],0,0,ncomp,ngsrc,ngdst,period,FabArrayBase::ADD); + const MultiFab* crho = rhoc[lev+1].get(); + if (charge_buf[lev+1]) + { + MultiFab::Add(*charge_buf[lev+1], *rhoc[lev+1], 0, 0, ncomp, ngsrc); + crho = charge_buf[lev+1].get(); + } + + rhof[lev]->copy(*crho,0,0,ncomp,ngsrc,ngdst,period,FabArrayBase::ADD); } // Sum up coarse patch @@ -556,6 +576,13 @@ WarpX::SyncRho (amrex::Vector<std::unique_ptr<amrex::MultiFab> >& rhof, std::swap(rho_c_g[lev], rhoc[lev]); MultiFab::Copy(*rhoc[lev], *rho_c_g[lev], 0, 0, rhoc[lev]->nComp(), 0); } + for (int lev = 1; lev <= finest_level; ++lev) + { + if (rho_buf_g[lev]) { + std::swap(rho_buf_g[lev], charge_buf[lev]); + MultiFab::Copy(*charge_buf[lev], *rho_buf_g[lev], 0, 0, rhoc[lev]->nComp(), 0); + } + } } // sync shared nodal points |