ParMooN
 All Classes Functions Variables Friends Pages
Hemker_Wide_VMS.h
1 // Navier-Stokes coupled with conformation stress tensor problem, Benchmark problem
2 
3 
4 void ExampleFile()
5 {
6  OutPut("Example: Hemker_Wide_VMS" << endl) ;
7 }
8 
9 #define __BENCH__
10 
11 
12 #include <Joint.h>
13 #include <BoundEdge.h>
14 #include <BoundComp.h>
15 #include <FE2D.h>
16 #include <FEDesc2D.h>
17 
18 #include <MainUtilities.h>
19 
20 
21 #include <MacroCell.h>
22 #include <BoundEdge.h>
23 #include <IsoBoundEdge.h>
24 #include <gridgen.h>
25 #include <IsoInterfaceJoint.h>
26 #include <BdLine.h>
27 #include <BdCircle.h>
28 #include <GridCell.h>
29 
30 #include <QuadAffin.h>
31 #include <QuadBilinear.h>
32 #include <QuadIsoparametric.h>
33 #include <TriaAffin.h>
34 #include <TriaIsoparametric.h>
35 
36 extern "C"
37 {
38  void triangulate(char*, struct triangulateio*,
39  struct triangulateio*, struct triangulateio*);
40 }
41 
42 // ========================================================================
43 // exact solution
44 // ========================================================================
45 void ExactU1(double x, double y, double *values)
46 {
47  values[0] = 0;
48  values[1] = 0;
49  values[2] = 0;
50  values[3] = 0;
51 }
52 
53 void ExactU2(double x, double y, double *values)
54 {
55  values[0] = 0;
56  values[1] = 0;
57  values[2] = 0;
58  values[3] = 0;
59 }
60 
61 void ExactP(double x, double y, double *values)
62 {
63  values[0] = 0;
64  values[1] = 0;
65  values[2] = 0;
66  values[3] = 0;
67 }
68 
69 // ========================================================================
70 // boundary conditions
71 // ========================================================================
72 void BoundCondition(int i, double t, BoundCond &cond)
73 {
74  cond = DIRICHLET;
75 }
76 
77 void U1BoundValue(int BdComp, double Param, double &value)
78 {
79  switch(BdComp)
80  {
81  case 0: value = 0;
82  break;
83  case 1: value=1.5*(1.0 - (pow(-8+16*Param,2))/64.0);
84  break;
85  case 2: value = 0;
86  break;
87  case 3: value=1.5*(1.0 - (pow(8-16*Param,2))/64.0) ;
88  break;
89  case 4: value=0;
90  break;
91  default: cout << "wrong boundary part number: " << BdComp << endl;
92  }
93 }
94 
95 void U2BoundValue(int BdComp, double Param, double &value)
96 {
97  value = 0;
98  if(BdComp>4) cout << "wrong boundary part number: " << BdComp << endl;
99 }
100 
101 // ========================================================================
102 // coefficients for Stokes form: A, B1, B2, f1, f2
103 // ========================================================================
104 void LinCoeffs(int n_points, double *x, double *y,
105  double **parameters, double **coeffs)
106 {
107  double eps = 1.0/TDatabase::ParamDB->RE_NR, beta = TDatabase::ParamDB->P3;
108  int i;
109  double *coeff, nondim;
110 
111  nondim = beta*eps;
112 
113  for(i=0;i<n_points;i++)
114  {
115  coeff = coeffs[i];
116 
117  coeff[0] = nondim;
118  coeff[1] = 0; // f1
119  coeff[2] = 0; // f2
120  }
121 }
122 
123 // ========================================================================
124 // exact solution
125 // ========================================================================
126 void ExactS1(double x, double y, double *values)
127 {
128  values[0] = 0;
129  values[1] = 0;
130  values[2] = 0;
131  values[3] = 0;
132 }
133 
134 void ExactS2(double x, double y, double *values)
135 {
136  values[0] = 0;
137  values[1] = 0;
138  values[2] = 0;
139  values[3] = 0;
140 }
141 
142 void ExactS3(double x, double y, double *values)
143 {
144  values[0] = 0;
145  values[1] = 0;
146  values[2] = 0;
147  values[3] = 0;
148 }
149 
150 // ========================================================================
151 // boundary conditions
152 // ========================================================================
153 void BoundCondition_CST(int i, double t, BoundCond &cond)
154 {
155  switch(i)
156  {
157  case 0:
158  case 1:
159  case 2:
160  case 4:
161  cond = NEUMANN;
162  break;
163  case 3:
164  cond = DIRICHLET;
165  break;
166  }
167 }
168 
169 void S1BoundValue(int BdComp, double Param, double &value)
170 {
171  double Wei = TDatabase::ParamDB->WEI_NR;
172  switch(BdComp)
173  {
174  case 0: value=0.0;
175  break;
176 // case 1: value= (pow(1.5*Wei*(1-2*Param),2) * 2.0 )+1.0;
177 // break;
178  case 1: value=0.0;
179  break;
180  case 2: value=0.0;
181  break;
182  case 3: value=(pow(0.375*Wei*(-1+2*Param),2) * 2.0 )+1.0;
183  break;
184  case 4: value=0.0;
185  break;
186 
187  }
188 }
189 
190 void S2BoundValue(int BdComp, double Param, double &value)
191 {
192  double Wei = TDatabase::ParamDB->WEI_NR;
193  switch(BdComp)
194  {
195  case 0: value=0;
196  break;
197 // case 1: value=1.5*Wei*(1-2*Param);
198 // break;
199  case 1: value=0.0;
200  break;
201  case 2: value=0;
202  break;
203  case 3: value=0.375*Wei*(-1+2*Param);
204  break;
205  case 4: value=0;
206  break;
207 
208  }
209  return;
210 }
211 
212 
213 
214 void S3BoundValue(int BdComp, double Param, double &value)
215 {
216  switch(BdComp)
217  {
218  case 0: value=0.0;
219  break;
220 // case 1: value=1.0;
221 // break;
222  case 1: value=0.0;
223  break;
224  case 2: value=0.0;
225  break;
226  case 3: value=1.0;
227  break;
228  case 4: value=0.0;
229  break;
230 
231  }
232  return;
233 }
234 
235 void LinCoeffs_CST(int n_points, double *X, double *Y,
236  double **parameters, double **coeffs)
237 {
238  double nu=1./TDatabase::ParamDB->WEI_NR;
239 
240  int i;
241  double *coeff;
242 
243  for(i=0;i<n_points;i++)
244  {
245  coeff = coeffs[i];
246 
247  coeff[0] = nu;
248  coeff[1] = nu; //f1
249  coeff[2] = 0.0; //f2
250  coeff[3] = nu; //f3
251 
252 
253  }
254 }
255 
256 
258 void GetCdCl(TFEFunction2D *u1fct, TFEFunction2D *u2fct,
259  TFEFunction2D *pfct, TFEFunction2D *tau1fct,
260  TFEFunction2D *tau2fct, TFEFunction2D *tau3fct,
261  double &cd, double &cl)
262 {
263  int i,j,k,l, N_;
264  int N_Points,N_Edges,comp,ed_nr;
265  double *weights, *xi, *eta;
266  double X[MaxN_QuadPoints_2D];
267  double Y[MaxN_QuadPoints_2D];
268  double AbsDetjk[MaxN_QuadPoints_2D];
269  int N_LocalUsedElements;
270  FE2D LocalUsedElements[3], CurrentElement;
271  int *DOF;
272  double **OrigFEValues, *Orig;
273  bool SecondDer[3] = { FALSE, FALSE, FALSE };
274  double *u1, *u2, *p, *tau1, *tau2, *tau3;
275  TFESpace2D *USpace, *PSpace, *TauSpace;
276  int *UGlobalNumbers, *UBeginIndex;
277  int *PGlobalNumbers, *PBeginIndex;
278  int *TauGlobalNumbers, *TauBeginIndex;
279  int *N_BaseFunct, N_Cells;
280  BaseFunct2D BaseFunct, *BaseFuncts;
281  TCollection *Coll;
282  TBaseCell *cell;
283  double value, value1, value2, value3, value4, value5, value6;
284  double FEFunctValues[MaxN_BaseFunctions2D];
285  double FEFunctValues1[MaxN_BaseFunctions2D];
286  double FEFunctValues2[MaxN_BaseFunctions2D];
287  double FEFunctValues3[MaxN_BaseFunctions2D];
288  double FEFunctValues4[MaxN_BaseFunctions2D];
289  double FEFunctValues5[MaxN_BaseFunctions2D];
290  double FEFunctValues6[MaxN_BaseFunctions2D];
291 
292  int N_DerivativesU = 3;
293  double *Derivatives[MaxN_BaseFunctions2D];
294  MultiIndex2D NeededDerivatives[3] = { D00, D10, D01 };
295  TFEFunction2D *vfct;
296  double *v, nu = 1/TDatabase::ParamDB->RE_NR;
297  double wei = 1/TDatabase::ParamDB->WEI_NR, beta = TDatabase::ParamDB->P3;
298  double *Der, *aux;
299  TJoint *joint;
300  TBoundEdge *boundedge;
301  TBoundComp *BoundComp;
302  TFE2D *eleCell;
303  FE2D FEEle;
304  TFEDesc2D *FEDesc;
305  int N_DOF_Circ, *DOF_Circ;
306  char VString[] = "v";
307 
308  u1 = u1fct->GetValues();
309  u2 = u2fct->GetValues();
310  p = pfct->GetValues();
311  tau1 = tau1fct->GetValues();
312  tau2 = tau2fct->GetValues();
313  tau3 = tau3fct->GetValues();
314 
315  USpace = u1fct->GetFESpace2D();
316  PSpace = pfct->GetFESpace2D();
317  TauSpace = tau1fct->GetFESpace2D();
318 
319  UGlobalNumbers = USpace->GetGlobalNumbers();
320  UBeginIndex = USpace->GetBeginIndex();
321 
322  PGlobalNumbers = PSpace->GetGlobalNumbers();
323  PBeginIndex = PSpace->GetBeginIndex();
324 
325  TauGlobalNumbers = TauSpace->GetGlobalNumbers();
326  TauBeginIndex = TauSpace->GetBeginIndex();
327 
330 
331  aux = new double [MaxN_QuadPoints_2D*13];
332  for(j=0;j<MaxN_QuadPoints_2D;j++)
333  Derivatives[j] = aux + j*13;
334 
335  N_ = u1fct->GetLength();
336  v = new double[N_];
337  memset(v,0,N_*SizeOfDouble);
338  vfct = new TFEFunction2D(USpace, VString, VString, v, N_);
339 
340 // ########################################################################
341 // loop over all cells
342 // ########################################################################
343  Coll = USpace->GetCollection(); // all spaces use same Coll
344  N_Cells = Coll->GetN_Cells();
345 
346  for(i=0;i<N_Cells;i++)
347  {
348  cell = Coll->GetCell(i);
349  N_Edges=cell->GetN_Edges();
350  for(j=0;j<N_Edges;j++) // loop over all edges of cell
351  {
352  joint=cell->GetJoint(j);
353  if ((joint->GetType() == BoundaryEdge)||
354  (joint->GetType() == IsoBoundEdge)) // boundary edge
355  {
356 
357  boundedge=(TBoundEdge *)joint;
358  BoundComp=boundedge->GetBoundComp(); // get boundary component
359  comp=BoundComp->GetID(); // boundary id
360  if (comp==4)
361  {
362  FEEle = USpace->GetFE2D(i,cell); // finite element of cell
363  eleCell = TFEDatabase2D::GetFE2D(FEEle);
364  FEDesc = eleCell->GetFEDesc2D(); // fe descriptor
365  N_DOF_Circ = FEDesc->GetN_JointDOF(); // # local dofs on joints
366  DOF_Circ = FEDesc->GetJointDOF(j); // local dofs on joint j
367  DOF = UGlobalNumbers + UBeginIndex[i]; // pointer to global dofs
368  for (k=0;k<N_DOF_Circ;k++) // set fe on circle to 1
369  v[DOF[DOF_Circ[k]]] = 1;
370  }
371  }
372  }
373  }
374 
375  cd = 0;
376  cl = 0;
377 
378 // ########################################################################
379 // loop over all cells
380 // ########################################################################
381  Coll = USpace->GetCollection(); // all spaces use same Coll
382  N_Cells = Coll->GetN_Cells();
383  for(i=0;i<N_Cells;i++)
384  {
385  cell = Coll->GetCell(i);
386 
387  // ####################################################################
388  // find local used elements on this cell
389  // ####################################################################
390  N_LocalUsedElements = 3;
391  LocalUsedElements[0] = USpace->GetFE2D(i, cell);
392  LocalUsedElements[1] = PSpace->GetFE2D(i, cell);
393  LocalUsedElements[2] = TauSpace->GetFE2D(i, cell);
394 
395  // ####################################################################
396  // calculate values on original element
397  // ####################################################################
398  TFEDatabase2D::GetOrig(N_LocalUsedElements, LocalUsedElements, Coll, cell, SecondDer, N_Points, xi, eta, weights, X, Y, AbsDetjk);
399 
400  // calculate all needed values of p
401  CurrentElement = LocalUsedElements[1];
402  BaseFunct = BaseFuncts[CurrentElement];
403  N_ = N_BaseFunct[CurrentElement];
404 
405  DOF = PGlobalNumbers + PBeginIndex[i];
406  for(l=0;l<N_;l++)
407  FEFunctValues[l] = p[DOF[l]];
408 
409  OrigFEValues = TFEDatabase2D::GetOrigElementValues(BaseFunct, D00);
410 
411  for(j=0;j<N_Points;j++)
412  {
413  Orig = OrigFEValues[j];
414  value = 0;
415  for(l=0;l<N_;l++)
416  value += FEFunctValues[l] * Orig[l];
417 
418  Derivatives[j][0] = value;
419  }
420 
421  // calculate all needed values of u1, u2
422  CurrentElement = LocalUsedElements[0];
423  BaseFunct = BaseFuncts[CurrentElement];
424  N_ = N_BaseFunct[CurrentElement];
425 
426  DOF = UGlobalNumbers + UBeginIndex[i];
427  for(l=0;l<N_;l++)
428  {
429  FEFunctValues1[l] = u1[DOF[l]];
430  FEFunctValues2[l] = u2[DOF[l]];
431  FEFunctValues3[l] = v[DOF[l]];
432  }
433 
434  for(k=0;k<N_DerivativesU;k++)
435  {
436  OrigFEValues = TFEDatabase2D::GetOrigElementValues(BaseFunct,
437  NeededDerivatives[k]);
438  for(j=0;j<N_Points;j++)
439  {
440  Orig = OrigFEValues[j];
441  value1 = 0;
442  value2 = 0;
443  value3 = 0;
444  for(l=0;l<N_;l++)
445  {
446  value1 += FEFunctValues1[l] * Orig[l];
447  value2 += FEFunctValues2[l] * Orig[l];
448  value3 += FEFunctValues3[l] * Orig[l];
449  } // endfor l
450  Derivatives[j][k+1] = value1;
451  Derivatives[j][k+4] = value2;
452  Derivatives[j][k+7] = value3;
453  } // endfor j
454  } // endfor k
455 
456 
457  // calculate all needed values of tau1, tau2, tau3
458  CurrentElement = LocalUsedElements[2];
459  BaseFunct = BaseFuncts[CurrentElement];
460  N_ = N_BaseFunct[CurrentElement];
461 
462  DOF = TauGlobalNumbers + TauBeginIndex[i];
463  for(l=0;l<N_;l++)
464  {
465  FEFunctValues4[l] = tau1[DOF[l]];
466  FEFunctValues5[l] = tau2[DOF[l]];
467  FEFunctValues6[l] = tau3[DOF[l]];
468 
469  }
470  OrigFEValues = TFEDatabase2D::GetOrigElementValues(BaseFunct, D00);
471 
472  for(j=0;j<N_Points;j++)
473  {
474  Orig = OrigFEValues[j];
475  value4 = 0;
476  value5 = 0;
477  value6 = 0;
478  for(l=0;l<N_;l++)
479  {
480  value4 += FEFunctValues4[l] * Orig[l];
481  value5 += FEFunctValues5[l] * Orig[l];
482  value6 += FEFunctValues6[l] * Orig[l];
483  } // endfor l
484  Derivatives[j][10] = value4;
485  Derivatives[j][11] = value5;
486  Derivatives[j][12] = value6;
487  }
488 
489 
490 
491 
492  // calculation
493  for(j=0;j<N_Points;j++)
494  {
495  Der = Derivatives[j];
496 
497  // beta*nu * (u1_x*v_x, u1_y*v_y), v= (v,0)
498  value1 = beta*nu*(Der[2]*Der[8]+Der[3]*Der[9]);
499  // (u1 * u1_x + u2* u1_y) * (1,0)
500  // value1 += (Der[1]*Der[2]+Der[4]*Der[3])*Der[7];
501  // pressure times divergence of test function (1,0)
502  value1 -= Der[0]*Der[8];
503 // // (1-beta)*nu*wei* (tau1*v_x + tau2*v_y)
504  value1 += (1.0-beta)*nu*wei*(Der[10]*Der[8] + Der[11]*Der[9]);
505 
506 // value2 = beta*nu*(Der[5]*Der[8]+Der[6]*Der[9]);
507 // // value2 += (Der[1]*Der[5]+Der[4]*Der[6])*Der[7];
508 // value2 -= Der[0]*Der[9];
509 // value2 += (1.0-beta)*nu*wei*(Der[11]*Der[8] + Der[12]*Der[9]);
510 
511  cd += AbsDetjk[j]*weights[j] * value1;
512  cl += AbsDetjk[j]*weights[j] * value2;
513  }
514 
515  } // endfor i
516 
517  cd *= -1;
518  cl *= -1;
519 
520  delete Derivatives[0];
521  delete vfct;
522  delete v;
523 }
524 
525 // **************************************************************************
526 // Triangular Mesh Generation
527 // **************************************************************************
528 
529 void TriaReMeshGen(TDomain *&Domain)
530 {
531  int j, ID, k, N_G, *PartMarker, *PointNeighb, maxEpV=0;
532  int a, b, len1, len2, Neighb_tmp, BDpart;
533  int i, temp, N_Cells, N_RootCells, CurrVertex, N_Joints, N_Vertices;
534  int N_Interface_Vert, N_Verti, N_Hori, N_SlipBound_Vert, N_BDVertices;
535  int CurrComp, In_Index, *Triangles, Neib[2], CurrNeib;
536 
537  double deviation, hi, x0, y0, x, y, phi1, phi2;
538  double T_a, T_b, C_x, C_y, s, theta;
539  double dt, area = TDatabase::ParamDB->Area;
540  double *Coordinates, *Hole_List;
541 
542  double Xi[4] = {-40., 40., 40.,-40.};
543  double Yi[4] = {-8.,-8., 8., 8.};
544 
545  TBaseCell **CellTree, *cell;
546  TBoundPart *BoundPart;
547  TJoint *Joint;
548  TCollection *coll;
549  TVertex **VertexDel, **NewVertices;
550  TBdLine *UpdateBound[12];
551  TBdCircle *UpdateIntface;
552 
553 
554  boolean AllowEdgeRef = (boolean) TDatabase::ParamDB->MESHGEN_ALLOW_EDGE_REF;
555 
556  struct triangulateio In, Out;
557  std::ostringstream opts;
558  opts << " ";
559 
560  Out.pointlist = NULL;
561  Out.pointattributelist = NULL;
562  Out.pointmarkerlist = NULL;
563  Out.trianglelist = NULL;
564  Out.triangleattributelist = NULL;
565  Out.trianglearealist = NULL;
566  Out.neighborlist = NULL;
567  Out.segmentlist = NULL;
568  Out.segmentmarkerlist = NULL;
569  Out.holelist = NULL;
570  Out.regionlist = NULL;
571  Out.edgelist = NULL;
572  Out.edgemarkerlist = NULL;
573  Out.normlist = NULL;
574 
575  opts.seekp(std::ios::beg);
576 
577 
578  BoundPart = Domain->GetBdPart(0);
579  UpdateBound[0] = (TBdLine*)BoundPart->GetBdComp(0);
580  UpdateBound[1] = (TBdLine*)BoundPart->GetBdComp(1);
581  UpdateBound[2] = (TBdLine*)BoundPart->GetBdComp(2);
582  UpdateBound[3] = (TBdLine*)BoundPart->GetBdComp(3);
583  BoundPart = Domain->GetBdPart(1);
584  UpdateIntface = (TBdCircle*)BoundPart->GetBdComp(0);
585 
586 
587 //OutPut("MESHGEN_REF_QUALIT " << TDatabase::ParamDB->MESHGEN_REF_QUALITY << endl);
588 
589  opts<<'p'; // Constrained Delaunay Triangulation:
590  // initial values - only points defined on the boundary of the domain;
591  // triangulation near boundary may variate from Delaunay criterion
592  opts<<"q"<< TDatabase::ParamDB->MESHGEN_REF_QUALITY;
593  // Quality mesh generation with no angles smaller than 20 degrees;
594  opts<<"a"<< area; // Imposes a maximum triangle area.
595  opts<<'e'; // Outputs a list of edges of the triangulation
596  opts<<'z'; // Numbers if items starting from 0
597  //opts<<"VVVV"; // Gives detailed information about what Triangle is doing
598  opts<<'Q'; // Supress all explanation of what Triangle is doing, unless an error occurs
599 // opts<<'Y'; // Supress adding vertices on boundary edges
600  opts<<ends;
601 
602  N_Interface_Vert = int (TDatabase::ParamDB->P6); //Freesurf except end point
603  N_Hori = 300; // number of horrizontal BD vertices
604  N_Verti = 50; // number of vertical BD vertices
605  N_SlipBound_Vert = 2*N_Hori + 2*N_Verti;
606 
607  N_BDVertices = N_Interface_Vert+N_SlipBound_Vert;
608  In.numberofpoints = N_BDVertices;
609  In.pointlist = new double[2*In.numberofpoints];
610  In.pointmarkerlist = new int[In.numberofpoints];
611  In.numberofpointattributes = 0;
612 
613  In.numberofsegments = In.numberofpoints;
614  In.segmentlist = new int[2*In.numberofsegments];
615  In.segmentmarkerlist = new int[In.numberofsegments];
616  In.numberofregions = 0;
617  In.regionlist = NULL;
618 
619  In.numberofholes = 1;
620  In.holelist = NULL;
621 
622  Hole_List = new double[2* In.numberofholes];
623  Hole_List[0] = 0.;
624  Hole_List[1] = 0.;
625  In.holelist = Hole_List;
626 
627  In_Index = 0;
628  CurrComp = 1;
629 
630  hi = (Xi[1] - Xi[0])/(double)N_Hori;
631  x0 = Xi[0];
632  y0 = Yi[0];
633  x = Xi[0];
634 
635  // points and segments on the horizontal boundary (marker=1)
636  for(i=0;i<N_Hori;i++) // without last point
637  {
638  x = x0 + (double)i*hi;
639  In.pointlist[2*In_Index] = x;
640  In.pointlist[2*In_Index+1] = y0;
641 // cout<<" x : "<< In.pointlist[2*In_Index] << " y : "<< In.pointlist[2*In_Index+1] <<endl;
642  In.pointmarkerlist[In_Index] = CurrComp;
643  In.segmentlist[2*In_Index] = In_Index;
644  In.segmentlist[2*In_Index+1] = In_Index+1;
645  In.segmentmarkerlist[In_Index] = CurrComp;
646  In_Index++;
647  }
648 
649  CurrComp++;
650 
651  hi = (Yi[2] - Yi[1])/(double)N_Verti;
652  x0 = Xi[1];
653  y0 = Yi[1];
654  y = Yi[1];
655  // points and segments on the horizontal boundary (marker=1)
656  for(i=0;i<N_Verti;i++) // without last point
657  {
658  y = y0 + (double)i*hi;
659  In.pointlist[2*In_Index] = x0;
660  In.pointlist[2*In_Index+1] = y;
661 // cout<<" x : "<< In.pointlist[2*In_Index] << " y : "<< In.pointlist[2*In_Index+1] <<endl;
662  In.pointmarkerlist[In_Index] = CurrComp;
663  In.segmentlist[2*In_Index] = In_Index;
664  In.segmentlist[2*In_Index+1] = In_Index+1;
665  In.segmentmarkerlist[In_Index] = CurrComp;
666  In_Index++;
667 
668  }
669 
670  CurrComp++;
671 // cout<<endl;
672 
673  hi = (Xi[3] - Xi[2])/(double)N_Hori;
674  x0 = Xi[2];
675  y0 = Yi[2];
676  x = Xi[2];
677  // points and segments on the horizontal boundary (marker=1)
678  for(i=0;i<N_Hori;i++) // without last point
679  {
680  x = x0 + (double)i*hi;
681  In.pointlist[2*In_Index] = x;
682  In.pointlist[2*In_Index+1] = y0;
683 // cout<<" x : "<< In.pointlist[2*In_Index] << " y : "<< In.pointlist[2*In_Index+1] <<endl;
684  In.pointmarkerlist[In_Index] = CurrComp;
685  In.segmentlist[2*In_Index] = In_Index;
686  In.segmentlist[2*In_Index+1] = In_Index+1;
687  In.segmentmarkerlist[In_Index] = CurrComp;
688  In_Index++;
689 
690  }
691 
692  CurrComp++;
693 // cout<<endl;
694 
695  hi = (Yi[0] - Yi[3])/(double)N_Verti;
696  x0 = Xi[3];
697  y0 = Yi[3];
698  y = Yi[3];
699  // points and segments on the horizontal boundary (marker=1)
700  for(i=0;i<N_Verti;i++) // without last point
701  {
702  y = y0 + (double)i*hi;
703  In.pointlist[2*In_Index] = x0;
704  In.pointlist[2*In_Index+1] = y;
705 // cout<<" x : "<< In.pointlist[2*In_Index] << " y : "<< In.pointlist[2*In_Index+1] <<endl;
706  In.pointmarkerlist[In_Index] = CurrComp;
707  In.segmentlist[2*In_Index] = In_Index;
708  In.segmentlist[2*In_Index+1] = In_Index+1;
709  In.segmentmarkerlist[In_Index] = CurrComp;
710  In_Index++;
711 
712  }
713  CurrComp++;
714 
715  In.segmentlist[2*(In_Index-1)+1] = 0;
716  temp=In_Index;
717 
718 
719  T_a = TDatabase::ParamDB->P1; // x axis value in ellipse
720  T_b = TDatabase::ParamDB->P2; // y axis value in ellipse !!! set in modifyGausscoord funct also
721 // deviation = fabs( T_a - T_b);
722 
723 
724  C_x = 0.0; // center of the inner phase
725  C_y = 0.0, // center of the inner phase
726  phi1 = 0.000000E+0000; // end degree value of interface
727  phi2 = 2.*Pi;
728 
729 // C_x = 0.0; // center of the inner phase
730 // C_y = 0.0, // center of the inner phase
731  s = (phi2- phi1)/(double)N_Interface_Vert;
732 
733  // points and segments on the interface (marker=2)
734 // theta = 0.;
735 // t0 = theta;
736 
737  for(i=0;i<N_Interface_Vert;i++)
738  {
739  theta = phi1 + (double)i*s;
740 // cout<<" theta : "<< theta <<endl;
741 
742 // if(fabs(I_FaceX[i]) < 1e-10 ) I_FaceX[i] = 0.0;
743  In.pointlist[2*In_Index] = T_a*cos(theta);;
744  In.pointlist[2*In_Index+1] = T_b*sin(theta);
745 
746 // if(i==0)
747 // {
748 // FreeBD_X = I_FaceX[i]; FreeBD_Y = I_FaceY[i];
749 // cout << " sorting " << FreeBD_X << ' ' << FreeBD_Y<<endl;
750 // }
751 
752 // if(i==1)
753 // {
754 // h_interface = sqrt((I_FaceX[i-1]-I_FaceX[i])*(I_FaceX[i-1]-I_FaceX[i]) +
755 // (I_FaceY[i-1]-I_FaceY[i])*(I_FaceY[i-1]-I_FaceY[i]) );
756 // OutPut("h_interface " <<h_interface << endl);
757 // }
758 // cout<<(180./Pi)*theta<< " x : "<< In.pointlist[2*In_Index] << " y : "<< In.pointlist[2*In_Index+1] <<endl;
759 
760  In.pointmarkerlist[In_Index] = CurrComp;
761  In.segmentlist[2*In_Index] = In_Index;
762  In.segmentlist[2*In_Index+1] = In_Index+1;
763  In.segmentmarkerlist[In_Index] = CurrComp;
764  In_Index++;
765  }
766 
767  In.segmentlist[2*(In_Index-1)+1] = temp;
768 
769 // exit(0);
770 
771  if(Out.pointlist!=NULL) {
772  free(Out.pointlist); Out.pointlist = NULL;}
773  if(Out.pointattributelist!=NULL) {
774  free(Out.pointattributelist); Out.pointattributelist = NULL;}
775  if(Out.pointmarkerlist!=NULL) {
776  free(Out.pointmarkerlist); Out.pointmarkerlist = NULL;}
777  if(Out.trianglelist!=NULL) {
778  free(Out.trianglelist); Out.trianglelist = NULL;}
779  if(Out.triangleattributelist!=NULL) {
780  free(Out.triangleattributelist); Out.triangleattributelist = NULL;}
781  if(Out.trianglearealist!=NULL) {
782  free(Out.trianglearealist); Out.trianglearealist = NULL;}
783  if(Out.neighborlist!=NULL) {
784  free(Out.neighborlist); Out.neighborlist = NULL;}
785  if(Out.segmentlist!=NULL) {
786  free(Out.segmentlist); Out.segmentlist = NULL;}
787  if(Out.segmentmarkerlist!=NULL) {
788  free(Out.segmentmarkerlist); Out.segmentmarkerlist = NULL;}
789  if(Out.holelist!=NULL) {
790  free(Out.holelist); Out.holelist = NULL;}
791  if(Out.regionlist!=NULL) {
792  free(Out.regionlist); Out.regionlist = NULL;}
793  if(Out.edgelist!=NULL) {
794  free(Out.edgelist); Out.edgelist = NULL;}
795  if(Out.edgemarkerlist!=NULL) {
796  free(Out.edgemarkerlist); Out.edgemarkerlist = NULL;}
797  if(Out.normlist!=NULL) {
798  free(Out.normlist); Out.normlist = NULL;}
799 
800  // call triangle
801  triangulate((char*)opts.str().c_str(), &In, &Out, (struct triangulateio *)NULL);
802 
803 
804  Domain->GetTreeInfo(CellTree, N_RootCells);
805  coll = Domain->GetCollection(It_Finest, 0);
806  N_Cells = coll->GetN_Cells();
807 
808  // remove all existing vertices and joints
809  VertexDel = new TVertex*[3*N_RootCells];
810 
811  CurrVertex = 0;
812 
813  for(i=0;i<N_Cells;i++)
814  {
815  cell = coll->GetCell(i);
816  N_Joints = cell->GetN_Joints();
817  N_Vertices = cell->GetN_Vertices();
818  for(j=0;j<N_Joints;j++)
819  {
820  if(CurrVertex==0)
821  {
822  VertexDel[CurrVertex] = cell->GetVertex(j);
823  CurrVertex++;
824  }
825  else
826  {
827  ID = 0;
828  for(k=0;k<CurrVertex;k++)
829  if(VertexDel[k]==cell->GetVertex(j))
830  {
831  ID = 1; break;
832  }
833  if(ID!=1)
834  {
835  VertexDel[CurrVertex] = cell->GetVertex(j);
836  CurrVertex++;
837  }
838  } // else if(CurrVertex==0)
839 
840  ID = 0;
841  for(k=0;k<CurrVertex;k++)
842  if(VertexDel[k]==cell->GetVertex((j+1)%N_Vertices))
843  {
844  ID = 1; break;
845  }
846  if(ID!=1)
847  {
848  VertexDel[CurrVertex] = cell->GetVertex((j+1)%N_Vertices);
849  CurrVertex++;
850  }
851  } // for j
852  } // for i
853  for(i=0;i<CurrVertex;i++)
854  delete VertexDel[i];
855 
856  delete []VertexDel;
857  OutPut(CurrVertex<<" vertices were deleted"<<endl);
858 
859  // remove all existing cells and joints
860  for(i=0;i<N_RootCells;i++)
861  delete (TGridCell*)CellTree[i];
862  OutPut(N_RootCells<<" cells were deleted"<<endl);
863  delete CellTree;
864  delete coll;
865 
866 
867 
868  // Solid Bound startx, starty, x length and y length
869  UpdateBound[0]->SetParams(Xi[0], Yi[0], Xi[1]-Xi[0],Yi[1]-Yi[0]);
870  UpdateBound[1]->SetParams(Xi[1], Yi[1], Xi[2]-Xi[1],Yi[2]-Yi[1]);
871  UpdateBound[2]->SetParams(Xi[2], Yi[2], Xi[3]-Xi[2],Yi[3]-Yi[2]);
872  UpdateBound[3]->SetParams(Xi[3], Yi[3], Xi[0]-Xi[3],Yi[0]-Yi[3]);
873 
874 
875 // Free boundary xmid, ymid, radius_a, radius_b, start angle, end angle
876  UpdateIntface->SetParams(C_x, C_y, T_a, T_b, phi1, phi2);
877 
878 
879  N_RootCells = Out.numberoftriangles;
880 
881  // allocate auxillary fields
882  Coordinates = Out.pointlist;
883  Triangles = Out.trianglelist;
884  PartMarker = new int[Out.numberofpoints];
885 
886  // generate new vertices
887  N_G = Out.numberofpoints;
888  NewVertices = new TVertex*[N_G];
889 
890  for (i=0;i<N_G;i++)
891  NewVertices[i] = new TVertex(Coordinates[2*i], Coordinates[2*i+1]);
892 
893 // // set bounding box
894 // left = bottom = 1e8;
895 // right = top = -1e8;
896 //
897 // for(i=0;i<In.numberofpoints;i++)
898 // {
899 // if(left>In.pointlist[2*i]) left = In.pointlist[2*i];
900 // if(right<In.pointlist[2*i]) right = In.pointlist[2*i];
901 // if(top<In.pointlist[2*i+1]) top = In.pointlist[2*i+1];
902 // if(bottom>In.pointlist[2*i+1]) bottom = In.pointlist[2*i+1];
903 // }
904 
905 /* // Solid Bound startx, starty, x length and y length
906  UpdateSlipBound[0]->SetParams(Xi[0], Yi[0], Xi[1]-Xi[0],Yi[1]-Yi[0]);
907  UpdateSlipBound[1]->SetParams(Xi[1], Yi[1], Xi[2]-Xi[1],Yi[2]-Yi[1]);
908  UpdateSlipBound[2]->SetParams(Xi[2], Yi[2], Xi[3]-Xi[2],Yi[3]-Yi[2]);
909  UpdateSlipBound[3]->SetParams(Xi[3], Yi[3], Xi[0]-Xi[3],Yi[0]-Yi[3]);
910 
911 // Free boundary xmid, ymid, radius_a, radius_b, start angle, end angle
912  UpdateIntface->SetParams(C_x, C_y, T_a, T_b, phi1, phi2);*/
913 
914  // generate cells
915  CellTree = new TBaseCell*[N_RootCells];
916 
917  for (i=0;i<N_RootCells;i++)
918  {
919  CellTree[i] = new TMacroCell(TDatabase::RefDescDB[Triangle], 0);
920 
921  CellTree[i]->SetVertex(0, NewVertices[Out.trianglelist[3*i ]]);
922  CellTree[i]->SetVertex(1, NewVertices[Out.trianglelist[3*i + 1]]);
923  CellTree[i]->SetVertex(2, NewVertices[Out.trianglelist[3*i + 2]]);
924 
925  ((TMacroCell *) CellTree[i])->SetSubGridID(0);
926  }
927 
928  Domain->SetTreeInfo(CellTree, N_RootCells);
929 
930  // initialize iterators
931  TDatabase::IteratorDB[It_EQ]->SetParam(Domain);
932  TDatabase::IteratorDB[It_LE]->SetParam(Domain);
933  TDatabase::IteratorDB[It_Finest]->SetParam(Domain);
934  TDatabase::IteratorDB[It_Between]->SetParam(Domain);
935  TDatabase::IteratorDB[It_OCAF]->SetParam(Domain);
936 
937  // search neighbours
938  N_G = Out.numberofpoints;
939  PointNeighb = new int[N_G];
940 
941  memset(PointNeighb, 0, N_G *SizeOfInt);
942 
943  for (i=0;i<3*N_RootCells;i++)
944  PointNeighb[Triangles[i]]++;
945 
946  maxEpV=0;
947 
948  for (i=0;i<N_G;i++)
949  if (PointNeighb[i] > maxEpV) maxEpV = PointNeighb[i];
950  delete [] PointNeighb;
951 
952  PointNeighb = new int[++maxEpV * N_G];
953 
954  memset(PointNeighb, 0, maxEpV * N_G *SizeOfInt);
955 
956  // first colomn contains the number of following elements
957  // for every point at first column we set the number of neighbour points
958  // at further columns we set the index of corresponding cells
959  for(i=0;i<3*N_RootCells;i++)
960  {
961  j = Triangles[i]*maxEpV;
962  PointNeighb[j]++;
963  PointNeighb[j + PointNeighb[j]] = i / 3;
964  }
965 
966  // generate new edges
967  N_G = Out.numberofedges;
968  for (i=0;i<N_G;i++)
969  {
970  a = Out.edgelist[2*i];
971  b = Out.edgelist[2*i+1];
972  Neib[0] = -1;
973  Neib[1] = -1;
974  CurrNeib = 0;
975 
976  len1 = PointNeighb[a*maxEpV];
977  len2 = PointNeighb[b*maxEpV];
978 
979  // find indexes of cells containing the current edge
980  for (j=1;j<=len1;j++)
981  {
982  Neighb_tmp = PointNeighb[a*maxEpV + j];
983  for (k=1;k<=len2;k++)
984  if (Neighb_tmp == PointNeighb[b*maxEpV + k])
985  {
986  Neib[CurrNeib++] = Neighb_tmp;
987  break;
988  }
989  if (CurrNeib == 2) break;
990  }
991 
992 // cout<<BDpart << " BDpart CurrComp "<< CurrComp <<endl;
993 
994 
995 
996  if (Out.edgemarkerlist[i]) // 0 for inner edges and Boundcomp+1 for Boundedge respect
997  {
998  CurrComp = Out.edgemarkerlist[i] - 1;
999  if (CurrComp >= 100000) CurrComp -= 100000;
1000 
1001  BDpart=Domain->GetBdPartID(CurrComp);
1002  CurrComp= Domain->GetLocalBdCompID(CurrComp);
1003 
1004 // cout<<BDpart << " BDpart CurrComp "<< CurrComp <<endl;
1005 
1006  if(Domain->GetBdPart(BDpart)->GetBdComp(CurrComp)->GetTofXY(
1007  NewVertices[a]->GetX(), NewVertices[a]->GetY(), T_a) ||
1008  Domain->GetBdPart(BDpart)->GetBdComp(CurrComp)->GetTofXY(
1009  NewVertices[b]->GetX(), NewVertices[b]->GetY(), T_b))
1010  {
1011  cerr<<"Error: could not set parameter values"<<endl;
1012  OutPut(NewVertices[a]<<endl);
1013  OutPut(NewVertices[b]<<endl);
1014  // exit(0);
1015  }
1016 
1017 // ===============================================================================
1018  // due to the hole the orientation of the circle is colck-wise from out side
1019 // the parameter of the starting edge (in 0, 2pi) is for e.g (0, 0.9) (colck-wise)
1020 // while refining to get the mid point we should get the mid point parameter as 0.95
1021 // but we will get only (0+0.9)/2 =0.45 (wrong mid point). So we change.
1022 // Note only if the orientation is colck-wise !!!!!!!
1023 // ===============================================================================
1024 
1025  if(BDpart==1 && CurrComp==0 && fabs(T_a)==0 ) T_a=1;
1026 
1027 
1028 // cout<<BDpart << " BDpart CurrComp "<< CurrComp <<endl;
1029 
1030 
1031  if (CurrNeib == 2) // 2 cells contain the current edge
1032  {
1033  if(Domain->GetBdPart(BDpart)->GetBdComp(CurrComp)->IsFreeBoundary())
1034  {
1035  Joint = new TIsoInterfaceJoint(Domain->GetBdPart(BDpart)->GetBdComp(CurrComp),
1036  T_a, T_b, CellTree[Neib[0]], CellTree[Neib[1]]);
1037  }
1038  else
1039  {
1040  Joint = new TInterfaceJoint(Domain->GetBdPart(BDpart)->GetBdComp(CurrComp),
1041  T_a, T_b, CellTree[Neib[0]], CellTree[Neib[1]]);
1042  }
1043  }
1044  else
1045  {
1046  if(Domain->GetBdPart(BDpart)->GetBdComp(CurrComp)->IsFreeBoundary())
1047  {
1048  Joint = new TIsoBoundEdge(Domain->GetBdPart(BDpart)->GetBdComp(CurrComp), T_a, T_b);
1049 // cout<<" FreeBoundary"<<endl;
1050  }
1051  else
1052  {
1053  Joint = new TBoundEdge(Domain->GetBdPart(BDpart)->GetBdComp(CurrComp), T_a, T_b);
1054  }
1055  }
1056  }
1057  else // inner edge
1058  {
1059  if (CurrNeib != 2)
1060  cerr << "Error!!!!!!!! not enough neighbours!" << endl;
1061 
1062  Joint = new TJointEqN(CellTree[Neib[0]], CellTree[Neib[1]]);
1063  }
1064 
1065  // find the local index for the point 'a' on the cell
1066  for (j=0;j<3;j++)
1067  if (Triangles[3*Neib[0]+j] == a) break;
1068 
1069  // find the local index for the point 'b' on the cell
1070  for (k=0;k<3;k++)
1071  if (Triangles[3*Neib[0]+k] == b) break;
1072 
1073  k = k*10 + j;
1074 
1075  switch (k)
1076  {
1077  case 1:
1078  case 10:
1079  j = 0;
1080  break;
1081  case 12:
1082  case 21:
1083  j = 1;
1084  break;
1085  case 2:
1086  case 20:
1087  j = 2;
1088  break;
1089  }
1090 
1091  CellTree[Neib[0]]->SetJoint(j, Joint);
1092 
1093  if (Neib[1] != -1)
1094  {
1095  // find the local index for the point 'a' on the cell
1096  for (j=0;j<3;j++)
1097  if (Triangles[3*Neib[1]+j] == a) break;
1098 
1099  // find the local index for the point 'b' on the cell
1100  for (k=0;k<3;k++)
1101  if (Triangles[3*Neib[1]+k] == b) break;
1102 
1103  k = k*10 + j;
1104 
1105  switch (k) // j will contain the local index for the current
1106  {
1107  case 1:
1108  case 10:
1109  j = 0;
1110  break;
1111  case 12:
1112  case 21:
1113  j = 1;
1114  break;
1115  case 2:
1116  case 20:
1117  j = 2;
1118  break;
1119  }
1120 
1121  CellTree[Neib[1]]->SetJoint(j, Joint);
1122  }
1123 
1124  if (Joint->GetType() == InterfaceJoint ||
1125  Joint->GetType() == IsoInterfaceJoint)
1126  ((TInterfaceJoint *) Joint)->CheckOrientation();
1127  }
1128 
1129 
1130  delete [] NewVertices;
1131  delete [] PointNeighb;
1132  delete [] In.pointlist;
1133  delete [] In.pointmarkerlist;
1134  delete [] In.segmentlist;
1135  delete [] In.segmentmarkerlist;
1136 
1137  if(Out.pointlist!=NULL) {
1138  free(Out.pointlist); Out.pointlist = NULL;}
1139  if(Out.pointattributelist!=NULL) {
1140  free(Out.pointattributelist); Out.pointattributelist = NULL;}
1141  if(Out.pointmarkerlist!=NULL) {
1142  free(Out.pointmarkerlist); Out.pointmarkerlist = NULL;}
1143  if(Out.trianglelist!=NULL) {
1144  free(Out.trianglelist); Out.trianglelist = NULL;}
1145  if(Out.triangleattributelist!=NULL) {
1146  free(Out.triangleattributelist); Out.triangleattributelist = NULL;}
1147  if(Out.trianglearealist!=NULL) {
1148  free(Out.trianglearealist); Out.trianglearealist = NULL;}
1149  if(Out.neighborlist!=NULL) {
1150  free(Out.neighborlist); Out.neighborlist = NULL;}
1151  if(Out.segmentlist!=NULL) {
1152  free(Out.segmentlist); Out.segmentlist = NULL;}
1153  if(Out.segmentmarkerlist!=NULL) {
1154  free(Out.segmentmarkerlist); Out.segmentmarkerlist = NULL;}
1155  if(Out.holelist!=NULL) {
1156  free(Out.holelist); Out.holelist = NULL;}
1157  if(Out.regionlist!=NULL) {
1158  free(Out.regionlist); Out.regionlist = NULL;}
1159  if(Out.edgelist!=NULL) {
1160  free(Out.edgelist); Out.edgelist = NULL;}
1161  if(Out.edgemarkerlist!=NULL) {
1162  free(Out.edgemarkerlist); Out.edgemarkerlist = NULL;}
1163  if(Out.normlist!=NULL) {
1164  free(Out.normlist); Out.normlist = NULL;}
1165 
1166 //======================================================================
1167 // Triangular for grid generation --end
1168 //======================================================================
1169 
1170 
1171 // cout<< "tetgen" <<endl;
1172 // exit(0);
1173 
1174 
1175 } // TriaReMeshGen
double * GetValues()
Definition: FEFunction2D.h:67
virtual int GetTofXY(double X, double Y, double &T)=0
static TFE2D * GetFE2D(FE2D FE)
Definition: FEDatabase2D.h:353
int GetLength()
Definition: FEFunction2D.h:63
void GetTreeInfo(TBaseCell **&celltree, int &N_rootcells)
get tree of cells
Definition: Domain.h:176
TCollection * GetCollection() const
Definition: FESpace.h:131
JointType GetType()
Definition: Joint.h:75
TBaseCell * GetCell(int i) const
return Cell with index i in Cells-array
Definition: Collection.h:50
TBoundComp2D * GetBoundComp() const
Definition: BoundEdge.h:77
int GetBdPartID(int BdCompID)
get boundary part of BdCompID
Definition: Domain.C:88
void SetParams(double xmid, double ymid, double radius_a, double radius_b, double phi1, double phi2)
Definition: BdCircle.C:21
Definition: IsoBoundEdge.h:18
Definition: FE2D.h:20
Definition: gridgen.h:21
TBoundComp2D * GetBdComp(int i)
Definition: BoundPart.h:49
int SetJoint(int J_i, TJoint *J)
set the pointer to face J_i to J
Definition: BaseCell.h:168
contains the boundary description, the virtual cell tree and macro grid
Definition: Domain.h:36
void SetParams(double xstart, double ystart, double delx, double dely)
Definition: BdLine.C:21
Definition: FESpace2D.h:28
double RE_NR
Definition: Database.h:313
int SetParam(TDomain *domain)
Definition: Iterator.C:17
static double ** GetOrigElementValues(BaseFunct1D BaseFunct, MultiIndex1D MultiIndex)
Definition: FEDatabase2D.h:300
static TIterator ** IteratorDB
Definition: Database.h:1131
store cells in an array, used by cell iterators
Definition: Collection.h:18
int GetN_Joints()
return the number of joints
Definition: BaseCell.h:185
virtual TVertex * GetVertex(int Vert_i)=0
return the pointer to vertex with number i
represent a unit of the macro grid
Definition: MacroCell.h:15
Definition: JointEqN.h:20
int GetN_Cells() const
return number of cells
Definition: Collection.h:46
TJoint * GetJoint(int J_i)
return the pointer to face with number i
Definition: BaseCell.h:175
Definition: Joint.h:48
TFESpace2D * GetFESpace2D()
Definition: FEFunction2D.h:59
TBoundPart * GetBdPart(int i)
get i-th boundary part
Definition: Domain.h:172
FE2D GetFE2D(int i, TBaseCell *cell)
Definition: FESpace2D.C:1184
TFEDesc2D * GetFEDesc2D() const
Definition: FE2D.h:97
int GetN_Vertices()
return the number of vertices of the cell
Definition: BaseCell.h:179
int ** GetJointDOF() const
Definition: FEDesc2D.h:86
static BaseFunct2D * GetBaseFunct2D_IDFromFE2D()
Definition: FEDatabase2D.h:417
Definition: BoundPart.h:21
void SetTreeInfo(TBaseCell **celltree, int N_rootcells)
set tree of cells
Definition: Domain.h:183
static int * GetN_BaseFunctFromFE2D()
Definition: FEDatabase2D.h:421
bool IsFreeBoundary() const
Definition: BoundComp.h:57
TCollection * GetCollection(Iterators it, int level)
produce a collection with all cells returned by iterator it
Definition: Domain.C:1982
int GetID() const
Definition: BoundComp.h:49
Definition: BdCircle.h:18
information for finite element data structure
Definition: BaseCell.h:25
int * GetGlobalNumbers() const
Definition: FESpace.h:135
Definition: Vertex.h:19
int GetN_Edges()
return the number of edges of the cell
Definition: BaseCell.h:182
static TRefDesc ** RefDescDB
Definition: Database.h:1125
Definition: BoundEdge.h:19
Definition: IsoInterfaceJoint.h:18
Definition: BoundComp.h:27
static RefTrans2D GetOrig(int N_LocalUsedElements, FE2D *LocalUsedElements, TCollection *Coll, TBaseCell *cell, bool *Needs2ndDer, int &N_Points, double *&xi, double *&eta, double *&weights, double *X, double *Y, double *absdetjk)
Definition: FEDatabase2D.C:1765
virtual int SetVertex(int Vert_i, TVertex *Vert)=0
set the pointer of vertex Vert_i to Vert
Definition: FEDesc2D.h:15
Definition: BdLine.h:18
represent geometric information of the cell
Definition: GridCell.h:15
int * GetBeginIndex() const
Definition: FESpace.h:142
int GetN_JointDOF() const
Definition: FEDesc2D.h:61
Definition: InterfaceJoint.h:18
static TParamDB * ParamDB
Definition: Database.h:1134
int GetLocalBdCompID(int BdCompID)
get local number of boundary component
Definition: Domain.C:98
Definition: FEFunction2D.h:24