TrioCFD 1.9.8
TrioCFD documentation
Loading...
Searching...
No Matches
Domaine_Cl_dis_base.cpp
1/****************************************************************************
2* Copyright (c) 2026, CEA
3* All rights reserved.
4*
5* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
6* 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
7* 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
8* 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
9*
10* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
11* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
12* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
13*
14*****************************************************************************/
15
16#include <Cond_lim_utilisateur_base.h>
17#include <Domaine_Cl_dis_base.h>
18#include <Frontiere_dis_base.h>
19#include <Schema_Temps_base.h>
20#include <Equation_base.h>
21#include <Probleme_base.h>
22
23Implemente_base(Domaine_Cl_dis_base,"Domaine_Cl_dis_base",Objet_U);
24
26{
27 return os;
28}
29
30/*! @brief Surcharge Objet_U::readOn(Sortie&) Lit les conditions aux limites discretisees a partir d'un flot d'entree
31 *
32 * Le format attendu est le suivant:
33 * {
34 * Nom Cond_lim [REPETER LECTURE AUTANT DE FOIS QUE NECESSAIRE]
35 * }
36 *
37 * @param (Entree& is) un flot d'entree
38 * @return (Entree&) le flot d'entree modifie
39 * @throws accolade ouvrante attendue
40 * @throws nombre de conditions aux limites lues invalide
41 */
43{
44 assert(mon_equation);
45 const Domaine& ledomaine=equation().domaine_dis().domaine();
46 Motcle accolade_ouverte("{");
47 Motcle accolade_fermee("}");
48 Nom nomlu;
49 Motcle motlu;
50 is >> motlu;
51 if (motlu != accolade_ouverte)
52 {
53 Cerr << "Error while reading the boundaries conditions\n";
54 Cerr << "We expected a " << accolade_ouverte << " instead of \n"
55 << motlu;
56 exit();
57 }
58
59 int n = ledomaine.nb_front_Cl();
60 IntTab front_deja_lu(n);
61 front_deja_lu = 0;
62 les_conditions_limites().dimensionner(n);
63 int nb_clim=0;
64
65 while(1)
66 {
67
68 // lecture d'un nom de bord ou de }
69 is >> nomlu;
70 motlu=nomlu;
71 if (motlu == accolade_fermee)
72 break;
73
74 Cerr << "Reading the " << nomlu << " boundary condition of the " << equation().que_suis_je() << " equation from the problem " << equation().probleme().le_nom() << finl;
75 Journal()<< "Reading the boundary condition " << nomlu <<finl;
76
77 int rang=ledomaine.rang_frontiere(nomlu);
78
79 // Test supplementaire sur les conditions aux limites qui ont ete lues :
80 // on test si deux frontieres ont le meme nom
81 if (front_deja_lu(rang) == 0)
82 front_deja_lu(rang) = 1;
83 else
84 {
85 Cerr <<finl;
86 Cerr <<"Error in the data set "<<finl;
87 Cerr <<"the boundary condition associated"<<finl;
88 Cerr <<"to the boundary "<< nomlu <<"is read twice !!"<<finl;
89 exit();
90 }
91 // const Frontiere& frontiere=domaine.frontiere(rang);
92 is >> les_conditions_limites(rang);
93 // Si on avait une condition_limite_utilisateur
94 // Il faut recuperer la cl stockee dans celle ci
95 // la copier et detruire celle contenue dans la cond_utilisateur
96 if (sub_type(Cond_lim_utilisateur_base,les_conditions_limites(rang).valeur()))
97 {
98 Cond_lim_utilisateur_base& la_cl=ref_cast(Cond_lim_utilisateur_base,les_conditions_limites(rang).valeur());
99 la_cl.lire(is,equation(),nomlu);
100 Cond_lim* sa=&(la_cl.la_cl());
101
102 // WEC : La nouvelle formulation evite la copie de l'objet Cond_lim_base
103 // Cette copie peut poser probleme aux champs qui s'enregistrent dans un vecteur
104 // (Champ_Inputs). Le vecteur pointe sur n'importe quoi...
105 // Adopte la nouvelle et detruit l'ancienne (Cond_lim_utilisateur)
106 les_conditions_limites(rang).adopt(*sa);
107 //les_conditions_limites(rang)=(*sa);
108 delete sa;
109 }
110 les_conditions_limites(rang)->associer_fr_dis_base(domaine_dis().frontiere_dis(rang));
111
112 //Test pour empecher l utilisation de 'Raccord_distant_homogene' en calcul sequentiel
113 const Frontiere& frontiere=ledomaine.frontiere(rang);
114 if ((frontiere.que_suis_je()=="Raccord_distant_homogene") && Process::is_sequential())
115 {
116 Cerr<<"At least one connection (adjacent boundary on two domains) is of type 'Raccord distant homogene'." << finl;
117 Cerr<<"Use 'Raccord local homogene' to define the connections in sequential computing"<<finl;
118 Cerr<<"And 'Raccord distant homogene' for the connections in parallel computing." << finl;
119 exit();
120 }
121
122 nb_clim++;
123 }
124 if (nb_clim!=n)
125 {
127 Cerr << "It misses " << n-nb_clim << " boundaries conditions " << finl;
128 Cerr << "We read " << nb_clim << " boundaries conditions " << finl;
129 Cerr << "We waited " << n << " boundary conditions " << finl;
130 exit();
131 }
132 for (int num_cl=0; num_cl<nb_clim; num_cl++)
133 {
134 les_conditions_limites(num_cl)->associer_domaine_cl_dis_base(*this);
135 les_conditions_limites(num_cl)->verifie_ch_init_nb_comp();
136 // const Frontiere_dis_base& la_fr_dis = les_conditions_limites(num_cl).frontiere_dis();
137 // const Frontiere& frontiere=la_fr_dis.frontiere();
138 // const Domaine& domaine2=frontiere.domaine();
139 }
140
141 return is;
142}
143
144/*! @brief Renvoie 1 si l'objet contient une condition aux limites du Nom specifie.
145 *
146 * Renvoie 0 sinon.
147 *
148 * @param (Nom& type) le nom de la condition aux limites a chercher
149 * @return (int) 1 si la condition aux limites de nom specifie a ete trouve, 0 sinon.
150 */
152{
153 for (auto& itr : les_conditions_limites_)
154 if (itr.get_info()->has_base(type)) return 1;
155 return 0;
156}
157
158/*! @brief Renvoie une reference sur le domaine discretise associe aux conditions aux limites.
159 *
160 * Ce Domaine_dis est associe au travers de l'equation
161 * associee et pas directement a l'objet Domaine_Cl_dis_base.
162 *
163 * @return (Domaine_dis_base&) le domaine discretise associe a l'equation associe aux conditions aux limites.
164 */
169
170/*! @brief Renvoie une reference sur le domaine discretise associe aux conditions aux limites.
171 *
172 * Cet Domaine_dis est associe au travers de l'equation
173 * associee et pas directement a l'objet Domaine_Cl_dis_base.
174 * (version const)
175 *
176 * @return (Domaine_dis_base&) le domaine discretise associe a l'equation associe aux conditions aux limites.
177 */
182
183/*! @brief Change le i-eme temps futur de toutes les CLs.
184 *
185 */
187{
188 for (int j=0; j<nb_cond_lim(); j++)
190}
191
192/*! @brief Change le i-eme temps futur de toutes les CLs.
193 *
194 */
196{
197 for (int j=0; j<nb_cond_lim(); j++)
199}
200
201/*! @brief Tourne la roue des CLs jusqu'au temps donne
202 *
203 */
205{
206 int ok=1;
207 for (int j=0; j<nb_cond_lim(); j++)
208 ok = ok && les_conditions_limites_[j]->avancer(temps);
209 return ok;
210}
211
212/*! @brief Tourne la roue des CLsj usqu'au temps donne
213 *
214 */
216{
217 int ok=1;
218 for (int j=0; j<nb_cond_lim(); j++)
219 ok = ok && les_conditions_limites_[j]->reculer(temps);
220 return ok;
221}
222
223/*! @brief Effectue une mise a jour en temps de toutes les conditions aux limites.
224 *
225 * @param (double temps) le pas de temps de mise a jour
226 */
228{
229 les_conditions_limites_.mettre_a_jour(temps);
230}
231
232/* @brief See ICoCo::ProblemTrio::resetTime()
233 */
235{
236 les_conditions_limites_.resetTime(temps);
237}
238
239/*! @brief Effectue une mise a jour pour des sous pas de temps d'un schema en temps (par exemple dans RungeKutta)
240 *
241 * pour toutes les Cond Lims renvoyant 1 par le biais de la methode
242 * int Cond_Lim_base::a_mettre_a_jour_ss_pas_dt();
243 *
244 * @param (double temps) le pas de temps de mise a jour
245 */
247{
248 for (auto &itr : les_conditions_limites_)
249 {
250 Cond_lim_base& la_cl = itr.valeur();
251 if (la_cl.a_mettre_a_jour_ss_pas_dt() == 1)
252 la_cl.mettre_a_jour(temps);
253 }
254}
255
256/*! @brief Initialise les CLs Contrairement aux methodes mettre_a_jour, les methodes
257 *
258 * initialiser des CLs ne peuvent pas dependre de l'exterieur
259 * (lui-meme peut ne pas etre initialise)
260 *
261 * @return (int) 1 si OK, 0 sinon
262 */
264{
265 return les_conditions_limites_.initialiser(temps);
266}
267
268/*! @brief Calcul des coefficients d'echange pour les problemes couples thermiques
269 *
270 * @return (int) renvoie toujours 1
271 */
273{
274 les_conditions_limites_.calculer_coeffs_echange(temps);
275 return 1;
276}
277
278/*! @brief Appel Cond_lim_base::completer() sur chaque condition aux limites
279 *
280 */
286
287/*! @brief Renvoie la condition limite associee a une face reelle donnee.
288 *
289 * Met dans face_locale le numero de la face dans la frontiere.
290 * Provoque une erreur si la face ne porte pas de CL.
291 *
292 */
293const Cond_lim_base& Domaine_Cl_dis_base::condition_limite_de_la_face_reelle(int face_globale, int& face_locale) const
294{
295 for (int i=0; i<nb_cond_lim(); i++)
296 {
297 const Frontiere& fr=les_conditions_limites(i)->frontiere_dis().frontiere();
298 if (face_globale>=fr.num_premiere_face() && face_globale < fr.num_premiere_face()+fr.nb_faces())
299 {
300 face_locale=face_globale-fr.num_premiere_face();
301 return les_conditions_limites(i).valeur();
302 }
303 }
304 assert(0); // la face ne porte pas de CL
305 return les_conditions_limites(0).valeur(); // Pour compilo
306}
307
308/*! @brief Renvoie la condition limite associee a une face virtuelle donnee.
309 *
310 * Met dans face_locale le numero de la face dans la frontiere.
311 * Provoque une erreur si la face ne porte pas de CL.
312 *
313 */
314const Cond_lim_base& Domaine_Cl_dis_base::condition_limite_de_la_face_virtuelle(int face_globale, int& face_locale) const
315{
316 for (int i=0; i<nb_cond_lim(); i++)
317 {
318 const Frontiere& fr=les_conditions_limites(i)->frontiere_dis().frontiere();
319 const ArrOfInt& faces_virt=fr.get_faces_virt();
320 for (int j=0; j<faces_virt.size_array(); j++)
321 if (face_globale==faces_virt[j])
322 {
323 face_locale=fr.nb_faces()+j;
324 return les_conditions_limites(i).valeur();
325 }
326 }
327 assert(0); // la face ne porte pas de CL
328 return les_conditions_limites(0).valeur(); // Pour compilo
329}
330
331/*! @brief Renvoie la condition limite associee a une frontiere de nom donne.
332 *
333 * Provoque une erreur si aucune frontiere ne porte ce nom.
334 *
335 */
337{
338 for (int i=0; i<nb_cond_lim(); i++)
339 {
340 const Frontiere& fr=les_conditions_limites(i)->frontiere_dis().frontiere();
341 if (fr.le_nom()==frontiere)
342 return les_conditions_limites(i).valeur();
343 }
344 assert(0); // Aucune frontiere de ce nom
345 exit();
346 return les_conditions_limites(0).valeur(); // Pour compilo
347}
348
349/*! @brief Renvoie la condition limite associee a une frontiere de nom donne.
350 *
351 * Provoque une erreur si aucune frontiere ne porte ce nom.
352 *
353 */
355{
356 for (int i=0; i<nb_cond_lim(); i++)
357 {
358 const Frontiere& fr=les_conditions_limites(i)->frontiere_dis().frontiere();
359 if (fr.le_nom()==frontiere)
360 return les_conditions_limites(i).valeur();
361 }
362 assert(0); // Aucune frontiere de ce nom
363 exit();
364 return les_conditions_limites(0).valeur(); // Pour compilo
365}
366
367/*! @brief Calcule le taux d'accroissement des CLs instationnaires entre t1 et t2.
368 *
369 */
371{
372 for (int i=0; i<nb_cond_lim(); i++)
373 {
374 Champ_front_base& champ=les_conditions_limites(i)->champ_front();
375 if (champ.instationnaire()) champ.calculer_derivee_en_temps(t1,t2);
376 }
377}
378
379/*! @brief Renvoie la i-ieme condition aux limites.
380 *
381 * (version const)
382 *
383 * @param (int i) le rang de la i-ieme condition aux limites
384 * @return (Cond_lim&) la i-ieme condition aux limites
385 */
390
391/*! @brief Renvoie la i-ieme condition aux limites.
392 *
393 * @param (int i) le rang de la i-ieme condition aux limites
394 * @return (Cond_lim&) la i-ieme condition aux limites
395 */
400
401/*! @brief Renvoie le tableaux des conditions aux limites.
402 *
403 * @return (Conds_lim&) le tableau des conditions aux limites
404 */
409
410/*! @brief Renvoie le tableaux des conditions aux limites.
411 *
412 * (version const)
413 *
414 * @return (Conds_lim&) le tableau des conditions aux limites
415 */
420
421/*! @brief Renvoie le nombre de conditions aux limites.
422 *
423 * @return (int) le nombre de conditions aux limites
424 */
426{
427 return les_conditions_limites_.size();
428}
429
431{
432 return domaine().nb_faces_frontiere();
433}
434
436{
437 return domaine_dis().domaine();
438}
439const Domaine& Domaine_Cl_dis_base::domaine() const
440{
441 return domaine_dis().domaine();
442}
443
444/*! @brief A partir d'un indice de face de bord dans le Domaine_VF, renvoie la condition aux limites a laquelle cette face
445 *
446 * appartient, pour 0 <= num_face < nb_faces_Cl().
447 *
448 */
450{
451 // Algorithme generique: on parcourt les bords jusqu'a trouver
452 // celui qui contient la face.
453 // Les faces du bord 0, puis celle du bord 1, etc... se suivent
454 // dans le Domaine_VF.
455 assert(num_face >= 0);
456 int i = 0;
457 const int nb_cl = les_conditions_limites_.size();
458 for (i = 0; i < nb_cl; i++)
459 {
460 const Cond_lim_base& cl = les_conditions_limites_[i].valeur();
461 const Frontiere& fr = cl.frontiere_dis().frontiere();
462 int num_premiere_face = fr.num_premiere_face();
463 int nb_faces = fr.nb_faces();
464
465 if (num_face >= num_premiere_face && num_face < num_premiere_face + nb_faces)
466 break;
467 }
468 if (i == nb_cl)
469 {
470 Cerr << "Error in Domaine_Cl_dis_base::la_cl_de_la_face(num_face="
471 << num_face << ")\n This face is not on a boundary of cond_lim."
472 << finl;
473 exit();
474 }
475 return les_conditions_limites_[i];
476}
477
479{
480 nom_ = un_nom;
481}
482
484{
485 mon_inconnue=inco;
486}
487
489{
490 return mon_inconnue;
491}
492
494{
495 return mon_inconnue;
496}
Classe Champ_Inc_base.
classe Champ_front_base Classe de base pour la hierarchie des champs aux frontieres.
classe Cond_lim_base Classe de base pour la hierarchie des classes qui representent les differentes c...
virtual void mettre_a_jour(double temps)
Effectue une mise a jour en temps de la condition aux limites.
virtual int a_mettre_a_jour_ss_pas_dt()
Cette methode indique si cette condition aux limites doit etre mise a jour dans des sous pas de temps...
virtual Frontiere_dis_base & frontiere_dis()
Renvoie la frontiere discretisee a laquelle les conditions aux limites s'appliquent.
void lire(Entree &, Equation_base &, const Nom &nom_bord)
classe Cond_lim Classe generique servant a representer n'importe quelle classe
Definition Cond_lim.h:31
classe Conds_lim Cette classe represente un vecteur de conditions aux limites.
Definition Conds_lim.h:32
int nb_front_Cl() const
Definition Domaine.h:236
int_t nb_faces_frontiere() const
Renvoie le nombre de faces frontiere du domaine (somme des nombres de bords, de raccords et de bords ...
Definition Domaine.h:488
int rang_frontiere(const Nom &) const
Definition Domaine.cpp:1052
const Frontiere_t & frontiere(int i) const
Definition Domaine.h:539
classe Domaine_Cl_dis_base Les objets Domaine_Cl_dis_base representent les conditions aux limites
virtual void mettre_a_jour_ss_pas_dt(double temps)
Effectue une mise a jour pour des sous pas de temps d'un schema en temps (par exemple dans RungeKutta...
virtual int calculer_coeffs_echange(double temps)
Calcul des coefficients d'echange pour les problemes couples thermiques.
void calculer_derivee_en_temps(double t1, double t2)
Calcule le taux d'accroissement des CLs instationnaires entre t1 et t2.
void nommer(const Nom &nom) override
Donne un nom a l'Objet_U Methode virtuelle a surcharger.
virtual int initialiser(double temps)
Initialise les CLs Contrairement aux methodes mettre_a_jour, les methodes.
virtual const Champ_Inc_base & inconnue() const
const Cond_lim_base & condition_limite_de_la_frontiere(Nom frontiere) const
Renvoie la condition limite associee a une frontiere de nom donne.
int reculer(double temps)
Tourne la roue des CLsj usqu'au temps donne.
int nb_cond_lim() const
Renvoie le nombre de conditions aux limites.
virtual const Cond_lim & la_cl_de_la_face(int num_face) const
A partir d'un indice de face de bord dans le Domaine_VF, renvoie la condition aux limites a laquelle ...
void completer()
Appel Cond_lim_base::completer() sur chaque condition aux limites.
Conds_lim & les_conditions_limites()
Renvoie le tableaux des conditions aux limites.
void resetTime(double time)
Domaine_dis_base & domaine_dis()
Renvoie une reference sur le domaine discretise associe aux conditions aux limites.
virtual void associer_inconnue(const Champ_Inc_base &)
void set_temps_defaut(double temps)
Change le i-eme temps futur de toutes les CLs.
virtual void mettre_a_jour(double temps)
Effectue une mise a jour en temps de toutes les conditions aux limites.
int avancer(double temps)
Tourne la roue des CLs jusqu'au temps donne.
int contient_Cl(const Nom &)
Renvoie 1 si l'objet contient une condition aux limites du Nom specifie.
const Cond_lim_base & condition_limite_de_la_face_reelle(int face_globale, int &face_locale) const
Renvoie la condition limite associee a une face reelle donnee.
const Cond_lim_base & condition_limite_de_la_face_virtuelle(int face_globale, int &face_locale) const
Renvoie la condition limite associee a une face virtuelle donnee.
void changer_temps_futur(double temps, int i)
Change le i-eme temps futur de toutes les CLs.
classe Domaine_dis_base Cette classe est la base de la hierarchie des domaines discretisees.
const Domaine & domaine() const
void ecrire_noms_bords(Sortie &) const
Ecriture des noms des bords sur un flot de sortie.
Class defining operators and methods for all reading operation in an input flow (file,...
Definition Entree.h:42
Probleme_base & probleme()
Renvoie le probleme associe a l'equation.
Domaine_dis_base & domaine_dis()
Renvoie le domaine discretise associe a l'equation.
const ArrOfInt_t & get_faces_virt() const
Definition Frontiere.h:69
int_t num_premiere_face() const
Definition Frontiere.h:67
const Nom & le_nom() const override
Donne le nom de l'Objet_U Methode a surcharger : renvoie "neant" dans cette implementation.
Definition Frontiere.h:49
int_t nb_faces() const
Renvoie le nombre de faces de la frontiere.
Definition Frontiere.h:59
const Frontiere & frontiere() const
Renvoie la frontiere geometrique associee.
const Equation_base & equation() const
Renvoie la reference sur l'equation pointe par MorEqn::mon_equation.
Definition MorEqn.h:62
class Nom Une chaine de caractere pour nommer les objets de TRUST
Definition Nom.h:31
classe Objet_U Cette classe est la classe de base des Objets de TRUST
Definition Objet_U.h:73
const Nom & que_suis_je() const
renvoie la chaine identifiant la classe.
Definition Objet_U.cpp:104
virtual Entree & readOn(Entree &)
Lecture d'un Objet_U sur un flot d'entree Methode a surcharger.
Definition Objet_U.cpp:293
virtual Sortie & printOn(Sortie &) const
Ecriture de l'objet sur un flot de sortie Methode a surcharger.
Definition Objet_U.cpp:282
const Nom & le_nom() const override
Donne le nom de l'Objet_U Methode a surcharger : renvoie "neant" dans cette implementation.
Definition Probleme_U.h:109
static Sortie & Journal(int message_level=0)
Renvoie un objet statique de type Sortie qui sert de journal d'evenements.
Definition Process.cpp:588
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
Definition Process.cpp:455
static bool is_sequential()
Definition Process.cpp:115
Classe de base des flux de sortie.
Definition Sortie.h:52
_SIZE_ size_array() const