IrregularDomain.h 6.41 KB
Newer Older
1
//
frey_m's avatar
frey_m committed
2 3
// Class IrregularDomain
//   Defines a common abstract interface for different types of boundaries.
4
//
5
// Copyright (c) 2008,        Yves Ineichen, ETH Zürich,
frey_m's avatar
frey_m committed
6
//               2013 - 2015, Tülin Kaman, Paul Scherrer Institut, Villigen PSI, Switzerland
7
//               2017 - 2020, Paul Scherrer Institut, Villigen PSI, Switzerland
frey_m's avatar
frey_m committed
8
// All rights reserved
9
//
10 11 12 13 14
// Implemented as part of the master thesis
// "A Parallel Multigrid Solver for Beam Dynamics"
// and the paper
// "A fast parallel Poisson solver on irregular domains applied to beam dynamics simulations"
// (https://doi.org/10.1016/j.jcp.2010.02.022)
frey_m's avatar
frey_m committed
15 16 17 18 19 20 21 22 23 24
//
// This file is part of OPAL.
//
// OPAL is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// You should have received a copy of the GNU General Public License
// along with OPAL. If not, see <https://www.gnu.org/licenses/>.
25
//
gsell's avatar
gsell committed
26 27 28 29 30
#ifndef IRREGULAR_DOMAIN_H
#define IRREGULAR_DOMAIN_H

#include <vector>
#include <string>
31
#include "Algorithms/PBunchDefs.h"
32

gsell's avatar
gsell committed
33 34 35 36 37 38 39
/// enumeration corresponding to different interpolation methods at the boundary
enum {
    CONSTANT,
    LINEAR,
    QUADRATIC
};

40

gsell's avatar
gsell committed
41 42 43 44
class IrregularDomain {

public:

45 46 47 48 49 50 51 52 53 54 55 56 57
    template<typename T>
    struct Stencil {
        T center;   // x,   y,   z
        T west;     // x-1, y,   z
        T east;     // x+1, y,   z
        T north;    // x,   y+1, z
        T south;    // x,   y-1, z
        T front;    // x,   y,   z-1
        T back;     // x,   y,   z+1
    };

    typedef Stencil<int>    StencilIndex_t;
    typedef Stencil<double> StencilValue_t;
58
    typedef Vektor<int, 3>  IntVector_t;
59

60
    IrregularDomain(const IntVector_t& nr,
61 62
                    const Vector_t& hr,
                    const std::string& interpl);
frey_m's avatar
frey_m committed
63 64


frey_m's avatar
frey_m committed
65 66
    /** method to compute the intersection points with the boundary geometry
     * (stored in some appropriate data structure)
gsell's avatar
gsell committed
67 68
     * \param hr updated mesh spacings
     */
69
    virtual void compute(Vector_t hr, NDIndex<3> localId) = 0;
gsell's avatar
gsell committed
70 71 72 73 74

    /// method to calculate the stencil at a boundary points
    /// \param x index of the current element in the matrix
    /// \param y index of the current element in the matrix
    /// \param z index of the current element in the matrix
75 76
    /// \param values of stencil element
    /// \param scaleFactor of stencil values
77
    void getBoundaryStencil(int x, int y, int z,
78
                                    StencilValue_t& value,
79
                                    double &scaleFactor) const;
gsell's avatar
gsell committed
80 81

    /// method to calculate the stencil at a boundary points
82
    /// \param id index of the current element in the matrix
83 84 85
    // \param values of stencil element
    /// \param scaleFactor of stencil values
    void getBoundaryStencil(int id, StencilValue_t& value,
86
                            double &scaleFactor) const;
gsell's avatar
gsell committed
87 88 89 90 91

    /// method to calculate the neighbours in the matrix of the current index (x,y,z)
    /// \param x index of the current element in the matrix
    /// \param y index of the current element in the matrix
    /// \param z index of the current element in the matrix
92
    /// \param index stencil indices of an element
93
    void getNeighbours(int x, int y, int z, StencilIndex_t& index) const;
94

95
    void getNeighbours(int idx, StencilIndex_t& index) const;
96

frey_m's avatar
frey_m committed
97
    /// Conversion from a 3D index to (x,y,z)
98
    virtual void getCoord(int idx, int &x, int &y, int &z) const;
99

frey_m's avatar
frey_m committed
100
    /// Conversion from (x,y,z) to index on the 3D grid
101 102 103
    int getIdx(int x, int y, int z) const;

    virtual int getNumXY() const { return nr_m[0] * nr_m[1]; }
gsell's avatar
gsell committed
104 105 106 107 108 109

    /// method that checks if a given point lies inside the boundary
    /// \param x index of the current element in the matrix
    /// \param y index of the current element in the matrix
    /// \param z index of the current element in the matrix
    /// \return boolean indicating if the point lies inside the boundary
110 111 112 113
    virtual bool isInside(int x, int y, int z)  const = 0;

    IntVector_t getNr() const { return nr_m; }
    Vector_t    getHr() const { return hr_m; }
gsell's avatar
gsell committed
114

115 116
    void setNr(IntVector_t nr) { nr_m = nr; }
    void setHr(Vector_t hr)    { hr_m = hr; }
gsell's avatar
gsell committed
117

118 119 120 121
    void setMinMaxZ(double minz, double maxz) {
        zMin_m = minz;
        zMax_m = maxz;
    }
gsell's avatar
gsell committed
122

123 124
    double getMinZ() const { return zMin_m; }
    double getMaxZ() const { return zMax_m; }
125

126 127 128 129 130 131
    double getXRangeMin() const { return min_m(0); }
    double getXRangeMax() const { return max_m(0); }
    double getYRangeMin() const { return min_m(1); }
    double getYRangeMax() const { return max_m(1); }
    double getZRangeMin() const { return min_m(2); }
    double getZRangeMax() const { return max_m(2); }
gsell's avatar
gsell committed
132

133 134 135 136
    void setRangeMin(const Vector_t& min) { min_m = min; }
    void setRangeMax(const Vector_t& max) { max_m = max; }

    bool hasGeometryChanged() const { return hasGeometryChanged_m; }
137

138
    virtual ~IrregularDomain() {};
gsell's avatar
gsell committed
139

140
    virtual void resizeMesh(Vector_t& origin, Vector_t& hr,
frey_m's avatar
frey_m committed
141
                            const Vector_t& /*rmin*/, const Vector_t& /*rmax*/,
142
                            double /*dh*/);
143

gsell's avatar
gsell committed
144 145
protected:

146 147 148
    virtual int indexAccess(int x, int y, int z) const = 0;

    virtual int coordAccess(int idx) const = 0;
frey_m's avatar
frey_m committed
149

150 151
    /// different interpolation methods for boundary points
    virtual void constantInterpolation(int x, int y, int z, StencilValue_t& value,
152
                               double &scaleFactor) const;
153 154

    virtual void linearInterpolation(int x, int y, int z, StencilValue_t& value,
155
                             double &scaleFactor) const;
156 157

    virtual void quadraticInterpolation(int x, int y, int z, StencilValue_t& value,
158
                                double &scaleFactor) const;
159 160


gsell's avatar
gsell committed
161 162
    // a irregular domain is always defined on a grid
    /// number of mesh points in each direction
163
    IntVector_t nr_m;
gsell's avatar
gsell committed
164
    /// mesh-spacings in each direction
frey_m's avatar
frey_m committed
165
    Vector_t hr_m;
gsell's avatar
gsell committed
166 167 168 169

    /// min/max of bunch in floor coordinates
    double zMin_m;
    double zMax_m;
170

171 172 173
    Vector_t min_m;
    Vector_t max_m;

174 175 176
    /// flag indicating if geometry has changed for the current time-step
    bool hasGeometryChanged_m;

177 178 179
    /// interpolation type
    int interpolationMethod_m;

180 181 182 183 184 185
    /// mapping (x,y,z) -> idx
    std::map<int, int> idxMap_m;

    /// mapping idx -> (x,y,z)
    std::map<int, int> coordMap_m;

gsell's avatar
gsell committed
186 187
};

188 189
#endif

190

191 192 193 194 195 196 197
// vi: set et ts=4 sw=4 sts=4:
// Local Variables:
// mode:c
// c-basic-offset: 4
// indent-tabs-mode: nil
// require-final-newline: nil
// End: