10 #ifndef SFCSORTBENCH_RKTRANSPORTUTILS_H 11 #define SFCSORTBENCH_RKTRANSPORTUTILS_H 17 #include "fdCoefficient.h" 21 static const Point domain_min(-M_PI,-M_PI,-M_PI);
22 static const Point domain_max(M_PI,M_PI,M_PI);
34 void grad(
const ot::Mesh* pMesh,
unsigned int dir,
const T* uZipIn,T* uZipOut);
38 void grad(
const ot::Mesh* pMesh,
unsigned int dir,
const T* uZipIn,T* uZipOut)
45 unsigned int blkNpe_1D;
47 unsigned int grid_min=0;
48 unsigned int grid_max=(1u<<m_uiMaxDepth);
49 unsigned int paddWidth;
50 const unsigned int stencilSz=5;
51 unsigned int lx,ly,lz,offset;
59 for(
unsigned int blk=0;blk<blkList.size();blk++)
62 blkNode=blkList[blk].getBlockNode();
63 paddWidth=blkList[blk].get1DPadWidth();
64 blkNpe_1D=blkList[blk].get1DArraySize();
65 h=1.0/(blkList[blk].computeDx(adv_param::domain_min,adv_param::domain_max));
67 lx=blkList[blk].getAllocationSzX();
68 ly=blkList[blk].getAllocationSzY();
69 lz=blkList[blk].getAllocationSzZ();
71 offset=blkList[blk].getOffset();
74 assert(blkNpe_1D>paddWidth);
76 if(blkNode.
minX()==grid_min)
79 for(
unsigned int k=paddWidth;k<(blkNpe_1D-paddWidth);k++)
80 for(
unsigned int j=paddWidth;j<(blkNpe_1D-paddWidth);j++)
82 uZipOut[offset+k*(ly*lx)+j*(lx)+paddWidth]=0;
83 for(
unsigned int index=0;index<stencilSz;index++)
84 uZipOut[offset+k*(ly*lx)+j*(lx)+paddWidth]+=fd::D1_ORDER_4_FORWARD[index]*uZipIn[offset+k*(ly*lx)+j*(lx)+paddWidth+index]*h;
88 for(
unsigned int k=paddWidth;k<(blkNpe_1D-paddWidth);k++)
89 for(
unsigned int j=paddWidth;j<(blkNpe_1D-paddWidth);j++)
90 for(
unsigned int i=(paddWidth+1);i<(2*paddWidth);i++)
92 uZipOut[offset+k*(ly*lx)+j*(lx)+i]=0;
93 for(
unsigned int index=0;index<stencilSz;index++)
94 uZipOut[offset+k*(ly*lx)+j*(lx)+i]+=fd::D1_ORDER_4_UPWIND[index]*uZipIn[offset+k*(ly*lx)+j*(lx)+i+index-1]*h;
99 for(
unsigned int k=paddWidth;k<(blkNpe_1D-paddWidth);k++)
100 for(
unsigned int j=paddWidth;j<(blkNpe_1D-paddWidth);j++)
101 for(
unsigned int i=2*paddWidth;i<(blkNpe_1D-2*paddWidth);i++)
103 uZipOut[offset+k*(ly*lx)+j*(lx)+i]=0;
104 for(
unsigned int index=0;index<stencilSz;index++)
105 uZipOut[offset+k*(ly*lx)+j*(lx)+i]+=fd::D1_ORDER_4_CENTERED[index]*uZipIn[offset+k*(ly*lx)+j*(lx)+i+index-2]*h;
110 if(blkNode.maxX()==grid_max)
112 for(
unsigned int k=paddWidth;k<(blkNpe_1D-paddWidth);k++)
113 for(
unsigned int j=paddWidth;j<(blkNpe_1D-paddWidth);j++)
114 for(
unsigned int i=(blkNpe_1D-2*paddWidth);i<(blkNpe_1D-paddWidth-1);i++)
116 uZipOut[offset+k*(ly*lx)+j*(lx)+i]=0;
117 for(
unsigned int index=0;index<stencilSz;index++)
118 uZipOut[offset+k*(ly*lx)+j*(lx)+i]+=fd::D1_ORDER_4_DOWNWIND[index]*uZipIn[offset+k*(ly*lx)+j*(lx)+i+index-3]*h;
123 for(
unsigned int k=paddWidth;k<(blkNpe_1D-paddWidth);k++)
124 for(
unsigned int j=paddWidth;j<(blkNpe_1D-paddWidth);j++)
126 uZipOut[offset+k*(ly*lx)+j*(lx)+(blkNpe_1D-paddWidth-1)]=0;
127 for(
unsigned int index=0;index<stencilSz;index++)
128 uZipOut[offset+k*(ly*lx)+j*(lx)+(blkNpe_1D-paddWidth-1)]+=fd::D1_ORDER_4_BACKWARD[index]*uZipIn[offset+k*(ly*lx)+j*(lx)+(blkNpe_1D-paddWidth-1)+index-4]*h;
135 assert(blkNode.maxX()<grid_max);
136 for(
unsigned int k=paddWidth;k<(blkNpe_1D-paddWidth);k++)
137 for(
unsigned int j=paddWidth;j<(blkNpe_1D-paddWidth);j++)
138 for(
unsigned int i=(blkNpe_1D-2*paddWidth);i<(blkNpe_1D-paddWidth);i++)
140 uZipOut[offset+k*(ly*lx)+j*(lx)+i]=0;
141 for(
unsigned int index=0;index<stencilSz;index++)
142 uZipOut[offset+k*(ly*lx)+j*(lx)+i]+=fd::D1_ORDER_4_CENTERED[index]*uZipIn[offset+k*(ly*lx)+j*(lx)+i+index-2]*h;
148 }
else if(blkNode.maxX()==grid_max)
151 assert(blkNode.
minX()>grid_min);
152 assert((blkNpe_1D-2*paddWidth));
154 for(
unsigned int k=paddWidth;k<(blkNpe_1D-paddWidth);k++)
155 for(
unsigned int j=paddWidth;j<(blkNpe_1D-paddWidth);j++)
156 for(
unsigned int i=paddWidth;i<(blkNpe_1D-2*paddWidth);i++)
158 uZipOut[offset+k*(ly*lx)+j*(lx)+i]=0;
159 for(
unsigned int index=0;index<stencilSz;index++)
160 uZipOut[offset+k*(ly*lx)+j*(lx)+i]+=fd::D1_ORDER_4_CENTERED[index]*uZipIn[offset+k*(ly*lx)+j*(lx)+i+index-2]*h;
165 for(
unsigned int k=paddWidth;k<(blkNpe_1D-paddWidth);k++)
166 for(
unsigned int j=paddWidth;j<(blkNpe_1D-paddWidth);j++)
167 for(
unsigned int i=(blkNpe_1D-2*paddWidth);i<(blkNpe_1D-paddWidth-1);i++)
169 uZipOut[offset+k*(ly*lx)+j*(lx)+i]=0;
170 for(
unsigned int index=0;index<stencilSz;index++)
171 uZipOut[offset+k*(ly*lx)+j*(lx)+i]+=fd::D1_ORDER_4_DOWNWIND[index]*uZipIn[offset+k*(ly*lx)+j*(lx)+i+index-3]*h;
176 for(
unsigned int k=paddWidth;k<(blkNpe_1D-paddWidth);k++)
177 for(
unsigned int j=paddWidth;j<(blkNpe_1D-paddWidth);j++)
179 uZipOut[offset+k*(ly*lx)+j*(lx)+(blkNpe_1D-paddWidth-1)]=0;
180 for(
unsigned int index=0;index<stencilSz;index++)
181 uZipOut[offset+k*(ly*lx)+j*(lx)+(blkNpe_1D-paddWidth-1)]+=fd::D1_ORDER_4_BACKWARD[index]*uZipIn[offset+k*(ly*lx)+j*(lx)+(blkNpe_1D-paddWidth-1)+index-4]*h;
188 assert(blkNode.
minX()>grid_min && blkNode.maxX()<grid_max);
190 for(
unsigned int k=paddWidth;k<(blkNpe_1D-paddWidth);k++)
191 for(
unsigned int j=paddWidth;j<(blkNpe_1D-paddWidth);j++)
192 for(
unsigned int i=paddWidth;i<(blkNpe_1D-paddWidth);i++)
194 uZipOut[offset+k*(ly*lx)+j*(lx)+i]=0;
195 for(
unsigned int index=0;index<stencilSz;index++)
196 uZipOut[offset+k*(ly*lx)+j*(lx)+i]+=fd::D1_ORDER_4_CENTERED[index]*uZipIn[offset+k*(ly*lx)+j*(lx)+(i+index-2)]*h;
207 for(
unsigned int blk=0;blk<blkList.size();blk++)
210 blkNode=blkList[blk].getBlockNode();
211 paddWidth=blkList[blk].get1DPadWidth();
212 blkNpe_1D=blkList[blk].get1DArraySize();
213 h=1.0/(blkList[blk].computeDy(adv_param::domain_min,adv_param::domain_max));
215 lx=blkList[blk].getAllocationSzX();
216 ly=blkList[blk].getAllocationSzY();
217 lz=blkList[blk].getAllocationSzZ();
219 offset=blkList[blk].getOffset();
222 assert(blkNpe_1D>paddWidth);
224 if(blkNode.minY()==grid_min)
227 for(
unsigned int k=paddWidth;k<(blkNpe_1D-paddWidth);k++)
228 for(
unsigned int i=paddWidth;i<(blkNpe_1D-paddWidth);i++)
230 uZipOut[offset+k*(ly*lx)+(paddWidth)*(lx)+i]=0;
231 for(
unsigned int index=0;index<stencilSz;index++)
232 uZipOut[offset+k*(ly*lx)+(paddWidth)*(lx)+i]+=fd::D1_ORDER_4_FORWARD[index]*uZipIn[offset+k*(ly*lx)+(paddWidth+index)*(lx)+i]*h;
236 for(
unsigned int k=paddWidth;k<(blkNpe_1D-paddWidth);k++)
237 for(
unsigned int i=paddWidth;i<(blkNpe_1D-paddWidth);i++)
238 for(
unsigned int j=(paddWidth+1);j<(2*paddWidth);j++)
240 uZipOut[offset+k*(ly*lx)+j*(lx)+i]=0;
241 for(
unsigned int index=0;index<stencilSz;index++)
242 uZipOut[offset+k*(ly*lx)+j*(lx)+i]+=fd::D1_ORDER_4_UPWIND[index]*uZipIn[offset+k*(ly*lx)+(j+index-1)*(lx)+i]*h;
247 for(
unsigned int k=paddWidth;k<(blkNpe_1D-paddWidth);k++)
248 for(
unsigned int i=paddWidth;i<(blkNpe_1D-paddWidth);i++)
249 for(
unsigned int j=2*paddWidth;j<(blkNpe_1D-2*paddWidth);j++)
251 uZipOut[offset+k*(ly*lx)+j*(lx)+i]=0;
252 for(
unsigned int index=0;index<stencilSz;index++)
253 uZipOut[offset+k*(ly*lx)+j*(lx)+i]+=fd::D1_ORDER_4_CENTERED[index]*uZipIn[offset+k*(ly*lx)+(j+index-2)*(lx)+i]*h;
258 if(blkNode.maxY()==grid_max)
260 for(
unsigned int k=paddWidth;k<(blkNpe_1D-paddWidth);k++)
261 for(
unsigned int i=paddWidth;i<(blkNpe_1D-paddWidth);i++)
262 for(
unsigned int j=(blkNpe_1D-2*paddWidth);j<(blkNpe_1D-paddWidth-1);j++)
264 uZipOut[offset+k*(ly*lx)+j*(lx)+i]=0;
265 for(
unsigned int index=0;index<stencilSz;index++)
266 uZipOut[offset+k*(ly*lx)+j*(lx)+i]+=fd::D1_ORDER_4_DOWNWIND[index]*uZipIn[offset+k*(ly*lx)+(j+index-3)*(lx)+i]*h;
271 for(
unsigned int k=paddWidth;k<(blkNpe_1D-paddWidth);k++)
272 for(
unsigned int i=paddWidth;i<(blkNpe_1D-paddWidth);i++)
274 uZipOut[offset+k*(ly*lx)+(blkNpe_1D-paddWidth-1)*(lx)+i]=0;
275 for(
unsigned int index=0;index<stencilSz;index++)
276 uZipOut[offset+k*(ly*lx)+(blkNpe_1D-paddWidth-1)*(lx)+i]+=fd::D1_ORDER_4_BACKWARD[index]*uZipIn[offset+k*(ly*lx)+((blkNpe_1D-paddWidth-1)+index-4)*(lx)+i]*h;
283 assert(blkNode.maxY()<grid_max);
284 for(
unsigned int k=paddWidth;k<(blkNpe_1D-paddWidth);k++)
285 for(
unsigned int i=paddWidth;i<(blkNpe_1D-paddWidth);i++)
286 for(
unsigned int j=(blkNpe_1D-2*paddWidth);j<(blkNpe_1D-paddWidth);j++)
288 uZipOut[offset+k*(ly*lx)+j*(lx)+i]=0;
289 for(
unsigned int index=0;index<stencilSz;index++)
290 uZipOut[offset+k*(ly*lx)+j*(lx)+i]+=fd::D1_ORDER_4_CENTERED[index]*uZipIn[offset+k*(ly*lx)+(j+index-2)*(lx)+i]*h;
296 }
else if(blkNode.maxY()==grid_max)
299 assert(blkNode.minY()>grid_min);
300 assert((blkNpe_1D-2*paddWidth));
302 for(
unsigned int k=paddWidth;k<(blkNpe_1D-paddWidth);k++)
303 for(
unsigned int i=paddWidth;i<(blkNpe_1D-paddWidth);i++)
304 for(
unsigned int j=paddWidth;j<(blkNpe_1D-2*paddWidth);j++)
306 uZipOut[offset+k*(ly*lx)+j*(lx)+i]=0;
307 for(
unsigned int index=0;index<stencilSz;index++)
308 uZipOut[offset+k*(ly*lx)+j*(lx)+i]+=fd::D1_ORDER_4_CENTERED[index]*uZipIn[offset+k*(ly*lx)+(j+index-2)*(lx)+i]*h;
313 for(
unsigned int k=paddWidth;k<(blkNpe_1D-paddWidth);k++)
314 for(
unsigned int i=paddWidth;i<(blkNpe_1D-paddWidth);i++)
315 for(
unsigned int j=(blkNpe_1D-2*paddWidth);j<(blkNpe_1D-paddWidth-1);j++)
317 uZipOut[offset+k*(ly*lx)+j*(lx)+i]=0;
318 for(
unsigned int index=0;index<stencilSz;index++)
319 uZipOut[offset+k*(ly*lx)+j*(lx)+i]+=fd::D1_ORDER_4_DOWNWIND[index]*uZipIn[offset+k*(ly*lx)+(j+index-3)*(lx)+i]*h;
324 for(
unsigned int k=paddWidth;k<(blkNpe_1D-paddWidth);k++)
325 for(
unsigned int i=paddWidth;i<(blkNpe_1D-paddWidth);i++)
327 uZipOut[offset+k*(ly*lx)+(blkNpe_1D-paddWidth-1)*(lx)+i]=0;
328 for(
unsigned int index=0;index<stencilSz;index++)
329 uZipOut[offset+k*(ly*lx)+(blkNpe_1D-paddWidth-1)*(lx)+i]+=fd::D1_ORDER_4_BACKWARD[index]*uZipIn[offset+k*(ly*lx)+((blkNpe_1D-paddWidth-1)+index-4)*(lx)+i]*h;
336 assert(blkNode.minY()>grid_min && blkNode.maxY()<grid_max);
338 for(
unsigned int k=paddWidth;k<(blkNpe_1D-paddWidth);k++)
339 for(
unsigned int i=paddWidth;i<(blkNpe_1D-paddWidth);i++)
340 for(
unsigned int j=paddWidth;j<(blkNpe_1D-paddWidth);j++)
342 uZipOut[offset+k*(ly*lx)+j*(lx)+i]=0;
343 for(
unsigned int index=0;index<stencilSz;index++)
344 uZipOut[offset+k*(ly*lx)+j*(lx)+i]+=fd::D1_ORDER_4_CENTERED[index]*uZipIn[offset+k*(ly*lx)+(j+index-2)*(lx)+i]*h;
356 for(
unsigned int blk=0;blk<blkList.size();blk++)
359 blkNode=blkList[blk].getBlockNode();
360 paddWidth=blkList[blk].get1DPadWidth();
361 blkNpe_1D=blkList[blk].get1DArraySize();
362 h=1.0/(blkList[blk].computeDz(adv_param::domain_min,adv_param::domain_max));
364 lx=blkList[blk].getAllocationSzX();
365 ly=blkList[blk].getAllocationSzY();
366 lz=blkList[blk].getAllocationSzZ();
368 offset=blkList[blk].getOffset();
371 assert(blkNpe_1D>paddWidth);
373 if(blkNode.minZ()==grid_min)
376 for(
unsigned int j=paddWidth;j<(blkNpe_1D-paddWidth);j++)
377 for(
unsigned int i=paddWidth;i<(blkNpe_1D-paddWidth);i++)
379 uZipOut[offset+(paddWidth)*(ly*lx)+(j)*(lx)+i]=0;
380 for(
unsigned int index=0;index<stencilSz;index++)
381 uZipOut[offset+(paddWidth)*(ly*lx)+(j)*(lx)+i]+=fd::D1_ORDER_4_FORWARD[index]*uZipIn[offset+(paddWidth+index)*(ly*lx)+j*(lx)+i]*h;
385 for(
unsigned int j=paddWidth;j<(blkNpe_1D-paddWidth);j++)
386 for(
unsigned int i=paddWidth;i<(blkNpe_1D-paddWidth);i++)
387 for(
unsigned int k=(paddWidth+1);k<(2*paddWidth);k++)
389 uZipOut[offset+k*(ly*lx)+j*(lx)+i]=0;
390 for(
unsigned int index=0;index<stencilSz;index++)
391 uZipOut[offset+k*(ly*lx)+j*(lx)+i]+=fd::D1_ORDER_4_UPWIND[index]*uZipIn[offset+(k+index-1)*(ly*lx)+j*(lx)+i]*h;
396 for(
unsigned int j=paddWidth;j<(blkNpe_1D-paddWidth);j++)
397 for(
unsigned int i=paddWidth;i<(blkNpe_1D-paddWidth);i++)
398 for(
unsigned int k=2*paddWidth;k<(blkNpe_1D-2*paddWidth);k++)
400 uZipOut[offset+k*(ly*lx)+j*(lx)+i]=0;
401 for(
unsigned int index=0;index<stencilSz;index++)
402 uZipOut[offset+k*(ly*lx)+j*(lx)+i]+=fd::D1_ORDER_4_CENTERED[index]*uZipIn[offset+(k+index-2)*(ly*lx)+j*(lx)+i]*h;
407 if(blkNode.maxZ()==grid_max)
409 for(
unsigned int j=paddWidth;j<(blkNpe_1D-paddWidth);j++)
410 for(
unsigned int i=paddWidth;i<(blkNpe_1D-paddWidth);i++)
411 for(
unsigned int k=(blkNpe_1D-2*paddWidth);k<(blkNpe_1D-paddWidth-1);k++)
413 uZipOut[offset+k*(ly*lx)+j*(lx)+i]=0;
414 for(
unsigned int index=0;index<stencilSz;index++)
415 uZipOut[offset+k*(ly*lx)+j*(lx)+i]+=fd::D1_ORDER_4_DOWNWIND[index]*uZipIn[offset+(k+index-3)*(ly*lx)+j*(lx)+i]*h;
420 for(
unsigned int j=paddWidth;j<(blkNpe_1D-paddWidth);j++)
421 for(
unsigned int i=paddWidth;i<(blkNpe_1D-paddWidth);i++)
423 uZipOut[offset+(blkNpe_1D-paddWidth-1)*(ly*lx)+j*(lx)+i]=0;
424 for(
unsigned int index=0;index<stencilSz;index++)
425 uZipOut[offset+(blkNpe_1D-paddWidth-1)*(ly*lx)+j*(lx)+i]+=fd::D1_ORDER_4_BACKWARD[index]*uZipIn[offset+((blkNpe_1D-paddWidth-1)+index-4)*(ly*lx)+j*(lx)+i]*h;
432 assert(blkNode.maxY()<grid_max);
433 for(
unsigned int j=paddWidth;j<(blkNpe_1D-paddWidth);j++)
434 for(
unsigned int i=paddWidth;i<(blkNpe_1D-paddWidth);i++)
435 for(
unsigned int k=(blkNpe_1D-2*paddWidth);k<(blkNpe_1D-paddWidth);k++)
437 uZipOut[offset+k*(ly*lx)+j*(lx)+i]=0;
438 for(
unsigned int index=0;index<stencilSz;index++)
439 uZipOut[offset+k*(ly*lx)+j*(lx)+i]+=fd::D1_ORDER_4_CENTERED[index]*uZipIn[offset+(k+index-2)*(ly*lx)+j*(lx)+i]*h;
445 }
else if(blkNode.maxZ()==grid_max)
448 assert(blkNode.minZ()>grid_min);
449 assert((blkNpe_1D-2*paddWidth));
451 for(
unsigned int j=paddWidth;j<(blkNpe_1D-paddWidth);j++)
452 for(
unsigned int i=paddWidth;i<(blkNpe_1D-paddWidth);i++)
453 for(
unsigned int k=paddWidth;k<(blkNpe_1D-2*paddWidth);k++)
455 uZipOut[offset+k*(ly*lx)+j*(lx)+i]=0;
456 for(
unsigned int index=0;index<stencilSz;index++)
457 uZipOut[offset+k*(ly*lx)+j*(lx)+i]+=fd::D1_ORDER_4_CENTERED[index]*uZipIn[offset+(k+index-2)*(ly*lx)+j*(lx)+i]*h;
462 for(
unsigned int j=paddWidth;j<(blkNpe_1D-paddWidth);j++)
463 for(
unsigned int i=paddWidth;i<(blkNpe_1D-paddWidth);i++)
464 for(
unsigned int k=(blkNpe_1D-2*paddWidth);k<(blkNpe_1D-paddWidth-1);k++)
466 uZipOut[offset+k*(ly*lx)+j*(lx)+i]=0;
467 for(
unsigned int index=0;index<stencilSz;index++)
468 uZipOut[offset+k*(ly*lx)+j*(lx)+i]+=fd::D1_ORDER_4_DOWNWIND[index]*uZipIn[offset+(k+index-3)*(ly*lx)+j*(lx)+i]*h;
473 for(
unsigned int j=paddWidth;j<(blkNpe_1D-paddWidth);j++)
474 for(
unsigned int i=paddWidth;i<(blkNpe_1D-paddWidth);i++)
476 uZipOut[offset+(blkNpe_1D-paddWidth-1)*(ly*lx)+j*(lx)+i]=0;
477 for(
unsigned int index=0;index<stencilSz;index++)
478 uZipOut[offset+(blkNpe_1D-paddWidth-1)*(ly*lx)+j*(lx)+i]+=fd::D1_ORDER_4_BACKWARD[index]*uZipIn[offset+((blkNpe_1D-paddWidth-1)+index-4)*(ly*lx)+j*(lx)+i]*h;
485 assert(blkNode.minZ()>grid_min && blkNode.maxZ()<grid_max);
487 for(
unsigned int j=paddWidth;j<(blkNpe_1D-paddWidth);j++)
488 for(
unsigned int i=paddWidth;i<(blkNpe_1D-paddWidth);i++)
489 for(
unsigned int k=paddWidth;k<(blkNpe_1D-paddWidth);k++)
491 uZipOut[offset+k*(ly*lx)+j*(lx)+i]=0;
492 for(
unsigned int index=0;index<stencilSz;index++)
493 uZipOut[offset+k*(ly*lx)+j*(lx)+i]+=fd::D1_ORDER_4_CENTERED[index]*uZipIn[offset+(k+index-2)*(ly*lx)+j*(lx)+i]*h;
506 std::cout<<
" unknown stencil direction "<<std::endl;
515 #endif //SFCSORTBENCH_RKTRANSPORTUTILS_H unsigned int minX() const
returns true min corner(anchor) and the max corner coordinates of a octant.
Definition: TreeNode.h:164
A class to manage octants.
Definition: TreeNode.h:35
A point class.
Definition: point.h:36
Contains gradient computation functions for the advection equation.
Definition: rkTransportUtils.h:19
const std::vector< ot::Block > & getLocalBlockList() const
returns const list of local blocks (regular grids) for the consdering mesh.
Definition: mesh.h:1084