HARM
harm and utilities
 All Data Structures Files Functions Variables Typedefs Macros Pages
copyandinit_functions.c
Go to the documentation of this file.
1 #include "decs.h"
2 
9 
17 
18 void get_inversion_startendindices(int *loop, int *is,int *ie,int *js,int *je,int *ks,int *ke)
19 {
20 
21 
22 #if(0)
23  // define loop range
24  // +SHIFT? is for IF3DSPCTHENMPITRANSFERATPOLE
25  // with cleanup_fluxes() in flux.c so that fluxes are zeroed-out outside well-defined computational box, then *always* update +-1 from "normal" conservatives so that all possible fluxes are accounted in changes due to interior and some exterior cells
26  // This way all advance.c is simple and just expanded by 1 cell effectively
27  // This allows use of adaptive time-stepping such that surrounding cells are properly updated and keep pace with the effective time of the RK-stepping
28  // Also ensures divb=0 and flux conservation under any case since always take into account fluxes through the well-defined computational box
29  // must constrain result since this is final centered value of field and only have enough information to be well-defined on the current computational box over a finite range
30  // Only expand if on outer edge of not-evolved region in order to (primarily) preserve divb=0
31 
32  // must constrain result since this is final centered value of field and only have enough information to be well-defined on the current computational box over a finite range
33  // Only expand if on outer edge of not-evolved region in order to (primarily) preserve divb=0
34 
35  // 1|| because realized don't want to adjust "boundary cells". Want to keep them fixed. Violates conservation (and divb=0) unless separately evolve that other region. This is ok since just approximating evolution in non-evolved region when moving full boundary.
36  // if(subgrid inner boundary>global active grid inner boundary)
38  else *is=Uconsevolveloop[FIS]-SHIFT1;
39 
41  else *ie=Uconsevolveloop[FIE]+SHIFT1;
42 
44  else *js=Uconsevolveloop[FJS]-SHIFT2;
45 
47  else *je=Uconsevolveloop[FJE]+SHIFT2;
48 
50  else *ks=Uconsevolveloop[FKS]-SHIFT3;
51 
53  else *ke=Uconsevolveloop[FKE]+SHIFT3;
54 #else
55 
56  // this loop range must be equal to that used in copy_tempucum_finalucum() for centered quantities there (i.e. ignore FLUXB==FLUXCTSTAG in that function as compared to here).
57  *is=loop[FIS]-SHIFT1*(AVOIDADVANCESHIFTX1DN==0);
58  *ie=loop[FIE]+SHIFT1*(AVOIDADVANCESHIFTX1UP==0);
59  *js=loop[FJS]-SHIFT2*(AVOIDADVANCESHIFTX2DN==0);
60  *je=loop[FJE]+SHIFT2*(AVOIDADVANCESHIFTX2UP==0);
61  *ks=loop[FKS]-SHIFT3*(AVOIDADVANCESHIFTX3DN==0);
62  *ke=loop[FKE]+SHIFT3*(AVOIDADVANCESHIFTX3UP==0);
63 
64  // new method is always centered inversion or primitive for field
65  //*is=loop[FIS];
66  // *ie=loop[FIE];
67  // *js=loop[FJS];
68  // *je=loop[FJE];
69  // *ks=loop[FKS];
70  // *ke=loop[FKE];
71 
72 #endif
73 
74 }
75 
77 void get_stag_startendindices(int *loop, int dir, int *is,int *ie,int *js,int *je,int *ks,int *ke)
78 {
79 
80  // must constrain result since this is final centered value of field and only have enough information to be well-defined on the current computational box over a finite range
81  // Only expand if on outer edge of not-evolved region in order to (primarily) preserve divb=0
82 
83  // 1|| for same reason as for centered quantities as discussed above.
84  // if(subgrid inner boundary>global active grid inner boundary)
86  else *is=loop[FIS]-SHIFT1;
87 
88  if(AVOIDADVANCESHIFTX1UP||enerposreg[ACTIVEREGION][X1UP]<enerposreg[ACTIVEREGION][X1UP]) *ie=loop[FIE]+SHIFT1*(dir==1);
89  else *ie=loop[FIE]+SHIFT1;
90 
92  else *js=loop[FJS]-SHIFT2;
93 
94  if(AVOIDADVANCESHIFTX2UP||enerposreg[ACTIVEREGION][X2UP]<enerposreg[ACTIVEREGION][X2UP]) *je=loop[FJE]+SHIFT2*(dir==2);
95  else *je=loop[FJE]+SHIFT2;
96 
98  else *ks=loop[FKS]-SHIFT3;
99 
101  else *ke=loop[FKE]+SHIFT3;
102 
103 }
104 
105 
106 
122 void get_flux_startendindices(int *loop, int *is,int *ie,int *js,int *je,int *ks,int *ke)
123 {
124 
125  // this loop range must be equal or larger than that used in copy_tempucum_finalucum()
126  *is=loop[FIS]-SHIFT1*(AVOIDADVANCESHIFTX1DN==0);
127  *ie=loop[FIE]+SHIFT1*(AVOIDADVANCESHIFTX1UP==0);
128  *js=loop[FJS]-SHIFT2*(AVOIDADVANCESHIFTX2DN==0);
129  *je=loop[FJE]+SHIFT2*(AVOIDADVANCESHIFTX2UP==0);
130  *ks=loop[FKS]-SHIFT3*(AVOIDADVANCESHIFTX3DN==0);
131  *ke=loop[FKE]+SHIFT3*(AVOIDADVANCESHIFTX3UP==0);
132 
133 
134  if(FLUXB==FLUXCTSTAG){
135  // generic shift upwards to compute necessary things for staggered field. In end presume however shifted here, ucum and final primitives are computed on highly controlled locations only
136 
137  // overrides:
138  *ie=loop[FIE]+SHIFT1;
139  *je=loop[FJE]+SHIFT2;
140  *ke=loop[FKE]+SHIFT3;
141  }
142  else{
143  // default is good
144  }
145 }
146 
147 
148 
149 
150 
151 
152 
153 
160 void copy_tempucum_finalucum(int whichpl, int *loop, FTYPE (*tempucum)[NSTORE2][NSTORE3][NPR], FTYPE (*ucum)[NSTORE2][NSTORE3][NPR])
161 {
162 
163 
164 #pragma omp parallel // just copying, only need PLOOP even for ucum_check()
165  {
166  int i,j,k;
167  int pl,pliter;
168  int is,ie,js,je,ks,ke;
169  extern void ucum_check(int i, int j, int k, int loc, int pl, FTYPE *ucum);
170 
171  // loop range where final ucum is set from scratch ucum that may have been set outside desired region for simplicity of loop structures
172  is=loop[FIS]-SHIFT1*(AVOIDADVANCESHIFTX1DN==0);
173  ie=loop[FIE]+SHIFT1*(AVOIDADVANCESHIFTX1UP==0);
174  js=loop[FJS]-SHIFT2*(AVOIDADVANCESHIFTX2DN==0);
175  je=loop[FJE]+SHIFT2*(AVOIDADVANCESHIFTX2UP==0);
176  ks=loop[FKS]-SHIFT3*(AVOIDADVANCESHIFTX3DN==0);
177  ke=loop[FKE]+SHIFT3*(AVOIDADVANCESHIFTX3UP==0);
178 
179 
180  if(FLUXB==FLUXCTSTAG){
181  if(whichpl==DOALLPL || whichpl==DONONBPL){
182  // do non-field quantities
183  copy_3d_nofield_nowait(is, ie, js, je, ks, ke, tempucum,ucum);
184 
185 #if(PRODUCTION==0)
186 #pragma omp barrier // force barrier since otherwise nowait will leak into here with undefined values in general
187  COMPZSLOOP(is,ie,js,je,ks,ke){
188  PLOOPNOB1(pl) ucum_check(i,j,k,CENT,pl, MAC(ucum,i,j,k));
189  PLOOPNOB2(pl) ucum_check(i,j,k,CENT,pl, MAC(ucum,i,j,k));
190  }
191 #endif
192  }
193 
194  // do field quantities
195  if(whichpl==DOALLPL || whichpl==DOBPL){
196 
197  // do pl==B1
198  pl=B1;
199  is=loop[FIS]-SHIFT1*(AVOIDADVANCESHIFTX1DN==0);
200  ie=loop[FIE]+SHIFT1*(AVOIDADVANCESHIFTX1UP==0);
201  js=loop[FJS]-SHIFT2*(AVOIDADVANCESHIFTX2DN==0);
202  je=loop[FJE]+SHIFT2*(AVOIDADVANCESHIFTX2UP==0);
203  ks=loop[FKS]-SHIFT3*(AVOIDADVANCESHIFTX3DN==0);
204  ke=loop[FKE]+SHIFT3*(AVOIDADVANCESHIFTX3UP==0);
205 
206  ie=loop[FIE]+SHIFT1; // always shift - override
207  copy_3d_onepl_nowait(is, ie, js, je, ks, ke, pl, tempucum, ucum );
208 
209 #if(PRODUCTION==0)
210 #pragma omp barrier // force barrier since otherwise nowait will leak into here with undefined values in general
211  COMPZSLOOP(is,ie,js,je,ks,ke){
212  ucum_check(i,j,k,FACE1,pl, MAC(ucum,i,j,k));
213  }
214 #endif
215 
216 
217  // do pl==B2
218  pl=B2;
219  is=loop[FIS]-SHIFT1*(AVOIDADVANCESHIFTX1DN==0);
220  ie=loop[FIE]+SHIFT1*(AVOIDADVANCESHIFTX1UP==0);
221  js=loop[FJS]-SHIFT2*(AVOIDADVANCESHIFTX2DN==0);
222  je=loop[FJE]+SHIFT2*(AVOIDADVANCESHIFTX2UP==0);
223  ks=loop[FKS]-SHIFT3*(AVOIDADVANCESHIFTX3DN==0);
224  ke=loop[FKE]+SHIFT3*(AVOIDADVANCESHIFTX3UP==0);
225 
226  je=loop[FJE]+SHIFT2;
227  copy_3d_onepl_nowait(is, ie, js, je, ks, ke, pl, tempucum, ucum );
228 
229 
230 #if(PRODUCTION==0)
231 #pragma omp barrier // force barrier since otherwise nowait will leak into here with undefined values in general
232  COMPZSLOOP(is,ie,js,je,ks,ke){
233  ucum_check(i,j,k,FACE2,pl, MAC(ucum,i,j,k));
234  }
235 #endif
236 
237 
238  // do pl==B3
239  pl=B3;
240  is=loop[FIS]-SHIFT1*(AVOIDADVANCESHIFTX1DN==0);
241  ie=loop[FIE]+SHIFT1*(AVOIDADVANCESHIFTX1UP==0);
242  js=loop[FJS]-SHIFT2*(AVOIDADVANCESHIFTX2DN==0);
243  je=loop[FJE]+SHIFT2*(AVOIDADVANCESHIFTX2UP==0);
244  ks=loop[FKS]-SHIFT3*(AVOIDADVANCESHIFTX3DN==0);
245  ke=loop[FKE]+SHIFT3*(AVOIDADVANCESHIFTX3UP==0);
246 
247  ke=loop[FKE]+SHIFT3;
248  copy_3d_onepl_nowait(is, ie, js, je, ks, ke, pl, tempucum, ucum );
249 
250 
251 #if(PRODUCTION==0)
252 #pragma omp barrier // force barrier since otherwise nowait will leak into here with undefined values in general
253  COMPZSLOOP(is,ie,js,je,ks,ke){
254  ucum_check(i,j,k,FACE3,pl, MAC(ucum,i,j,k));
255  }
256 #endif
257  }// end if need to to B type pl
258 
259  // now ucum is assigned only where should be changed
260 
261  }
262  else{
263  // nothing to do since tempucum is ucum and all at CENT
264  // just check
265 #if(PRODUCTION==0)
266 #pragma omp barrier // force barrier since otherwise nowait will leak into here with undefined values in general
267  COMPZSLOOP(is,ie,js,je,ks,ke){
268  PLOOP(pliter,pl){
269  if(whichpl==DONONBPL && BPL(pl)==1 || whichpl==DOBPL && BPL(pl)==0) continue;
270  ucum_check(i,j,k,CENT,pl, MAC(ucum,i,j,k));
271  }
272  }
273 #endif
274  }
275 
276  }// end parallel region (with implicit barrier)
277 
278 }
279 
280 
283 void copy_tempucum_finalucum_fieldonly(int *loop, FTYPE (*tempucum)[NSTORE2][NSTORE3][NPR], FTYPE (*ucum)[NSTORE2][NSTORE3][NPR])
284 {
285 
286 
287 #pragma omp parallel // just copying, only need PLOOP even for ucum_check()
288  {
289  int i,j,k;
290  int pl,pliter;
291  int is,ie,js,je,ks,ke;
292  extern void ucum_check(int i, int j, int k, int loc, int pl, FTYPE *ucum);
293 
294  // loop range where final ucum is set from scratch ucum that may have been set outside desired region for simplicity of loop structures
295  is=loop[FIS]-SHIFT1*(AVOIDADVANCESHIFTX1DN==0);
296  ie=loop[FIE]+SHIFT1*(AVOIDADVANCESHIFTX1UP==0);
297  js=loop[FJS]-SHIFT2*(AVOIDADVANCESHIFTX2DN==0);
298  je=loop[FJE]+SHIFT2*(AVOIDADVANCESHIFTX2UP==0);
299  ks=loop[FKS]-SHIFT3*(AVOIDADVANCESHIFTX3DN==0);
300  ke=loop[FKE]+SHIFT3*(AVOIDADVANCESHIFTX3UP==0);
301 
302 
303  if(FLUXB==FLUXCTSTAG){
304 
305  // do pl==B1
306  pl=B1;
307  ie=loop[FIE]+SHIFT1; // always shift - override
308  copy_3d_onepl_nowait(is, ie, js, je, ks, ke, pl, tempucum, ucum );
309 
310 #if(PRODUCTION==0)
311  COMPZSLOOP(is,ie,js,je,ks,ke){
312  ucum_check(i,j,k,FACE1,pl, MAC(ucum,i,j,k));
313  }
314 #endif
315 
316 
317  // do pl==B2
318  pl=B2;
319  je=loop[FJE]+SHIFT2;
320  copy_3d_onepl_nowait(is, ie, js, je, ks, ke, pl, tempucum, ucum );
321 
322 
323 #if(PRODUCTION==0)
324  COMPZSLOOP(is,ie,js,je,ks,ke){
325  ucum_check(i,j,k,FACE2,pl, MAC(ucum,i,j,k));
326  }
327 #endif
328 
329 
330  // do pl==B3
331  pl=B3;
332  ke=loop[FKE]+SHIFT3;
333  copy_3d_onepl_nowait(is, ie, js, je, ks, ke, pl, tempucum, ucum );
334 
335 
336 #if(PRODUCTION==0)
337  COMPZSLOOP(is,ie,js,je,ks,ke){
338  ucum_check(i,j,k,FACE3,pl, MAC(ucum,i,j,k));
339  }
340 #endif
341 
342 
343  // now ucum is assigned only where should be changed
344 
345  }
346  else{
347  // nothing to do since tempucum is ucum and all at CENT
348  // just check
349 #if(PRODUCTION==0)
350  COMPZSLOOP(is,ie,js,je,ks,ke){
351  PLOOPBONLY(pl) ucum_check(i,j,k,CENT,pl, MAC(ucum,i,j,k));
352  }
353 #endif
354  }
355 
356  }// end parallel region (with implicit barrier)
357 
358 }
359 
360 
361 
362 
363 
364 
365 
366 
369 void copy_3dnpr(int is, int ie, int js, int je, int ks, int ke,FTYPE (*source)[NSTORE2][NSTORE3][NPR],FTYPE (*dest)[NSTORE2][NSTORE3][NPR])
370 {
371 
372 
373 #pragma omp parallel
374  {
375  int i,j,k,pl,pliter;
376  OPENMP3DLOOPVARSDEFINE; OPENMP3DLOOPSETUP(is,ie,js,je,ks,ke);
377 
378 #pragma omp for schedule(OPENMPFULLNOVARYSCHEDULE())
380  OPENMP3DLOOPBLOCK2IJK(i,j,k);
381 
383  PLOOP(pliter,pl){
384  MACP0A1(dest,i,j,k,pl)=MACP0A1(source,i,j,k,pl);
385  }
386  }// end 3D loop
387 
388 
389  }// end parallel region
390 
391 }
392 
393 // general purpose copy machine for 3D arrays with only size NPR appended onto the end of array
394 // put as function because then wrap-up OpenMP stuff
395 void copy_3dnpr_fullloop(FTYPE (*source)[NSTORE2][NSTORE3][NPR],FTYPE (*dest)[NSTORE2][NSTORE3][NPR])
396 {
397  int is=-N1BND;
398  int ie=N1-1+N1BND;
399  int js=-N2BND;
400  int je=N2-1+N2BND;
401  int ks=-N3BND;
402  int ke=N3-1+N3BND;
403 
404 
405  copy_3dnpr(is, ie, js, je, ks, ke,source, dest);
406 
407 }
408 
411 void copy_3d_nofield(int is, int ie, int js, int je, int ks, int ke,FTYPE (*source)[NSTORE2][NSTORE3][NPR],FTYPE (*dest)[NSTORE2][NSTORE3][NPR])
412 {
413 
414 
415 #pragma omp parallel
416  {
417  int i,j,k,pl,pliter;
418  OPENMP3DLOOPVARSDEFINE; OPENMP3DLOOPSETUP(is,ie,js,je,ks,ke);
419 
420 #pragma omp for schedule(OPENMPFULLNOVARYSCHEDULE())
422  OPENMP3DLOOPBLOCK2IJK(i,j,k);
423 
424  // COMPZSLOOP(is,ie,js,je,ks,ke){
425  PLOOPNOB1(pl) MACP0A1(dest,i,j,k,pl)=MACP0A1(source,i,j,k,pl);
426  PLOOPNOB2(pl) MACP0A1(dest,i,j,k,pl)=MACP0A1(source,i,j,k,pl);
427 
428  }// end 3D loop
429 
430 
431  }// end parallel region
432 
433 }
434 
435 
438 void copy_3d_fieldonly(int is, int ie, int js, int je, int ks, int ke,FTYPE (*source)[NSTORE2][NSTORE3][NPR],FTYPE (*dest)[NSTORE2][NSTORE3][NPR])
439 {
440 
441 
442 #pragma omp parallel
443  {
444  int i,j,k,pl,pliter;
445  OPENMP3DLOOPVARSDEFINE; OPENMP3DLOOPSETUP(is,ie,js,je,ks,ke);
446 
447 #pragma omp for schedule(OPENMPFULLNOVARYSCHEDULE())
449  OPENMP3DLOOPBLOCK2IJK(i,j,k);
450 
451  // COMPZSLOOP(is,ie,js,je,ks,ke){
452  PLOOPBONLY(pl) MACP0A1(dest,i,j,k,pl)=MACP0A1(source,i,j,k,pl);
453 
454  }// end 3D loop
455 
456 
457  }// end parallel region
458 
459 }
460 
463 void copy_3d_fieldonly_fullloop(FTYPE (*source)[NSTORE2][NSTORE3][NPR],FTYPE (*dest)[NSTORE2][NSTORE3][NPR])
464 {
465  int is=-N1BND;
466  int ie=N1-1+N1BND;
467  int js=-N2BND;
468  int je=N2-1+N2BND;
469  int ks=-N3BND;
470  int ke=N3-1+N3BND;
471 
472 
473  copy_3d_fieldonly(is, ie, js, je, ks, ke, source, dest);
474 
475 
476 }
477 
478 
482 void copy_3d_nofield_nowait(int is, int ie, int js, int je, int ks, int ke,FTYPE (*source)[NSTORE2][NSTORE3][NPR],FTYPE (*dest)[NSTORE2][NSTORE3][NPR])
483 {
484  int i,j,k,pl,pliter;
485 
486  // already inside parallel region
487  OPENMP3DLOOPVARSDEFINE; OPENMP3DLOOPSETUP(is,ie,js,je,ks,ke);
488 
489 #pragma omp for schedule(OPENMPFULLNOVARYSCHEDULE()) nowait
491  OPENMP3DLOOPBLOCK2IJK(i,j,k);
492 
493  // COMPZSLOOP(is,ie,js,je,ks,ke){
494  PLOOPNOB1(pl) MACP0A1(dest,i,j,k,pl)=MACP0A1(source,i,j,k,pl);
495  PLOOPNOB2(pl) MACP0A1(dest,i,j,k,pl)=MACP0A1(source,i,j,k,pl);
496 
497  }// end 3D loop
498 
499 
500 }
501 
505 void copy_3d_fieldonly_nowait(int is, int ie, int js, int je, int ks, int ke,FTYPE (*source)[NSTORE2][NSTORE3][NPR],FTYPE (*dest)[NSTORE2][NSTORE3][NPR])
506 {
507  int i,j,k,pl,pliter;
508 
509  // already inside parallel region
510  OPENMP3DLOOPVARSDEFINE; OPENMP3DLOOPSETUP(is,ie,js,je,ks,ke);
511 
512 #pragma omp for schedule(OPENMPFULLNOVARYSCHEDULE()) nowait
514  OPENMP3DLOOPBLOCK2IJK(i,j,k);
515 
516  // COMPZSLOOP(is,ie,js,je,ks,ke){
517  PLOOPBONLY(pl) MACP0A1(dest,i,j,k,pl)=MACP0A1(source,i,j,k,pl);
518 
519  }// end 3D loop
520 
521 
522 }
523 
526 void copy_3d_onepl(int is, int ie, int js, int je, int ks, int ke, int pl, FTYPE (*source)[NSTORE2][NSTORE3][NPR],FTYPE (*dest)[NSTORE2][NSTORE3][NPR])
527 {
528 
529 
530 #pragma omp parallel
531  {
532  int i,j,k;
533  OPENMP3DLOOPVARSDEFINE; OPENMP3DLOOPSETUP(is,ie,js,je,ks,ke);
534 
535 #pragma omp for schedule(OPENMPFULLNOVARYSCHEDULE())
537  OPENMP3DLOOPBLOCK2IJK(i,j,k);
538 
539  // COMPZSLOOP(is,ie,js,je,ks,ke){
540  MACP0A1(dest,i,j,k,pl)=MACP0A1(source,i,j,k,pl);
541 
542  }// end 3D loop
543 
544 
545  }// end parallel region
546 
547 }
548 
552 void copy_3d_onepl_nowait(int is, int ie, int js, int je, int ks, int ke, int pl, FTYPE (*source)[NSTORE2][NSTORE3][NPR],FTYPE (*dest)[NSTORE2][NSTORE3][NPR])
553 {
554  int i,j,k;
555 
556 
557  // already inside parallel region
558  OPENMP3DLOOPVARSDEFINE; OPENMP3DLOOPSETUP(is,ie,js,je,ks,ke);
559 #pragma omp for schedule(OPENMPFULLNOVARYSCHEDULE())
561  OPENMP3DLOOPBLOCK2IJK(i,j,k);
562 
563  // COMPZSLOOP(is,ie,js,je,ks,ke){
564  MACP0A1(dest,i,j,k,pl)=MACP0A1(source,i,j,k,pl);
565 
566  }// end 3D loop
567 
568 }
569 
570 
573 void copy_3d_onepl_fullloop(int pl, FTYPE (*source)[NSTORE2][NSTORE3][NPR],FTYPE (*dest)[NSTORE2][NSTORE3][NPR])
574 {
575  int is=-N1BND;
576  int ie=N1-1+N1BND;
577  int js=-N2BND;
578  int je=N2-1+N2BND;
579  int ks=-N3BND;
580  int ke=N3-1+N3BND;
581 
582 
583  copy_3d_onepl(is, ie, js, je, ks, ke, pl, source, dest);
584 
585 }
586 
590 void copy_3d_onepl_fullloop_nowait(int pl, FTYPE (*source)[NSTORE2][NSTORE3][NPR],FTYPE (*dest)[NSTORE2][NSTORE3][NPR])
591 {
592  int is=-N1BND;
593  int ie=N1-1+N1BND;
594  int js=-N2BND;
595  int je=N2-1+N2BND;
596  int ks=-N3BND;
597  int ke=N3-1+N3BND;
598 
599 
600  copy_3d_onepl_nowait(is, ie, js, je, ks, ke, pl, source, dest);
601 
602 }
603 
606 void init_3dnpr_flux(int is, int ie, int js, int je, int ks, int ke,FTYPE initvalue, FTYPE (*dest)[NSTORE2][NSTORE3][NPR+NSPECIAL])
607 {
608 
609 
610 #pragma omp parallel
611  {
612  int i,j,k,pl,pliter;
613  OPENMP3DLOOPVARSDEFINE; OPENMP3DLOOPSETUP(is,ie,js,je,ks,ke);
614 
615 
616 #pragma omp for schedule(OPENMPFULLNOVARYSCHEDULE())
618  OPENMP3DLOOPBLOCK2IJK(i,j,k);
619 
620  // COMPZSLOOP(is,ie,js,je,ks,ke){
621  PLOOP(pliter,pl){
622  MACP0A1(dest,i,j,k,pl)=initvalue;
623  }
624  }// end 3D loop
625 
626 
627  }// end parallel region
628 
629 }
630 
632 void init_3dnpr(int is, int ie, int js, int je, int ks, int ke,FTYPE initvalue, FTYPE (*dest)[NSTORE2][NSTORE3][NPR])
633 {
634 
635 
636 #pragma omp parallel
637  {
638  int i,j,k,pl,pliter;
639  OPENMP3DLOOPVARSDEFINE; OPENMP3DLOOPSETUP(is,ie,js,je,ks,ke);
640 
641 
642 #pragma omp for schedule(OPENMPFULLNOVARYSCHEDULE())
644  OPENMP3DLOOPBLOCK2IJK(i,j,k);
645 
646  // COMPZSLOOP(is,ie,js,je,ks,ke){
647  PLOOP(pliter,pl){
648  MACP0A1(dest,i,j,k,pl)=initvalue;
649  }
650  }// end 3D loop
651 
652 
653  }// end parallel region
654 
655 }
656 
658 void init_3dnpr_fullloop(FTYPE initvalue, FTYPE (*dest)[NSTORE2][NSTORE3][NPR])
659 {
660  int is=-N1BND;
661  int ie=N1-1+N1BND;
662  int js=-N2BND;
663  int je=N2-1+N2BND;
664  int ks=-N3BND;
665  int ke=N3-1+N3BND;
666 
667  init_3dnpr(is,ie,js,je,ks,ke,initvalue,dest);
668 
669 }
670 
672 void init_3dnpr_fullloop_flux(FTYPE initvalue, FTYPE (*dest)[NSTORE2][NSTORE3][NPR+NSPECIAL])
673 {
674  int is=-N1BND;
675  int ie=N1-1+N1BND;
676  int js=-N2BND;
677  int je=N2-1+N2BND;
678  int ks=-N3BND;
679  int ke=N3-1+N3BND;
680 
681  init_3dnpr_flux(is,ie,js,je,ks,ke,initvalue,dest);
682 
683 }
684 
685 
687 void init_3dvpot(int is, int ie, int js, int je, int ks, int ke,FTYPE initvalue, FTYPE (*dest)[NSTORE2+SHIFTSTORE2][NSTORE3+SHIFTSTORE3])
688 {
689 
690 
691 #pragma omp parallel
692  {
693  int i,j,k;
694  OPENMP3DLOOPVARSDEFINE; OPENMP3DLOOPSETUP(is,ie,js,je,ks,ke);
695 #pragma omp for schedule(OPENMPFULLNOVARYSCHEDULE())
697  OPENMP3DLOOPBLOCK2IJK(i,j,k);
698 
699  MAC(dest,i,j,k)=initvalue;
700  }// end 3D loop
701  }// end parallel region
702 
703 }
704 
705 
707 void init_3dvpot_fullloopp1(FTYPE initvalue, FTYPE (*dest)[NSTORE2+SHIFTSTORE2][NSTORE3+SHIFTSTORE3])
708 {
709  int is=-N1BND;
710  int ie=N1-1+N1BND+SHIFT1;
711  int js=-N2BND;
712  int je=N2-1+N2BND+SHIFT2;
713  int ks=-N3BND;
714  int ke=N3-1+N3BND+SHIFT3;
715 
716  init_3dvpot(is,ie,js,je,ks,ke,initvalue,dest);
717 
718 }
719 
720 
721 
723 void copy_3dvpot(int is, int ie, int js, int je, int ks, int ke, FTYPE (*source)[NSTORE2+SHIFTSTORE2][NSTORE3+SHIFTSTORE3], FTYPE (*dest)[NSTORE2+SHIFTSTORE2][NSTORE3+SHIFTSTORE3])
724 {
725 
726 
727 #pragma omp parallel
728  {
729  int i,j,k;
730  OPENMP3DLOOPVARSDEFINE; OPENMP3DLOOPSETUP(is,ie,js,je,ks,ke);
731 #pragma omp for schedule(OPENMPFULLNOVARYSCHEDULE())
733  OPENMP3DLOOPBLOCK2IJK(i,j,k);
734 
735  MAC(dest,i,j,k)=MAC(source,i,j,k);
736  }// end 3D loop
737  }// end parallel region
738 
739 }
740 
741 
743 void copy_3dvpot_fullloopp1(FTYPE (*source)[NSTORE2+SHIFTSTORE2][NSTORE3+SHIFTSTORE3], FTYPE (*dest)[NSTORE2+SHIFTSTORE2][NSTORE3+SHIFTSTORE3])
744 {
745  int is=-N1BND;
746  int ie=N1-1+N1BND+SHIFT1;
747  int js=-N2BND;
748  int je=N2-1+N2BND+SHIFT2;
749  int ks=-N3BND;
750  int ke=N3-1+N3BND+SHIFT3;
751 
752  copy_3dvpot(is,ie,js,je,ks,ke,source,dest);
753 
754 }
755 
758 void init_3dnpr_2ptrs(int is, int ie, int js, int je, int ks, int ke,FTYPE initvalue, FTYPE (*dest1)[NSTORE2][NSTORE3][NPR],FTYPE (*dest2)[NSTORE2][NSTORE3][NPR])
759 {
760 
761 #pragma omp parallel
762  {
763  int i,j,k,pl,pliter;
764  OPENMP3DLOOPVARSDEFINE; OPENMP3DLOOPSETUP(is,ie,js,je,ks,ke);
765 
766 #pragma omp for schedule(OPENMPFULLNOVARYSCHEDULE())
768  OPENMP3DLOOPBLOCK2IJK(i,j,k);
769 
770  // COMPZSLOOP(is,ie,js,je,ks,ke){
771  PLOOP(pliter,pl){
772  MACP0A1(dest1,i,j,k,pl)=MACP0A1(dest2,i,j,k,pl)=initvalue;
773  }
774  }// end 3D loop
775 
776 
777  }// end parallel region
778 
779 }
780 
783 void init_3dnpr_3ptrs(int is, int ie, int js, int je, int ks, int ke,FTYPE initvalue, FTYPE (*dest1)[NSTORE2][NSTORE3][NPR],FTYPE (*dest2)[NSTORE2][NSTORE3][NPR],FTYPE (*dest3)[NSTORE2][NSTORE3][NPR])
784 {
785 
786 #pragma omp parallel
787  {
788  int i,j,k,pl,pliter;
789  OPENMP3DLOOPVARSDEFINE; OPENMP3DLOOPSETUP(is,ie,js,je,ks,ke);
790 
791 #pragma omp for schedule(OPENMPFULLNOVARYSCHEDULE())
793  OPENMP3DLOOPBLOCK2IJK(i,j,k);
794 
795  // COMPZSLOOP(is,ie,js,je,ks,ke){
796  PLOOP(pliter,pl){
797  MACP0A1(dest1,i,j,k,pl)=MACP0A1(dest2,i,j,k,pl)=MACP0A1(dest3,i,j,k,pl)=initvalue;
798  }
799  }// end 3D loop
800 
801 
802  }// end parallel region
803 
804 }
805 
806 
807 
808 
811 void copy_3dnpr_2ptrs(int is, int ie, int js, int je, int ks, int ke,FTYPE (*source)[NSTORE2][NSTORE3][NPR],FTYPE (*dest1)[NSTORE2][NSTORE3][NPR],FTYPE (*dest2)[NSTORE2][NSTORE3][NPR])
812 {
813 
814 #pragma omp parallel
815  {
816  int i,j,k,pl,pliter;
817  OPENMP3DLOOPVARSDEFINE; OPENMP3DLOOPSETUP(is,ie,js,je,ks,ke);
818 
819 #pragma omp for schedule(OPENMPFULLNOVARYSCHEDULE())
821  OPENMP3DLOOPBLOCK2IJK(i,j,k);
822 
823  // COMPZSLOOP(is,ie,js,je,ks,ke){
824  PLOOP(pliter,pl){
825  MACP0A1(dest1,i,j,k,pl)=MACP0A1(dest2,i,j,k,pl)=MACP0A1(source,i,j,k,pl);
826  }
827  }// end 3D loop
828 
829 
830  }// end parallel region
831 
832 }
833 
834 
835 
836 
837 
838 
839 
842 void copy_3dpftype_special(int is, int ie, int js, int je, int ks, int ke,PFTYPE (*source)[NSTORE2][NSTORE3][NUMPFLAGS],PFTYPE (*destspecial)[NSTORE2][NSTORE3][NUMFAILPFLAGS])
843 {
844 
845 
846 #pragma omp parallel
847  {
848  int pf;
849  int i,j,k;
850  OPENMP3DLOOPVARSDEFINE; OPENMP3DLOOPSETUP(is,ie,js,je,ks,ke);
851 
852 #pragma omp for schedule(OPENMPFULLNOVARYSCHEDULE())
854  OPENMP3DLOOPBLOCK2IJK(i,j,k);
855 
856  FAILPFLAGLOOP(pf) MACP0A1(destspecial,i,j,k,pf)=MACP0A1(source,i,j,k,pf);
857 
858  }// end 3D loop
859 
860  }// end parallel region
861 
862 }
863 
866 void copy_3dpftype_special_fullloop(PFTYPE (*source)[NSTORE2][NSTORE3][NUMPFLAGS],PFTYPE (*destspecial)[NSTORE2][NSTORE3][NUMFAILPFLAGS])
867 {
868  int is=-N1BND;
869  int ie=N1-1+N1BND;
870  int js=-N2BND;
871  int je=N2-1+N2BND;
872  int ks=-N3BND;
873  int ke=N3-1+N3BND;
874 
875  // override
876  get_inversion_startendindices(Uconsevolveloop,&is,&ie,&js,&je,&ks,&ke);
877 
878  // +-NUMPFLAGBNDx extra so can do check
879  is += -NUMPFLAGBND1;
880  ie += +NUMPFLAGBND1;
881  js += -NUMPFLAGBND2;
882  je += +NUMPFLAGBND2;
883  ks += -NUMPFLAGBND3;
884  ke += +NUMPFLAGBND3;
885 
886 
887  copy_3dpftype_special(is, ie, js, je, ks, ke,source, destspecial);
888 
889 }
890 
891 
892 
895 void copy_3dnpr2interp_2ptrs(int is, int ie, int js, int je, int ks, int ke,FTYPE (*source)[NSTORE2][NSTORE3][NPR2INTERP],FTYPE (*dest1)[NSTORE2][NSTORE3][NPR2INTERP],FTYPE (*dest2)[NSTORE2][NSTORE3][NPR2INTERP])
896 {
897 
898 
899 #pragma omp parallel OPENMPGLOBALPRIVATEPLOOPINTERPONLY
900  {
901  int i,j,k,pl,pliter;
902  OPENMP3DLOOPVARSDEFINE; OPENMP3DLOOPSETUP(is,ie,js,je,ks,ke);
903 
904 #pragma omp for schedule(OPENMPFULLNOVARYSCHEDULE())
906  OPENMP3DLOOPBLOCK2IJK(i,j,k);
907 
908  // COMPZSLOOP(is,ie,js,je,ks,ke){
909  PINTERPLOOP(pliter,pl){
910  MACP0A1(dest1,i,j,k,pl)=MACP0A1(dest2,i,j,k,pl)=MACP0A1(source,i,j,k,pl);
911  }
912  }// end 3D loop
913 
914 
915  }// end parallel region
916 
917 }
918 
921 void copy_3dnpr2interp_2ptrs_fullloop(FTYPE (*source)[NSTORE2][NSTORE3][NPR2INTERP],FTYPE (*dest1)[NSTORE2][NSTORE3][NPR2INTERP],FTYPE (*dest2)[NSTORE2][NSTORE3][NPR2INTERP])
922 {
923  int i,j,k,pl,pliter;
924  int is=-N1BND;
925  int ie=N1-1+N1BND;
926  int js=-N2BND;
927  int je=N2-1+N2BND;
928  int ks=-N3BND;
929  int ke=N3-1+N3BND;
930 
931  copy_3dnpr2interp_2ptrs(is, ie, js, je, ks, ke,source, dest1, dest2);
932 
933 }
934