Branch data Line data Source code
1 : : //
2 : : // Class Field
3 : : // BareField with a mesh and configurable boundary conditions
4 : : //
5 : : //
6 : :
7 : : namespace ippl {
8 : : namespace detail {
9 : : template <typename T, unsigned Dim, class Mesh, class Centering, class... ViewArgs>
10 : : struct isExpression<Field<T, Dim, Mesh, Centering, ViewArgs...>> : std::true_type {};
11 : : } // namespace detail
12 : :
13 : : //////////////////////////////////////////////////////////////////////////
14 : : // A default constructor, which should be used only if the user calls the
15 : : // 'initialize' function before doing anything else. There are no special
16 : : // checks in the rest of the Field methods to check that the Field has
17 : : // been properly initialized
18 : : template <class T, unsigned Dim, class Mesh, class Centering, class... ViewArgs>
19 : 24 : Field<T, Dim, Mesh, Centering, ViewArgs...>::Field()
20 : : : BareField_t()
21 : 24 : , mesh_m(nullptr)
22 [ + + ]: 28 : , bc_m() {}
23 : :
24 : : template <class T, unsigned Dim, class Mesh, class Centering, class... ViewArgs>
25 : : Field<T, Dim, Mesh, Centering, ViewArgs...>
26 : 12 : Field<T, Dim, Mesh, Centering, ViewArgs...>::deepCopy() const {
27 : 12 : Field<T, Dim, Mesh, Centering, ViewArgs...> copy(*mesh_m, this->getLayout(),
28 : : this->getNghost());
29 [ + - ]: 12 : Kokkos::deep_copy(copy.getView(), this->getView());
30 : :
31 : 12 : return copy;
32 : 0 : }
33 : :
34 : : //////////////////////////////////////////////////////////////////////////
35 : : // Constructors which include a Mesh object as argument
36 : : template <class T, unsigned Dim, class Mesh, class Centering, class... ViewArgs>
37 : 508 : Field<T, Dim, Mesh, Centering, ViewArgs...>::Field(Mesh_t& m, Layout_t& l, int nghost)
38 : : : BareField_t(l, nghost)
39 : 508 : , mesh_m(&m) {
40 [ + + ]: 3988 : for (unsigned int face = 0; face < 2 * Dim; ++face) {
41 : 3480 : bc_m[face] =
42 [ + - ]: 6960 : std::make_shared<NoBcFace<Field<T, Dim, Mesh, Centering, ViewArgs...>>>(face);
43 : : }
44 : 508 : }
45 : :
46 : : //////////////////////////////////////////////////////////////////////////
47 : : // Initialize the Field, also specifying a mesh
48 : : template <class T, unsigned Dim, class Mesh, class Centering, class... ViewArgs>
49 : 24 : void Field<T, Dim, Mesh, Centering, ViewArgs...>::initialize(Mesh_t& m, Layout_t& l,
50 : : int nghost) {
51 : 24 : BareField_t::initialize(l, nghost);
52 : 24 : mesh_m = &m;
53 [ + + ]: 192 : for (unsigned int face = 0; face < 2 * Dim; ++face) {
54 : 168 : bc_m[face] =
55 [ + - ]: 336 : std::make_shared<NoBcFace<Field<T, Dim, Mesh, Centering, ViewArgs...>>>(face);
56 : : }
57 : 24 : }
58 : :
59 : : template <class T, unsigned Dim, class Mesh, class Centering, class... ViewArgs>
60 : 24 : T Field<T, Dim, Mesh, Centering, ViewArgs...>::getVolumeIntegral() const {
61 : 24 : typename Mesh::value_type dV = mesh_m->getCellVolume();
62 : 24 : return this->sum() * dV;
63 : : }
64 : :
65 : : template <class T, unsigned Dim, class Mesh, class Centering, class... ViewArgs>
66 : 0 : T Field<T, Dim, Mesh, Centering, ViewArgs...>::getVolumeAverage() const {
67 : 0 : return getVolumeIntegral() / mesh_m->getMeshVolume();
68 : : }
69 : :
70 : : template <class T, unsigned Dim, class Mesh, class Centering, class... ViewArgs>
71 : 48 : void Field<T, Dim, Mesh, Centering, ViewArgs...>::updateLayout(Layout_t& l, int nghost) {
72 : 48 : BareField_t::updateLayout(l, nghost);
73 : 48 : }
74 : :
75 : : } // namespace ippl
|