ArbitraryDomain.h 3.72 KB
Newer Older
1 2 3 4 5
//
// Class ArbitraryDomain
//   Interface to iterative solver and boundary geometry
//   for space charge calculation
//
6
// Copyright (c) 2008,        Yves Ineichen, ETH Zürich,
frey_m's avatar
frey_m committed
7 8
//               2013 - 2015, Tülin Kaman, Paul Scherrer Institut, Villigen PSI, Switzerland
//                      2016, Daniel Winklehner, Massachusetts Institute of Technology
9
//               2017 - 2020, Paul Scherrer Institut, Villigen PSI, Switzerland
frey_m's avatar
frey_m committed
10
// All rights reserved
11
//
12 13 14 15 16
// 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
17 18 19 20 21 22 23 24 25 26
//
// 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/>.
27
//
28 29
#ifndef ARBITRARY_DOMAIN_H
#define ARBITRARY_DOMAIN_H
30

gsell's avatar
gsell committed
31 32 33
#include <mpi.h>
#include <hdf5.h>
#include "H5hut.h"
34

gsell's avatar
gsell committed
35
#include <map>
36
#include <string>
snuverink_j's avatar
snuverink_j committed
37 38
#include <tuple>
#include <vector>
39
#include "IrregularDomain.h"
snuverink_j's avatar
snuverink_j committed
40 41

class BoundaryGeometry;
gsell's avatar
gsell committed
42 43 44 45

class ArbitraryDomain : public IrregularDomain {

public:
46 47
    using IrregularDomain::StencilIndex_t;
    using IrregularDomain::StencilValue_t;
gsell's avatar
gsell committed
48

frey_m's avatar
frey_m committed
49 50 51
    ArbitraryDomain(BoundaryGeometry *bgeom, Vector_t nr, Vector_t hr,
                    std::string interpl);

52
    ~ArbitraryDomain();
gsell's avatar
gsell committed
53 54

    /// queries if a given (x,y,z) coordinate lies inside the domain
55
    bool isInside(int idx, int idy, int idz);
56
    /// returns number of nodes in xy plane
57
    int getNumXY(int idz);
58 59
    // calculates intersection with rotated and shifted geometry
    void compute(Vector_t hr, NDIndex<3> localId);
gsell's avatar
gsell committed
60

61
    int getStartId() {return startId;}
gsell's avatar
gsell committed
62 63

private:
64 65
    BoundaryGeometry *bgeom_m;

frey_m's avatar
frey_m committed
66 67 68
    /** PointList maps from an (x,z) resp. (y,z) pair to double values
     * (=intersections with boundary)
     */
69
    typedef std::multimap< std::tuple<int, int, int>, double > PointList;
gsell's avatar
gsell committed
70 71

    /// all intersection points with gridlines in X direction
72 73 74 75 76
    PointList IntersectHiX, IntersectLoX;

    /// all intersection points with gridlines in Y direction
    PointList IntersectHiY, IntersectLoY;

gsell's avatar
gsell committed
77
    /// all intersection points with gridlines in Z direction
78
    PointList IntersectHiZ, IntersectLoZ;
79

80
    int startId;
gsell's avatar
gsell committed
81

82
    // Here we store the number of nodes in a xy layer for a given z coordinate
gsell's avatar
gsell committed
83 84
    std::map<int, int> numXY;

85 86 87 88
    // Mapping all cells that are inside the geometry
    std::map<int, bool> IsInsideMap;

    Vector_t globalInsideP0_m;
gsell's avatar
gsell committed
89

90 91 92 93 94
    // Conversion from (x,y,z) to index in xyz plane
    inline int toCoordIdx(int idx, int idy, int idz);
    // Conversion from (x,y,z) to index on the 3D grid
    int getIdx(int idx, int idy, int idz);
    // Conversion from a 3D index to (x,y,z)
95
    inline void getCoord(int idxyz, int &x, int &y, int &z);
gsell's avatar
gsell committed
96 97

    inline void crossProduct(double A[], double B[], double C[]);
frey_m's avatar
frey_m committed
98 99 100 101

    inline double dotProduct(double v1[], double v2[]) {
        return (v1[0] * v2[0] + v1[1] * v2[1] + v1[2] * v2[2]);
    }
gsell's avatar
gsell committed
102

103
    // Different interpolation methods for boundary points
104
    void constantInterpolation(int idx, int idy, int idz, StencilValue_t& value,
105
                               double &scaleFactor) override;
frey_m's avatar
frey_m committed
106

107
    void linearInterpolation(int idx, int idy, int idz, StencilValue_t& value,
108
                             double &scaleFactor) override;
gsell's avatar
gsell committed
109 110
};

111 112 113 114 115 116 117 118 119
#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: