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

src/expde/formulas/subdivIV.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 // subdivIV.h
00020 //
00021 // ------------------------------------------------------------
00022 
00023 #ifndef SUBDIVIV_H_
00024 #define SUBDIVIV_H_
00025 
00026 void Act_on_subdivision_partIV(Bo_description* Description, 
00027                                 Calculator_FE* Act,
00028                                 bool* corners, bool& stop) {
00029   int i;
00030 
00031   Edge_Corner_point poi_1,   poi_2,   poi_3,   poi_4;
00032   Edge_Corner_point poi_5,   poi_6,   poi_7,   poi_8,   poi_14;
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;
00039   dir_3D sur, suropp;
00040   bool later_stop, LA, LB, LC, LD, LcA, LcB, LcC, LcD, Lsp;
00041   int num_corners;
00042   double h_7, h_9, h_11, h_13;
00043 
00044   later_stop = false;
00045 
00046 // stop = false;
00047 for(i=0;i<6 && !stop;++i) {
00048   sur    = (dir_3D)i;
00049   if(i==Wdir || i==Ndir || i==Ddir) {   
00050     poi_A.corner = corner_sur(sur,SWdir);
00051     poi_B.corner = corner_sur(sur,SEdir);
00052     poi_C.corner = corner_sur(sur,NWdir);
00053     poi_D.corner = corner_sur(sur,NEdir);
00054   }
00055   else {
00056     poi_A.corner = corner_sur(sur,SWdir);
00057     poi_B.corner = corner_sur(sur,NWdir);
00058     poi_C.corner = corner_sur(sur,SEdir);
00059     poi_D.corner = corner_sur(sur,NEdir);
00060   }
00061 
00062   LcA = Description->corner_point(poi_A.corner);
00063   LcB = Description->corner_point(poi_B.corner);
00064   LcC = Description->corner_point(poi_C.corner);
00065   LcD = Description->corner_point(poi_D.corner);
00066 
00067   num_corners=0;
00068   if(LcA) ++num_corners;
00069   if(LcB) ++num_corners;
00070   if(LcC) ++num_corners;
00071   if(LcD) ++num_corners;
00072   if(num_corners == 3) {
00073     // Flaeche vom Typ d)
00074     poi_A.edge_point = corner_poi_typ;
00075     poi_B.edge_point = corner_poi_typ;
00076     poi_C.edge_point = corner_poi_typ;
00077     poi_D.edge_point = corner_poi_typ;
00078     
00079     poi_A2.edge_point = corner_poi_typ;
00080     poi_B2.edge_point = corner_poi_typ;
00081     poi_C2.edge_point = corner_poi_typ;
00082     poi_D2.edge_point = corner_poi_typ;
00083     
00084     poi_boA.edge_point = edge_poi_typ;
00085     poi_boB.edge_point = edge_poi_typ;
00086     poi_boC.edge_point = edge_poi_typ;
00087     poi_boD.edge_point = edge_poi_typ;
00088     suropp = opposite3D((dir_3D)i);
00089     if(i==Wdir || i==Ndir || i==Ddir) { 
00090       poi_A2.corner = corner_sur(suropp,SWdir);
00091       poi_B2.corner = corner_sur(suropp,SEdir);
00092       poi_C2.corner = corner_sur(suropp,NWdir);
00093       poi_D2.corner = corner_sur(suropp,NEdir);
00094       
00095       poi_boA.corner = poi_A.corner;   poi_boA.d = opposite3D((dir_3D)i);
00096       LA = Description->edge_point(poi_boA);
00097       poi_boB.corner = poi_B.corner;   poi_boB.d = opposite3D((dir_3D)i);
00098       LB = Description->edge_point(poi_boB);
00099       poi_boC.corner = poi_C.corner;   poi_boC.d = opposite3D((dir_3D)i);
00100       LC = Description->edge_point(poi_boC);
00101       poi_boD.corner = poi_D.corner;   poi_boD.d = opposite3D((dir_3D)i);
00102       LD = Description->edge_point(poi_boD);
00103     }
00104     else {
00105       poi_A2.corner = corner_sur(suropp,SWdir);
00106       poi_B2.corner = corner_sur(suropp,NWdir);
00107       poi_C2.corner = corner_sur(suropp,SEdir);
00108       poi_D2.corner = corner_sur(suropp,NEdir);
00109       
00110       poi_boA.corner = poi_A.corner;   poi_boA.d = opposite3D((dir_3D)i);
00111       LA = Description->edge_point(poi_boA);
00112       poi_boB.corner = poi_B.corner;   poi_boB.d = opposite3D((dir_3D)i);
00113       LB = Description->edge_point(poi_boB);
00114       poi_boC.corner = poi_C.corner;   poi_boC.d = opposite3D((dir_3D)i);
00115       LC = Description->edge_point(poi_boC);
00116       poi_boD.corner = poi_D.corner;   poi_boD.d = opposite3D((dir_3D)i);
00117       LD = Description->edge_point(poi_boD);
00118     }
00119 
00120     // Drehen:
00121     if(!LcC) {
00122       // D B  ->  // C D
00123       // C A  ->  // A B
00124       Lsp = LC;
00125       LC = LD;     LD = LB;
00126       LB = LA;     LA = Lsp;    
00127 
00128       poi_1 = poi_C;
00129       poi_C = poi_D;     poi_D = poi_B;
00130       poi_B = poi_A;     poi_A = poi_1;     
00131  
00132       poi_1 = poi_C2;
00133       poi_C2 = poi_D2;     poi_D2 = poi_B2;
00134       poi_B2 = poi_A2;     poi_A2 = poi_1;
00135 
00136       poi_1   = poi_boC;
00137       poi_boC = poi_boD;     poi_boD = poi_boB;
00138       poi_boB = poi_boA;     poi_boA = poi_1;     
00139     }
00140     if(!LcD) {
00141       // B A ->  // C D
00142       // D C ->  // A B
00143       Lsp = LD;
00144       LD = LA;      LA = Lsp;
00145       Lsp = LB;
00146       LB = LC;      LC = Lsp;
00147 
00148       poi_1 = poi_D;
00149       poi_D = poi_A;      poi_A = poi_1;
00150       poi_1 = poi_B;
00151       poi_B = poi_C;      poi_C = poi_1;
00152 
00153       poi_1  = poi_D2;
00154       poi_D2 = poi_A2;      poi_A2 = poi_1;
00155       poi_1  = poi_B2;
00156       poi_B2 = poi_C2;      poi_C2 = poi_1;
00157 
00158       poi_1   = poi_boD;
00159       poi_boD = poi_boA;      poi_boA = poi_1;
00160       poi_1   = poi_boB;
00161       poi_boB = poi_boC;      poi_boC = poi_1;
00162     }
00163     if(!LcB) {
00164       // A C  ->  // C D
00165       // B D  ->  // A B
00166       Lsp = LB;
00167       LB = LD;     LD = LC;
00168       LC = LA;     LA = Lsp;
00169 
00170       poi_1 = poi_B;
00171       poi_B = poi_D;     poi_D = poi_C;
00172       poi_C = poi_A;     poi_A = poi_1;
00173 
00174       poi_1  = poi_B2;
00175       poi_B2 = poi_D2;     poi_D2 = poi_C2;
00176       poi_C2 = poi_A2;     poi_A2 = poi_1;
00177 
00178       poi_1   = poi_boB;
00179       poi_boB = poi_boD;     poi_boD = poi_boC;
00180       poi_boC = poi_boA;     poi_boA = poi_1;
00181     }
00182 
00183     // Jetzt immer:
00184     // C D
00185     // A B
00186 
00187     poi_2.edge_point = corner_poi_typ;
00188     poi_3.edge_point = poi_4.edge_point = corner_poi_typ;
00189     poi_5.edge_point = poi_6.edge_point = edge_poi_typ;
00190 
00191     poi_2 = poi_C;        poi_3 = poi_D;
00192                           poi_4 = poi_B;
00193 
00194     poi_5.corner = poi_2.corner;   
00195     poi_5.d = direction_from_to(poi_C.corner,poi_A.corner);
00196     poi_6.corner = poi_4.corner;   
00197     poi_6.d = direction_from_to(poi_B.corner,poi_A.corner);
00198 
00199     //  Boundary cell : 2.3.
00200     // ----------------------
00201     poi_boA.corner = poi_B2.corner;   
00202     poi_boA.d = direction_from_to(poi_B.corner,poi_A.corner);
00203     LA = Description->edge_point(poi_boA);
00204     // Symmetrie a):
00205     if(LA && LD && LC && !LB &&
00206        corners[poi_B.corner] && corners[poi_C.corner] &&
00207        corners[poi_D.corner] && corners[poi_B2.corner]) {
00208       corners[poi_B.corner] = corners[poi_C.corner] =
00209         corners[poi_D.corner] = corners[poi_B2.corner] = false;
00210       if(later_stop) {
00211         stop=true;
00212         cout << "\n Achtung:" << endl;
00213       }
00214       later_stop=true;
00215       poi_7.edge_point = poi_9.edge_point = edge_poi_typ;
00216       poi_8.edge_point = corner_poi_typ;
00217       poi_10.edge_point = poi_11.edge_point = edge_poi_typ;
00218       // C D
00219       // A B
00220       poi_11 = poi_boC;   poi_10 = poi_boD;
00221       poi_8  = poi_B2;
00222       
00223       poi_7.corner = poi_8.corner;   
00224       poi_9.corner = poi_8.corner;   
00225       poi_7.d = direction_from_to(poi_B.corner,poi_A.corner);
00226       poi_9.d = direction_from_to(poi_B.corner,poi_D.corner);
00227 
00228       poi_12.edge_point = cell_poi_typ;
00229 
00230       
00231       if(poi_9.d==Wdir || poi_9.d==Edir)
00232         Act->Add_Bo_freedom(D3vector( 0.0,
00233                                      -0.25+0.5*y1DCoord(poi_4.corner),
00234                                      -0.25+0.5*z1DCoord(poi_4.corner)));
00235       if(poi_9.d==Ndir || poi_9.d==Sdir)
00236         Act->Add_Bo_freedom(D3vector(-0.25+0.5*x1DCoord(poi_4.corner),
00237                                       0.0,
00238                                      -0.25+0.5*z1DCoord(poi_4.corner)));
00239       if(poi_9.d==Tdir || poi_9.d==Ddir)
00240         Act->Add_Bo_freedom(D3vector(-0.25+0.5*x1DCoord(poi_4.corner),
00241                                      -0.25+0.5*y1DCoord(poi_4.corner),
00242                                       0.0));
00243       /*
00244       if(poi_9.d==Wdir || poi_9.d==Edir)
00245         Act->Add_Bo_freedom(D3vector(-0.05+0.1*x1DCoord(poi_4.corner),
00246                                      -0.25+0.5*y1DCoord(poi_4.corner),
00247                                      -0.25+0.5*z1DCoord(poi_4.corner)));
00248       if(poi_9.d==Ndir || poi_9.d==Sdir)
00249         Act->Add_Bo_freedom(D3vector(-0.25+0.5*x1DCoord(poi_4.corner),
00250                                      -0.05+0.1*y1DCoord(poi_4.corner),
00251                                      -0.25+0.5*z1DCoord(poi_4.corner)));
00252       if(poi_9.d==Tdir || poi_9.d==Ddir)
00253         Act->Add_Bo_freedom(D3vector(-0.25+0.5*x1DCoord(poi_4.corner),
00254                                      -0.25+0.5*y1DCoord(poi_4.corner),
00255                                      -0.05+0.1*z1DCoord(poi_4.corner)));
00256       */
00257       // D Flaeche
00258       Act->Tetraeder(poi_12,poi_5,poi_6,poi_3);
00259       Act->Tetraeder(poi_12,poi_2,poi_5,poi_3);
00260       Act->Tetraeder(poi_12,poi_6,poi_4,poi_3);
00261 
00262       // E Flaeche
00263       Act->Tetraeder(poi_12,poi_10,poi_4,poi_9);
00264       Act->Tetraeder(poi_12,poi_10,poi_3,poi_4);
00265       Act->Tetraeder(poi_12,poi_8,poi_9,poi_4);
00266 
00267       // W Flaeche
00268       Act->Tetraeder(poi_12,poi_11,poi_5,poi_2);
00269 
00270       // T Flaeche
00271       Act->Tetraeder(poi_12,poi_8,poi_7,poi_9);
00272 
00273       // N Flaeche
00274       // Anstelle: Act->Pyramid(poi_12,poi_10,poi_11,poi_2,poi_3);
00275       dirA = poi_10.d;
00276       dirB = direction_from_to(poi_3.corner,poi_2.corner);
00277       if(Calc_f_type(dirA,dirB)==an) {
00278         Act->Tetraeder(poi_12,poi_10,poi_2,poi_3);
00279         Act->Tetraeder(poi_12,poi_10,poi_11,poi_2);
00280       }
00281       else {
00282         Act->Tetraeder(poi_12,poi_11,poi_3,poi_10);
00283         Act->Tetraeder(poi_12,poi_11,poi_2,poi_3);
00284       }
00285       // S Flaeche
00286       // Anstelle: Act->Pyramid(poi_12,poi_7,poi_8,poi_4,poi_6);
00287       if(Calc_f_type(dirA,dirB)==an) {
00288         Act->Tetraeder(poi_12,poi_8,poi_4,poi_6);
00289         Act->Tetraeder(poi_12,poi_8,poi_6,poi_7);
00290       }
00291       else {
00292         Act->Tetraeder(poi_12,poi_8,poi_4,poi_7);
00293         Act->Tetraeder(poi_12,poi_7,poi_4,poi_6);
00294       }
00295       // Oberflaeche:
00296       Act->Tetraeder(poi_12,poi_7,poi_11,poi_9);
00297       Act->Tetraeder(poi_12,poi_9,poi_11,poi_10);
00298       // Anstelle: Act->Pyramid(poi_12,poi_7,poi_6,poi_5,poi_11);
00299       Act->Tetraeder(poi_12,poi_7,poi_5,poi_11);
00300       Act->Tetraeder(poi_12,poi_7,poi_6,poi_5);
00301     }
00302     poi_boA.corner = poi_C2.corner;   
00303     poi_boA.d = direction_from_to(poi_C.corner,poi_A.corner);
00304     LA = Description->edge_point(poi_boA);
00305     // Symmetrie b):
00306     if(LA && LD && !LC && LB && !stop &&
00307        corners[poi_B.corner] && corners[poi_C.corner] &&
00308        corners[poi_D.corner] && corners[poi_C2.corner]) {
00309       corners[poi_B.corner] = corners[poi_C.corner] =
00310         corners[poi_D.corner] = corners[poi_C2.corner] = false;
00311       if(later_stop) stop=true;
00312       later_stop=true;
00313       poi_7.edge_point = poi_9.edge_point = edge_poi_typ;
00314       poi_8.edge_point = corner_poi_typ;
00315       poi_10.edge_point = poi_11.edge_point = edge_poi_typ;
00316       // C D
00317       // A B
00318       poi_8 = poi_C2;     poi_10 = poi_boD;
00319                           poi_11 = poi_boB;
00320       
00321       poi_7.corner = poi_8.corner;   
00322       poi_9.corner = poi_8.corner;   
00323       poi_7.d = direction_from_to(poi_C.corner,poi_A.corner);
00324       poi_9.d = direction_from_to(poi_C.corner,poi_D.corner);
00325 
00326       poi_12.edge_point = cell_poi_typ;
00327 
00328       if(poi_9.d==Wdir || poi_9.d==Edir)
00329         Act->Add_Bo_freedom(D3vector( 0.0,
00330                                      -0.25+0.5*y1DCoord(poi_2.corner),
00331                                      -0.25+0.5*z1DCoord(poi_2.corner)));
00332       if(poi_9.d==Ndir || poi_9.d==Sdir)
00333         Act->Add_Bo_freedom(D3vector(-0.25+0.5*x1DCoord(poi_2.corner),
00334                                       0.0,
00335                                      -0.25+0.5*z1DCoord(poi_2.corner)));
00336       if(poi_9.d==Tdir || poi_9.d==Ddir)
00337         Act->Add_Bo_freedom(D3vector(-0.25+0.5*x1DCoord(poi_2.corner),
00338                                      -0.25+0.5*y1DCoord(poi_2.corner),
00339                                       0.0));
00340       /*
00341       if(poi_9.d==Wdir || poi_9.d==Edir)
00342         Act->Add_Bo_freedom(D3vector(-0.05+0.1*x1DCoord(poi_2.corner),
00343                                      -0.25+0.5*y1DCoord(poi_2.corner),
00344                                      -0.25+0.5*z1DCoord(poi_2.corner)));
00345       if(poi_9.d==Ndir || poi_9.d==Sdir)
00346         Act->Add_Bo_freedom(D3vector(-0.25+0.5*x1DCoord(poi_2.corner),
00347                                      -0.05+0.1*y1DCoord(poi_2.corner),
00348                                      -0.25+0.5*z1DCoord(poi_2.corner)));
00349       if(poi_9.d==Tdir || poi_9.d==Ddir)
00350         Act->Add_Bo_freedom(D3vector(-0.25+0.5*x1DCoord(poi_2.corner),
00351                                      -0.25+0.5*y1DCoord(poi_2.corner),
00352                                      -0.05+0.1*z1DCoord(poi_2.corner)));
00353       */    
00354       // D Flaeche
00355       Act->Tetraeder(poi_12,poi_5,poi_6,poi_3);
00356       Act->Tetraeder(poi_12,poi_2,poi_5,poi_3);
00357       Act->Tetraeder(poi_12,poi_6,poi_4,poi_3);
00358 
00359       // N Flaeche
00360       Act->Tetraeder(poi_12,poi_10,poi_2,poi_3);
00361       Act->Tetraeder(poi_12,poi_10,poi_9,poi_2);
00362       Act->Tetraeder(poi_12,poi_9,poi_8,poi_2);
00363 
00364       // S Flaeche
00365       Act->Tetraeder(poi_12,poi_11,poi_4,poi_6);
00366 
00367       // T Flaeche
00368       Act->Tetraeder(poi_12,poi_7,poi_8,poi_9);
00369 
00370       // E Flaeche
00371       // Anstelle: Act->Pyramid(poi_12,poi_10,poi_11,poi_2,poi_3);
00372       dirA = poi_10.d;
00373       dirB = direction_from_to(poi_3.corner,poi_4.corner);
00374       if(Calc_f_type(dirA,dirB)==an) {
00375         Act->Tetraeder(poi_12,poi_10,poi_3,poi_4);
00376         Act->Tetraeder(poi_12,poi_10,poi_4,poi_11);
00377       }
00378       else {
00379         Act->Tetraeder(poi_12,poi_11,poi_10,poi_3);
00380         Act->Tetraeder(poi_12,poi_11,poi_3,poi_4);
00381       }
00382 
00383       // W Flaeche
00384       // Anstelle: Act->Pyramid(poi_12,poi_7,poi_8,poi_4,poi_6);
00385       if(Calc_f_type(dirA,dirB)==an) {
00386         Act->Tetraeder(poi_12,poi_8,poi_5,poi_2);
00387         Act->Tetraeder(poi_12,poi_8,poi_7,poi_5);
00388       }
00389       else {
00390         Act->Tetraeder(poi_12,poi_7,poi_2,poi_8);
00391         Act->Tetraeder(poi_12,poi_7,poi_5,poi_2);
00392       }
00393                
00394       // Oberflaeche:
00395       Act->Tetraeder(poi_12,poi_11,poi_7,poi_9);
00396       Act->Tetraeder(poi_12,poi_11,poi_9,poi_10);
00397       // Anstelle: Act->Pyramid(poi_12,poi_7,poi_6,poi_5,poi_11);
00398       // falsch:
00399       //   Act->Tetraeder(poi_12,poi_11,poi_5,poi_7);
00400       //   Act->Tetraeder(poi_12,poi_11,poi_6,poi_5);
00401       Act->Tetraeder(poi_12,poi_11,poi_6,poi_7);
00402       Act->Tetraeder(poi_12,poi_7,poi_6,poi_5);
00403     }
00404     //  Boundary cell : 2.4.
00405     // ----------------------
00406     poi_boA.corner = poi_C2.corner;   
00407     poi_boA.d = direction_from_to(poi_C.corner,poi_A.corner);
00408     LA = Description->edge_point(poi_boA);
00409     if(LA && LD && !LC && !LB) {
00410       stop=true;
00411       poi_7.edge_point = poi_9.edge_point = edge_poi_typ;
00412       poi_8.edge_point = corner_poi_typ;
00413       poi_10.edge_point = edge_poi_typ;
00414       poi_12.edge_point = corner_poi_typ;
00415       poi_11.edge_point = poi_13.edge_point = edge_poi_typ;
00416       // C D
00417       // A B
00418       poi_12 = poi_C2;    poi_10 = poi_boD;
00419                           poi_8  = poi_B2;
00420       
00421       poi_7.corner = poi_8.corner;   
00422       poi_9.corner = poi_8.corner;   
00423       poi_7.d = direction_from_to(poi_B.corner,poi_A.corner);
00424       poi_9.d = direction_from_to(poi_B.corner,poi_D.corner);
00425 
00426       poi_11.corner = poi_12.corner;   
00427       poi_13.corner = poi_12.corner;   
00428       poi_11.d = direction_from_to(poi_C.corner,poi_D.corner);
00429       poi_13.d = direction_from_to(poi_C.corner,poi_A.corner);
00430 
00431       poi_14.edge_point = cell_poi_typ;
00432       /*  old version
00433       Act->Add_Bo_freedom(D3vector(-0.3+0.6*x1DCoord(poi_3.corner),
00434                                    -0.3+0.6*y1DCoord(poi_3.corner),
00435                                    -0.3+0.6*z1DCoord(poi_3.corner)));
00436       */
00437       
00438       Act->Add_Bo_freedom(D3vector(-0.1+0.2*x1DCoord(poi_3.corner),
00439                                    -0.1+0.2*y1DCoord(poi_3.corner),
00440                                    -0.1+0.2*z1DCoord(poi_3.corner)));
00441       
00442       /*
00443       Act->Add_Bo_freedom(D3vector(-0.25+0.5*x1DCoord(poi_3.corner),
00444                                    -0.25+0.5*y1DCoord(poi_3.corner),
00445                                    -0.25+0.5*z1DCoord(poi_3.corner)));
00446       */
00447       // D Flaeche
00448       Act->Tetraeder(poi_14,poi_5,poi_6,poi_3);
00449       Act->Tetraeder(poi_14,poi_2,poi_5,poi_3);
00450       Act->Tetraeder(poi_14,poi_6,poi_4,poi_3);
00451 
00452       // E Flaeche
00453       Act->Tetraeder(poi_14,poi_10,poi_4,poi_9);
00454       Act->Tetraeder(poi_14,poi_10,poi_3,poi_4);
00455       Act->Tetraeder(poi_14,poi_8,poi_9,poi_4);
00456 
00457       // N Flaeche
00458       Act->Tetraeder(poi_14,poi_10,poi_11,poi_2);
00459       Act->Tetraeder(poi_14,poi_10,poi_2,poi_3);
00460       Act->Tetraeder(poi_14,poi_11,poi_12,poi_2);
00461 
00462       // T Flaeche
00463       Act->Tetraeder(poi_14,poi_8,poi_7,poi_9);
00464       Act->Tetraeder(poi_14,poi_13,poi_12,poi_11);
00465 
00466       // S Flaeche
00467       // Anstelle: Act->Pyramid(poi_14,poi_8,poi_7,poi_6,poi_4);
00468       dirA = poi_10.d;
00469       dirB = poi_6.d;
00470       if(Calc_f_type(dirA,dirB)==an) {
00471         Act->Tetraeder(poi_14,poi_8,poi_4,poi_6);
00472         Act->Tetraeder(poi_14,poi_8,poi_6,poi_7);
00473       }
00474       else {
00475         Act->Tetraeder(poi_14,poi_7,poi_8,poi_4);
00476         Act->Tetraeder(poi_14,poi_7,poi_4,poi_6);
00477       }
00478       // W Flaeche
00479       // Anstelle: Act->Pyramid(poi_12,poi_13,poi_5,poi_2,poi_12);
00480       dirA = poi_10.d;
00481       dirB = poi_5.d;
00482       if(Calc_f_type(dirA,dirB)==an) {
00483         Act->Tetraeder(poi_14,poi_12,poi_5,poi_2);
00484         Act->Tetraeder(poi_14,poi_12,poi_13,poi_5);
00485       }
00486       else {
00487         Act->Tetraeder(poi_14,poi_12,poi_13,poi_2);
00488         Act->Tetraeder(poi_14,poi_13,poi_5,poi_2);
00489       }
00490 
00491       // Oberflaeche:
00492       Act->Tetraeder(poi_14,poi_9,poi_11,poi_10);
00493       // Anstelle: Act->Pyramid(poi_14,poi_7,poi_6,poi_5,poi_13);
00494       Act->Tetraeder(poi_14,poi_7,poi_5,poi_13);
00495       Act->Tetraeder(poi_14,poi_7,poi_6,poi_5);
00496 
00497       h_9 = Description->h(poi_9.corner, poi_9.d);
00498       h_7 = Description->h(poi_7.corner, poi_7.d);
00499       h_11 = Description->h(poi_11.corner, poi_11.d);
00500       h_13 = Description->h(poi_13.corner, poi_13.d);
00501 
00502       double H; 
00503       double angle_9;
00504       double angle_7;
00505       double angle_11;
00506       double angle_13;
00507       
00508       H = Description->Meshsize();
00509       
00510       angle_9  = calc_special_angle(h_7,h_9,H-h_11,H-h_9);
00511       angle_7  = calc_special_angle(H-h_13,H-h_7,h_9,h_7);
00512       angle_13 = calc_special_angle(h_11,h_13,H-h_7,H-h_13);
00513       angle_11  = calc_special_angle(H-h_9,H-h_11,h_13,h_11);
00514       
00515       /*
00516       if( (h_7-h_11) < (h_9-h_13) ) {
00517         h_min = (h_7-h_11);
00518         num_min = 9;
00519       }
00520       else {
00521         h_min = (h_9-h_13);
00522         num_min = 7;
00523       }
00524       if( h_min > (h_13-h_9) ) {
00525         h_min = (h_13-h_9);
00526         num_min = 11;
00527       }
00528       if( h_min > (h_11-h_7) ) {
00529         h_min = (h_11-h_7);
00530       }
00531       */      
00532 
00533       // Anstelle von Pyr 14, 7, 13, 11, 9
00534       //      if(num_min==9 || num_min==13) {
00535       if(parallel_version) 
00536         Tell_about_round_of_problem(MAX(angle_7,angle_11),
00537                                     MAX(angle_13,angle_9));
00538       if(MAX(angle_7,angle_11) > MAX(angle_13,angle_9)) {
00539         Act->Tetraeder(poi_14,poi_7,poi_13,poi_11);
00540         Act->Tetraeder(poi_14,poi_7,poi_11,poi_9);
00541       }
00542       else {
00543         Act->Tetraeder(poi_14,poi_7,poi_13,poi_9);
00544         Act->Tetraeder(poi_14,poi_9,poi_13,poi_11);
00545       }
00546     }
00547     
00548     //  Boundary cell : 2.6.
00549     // ----------------------
00550     poi_boA.corner = poi_C2.corner;   
00551     poi_boA.d = direction_from_to(poi_C.corner,poi_A.corner);
00552     LA = Description->edge_point(poi_boA);
00553     if(!LA && LD && !LC && !LB) {
00554       cout << "\n Fall 2.6 Randzelle. Noch nicht getestet! " << endl;
00555 
00556       stop=true;
00557       poi_7.edge_point = poi_9.edge_point = edge_poi_typ;
00558       poi_8.edge_point = poi_10.edge_point = corner_poi_typ;
00559       poi_13.edge_point = corner_poi_typ;
00560       poi_11.edge_point = poi_12.edge_point = edge_poi_typ;
00561       // C D
00562       // A B
00563       poi_13 = poi_C2;    poi_9 = poi_boD;
00564       poi_10  = poi_A2;   poi_8  = poi_B2;
00565       
00566       poi_7.corner = poi_10.corner;   
00567       poi_7.d = direction_from_to(poi_B2.corner,poi_B.corner);
00568 
00569       poi_11.corner = poi_8.corner;   
00570       poi_12.corner = poi_13.corner;   
00571       poi_11.d = direction_from_to(poi_B.corner,poi_D.corner);
00572       poi_12.d = direction_from_to(poi_C.corner,poi_D.corner);
00573 
00574       poi_14.edge_point = cell_poi_typ;
00575       Act->Add_Bo_freedom(D3vector(0.0,0.0,0.0));
00576 
00577       // D Flaeche
00578       Act->Tetraeder(poi_14,poi_5,poi_6,poi_3);
00579       Act->Tetraeder(poi_14,poi_2,poi_5,poi_3);
00580       Act->Tetraeder(poi_14,poi_6,poi_4,poi_3);
00581 
00582       // E Flaeche
00583       Act->Tetraeder(poi_14,poi_11,poi_9,poi_4);
00584       Act->Tetraeder(poi_14,poi_9,poi_3,poi_4);
00585       Act->Tetraeder(poi_14,poi_8,poi_11,poi_4);
00586 
00587       // T Flaeche
00588       Act->Tetraeder(poi_14,poi_12,poi_10,poi_13);
00589       Act->Tetraeder(poi_14,poi_12,poi_11,poi_10);
00590       Act->Tetraeder(poi_14,poi_11,poi_8,poi_10);
00591 
00592       // N Flaeche
00593       Act->Tetraeder(poi_14,poi_12,poi_2,poi_9);
00594       Act->Tetraeder(poi_14,poi_12,poi_13,poi_2);
00595       Act->Tetraeder(poi_14,poi_9,poi_2,poi_3);
00596 
00597       // S Flaeche
00598       Act->Tetraeder(poi_14,poi_8,poi_6,poi_7);
00599       Act->Tetraeder(poi_14,poi_8,poi_4,poi_6);
00600       Act->Tetraeder(poi_14,poi_8,poi_7,poi_10);
00601 
00602       // S Flaeche
00603       Act->Tetraeder(poi_14,poi_13,poi_7,poi_5);
00604       Act->Tetraeder(poi_14,poi_13,poi_5,poi_2);
00605       Act->Tetraeder(poi_14,poi_13,poi_10,poi_7);
00606 
00607       // Oberflaeche
00608       Act->Tetraeder(poi_14,poi_7,poi_6,poi_5);
00609       Act->Tetraeder(poi_14,poi_11,poi_12,poi_9);
00610     }
00611   }
00612 }
00613 
00614 }
00615 
00616 #endif
00617    

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