TRUST 1.9.8
HPC thermohydraulic platform
Loading...
Searching...
No Matches
Verif_Cl.cpp
1/****************************************************************************
2* Copyright (c) 2025, 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 <Entree_fluide_concentration_imposee.h>
17#include <Dirichlet_entree_fluide_leaves.h>
18#include <Dirichlet_paroi_defilante.h>
19#include <Entree_fluide_T_h_imposee.h>
20#include <Neumann_paroi_adiabatique.h>
21#include <Neumann_paroi_flux_nul.h>
22#include <Echange_global_impose.h>
23#include <Echange_externe_impose.h>
24#include <Scalaire_impose_paroi.h>
25#include <Neumann_sortie_libre.h>
26#include <Dirichlet_paroi_fixe.h>
27#include <Domaine_Cl_dis_base.h>
28#include <Frontiere_dis_base.h>
29
30#include <Neumann_paroi.h>
31#include <Periodique.h>
32#include <Verif_Cl.h>
33#include <Symetrie.h>
34#include <Motcle.h>
35
36/*! @brief Teste la compatibilite des conditions aux limites thermiques et hydrauliques.
37 *
38 * La liste des compatibilites est la suivante:
39 * -----------------------------------------------------------------------
40 * Hydraulique | Thermique
41 * -----------------------------------------------------------------------
42 * Entree_fluide_vitesse_imposee ===> Entree_fluide_temperature_imposee
43 * Entree_fluide_vitesse_imposee_libre => Neumann_sortie_libre
44 * -----------------------------------------------------------------------
45 * Dirichlet_paroi_fixe |
46 * Dirichlet_paroi_defilante =======> Neumann_paroi_adiabatique
47 * =================================> Neumann_paroi
48 * =================================> Echange_global_impose
49 * =================================> Echange_externe_impose
50 * =================================> Scalaire_impose_paroi
51 * -----------------------------------------------------------------------
52 * Neumann_sortie_libre ============> Entree_fluide_temperature_imposee
53 * =================================> Neumann_sortie_libre
54 * -----------------------------------------------------------------------
55 * Symetrie ========================> Neumann_paroi_adiabatique
56 * =================================> Neumann_paroi
57 * =================================> Echange_global_impose
58 * =================================> Echange_externe_impose
59 * =================================> Scalaire_impose_paroi
60 * =================================> Symetrie
61 * -----------------------------------------------------------------------
62 * Periodique ======================> Periodique
63 *
64 * @param (Domaine_Cl_dis_base& domaine_Cl_hydr)
65 * @param[in] (Domaine_Cl_dis_base& domaine_Cl_th)
66 * @return (int) renvoie toujours 1
67 * @throws nombres de conditions aux limites differents
68 * @throws conditions aux limites hydraulique et thermique incompatibles
69 */
70int tester_compatibilite_hydr_thermique(const Domaine_Cl_dis_base& domaine_Cl_hydr, const Domaine_Cl_dis_base& domaine_Cl_th)
71{
72
73 int nb_Cl = domaine_Cl_hydr.nb_cond_lim();
74
75 if (domaine_Cl_th.nb_cond_lim() != nb_Cl)
76 {
77 Cerr << "The two objects of OWN_PTR(Domaine_Cl_dis_base) type don't have" << finl;
78 Cerr << "the same number of boundary conditions." << finl;
80 }
81
82 for (int num_Cl = 0; num_Cl < nb_Cl; num_Cl++)
83 {
84 const Cond_lim& la_cl_hydr = domaine_Cl_hydr.les_conditions_limites(num_Cl);
85 const Cond_lim& la_cl_th = domaine_Cl_th.les_conditions_limites(num_Cl);
86 if (sub_type(Entree_fluide_vitesse_imposee_libre, la_cl_hydr.valeur()))
87 {
88 if ((sub_type(Entree_fluide_temperature_imposee, la_cl_th.valeur())) || (sub_type(Neumann_sortie_libre, la_cl_th.valeur())))
89 { /* Do nothing */ }
90 else if ((sub_type(Entree_fluide_T_h_imposee, la_cl_th.valeur())) || (sub_type(Neumann_sortie_libre, la_cl_th.valeur())))
91 { /* Do nothing */ }
92 else
93 {
94 message_erreur_therm(la_cl_hydr, la_cl_th, num_Cl);
95 }
96 }
97 else if (sub_type(Entree_fluide_vitesse_imposee, la_cl_hydr.valeur()) && (la_cl_hydr->que_suis_je() != "Frontiere_ouverte_vitesse_imposee_ALE"))
98 {
99 if (sub_type(Entree_fluide_temperature_imposee, la_cl_th.valeur()))
100 { /* Do nothing */ }
101 else if (sub_type(Entree_fluide_T_h_imposee, la_cl_th.valeur()))
102 { /* Do nothing */ }
103 else
104 {
105 message_erreur_therm(la_cl_hydr, la_cl_th, num_Cl);
106 }
107 }
108 else if ((sub_type(Dirichlet_paroi_fixe, la_cl_hydr.valeur())) || (sub_type(Dirichlet_paroi_defilante, la_cl_hydr.valeur())) || (la_cl_hydr->que_suis_je() == "Frontiere_ouverte_vitesse_imposee_ALE"))
109 {
110 if ((sub_type(Neumann_paroi_adiabatique, la_cl_th.valeur())) || (sub_type(Neumann_paroi, la_cl_th.valeur())) || (sub_type(Echange_global_impose, la_cl_th.valeur()))
111 || (sub_type(Echange_externe_impose, la_cl_th.valeur())) || (sub_type(Scalaire_impose_paroi, la_cl_th.valeur())))
112 { /* Do nothing */ }
113 else
114 {
115 message_erreur_therm(la_cl_hydr, la_cl_th, num_Cl);
116 }
117 }
118 else if (sub_type(Neumann_sortie_libre, la_cl_hydr.valeur()))
119 {
120 if ((sub_type(Entree_fluide_temperature_imposee, la_cl_th.valeur())) || (sub_type(Neumann_sortie_libre, la_cl_th.valeur())))
121 { /* Do nothing */}
122 else
123 {
124 message_erreur_therm(la_cl_hydr, la_cl_th, num_Cl);
125 }
126 }
127 else if (sub_type(Symetrie, la_cl_hydr.valeur()))
128 {
129 if ((sub_type(Neumann_paroi_adiabatique, la_cl_th.valeur())) || (sub_type(Neumann_paroi, la_cl_th.valeur())) || (sub_type(Echange_global_impose, la_cl_th.valeur()))
130 || (sub_type(Echange_externe_impose, la_cl_th.valeur())) || (sub_type(Scalaire_impose_paroi, la_cl_th.valeur())) || (sub_type(Symetrie, la_cl_th.valeur())))
131 { /* Do nothing */}
132 else
133 {
134 message_erreur_therm(la_cl_hydr, la_cl_th, num_Cl);
135 }
136 }
137 else if (sub_type(Periodique, la_cl_hydr.valeur()))
138 {
139 if (sub_type(Periodique, la_cl_th.valeur()))
140 { /* Do nothing */}
141 else
142 {
143 message_erreur_therm(la_cl_hydr, la_cl_th, num_Cl);
144 }
145 }
146 }
147 return 1;
148}
149
150/*! @brief Affiche un message d'erreur pour la fonction precedente
151 *
152 * @param (Domaine_Cl_dis_base& domaine_Cl_hydr)
153 * @param (Domaine_Cl_dis_base& domaine_Cl_th)
154 * @param (int num_Cl) numero de la CL
155 * @return (int) renvoie toujours 1
156 */
157int message_erreur_therm(const Cond_lim& la_cl_hydr, const Cond_lim& la_cl_th, int& num_Cl)
158{
159 Cerr << "The hydraulic and thermal boundary conditions are not consitent on border:" << finl;
160 Cerr << "Boundary conditions number " << num_Cl << " \"" << la_cl_th->frontiere_dis().le_nom() << "\" have been assigned to : " << finl;
161 Cerr << la_cl_hydr->que_suis_je() << " and " << la_cl_th->que_suis_je() << " !! " << finl;
163 return 1;
164}
165
166/*! @brief Teste la compatibilite des conditions aux limites concentration et hydrauliques.
167 *
168 * La liste des compatibilites est la suivante:
169 * -----------------------------------------------------------------------
170 * Hydraulique | Concentration
171 * -----------------------------------------------------------------------
172 * Entree_fluide_vitesse_imposee ===> Entree_fluide_concentration_imposee
173 * =================================> Neumann_sortie_libre
174 * -----------------------------------------------------------------------
175 * Dirichlet_paroi_fixe |
176 * Dirichlet_paroi_defilante =======> Neumann_paroi_flux_nul
177 * -----------------------------------------------------------------------
178 * Neumann_sortie_libre ============> Neumann_sortie_libre
179 * =================================> Entree_fluide_concentration_imposee
180 * -----------------------------------------------------------------------
181 * Symetrie ========================> Symetrie
182 * =================================> Neumann_paroi_flux_nul
183 * -----------------------------------------------------------------------
184 * Periodique ======================> Periodique
185 *
186 * @param (Domaine_Cl_dis_base& domaine_Cl_hydr)
187 * @param (Domaine_Cl_dis_base& domaine_Cl_co)
188 * @return (int) renvoie toujours 1
189 * @throws nombres de conditions aux limites differents
190 * @throws conditions aux limite hydraulique et concentration incompatible
191 */
192int tester_compatibilite_hydr_concentration(const Domaine_Cl_dis_base& domaine_Cl_hydr, const Domaine_Cl_dis_base& domaine_Cl_co)
193{
194
195 int nb_Cl = domaine_Cl_hydr.nb_cond_lim();
196
197 if (domaine_Cl_co.nb_cond_lim() != nb_Cl)
198 {
199 Cerr << "The two objects of OWN_PTR(Domaine_Cl_dis_base) type don't have" << finl;
200 Cerr << "the same number of boundary conditions." << finl;
202 }
203
204 for (int num_Cl = 0; num_Cl < nb_Cl; num_Cl++)
205 {
206 const Cond_lim& la_cl_hydr = domaine_Cl_hydr.les_conditions_limites(num_Cl);
207 const Cond_lim& la_cl_co = domaine_Cl_co.les_conditions_limites(num_Cl);
208
209 if (sub_type(Entree_fluide_vitesse_imposee, la_cl_hydr.valeur()))
210 {
211 if ((sub_type(Entree_fluide_concentration_imposee, la_cl_co.valeur())) || (sub_type(Neumann_sortie_libre, la_cl_co.valeur())))
212 { /* Do nothing */ }
213 else
214 {
215 message_erreur_conc(la_cl_hydr, la_cl_co, num_Cl);
216 }
217 }
218 else if ((sub_type(Dirichlet_paroi_fixe, la_cl_hydr.valeur())) || (sub_type(Dirichlet_paroi_defilante, la_cl_hydr.valeur())))
219 {
220 if ((!sub_type(Neumann_paroi_flux_nul, la_cl_co.valeur())) && (!sub_type(Neumann_paroi, la_cl_co.valeur())) && (!sub_type(Scalaire_impose_paroi, la_cl_co.valeur())))
221 {
222 message_erreur_conc(la_cl_hydr, la_cl_co, num_Cl);
223 }
224 }
225 else if (sub_type(Neumann_sortie_libre, la_cl_hydr.valeur()))
226 {
227 if ((sub_type(Neumann_sortie_libre, la_cl_co.valeur())) || (sub_type(Entree_fluide_concentration_imposee, la_cl_co.valeur())))
228 { /* Do nothing */}
229 else
230 {
231 message_erreur_conc(la_cl_hydr, la_cl_co, num_Cl);
232 }
233 }
234 else if (sub_type(Symetrie, la_cl_hydr.valeur()))
235 {
236 if ((sub_type(Symetrie, la_cl_co.valeur())) || (sub_type(Neumann_paroi_flux_nul, la_cl_co.valeur()))|| (sub_type(Echange_externe_impose, la_cl_co.valeur())))
237 { /* Do nothing */}
238 else
239 {
240 message_erreur_conc(la_cl_hydr, la_cl_co, num_Cl);
241 }
242 }
243 else if (sub_type(Periodique, la_cl_hydr.valeur()))
244 {
245 if (sub_type(Periodique, la_cl_co.valeur()))
246 { /* Do nothing */}
247 else
248 {
249 message_erreur_conc(la_cl_hydr, la_cl_co, num_Cl);
250 }
251 }
252 }
253
254 return 1;
255}
256
257/*! @brief Affiche un message d'erreur pour la fonction precedente
258 *
259 * @param (Domaine_Cl_dis_base& domaine_Cl_hydr)
260 * @param (Domaine_Cl_dis_base& domaine_Cl_co)
261 * @param (int num_Cl) numero de la CL
262 * @return (int) renvoie toujours 1
263 */
264int message_erreur_conc(const Cond_lim& la_cl_hydr, const Cond_lim& la_cl_co, int& num_Cl)
265{
266 Cerr << "The hydraulic and concentration boundary conditions are not consitent on border:" << finl;
267 Cerr << "Boundary conditions number " << num_Cl << " \"" << la_cl_co->frontiere_dis().le_nom() << "\" have been assigned to : " << finl;
268 Cerr << la_cl_hydr->que_suis_je() << " and " << la_cl_co->que_suis_je() << " !! " << finl;
270 return 1;
271}
272
273/*! @brief Teste la compatibilite des conditions aux limites fraction massqiues et hydrauliques.
274 *
275 * La liste des compatibilites est la suivante:
276 * -----------------------------------------------------------------------
277 * Hydraulique | Fraction massique
278 * -----------------------------------------------------------------------
279 * Entree_fluide_vitesse_imposee ===> Entree_fluide_fraction_massique_imposee
280 * Entree_fluide_vitesse_imposee_libre => Neumann_sortie_libre
281 * Entree_fluide_vitesse_imposee ===> Echange_externe_impose
282 * Entree_fluide_vitesse_imposee ===> Neumann_paroi
283 * -----------------------------------------------------------------------
284 * Dirichlet_paroi_fixe |
285 * Dirichlet_paroi_defilante =======> Neumann_paroi_flux_nul
286 * =================================> Echange_externe_impose
287 * -----------------------------------------------------------------------
288 * Neumann_sortie_libre ============> Entree_fluide_fraction_massique_imposee
289 * =================================> Neumann_sortie_libre
290 * -----------------------------------------------------------------------
291 * Symetrie ========================> Symetrie
292 * =================================> Neumann_paroi_flux_nul
293 * =================================> Neumann_paroi
294 * -----------------------------------------------------------------------
295 * Periodique ======================> Periodique
296 *
297 * @param (Domaine_Cl_dis_base& domaine_Cl_hydr)
298 * @param[in] (Domaine_Cl_dis_base& domaine_Cl_fm)
299 * @return (int) renvoie toujours 1
300 * @throws nombres de conditions aux limites differents
301 * @throws conditions aux limites hydraulique et fraction massiques incompatibles
302 */
303int tester_compatibilite_hydr_fraction_massique(const Domaine_Cl_dis_base& domaine_Cl_hydr, const Domaine_Cl_dis_base& domaine_Cl_fm)
304{
305
306 int nb_Cl = domaine_Cl_hydr.nb_cond_lim();
307
308 if (domaine_Cl_fm.nb_cond_lim() != nb_Cl)
309 {
310 Cerr << "The two objects of OWN_PTR(Domaine_Cl_dis_base) type don't have" << finl;
311 Cerr << "the same number of boundary conditions." << finl;
313 }
314
315 for (int num_Cl = 0; num_Cl < nb_Cl; num_Cl++)
316 {
317 const Cond_lim& la_cl_hydr = domaine_Cl_hydr.les_conditions_limites(num_Cl);
318 const Cond_lim& la_cl_fm = domaine_Cl_fm.les_conditions_limites(num_Cl);
319 if (sub_type(Entree_fluide_vitesse_imposee_libre, la_cl_hydr.valeur()))
320 {
321 if ((sub_type(Entree_fluide_fraction_massique_imposee, la_cl_fm.valeur())) || (sub_type(Neumann_sortie_libre, la_cl_fm.valeur())) || (sub_type(Echange_externe_impose, la_cl_fm.valeur()))
322 || (sub_type(Neumann_paroi, la_cl_fm.valeur())))
323 { /* Do nothing */ }
324 else
325 {
326 message_erreur_fraction_massique(la_cl_hydr, la_cl_fm, num_Cl);
327 }
328 }
329 else if (sub_type(Entree_fluide_vitesse_imposee, la_cl_hydr.valeur()))
330 {
331 if (sub_type(Entree_fluide_fraction_massique_imposee, la_cl_fm.valeur()))
332 { /* Do nothing */ }
333 else
334 {
335 message_erreur_fraction_massique(la_cl_hydr, la_cl_fm, num_Cl);
336 }
337 }
338 else if ((sub_type(Dirichlet_paroi_fixe, la_cl_hydr.valeur())) || (sub_type(Dirichlet_paroi_defilante, la_cl_hydr.valeur())))
339 {
340 if ((!sub_type(Neumann_paroi_flux_nul, la_cl_fm.valeur())) && (!sub_type(Neumann_paroi, la_cl_fm.valeur())) && (!sub_type(Scalaire_impose_paroi, la_cl_fm.valeur()))
341 && (!sub_type(Echange_externe_impose, la_cl_fm.valeur())))
342 {
343 message_erreur_fraction_massique(la_cl_hydr, la_cl_fm, num_Cl);
344 }
345
346 }
347 else if (sub_type(Neumann_sortie_libre, la_cl_hydr.valeur()))
348 {
349 if ((sub_type(Entree_fluide_fraction_massique_imposee, la_cl_fm.valeur())) || (sub_type(Neumann_sortie_libre, la_cl_fm.valeur())))
350 { /* Do nothing */}
351 else
352 {
353 message_erreur_fraction_massique(la_cl_hydr, la_cl_fm, num_Cl);
354 }
355 }
356 else if (sub_type(Symetrie, la_cl_hydr.valeur()))
357 {
358 if ((sub_type(Symetrie, la_cl_fm.valeur())) || (sub_type(Neumann_paroi_flux_nul, la_cl_fm.valeur())) || (sub_type(Neumann_paroi, la_cl_fm.valeur())))
359 { /* Do nothing */}
360 else
361 {
362 message_erreur_fraction_massique(la_cl_hydr, la_cl_fm, num_Cl);
363 }
364 }
365 else if (sub_type(Periodique, la_cl_hydr.valeur()))
366 {
367 if (sub_type(Periodique, la_cl_fm.valeur()))
368 { /* Do nothing */}
369 else
370 {
371 message_erreur_fraction_massique(la_cl_hydr, la_cl_fm, num_Cl);
372 }
373 }
374 }
375 return 1;
376}
377
378/*! @brief Affiche un message d'erreur pour la fonction precedente
379 *
380 * @param (Domaine_Cl_dis_base& domaine_Cl_hydr)
381 * @param (Domaine_Cl_dis_base& domaine_Cl_frac_mass)
382 * @param (int num_Cl) numero de la CL
383 * @return (int) renvoie toujours 1
384 */
385int message_erreur_fraction_massique(const Cond_lim& la_cl_hydr, const Cond_lim& la_cl_frac_mass, int& num_Cl)
386{
387 Cerr << "The hydraulic and massic fraction boundary conditions are not consitent on border:" << finl;
388 Cerr << "Boundary conditions number " << num_Cl << " \"" << la_cl_frac_mass->frontiere_dis().le_nom() << "\" have been assigned to : " << finl;
389 Cerr << la_cl_hydr->que_suis_je() << " and " << la_cl_frac_mass->que_suis_je() << " !! " << finl;
391 return 1;
392}
classe Cond_lim Classe generique servant a representer n'importe quelle classe
Definition Cond_lim.h:31
classe Dirichlet_paroi_defilante Impose la vitesse de paroi dnas une equation de type Navier_Stokes.
classe Dirichlet_paroi_fixe Represente une paroi immobile dans une equation de type Navier_Stokes.
classe Domaine_Cl_dis_base Les objets Domaine_Cl_dis_base representent les conditions aux limites
int nb_cond_lim() const
Renvoie le nombre de conditions aux limites.
const Cond_lim & les_conditions_limites(int) const
Renvoie la i-ieme condition aux limites.
Classe Echange_externe_impose: Cette classe represente le cas particulier de la classe.
Classe Echange_global_impose Cette classe represente le cas particulier de la classe.
classe Entree_fluide_temperature_imposee Cas particulier de la classe Dirichlet_entree_fluide
classe Entree_fluide_temperature_imposee Cas particulier de la classe Dirichlet_entree_fluide pour la...
classe Entree_fluide_vitesse_imposee_libre Cas particulier de la classe Entree_fluide_vitesse_imposee...
classe Entree_fluide_vitesse_imposee Cas particulier de la classe Dirichlet_entree_fluide
Classe Neumann_paroi_adiabatique Cette condition limite correspond a une paroi adiabatique dans une.
Classe Neumann_paroi_flux_nul Cette condition limite flux nul a la frontiere.
Classe Neumann_paroi Cette condition limite correspond a un flux impose pour l'equation de.
classe Neumann_sortie_libre Cette classe represente une frontiere ouverte sans vitesse imposee
classe Periodique Cette classe represente une condition aux limites periodique.
Definition Periodique.h:31
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
Definition Process.cpp:455
classe Scalaire_impose_paroi Impose un scalaire a la paroi dans une equation de type Convection-Difus...
classe Symetrie Sur les faces de symetrie on a les proprietes suivantes:
Definition Symetrie.h:37