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 528 : Field<T, Dim, Mesh, Centering, ViewArgs...>::Field(Mesh_t& m, Layout_t& l, int nghost)
38 : : BareField_t(l, nghost)
39 528 : , mesh_m(&m) {
40 4048 : for (unsigned int face = 0; face < 2 * Dim; ++face) {
41 3520 : bc_m[face] =
42 7040 : std::make_shared<NoBcFace<Field<T, Dim, Mesh, Centering, ViewArgs...>>>(face);
43 : }
44 528 : }
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
|