16#include <DecoupeBord.h>
18#include <TRUSTArrays.h>
22#include <Synonyme_info.h>
25Add_synonym(DecoupeBord,
"DecoupeBord_pour_rayonnement");
43template <
typename _SIZE_>
49template <
typename _SIZE_>
57template <
typename _SIZE_>
79 if (tmp >= std::numeric_limits<int>::max())
81 Cerr <<
"Too many faces in frontiere '" << fr.
le_nom() <<
"' (exceed 32b limit) - the support for this is not yet implemented." << finl;
82 Cerr <<
"Please contact TRUST support!" << finl;
90template <
typename _SIZE_>
100 for (
int l=0; l<nbfr; l++)
108 Cerr <<
" The domains " << dom1.
le_nom() <<
" and " << dom_oth.
le_nom() <<
" do not have the same names of boundaries " << finl;
109 Cerr<<nomfr1<<
" not found in "<<dom1.
le_nom() <<finl;
110 Cerr <<
" Make sure they were generated in a similar way (almost to the mesh size) " << finl;
115 if (nomdec.
search(nomfr1)!=-1)
130 for (
int_t face1=0; face1<nbfaces1; face1++)
134 for (
int i=0; i<nb_som_face; i++)
136 xg1[j]+=xs1(sommets_face1(face1,i),j);
140 double dist_min=1.e6;
143 for (
int face2=0; face2<nbfaces2; face2++)
147 for (
int i=0; i<nb_som_face; i++)
149 xg2[j]+=xs2(sommets_face2(face2,i),j);
154 dist+=(xg2[j]-xg1[j])*(xg2[j]-xg1[j]);
163 faces_associees[face_min].append_array(face1);
166 for (
int face2=0; face2<nbfaces2; face2++)
174 s<<faces_associees[face2]<<finl;
185template <
typename _SIZE_>
188 int n1=nomdec.size();
192 Cerr<<
"The numbers of boundaries in 'bords_a_decouper' and 'condition_geometrique' have to be the same"<<finl;
208 for (
int l=0; l<nbfr; l++)
213 int inc=nomdec.
search(nomfr1);
216 Nom expr2(expr[inc]);
231 for (
int face1=0; face1<nbfaces1; face1++)
235 for (
int i=0; i<nb_som_face; i++)
237 xg1[j]+=xs1(sommets_face1(face1,i),j);
239 parser.
setVar(
"x",xg1[0]);
241 parser.
setVar(
"y",xg1[1]);
243 parser.
setVar(
"z",xg1[2]);
244 double res=parser.
eval();
245 int face_min=
static_cast<int>(res+0.5);
246 nb=std::max(nb,face_min);
249 faces_associees[face_min].append_array(face1);
253 for (
int face2=0; face2<nb+1; face2++)
261 s<<faces_associees[face2]<<finl;
271template <
typename _SIZE_>
274 int n1=nomdec.size();
278 Cerr <<
"The numbers of boundaries in 'bords_a_decouper' and 'nb_parts_naif' are not the same : check your data file"<<finl;
284 for (
int l=0; l<nbfr; l++)
291 int inc=nomdec.
search(nomfr);
295 nb=std::min(nb,nbfaces);
301 if ((nb*nc)<nbfaces) nc++;
303 Cerr<<nomfr<<
" splitting in "<<nb<<
" parts, average number of faces "<<nbfaces/(1.*nb)<<finl;
305 for (
int i=0; i<nb; i++)
307 if (i==nb-1) nc=nbfaces-compt;
309 for (
int j=0; j<nc; j++) p[j]=compt++;
327template <
typename _SIZE_>
332 Cerr<<
"nb_parts_geom has been defined for dimension 3 only"<<finl;;
336 int n1=nomdec.size();
340 Cerr <<
"The 'nb_parts_geom' has to be twice the number of boundaries in 'bords_a_decouper' : check your data file"<<finl;
354 for (
int l=0; l<nbfr; l++)
359 int inc=nomdec.
search(nomfr);
362 int nb1=nbdec[2*inc];
363 int nb2=nbdec[2*inc+1];
370 ArrOfDouble coord_min(3);
372 ArrOfDouble coord_max(3);
375 for (
int_t face=0; face<nbfaces; face++)
377 for (
int i=0; i<nb_som_face; i++)
378 for (
int j=0; j<3; j++)
380 coord_min[j] = std::min(coord_min[j],xs(sommets_face(face,i),j));
381 coord_max[j] = std::max(coord_max[j],xs(sommets_face(face,i),j));
387 if(coord_min[0]==coord_max[0])
389 double dy=(coord_max[1]-coord_min[1])/nb1;
390 double dz=(coord_max[2]-coord_min[2])/nb2;
392 for (
int j=1; j<nb1; j++)
401 for (
int k=1; k<nb2; k++)
409 else if (coord_min[1]==coord_max[1])
411 double dx=(coord_max[0]-coord_min[0])/nb1;
412 double dz=(coord_max[2]-coord_min[2])/nb2;
414 for (
int i=1; i<nb1; i++)
423 for (
int k=1; k<nb2; k++)
431 else if (coord_min[2]==coord_max[2])
433 double dx=(coord_max[0]-coord_min[0])/nb1;
434 double dy=(coord_max[1]-coord_min[1])/nb2;
436 for (
int i=1; i<nb1; i++)
445 for (
int j=1; j<nb2; j++)
455 Cerr <<
"the boundary "<<nomfr<<
" is not plane : nb_parts_geom can't be used"<<finl;
460 Cerr <<
"fontiere : "<<nomfr<<
" - expression : " <<expr<<finl;
469 Cerr <<
"create_listb_from_xyz .... "<<finl;
471 Cerr <<
" ... ok "<<finl;
474template <
typename _SIZE_>
479 Nom nom_dom1,nom_dom2;
480 Nom nom_fichier_sortie(
"");
483 ArrOfInt nb_parts,nb_parts_geom;
489 param.
ajouter(
"domaine_grossier",&nom_dom2);
491 param.
ajouter(
"nb_parts_naif",&nb_parts);
493 param.
ajouter(
"nb_parts_geom",&nb_parts_geom);
495 param.
ajouter(
"condition_geometrique",&expr);
499 param.
ajouter(
"nom_fichier_sortie",&nom_fichier_sortie);
501 param.
ajouter(
"binaire",&binaire);
507 if (nom_fichier_sortie==
"")
509 nom_fichier_sortie=dom_1.
le_nom()+
".newgeom";
517 Cerr << nom_dom2 <<
" is not an object of type Domaine " << finl;
518 Cerr <<
" Please correct your data set" << finl;
523 Impl_::create_listb_from_domaine2(dom1,dom_2,nomdec);
528 Impl_::create_listb_from_xyz(dom1,nomdec,expr);
530 Impl_::create_listb_naif(dom1,nomdec,nb_parts);
532 Impl_::create_listb_geom(dom1,nomdec,nb_parts_geom);
535 Cerr<<
"in DecoupeBord_32_64_pour_rayonnement : You must specify domaine_grossier or nb_parts_naif or nb_part_geom or condition_geometrique"<<finl;
540 Nom nom_file(dom1.
le_nom()+
".boundary_list");
543 Cout <<
"Writing of the new geometry in the file " << nom_fichier_sortie <<finl;
546 fic.
ouvrir(nom_fichier_sortie);
552template <
typename _SIZE_>
555 Cerr <<
"Splitting to the radiation of the boundaries of the domain " << dom.
le_nom() << finl;
556 int_t nb_faces_bord_sa=dom. nb_faces_bord();
557 int_t nb_faces_raccord_sa=dom. nb_faces_raccord();
558 if (this->
nproc()!=1)
560 Cerr <<
" The splitting DecoupeBord_32_64 can be done only in sequential " << finl;
579 Noms nomborddec(nbtot);
580 for (
int nf=0; nf<nbtot; nf++) listb2>>nomborddec[nf];
588 IntVect decoup(nbfr);
589 Noms nomsdesbordsorg(nbfr);
591 for (
int b=0; b<nbfr; b++)
595 nomsdesbordsorg[b]=nombord;
598 bord_xv.
setf(ios::scientific);
600 for (
int nf=0; nf<nbtot; nf++)
602 Nom nombord_dec=nomborddec[nf];
603 const char* marq=strchr(nombord_dec,
'%');
608 if (nombord==nombord_dec)
613 if (b>=nbbord) toto_rac.typer(org.
le_type());
615 Nom nombord_dec_bis=nomborddec[nf];
616 toto.
nommer(nombord_dec_bis);
630 for (
int_t i=0; i<newnbfaces; i++)
631 for (
int j=0; j<nbsom; j++)
632 newsommet(i,j)=sommetsorg(listfaces[i],j);
637 bord_xv<<nombord_dec_bis<<finl;
638 bord_xv<<position<<finl;
640 listbord2.add(toto_bord);
642 listrac2.add(toto_rac);
649 for (
int b2=0; b2<nbbord; b2++)
651 listbord.suppr(dom.
bord(nomsdesbordsorg[b2]));
652 for (
int r2=nbbord; r2<nbfr; r2++)
654 listrac.suppr(dom.
raccord(nomsdesbordsorg[r2]));
655 listbord.add(listbord2);
656 listrac.add(listrac2);
659 if (nb_faces_bord!=nb_faces_bord_sa)
661 Cerr<<
"the new number of boundary faces is false :"<<nb_faces_bord;
662 Cerr<<
" instead of "<<nb_faces_bord_sa<<finl;
666 if (nb_faces_raccord!=nb_faces_raccord_sa)
668 Cerr<<
"the new number of connection faces is false :"<<nb_faces_raccord;
669 Cerr<<
" instead of "<<nb_faces_raccord_sa<<finl;
class DecoupeBord Realise un maillage en decoupant chaque pave en 40 tetraedres
Bord_32_64< _SIZE_ > Bord_t
DoubleTab_T< _SIZE_ > DoubleTab_t
Raccords_32_64< _SIZE_ > Raccords_t
Entree & interpreter_(Entree &) override
OWN_PTR(Raccord_base_32_64< _SIZE_ >) Raccord_t
Bords_32_64< _SIZE_ > Bords_t
Frontiere_32_64< _SIZE_ > Frontiere_t
IntTab_T< _SIZE_ > IntTab_t
void decouper(Domaine_t &dom, const Nom &nom_file)
IntVect_T< _SIZE_ > IntVect_t
Domaine_32_64< _SIZE_ > Domaine_t
Faces_32_64< _SIZE_ > Faces_t
classe Domaine_32_64 un Domaine est un maillage compose d'un ensemble d'elements geometriques de meme...
int_t nb_faces_bord() const
Raccord_t & raccord(int i)
DoubleTab_t & les_sommets()
int rang_frontiere(const Nom &) const
int_t nb_faces_raccord() const
const Frontiere_t & frontiere(int i) const
Raccords_t & faces_raccord()
const DoubleTab_t & coord_sommets() const
const Nom & le_nom() const override
Donne le nom de l'Objet_U Methode a surcharger : renvoie "neant" dans cette implementation.
Fichier en lecture Cette classe est a la classe C++ ifstream ce que la classe Entree est a la.
Class defining operators and methods for all reading operation in an input flow (file,...
void typer(const Motcle &)
Type les faces.
int_t dimensionner(int_t)
(Re-)dimensionne les faces On redimensionne les voisins en consequence.
const IntTab_t & les_sommets() const
Renvoie le tableau des sommets de toutes les faces.
Type_Face type_face() const
static void Calculer_centres_gravite(DoubleTab_t &xv, Type_Face type_face_, const DoubleTab_t &coord, const IntTab_t &sommet)
int nb_som_faces() const
Renvoie le nombre de sommet par face.
void nommer(const Nom &) override
Donne un nom a la frontiere.
const Nom & le_nom() const override
Donne le nom de l'Objet_U Methode a surcharger : renvoie "neant" dans cette implementation.
int_t nb_faces() const
Renvoie le nombre de faces de la frontiere.
const Faces_t & faces() const
static void create_listb_from_domaine2(const Domaine_t &dom1, const Domaine_t &dom_oth, const Noms &nomdec)
Domaine_32_64< _SIZE_ > Domaine_t
DoubleTab_T< _SIZE_ > DoubleTab_t
static void create_listb_from_xyz(const Domaine_t &dom, const Noms &nomdec, const Noms &expr)
ArrOfInt_T< _SIZE_ > ArrOfInt_t
IntVect_T< _SIZE_ > IntVect_t
Frontiere_32_64< _SIZE_ > Frontiere_t
static void create_listb_naif(const Domaine_t &dom, const Noms &nomdec, const ArrOfInt &nbdec)
IntTab_T< _SIZE_ > IntTab_t
ArrsOfInt_T< _SIZE_ > ArrsOfInt_t
static void create_listb_geom(const Domaine_t &dom, const Noms &nomdec, const ArrOfInt &nbdec)
static int check_front_sz(const Frontiere_t &fr)
classe Interprete_geometrique_base .
void associer_domaine(Nom &nom_dom)
Domaine_t & domaine(int i=0)
static Objet_U & objet(const Nom &)
Voir Interprete_bloc::objet_global() BM: la classe Interprete n'est pas le meilleur endroit pour cett...
class Nom Une chaine de caractere pour nommer les objets de TRUST
Nom & prefix(const char *const)
Un tableau de chaine de caracteres (VECT(Nom)).
int search(const Nom &t) const
const Nom & que_suis_je() const
renvoie la chaine identifiant la classe.
virtual Entree & readOn(Entree &)
Lecture d'un Objet_U sur un flot d'entree Methode a surcharger.
const char * le_type() const
Donne le nom du type de l'Objet_U.
virtual Sortie & printOn(Sortie &) const
Ecriture de l'objet sur un flot de sortie Methode a surcharger.
Helper class to factorize the readOn method of Objet_U classes.
void ajouter(const char *keyword, const int *value, Param::Nature nat=Param::OPTIONAL)
Register an integer parameter.
int lire_avec_accolades_depuis(Entree &is)
Parse the parameter block { ... } from is.
classe Parser_U Version de la classe Parser, derivant de Objet_U.
void setVar(const char *sv, double val)
void setString(const std::string &s)
void addVar(const char *v)
static int nproc()
renvoie le nombre de processeurs dans le groupe courant Voir Comm_Group::nproc() et PE_Groups::curren...
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
Cette classe est a la classe C++ ofstream ce que la classe Sortie est a la classe C++ ostream Elle re...
virtual int ouvrir(const char *name, IOS_OPEN_MODE mode=ios::out)
void precision(int pre) override
void setf(IOS_FORMAT code) override
Classe de base des flux de sortie.
void set_bin(bool bin) override
Change le mode d'ecriture du fichier.
_SIZE_ size_array() const
int dimension_int(int d) const