00001 #ifdef CH_LANG_CC
00002
00003
00004
00005
00006
00007
00008
00009 #endif
00010
00011 #ifndef _EBLEVELDATAOPS_H_
00012 #define _EBLEVELDATAOPS_H_
00013
00014 #include "IntVect.H"
00015 #include "LevelData.H"
00016 #include "RefCountedPtr.H"
00017
00018 #include "EBCellFAB.H"
00019 #include "EBCellFactory.H"
00020 #include "EBFluxFAB.H"
00021 #include "EBFluxFactory.H"
00022 #include "EBISLayout.H"
00023 #include "NamespaceHeader.H"
00024
00025 #define EBLEVELDATAOPS_INTERIORREGVOFS 0x1
00026 #define EBLEVELDATAOPS_BOUNDARYREGVOFS 0x2
00027 #define EBLEVELDATAOPS_INTERIORIRREGVOFS 0x4
00028 #define EBLEVELDATAOPS_BOUNDARYIRREGVOFS 0x8
00029
00030 #define EBLEVELDATAOPS_ALLVOFS (EBLEVELDATAOPS_INTERIORREGVOFS | \
00031 EBLEVELDATAOPS_BOUNDARYREGVOFS | \
00032 EBLEVELDATAOPS_INTERIORIRREGVOFS | \
00033 EBLEVELDATAOPS_BOUNDARYIRREGVOFS )
00034
00035 #define EBLEVELDATAOPS_REGULARVOFS (EBLEVELDATAOPS_INTERIORREGVOFS | \
00036 EBLEVELDATAOPS_BOUNDARYREGVOFS )
00037
00038 #define EBLEVELDATAOPS_IRREGULARVOFS (EBLEVELDATAOPS_INTERIORIRREGVOFS | \
00039 EBLEVELDATAOPS_BOUNDARYIRREGVOFS )
00040
00041 #define EBLEVELDATAOPS_BOUNDARYVOFS (EBLEVELDATAOPS_BOUNDARYREGVOFS | \
00042 EBLEVELDATAOPS_IRREGULARVOFS )
00043
00044
00045
00046
00047
00048
00049 class EBLevelDataOps
00050 {
00051 public:
00052 EBLevelDataOps()
00053 {
00054 }
00055
00056 ~EBLevelDataOps()
00057 {
00058 }
00059
00060 static bool checkForBogusNumbers(const LevelData<EBFluxFAB> & a_data);
00061 static bool checkForBogusNumbers(const LevelData<EBCellFAB> & a_data);
00062
00063
00064
00065
00066
00067
00068
00069 static void averageCellToFace(EBFaceFAB & a_fluxData,
00070 const EBCellFAB & a_cellData,
00071 const Box & a_grid,
00072 const EBISBox & a_ebisl,
00073 const ProblemDomain & a_domain,
00074 int isrc, int idst, int inco,
00075 bool a_interpolateToCentroid);
00076
00077
00078 static void checkData(const LevelData<EBCellFAB>&a_data, const string& label);
00079
00080 static void checkData(const LevelData<EBFluxFAB>&a_data, const string& label);
00081
00082
00083 static void plus(LevelData<EBCellFAB> & a_dst,
00084 const LevelData<EBCellFAB> & a_src,
00085 int srccomp, int dstcomp, int numcomp);
00086
00087
00088
00089
00090
00091
00092 static void faceCenteredAverageCellsToFaces(EBFaceFAB & a_faceData,
00093 const EBCellFAB & a_cellData,
00094 const Box & ccFluxBox,
00095 const EBISBox & a_ebisBox,
00096 const ProblemDomain & a_domain,
00097 int isrc, int idst, int inco);
00098
00099
00100
00101
00102
00103
00104 static void averageCellToFace(LevelData<EBFluxFAB>& a_fluxData,
00105 const LevelData<EBCellFAB>& a_cellData,
00106 const DisjointBoxLayout& a_grids,
00107 const EBISLayout& a_ebisl,
00108 const ProblemDomain& a_domain,
00109 int isrc, int idst, int inco,
00110 bool a_interpolateToCentroid);
00111
00112
00113
00114 static void pruneCoveredBoxes(Vector<Box>& a_boxes,
00115 const ProblemDomain& a_domain,
00116 const EBIndexSpace* a_ebisPtr,
00117 const int& a_ghosts = 0);
00118
00119
00120
00121
00122 static int parallelSum(const int& a_value);
00123
00124
00125
00126
00127 static long long parallelSum(const long long& a_value);
00128
00129
00130
00131
00132 static Real parallelSum(const Real& a_value);
00133
00134
00135
00136
00137 static int parallelMin(const int& a_value);
00138
00139
00140
00141
00142 static int parallelMax(const int& a_value);
00143
00144
00145
00146
00147 static Real parallelMin(const Real& a_value);
00148
00149
00150
00151
00152 static Real parallelMax(const Real& a_value);
00153
00154
00155
00156
00157
00158 static void
00159 averageCellToFaces(LevelData<EBFluxFAB>& a_fluxData,
00160 const LevelData<EBCellFAB>& a_cellData,
00161 const DisjointBoxLayout& a_grids,
00162 const EBISLayout& a_ebisl,
00163 const ProblemDomain& a_domain,
00164 const int& a_comp);
00165
00166
00167
00168
00169
00170 static void
00171 averageCellToFacesMAC(LevelData<EBFluxFAB>& a_fluxData,
00172 const LevelData<EBCellFAB>& a_cellData,
00173 const DisjointBoxLayout& a_grids,
00174 const EBISLayout& a_ebisl,
00175 const ProblemDomain& a_domain);
00176
00177
00178
00179
00180
00181 static void exchangeAll(LevelData<EBCellFAB>& a_phi);
00182
00183
00184
00185
00186 static void exchangeCorners(LevelData<EBCellFAB>& a_data,
00187 const ProblemDomain& a_domain);
00188
00189
00190
00191
00192 static void exchangeComp(LevelData<EBCellFAB>& a_data,
00193 const int& a_comp);
00194
00195
00196
00197
00198
00199 static void exchangeAll(LevelData<EBFluxFAB>& a_phi);
00200
00201
00202
00203
00204
00205 static void exchangeComp(LevelData<EBFluxFAB>& a_data,
00206 const int& a_comp);
00207
00208
00209
00210
00211
00212 static void setIrregVal(LevelData<EBCellFAB>& a_data,
00213 const DisjointBoxLayout& a_dbl,
00214 const EBISLayout& a_ebisl,
00215 const Real& a_value);
00216
00217
00218
00219
00220 static bool checkNANINF(const LevelData<EBCellFAB>&a_data,
00221 const IntVect& a_iv1 = IntVect::Zero,
00222 const IntVect& a_iv2 = IntVect::Zero,
00223 const Real& a_shift = 0.0);
00224
00225
00226
00227
00228 static void getMaxMin(Real& a_maxVal,
00229 Real& a_minVal,
00230 const LevelData<EBCellFAB>& a_data,
00231 const int& a_comp,
00232 const bool& a_doAbs=false);
00233
00234
00235 static void getMaxMin(Real& a_maxVal,
00236 Real& a_minVal,
00237 const LevelData<EBFluxFAB>& a_data,
00238 const int& a_comp,
00239 const int& a_idir,
00240 const bool& a_doAbs=false);
00241
00242
00243
00244 static void setCoveredVal(LevelData<EBCellFAB>& a_lData,
00245 const Real& a_value);
00246
00247
00248
00249
00250
00251 static void setCoveredVal(LevelData<EBCellFAB>& a_lData,
00252 const int& a_comp,
00253 const Real& a_value);
00254
00255
00256
00257
00258
00259 static void setCoveredVal(LevelData<EBFluxFAB>& a_lData,
00260 const Real& a_value);
00261
00262
00263
00264
00265
00266 static void setCoveredVal(LevelData<EBFluxFAB>& a_lData,
00267 const int& a_comp,
00268 const Real& a_value);
00269
00270
00271
00272
00273 static void averageMultiVofsToRegFAB(LevelData<EBCellFAB>& a_data,
00274 const DisjointBoxLayout& a_dbl,
00275 const EBISLayout& a_ebisl);
00276
00277
00278
00279
00280
00281 static void copyToMultiVofsFromRegFAB(LevelData<EBCellFAB>& a_data,
00282 const DisjointBoxLayout& a_dbl,
00283 const EBISLayout& a_ebisl);
00284
00285
00286
00287
00288
00289 static void defineLevelData(LevelData<EBCellFAB>& a_levelData,
00290 const EBISLayout& a_ebisl,
00291 const DisjointBoxLayout& a_dbl,
00292 const IntVect& a_ghosts,
00293 const int& a_nComp);
00294
00295
00296
00297
00298
00299 static void defineLevelData(LevelData<EBFluxFAB>& a_levelData,
00300 const EBISLayout& a_ebisl,
00301 const DisjointBoxLayout& a_dbl,
00302 const IntVect& a_ghosts,
00303 const int& a_nComp);
00304
00305
00306
00307
00308
00309 static void setToZero(LevelData<EBCellFAB>& a_result);
00310
00311
00312
00313
00314
00315 static void setToZero(LevelData<EBFluxFAB>& a_result);
00316
00317
00318
00319
00320
00321 static void scale(LevelData<EBFluxFAB>& a_lhs,
00322 const Real& a_scale) ;
00323
00324 static void scale(LevelData<EBCellFAB>& a_lhs,
00325 const LevelData<EBCellFAB>& a_scale) ;
00326
00327
00328
00329
00330
00331 static void scale(LevelData<EBCellFAB>& a_lhs,
00332 const Real& a_scale) ;
00333
00334
00335
00336
00337
00338 static void scale(LevelData<EBCellFAB>& a_lhs,
00339 const Real& a_scale,
00340 const int& a_comp);
00341
00342
00343
00344
00345
00346 static void setVal(LevelData<EBCellFAB>& a_result,
00347 const Real& a_value);
00348
00349
00350
00351
00352 static void setVal(LevelData<BaseIVFAB<Real> >& a_result,
00353 const Real& a_value);
00354
00355
00356
00357
00358 static void setVal(LevelData<EBCellFAB>& a_result,
00359 const Real& a_value,
00360 const int& a_comp);
00361
00362
00363
00364
00365 static void setVal(LevelData<EBFluxFAB>& a_result,
00366 const Real& a_value);
00367
00368
00369
00370
00371 static void assign(LevelData<EBCellFAB>& a_to,
00372 const LevelData<EBCellFAB>& a_from,
00373 const Interval& a_toInterva,
00374 const Interval& a_fromInterval);
00375
00376
00377
00378
00379
00380 static void assign(LevelData<EBCellFAB>& a_lhs,
00381 const LevelData<EBCellFAB>& a_rhs);
00382
00383
00384
00385
00386
00387 static void clone(LevelData<EBCellFAB>& a_lhs,
00388 const LevelData<EBCellFAB>& a_rhs);
00389
00390
00391
00392
00393
00394 static void assign(LevelData<EBFluxFAB>& a_lhs,
00395 const LevelData<EBFluxFAB>& a_rhs);
00396
00397
00398
00399
00400
00401 static void incr( LevelData<EBCellFAB>& a_lhs,
00402 const LevelData<EBCellFAB>& a_rhs,
00403 const Real& a_scale);
00404
00405
00406
00407
00408
00409 static void incr( LevelData<EBCellFAB>& a_lhs,
00410 const Real& a_scale);
00411
00412
00413
00414
00415
00416 static void axby( LevelData<EBCellFAB>& a_lhs,
00417 const LevelData<EBCellFAB>& a_x,
00418 const LevelData<EBCellFAB>& a_y,
00419 const Real& a,
00420 const Real& b);
00421
00422
00423
00424
00425
00426
00427
00428
00429
00430
00431
00432
00433
00434
00435
00436
00437
00438
00439
00440 static void sum(LevelData<EBCellFAB>& a_result,
00441 const LevelData<EBCellFAB>& a_in1,
00442 const LevelData<EBCellFAB>& a_in2);
00443
00444
00445
00446
00447
00448 static void addConstant(LevelData<EBCellFAB>& a_data,
00449 const Real& a_constant);
00450
00451
00452
00453
00454
00455 static void power(LevelData<EBCellFAB>& a_result,
00456 const Real& a_exponent,
00457 const int& a_comp);
00458
00459
00460
00461
00462 static void product(LevelData<EBCellFAB>& a_result,
00463 const LevelData<EBCellFAB>& a_in1,
00464 const LevelData<EBCellFAB>& a_in2);
00465
00466
00467
00468
00469
00470 static void product(LevelData<EBFluxFAB>& a_result,
00471 const LevelData<EBFluxFAB>& a_in1,
00472 const LevelData<EBFluxFAB>& a_in2);
00473
00474
00475
00476
00477
00478 static void product(LevelData<EBCellFAB>& a_result,
00479 const LevelData<EBCellFAB>& a_in1,
00480 const LevelData<EBCellFAB>& a_in2,
00481 const int& a_rComp,
00482 const int& a_1Comp,
00483 const int& a_2Comp);
00484
00485
00486
00487
00488
00489 static void invert(LevelData<EBCellFAB>& a_result,
00490 const LevelData<EBCellFAB>& a_in1);
00491
00492
00493
00494
00495
00496 static void divideVectorByScalar(LevelData<EBCellFAB>& a_vectorOut,
00497 const LevelData<EBCellFAB>& a_vectorIn,
00498 const LevelData<EBCellFAB>& a_scalar);
00499
00500
00501
00502
00503 static void divide(LevelData<EBCellFAB>& a_result,
00504 const LevelData<EBCellFAB>& a_in1,
00505 const LevelData<EBCellFAB>& a_in2);
00506
00507
00508
00509
00510
00511 static void divide(LevelData<EBCellFAB>& a_result,
00512 const LevelData<EBCellFAB>& a_in1,
00513 const LevelData<EBCellFAB>& a_in2,
00514 const int& a_rComp,
00515 const int& a_1Comp,
00516 const int& a_2Comp);
00517
00518
00519
00520
00521
00522
00523 static void areaFracScalingWeight(LevelData<EBCellFAB>& a_data);
00524
00525
00526
00527
00528
00529 static void areaFracScalingWeight(EBCellFAB& a_data);
00530
00531
00532
00533
00534 static void kappaWeight(LevelData<EBCellFAB>& a_data);
00535
00536
00537
00538
00539 static void kappaWeight(EBCellFAB& a_data);
00540
00541
00542
00543
00544
00545 static void kappaScale(LevelData<EBCellFAB>& a_data,
00546 const Real& a_scale);
00547
00548
00549
00550
00551
00552 static Real kappaNorm(Real& a_volume,
00553 const LevelData<EBCellFAB>& a_data,
00554 int a_which,
00555 const ProblemDomain& a_domain,
00556 int a_p=2);
00557
00558
00559
00560
00561
00562 static Vector<Real> vectorKappaNorm(Real& a_volume,
00563 const LevelData<EBCellFAB>& a_data,
00564 int a_which,
00565 const ProblemDomain& a_domain,
00566 int a_p=2);
00567
00568
00569
00570
00571
00572 static Real noKappaNorm(Real& a_volume,
00573 const LevelData<EBCellFAB>& a_data,
00574 int a_which,
00575 const ProblemDomain& a_domain,
00576 int a_p=2);
00577
00578
00579
00580
00581
00582 static Real kappaDotProduct(Real& a_volume,
00583 const LevelData<EBCellFAB>& a_data1,
00584 const LevelData<EBCellFAB>& a_data2,
00585 int a_which,
00586 const ProblemDomain& a_domain);
00587
00588
00589
00590
00591
00592 static Real noKappaDotProduct(Real& a_volume,
00593 const LevelData<EBCellFAB>& a_data1,
00594 const LevelData<EBCellFAB>& a_data2,
00595 int a_which,
00596 const ProblemDomain& a_domain);
00597
00598
00599
00600
00601
00602 static Real kappaSumLevel(Real& a_volume,
00603 const LevelData<EBCellFAB>& a_data,
00604 int a_which,
00605 const ProblemDomain& a_domain);
00606
00607
00608
00609
00610
00611 static Real noKappaSumLevel(Real& a_volume,
00612 const LevelData<EBCellFAB>& a_data,
00613 int a_which,
00614 const ProblemDomain& a_domain);
00615
00616
00617
00618
00619
00620 static Vector<Real> vectorSumKappaPow(Real& a_volume,
00621 const EBCellFAB& a_data, const Box& curBox,
00622 int a_which,
00623 const ProblemDomain& a_domain,
00624 int a_p);
00625
00626
00627
00628
00629 static Real sumKappaPow(Real& a_volume,
00630 const EBCellFAB& a_data, const Box& a_region,
00631 int a_which,
00632 const ProblemDomain& a_domain,
00633 int a_p);
00634
00635
00636
00637
00638
00639 static Real sumNoKappaPow(Real& a_volume,
00640 const EBCellFAB& a_data,const Box& a_region,
00641 int a_which,
00642 const ProblemDomain& a_domain,
00643 int a_p);
00644
00645
00646
00647
00648
00649 static Real sumKappaDotProduct(Real& a_volume,
00650 const EBCellFAB& a_data1,
00651 const EBCellFAB& a_data2,
00652 const Box& a_region,
00653 int a_which,
00654 const ProblemDomain& a_domain);
00655
00656
00657
00658
00659 static Real sumKappaDotProductAllCells(Real& a_volume,
00660 const EBCellFAB& a_data1,
00661 const EBCellFAB& a_data2,
00662 const Box& a_region,
00663 int a_which,
00664 const ProblemDomain& a_domain);
00665
00666
00667
00668 static Real sumNoKappaDotProduct(Real& a_volume,
00669 const EBCellFAB& a_data1,
00670 const EBCellFAB& a_data2,const Box& a_region,
00671 int a_which,
00672 const ProblemDomain& a_domain);
00673
00674
00675
00676
00677
00678 static Real sumKappa(Real& a_volume,
00679 const EBCellFAB& a_data,const Box& a_region,
00680 int a_which,
00681 const ProblemDomain& a_domain);
00682
00683
00684
00685
00686
00687 static Real sumNoKappa(Real& a_volume,
00688 const EBCellFAB& a_data,const Box& a_region,
00689 int a_which,
00690 const ProblemDomain& a_domain);
00691
00692
00693
00694
00695
00696
00697 static void
00698 averageCellToFace(EBFaceFAB& a_faceData,
00699 const EBCellFAB& a_cellData,
00700 const EBGraph& a_ebGraph,
00701 const Box& a_dblBox,
00702 const int& a_ghostFlux,
00703 const int& a_idir,
00704 const ProblemDomain& a_domain,
00705 const int& a_cellComp,
00706 const int& a_faceComp);
00707
00708
00709
00710
00711
00712 static void gatherBroadCast(Real& a_accum, Real& a_volume, const int& a_p);
00713
00714
00715
00716
00717 static void gatherBroadCast(Vector<Real>& a_accum, Real& a_volume, const int& a_p);
00718
00719
00720
00721
00722
00723 static Real sum(const LevelData<EBCellFAB> & a_data,
00724 const DisjointBoxLayout & a_grids,
00725 const EBISLayout & a_ebisl,
00726 const IntVectSet & a_ivsExclude,
00727 int a_comp,
00728 bool a_mutiplyByKappa);
00729 private:
00730
00731 };
00732 #include "NamespaceFooter.H"
00733 #endif