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

src/expde/formulas/subdiv.cc

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 // subdiv.cc
00020 // ruft spaeter subdivI.h subdivII.h subdivIII.h subdivIV.h auf
00021 //
00022 // ------------------------------------------------------------
00023 
00024 // Include level 0:
00025 #ifdef COMP_GNUOLD
00026  #include <iostream.h>
00027  #include <fstream.h>
00028  #include <time.h>
00029  #include <math.h>
00030 #else
00031  #include <iostream>
00032  #include <fstream>
00033  #include <ctime>
00034  #include <cmath>
00035 #endif 
00036 
00037 
00038 // Include level 0:
00039 #include "../parser.h"
00040 
00041 // Include level 1:
00042 #include "../paramete.h"
00043 #include "../abbrevi.h"
00044 #include "../math_lib/math_lib.h"
00045 
00046 // Include level 4:
00047 #include "../formulas/boundy.h"
00048 #include "subdiv.h"
00049 
00050 
00051 
00053 // Funktion die eine Randzelle in 
00054 // Tetraeder zerlegt
00056 
00057 /* 
00058     Function which calculates angle angle(P1,P3,P2) 
00059     P1 x            x  P2
00060        |            |
00061     s1 |            |  s2
00062        |            |
00063        x-----x------x
00064       P4     P3     P5
00065           s3    s4
00066 
00067 */
00068 
00069 double calc_special_angle(double s1, double  s3, double s2, double s4) {
00070   return 180.0 - (my_atan(s1/s3) + my_atan(s2/s4)) / M_PI * 180.0; 
00071 }
00072 
00073 // devisions for prism:
00074 // these functions give back the type of the face
00075 // (P_5,P_2,P_1,P_4) at the point P_1
00076                    
00077 // Zerlegung eines Prismas in Tetraeder
00078 // Nimm immer 1. Version
00079 f_type Act_on_Prism(Bo_description* Description, Calculator_FE* Act,
00080                   f_type x_face_type, f_type y_face_type,
00081                   Edge_Corner_point poi_0, Edge_Corner_point poi_1, 
00082                   Edge_Corner_point poi_2, Edge_Corner_point poi_3,
00083                   Edge_Corner_point poi_4, Edge_Corner_point poi_5) {
00084   if(x_face_type==an && y_face_type==an) {
00085     Act->Tetraeder(poi_0,poi_2,poi_3,poi_1);
00086     Act->Tetraeder(poi_2,poi_3,poi_1,poi_4);
00087     Act->Tetraeder(poi_5,poi_3,poi_2,poi_4);
00088     return an;
00089   }
00090   if(x_face_type==spitz && y_face_type==an) {
00091     Act->Tetraeder(poi_2,poi_0,poi_1,poi_4);
00092     Act->Tetraeder(poi_3,poi_0,poi_2,poi_4);
00093     Act->Tetraeder(poi_5,poi_3,poi_2,poi_4);
00094     return an;
00095   }
00096   if(x_face_type==an && y_face_type==spitz) {
00097     Act->Tetraeder(poi_5,poi_3,poi_0,poi_1);
00098     Act->Tetraeder(poi_2,poi_5,poi_0,poi_1);
00099     Act->Tetraeder(poi_4,poi_5,poi_1,poi_3);
00100     return spitz;
00101   }
00102   //  if(x_face_type==spitz && y_face_type==spitz) {
00103   Act->Tetraeder(poi_5,poi_2,poi_1,poi_0);
00104   Act->Tetraeder(poi_5,poi_3,poi_0,poi_4);
00105   Act->Tetraeder(poi_1,poi_5,poi_0,poi_4);    
00106   return spitz;
00107   //  }
00108 }
00109 
00110 // Zerlegung eines Prismas in Tetraeder
00111 // Nimm immer beste Version
00112 f_type Act_on_Prism_best(Bo_description* Description, Calculator_FE* Act,
00113                   f_type x_face_type, f_type y_face_type,
00114                   Edge_Corner_point poi_0, Edge_Corner_point poi_1, 
00115                   Edge_Corner_point poi_2, Edge_Corner_point poi_3,
00116                   Edge_Corner_point poi_4, Edge_Corner_point poi_5) {
00117   if(developer_version) {
00118     if(poi_2.edge_point!=edge_poi_typ ||
00119        poi_1.edge_point!=edge_poi_typ ||
00120        poi_4.edge_point!=edge_poi_typ ||
00121        poi_5.edge_point!=edge_poi_typ)
00122       cout << " \n Mistake in Act_on_Prism_best ! \n ";
00123   }
00124 
00125   if(x_face_type==an && y_face_type==an) {
00126     if(parallel_version)
00127       Tell_about_round_of_problem(Description->h(poi_2.corner, poi_2.d),
00128                                   Description->h(poi_1.corner, poi_1.d));
00129     if(Description->h(poi_2.corner, poi_2.d) >
00130        Description->h(poi_1.corner, poi_1.d)) {
00131       Act->Tetraeder(poi_0,poi_2,poi_3,poi_1);
00132       Act->Tetraeder(poi_2,poi_3,poi_1,poi_4);
00133       Act->Tetraeder(poi_5,poi_3,poi_2,poi_4);
00134       return an;
00135     }
00136     else  {
00137       Act->Tetraeder(poi_0,poi_2,poi_3,poi_1);
00138       Act->Tetraeder(poi_2,poi_3,poi_1,poi_5);
00139       Act->Tetraeder(poi_5,poi_3,poi_1,poi_4);
00140       return spitz;
00141     }
00142   }
00143   if(x_face_type==spitz && y_face_type==an) {
00144     Act->Tetraeder(poi_2,poi_0,poi_1,poi_4);
00145     Act->Tetraeder(poi_3,poi_0,poi_2,poi_4);
00146     Act->Tetraeder(poi_5,poi_3,poi_2,poi_4);
00147     return an;
00148   }
00149   if(x_face_type==an && y_face_type==spitz) {
00150     Act->Tetraeder(poi_5,poi_3,poi_0,poi_1);
00151     Act->Tetraeder(poi_2,poi_5,poi_0,poi_1);
00152     Act->Tetraeder(poi_4,poi_5,poi_1,poi_3);
00153     return spitz;
00154   }
00155   //  if(x_face_type==spitz && y_face_type==spitz) {
00156   if(parallel_version)
00157       Tell_about_round_of_problem(Description->h(poi_5.corner, poi_5.d),
00158                                   Description->h(poi_4.corner, poi_4.d));
00159   if(Description->h(poi_5.corner, poi_5.d) >
00160      Description->h(poi_4.corner, poi_4.d)) {
00161     Act->Tetraeder(poi_5,poi_2,poi_1,poi_0);
00162     Act->Tetraeder(poi_5,poi_3,poi_0,poi_4);
00163     Act->Tetraeder(poi_1,poi_5,poi_0,poi_4);    
00164     return spitz;
00165   }
00166   else {
00167     Act->Tetraeder(poi_5,poi_2,poi_4,poi_0);
00168     Act->Tetraeder(poi_5,poi_3,poi_0,poi_4);
00169     Act->Tetraeder(poi_1,poi_2,poi_0,poi_4);    
00170     return an;
00171   }
00172 
00173 
00174   //  }
00175 }
00176 
00177 // Zerlegung eines Prismas in Tetraeder
00178 // Take version which is better for |01| < |02|
00179 //                          and for |34| < |35|
00180 f_type Act_on_Prism_short(Bo_description* Description, Calculator_FE* Act,
00181                   f_type x_face_type, f_type y_face_type,
00182                   Edge_Corner_point poi_0, Edge_Corner_point poi_1, 
00183                   Edge_Corner_point poi_2, Edge_Corner_point poi_3,
00184                   Edge_Corner_point poi_4, Edge_Corner_point poi_5) {
00185   if(x_face_type==an && y_face_type==an) {
00186     Act->Tetraeder(poi_0,poi_2,poi_3,poi_1);
00187     Act->Tetraeder(poi_2,poi_3,poi_1,poi_4);
00188     Act->Tetraeder(poi_5,poi_3,poi_2,poi_4);
00189     return an;
00190   }
00191   if(x_face_type==spitz && y_face_type==an) {
00192     Act->Tetraeder(poi_2,poi_0,poi_1,poi_4);
00193     Act->Tetraeder(poi_3,poi_0,poi_2,poi_4);
00194     Act->Tetraeder(poi_5,poi_3,poi_2,poi_4);
00195     return an;
00196   }
00197   if(x_face_type==an && y_face_type==spitz) {
00198     Act->Tetraeder(poi_5,poi_3,poi_0,poi_1);
00199     Act->Tetraeder(poi_2,poi_5,poi_0,poi_1);
00200     Act->Tetraeder(poi_4,poi_5,poi_1,poi_3);
00201     return spitz;
00202   }
00203   //  if(x_face_type==spitz && y_face_type==spitz) {
00204   Act->Tetraeder(poi_5,poi_2,poi_1,poi_0);
00205   Act->Tetraeder(poi_5,poi_3,poi_0,poi_4);
00206   Act->Tetraeder(poi_1,poi_5,poi_0,poi_4);    
00207   return spitz;
00208   //  }
00209 }
00210 
00211 // Zerlegung eines Prismas in Tetraeder
00212 // Take version which is better for |01| > |02|
00213 //                          and for |34| > |35|
00214 f_type Act_on_Prism_long(Bo_description* Description, Calculator_FE* Act,
00215                   f_type x_face_type, f_type y_face_type,
00216                   Edge_Corner_point poi_0, Edge_Corner_point poi_1, 
00217                   Edge_Corner_point poi_2, Edge_Corner_point poi_3,
00218                   Edge_Corner_point poi_4, Edge_Corner_point poi_5) {
00219   if(x_face_type==an && y_face_type==an) {
00220     Act->Tetraeder(poi_0,poi_2,poi_3,poi_1);
00221     Act->Tetraeder(poi_2,poi_3,poi_1,poi_5);
00222     Act->Tetraeder(poi_5,poi_3,poi_1,poi_4);
00223     return spitz;
00224   }
00225   if(x_face_type==spitz && y_face_type==an) {
00226     Act->Tetraeder(poi_2,poi_0,poi_1,poi_4);
00227     Act->Tetraeder(poi_3,poi_0,poi_2,poi_4);
00228     Act->Tetraeder(poi_5,poi_3,poi_2,poi_4);
00229     return an;
00230   }
00231   if(x_face_type==an && y_face_type==spitz) {
00232     Act->Tetraeder(poi_5,poi_3,poi_0,poi_1);
00233     Act->Tetraeder(poi_2,poi_5,poi_0,poi_1);
00234     Act->Tetraeder(poi_4,poi_5,poi_1,poi_3);
00235     return spitz;
00236   }
00237   //  if(x_face_type==spitz && y_face_type==spitz) {
00238   Act->Tetraeder(poi_5,poi_2,poi_4,poi_0);
00239   Act->Tetraeder(poi_5,poi_3,poi_0,poi_4);
00240   Act->Tetraeder(poi_1,poi_2,poi_0,poi_4);    
00241   return an;
00242   //  }
00243 }
00244 
00245 
00246 #include "subdivI.h"
00247 #include "subdivII.h"
00248 #include "subdiIII.h"
00249 #include "subdivIV.h"
00250 
00251 // Zerlegung der Randzelle
00252 void Act_on_subdivision(Bo_description* Description, Calculator_FE* Act) {
00253   int i;
00254   bool corners[8];
00255   bool stop;
00256 
00257   // Vorbereitung Infos ueber Ecken setzen:
00258   // Wichtig fuer doppelte Randzellen!
00259   for(i=0;i<8;++i) 
00260     corners[i] = Description->corner_point((dir_sons)i);
00261 
00262   Act_on_subdivision_partI(Description,Act,corners);
00263   // Entscheidung ob noch weitere Ecken behandelt werden muessen
00264   stop = true;
00265   for(i=0;i<8;++i) if(corners[i]) stop = false;
00266   Act_on_subdivision_partII(Description,Act,corners,stop);
00267   Act_on_subdivision_partIII(Description,Act,corners,stop);
00268   Act_on_subdivision_partIV(Description,Act,corners,stop);
00269 };
00270 
00271 
00273 //  Memberfunktion
00275 
00276 
00277 void Calculator_FE::Tetraeder(Edge_Corner_point p0, Edge_Corner_point p1,
00278                               Edge_Corner_point p2, Edge_Corner_point p3) { 
00279   if(p0.edge_point!=edge_poi_typ &&
00280      p1.edge_point==edge_poi_typ &&
00281      p2.edge_point==edge_poi_typ &&
00282      p3.edge_point==edge_poi_typ) {
00283     bo_cell->Add_Tetraeder_bo(bo_desc,
00284                               bo_desc->Num(p2),bo_desc->Num(p1),
00285                               bo_desc->Num(p3),bo_desc->Num(p0));
00286   }
00287   else if(p0.edge_point==edge_poi_typ &&
00288           p1.edge_point!=edge_poi_typ &&
00289           p2.edge_point==edge_poi_typ &&
00290           p3.edge_point==edge_poi_typ) {
00291     bo_cell->Add_Tetraeder_bo(bo_desc,
00292                               bo_desc->Num(p2),bo_desc->Num(p3),
00293                               bo_desc->Num(p0),bo_desc->Num(p1));
00294   }
00295   else if(p0.edge_point==edge_poi_typ &&
00296           p1.edge_point==edge_poi_typ &&
00297           p2.edge_point!=edge_poi_typ &&
00298           p3.edge_point==edge_poi_typ) {
00299     bo_cell->Add_Tetraeder_bo(bo_desc,
00300                               bo_desc->Num(p0),bo_desc->Num(p3),
00301                               bo_desc->Num(p1),bo_desc->Num(p2));
00302   }
00303   else if(p0.edge_point==edge_poi_typ &&
00304           p1.edge_point==edge_poi_typ &&
00305           p2.edge_point==edge_poi_typ &&
00306           p3.edge_point!=edge_poi_typ) {
00307     bo_cell->Add_Tetraeder_bo(bo_desc,
00308                               bo_desc->Num(p0),bo_desc->Num(p1),
00309                               bo_desc->Num(p2),bo_desc->Num(p3));
00310   }
00311   else
00312     bo_cell->Add_Tetraeder(bo_desc,
00313                            bo_desc->Num(p0),bo_desc->Num(p1),
00314                            bo_desc->Num(p2),bo_desc->Num(p3));
00315 }

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