src/expde/grid/listint/listint4.h

Go to the documentation of this file.
00001 //    expde: expression templates for partial differential equations.
00002 //    Copyright (C) 2001  Christoph Pflaum
00003 //    This program is free software; you can redistribute it and/or modify
00004 //    it under the terms of the GNU General Public License as published by
00005 //    the Free Software Foundation; either version 2 of the License, or
00006 //    (at your option) any later version.
00007 //
00008 //    This program is distributed in the hope that it will be useful,
00009 //    but WITHOUT ANY WARRANTY; without even the implied warranty of
00010 //    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00011 //    GNU General Public License for more details.
00012 //
00013 //                 SEE  Notice1.doc made by 
00014 //                 LAWRENCE LIVERMORE NATIONAL LABORATORY
00015 //
00016 
00017 // ------------------------------------------------------------
00018 // listint3.h
00019 //
00020 // ------------------------------------------------------------
00021 
00022 #define initialize_interior true
00023 
00024 
00025 class P_interior {
00026  public:
00027   P_interior(Index3D I, P_interior* Next) : ind(I), next(Next) {};
00028 
00029   // initialize
00030   void initialize(const Grid* gitter, int var_ebene);
00031 
00032   // same level
00033   // --------------
00034   // idem:
00035   double *varM(const Grid* gitter,int level) const;
00036   // next:
00037   double *varN(const Grid* gitter, int level) const;
00038   double *varS(const Grid* gitter, int level) const;
00039   double *varW(const Grid* gitter, int level) const;
00040   double *varE(const Grid* gitter, int level) const;
00041   double *varT(const Grid* gitter, int level) const;
00042   double *varD(const Grid* gitter, int level) const;
00043   // double next:
00044   double *varND(const Grid* gitter, int level) const;
00045   double *varWN(const Grid* gitter, int level) const;
00046   double *varWT(const Grid* gitter, int level) const;
00047   double *varED(const Grid* gitter, int level) const;
00048   double *varST(const Grid* gitter, int level) const;
00049   double *varES(const Grid* gitter, int level) const;
00050   // third next:
00051   double *varEST(const Grid* gitter, int level) const;
00052   double *varWND(const Grid* gitter, int level) const;
00053 
00054   // double next special
00055   double *varWD(const Grid* gitter, int level) const;
00056   double *varET(const Grid* gitter, int level) const;
00057 
00058   // cell variable:
00059   double *cell_varWSD(const Grid* gitter,int lev) const;
00060   double *cell_varWST(const Grid* gitter,int lev) const;
00061   double *cell_varWND(const Grid* gitter,int lev) const;
00062   double *cell_varWNT(const Grid* gitter,int lev) const;
00063   double *cell_varESD(const Grid* gitter,int lev) const;
00064   double *cell_varEST(const Grid* gitter,int lev) const;
00065   double *cell_varEND(const Grid* gitter,int lev) const;
00066   double *cell_varENT(const Grid* gitter,int lev) const;
00067 
00068   // finer level
00069   // --------------
00070   // idem:
00071   double *var_fine_M(const Grid* gitter, int level) const;
00072   // next:
00073   double *var_fine_N(const Grid* gitter, int level) const;
00074   double *var_fine_S(const Grid* gitter, int level) const;
00075   double *var_fine_W(const Grid* gitter, int level) const;
00076   double *var_fine_E(const Grid* gitter, int level) const;
00077   double *var_fine_T(const Grid* gitter, int level) const;
00078   double *var_fine_D(const Grid* gitter, int level) const;
00079   // double next:
00080   double *var_fine_ND(const Grid* gitter, int level) const;
00081   double *var_fine_WN(const Grid* gitter, int level) const;
00082   double *var_fine_WT(const Grid* gitter, int level) const;
00083   double *var_fine_ED(const Grid* gitter, int level) const;
00084   double *var_fine_ST(const Grid* gitter, int level) const;
00085   double *var_fine_ES(const Grid* gitter, int level) const;
00086   // third next:
00087   double *var_fine_EST(const Grid* gitter, int level) const;
00088   double *var_fine_WND(const Grid* gitter, int level) const;
00089 
00090   // coarse level
00091   // --------------
00092   // idem:
00093   double *var_coarse_M(const Grid* gitter, int level) const;
00094   // next:
00095   double *var_coarse_N(const Grid* gitter, int level) const;
00096   double *var_coarse_S(const Grid* gitter, int level) const;
00097   double *var_coarse_W(const Grid* gitter, int level) const;
00098   double *var_coarse_E(const Grid* gitter, int level) const;
00099   double *var_coarse_T(const Grid* gitter, int level) const;
00100   double *var_coarse_D(const Grid* gitter, int level) const;
00101   // double next:
00102   double *var_coarse_ND(const Grid* gitter, int level) const;
00103   double *var_coarse_WN(const Grid* gitter, int level) const;
00104   double *var_coarse_WT(const Grid* gitter, int level) const;
00105   double *var_coarse_ED(const Grid* gitter, int level) const;
00106   double *var_coarse_ST(const Grid* gitter, int level) const;
00107   double *var_coarse_ES(const Grid* gitter, int level) const;
00108   // third next:
00109   double *var_coarse_EST(const Grid* gitter, int level) const;
00110   double *var_coarse_WND(const Grid* gitter, int level) const;
00111 
00112   // physical coordinates of the point
00113   D3vector coordinate(const Grid* gitter) const;
00114   double coordinateX(const Grid* gitter) const;
00115   double coordinateY(const Grid* gitter) const;
00116   double coordinateZ(const Grid* gitter) const;
00117 
00118   // for iteration:
00119   P_interior* Next() { return next; };
00120 
00121   // index of the point
00122   Index3D Ind() const { return ind; };
00123  private:
00124   // same level:
00125   double* pointer_varM;
00126 
00127   double* pointer_varN;
00128   double* pointer_varS;
00129   double* pointer_varE;
00130   double* pointer_varW;
00131   double* pointer_varT;
00132   double* pointer_varD;
00133 
00134   double* pointer_varND;
00135   double* pointer_varWN;
00136   double* pointer_varWT;
00137   double* pointer_varED;
00138   double* pointer_varST;
00139   double* pointer_varES;
00140 
00141   double* pointer_varEST;
00142   double* pointer_varWND;
00143 
00144   // finer level:
00145   double* pointer_fine_varM;
00146 
00147   double* pointer_fine_varN;
00148   double* pointer_fine_varS;
00149   double* pointer_fine_varE;
00150   double* pointer_fine_varW;
00151   double* pointer_fine_varT;
00152   double* pointer_fine_varD;
00153 
00154   double* pointer_fine_varND;
00155   double* pointer_fine_varWN;
00156   double* pointer_fine_varWT;
00157   double* pointer_fine_varED;
00158   double* pointer_fine_varST;
00159   double* pointer_fine_varES;
00160 
00161   double* pointer_fine_varEST;
00162   double* pointer_fine_varWND;
00163 
00164   Index3D ind;
00165   P_interior *next;
00166 };
00167 
00168 
00169 
00170 // coordinates
00171 inline D3vector P_interior::coordinate(const Grid* gitter) const {
00172   return gitter->transform_coord(ind);
00173 };
00174 inline double P_interior::coordinateX(const Grid* gitter) const {
00175   return gitter->transform_coordX(ind);
00176 };
00177 inline double P_interior::coordinateY(const Grid* gitter) const {
00178   return gitter->transform_coordY(ind);
00179 };
00180 inline double P_interior::coordinateZ(const Grid* gitter) const {
00181   return gitter->transform_coordZ(ind);
00182 };
00183 
00184 
00185 inline void P_interior::initialize(const Grid* gitter, int level) {
00186   // same level:
00187   pointer_varM = gitter->Give_variable(ind,level);
00188 
00189   pointer_varN = gitter->Give_variable(ind.next_NS(Rd,level),level);
00190   pointer_varS = gitter->Give_variable(ind.next_NS(Ld,level),level);
00191   pointer_varE = gitter->Give_variable(ind.next_EW(Rd,level),level);
00192   pointer_varW = gitter->Give_variable(ind.next_EW(Ld,level),level);
00193   pointer_varT = gitter->Give_variable(ind.next_TD(Rd,level),level);
00194   pointer_varD = gitter->Give_variable(ind.next_TD(Ld,level),level);
00195   pointer_varND = 
00196     gitter->Give_variable(ind.next_NS(Rd,level).next_TD(Ld,level),level);
00197   pointer_varWN = 
00198     gitter->Give_variable(ind.next_NS(Rd,level).next_EW(Ld,level),level);
00199   pointer_varWT = 
00200     gitter->Give_variable(ind.next_TD(Rd,level).next_EW(Ld,level),level);
00201   pointer_varED =
00202     gitter->Give_variable(ind.next_TD(Ld,level).next_EW(Rd,level),level);
00203   pointer_varST =
00204     gitter->Give_variable(ind.next_TD(Rd,level).next_NS(Ld,level),level);
00205   pointer_varES =
00206     gitter->Give_variable(ind.next_EW(Rd,level).next_NS(Ld,level),level);
00207   pointer_varEST =
00208     gitter->Give_variable(
00209           ind.next_EW(Rd,level).next_NS(Ld,level).next_TD(Rd,level),level);
00210   pointer_varWND =
00211     gitter->Give_variable(
00212           ind.next_EW(Ld,level).next_NS(Rd,level).next_TD(Ld,level),level);
00213 
00214   // finer level
00215   if(level<gitter->Max_level()) {
00216     pointer_fine_varM = gitter->Give_variable(ind,level+1);
00217     
00218     pointer_fine_varN = gitter->Give_variable(ind.next_NS(Rd,level+1),level+1);
00219     pointer_fine_varS = gitter->Give_variable(ind.next_NS(Ld,level+1),level+1);
00220     pointer_fine_varE = gitter->Give_variable(ind.next_EW(Rd,level+1),level+1);
00221     pointer_fine_varW = gitter->Give_variable(ind.next_EW(Ld,level+1),level+1);
00222     pointer_fine_varT = gitter->Give_variable(ind.next_TD(Rd,level+1),level+1);
00223     pointer_fine_varD = gitter->Give_variable(ind.next_TD(Ld,level+1),level+1);
00224     pointer_fine_varND = 
00225       gitter->Give_variable(ind.next_NS(Rd,level+1).next_TD(Ld,level+1),level+1);
00226     pointer_fine_varWN = 
00227       gitter->Give_variable(ind.next_NS(Rd,level+1).next_EW(Ld,level+1),level+1);
00228     pointer_fine_varWT = 
00229       gitter->Give_variable(ind.next_TD(Rd,level+1).next_EW(Ld,level+1),level+1);
00230     pointer_fine_varED =
00231       gitter->Give_variable(ind.next_TD(Ld,level+1).next_EW(Rd,level+1),level+1);
00232     pointer_fine_varST =
00233       gitter->Give_variable(ind.next_TD(Rd,level+1).next_NS(Ld,level+1),level+1);
00234     pointer_fine_varES =
00235       gitter->Give_variable(ind.next_EW(Rd,level+1).next_NS(Ld,level+1),level+1);
00236     pointer_fine_varEST =
00237       gitter->Give_variable(
00238         ind.next_EW(Rd,level+1).next_NS(Ld,level+1).next_TD(Rd,level+1),level+1);
00239     pointer_fine_varWND =
00240       gitter->Give_variable(
00241         ind.next_EW(Ld,level+1).next_NS(Rd,level+1).next_TD(Ld,level+1),level+1);
00242   }
00243 };
00244 
00245 // same level
00246 // --------------
00247 // idem:
00248 inline double *P_interior::varM(const Grid* gitter, int level) const {
00249   return pointer_varM;
00250 };
00251 // next:
00252 inline double *P_interior::varN(const Grid* gitter, int level)
00253      const {
00254   return pointer_varN;
00255 };
00256 inline double *P_interior::varS(const Grid* gitter, int level)
00257      const {
00258   return pointer_varS;
00259 };
00260 inline double *P_interior::varE(const Grid* gitter, int level)
00261      const {
00262   return pointer_varE;
00263 };
00264 inline double *P_interior::varW(const Grid* gitter, int level)
00265      const {
00266   return pointer_varW;
00267 };
00268 inline double *P_interior::varT(const Grid* gitter, int level)
00269      const {
00270   return pointer_varT;
00271 };
00272 inline double *P_interior::varD(const Grid* gitter, int level)
00273      const {
00274   return pointer_varD;
00275 };
00276 // double next:
00277 inline double *P_interior::varND(const Grid* gitter, int level)
00278      const {
00279   return pointer_varND;
00280 };
00281 inline double *P_interior::varWN(const Grid* gitter, int level)
00282      const {
00283   return pointer_varWN;
00284 };
00285 inline double *P_interior::varWT(const Grid* gitter, int level)
00286      const {
00287   return pointer_varWT;
00288 };
00289 inline double *P_interior::varED(const Grid* gitter, int level)
00290      const {
00291   return pointer_varED;
00292 };
00293 inline double *P_interior::varST(const Grid* gitter, int level)
00294      const {
00295   return pointer_varST;
00296 };
00297 inline double *P_interior::varES(const Grid* gitter, int level)
00298      const {
00299   return pointer_varES;
00300 };
00301 
00302 // double next special:
00303 inline double *P_interior::varWD(const Grid* gitter, int level)
00304      const {
00305   return gitter->Give_variable(ind.next_WD(level),level);
00306 };
00307 inline double *P_interior::varET(const Grid* gitter, int level)
00308      const {
00309   return gitter->Give_variable(ind.next_ET(level),level);
00310 };
00311 
00312 // third next:
00313 inline double *P_interior::varEST(const Grid* gitter, int level)
00314      const {
00315   return pointer_varEST;
00316 };
00317 inline double *P_interior::varWND(const Grid* gitter, int level)
00318      const {
00319   return pointer_varWND;
00320 };
00321 
00322 // cell variable
00323 inline double *P_interior::cell_varENT(const Grid* gitter,int lev) const {
00324   return gitter->Give_cell_variable(ind.next_ENT(lev+1));
00325 };
00326 inline double *P_interior::cell_varEND(const Grid* gitter,int lev) const {
00327   return gitter->Give_cell_variable(ind.next_END(lev+1));
00328 };
00329 inline double *P_interior::cell_varEST(const Grid* gitter,int lev) const {
00330   return gitter->Give_cell_variable(ind.next_EST(lev+1));
00331 };
00332 inline double *P_interior::cell_varESD(const Grid* gitter,int lev) const {
00333   return gitter->Give_cell_variable(ind.next_ESD(lev+1));
00334 };
00335 inline double *P_interior::cell_varWNT(const Grid* gitter,int lev) const {
00336   return gitter->Give_cell_variable(ind.next_WNT(lev+1));
00337 };
00338 inline double *P_interior::cell_varWND(const Grid* gitter,int lev) const {
00339   return gitter->Give_cell_variable(ind.next_WND(lev+1));
00340 };
00341 inline double *P_interior::cell_varWST(const Grid* gitter,int lev) const {
00342   return gitter->Give_cell_variable(ind.next_WST(lev+1));
00343 };
00344 inline double *P_interior::cell_varWSD(const Grid* gitter,int lev) const {
00345   return gitter->Give_cell_variable(ind.next_WSD(lev+1));
00346 };
00347 
00348 
00349 // finer level
00350 // --------------
00351 // idem:
00352 inline double *P_interior::var_fine_M(const Grid* gitter, int level) const {
00353   return pointer_fine_varM;
00354 };
00355 // next:
00356 inline double *P_interior::var_fine_N(const Grid* gitter, int level)
00357      const {
00358   return pointer_fine_varN;
00359 };
00360 inline double *P_interior::var_fine_S(const Grid* gitter, int level)
00361      const {
00362   return pointer_fine_varS;
00363 };
00364 inline double *P_interior::var_fine_E(const Grid* gitter, int level)
00365      const {
00366   return pointer_fine_varE;
00367 };
00368 inline double *P_interior::var_fine_W(const Grid* gitter, int level)
00369      const {
00370   return pointer_fine_varW;
00371 };
00372 inline double *P_interior::var_fine_T(const Grid* gitter, int level)
00373      const {
00374   return pointer_fine_varT;
00375 };
00376 inline double *P_interior::var_fine_D(const Grid* gitter, int level)
00377      const {
00378   return pointer_fine_varD;
00379 };
00380 // double next:
00381 inline double *P_interior::var_fine_ND(const Grid* gitter, int level)
00382      const {
00383   return pointer_fine_varND;
00384 };
00385 inline double *P_interior::var_fine_WN(const Grid* gitter, int level)
00386      const {
00387   return pointer_fine_varWN;
00388 };
00389 inline double *P_interior::var_fine_WT(const Grid* gitter, int level)
00390      const {
00391   return pointer_fine_varWT;
00392 };
00393 inline double *P_interior::var_fine_ED(const Grid* gitter, int level)
00394      const {
00395   return pointer_fine_varED;
00396 };
00397 inline double *P_interior::var_fine_ST(const Grid* gitter, int level)
00398      const {
00399   return pointer_fine_varST;
00400 };
00401 inline double *P_interior::var_fine_ES(const Grid* gitter, int level)
00402      const {
00403   return pointer_fine_varES;
00404 };
00405 // third next:
00406 inline double *P_interior::var_fine_EST(const Grid* gitter, int level)
00407      const {
00408   return pointer_fine_varEST;
00409 };
00410 inline double *P_interior::var_fine_WND(const Grid* gitter, int level)
00411      const {
00412   return pointer_fine_varWND;
00413 };
00414 
00415 // Coarse level
00416 // --------------
00417 // idem:
00418 inline double *P_interior::var_coarse_M(const Grid* gitter, int level) const {
00419   return gitter->Give_variable(ind,level-1);
00420 };
00421 // next:
00422 inline double *P_interior::var_coarse_N(const Grid* gitter, int level)
00423      const {
00424   return gitter->Give_variable(ind.next_NS(Rd,level),level-1);
00425 };
00426 inline double *P_interior::var_coarse_S(const Grid* gitter, int level)
00427      const {
00428   return gitter->Give_variable(ind.next_NS(Ld,level),level-1);
00429 };
00430 inline double *P_interior::var_coarse_E(const Grid* gitter, int level)
00431      const {
00432   return gitter->Give_variable(ind.next_EW(Rd,level),level-1);
00433 };
00434 inline double *P_interior::var_coarse_W(const Grid* gitter, int level)
00435      const {
00436   return gitter->Give_variable(ind.next_EW(Ld,level),level-1);
00437 };
00438 inline double *P_interior::var_coarse_T(const Grid* gitter, int level)
00439      const {
00440   return gitter->Give_variable(ind.next_TD(Rd,level),level-1);
00441 };
00442 inline double *P_interior::var_coarse_D(const Grid* gitter, int level)
00443      const {
00444   return gitter->Give_variable(ind.next_TD(Ld,level),level-1);
00445 };
00446 // double next:
00447 inline double *P_interior::var_coarse_ND(const Grid* gitter, int level)
00448      const {
00449   return gitter->Give_variable(ind.next_ND(level),level-1);
00450 };
00451 inline double *P_interior::var_coarse_WN(const Grid* gitter, int level)
00452      const {
00453   return gitter->Give_variable(ind.next_WN(level),level-1);
00454 };
00455 inline double *P_interior::var_coarse_WT(const Grid* gitter, int level)
00456      const {
00457   return gitter->Give_variable(ind.next_WT(level),level-1);
00458 };
00459 inline double *P_interior::var_coarse_ED(const Grid* gitter, int level)
00460      const {
00461   return gitter->Give_variable(ind.next_ED(level),level-1);
00462 };
00463 inline double *P_interior::var_coarse_ST(const Grid* gitter, int level)
00464      const {
00465   return gitter->Give_variable(ind.next_ST(level),level-1);
00466 };
00467 inline double *P_interior::var_coarse_ES(const Grid* gitter, int level)
00468      const {
00469   return gitter->Give_variable(ind.next_ES(level),level-1);
00470 };
00471 // third next:
00472 inline double *P_interior::var_coarse_EST(const Grid* gitter, int level)
00473      const {
00474   return gitter->Give_variable(ind.next_EST(level),level-1);
00475 };
00476 inline double *P_interior::var_coarse_WND(const Grid* gitter, int level)
00477      const {
00478   return gitter->Give_variable(ind.next_WND(level),level-1);
00479 };

Generated on Mon Jan 16 13:23:41 2006 for IPPL by  doxygen 1.4.6