Code indexing in gitaly is broken and leads to code not being visible to the user. We work on the issue with highest priority.

Skip to content
Snippets Groups Projects
Commit d087d08b authored by Matthias Frey's avatar Matthias Frey Committed by vinciguerra_a
Browse files

move getRangePolicy to BareField

parent 07468628
No related branches found
No related tags found
1 merge request!88Resolve "Add MDRangePolicy generator for arbitrary dimensions"
......@@ -62,6 +62,7 @@ namespace ippl {
//! View type storing the data
using view_type = typename detail::ViewType<T, Dim>::view_type;
using HostMirror = typename view_type::host_mirror_type;
using range_policy_type = typename detail::RangePolicy<Dim>::range_policy_type;
/*! A default constructor, which should be used only if the user calls the
......@@ -182,6 +183,21 @@ namespace ippl {
return Kokkos::create_mirror(dview_m);
}
range_policy_type getRangePolicy(int nghost) const {
if constexpr (Dim == 1) {
return range_policy_type(nghost, dview_m.extent(0) - nghost);
} else if constexpr (Dim == 2) {
return range_policy_type({nghost, nghost},
{dview_m.extent(0) - nghost,
dview_m.extent(1) - nghost});
} else if constexpr (Dim == 3) {
return range_policy_type({nghost, nghost, nghost},
{dview_m.extent(0) - nghost,
dview_m.extent(1) - nghost,
dview_m.extent(2) - nghost});
}
}
/*!
* Print the BareField.
* @param out stream
......
......@@ -100,13 +100,9 @@ namespace ippl {
template <typename T, unsigned Dim>
BareField<T, Dim>& BareField<T, Dim>::operator=(T x) {
using mdrange_type = Kokkos::MDRangePolicy<Kokkos::Rank<3>>;
range_policy_type mdrange = getRangePolicy(0);
Kokkos::parallel_for("BareField::operator=(T)",
mdrange_type({0, 0, 0},
{dview_m.extent(0),
dview_m.extent(1),
dview_m.extent(2)
}),
mdrange,
KOKKOS_CLASS_LAMBDA(const size_t i,
const size_t j,
const size_t k)
......@@ -122,12 +118,10 @@ namespace ippl {
BareField<T, Dim>& BareField<T, Dim>::operator=(const detail::Expression<E, N>& expr) {
using capture_type = detail::CapturedExpression<E, N>;
capture_type expr_ = reinterpret_cast<const capture_type&>(expr);
using mdrange_type = Kokkos::MDRangePolicy<Kokkos::Rank<3>>;
range_policy_type mdrange = getRangePolicy(nghost_m);
Kokkos::parallel_for("BareField::operator=(const Expression&)",
mdrange_type({nghost_m, nghost_m, nghost_m},
{dview_m.extent(0) - nghost_m,
dview_m.extent(1) - nghost_m,
dview_m.extent(2) - nghost_m}),
mdrange,
KOKKOS_CLASS_LAMBDA(const size_t i,
const size_t j,
const size_t k)
......
......@@ -30,7 +30,7 @@ namespace ippl {
Field<T,Dim,M,C>::Field()
: BareField<T, Dim>()
, mesh_m(nullptr)
, bc_m()
, bc_m()
{ }
//////////////////////////////////////////////////////////////////////////
......@@ -39,7 +39,7 @@ namespace ippl {
Field<T,Dim,M,C>::Field(Mesh_t& m, Layout_t& l, int nghost)
: BareField<T,Dim>(l, nghost)
, mesh_m(&m)
{
{
for (unsigned int face=0; face < 2 * Dim; ++face) {
bc_m[face] = std::make_shared<NoBcFace<T, Dim>>(face);
}
......
......@@ -62,6 +62,23 @@ namespace ippl {
};
/*!
* Muldimensional range policies.
*/
template <unsigned Dim>
struct RangePolicy {
typedef Kokkos::MDRangePolicy<Kokkos::Rank<Dim>> range_policy_type;
};
/*!
* Specialized range policy for one dimension.
*/
template <>
struct RangePolicy<1> {
typedef Kokkos::RangePolicy<> range_policy_type;
};
/*!
* Empty function for general write.
* @tparam T view data type
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment