16#include <Operateur_base.h>
17#include <Probleme_base.h>
18#include <Schema_Temps_base.h>
19#include <EcrFicPartage.h>
20#include <Periodique.h>
24#include <Domaine_VF.h>
25#include <Matrice_Morse.h>
27#include <Discretisation_base.h>
28#include <Domaine_Cl_dis_base.h>
32Operateur_base::Operateur_base()
99 for (
auto& itr : les_cl)
110 if (noms_compo_courts.size() > 1)
111 for (
int i = 0; i < noms_compo_courts.size(); ++i)
114 w_suffix = std::max(w_suffix, noms_compo_courts[i].longueur());
136 Cerr <<
"You must overload the method " <<
que_suis_je()
137 <<
"::calculer_dt_local(DoubleVect&)" << finl;
193 DoubleTrav secmem(inco);
219 Cerr <<
"***********************************************************************************" << finl;
220 Cerr <<
"Sorry, implicit scheme is not available yet for the " <<
que_suis_je() <<
" scheme." << finl;
222 Cerr <<
"***********************************************************************************" << finl;
233 if (
equation().discretisation().is_poly_family())
256 DoubleTrav secmem(inco);
268 DoubleTrav secmem(inco);
281 Cerr <<
"You must overload the method " <<
que_suis_je()
282 <<
"::contribuer_au_second_membre(DoubleTab&)" << finl;
292 Cerr<<
"Operateur_base::associer_domaine_cl_dis must be overloaded "<<finl;
300 Cerr <<
"You provided an empty string to name the .out file of operator " <<
que_suis_je() <<
" in equation " <<
equation().
que_suis_je() <<
"." << finl;
301 Cerr <<
"If you don't want to write a .out file for this operator, don't call set_fichier()" << finl;
322 Cerr<<
"Only master process can open "<<type<<
" file. See Operateur_base::ouvrir_fichier()" << finl;
331 if (type!=
"") nomfichier+=(
Nom)
"_"+type;
339 std::vector<std::string> comp_m = {
"_Mx",
"_My",
"_Mz"};
341 os <<
"# " << (type==
"moment" ?
"Moment of " :
"") <<
description() << finl;
343 if (!gnuplot_header) os <<
"#";
351 Cerr <<
"flux_bords_ not dimensioned for the operator " <<
que_suis_je() << finl;
357 if (type==
"moment" &&
dimension == 2) nb_compo=1;
360 for (
int i = 0; i < noms_compo_courts.size(); ++i)
367 for (
int num_cl=0; num_cl<les_cls.size(); num_cl++)
376 os.
add_col((ch + comp_m[2]).getChar());
379 os.
add_col((ch + comp_m[d]).getChar());
384 for (
int d = 0; d < nb_compo; ++d)
386 os.
add_col((ch +
"_" + noms_compo_courts[d]).getChar());
393 for (
int d = 0; d < nb_compo; ++d)
395 os.
add_col((ch +
"_" + noms_compo_courts[d]).getChar());
402 if (type!=
"sum" && type!=
"moment")
406 for (
int d = 0; d < nb_compo; ++d)
407 os.
add_col((
Nom(
"Total_") + noms_compo_courts[d]).getChar());
416 os.
ouvrir(nomfichier,ios::app);
419 os.
setf(ios::scientific);
421 pb.get_set_out_files().add(os);
439 if (type!=
"") nomfichier+=(
Nom)
"_"+type;
449 os.
ouvrir(nomfichier,ios::app);
452 os.
setf(ios::scientific);
478 if (opt == DESCRIPTION)
492 bool surfacique = (
Motcle(
option)==
"flux_surfacique_bords");
493 DoubleTab& es_valeurs = espace_stockage.
valeurs();
502 for (
int n_bord=0; n_bord<nb_front; n_bord++)
506 if (surfacique) la_cl->frontiere_dis().frontiere().faces().calculer_surfaces(aire);
508 int nfin = ndeb + le_bord.
nb_faces();
510 for (
int face=ndeb; face<nfin; face++)
511 es_valeurs(face) =
flux_bords_(face,comp) / (surfacique ? aire(face-ndeb) : 1.);
517 Cerr<<
"The method calculer_pour_post is not recognized for the option "<<
option<<finl;
527 if (!
equation().discretisation().is_vdf())
534 Cerr<<
"The method get_localisation_pour_post is not actually coded "<<finl;
545 Cerr <<
"Warning : 'Operateur_base::ajouter_flux()' must be overloaded" << finl;
570 char* theValue = getenv(
"TRUST_TEST_OPERATEUR_IMPLICITE");
571 if (theValue !=
nullptr) test_op=2;
574 char* theValue = getenv(
"TRUST_TEST_OPERATEUR_IMPLICITE_BLOQUANT");
575 if (theValue !=
nullptr) test_op=1;
577 if (test_op==0)
return;
580 DoubleTrav resu(inco);
581 auto& coeff_contribuer = mat_contribuer.get_set_coeff();
583 coeff_contribuer = 0;
590 const double eps = 1e-6;
595 for (
int i = 0; i < inco.
dimension(0); i++)
596 for (
auto j = tab1[i] - 1; j < tab1[i + 1] - 1; j++)
598 const int i2 = tab2[j] - 1;
600 DoubleTrav resu_DF(inco);
601 DoubleTab inco_pert(inco);
602 inco_pert[i2] += eps;
604 mat_DF(i, i2) = -(resu_DF[i] - resu[i]) / eps;
610 mat_DF += -mat_contribuer;
612 Cerr <<
"Max difference between contribuer_a_avec and finite difference jacobian : " << coeff_DF.mp_max_abs_vect() << finl;
614 else Cerr <<
"nbcomp > 1 : the finite difference jacobian matrix is not compared to the contribuer_a_avec one.";
616 mat_contribuer.ajouter_multvect(inco, resu);
619 mon_equation->solv_masse().appliquer(resu);
624 mon_equation->solv_masse().appliquer(un);
625 resu/=mp_max_vect(un);
626 double err=mp_max_abs_vect(resu);
627 Cerr<<
"Test contribuer_a_avec on " <<
que_suis_je() <<
" error: "<<err<<finl;
631 DoubleVect& resu_=resu;
632 Cerr<<
" size "<< resu_.
size()<<finl;
633 for (
int i=0; i<resu_.size(); i++)
634 if (std::fabs(resu_(i))>1e-10)
636 Cerr<<i <<
" "<< resu_(i)<<
" "<<finl;
const Domaine_Cl_dis_base & domaine_Cl_dis() const
DoubleTab & valeurs() override
Renvoie le tableau des valeurs du champ au temps courant.
virtual DoubleTab & valeurs()=0
classe Champ_base Cette classe est la base de la hierarchie des champs.
bool has_champ(const Motcle &nom, OBS_PTR(FIELD_TYPE)&ref_champ) const
classe Cond_lim Classe generique servant a representer n'importe quelle classe
classe Conds_lim Cette classe represente un vecteur de conditions aux limites.
classe Domaine_Cl_dis_base Les objets Domaine_Cl_dis_base representent les conditions aux limites
const Cond_lim & les_conditions_limites(int) const
Renvoie la i-ieme condition aux limites.
classe Domaine_dis_base Cette classe est la base de la hierarchie des domaines discretisees.
const Domaine & domaine() const
int ouvrir(const char *name, IOS_OPEN_MODE mode=ios::out) override
Ouvre le fichier avec les parametres mode et prot donnes Ces parametres sont les parametres de la met...
void precision(int) override
Class defining operators and methods for all reading operation in an input flow (file,...
classe Equation_base Le role d'une equation est le calcul d'un ou plusieurs champs....
virtual const Champ_Inc_base & inconnue() const =0
virtual Domaine_Cl_dis_base & domaine_Cl_dis()
Renvoie le domaine des conditions aux limite discretisee associee a l'equation.
Probleme_base & probleme()
Renvoie le probleme associe a l'equation.
Domaine_dis_base & domaine_dis()
Renvoie le domaine discretise associe a l'equation.
const Nom & le_nom() const override
Renvoie le nom du champ.
const Noms & noms_compo() const
Renvoie le tableau des noms des composantes du champ.
int num_premiere_face() const
classe Frontiere_dis_base Classe representant une frontiere discretisee.
const Nom & le_nom() const override
Renvoie le nom de la frontiere geometrique.
Classe Matrice_Morse Represente une matrice M (creuse), non necessairement carree.
const Equation_base & equation() const
Renvoie la reference sur l'equation pointe par MorEqn::mon_equation.
Une chaine de caractere (Nom) en majuscules.
class Nom Une chaine de caractere pour nommer les objets de TRUST
const char * getChar() const
const Nom getSuffix(const char *const) const
int longueur() const
Renvoie le nombre de caracteres de la chaine du Nom y compris le caractere zero de fin de chaine.
const std::string & getString() const
Un tableau de chaine de caracteres (VECT(Nom)).
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 Operateur_base Classe est la base de la hierarchie des objets representant un
virtual void ajouter_termes_croises(const DoubleTab &inco, const Probleme_base &autre_pb, const DoubleTab &autre_inco, DoubleTab &resu) const
void set_fichier(const Nom &)
virtual void modifier_pour_Cl(Matrice_Morse &, DoubleTab &) const
DOES NOTHING - to override in derived classes.
Champs_compris champs_compris_
virtual void calculer_dt_local(DoubleTab &) const
virtual void associer_champ(const Champ_Inc_base &, const std::string &nom_ch)
virtual DoubleTab & calculer(const DoubleTab &, DoubleTab &) const
virtual void contribuer_a_avec(const DoubleTab &, Matrice_Morse &) const
DOES NOTHING - to override in derived classes.
virtual void associer_domaine_cl_dis(const Domaine_Cl_dis_base &)
virtual int has_interface_blocs() const
void tester_contribuer_a_avec(const DoubleTab &, const Matrice_Morse &)
virtual void associer(const Domaine_dis_base &, const Domaine_Cl_dis_base &, const Champ_Inc_base &inco)=0
virtual void mettre_a_jour(double temps)
DOES NOTHING - to override in derived classes.
virtual void ajouter_flux(const DoubleTab &inconnue, DoubleTab &contribution) const
void ouvrir_fichier_partage(EcrFicPartage &, const Nom &, const int flag=1) const
Ouverture/creation d'un fichier d'impression d'un operateur A surcharger dans les classes derivees.
void calculer_pour_post(Champ_base &espace_stockage, const Nom &option, int comp) const override
bool has_champ(const Motcle &nom, OBS_PTR(Champ_base) &ref_champ) const override
virtual void preparer_calcul()
virtual void dimensionner_bloc_vitesse(Matrice_Morse &matrice) const
virtual double calculer_dt_stab() const
Calcul dt_stab.
virtual void dimensionner_termes_croises(Matrice_Morse &, const Probleme_base &autre_pb, int nl, int nc) const
virtual void dimensionner(Matrice_Morse &) const
DOES NOTHING - to override in derived classes.
virtual void completer()
Associe l'operateur au domaine_dis, le domaine_Cl_dis, et a l'inconnue de son equation.
void get_noms_champs_postraitables(Noms &nom, Option opt=NONE) const override
virtual int impr(Sortie &os) const
DOES NOTHING - to override in derived classes.
virtual void contribuer_bloc_vitesse(const DoubleTab &, Matrice_Morse &) const
Motcle get_localisation_pour_post(const Nom &option) const override
virtual void dimensionner_blocs(matrices_t matrices, const tabs_t &semi_impl={ }) const
const Champ_base & get_champ(const Motcle &nom) const override
virtual void contribuer_au_second_membre(DoubleTab &) const
DOES NOTHING - to override in derived classes.
virtual void resetTime(double time)
virtual void ajouter_contribution_explicite_au_second_membre(const Champ_Inc_base &inconnue, DoubleTab &derivee) const
virtual void abortTimeStep()
const Nom description() const
virtual DoubleTab & ajouter(const DoubleTab &, DoubleTab &) const
virtual int systeme_invariant() const
virtual void ajouter_blocs(matrices_t matrices, DoubleTab &secmem, const tabs_t &semi_impl={ }) const
virtual void contribuer_termes_croises(const DoubleTab &inco, const Probleme_base &autre_pb, const DoubleTab &autre_inco, Matrice_Morse &matrice) const
virtual void calculer_flux(const DoubleTab &inconnue, DoubleTab &flux) const
void ouvrir_fichier(SFichier &os, const Nom &, const int flag=1) const
Ouverture/creation d'un fichier d'impression d'un operateur A surcharger dans les classes derivees.
classe Periodique Cette classe represente une condition aux limites periodique.
const Nom & le_nom() const override
Donne le nom de l'Objet_U Methode a surcharger : renvoie "neant" dans cette implementation.
classe Probleme_base C'est un Probleme_U qui n'est pas un couplage.
bool & reprise_effectuee()
const Schema_Temps_base & schema_temps() const
Renvoie le schema en temps associe au probleme.
static void abort()
Routine de sortie de Trio-U sur une erreur abort().
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...
int nb_impr() const
Renvoie le nombre d'impressions effectuees.
int gnuplot_header() const
int precision_impr() const
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_col_width(int w)
virtual int add_col(const double ob)
_SIZE_ dimension(int d) const