escript  Revision_
CrossDomainCoupler.h
Go to the documentation of this file.
1 
2 /*****************************************************************************
3 *
4 * Copyright (c) 2003-2016 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 by Centre for Geoscience Computing (GeoComp)
14 *
15 *****************************************************************************/
16 
17 #ifndef __SPECKLEY_CROSSDOMAINCOUPLER_H__
18 #define __SPECKLEY_CROSSDOMAINCOUPLER_H__
19 
20 #include <speckley/Brick.h>
21 #include <speckley/Rectangle.h>
22 
23 #include <ripley/Brick.h>
24 #include <ripley/Rectangle.h>
25 
26 namespace speckley {
27 
29 public:
30  RipleyCoupler(const SpeckleyDomain *speck, const double s_dx[2], int rank);
31 
32 
33  void interpolate(escript::Data& target, const escript::Data& source) const;
34 private:
35  // a struct type to hold all the relevant info on the target domain
36  struct Ripley {
38  double dx[3];
39  dim_t NE[3];
40  dim_t mins[3];
41  dim_t maxs[3];
42  };
43  void calculateOrder2(int dim, double loc, double *results) const;
44  void calculateOrder3(int dim, double loc, double *results) const;
45  void calculateOrder4(int dim, double loc, double *results) const;
46  void calculateOrder5(int dim, double loc, double *results) const;
47  void calculateOrder6(int dim, double loc, double *results) const;
48  void calculateOrder7(int dim, double loc, double *results) const;
49  void calculateOrder8(int dim, double loc, double *results) const;
50  void calculateOrder9(int dim, double loc, double *results) const;
51  void calculateOrder10(int dim, double loc, double *results) const;
52 
53  void generateLocations(struct Ripley& r, double **positions) const;
54 
55  bool validInterpolation(escript::Data& target, const escript::Data& source,
56  const SpeckleyDomain *speck, const double *s_dx,
57  const ripley::RipleyDomain *other) const;
58  void calculate(struct Ripley& r, dim_t ex, dim_t ey, dim_t ez,
59  int oqx, int oqy, int oqz, double *out, const double *factor_x,
60  const double *factor_y, const double *factor_z,
61  const escript::Data& source) const;
62 
63  void shareWithNeighbours(bool lowerFirst, int hasLower, int hasUpper,
64  double *bottom, double *top, double *brecv, double *trecv,
65  int bSize, int tSize, int distance) const;
66 
67  void getEdgeSpacing(struct Ripley r, int *lower, int *upper) const;
68 
69  void shareBrickXFaces(struct Ripley& r, int hasLower,
70  int hasUpper, int lower, int upper, escript::Data& target) const;
71  void shareBrickYFaces(struct Ripley& r, int hasLower,
72  int hasUpper, int lower, int upper, escript::Data& target) const;
73  void shareBrickZFaces(struct Ripley& r, int hasLower,
74  int hasUpper, int lower, int upper, escript::Data& target) const;
75 
76  void shareRectangleXEdges(struct Ripley& r, int hasLower,
77  int hasUpper, int lower, int upper, escript::Data& target) const;
78  void shareRectangleYEdges(struct Ripley& r, int hasLower,
79  int hasUpper, int lower, int upper, escript::Data& target) const;
80  //speckley info
82  dim_t s_NE[3];
83  double s_dx[3];
84  int s_NX[3];
85  double speckley_origin[3];
86  int order;
87  int numQuads;
88 
89  //coupling info
90  bool hasLower[3];
91  bool hasUpper[3];
92 
93  //per interpolation
94  mutable int numComp;
95 
96 #ifdef ESYS_MPI
97  int rank;
98  MPI_Comm comm;
99 #endif
100 
101 };
102 
108 void interpolateAcross3D(escript::Data& target, const escript::Data& source,
109  const Brick *speck, const double s_dx[3], int rank,
110  MPI_Comm comm);
111 
112 bool probeInterpolationAcross(int fsType_source,
113  const escript::AbstractDomain& domain, int fsType_target, int dim);
114 
115 } // end of namespace speckley
116 
117 #endif // __SPECKLEY_CROSSDOMAINCOUPLER_H__
118 
void calculateOrder7(int dim, double loc, double *results) const
Definition: CrossDomainCoupler.cpp:318
Definition: AbstractAssembler.cpp:18
Definition: CrossDomainCoupler.h:36
void shareBrickXFaces(struct Ripley &r, int hasLower, int hasUpper, int lower, int upper, escript::Data &target) const
Definition: CrossDomainCoupler.cpp:551
int order
Definition: CrossDomainCoupler.h:86
SpeckleyDomain extends the AbstractContinuousDomain interface for the Speckley library and is the bas...
Definition: speckley/src/SpeckleyDomain.h:84
void calculateOrder9(int dim, double loc, double *results) const
Definition: CrossDomainCoupler.cpp:349
bool probeInterpolationAcross(int fsType_source, const escript::AbstractDomain &domain, int fsType_target, int dim)
Definition: CrossDomainCoupler.cpp:31
void shareBrickYFaces(struct Ripley &r, int hasLower, int hasUpper, int lower, int upper, escript::Data &target) const
Definition: CrossDomainCoupler.cpp:668
double s_dx[3]
Definition: CrossDomainCoupler.h:83
dim_t mins[3]
Definition: CrossDomainCoupler.h:40
dim_t s_NE[3]
Definition: CrossDomainCoupler.h:82
void shareRectangleXEdges(struct Ripley &r, int hasLower, int hasUpper, int lower, int upper, escript::Data &target) const
Definition: CrossDomainCoupler.cpp:821
int numQuads
Definition: CrossDomainCoupler.h:87
Definition: CrossDomainCoupler.h:28
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 ...
void shareRectangleYEdges(struct Ripley &r, int hasLower, int hasUpper, int lower, int upper, escript::Data &target) const
Definition: CrossDomainCoupler.cpp:899
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:408
double speckley_origin[3]
Definition: CrossDomainCoupler.h:85
dim_t NE[3]
Definition: CrossDomainCoupler.h:39
const ripley::RipleyDomain * domain
Definition: CrossDomainCoupler.h:37
RipleyCoupler(const SpeckleyDomain *speck, const double s_dx[2], int rank)
Definition: CrossDomainCoupler.cpp:45
dim_t maxs[3]
Definition: CrossDomainCoupler.h:41
void calculateOrder8(int dim, double loc, double *results) const
Definition: CrossDomainCoupler.cpp:333
bool hasLower[3]
Definition: CrossDomainCoupler.h:90
void calculateOrder10(int dim, double loc, double *results) const
Definition: CrossDomainCoupler.cpp:366
int numComp
Definition: CrossDomainCoupler.h:94
Data represents a collection of datapoints.
Definition: Data.h:63
void calculateOrder6(int dim, double loc, double *results) const
Definition: CrossDomainCoupler.cpp:304
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:959
void calculateOrder3(int dim, double loc, double *results) const
Definition: CrossDomainCoupler.cpp:268
RipleyDomain extends the AbstractContinuousDomain interface for the Ripley library and is the base cl...
Definition: ripley/src/RipleyDomain.h:101
int MPI_Comm
Definition: EsysMPI.h:41
double dx[3]
Definition: CrossDomainCoupler.h:38
void shareBrickZFaces(struct Ripley &r, int hasLower, int hasUpper, int lower, int upper, escript::Data &target) const
Definition: CrossDomainCoupler.cpp:752
void generateLocations(struct Ripley &r, double **positions) const
Definition: CrossDomainCoupler.cpp:132
bool validInterpolation(escript::Data &target, const escript::Data &source, const SpeckleyDomain *speck, const double *s_dx, const ripley::RipleyDomain *other) const
Definition: CrossDomainCoupler.cpp:74
bool hasUpper[3]
Definition: CrossDomainCoupler.h:91
const SpeckleyDomain * speck
Definition: CrossDomainCoupler.h:81
Brick is the 3-dimensional implementation of a SpeckleyDomain.
Definition: speckley/src/Brick.h:32
void getEdgeSpacing(struct Ripley r, int *lower, int *upper) const
Definition: CrossDomainCoupler.cpp:384
void calculateOrder4(int dim, double loc, double *results) const
Definition: CrossDomainCoupler.cpp:279
void calculateOrder5(int dim, double loc, double *results) const
Definition: CrossDomainCoupler.cpp:291
Base class for all escript domains.
Definition: AbstractDomain.h:45
void interpolate(escript::Data &target, const escript::Data &source) const
Definition: CrossDomainCoupler.cpp:452
int s_NX[3]
Definition: CrossDomainCoupler.h:84
void calculateOrder2(int dim, double loc, double *results) const
Definition: CrossDomainCoupler.cpp:258
index_t dim_t
Definition: DataTypes.h:64