PlasCom2  1.0
XPACC Multi-physics simluation application
TestFixtures.H
Go to the documentation of this file.
1 #ifndef __TEST_FIXTURES_H__
2 #define __TEST_FIXTURES_H__
3 
4 
5 #include "WENO.H"
6 
7 namespace testfixtures {
8 
9  template<typename GridType>
10  int CreateSimpleGrid(GridType &inGrid,
11  const std::vector<size_t> &gridSizes)
12  {
13  int numDim = gridSizes.size();
14  std::vector<double> dX(numDim,0);
15  size_t numGlobalNodes = 1;
16  size_t numGlobalCells = 1;
17 
18  for(int iDim = 0;iDim < numDim;iDim++){
19  numGlobalNodes *= gridSizes[iDim];
20  numGlobalCells *= (gridSizes[iDim]-1);
21  dX[iDim] = 1.0/static_cast<double>(gridSizes[iDim]-1);
22  }
23 
24  inGrid.SetGridSizes(gridSizes);
25  inGrid.SetGridSpacings(dX);
26  inGrid.Finalize();
27  return(0);
28  };
29 
30  template<typename GridType,typename HaloType>
31  int CreateSimulationFixtures(GridType &inGrid,HaloType &inHalo,
33  const std::vector<size_t> &gridSizes,
34  int interiorOrder,
35  pcpp::CommunicatorType &inComm,
36  std::ostream *messageStreamPtr = NULL)
37  {
38 
39  int numProc = inComm.Size();
40  int myRank = inComm.Rank();
41  inGrid.SetType(simulation::grid::UNIRECT);
42 
43  if(!messageStreamPtr)
44  messageStreamPtr = &std::cout;
45 
46  pcpp::CommunicatorType &gridComm(inGrid.Communicator());
47 
48  int numDim = gridSizes.size();
49  std::vector<double> dX(numDim,0);
50  std::vector<double> physicalExtent(2*numDim,1.0);
51  size_t numGlobalNodes = 1;
52  size_t numGlobalCells = 1;
53 
54  for(int iDim = 0;iDim < numDim;iDim++){
55  physicalExtent[2*iDim] = 0.0;
56  numGlobalNodes *= gridSizes[iDim];
57  numGlobalCells *= (gridSizes[iDim]-1);
58  dX[iDim] = 1.0/static_cast<double>(gridSizes[iDim]-1);
59  }
60 
61  inGrid.SetGridSizes(gridSizes);
62  inGrid.SetGridSpacings(dX);
63  inGrid.SetPhysicalExtent(physicalExtent);
64 
65 
66  plascom2::operators::sbp::Initialize(inOperator,interiorOrder);
67  int boundaryDepth = (inOperator.numStencils-1)/2;
68  std::vector<int> haloDepths(2*numDim,boundaryDepth);
69 
71  cartInfo.numDimensions = numDim;
73  pbsCartInfo.numDimensions = numDim;
74  pbsCartInfo.isPeriodic.resize(numDim,1);
75  pcpp::comm::SetupCartesianTopology(inComm,pbsCartInfo,gridComm,*messageStreamPtr);
76 
77  // Grab the local coordinates and global dimension of the Cartesian topo
78  std::vector<int> &cartCoords(gridComm.CartCoordinates());
79  std::vector<int> &cartDims(gridComm.CartDimensions());
80 
81  // Generate a report of the Cartesian setup and put it the messageStream
82  pcpp::report::CartesianSetup(*messageStreamPtr,pbsCartInfo);
83 
84  pcpp::IndexIntervalType &partitionInterval(inGrid.PartitionInterval());
85  pcpp::IndexIntervalType globalInterval;
86  globalInterval.InitSimple(gridSizes);
87 
88  // === Partition the grid ===
89  if(pcpp::util::PartitionCartesianInterval(globalInterval,cartDims,cartCoords,
90  partitionInterval,*messageStreamPtr)){
91  *messageStreamPtr << "TestFixtures:SetupSimulationFixtures:Error: Partitioning failed." << std::endl;
92  return(1);
93  }
94 
95  std::vector<size_t> extendGrid(2*numDim,0);
96  std::vector<bool> isPeriodic(numDim,true);
97  size_t numPointsPart = partitionInterval.NNodes();
98  std::vector<bool> haveNeighbors(2*numDim,true);
99 
100  for(int iDim = 0;iDim < numDim; iDim++){
101  if(isPeriodic[iDim]){
102  extendGrid[2*iDim] = haloDepths[2*iDim];
103  extendGrid[2*iDim+1] = haloDepths[2*iDim+1];
104  } else {
105  if(partitionInterval[iDim].first == 0) {
106  haveNeighbors[2*iDim] = false;
107  } else {
108  extendGrid[2*iDim] = haloDepths[2*iDim];
109  }
110  if(partitionInterval[iDim].second == (gridSizes[iDim]-1)){
111  haveNeighbors[2*iDim+1] = false;
112  } else {
113  extendGrid[2*iDim + 1] = haloDepths[2*iDim+1];
114  }
115  }
116  }
117 
118  inGrid.SetDimensionExtensions(extendGrid);
119 
120  if(inGrid.Finalize()){
121  *messageStreamPtr << "TestFixtures:SetupSimulationFixtures:Error: Grid finalization failed." << std::endl;
122  return(1);
123  }
124 
125  inGrid.GenerateCoordinates(*messageStreamPtr);
126 
127  const std::vector<size_t> &bufferSizes(inGrid.BufferSizes());
128  const pcpp::IndexIntervalType &partitionBufferInterval(inGrid.PartitionBufferInterval());
129  size_t numPointsBuffer = inGrid.BufferSize();
130 
131  // Set up the HALO data structure
132  // halo_t testHalo(globalInterval,pbsPartInterval);
133  inHalo.SetGridInterval(globalInterval);
134  inHalo.SetPartitionInterval(partitionInterval);
135 
136  // This forces the halo to have neighbors even on
137  // partitions with domain boundaries.
138  inHalo.SetNeighbors(haveNeighbors);
139  inHalo.SetPeriodicDirs(pbsCartInfo.isPeriodic);
140 
141  std::vector<pcpp::IndexIntervalType> remoteHaloExtents(inHalo.CreateRemoteHaloExtents(extendGrid));
142  std::vector<pcpp::IndexIntervalType> localHaloExtents(inHalo.CreateLocalHaloExtents(extendGrid));
143 
144  inHalo.SetLocalBufferSizes(bufferSizes);
145  inHalo.SetLocalPartitionExtent(partitionBufferInterval);
146 
147  inHalo.SetRemoteHaloExtents(remoteHaloExtents);
148  inHalo.SetLocalHaloExtents(localHaloExtents);
149 
150  const std::vector<pcpp::IndexIntervalType> &remoteHaloBufferExtents(inHalo.RemoteHaloBufferExtents());
151  const std::vector<pcpp::IndexIntervalType> &localHaloBufferExtents(inHalo.LocalHaloBufferExtents());
152 
153  inHalo.CreateSimpleSendIndices();
154  inHalo.CreateSimpleRecvIndices();
155 
156  return(0);
157 
158  };
159 
160  template<typename GridType,typename HaloType>
161  int CreateSimulationFixtures(GridType &inGrid,HaloType &inHalo,
162  plascom2::operators::sbp::base &inOperator,
163  WENO::CoeffsWENO &coeffsWENO,
164  const std::vector<size_t> &gridSizes,
165  int interiorOrder,
166  pcpp::CommunicatorType &inComm,
167  std::ostream *messageStreamPtr = NULL)
168  {
169 
170  int numProc = inComm.Size();
171  int myRank = inComm.Rank();
172 
173  if(!messageStreamPtr)
174  messageStreamPtr = &std::cout;
175 
176  pcpp::CommunicatorType &gridComm(inGrid.Communicator());
177  inGrid.SetType(simulation::grid::UNIRECT);
178  int numDim = gridSizes.size();
179  std::vector<double> dX(numDim,0);
180  size_t numGlobalNodes = 1;
181  size_t numGlobalCells = 1;
182 
183  std::vector<double> &physicalExtent(inGrid.PhysicalExtent());
184  if(physicalExtent.empty()){
185  physicalExtent.resize(numDim*2,0);
186  for(int iDim = 0;iDim < numDim;iDim++)
187  physicalExtent[2*iDim+1] = 20.0;
188  }
189 
190  for(int iDim = 0;iDim < numDim;iDim++){
191  numGlobalNodes *= gridSizes[iDim];
192  numGlobalCells *= (gridSizes[iDim]-1);
193  dX[iDim] = (physicalExtent[2*iDim+1] - physicalExtent[2*iDim])/static_cast<double>(gridSizes[iDim]-1);
194  }
195 
196  inGrid.SetGridSizes(gridSizes);
197  inGrid.SetGridSpacings(dX);
198 
199  plascom2::operators::sbp::Initialize(inOperator,interiorOrder);
200  int boundaryDepth = coeffsWENO.HaloWidth();
201  int boundaryWidth = inOperator.boundaryWidth;
202  boundaryDepth = std::max(boundaryWidth,boundaryDepth);
203 
204  std::vector<int> haloDepths(2*numDim,boundaryDepth);
205 
207  cartInfo.numDimensions = numDim;
208  pcpp::ParallelTopologyInfoType pbsCartInfo;
209  pbsCartInfo.numDimensions = numDim;
210  pbsCartInfo.isPeriodic.resize(numDim,1);
211  pcpp::comm::SetupCartesianTopology(inComm,pbsCartInfo,gridComm,*messageStreamPtr);
212 
213  // Grab the local coordinates and global dimension of the Cartesian topo
214  std::vector<int> &cartCoords(gridComm.CartCoordinates());
215  std::vector<int> &cartDims(gridComm.CartDimensions());
216 
217  // Generate a report of the Cartesian setup and put it the messageStream
218  pcpp::report::CartesianSetup(*messageStreamPtr,pbsCartInfo);
219 
220  pcpp::IndexIntervalType &partitionInterval(inGrid.PartitionInterval());
221  pcpp::IndexIntervalType globalInterval;
222  globalInterval.InitSimple(gridSizes);
223 
224  // === Partition the grid ===
225  if(pcpp::util::PartitionCartesianInterval(globalInterval,cartDims,cartCoords,
226  partitionInterval,*messageStreamPtr)){
227  *messageStreamPtr << "TestFixtures:SetupSimulationFixtures:Error: Partitioning failed." << std::endl;
228  return(1);
229  }
230 
231  std::vector<size_t> extendGrid(2*numDim,0);
232  std::vector<bool> isPeriodic(numDim,true);
233  size_t numPointsPart = partitionInterval.NNodes();
234 
235  for(int iDim = 0;iDim < numDim; iDim++){
236  if(isPeriodic[iDim]){
237  extendGrid[2*iDim] = haloDepths[2*iDim];
238  extendGrid[2*iDim+1] = haloDepths[2*iDim+1];
239  } else {
240  if(partitionInterval[iDim].first != 0)
241  extendGrid[2*iDim] = haloDepths[2*iDim];
242  if(partitionInterval[iDim].second != (gridSizes[iDim]-1))
243  extendGrid[2*iDim + 1] = haloDepths[2*iDim+1];
244  }
245  }
246 
247  inGrid.SetDimensionExtensions(extendGrid);
248  if(inGrid.Finalize()){
249  *messageStreamPtr << "TestFixtures:SetupSimulationFixtures:Error: Grid finalization failed." << std::endl;
250  return(1);
251  }
252 
253  const std::vector<size_t> &bufferSizes(inGrid.BufferSizes());
254  const pcpp::IndexIntervalType &partitionBufferInterval(inGrid.PartitionBufferInterval());
255  size_t numPointsBuffer = inGrid.BufferSize();
256 
257  // Set up the HALO data structure
258  // halo_t testHalo(globalInterval,pbsPartInterval);
259  inHalo.SetGridInterval(globalInterval);
260  inHalo.SetPartitionInterval(partitionInterval);
261 
262  // This forces the halo to have neighbors even on
263  // partitions with domain boundaries.
264  std::vector<bool> haveNeighbors(2*numDim,true);
265  inHalo.SetNeighbors(haveNeighbors);
266  inHalo.SetPeriodicDirs(pbsCartInfo.isPeriodic);
267 
268  std::vector<pcpp::IndexIntervalType> remoteHaloExtents(inHalo.CreateRemoteHaloExtents(extendGrid));
269  std::vector<pcpp::IndexIntervalType> localHaloExtents(inHalo.CreateLocalHaloExtents(extendGrid));
270 
271  inHalo.SetLocalBufferSizes(bufferSizes);
272  inHalo.SetLocalPartitionExtent(partitionBufferInterval);
273 
274  inHalo.SetRemoteHaloExtents(remoteHaloExtents);
275  inHalo.SetLocalHaloExtents(localHaloExtents);
276 
277  const std::vector<pcpp::IndexIntervalType> &remoteHaloBufferExtents(inHalo.RemoteHaloBufferExtents());
278  const std::vector<pcpp::IndexIntervalType> &localHaloBufferExtents(inHalo.LocalHaloBufferExtents());
279 
280  inHalo.CreateSimpleSendIndices();
281  inHalo.CreateSimpleRecvIndices();
282 
283  return(0);
284 
285  };
286 
287  template<typename GridType>
288  int CreateSerialSimulationFixtures(GridType &inGrid,
289  plascom2::operators::sbp::base &inOperator,
290  const std::vector<size_t> &gridSizes,
291  int interiorOrder,
292  std::ostream *messageStreamPtr = NULL)
293  {
294 
295 
296  if(!messageStreamPtr)
297  messageStreamPtr = &std::cout;
298 
299  int numDim = gridSizes.size();
300  std::vector<double> dX(numDim,0);
301  size_t numGlobalNodes = 1;
302  size_t numGlobalCells = 1;
303  inGrid.SetType(simulation::grid::UNIRECT);
304 
305  for(int iDim = 0;iDim < numDim;iDim++){
306  numGlobalNodes *= gridSizes[iDim];
307  numGlobalCells *= (gridSizes[iDim]-1);
308  dX[iDim] = 1.0/static_cast<double>(gridSizes[iDim]-1);
309  }
310 
311  inGrid.SetGridSizes(gridSizes);
312 
313  plascom2::operators::sbp::Initialize(inOperator,interiorOrder);
314  int boundaryDepth = (inOperator.numStencils-1)/2;
315  std::vector<int> haloDepths(2*numDim,boundaryDepth);
316 
317  pcpp::IndexIntervalType &partitionInterval(inGrid.PartitionInterval());
318  pcpp::IndexIntervalType globalInterval;
319  globalInterval.InitSimple(gridSizes);
320 
321  std::vector<size_t> extendGrid(2*numDim,0);
322  std::vector<bool> isPeriodic(numDim,true);
323  size_t numPointsPart = partitionInterval.NNodes();
324 
325  for(int iDim = 0;iDim < numDim; iDim++){
326  if(isPeriodic[iDim]){
327  extendGrid[2*iDim] = haloDepths[2*iDim];
328  extendGrid[2*iDim+1] = haloDepths[2*iDim+1];
329  } else {
330  if(partitionInterval[iDim].first == 0)
331  extendGrid[2*iDim] = haloDepths[2*iDim];
332  if(partitionInterval[iDim].second == (gridSizes[iDim]-1))
333  extendGrid[2*iDim + 1] = haloDepths[2*iDim+1];
334  }
335  }
336 
337  inGrid.SetDimensionExtensions(extendGrid);
338  if(inGrid.Finalize()){
339  *messageStreamPtr << "TestFixtures:SetupSimulationFixtures:Error: Grid finalization failed." << std::endl;
340  return(1);
341  }
342 
343  const std::vector<size_t> &bufferSizes(inGrid.BufferSizes());
344  const pcpp::IndexIntervalType &partitionBufferInterval(inGrid.PartitionBufferInterval());
345  size_t numPointsBuffer = inGrid.BufferSize();
346 
347  return(0);
348 
349  };
350 }
351 #endif
int CreateSimpleGrid(GridType &inGrid, const std::vector< size_t > &gridSizes)
Definition: TestFixtures.H:10
void const size_t const size_t * gridSizes
Definition: EulerKernels.H:10
void CartesianSetup(std::ostream &outStream, const std::vector< int > &cartCoords, const std::vector< int > &cartDims)
Definition: PCPPReport.C:199
std::vector< int > isPeriodic
Definition: PCPPCommUtil.H:24
int CreateSerialSimulationFixtures(GridType &inGrid, plascom2::operators::sbp::base &inOperator, const std::vector< size_t > &gridSizes, int interiorOrder, std::ostream *messageStreamPtr=NULL)
Definition: TestFixtures.H:288
int HaloWidth()
Definition: WENO.H:257
Main encapsulation of MPI.
Definition: COMM.H:62
Encapsulation for a collection of operator stencils.
Definition: Stencil.H:26
int CreateSimulationFixtures(GridType &inGrid, HaloType &inHalo, plascom2::operators::sbp::base &inOperator, const std::vector< size_t > &gridSizes, int interiorOrder, pcpp::CommunicatorType &inComm, std::ostream *messageStreamPtr=NULL)
Definition: TestFixtures.H:31
void const size_t const size_t * bufferSizes
Definition: MetricKernels.H:19
int PartitionCartesianInterval(const pcpp::IndexIntervalType &globalExtent, const std::vector< int > &cartDims, const std::vector< int > &cartCoords, pcpp::IndexIntervalType &partExtent, std::ostream &messageStream)
Get local sub-interval of an n-dimensional integer interval.
int boundaryWidth
Boundary width is the size of the on-boundary stencil.
Definition: Stencil.H:116
int SetupCartesianTopology(pcpp::CommunicatorType &parallelCommunicator, pcpp::ParallelTopologyInfoType &topologyInfo, pcpp::CommunicatorType &topoCommunicator, std::ostream &messageStream)
Sets up a communicator with Cartesian topology.
Definition: PCPPCommUtil.C:48
int numStencils
The number of stencils (e.g. interior + boundary)
Definition: Stencil.H:93
int Initialize(base &stencilSet, int interiorOrder)
Initialize the sbp::base stencilset with the SBP operator of given order.
Definition: Stencil.C:360
Simple Block Structured Mesh object.
Definition: IndexUtil.H:21
void InitSimple(const ContainerType &inSize)
Definition: IndexUtil.H:169
void const size_t * numPointsBuffer
Definition: MetricKernels.H:19