129 Cerr <<
"ExtrudeParoi ..... " << finl;
133 Cerr <<
"The " << dom.type_elem()->
que_suis_je() <<
"s are not treated with ExtrudeParoi"<<finl;
140 int oldnbsom = dom.
nb_som();
146 Type_Face type_face = dom.type_elem()->type_face(0);
147 lesfaces.
typer(type_face);
150 Static_Int_Lists connectivite_som_elem;
152 const IntTab& elements = dom.
les_elems();
154 construire_connectivite_som_elem(nb_sommets_tot,
156 connectivite_som_elem,
159 Faces_builder faces_builder;
162 connectivite_som_elem,
167 IntTab& faces_voisins = lesfaces.
voisins();
173 DoubleTab normale_som(nbs,3);
175 DoubleVect dmin_som(nbs);
196 som_arete.
resize(3*nbfaces,2);
199 ArrOfInt som_elem(4);
200 ArrOfInt som_face(3);
202 ArrOfDouble pt0(3),pt1(3),pt2(3);
203 ArrOfDouble normale(3),vect_int(3);
211 for (
int i=0; i<nbfaces; i++)
213 int elem=faces_voisins(i+ndeb,0);
214 if (elem==-1) elem=faces_voisins(i+ndeb,1);
216 for(
int j=0; j<4; j++) som_elem[j]=les_elems(elem,j);
217 for(
int j=0; j<3; j++)
219 som_face[j]=sommet(i,j);
225 int stot=som_face[0]+som_face[1]+som_face[2];
227 int som0=min_array(som_face);
228 int som2=max_array(som_face);
229 int som1=stot-som0-som2;
232 som_arete(compt,0)=som0;
233 som_arete(compt,1)=som1;
236 som_arete(compt,0)=som0;
237 som_arete(compt,1)=som2;
240 som_arete(compt,0)=som1;
241 som_arete(compt,1)=som2;
246 for(
int j=0; j<4; j++)
249 for(
int k=0; k<3; k++)
250 if(som_elem[j]==som_face[k]) ok=1;
253 som_ext=som_elem[j] ;
258 for(
int j=0; j<3; j++)
260 pt0[j]=coord(som_face[0],j);
261 pt1[j]=coord(som_face[1],j);
262 pt2[j]=coord(som_face[2],j);
263 vect_int[j]=coord(som_ext,j)-pt0[j];
266 calcul_normal_norme2(pt0,pt1,pt2,normale);
267 double dist_paroi = dotproduct_array(normale,vect_int);
268 if (dist_paroi<0.) normale *=-1.;
270 for(
int k=0; k<3; k++)
273 dmin_som(som) = std::min(dmin_som(som),std::fabs(dist_paroi));
274 for(
int j=0; j<3; j++) normale_som(som,j) += normale[j];
281 calcul_tab_norme(normale_som);
283 Cerr <<
"minimum distance node-wall : "<< dmin_som.
mp_min_vect()<< finl;
284 if(
type) Cerr <<
"thickness of the layer "<< ep_abs[
nb_couche-1] << finl;
288 Cerr <<
"Error !! The thickness of the layer is greater than the minimum distance node-wall" << finl;
295 tri_lexicographique_tableau(som_arete);
296 IntTab som_arete_bord(som_arete.
dimension(0),3);
301 for(
int i=1; i<nba; i++)
303 if( (som_arete(i,0)==som_arete(i-1,0)) && (som_arete(i,1)==som_arete(i-1,1)) ) i++;
306 som_arete_bord(compt,0)=som_arete(i-1,0);
307 som_arete_bord(compt,1)=som_arete(i-1,1);
312 som_arete_bord(compt,0)=som_arete(i,0);
313 som_arete_bord(compt,1)=som_arete(i,1);
321 som_arete_bord.
resize(nba_bord,3);
323 ArrOfInt corresp_bord(nba_bord);
326 for (
int num_front=0; num_front<dom.
nb_front_Cl(); num_front++)
328 const Frontiere& fr=dom.
frontiere(num_front);
336 ArrOfInt som_face(3);
338 for (
int i=0; i<nbfaces; i++)
340 for(
int j=0; j<3; j++) som_face[j]=sommet(i,j);
342 int stot=som_face[0]+som_face[1]+som_face[2];
344 int som0=min_array(som_face);
345 int som2=max_array(som_face);
346 int som1=stot-som0-som2;
348 for(
int j=0; j<nba_bord; j++)
350 if((som_arete_bord(j,0)==som0) && (som_arete_bord(j,1)==som1))
352 som_arete_bord(j,2)=som2;
353 corresp_bord[j]=num_front;
356 if((som_arete_bord(j,0)==som0) && (som_arete_bord(j,1)==som2))
358 som_arete_bord(j,2)=som1;
359 corresp_bord[j]=num_front;
362 if((som_arete_bord(j,0)==som1) && (som_arete_bord(j,1)==som2))
364 som_arete_bord(j,2)=som0;
365 corresp_bord[j]=num_front;
373 if(min_array(corresp_bord)==-1)
375 Cerr <<
"Problem with the boundary edges !!" << finl;
385 ArrOfDouble pt1(3),pt2(3),pt3(3);
386 ArrOfDouble n1(3),n2(3),n_proj(3);
388 for(
int i=0; i<nba_bord; i++)
390 int s1 = som_arete_bord(i,0);
391 int s2 = som_arete_bord(i,1);
392 int s3 = som_arete_bord(i,2);
394 for(
int j=0; j<3; j++)
396 n1[j]=normale_som(s1,j) ;
397 n2[j]=normale_som(s2,j) ;
404 calcul_normal_norme2(pt1,pt2,pt3,n_proj);
405 double ori = dotproduct_array(n1,n_proj);
406 if (ori<0.) n_proj *=-1.;
408 double psc1=dotproduct_array(n1,n_proj);
409 double psc2=dotproduct_array(n2,n_proj);
411 for(
int j=0; j<3; j++)
413 normale_som(s1,j) -= psc1*n_proj[j];
414 normale_som(s2,j) -= psc2*n_proj[j];
422 int nb_som = List_som.
size();
423 int newnbsom = oldnbsom+
nb_couche*nb_som;
425 new_soms.
resize(newnbsom,3);
428 for (
int i=0; i<nb_som; i++)
437 for(
int j=0; j<3; j++)
439 new_soms(oldnbsom+i,j) = new_soms(som,j);
443 new_soms(oldnbsom+(k+1)*nb_som+i,j) = new_soms(som,j)+ep_abs[k]*normale_som(som,j);
444 new_soms(som,j) += ep_abs[
nb_couche-1]*normale_som(som,j);
463 som_front.
resize(nbfaces,3);
467 for (
int i=0; i<nbfaces; i++)
475 int i1=std::min(std::min(s1,s2),s3);
476 int i3=std::max(std::max(s1,s2),s3);
479 int i4=oldnbsom+List_som.
rang(i1);
480 int i5=oldnbsom+List_som.
rang(i2);
481 int i6=oldnbsom+List_som.
rang(i3);
491 int ii1=i4+(k+1)*nb_som;
492 int ii2=i5+(k+1)*nb_som;
493 int ii3=i6+(k+1)*nb_som;
511 new_elems(oldsz+cpt,0) = ii1;
512 new_elems(oldsz+cpt,1) = ii2;
513 new_elems(oldsz+cpt,2) = ii3;
514 new_elems(oldsz+cpt,3) = ii6;
517 new_elems(oldsz+cpt,0) = ii1;
518 new_elems(oldsz+cpt,1) = ii2;
519 new_elems(oldsz+cpt,2) = ii5;
520 new_elems(oldsz+cpt,3) = ii6;
523 new_elems(oldsz+cpt,0) = ii1;
524 new_elems(oldsz+cpt,1) = ii4;
525 new_elems(oldsz+cpt,2) = ii5;
526 new_elems(oldsz+cpt,3) = ii6;
538 les_elems.
ref(new_elems);
542 dom.
typer(
"Tetraedre");
544 Cerr <<
" Reconstruction of the Octree" << finl;
546 Cerr <<
" Octree rebuilt" << finl;
549 Cerr <<
"Reconstruction of the boundaries" << finl;
553 Faces& lesfacesbord=itr.faces();
554 lesfacesbord.
typer(Type_Face::triangle_3D);
558 sommets.
ref(som_front);
562 IntTab som_front2(sommets);
567 for (
int i=0; i<nba_bord; i++)
568 if(corresp_bord[i]==num_front) nbf2++;
574 for (
int i=0; i<nba_bord; i++)
575 if(corresp_bord[i]==num_front)
577 int s1=som_arete_bord(i,0);
578 int s2=som_arete_bord(i,1);
580 int s1_new=oldnbsom+List_som.
rang(s1);
581 int s2_new=oldnbsom+List_som.
rang(s2);
587 int s1_sup=s1_new+(k+1)*nb_som;
588 int s2_sup=s2_new+(k+1)*nb_som;
598 int s1_inf=s1_new+k*nb_som;
599 int s2_inf=s2_new+k*nb_som;
602 som_front2(compt2,0)=s1_sup;
603 som_front2(compt2,1)=s2_sup;
604 som_front2(compt2,2)=s2_inf;
607 som_front2(compt2,0)=s1_sup;
608 som_front2(compt2,1)=s1_inf;
609 som_front2(compt2,2)=s2_inf;
614 sommets.
ref(som_front2);