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

src/expde/formulas/subdiIII.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 // subdiIII.h
00020 //
00021 // ------------------------------------------------------------
00022 
00023 #ifndef SUBDIIII_H_
00024 #define SUBDIIII_H_
00025 
00026 void Act_on_subdivision_partIII(Bo_description* Description, 
00027                                 Calculator_FE* Act,
00028                                 bool* corners, bool& stop) {
00029 
00030   int i;
00031 
00032   Edge_Corner_point poi_1,   poi_2,   poi_3,   poi_4;
00033   Edge_Corner_point poi_5,   poi_6,   poi_7,   poi_8;
00034   Edge_Corner_point poi_9,   poi_10;
00035   Edge_Corner_point poi_A,   poi_B,   poi_C,   poi_D;
00036   Edge_Corner_point poi_A2,  poi_B2,  poi_C2;
00037   Edge_Corner_point poi_oppA,   poi_oppB,   poi_oppC;
00038 
00039   dir_sons    oppA, oppB, oppC;
00040   bool later_stop, LA, LB, LC;
00041   // int ori;
00042 
00043   // leere Initialisierung
00044   // ori = 0;
00045 
00046 
00047 
00048 
00049 
00050 
00051   later_stop = false;
00052 
00053 
00054 
00055 
00056   // stop=true;
00057   //  Boundary cell : 2.2.
00058   // ----------------------
00059   // Dreibein
00060   // Bemerkung: Test ob Kanten im Gebiet nicht notwendig wegen corners
00061   for(i=0;i<8 && !stop;++i) {
00062     // Punkt am Eck des Dreibeins
00063     poi_D.edge_point = corner_poi_typ;
00064     poi_D.corner = (dir_sons)i;
00065 
00066     // Drei Ecken des Dreibeins
00067     poi_oppA.edge_point = poi_oppB.edge_point = 
00068       poi_oppC.edge_point = corner_poi_typ;
00069 
00070     oppA = Next_corner((dir_sons)i,opposite3D(xCoord((dir_sons)i)));
00071     oppB = Next_corner((dir_sons)i,opposite3D(yCoord((dir_sons)i)));
00072     oppC = Next_corner((dir_sons)i,opposite3D(zCoord((dir_sons)i)));
00073 
00074     poi_oppA.corner = oppA;
00075     poi_oppB.corner = oppB;
00076     poi_oppC.corner = oppC;
00077 
00078     // Kantenpunkte des Dreibeins
00079     poi_A.edge_point  = poi_B.edge_point  = poi_C.edge_point  = edge_poi_typ;
00080     poi_A2.edge_point = poi_B2.edge_point = poi_C2.edge_point = edge_poi_typ;
00081 
00082     poi_A.corner  = oppA; poi_A.d  = opposite3D(yCoord((dir_sons)i));
00083     poi_A2.corner = oppA; poi_A2.d = opposite3D(zCoord((dir_sons)i));
00084     poi_B.corner  = oppB; poi_B.d  = opposite3D(xCoord((dir_sons)i));
00085     poi_B2.corner = oppB; poi_B2.d = opposite3D(zCoord((dir_sons)i));
00086     poi_C.corner  = oppC; poi_C.d  = opposite3D(xCoord((dir_sons)i));
00087     poi_C2.corner = oppC; poi_C2.d = opposite3D(yCoord((dir_sons)i));
00088 
00089     if(Description->edge_point(poi_A) && Description->edge_point(poi_A2) &&
00090        Description->edge_point(poi_B) && Description->edge_point(poi_B2) &&
00091        Description->edge_point(poi_C) && Description->edge_point(poi_C2)
00092        && corners[i] && corners[oppA] && corners[oppB] && corners[oppC]) {
00093       corners[i] = corners[oppA] = corners[oppB] = corners[oppC] = false;
00094       //  stop = true;
00095       later_stop = true;
00096       if(((((i>>2)&1) + ((i>>1)&1) + ((i>>0)&1))&1)==0) { // Orientierung 
00097         //  1. Version
00098         poi_10 =  poi_D;
00099 
00100         poi_7  =  poi_oppA;
00101         poi_6  =  poi_A;
00102         poi_8  =  poi_A2;
00103 
00104         poi_4  =  poi_oppB;
00105         poi_3  =  poi_B2;
00106         poi_5  =  poi_B;
00107 
00108         poi_1  =  poi_oppC;
00109         poi_2  =  poi_C2;
00110         poi_9  =  poi_C;
00111       }
00112       else {
00113         //  2. Version
00114         poi_10 =  poi_D;
00115 
00116         poi_7  =  poi_oppA;
00117         poi_6  =  poi_A2;
00118         poi_8  =  poi_A;
00119 
00120         poi_4  =  poi_oppC;
00121         poi_3  =  poi_C2;
00122         poi_5  =  poi_C;
00123 
00124         poi_1  =  poi_oppB;
00125         poi_2  =  poi_B2;
00126         poi_9  =  poi_B;
00127       }
00128 
00129       Act->Tetraeder(poi_10,poi_2,poi_9,poi_1);
00130       Act->Tetraeder(poi_10,poi_6,poi_7,poi_8);
00131       Act->Tetraeder(poi_10,poi_4,poi_5,poi_3);
00132 
00133      LA = Description->h(poi_9.corner, poi_9.d) <
00134           Description->h(poi_2.corner, poi_2.d);
00135      LB = Description->h(poi_3.corner, poi_3.d) <
00136           Description->h(poi_5.corner, poi_5.d);
00137      LC = Description->h(poi_6.corner, poi_6.d) <
00138           Description->h(poi_8.corner, poi_8.d);
00139 
00140 
00141      if(LA && LB && LC) {
00142        Act->Tetraeder(poi_10,poi_8,poi_9,poi_2);
00143        Act->Tetraeder(poi_10,poi_2,poi_3,poi_5);
00144        Act->Tetraeder(poi_10,poi_5,poi_6,poi_8);
00145        Act->Tetraeder(poi_10,poi_8,poi_2,poi_5);
00146      }
00147      else if(!LA && !LB && !LC) {
00148        Act->Tetraeder(poi_10,poi_3,poi_9,poi_2);
00149        Act->Tetraeder(poi_10,poi_5,poi_6,poi_3);
00150        Act->Tetraeder(poi_10,poi_6,poi_8,poi_9);
00151        Act->Tetraeder(poi_10,poi_9,poi_3,poi_6);
00152      }
00153      else {
00154        if(LA && !LC) {
00155          poi_7 = poi_2;  poi_1 = poi_3;
00156          poi_2 = poi_5;  poi_3 = poi_6;
00157          poi_5 = poi_8;  poi_6 = poi_9;
00158          poi_8 = poi_7;  poi_9 = poi_1;
00159        }
00160        if(LB && !LA) {
00161          poi_4 = poi_9;  poi_1 = poi_8;
00162          poi_9 = poi_6;  poi_8 = poi_5;
00163          poi_6 = poi_3;  poi_5 = poi_2;
00164          poi_3 = poi_4;  poi_2 = poi_1;
00165        }
00166        Act->Tetraeder(poi_10,poi_5,poi_8,poi_3);
00167        Act->Tetraeder(poi_10,poi_6,poi_8,poi_5);
00168        if(Description->h(poi_9.corner, poi_9.d) <
00169           Description->h(poi_2.corner, poi_2.d)) {
00170          Act->Tetraeder(poi_10,poi_8,poi_9,poi_2);
00171          Act->Tetraeder(poi_10,poi_3,poi_8,poi_2);
00172        }
00173        else {
00174          Act->Tetraeder(poi_10,poi_3,poi_9,poi_2);
00175          Act->Tetraeder(poi_10,poi_3,poi_8,poi_9);
00176        }
00177      }
00178     }
00179 }
00180 
00181 if(later_stop) stop = true; 
00182 }
00183 
00184 #endif
00185    

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