OPAL (Object Oriented Parallel Accelerator Library)  2024.1
OPAL
RegularDomain.cpp
Go to the documentation of this file.
1 //
2 // Class RegularDomain
3 // Base class for simple domains that do not change the x-y shape in
4 // longitudinal direction.
5 //
6 // Copyright (c) 2020, Paul Scherrer Institut, Villigen PSI, Switzerland
7 // All rights reserved
8 //
9 // This file is part of OPAL.
10 //
11 // OPAL is free software: you can redistribute it and/or modify
12 // it under the terms of the GNU General Public License as published by
13 // the Free Software Foundation, either version 3 of the License, or
14 // (at your option) any later version.
15 //
16 // You should have received a copy of the GNU General Public License
17 // along with OPAL. If not, see <https://www.gnu.org/licenses/>.
18 //
19 #include "Solvers/RegularDomain.h"
20 
22  const Vector_t& hr,
23  const std::string& interpl)
24  : IrregularDomain(nr, hr, interpl)
25  , nxy_m(nr[0] * nr[1])
26 { }
27 
28 
29 void RegularDomain::resizeMesh(Vector_t& origin, Vector_t& hr, const Vector_t& rmin,
30  const Vector_t& rmax, double dh)
31 {
32  Vector_t mymax = Vector_t(0.0, 0.0, 0.0);
33 
34  // apply bounding box increment dh, i.e., "BBOXINCR" input argument
35  double zsize = rmax[2] - rmin[2];
36 
37  setMinMaxZ(rmin[2] - zsize * (1.0 + dh),
38  rmax[2] + zsize * (1.0 + dh));
39 
40  origin = Vector_t(getXRangeMin(), getYRangeMin(), getMinZ());
41  mymax = Vector_t(getXRangeMax(), getYRangeMax(), getMaxZ());
42 
43  for (int i = 0; i < 3; ++i)
44  hr[i] = (mymax[i] - origin[i]) / nr_m[i];
45 }
46 
47 
48 void RegularDomain::constantInterpolation(int x, int y, int z, StencilValue_t& value,
49  double &scaleFactor) const
50 {
51  scaleFactor = 1.0;
52  value.west = -1.0 / (hr_m[0] * hr_m[0]);
53  value.east = -1.0 / (hr_m[0] * hr_m[0]);
54  value.north = -1.0 / (hr_m[1] * hr_m[1]);
55  value.south = -1.0 / (hr_m[1] * hr_m[1]);
56  value.front = -1.0 / (hr_m[2] * hr_m[2]);
57  value.back = -1.0 / (hr_m[2] * hr_m[2]);
58 
59  value.center = 2.0 / (hr_m[0] * hr_m[0])
60  + 2.0 / (hr_m[1] * hr_m[1])
61  + 2.0 / (hr_m[2] * hr_m[2]);
62 
63  // we are a right boundary point
64  if (!isInside(x + 1, y, z))
65  value.east = 0.0;
66 
67  // we are a left boundary point
68  if (!isInside(x - 1, y, z))
69  value.west = 0.0;
70 
71  // we are a upper boundary point
72  if (!isInside(x, y + 1, z))
73  value.north = 0.0;
74 
75  // we are a lower boundary point
76  if (!isInside(x, y - 1, z))
77  value.south = 0.0;
78 
79  // handle boundary condition in z direction
80  robinBoundaryStencil(z, value.front, value.back, value.center);
81 }
82 
83 
84 void RegularDomain::robinBoundaryStencil(int z, double &F, double &B, double &C) const {
85  if (z == 0 || z == nr_m[2] - 1) {
86 
87  // case where we are on the Robin BC in Z-direction
88  // where we distinguish two cases
89  // IFF: this values should not matter because they
90  // never make it into the discretization matrix
91  if (z == 0)
92  F = 0.0;
93  else
94  B = 0.0;
95 
96  // add contribution of Robin discretization to center point
97  // d the distance between the center of the bunch and the boundary
98  double d = 0.5 * hr_m[2] * (nr_m[2] - 1);
99  C += 2.0 / (d * hr_m[2]);
100  }
101 }
virtual bool isInside(int x, int y, int z) const =0
double getYRangeMax() const
double getXRangeMax() const
IntVector_t nr_m
number of mesh points in each direction
RegularDomain(const IntVector_t &nr, const Vector_t &hr, const std::string &interpl)
Vektor< double, 3 > Vector_t
Definition: Vektor.h:6
double getMinZ() const
void robinBoundaryStencil(int z, double &F, double &B, double &C) const
function to handle the open boundary condition in longitudinal direction
double getMaxZ() const
double getYRangeMin() const
double getXRangeMin() const
Vector_t hr_m
mesh-spacings in each direction
void resizeMesh(Vector_t &origin, Vector_t &hr, const Vector_t &rmin, const Vector_t &rmax, double dh) override
void constantInterpolation(int x, int y, int z, StencilValue_t &value, double &scaleFactor) const override
different interpolation methods for boundary points
const int nr
Definition: ClassicRandom.h:24
void setMinMaxZ(double minz, double maxz)