00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #ifndef SUBDIVII_H_
00024 #define SUBDIVII_H_
00025
00026 void Act_on_subdivision_partII(Bo_description* Description,
00027 Calculator_FE* Act,
00028 bool* corners, bool& stop) {
00029 int i;
00030
00031 Edge_Corner_point poi_0, poi_1, poi_2, poi_3, poi_4;
00032 Edge_Corner_point poi_5, poi_6, poi_7, poi_8;
00033 Edge_Corner_point poi_9, poi_10, poi_11, poi_12, poi_13;
00034 Edge_Corner_point poi_A, poi_B, poi_C, poi_D;
00035 Edge_Corner_point poi_A2, poi_B2, poi_C2, poi_D2;
00036 Edge_Corner_point poi_boA, poi_boB, poi_boC, poi_boD;
00037
00038 dir_3D dirA, dirB, dirC;
00039 dir_3D sur, suropp;
00040 bool later_stop, LA, LB, LC, LD;
00041
00042 int num_max;
00043 double h_6, h_7, h_8, h_9, h_10, H, h_max;
00044 f_type x_face_type;
00045 f_type y_face_type;
00046
00047 f_type A_face_type, B_face_type, C_face_type;
00048
00049
00050 later_stop = false;
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064 for(i=0;i<6 && !stop;++i) {
00065 if(Description->Edge(Edge_surface((dir_3D)i,Edir2D)) &
00066 Description->Edge(Edge_surface((dir_3D)i,Wdir2D)) &
00067 Description->Edge(Edge_surface((dir_3D)i,Ndir2D)) &
00068 Description->Edge(Edge_surface((dir_3D)i,Sdir2D))) {
00069
00070 stop=true;
00071
00072 poi_A.edge_point = corner_poi_typ;
00073 poi_B.edge_point = corner_poi_typ;
00074 poi_C.edge_point = corner_poi_typ;
00075 poi_D.edge_point = corner_poi_typ;
00076
00077 poi_A2.edge_point = corner_poi_typ;
00078 poi_B2.edge_point = corner_poi_typ;
00079 poi_C2.edge_point = corner_poi_typ;
00080 poi_D2.edge_point = corner_poi_typ;
00081
00082 poi_boA.edge_point = edge_poi_typ;
00083 poi_boB.edge_point = edge_poi_typ;
00084 poi_boC.edge_point = edge_poi_typ;
00085 poi_boD.edge_point = edge_poi_typ;
00086
00087 sur = (dir_3D)i;
00088 suropp = opposite3D((dir_3D)i);
00089 if(i==Wdir || i==Ndir || i==Ddir) {
00090 poi_A.corner = corner_sur(sur,SWdir);
00091 poi_B.corner = corner_sur(sur,SEdir);
00092 poi_C.corner = corner_sur(sur,NWdir);
00093 poi_D.corner = corner_sur(sur,NEdir);
00094
00095 poi_A2.corner = corner_sur(suropp,SWdir);
00096 poi_B2.corner = corner_sur(suropp,SEdir);
00097 poi_C2.corner = corner_sur(suropp,NWdir);
00098 poi_D2.corner = corner_sur(suropp,NEdir);
00099
00100 poi_boA.corner = poi_A.corner; poi_boA.d = opposite3D((dir_3D)i);
00101 LA = Description->edge_point(poi_boA);
00102 poi_boB.corner = poi_B.corner; poi_boB.d = opposite3D((dir_3D)i);
00103 LB = Description->edge_point(poi_boB);
00104 poi_boC.corner = poi_C.corner; poi_boC.d = opposite3D((dir_3D)i);
00105 LC = Description->edge_point(poi_boC);
00106 poi_boD.corner = poi_D.corner; poi_boD.d = opposite3D((dir_3D)i);
00107 LD = Description->edge_point(poi_boD);
00108 }
00109 else {
00110 poi_A.corner = corner_sur(sur,SWdir);
00111 poi_B.corner = corner_sur(sur,NWdir);
00112 poi_C.corner = corner_sur(sur,SEdir);
00113 poi_D.corner = corner_sur(sur,NEdir);
00114
00115 poi_A2.corner = corner_sur(suropp,SWdir);
00116 poi_B2.corner = corner_sur(suropp,NWdir);
00117 poi_C2.corner = corner_sur(suropp,SEdir);
00118 poi_D2.corner = corner_sur(suropp,NEdir);
00119
00120 poi_boA.corner = poi_A.corner; poi_boA.d = opposite3D((dir_3D)i);
00121 LA = Description->edge_point(poi_boA);
00122 poi_boB.corner = poi_B.corner; poi_boB.d = opposite3D((dir_3D)i);
00123 LB = Description->edge_point(poi_boB);
00124 poi_boC.corner = poi_C.corner; poi_boC.d = opposite3D((dir_3D)i);
00125 LC = Description->edge_point(poi_boC);
00126 poi_boD.corner = poi_D.corner; poi_boD.d = opposite3D((dir_3D)i);
00127 LD = Description->edge_point(poi_boD);
00128 }
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138 if(LA && LB && LC && LD) {
00139 stop=false;
00140 later_stop = true;
00141
00142
00143
00144 poi_3 = poi_boC; poi_2 = poi_boD;
00145 poi_0 = poi_boA; poi_1 = poi_boB;
00146
00147 poi_7 = poi_C; poi_6 = poi_D;
00148 poi_4 = poi_A; poi_5 = poi_B;
00149
00150 dirA = direction_from_to(poi_A.corner,poi_B.corner);
00151 dirB = direction_from_to(poi_A.corner,poi_C.corner);
00152 dirC = poi_0.d;
00153
00154 dirC = opposite3D(dirC);
00155 A_face_type = Calc_f_type(dirA,dirC);
00156 B_face_type = Calc_f_type(dirB,dirC);
00157 C_face_type = Calc_f_type(dirA,dirB);
00158 if(C_face_type == an) {
00159 Act_on_Prism(Description,Act,A_face_type,B_face_type,
00160 poi_0,poi_1,poi_3,poi_4,poi_5,poi_7);
00161 Act_on_Prism(Description,Act,opposite(A_face_type),
00162 opposite(B_face_type),
00163 poi_2,poi_3,poi_1,poi_6,poi_7,poi_5);
00164 }
00165 else {
00166 Act_on_Prism(Description,Act,A_face_type,B_face_type,
00167 poi_1,poi_2,poi_0,poi_5,poi_6,poi_4);
00168 Act_on_Prism(Description,Act,A_face_type,B_face_type,
00169 poi_3,poi_0,poi_2,poi_7,poi_4,poi_6);
00170 }
00171
00172 }
00173
00174
00175 else if((LA && LB && LC && !LD) || (LA && !LB && LC && LD) ||
00176 (LA && LB && !LC && LD) || (!LA && LB && LC && LD)) {
00177 poi_1.edge_point = poi_2.edge_point = corner_poi_typ;
00178 poi_3.edge_point = poi_4.edge_point = corner_poi_typ;
00179 poi_5.edge_point = corner_poi_typ;
00180 poi_6.edge_point = edge_poi_typ;
00181 poi_7.edge_point = poi_8.edge_point = edge_poi_typ;
00182 poi_9.edge_point = poi_10.edge_point = edge_poi_typ;
00183 if(LA && LB && LC && !LD) {
00184
00185
00186 poi_2 = poi_B; poi_3 = poi_A;
00187 poi_1 = poi_D; poi_4 = poi_C;
00188
00189 poi_8 = poi_boB; poi_9 = poi_boA;
00190 poi_5 = poi_D2; poi_10 = poi_boC;
00191
00192 poi_7.corner = poi_5.corner;
00193 poi_7.d = direction_from_to(poi_5.corner,poi_C2.corner);
00194 poi_6.corner = poi_5.corner;
00195 poi_6.d = direction_from_to(poi_5.corner,poi_B2.corner);
00196 }
00197 if(LA && !LB && LC && LD) {
00198
00199
00200 poi_2 = poi_A; poi_3 = poi_C;
00201 poi_1 = poi_B; poi_4 = poi_D;
00202
00203 poi_8 = poi_boA; poi_9 = poi_boC;
00204 poi_5 = poi_B2; poi_10 = poi_boD;
00205
00206 poi_7.corner = poi_5.corner;
00207 poi_7.d = direction_from_to(poi_5.corner,poi_D2.corner);
00208 poi_6.corner = poi_5.corner;
00209 poi_6.d = direction_from_to(poi_5.corner,poi_A2.corner);
00210 }
00211 if(LA && LB && !LC && LD) {
00212
00213
00214 poi_2 = poi_D; poi_3 = poi_B;
00215 poi_1 = poi_C; poi_4 = poi_A;
00216
00217 poi_8 = poi_boD; poi_9 = poi_boB;
00218 poi_5 = poi_C2; poi_10 = poi_boA;
00219
00220 poi_7.corner = poi_5.corner;
00221 poi_7.d = direction_from_to(poi_5.corner,poi_A2.corner);
00222 poi_6.corner = poi_5.corner;
00223 poi_6.d = direction_from_to(poi_5.corner,poi_D2.corner);
00224 }
00225 if(!LA && LB && LC && LD) {
00226
00227
00228 poi_2 = poi_C; poi_3 = poi_D;
00229 poi_1 = poi_A; poi_4 = poi_B;
00230
00231 poi_8 = poi_boC; poi_9 = poi_boD;
00232 poi_5 = poi_A2; poi_10 = poi_boB;
00233
00234 poi_7.corner = poi_5.corner;
00235 poi_7.d = direction_from_to(poi_5.corner,poi_B2.corner);
00236 poi_6.corner = poi_5.corner;
00237 poi_6.d = direction_from_to(poi_5.corner,poi_C2.corner);
00238 }
00239
00240
00241 Act->Tetraeder(poi_1,poi_5,poi_6,poi_7);
00242
00243 dirA = direction_from_to(poi_4.corner,poi_1.corner);
00244 dirB = direction_from_to(poi_4.corner,poi_3.corner);
00245 if(Calc_f_type(dirA,dirB)==an) {
00246 Act->Tetraeder(poi_1,poi_6,poi_9,poi_7);
00247 Act->Tetraeder(poi_1,poi_7,poi_9,poi_10);
00248 Act->Tetraeder(poi_1,poi_6,poi_8,poi_9);
00249
00250 dirA = poi_10.d;
00251 dirB = direction_from_to(poi_4.corner,poi_3.corner);
00252 if(Calc_f_type(dirA,dirB)==an) {
00253 Act->Tetraeder(poi_1,poi_10,poi_3,poi_4);
00254 Act->Tetraeder(poi_1,poi_10,poi_9,poi_3);
00255 }
00256 else {
00257 Act->Tetraeder(poi_1,poi_10,poi_9,poi_4);
00258 Act->Tetraeder(poi_1,poi_9,poi_3,poi_4);
00259 }
00260
00261 dirA = poi_9.d;
00262 dirB = direction_from_to(poi_3.corner,poi_2.corner);
00263 if(Calc_f_type(dirA,dirB)==an) {
00264 Act->Tetraeder(poi_1,poi_9,poi_2,poi_3);
00265 Act->Tetraeder(poi_1,poi_8,poi_2,poi_9);
00266 }
00267 else {
00268 Act->Tetraeder(poi_1,poi_8,poi_3,poi_9);
00269 Act->Tetraeder(poi_1,poi_8,poi_2,poi_3);
00270 }
00271 }
00272 else {
00273
00274 if(parallel_version)
00275 Tell_about_round_of_problem(Description->h(poi_7.corner, poi_7.d),
00276 Description->h(poi_6.corner, poi_6.d));
00277 if(Description->h(poi_7.corner, poi_7.d) <
00278 Description->h(poi_6.corner, poi_6.d)) {
00279 Act->Tetraeder(poi_1,poi_7,poi_6,poi_10);
00280 Act->Tetraeder(poi_1,poi_6,poi_8,poi_10);
00281 }
00282 else {
00283 Act->Tetraeder(poi_1,poi_7,poi_6,poi_8);
00284 Act->Tetraeder(poi_1,poi_7,poi_8,poi_10);
00285 }
00286 dirA = opposite3D(poi_9.d);
00287 dirB = direction_from_to(poi_3.corner,poi_4.corner);
00288 dirC = direction_from_to(poi_3.corner,poi_2.corner);
00289
00290 x_face_type = Calc_f_type(dirA,dirC);
00291 y_face_type = Calc_f_type(dirA,dirB);
00292
00293 A_face_type = Act_on_Prism(Description,Act,x_face_type,y_face_type,
00294 poi_9,poi_8,poi_10,poi_3,poi_2,poi_4);
00295
00296 if(A_face_type==an) {
00297 Act->Tetraeder(poi_1,poi_8,poi_2,poi_10);
00298 Act->Tetraeder(poi_1,poi_10,poi_2,poi_4);
00299 }
00300 else {
00301 Act->Tetraeder(poi_1,poi_8,poi_4,poi_10);
00302 Act->Tetraeder(poi_1,poi_8,poi_2,poi_4);
00303 }
00304 }
00305
00306 }
00307
00308
00309 else if((LA && LB && !LC && !LD) || (LA && !LB && LC && !LD) ||
00310 (!LA && !LB && LC && LD) || (!LA && LB && !LC && LD)) {
00311 poi_1.edge_point = poi_2.edge_point = corner_poi_typ;
00312 poi_3.edge_point = poi_4.edge_point = corner_poi_typ;
00313 poi_5.edge_point = poi_6.edge_point = corner_poi_typ;
00314 poi_7.edge_point = poi_8.edge_point = edge_poi_typ;
00315 poi_9.edge_point = poi_10.edge_point = edge_poi_typ;
00316 if(!LA && !LB && LC && LD) {
00317
00318
00319 poi_2 = poi_A; poi_3 = poi_C;
00320 poi_1 = poi_B; poi_4 = poi_D;
00321
00322 poi_6 = poi_A2; poi_10 = poi_boC;
00323 poi_5 = poi_B2; poi_9 = poi_boD;
00324
00325 poi_7.corner = poi_6.corner;
00326 poi_7.d = direction_from_to(poi_6.corner,poi_C2.corner);
00327 poi_8.corner = poi_5.corner;
00328 poi_8.d = direction_from_to(poi_5.corner,poi_D2.corner);
00329 }
00330 if(LA && LB && !LC && !LD) {
00331
00332
00333 poi_2 = poi_D; poi_3 = poi_B;
00334 poi_1 = poi_C; poi_4 = poi_A;
00335
00336 poi_6 = poi_D2; poi_10 = poi_boB;
00337 poi_5 = poi_C2; poi_9 = poi_boA;
00338
00339 poi_7.corner = poi_6.corner;
00340 poi_7.d = direction_from_to(poi_6.corner,poi_B2.corner);
00341 poi_8.corner = poi_5.corner;
00342 poi_8.d = direction_from_to(poi_5.corner,poi_A2.corner);
00343 }
00344 if(LA && !LB && LC && !LD) {
00345
00346
00347 poi_2 = poi_B; poi_3 = poi_A;
00348 poi_1 = poi_D; poi_4 = poi_C;
00349
00350 poi_6 = poi_B2; poi_10 = poi_boA;
00351 poi_5 = poi_D2; poi_9 = poi_boC;
00352
00353 poi_7.corner = poi_6.corner;
00354 poi_7.d = direction_from_to(poi_6.corner,poi_A2.corner);
00355 poi_8.corner = poi_5.corner;
00356 poi_8.d = direction_from_to(poi_5.corner,poi_C2.corner);
00357 }
00358 if(!LA && LB && !LC && LD) {
00359
00360
00361 poi_2 = poi_C; poi_3 = poi_D;
00362 poi_1 = poi_A; poi_4 = poi_B;
00363
00364 poi_6 = poi_C2; poi_10 = poi_boD;
00365 poi_5 = poi_A2; poi_9 = poi_boB;
00366
00367 poi_7.corner = poi_6.corner;
00368 poi_7.d = direction_from_to(poi_6.corner,poi_D2.corner);
00369 poi_8.corner = poi_5.corner;
00370 poi_8.d = direction_from_to(poi_5.corner,poi_B2.corner);
00371 }
00372
00373 h_9 = Description->h(poi_9.corner, poi_9.d);
00374 h_7 = Description->h(poi_7.corner, poi_7.d);
00375 h_8 = Description->h(poi_8.corner, poi_8.d);
00376 h_10 = Description->h(poi_10.corner, poi_10.d);
00377
00378 H = Description->Meshsize();
00379
00380 num_max = 9;
00381 h_max = h_9;
00382 if(parallel_version) Tell_about_round_of_problem(h_7 , h_max);
00383 if(h_7 > h_max) {
00384 num_max = 7;
00385 h_max = h_7;
00386 }
00387 if(parallel_version) Tell_about_round_of_problem(h_8 , h_max);
00388 if(h_8 > h_max) {
00389 num_max = 8;
00390 h_max = h_8;
00391 }
00392 if(parallel_version) Tell_about_round_of_problem(h_10 , h_max);
00393 if(h_10 > h_max) {
00394 num_max = 10;
00395 h_max = h_10;
00396 }
00397
00398 if(parallel_version) Tell_about_round_of_problem(h_max,0.5*H);
00399 if(h_max > 0.5*H) {
00400
00401 poi_11.edge_point = cell_poi_typ;
00402 dirA = direction_from_to(poi_1.corner,poi_2.corner);
00403
00404 if(dirA==Wdir || dirA==Edir)
00405 Act->Add_Bo_freedom(D3vector( 0.0,
00406 -0.1+0.2*y1DCoord(poi_1.corner),
00407 -0.1+0.2*z1DCoord(poi_1.corner)));
00408 if(dirA==Ndir || dirA==Sdir)
00409 Act->Add_Bo_freedom(D3vector(-0.1+0.2*x1DCoord(poi_1.corner),
00410 0.0,
00411 -0.1+0.2*z1DCoord(poi_1.corner)));
00412 if(dirA==Tdir || dirA==Ddir)
00413 Act->Add_Bo_freedom(D3vector(-0.1+0.2*x1DCoord(poi_1.corner),
00414 -0.1+0.2*y1DCoord(poi_1.corner),
00415 0.0));
00416
00417
00418
00419 dirA = poi_9.d;
00420 dirB = direction_from_to(poi_4.corner,poi_3.corner);
00421 if(Calc_f_type(dirA,dirB)==an) {
00422 Act->Tetraeder(poi_11,poi_9,poi_3,poi_4);
00423 Act->Tetraeder(poi_11,poi_9,poi_10,poi_3);
00424 }
00425 else {
00426 Act->Tetraeder(poi_11,poi_9,poi_10,poi_4);
00427 Act->Tetraeder(poi_11,poi_10,poi_3,poi_4);
00428 }
00429
00430
00431 dirA = poi_9.d;
00432 dirB = direction_from_to(poi_1.corner,poi_2.corner);
00433 if(Calc_f_type(dirA,dirB)==an) {
00434 Act->Tetraeder(poi_11,poi_5,poi_1,poi_2);
00435 Act->Tetraeder(poi_11,poi_6,poi_5,poi_2);
00436 }
00437 else {
00438 Act->Tetraeder(poi_11,poi_6,poi_1,poi_2);
00439 Act->Tetraeder(poi_11,poi_6,poi_5,poi_1);
00440 }
00441
00442
00443 dirA = poi_8.d;
00444 dirB = direction_from_to(poi_1.corner,poi_2.corner);
00445 if(Calc_f_type(dirA,dirB)==an) {
00446 Act->Tetraeder(poi_11,poi_8,poi_5,poi_6);
00447 Act->Tetraeder(poi_11,poi_8,poi_6,poi_7);
00448 }
00449 else {
00450 Act->Tetraeder(poi_11,poi_8,poi_5,poi_7);
00451 Act->Tetraeder(poi_11,poi_5,poi_6,poi_7);
00452 }
00453
00454
00455 dirA = poi_8.d;
00456 dirB = direction_from_to(poi_1.corner,poi_2.corner);
00457 if(Calc_f_type(dirA,dirB)==an) {
00458 Act->Tetraeder(poi_11,poi_2,poi_1,poi_4);
00459 Act->Tetraeder(poi_11,poi_2,poi_4,poi_3);
00460 }
00461 else {
00462 Act->Tetraeder(poi_11,poi_3,poi_1,poi_4);
00463 Act->Tetraeder(poi_11,poi_3,poi_2,poi_1);
00464 }
00465
00466 Act->Tetraeder(poi_11,poi_8,poi_1,poi_5);
00467 Act->Tetraeder(poi_11,poi_8,poi_9,poi_1);
00468 Act->Tetraeder(poi_11,poi_9,poi_4,poi_1);
00469
00470
00471 Act->Tetraeder(poi_11,poi_7,poi_6,poi_2);
00472 Act->Tetraeder(poi_11,poi_7,poi_2,poi_10);
00473 Act->Tetraeder(poi_11,poi_10,poi_2,poi_3);
00474
00475
00476 if(num_max==9 || num_max==7) {
00477 Act->Tetraeder(poi_11,poi_9,poi_8,poi_7);
00478 Act->Tetraeder(poi_11,poi_9,poi_7,poi_10);
00479 }
00480 else {
00481 Act->Tetraeder(poi_11,poi_9,poi_8,poi_10);
00482 Act->Tetraeder(poi_11,poi_8,poi_7,poi_10);
00483 }
00484 }
00485 else {
00486
00487
00488 dirA = direction_from_to(poi_5.corner,poi_1.corner);
00489 dirB = direction_from_to(poi_5.corner,poi_6.corner);
00490 x_face_type=Calc_f_type(dirA,dirB);
00491 dirA = poi_8.d;
00492 y_face_type=Calc_f_type(dirA,dirB);
00493 A_face_type = Act_on_Prism_long(Description,Act,
00494 x_face_type,y_face_type,
00495 poi_5,poi_1,poi_8,poi_6,poi_2,poi_7);
00496
00497
00498 dirA = poi_9.d;
00499 dirB = direction_from_to(poi_4.corner,poi_3.corner);
00500 x_face_type=Calc_f_type(dirA,dirB);
00501 dirA = direction_from_to(poi_4.corner,poi_1.corner);
00502 y_face_type=Calc_f_type(dirA,dirB);
00503 B_face_type = Act_on_Prism_short(Description,Act,
00504 x_face_type,y_face_type,
00505 poi_4,poi_9,poi_1,
00506 poi_3,poi_10,poi_2);
00507
00508 Act_on_Prism(Description,Act,opposite_face_type(B_face_type),
00509 A_face_type,
00510 poi_1,poi_9,poi_8,poi_2,poi_10,poi_7);
00511 }
00512 }
00513
00514
00515 else if((LA && !LB && !LC && LD) || (!LA && LB && LC && !LD)) {
00516 poi_1.edge_point = poi_2.edge_point = corner_poi_typ;
00517 poi_3.edge_point = poi_4.edge_point = corner_poi_typ;
00518 poi_5.edge_point = poi_8.edge_point = corner_poi_typ;
00519 poi_6.edge_point = poi_7.edge_point = edge_poi_typ;
00520 poi_9.edge_point = poi_10.edge_point = edge_poi_typ;
00521 poi_11.edge_point = poi_12.edge_point = edge_poi_typ;
00522 if(!LA && LB && LC && !LD) {
00523
00524
00525 poi_2 = poi_A; poi_3 = poi_C;
00526 poi_1 = poi_B; poi_4 = poi_D;
00527
00528 poi_8 = poi_A2; poi_11 = poi_boC;
00529 poi_12 = poi_boB; poi_5 = poi_D2;
00530 }
00531 if(LA && !LB && !LC && LD) {
00532
00533
00534 poi_2 = poi_B; poi_3 = poi_A;
00535 poi_1 = poi_D; poi_4 = poi_C;
00536
00537 poi_8 = poi_B2; poi_11 = poi_boA;
00538 poi_12 = poi_boD; poi_5 = poi_C2;
00539 }
00540 poi_9.corner = poi_8.corner;
00541 poi_10.corner = poi_8.corner;
00542 poi_9.d = direction_from_to(poi_2.corner,poi_3.corner);
00543 poi_10.d = direction_from_to(poi_2.corner,poi_1.corner);
00544 poi_6.corner = poi_5.corner;
00545 poi_7.corner = poi_5.corner;
00546 poi_6.d = direction_from_to(poi_4.corner,poi_3.corner);
00547 poi_7.d = direction_from_to(poi_4.corner,poi_1.corner);
00548
00549 poi_13.edge_point = cell_poi_typ;
00550 Act->Add_Bo_freedom(D3vector(0.0,0.0,0.0));
00551
00552
00553 Act->Tetraeder(poi_5,poi_6,poi_7,poi_4);
00554 Act->Tetraeder(poi_8,poi_10,poi_9,poi_2);
00555
00556
00557 Act->Tetraeder(poi_13,poi_10,poi_2,poi_9);
00558 Act->Tetraeder(poi_13,poi_7,poi_6,poi_4);
00559
00560
00561 Act->Tetraeder(poi_13,poi_7,poi_4,poi_12);
00562 Act->Tetraeder(poi_13,poi_6,poi_11,poi_4);
00563 Act->Tetraeder(poi_13,poi_11,poi_9,poi_2);
00564 Act->Tetraeder(poi_13,poi_10,poi_12,poi_2);
00565
00566
00567 Act->Tetraeder(poi_13,poi_12,poi_4,poi_1);
00568 Act->Tetraeder(poi_13,poi_12,poi_1,poi_2);
00569 Act->Tetraeder(poi_13,poi_11,poi_2,poi_3);
00570 Act->Tetraeder(poi_13,poi_11,poi_3,poi_4);
00571
00572
00573 dirA = poi_6.d;
00574 dirB = poi_7.d;
00575 if(Calc_f_type(dirA,dirB)==an) {
00576 Act->Tetraeder(poi_13,poi_3,poi_1,poi_4);
00577 Act->Tetraeder(poi_13,poi_3,poi_2,poi_1);
00578 }
00579 else {
00580 Act->Tetraeder(poi_13,poi_2,poi_4,poi_3);
00581 Act->Tetraeder(poi_13,poi_2,poi_1,poi_4);
00582 }
00583
00584
00585 Act->Tetraeder(poi_13,poi_7,poi_12,poi_10);
00586 Act->Tetraeder(poi_13,poi_6,poi_9,poi_11);
00587
00588 h_6 = Description->h(poi_6.corner, poi_6.d);
00589 h_7 = Description->h(poi_7.corner, poi_7.d);
00590 h_9 = Description->h(poi_9.corner, poi_9.d);
00591 h_10 = Description->h(poi_10.corner, poi_10.d);
00592
00593 double H;
00594 double angle_6;
00595 double angle_7;
00596 double angle_9;
00597 double angle_10;
00598
00599 H = Description->Meshsize();
00600
00601 angle_6 = calc_special_angle(h_7,h_6,H-h_9,H-h_6);
00602 angle_7 = calc_special_angle(H-h_10,H-h_7,h_6,h_7);
00603 angle_10 = calc_special_angle(h_9,h_10,H-h_7,H-h_10);
00604 angle_9 = calc_special_angle(H-h_6,H-h_9,h_10,h_9);
00605
00606
00607
00608 if(parallel_version)
00609 Tell_about_round_of_problem(MAX(angle_7,angle_9),
00610 MAX(angle_10,angle_6));
00611 if(MAX(angle_7,angle_9) > MAX(angle_10,angle_6)) {
00612 Act->Tetraeder(poi_13,poi_7,poi_10,poi_9);
00613 Act->Tetraeder(poi_13,poi_7,poi_9,poi_6);
00614 }
00615 else {
00616 Act->Tetraeder(poi_13,poi_7,poi_10,poi_6);
00617 Act->Tetraeder(poi_13,poi_6,poi_10,poi_9);
00618 }
00619 }
00620
00621
00622 else if((!LA && !LB && !LC && LD) || (!LA && !LB && LC && !LD) ||
00623 (!LA && LB && !LC && !LD) || (LA && !LB && !LC && !LD)) {
00624 poi_1.edge_point = poi_2.edge_point = corner_poi_typ;
00625 poi_3.edge_point = poi_4.edge_point = corner_poi_typ;
00626 poi_5.edge_point = poi_6.edge_point = corner_poi_typ;
00627 poi_7.edge_point = corner_poi_typ;
00628 poi_8.edge_point = edge_poi_typ;
00629 poi_9.edge_point = poi_10.edge_point = edge_poi_typ;
00630
00631 if(!LA && !LB && !LC && LD) {
00632
00633
00634 poi_2 = poi_A; poi_3 = poi_C;
00635 poi_1 = poi_B; poi_4 = poi_D;
00636
00637 poi_6 = poi_A2; poi_7 = poi_C2;
00638 poi_5 = poi_B2;
00639
00640 poi_8.corner = poi_7.corner;
00641 poi_8.d = direction_from_to(poi_7.corner,poi_D2.corner);
00642 poi_9.corner = poi_5.corner;
00643 poi_9.d = direction_from_to(poi_5.corner,poi_D2.corner);
00644 poi_10.corner = poi_4.corner;
00645 poi_10.d = direction_from_to(poi_4.corner,poi_D2.corner);
00646 }
00647 if(LA && !LB && !LC && !LD) {
00648
00649
00650 poi_2 = poi_D; poi_3 = poi_B;
00651 poi_1 = poi_C; poi_4 = poi_A;
00652
00653 poi_6 = poi_D2; poi_7 = poi_B2;
00654 poi_5 = poi_C2;
00655
00656 poi_8.corner = poi_7.corner;
00657 poi_8.d = direction_from_to(poi_7.corner,poi_A2.corner);
00658 poi_9.corner = poi_5.corner;
00659 poi_9.d = direction_from_to(poi_5.corner,poi_A2.corner);
00660 poi_10.corner = poi_4.corner;
00661 poi_10.d = direction_from_to(poi_4.corner,poi_A2.corner);
00662 }
00663 if(!LA && !LB && LC && !LD) {
00664
00665
00666 poi_2 = poi_B; poi_3 = poi_A;
00667 poi_1 = poi_D; poi_4 = poi_C;
00668
00669 poi_6 = poi_B2; poi_7 = poi_A2;
00670 poi_5 = poi_D2;
00671
00672 poi_8.corner = poi_7.corner;
00673 poi_8.d = direction_from_to(poi_7.corner,poi_C2.corner);
00674 poi_9.corner = poi_5.corner;
00675 poi_9.d = direction_from_to(poi_5.corner,poi_C2.corner);
00676 poi_10.corner = poi_4.corner;
00677 poi_10.d = direction_from_to(poi_4.corner,poi_C2.corner);
00678 }
00679 if(!LA && LB && !LC && !LD) {
00680
00681
00682 poi_2 = poi_C; poi_3 = poi_D;
00683 poi_1 = poi_A; poi_4 = poi_B;
00684
00685 poi_6 = poi_C2; poi_7 = poi_D2;
00686 poi_5 = poi_A2;
00687
00688 poi_8.corner = poi_7.corner;
00689 poi_8.d = direction_from_to(poi_7.corner,poi_B2.corner);
00690 poi_9.corner = poi_5.corner;
00691 poi_9.d = direction_from_to(poi_5.corner,poi_B2.corner);
00692 poi_10.corner = poi_4.corner;
00693 poi_10.d = direction_from_to(poi_4.corner,poi_B2.corner);
00694 }
00695
00696 poi_11.edge_point = cell_poi_typ;
00697
00698
00699
00700
00701
00702 Act->Add_Bo_freedom(D3vector(0.0,0.0,0.0));
00703
00704
00705 dirA = direction_from_to(poi_5.corner,poi_6.corner);
00706 dirB = direction_from_to(poi_5.corner,poi_1.corner);
00707 if(Calc_f_type(dirA,dirB)==an) {
00708 Act->Tetraeder(poi_11,poi_5,poi_1,poi_6);
00709 Act->Tetraeder(poi_11,poi_6,poi_1,poi_2);
00710 }
00711 else {
00712 Act->Tetraeder(poi_11,poi_6,poi_5,poi_2);
00713 Act->Tetraeder(poi_11,poi_5,poi_1,poi_2);
00714 }
00715
00716 dirA = direction_from_to(poi_4.corner,poi_1.corner);
00717 dirB = direction_from_to(poi_4.corner,poi_3.corner);
00718 if(Calc_f_type(dirA,dirB)==an) {
00719 Act->Tetraeder(poi_11,poi_3,poi_1,poi_4);
00720 Act->Tetraeder(poi_11,poi_2,poi_1,poi_3);
00721 }
00722 else {
00723 Act->Tetraeder(poi_11,poi_2,poi_1,poi_4);
00724 Act->Tetraeder(poi_11,poi_2,poi_4,poi_3);
00725 }
00726
00727 dirA = direction_from_to(poi_7.corner,poi_6.corner);
00728 dirB = direction_from_to(poi_7.corner,poi_3.corner);
00729 if(Calc_f_type(dirA,dirB)==an) {
00730 Act->Tetraeder(poi_11,poi_6,poi_3,poi_7);
00731 Act->Tetraeder(poi_11,poi_6,poi_2,poi_3);
00732 }
00733 else {
00734 Act->Tetraeder(poi_11,poi_6,poi_2,poi_7);
00735 Act->Tetraeder(poi_11,poi_7,poi_2,poi_3);
00736 }
00737
00738 Act->Tetraeder(poi_11,poi_1,poi_5,poi_9);
00739 Act->Tetraeder(poi_11,poi_1,poi_10,poi_4);
00740 Act->Tetraeder(poi_11,poi_1,poi_9,poi_10);
00741
00742 Act->Tetraeder(poi_11,poi_6,poi_9,poi_5);
00743 Act->Tetraeder(poi_11,poi_6,poi_8,poi_9);
00744 Act->Tetraeder(poi_11,poi_6,poi_7,poi_8);
00745
00746 Act->Tetraeder(poi_11,poi_3,poi_8,poi_7);
00747 Act->Tetraeder(poi_11,poi_3,poi_10,poi_8);
00748 Act->Tetraeder(poi_11,poi_3,poi_4,poi_10);
00749
00750 Act->Tetraeder(poi_11,poi_9,poi_8,poi_10);
00751
00752 }
00753 }
00754 }
00755
00756 if(later_stop) stop = true;
00757 }
00758
00759
00760 #endif
00761