Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion src/amr/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ set( SOURCES_INC
data/field/coarsening/field_coarsen_index_weight.hpp
data/field/coarsening/coarsen_weighter.hpp
data/field/coarsening/default_field_coarsener.hpp
data/field/coarsening/magnetic_field_coarsener.hpp
data/field/coarsening/electric_field_coarsener.hpp
data/field/field_data.hpp
data/field/field_data_factory.hpp
data/field/field_geometry.hpp
Expand All @@ -20,6 +20,7 @@ set( SOURCES_INC
data/field/refine/field_linear_refine.hpp
data/field/refine/field_refiner.hpp
data/field/refine/magnetic_field_refiner.hpp
data/field/refine/magnetic_field_regrider.hpp
data/field/refine/electric_field_refiner.hpp
data/field/refine/linear_weighter.hpp
data/field/refine/field_refine_operator.hpp
Expand Down
11 changes: 7 additions & 4 deletions src/amr/data/field/coarsening/default_field_coarsener.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,20 +2,21 @@
#define PHARE_DEFAULT_FIELD_COARSENER_HPP


#include "core/def/phare_mpi.hpp"
#include "core/def/phare_mpi.hpp" // IWYU pragma: keep

#include "core/def.hpp"
#include "core/data/grid/gridlayoutdefs.hpp"
#include "core/utilities/constants.hpp"
#include "core/utilities/point/point.hpp"
#include "core/data/grid/gridlayoutdefs.hpp"

#include "amr/data/field/coarsening/field_coarsen_index_weight.hpp"
#include "amr/resources_manager/amr_utils.hpp"
#include "amr/data/field/coarsening/field_coarsen_index_weight.hpp"

#include <SAMRAI/hier/Box.h>

#include <cstddef>
#include <array>
#include <cstddef>




Expand Down Expand Up @@ -157,4 +158,6 @@ namespace amr
} // namespace PHARE




#endif
Original file line number Diff line number Diff line change
@@ -1,15 +1,13 @@
#ifndef PHARE_MAGNETIC_FIELD_COARSENER
#define PHARE_MAGNETIC_FIELD_COARSENER


#include "core/def/phare_mpi.hpp"
#ifndef PHARE_FLUX_SUM_COARSENER
#define PHARE_FLUX_SUM_COARSENER
Comment thread
nicolasaunai marked this conversation as resolved.
Comment thread
nicolasaunai marked this conversation as resolved.

#include "core/data/grid/gridlayoutdefs.hpp"
#include "core/hybrid/hybrid_quantities.hpp"
#include "core/utilities/constants.hpp"
#include "amr/resources_manager/amr_utils.hpp"


#include <SAMRAI/hier/Box.h>
#include <cstddef>
#include <stdexcept>

namespace PHARE::amr
Expand All @@ -32,13 +30,13 @@ using core::dirZ;
*
*/
template<std::size_t dimension>
class MagneticFieldCoarsener
class ElectricFieldCoarsener
{
public:
MagneticFieldCoarsener(std::array<core::QtyCentering, dimension> const centering,
ElectricFieldCoarsener(std::array<core::QtyCentering, dimension> const centering,
SAMRAI::hier::Box const& sourceBox,
SAMRAI::hier::Box const& destinationBox,
SAMRAI::hier::IntVector const& ratio)
SAMRAI::hier::IntVector const& /*ratio*/)
: centering_{centering}
, sourceBox_{sourceBox}
, destinationBox_{destinationBox}
Expand All @@ -55,78 +53,92 @@ class MagneticFieldCoarsener

core::Point<int, dimension> fineStartIndex;

fineStartIndex[dirX] = coarseIndex[dirX] * this->ratio_;

if constexpr (dimension > 1)
for (auto i = std::size_t{0}; i < dimension; ++i)
{
fineStartIndex[dirY] = coarseIndex[dirY] * this->ratio_;
if constexpr (dimension > 2)
{
fineStartIndex[dirZ] = coarseIndex[dirZ] * this->ratio_;
}
fineStartIndex[i] = coarseIndex[i] * this->ratio_;
Comment thread
nicolasaunai marked this conversation as resolved.
}

fineStartIndex = AMRToLocal(fineStartIndex, sourceBox_);
coarseIndex = AMRToLocal(coarseIndex, destinationBox_);

// the following kinda assumes where B is, i.e. Yee layout centering
// as it only does faces pirmal-dual, dual-primal and dual-dual

if constexpr (dimension == 1)
{
// in 1D div(B) is automatically satisfied so using this coarsening
// opertor is probably not better than the default one, but we do that
// for a kind of consistency...
// coarse flux is equal to fine flux and we're 1D so there is flux partitioned
// only for By and Bz, Bx is equal to the fine value

if (centering_[dirX] == core::QtyCentering::primal) // bx
{
coarseField(coarseIndex[dirX]) = fineField(fineStartIndex[dirX]);
}
else if (centering_[dirX] == core::QtyCentering::dual) // by and bz
if (centering_[dirX] == core::QtyCentering::dual) // ex
{
coarseField(coarseIndex[dirX])
= 0.5 * (fineField(fineStartIndex[dirX] + 1) + fineField(fineStartIndex[dirX]));
}
else if (centering_[dirX] == core::QtyCentering::primal) // ey, ez
{
coarseField(coarseIndex[dirX]) = fineField(fineStartIndex[dirX]);
}
}

if constexpr (dimension == 2)
{
if (centering_[dirX] == core::QtyCentering::primal
and centering_[dirY] == core::QtyCentering::dual)
if (centering_[dirX] == core::QtyCentering::dual
and centering_[dirY] == core::QtyCentering::primal) // ex
{
coarseField(coarseIndex[dirX], coarseIndex[dirY])
= 0.5
* (fineField(fineStartIndex[dirX], fineStartIndex[dirY])
+ fineField(fineStartIndex[dirX], fineStartIndex[dirY] + 1));
+ fineField(fineStartIndex[dirX] + 1, fineStartIndex[dirY]));
}
else if (centering_[dirX] == core::QtyCentering::dual
and centering_[dirY] == core::QtyCentering::primal)
else if (centering_[dirX] == core::QtyCentering::primal
and centering_[dirY] == core::QtyCentering::dual) // ey
{
coarseField(coarseIndex[dirX], coarseIndex[dirY])
= 0.5
* (fineField(fineStartIndex[dirX], fineStartIndex[dirY])
+ fineField(fineStartIndex[dirX] + 1, fineStartIndex[dirY]));
+ fineField(fineStartIndex[dirX], fineStartIndex[dirY] + 1));
}
else if (centering_[dirX] == core::QtyCentering::dual
and centering_[dirY] == core::QtyCentering::dual)
else if (centering_[dirX] == core::QtyCentering::primal
and centering_[dirY] == core::QtyCentering::primal) // ez
{
coarseField(coarseIndex[dirX], coarseIndex[dirY])
= 0.25
* (fineField(fineStartIndex[dirX], fineStartIndex[dirY])
+ fineField(fineStartIndex[dirX] + 1, fineStartIndex[dirY])
+ fineField(fineStartIndex[dirX], fineStartIndex[dirY] + 1)
+ fineField(fineStartIndex[dirX] + 1, fineStartIndex[dirY] + 1));
= fineField(fineStartIndex[dirX], fineStartIndex[dirY]);
}
else
{
throw std::runtime_error("no magnetic field should end up here");
throw std::runtime_error("no electric field should end up here");
}
}
else if constexpr (dimension == 3)
{
throw std::runtime_error("Not Implemented yet");
if (centering_[dirX] == core::QtyCentering::dual
and centering_[dirY] == core::QtyCentering::primal
and centering_[dirZ] == core::QtyCentering::primal) // ex
{
coarseField(coarseIndex[dirX], coarseIndex[dirY], coarseIndex[dirZ])
= 0.5
* (fineField(fineStartIndex[dirX], fineStartIndex[dirY], fineStartIndex[dirZ])
+ fineField(fineStartIndex[dirX] + 1, fineStartIndex[dirY],
fineStartIndex[dirZ]));
}
else if (centering_[dirX] == core::QtyCentering::primal
and centering_[dirY] == core::QtyCentering::dual
and centering_[dirZ] == core::QtyCentering::primal) // ey
{
coarseField(coarseIndex[dirX], coarseIndex[dirY], coarseIndex[dirZ])
= 0.5
* (fineField(fineStartIndex[dirX], fineStartIndex[dirY], fineStartIndex[dirZ])
+ fineField(fineStartIndex[dirX], fineStartIndex[dirY] + 1,
fineStartIndex[dirZ]));
}
else if (centering_[dirX] == core::QtyCentering::primal
and centering_[dirY] == core::QtyCentering::primal
and centering_[dirZ] == core::QtyCentering::dual) // ez
{
coarseField(coarseIndex[dirX], coarseIndex[dirY], coarseIndex[dirZ])
= 0.5
* (fineField(fineStartIndex[dirX], fineStartIndex[dirY], fineStartIndex[dirZ])
+ fineField(fineStartIndex[dirX], fineStartIndex[dirY],
fineStartIndex[dirZ] + 1));
}
else
{
throw std::runtime_error("no electric field should end up here");
}
}
}

Expand All @@ -136,5 +148,7 @@ class MagneticFieldCoarsener
SAMRAI::hier::Box const destinationBox_;
static int constexpr ratio_ = 2;
};

} // namespace PHARE::amr

#endif
9 changes: 2 additions & 7 deletions src/amr/data/field/coarsening/field_coarsen_index_weight.hpp
Original file line number Diff line number Diff line change
@@ -1,18 +1,13 @@
#ifndef PHARE_FIELD_COARSEN_HPP
#define PHARE_FIELD_COARSEN_HPP


#include "core/def/phare_mpi.hpp"

#include "core/def.hpp"
#include "coarsen_weighter.hpp"
#include "core/def/phare_mpi.hpp" // IWYU pragma: keep
#include "core/data/grid/gridlayoutdefs.hpp"
#include "core/hybrid/hybrid_quantities.hpp"
#include "core/data/field/field.hpp"
#include "core/utilities/constants.hpp"

#include "amr/resources_manager/amr_utils.hpp"

#include "coarsen_weighter.hpp"

#include <SAMRAI/hier/Box.h>

Expand Down
Loading