ParMooN
 All Classes Functions Variables Friends Pages
BF_N_Q_Q2_2D.h
1 // ***********************************************************************
2 // Q2 element, nonconforming, 2D
3 // ***********************************************************************
4 
5 // base function values
6 static void N_Q_Q2_2D_Funct(double xi, double eta, double *values)
7 {
8  double t1, t2, t3, t4, t5, t8, t10, t11, t12, t15, t20, t26, t32;
9  double t7, t9, t16, t17, t18, t22;
10  double t6, t19;
11 
12  switch(TDatabase::ParamDB->NC_TYPE)
13  {
14  case 2: // G. Matthies, many differences, family 2 // GM
15  t1 = 3.0/16.0*eta;
16  t2 = eta*eta;
17  t3 = 3.0/4.0*t2;
18  t4 = xi*xi;
19  t5 = t4-t2;
20  t7 = 15.0/32.0*eta*t5;
21  t9 = 3.0/16.0*xi;
22  t10 = 3.0/4.0*t4;
23  t12 = 15.0/32.0*xi*t5;
24  t16 = 5.0/16.0*xi;
25  t17 = xi*eta;
26  t18 = t17/4.0;
27  t20 = 5.0/8.0*t17*t5;
28  t22 = 5.0/16.0*eta;
29 
30  values[0] = -1.0/4.0-t1+t3+t7;
31  values[1] = -1.0/4.0+t9+t10+t12;
32  values[2] = -1.0/4.0+t1+t3-t7;
33  values[3] = -1.0/4.0-t9+t10-t12;
34  values[4] = t16-t18-t12+t20;
35  values[5] = t22+t18+t7+t20;
36  values[6] = -t16-t18+t12+t20;
37  values[7] = -t22+t18-t7+t20;
38  values[8] = 2.0-3.0/2.0*t4-3.0/2.0*t2;
39  break;
40 
41  case 3: // G. Matthies, only one difference, family 3 // FS
42  t1 = 3.0/4.0*eta;
43  t2 = eta*eta;
44  t3 = 3.0/4.0*t2;
45  t5 = 5.0/4.0*t2*eta;
46  t7 = 3.0/4.0*xi;
47  t8 = xi*xi;
48  t9 = 3.0/4.0*t8;
49  t11 = 5.0/4.0*t8*xi;
50  t15 = 5.0/4.0*xi;
51  t16 = xi*eta;
52  t17 = t16/4.0;
53  t20 = 5.0/8.0*t16*(t8-t2);
54  t22 = 5.0/4.0*eta;
55 
56  values[0] = -1.0/4.0+t1+t3-t5;
57  values[1] = -1.0/4.0-t7+t9+t11;
58  values[2] = -1.0/4.0-t1+t3+t5;
59  values[3] = -1.0/4.0+t7+t9-t11;
60  values[4] = t15-t17-t11+t20;
61  values[5] = t22+t17-t5+t20;
62  values[6] = -t15-t17+t11+t20;
63  values[7] = -t22+t17+t5+t20;
64  values[8] = 2.0-3.0/2.0*t8-3.0/2.0*t2;
65  break;
66 
67  case 4: // Apel, Matthies, anisotrop, family 4 // Apel/Matthies
68  cout << "o";
69  t1 = 3.0/4.0*eta;
70  t2 = eta*eta;
71  t3 = 3.0/4.0*t2;
72  t4 = xi*xi;
73  t6 = 3.0/4.0*t4*eta;
74  t8 = 3.0/4.0*xi;
75  t9 = 3.0/4.0*t4;
76  t10 = t4*xi;
77  t11 = 5.0/4.0*t10;
78  t15 = xi*eta;
79  t16 = t10*eta;
80  t18 = eta/4.0;
81  t19 = 3.0/4.0*t15;
82  t20 = 5.0/4.0*t16;
83 
84  values[0] = -1.0/4.0-t1+t3+t6;
85  values[1] = -1.0/4.0-t8+t9+t11;
86  values[2] = -1.0/4.0+t1+t3-t6;
87  values[3] = -1.0/4.0+t8+t9-t11;
88  values[4] = 5.0/4.0*xi-5.0/4.0*t15-5.0/4.0*t10+5.0/4.0*t16;
89  values[5] = -t18-t19+t6+t20;
90  values[6] = -5.0/4.0*xi-5.0/4.0*t15+5.0/4.0*t10+5.0/4.0*t16;
91  values[7] = t18-t19-t6+t20;
92  values[8] = 2.0-3.0/2.0*t4-3.0/2.0*t2;
93  break;
94 
95  case 1: // Hennart, Jaffr'e, Roberts, 1988 // Hennart et al.
96  t1 = eta/2.0;
97  t2 = eta*eta;
98  t3 = 3.0/4.0*t2;
99  t4 = xi*xi;
100  t5 = 3.0/2.0*t4;
101  t8 = (-1.0/2.0+t5)*eta/2.0;
102  t10 = xi/2.0;
103  t11 = 3.0/4.0*t4;
104  t12 = 3.0/2.0*t2;
105  t15 = xi*(-1.0/2.0+t12)/2.0;
106  t20 = xi*eta/4.0;
107  t26 = (5.0/2.0*t4*xi-3.0/2.0*xi)*eta/4.0;
108  t32 = xi*(5.0/2.0*t2*eta-3.0/2.0*eta)/4.0;
109 
110  values[0] = -1.0/4.0-t1+t3+t8;
111  values[1] = -1.0/4.0+t10+t11-t15;
112  values[2] = -1.0/4.0+t1+t3-t8;
113  values[3] = -1.0/4.0-t10+t11+t15;
114  values[4] = -t20+t15+t26-t32;
115  values[5] = t20+t8+t26-t32;
116  values[6] = -t20-t15+t26-t32;
117  values[7] = t20-t8+t26-t32;
118  values[8] = 2.0-t5-t12;
119  break;
120  } // end switch
121 }
122 
123 // values of the derivatives in xi direction
124 static void N_Q_Q2_2D_DeriveXi(double xi, double eta, double *values)
125 {
126  double t2, t3, t4, t5, t8, t9, t13, t15, t17;
127  double t1, t6, t7, t10, t12, t14;
128 
129  switch(TDatabase::ParamDB->NC_TYPE)
130  {
131  case 2: // G. Matthies, many differences, family 2
132  t2 = 15.0/16.0*xi*eta;
133  t3 = 3.0/2.0*xi;
134  t4 = xi*xi;
135  t5 = 45.0/32.0*t4;
136  t6 = eta*eta;
137  t7 = 15.0/32.0*t6;
138  t10 = eta/4.0;
139  t13 = 5.0/8.0*eta*(t4-t6);
140  t15 = 5.0/4.0*t4*eta;
141 
142  values[0] = t2;
143  values[1] = 3.0/16.0+t3+t5-t7;
144  values[2] = -t2;
145  values[3] = -3.0/16.0+t3-t5+t7;
146  values[4] = 5.0/16.0-t10-t5+t7+t13+t15;
147  values[5] = t10+t2+t13+t15;
148  values[6] = -5.0/16.0-t10+t5-t7+t13+t15;
149  values[7] = t10-t2+t13+t15;
150  values[8] = -3.0*xi;
151  break;
152 
153  case 3: // G. Matthies, only one difference, family 3
154  t1 = 3.0/2.0*xi;
155  t2 = xi*xi;
156  t3 = 15.0/4.0*t2;
157  t6 = eta/4.0;
158  t7 = eta*eta;
159  t10 = 5.0/8.0*eta*(t2-t7);
160  t12 = 5.0/4.0*t2*eta;
161  t14 = t6+t10+t12;
162 
163  values[0] = 0.0;
164  values[1] = -3.0/4.0+t1+t3;
165  values[2] = 0.0;
166  values[3] = 3.0/4.0+t1-t3;
167  values[4] = 5.0/4.0-t6-t3+t10+t12;
168  values[5] = t14;
169  values[6] = -5.0/4.0-t6+t3+t10+t12;
170  values[7] = t14;
171  values[8] = -3.0*xi;
172  break;
173 
174  case 4: // Apel, Matthies, anisotrop, family 4
175  t2 = 3.0/2.0*xi*eta;
176  t3 = 3.0/2.0*xi;
177  t4 = xi*xi;
178  t5 = 15.0/4.0*t4;
179  t8 = 5.0/4.0*eta;
180  t10 = 15.0/4.0*t4*eta;
181  t12 = 3.0/4.0*eta;
182 
183  values[0] = t2;
184  values[1] = -3.0/4.0+t3+t5;
185  values[2] = -t2;
186  values[3] = 3.0/4.0+t3-t5;
187  values[4] = 5.0/4.0-t8-t5+t10;
188  values[5] = -t12+t2+t10;
189  values[6] = -5.0/4.0-t8+t5+t10;
190  values[7] = -t12-t2+t10;
191  values[8] = -3.0*xi;
192  break;
193 
194  case 1: // Hennart, Jaffr'e, Roberts, 1988
195  t2 = 3.0/2.0*xi*eta;
196  t3 = 3.0/2.0*xi;
197  t4 = eta*eta;
198  t5 = 3.0/4.0*t4;
199  t8 = eta/8.0;
200  t9 = xi*xi;
201  t13 = (15.0/2.0*t9-3.0/2.0)*eta/4.0;
202  t15 = 5.0/8.0*t4*eta;
203  t17 = 5.0/8.0*eta;
204 
205  values[0] = t2;
206  values[1] = 3.0/4.0+t3-t5;
207  values[2] = -t2;
208  values[3] = -3.0/4.0+t3+t5;
209  values[4] = t8-1.0/4.0+t5+t13-t15;
210  values[5] = t17+t2+t13-t15;
211  values[6] = t8+1.0/4.0-t5+t13-t15;
212  values[7] = t17-t2+t13-t15;
213  values[8] = -3.0*xi;
214  break;
215  }
216 }
217 
218 // values of the derivatives in eta direction
219 static void N_Q_Q2_2D_DeriveEta(double xi, double eta, double *values)
220 {
221  double t1, t2, t3, t6, t8, t10, t11, t15, t17;
222  double t4, t5, t7, t12, t13;
223  double t9, t14, t16, t19, t20, t21, t22;
224 
225  switch(TDatabase::ParamDB->NC_TYPE)
226  {
227  case 2: // G. Matthies, many differences, family 2
228  t1 = 3.0/2.0*eta;
229  t2 = xi*xi;
230  t3 = 15.0/32.0*t2;
231  t4 = eta*eta;
232  t5 = 45.0/32.0*t4;
233  t8 = 15.0/16.0*xi*eta;
234  t10 = xi/4.0;
235  t13 = 5.0/8.0*xi*(t2-t4);
236  t15 = 5.0/4.0*xi*t4;
237 
238  values[0] = -3.0/16.0+t1+t3-t5;
239  values[1] = -t8;
240  values[2] = 3.0/16.0+t1-t3+t5;
241  values[3] = t8;
242  values[4] = -t10+t8+t13-t15;
243  values[5] = 5.0/16.0+t10+t3-t5+t13-t15;
244  values[6] = -t10-t8+t13-t15;
245  values[7] = -5.0/16.0+t10-t3+t5+t13-t15;
246  values[8] = -3.0*eta;
247  break;
248 
249  case 3: // G. Matthies, only one difference, family 3
250  t1 = 3.0/2.0*eta;
251  t2 = eta*eta;
252  t3 = 15.0/4.0*t2;
253  t6 = xi/4.0;
254  t7 = xi*xi;
255  t10 = 5.0/8.0*xi*(t7-t2);
256  t12 = 5.0/4.0*xi*t2;
257  t13 = -t6+t10-t12;
258 
259  values[0] = 3.0/4.0+t1-t3;
260  values[1] = 0.0;
261  values[2] = -3.0/4.0+t1+t3;
262  values[3] = 0.0;
263  values[4] = t13;
264  values[5] = 5.0/4.0+t6-t3+t10-t12;
265  values[6] = t13;
266  values[7] = -5.0/4.0+t6+t3+t10-t12;
267  values[8] = -3.0*eta;
268  break;
269 
270  case 4: // Apel, Matthies, anisotrop, family 4
271  t1 = 3.0/2.0*eta;
272  t2 = xi*xi;
273  t3 = 3.0/4.0*t2;
274  t6 = t2*xi;
275  t7 = -xi+t6;
276  t8 = 3.0/4.0*xi;
277  t9 = 5.0/4.0*t6;
278 
279  values[0] = -3.0/4.0+t1+t3;
280  values[1] = 0.0;
281  values[2] = 3.0/4.0+t1-t3;
282  values[3] = 0.0;
283  values[4] = 5.0/4.0*t7;
284  values[5] = -1.0/4.0-t8+t3+t9;
285  values[6] = 5.0/4.0*t7;
286  values[7] = 1.0/4.0-t8-t3+t9;
287  values[8] = -3.0*eta;
288  break;
289 
290  case 1: // Hennart, Jaffr'e, Roberts, 1988
291  t1 = 3.0/2.0*eta;
292  t2 = xi*xi;
293  t3 = 3.0/4.0*t2;
294  t6 = 3.0/2.0*xi*eta;
295  t8 = 5.0/8.0*xi;
296  t10 = 5.0/8.0*t2*xi;
297  t11 = eta*eta;
298  t15 = xi*(15.0/2.0*t11-3.0/2.0)/4.0;
299  t17 = xi/8.0;
300 
301  values[0] = -3.0/4.0+t1+t3;
302  values[1] = -t6;
303  values[2] = 3.0/4.0+t1-t3;
304  values[3] = t6;
305  values[4] = -t8+t6+t10-t15;
306  values[5] = -t17-1.0/4.0+t3+t10-t15;
307  values[6] = -t8-t6+t10-t15;
308  values[7] = -t17+1.0/4.0-t3+t10-t15;
309  values[8] = -3.0*eta;
310  break;
311  }
312 }
313 
314 // values of derivatives in xi-xi direction
315 static void N_Q_Q2_2D_DeriveXiXi(double xi, double eta, double *values)
316 {
317  double t1, t3;
318  double t2, t5, t6;
319  double t7;
320 
321  switch(TDatabase::ParamDB->NC_TYPE)
322  {
323  case 2: // G. Matthies, many differences, family 2
324  t1 = 15.0/16.0*eta;
325  t2 = 45.0/16.0*xi;
326  t6 = 15.0/4.0*xi*eta;
327 
328  values[0] = t1;
329  values[1] = 3.0/2.0+t2;
330  values[2] = -t1;
331  values[3] = 3.0/2.0-t2;
332  values[4] = -t2+t6;
333  values[5] = t1+t6;
334  values[6] = t2+t6;
335  values[7] = -t1+t6;
336  values[8] = -3.0;
337  break;
338 
339  case 3: // G. Matthies, only one difference, family 3
340  t1 = 15.0/2.0*xi;
341  t5 = 15.0/4.0*xi*eta;
342 
343  values[0] = 0.0;
344  values[1] = 3.0/2.0+t1;
345  values[2] = 0.0;
346  values[3] = 3.0/2.0-t1;
347  values[4] = -t1+t5;
348  values[5] = t5;
349  values[6] = t1+t5;
350  values[7] = t5;
351  values[8] = -3.0;
352  break;
353 
354  case 4: // Apel, Matthies, anisotrop, family 4
355  t1 = 3.0/2.0*eta;
356  t2 = 15.0/2.0*xi;
357  t5 = xi*eta;
358  t7 = 15.0/2.0*t5;
359 
360  values[0] = t1;
361  values[1] = 3.0/2.0+t2;
362  values[2] = -t1;
363  values[3] = 3.0/2.0-t2;
364  values[4] = -15.0/2.0*xi+15.0/2.0*t5;
365  values[5] = t1+t7;
366  values[6] = 15.0/2.0*xi+15.0/2.0*t5;
367  values[7] = -t1+t7;
368  values[8] = -3.0;
369  break;
370 
371  case 1: // Hennart, Jaffr'e, Roberts, 1988
372  t1 = 3.0/2.0*eta;
373  t3 = 15.0/4.0*xi*eta;
374 
375  values[0] = t1;
376  values[1] = 3.0/2.0;
377  values[2] = -t1;
378  values[3] = 3.0/2.0;
379  values[4] = t3;
380  values[5] = t1+t3;
381  values[6] = t3;
382  values[7] = -t1+t3;
383  values[8] = -3.0;
384  break;
385  }
386 }
387 
388 // values of derivatives in eta-eta direction
389 static void N_Q_Q2_2D_DeriveXiEta(double xi, double eta, double *values)
390 {
391  double t1, t2, t3, t4, t5, t6;
392 
393  switch(TDatabase::ParamDB->NC_TYPE)
394  {
395  case 2: // G. Matthies, many differences, family 2
396  t1 = 15.0/16.0*xi;
397  t2 = 15.0/16.0*eta;
398  t3 = xi*xi;
399  t4 = 15.0/8.0*t3;
400  t5 = eta*eta;
401  t6 = 15.0/8.0*t5;
402 
403  values[0] = t1;
404  values[1] = -t2;
405  values[2] = -t1;
406  values[3] = t2;
407  values[4] = -1.0/4.0+t2+t4-t6;
408  values[5] = 1.0/4.0+t1+t4-t6;
409  values[6] = -1.0/4.0-t2+t4-t6;
410  values[7] = 1.0/4.0-t1+t4-t6;
411  values[8] = 0.0;
412  break;
413 
414  case 3: // G. Matthies, only one difference, family 3
415  t1 = xi*xi;
416  t2 = 15.0/8.0*t1;
417  t3 = eta*eta;
418  t4 = 15.0/8.0*t3;
419  t5 = -1.0/4.0+t2-t4;
420  t6 = 1.0/4.0+t2-t4;
421 
422  values[0] = 0.0;
423  values[1] = 0.0;
424  values[2] = 0.0;
425  values[3] = 0.0;
426  values[4] = t5;
427  values[5] = t6;
428  values[6] = t5;
429  values[7] = t6;
430  values[8] = 0.0;
431  break;
432 
433  case 4: // Apel, Matthies, anisotrop, family 4
434  t1 = 3.0/2.0*xi;
435  t2 = xi*xi;
436  t3 = 15.0/4.0*t2;
437  t4 = -5.0/4.0+t3;
438 
439  values[0] = t1;
440  values[1] = 0.0;
441  values[2] = -t1;
442  values[3] = 0.0;
443  values[4] = t4;
444  values[5] = -3.0/4.0+t1+t3;
445  values[6] = t4;
446  values[7] = -3.0/4.0-t1+t3;
447  values[8] = 0.0;
448  break;
449 
450  case 1: // Hennart, Jaffr'e, Roberts, 1988
451  t1 = 3.0/2.0*xi;
452  t2 = 3.0/2.0*eta;
453  t3 = xi*xi;
454  t4 = 15.0/8.0*t3;
455  t5 = eta*eta;
456  t6 = 15.0/8.0*t5;
457 
458  values[0] = t1;
459  values[1] = -t2;
460  values[2] = -t1;
461  values[3] = t2;
462  values[4] = -1.0/4.0+t2+t4-t6;
463  values[5] = 1.0/4.0+t1+t4-t6;
464  values[6] = -1.0/4.0-t2+t4-t6;
465  values[7] = 1.0/4.0-t1+t4-t6;
466  values[8] = 0.0;
467  break;
468  }
469 }
470 
471 // values of derivatives in xi-eta direction
472 static void N_Q_Q2_2D_DeriveEtaEta(double xi, double eta, double *values)
473 {
474  double t1, t3;
475  double t5, t6;
476 
477  switch(TDatabase::ParamDB->NC_TYPE)
478  {
479  case 2: // G. Matthies, many differences, family 2
480  t1 = 45.0/16.0*eta;
481  t3 = 15.0/16.0*xi;
482  t6 = 15.0/4.0*xi*eta;
483 
484  values[0] = 3.0/2.0-t1;
485  values[1] = -t3;
486  values[2] = 3.0/2.0+t1;
487  values[3] = t3;
488  values[4] = t3-t6;
489  values[5] = -t1-t6;
490  values[6] = -t3-t6;
491  values[7] = t1-t6;
492  values[8] = -3.0;
493  break;
494 
495  case 3: // G. Matthies, only one difference, family 3
496  t1 = 15.0/2.0*eta;
497  t5 = 15.0/4.0*xi*eta;
498 
499  values[0] = 3.0/2.0-t1;
500  values[1] = 0.0;
501  values[2] = 3.0/2.0+t1;
502  values[3] = 0.0;
503  values[4] = -t5;
504  values[5] = -t1-t5;
505  values[6] = -t5;
506  values[7] = t1-t5;
507  values[8] = -3.0;
508  break;
509 
510  case 4: // Apel, Matthies, anisotrop, family 4
511  values[0] = 3.0/2.0;
512  values[1] = 0.0;
513  values[2] = 3.0/2.0;
514  values[3] = 0.0;
515  values[4] = 0.0;
516  values[5] = 0.0;
517  values[6] = 0.0;
518  values[7] = 0.0;
519  values[8] = -3.0;
520  break;
521 
522  case 1: // Hennart, Jaffr'e, Roberts, 1988
523  t1 = 3.0/2.0*xi;
524  t3 = 15.0/4.0*xi*eta;
525 
526  values[0] = 3.0/2.0;
527  values[1] = -t1;
528  values[2] = 3.0/2.0;
529  values[3] = t1;
530  values[4] = t1-t3;
531  values[5] = -t3;
532  values[6] = -t1-t3;
533  values[7] = -t3;
534  values[8] = -3.0;
535  break;
536  }
537 }
538 
539 static int N_Q_Q2_2D_ChangeJ0[1] = { 4 };
540 static int N_Q_Q2_2D_ChangeJ1[1] = { 5 };
541 static int N_Q_Q2_2D_ChangeJ2[1] = { 6 };
542 static int N_Q_Q2_2D_ChangeJ3[1] = { 7 };
543 
544 static int *N_Q_Q2_2D_Change[4] = { N_Q_Q2_2D_ChangeJ0, N_Q_Q2_2D_ChangeJ1,
545  N_Q_Q2_2D_ChangeJ2, N_Q_Q2_2D_ChangeJ3 };
546 
547 // ***********************************************************************
548 
549 TBaseFunct2D *BF_N_Q_Q2_2D_Obj = new TBaseFunct2D
550  (9, BF_N_Q_Q2_2D, BFUnitSquare,
551  N_Q_Q2_2D_Funct, N_Q_Q2_2D_DeriveXi,
552  N_Q_Q2_2D_DeriveEta, N_Q_Q2_2D_DeriveXiXi,
553  N_Q_Q2_2D_DeriveXiEta, N_Q_Q2_2D_DeriveEtaEta, 3, 2,
554  1, N_Q_Q2_2D_Change);
Definition: BaseFunct2D.h:27
static TParamDB * ParamDB
Definition: Database.h:1134