16#include <Champ_front_ALE_lag.h>
17#include <Champ_base.h>
18#include <Frontiere_dis_base.h>
19#include <Interprete.h>
20#include <Probleme_base.h>
23#include <medcoupling++.h>
24#include <MEDCouplingMemArray.hxx>
25using namespace MEDCoupling;
34 is >> external_pb_name_ >> external_field_name_;
41 os << external_pb_name_ <<
" " << external_field_name_;
45const Probleme_base& Champ_front_ALE_lag::external_problem()
const
47 if (external_pb_name_ ==
"??")
49 Cerr <<
"Champ_front_ALE_lag : aucun probleme externe n'a ete specifie." << finl;
52 return ref_cast(Probleme_base,
interprete().objet(external_pb_name_));
57 if (external_field_name_ ==
"??")
59 Cerr <<
"Champ_front_ALE_lag : aucun champ externe n'a ete specifie." << finl;
64 Cerr <<
"Champ_front_ALE_lag : le probleme " << pb.
le_nom()
65 <<
" ne contient pas de champ " << external_field_name_ << finl;
68 return pb.
get_champ(external_field_name_);
71void Champ_front_ALE_lag::check_external_field(
const Champ_base& champ)
const
73 const DoubleTab&
valeurs = champ.valeurs();
76 Cerr <<
"Champ_front_ALE_lag : le champ externe " << champ.
le_nom()
77 <<
" doit avoir " <<
nb_comp() <<
" composantes par sommet (line_size="
78 <<
valeurs.line_size() <<
")." << finl;
83void Champ_front_ALE_lag::build_vertex_mapping(
const Domaine& ale_dom,
const Domaine& ext_dom)
86 Cerr <<
"Champ_front_ALE_lag : MEDCoupling est requis pour utiliser un champ lagrangien externe." << finl;
89 const DoubleTab& ext_coords = ext_dom.
les_sommets();
90 const DoubleTab& ale_coords = ale_dom.
les_sommets();
93 const int nb_ext = ext_coords.
dimension(0);
94 const int nb_ale = ale_coords.
dimension(0);
96 MCAuto<DataArrayDouble> ext_pts(DataArrayDouble::New());
97 MCAuto<DataArrayDouble> ale_pts(DataArrayDouble::New());
98 ext_pts->alloc(nb_ext, dim);
99 ale_pts->alloc(nb_ale, dim);
101 double * ext_ptr = ext_pts->getPointer();
102 for (
int i = 0; i < nb_ext; i++)
103 for (
int d = 0; d < dim; d++)
104 ext_ptr[i * dim + d] = ext_coords(i, d);
106 double * ale_ptr = ale_pts->getPointer();
107 for (
int i = 0; i < nb_ale; i++)
108 for (
int d = 0; d < dim; d++)
109 ale_ptr[i * dim + d] = ale_coords(i, d);
111 MCAuto<DataArrayIdType> closest(ext_pts->findClosestTupleId(ale_pts));
112 external_vertex_id_for_ale_vertex_.resize(nb_ale);
113 external_vertex_id_for_ale_vertex_ = -1;
114 for (
int i = 0; i < nb_ale; i++)
115 external_vertex_id_for_ale_vertex_[i] =
static_cast<int>(closest->getIJ(i, 0));
116 mapping_initialized_ =
true;
117 mapping_size_ = nb_ale;
124 Cerr <<
"Champ_front_ALE_lag::remplir_vit_som_bord_ALE : MEDCoupling est requis pour utiliser un champ lagrangien externe." << finl;
130 check_external_field(champ);
132 const Frontiere& front = la_frontiere_dis->frontiere();
133 const Domaine& domaine = front.
domaine();
134 const Domaine& external_dom = pb.
domaine();
135 const DoubleTab&
valeurs = champ.valeurs();
139 Cerr <<
"Champ_front_ALE_lag : le champ " << champ.le_nom()
140 <<
" contient " <<
valeurs.dimension(0) <<
" sommets alors que le domaine "
141 << external_dom.
le_nom() <<
" en possede " << external_dom.
nb_som() <<
"." << finl;
145 if (!mapping_initialized_ || mapping_size_ != domaine.nb_som())
146 build_vertex_mapping(domaine, external_dom);
148 const int nb_som_tot = domaine.nb_som_tot();
153 const int nb_faces = faces_som.
dimension(0);
154 const int nb_som_face = faces_som.
dimension(1);
155 for (
int f = 0; f < nb_faces; f++)
156 for (
int k = 0; k < nb_som_face; k++)
158 const int som = faces_som(f, k);
159 if (som < 0)
continue;
160 const int ext = external_vertex_id_for_ale_vertex_[som];
161 if (ext < 0)
continue;
162 for (
int comp = 0; comp <
nb_comp(); comp++)
classe Champ_base Cette classe est la base de la hierarchie des champs.
void remplir_vit_som_bord_ALE(double temps) override
DoubleTab vit_som_bord_ALE
virtual DoubleTab & valeurs() override
Renvoie le tableau des valeurs du champ.
DoubleTab_t & les_sommets()
int_t nb_som() const
Renvoie le nombre de sommets du domaine.
const Nom & le_nom() const override
Donne le nom de l'Objet_U Methode a surcharger : renvoie "neant" dans cette implementation.
Class defining operators and methods for all reading operation in an input flow (file,...
const IntTab_t & les_sommets() const
Renvoie le tableau des sommets de toutes les faces.
virtual void fixer_nb_comp(int i)
Fixe le nombre de composantes du champ.
virtual int nb_comp() const
const Domaine_t & domaine() const
Renvoie le domaine associe a la frontiere.
const Faces_t & faces() const
const Nom & le_nom() const override
Renvoie *this;.
const Interprete & interprete() const
virtual Entree & readOn(Entree &)
Lecture d'un Objet_U sur un flot d'entree Methode a surcharger.
virtual Sortie & printOn(Sortie &) const
Ecriture de l'objet sur un flot de sortie Methode a surcharger.
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 has_champ(const Motcle &nom, OBS_PTR(Champ_base) &ref_champ) const override
const Domaine & domaine() const
Renvoie le domaine associe au probleme.
const Champ_base & get_champ(const Motcle &nom) const override
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
Classe de base des flux de sortie.
_SIZE_ dimension(int d) const