KratosMultiphysics
KRATOS Multiphysics (Kratos) is a framework for building parallel, multi-disciplinary simulation software, aiming at modularity, extensibility, and high performance. Kratos is written in C++, and counts with an extensive Python interface.
split_prism.hpp
Go to the documentation of this file.
1 // | / |
2 // ' / __| _` | __| _ \ __|
3 // . \ | ( | | ( |\__ `
4 // _|\_\_| \__,_|\__|\___/ ____/
5 // Multi-Physics
6 //
7 // License: BSD License
8 // Kratos default license: kratos/license.txt
9 //
10 // Main authors: Pooyan Dadvand
11 // Riccardo Rossi
12 //
13 //
14 
15 #if !defined(KRATOS_SPLIT_PRISM)
16 #define KRATOS_SPLIT_PRISM
17 
50 /***********************************************************************************/
51 /***********************************************************************************/
52 
72  const int aux_ids[12],
73  int edge_ids[6]
74 )
75 {
76  /* Edge 01*/
77  if (aux_ids[6] < 0)
78  {
79  if (aux_ids[0] > aux_ids[1])
80  {
81  edge_ids[0] = 0;
82  edge_ids[3] = 3;
83  }
84  else
85  {
86  edge_ids[0] = 1;
87  edge_ids[3] = 4;
88  }
89  }
90  else
91  {
92  edge_ids[0] = 6;
93  edge_ids[3] = 9;
94  }
95 
96  /* Edge 12*/
97  if (aux_ids[7] < 0)
98  if (aux_ids[1] > aux_ids[2])
99  {
100  edge_ids[1] = 1;
101  edge_ids[4] = 4;
102  }
103  else
104  {
105  edge_ids[1] = 2;
106  edge_ids[4] = 5;
107  }
108  else
109  {
110  edge_ids[1] = 7;
111  edge_ids[4] = 10;
112  }
113 
114  /* Edge 20*/
115  if (aux_ids[8] < 0)
116  {
117  if (aux_ids[2] > aux_ids[0])
118  {
119  edge_ids[2] = 2;
120  edge_ids[5] = 5;
121  }
122  else
123  {
124  edge_ids[2] = 0;
125  edge_ids[5] = 3;
126  }
127  }
128  else
129  {
130  edge_ids[2] = 8;
131  edge_ids[5] = 11;
132  }
133 }
134 
135 /***********************************************************************************/
136 /***********************************************************************************/
137 
152  const int prism_index,
153  const int t[24],
154  const int aux_ids[12],
155  int* id0,
156  int* id1,
157  int* id2,
158  int* id3,
159  int* id4,
160  int* id5
161 )
162 {
163  unsigned int base = prism_index * 6;
164  *id0 = aux_ids[t[base]];
165  *id1 = aux_ids[t[base + 1]];
166  *id2 = aux_ids[t[base + 2]];
167  *id3 = aux_ids[t[base + 3]];
168  *id4 = aux_ids[t[base + 4]];
169  *id5 = aux_ids[t[base + 5]];
170 }
171 
183  const int edges[6],
184  int t[24],
185  int* number_elem,
186  int* splitted_edges,
187  int* nint
188 )
189 {
190  *splitted_edges = 0;
191  int topology[6];
192  topology[0] = 0;
193  topology[1] = 0;
194  topology[2] = 0;
195  topology[3] = 0;
196  topology[4] = 0;
197  topology[5] = 0;
198 
199  for (unsigned int i = 0; i < 6; i++)
200  {
201  if (edges[i] > 2)
202  {
203  topology[i] = 1;
204  *splitted_edges = *splitted_edges + 1;
205  }
206  }
207 
208  if (*splitted_edges == 0 && *nint == 0)
209  {
210  /* No splitting needed */
211  *number_elem = 1;
212  // Lower face
213  t[0] = 0;
214  t[1] = 1;
215  t[2] = 2;
216 
217  // Upper face
218  t[3] = 3;
219  t[4] = 4;
220  t[5] = 5;
221 
222  return 0;
223  }
224  /*WARNING = case new central node needed*/
225  else if (*splitted_edges == 0 && *nint == 1)
226  {
227  *number_elem = 3;
228  // Lower face
229  t[0] = 6;
230  t[1] = 0;
231  t[2] = 1;
232 
233  t[6] = 6;
234  t[7] = 1;
235  t[8] = 2;
236 
237  t[8] = 6;
238  t[8] = 2;
239  t[8] = 0;
240 
241  // Upper face
242  t[3] = 9;
243  t[4] = 3;
244  t[5] = 4;
245 
246  t[9] = 9;
247  t[10] = 4;
248  t[11] = 5;
249 
250  t[11] = 9;
251  t[11] = 5;
252  t[11] = 3;
253 
254  return 1;
255  }
256  else if (*splitted_edges == 2)
257  {
258  *number_elem = 2;
259  /* Case 1*/
260  if (topology[0] == 1)
261  {
262  // Lower face
263  t[0] = 6;
264  t[1] = 2;
265  t[2] = 0;
266 
267  t[6] = 6;
268  t[7] = 1;
269  t[8] = 2;
270 
271  // Upper face
272  t[3] = 9;
273  t[4] = 5;
274  t[5] = 3;
275 
276  t[9] = 9;
277  t[10] = 4;
278  t[11] = 5;
279  }
280  /* Case 2*/
281  else if (topology[1] == 1)
282  {
283  // Lower face
284  t[0] = 7;
285  t[1] = 0;
286  t[2] = 1;
287 
288  t[6] = 7;
289  t[7] = 2;
290  t[8] = 0;
291 
292  // Upper face
293  t[3] = 10;
294  t[4] = 3;
295  t[5] = 4;
296 
297  t[9] = 10;
298  t[10] = 5;
299  t[11] = 3;
300  }
301  /* Case 3*/
302  else if (topology[2] == 1)
303  {
304  // Lower face
305  t[0] = 8;
306  t[1] = 1;
307  t[2] = 2;
308 
309  t[6] = 8;
310  t[7] = 0;
311  t[8] = 1;
312 
313  // Upper face
314  t[3] = 11;
315  t[4] = 4;
316  t[5] = 5;
317 
318  t[9] = 11;
319  t[10] = 3;
320  t[11] = 4;
321  }
322 
323  return 1;
324  }
325  else if (*splitted_edges == 4)
326  {
327  *number_elem = 3;
328  /* Case 4*/
329  if (topology[0] == 1 && topology[1] == 1)
330  {
331  if (edges[2] == 0) // If I colapse to the node 0 local
332  {
333  // Lower face
334  t[0] = 7;
335  t[1] = 6;
336  t[2] = 1;
337 
338  t[6] = 7;
339  t[7] = 0;
340  t[8] = 6;
341 
342  t[12] = 7;
343  t[13] = 2;
344  t[14] = 0;
345 
346  // Upper face
347  t[3] = 10;
348  t[4] = 9;
349  t[5] = 4;
350 
351  t[9] = 10;
352  t[10] = 3;
353  t[11] = 9;
354 
355  t[15] = 10;
356  t[16] = 5;
357  t[17] = 3;
358 
359  }
360  else if (edges[2] == 2) // If I colapse to the node 2 local
361  {
362  // Lower face
363  t[0] = 7;
364  t[1] = 6;
365  t[2] = 1;
366 
367  t[6] = 7;
368  t[7] = 2;
369  t[8] = 6;
370 
371  t[12] = 6;
372  t[13] = 2;
373  t[14] = 0;
374 
375  // Upper face
376  t[3] = 10;
377  t[4] = 9;
378  t[5] = 4;
379 
380  t[9] = 10;
381  t[10] = 5;
382  t[11] = 9;
383 
384  t[15] = 9;
385  t[16] = 5;
386  t[17] = 3;
387  }
388  }
389  /* Case 5*/
390  else if (topology[1] == 1 && topology[2] == 1)
391  {
392  if (edges[0] == 0) // If I colapse to the node 0 local
393  {
394  // Lower face
395  t[0] = 5;
396  t[1] = 4;
397  t[2] = 2;
398 
399  t[6] = 5;
400  t[7] = 0;
401  t[8] = 4;
402 
403  t[12] = 4;
404  t[13] = 0;
405  t[14] = 1;
406  }
407  else if (edges[0] == 1)
408  {
409  // Lower face
410  t[0] = 5;
411  t[1] = 4;
412  t[2] = 2;
413 
414  t[6] = 5;
415  t[7] = 1;
416  t[8] = 4;
417 
418  t[12] = 5;
419  t[13] = 0;
420  t[14] = 1;
421  }
422  }
423  /* Case 6 */
424  else if (topology[0] == 1 && topology[2] == 1)
425  {
426  if (edges[1] == 1)
427  {
428  // Lower face
429  t[0] = 8;
430  t[1] = 0;
431  t[2] = 6;
432 
433  t[6] = 8;
434  t[7] = 6;
435  t[8] = 1;
436 
437  t[12] = 8;
438  t[13] = 1;
439  t[14] = 2;
440 
441  // Upper face
442  t[3] = 11;
443  t[4] = 3;
444  t[5] = 9;
445 
446  t[9] = 11;
447  t[10] = 9;
448  t[11] = 4;
449 
450  t[15] = 11;
451  t[14] = 4;
452  t[15] = 5;
453  }
454  else if (edges[1] == 2)
455  {
456  // Lower face
457  t[0] = 8;
458  t[1] = 0;
459  t[2] = 6;
460 
461  t[6] = 8;
462  t[7] = 6;
463  t[8] = 2;
464 
465  t[12] = 6;
466  t[13] = 1;
467  t[14] = 2;
468 
469  // Upper face
470  t[3] = 11;
471  t[4] = 3;
472  t[5] = 9;
473 
474  t[9] = 11;
475  t[10] = 9;
476  t[11] = 5;
477 
478  t[15] = 9;
479  t[16] = 4;
480  t[17] = 5;
481  }
482  }
483  return 1;
484  }
485  else if (*splitted_edges == 6)
486  {
487  *number_elem = 4;
488  // Lower face
489  t[0] = 8;
490  t[1] = 0;
491  t[2] = 6;
492 
493  t[6] = 8;
494  t[7] = 6;
495  t[8] = 7;
496 
497  t[12] = 7;
498  t[13] = 6;
499  t[14] = 1;
500 
501  t[18] = 8;
502  t[19] = 7;
503  t[20] = 2;
504 
505  // Upper face
506  t[3] = 11;
507  t[4] = 3;
508  t[5] = 9;
509 
510  t[9] = 11;
511  t[10] = 9;
512  t[11] = 10;
513 
514  t[15] = 10;
515  t[16] = 9;
516  t[17] = 4;
517 
518  t[21] = 11;
519  t[22] = 10;
520  t[23] = 5;
521 
522  return 1;
523  }
524  else
525  {
526  return 0;
527  }
528 
529 }
530 
531 #endif /* KRATOS_SPLIT_PRISM defined */
532 
int t
Definition: ode_solve.py:392
integer i
Definition: TensorModule.f:17
void PrismGetNewConnectivityGID(const int prism_index, const int t[24], const int aux_ids[12], int *id0, int *id1, int *id2, int *id3, int *id4, int *id5)
Definition: split_prism.hpp:151
void PrismSplitMode(const int aux_ids[12], int edge_ids[6])
Definition: split_prism.hpp:71
int Split_Prism(const int edges[6], int t[24], int *number_elem, int *splitted_edges, int *nint)
Definition: split_prism.hpp:182