Main Page | Namespace List | Class Hierarchy | Class List | File List | Class Members | File Members

src/expde/extemp/varcon.cc

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 // varcon.cc
00019 //
00020 // ------------------------------------------------------------
00021 
00022 // Include level 0:
00023 #ifdef COMP_GNUOLD
00024  #include <iostream.h>
00025  #include <fstream.h>
00026  #include <time.h>
00027  #include <math.h>
00028 #else
00029  #include <iostream>
00030  #include <fstream>
00031  #include <ctime>
00032  #include <cmath>
00033 #endif 
00034 
00035 
00036 // Include level 0:
00037 #include "../parser.h"
00038 
00039 // Include level 1:
00040 #include "../paramete.h"
00041 #include "../abbrevi.h"
00042 #include "../math_lib/math_lib.h"
00043 
00044 // Include level 2:
00045 #include "../basic/basic.h"
00046 
00047 // Include level 3:
00048 #include "../domain/domain.h"
00049 
00050 // Include level 4:
00051 #include "../formulas/boundy.h"
00052 #include "../formulas/loc_sten.h"
00053 
00054 // Include level 5:
00055 #include "../grid/gpar.h"
00056 #include "../grid/parallel.h"
00057 #include "../grid/mgcoeff.h"
00058 #include "../grid/sto_man.h"
00059 #include "../grid/gridbase.h"
00060 #include "../grid/grid.h"
00061 #include "../grid/input.h"
00062 
00063 // Include level 5.1
00064 #include "../evpar/evpar.h"
00065 
00066 // Include level 6:
00067 #include "variable.h"
00068 #include "varcon.h"
00069 
00070 void Print_UCD(Cell_Variable& a, ofstream *Datei) {
00071   a.Give_grid()->Print_Cell_Variable_AVS(Datei,a.Number_cell_variable());
00072 };
00073 void Print_UCD_moved(Cell_Variable& v, 
00074                      Variable& a, Variable& b, Variable& c, ofstream *Datei) {
00075   a.Give_grid()->Print_Cell_Variable_AVS_moved(Datei,
00076                                                v.Number_cell_variable(),
00077                                                a.Number_variable(),
00078                                                b.Number_variable(),
00079                                                c.Number_variable());
00080 };
00081 
00082 void Print_UCD_parallel(Cell_Variable& a, ofstream *Datei) {
00083   a.Give_grid()->Print_Cell_Variable_AVS_parallel(Datei,
00084                                                   a.Number_cell_variable());
00085 };
00086 
00087 CoExpr<CoExprTrans> Cell_Interpolation(const Variable& vec) {
00088   typedef CoExprTrans ExprT;
00089   return CoExpr<ExprT>(ExprT(vec));
00090 }
00091 
00092 void Cell_Variable::operator=(double (*Formula)(double x,double y,double z)) {
00093   D3vector V;
00094   Test_init();  // Grid storage initialization
00095 
00096   // interior_cells
00097   for(iter_ice=grid->Start_P_interior_cell(level);
00098       iter_ice!=NULL;iter_ice=iter_ice->Next()) {
00099     V = iter_ice->coordinate(grid);
00100     iter_ice->varM(grid)[number_cell_variable] = 
00101       Formula(V.x,V.y,V.z);
00102   }
00103   // boundary cells
00104   for(iter_bce=grid->Start_P_boundary_tet(level);
00105       iter_bce!=NULL;iter_bce=iter_bce->Next()) {
00106     V = iter_bce->coordinate(grid);
00107     iter_bce->varM(grid)[number_cell_variable] = 
00108       Formula(V.x,V.y,V.z);
00109   }
00110 }
00111 
00112 
00113 
00114 void Cell_Variable::operator=(Input_data_object& input_object) {
00115   D3vector V;
00116   Test_init();  // Grid storage initialization
00117 
00118   // interior_cells
00119   for(iter_ice=grid->Start_P_interior_cell(level);
00120       iter_ice!=NULL;iter_ice=iter_ice->Next()) {
00121     V = iter_ice->coordinate(grid);
00122     iter_ice->varM(grid)[number_cell_variable] = 
00123       input_object.Interpolate_value(V);
00124   }
00125   // boundary cells
00126   for(iter_bce=grid->Start_P_boundary_tet(level);
00127       iter_bce!=NULL;iter_bce=iter_bce->Next()) {
00128     V = iter_bce->coordinate(grid);
00129     iter_bce->varM(grid)[number_cell_variable] = 
00130       input_object.Interpolate_value(V);
00131   }
00132 }
00133 
00134 
00135 
00136 void Cell_Variable::operator=(double x) {
00137   Test_init();  // Grid storage initialization
00138 
00139   // interior_cells
00140   for(iter_ice=grid->Start_P_interior_cell(level);
00141       iter_ice!=NULL;iter_ice=iter_ice->Next()) {
00142     iter_ice->varM(grid)[number_cell_variable] = x;
00143   }
00144   // boundary cells
00145   for(iter_bce=grid->Start_P_boundary_tet(level);
00146       iter_bce!=NULL;iter_bce=iter_bce->Next()) {
00147     iter_bce->varM(grid)[number_cell_variable] = x;
00148   }
00149 }
00150 
00151 double Maximum(Cell_Variable& v) {
00152   v.Test_init();  // Grid storage initialization
00153   double maxi,x;
00154   Grid *grid;
00155   int number_cell_variable;
00156   P_interior_cell  *iter_ice;
00157   P_boundary_tet  *iter_bce;
00158   number_cell_variable = v.Number_cell_variable();
00159 
00160   grid = v.Give_grid(); 
00161   maxi = grid->Start_P_interior_cell(
00162                v.Level())->varM(grid)[number_cell_variable];
00163   // interior_cells
00164   for(iter_ice=grid->Start_P_interior_cell(v.Level());
00165       iter_ice!=NULL;iter_ice=iter_ice->Next()) {
00166     x = iter_ice->varM(grid)[number_cell_variable];
00167     if(maxi<x) maxi=x;
00168   }
00169   // boundary cells
00170   for(iter_bce=grid->Start_P_boundary_tet(v.Level());
00171       iter_bce!=NULL;iter_bce=iter_bce->Next()) {
00172     x = iter_bce->varM(grid)[number_cell_variable];
00173     if(maxi<x) maxi=x;
00174   }
00175   return maxi;
00176 }
00177 
00178 double L_infty(Cell_Variable& v) {
00179   v.Test_init();  // Grid storage initialization
00180   double maxi,x;
00181   Grid *grid;
00182   int number_cell_variable;
00183   P_interior_cell  *iter_ice;
00184   P_boundary_tet  *iter_bce;
00185   number_cell_variable = v.Number_cell_variable();
00186 
00187   grid = v.Give_grid(); 
00188   maxi = 0.0;
00189   // interior_cells
00190   for(iter_ice=grid->Start_P_interior_cell(v.Level());
00191       iter_ice!=NULL;iter_ice=iter_ice->Next()) {
00192     x = ABS(iter_ice->varM(grid)[number_cell_variable]);
00193     if(maxi<x) maxi=x;
00194   }
00195   // boundary cells
00196   for(iter_bce=grid->Start_P_boundary_tet(v.Level());
00197       iter_bce!=NULL;iter_bce=iter_bce->Next()) {
00198     x = ABS(iter_bce->varM(grid)[number_cell_variable]);
00199     if(maxi<x) maxi=x;
00200   }
00201   return maxi;
00202 }
00203 
00204 double Minimum(Cell_Variable& v) {
00205   v.Test_init();  // Grid storage initialization
00206   double mini,x;
00207   Grid *grid;
00208   int number_cell_variable;
00209   P_interior_cell  *iter_ice;
00210   P_boundary_tet  *iter_bce;
00211   number_cell_variable = v.Number_cell_variable();
00212 
00213   grid = v.Give_grid(); 
00214   mini = grid->Start_P_interior_cell(
00215                v.Level())->varM(grid)[number_cell_variable];
00216   // interior_cells
00217   for(iter_ice=grid->Start_P_interior_cell(v.Level());
00218       iter_ice!=NULL;iter_ice=iter_ice->Next()) {
00219     x = iter_ice->varM(grid)[number_cell_variable];
00220     if(mini>x) mini=x;
00221   }
00222   // boundary cells
00223   for(iter_bce=grid->Start_P_boundary_tet(v.Level());
00224       iter_bce!=NULL;iter_bce=iter_bce->Next()) {
00225     x = iter_bce->varM(grid)[number_cell_variable];
00226     if(mini>x) mini=x;
00227   }
00228   return mini;
00229 }
00230 
00231 
00232 // ------------------------------------------------------------
00233 //  Addition, Multi, ...
00234 // ------------------------------------------------------------
00235 
00236 #define Macro_set_expressions_for_cells(insertA,insertB) \
00237 CoExpr<CoExprBinOp<CoExprLIT, CoExprVAR, insertA> > \
00238 insertB(double x, Cell_Variable& a) \
00239 { \
00240   typedef CoExprBinOp<CoExprLIT, CoExprVAR, insertA> ExprT; \
00241   return CoExpr<ExprT>(ExprT(CoExprLIT(x),CoExprVAR(a))); \
00242 } \
00243 CoExpr<CoExprBinOp<CoExprVAR, CoExprLIT, insertA> > \
00244 insertB(Cell_Variable& a,double x) \
00245 { \
00246   typedef CoExprBinOp<CoExprVAR, CoExprLIT, insertA> ExprT; \
00247   return CoExpr<ExprT>(ExprT(CoExprVAR(a),CoExprLIT(x))); \
00248 } \
00249 CoExpr<CoExprBinOp<CoExprVAR, CoExprVAR, insertA> > \
00250 insertB(Cell_Variable& b, Cell_Variable& a) \
00251 { \
00252   typedef CoExprBinOp<CoExprVAR, CoExprVAR, insertA> ExprT; \
00253   return CoExpr<ExprT>(ExprT(CoExprVAR(b),CoExprVAR(a))); \
00254 }
00255 
00256 
00257 
00258 
00259 
00260 
00261 
00262 
00263 
00264 
00265 Macro_set_expressions_for_cells(CoApMul,operator*)
00266 Macro_set_expressions_for_cells(CoApAdd,operator+)
00267 Macro_set_expressions_for_cells(CoApDivide,operator/)
00268 Macro_set_expressions_for_cells(CoApSub,operator-)

Generated on Fri Nov 2 01:25:57 2007 for IPPL by doxygen 1.3.5