IrregularDomain.h 6.12 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 33
#include "Algorithms/Quaternion.h"

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

41

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

public:

46 47 48 49 50 51 52 53 54 55 56 57 58 59
    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;

frey_m's avatar
frey_m committed
60 61
    /** method to compute the intersection points with the boundary geometry
     * (stored in some appropriate data structure)
gsell's avatar
gsell committed
62 63
     * \param hr updated mesh spacings
     */
64
    virtual void compute(Vector_t hr, NDIndex<3> localId) = 0;
gsell's avatar
gsell committed
65 66 67 68 69 70 71 72 73 74
    /** method to get the number of gridpoints in a given z plane
     * \param z coordinate of the z plane
     * \return int number of grid nodes in the given z plane
     */
    virtual int getNumXY(int z) = 0;

    /// 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
frey_m's avatar
frey_m committed
77
    virtual void getBoundaryStencil(int x, int y, int z,
78 79
                                    StencilValue_t& value,
                                    double &scaleFactor) = 0;
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);
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);
94 95

    void getNeighbours(int idx, StencilIndex_t& index);
96 97 98


    virtual void getCoord(int idx, int &x, int &y, int &z) = 0;
gsell's avatar
gsell committed
99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119

    /// method that identifies a specialized boundary geometry
    /// \return std::string containing a description of the boundary geometry used
    virtual std::string getType() = 0;

    /// 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
    virtual bool isInside(int x, int y, int z) = 0;

    Vector_t getNr() { return nr; }
    Vector_t getHr() { return hr; }
    void setNr(Vector_t nri) { nr = nri; }
    void setHr(Vector_t hri) { hr = hri; }

    void setMinMaxZ(double minz, double maxz) { zMin_m=minz; zMax_m=maxz; }
    double getMinZ() { return zMin_m; }
    double getMaxZ() { return zMax_m; }

120 121
    void setGlobalMeanR(Vector_t rmean) { rMean_m = rmean;}
    Vector_t getGlobalMeanR() { return rMean_m; }
122

123 124
    void setGlobalToLocalQuaternion(Quaternion_t globalToLocalQuaternion){
        globalToLocalQuaternion_m = globalToLocalQuaternion;}
frey_m's avatar
frey_m committed
125

126
    Quaternion_t getGlobalToLocalQuaternion() { return globalToLocalQuaternion_m;}
127

gsell's avatar
gsell committed
128 129 130 131
    virtual double getXRangeMin() = 0;
    virtual double getXRangeMax() = 0;
    virtual double getYRangeMin() = 0;
    virtual double getYRangeMax() = 0;
132 133
    virtual double getZRangeMin() = 0;
    virtual double getZRangeMax() = 0;
gsell's avatar
gsell committed
134 135 136

    virtual int getIdx(int x, int y, int z) = 0;
    virtual bool hasGeometryChanged() = 0;
137
    virtual ~IrregularDomain() {};
gsell's avatar
gsell committed
138

139
    virtual void resizeMesh(Vector_t& origin, Vector_t& hr,
frey_m's avatar
frey_m committed
140 141 142
                            const Vector_t& /*rmin*/, const Vector_t& /*rmax*/,
                            double /*dh*/)
    {
143 144 145 146 147 148 149 150 151 152 153
        double xmin = getXRangeMin();
        double xmax = getXRangeMax();
        double ymin = getYRangeMin();
        double ymax = getYRangeMax();
        double zmin = getZRangeMin();
        double zmax = getZRangeMax();

        origin = Vector_t(xmin, ymin , zmin);
        Vector_t mymax = Vector_t(xmax, ymax , zmax);

        for (int i = 0; i < 3; i++)
frey_m's avatar
frey_m committed
154
            hr[i] = (mymax[i] - origin[i]) / nr[i];
155 156
    };

gsell's avatar
gsell committed
157 158 159 160 161 162 163 164 165 166 167
protected:

    // a irregular domain is always defined on a grid
    /// number of mesh points in each direction
    Vector_t nr;
    /// mesh-spacings in each direction
    Vector_t hr;

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

    /// mean position of bunch (m)
    Vector_t rMean_m;
171
    Quaternion_t globalToLocalQuaternion_m;
gsell's avatar
gsell committed
172 173
};

174 175 176 177 178 179 180 181 182
#endif

// 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: