00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef CARTESIAN_CENTERING_H
00021 #define CARTESIAN_CENTERING_H
00022
00023
00024 #ifdef IPPL_USE_STANDARD_HEADERS
00025 #include <iostream>
00026 using namespace std;
00027 #else
00028 #include <iostream.h>
00029 #endif
00030
00031
00032
00033
00034
00035 enum CenteringEnum {CELL=0, VERTEX=1, VERT=1};
00036 extern char* CenteringEnum_Names[2];
00037
00038
00039 template<const CenteringEnum* CE, unsigned Dim, unsigned NComponents=1U>
00040 class CartesianCentering
00041 {
00042 public:
00043 static void print_Centerings(ostream&);
00044 static char* CenteringName;
00045 };
00046 template <const CenteringEnum* CE, unsigned Dim, unsigned NComponents>
00047 void CartesianCentering<CE,Dim,NComponents>::
00048 print_Centerings(ostream& out)
00049 {
00050 int i,j;
00051 #ifndef __MWERKS__
00052
00053
00054 out << CenteringName << endl;
00055 #endif // __MWERKS__
00056 out << "Dim = " << Dim << " ; NComponents = " << NComponents << endl;
00057 for (i=0;i<Dim;i++) {
00058 for (j=0;j<NComponents;j++) {
00059 out << "centering[dim=" << i << "][component=" << j << "] = "
00060 << CenteringEnum_Names[CE[j+i*NComponents]] << endl;
00061 }
00062 }
00063 }
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075 template<unsigned Dim, unsigned NComponents=1U, unsigned Direction=0U>
00076 struct CCCEnums
00077 {
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097 };
00098
00099
00100
00101
00102
00103
00104
00105
00106 template<>
00107 struct CCCEnums<1U,1U,0U> {
00108 static CenteringEnum allCell[1U*1U];
00109 static CenteringEnum allVertex[1U*1U];
00110
00111 static CenteringEnum vectorFace[1U*1U];
00112 static CenteringEnum vectorEdge[1U*1U];
00113
00114 static CenteringEnum allFace[1U*1U];
00115 static CenteringEnum allEdge[1U*1U];
00116 };
00117
00118
00119
00120
00121
00122
00123
00124 template<>
00125 struct CCCEnums<2U,1U,0U> {
00126 static CenteringEnum allCell[2U*1U];
00127 static CenteringEnum allVertex[2U*1U];
00128
00129 static CenteringEnum allFace[2U*1U];
00130 static CenteringEnum allEdge[2U*1U];
00131 };
00132 template<>
00133 struct CCCEnums<2U,1U,1U> {
00134
00135 static CenteringEnum allFace[2U*1U];
00136 static CenteringEnum allEdge[2U*1U];
00137 };
00138
00139
00140 template<>
00141 struct CCCEnums<2U,2U,0U> {
00142 static CenteringEnum allCell[2U*2U];
00143 static CenteringEnum allVertex[2U*2U];
00144
00145 static CenteringEnum vectorFace[2U*2U];
00146 static CenteringEnum vectorEdge[2U*2U];
00147
00148 static CenteringEnum allFace[2U*2U];
00149 static CenteringEnum allEdge[2U*2U];
00150 };
00151 template<>
00152 struct CCCEnums<2U,2U,1U> {
00153
00154 static CenteringEnum allFace[2U*2U];
00155 static CenteringEnum allEdge[2U*2U];
00156 };
00157
00158
00159 template<>
00160 struct CCCEnums<2U,4U,0U> {
00161 static CenteringEnum allCell[4U*2U];
00162 static CenteringEnum allVertex[4U*2U];
00163
00164 static CenteringEnum allFace[2U*4U];
00165 static CenteringEnum allEdge[2U*4U];
00166 };
00167 template<>
00168 struct CCCEnums<2U,4U,1U> {
00169
00170 static CenteringEnum allFace[2U*4U];
00171 static CenteringEnum allEdge[2U*4U];
00172 };
00173
00174
00175 template<>
00176 struct CCCEnums<2U,3U,0U> {
00177 static CenteringEnum allCell[2U*3U];
00178 static CenteringEnum allVertex[2U*3U];
00179
00180 static CenteringEnum allFace[2U*3U];
00181 static CenteringEnum allEdge[2U*3U];
00182 };
00183 template<>
00184 struct CCCEnums<2U,3U,1U> {
00185
00186 static CenteringEnum allFace[2U*3U];
00187 static CenteringEnum allEdge[2U*3U];
00188 };
00189
00190
00191
00192
00193
00194
00195
00196 template<>
00197 struct CCCEnums<3U,1U,0U> {
00198 static CenteringEnum allCell[3U*1U];
00199 static CenteringEnum allVertex[3U*1U];
00200
00201 static CenteringEnum allFace[3U*1U];
00202 static CenteringEnum allEdge[3U*1U];
00203 };
00204 template<>
00205 struct CCCEnums<3U,1U,1U> {
00206
00207 static CenteringEnum allFace[3U*1U];
00208 static CenteringEnum allEdge[3U*1U];
00209 };
00210 template<>
00211 struct CCCEnums<3U,1U,2U> {
00212
00213 static CenteringEnum allFace[3U*1U];
00214 static CenteringEnum allEdge[3U*1U];
00215 };
00216
00217
00218 template<>
00219 struct CCCEnums<3U,2U,0U> {
00220 static CenteringEnum allCell[3U*2U];
00221 static CenteringEnum allVertex[3U*2U];
00222
00223 static CenteringEnum allFace[3U*2U];
00224 static CenteringEnum allEdge[3U*2U];
00225 };
00226 template<>
00227 struct CCCEnums<3U,2U,1U> {
00228
00229 static CenteringEnum allFace[3U*2U];
00230 static CenteringEnum allEdge[3U*2U];
00231 };
00232 template<>
00233 struct CCCEnums<3U,2U,2U> {
00234
00235 static CenteringEnum allFace[3U*2U];
00236 static CenteringEnum allEdge[3U*2U];
00237 };
00238
00239
00240 template<>
00241 struct CCCEnums<3U,3U,0U> {
00242 static CenteringEnum allCell[3U*3U];
00243 static CenteringEnum allVertex[3U*3U];
00244
00245 static CenteringEnum vectorFace[3U*3U];
00246 static CenteringEnum vectorEdge[3U*3U];
00247
00248 static CenteringEnum allFace[3U*3U];
00249 static CenteringEnum allEdge[3U*3U];
00250 };
00251 template<>
00252 struct CCCEnums<3U,3U,1U> {
00253
00254 static CenteringEnum allFace[3U*3U];
00255 static CenteringEnum allEdge[3U*3U];
00256 };
00257 template<>
00258 struct CCCEnums<3U,3U,2U> {
00259
00260 static CenteringEnum allFace[3U*3U];
00261 static CenteringEnum allEdge[3U*3U];
00262 };
00263
00264
00265 template<>
00266 struct CCCEnums<3U,9U,0U> {
00267 static CenteringEnum allCell[3U*9U];
00268 static CenteringEnum allVertex[3U*9U];
00269
00270 static CenteringEnum allFace[3U*9U];
00271 static CenteringEnum allEdge[3U*9U];
00272 };
00273 template<>
00274 struct CCCEnums<3U,9U,1U> {
00275
00276 static CenteringEnum allFace[3U*9U];
00277 static CenteringEnum allEdge[3U*9U];
00278 };
00279 template<>
00280 struct CCCEnums<3U,9U,2U> {
00281
00282 static CenteringEnum allFace[3U*9U];
00283 static CenteringEnum allEdge[3U*9U];
00284 };
00285
00286
00287 template<>
00288 struct CCCEnums<3U,6U,0U> {
00289 static CenteringEnum allCell[3U*6U];
00290 static CenteringEnum allVertex[3U*6U];
00291
00292 static CenteringEnum allFace[3U*6U];
00293 static CenteringEnum allEdge[3U*6U];
00294 };
00295 template<>
00296 struct CCCEnums<3U,6U,1U> {
00297
00298 static CenteringEnum allFace[3U*6U];
00299 static CenteringEnum allEdge[3U*6U];
00300 };
00301 template<>
00302 struct CCCEnums<3U,6U,2U> {
00303
00304 static CenteringEnum allFace[3U*6U];
00305 static CenteringEnum allEdge[3U*6U];
00306 };
00307
00308
00309
00310
00311
00312
00313
00314
00315
00316 template<unsigned Dim, unsigned NComponents=1U, unsigned Direction=0U>
00317 struct CommonCartesianCenterings
00318 {
00319
00320
00321
00322
00323
00324
00325
00326
00327
00328
00329
00330
00331
00332 };
00333
00334
00335
00336
00337
00338
00339
00340
00341
00342 template<>
00343 struct CommonCartesianCenterings<1U,1U,0U>
00344 {
00345 typedef CartesianCentering<CCCEnums<1U,1U,0U>::allCell,1U,1U> allCell;
00346 typedef CartesianCentering<CCCEnums<1U,1U,0U>::allVertex,1U,1U> allVertex;
00347
00348 typedef CartesianCentering<CCCEnums<1U,1U,0U>::vectorFace,1U,1U> vectorFace;
00349 typedef CartesianCentering<CCCEnums<1U,1U,0U>::vectorEdge,1U,1U> vectorEdge;
00350
00351 typedef CartesianCentering<CCCEnums<1U,1U,0U>::allFace,1U,1U> allFace;
00352 typedef CartesianCentering<CCCEnums<1U,1U,0U>::allEdge,1U,1U> allEdge;
00353 };
00354
00355
00356
00357
00358
00359
00360
00361 template<>
00362 struct CommonCartesianCenterings<2U,1U,0U>
00363 {
00364 typedef CartesianCentering<CCCEnums<2U,1U,0U>::allCell,2U,1U> allCell;
00365 typedef CartesianCentering<CCCEnums<2U,1U,0U>::allVertex,2U,1U> allVertex;
00366
00367 typedef CartesianCentering<CCCEnums<2U,1U,0U>::allFace,2U,1U> allFace;
00368 typedef CartesianCentering<CCCEnums<2U,1U,0U>::allEdge,2U,1U> allEdge;
00369 };
00370 template<>
00371 struct CommonCartesianCenterings<2U,1U,1U> {
00372
00373 typedef CartesianCentering<CCCEnums<2U,1U,1U>::allFace,2U,1U> allFace;
00374 typedef CartesianCentering<CCCEnums<2U,1U,1U>::allEdge,2U,1U> allEdge;
00375 };
00376
00377
00378 template<>
00379 struct CommonCartesianCenterings<2U,2U,0U>
00380 {
00381 typedef CartesianCentering<CCCEnums<2U,2U,0U>::allCell,2U,2U> allCell;
00382 typedef CartesianCentering<CCCEnums<2U,2U,0U>::allVertex,2U,2U> allVertex;
00383
00384 typedef CartesianCentering<CCCEnums<2U,2U,0U>::vectorFace,2U,2U> vectorFace;
00385 typedef CartesianCentering<CCCEnums<2U,2U,0U>::vectorEdge,2U,2U> vectorEdge;
00386
00387 typedef CartesianCentering<CCCEnums<2U,2U,0U>::allFace,2U,2U> allFace;
00388 typedef CartesianCentering<CCCEnums<2U,2U,0U>::allEdge,2U,2U> allEdge;
00389 };
00390 template<>
00391 struct CommonCartesianCenterings<2U,2U,1U>
00392 {
00393
00394 typedef CartesianCentering<CCCEnums<2U,2U,1U>::allFace,2U,2U> allFace;
00395 typedef CartesianCentering<CCCEnums<2U,2U,1U>::allEdge,2U,2U> allEdge;
00396 };
00397
00398
00399 template<>
00400 struct CommonCartesianCenterings<2U,4U,0U>
00401 {
00402 typedef CartesianCentering<CCCEnums<2U,4U,0U>::allCell,2U,4U> allCell;
00403 typedef CartesianCentering<CCCEnums<2U,4U,0U>::allVertex,2U,4U> allVertex;
00404
00405 typedef CartesianCentering<CCCEnums<2U,4U,0U>::allFace,2U,4U> allFace;
00406 typedef CartesianCentering<CCCEnums<2U,4U,0U>::allEdge,2U,4U> allEdge;
00407 };
00408 template<>
00409 struct CommonCartesianCenterings<2U,4U,1U>
00410 {
00411
00412 typedef CartesianCentering<CCCEnums<2U,4U,1U>::allFace,2U,4U> allFace;
00413 typedef CartesianCentering<CCCEnums<2U,4U,1U>::allEdge,2U,4U> allEdge;
00414 };
00415
00416
00417 template<>
00418 struct CommonCartesianCenterings<2U,3U,0U>
00419 {
00420 typedef CartesianCentering<CCCEnums<2U,3U,0U>::allCell,2U,3U> allCell;
00421 typedef CartesianCentering<CCCEnums<2U,3U,0U>::allVertex,2U,3U> allVertex;
00422
00423 typedef CartesianCentering<CCCEnums<2U,3U,0U>::allFace,2U,3U> allFace;
00424 typedef CartesianCentering<CCCEnums<2U,3U,0U>::allEdge,2U,3U> allEdge;
00425 };
00426 template<>
00427 struct CommonCartesianCenterings<2U,3U,1U>
00428 {
00429
00430 typedef CartesianCentering<CCCEnums<2U,3U,1U>::allFace,2U,3U> allFace;
00431 typedef CartesianCentering<CCCEnums<2U,3U,1U>::allEdge,2U,3U> allEdge;
00432 };
00433
00434
00435
00436
00437
00438
00439
00440 template<>
00441 struct CommonCartesianCenterings<3U,1U,0U>
00442 {
00443 typedef CartesianCentering<CCCEnums<3U,1U,0U>::allCell,3U,1U> allCell;
00444 typedef CartesianCentering<CCCEnums<3U,1U,0U>::allVertex,3U,1U> allVertex;
00445
00446 typedef CartesianCentering<CCCEnums<3U,1U,0U>::allFace,3U,1U> allFace;
00447 typedef CartesianCentering<CCCEnums<3U,1U,0U>::allEdge,3U,1U> allEdge;
00448 };
00449 template<>
00450 struct CommonCartesianCenterings<3U,1U,1U>
00451 {
00452
00453 typedef CartesianCentering<CCCEnums<3U,1U,1U>::allFace,3U,1U> allFace;
00454 typedef CartesianCentering<CCCEnums<3U,1U,1U>::allEdge,3U,1U> allEdge;
00455 };
00456 template<>
00457 struct CommonCartesianCenterings<3U,1U,2U>
00458 {
00459
00460 typedef CartesianCentering<CCCEnums<3U,1U,2U>::allFace,3U,1U> allFace;
00461 typedef CartesianCentering<CCCEnums<3U,1U,2U>::allEdge,3U,1U> allEdge;
00462 };
00463
00464
00465 template<>
00466 struct CommonCartesianCenterings<3U,2U,0U>
00467 {
00468 typedef CartesianCentering<CCCEnums<3U,2U,0U>::allCell,3U,2U> allCell;
00469 typedef CartesianCentering<CCCEnums<3U,2U,0U>::allVertex,3U,2U> allVertex;
00470
00471 typedef CartesianCentering<CCCEnums<3U,2U,0U>::allFace,3U,2U> allFace;
00472 typedef CartesianCentering<CCCEnums<3U,2U,0U>::allEdge,3U,2U> allEdge;
00473 };
00474 template<>
00475 struct CommonCartesianCenterings<3U,2U,1U>
00476 {
00477
00478 typedef CartesianCentering<CCCEnums<3U,2U,1U>::allFace,3U,2U> allFace;
00479 typedef CartesianCentering<CCCEnums<3U,2U,1U>::allEdge,3U,2U> allEdge;
00480 };
00481 template<>
00482 struct CommonCartesianCenterings<3U,2U,2U>
00483 {
00484
00485 typedef CartesianCentering<CCCEnums<3U,2U,2U>::allFace,3U,2U> allFace;
00486 typedef CartesianCentering<CCCEnums<3U,2U,2U>::allEdge,3U,2U> allEdge;
00487 };
00488
00489
00490 template<>
00491 struct CommonCartesianCenterings<3U,3U,0U>
00492 {
00493 typedef CartesianCentering<CCCEnums<3U,3U,0U>::allCell,3U,3U> allCell;
00494 typedef CartesianCentering<CCCEnums<3U,3U,0U>::allVertex,3U,3U> allVertex;
00495
00496 typedef CartesianCentering<CCCEnums<3U,3U,0U>::vectorFace,3U,3U> vectorFace;
00497 typedef CartesianCentering<CCCEnums<3U,3U,0U>::vectorEdge,3U,3U> vectorEdge;
00498
00499 typedef CartesianCentering<CCCEnums<3U,3U,0U>::allFace,3U,3U> allFace;
00500 typedef CartesianCentering<CCCEnums<3U,3U,0U>::allEdge,3U,3U> allEdge;
00501 };
00502 template<>
00503 struct CommonCartesianCenterings<3U,3U,1U>
00504 {
00505
00506 typedef CartesianCentering<CCCEnums<3U,3U,1U>::allFace,3U,3U> allFace;
00507 typedef CartesianCentering<CCCEnums<3U,3U,1U>::allEdge,3U,3U> allEdge;
00508 };
00509 template<>
00510 struct CommonCartesianCenterings<3U,3U,2U>
00511 {
00512
00513 typedef CartesianCentering<CCCEnums<3U,3U,2U>::allFace,3U,3U> allFace;
00514 typedef CartesianCentering<CCCEnums<3U,3U,2U>::allEdge,3U,3U> allEdge;
00515 };
00516
00517
00518
00519 template<>
00520 struct CommonCartesianCenterings<3U,9U,0U>
00521 {
00522 typedef CartesianCentering<CCCEnums<3U,9U,0U>::allCell,3U,9U> allCell;
00523 typedef CartesianCentering<CCCEnums<3U,9U,0U>::allVertex,3U,9U> allVertex;
00524
00525 typedef CartesianCentering<CCCEnums<3U,9U,0U>::allFace,3U,9U> allFace;
00526 typedef CartesianCentering<CCCEnums<3U,9U,0U>::allEdge,3U,9U> allEdge;
00527 };
00528 template<>
00529 struct CommonCartesianCenterings<3U,9U,1U>
00530 {
00531
00532 typedef CartesianCentering<CCCEnums<3U,9U,1U>::allFace,3U,9U> allFace;
00533 typedef CartesianCentering<CCCEnums<3U,9U,1U>::allEdge,3U,9U> allEdge;
00534 };
00535 template<>
00536 struct CommonCartesianCenterings<3U,9U,2U>
00537 {
00538
00539 typedef CartesianCentering<CCCEnums<3U,9U,2U>::allFace,3U,9U> allFace;
00540 typedef CartesianCentering<CCCEnums<3U,9U,2U>::allEdge,3U,9U> allEdge;
00541 };
00542
00543
00544 template<>
00545 struct CommonCartesianCenterings<3U,6U,0U>
00546 {
00547 typedef CartesianCentering<CCCEnums<3U,6U,0U>::allCell,3U,6U> allCell;
00548 typedef CartesianCentering<CCCEnums<3U,6U,0U>::allVertex,3U,6U> allVertex;
00549
00550 typedef CartesianCentering<CCCEnums<3U,6U,0U>::allFace,3U,6U> allFace;
00551 typedef CartesianCentering<CCCEnums<3U,6U,0U>::allEdge,3U,6U> allEdge;
00552 };
00553 template<>
00554 struct CommonCartesianCenterings<3U,6U,1U>
00555 {
00556
00557 typedef CartesianCentering<CCCEnums<3U,6U,1U>::allFace,3U,6U> allFace;
00558 typedef CartesianCentering<CCCEnums<3U,6U,1U>::allEdge,3U,6U> allEdge;
00559 };
00560 template<>
00561 struct CommonCartesianCenterings<3U,6U,2U>
00562 {
00563
00564 typedef CartesianCentering<CCCEnums<3U,6U,2U>::allFace,3U,6U> allFace;
00565 typedef CartesianCentering<CCCEnums<3U,6U,2U>::allEdge,3U,6U> allEdge;
00566 };
00567
00568 #include "Meshes/CartesianCentering.cpp"
00569
00570 #endif // CARTESIAN_CENTERING_H
00571
00572
00573
00574
00575
00576