IPPL (Independent Parallel Particle Layer)
IPPL
Loading...
Searching...
No Matches
BcTypes.h
Go to the documentation of this file.
1// This file contains the abstract base class for
2// field boundary conditions and other child classes
3// which represent specific BCs. At the moment the
4// following field BCs are supported
5//
6// 1. Periodic BC
7// 2. Zero BC
8// 3. Specifying a constant BC
9// 4. No BC (default option)
10// 5. Constant extrapolation BC
11// Only cell-centered field BCs are implemented
12// at the moment.
13//
14#ifndef IPPL_FIELD_BC_TYPES_H
15#define IPPL_FIELD_BC_TYPES_H
16
17#include "Types/IpplTypes.h"
18#include "Types/ViewTypes.h"
19
20#include "Communicate/Archive.h"
22#include "Index/NDIndex.h"
24
25namespace ippl {
26 /*
27 * Enum type to identify different kinds of
28 * field boundary conditions. Since ZeroFace is
29 * a special case of ConstantFace, both will match
30 * a bitwise AND with CONSTANT_FACE
31 * (to avoid conflict with particle BC enum, add _FACE)
32 */
33 enum FieldBC {
34 PERIODIC_FACE = 0b0000,
35 CONSTANT_FACE = 0b0001,
36 ZERO_FACE = 0b0011,
38 NO_FACE = 0b1000,
39 };
40
41 namespace detail {
42 template <typename Field>
43 class BCondBase {
44 constexpr static unsigned Dim = Field::dim;
45
46 public:
48
49 // Constructor takes:
50 // face: the face to apply the boundary condition on.
51 // i : what component of T to apply the boundary condition to.
52 // The components default to setting all components.
53 BCondBase(unsigned int face);
54
55 virtual ~BCondBase() = default;
56
57 virtual FieldBC getBCType() const { return NO_FACE; }
58
59 virtual void findBCNeighbors(Field& field) = 0;
60 virtual void apply(Field& field) = 0;
61 virtual void assignGhostToPhysical(Field& field) = 0;
62 virtual void write(std::ostream&) const = 0;
63
64 // Return face on which BC applies
65 unsigned int getFace() const { return face_m; }
66
67 // Returns whether or not this BC changes physical cells.
68 bool changesPhysicalCells() const { return changePhysical_m; }
69
70 protected:
71 // What face to apply the boundary condition to.
72 unsigned int face_m;
73
74 // True if this boundary condition changes physical cells.
76 };
77
78 template <typename Field>
79 std::ostream& operator<<(std::ostream&, const BCondBase<Field>&);
80
81 } // namespace detail
82
83 template <typename Field>
84 class ExtrapolateFace : public detail::BCondBase<Field> {
85 constexpr static unsigned Dim = Field::dim;
86 using T = typename Field::value_type;
87
88 public:
89 // Constructor takes zero, one, or two int's specifying components of
90 // multicomponent types like Vector this BC applies to.
91 // Zero int's specified means apply to all components; one means apply to
92 // component (i), and two means apply to component (i,j),
95
96 ExtrapolateFace(unsigned face, T offset, T slope)
97 : base_type(face)
98 , offset_m(offset)
99 , slope_m(slope) {}
100
101 virtual ~ExtrapolateFace() = default;
102
103 virtual FieldBC getBCType() const { return EXTRAPOLATE_FACE; }
104
105 virtual void findBCNeighbors(Field& /*field*/) {}
106 virtual void apply(Field& field);
107 virtual void assignGhostToPhysical(Field& field);
108
109 virtual void write(std::ostream& out) const;
110
111 const T& getOffset() const { return offset_m; }
112 const T& getSlope() const { return slope_m; }
113
114 protected:
117 };
118
119 template <typename Field>
120 class NoBcFace : public detail::BCondBase<Field> {
121 public:
122 NoBcFace(int face)
123 : detail::BCondBase<Field>(face) {}
124
125 virtual void findBCNeighbors(Field& /*field*/) {}
126 virtual void apply(Field& /*field*/) {}
127 virtual void assignGhostToPhysical(Field& /*field*/) {}
128
129 virtual void write(std::ostream& out) const;
130 };
131
132 template <typename Field>
133 class ConstantFace : public ExtrapolateFace<Field> {
134 using T = typename Field::value_type;
135
136 public:
137 ConstantFace(unsigned int face, T constant)
138 : ExtrapolateFace<Field>(face, constant, 0) {}
139
140 virtual FieldBC getBCType() const { return CONSTANT_FACE; }
141
142 virtual void write(std::ostream& out) const;
143 };
144
145 template <typename Field>
146 class ZeroFace : public ConstantFace<Field> {
147 public:
148 ZeroFace(unsigned face)
149 : ConstantFace<Field>(face, 0.0) {}
150
151 virtual FieldBC getBCType() const { return ZERO_FACE; }
152
153 virtual void write(std::ostream& out) const;
154 };
155
156 template <typename Field>
157 class PeriodicFace : public detail::BCondBase<Field> {
158 constexpr static unsigned Dim = Field::dim;
159 using T = typename Field::value_type;
160
161 public:
162 using face_neighbor_type = std::array<std::vector<int>, 2 * Dim>;
164
165 PeriodicFace(unsigned face)
166 : detail::BCondBase<Field>(face) {}
167
168 virtual FieldBC getBCType() const { return PERIODIC_FACE; }
169
170 virtual void findBCNeighbors(Field& field);
171 virtual void apply(Field& field);
172 virtual void assignGhostToPhysical(Field& field);
173
174 virtual void write(std::ostream& out) const;
175
176 private:
178 typename Field::halo_type::databuffer_type haloData_m;
179 };
180} // namespace ippl
181
182#include "Field/BcTypes.hpp"
183
184#endif
Definition Archive.h:20
FieldBC
Definition BcTypes.h:33
@ NO_FACE
Definition BcTypes.h:38
@ ZERO_FACE
Definition BcTypes.h:36
@ PERIODIC_FACE
Definition BcTypes.h:34
@ CONSTANT_FACE
Definition BcTypes.h:35
@ EXTRAPOLATE_FACE
Definition BcTypes.h:37
std::ostream & operator<<(std::ostream &, const BCondBase< Field > &)
Definition BcTypes.hpp:28
virtual void assignGhostToPhysical(Field &field)=0
virtual ~BCondBase()=default
unsigned int getFace() const
Definition BcTypes.h:65
virtual void findBCNeighbors(Field &field)=0
unsigned int face_m
Definition BcTypes.h:72
virtual void apply(Field &field)=0
bool changesPhysicalCells() const
Definition BcTypes.h:68
static constexpr unsigned Dim
Definition BcTypes.h:44
BCondBase(unsigned int face)
Definition BcTypes.hpp:23
virtual FieldBC getBCType() const
Definition BcTypes.h:57
FieldLayout< Dim > Layout_t
Definition BcTypes.h:47
virtual void write(std::ostream &) const =0
typename detail::BCondBase< Field >::Layout_t Layout_t
Definition BcTypes.h:94
virtual void assignGhostToPhysical(Field &field)
Definition BcTypes.hpp:408
typename Field::value_type T
Definition BcTypes.h:86
virtual void write(std::ostream &out) const
Definition BcTypes.hpp:108
ExtrapolateFace(unsigned face, T offset, T slope)
Definition BcTypes.h:96
virtual void apply(Field &field)
Definition BcTypes.hpp:36
virtual ~ExtrapolateFace()=default
const T & getSlope() const
Definition BcTypes.h:112
static constexpr unsigned Dim
Definition BcTypes.h:85
virtual FieldBC getBCType() const
Definition BcTypes.h:103
virtual void findBCNeighbors(Field &)
Definition BcTypes.h:105
detail::BCondBase< Field > base_type
Definition BcTypes.h:93
const T & getOffset() const
Definition BcTypes.h:111
virtual void write(std::ostream &out) const
Definition BcTypes.hpp:114
virtual void assignGhostToPhysical(Field &)
Definition BcTypes.h:127
NoBcFace(int face)
Definition BcTypes.h:122
virtual void findBCNeighbors(Field &)
Definition BcTypes.h:125
virtual void apply(Field &)
Definition BcTypes.h:126
virtual void write(std::ostream &out) const
Definition BcTypes.hpp:120
virtual FieldBC getBCType() const
Definition BcTypes.h:140
typename Field::value_type T
Definition BcTypes.h:134
ConstantFace(unsigned int face, T constant)
Definition BcTypes.h:137
virtual FieldBC getBCType() const
Definition BcTypes.h:151
ZeroFace(unsigned face)
Definition BcTypes.h:148
virtual void write(std::ostream &out) const
Definition BcTypes.hpp:126
virtual void findBCNeighbors(Field &field)
Definition BcTypes.hpp:138
face_neighbor_type faceNeighbors_m
Definition BcTypes.h:177
typename Field::value_type T
Definition BcTypes.h:159
virtual void write(std::ostream &out) const
Definition BcTypes.hpp:132
Field::halo_type::databuffer_type haloData_m
Definition BcTypes.h:178
virtual FieldBC getBCType() const
Definition BcTypes.h:168
std::array< std::vector< int >, 2 *Dim > face_neighbor_type
Definition BcTypes.h:162
virtual void apply(Field &field)
Definition BcTypes.hpp:193
typename detail::BCondBase< Field >::Layout_t Layout_t
Definition BcTypes.h:163
virtual void assignGhostToPhysical(Field &field)
Definition BcTypes.hpp:347
static constexpr unsigned Dim
Definition BcTypes.h:158
PeriodicFace(unsigned face)
Definition BcTypes.h:165