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

src/expde/domain/sca_dom.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 // sca_dom.cc
00020 //
00021 // ------------------------------------------------------------
00022 
00023 
00024 // Include level 0:
00025 #ifdef COMP_GNUOLD
00026  #include <iostream.h>
00027  #include <fstream.h>
00028  #include <strstream.h>
00029  #include <math.h>
00030  #define Problemzeile istrstream line(zeile,100);
00031 #else
00032  #include <iostream>
00033  #include <fstream>
00034  #include <sstream> 
00035  #include <cmath>
00036  #define Problemzeile std::istringstream line(zeile,std::ios::in);
00037 #endif 
00038 
00039 
00040 
00041 
00042 
00043 // Include level 1:
00044 #include "../paramete.h"
00045 #include "../abbrevi.h"
00046 #include "../math_lib/math_lib.h"
00047 
00048 // Include level 2:
00049 #include "../basic/basic.h"
00050 
00051 // Include level 3:
00052 #include "../domain/domain.h"
00053 #include "../domain/sca_dom.h"
00054 
00055 Scat_domain::Scat_domain(int number) {
00056   sample = new D3vector[number];
00057   normal = new D3vector[number];
00058   punkte = number;
00059 }
00060 
00061 Six_corner_pyramid::Six_corner_pyramid(
00062                     D3vector top1, D3vector top2, D3vector top3, 
00063                     D3vector top4, D3vector top5, D3vector top6,
00064                     D3vector down1, D3vector down2, D3vector down3, 
00065                     D3vector down4, D3vector down5, D3vector down6) :
00066   Scat_domain(8) {
00067   double normV;
00068 
00069   // 1.Step Calc border
00070   bordermax = top1;
00071   bordermax = MAX(top1,bordermax);
00072   bordermax = MAX(top2,bordermax);
00073   bordermax = MAX(top3,bordermax);
00074   bordermax = MAX(top4,bordermax);
00075   bordermax = MAX(top5,bordermax);
00076   bordermax = MAX(top6,bordermax);
00077 
00078   bordermax = MAX(down1,bordermax);
00079   bordermax = MAX(down2,bordermax);
00080   bordermax = MAX(down3,bordermax);
00081   bordermax = MAX(down4,bordermax);
00082   bordermax = MAX(down5,bordermax);
00083   bordermax = MAX(down6,bordermax);
00084 
00085   bordermin = top1;
00086   bordermin = MIN(top1,bordermin);
00087   bordermin = MIN(top2,bordermin);
00088   bordermin = MIN(top3,bordermin);
00089   bordermin = MIN(top4,bordermin);
00090   bordermin = MIN(top5,bordermin);
00091   bordermin = MIN(top6,bordermin);
00092 
00093   bordermin = MIN(down1,bordermin);
00094   bordermin = MIN(down2,bordermin);
00095   bordermin = MIN(down3,bordermin);
00096   bordermin = MIN(down4,bordermin);
00097   bordermin = MIN(down5,bordermin);
00098   bordermin = MIN(down6,bordermin);
00099 
00100 
00101   // 2.Step Calc bounding cube
00102   H    = L_infty(bordermax-bordermin)*Bounding_cube_enlargement;
00103   VecH = (bordermax-bordermin)*Bounding_cube_enlargement;
00104   A = (bordermin+bordermax - VecH)/2;
00105   
00106   // 3.Step Calc normal and sample
00107   // top
00108   sample[0] = top1;
00109   normal[0] = cross_product(top2-top1,   top4-top1);
00110 
00111   // down
00112   sample[1] = down1;
00113   normal[1] = cross_product(down4-down1, down2-down1);
00114 
00115   // sides
00116   sample[2] = top1;
00117   normal[2] = cross_product(down2-top1,   top2-top1);
00118 
00119   sample[3] = top2;
00120   normal[3] = cross_product(down3-top2,   top3-top2);
00121 
00122   sample[4] = top3;
00123   normal[4] = cross_product(down4-top3,   top4-top3);
00124 
00125   sample[5] = top4;
00126   normal[5] = cross_product(down5-top4,   top5-top4);
00127 
00128   sample[6] = top5;
00129   normal[6] = cross_product(down6-top5,   top6-top5);
00130 
00131   sample[7] = top6;
00132   normal[7] = cross_product(down1-top6,   top1-top6);
00133 
00134 
00135   for(int i=0;i<8;++i) {
00136     normV = norm(normal[i]);
00137     normal[i] = normal[i] / normV;
00138   }
00139 
00140 }
00141 
00142 
00143 
00144 Scat_domain::Scat_domain(ifstream& Datei)
00145 {
00146     // 1.Step: Count number of samples
00147     char zeile[100];
00148     bordermax = D3vector(-9.999e9);
00149     bordermin = D3vector(9.999e9);
00150   
00151     punkte = 0;
00152     do {
00153       Datei.getline(zeile,100);
00154       if ((zeile[0]==' ' || zeile[0]=='-') &&
00155           (zeile[1]>='0' && zeile[1]<='9')) punkte++;
00156     }
00157     while ( !Datei.eof() );
00158     // 2.Step: initialze storage
00159     sample = new D3vector[punkte];
00160     normal = new D3vector[punkte];
00161     // 3.Step: read samples
00162     Datei.clear();  // clear EOF-bit
00163     Datei.seekg(0); // reset readpointer to beginning
00164     punkte = 0;
00165     char c; // dummy
00166 
00167     // ada std::_Ios_Openmode openMode = std::ios_base::in;;
00168 
00169     do {
00170       Datei.getline( zeile,100 );
00171       if ((zeile[0]==' ' || zeile[0]=='-') && (zeile[1]>='0' && zeile[1]<='9'))
00172         {
00173           Problemzeile
00174           line >> sample[punkte].x >> c >> sample[punkte].y >> c 
00175                >> sample[punkte].z >> c;
00176           line >> normal[punkte].x >> c >> normal[punkte].y >> c 
00177                >> normal[punkte].z;
00178           bordermax.x = 
00179             (bordermax.x<sample[punkte].x)?sample[punkte].x:bordermax.x;
00180           bordermax.y = 
00181             (bordermax.y<sample[punkte].y)?sample[punkte].y:bordermax.y;
00182           bordermax.z = 
00183             (bordermax.z<sample[punkte].z)?sample[punkte].z:bordermax.z;
00184           bordermin.x =
00185             (bordermin.x>sample[punkte].x)?sample[punkte].x:bordermin.x;
00186           bordermin.y = 
00187             (bordermin.y>sample[punkte].y)?sample[punkte].y:bordermin.y;
00188           bordermin.z = 
00189             (bordermin.z>sample[punkte].z)?sample[punkte].z:bordermin.z;
00190           punkte++;
00191         }
00192     }
00193     while ( !Datei.eof() );
00194     // 4.Step: Calc bounding cube
00195     H = L_infty(bordermax-bordermin)*Bounding_cube_enlargement;
00196     A = (bordermin+bordermax-D3vector(H))/2;
00197     
00198     bordermin = bordermin -
00199       D3vector(H * (1.0 - 1.0/Bounding_cube_enlargement));
00200     bordermax = bordermax +
00201       D3vector(H * (1.0 - 1.0/Bounding_cube_enlargement));
00202 
00203     // 5.Step: Set n_uniform
00204     n_uniform = 3;  // ????
00205     return;
00206 };
00207 
00208 bool Scat_domain::point_in_domain(D3vector V)
00209 {
00210   if(!(bordermin<V && V<bordermax)) return false;
00211     D3vector delta;
00212     double dist;
00213 
00214     /* version zahn
00215     delta=V-sample[0];
00216     d2min=product(delta,delta);
00217     dist=product(delta,normal[0]);
00218     for (int i=1;i<punkte;i++) {
00219       delta=V-sample[i];
00220       d2=product(delta,delta);
00221       if (d2<d2min) {
00222         d2min=d2;
00223         dist=product(delta,normal[i]);
00224       }
00225     }
00226     return (dist<0.0);
00227     */
00228 
00229     for(int i=0;i<punkte;i++) {
00230       delta=V-sample[i];
00231       dist=product(delta,normal[i]);
00232       if(dist>=0.0) return false;
00233     }
00234     return true;
00235 }
00236 
00237 double Scat_domain::distance(D3vector V, dir_3D d) {
00238   if(!(bordermin<V && V<bordermax)) return -100.0;
00239 
00240   D3vector dir_vector,delta,normal_vec, normal_vec2;
00241   switch (d)
00242     {
00243     case Wdir: dir_vector=D3vector(-1,0,0); break;
00244     case Edir: dir_vector=D3vector(1,0,0); break;
00245     case Sdir: dir_vector=D3vector(0,-1,0); break;
00246     case Ndir: dir_vector=D3vector(0,1,0); break;
00247     case Ddir: dir_vector=D3vector(0,0,-1); break;
00248     default: dir_vector=D3vector(0,0,1);
00249     }
00250 
00251   double dis_R, dis_R_new, dist, prod_dir_nor;
00252   dis_R = 4.0*H;
00253   for(int i=0;i<punkte;i++) {
00254     prod_dir_nor = product(dir_vector,normal[i]);
00255     if(prod_dir_nor > 0) {
00256       delta=V-sample[i];
00257       dist=product(delta,normal[i]);
00258       dis_R_new = -dist/prod_dir_nor;
00259 
00260       if(dis_R_new<dis_R)
00261         dis_R = dis_R_new;
00262     }
00263   }
00264   return dis_R;
00265   
00266 
00267   /* Version zahn
00268   double dist, d2, d2min, d2min_in_dom, dist_in_dom;
00269 
00270   dist = -100.0;
00271   dist_in_dom = 10;
00272   
00273   delta=V-sample[0];
00274   d2min=product(delta,delta);
00275   
00276   d2min = 10e10;
00277   d2min_in_dom = 10e10;
00278   for (int i=0;i<punkte;i++) {
00279     delta=V-sample[i];
00280     d2=product(delta,delta);
00281     normal_vec2=normal[i];
00282     if(d2<d2min_in_dom) {
00283       d2min_in_dom=d2;
00284       dist_in_dom=product(delta,normal[i]);
00285     }
00286     //      if(d2<d2min && product(dir_vector,normal_vec2)>0.0) {
00287     //      if(d2<d2min && product(dir_vector,normal_vec2)>0.1) {
00288     if(d2<d2min && product(dir_vector,normal_vec2)>0.01) {
00289       d2min=d2;
00290       normal_vec = normal_vec2;
00291       dist=product(delta,normal[i]);
00292     }
00293   }
00294   
00295   //    return 0.0;
00296   
00297   if(developer_version) {
00298     if(product(dir_vector,normal_vec)<0.0
00299        && point_in_domain(V)) {
00300       cout << " \n Mistake wrong direction" << dist << endl;
00301     }
00302   }
00303   
00304   if(dist_in_dom < 0.0)
00305     return -dist/product(dir_vector,normal_vec);
00306   else return -100.0;
00307   */
00308 }

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