00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
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
00039 #include "../parser.h"
00040
00041
00042 #include "../paramete.h"
00043 #include "../abbrevi.h"
00044 #include "../math_lib/math_lib.h"
00045
00046
00047 #include "../formulas/boundy.h"
00048 #include "subdiv.h"
00049
00050
00051
00053
00054
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
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
00074
00075
00076
00077
00078
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
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
00111
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
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
00178
00179
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
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
00212
00213
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
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
00252 void Act_on_subdivision(Bo_description* Description, Calculator_FE* Act) {
00253 int i;
00254 bool corners[8];
00255 bool stop;
00256
00257
00258
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
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
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 }