2 // C++ : Fonctions utilitaires de Hexa
4 // Copyright (C) 2009-2016 CEA/DEN, EDF R&D
6 // This library is free software; you can redistribute it and/or
7 // modify it under the terms of the GNU Lesser General Public
8 // License as published by the Free Software Foundation; either
9 // version 2.1 of the License, or (at your option) any later version.
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 // Lesser General Public License for more details.
16 // You should have received a copy of the GNU Lesser General Public
17 // License along with this library; if not, write to the Free Software
18 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
23 #include "hexa_base.hxx"
34 // ========================================================= niv_debug
37 static int debug_level = NOTHING;
38 if (debug_level == NOTHING)
40 cpchar rep = getenv ("HEXA_DB");
42 debug_level = atoi (rep);
43 debug_level = std::max (debug_level, 0);
47 // ========================================================= on_debug
50 return niv_debug () > 0;
52 // ========================================================= in_test
55 static int test_level = NOTHING;
56 if (test_level == NOTHING)
58 cpchar rep = getenv ("HEXA_TEST");
60 test_level = atoi (rep);
61 test_level = std::max (test_level, 0);
63 return test_level > 0;
66 // ======================================================== set_minus
67 void set_minus (string& chaine)
69 int lg = chaine.size();
70 for (int nc=0 ; nc<lg ; nc++)
71 chaine [lg] = tolower (chaine[lg]);
73 // ======================================================== get_temp_name
74 pchar get_temp_name (cpchar format, pchar nomfic)
80 sprintf (nomfic, format, nro);
83 int rep = stat (nomfic, &buffer);
88 // ========================================================= prod_scalaire
89 double prod_scalaire (double v1[], double v2[])
91 double prod = v1[dir_x]*v2[dir_x] + v1[dir_y]*v2[dir_y]
92 + v1[dir_z]*v2[dir_z];
95 // ========================================================= calc_norme
96 double calc_norme (double vect[])
98 double norme = vect[dir_x]*vect[dir_x] + vect[dir_y]*vect[dir_y]
99 + vect[dir_z]*vect[dir_z];
102 // ======================================================== calc_distance
103 double calc_distance (double v1[], double v2[])
105 Real3 vv = { v2[dir_x]-v1[dir_x], v2[dir_y]-v1[dir_y], v2[dir_z]-v1[dir_z] };
106 return calc_norme (vv);
108 // ======================================================== calc_d2
109 double calc_d2 (double v1[], double v2[])
111 double dd = carre (v2[dir_x]-v1[dir_x]) + carre (v2[dir_y]-v1[dir_y])
112 + carre (v2[dir_z]-v1[dir_z]);
115 // ========================================================= calc_vecteur
116 void calc_vecteur (double pta[], double ptb[], double vab[])
118 vab [dir_x] = ptb [dir_x] - pta [dir_x];
119 vab [dir_y] = ptb [dir_y] - pta [dir_y];
120 vab [dir_z] = ptb [dir_z] - pta [dir_z];
122 // ========================================================= copy_vecteur
123 void copy_vecteur (double va[], double vb[])
125 vb [dir_x] = va [dir_x];
126 vb [dir_y] = va [dir_y];
127 vb [dir_z] = va [dir_z];
129 // ========================================================= calc_milieu
130 void calc_milieu (double pta[], double ptb[], double milieu[])
132 milieu [dir_x] = (ptb [dir_x] + pta [dir_x])/2.0;
133 milieu [dir_y] = (ptb [dir_y] + pta [dir_y])/2.0;
134 milieu [dir_z] = (ptb [dir_z] + pta [dir_z])/2.0;
136 // ========================================================= normer_vecteur
137 int normer_vecteur (double vect[])
139 double dn = calc_norme (vect);
148 // ========================================================= prod_vectoriel
149 double* prod_vectoriel (double v1[], double v2[], double prod[])
151 prod [dir_x] = v1[dir_y] * v2[dir_z] - v2[dir_y] * v1[dir_z];
152 prod [dir_y] = v1[dir_z] * v2[dir_x] - v2[dir_z] * v1[dir_x];
153 prod [dir_z] = v1[dir_x] * v2[dir_y] - v2[dir_x] * v1[dir_y];
157 // ====================================================== carre
158 double carre (double val)
162 // ====================================================== same_coords
163 bool same_coords (double* pa, double* pb, double epsilon2)
165 double d2 = carre (pb[dir_x]-pa[dir_x]) + carre (pb[dir_y]-pa[dir_y])
166 + carre (pb[dir_z]-pa[dir_z]);
167 return d2 < epsilon2;
169 // ========================================================= prod_mixte
170 double prod_mixte (double vi[], double vj[], double vk[])
174 for (int nc=0 ; nc<DIM3 ; nc++)
176 int nc1 = (nc + 1) MODULO DIM3;
177 int nc2 = (nc + 2) MODULO DIM3;
178 pmixte += vk[nc] * (vi [nc1] * vj [nc2] - vj [nc1] * vi [nc2]);
183 // ========================================================= fatal_error
184 void fatal_error (cpchar format, cpchar info1, cpchar info2)
187 sprintf (buffer, format, info1, info2);
189 printf ("**** %s\n", buffer);
192 printf (" ............ Erreur fatale\n");
197 static int current_option = NOTHING;
198 // ====================================================== special_option
199 bool special_option ()
201 if (current_option == NOTHING)
203 cpchar rep = getenv ("HEXA_OPTION");
205 current_option = atoi (rep);
206 current_option = std::max (current_option, 0);
208 return current_option > 0;
210 // ====================================================== set_special_option
211 void set_special_option (bool opt)
213 current_option = opt ? 1 : 0;
215 // ====================================================== sizeof_file
216 int sizeof_file (cpchar filename)
220 int ier = stat (filename, &status);
222 return status.st_size;
226 // ====================================================== read_file
227 char* read_file (cpchar filename, int& size)
232 int ier = stat (filename, &status);
236 FILE* fic = fopen (filename, "r");
240 int lgalloc = status.st_size;
241 char* buffer = (char*) malloc (lgalloc+1);
245 for (int car = fgetc (fic) ; car!=EOF && size<lgalloc ; car = fgetc(fic))
246 buffer [size++] = car;
249 printf ("read_file : lgalloc=%d, size=%d\n", lgalloc, size);
250 buffer [size++] = EOS;
253 // ====================================================== get_time
254 cpchar get_time (string& buffer)
259 struct tm *temps = localtime (&tps);
261 sprintf (quand, "%d/%02d/%02d %02d:%02d:%02d",
262 1900 + temps->tm_year, temps->tm_mon+1, temps->tm_mday,
263 temps->tm_hour, temps->tm_min, temps->tm_sec);
266 return buffer.c_str();
268 // ======================================================== requals
269 bool requals (const double v1, const double v2)
271 static const double Epsilon = 1e-6;
272 return v1 >= v2 - Epsilon && v1 <= v2 + Epsilon;
274 // ======================================================== requals
275 bool requals (const double* lun, const double* lautre)
277 return lun!=NULL && lautre!=NULL && requals (lun [0], lautre [0])
278 && requals (lun [1], lautre [1]) && requals (lun [2], lautre [2]) ;
280 // ======================================================== make_basename
281 int make_basename (cpchar filename, string& base)
283 const char slash = '/';
284 const char antis = '\\';
285 int lg = strlen (filename);
290 for (int nc = lg-1 ; more && nc>=0 ; --nc)
292 char car = filename[nc];
293 if (car==slash || car==antis)
312 for (int nc=ideb ; nc <= ifin ; ++nc)
313 base += filename[nc];