Main Page | Namespace List | Class Hierarchy | Class List | File List | Class Members | File Members

src/expde/formulas/subdivII.h

Go to the documentation of this file.
00001 //    expde: expression templates for partial differential equations.
00002 //    Copyright (C) 2001  Christoph Pflaum
00003 //    This program is free software; you can redistribute it and/or modify
00004 //    it under the terms of the GNU General Public License as published by
00005 //    the Free Software Foundation; either version 2 of the License, or
00006 //    (at your option) any later version.
00007 //
00008 //    This program is distributed in the hope that it will be useful,
00009 //    but WITHOUT ANY WARRANTY; without even the implied warranty of
00010 //    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00011 //    GNU General Public License for more details.
00012 //
00013 //                 SEE  Notice1.doc made by 
00014 //                 LAWRENCE LIVERMORE NATIONAL LABORATORY
00015 //
00016 
00017 // ------------------------------------------------------------
00018 //
00019 // subdivII.h
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   // Bemerkung:  richtig? (nicht so wichtig!)
00053     // Ab hier gibt es:
00054     // a) ein oder zwei Dreibeine
00055     // b) ein oder zwei Quader
00056     // c) ein oder zwei Typ 2.3
00057     // d) genau einen weitere Randtyp
00058 
00059   // stop = true;
00060   // stop = false;
00061   //  Boundary cells : 1.
00062   // ---------------------
00063   //  Ganze Flaeche im Gebiet
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       // Flaeche ist im Gebiet
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       //   Quader von oben:
00131       //   A C     
00132       //   B D
00133 
00134       //  Boundary cell : 1.1.
00135       // ----------------------
00136       // Ein Quader
00137       //      if(LA && LB && LC && LD) {
00138       if(LA && LB && LC && LD) {
00139         stop=false; 
00140         later_stop = true;
00141 
00142           // C D     3 2     7 6
00143           // A B     0 1     4 5 
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       //  Boundary cell : 1.2.
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           // B A
00185           // D C
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           // A C
00199           // B D
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           // D B
00213           // C A
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           // C D
00227           // A B
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) { // Bei Punkt 4 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           // Anstelle von Pyr 1, 10, 9, 3, 4
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           // Anstelle von Pyr 1, 9, 8, 2, 3
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 { // Bei Punkt 4 spitz
00273           // Anstelle von:  Pyr 1, 6, 8, 10, 7
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       //  Boundary cell : 1.3.
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           // A C
00318           // B D
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           // D B
00332           // C A
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           // B A
00346           // D C
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           // C D
00360           // A B
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           // version with additional point
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           // East
00418           // Anstelle von Pyr 11, 10, 9, 3, 4
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           // West
00430           // Anstelle von Pyr 11, 5, 1, 2, 6
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           // Top
00442           // Anstelle von Pyr 11, 8, 5, 6, 7
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           // Bottom
00454           // Anstelle von Pyr 11, 2, 1, 4, 3
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           // South
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           // North
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           // Oberflaeche
00475           // Anstelle von Pyr 11, 8, 7, 10, 9
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           // version with prisms
00487           // Anstelle: Act->Prism(poi_5,poi_1,poi_8,poi_6,poi_2,poi_7);
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           // Anstelle: Act->Prism(poi_4,poi_9,poi_1,poi_3,poi_10,poi_2);
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           // Anstelle: Act->Prism(poi_8,poi_1,poi_9,poi_7,poi_2,poi_10); 
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      //  Boundary cell : 1.4.
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           // A C
00524           // B D
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           // B A
00533           // D C
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         // Ecke 5 und 8
00553         Act->Tetraeder(poi_5,poi_6,poi_7,poi_4);
00554         Act->Tetraeder(poi_8,poi_10,poi_9,poi_2);
00555 
00556         // Verbindung zu poi_13
00557         Act->Tetraeder(poi_13,poi_10,poi_2,poi_9);
00558         Act->Tetraeder(poi_13,poi_7,poi_6,poi_4);
00559 
00560         // Dreieck in der Mitte einer c)-Zelle zu poi_13
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         // Restliche Dreiecke  einer c)-Zelle zu poi_13
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         // Anstelle von Pyr 13, 2, 1, 4, 3
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         // Oberflaeche:
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         // Anstelle von Pyr 13, 7, 10, 9, 6
00607         //      if(num_min==6 || num_min==10) {
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       //  Boundary cell : 1.5.
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           // A C
00633           // B D
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           // D B
00649           // C A
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           // B A
00665           // D C
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           // C D
00681           // A B
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         Act->Add_Bo_freedom(D3vector(-0.25+0.5*x1DCoord(poi_2.corner),
00699                                      -0.25+0.5*y1DCoord(poi_2.corner),
00700                                      -0.25+0.5*z1DCoord(poi_2.corner)));
00701         */
00702         Act->Add_Bo_freedom(D3vector(0.0,0.0,0.0));
00703 
00704         // Anstelle: Act->Pyramid(poi_11,poi_5,poi_1,poi_2,poi_6);
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         // Anstelle: Act->Pyramid(poi_11,poi_4,poi_3,poi_2,poi_1);
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         // Anstelle: Act->Pyramid(poi_11,poi_6,poi_2,poi_3,poi_7);
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    

Generated on Fri Nov 2 01:25:59 2007 for IPPL by doxygen 1.3.5