RectangularDomain.h 2.71 KB
Newer Older
frey_m's avatar
frey_m committed
1 2 3 4
//
// Class RectangularDomain
//   :FIXME: add brief description
//
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 9
// All rights reserved
//
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 25
//
// 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/>.
//
gsell's avatar
gsell committed
26 27 28 29
#ifndef RECTANGULAR_DOMAIN_H
#define RECTANGULAR_DOMAIN_H

#include <vector>
30
#include <string>
gsell's avatar
gsell committed
31 32 33 34 35
#include "IrregularDomain.h"

class RectangularDomain : public IrregularDomain {

public:
36 37
    using IrregularDomain::StencilIndex_t;
    using IrregularDomain::StencilValue_t;
gsell's avatar
gsell committed
38

39 40 41 42 43
    /**
     * \param a is the longer side a of the rectangle
     * \param b is the shorter side b of the rectangle
     *
     */
gsell's avatar
gsell committed
44 45
    RectangularDomain(double a, double b, Vector_t nr, Vector_t hr);

46
    /// calculates intersection with the beam pipe
47
    void compute(Vector_t hr, NDIndex<3> /*localId*/);
48

gsell's avatar
gsell committed
49
    /// returns index of neighbours at (x,y,z)
50
    using IrregularDomain::getNeighbours;
gsell's avatar
gsell committed
51
    /// queries if a given (x,y,z) coordinate lies inside the domain
52
    inline bool isInside(int x, int y, int /*z*/) {
frey_m's avatar
frey_m committed
53 54
        double xx = (x - (nr_m[0] - 1) / 2.0) * hr_m[0];
        double yy = (y - (nr_m[1] - 1) / 2.0) * hr_m[1];
55
        return (xx <= getXRangeMax() && yy < getYRangeMax());
gsell's avatar
gsell committed
56 57 58 59 60 61 62
    }

private:
    /// number of nodes in the xy plane (for this case: independent of the z coordinate)
    int nxy_m;

    /// conversion from (x,y,z) to index on the 3D grid
frey_m's avatar
frey_m committed
63 64
    int indexAccess(int x, int y, int z) {
        return y * nr_m[0] + x + z * nxy_m;
gsell's avatar
gsell committed
65
    }
frey_m's avatar
frey_m committed
66

gsell's avatar
gsell committed
67
    /// conversion from a 3D index to (x,y,z)
frey_m's avatar
frey_m committed
68
    void getCoord(int idx, int &x, int &y, int &z) override {
gsell's avatar
gsell committed
69
        int ixy = idx % nxy_m;
frey_m's avatar
frey_m committed
70
        x = ixy % (int)nr_m[0];
frey_m's avatar
frey_m committed
71
        y = (ixy - x) / nr_m[0];
gsell's avatar
gsell committed
72 73 74
        z = (idx - ixy) / nxy_m;
    }

75 76
    void constantInterpolation(int x, int y, int z, StencilValue_t& value,
                               double &scaleFactor) override;
gsell's avatar
gsell committed
77 78
};

79 80 81 82 83 84 85 86 87 88
#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: