PlasCom2  1.0
XPACC Multi-physics simluation application
Stencil.H
Go to the documentation of this file.
1 #ifndef __STENCIL_H__
2 #define __STENCIL_H__
3 
4 #include "PCPPTypes.H"
5 
6 #include <cstdlib>
7 #include <vector>
8 #include <cmath>
9 #include <list>
10 
13 namespace plascom2 {
14 
17  namespace operators {
18 
26  struct stencilset {
29  stencilSizes(NULL), stencilStarts(NULL),
30  stencilOffsets(NULL),stencilWeights(NULL),
31  overallOrder(0), stencilOrders(NULL) {};
32 
34  void Copy(const stencilset &inStencilSet) {
35 
36  Destroy();
37 
38  numStencils = inStencilSet.numStencils;
39  numValues = inStencilSet.numValues;
40  ownData = true;
41  overallOrder = inStencilSet.overallOrder;
42 
43  stencilSizes = new int [numStencils];
44  stencilStarts = new int [numStencils];
45  stencilOffsets = new int [numValues];
46  stencilWeights = new double [numValues];
47 
48  for(int iStencil = 0;iStencil < numStencils;iStencil++){
49  stencilSizes[iStencil] = inStencilSet.stencilSizes[iStencil];
50  stencilStarts[iStencil] = inStencilSet.stencilStarts[iStencil];
51  }
52 
53  // some things that use stencilset don't care about stencilOrders
54  if (inStencilSet.stencilOrders) {
55  stencilOrders = new int [numStencils];
56  for(int iStencil = 0;iStencil < numStencils;iStencil++){
57  stencilOrders[iStencil] = inStencilSet.stencilOrders[iStencil];
58  }
59  }
60 
61  for(int iVal = 0;iVal < numValues;iVal++){
62  stencilOffsets[iVal] = inStencilSet.stencilOffsets[iVal];
63  stencilWeights[iVal] = inStencilSet.stencilWeights[iVal];
64  }
65 
66  boundaryWeight = inStencilSet.boundaryWeight;
67  boundaryDepth = inStencilSet.boundaryDepth;
68  boundaryWidth = inStencilSet.boundaryWidth;
69 
70  }
71 
73  void Destroy() {
74  if(ownData) {
75  delete [] stencilSizes;
76  delete [] stencilStarts;
77  delete [] stencilOffsets;
78  delete [] stencilWeights;
79  delete [] stencilOrders;
80  stencilSizes = NULL;
81  stencilStarts = NULL;
82  stencilOffsets = NULL;
83  stencilWeights = NULL;
84  stencilOrders = NULL;
85  boundaryWeight = 0.0;
86  boundaryDepth = 0;
87  boundaryWidth = 0;
88  overallOrder = 0;
89  }
90  };
91 
93  ~stencilset() { Destroy(); };
94 
96  int numStencils;
98  int numValues;
100  bool ownData;
108  double *stencilWeights;
119  };
120 
123  namespace sbp {
124 
125  bool IsValidOrder(int overallOrder);
126 
141  typedef stencilset base;
142 
144  int Initialize(base &stencilSet,int interiorOrder);
145 
148  void OperatorSetup(base &stencilSet, int interiorOrder, int boundaryDepth,
149  int boundaryWidth, double boundaryWeight, std::vector<double> centralWeightsRight,
150  std::vector<std::vector<double> > leftWeights, std::vector<int> leftOrders);
151 
188  int BruteTest1(base &inOperator,int interiorOrder,int numDim,
189  int numComponents,int numTrials,std::vector<bool> &testResults);
190 
215  int CreateStencilConnectivity(int numDim,size_t *dimSizes,size_t *opInterval,int boundaryDepth,
216  int *stencilID, bool fortranInterval=false);
217 
218 
244  int CreateStencilConnectivity(int numDim,size_t *dimSizes,size_t *opInterval,int boundaryDepth,
245  int *periodicDirs,int *stencilID, bool fortranInterval=false);
246 
265  int InvertStencilConnectivity(int numDim,size_t *dimSizes,size_t *opInterval,int numStencils,int *stencilID,
266  size_t *dualStencilConn,size_t *numPointsStencil,bool fortranInterval=false);
267 
282  int BoundaryStencilConnectivity(std::vector<size_t> &bufferSizes,
283  pcpp::IndexIntervalType &partitionInterval,
284  pcpp::IndexIntervalType &partitionBufferInterval,
285  pcpp::IndexIntervalType &boundaryInterval,
286  int boundaryDepth,int boundaryDirection,
287  int *stencilConnectivity);
288 
289 
303  int HoleStencilConnectivity(std::vector<size_t> &bufferSizes,
304  pcpp::IndexIntervalType &partitionInterval,
305  pcpp::IndexIntervalType &partitionBufferInterval,
306  pcpp::IndexIntervalType &holeInterval,
307  int holeStencil,
308  int *stencilConnectivity);
309 
310 
311  int MaskStencilConnectivity(int numDim,size_t *dimSizes,size_t *opInterval,
312  int boundaryDepth,int boundaryStart,int holeBit,
313  int *inMask,int *stencilID);
314 
316  int DetectHoles(int numDim,size_t *dimSizes,size_t *opInterval,
317  int boundaryDepth,int holeBit,int *inMask,int *stencilID);
318 
319  }
320 
321  namespace dissipation {
322  int Initialize(stencilset &stencilSet1,stencilset &stencilSet2,int interiorOrder);
323  }
324 
325  }
326 
327 }
328 namespace mask {
329 
331 
332  void SetMask(const std::vector<size_t> &opIndices,int maskBits,int *inMask);
333  void SetMask(const std::vector<size_t> &bufferSizes,
335  int maskBits,int *inMask);
336  void UnSetMask(const std::vector<size_t> &opIndices,int maskBits,int *inMask);
337  void UnSetMask(const std::vector<size_t> &bufferSizes,
338  const pcpp::IndexIntervalType &opInterval,
339  int maskBits,int *inMask);
340 }
341 
342 
343 
344 
345 #endif
int InvertStencilConnectivity(int numDim, size_t *dimSizes, size_t *opInterval, int numStencils, int *stencilID, size_t *dualStencilConn, size_t *numPointsStencil, bool fortranInterval=false)
Inverts stencil connectivity to populate the so-called dual stencil connectivity
Definition: Stencil.C:1739
int CreateStencilConnectivity(int numDim, size_t *dimSizes, size_t *opInterval, int boundaryDepth, int *periodicDirs, int *stencilID, bool fortranInterval=false)
Creates simple stencil connectivity assuming all domain boundaries are either periodic or physical bo...
Definition: Stencil.C:968
int * stencilSizes
The number of weights for each stencil.
Definition: Stencil.H:102
int BoundaryStencilConnectivity(std::vector< size_t > &bufferSizes, pcpp::IndexIntervalType &partitionInterval, pcpp::IndexIntervalType &partitionBufferInterval, pcpp::IndexIntervalType &boundaryInterval, int boundaryDepth, int boundaryDirection, int *stencilConnectivity)
Update a stencil connectivity with a boundary.
Definition: Stencil.C:1114
void Copy(const stencilset &inStencilSet)
Copy a stencil.
Definition: Stencil.H:34
int * stencilStarts
The starting index into the stencilWeight and stencilOffset arrays for each stencil.
Definition: Stencil.H:104
int * stencilOffsets
The offsets wrt the grid point at which the stencil is being applied.
Definition: Stencil.H:106
void SetMask(const std::vector< size_t > &bufferSizes, const pcpp::IndexIntervalType &opInterval, int maskBits, int *inMask)
Definition: Stencil.C:1856
Definition: PC2IO.H:10
void const size_t const size_t const size_t * opInterval
Definition: EulerKernels.H:10
int BruteTest1(base &inOperator, int interiorOrder, int numDim, int numComponents, int numTrials, std::vector< bool > &testResults)
Brute-force accuracy test for SBP operators.
Definition: Stencil.C:625
void double double double double double double double *void const size_t * dimSizes
Definition: SATKernels.H:48
int DetectHoles(int numDim, size_t *dimSizes, size_t *opInterval, int boundaryDepth, int holeBit, int *inMask, int *stencilID)
Detect unstructured holes and set up boundary stencil id&#39;s accordingly.
Definition: Stencil.C:1454
int MaskStencilConnectivity(int numDim, size_t *dimSizes, size_t *opInterval, int boundaryDepth, int boundaryStart, int holeBit, int *inMask, int *stencilID)
Definition: Stencil.C:1381
int HoleStencilConnectivity(std::vector< size_t > &bufferSizes, pcpp::IndexIntervalType &partitionInterval, pcpp::IndexIntervalType &partitionBufferInterval, pcpp::IndexIntervalType &holeInterval, int holeStencil, int *stencilConnectivity)
Update a stencil connectivity with a hole.
Definition: Stencil.C:1230
stencilset base
The sbp::base is an SBP-specific stencilset.
Definition: Stencil.H:141
int Initialize(stencilset &stencilSet1, stencilset &stencilSet2, int interiorOrder)
Definition: Stencil.C:29
void size_t int size_t int size_t int int int int double int int * stencilID
int * stencilOrders
Boundary weight needed by BC&#39;s.
Definition: Stencil.H:110
Encapsulation for a collection of operator stencils.
Definition: Stencil.H:26
int numValues
The total number of weights for all stencils (reqd for Fortran)
Definition: Stencil.H:98
maskbits
Definition: Stencil.H:330
void const size_t const size_t * bufferSizes
Definition: MetricKernels.H:19
void Destroy()
Destroy utility destroys the stencil set memory.
Definition: Stencil.H:73
bool IsValidOrder(int overallOrder)
Definition: Stencil.C:352
bool ownData
Indicates whether this data structure owns the stencil memory.
Definition: Stencil.H:100
int boundaryWidth
Boundary width is the size of the on-boundary stencil.
Definition: Stencil.H:116
double * stencilWeights
The stencil weights.
Definition: Stencil.H:108
int numStencils
The number of stencils (e.g. interior + boundary)
Definition: Stencil.H:93
double boundaryWeight
The order of accuracy for each stencil.
Definition: Stencil.H:112
Definition: Stencil.H:328
Simple Block Structured Mesh object.
Definition: IndexUtil.H:21
void size_t int * numComponents
void OperatorSetup(base &stencilSet, int interiorOrder, int boundaryDepth, int boundaryWidth, double boundaryWeight, std::vector< double > centralWeightsRight, std::vector< std::vector< double > > leftWeights, std::vector< int > leftOrders)
Setup the SBP operator given the appropriate coefficients – called from Initialize.
Definition: Stencil.C:485
int boundaryDepth
Boundary depth is the number of biased boundary stencils for one boundary.
Definition: Stencil.H:114
stencilset()
Constructor.
Definition: Stencil.H:28
int overallOrder
The overall order of the scheme this stencil implements.
Definition: Stencil.H:118
void UnSetMask(const std::vector< size_t > &bufferSizes, const pcpp::IndexIntervalType &opInterval, int maskBits, int *inMask)
Definition: Stencil.C:1879