16#include <communications.h>
17#include <Postraitement.h>
20Implemente_instanciable_sans_constructeur_ni_destructeur(
Sonde_Int,
"Sonde_Int",
Objet_U);
48 Probleme_base& pb = mon_post->probleme();
50 Motcle accolade_fermee(
"}");
59 for (
int i=0; i<liste_noms.size(); i++)
61 if (liste_noms[i]==motlu)
63 OBS_PTR(IntVect) ref_tab;
65 mon_tableau = ref_tab;
68 Cerr <<
"The problem does not have the array " << motlu << finl;
78 Motcles les_motcles(6);
80 les_motcles[0] =
"periode";
81 les_motcles[1] =
"point";
82 les_motcles[2] =
"points";
83 les_motcles[3] =
"segment";
84 les_motcles[4] =
"plan";
85 les_motcles[5] =
"volume";
88 while ((fait(0) != 1) || (fait(1) != 1))
91 if (motlu == accolade_fermee)
93 Cerr <<
"Error while reading the probe " << nom_ <<finl;
94 Cerr <<
"The data of the probe were not defined" << finl;
97 int rang=les_motcles.search(motlu);
100 Cerr <<
"Error while reading the probe " << nom_ <<finl;
101 Cerr << motlu <<
" is not understood; the keywords understood are : " << finl;
119 les_positions_.resize(nbre_points,
dimension);
121 for (
int i=0; i<nbre_points; i++)
123 is >> les_positions_(i,j);
136 les_positions_.resize(nbre_points,
dimension);
143 dx(i)=(extremite(i)-origine(i))/(nbre_points-1);
144 for (i=0; i<nbre_points; i++)
146 les_positions_(i,j)=origine(j)+i*dx(j);
161 nbre_points=nbre_points1*nbre_points2;
162 les_positions_.resize(nbre_points,
dimension);
171 dx1(i)=(extremite1(i)-origine(i))/(nbre_points1-1);
173 dx2(i)=(extremite2(i)-origine(i))/(nbre_points2-1);
174 for (i=0; i<nbre_points1; i++)
175 for (j=0; j<nbre_points2; j++)
177 les_positions_(i*nbre_points2+j,k)=origine(k)+i*dx1(k)+j*dx2(k);
195 nbre_points=nbre_points1*nbre_points2*nbre_points3;
196 les_positions_.resize(nbre_points,
dimension);
207 dx1(i)=(extremite1(i)-origine(i))/(nbre_points1-1);
209 dx2(i)=(extremite2(i)-origine(i))/(nbre_points2-1);
211 dx3(i)=(extremite3(i)-origine(i))/(nbre_points3-1);
212 for (i=0; i<nbre_points1; i++)
213 for (j=0; j<nbre_points2; j++)
214 for (
int m=0; m<nbre_points3; m++)
216 les_positions_(i*nbre_points2*nbre_points1+j*nbre_points1+m,k)=origine(k)+i*dx1(k)+j*dx2(k)+m*dx3(k);
221 Cerr << motlu <<
"is not yet understood!" << finl;
228 if ( (fait[0] == 0) || (fait[1] == 0) )
230 Cerr <<
"Error while reading the probe " << nom_ << finl;
231 Cerr <<
"The data of the probe have not been properly defined" << finl;
235 const Domaine& le_dom =pb.
domaine();
248 if (mon_post->noms_fichiers_sondes().contient(nom_)==0)
249 mon_post->noms_fichiers_sondes().add(nom_);
252 Cerr <<
"The filename " << nom_ <<
" is used several times for probes." << finl;
253 Cerr <<
"A probe must have a unique filename to avoid writing conflicts." << finl;
270 int nbre_points = les_positions_.
dimension(0);
271 elem_.resize(nbre_points);
273 for (
int i=0; i<nbre_points; i++)
276 Cerr <<
"The point number " << i+1 <<
" of probe " << nom_ << finl;
277 Cerr <<
"is outside of the computational domain" << finl;
279 if (sub_type(IntTab,mon_tableau.valeur()))
281 const IntTab& tab_val =
static_cast<const IntTab&
>(mon_tableau.valeur());
282 valeurs.resize(nbre_points,tab_val.
dimension(1));
285 valeurs.
resize(nbre_points);
307 s.
setf(ios::scientific);
311 if (dim==0 || dim==1)
314 int nbre_points = les_positions_.dimension(0);
315 s <<
"# " << nom_fich << finl;
317 for(
int i=0; i<nbre_points; i++)
319 s <<
" x=" << p(i,0) <<
" y=" << p(i,1) ;
326 s <<
"TRUST Version1 01/09/96" << finl;
328 s <<
"TRUST" << finl;
329 s <<
"GRILLE" << finl;
330 Nom nom_grille(
"Grille");
331 Nom nom_topologie(
"Topologie");
334 nom_topologie +=
"_";
335 nom_topologie += nom_;
337 int nbre_points = les_positions_.
dimension(0);
339 double xn,yn,zn,norme;
342 xn=(p(1,2)-p(0,2))*(p(nbre_points1,1)
343 -p(0,1))-(p(1,1)-p(0,1))*(p(nbre_points1,2)-p(0,2));
344 yn=(p(1,0)-p(0,0))*(p(nbre_points1,2)-p(0,2))
345 -(p(1,2)-p(0,2))*(p(nbre_points1,0)-p(0,0));
353 zn=(p(1,1)-p(0,1))*(p(nbre_points1,0)-p(0,0))
354 -(p(1,0)-p(0,0))*(p(nbre_points1,1)-p(0,1));
355 norme=std::fabs(xn)+std::fabs(yn)+std::fabs(zn);
359 s << nom_grille <<
" 3 " << 2*nbre_points << finl;
361 for(i=0; i<nbre_points; i++)
363 s << p(i,0) <<
" " << p(i,1) ;
365 else if (
dimension==2) s <<
" 0." << finl;
367 for(i=0; i<nbre_points; i++)
369 s << p(i,0)+xn <<
" " << p(i,1)+yn ;
370 if (
dimension==3) s <<
" " << p(i,2)+zn << finl;
371 else if (
dimension==2) s <<
" " << zn << finl;
373 s <<
"TOPOLOGIE" << finl;
374 s << nom_topologie <<
" " << nom_grille << finl;
375 s <<
"MAILLE" << finl;
376 s << (nbre_points1-1)*(nbre_points2-1) << finl;
377 for(
int j=0; j<nbre_points2-1; j++)
378 for(i=0; i<nbre_points1-1; i++)
380 k=j*nbre_points1+i+1;
382 s <<
"VOXEL8 " << k <<
" " << k+1 <<
" ";
383 s << k+nbre_points1 <<
" " << k+nbre_points1+1;
384 s <<
" " << kn <<
" " << kn+1 <<
" " << kn+nbre_points1;
385 s <<
" " << kn+nbre_points1+1 << finl;
392 s <<
"TRUST Version1 01/09/96" << finl;
394 s <<
"TRUST" << finl;
395 s <<
"GRILLE" << finl;
396 Nom nom_grille(
"Grille");
397 Nom nom_topologie(
"Topologie");
400 nom_topologie +=
"_";
401 nom_topologie += nom_;
403 int nbre_points = les_positions_.
dimension(0);
405 s << nom_grille <<
" 3 " << nbre_points << finl;
407 for(i=0; i<nbre_points; i++)
409 s << p(i,0) <<
" " << p(i,1) ;
410 s <<
" " << p(i,2) << finl;
412 s <<
"TOPOLOGIE" << finl;
413 s << nom_topologie <<
" " << nom_grille << finl;
414 s <<
"MAILLE" << finl;
415 s << (nbre_points1-1)*(nbre_points2-1)*(nbre_points3-1) << finl;
416 for(
int m=0; m<nbre_points3-1; m++)
417 for(
int j=0; j<nbre_points2-1; j++)
418 for(i=0; i<nbre_points1-1; i++)
420 k=m*nbre_points2*nbre_points1+j*nbre_points1+i+1;
421 kn=k+nbre_points2*nbre_points1;
422 s <<
"VOXEL8 " << k <<
" " << k+1 <<
" ";
423 s << k+nbre_points1 <<
" " << k+nbre_points1+1;
424 s <<
" " << kn <<
" " << kn+1 <<
" " << kn+nbre_points1;
425 s <<
" " << kn+nbre_points1+1 << finl;
442 modf((un_temps-tinit)/periode, &nb);
459 if (sub_type(IntTab,mon_tableau.valeur()))
461 const IntTab& val_tab=
static_cast<const IntTab&
>(mon_tableau.valeur());
465 int nbre_points = les_positions_.dimension(0);
467 for (
int i=0; i<nbre_points; i++)
468 for (
int j=0; j<nval; j++)
469 valeurs(i,j) = val_tab(elem_(i),j);
477 for(p=1; p<nbproc; p++)
479 recevoir(valeurs_pe,p,0,p);
480 int n1=valeurs.dimension(0);
481 int n2=valeurs.dimension(1);
483 for(
int i=0; i<n1; i++)
486 val_max = std::max(std::abs(valeurs(i,k)),std::abs(valeurs_pe(i,k)));
487 if(val_max==(std::abs(valeurs_pe(i,k))))
488 valeurs(i,k)=valeurs_pe(i,k);
492 if (dim==0 || dim==1)
495 for(
int i=0; i<valeurs.dimension(0); i++)
496 for(
int k=0; k<valeurs.dimension(1); k++)
497 fichier() <<
" " << valeurs(i,k);
504 else if (dim==2 || dim==3)
507 Nom nom_topologie(
"Topologie");
508 nom_topologie +=
"_";
509 nom_topologie += nom_;
510 fichier() <<
"TEMPS " << un_temps <<
"\n";
511 fichier() <<
"CHAMPOINT " << nom_ <<
" " << nom_topologie
512 <<
" " << un_temps <<
"\n";
513 fichier() << nom_ <<
" " << nval <<
" " << unite <<
"\n";
516 fichier() <<
"type1 " << nbp <<
"\n";
518 for(i=0; i<nbre_points; i++)
521 for(
int j=0; j<valeurs.dimension(1); j++)
522 fichier() <<
" " << valeurs(i,j);
529 for(i=0; i<nbre_points; i++)
532 for(
int j=0; j<valeurs.dimension(1); j++)
533 fichier() <<
" " << valeurs(i,j);
546 const IntVect& val_tab=
static_cast<const IntVect&
>(mon_tableau.valeur());
551 int nbre_points = les_positions_.dimension(0);
553 for (
int i=0; i<nbre_points; i++)
554 valeurs(i) = val_tab(elem_(i));
562 for(p=1; p<nbproc; p++)
564 recevoir(valeurs_pe,p,0,p);
566 for(
int i=0; i<valeurs.dimension(0); i++)
568 val_max = std::max(std::abs(valeurs(i)), std::abs(valeurs_pe(i)));
569 if(val_max == std::abs(valeurs_pe(i)))
570 valeurs(i)=valeurs_pe(i);
573 if (dim==0 || dim==1)
576 for(
int i=0; i<valeurs.dimension(0); i++)
577 fichier() <<
" " << valeurs(i);
584 else if (dim==2 || dim==3)
587 Nom nom_topologie(
"Topologie");
588 nom_topologie +=
"_";
589 nom_topologie += nom_;
590 fichier() <<
"TEMPS " << un_temps <<
"\n";
591 fichier() <<
"CHAMPOINT " << nom_ <<
" " << nom_topologie
592 <<
" " << un_temps <<
"\n";
593 fichier() << nom_ <<
" " << nval <<
" " << unite <<
"\n";
596 fichier() <<
"type0 " << nbp <<
"\n";
598 for(
int i=0; i<nbre_points; i++)
601 fichier() <<
" " << valeurs(i);
608 for(
int i=0; i<nbre_points; i++)
611 fichier() <<
" " << valeurs(i);
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.
Class defining operators and methods for all reading operation in an input flow (file,...
class Nom Une chaine de caractere pour nommer les objets de TRUST
classe Objet_U Cette classe est la classe de base des Objets de TRUST
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.
static const Nom & nom_du_cas()
Renvoie une reference constante vers le nom du cas.
virtual Sortie & printOn(Sortie &) const
Ecriture de l'objet sur un flot de sortie Methode a surcharger.
classe Postraitement La classe est dotee -d une liste de champs generiques champs_post_complet_ qui c...
void get_noms_champs_postraitables(Noms &nom, Option opt=NONE) const override
const Domaine & domaine() const
Renvoie le domaine associe au probleme.
virtual int a_pour_IntVect(const Motcle &, OBS_PTR(IntVect)&) const
static double mp_max(double)
static int nproc()
renvoie le nombre de processeurs dans le groupe courant Voir Comm_Group::nproc() et PE_Groups::curren...
static int me()
renvoie mon rang dans le groupe de communication courant.
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
static int je_suis_maitre()
renvoie 1 si on est sur le processeur maitre du groupe courant (c'est a dire me() == 0),...
Cette classe est a la classe C++ ofstream ce que la classe Sortie est a la classe C++ ostream Elle re...
classe Sonde_Int Cette classe permet d'effectuer l'evolution d'un champ au cours du temps.
SFichier & fichier()
Renvoie un flot de sortie Fichier, pointant sur le fichier de sortie utilise par la sonde.
void ouvrir_fichier()
Ouvre le fichier associe a la sonde.
const DoubleTab & les_positions() const
Renvoie le tableau des positions du champ qui sont sondees.
void associer_post(const Postraitement &)
Associer le postraitement a la sonde.
void initialiser(const Domaine &)
Initialise la sonde.
Sonde_Int(const Nom &)
Constructeur d'une sonde a partir de son nom.
void mettre_a_jour(double temps, double tinit)
Effectue une mise a jour en temps de la sonde effectue le postraitement.
void postraiter(double)
Effectue un postraitement.
Sortie & flush() override
Force l'ecriture sur disque des donnees dans le tampon Utilise l'implementation de la classe ofstream...
void precision(int pre) override
void setf(IOS_FORMAT code) override
Classe de base des flux de sortie.
void resize(_SIZE_ new_size, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT)
_SIZE_ dimension(int d) const