58 ArrOfDouble origine,point1,point2,point3;
60 double epaisseur = -123.;
72 param.
ajouter(
"point3",&point3);
79 bool via_extraire_surface =
false;
80 bool inverse_condition_element =
false;
81 param.
ajouter_flag(
"via_extraire_surface",&via_extraire_surface);
83 param.
ajouter_flag(
"inverse_condition_element",&inverse_condition_element);
88 param.
ajouter(
"avec_certains_bords_pour_extraire_surface",&bords);
98 for (
int dir=0; dir<3; dir++)
100 point3[dir]=(point1[dir]+point2[dir])/2.;
102 point3[dir]=point1[dir]+point2[dir]-origine[dir];
106 if (via_extraire_surface)
109 ArrOfDouble normal(3);
110 calcul_normal_norme(origine,point1,point2,normal);
113 for (
int dir=0; dir<3; dir++)
114 dx+=normal[dir]*origine[dir];
121 out <<
" { domaine "<<nom_dom <<
" probleme "<<nom_pb <<finl;
122 out<<
" condition_elements (" <<-dx ;
123 for (
int dir=0; dir<3; dir++)
125 out<<
"+"<<axes[dir]<<
"*("<<normal[dir]<<
")";
126 if (inverse_condition_element)
130 out<<
" condition_faces (";
131 for (
int ori=0; ori<2; ori++)
134 ArrOfDouble& A=(ori==0?origine:point3);
135 ArrOfDouble& D=(ori!=0?origine:point3);
136 ArrOfDouble normal2(3),prov(3);
137 for (
int te=0; te<2; te++)
139 ArrOfDouble& B=(te==0?point1:point2);
143 calcul_normal_norme(A,B,prov,normal2);
149 for (
int dir=0; dir<3; dir++)
151 dxbis+=normal2[dir]*D[dir];
152 ref+=normal2[dir]*A[dir];
154 out << axes[dir]<<
"*("<< normal2[dir]<<
")+";
156 out<<
"("<<-ref<<
"))";
167 out<<
"avec_certains_bords " <<bords<<finl;
169 Cout<<
" Creation of the plan through Extraire_surface "<< out.
get_str()<<finl;;
182 Cerr <<
"and not of type Probleme_base" << finl;
190 if (type_elem==
Motcle(
"Tetraedre"))
191 dom.
typer(
"Triangle");
194 Cerr<<
que_suis_je()<<
" not coded for this type of elements "<<finl;
199 Domaine domaine_test;
200 ArrOfDouble normal(3);
203 domaine_test.
typer(
"Prisme");
205 domaine_test.
typer(
"Hexaedre_vef");
210 somm_hexa.
resize(nb_som*2,3);
212 for (
int dir=0; dir<3; dir++)
214 somm_hexa(0,dir)=origine[dir];
215 somm_hexa(1,dir)=point1[dir];
216 somm_hexa(2,dir)=point2[dir];
217 somm_hexa(3,dir)=point3[dir];
218 for (
int t=0; t<nb_som; t++)
219 somm_hexa(t+nb_som,dir)=somm_hexa(t,dir);
223 calcul_normal_norme(origine,point1,point2,normal);
224 double d_epaisseur=epaisseur/2.;
225 for (
int t=0; t<nb_som; t++)
226 for (
int dir=0; dir<3; dir++)
228 somm_hexa(t,dir)=somm_hexa(t,dir)-d_epaisseur*normal[dir];
229 somm_hexa(nb_som+t,dir)=somm_hexa(nb_som+t,dir)+d_epaisseur*normal[dir];
231 IntTab& elem_test=domaine_test.
les_elems();
232 elem_test.
resize(1,nb_som*2);
233 for (
int s=0; s<nb_som*2; s++) elem_test(0,s)=s;
239 const DoubleTab& xv =domaine_vf.
xv();
243 ArrOfInt marq(nbfaces);
248 for(
int njoint=0; njoint<nbjoints; njoint++)
250 const Joint& joint_temp = domaine_vf.
joint(njoint);
251 int pe_voisin=joint_temp.
PEvoisin();
255 const int nb_faces_j = indices_faces_joint.
dimension(0);
256 for (
int j = 0; j < nb_faces_j; j++)
258 int face_de_joint = indices_faces_joint(j, 1);
259 marq[face_de_joint] = -1;
265 for (
int fac=0; fac<nbfaces; fac++)
275 ArrOfDouble point0b(3),point1b(3),point2b(3);
276 Cerr<<
"Number of elements of the new domain "<<nb_t<<finl;
281 for (
int fac=0; fac<nbfaces; fac++)
285 for (
int s=0; s<3; s++)
286 les_elems(nb,s)=face_sommets(fac,s);
288 ArrOfDouble normal_b(3);
289 for (
int i=0; i<3; i++)
291 point0b[i]=coord(les_elems(nb,0),i);
292 point1b[i]=coord(les_elems(nb,1),i);
293 point2b[i]=coord(les_elems(nb,2),i);
295 calcul_normal(point0b.addr(),point1b.addr(),point2b.
addr(),normal_b.
addr());
296 if (dotproduct_array(normal,normal_b)<0)
299 les_elems(nb,1)=face_sommets(fac,2);
300 les_elems(nb,2)=face_sommets(fac,1);
SmallArrOfTID_t & chercher_elements(const DoubleTab &pos, SmallArrOfTID_t &elem, int reel=0) const
Recherche des elements contenant les points dont les coordonnees sont specifiees.
DoubleTab_t & les_sommets()
void typer(const Nom &)
Type les elements du domaine avec le nom passe en parametre.
int nb_faces() const
renvoie le nombre global de faces.
double xv(int num_face, int k) const
const Joint & joint(int i) const
int face_sommets(int i, int j) const
renvoie le numero du ieme sommet de la face num_face.
const Domaine & domaine() const