TrioCFD 1.9.8
TrioCFD documentation
Loading...
Searching...
No Matches
Champ_front_contact_VEF.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 <Convection_Diffusion_Concentration.h>
17#include <Champ_front_contact_fictif_VEF.h>
18#include <Modele_turbulence_scal_base.h>
19#include <Op_Diff_VEF_Anisotrope_Face.h>
20#include <Modele_turbulence_hyd_base.h>
21#include <Raccord_distant_homogene.h>
22#include <Champ_front_contact_VEF.h>
23#include <Champ_Fonc_P0_VEF.h>
24#include <Format_Post_Med.h>
25#include <Domaine_Cl_VEF.h>
26#include <Champ_Uniforme.h>
27#include <distances_VEF.h>
28#include <Probleme_base.h>
29#include <Pb_Conduction.h>
30#include <Schema_Comm.h>
31#include <Constituant.h>
32#include <Interprete.h>
33#include <TRUST_Ref.h>
34#include <ArrOfBit.h>
35#include <SFichier.h>
36#include <Domaine.h>
37
38// WEC : Attention. D'autres tableaux que le champ_front meriteraient davoir plusieurs valeurs temporelles !
39// En particulier les gradients...
40
41Implemente_instanciable(Champ_front_contact_VEF,"Champ_front_contact_VEF",Ch_front_var_instationnaire_dep);
42
43
45{
46 return os;
47}
48
49
51{
52 Motcle nom_inco;
53 nom_inco = "temperature";
54 is >> nom_pb1 >> nom_bord1 >> nom_pb2 >> nom_bord2;
55
56 Cerr << "Champ_front_contact_VEF::readOn : " << nom_pb1 << " " << nom_bord1 << " " << nom_inco << finl;
57 Cerr << " connecte a : " << nom_pb2 << " " << nom_bord2 << " " << nom_inco << finl;
58
59 fixer_nb_comp(1); // prevu pour la temperature.
62 else
64
65 return is;
66}
67
69{
71 return 0;
72
73 // WEC : code repris de calculer_coeffs_echange qui faisait des
74 // iniialisations au premier pas de temps.
75
76 // XXX : On rempli les valeurs ici et pas dans le readOn car le milieu de pb2 ets pas encore lu !!!
77 creer(nom_pb1, nom_bord1, nom_pb2, nom_bord2, "temperature");
79
80 // Check/initialize Raccord boundaries in parallel:
82 {
84 associer_ch_inc_base(l_inconnue2.valeur());
85 const Domaine_dis_base& domaine_dis_opposee = front_dis().domaine_dis();
86 const Domaine_dis_base& domaine_dis_locale = frontiere_dis().domaine_dis();
87 const Frontiere& frontiere_opposee = front_dis().frontiere();
88 const Frontiere& frontiere_locale = frontiere_dis().frontiere();
89 if (!sub_type(Raccord_distant_homogene, frontiere_opposee))
90 {
91 const Nom& nom_domaine_oppose = domaine_dis_opposee.domaine().le_nom();
92 Cerr << "Error, the boundary " << frontiere_opposee.le_nom() << " should be a Raccord." << finl;
93 Cerr << "Add in your data file between the definition and the partition of the domain " << nom_domaine_oppose << " :" << finl;
94 Cerr << "Modif_bord_to_raccord " << nom_domaine_oppose << " " << frontiere_opposee.le_nom() << finl;
95 exit();
96 }
97 Raccord_distant_homogene& raccord_distant = ref_cast_non_const(Raccord_distant_homogene, frontiere_opposee);
98 raccord_distant.initialise(frontiere_locale, domaine_dis_locale, domaine_dis_opposee);
99 }
100
101 // remplissage du tableau de connectivite des numeros de faces de bord
102 // entre les deux problemes couples.
103 if (connect_est_remplit==0)
104 {
107 //Les elems_voisin_bord_ ont ete remplis pour chaque frontiere portant un Champ_Front_contact_VEF
108 //On peut remplir faces_coin
110 }
112
113 // On initialise les references au ch_fr_autre_pb et fr_vf_autre_pb
115
116 // Dimensionnement des tableaux
117 int nb_faces=frontiere_dis().frontiere().nb_faces();
118 gradient_num_transf.resize(nb_faces);
119 gradient_fro_transf.resize(nb_faces);
120 Scal_moy.resize(nb_faces);
121 gradient_num_local.resize(nb_faces);
122 gradient_fro_local.resize(nb_faces);
123 coeff_amort_num.resize(nb_faces);
124 coeff_amort_denum.resize(nb_faces);
125
126 // Est-on dans le probleme conduction ?
127 // (utilise en rayo trans et semi_transp => factorisation)
128 const Probleme_base& pb = l_inconnue1->equation().probleme();
129 if (sub_type(Pb_Conduction,pb))
131 else
133
134 // Initialisation des tableaux de gradients
135 calculer_coeffs_echange(temps); // sur instant present
136 return 1;
137}
138
139void Champ_front_contact_VEF::creer(const Nom& nompb1, const Nom& nom1, const Nom& nompb2, const Nom& nom2, const Motcle& nom_inco)
140{
141 nom_bord1 = nom1;
142 nom_bord2 = nom2;
143 Nom nom_inco1, nom_inco2;
144 nom_inco1 = nom_inco;
145 nom_inco2 = nom_inco;
146
147 OBS_PTR(Champ_base) rch1;
148 Probleme_base& pb1 = ref_cast(Probleme_base, Interprete::objet(nompb1));
149
150 if (!sub_type(Pb_Conduction, pb1))
151 if (pb1.equation(1).inconnue().le_nom() != "temperature")
152 nom_inco1 = "concentration";
153
154 rch1 = pb1.get_champ(nom_inco1);
155 l_inconnue1 = ref_cast(Champ_Inc_base, rch1.valeur());
156
157 OBS_PTR(Champ_base) rch2;
158 Probleme_base& pb2 = ref_cast(Probleme_base, Interprete::objet(nompb2));
159
160 if (!sub_type(Pb_Conduction, pb2))
161 if (pb2.equation(1).inconnue().le_nom() != "temperature")
162 nom_inco2 = "concentration";
163
164 rch2 = pb2.get_champ(nom_inco2);
165 l_inconnue2 = ref_cast(Champ_Inc_base, rch2.valeur());
166
167 if (nom_inco1 != nom_inco2)
168 {
169 Cerr << "Une condition limite de contact est mal specifiee" << finl;
170 Cerr << "Il existe une incoherence sur l'inconnue mise en jeu de part et d'autre de la frontiere de contact" << finl;
171 exit();
172 }
173
174}
175
177{
178 l_inconnue = inco;
179}
180
181
186
187
189{
190 // Dans le cas de raccords homogenes, c'est a dire parfaitement coincidents
191 // au niveau du maillage, gradient_num_local = gradient_num_transf et
192 // gradient_fro_local = gradient_fro_transf
193
196}
197
199{
200 // collection information problem local
202 associer_ch_inc_base(l_inconnue1.valeur());
203 const Champ_Inc_base& inco = l_inconnue.valeur();
204 const DoubleTab& inco_valeurs = l_inconnue->valeurs(temps);
205 assert (nom_bord != "??");
206
207 const Domaine_VEF& le_dom_dis = ref_cast(Domaine_VEF, domaine_dis());
208 const Front_VF& la_front_vf = ref_cast(Front_VF, front_dis());
209 const DoubleVect& vol = le_dom_dis.volumes();
210 const IntTab& face_voisins = le_dom_dis.face_voisins();
211 const IntTab& elem_faces = le_dom_dis.elem_faces();
212 const DoubleTab& face_normales = le_dom_dis.face_normales();
213 const Milieu_base& le_milieu = milieu();
214
215 const int nb_faces_elem = le_dom_dis.domaine().nb_faces_elem();
216 const int nb_faces = la_front_vf.nb_faces();
217 const int ndeb = la_front_vf.num_premiere_face();
218
219 DoubleTab coeff_lam, coeff_turb;
220
221 // diffusivite laminaire (lambda ou D)
222 if (!sub_type(Convection_Diffusion_Concentration, inco.equation()))
223 coeff_lam = le_milieu.conductivite().valeurs();
224 else
225 coeff_lam = ref_cast(Constituant,le_milieu).diffusivite_constituant().valeurs();
226
227 // turbulence
228 int ind_loi_paroi = 0;
229 DoubleVect d_equiv;
230 const RefObjU& mod = inco.equation().get_modele(TURBULENCE);
231 if (mod)
232 {
233 const Modele_turbulence_scal_base& mod_turb_scal = ref_cast(Modele_turbulence_scal_base, mod.valeur());
234 coeff_turb = mod_turb_scal.conductivite_turbulente().valeurs();
235 const Turbulence_paroi_scal_base& loipar = mod_turb_scal.loi_paroi();
236
237 if (mod_turb_scal.loi_paroi_non_nulle() && loipar.use_equivalent_distance())
238 {
239 ind_loi_paroi = 1;
240 d_equiv.resize(nb_faces);
241
242 // Recherche du bord correspondant
243 int i_bord = -1;
244 for (int n_bord = 0; n_bord < le_dom_dis.domaine().nb_front_Cl(); n_bord++)
245 if (le_dom_dis.front_VF(n_bord).le_nom() == la_front_vf.le_nom())
246 i_bord = n_bord;
247 // Copie des donnees d'un bord dans les tableaux locaux temporaires positions_Pf et d_equiv
248 for (int ind_face = 0; ind_face < nb_faces; ind_face++)
249 d_equiv(ind_face) = loipar.equivalent_distance(i_bord, ind_face);
250 }
251 }
252
253 int signe;
254 double surface_pond, surface_face;
255
256 const int nd = coeff_lam.nb_dim();
257 const bool is_uniforme = coeff_lam.dimension(0) == 1;
258
259 for (int fac_front = 0; fac_front < nb_faces; fac_front++)
260 {
261 gradient_num_local(fac_front) = 0.;
262 gradient_fro_local(fac_front) = 0.;
263 Scal_moy(fac_front) = 0.;
264
265 const int fac_glob = fac_front + ndeb;
266 int num = face_voisins(fac_glob, 0);
267 if (num < 0)
268 num = face_voisins(fac_glob, 1);
269
270 // normale unitaire a la face
271 double ratio = 0.;
272 for (int i = 0; i < dimension; i++)
273 ratio += (face_normales(fac_glob, i) * face_normales(fac_glob, i));
274 ratio = sqrt(ratio);
275
276
277 // conductivite/diffusivite effective k_eff = n^T K n
278 double k_eff = 0.;
279
280 int e_idx = 0; // index d’elem
281 if (nd >= 1)
282 e_idx = is_uniforme ? 0 : num;
283
284 if (nd == 1) // scalaire par maille OU champ_uniforme
285 k_eff = coeff_lam(e_idx);
286 else if (nd == 2)
287 {
288 // XXX Elie Saikali : faut faire qlq chose si l'op de diff est aniso ...
289 DoubleTrav n(dimension);
290 for (int i = 0; i < dimension; i++)
291 n[i] = face_normales(fac_glob, i) / ratio;
292
293 const int s1 = coeff_lam.dimension(1);
294 if (s1 == 1)
295 k_eff = coeff_lam(e_idx, 0);
296 else if (s1 == dimension)
297 {
298 for (int i = 0; i < dimension; i++)
299 k_eff += n[i] * n[i] * coeff_lam(e_idx, i);
300 }
301 else if (s1 == dimension * dimension)
302 {
303
304 for (int i = 0; i < dimension; i++)
305 for (int j = 0; j < dimension; j++)
306 {
307 const double Kij = 0.5 * (coeff_lam(e_idx, i * dimension + j) + coeff_lam(e_idx, j * dimension + i));
308 k_eff += n[i] * n[j] * Kij;
309 }
310 }
311 else
312 k_eff = coeff_lam(e_idx, 0); // XXX comme avant lol
313 }
314 else if (nd == 3)
315 {
316 DoubleTrav n(dimension);
317 for (int i = 0; i < dimension; i++)
318 n[i] = face_normales(fac_glob, i) / ratio;
319
320 for (int i = 0; i < dimension; i++)
321 for (int j = 0; j < dimension; j++)
322 k_eff += n[i] * coeff_lam(e_idx, i, j) * n[j];
323 }
324 else
325 throw;
326
327 // turbulence
328 if (mod)
329 k_eff += coeff_turb(num);
330
331 //Calcul de la temperature moyenne dans la maille
332 surface_face = le_dom_dis.face_surfaces(fac_glob);
333 for (int i = 0; i < nb_faces_elem; i++)
334 {
335 // On ne tient pas compte de la temperature de paroi
336 // pour calculer la temperature moyenne dans la maille.
337 const int j = elem_faces(num, i);
338 if (j != fac_glob)
339 {
340 surface_pond = 0.;
341 for (int kk = 0; kk < dimension; kk++)
342 surface_pond -= (face_normales(j, kk) * le_dom_dis.oriente_normale(j, num) * face_normales(fac_glob, kk) * le_dom_dis.oriente_normale(fac_glob, num)) / (surface_face * surface_face);
343 Scal_moy(fac_front) += inco_valeurs(j) * surface_pond;
344 }
345 }
346
347 // contributions num/fro
348 for (int fac = 0; fac < dimension + 1; fac++)
349 for (int i = 0; i < dimension; i++)
350 {
351 const int fac_loc = elem_faces(num, fac);
352 signe = le_dom_dis.oriente_normale(fac_loc, num);
353 if (fac_loc != fac_glob)
354 gradient_num_local(fac_front) += (signe * face_normales(fac_glob, i) / ratio * face_normales(fac_loc, i) * inco_valeurs(fac_loc));
355 else
356 gradient_fro_local(fac_front) += (signe * face_normales(fac_loc, i) / ratio * face_normales(fac_loc, i));
357 }
358
359 gradient_num_local(fac_front) *= (k_eff / vol(num));
360 gradient_fro_local(fac_front) *= (k_eff / vol(num));
361
362 // loi de paroi avec distance équivalente
363 if (ind_loi_paroi == 1)
364 {
365 gradient_num_local(fac_front) = 0.;
366 gradient_fro_local(fac_front) = 0.;
367
368 gradient_num_local(fac_front) = -Scal_moy(fac_front);
369 const double coeff_equiv = k_eff / d_equiv(fac_front);
370 gradient_num_local(fac_front) *= coeff_equiv;
371 gradient_fro_local(fac_front) = coeff_equiv;
372 }
373 }
374}
375
377{
379 {
382 }
383
384 const Frontiere& la_front=la_frontiere_dis->frontiere();
385 int nb_faces=la_front.nb_faces();
386 DoubleTab& tab=valeurs_au_temps(temps);
387
388 // On recupere les coefficients gradient_num_transf et gradient_fro_transf de l'autre probleme
389 DoubleVect gradient_num_transf_autre_pb(nb_faces);
390 DoubleVect gradient_fro_transf_autre_pb(nb_faces);
391 if (!ch_fr_autre_pb)
392 {
393 Cerr << "Attention: Vous utilisez une condition de contact Champ_front_contact_VEF sur le bord " << nom_bord1 << " sur le probleme "<< nom_pb1 <<" " << finl;
394 Cerr << "Vous devez avoir un Champ_front_contact_VEF equivalent sur le bord " << nom_bord2 << " du probleme "<<nom_pb2<<" " << finl;
395 exit();
396 }
397 trace_face_raccord(fr_vf_autre_pb.valeur(),ch_fr_autre_pb->gradient_num_transf,gradient_num_transf_autre_pb);
398 trace_face_raccord(fr_vf_autre_pb.valeur(),ch_fr_autre_pb->gradient_fro_transf,gradient_fro_transf_autre_pb);
399 //
400 //
401 // gradient_fro_ h
402 // gradient_num_ -h*T
403 // Calcul de la temperature imposee
404 for (int fac_front=0; fac_front<nb_faces; fac_front++)
405 {
406 tab(fac_front,0)= -(gradient_num_local(fac_front) + gradient_num_transf_autre_pb(fac_front))
407 / ( gradient_fro_transf_autre_pb(fac_front) + gradient_fro_local(fac_front)) ;
408 }
409 // Verification de la coherence des temperatures de bord calculees
410 //verifier_scalaire_bord();
411}
412
413
415{
416 // Cette methode a pour but de verifier que la temperature de bord calculee pour chaque
417 // face num_face est bien comprise entre les temperatures moyennes sur les elements entourant
418 // num_face dans chaque milieu.
419 const Frontiere& la_front=la_frontiere_dis->frontiere();
420 int nb_faces=la_front.nb_faces();
421
422 DoubleVect Scal_moy_autre_pb(nb_faces);
423 trace_face_raccord(fr_vf_autre_pb.valeur(),ch_fr_autre_pb->Scal_moy,Scal_moy_autre_pb);
424
425 DoubleTab& tab=valeurs_au_temps(temps);
426
427 // Verification sur les temperatures
428 for (int fac_front=0; fac_front<nb_faces; fac_front++)
429 {
430 if (Scal_moy(fac_front) > Scal_moy_autre_pb(fac_front))
431 {
432 if ((tab(fac_front,0)>Scal_moy(fac_front)) || (tab(fac_front,0)<Scal_moy_autre_pb(fac_front)))
433 {
434 if (tab(fac_front,0)>Scal_moy(fac_front))
435 {
436 Cerr<<"Attention, Tp n'est pas compris entre les temperatures"<<finl;
437 Cerr<<"fluide et solide au voisinage de la paroi"<<finl;
438 Cerr<<"Tp("<<fac_front<<") = "<<tab(fac_front,0)<<" est trop elevee"<<finl;
439 Cerr<<"de DT = "<<tab(fac_front,0)-Scal_moy(fac_front)<<" K"<<finl;
440 }
441 else
442 {
443 Cerr<<"Attention, Tp n'est pas compris entre les temperatures"<<finl;
444 Cerr<<"fluide et solide au voisinage de la paroi"<<finl;
445 Cerr<<"Tp("<<fac_front<<") = "<<tab(fac_front,0)<<" est trop basse "<<finl;
446 Cerr<<"de DT = "<<Scal_moy_autre_pb(fac_front)-tab(fac_front,0)<<" K"<<finl;
447 }
448 }
449 }
450 else
451 {
452 if ((tab(fac_front,0)<Scal_moy(fac_front)) || (tab(fac_front,0)>Scal_moy_autre_pb(fac_front)))
453 {
454 if (tab(fac_front,0)<Scal_moy(fac_front))
455 {
456 Cerr<<"Attention, Tp n'est pas compris entre les temperatures"<<finl;
457 Cerr<<"fluide et solide au voisinage de la paroi"<<finl;
458 Cerr<<"Tp("<<fac_front<<") = "<<tab(fac_front,0)<<" est trop basse"<<finl;
459 Cerr<<"de DT = "<<Scal_moy(fac_front)-tab(fac_front,0)<<" K"<<finl;
460 }
461 else
462 {
463 Cerr<<"Attention, Tp n'est pas compris entre les temperatures"<<finl;
464 Cerr<<"fluide et solide au voisinage de la paroi"<<finl;
465 Cerr<<"Tp("<<fac_front<<") = "<<tab(fac_front,0)<<" est trop elevee"<<finl;
466 Cerr<<"de DT = "<<tab(fac_front,0)-Scal_moy_autre_pb(fac_front)<<" K"<<finl;
467 }
468 }
469 }
470 }
471}
472
473
475{
476 // Calcul de la temperature imposee
477 calcul_grads_locaux(temps);
478 calcul_grads_transf(temps);
479}
480
481
483{
484 return l_inconnue.valeur();
485}
486
487
489{
490 return nom_bord;
491}
492
493
495{
496 if (!l_inconnue)
497 {
498 Cerr << "\nError in Champ_front_contact_VEF::equation() : not able to return the equation !" << finl;
500 }
501 return inconnue().equation();
502}
503
504
506{
507 return equation().milieu();
508}
509
510
515
516
521
522
527
528
530{
531 const Domaine_VEF& le_dom_dis=ref_cast(Domaine_VEF, l_inconnue1->equation().domaine_dis());
532 int rang_front = le_dom_dis.rang_frontiere(nom_bord1);
533 const Front_VF& la_front_vf=ref_cast(Front_VF, le_dom_dis.frontiere_dis(rang_front));
534 const DoubleVect& vol = le_dom_dis.volumes();
535 const IntTab& face_voisins = le_dom_dis.face_voisins();
536 const DoubleTab& face_normales = le_dom_dis.face_normales();
537 const Milieu_base& le_milieu = l_inconnue1->equation().milieu();
538
539 int nb_faces = la_front_vf.nb_faces();
540 int ndeb = la_front_vf.num_premiere_face();
541
542 int fac_front;
543 for (fac_front = 0; fac_front<nb_faces; fac_front++)
544 {
545 int fac = fac_front + ndeb;
546 int num = face_voisins(fac,0);
547 if (num < 0) num = face_voisins(fac,1);
548
549 // calcul de la surface de la face courante
550 double ratio = 0.;
551 for (int i=0; i<dimension; i++) ratio += (face_normales(fac,i) * face_normales(fac,i));
552 ratio = sqrt(ratio);
553
554 double alpha;
555 if(sub_type(Champ_Uniforme,le_milieu.diffusivite()))
556 alpha=le_milieu.diffusivite().valeurs()(0,0);
557 else
558 {
559 const DoubleTab& tab_alpha = le_milieu.diffusivite().valeurs();
560 alpha=tab_alpha(num);
561 }
562
563 double volume = vol(num);
564
565 coeff_amort_num(fac_front) = volume/ratio;
566 coeff_amort_denum(fac_front) = (alpha*ratio)/volume;
567 }
568}
569
570
572{
573 const Champ_Inc_base& temp_autre = l_inconnue2.valeur();
574 const Equation_base& eqn = temp_autre.equation();
575 const Domaine_Cl_dis_base& zcl = eqn.domaine_Cl_dis();
576
577 int num_cl;
578 for (num_cl = 0; num_cl<zcl.nb_cond_lim(); num_cl++)
579 {
580 const Cond_lim_base& la_cl = zcl.les_conditions_limites(num_cl);
581 const Nom& le_nom_cl = la_cl.frontiere_dis().le_nom();
582 if (le_nom_cl == nom_bord2)
583 {
584 if (sub_type(Champ_front_contact_VEF,la_cl.champ_front()))
585 {
586 ch_fr_autre_pb = ref_cast(Champ_front_contact_VEF,la_cl.champ_front());
587 // Test de securite pour verifier que l'on a bien saisit le champ
588 // front_contact_VEF.
589 if (ch_fr_autre_pb->nom_pb1 == nom_pb1)
590 if (!(sub_type(Champ_front_contact_fictif_VEF,(*this))))
591 {
592 Cerr<<"Attention, erreur lors de la lecture du Champ_Front_Contact_VEF"<<finl;
593 Cerr<<"La syntaxe a utiliser est : nom_pb_local nom_bord_local nom_pb_distant nom_bord_distant"<<finl;
594 exit();
595 }
596 fr_vf_autre_pb=ref_cast(Front_VF, la_cl.frontiere_dis());
597 }
598 }
599 }
600}
601
602DoubleVect& Champ_front_contact_VEF::trace_face_raccord(const Front_VF& fr_vf,const DoubleVect& y,DoubleVect& x)
603{
604 // On verifie que la frontiere est de type Raccord_distant_homogene
605 if (sub_type(Raccord_distant_homogene,fr_vf.frontiere()))
606 fr_vf.frontiere().trace_face_distant(y,x);
607 else
608 {
610 {
611 // On teste si on a bien un raccord distant homogene car sinon le tableau connect n'est pas rempli en parallele
612 // En effet remplir_connect_bords n'est fait qu'en sequentiel
613 Cerr << "The boundary named " << fr_vf.frontiere().le_nom() << " is not a 'Raccord Distant Homogene'" << finl;
614 Cerr << "Use keyword modif_bord_to_raccord to change the boundary of kind Paroi into a boundary of kind Raccord" << finl;
615 Cerr << "after you read the meshes during the partitioning." << finl;
616 exit();
617 }
618 // On traite un raccord local
619 int nb_fac_front=x.size();
620 for(int fac_front=0; fac_front<nb_fac_front; fac_front++)
621 x(fac_front) = y(connect_bords(fac_front));
622 }
623
624 return x;
625}
626
627
629{
630 // Par convention, les grandeurs notees sans indice ainsi que celle notees
631 // avec un indice 1 correspondent au probleme courant, celle notees avec
632 // un indice 2 correspondent aux grandeurs du probleme couple avec le probleme
633 // courant
634 const Frontiere& la_front = la_frontiere_dis->frontiere();
635 int nb_faces = la_front.nb_faces();
636
637 //
638 // collection des informations du probleme 1
639 //
641 associer_ch_inc_base(l_inconnue1.valeur()) ;
642
643 assert (nom_bord != "??") ;
644 const Domaine_VEF& le_dom_dis1=ref_cast(Domaine_VEF, l_inconnue1->equation().domaine_dis());
645
646 int rang_front1 = le_dom_dis1.rang_frontiere(nom_bord1);
647 const Front_VF& la_front_vf1=ref_cast(Front_VF, le_dom_dis1.frontiere_dis(rang_front1));
648 const DoubleTab& xv1 = le_dom_dis1.xv();
649 const IntTab& face_voisin=le_dom_dis1.face_voisins();
650
651 const IntTab& elem_faces = le_dom_dis1.elem_faces();
652
653 int ndeb1 = la_front_vf1.num_premiere_face();
654
655 //
656 // collection des informations du probleme 2
657 //
659 associer_ch_inc_base(l_inconnue2.valeur()) ;
660
661 assert (nom_bord != "??") ;
662 const Domaine_VEF& le_dom_dis2=ref_cast(Domaine_VEF, l_inconnue2->equation().domaine_dis());
663
664 int rang_front2 = le_dom_dis2.rang_frontiere(nom_bord2);
665 const Front_VF& la_front_vf2=ref_cast(Front_VF, le_dom_dis2.frontiere_dis(rang_front2));
666 const DoubleTab& xv2 = le_dom_dis2.xv();
667 int ndeb2 = la_front_vf2.num_premiere_face();
668
669 // On verifie que les numerotations des faces sur ce bord sont bien compatibles
670 // pour les deux problemes consideres.
671 int i,j,k,temoin,temoin_tot;
672
673 double erreur = 0.;
674 int ii;
675 for (ii=0; ii<dimension; ii++)
676 if (std::fabs(xv1(ndeb1,ii) - xv1(ndeb1+nb_faces,ii)) > erreur )
677 erreur = std::fabs(xv1(ndeb1,ii) - xv1(ndeb1+nb_faces,ii));
678 //
679 // L'erreur est 1.e-5 fois la distance maximale entre deux faces de bord
680 erreur *=1.e-5;
681
682 //GF la reference pour calculer l'erreur ne correspondait a rien
683 // distance entre la premiere face du bord et la face apres le bord ?????
684
685
686
687
688 // Version PAT
689 // erreur = Objet_U::precision_geom
690 connect_bords.resize(nb_faces);
691
692 //assert(la_front_vf2.nb_faces()==la_front_vf1.nb_faces());
693 //Cout << "nb faces = " << la_front_vf2.nb_faces() << finl;
694 //Cout << "nb faces = " << la_front_vf1.nb_faces() << finl;
695
696 // PQ : 06/08/07
697
698 int nb_faces1 = la_front_vf1.nb_faces();
699 int nb_faces2 = la_front_vf2.nb_faces();
700
701 if(nb_faces1!=nb_faces2)
702 {
703 Cerr << "Warning, the number of faces (" << nb_faces1 << ") on the boundary " << la_front_vf1.le_nom();
704 Cerr << " of the domain " << le_dom_dis1.domaine().le_nom() << finl;
705 Cerr << "is different of the number of faces (" << nb_faces2 << ") on the boundary " << la_front_vf2.le_nom();
706 Cerr << " of the domain " << le_dom_dis2.domaine().le_nom() << " ..." << finl;
707 Cerr << "The exchange condition with the paroi_contact can't succeed!" << finl;
708 Nom fichier="connectivity_failed_";
709 Nom fichier_med="connectivity_failed_";
710 Nom nom_pb;
711 if(nb_faces1>nb_faces2)
712 {
713 nom_pb=nom_pb2;
714 fichier+=nom_bord2;
715 fichier_med+=nom_pb;
716 fichier_med+=".med";
717 connectivity_failed(le_dom_dis1, nb_faces1, ndeb1, le_dom_dis2, nb_faces2, ndeb2, fichier, fichier_med);
718 }
719 else
720 {
721 nom_pb=nom_pb1;
722 fichier+=nom_bord1;
723 fichier_med+=nom_pb;
724 fichier_med+=".med";
725 connectivity_failed(le_dom_dis2, nb_faces2, ndeb2, le_dom_dis1, nb_faces1, ndeb1, fichier, fichier_med);
726 }
727 Cerr << "Boundaries " << nom_bord1 << " from problem " << nom_pb1 << finl;
728 Cerr << " and " << nom_bord2 << " from problem " << nom_pb2 << finl;
729 Cerr << "have not the same number of faces." << finl;
730 Cerr << "Coincidence between meshes may be recovered " << finl;
731 Cerr << "by cutting mesh associated to " << nom_pb << finl;
732 Cerr << "thanks to decouper_bord_coincident keyword or HOMARD tool (see reference manual)." << finl;
733 exit();
734 }
735
736
737
738 // PQ : 03/03 : redefinition du tableau de connectivite
739 // processus "optimise" et applicable a tout type de configuration
740
741 temoin_tot=0;
742
743 for (i=0; i<nb_faces; i++)
744 {
745
746 // on redefinit erreur pour chaque face comme etant:
747 // on cherche l'elt associe a la face, on calcule le min du centre
748 // de gravite de l'elem a ses faces -> d1
749 // d1*1e-2
750 int elem_voisin=face_voisin(ndeb1+i,0);
751 if (elem_voisin==-1)
752 elem_voisin=face_voisin(ndeb1+i,1);
753 int nbf=elem_faces.dimension(1);
754 double d1=DMAXFLOAT;
755 for (int f=0; f<nbf; f++)
756 {
757 int f2=elem_faces(elem_voisin,f);
758 if (dimension==2)
759 d1=std::min(d1,distance_2D(f2,elem_voisin,le_dom_dis1));
760 else
761 d1=std::min(d1,distance_3D(f2,elem_voisin,le_dom_dis1));
762 }
763 erreur=d1*1e-2;
764 temoin=0;
765 for (j=i; j<nb_faces; j++)
766 {
767 // O.C. : dimension plutot que dim1 dans la boucle suivante :
768 // for (k=0 ; k<dim1 ; k++)
769 for (k=0 ; k<dimension ; k++)
770 if (std::fabs(xv1(ndeb1+i,k) - xv2(ndeb2+j,k)) > erreur) break;
771 // Si on a passe le test ci-dessus, c'est que les dim coordonnees de la face
772 // sont les memes (d == dim)
773 if (k==dimension)
774 {
775
776 /** if (j==1)
777 {
778 Cout << "connect i j " << i << " " << j << finl;
779 Cout << "xv i j " << xv1(ndeb1+i,0) << " " << xv2(ndeb2+j,0) << finl;
780 Cout << "xv i j " << xv1(ndeb1+i,1) << " " << xv2(ndeb2+j,1) << finl;
781 Cout << "xv i j " << xv1(ndeb1+i,2) << " " << xv2(ndeb2+j,2) << finl;
782 Cout << "err i j " << std::fabs(xv1(ndeb1+i,0) - xv2(ndeb2+j,0)) << finl;
783 Cout << "err i j " << std::fabs(xv1(ndeb1+i,1) - xv2(ndeb2+j,1)) << finl;
784 Cout << "err i j " << std::fabs(xv1(ndeb1+i,2) - xv2(ndeb2+j,2)) << finl;
785 Cout << "erreur " << erreur << finl;
786 }*/
787 connect_bords(i)=j;
788 temoin=1;
789 break;
790 }
791 }
792 if(temoin==0)
793 for (j=0; j<i; j++)
794 {
795 for (k=0 ; k<dimension ; k++)
796 if (std::fabs(xv1(ndeb1+i,k) - xv2(ndeb2+j,k)) > erreur) break;
797
798 // Si on a passe le test ci-dessus, c'est que les dim coordonnees de la face
799 // sont les memes (d == dim)
800 if (k==dimension)
801 {
802 /** if (j==1)
803 {
804 Cout << "connect i j " << i << " " << j << finl;
805 Cout << "xv i j " << xv1(ndeb1+i,0) << " " << xv2(ndeb2+j,0) << finl;
806 Cout << "xv i j " << xv1(ndeb1+i,1) << " " << xv2(ndeb2+j,1) << finl;
807 Cout << "xv i j " << xv1(ndeb1+i,2) << " " << xv2(ndeb2+j,2) << finl;
808 Cout << "err i j " << std::fabs(xv1(ndeb1+i,0) - xv2(ndeb2+j,0)) << finl;
809 Cout << "err i j " << std::fabs(xv1(ndeb1+i,1) - xv2(ndeb2+j,1)) << finl;
810 Cout << "err i j " << std::fabs(xv1(ndeb1+i,2) - xv2(ndeb2+j,2)) << finl;
811 Cout << "erreur " << erreur << finl;
812 }*/
813 connect_bords(i)=j;
814 temoin=1;
815 break;
816 }
817 }
818 if(temoin==0)
819 {
820 temoin_tot=1;
821 if(dimension==2)
822 Cerr<<" no connectivity found for face : "<<ndeb1+i<<" located at : x= "<<xv1(ndeb1+i,0)<<" y= "<<xv1(ndeb1+i,1)<<finl;
823 else
824 Cerr<<" no connectivity found for face : "<<ndeb1+i<<" located at : x= "<<xv1(ndeb1+i,0)<<" y= "<<xv1(ndeb1+i,1)<< " z= "<<xv1(ndeb1+i,2)<<finl;
825 }
826 }
827
828
829 if(temoin_tot==1)
830 {
831 Cerr<<" Process stopped at Champ_front_contact_VEF::remplir_connect_bords() "<<finl;
832 exit();
833 }
834 // on verifie que l'on a bien cree une bijection
835 ArrOfInt inv_connect_bords;
836 inv_connect_bords.resize_array(nb_faces, RESIZE_OPTIONS::NOCOPY_NOINIT);
837 inv_connect_bords=-1;
838 for (i=0; i<nb_faces; i++)
839 {
840 inv_connect_bords[connect_bords(i)]=i;
841 }
842 if (min_array(inv_connect_bords) < 0)
843 {
844 Cerr<<"Pb a la creation de connect_bord, ce n'est pas une bijection"<<finl;
845 Cerr<<"tableau inverse "<<inv_connect_bords<<finl;
846 Cerr<<"tableau connect "<<connect_bords<<finl;
847 exit();
848 }
849}
850
852{
853 const Domaine_Cl_VEF& la_zcl_dis1=ref_cast(Domaine_Cl_VEF, l_inconnue1->equation().domaine_Cl_dis());
854 const Conds_lim& conds_lim = la_zcl_dis1.les_conditions_limites();
855 int size_cl = conds_lim.size();
856 int size = elems_voisin_bord_.size();
857 int elem_vois, elem_vois_autre_fr;
858
859 //Parcours des faces de la frontiere
860
861 int elem_vois_face_1, elem_vois_face_2;
862 faces_coin.resize(size);
863
864 for (int ind_face_1=0; ind_face_1<size; ind_face_1++)
865 {
866 elem_vois_face_1 = elems_voisin_bord_[ind_face_1];
867 for (int ind_face_2 =0; ind_face_2<size; ind_face_2++)
868 {
869 if (ind_face_1!=ind_face_2)
870 {
871 elem_vois_face_2 = elems_voisin_bord_[ind_face_2];
872 if ((elem_vois_face_1==elem_vois_face_2) && (elem_vois_face_1!=-1))
873 faces_coin(ind_face_1)=1;
874
875 }
876 }
877 }
878
879 //On tient compte ensuite des faces appaartenant a d autres fontieres
880 //pouvant appartenir a un element coin
881
882 for (int num_cl=0; num_cl<size_cl; num_cl++)
883 {
884 const Champ_front_base& ch_front = conds_lim[num_cl]->champ_front();
885 if (sub_type(Champ_front_contact_VEF,ch_front))
886 {
887 const Champ_front_contact_VEF& ch_front_contact = ref_cast(Champ_front_contact_VEF,ch_front);
888 const Nom& nom_bord_autre_fr = ch_front_contact.get_nom_bord1();
889
890 if (nom_bord1!=nom_bord_autre_fr)
891 {
892 const IntVect& elems_autre_fr = ch_front_contact.get_elems_voisin_bord();
893 int size_autre_fr = elems_autre_fr.size();
894 for (int ind_face =0; ind_face<size; ind_face++)
895 {
896 elem_vois = elems_voisin_bord_[ind_face];
897 for (int ind_face_autre_fr =0; ind_face_autre_fr<size_autre_fr; ind_face_autre_fr++)
898 {
899 elem_vois_autre_fr = elems_autre_fr[ind_face_autre_fr];
900 if ((elem_vois==elem_vois_autre_fr) && (elem_vois!=-1))
901 faces_coin(ind_face)=1;
902 }
903 }
904 }
905 }
906 }
907}
908
910{
911 const Domaine_VEF& le_dom_dis1=ref_cast(Domaine_VEF, l_inconnue1->domaine_dis_base());
912 int rang_front1 = le_dom_dis1.rang_frontiere(nom_bord1);
913 const Front_VF& la_front_vf1=ref_cast(Front_VF, le_dom_dis1.frontiere_dis(rang_front1));
914 const IntTab& face_voisins1 = le_dom_dis1.face_voisins();
915 int nb_faces = la_front_vf1.nb_faces();
916 int ndeb = la_front_vf1.num_premiere_face();
917
918 int voisin_0, voisin_1;
919 int elem_vois;
920 elems_voisin_bord_.resize(nb_faces);
922
923 for (int face=0; face<nb_faces; face++)
924 {
925 elem_vois=-1;
926 voisin_0 = face_voisins1(ndeb+face,0);
927 voisin_1 = face_voisins1(ndeb+face,1);
928
929 if (voisin_0!=-1)
930 elem_vois=voisin_0;
931 else
932 elem_vois=voisin_1;
933 elems_voisin_bord_(face) = elem_vois;
934 }
935
936}
938{
939 const Domaine_VEF& le_dom_dis1=ref_cast(Domaine_VEF, l_inconnue1->domaine_dis_base());
940 const DoubleTab& xv1 = le_dom_dis1.xv();
941 const Domaine_Cl_VEF& la_zcl_dis1=ref_cast(Domaine_Cl_VEF, l_inconnue1->equation().domaine_Cl_dis());
942 const Conds_lim& conds_lim = la_zcl_dis1.les_conditions_limites();
943 int size_cl = conds_lim.size();
944
945 const Nom& nom_dom = l_inconnue1->equation().probleme().domaine().le_nom();
946 int erreur = 0;
947 for (int num_cl=0; num_cl<size_cl; num_cl++)
948 {
949 const Champ_front_base& ch_front = conds_lim[num_cl]->champ_front();
950 if (sub_type(Champ_front_contact_VEF,ch_front))
951 {
952 const Champ_front_contact_VEF& ch_front_contact = ref_cast(Champ_front_contact_VEF,ch_front);
953 const Nom& nom_bord_fr = ch_front_contact.get_nom_bord1();
954 int rang_front_fr = le_dom_dis1.rang_frontiere(nom_bord_fr);
955 const Front_VF& la_front_vf_fr = ref_cast(Front_VF, le_dom_dis1.frontiere_dis(rang_front_fr));
956 int ndeb_fr = la_front_vf_fr.num_premiere_face();
957 const IntVect& faces_coin_fr = ch_front_contact.get_faces_coin();
958
959 for (int i=0; i<faces_coin_fr.size(); i++)
960 {
961 if (faces_coin_fr(i)!=0)
962 {
963 erreur =1;
964 Cerr<<"La face suivante du bord "<<nom_bord_fr<<" est une face de coin pour le domaine "<<nom_dom<<finl;
965 for (int k=0; k<dimension; k++)
966 Cerr<<"x_"<<k<<" "<<xv1(ndeb_fr+i,k)<<finl;
967 }
968 }
969 }
970 }
971 if (erreur)
972 {
973 Cerr<<"Le codage de Champ_front_contact_VEF n est pas disponible pour cette situation"<<finl;
974 Cerr<<"Decouper la (ou les) maille concernee en utilisant l interprete VerifierCoin"<<finl;
975 Cerr<<"ou en utilisant Trianguler_H en 2D ou Tetraedriser_homogene en 3D"<<finl;
976 //exit();
977 }
978}
979
980void Champ_front_contact_VEF::connectivity_failed(const Domaine_VEF& zvef1, int& nb_faces1, int& ndeb1,
981 const Domaine_VEF& zvef2, int& nb_faces2, int& ndeb2,
982 Nom& fichier, Nom& fichier_med)
983{
984
985 const IntTab& face_voisin2 = zvef2.face_voisins();
986 const IntTab& elem_faces2 = zvef2.elem_faces();
987 int nb_elem2 = zvef2.nb_elem();
988
989 const DoubleTab& xv1 = zvef1.xv();
990
991 int nbf = dimension+1; // nombre de faces par element
992 int fac,elem,face1,face2,elem2,trouve;
993 int j;
994
995 // Creation du champ P0
996
998 chp.associer_domaine_dis_base(zvef2);
999 chp.dimensionner(nb_elem2,1);
1000 chp.fixer_nb_comp(1);
1001 chp.nommer("Raccord_Homard");
1002 DoubleTab& chp_val = chp.valeurs();
1003
1004 chp_val=0.;
1005
1006
1007 for (fac=0; fac<nb_faces1; fac++)
1008 {
1009 face1=fac+ndeb1;
1010
1011 elem2=-1;
1012
1013 if (dimension==2) elem2 = zvef2.domaine().chercher_elements(xv1(face1,0),xv1(face1,1));
1014 else elem2 = zvef2.domaine().chercher_elements(xv1(face1,0),xv1(face1,1),xv1(face1,2));
1015
1016 if(elem2==-1)
1017 {
1018 Cerr << "Probleme dans la recherche de l'element associe !" << finl;
1019 exit();
1020 }
1021
1022 chp_val(elem2)++;
1023 }
1024
1025 /////////////////////////////////////////////////////////
1026 // Ecriture du fichier Connectivity_failed pour decoupage
1027 // a l'aide de l'interprete Decouper_Bord_coincident
1028 /////////////////////////////////////////////////////////
1029
1030 SFichier fic(fichier);
1031 fic << nb_faces2 << finl;
1032 fic << nb_faces1 << finl;
1033
1034 for (fac=0; fac<nb_faces2; fac++)
1035 {
1036 face2=fac+ndeb2;
1037 elem2=face_voisin2(face2,0);
1038 if (elem2==-1) elem2=face_voisin2(face2,1);
1039
1040 // recherche de l'indice locale de la face
1041 trouve=0;
1042 for(j=0; j<nbf; j++)
1043 if(face2==elem_faces2(elem2,j))
1044 {
1045 trouve=1;
1046 break;
1047 }
1048
1049 if(trouve==0)
1050 {
1051 Cerr << "Probleme dans la recherche de l'indice local !" << finl;
1052 exit();
1053 }
1054
1055 fic << chp_val(elem2) << " " << fac << " " << elem2 << " " << j << finl;
1056 }
1057
1058 fic <<(int) -1;
1059 // pour forcer l ecriture
1060 fic.close();
1061 /////////////////////////////////////////////////////////
1062 // Ecriture du fichier MED pour decoupage suivant HOMARD
1063 /////////////////////////////////////////////////////////
1064
1065 // renormalisation de chp_val
1066
1067 for (elem=0; elem<nb_elem2; elem++)
1068 {
1069 if(chp_val(elem)==(2*(dimension-1))) chp_val(elem)=1;
1070 else chp_val(elem)=0;
1071 }
1072 Nom bis(fichier_med);
1073 bis+="_index";
1074 fichier_med.prefix(".med");
1075 const Domaine& dom2 = zvef2.domaine();
1076 Noms unites_(1);
1077 unites_[0]="1";
1078 Noms nom_compos(1);
1079 nom_compos[0]=chp.le_nom();
1080 Format_Post_Med post;
1081 post.initialize_by_default(fichier_med);
1082 post.ecrire_domaine(dom2,1);
1083 post.ecrire_champ(dom2,unites_,nom_compos,-1, 0., chp.le_nom(), dom2.le_nom(), Motcle("elem"), "scalar",chp_val);
1084 post.ecrire_champ(dom2,unites_,nom_compos,-1, 0., chp.le_nom(), dom2.le_nom(), Motcle("elem"), "scalar",chp_val);
1085}
classe Ch_front_var_instationnaire_dep Cette classe abstraite represente un champ sur une frontiere,
int initialiser(double temps, const Champ_Inc_base &inco) override
Initialisation en debut de calcul.
void dimensionner(int, int)
Fixe le nombre de composantes et le nombre de valeurs nodales.
DoubleTab & valeurs() override
Surcharge Champ_base::valeurs() Renvoie le tableau des valeurs.
classe Champ_Fonc_P0_VEF
void associer_domaine_dis_base(const Domaine_dis_base &) override
Classe Champ_Inc_base.
const Domaine_dis_base & domaine_dis_base() const override
DoubleTab & valeurs() override
Renvoie le tableau des valeurs du champ au temps courant.
classe Champ_Uniforme Represente un champ constant dans l'espace et dans le temps.
classe Champ_base Cette classe est la base de la hierarchie des champs.
Definition Champ_base.h:43
classe Champ_front_base Classe de base pour la hierarchie des champs aux frontieres.
virtual const Frontiere_dis_base & frontiere_dis() const
Renvoie la frontiere discretisee associee au champ.
classe Champ_front_contact_VEF Permet le couplage scalaire (temperature ou concentration) entre probl...
const IntVect & get_elems_voisin_bord() const
virtual void calcul_grads_transf(double temps)
const Equation_base & equation() const
void calculer_coeffs_echange(double temps) override
NE FAIT RIEN, a surcharger Cette methode peut calculer et stocker des donnees utiles a la.
void creer(const Nom &, const Nom &, const Nom &, const Nom &, const Motcle &)
virtual void calcul_grads_locaux(double temps)
const Domaine_Cl_dis_base & domaine_Cl_dis() const
void connectivity_failed(const Domaine_VEF &, int &, int &, const Domaine_VEF &, int &, int &, Nom &, Nom &)
const Frontiere_dis_base & front_dis() const
void verifier_scalaire_bord(double temps)
Champ_front_base & affecter_(const Champ_front_base &ch) override
void mettre_a_jour(double temps) override
NE FAIT RIEN, a surcharger.
DoubleVect & trace_face_raccord(const Front_VF &fr_vf, const DoubleVect &y, DoubleVect &x)
void associer_ch_inc_base(const Champ_Inc_base &)
OBS_PTR(Champ_Inc_base) l_inconnue1
const IntVect & get_faces_coin() const
int initialiser(double temps, const Champ_Inc_base &inco) override
Initialisation en debut de calcul.
const Domaine_dis_base & domaine_dis() const override
const Champ_Inc_base & inconnue() const
const Milieu_base & milieu() const
classe Champ_front_contact_fictif_VEF Classe derivee de Champ_front_contact_VEF elle-meme derivant de
DoubleTab & valeurs_au_temps(double temps) override
Renvoie les valeurs au temps desire.
classe Cond_lim_base Classe de base pour la hierarchie des classes qui representent les differentes c...
virtual Frontiere_dis_base & frontiere_dis()
Renvoie la frontiere discretisee a laquelle les conditions aux limites s'appliquent.
Champ_front_base & champ_front()
classe Conds_lim Cette classe represente un vecteur de conditions aux limites.
Definition Conds_lim.h:32
classe Constituant Cette classe represente le(s) constituant(s) d'un fluide.
Definition Constituant.h:30
classe Convection_Diffusion_Concentration Cas particulier de Convection_Diffusion_std
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.
Definition Domaine.cpp:405
int nb_faces_elem(int=0) const
Renvoie le nombre de face de type i des elements geometriques constituants le domaine.
Definition Domaine.h:484
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.
class Domaine_VEF
Definition Domaine_VEF.h:54
virtual const DoubleVect & face_surfaces() const
Definition Domaine_VF.h:51
virtual double face_normales(int face, int comp) const
Definition Domaine_VF.h:47
double xv(int num_face, int k) const
Definition Domaine_VF.h:76
double volumes(int i) const
Definition Domaine_VF.h:113
Frontiere_dis_base & frontiere_dis(int) override
renvoie la ieme frontiere_discrete.
Definition Domaine_VF.h:631
int elem_faces(int i, int j) const
renvoie le numero de le ieme face de la maille num_elem la facon dont ces faces sont numerotees est
Definition Domaine_VF.h:543
int oriente_normale(int f, int e) const
Definition Domaine_VF.h:194
int face_voisins(int num_face, int i) const
renvoie l'element voisin de numface dans la direction i.
Definition Domaine_VF.h:418
const Front_VF & front_VF(int i) const
Definition Domaine_VF.h:112
const Nom & le_nom() const override
Donne le nom de l'Objet_U Methode a surcharger : renvoie "neant" dans cette implementation.
classe Domaine_dis_base Cette classe est la base de la hierarchie des domaines discretisees.
const Frontiere_dis_base & frontiere_dis(const Nom &) const
Renvoie la frontiere de Nom nom.
int rang_frontiere(const Nom &)
const Domaine & domaine() const
Class defining operators and methods for all reading operation in an input flow (file,...
Definition Entree.h:42
classe Equation_base Le role d'une equation est le calcul d'un ou plusieurs champs....
virtual const Milieu_base & milieu() const =0
virtual const RefObjU & get_modele(Type_modele type) const
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.
virtual void fixer_nb_comp(int i)
Fixe le nombre de composantes du champ.
const Nom & le_nom() const override
Renvoie le nom du champ.
void nommer(const Nom &) override
Donne un nom au champ.
: Classe de postraitement des champs euleriens au format med.
int ecrire_domaine(const Domaine &domaine, const int est_le_premier_post) override
Ecriture d'un maillage.
int initialize_by_default(const Nom &file_basename) override
Initialisation de la classe avec des parametres par defaut.
int ecrire_champ(const Domaine &domaine, const Noms &unite_, const Noms &noms_compo, int ncomp, double temps_, const Nom &id_du_champ, const Nom &id_du_domaine, const Nom &localisation, const Nom &nature, const DoubleTab &data) override
voir Format_Post_base::ecrire_champ
class Front_VF
Definition Front_VF.h:36
int nb_faces() const
Definition Front_VF.h:53
int num_premiere_face() const
Definition Front_VF.h:63
virtual void trace_face_distant(const DoubleTab &, DoubleTab &) const
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
classe Frontiere_dis_base Classe representant une frontiere discretisee.
const Frontiere & frontiere() const
Renvoie la frontiere geometrique associee.
const Domaine_dis_base & domaine_dis() const
const Nom & le_nom() const override
Renvoie le nom de la frontiere geometrique.
static Objet_U & objet(const Nom &)
Voir Interprete_bloc::objet_global() BM: la classe Interprete n'est pas le meilleur endroit pour cett...
classe Milieu_base Cette classe est la base de la hierarchie des milieux (physiques)
Definition Milieu_base.h:50
virtual const Equation_base & equation(const std::string &nom_inc) const
virtual const Champ_Don_base & conductivite() const
Renvoie la conductivite du milieu.
virtual const Champ_Don_base & diffusivite() const
Renvoie la diffusivite du milieu.
Classe Modele_turbulence_scal_base Cette classe represente un modele de turbulence pour une equation ...
const Champ_Fonc_base & conductivite_turbulente() const
const Turbulence_paroi_scal_base & loi_paroi() const
Renvoie la loi de turbulence sur la paroi (version const).
int loi_paroi_non_nulle() const
Renvoie si oui ou non loi de paroi (version const).
const Equation_base & equation() const
Renvoie la reference sur l'equation pointe par MorEqn::mon_equation.
Definition MorEqn.h:62
Une chaine de caractere (Nom) en majuscules.
Definition Motcle.h:26
class Nom Une chaine de caractere pour nommer les objets de TRUST
Definition Nom.h:31
Nom & prefix(const char *const)
Definition Nom.cpp:329
const Nom & le_nom() const override
Renvoie *this;.
Definition Nom.cpp:563
Un tableau de chaine de caracteres (VECT(Nom)).
Definition Noms.h:26
static int dimension
Definition Objet_U.h:99
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
Classe Pb_Conduction Cette classe represente un probleme de conduction avec rho et Cp non uniformes :
classe Probleme_base C'est un Probleme_U qui n'est pas un couplage.
const Champ_base & get_champ(const Motcle &nom) const override
virtual const Equation_base & equation(int) const =0
static bool is_parallel()
Definition Process.cpp:110
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
Definition Process.cpp:455
void initialise(const Frontiere_t &, const Domaine_dis_base &, const Domaine_dis_base &)
Cette classe est a la classe C++ ofstream ce que la classe Sortie est a la classe C++ ostream Elle re...
Definition SFichier.h:27
Classe de base des flux de sortie.
Definition Sortie.h:52
void resize_array(_SIZE_ new_size, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT)
int nb_dim() const
Definition TRUSTTab.h:199
_SIZE_ dimension(int d) const
Definition TRUSTTab.tpp:133
_SIZE_ size() const
Definition TRUSTVect.tpp:45
void resize(_SIZE_, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT)
Definition TRUSTVect.tpp:91
const Objet_U & valeur() const
Definition TRUST_Ref.h:134
Classe Turbulence_paroi_scal_base Classe de base pour la hierarchie des classes representant les mode...
virtual bool use_equivalent_distance() const
Give a boolean indicating if we need to use equivant distance by default we consider that we use the ...
const DoubleVects & equivalent_distance() const