Skip to content

Commit

Permalink
Add register to fluid container (#9)
Browse files Browse the repository at this point in the history
* modified MultiFluidContainer.H

* modified MultiFluidContainer.cpp

* modified WarpXFluidContainer.H

* modified WarpXFluidContainer.cpp

* modified WarpX.cpp

* modified RhoFunctor

* modified RhoFunctor

* modified WarpXPushFieldsHybridPIC.cpp

* modified WarpXEvolve.cpp and ElectrostaticSolver.cpp

* modified WarpXFluidContainer.cpp

* modified WarpXMovingWindow.cpp

* modified WarpXMovingWindow.cpp

* updated functions fluid container

* updated functions fluid container
  • Loading branch information
marcoacc95 authored Sep 13, 2024
1 parent b6f274c commit 616fb33
Show file tree
Hide file tree
Showing 10 changed files with 191 additions and 180 deletions.
2 changes: 1 addition & 1 deletion Source/Diagnostics/ComputeDiagFunctors/RhoFunctor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ RhoFunctor::operator() ( amrex::MultiFab& mf_dst, const int dcomp, const int /*i
rho = mypc.GetChargeDensity(m_lev, true);
if (warpx.DoFluidSpecies()) {
auto& myfl = warpx.GetFluidContainer();
myfl.DepositCharge(m_lev, *rho);
myfl.DepositCharge(warpx.m_fields, *rho, m_lev);
}
}
// Dump rho per species
Expand Down
14 changes: 3 additions & 11 deletions Source/Evolve/WarpXEvolve.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1145,17 +1145,9 @@ WarpX::PushParticlesandDeposit (int lev, amrex::Real cur_time, DtType a_dt_type,
// Might this be related to issue #1943?
#endif
if (do_fluid_species) {
myfl->Evolve(lev,
*m_fields.get("Efield_aux", Direction{0}, lev),
*m_fields.get("Efield_aux", Direction{1}, lev),
*m_fields.get("Efield_aux", Direction{2}, lev),
*m_fields.get("Bfield_aux", Direction{0}, lev),
*m_fields.get("Bfield_aux", Direction{1}, lev),
*m_fields.get("Bfield_aux", Direction{2}, lev),
m_fields.get("rho_fp", lev),
*m_fields.get(current_fp_string, Direction{0}, lev),
*m_fields.get(current_fp_string, Direction{1}, lev),
*m_fields.get(current_fp_string, Direction{2}, lev),
myfl->Evolve(m_fields,
lev,
current_fp_string,
cur_time,
skip_current
);
Expand Down
2 changes: 1 addition & 1 deletion Source/FieldSolver/ElectrostaticSolver.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -262,7 +262,7 @@ WarpX::AddSpaceChargeFieldLabFrame ()
mypc->DepositCharge(m_fields.get_mr_levels("rho_fp", finest_level), 0.0_rt);
if (do_fluid_species) {
int const lev = 0;
myfl->DepositCharge( lev, *m_fields.get("rho_fp", lev));
myfl->DepositCharge( m_fields, *m_fields.get("rho_fp", lev), lev );
}
for (int lev = 0; lev <= max_level; lev++) {
if (lev > 0) {
Expand Down
7 changes: 4 additions & 3 deletions Source/FieldSolver/WarpXPushFieldsHybridPIC.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -40,11 +40,12 @@ void WarpX::HybridPICEvolveFields ()
// Deposit cold-relativistic fluid charge and current
if (do_fluid_species) {
int const lev = 0;
myfl->DepositCharge(lev, *m_fields.get("rho_fp", lev));
myfl->DepositCurrent(lev,
myfl->DepositCharge(m_fields, *m_fields.get("rho_fp", lev), lev);
myfl->DepositCurrent(m_fields,
*m_fields.get("current_fp", Direction{0}, lev),
*m_fields.get("current_fp", Direction{1}, lev),
*m_fields.get("current_fp", Direction{2}, lev));
*m_fields.get("current_fp", Direction{2}, lev),
lev);
}

// Synchronize J and rho:
Expand Down
25 changes: 14 additions & 11 deletions Source/Fluids/MultiFluidContainer.H
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@

#include "WarpXFluidContainer_fwd.H"

#include <ablastr/fields/MultiFabRegister.H>

#include<AMReX_MultiFab.H>
#include <AMReX_Vector.H>

Expand Down Expand Up @@ -52,25 +54,26 @@ public:
}
#endif

void AllocateLevelMFs (int lev, const amrex::BoxArray& ba, const amrex::DistributionMapping& dm);
void AllocateLevelMFs (ablastr::fields::MultiFabRegister& m_fields, const amrex::BoxArray& ba, const amrex::DistributionMapping& dm, int lev);

void InitData (int lev, amrex::Box init_box, amrex::Real cur_time);
void InitData (ablastr::fields::MultiFabRegister& m_fields, amrex::Box init_box, amrex::Real cur_time, int lev);

///
/// This evolves all the fluids by one PIC time step, including current deposition, the
/// field solve, and pushing the fluids, for all the species in the MultiFluidContainer.
///
void Evolve (int lev,
const amrex::MultiFab& Ex, const amrex::MultiFab& Ey, const amrex::MultiFab& Ez,
const amrex::MultiFab& Bx, const amrex::MultiFab& By, const amrex::MultiFab& Bz,
amrex::MultiFab* rho, amrex::MultiFab& jx, amrex::MultiFab& jy, amrex::MultiFab& jz,
amrex::Real cur_time, bool skip_deposition=false);
void Evolve (ablastr::fields::MultiFabRegister& m_fields,
int lev,
std::string current_fp_string,
amrex::Real cur_time,
bool skip_deposition=false);

[[nodiscard]] int nSpecies() const {return static_cast<int>(species_names.size());}

void DepositCharge (int lev, amrex::MultiFab &rho);
void DepositCurrent (int lev,
amrex::MultiFab& jx, amrex::MultiFab& jy, amrex::MultiFab& jz);
void DepositCharge (ablastr::fields::MultiFabRegister& m_fields, amrex::MultiFab &rho, int lev);
void DepositCurrent (ablastr::fields::MultiFabRegister& m_fields,
amrex::MultiFab& jx, amrex::MultiFab& jy, amrex::MultiFab& jz,
int lev);

private:

Expand All @@ -80,4 +83,4 @@ private:
amrex::Vector<std::unique_ptr<WarpXFluidContainer>> allcontainers;

};
#endif /*WARPX_MultiFluidContainer_H_*/
#endif /*WARPX_MultiFluidContainer_H_*/
32 changes: 16 additions & 16 deletions Source/Fluids/MultiFluidContainer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -27,47 +27,47 @@ MultiFluidContainer::MultiFluidContainer (int nlevs_max)
}

void
MultiFluidContainer::AllocateLevelMFs (int lev, const BoxArray& ba, const DistributionMapping& dm)
MultiFluidContainer::AllocateLevelMFs (ablastr::fields::MultiFabRegister& m_fields, const BoxArray& ba, const DistributionMapping& dm, int lev)
{
for (auto& fl : allcontainers) {
fl->AllocateLevelMFs(lev, ba, dm);
fl->AllocateLevelMFs(m_fields, ba, dm, lev);
}
}

void
MultiFluidContainer::InitData (int lev, amrex::Box init_box, amrex::Real cur_time)
MultiFluidContainer::InitData (ablastr::fields::MultiFabRegister& m_fields, amrex::Box init_box, amrex::Real cur_time, int lev)
{
for (auto& fl : allcontainers) {
fl->InitData(lev, init_box, cur_time);
fl->InitData(m_fields, init_box, cur_time, lev);
}
}


void
MultiFluidContainer::DepositCharge (int lev, amrex::MultiFab &rho)
MultiFluidContainer::DepositCharge (ablastr::fields::MultiFabRegister& m_fields, amrex::MultiFab &rho, int lev)
{
for (auto& fl : allcontainers) {
fl->DepositCharge(lev,rho);
fl->DepositCharge(m_fields,rho,lev);
}
}

void
MultiFluidContainer::DepositCurrent (int lev,
amrex::MultiFab& jx, amrex::MultiFab& jy, amrex::MultiFab& jz)
MultiFluidContainer::DepositCurrent (ablastr::fields::MultiFabRegister& m_fields,
amrex::MultiFab& jx, amrex::MultiFab& jy, amrex::MultiFab& jz, int lev)
{
for (auto& fl : allcontainers) {
fl->DepositCurrent(lev,jx,jy,jz);
fl->DepositCurrent(m_fields,jx,jy,jz,lev);
}
}

void
MultiFluidContainer::Evolve (int lev,
const MultiFab& Ex, const MultiFab& Ey, const MultiFab& Ez,
const MultiFab& Bx, const MultiFab& By, const MultiFab& Bz,
MultiFab* rho, MultiFab& jx, MultiFab& jy, MultiFab& jz,
amrex::Real cur_time, bool skip_deposition)
MultiFluidContainer::Evolve (ablastr::fields::MultiFabRegister& m_fields,
int lev,
std::string current_fp_string,
amrex::Real cur_time,
bool skip_deposition)
{
for (auto& fl : allcontainers) {
fl->Evolve(lev, Ex, Ey, Ez, Bx, By, Bz, rho, jx, jy, jz, cur_time, skip_deposition);
fl->Evolve(m_fields, lev, current_fp_string, cur_time, skip_deposition);
}
}
}
36 changes: 18 additions & 18 deletions Source/Fluids/WarpXFluidContainer.H
Original file line number Diff line number Diff line change
Expand Up @@ -38,20 +38,20 @@ public:
WarpXFluidContainer(WarpXFluidContainer&& ) = default;
WarpXFluidContainer& operator=(WarpXFluidContainer&& ) = default;

void AllocateLevelMFs (int lev, const amrex::BoxArray& ba, const amrex::DistributionMapping& dm);
void AllocateLevelMFs (ablastr::fields::MultiFabRegister& m_fields, const amrex::BoxArray& ba, const amrex::DistributionMapping& dm, int lev);

void InitData (int lev, amrex::Box init_box, amrex::Real cur_time);
void InitData (ablastr::fields::MultiFabRegister& m_fields, amrex::Box init_box, amrex::Real cur_time, int lev);

void ReadParameters ();

/**
* Evolve updates a single timestep (dt) of the cold relativistic fluid equations
*/
void Evolve (int lev,
const amrex::MultiFab& Ex, const amrex::MultiFab& Ey, const amrex::MultiFab& Ez,
const amrex::MultiFab& Bx, const amrex::MultiFab& By, const amrex::MultiFab& Bz,
amrex::MultiFab* rho, amrex::MultiFab& jx, amrex::MultiFab& jy, amrex::MultiFab& jz,
amrex::Real cur_time, bool skip_deposition=false);
void Evolve (ablastr::fields::MultiFabRegister& m_fields,
int lev,
std::string current_fp_string,
amrex::Real cur_time,
bool skip_deposition=false);

/**
* AdvectivePush_Muscl takes a single timestep (dt) of the cold relativistic fluid equations
Expand All @@ -61,7 +61,7 @@ public:
*
* \param[in] lev refinement level
*/
void AdvectivePush_Muscl (int lev);
void AdvectivePush_Muscl (ablastr::fields::MultiFabRegister& m_fields, int lev);


/**
Expand All @@ -72,7 +72,7 @@ public:
*
* \param[in] lev refinement level
*/
void ApplyBcFluidsAndComms (int lev);
void ApplyBcFluidsAndComms (ablastr::fields::MultiFabRegister& m_fields, int lev);

#if defined(WARPX_DIM_RZ)
/**
Expand All @@ -83,7 +83,7 @@ public:
*
* \param[in] lev refinement level
*/
void centrifugal_source_rz (int lev);
void centrifugal_source_rz (ablastr::fields::MultiFabRegister& m_fields, int lev);
#endif

/**
Expand All @@ -101,10 +101,10 @@ public:
* \param[in] Bz Yee magnetic field (z)
* \param[in] t Current time
*/
void GatherAndPush (int lev,
void GatherAndPush (ablastr::fields::MultiFabRegister& m_fields,
const amrex::MultiFab& Ex, const amrex::MultiFab& Ey, const amrex::MultiFab& Ez,
const amrex::MultiFab& Bx, const amrex::MultiFab& By, const amrex::MultiFab& Bz,
amrex::Real t);
amrex::Real t, int lev);

/**
* DepositCurrent interpolates the fluid current density comps. onto the Yee grid and
Expand All @@ -117,8 +117,8 @@ public:
* \param[in,out] jy current density MultiFab y comp.
* \param[in,out] jz current density MultiFab z comp.
*/
void DepositCurrent (int lev,
amrex::MultiFab& jx, amrex::MultiFab& jy, amrex::MultiFab& jz);
void DepositCurrent (ablastr::fields::MultiFabRegister& m_fields,
amrex::MultiFab& jx, amrex::MultiFab& jy, amrex::MultiFab& jz, int lev);

/**
* DepositCharge interpolates the fluid charge density onto the Yee grid and
Expand All @@ -129,7 +129,7 @@ public:
* \param[in] lev refinement level
* \param[in,out] rho charge density MultiFab.
*/
void DepositCharge (int lev, amrex::MultiFab &rho, int icomp = 0);
void DepositCharge (ablastr::fields::MultiFabRegister& m_fields, amrex::MultiFab &rho, int lev, int icomp = 0);

[[nodiscard]] amrex::Real getCharge () const {return charge;}
[[nodiscard]] amrex::Real getMass () const {return mass;}
Expand Down Expand Up @@ -185,9 +185,9 @@ protected:

public:

// MultiFabs that contain the density (N) and momentum density (NU) of this fluid species, for each refinement level
amrex::Vector< std::unique_ptr<amrex::MultiFab> > N;
amrex::Vector<std::array< std::unique_ptr<amrex::MultiFab>, 3 > > NU;
// Names of Multifabs that will be added to the mfs register
std::string name_mf_N = "fluid_density_"+species_name;
std::string name_mf_NU = "fluid_momentum_density_"+species_name;

};

Expand Down
Loading

0 comments on commit 616fb33

Please sign in to comment.