escript Revision_
CrossDomainCoupler.h
Go to the documentation of this file.
1
2/*****************************************************************************
3*
4* Copyright (c) 2003-2020 by The University of Queensland
5* http://www.uq.edu.au
6*
7* Primary Business: Queensland, Australia
8* Licensed under the Apache License, version 2.0
9* http://www.apache.org/licenses/LICENSE-2.0
10*
11* Development until 2012 by Earth Systems Science Computational Center (ESSCC)
12* Development 2012-2013 by School of Earth Sciences
13* Development from 2014-2017 by Centre for Geoscience Computing (GeoComp)
14* Development from 2019 by School of Earth and Environmental Sciences
15**
16*****************************************************************************/
17
18#ifndef __SPECKLEY_CROSSDOMAINCOUPLER_H__
19#define __SPECKLEY_CROSSDOMAINCOUPLER_H__
20
21#include <speckley/Brick.h>
22#include <speckley/Rectangle.h>
23
24#include <ripley/Brick.h>
25#include <ripley/Rectangle.h>
26
27namespace speckley {
28
30public:
31 RipleyCoupler(const SpeckleyDomain *speck, const double s_dx[2], int rank);
32
33
34 void interpolate(escript::Data& target, const escript::Data& source) const;
35private:
36 // a struct type to hold all the relevant info on the target domain
37 struct Ripley {
39 double dx[3];
40 dim_t NE[3];
41 dim_t mins[3];
42 dim_t maxs[3];
43 };
44 void calculateOrder2(int dim, double loc, double *results) const;
45 void calculateOrder3(int dim, double loc, double *results) const;
46 void calculateOrder4(int dim, double loc, double *results) const;
47 void calculateOrder5(int dim, double loc, double *results) const;
48 void calculateOrder6(int dim, double loc, double *results) const;
49 void calculateOrder7(int dim, double loc, double *results) const;
50 void calculateOrder8(int dim, double loc, double *results) const;
51 void calculateOrder9(int dim, double loc, double *results) const;
52 void calculateOrder10(int dim, double loc, double *results) const;
53
54 void generateLocations(struct Ripley& r, double **positions) const;
55
56 bool validInterpolation(escript::Data& target, const escript::Data& source,
57 const SpeckleyDomain *speck, const double *s_dx,
58 const ripley::RipleyDomain *other) const;
59 void calculate(struct Ripley& r, dim_t ex, dim_t ey, dim_t ez,
60 int oqx, int oqy, int oqz, double *out, const double *factor_x,
61 const double *factor_y, const double *factor_z,
62 const escript::Data& source) const;
63
64 void shareWithNeighbours(bool lowerFirst, int hasLower, int hasUpper,
65 double *bottom, double *top, double *brecv, double *trecv,
66 int bSize, int tSize, int distance) const;
67
68 void getEdgeSpacing(struct Ripley r, int *lower, int *upper) const;
69
70 void shareBrickXFaces(struct Ripley& r, int hasLower,
71 int hasUpper, int lower, int upper, escript::Data& target) const;
72 void shareBrickYFaces(struct Ripley& r, int hasLower,
73 int hasUpper, int lower, int upper, escript::Data& target) const;
74 void shareBrickZFaces(struct Ripley& r, int hasLower,
75 int hasUpper, int lower, int upper, escript::Data& target) const;
76
77 void shareRectangleXEdges(struct Ripley& r, int hasLower,
78 int hasUpper, int lower, int upper, escript::Data& target) const;
79 void shareRectangleYEdges(struct Ripley& r, int hasLower,
80 int hasUpper, int lower, int upper, escript::Data& target) const;
81 //speckley info
83 dim_t s_NE[3];
84 double s_dx[3];
85 int s_NX[3];
86 double speckley_origin[3];
87 int order;
89
90 //coupling info
91 bool hasLower[3];
92 bool hasUpper[3];
93
94 //per interpolation
95 mutable int numComp;
96
97#ifdef ESYS_MPI
98 int rank;
99 MPI_Comm comm;
100#endif
101
102};
103
110 const Brick *speck, const double s_dx[3], int rank,
111 MPI_Comm comm);
112
113bool probeInterpolationAcross(int fsType_source,
114 const escript::AbstractDomain& domain, int fsType_target, int dim);
115
116} // end of namespace speckley
117
118#endif // __SPECKLEY_CROSSDOMAINCOUPLER_H__
119
int MPI_Comm
Definition EsysMPI.h:44
Base class for all escript domains.
Definition AbstractDomain.h:51
Data represents a collection of datapoints.
Definition Data.h:64
RipleyDomain extends the AbstractContinuousDomain interface for the Ripley library and is the base cl...
Definition ripley/src/RipleyDomain.h:103
Brick is the 3-dimensional implementation of a SpeckleyDomain.
Definition speckley/src/Brick.h:34
Definition CrossDomainCoupler.h:29
int s_NX[3]
Definition CrossDomainCoupler.h:85
int numComp
Definition CrossDomainCoupler.h:95
dim_t s_NE[3]
Definition CrossDomainCoupler.h:83
void interpolate(escript::Data &target, const escript::Data &source) const
Definition CrossDomainCoupler.cpp:453
void calculateOrder2(int dim, double loc, double *results) const
Definition CrossDomainCoupler.cpp:259
void shareBrickXFaces(struct Ripley &r, int hasLower, int hasUpper, int lower, int upper, escript::Data &target) const
Definition CrossDomainCoupler.cpp:552
const SpeckleyDomain * speck
Definition CrossDomainCoupler.h:82
void calculateOrder7(int dim, double loc, double *results) const
Definition CrossDomainCoupler.cpp:319
void calculateOrder4(int dim, double loc, double *results) const
Definition CrossDomainCoupler.cpp:280
double s_dx[3]
Definition CrossDomainCoupler.h:84
void calculateOrder8(int dim, double loc, double *results) const
Definition CrossDomainCoupler.cpp:334
int numQuads
Definition CrossDomainCoupler.h:88
void getEdgeSpacing(struct Ripley r, int *lower, int *upper) const
Definition CrossDomainCoupler.cpp:385
void generateLocations(struct Ripley &r, double **positions) const
Definition CrossDomainCoupler.cpp:133
void calculateOrder10(int dim, double loc, double *results) const
Definition CrossDomainCoupler.cpp:367
void calculate(struct Ripley &r, dim_t ex, dim_t ey, dim_t ez, int oqx, int oqy, int oqz, double *out, const double *factor_x, const double *factor_y, const double *factor_z, const escript::Data &source) const
Definition CrossDomainCoupler.cpp:409
bool hasLower[3]
Definition CrossDomainCoupler.h:91
double speckley_origin[3]
Definition CrossDomainCoupler.h:86
void shareRectangleXEdges(struct Ripley &r, int hasLower, int hasUpper, int lower, int upper, escript::Data &target) const
Definition CrossDomainCoupler.cpp:822
bool validInterpolation(escript::Data &target, const escript::Data &source, const SpeckleyDomain *speck, const double *s_dx, const ripley::RipleyDomain *other) const
Definition CrossDomainCoupler.cpp:75
void shareRectangleYEdges(struct Ripley &r, int hasLower, int hasUpper, int lower, int upper, escript::Data &target) const
Definition CrossDomainCoupler.cpp:900
int order
Definition CrossDomainCoupler.h:87
void shareBrickZFaces(struct Ripley &r, int hasLower, int hasUpper, int lower, int upper, escript::Data &target) const
Definition CrossDomainCoupler.cpp:753
void shareWithNeighbours(bool lowerFirst, int hasLower, int hasUpper, double *bottom, double *top, double *brecv, double *trecv, int bSize, int tSize, int distance) const
Definition CrossDomainCoupler.cpp:960
void calculateOrder3(int dim, double loc, double *results) const
Definition CrossDomainCoupler.cpp:269
bool hasUpper[3]
Definition CrossDomainCoupler.h:92
void shareBrickYFaces(struct Ripley &r, int hasLower, int hasUpper, int lower, int upper, escript::Data &target) const
Definition CrossDomainCoupler.cpp:669
void calculateOrder9(int dim, double loc, double *results) const
Definition CrossDomainCoupler.cpp:350
void calculateOrder6(int dim, double loc, double *results) const
Definition CrossDomainCoupler.cpp:305
void calculateOrder5(int dim, double loc, double *results) const
Definition CrossDomainCoupler.cpp:292
SpeckleyDomain extends the AbstractContinuousDomain interface for the Speckley library and is the bas...
Definition speckley/src/SpeckleyDomain.h:86
Definition AbstractAssembler.cpp:19
bool probeInterpolationAcross(int fsType_source, const escript::AbstractDomain &domain, int fsType_target, int dim)
Definition CrossDomainCoupler.cpp:32
void interpolateAcross3D(escript::Data &target, const escript::Data &source, const Brick *speck, const double s_dx[3], int rank, MPI_Comm comm)
interpolates data given on source onto target where source and target are given on different domains
Definition CrossDomainCoupler.h:37
dim_t NE[3]
Definition CrossDomainCoupler.h:40
double dx[3]
Definition CrossDomainCoupler.h:39
const ripley::RipleyDomain * domain
Definition CrossDomainCoupler.h:38
dim_t mins[3]
Definition CrossDomainCoupler.h:41
dim_t maxs[3]
Definition CrossDomainCoupler.h:42