ParMooN
 All Classes Functions Variables Friends Pages
MainUtilities.h
1 #ifdef __2D__
2  #include <FESpace2D.h>
3  #include <TriaAffin.h>
4  #include <QuadAffin.h>
5  #include <NodalFunctional2D.h>
6  #include <BoundEdge.h>
7 #endif
8 #ifdef __3D__
9  #include <FESpace3D.h>
10  #include <FEVectFunct3D.h>
11 #endif
12 
13 #include <BaseCell.h>
14 #include <JointEqN.h>
15 
16 #include <string.h>
17 
18 double GetTime();
19 int GetMemory();
20 
21 void SwapDoubleArray(double *doublearray, int length);
22 void SwapIntArray(int *intarray, int length);
23 
24 
25 #ifdef __2D__
26 // ====================================================================
27 // calculate the streamfunction from the (u1, u2) velocity field
28 // ====================================================================
29 void StreamFunction(TFESpace2D *velo, double *u1, double *u2,
30  TFESpace2D *stream, double *psi);
31 
32 void ComputeVorticityDivergence(TFESpace2D *velo, TFEFunction2D *u1, TFEFunction2D *u2,
33  TFESpace2D *vorticity, double *vort, double *div);
34 
35 // determine L2 and H1 error
36 void L2H1Errors(int N_Points, double *X, double *Y, double *AbsDetjk,
37  double *Weights, double hK,
38  double **Der, double **Exact,
39  double **coeffs, double *LocError);
40 
41 // determine L2-error, divergence error and H1 error, 2D
42 void L2DivH1Errors(int N_Points, double *X, double *Y, double *AbsDetjk,
43  double *Weights, double hK,
44  double **Der, double **Exact,
45  double **coeffs, double *LocError);
46 
47 // determine L1 error, 2D
48 void L1Error(int N_Points, double *X, double *Y, double *AbsDetjk,
49  double *Weights, double hK,
50  double **Der, double **Exact,
51  double **coeffs, double *LocError);
52 
53 // determine L2, H1 and SDFEM error
54 void SDFEMErrors(int N_Points, double *X, double *Y, double *AbsDetjk,
55  double *Weights, double hK, double **Der, double **Exact,
56  double **coeffs, double *LocError);
57 
58 // determine L2, H1 and SDFEM error, in (0,P6)^2
59 void SDFEMErrorsSmooth(int N_Points, double *X, double *Y, double *AbsDetjk,
60  double *Weights, double hK, double **Der, double **Exact,
61  double **coeffs, double *LocError);
62 
63 // determine L2, H1 and SDFEM error for smooth region in the
64 // example JohnMaubachTobiska1997 (x-0.5)^2+(y-0.5)^2 > r^2
65 void SDFEMErrorsSmooth_JohnMaubachTobiska1997
66 (int N_Points, double *X, double *Y, double *AbsDetjk,
67  double *Weights, double hK, double **Der, double **Exact,
68  double **coeffs, double *LocError);
69 
70 // determine errors to interpolant
71 // paper with Julia Novo
72  void SDFEMErrorsInterpolant(int N_Points, double *X, double *Y, double *AbsDetjk,
73  double *Weights, double hK, double **Der, double **Exact,
74  double **coeffs, double *LocError);
75 
76  // determine L2, H1 and SDFEM error for NSE
77 void SPGErrorsOseen(int N_Points, double *X, double *Y, double *AbsDetjk,
78  double *Weights, double hK, double **Der, double **Exact,
79  double **coeffs, double *LocError);
80 
81 // determine L2, H1 and pressure part of SUPG error for Oseen
82 void SPGErrorsOseenPressure(int N_Points, double *X, double *Y, double *AbsDetjk,
83  double *Weights, double hK, double **Der, double **Exact,
84  double **coeffs, double *LocError);
85 
86 // determine deformation tensor error
87 void DeformationTensorError(int N_Points, double *X, double *Y, double *AbsDetjk,
88  double *Weights, double hK,
89  double **Der, double **Exact,
90  double **coeffs, double *LocError);
91 // compute the subgrid dissipation
92 void SubGridDissipation(int N_Points, double *X, double *Y, double *AbsDetjk,
93  double *Weights, double hK,
94  double **Der, double **Exact,
95  double **coeffs, double *LocError);
96 
97 // determine H1 norm
98 void H1Norm(int N_Points, double *X, double *Y, double *AbsDetjk,
99  double *Weights, double hK,
100  double **Der, double **Exact,
101  double **coeffs, double *LocError);
102 
103 // compute the error in the divergence
104 void DivergenceError(int N_Points, double *X, double *Y,
105  double *AbsDetjk, double *Weights, double hK,
106  double **Der, double **Exact,
107  double **coeffs, double *LocError);
108 
109 // mesh cell parameters for shock capturing scheme DC_CD
110 void Parameters_DC_CD(int N_Points, double *X, double *Y, double *AbsDetjk,
111  double *Weights, double hK,
112  double **Der, double **Exact,
113  double **coeffs, double *LocError);
114 
115 void DivergenceErrorGradDivOseen(int N_Points, double *X, double *Y,
116  double *AbsDetjk, double *Weights, double hK,
117  double **Der, double **Exact,
118  double **coeffs, double *LocError);
119 
120 void Parameters_Gradient_Residual(int N_Points, double *X, double *Y, double *AbsDetjk,
121  double *Weights, double hK,
122  double **Der, double **Exact,
123  double **coeffs, double *LocError);
124 #endif
125 
126 double graddiv_parameterOseen(double hK, double nu, double b1, double b2);
127 
128 #ifdef __3D__
129 void ComputeVorticityDivergence(TFESpace3D *velo, TFEFunction3D *u1,
130  TFEFunction3D *u2, TFEFunction3D *u3,
131  TFESpace3D *vorticity_space,
132  TFEFunction3D *vort1,
133  TFEFunction3D *vort2, TFEFunction3D *vort3,
134  double *div);
135 
136 // determine L2 and H1 error
137 void L2H1Errors(int N_Points, double *X, double *Y, double *Z,
138  double *AbsDetjk,
139  double *Weights, double hK,
140  double **Der, double **Exact,
141  double **coeffs, double *LocError);
142 void L2H1ErrorsSmooth(int N_Points, double *X, double *Y, double *Z,
143  double *AbsDetjk,
144  double *Weights, double hK,
145  double **Der, double **Exact,
146  double **coeffs, double *LocError);
147 
148 // compute L2 error, L2 error of divergence, and H1 error for vector valued
149 // basis functions (Raviart-Thomas or Brezzi-Douglas-Marini)
150 void L2DivH1Errors(int N_Points, double *X, double *Y, double *Z,
151  double *AbsDetjk, double *Weights, double hK, double **Der,
152  double **Exact, double **coeffs, double *LocError);
153 
154 // determine L1 error
155 void L1Error(int N_Points, double *X, double *Y, double *Z, double *AbsDetjk,
156  double *Weights, double hK,
157  double **Der, double **Exact,
158  double **coeffs, double *LocError);
159 
160 // determine deformation tensor error
161 void DeformationTensorError(int N_Points, double *X, double *Y, double *Z,
162  double *AbsDetjk,
163  double *Weights, double hK,
164  double **Der, double **Exact,
165  double **coeffs, double *LocError);
166 // compute the subgrid dissipation
167 void SubGridDissipation(int N_Points, double *X, double *Y, double *Z,
168  double *AbsDetjk,
169  double *Weights, double hK,
170  double **Der, double **Exact,
171  double **coeffs, double *LocError);
172 
173 
174 // compute the error in the divergence
175 void DivergenceError(int N_Points, double *X, double *Y, double *Z,
176  double *AbsDetjk, double *Weights, double hK,
177  double **Der, double **Exact,
178  double **coeffs, double *LocError);
179 
180 // mesh cell parameters for shock capturing scheme DC_CD
181 void Parameters_DC_CD(int N_Points, double *X, double *Y, double *Z,
182  double *AbsDetjk,
183  double *Weights, double hK,
184  double **Der, double **Exact,
185  double **coeffs, double *LocError);
186 
187 void Q_criterion(TCollection *Coll,
188  TFEFunction3D *velocity1, TFEFunction3D *velocity2,
189  TFEFunction3D *velocity3, double *Qcrit);
190 #endif
191 
192 // ====================================================================
193 // auxiliary routines
194 // ====================================================================
195 void linfb(int N_Points, double **Coeffs, double ** Params,
196  TBaseCell *cell);
197 
198 void ave_l2b_quad_points(int N_Points, double **Coeffs, double **Params,
199  TBaseCell *cell);
200 
201 void CFPM2D_linfb(int N_Points, double **Coeffs, double ** Params,
202  TBaseCell *cell);
203 
204 void LInfU(int N_Points, double **Coeffs, double **Params,
205  TBaseCell *cell);
206 
207 
208 #ifdef __2D__
209 
210 // ====================================================================
211 // get velocity and pressure space from user defined parameters
212 // ====================================================================
213 int GetVelocityAndPressureSpace(TCollection *coll,
214  BoundCondFunct2D *BoundCondition,
215  TCollection *mortarcoll,
216  TFESpace2D* &velocity_space,
217  TFESpace2D* &pressure_space,
218  int* pressure_space_code,
219  int velo_order, int pressure_order);
220 
221 
222 #endif
223 
224 // ====================================================================
225 // read in solution from a Grape file
226 // ====================================================================
227 int ReadGrapeFile(char *name, int N_FEFct, int N_FEVectFct,
228  TFEFunction2D **FEFct, TFEVectFunct2D **FEVectFct);
229 
230 #ifdef __3D__
231 
232 // ====================================================================
233 // get velocity and pressure space from user defined parameters
234 // ====================================================================
235 int GetVelocityAndPressureSpace3D(TCollection *coll,
236  BoundCondFunct3D *BoundCondition,
237  TFESpace3D* &velocity_space,
238  TFESpace3D* &pressure_space,
239  int* pressure_space_code,
240  int velo_order, int pressure_order);
241 
242 // ====================================================================
243 // get velocity and pressure space for MG_TYPE 2
244 // ====================================================================
245 int GetVelocityAndPressureSpaceLow3D(TCollection *coll,
246  BoundCondFunct3D *BoundCondition,
247  TFESpace3D* &velocity_space,
248  int *velocity_space_code,
249  TFESpace3D* &pressure_space,
250  int *pressure_space_code,
251  int velo_order, int pressure_order);
252 // ====================================================================
253 // read in solution from a Grape file
254 // ====================================================================
255 int ReadGrapeFile3D(char *name, int N_FEFct, int N_FEVectFct,
256  TFEFunction3D **FEFct, TFEVectFunct3D **FEVectFct);
257 
258 #endif
259 void ExactNull(double x, double y, double z, double *values);
260 void ExactNull(double x, double y, double *values);
261 int ComputeNewTimeStep(double err);
262 void BoundConditionNoBoundCondition(int BdComp, double t, BoundCond &cond);
263 void BoundConditionNoBoundCondition(double x, double y, double z, BoundCond &cond);
264 void BoundaryValueNoBoundaryValue(int BdComp, double Param, double &value);
265 void BoundaryValueHomogenous(int BdComp, double Param, double &value);
266 void BoundaryValueHomogenous(double x, double y, double z, double &value);
267 void BoundConditionVMM(int BdComp, double t, BoundCond &cond);
268 void BoundConditionNSE(int BdComp, double t, BoundCond &cond);
269 void BoundaryConditionPressSep(int i, double t, BoundCond &cond);
270 void BoundaryValuePressSep(int BdComp, double Param, double &value);
271 void BoundaryConditionPressSep3D(double x, double y, double z, BoundCond &cond);
272 void BoundaryValuePressSep3D(double x, double y, double z, double &value);
273 void BoundaryConditionNewton(double x, double y, double z, BoundCond &cond);
274 void BoundaryValueNewton(double x, double y, double z, double &value);
275 void BoundCondition_FEM_FCT(int i, double t, BoundCond &cond);
276 void BoundValue_FEM_FCT(int BdComp, double Param, double &value);
277 void BoundCondition_FEM_FCT(double x, double y, double z, BoundCond &cond);
278 void BoundValue_FEM_FCT(double x, double y, double z, double &value);
279 void BoundConditionAuxProblem(int i, double t, BoundCond &cond);
280 void BoundValueAuxProblem(int BdComp, double Param, double &value);
281 void ho_BoundCondition(int i, double t, BoundCond &cond);
282 void ho_BoundValue(int BdComp, double Param, double &value);
283 
284 void SetPolynomialDegree();
285 void CheckMaximumPrinciple(TSquareMatrix *A, double *sol, int N_Active,
286  double *errors);
287 void SaveData(char *name, int N_Array, double **sol, int *N_Unknowns);
288 void ReadData(char *name, int N_Array, double **sol, int *N_Unknowns);
289 
290 void SaveData(std::string basename, double *sol, int nDOF);
291 void ReadData(std::string filename, double *sol, int nDOF);
292 /******************************************************************************/
293 //
294 // sets the nodes with global dof neum_to_diri to Dirichlet nodes
295 // by setting the matrix and the rhs
296 //
297 /******************************************************************************/
298 
299 #ifdef __2D__
300 void SetDirichletNodesFromNeumannNodes(TSquareMatrix2D **SQMATRICES,
301  double *rhs, double *sol,
302  int N_neum_to_diri,
303  int *neum_to_diri,
304  int *neum_to_diri_bdry,
305  double *neum_to_diri_param,
306  BoundValueFunct2D *BoundaryValue);
307 #endif
308 #ifdef __3D__
309 void SetDirichletNodesFromNeumannNodes(TSquareMatrix3D **SQMATRICES,
310  double *rhs, double *sol,
311  int N_neum_to_diri,
312  int *neum_to_diri,
313  double *neum_to_diri_x,
314  double *neum_to_diri_y,
315  double *neum_to_diri_z,
316  BoundValueFunct3D *BoundaryValue);
317 #endif
318 
319 
320 
321 
322 
323 
324 
325 
326 
327 
328 
329 
330 
331 
Definition: SquareMatrix2D.h:20
Definition: SquareMatrix3D.h:20
Definition: FESpace2D.h:28
Definition: FESpace3D.h:22
store cells in an array, used by cell iterators
Definition: Collection.h:18
Definition: SquareMatrix.h:20
Definition: FEVectFunct2D.h:23
Definition: FEVectFunct3D.h:20
information for finite element data structure
Definition: BaseCell.h:25
Definition: FEFunction3D.h:25
Definition: FEFunction2D.h:24