proteus 1.9.0
C/C++/Fortran libraries
Loading...
Searching...
No Matches
ModelFactory.h
Go to the documentation of this file.
1#ifndef MODELFACTORY_H
2#define MODELFACTORY_H
3#include <iostream>
4
5#define NO_INSTANCE std::cout<<"Constructing model object from template class:"<<std::endl \
6 <<"return static_cast<Model_Base*>(new ModelTemplate<CompKernelTemplate<" \
7 <<nSpaceIn<<"," \
8 <<nDOF_mesh_trial_elementIn<<"," \
9 <<nDOF_trial_elementIn<<"," \
10 <<nDOF_test_elementIn<<">," \
11 <<nSpaceIn<<"," \
12 <<nQuadraturePoints_elementIn<<"," \
13 <<nDOF_mesh_trial_elementIn<<"," \
14 <<nDOF_trial_elementIn<<"," \
15 <<nDOF_test_elementIn<<"," \
16 <<nQuadraturePoints_elementBoundaryIn<<">());" \
17 <<std::endl<<std::flush
18
19namespace proteus
20{
21 template<class Model_Base,
22 template<class CompKernelType,
23 int nSpace,
24 int nQuadraturePoints_element,
25 int nDOF_mesh_trial_element,
26 int nDOF_trial_element,
27 int nDOF_test_element,
28 int nQuadraturePoints_elementBoundary>
29 class ModelTemplate,
30 template<int nSpace,
31 int nDOF_mesh_trial_element,
32 int nDOF_trial_element,
33 int nDOF_test_element>
34 class CompKernelTemplate>
35 Model_Base* chooseAndAllocateDiscretization(int nSpaceIn,
36 int nQuadraturePoints_elementIn,
37 int nDOF_mesh_trial_elementIn,
38 int nDOF_trial_elementIn,
39 int nDOF_test_elementIn,
40 int nQuadraturePoints_elementBoundaryIn,
41 int CompKernelFlag)//0=Parametric
42 {
43 if (CompKernelFlag == 0)
44 {
45 if (nSpaceIn == 3) // 3D
46 {
47 if (nDOF_mesh_trial_elementIn == nDOF_trial_elementIn)//iso-parametric
48 {
49 if (nDOF_mesh_trial_elementIn == 4) // P1 FE-space. Default nquad=5
50 {
51 if (nQuadraturePoints_elementIn == 5)
52 return static_cast<Model_Base*>(new ModelTemplate<CompKernelTemplate<3,4,4,4>,3,5,4,4,4,4>());
53 else if (nQuadraturePoints_elementIn == 4)
54 return static_cast<Model_Base*>(new ModelTemplate<CompKernelTemplate<3,4,4,4>,3,4,4,4,4,3>());
55 else if (nQuadraturePoints_elementIn == 15 && nQuadraturePoints_elementBoundaryIn == 3)
56 return static_cast<Model_Base*>(new ModelTemplate<CompKernelTemplate<3,4,4,4>,3,15,4,4,4,3>());
57 else if (nQuadraturePoints_elementIn == 15 && nQuadraturePoints_elementBoundaryIn == 7)
58 return static_cast<Model_Base*>(new ModelTemplate<CompKernelTemplate<3,4,4,4>,3,15,4,4,4,7>());
59 else if (nQuadraturePoints_elementIn == 24 && nQuadraturePoints_elementBoundaryIn == 12)
60 return static_cast<Model_Base*>(new ModelTemplate<CompKernelTemplate<3,4,4,4>,3,24,4,4,4,12>());
61 else
62 {
64 abort();
65 }
66 }
67 else if (nDOF_mesh_trial_elementIn == 8) // Q1 FE-space. Default nquad=27
68 {
69 if (nQuadraturePoints_elementIn == 8)
70 {
71 if ( nQuadraturePoints_elementBoundaryIn == 4)
72 return static_cast<Model_Base*>(new ModelTemplate<CompKernelTemplate<3,8,8,8>,3,8,8,8,8,4>());
73 /* else if ( nQuadraturePoints_elementBoundaryIn == 9) */
74 /* return static_cast<Model_Base*>(new ModelTemplate<CompKernelTemplate<3,8,8,8>,3,8,8,8,8,9>()); */
75 else
76 {
78 abort();
79 }
80 }
81 /* else if (nQuadraturePoints_elementIn == 27) */
82 /* { */
83 /* if ( nQuadraturePoints_elementBoundaryIn == 4) */
84 /* return static_cast<Model_Base*>(new ModelTemplate<CompKernelTemplate<3,8,8,8>,3,27,8,8,8,4>()); */
85 /* /\* else if ( nQuadraturePoints_elementBoundaryIn == 9) *\/ */
86 /* /\* return static_cast<Model_Base*>(new ModelTemplate<CompKernelTemplate<3,8,8,8>,3,27,8,8,8,9>()); *\/ */
87 /* else */
88 /* { */
89 /* NO_INSTANCE; */
90 /* abort(); */
91 /* } */
92 /* } */
93 else
94 {
96 abort();
97 }
98 }
99 /* else if (nDOF_mesh_trial_elementIn == 10) // P2 FE space. Default nquad=15 */
100 /* { */
101 /* if (nQuadraturePoints_elementIn == 15) */
102 /* return static_cast<Model_Base*>(new ModelTemplate<CompKernelTemplate<3,10,10,10>,3,15,10,10,10,7>()); */
103 /* else */
104 /* { */
105 /* NO_INSTANCE; */
106 /* abort(); */
107 /* } */
108 /* } */
109 /* else if (nDOF_mesh_trial_elementIn == 27) // Q2 FE space. Default nquad=27 */
110 /* { */
111 /* if (nQuadraturePoints_elementIn == 8) */
112 /* { */
113 /* if ( nQuadraturePoints_elementBoundaryIn == 4) */
114 /* return static_cast<Model_Base*>(new ModelTemplate<CompKernelTemplate<3,27,27,27>,3,8,27,27,27,4>()); */
115 /* /\* else if ( nQuadraturePoints_elementBoundaryIn == 9) *\/ */
116 /* /\* return static_cast<Model_Base*>(new ModelTemplate<CompKernelTemplate<3,27,27,27>,3,8,27,27,27,9>()); *\/ */
117 /* else */
118 /* { */
119 /* NO_INSTANCE; */
120 /* abort(); */
121 /* } */
122 /* } */
123 /* else if (nQuadraturePoints_elementIn == 27) */
124 /* { */
125 /* if ( nQuadraturePoints_elementBoundaryIn == 4) */
126 /* return static_cast<Model_Base*>(new ModelTemplate<CompKernelTemplate<3,27,27,27>,3,27,27,27,27,4>()); */
127 /* /\* else if ( nQuadraturePoints_elementBoundaryIn == 9) *\/ */
128 /* /\* return static_cast<Model_Base*>(new ModelTemplate<CompKernelTemplate<3,27,27,27>,3,27,27,27,27,9>()); *\/ */
129 /* else */
130 /* { */
131 /* NO_INSTANCE; */
132 /* abort(); */
133 /* } */
134 /* } */
135 else
136 {
138 abort();
139 }
140 }
141 else if (nDOF_mesh_trial_elementIn == 4)//sub-parametric tets
142 {
143 if (nDOF_trial_elementIn == 10)
144 {
145 if (nQuadraturePoints_elementIn == 4 && nQuadraturePoints_elementBoundaryIn == 3)
146 {
147 return static_cast<Model_Base*>(new ModelTemplate<CompKernelTemplate<3,4,10,10>,3,4,4,10,10,3>());
148 }
149 /* else if (nQuadraturePoints_elementIn == 5 && nQuadraturePoints_elementBoundaryIn == 4) */
150 /* { */
151 /* return static_cast<Model_Base*>(new ModelTemplate<CompKernelTemplate<3,4,10,10>,3,5,4,10,10,4>()); */
152 /* } */
153 /* else if (nQuadraturePoints_elementIn == 14 && nQuadraturePoints_elementBoundaryIn == 6) */
154 /* { */
155 /* return static_cast<Model_Base*>(new ModelTemplate<CompKernelTemplate<3,4,10,10>,3,14,4,10,10,6>()); */
156 /* } */
157 else if (nQuadraturePoints_elementIn == 15 && nQuadraturePoints_elementBoundaryIn == 7)
158 {
159 return static_cast<Model_Base*>(new ModelTemplate<CompKernelTemplate<3,4,10,10>,3,15,4,10,10,7>());
160 }
161 else if (nQuadraturePoints_elementIn == 24 && nQuadraturePoints_elementBoundaryIn == 12)
162 {
163 return static_cast<Model_Base*>(new ModelTemplate<CompKernelTemplate<3,4,10,10>,3,24,4,10,10,12>());
164 }
165 /* else if (nQuadraturePoints_elementIn == 31 && nQuadraturePoints_elementBoundaryIn == 12) */
166 /* { */
167 /* return static_cast<Model_Base*>(new ModelTemplate<CompKernelTemplate<3,4,10,10>,3,31,4,10,10,12>()); */
168 /* } */
169 else
170 {
172 abort();
173 }
174 }
175 else
176 {
178 abort();
179 }
180 }
181 else if (nDOF_mesh_trial_elementIn == 8)//sub-parametric hexes
182 {
183 if (nDOF_trial_elementIn == 27)
184 {
185 if (nQuadraturePoints_elementIn == 125)
186 return static_cast<Model_Base*>(new ModelTemplate<CompKernelTemplate<3,8,27,27>,3,125,8,27,27,25>());
187 }
188 else
189 {
191 abort();
192 }
193 }
194 else
195 {
197 abort();
198 }
199 }
200 else
201 {
203 abort();
204 }
205 }
206 else
207 {
209 abort();
210 }
211 return NULL;
212 }
213 template<class Model_Base,
214 template<class CompKernelType,
215 int nSpace,
216 int nQuadraturePoints_element,
217 int nDOF_mesh_trial_element,
218 int nDOF_trial_element,
219 int nDOF_test_element,
220 int nQuadraturePoints_elementBoundary>
221 class ModelTemplate,
222 template<int nSpace,
223 int nDOF_mesh_trial_element,
224 int nDOF_trial_element,
225 int nDOF_test_element>
226 class CompKernelTemplate>
227 Model_Base* chooseAndAllocateDiscretization2D(int nSpaceIn,
228 int nQuadraturePoints_elementIn,
229 int nDOF_mesh_trial_elementIn,
230 int nDOF_trial_elementIn,
231 int nDOF_test_elementIn,
232 int nQuadraturePoints_elementBoundaryIn,
233 int CompKernelFlag)//0=Parametric
234 {
235 if (CompKernelFlag == 0)
236 {
237 if (nSpaceIn == 2) // 2D
238 {
239 if (nDOF_mesh_trial_elementIn == nDOF_trial_elementIn)//iso-parametric
240 {
241 if (nDOF_mesh_trial_elementIn == 3) // P1 FE-space. Default nquad=4
242 {
243 if (nQuadraturePoints_elementIn == 1)
244 {
245 if (nQuadraturePoints_elementBoundaryIn == 1)
246 return static_cast<Model_Base*>(new ModelTemplate<CompKernelTemplate<2,3,3,3>,2,1,3,3,3,1>());
247 else
248 {
250 abort();
251 }
252 }
253 else if (nQuadraturePoints_elementIn == 3)
254 {
255 if (nQuadraturePoints_elementBoundaryIn == 2)
256 return static_cast<Model_Base*>(new ModelTemplate<CompKernelTemplate<2,3,3,3>,2,3,3,3,3,2>());
257 else
258 {
260 abort();
261 }
262 }
263 else if (nQuadraturePoints_elementIn == 4)
264 {
265 if (nQuadraturePoints_elementBoundaryIn == 3)
266 return static_cast<Model_Base*>(new ModelTemplate<CompKernelTemplate<2,3,3,3>,2,4,3,3,3,3>());
267 else
268 {
270 abort();
271 }
272 }
273 else if (nQuadraturePoints_elementIn == 6)
274 {
275 if (nQuadraturePoints_elementBoundaryIn == 4)
276 return static_cast<Model_Base*>(new ModelTemplate<CompKernelTemplate<2,3,3,3>,2,6,3,3,3,4>());
277 else
278 {
280 abort();
281 }
282 }
283 else if (nQuadraturePoints_elementIn == 7)
284 {
285 if (nQuadraturePoints_elementBoundaryIn == 5)
286 return static_cast<Model_Base*>(new ModelTemplate<CompKernelTemplate<2,3,3,3>,2,7,3,3,3,5>());
287 else
288 {
290 abort();
291 }
292 }
293 else if (nQuadraturePoints_elementIn == 12)
294 {
295 if (nQuadraturePoints_elementBoundaryIn == 6)
296 return static_cast<Model_Base*>(new ModelTemplate<CompKernelTemplate<2,3,3,3>,2,12,3,3,3,6>());
297 else
298 {
300 abort();
301 }
302 }
303 /* else if (nQuadraturePoints_elementIn == 112)//hk=0.25 */
304 /* { */
305 /* if (nQuadraturePoints_elementBoundaryIn == 5) */
306 /* { */
307 /* return static_cast<Model_Base*>(new ModelTemplate<CompKernelTemplate<2,3,3,3>,2,112,3,3,3,5>()); */
308 /* } */
309 /* else */
310 /* { */
311 /* NO_INSTANCE; */
312 /* abort(); */
313 /* } */
314 /* } */
315 /* else if (nQuadraturePoints_elementIn == 16)//hk=0.5 */
316 /* { */
317 /* if (nQuadraturePoints_elementBoundaryIn == 3) */
318 /* { */
319 /* return static_cast<Model_Base*>(new ModelTemplate<CompKernelTemplate<2,3,3,3>,2,16,3,3,3,3>()); */
320 /* } */
321 /* else */
322 /* { */
323 /* NO_INSTANCE; */
324 /* abort(); */
325 /* } */
326 /* } */
327 /* else if (nQuadraturePoints_elementIn == 36)//hk=0.3 */
328 /* { */
329 /* if (nQuadraturePoints_elementBoundaryIn == 3) */
330 /* { */
331 /* return static_cast<Model_Base*>(new ModelTemplate<CompKernelTemplate<2,3,3,3>,2,36,3,3,3,3>()); */
332 /* } */
333 /* else */
334 /* { */
335 /* NO_INSTANCE; */
336 /* abort(); */
337 /* } */
338 /* } */
339 /* else if (nQuadraturePoints_elementIn == 100)//hk=0.2 */
340 /* { */
341 /* if (nQuadraturePoints_elementBoundaryIn == 3) */
342 /* { */
343 /* return static_cast<Model_Base*>(new ModelTemplate<CompKernelTemplate<2,3,3,3>,2,100,3,3,3,3>()); */
344 /* } */
345 /* else */
346 /* { */
347 /* NO_INSTANCE; */
348 /* abort(); */
349 /* } */
350 /* } */
351 else
352 {
354 abort();
355 }
356 }
357 else if(nDOF_mesh_trial_elementIn == 4)
358 {
359 if (nQuadraturePoints_elementIn == 4) // Q1 FE-space
360 {
361 if (nQuadraturePoints_elementBoundaryIn == 2)
362 return static_cast<Model_Base*>(new ModelTemplate<CompKernelTemplate<2,4,4,4>,2,4,4,4,4,2>());
363 else
364 {
366 abort();
367 }
368 }
369 else
370 {
372 abort();
373 }
374 }
375 else
376 {
378 abort();
379 }
380 }
381 else if (nDOF_mesh_trial_elementIn == 3)
382 {
383 if (nDOF_trial_elementIn == 6) // P2 FE-space. Default nquad=7
384 {
385 if (nQuadraturePoints_elementIn == 1)
386 {
387 if (nQuadraturePoints_elementBoundaryIn == 1)
388 return static_cast<Model_Base*>(new ModelTemplate<CompKernelTemplate<2,3,6,6>,2,1,3,6,6,1>());
389 else
390 {
392 abort();
393 }
394 }
395 else if (nQuadraturePoints_elementIn == 3)
396 {
397 if (nQuadraturePoints_elementBoundaryIn == 2)
398 return static_cast<Model_Base*>(new ModelTemplate<CompKernelTemplate<2,3,6,6>,2,3,3,6,6,2>());
399 else
400 {
402 abort();
403 }
404 }
405 else if (nQuadraturePoints_elementIn == 4)
406 {
407 if (nQuadraturePoints_elementBoundaryIn == 3)
408 return static_cast<Model_Base*>(new ModelTemplate<CompKernelTemplate<2,3,6,6>,2,4,3,6,6,3>());
409 else
410 {
412 abort();
413 }
414 }
415 else if (nQuadraturePoints_elementIn == 6)
416 {
417 if (nQuadraturePoints_elementBoundaryIn == 4)
418 return static_cast<Model_Base*>(new ModelTemplate<CompKernelTemplate<2,3,6,6>,2,6,3,6,6,4>());
419 else
420 {
422 abort();
423 }
424 }
425 else if (nQuadraturePoints_elementIn == 7)
426 {
427 if (nQuadraturePoints_elementBoundaryIn == 5)
428 {
429 return static_cast<Model_Base*>(new ModelTemplate<CompKernelTemplate<2,3,6,6>,2,7,3,6,6,5>());
430 }
431 else
432 {
434 abort();
435 }
436 }
437 else if (nQuadraturePoints_elementIn == 12)
438 {
439 if (nQuadraturePoints_elementBoundaryIn == 6)
440 {
441 return static_cast<Model_Base*>(new ModelTemplate<CompKernelTemplate<2,3,6,6>,2,12,3,6,6,6>());
442 }
443 else
444 {
446 abort();
447 }
448 }
449 /* else if (nQuadraturePoints_elementIn == 112) */
450 /* { */
451 /* if (nQuadraturePoints_elementBoundaryIn == 5) */
452 /* { */
453 /* return static_cast<Model_Base*>(new ModelTemplate<CompKernelTemplate<2,3,6,6>,2,112,3,6,6,5>()); */
454 /* } */
455 /* else */
456 /* { */
457 /* NO_INSTANCE; */
458 /* abort(); */
459 /* } */
460 /* } */
461 else
462 {
464 abort();
465 }
466
467 }
468 else
469 {
471 abort();
472 }
473 }
474 else
475 {
477 abort();
478 }
479 }
480 }
481 else
482 {
484 abort();
485 }
486 return NULL;
487 }
488 template<class Model_Base,
489 template<class CompKernelType,
490 int nSpace,
491 int nQuadraturePoints_element,
492 int nDOF_mesh_trial_element,
493 int nDOF_trial_element,
494 int nDOF_test_element,
495 int nQuadraturePoints_elementBoundary>
496 class ModelTemplate,
497 template<int nSpace,
498 int nDOF_mesh_trial_element,
499 int nDOF_trial_element,
500 int nDOF_test_element>
501 class CompKernelTemplate>
502 Model_Base* chooseAndAllocateDiscretization1D(int nSpaceIn,
503 int nQuadraturePoints_elementIn,
504 int nDOF_mesh_trial_elementIn,
505 int nDOF_trial_elementIn,
506 int nDOF_test_elementIn,
507 int nQuadraturePoints_elementBoundaryIn,
508 int CompKernelFlag)//0=Parametric
509 {
510 if (CompKernelFlag == 0)
511 {
512 if (nSpaceIn == 1) // 1D
513 {
514 if (nDOF_mesh_trial_elementIn == nDOF_trial_elementIn)//iso-parametric
515 {
516 if (nDOF_mesh_trial_elementIn == 2) // P1 FE-space. Default nquad=4
517 {
518 if (nQuadraturePoints_elementIn == 2)
519 {
520 if (nQuadraturePoints_elementBoundaryIn == 1)
521 return static_cast<Model_Base*>(new ModelTemplate<CompKernelTemplate<1,2,2,2>,1,2,2,2,2,1>());
522 else
523 {
525 abort();
526 }
527 }
528 else if (nQuadraturePoints_elementIn == 3)
529 {
530 if (nQuadraturePoints_elementBoundaryIn == 1)
531 return static_cast<Model_Base*>(new ModelTemplate<CompKernelTemplate<1,2,2,2>,1,3,2,2,2,1>());
532 else
533 {
535 abort();
536 }
537 }
538 else if (nQuadraturePoints_elementIn == 4)
539 {
540 if (nQuadraturePoints_elementBoundaryIn == 1)
541 return static_cast<Model_Base*>(new ModelTemplate<CompKernelTemplate<1,2,2,2>,1,4,2,2,2,1>());
542 else
543 {
545 abort();
546 }
547 }
548 else if (nQuadraturePoints_elementIn == 5)
549 {
550 if (nQuadraturePoints_elementBoundaryIn == 1)
551 return static_cast<Model_Base*>(new ModelTemplate<CompKernelTemplate<1,2,2,2>,1,5,2,2,2,1>());
552 else
553 {
555 abort();
556 }
557 }
558 else if (nQuadraturePoints_elementIn == 7)
559 {
560 if (nQuadraturePoints_elementBoundaryIn == 1)
561 return static_cast<Model_Base*>(new ModelTemplate<CompKernelTemplate<1,2,2,2>,1,7,2,2,2,1>());
562 else
563 {
565 abort();
566 }
567 }
568 else
569 {
571 abort();
572 }
573 }
574 else
575 {
577 abort();
578 }
579 }
580 else
581 {
583 abort();
584 }
585 }
586 else
587 {
589 abort();
590 }
591 }
592 else
593 {
595 abort();
596 }
597 return NULL;
598 }
599}
600#endif
#define NO_INSTANCE
Definition ADR.h:19
Model_Base * chooseAndAllocateDiscretization(int nSpaceIn, int nQuadraturePoints_elementIn, int nDOF_mesh_trial_elementIn, int nDOF_trial_elementIn, int nDOF_test_elementIn, int nDOF_v_trial_elementIn, int nDOF_v_test_elementIn, int nQuadraturePoints_elementBoundaryIn, int CompKernelFlag)
Model_Base * chooseAndAllocateDiscretization1D(int nSpaceIn, int nQuadraturePoints_elementIn, int nDOF_mesh_trial_elementIn, int nDOF_trial_elementIn, int nDOF_test_elementIn, int nQuadraturePoints_elementBoundaryIn, int CompKernelFlag)
Model_Base * chooseAndAllocateDiscretization2D(int nSpaceIn, int nQuadraturePoints_elementIn, int nDOF_mesh_trial_elementIn, int nDOF_trial_elementIn, int nDOF_test_elementIn, int nDOF_v_trial_elementIn, int nDOF_v_test_elementIn, int nQuadraturePoints_elementBoundaryIn, int CompKernelFlag)