TRUST 1.9.8
HPC thermohydraulic platform
Loading...
Searching...
No Matches
Echange_contact_Correlation_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 <Echange_contact_Correlation_VEF.h>
17#include <Domaine_Cl_dis_base.h>
18#include <Champ_front_calc.h>
19#include <communications.h>
20#include <Champ_Uniforme.h>
21#include <Probleme_base.h>
22#include <Milieu_base.h>
23#include <Schema_Comm.h>
24#include <Domaine_VEF.h>
25#include <Solv_TDMA.h>
26#include <EFichier.h>
27#include <SFichier.h>
28#include <Domaine.h>
29#include <Param.h>
30
31Implemente_instanciable(Echange_contact_Correlation_VEF,"Paroi_Echange_contact_Correlation_VEF",Temperature_imposee_paroi);
32// XD paroi_echange_contact_correlation_vef condlim_base paroi_echange_contact_correlation_vef BRACE Class to define a
33// XD_CONT thermohydraulic 1D model which will apply to a boundary of 2D or 3D domain. NL2 Warning : For parallel
34// XD_CONT calculation, the only possible partition will be according the axis of the model with the keyword
35// XD_CONT Tranche_geom.
36
37Sortie& Echange_contact_Correlation_VEF::printOn(Sortie& s ) const { return s << que_suis_je() << finl; }
38
40{
41 if (app_domains.size() == 0) app_domains = { Motcle("Thermique") };
42 if (supp_discs.size() == 0) supp_discs = { Nom("VEF"), Nom("EF"), Nom("EF_axi"), Nom("VEF_P1_P1"), Nom("VEFPreP1B"), Nom("PolyMAC_CDO"), Nom("PolyMAC_HFV"), Nom("PolyMAC_MPFA") };
43
44 Param param(que_suis_je());
46 dt_impr = 1e10;
47 avec_rayo=0;
48 set_param(param);
49 param.lire_avec_accolades_depuis(is);
50
51 le_champ_front.typer("Champ_front_fonc");
53 return is;
54}
55
57{
58 param.ajouter("dir",&dir); // XD_ADD_P entier
59 // XD_CONT Direction (0 : axis X, 1 : axis Y, 2 : axis Z) of the 1D model.
60 param.ajouter_condition("(value_of_dir_ge_0)_AND_(value_of_dir_le_2)", "La direction doit etre 0, 1 ou 2 dans Echange_contact_Correlation_VDF");
61 param.ajouter("Tinf",&Tinf); // XD_ADD_P floattant
62 // XD_CONT Inlet fluid temperature of the 1D model (oC or K).
63 param.ajouter("Tsup",&Tsup); // XD_ADD_P floattant
64 // XD_CONT Outlet fluid temperature of the 1D model (oC or K).
65 param.ajouter_non_std("lambda",(this)); // XD_ADD_P chaine
66 // XD_CONT Thermal conductivity of the fluid (W.m-1.K-1).
67 param.ajouter_non_std("rho",(this)); // XD_ADD_P chaine
68 // XD_CONT Mass density of the fluid (kg.m-3) which may be a function of the temperature T.
69 param.ajouter("dt_impr",&dt_impr); // XD_ADD_P floattant
70 // XD_CONT Printing period in name_of_data_file_time.dat files of the 1D model results.
71 param.ajouter("Cp",&Cp); // XD_ADD_P floattant
72 // XD_CONT Calorific capacity value at a constant pressure of the fluid (J.kg-1.K-1).
73 param.ajouter_non_std("mu",(this)); // XD_ADD_P chaine
74 // XD_CONT Dynamic viscosity of the fluid (kg.m-1.s-1) which may be a function of thetemperature T.
75 param.ajouter("debit",&debit); // XD_ADD_P floattant
76 // XD_CONT Surface flow rate (kg.s-1.m-2) of the fluid into the channel.
77 param.ajouter("N",&N); // XD_ADD_P entier
78 // XD_CONT Number of 1D cells of the 1D mesh.
79 param.ajouter_non_std("Dh",(this)); // XD_ADD_P chaine
80 // XD_CONT Hydraulic diameter may be a function f(x) with x position along the 1D axis (xinf <= x <= xsup)
81 param.ajouter_non_std("surface",(this)); // XD_ADD_P chaine
82 // XD_CONT Section surface of the channel which may be function f(Dh,x) of the hydraulic diameter (Dh) and x position
83 // XD_CONT along the 1D axis (xinf <= x <= xsup)
84 param.ajouter("xinf",&xinf); // XD_ADD_P floattant
85 // XD_CONT Position of the inlet of the 1D mesh on the axis direction.
86 param.ajouter("xsup",&xsup); // XD_ADD_P floattant
87 // XD_CONT Position of the outlet of the 1D mesh on the axis direction.
88 param.ajouter_non_std("Nu",(this)); // XD_ADD_P chaine
89 // XD_CONT Nusselt number which may be a function of the Reynolds number (Re) and the Prandtl number (Pr).
90 // Le mot cle suivant n'est pas encore commente car les hypotheses sur ce rayonnement sont restrictives
91 param.ajouter_non_std("emissivite_pour_rayonnement_entre_deux_plaques_quasi_infinies",(this)); // XD_ADD_P floattant
92 // XD_CONT Coefficient of emissivity for radiation between two quasi infinite plates.
93 // Rajout Cyril MALOD (14/09/2006)
94 param.ajouter_flag("Reprise_correlation",&Reprise_temperature); // XD_ADD_P rien
95 // XD_CONT Keyword in the case of a resuming calculation with this correlation.
96}
97
99{
100 int retval = 1;
101 if (mot=="lambda")
102 {
103 Nom tmp;
104 is >> tmp;
105 lambda_T.setNbVar(1);
106 lambda_T.setString(tmp);
107 lambda_T.addVar("T");
108 lambda_T.parseString();
109 }
110 else if (mot=="rho")
111 {
112 Nom tmp;
113 is >> tmp;
114 rho_T.setNbVar(1);
115 rho_T.setString(tmp);
116 rho_T.addVar("T");
117 rho_T.parseString();
118 }
119 else if (mot=="mu")
120 {
121 Nom tmp;
122 is >> tmp;
123 mu_T.setNbVar(1);
124 mu_T.setString(tmp);
125 mu_T.addVar("T");
126 mu_T.parseString();
127 }
128 else if (mot == "Dh")
129 {
130 Nom tmp;
131 is >> tmp;
132 fct_Dh.setNbVar(1);
133 fct_Dh.setString(tmp);
134 fct_Dh.addVar("x");
135 fct_Dh.parseString();
136 }
137 else if (mot=="surface")
138 {
139 Nom tmp;
140 is >> tmp;
141 fct_vol.setNbVar(2);
142 fct_vol.setString(tmp);
143 fct_vol.addVar("Dh");
144 fct_vol.addVar("x");
145 fct_vol.parseString();
146 }
147 else if (mot=="Nu")
148 {
149 Nom tmp;
150 is >> tmp;
151 fct_Nu.setNbVar(2);
152 fct_Nu.setString(tmp);
153 fct_Nu.addVar("Re");
154 fct_Nu.addVar("Pr");
155 fct_Nu.parseString();
156 }
157 else if (mot=="emissivite_pour_rayonnement_entre_deux_plaques_quasi_infinies")
158 {
159 avec_rayo=1;
160 is >> emissivite;
161 }
162 else retval = -1;
163
164 return retval;
165}
166
167
168
169/**
170 * Calcule le coeff d echange local dans la maille solide.
171 */
173{
174 // forcement local
175
176
177 const Equation_base& mon_eqn = domaine_Cl_dis().equation();
178 const Milieu_base& mon_milieu = mon_eqn.milieu();
179 const Domaine_VEF& zvef = ref_cast(Domaine_VEF,domaine_Cl_dis().domaine_dis());
180 const Front_VF& ma_front_vf = ref_cast(Front_VF,frontiere_dis());
181 const IntTab& face_voisins = zvef.face_voisins();
182
183 int nb_comp = mon_milieu.conductivite().nb_comp();
184 const int nb_faces_bord = ma_front_vf.nb_faces();
185
186 const int ndeb = ma_front_vf.num_premiere_face();
187 const int nfin = ndeb + nb_faces_bord;
188
189
190
191 if(!sub_type(Champ_Uniforme,mon_milieu.conductivite()))
192 {
193 const DoubleTab& tab_lambda = mon_milieu.conductivite().valeurs();
194
195 for (int face=ndeb; face<nfin; face++)
196 {
197 int elem = face_voisins(face,0);
198 if(elem == -1)
199 elem = face_voisins(face,1);
200
201 for(int i=0; i<nb_comp; i++)
202 tab(face-ndeb,i) = pdt_scalSqrt(zvef,face,face,elem,dimension,tab_lambda(elem,i)) ;
203 }
204 }
205 else // la conductivite est un OWN_PTR(Champ_base) uniforme
206 {
207 const DoubleTab& tab_lambda = mon_milieu.conductivite().valeurs();
208
209 for (int face=ndeb; face<nfin; face++)
210 {
211 int elem = face_voisins(face,0);
212 if(elem == -1)
213 elem = face_voisins(face,1);
214
215
216 for(int i=0; i<nb_comp; i++)
217 {
218 tab(face-ndeb,i) = pdt_scalSqrt(zvef,face,face,elem,dimension,tab_lambda(0,i));
219 }
220 }
221 }
222
223}
224
225
226
227/**
228 * Complete et initialise les attributs de la classe
229 */
230
232{
233
234 init();
235
236 T=std::min(Tinf,Tsup);
238 if (T(0)==Tinf)
239 U=debit/rho(0);
240 else U = debit/rho(N-1);
241
242 const Equation_base& mon_eqn = domaine_Cl_dis().equation();
243 const Milieu_base& mon_milieu = mon_eqn.milieu();
244 const Front_VF& ma_front_vf = ref_cast(Front_VF,frontiere_dis());
245 const int nb_faces_bord = ma_front_vf.nb_faces();
246 int nb_comp = mon_milieu.conductivite().nb_comp();
247 h_solide.resize(nb_faces_bord,nb_comp);
248
249
250
251 for (int i=0; i<N; i++)
252 {
254 }
256
257
258
259
260 DoubleTab& Tparoi =champ_front().valeurs();
261 Tparoi.resize(nb_faces_bord,nb_comp);
262 const DoubleTab& Ts = mon_eqn.inconnue().valeurs();
263 const Domaine_VEF& zvef = ref_cast(Domaine_VEF,domaine_Cl_dis().domaine_dis());
264 const IntTab& face_voisins = zvef.face_voisins();
265 const int ndeb = ma_front_vf.num_premiere_face();
266 for (int ii=0; ii<nb_faces_bord; ii++)
267 {
268 double Tint=0.;
269 int face = ndeb+ii;
270 int elem = face_voisins(face,0);
271 if(elem == -1)
272 elem = face_voisins(face,1);
273
274
275 // on recupere les faces 2, 3 et 4 de l'element contenant "face"
276 int face2 = zvef.elem_faces(elem,0);
277 int face3 = zvef.elem_faces(elem,1);
278 if (face2 == face)
279 face2 = zvef.elem_faces(elem,dimension);
280 else if (face3 == face)
281 face3 = zvef.elem_faces(elem,dimension);
282
283 Tint += pdt_scal(zvef,face,face2,elem,dimension,1.)*Ts(face2) + pdt_scal(zvef,face,face3,elem,dimension,1.)*Ts(face3);
284
285 if(dimension == 3)
286 {
287 int face4 = zvef.elem_faces(elem,2);
288 if (face4 == face)
289 face4 = zvef.elem_faces(elem,dimension);
290 Tint += pdt_scal(zvef,face,face4,elem,dimension,1.)*Ts(face4);
291 }
292
293 Tint *= -1./pdt_scal(zvef,face,face,elem,dimension,1.);
294
295
297 }
298
300
301 //Mise a jour car pas de dependance a des donnees d un autre probleme
302 //dans le cas de probleme couple
303 //Methode completer() peut etre a remplacer par methode initialiser()
304 const double temps = mon_eqn.schema_temps().temps_courant();
305 mettre_a_jour(temps);
306}
307
308/**
309 * Initialise le tab tab_ech pour le parallele
310 */
314/**
315 * Calcule les CL a appliquer sur l'equation d'energie
316 */
318{
319 Schema_Comm schema_comm;
320 const Joints& joints = domaine_Cl_dis().domaine().faces_joint();
321 const int nb_voisins = joints.size();
322 ArrOfInt send_pe_list(nb_voisins);
323 int i;
324 for (i = 0; i < nb_voisins; i++)
325 send_pe_list[i] = joints[i].PEvoisin();
326 schema_comm.set_send_recv_pe_list(send_pe_list, send_pe_list);
327
328 const double ymin = coord(1);
329 const double ymax = coord(N-2);
330 const double Tmin = T(1);
331 const double Tmax = T(N-2);
332
333 T_CL0 = Tinf;
334 T_CL1 = Tsup;
335
336 schema_comm.begin_comm();
337 for (i = 0; i < nb_voisins; i++)
338 {
339 const int pe = send_pe_list[i];
340 schema_comm.send_buffer(pe) << ymin << ymax << Tmin << Tmax;
341 }
342 schema_comm.echange_taille_et_messages();
343 for (i = 0; i < nb_voisins; i++)
344 {
345 const int pe = send_pe_list[i];
346 double ymin_voisin, ymax_voisin, Tmin_voisin, Tmax_voisin;
347 schema_comm.recv_buffer(pe) >> ymin_voisin >> ymax_voisin >> Tmin_voisin >> Tmax_voisin;
348 if (ymax_voisin < ymin)
349 T(0) = T_CL0 = 0.5 * (Tmax_voisin + Tmin);
350 else if (ymin_voisin > ymax)
351 T(N-1) = T_CL1 = 0.5 * (Tmin_voisin + Tmax);
352 else
353 {
354 Cerr << "Erreur dans Echange_contact_Correlation_VEF::calculer_CL() (decoupage incompatible ?)";
355 exit();
356 }
357 }
358 schema_comm.end_comm();
359}
360
361/**
362 * Calcule rho, mu et lambda du fluide pour la temperature courante
363 */
365{
366 for (int i=0; i<N; i++)
367 {
368 rho_T.setVar("T",T(i));
369 mu_T.setVar("T",T(i));
370 lambda_T.setVar("T",T(i));
371 rho(i) = rho_T.eval();
372 mu(i) = mu_T.eval();
373 lambda(i) = lambda_T.eval();
374 }
375}
376
377/**
378 * Calcule le coeff d echange suivant la correlation entree dans le jdd
379 */
381{
382 double Re,Pr;
383 Re = std::fabs(getQh()*getDh(i)/getMu(i));
384 Pr = getMu(i)*getCp()/getLambda(i);
385 fct_Nu.setVar("Re",Re);
386 fct_Nu.setVar("Pr",Pr);
387 return fct_Nu.eval()*getLambda(i)/getDh(i);
388}
389
390
391/**
392 * Calcul du terme source de puissance volumique dans l'equation d'energie 1D fluide.
393 */
395{
396 const Domaine_VEF& ma_zvef = ref_cast(Domaine_VEF,domaine_Cl_dis().domaine_dis());
397 const Front_VF& ma_front_vf = ref_cast(Front_VF,frontiere_dis());
398 const int ndeb = ma_front_vf.num_premiere_face();
399 const int nb_faces_bord = ma_front_vf.nb_faces();
400 const IntTab& face_voisins = ma_zvef.face_voisins();
401
402 DoubleTab& Tp= champ_front().valeurs();
403
404
405 Qvol=0.;
406 for(int iface=0; iface<nb_faces_bord; iface++)
407 {
408 int face = ndeb+iface;
409 int corresp = correspondance_solide_fluide(iface);
410 int elem = face_voisins(face,0);
411 if(elem == -1)
412 elem = face_voisins(face,1);
413 Qvol(corresp)+=h_correlation(corresp)*(Tp(iface,0)-T(corresp))*surfacesVEF(ma_zvef,face,dimension);
414 }
415 for (int i=0; i<N; i++)
416 Qvol(i)/=vol(i);
417
418}
419
420
421
423{
424 const Domaine_VEF& ma_zvef = ref_cast(Domaine_VEF,domaine_Cl_dis().domaine_dis());
425 const Front_VF& ma_front_vf = ref_cast(Front_VF,frontiere_dis());
426 const DoubleTab& xv = ma_zvef.xv();
427 const IntTab& face_sommets = ma_zvef.face_sommets();
428 const DoubleTab& coord_som = ma_zvef.domaine().coord_sommets();
429
430 const int ndeb = ma_front_vf.num_premiere_face();
431 const int nb_faces_bord = ma_front_vf.nb_faces();
432
433 // N entre par l'utilisateur = Nombre de mailles 1D
434 N=N/Process::nproc()+2;
435 // N modifie pour que cela soit le nombre de noeuds 1D par processeur
436
437 // Ici, on suppose que l'utilisateur a decoupe en tranche selon la direction 1D
438 double delta=(xsup-xinf)/Process::nproc();
439 xinf=xinf+Process::me()*delta;
440 xsup=xinf+delta;
441 // on dimensionne
442 coord.resize(N);
443 U.resize(N);
444 T.resize(N);
445 Qvol.resize(N);
446 rho.resize(N);
447 mu.resize(N);
448 lambda.resize(N);
449 vol.resize(N);
450 diam.resize(N);
451 h_correlation.resize(N);
452
453 // on remplit les coordonnees des noeuds du maillages 1D dans le fluide
454 coord(0)=xinf;
455 coord(N-1)=xsup;
456 double dx = (xsup-xinf)/(N-2);
457 for(int i=1; i<N-1; i++)
458 {
459 coord(i) = xinf+dx*(i-0.5);
460 }
461
462 // on remplit les correspondances elements solides -> elements fluides
463 correspondance_solide_fluide.resize(nb_faces_bord);
464 for(int i=0; i<nb_faces_bord; i++)
465 {
466 double min=std::fabs(xv(i+ndeb,dir)-coord(1));
467 double tmp=0.;
468 int jmin=1;
469 for (int j=2; j<N-1; j++)
470 {
471 if ((tmp=std::fabs(xv(i+ndeb,dir)-coord(j))) < min)
472 {
473 min = tmp;
474 jmin = j;
475 }
476 }
477 //Cerr << "min=" << min << " jmin=" << jmin << finl;
479 }
480 //Cerr << Process::me() << finl;
481 //Cerr << correspondance_solide_fluide << finl;
482
483 if (avec_rayo == 1)
484 {
485 const double precision = 1.e-6;
486 const int MAX_FACES_PATCH = 500; //!!! a revoir
487 int nb_patches = 2*(N-2);
488 patches_rayo.resize(nb_patches,MAX_FACES_PATCH);
489 nb_faces_patch.resize(nb_patches);
490 IntVect traite(nb_faces_bord);
491 correspondance_fluide_patch.resize(N,2); // en dur, deux patches associes a un point fluide
492 correspondance_face_patch.resize(nb_faces_bord); // fournit pour chaque face du bord, le numero du patch auquel elle appartient
493 traite=0;
494 correspondance_fluide_patch=-1;
495 int compteur_patches = 0;
496 for(int i=0; i<nb_faces_bord; i++)
497 {
498 int face_corresp = correspondance_solide_fluide(i);
499 if (traite(i) == 0)
500 {
501 int compteur_face=1;
502 traite(i)=1;
503 if (compteur_patches==nb_patches)
504 {
505 Cerr << "Erreur dans Echange_contact_Correlation_VEF::initialiser" << finl;
506 Cerr << "Le nombre de patches est depasse." << finl;
507 Cerr << "Contacter le support TRUST." << finl;
508 exit();
509 }
510 patches_rayo(compteur_patches,0) = i;
511 correspondance_face_patch(i)=compteur_patches;
512 if (correspondance_fluide_patch(face_corresp,0) == -1)
513 correspondance_fluide_patch(face_corresp,0) = compteur_patches;
514 else
515 correspondance_fluide_patch(face_corresp,1) = compteur_patches;
516
517 int s0 = face_sommets(ndeb+i,0);
518 int s1 = face_sommets(ndeb+i,1);
519 int s2 = face_sommets(ndeb+i,2);
520 ArrOfDouble v01(dimension);
521 ArrOfDouble v02(dimension);
522 for (int idim=0; idim<dimension; idim++)
523 {
524 v01[idim] = coord_som(s1,idim)-coord_som(s0,idim);
525 v02[idim] = coord_som(s2,idim)-coord_som(s0,idim);
526 }
527 ArrOfDouble normale(dimension);
528 normale[0] = v01[1]*v02[2]-v01[2]*v02[1];
529 normale[1] = -v01[0]*v02[2]+v01[2]*v02[0];
530 normale[2] = v01[0]*v02[1]-v01[1]*v02[0];
531
532 for(int j=0; j<nb_faces_bord; j++)
533 {
534 if ((traite(j) == 0) && (correspondance_solide_fluide(j) == face_corresp))
535 {
536 int sj_0 = face_sommets(ndeb+j,0);
537 double pscal = 0.;
538 for (int idim=0; idim<dimension; idim++)
539 {
540 pscal += normale[idim]*(coord_som(sj_0,idim)-coord_som(s0,idim));
541 }
542 if (std::fabs(pscal) < precision)
543 {
544 traite(j) = 1;
545 if (compteur_face==MAX_FACES_PATCH)
546 {
547 Cerr << "Erreur dans Echange_contact_Correlation_VEF::initialiser" << finl;
548 Cerr << "Le nombre maximal de faces de patches est depasse." << finl;
549 Cerr << "Contacter le support TRUST." << finl;
550 exit();
551 }
552 patches_rayo(compteur_patches,compteur_face++) = j;
553 correspondance_face_patch(j)=compteur_patches;
554 }
555 }
556 }
557 nb_faces_patch(compteur_patches) = compteur_face;
558 compteur_patches++;
559 }
560 }
561
562
563 }
564 // calcul du diametre hydraulique
565 for (int i=0; i<N; i++)
566 {
567 fct_Dh.setVar("x",coord(i));
568 diam(i)=fct_Dh.eval();
569 }
570 // calcul des volumes des tranches
571 vol=0.;
572 const double dz = (coord(2)-coord(1)); // pour l'instant dz est constant, le maillage fluide est regulier (hormis pour le premier et dernier point)
573 for (int i=1; i<N-1; i++)
574 {
575 fct_vol.setVar("Dh",getDh(i));
576 fct_vol.setVar("x",coord(i));
577 vol(i)=fct_vol.eval()*dz;
578 }
579 vol(0) = vol(N-1) = 1.; // ne sert pas mais evite une division par zero dans le calcul de Qvol.
580}
581
582
583/**
584 * Calcule la vitesse par conservation de la masse
585 */
587{
588 for (int i=0; i<N; i++)
589 U(i) = debit/rho(i);
590}
591
592
593/**
594 * Calcule la temperature 1D dans le fluide en resolvant la conservation de l'energie
595 */
597{
598 const Equation_base& mon_eqn = domaine_Cl_dis().equation();
599 const double dt = mon_eqn.schema_temps().pas_de_temps();
600
601 DoubleVect ma(N); // diagonale
602 DoubleVect mb(N-1); // sous-diagonale
603 DoubleVect mc(N-1); // sur-diagonale
604 DoubleVect sm(N);
605 const int sgn = (debit>0) ? 1 : -1; // schema amont pour le transport
606
607
608 ma(0) = 1.;
609 ma(N-1) = 1.;
610 sm(0) = T_CL0;
611 sm(N-1) = T_CL1;
612 mc(0) = 0.;
613 mb(N-2) = 0.;
614 int i;
615 for (i=1; i<N-1; i++)
616 {
617 const double dtrhoCp = dt/rho(i)/Cp;
618 const double dz1 = coord(i+1)-coord(i);
619 const double dz2 = coord(i)-coord(i-1);
620 const double l1 = 0.5*(lambda(i+1)+lambda(i));
621 const double l2 = 0.5*(lambda(i)+lambda(i-1));
622
623 ma(i)=1+dtrhoCp*(sgn*Cp*debit/dz1+2*(l1/dz1+l2/dz2)/(dz1+dz2));
624
625 sm(i) = T(i)+dtrhoCp*Qvol(i);
626
627 mc(i) = dtrhoCp*(0.5*(1-sgn)*Cp*debit/dz1-2*l1/dz1/(dz1+dz2));
628
629 mb(i-1) = dtrhoCp*(-2*l2/dz2/(dz1+dz2));
630 mb(i-1) += dtrhoCp*(-0.5*(1+sgn)*Cp*debit/dz1);
631 }
632
633
634
635
636 DoubleVect xx(N);
637 xx=0.;
638 Solv_TDMA::resoudre(ma,mb,mc,sm,xx,N);
639 for (i=0; i<N; i++)
640 T(i) = xx(i);
641}
642
643void Echange_contact_Correlation_VEF_sauvegarder(const Nom& filename, const double temps, const DoubleVect& T)
644{
645 const int canal = 56;
646 const int nproc = Process::nproc();
648 {
649 Process::Journal() << "Echange_contact_Correlation_VEF::mettre_a_jour: sauvegarde dans le fichier "
650 << filename << finl;
651 SFichier file(filename);
652 file << "Temps = " << temps << finl;
653 DoubleVect tmp(T); // copie de T
654 int count = 0;
655 for (int pe = 0; pe < nproc; pe++)
656 {
657 recevoir(tmp, pe, canal); // ne fait rien si pe==0
658 const int sz = tmp.size();
659 for (int i = 0; i < sz; i++)
660 {
661 file << "T(" << count << ")\t = " << tmp[i] << finl;
662 count++;
663 }
664 }
665 }
666 else
667 {
668 envoyer(T, 0, canal);
669 }
670}
671
672void Echange_contact_Correlation_VEF_reprendre(const Nom& filename, const double temps, DoubleVect& T)
673{
674 const int canal = 56;
675 const int nproc = Process::nproc();
677 {
678 Cerr << "Echange_contact_Correlation_VEF::mettre_a_jour: reprise dans le fichier "
679 << filename << finl;
680 EFichier file(filename);
681 file.set_error_action(Entree::ERROR_EXIT); // Exit en cas d'erreur de lecture
682 file.set_check_types(1); // Verifie que c'est bien des double
683 Nom bidon1, bidon2, temps_lu;
684 // Le format attendu en entete est "Temps = valeur"
685 file >> bidon1 >> bidon2 >> temps_lu;
686 if (bidon1 != "Temps" || bidon2 != "=" || temps_lu != temps)
687 {
688 Cerr << "Erreur dans Echange_contact_Correlation_VEF::mettre_a_jour() :\n"
689 << " On attendait l'entet suivante dans le fichier " << filename
690 << "\n Temps = " << temps << finl;
691 if (temps_lu != temps)
692 {
693 Cerr << "Le temps indique dans le fichierest different du temps de reprise du calcul " << temps
694 << "Vous ne pouvez pas faire de reprise pour la correlation.\n"
695 << "Supprimez dans la correlation le mot clef \"Reprise\".\n"
696 << "La phase transitoire du calcul sera fausse, mais l'etat stationnaire sera juste." << finl;
697 }
699 }
700 DoubleVect tmp(T); // copie de T
701 double valeur;
702 for (int pe = 0; pe < nproc; pe++)
703 {
704 recevoir(tmp, pe, canal); // ne fait rien si pe==0
705 const int sz = tmp.size();
706 for (int i = 0; i < sz; i++)
707 {
708 // Le format attendu est "T(i) = valeur"
709 file >> bidon1 >> bidon2 >> valeur;
710 tmp[i] = valeur;
711 }
712 envoyer(tmp, pe, canal); // ne fait rien si pe==0
713 if (pe == 0)
714 T = tmp;
715 }
716 }
717 else
718 {
719 envoyer(T, 0, canal); // j'envoie un tableau de la bonne taille au proc 0
720 recevoir(T, 0, canal);// je recois le tableau rempli
721 }
722}
723
724/**
725 * Mise a jour de la vitesse, temperature fluide et coeff d'echange
726 */
728{
729
730 // Nom des fichiers de sauvegarde
731 Nom Fichier_sauv_nom = domaine_Cl_dis().equation().probleme().le_nom();
732 Fichier_sauv_nom+="_";
733 Fichier_sauv_nom+=frontiere_dis().frontiere().le_nom();
734 Fichier_sauv_nom+=".sauv";
735
736 // Operation de reprise du champ de temperature dans le fluide
738 {
739 Echange_contact_Correlation_VEF_reprendre(Fichier_sauv_nom, temps, T);
741 }
742
743 calculer_CL();
745 calculer_Q();
748
749
750
751 for (int i=0; i<N; i++)
753
755
756 const int taille = h_solide.dimension(0);
757 DoubleTab& Tparoi = champ_front().valeurs();
758 const Equation_base& mon_eqn = domaine_Cl_dis().equation();
759 const DoubleTab& Ts = mon_eqn.inconnue().valeurs();
760 Domaine_VEF& zvef = ref_cast(Domaine_VEF,domaine_Cl_dis().domaine_dis());
761 const Front_VF& ma_front_vf = ref_cast(Front_VF,frontiere_dis());
762 const IntTab& face_voisins = zvef.face_voisins();
763 const int ndeb = ma_front_vf.num_premiere_face();
764 const double sigma = 5.67e-8;
765 const DoubleVect& face_surfaces = zvef.face_surfaces();
766 int nb_patches=2*(N-2);
767 flux_radiatif.resize(nb_patches);
769 IntVect patch_calcule(nb_patches);
770 patch_calcule=0;
771 for (int ii=0; ii<taille; ii++)
772 {
773 double Tint=0.;
774 int face = ndeb+ii;
775 int elem = face_voisins(face,0);
776 if(elem == -1)
777 elem = face_voisins(face,1);
778
779
780 // on recupere les faces 2, 3 et 4 de l'element contenant "face"
781 int face2 = zvef.elem_faces(elem,0);
782 int face3 = zvef.elem_faces(elem,1);
783 if (face2 == face)
784 face2 = zvef.elem_faces(elem,dimension);
785 else if (face3 == face)
786 face3 = zvef.elem_faces(elem,dimension);
787
788 Tint += pdt_scal(zvef,face,face2,elem,dimension,1.)*Ts(face2) + pdt_scal(zvef,face,face3,elem,dimension,1.)*Ts(face3);
789
790 if(dimension == 3)
791 {
792 int face4 = zvef.elem_faces(elem,2);
793 if (face4 == face)
794 face4 = zvef.elem_faces(elem,dimension);
795 Tint += pdt_scal(zvef,face,face4,elem,dimension,1.)*Ts(face4);
796 }
797
798 Tint *= -1./pdt_scal(zvef,face,face,elem,dimension,1.);
799
800 int patch_courant = 0;
801 if (avec_rayo == 1)
802 {
803 patch_courant = correspondance_face_patch(ii);
804 if (!patch_calcule(patch_courant))
805 {
806 int patch_en_face = correspondance_fluide_patch(correspondance_solide_fluide(ii),0);
807 if (patch_en_face == patch_courant)
808 patch_en_face = correspondance_fluide_patch(correspondance_solide_fluide(ii),1);
809
810 double Tp14 = 0.;
811 double surf1_tot = 0.;
812 for (int face_patch=0; face_patch<nb_faces_patch(patch_courant); face_patch++)
813 {
814 int f = ndeb+patches_rayo(patch_courant,face_patch);
815 double surf = face_surfaces(f);
816 Tp14 += surf*pow(Ts(f),4);
817 surf1_tot += surf;
818 }
819 Tp14 /= surf1_tot;
820 double Tp24 = 0.;
821 double surf2_tot = 0.;
822 for (int face_patch=0; face_patch<nb_faces_patch(patch_en_face); face_patch++)
823 {
824 int f = ndeb+patches_rayo(patch_en_face,face_patch);
825 double surf = face_surfaces(f);
826 Tp24 += surf*pow(Ts(f),4);
827 surf2_tot += surf;
828 }
829 Tp24 /= surf2_tot;
830
831 flux_radiatif(patch_courant) = sigma*emissivite/(2-emissivite)*(Tp24-Tp14);
832 patch_calcule(patch_courant) = 1;
833 if (limpr(temps,mon_eqn.schema_temps().pas_de_temps()))
834 {
835 //Cout << ii << " " << patch_courant << finl;
836 if (Process::is_parallel()) Cout << "Processeur " << Process::me() << " ";
837 Cout << ma_front_vf.le_nom() << " patch " << patch_courant;
838 Cout << " : flux radiatif=sigma*eps/(2-eps)*(TP2^4-TP1^4)= " << flux_radiatif(patch_courant) << " W/m2";
839 Cout << " TP2= " << pow(Tp24,0.25) << " K";
840 Cout << " TP1= " << pow(Tp14,0.25) << " K" << finl;
841 }
842 }
843 }
845 }
846 // Mise a jour des CLs pour avoir une impression correcte des resultats
847 calculer_CL();
848 if (limpr(temps,mon_eqn.schema_temps().pas_de_temps())) imprimer(temps);
849
851
852 Echange_contact_Correlation_VEF_sauvegarder(Fichier_sauv_nom, temps, T);
853}
854
855
856/**
857 * Teste si l'impression est demandee
858 */
859int Echange_contact_Correlation_VEF::limpr(double temps_courant,double dt) const
860{
862 // Test un peu tordu, mais ca fonctionne !!!! (CM 05/07/2007)
863 if (dt_impr<=dt || ((sch.temps_max()<=temps_courant || sch.nb_pas_dt_max()<=(sch.nb_pas_dt()+1) || (temps_courant!=sch.temps_courant() && sch.nb_pas_dt()==0)) && dt_impr!=1e10))
864 return 1;
865 else
866 {
867 // Voir Schema_Temps_base::limpr pour information sur epsilon et modf
868 static const double epsilon = 1.e-9;
869 double i, j;
870 modf(temps_courant/dt_impr + epsilon, &i);
871 modf((temps_courant-dt)/dt_impr + epsilon, &j);
872 return ( i>j );
873 }
874}
875
876
877/**
878 * Imprime les resultats
879 */
881{
882 const int ME = Process::me();
883 const int nbproc = Process::nproc();
884
885 if (nbproc>1)
886 {
887 envoyer(coord,ME,0,ME);
888 envoyer(T,ME,0,ME);
889 envoyer(U,ME,0,ME);
890 envoyer(h_correlation,ME,0,ME);
891 envoyer(rho,ME,0,ME);
892 envoyer(mu,ME,0,ME);
893 envoyer(lambda,ME,0,ME);
894 envoyer(Qvol,ME,0,ME);
895 envoyer(vol,ME,0,ME);
896 envoyer(flux_radiatif,ME,0,ME);
897
898 if (je_suis_maitre())
899 {
900 Nom nom_bord=frontiere_dis().frontiere().le_nom();
901 nom_bord+="_";
902 nom_bord+=Nom(temps);
903 nom_bord+=".dat";
904 SFichier fic(nom_bord);
905 fic.precision(domaine_Cl_dis().equation().schema_temps().precision_impr());
906 fic.setf(ios::scientific);
907 double Qt=0.;
908 fic << "# X T U h rho mu lambda Q[W]";
909 if (avec_rayo) fic << " Flux_radiatif(W/m2)";
910 fic << finl;
911
912 for (int p=0; p<nbproc; p++)
913 {
914 DoubleVect coord_tmp;
915 DoubleVect T_tmp;
916 DoubleVect U_tmp;
917 DoubleVect h_tmp;
918 DoubleVect rho_tmp;
919 DoubleVect mu_tmp;
920 DoubleVect lambda_tmp;
921 DoubleVect Qvol_tmp;
922 DoubleVect vol_tmp;
923 DoubleVect flux_radiatif_tmp;
924
925 recevoir(coord_tmp,p,0,p);
926 recevoir(T_tmp,p,0,p);
927 recevoir(U_tmp,p,0,p);
928 recevoir(h_tmp,p,0,p);
929 recevoir(rho_tmp,p,0,p);
930 recevoir(mu_tmp,p,0,p);
931 recevoir(lambda_tmp,p,0,p);
932 recevoir(Qvol_tmp,p,0,p);
933 recevoir(vol_tmp,p,0,p);
934 recevoir(flux_radiatif_tmp,p,0,p);
935
936 for (int i=0; i<coord_tmp.size(); i++)
937 {
938 fic << coord_tmp(i) << " \t" << T_tmp(i) << " \t" << U_tmp(i) << " \t" << h_tmp(i) << " \t" ;
939 fic << rho_tmp(i) << " \t" << mu_tmp(i) << " \t" << lambda_tmp(i) << " \t" << Qvol_tmp(i)*vol_tmp(i);
940 if (avec_rayo && i>0 && i<coord_tmp.size()-1) fic << " \t" << flux_radiatif_tmp(i-1);
941 fic << finl;
942 Qt+=Qvol_tmp(i)*vol_tmp(i);
943 }
944
945 }
946 fic << "# Q total[W] = " << Qt << finl;
947 fic << finl;
948 }
949 }
950 else
951 {
952 Nom nom_bord=frontiere_dis().frontiere().le_nom();
953 nom_bord+="_";
954 nom_bord+=Nom(temps);
955 nom_bord+=".dat";
956 SFichier fic(nom_bord);
957 fic.precision(domaine_Cl_dis().equation().schema_temps().precision_impr());
958 fic.setf(ios::scientific);
959 double Qt=0.;
960 fic << "# X T U h rho mu lambda Q[W]";
961 if (avec_rayo) fic << " Flux_radiatif(W/m2)";
962 fic << finl;
963
964 for (int i =0; i<N; i++)
965 {
966 fic << coord(i) << " \t" << T(i) << " \t" << U(i) << " \t" << h_correlation(i) << " \t" << rho(i) << " \t" ;
967 fic << mu(i) << " \t" << lambda(i) << " \t" << Qvol(i)*vol(i);
968 if (avec_rayo && i>0 && i<N-1) fic << " \t" << flux_radiatif(i-1);
969 fic << finl;
970 Qt+=Qvol(i)*vol(i);
971 }
972 fic << "# Q total[W] = " << Qt << finl;
973 fic << finl;
974
975 }
976
977}
978
979// Attention : la normale a la face num_face est suppose sortante
980// tandis que celle a la face num2 est reorientee dans la methode
981// afin d etre sortante.
982double Echange_contact_Correlation_VEF::pdt_scalSqrt(const Domaine_VEF& le_dom,int num_face,int num2,
983 int num_elem,int dim,double diffu)
984{
985 double pscal;
986
987 pscal = le_dom.face_normales(num_face,0)*le_dom.face_normales(num2,0)
988 + le_dom.face_normales(num_face,1)*le_dom.face_normales(num2,1);
989 if (dim == 3)
990 pscal += le_dom.face_normales(num_face,2)*le_dom.face_normales(num2,2);
991 pscal = sqrt(std::fabs(pscal));
992
993 return (pscal*diffu)/le_dom.volumes(num_elem);
994}
995
996// Attention : la normal a la face num_face est suppose sortante
997// tandis que celle a la face num2 est reorientee dans la methode
998// afin d etre sortante.
999double Echange_contact_Correlation_VEF::pdt_scal(const Domaine_VEF& le_dom,int num_face,int num2,
1000 int num_elem,int dim,double diffu)
1001{
1002 double pscal;
1003 const IntTab& face_voisinsF = le_dom.face_voisins();
1004
1005 pscal = le_dom.face_normales(num_face,0)*le_dom.face_normales(num2,0)
1006 + le_dom.face_normales(num_face,1)*le_dom.face_normales(num2,1);
1007 if (dim == 3)
1008 pscal += le_dom.face_normales(num_face,2)*le_dom.face_normales(num2,2);
1009
1010 if ( (face_voisinsF(num_face,0) == face_voisinsF(num2,0)) ||
1011 (face_voisinsF(num_face,1) == face_voisinsF(num2,1))) pscal = -pscal;
1012
1013 return (pscal*diffu)/le_dom.volumes(num_elem);
1014}
1015double Echange_contact_Correlation_VEF::surfacesVEF(const Domaine_VEF& le_dom,int num_face,int dim)
1016{
1017 double pscal;
1018
1019 pscal = le_dom.face_normales(num_face,0)*le_dom.face_normales(num_face,0)
1020 + le_dom.face_normales(num_face,1)*le_dom.face_normales(num_face,1);
1021 if (dim == 3)
1022 pscal += le_dom.face_normales(num_face,2)*le_dom.face_normales(num_face,2);
1023 pscal = sqrt(pscal);
1024
1025 return pscal;
1026}
DoubleTab & valeurs() override
Surcharge Champ_base::valeurs() Renvoie le tableau des valeurs.
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.
virtual DoubleTab & valeurs() override
Renvoie le tableau des valeurs du champ.
std::vector< Nom > supp_discs
virtual void mettre_a_jour(double temps)
Effectue une mise a jour en temps de la condition aux limites.
Domaine_Cl_dis_base & domaine_Cl_dis()
Renvoie le domaine des conditions aux limites discretisee dont l'objet fait partie.
std::vector< Motcle > app_domains
virtual Frontiere_dis_base & frontiere_dis()
Renvoie la frontiere discretisee a laquelle les conditions aux limites s'appliquent.
Champ_front_base & champ_front()
const DoubleTab_t & coord_sommets() const
Definition Domaine.h:112
Joints_t & faces_joint()
Definition Domaine.h:265
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
int face_sommets(int i, int j) const
renvoie le numero du ieme sommet de la face num_face.
Definition Domaine_VF.h:583
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 face_voisins(int num_face, int i) const
renvoie l'element voisin de numface dans la direction i.
Definition Domaine_VF.h:418
const Domaine & domaine() const
Fichier en lecture Cette classe est a la classe C++ ifstream ce que la classe Entree est a la.
Definition EFichier.h:29
int lire_motcle_non_standard(const Motcle &, Entree &) override
Lecture des parametres de type non simple d'un objet_U a partir d'un flot d'entree.
double pdt_scalSqrt(const Domaine_VEF &, int, int, int, int, double)
double pdt_scal(const Domaine_VEF &, int, int, int, int, double)
void set_param(Param &param) const override
double surfacesVEF(const Domaine_VEF &, int, int)
Class defining operators and methods for all reading operation in an input flow (file,...
Definition Entree.h:42
@ ERROR_EXIT
Definition Entree.h:93
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 Champ_Inc_base & inconnue() const =0
Probleme_base & probleme()
Renvoie le probleme associe a l'equation.
Schema_Temps_base & schema_temps()
Renvoie le schema en temps associe a l'equation.
virtual void fixer_nb_comp(int i)
Fixe le nombre de composantes du champ.
virtual int nb_comp() const
Definition Field_base.h:56
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
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
const Frontiere & frontiere() const
Renvoie la frontiere geometrique associee.
const Nom & le_nom() const override
Renvoie le nom de la frontiere geometrique.
classe Milieu_base Cette classe est la base de la hierarchie des milieux (physiques)
Definition Milieu_base.h:50
virtual const Champ_Don_base & conductivite() const
Renvoie la conductivite du milieu.
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
static int dimension
Definition Objet_U.h:99
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
Helper class to factorize the readOn method of Objet_U classes.
Definition Param.h:112
void ajouter_flag(const char *keyword, const bool *value)
Register a boolean flag whose mere presence switches it to true.
Definition Param.cpp:474
void ajouter_condition(const char *condition, const char *message, const char *name=0)
Declare a post-read logical condition that must hold on the parameter values.
Definition Param.cpp:496
void ajouter(const char *keyword, const int *value, Param::Nature nat=Param::OPTIONAL)
Register an integer parameter.
Definition Param.cpp:364
void ajouter_non_std(const char *keyword, const Objet_U *value, Param::Nature nat=Param::OPTIONAL)
Register a keyword handled by Objet_U::lire_motcle_non_standard.
Definition Param.cpp:489
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 bool is_parallel()
Definition Process.cpp:110
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 int nproc()
renvoie le nombre de processeurs dans le groupe courant Voir Comm_Group::nproc() et PE_Groups::curren...
Definition Process.cpp:104
static int me()
renvoie mon rang dans le groupe de communication courant.
Definition Process.cpp:125
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
Definition Process.cpp:455
static int je_suis_maitre()
renvoie 1 si on est sur le processeur maitre du groupe courant (c'est a dire me() == 0),...
Definition Process.cpp:86
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
void echange_taille_et_messages() const
Cette methode lance l'echange de donnees entre tous les processeurs.
Sortie & send_buffer(int num_PE) const
renvoie le buffer correspondant au processeur num_PE pour y entasser des donnees a envoyer.
void end_comm() const
Vide les buffers et libere les ressources: on a fini de lire les donnees recues dans les buffers.
Entree & recv_buffer(int num_PE) const
renvoie le buffer correspondant au processeur num_PE pour y lire les donnees recues.
void begin_comm() const
Reserve les buffers de comm pour une nouvelle communication.
void set_send_recv_pe_list(const ArrOfInt &send_pe_list, const ArrOfInt &recv_pe_list, const int me_to_me=0)
Definit la liste des processeurs a qui on va envoyer et de qui on va recevoir des donnees.
class Schema_Temps_base
double temps_courant() const
Renvoie le temps courant.
double temps_max() const
Renvoie une reference sur le temps maximum.
double pas_de_temps() const
Renvoie le pas de temps (delta_t) courant.
int nb_pas_dt() const
Renvoie le nombre de pas de temps effectues.
int nb_pas_dt_max() const
Renvoie une reference sur le nombre de pas maxi.
static void resoudre(const DoubleVect &ma, const DoubleVect &mb, const DoubleVect &mc, const DoubleVect &sm, DoubleVect &vi, int M)
Definition Solv_TDMA.cpp:19
void precision(int pre) override
void setf(IOS_FORMAT code) override
Classe de base des flux de sortie.
Definition Sortie.h:52
void resize(_SIZE_ n, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT)
Definition TRUSTTab.tpp:469
_SIZE_ size() const
Definition TRUSTVect.tpp:45
classe Temperature_imposee_paroi Impose la temperature de la paroi dans une equation de type Convecti...