TRUST 1.9.8
HPC thermohydraulic platform
Loading...
Searching...
No Matches
Op_Dift_EF_Q1.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 <Op_Dift_EF_Q1.h>
17#include <Domaine_EF.h>
18#include <Champ_Uniforme.h>
19#include <Milieu_base.h>
20#include <Debog.h>
21#include <TRUSTTrav.h>
22#include <Probleme_base.h>
23#include <Dirichlet_paroi_fixe.h>
24#include <Dirichlet_paroi_defilante.h>
25#include <Neumann_paroi.h>
26#include <Echange_global_impose.h>
27#include <Echange_interne_global_impose.h>
28#include <Echange_couplage_thermique.h>
29#include <Echange_interne_global_parfait.h>
30#include <Champ_front_calc_interne.h>
31#include <Param.h>
32#include <Op_Conv_EF.h>
33#include <vector>
34#include <Champ_Fonc_P0_base.h>
35
36Implemente_instanciable_sans_constructeur(Op_Dift_EF_Q1,"Op_Dift_EF_Q1",Op_Dift_EF_base);
37
38Op_Dift_EF_Q1::Op_Dift_EF_Q1():transpose_(1),transpose_partout_(0),nouvelle_expression_(0) { }
39
40Sortie& Op_Dift_EF_Q1::printOn(Sortie& s ) const { return s << que_suis_je() ; }
41
42Entree& Op_Dift_EF_Q1::readOn(Entree& s ) { return s ; }
43
44Implemente_instanciable(Op_Dift_EF_Q1_option,"Op_Dift_EF_Q1_option",Op_Dift_EF_Q1);
45
46Sortie& Op_Dift_EF_Q1_option::printOn(Sortie& s ) const { return s << que_suis_je() ; }
47
49{
50 Param param(que_suis_je());
51 param.ajouter("grad_u_transpose", &transpose_ );
52 param.ajouter("grad_u_transpose_partout", &transpose_partout_ );
53 param.ajouter("nouvelle_expression",&nouvelle_expression_);
54 param.ajouter_condition("(value_of_grad_u_transpose_EQ_0)_OR_(value_of_grad_u_transpose_EQ_1)"," grad_u_transpose doit valoir 0 ou 1 ");
55 param.ajouter_condition("(value_of_grad_u_transpose_partout_EQ_0)_OR_(value_of_grad_u_transpose_partout_EQ_1)"," grad_u_transpose_partout doit valoir 0 ou 1 ");
56 param.ajouter_condition("(value_of_grad_u_transpose_partout_EQ_0)_OR_((value_of_grad_u_transpose_partout_EQ_1)_AND_(value_of_grad_u_transpose_EQ_1))"," si grad_u_transpose_partout vaut 1 alors grad_u_transpose doit valoir 1");
57 param.lire_avec_accolades_depuis(s);
58
59 return s ;
60}
61
62void Op_Dift_EF_Q1::remplir_marqueur_elem_CL_paroi(ArrOfInt& marqueur,const Domaine_EF& domaine_EF,const Domaine_Cl_EF& domaine_Cl_EF) const
63{
64 const IntTab& face_voisins=domaine_EF.face_voisins();
65 marqueur.resize_array(domaine_EF.nb_elem_tot());
66 if (!(le_modele_turbulence->utiliser_loi_paroi())) return;
67
68 int nb_bords=domaine_EF.nb_front_Cl();
69 for (int n_bord=0; n_bord<nb_bords; n_bord++)
70 {
71 const Cond_lim& la_cl = domaine_Cl_EF.les_conditions_limites(n_bord);
72 // Paroi fixe, Paroi defilante :
73 if (sub_type(Dirichlet_paroi_fixe,la_cl.valeur()) ||
74 sub_type(Dirichlet_paroi_defilante,la_cl.valeur()) )
75 {
76 const Front_VF& le_bord = ref_cast(Front_VF,la_cl->frontiere_dis());
77 int nfin =le_bord.nb_faces_tot();
78 for (int ind_face=0; ind_face<nfin; ind_face++)
79 {
80 int face=le_bord.num_face(ind_face);
81 int elem=face_voisins(face,0);
82 marqueur(elem)=1;
83 }
84 }
85 }
86}
87
88/*! @brief associe le champ de diffusivite
89 *
90 */
92{
93 diffusivite_ = diffu;
94}
95
96void Op_Dift_EF_Q1::remplir_nu(DoubleTab& nu) const
97{
98 const Domaine_EF& domaine_EF = le_dom_EF.valeur();
99 // On dimensionne nu
100 if (!nu.get_md_vector())
101 domaine_EF.domaine().creer_tableau_elements(nu);
102 const DoubleTab& diffu=diffusivite().valeurs();
103 if (diffu.size()==1)
104 nu = diffu(0,0);
105 else if (diffu.nb_dim()==1)
106 nu = diffu;
107 else
108 {
109 assert(diffu.dimension(1)==1);
110 for (int i=0; i<diffu.size_totale(); i++) nu(i)=diffu(i,0);
111 }
112
113// nu.echange_espace_virtuel();
114}
115
116
117DoubleTab& Op_Dift_EF_Q1::ajouter(const DoubleTab& tab_inconnue, DoubleTab& resu) const
118{
119 if ((equation().nombre_d_operateurs()>1)&&sub_type(Op_Conv_EF,equation().operateur(1).l_op_base()))
120 ref_cast(Op_Conv_EF,equation().operateur(1).l_op_base()).ajouter_a_la_diffusion(tab_inconnue,resu);
121 // ref_cast(Op_Conv_EF,equation().operateur(1).l_op_base()).ajouter_sous_cond(tab_inconnue,resu,0,0,1);
123 return ajouter_new(tab_inconnue,resu);
124
125
126
128 // const Domaine_Cl_EF& domaine_Cl_EF = la_zcl_EF.valeur();
129 const Domaine_EF& domaine_ef = le_dom_EF.valeur();
130 int nb_som_elem=domaine_ef.domaine().nb_som_elem();
131
132 int N = resu.line_size();
133 Nature_du_champ nat= equation().inconnue().nature_du_champ();
134 if (nat==vectoriel)
135 {
136 if ((dimension==3)&&(nb_som_elem==8))
137 return ajouter_vectoriel_dim3_nbn_8(tab_inconnue,resu);
138 else if ((dimension==2)&&(nb_som_elem==4))
139 {
140 return ajouter_vectoriel_dim2_nbn_4(tab_inconnue,resu);
141 }
142 else
143 {
144 Cerr<<__FILE__<<(int)__LINE__<< "cas non optimise "<<finl;
145 return ajouter_vectoriel_gen(tab_inconnue,resu);
146 }
147 }
148 else
149 {
150 if (N != 1)
151 {
152 Cerr<<__FILE__<<(int)__LINE__<< "cas non prevu "<<finl;
153 assert(0);
154 exit();
155 return ajouter(tab_inconnue,resu);
156 }
157 if ((dimension==3)&&(nb_som_elem==8))
158 return ajouter_scalaire_dim3_nbn_8(tab_inconnue,resu);
159 else if ((dimension==2)&&(nb_som_elem==4))
160 {
161 return ajouter_scalaire_dim2_nbn_4(tab_inconnue,resu);
162 }
163 else
164 {
165 Cerr<<__FILE__<<(int)__LINE__<< "cas non optimise "<<finl;
166 return ajouter_scalaire_gen(tab_inconnue,resu);
167 }
168
169 }
170 //
171}
172
173
174
175DoubleTab& Op_Dift_EF_Q1::ajouter_vectoriel_dim3_nbn_8(const DoubleTab& tab_inconnue, DoubleTab& resu) const
176{
177 return ajouter_vectoriel_template<AJOUTE_VECT::D3_8>(tab_inconnue,resu);
178}
179
180DoubleTab& Op_Dift_EF_Q1::ajouter_vectoriel_dim2_nbn_4(const DoubleTab& tab_inconnue, DoubleTab& resu) const
181{
182 return ajouter_vectoriel_template<AJOUTE_VECT::D2_4>(tab_inconnue,resu);
183}
184
185DoubleTab& Op_Dift_EF_Q1::ajouter_scalaire_dim3_nbn_8(const DoubleTab& tab_inconnue, DoubleTab& resu) const
186{
187 return ajouter_scalaire_template<AJOUTE_SCAL::D3_8>(tab_inconnue, resu);
188}
189
190DoubleTab& Op_Dift_EF_Q1::ajouter_scalaire_dim2_nbn_4(const DoubleTab& tab_inconnue, DoubleTab& resu) const
191{
192 return ajouter_scalaire_template<AJOUTE_SCAL::D2_4>(tab_inconnue, resu);
193}
194
195DoubleTab& Op_Dift_EF_Q1::ajouter_scalaire_gen(const DoubleTab& tab_inconnue, DoubleTab& resu) const
196{
197 return ajouter_scalaire_template<AJOUTE_SCAL::GEN>(tab_inconnue, resu);
198}
199
200DoubleTab& Op_Dift_EF_Q1::ajouter_vectoriel_gen(const DoubleTab& tab_inconnue, DoubleTab& resu) const
201{
202 return ajouter_vectoriel_template<AJOUTE_VECT::GEN>(tab_inconnue,resu);
203}
204
205DoubleTab& Op_Dift_EF_Q1::ajouter_new(const DoubleTab& tab_inconnue, DoubleTab& resu) const
206{
207 Cerr<<"NEW"<<finl;
209 // const Domaine_Cl_EF& domaine_Cl_EF = la_zcl_EF.valeur();
210 //const Domaine_EF& domaine_EF = le_dom_EF.valeur();
211
212 DoubleVect diffu_turb(diffusivite_turbulente().valeurs());
213 DoubleTab diffu(nu_);
214
215 const int N = resu.line_size();
216 ArrOfInt marqueur_neuman;
217 ArrOfInt marqueur_paroi=0;
218 const Domaine_EF& domaine_ef=ref_cast(Domaine_EF,equation().domaine_dis());
219 if(N > 1)
220 {
221 remplir_marqueur_sommet_neumann( marqueur_neuman,domaine_ef,la_zcl_EF.valeur(),transpose_partout_ );
222 remplir_marqueur_elem_CL_paroi( marqueur_paroi,domaine_ef,la_zcl_EF.valeur() );
223 }
224
225 const DoubleVect& volumes= domaine_ef.volumes();
226
227 const DoubleTab& bij=domaine_ef.Bij();
228 const DoubleTab& bij_thilde=domaine_ef.Bij_thilde();
229 int nb_elem_tot=domaine_ef.domaine().nb_elem_tot();
230 int nb_som_elem=domaine_ef.domaine().nb_som_elem();
231 const IntTab& elems=domaine_ef.domaine().les_elems() ;
232
233 for (int elem=0; elem<nb_elem_tot; elem++)
234 if (elem_contribue(elem)&&(!marqueur_paroi(elem)))
235 {
236 double pond=1./volumes(elem);
237 assert(N == dimension || N == 1);
238
239 for (int i1=0; i1<nb_som_elem; i1++)
240 {
241 int glob=elems(elem,i1);
242 int transpose = (marqueur_neuman[glob] == 1 || N == 1) ? 0 : transpose_;
243 for (int i2=0; i2<nb_som_elem; i2++)
244 {
245 int glob2=elems(elem,i2);
246 for (int n = 0; n < N; n++)
247 for (int d = 0; d < dimension; d++)
248 resu(glob, n) -= bij(elem, i1, d) * (bij_thilde(elem, i2, d) * tab_inconnue(glob2, n) + transpose * bij_thilde(elem, i2, n) * tab_inconnue(glob2, d)) * (diffu[elem]+diffu_turb[elem]) * pond;
249 }
250 }
251 }
252 // Debog::verifier(" Op_Dift_EF_Q1::ajouter, resu 0 ",resu);
253 // Journal()<<max(resu)<<" "<<min(resu)<<finl;
254
255
256 // on ajoute la contribution des bords
257 ajouter_bords(tab_inconnue,resu);
258 return resu;
259}
260
261DoubleTab& Op_Dift_EF_Q1::calculer(const DoubleTab& tab_inconnue, DoubleTab& resu) const
262{
263 resu = 0;
264 return ajouter(tab_inconnue,resu);
265}
266
267
268
269/////////////////////////////////////////
270// Methode pour l'implicite
271/////////////////////////////////////////
272
273
274// essai
275inline double& coeff_opt(Matrice_Morse& matrice,int i, int j)
276{
277 const auto& tab1_ = matrice.get_tab1();
278 const auto& tab2_ = matrice.get_tab2();
279 auto k1=tab1_[i]-1;
280 auto k2=tab1_[i+1]-1;
281 for (auto k=k1; k<k2; k++)
282 if (tab2_[k]-1 == j) return(matrice.get_set_coeff()(k));
283 Cerr << "i ou j ne conviennent pas " << finl;
284 Cerr << "i=" << i << finl;
285 Cerr << "j=" << j << finl;
286 Cerr << "n_lignes=" << matrice.nb_lignes() << finl;
287 Cerr << "n_colonnes=" << matrice.nb_colonnes() << finl;
289 return coeff_opt(matrice,i,j);
290}
291//#define matrice_coef(i,j) coeff_opt(matrice,i,j)
292#define matrice_coef(i,j) matrice.coef(i,j)
293void Op_Dift_EF_Q1::ajouter_contribution(const DoubleTab& transporte, Matrice_Morse& matrice ) const
294{
295 if (1)
296 if ((equation().nombre_d_operateurs()>1)&&sub_type(Op_Conv_EF,equation().operateur(1).l_op_base()))
297 ref_cast(Op_Conv_EF,equation().operateur(1).l_op_base()).ajouter_contribution_a_la_diffusion(transporte,matrice);
298
300 {
301 ajouter_contribution_new(transporte,matrice);
302 }
303 // On remplit le tableau nu car l'assemblage d'une
304 // matrice avec ajouter_contribution peut se faire
305 // avant le premier pas de temps
307
308 DoubleVect diffu_turb(diffusivite_turbulente().valeurs());
309 DoubleTab diffu(nu_);
310
311 const int N = transporte.line_size();
312 const Domaine_EF& domaine_ef=ref_cast(Domaine_EF,equation().domaine_dis());
313 const DoubleVect& volumes_thilde= domaine_ef.volumes_thilde();
314 const DoubleVect& volumes= domaine_ef.volumes();
315
316 const DoubleTab& bij=domaine_ef.Bij();
317 int nb_elem_tot=domaine_ef.domaine().nb_elem_tot();
318 int nb_som_elem=domaine_ef.domaine().nb_som_elem();
319 const IntTab& elems=domaine_ef.domaine().les_elems() ;
320 int nb_som=domaine_ef.domaine().nb_som();
321
322 ArrOfInt marqueur_neuman;
323 remplir_marqueur_sommet_neumann( marqueur_neuman,domaine_ef,la_zcl_EF.valeur(),transpose_partout_ );
324 ArrOfInt marqueur_paroi = 0;
325 remplir_marqueur_elem_CL_paroi( marqueur_paroi,domaine_ef,la_zcl_EF.valeur() );
326 for (int elem=0; elem<nb_elem_tot; elem++)
327 if (elem_contribue(elem)&&(!marqueur_paroi(elem)))
328 {
329 double pond=volumes_thilde(elem)/volumes(elem)/volumes(elem);
330
331 for (int i1=0; i1<nb_som_elem; i1++)
332 {
333 int glob=elems(elem,i1);
334
335 int transpose = (marqueur_neuman[glob] == 1 || N == 1) ? 0 : transpose_;
336 if (glob<nb_som)
337 for (int i2=0; i2<nb_som_elem; i2++)
338 {
339 int glob2=elems(elem,i2);
340 double cb=0;
341 for (int b=0; b<dimension; b++)
342 cb+=bij(elem,i1,b)*bij(elem,i2,b);
343 for (int n = 0; n < N; n++)
344 {
345 matrice_coef(glob * N + n, glob2 * N + n) += cb * (diffu[elem]+diffu_turb[elem]) * pond;
346 if (transpose)
347 for (int d = 0; d < dimension; d++)
348 matrice_coef(glob * N + n, glob2 * N + d) += bij(elem, i1, d) * bij(elem, i2, n) * (diffu[elem]+diffu_turb[elem]) * pond;
349 }
350 }
351 }
352 }
353 if (N == 1) ajouter_contributions_bords(matrice);
354
355
356
357}
358
359void Op_Dift_EF_Q1::ajouter_contribution_new(const DoubleTab& transporte, Matrice_Morse& matrice ) const
360{
361 //Cerr<<" NEW"<<finl;
362 // On remplit le tableau nu car l'assemblage d'une
363 // matrice avec ajouter_contribution peut se faire
364 // avant le premier pas de temps
366
367 DoubleVect diffu_turb(diffusivite_turbulente().valeurs());
368 DoubleTab diffu(nu_);
369
370 const int N = transporte.line_size();
371 const Domaine_EF& domaine_ef=ref_cast(Domaine_EF,equation().domaine_dis());
372 //const DoubleVect& volumes_thilde= domaine_ef.volumes_thilde();
373 const DoubleVect& volumes= domaine_ef.volumes();
374
375 const DoubleTab& bij=domaine_ef.Bij();
376 const DoubleTab& bij_thilde=domaine_ef.Bij_thilde();
377 int nb_elem_tot=domaine_ef.domaine().nb_elem_tot();
378 int nb_som_elem=domaine_ef.domaine().nb_som_elem();
379 const IntTab& elems=domaine_ef.domaine().les_elems() ;
380 int nb_som=domaine_ef.domaine().nb_som();
381
382 ArrOfInt marqueur_neuman;
383 remplir_marqueur_sommet_neumann( marqueur_neuman,domaine_ef,la_zcl_EF.valeur(),transpose_partout_ );
384 ArrOfInt marqueur_paroi = 0;
385 remplir_marqueur_elem_CL_paroi( marqueur_paroi,domaine_ef,la_zcl_EF.valeur() );
386 for (int elem=0; elem<nb_elem_tot; elem++)
387 if (elem_contribue(elem)&&(!marqueur_paroi(elem)))
388 {
389 double pond=1./volumes(elem);
390
391 for (int i1=0; i1<nb_som_elem; i1++)
392 {
393 int glob=elems(elem,i1);
394
395 int transpose = (marqueur_neuman[glob] == 1 || N == 1) ? 0 : transpose_;
396 if (glob<nb_som)
397 for (int i2=0; i2<nb_som_elem; i2++)
398 {
399 int glob2=elems(elem,i2);
400 double cb=0;
401 for (int b=0; b<dimension; b++)
402 cb+=bij(elem,i1,b)*bij_thilde(elem,i2,b);
403 for (int n = 0; n < N; n++)
404 {
405 matrice_coef(glob * N + n, glob2 * N + n) += cb * (diffu[elem]+diffu_turb[elem]) * pond;
406 if (transpose)
407 for (int d = 0; d < dimension; d++)
408 matrice_coef(glob * N + n, glob2 * N + d) += bij(elem, i1, d) * bij_thilde(elem, i2, n) * (diffu[elem]+diffu_turb[elem]) * pond;
409 }
410 }
411 }
412 }
413
414
415
416
417}
419{
420
421 if ((equation().nombre_d_operateurs()>1)&&sub_type(Op_Conv_EF,equation().operateur(1).l_op_base()))
422 ref_cast(Op_Conv_EF,equation().operateur(1).l_op_base()).contribue_au_second_membre_a_la_diffusion(resu);
423 const DoubleTab& tab_inconnue=equation().inconnue().valeurs();
424 ajouter_bords(tab_inconnue,resu,0);
425}
426void Op_Dift_EF_Q1::ajouter_bords(const DoubleTab& tab_inconnue,DoubleTab& resu, int contrib_interne ) const
427{
428 // a mettre dans calculer_flux_bord....
429
430 const Domaine_Cl_EF& domaine_Cl_EF = la_zcl_EF.valeur();
431 const Domaine_EF& domaine_EF = le_dom_EF.valeur();
432 flux_bords_=0.;
433 // const DoubleTab& tab_inconnue=equation().inconnue().valeurs();
434 // on parcourt toutes les faces de bord et on calcule lambda*gradT
435 const Domaine_EF& domaine_ef=ref_cast(Domaine_EF,equation().domaine_dis());
436 const IntTab& face_voisins=domaine_ef.face_voisins();
437 const DoubleTab& bij=domaine_ef.Bij();
438 int nb_som_elem=domaine_ef.domaine().nb_som_elem();
439 const IntTab& elems=domaine_ef.domaine().les_elems() ;
440 const DoubleTab& face_normales=domaine_ef.face_normales();
441 const DoubleVect& volumes_thilde= domaine_ef.volumes_thilde();
442 const DoubleVect& volumes= domaine_ef.volumes();
443
444 const IntTab& face_sommets=domaine_ef.face_sommets();
445 int nb_som_face=domaine_ef.nb_som_face();
446 int nb_faces_elem = domaine_ef.domaine().nb_faces_elem();
447 const IntTab& elem_faces = domaine_ef.elem_faces();
448 int nb_som_free = nb_som_elem-nb_som_face;
449
450 const int N = resu.line_size();
451
452 DoubleVect diffu_turb(diffusivite_turbulente().valeurs());
453 DoubleTab diffu(nu_);
454
455 if (N > 1)
456 {
457 for (int n_bord=0; n_bord<domaine_ef.nb_front_Cl(); n_bord++)
458 {
459
460 const Cond_lim& la_cl = domaine_Cl_EF.les_conditions_limites(n_bord);
461 const Front_VF& le_bord = ref_cast(Front_VF,la_cl->frontiere_dis());
462 int nb_faces_bord = le_bord.nb_faces_tot();
463 int num1=0;
464 int num2=nb_faces_bord;
465
466 if (sub_type(Dirichlet_paroi_fixe,la_cl.valeur()) ||
467 sub_type(Dirichlet_paroi_defilante,la_cl.valeur()) )
468 {
469 if (le_modele_turbulence->utiliser_loi_paroi())
470 {
471 DoubleVect n(dimension);
472 DoubleTrav Tgrad(dimension,dimension);
473 ArrOfDouble effort_face(dimension);
474 ArrOfDouble effort_elem(dimension);
475 ArrOfInt som_CL(nb_som_face);
476
477 // Boucle sur les faces de la CL
478 for (int ind_face=num1; ind_face<num2; ind_face++)
479 {
480 int num_face = le_bord.num_face(ind_face);
481 for (int isom=0; isom<nb_som_face; isom++)
482 {
483 int glob2=face_sommets(num_face,isom);
484 som_CL(isom) = glob2;
485 }
486 int elem=face_voisins(num_face,0);
487 double pond=volumes_thilde(elem)/volumes(elem);
488 for (int a=0; a<dimension; a++) n[a]=face_normales(num_face,a);
489 n/=norme_array(n);
490
491 // Calcul du gradient gradU via tau
492 // Au bord, n toujours oriente vers l'exterieur
493 for (int nc=0; nc<dimension; nc++)
494 for (int nc2=0; nc2<dimension; nc2++)
495 Tgrad(nc,nc2)=tau_tan_(num_face,nc)*n[nc2];
496
497 // Boucle sur les faces de l'element
498 // (Sigma_e somme_face n = 0 => -Sigma_e somme_face_cl n = + Sigma_e somme_face_non_cl n)
499 effort_elem = 0.;
500 for (int i=0; i<nb_faces_elem; i++)
501 {
502 int face_i=elem_faces(elem,i);
503 // On calcule la contribution de la face :
504 effort_face = 0.;
505 double ori=1.;
506 if ( face_voisins(face_i,0) != elem ) ori=-1;
507 if (face_i != num_face)
508 for (int nc=0; nc<dimension; nc++)
509 for (int nc2=0; nc2<dimension; nc2++)
510 effort_face(nc)+=ori*(Tgrad(nc,nc2)*face_normales(face_i,nc2))*pond;
511 // Cerr<<"force cisaillement face "<<i<<" => "<<effort_face<<finl;
512 effort_elem+=effort_face;
513 }
514 // Cerr<<"force cisaillement elem "<<elem<<" => "<<effort_elem<<finl;
515
516 // On calcule la contribution a chaque noeud de l'element :
517 // (les nb_som_face noeuds de la face CL Dirichlet ne sont pas concernes)
518 int nb_iok = 0;
519 for (int jsom=0; jsom<nb_som_elem; jsom++)
520 {
521 int num_som = elems(elem,jsom);
522 int iok = 1;
523 for (int isom=0; isom<nb_som_face; isom++)
524 if (num_som == som_CL(isom)) iok = 0;
525 nb_iok += iok;
526 if (iok)
527 for (int nc=0; nc<dimension; nc++)
528 resu(num_som,nc)+= effort_elem(nc)/(nb_som_free);
529 }
530 if (nb_iok != nb_som_free)
531 {
532 Cerr<<"Op_Dift_EF_Q1::ajouter_bords: erreur nombre de noeuds"<<finl;
533 exit();
534 }
535 }
536 }
537 }
538 }
539 // Cerr<<__PRETTY_FUNCTION__<<" non code pour les vecteurs"<<finl;
540 modifier_flux(*this);
541 return;
542 }
543 int premiere_face_int=domaine_ef.premiere_face_int();
544 for (int face=0; face<premiere_face_int; face++)
545 {
546 int elem=face_voisins(face,0);
547 if (elem==-1) face_voisins(face,1);
548
549 double pond= volumes_thilde(elem)/volumes(elem)/volumes(elem);
550
551 for (int i1=0; i1<nb_som_elem; i1++)
552 {
553
554 int glob2=elems(elem,i1);
555 {
556
557 for (int a=0; a<dimension; a++)
558 {
559 flux_bords_(face,0)+=face_normales(face,a)*bij(elem,i1,a)*tab_inconnue(glob2)*(diffu[elem]+diffu_turb[elem])*pond;
560 }
561 }
562 }
563
564 }
565
566 // Neumann :
567 int n_bord;
568 int nb_bords=domaine_Cl_EF.nb_cond_lim();
569
570 for (n_bord=0; n_bord<nb_bords; n_bord++)
571 {
572 const Cond_lim& la_cl = domaine_Cl_EF.les_conditions_limites(n_bord);
573 const Front_VF& le_bord = ref_cast(Front_VF,la_cl->frontiere_dis());
574 int ndeb = le_bord.num_premiere_face();
575 int nfin = ndeb + le_bord.nb_faces();
576
577 if (sub_type(Neumann_paroi,la_cl.valeur()))
578 {
579 const Neumann_paroi& la_cl_paroi = ref_cast(Neumann_paroi, la_cl.valeur());
580 for (int face=ndeb; face<nfin; face++)
581 {
582
583 double flux=la_cl_paroi.flux_impose(face-ndeb)*domaine_EF.surface(face);
584 for (int i1=0; i1<nb_som_face; i1++)
585 {
586 int glob2=face_sommets(face,i1);
587 {
588
589 resu[glob2] += flux/nb_som_face;
590 }
591 flux_bords_(face,0) = flux;
592 }
593 }
594 }
595 else if (sub_type(Echange_couplage_thermique, la_cl.valeur()))
596 {
597 const Echange_couplage_thermique& la_cl_paroi = ref_cast(Echange_couplage_thermique, la_cl.valeur());
598 for (int face=ndeb; face<nfin; face++)
599 {
600
601 double h=la_cl_paroi.h_imp(face-ndeb);
602 double Text=la_cl_paroi.T_ext(face-ndeb);
603 double phiext=la_cl_paroi.flux_exterieur_impose(face-ndeb);
604
605 double tm=0;
606 if (contrib_interne)
607 {
608 for (int i1=0; i1<nb_som_face; i1++)
609 {
610 int glob2=face_sommets(face,i1);
611 tm+=tab_inconnue(glob2);
612 }
613 tm/=nb_som_face;
614 }
615 double flux=(phiext+h*(Text-tm))*domaine_EF.surface(face);
616 flux_bords_(face,0) = flux;
617 flux/=nb_som_face;
618 for (int i1=0; i1<nb_som_face; i1++)
619 {
620 int glob2=face_sommets(face,i1);
621 resu[glob2] += flux;
622 }
623 }
624 }
625 else if (sub_type(Echange_interne_global_parfait, la_cl.valeur()))
626 {
627 if (contrib_interne)
628 {
629 const Echange_interne_global_parfait& la_cl_paroi = ref_cast(Echange_interne_global_parfait, la_cl.valeur());
630 const Champ_front_calc_interne& Text = ref_cast(Champ_front_calc_interne, la_cl_paroi.T_ext());
631 const IntVect& fmap = Text.face_map();
632 std::vector<bool> hit(nfin-ndeb);
633 std::fill(hit.begin(), hit.end(), false);
634 for (int face=ndeb; face<nfin; face++)
635 {
636 int opp_face = fmap(face-ndeb)+ndeb; // face on the other side of the inner wall:
637
638 // STRONG assumption : 1D, only one node per face:
639 int som=face_sommets(face,0);
640 int som_opp=face_sommets(opp_face,0);
641 if (!hit[face-ndeb]) // first time we encounter one of the face of the pair
642 {
643 // This where we write the heat equation skipping duplicated face: -A.T(i-1) + (A*T(i)+B.T(i)) - B.T(i+2)
644 // By default, we just have -A.T(i-1) + A*T(i)
645 // Recompute the extra bit of flux coming from the other side:
646 // Get opposite element
647 int elem1 = domaine_EF.face_voisins(opp_face, 0);
648 int elem_opp = (elem1 != -1) ? elem1 : domaine_EF.face_voisins(opp_face, 1);
649 // Other face of the opposite element (i.e. face "after" opp_face)
650 int f1 = domaine_EF.elem_faces(elem_opp, 0);
651 int face_plus_2 = f1 != opp_face ? f1 : domaine_EF.elem_faces(elem_opp, 1); // 2 faces per elem max - 1D
652 int som_p2 = face_sommets(face_plus_2, 0);
653
654 double pond = volumes_thilde(elem_opp)/volumes(elem_opp)/volumes(elem_opp); // taken from ajouter() ...
655 double B = nu_(elem_opp)*pond;
656 resu[som] -= B*(tab_inconnue[som]-tab_inconnue[som_p2]);
657 }
658 else
659 {
660 // This is where we set a Dirichlet T(face) = T(opposite_face)
661 // Initially, flux for this som is -B.T(i+1) + B.T(i+2) with B = nu(i+1) (nu being the diffusivity)
662 // -> We want to have B.T(i) - B.T(i+1)
663 int elem = domaine_EF.face_voisins(face, 0);
664 int f1 = domaine_EF.elem_faces(elem, 0);
665 int face_p2 = f1 != face ? f1 : domaine_EF.elem_faces(elem, 1); // other face of the current elem
666 int som_p2=face_sommets(face_p2,0);
667
668 double pond = volumes_thilde(elem)/volumes(elem)/volumes(elem); // taken from ajouter() ...
669 double B = nu_(elem)*pond;
670 resu[som] += B*(-tab_inconnue[som_p2] + tab_inconnue[som_opp]); // remove B.T(i+2) and add B.T(i)
671 }
672 hit[face-ndeb] = true;
673 hit[opp_face-ndeb] = true;
674 }
675 }
676 else // contrib_interne=0 --> implicit
677 {
678 for (int face=ndeb; face<nfin; face++)
679 {
680 flux_bords_(face,0) = 0.0;
681 }
682 }
683 }
684 else if (sub_type(Echange_interne_global_impose, la_cl.valeur()))
685 {
686 const Echange_interne_global_impose& la_cl_paroi = ref_cast(Echange_interne_global_impose, la_cl.valeur());
687 const DoubleVect& surface_gap = la_cl_paroi.surface_gap();
688 for (int face=ndeb; face<nfin; face++)
689 {
690 double h=la_cl_paroi.h_imp(face-ndeb);
691 const Champ_front_calc_interne& Text = ref_cast(Champ_front_calc_interne, la_cl_paroi.T_ext());
692 const IntVect& fmap = Text.face_map();
693 int opp_face = fmap(face-ndeb)+ndeb;
694
695 double tm=0.0;
696 double to=0.0; // opposite temp.
697 double flux=0.0;
698 if (contrib_interne) // explicit case
699 {
700 for (int i1=0; i1<nb_som_face; i1++)
701 {
702 int glob2=face_sommets(face,i1);
703 int glob3 =face_sommets(opp_face,i1);
704 tm+=tab_inconnue(glob2);
705 to+=tab_inconnue(glob3);
706 }
707 tm/=nb_som_face;
708 to/=nb_som_face;
709 //flux=h*(to-tm)*domaine_EF.surface(face);
710 flux=h*(to-tm)*surface_gap(face-ndeb);
711 }
712 else // implicit case via contribuer_au_second_membre()
713 {
714 flux = 0.0;
715 }
716 flux_bords_(face,0) = flux;
717 flux/=nb_som_face;
718 for (int i1=0; i1<nb_som_face; i1++)
719 {
720 int glob2=face_sommets(face,i1);
721 resu[glob2] += flux;
722 }
723 }
724 }
725 else if (sub_type(Echange_global_impose, la_cl.valeur()))
726 {
727 const Echange_global_impose& la_cl_paroi = ref_cast(Echange_global_impose, la_cl.valeur());
728 for (int face=ndeb; face<nfin; face++)
729 {
730
731 double h=la_cl_paroi.h_imp(face-ndeb);
732 double Text=la_cl_paroi.T_ext(face-ndeb);
733
734
735 double tm=0;
736 if (contrib_interne)
737 {
738 for (int i1=0; i1<nb_som_face; i1++)
739 {
740 int glob2=face_sommets(face,i1);
741 {
742 tm+=tab_inconnue(glob2);
743 }
744 }
745 tm/=nb_som_face;
746 }
747 double flux=h*(Text-tm)*domaine_EF.surface(face);
748 flux_bords_(face,0) = flux;
749 flux/=nb_som_face;
750 for (int i1=0; i1<nb_som_face; i1++)
751 {
752 int glob2=face_sommets(face,i1);
753 {
754 resu[glob2] += flux;
755 }
756
757 }
758 }
759 }
760
761
762 }
763 modifier_flux(*this);
764}
765
766
767
768
770{
771 const Domaine_Cl_EF& domaine_Cl_EF = la_zcl_EF.valeur();
772 const Domaine_EF& domaine_EF = le_dom_EF.valeur();
773 const Domaine_EF& domaine_ef=ref_cast(Domaine_EF,equation().domaine_dis());
774
775 const IntTab& face_sommets=domaine_ef.face_sommets();
776 int nb_som_face=domaine_ef.nb_som_face();
777
778 int N = equation().inconnue().valeurs().line_size();
779
780 if (N > 1)
781 {
782 // Cerr<<__PRETTY_FUNCTION__<<" non code pour les vecteurs"<<finl;
783 throw;
784 }
785
786 // Neumann :
787 int n_bord;
788 int nb_bords=domaine_Cl_EF.nb_cond_lim();
789
790 for (n_bord=0; n_bord<nb_bords; n_bord++)
791 {
792 const Cond_lim& la_cl = domaine_Cl_EF.les_conditions_limites(n_bord);
793 const Front_VF& le_bord = ref_cast(Front_VF,la_cl->frontiere_dis());
794 int ndeb = le_bord.num_premiere_face();
795 int nfin = ndeb + le_bord.nb_faces();
796
797 if (sub_type(Echange_couplage_thermique, la_cl.valeur()))
798 {
799 // matrice.imprimer(Cout);
800 const Echange_couplage_thermique& la_cl_paroi = ref_cast(Echange_couplage_thermique, la_cl.valeur());
801 for (int face=ndeb; face<nfin; face++)
802 {
803
804 double h=la_cl_paroi.h_imp(face-ndeb);
805 double dphi_dT=la_cl_paroi.derivee_flux_exterieur_imposee(face-ndeb);
806
807 double tm=1./(nb_som_face*nb_som_face);
808 double flux=(dphi_dT+h)*domaine_EF.surface(face)*tm;
809
810 for (int i1=0; i1<nb_som_face; i1++)
811 {
812 int glob2=face_sommets(face,i1);
813 for (int j1=0; j1<nb_som_face; j1++)
814 {
815 int glob1=face_sommets(face,j1);
816 matrice.coef(glob1,glob2) += flux;
817 }
818 }
819 }
820 // matrice.imprimer(Cout);exit();
821 }
822 else if (sub_type(Echange_interne_global_parfait, la_cl.valeur()))
823 {
824 const Echange_interne_global_parfait& la_cl_paroi = ref_cast(Echange_interne_global_parfait, la_cl.valeur());
825 const Champ_front_calc_interne& Text = ref_cast(Champ_front_calc_interne, la_cl_paroi.T_ext());
826 const IntVect& fmap = Text.face_map();
827 std::vector<bool> hit(nfin-ndeb);
828 std::fill(hit.begin(), hit.end(), false);
829 for (int face=ndeb; face<nfin; face++)
830 {
831 // face on the other side of the inner wall:
832 int opp_face = fmap(face-ndeb)+ndeb;
833 // element attached to it
834 int elem1 = domaine_EF.face_voisins(opp_face, 0);
835 int elem_opp = (elem1 != -1) ? elem1 : domaine_EF.face_voisins(opp_face, 1);
836 // other face of the opposite element (i.e. face "after" opp_face)
837 int f1 = domaine_EF.elem_faces(elem_opp, 0);
838 int face_plus_2 = f1 != opp_face ? f1 : domaine_EF.elem_faces(elem_opp, 1); // 2 faces per elem max - 1D
839 // other face of the current elem
840 int elem = domaine_EF.face_voisins(face, 0);
841 f1 = domaine_EF.elem_faces(elem, 0);
842 int face_min_1 = f1 != face ? f1 : domaine_EF.elem_faces(elem, 1);
843
844 for (int i1=0; i1<nb_som_face; i1++)
845 {
846 int som=face_sommets(face,i1);
847 int som_opp=face_sommets(opp_face,i1);
848 if (!hit[face-ndeb]) // first time we encounter one of the face of the pair
849 {
850 for (int j1=0; j1<nb_som_face; j1++)
851 {
852 // heat equation skipping duplicated face: -T(i-1) + 2*T(i) - T(i+2)
853 int som_p2=face_sommets(face_plus_2,j1);
854 matrice.coef(som,som_p2) -= matrice.coef(som_opp, som_opp);
855 matrice.coef(som, som) += matrice.coef(som_opp, som_opp);
856 }
857 hit[face-ndeb] = true;
858 hit[opp_face-ndeb] = true;
859 }
860 else // we have already handled the opposite side of the wall
861 for (int j1=0; j1<nb_som_face; j1++)
862 {
863 // Dirichlet T(face) = T(opposite_face) and cancelling right term in the tri-band
864 int som_m1=face_sommets(face_min_1, j1);
865 matrice.coef(som,som_opp) = -matrice.coef(som,som);
866 matrice.coef(som,som_m1) = 0;
867 }
868 }
869 }
870// matrice.imprimer(Cout);
871 }
872 else if (sub_type(Echange_interne_global_impose, la_cl.valeur()))
873 {
874 const Echange_interne_global_impose& la_cl_paroi = ref_cast(Echange_interne_global_impose, la_cl.valeur());
875 const Champ_front_calc_interne& Text = ref_cast(Champ_front_calc_interne, la_cl_paroi.T_ext());
876 const IntVect& fmap = Text.face_map();
877 const DoubleVect& surface_gap = la_cl_paroi.surface_gap();
878 for (int face=ndeb; face<nfin; face++)
879 {
880 double h=la_cl_paroi.h_imp(face-ndeb);
881 double tm=1./(nb_som_face*nb_som_face);
882 //double flux=h*domaine_EF.surface(face)*tm;
883 double flux=h*surface_gap(face-ndeb)*tm;
884 int opp_face = fmap(face-ndeb)+ndeb;
885
886 for (int i1=0; i1<nb_som_face; i1++)
887 {
888 int glob2=face_sommets(face,i1);
889 int glob3=face_sommets(opp_face,i1);
890 for (int j1=0; j1<nb_som_face; j1++)
891 {
892 int glob1=face_sommets(face,j1);
893 matrice.coef(glob1,glob2) += flux;
894 matrice.coef(glob1,glob3) -= flux;
895 }
896 }
897 }
898// matrice.imprimer(Cout);
899 }
900 else if (sub_type(Echange_global_impose, la_cl.valeur()))
901 {
902 // matrice.imprimer(Cout);
903 const Echange_global_impose& la_cl_paroi = ref_cast(Echange_global_impose, la_cl.valeur());
904 for (int face=ndeb; face<nfin; face++)
905 {
906 double h=la_cl_paroi.h_imp(face-ndeb);
907 double tm=1./(nb_som_face*nb_som_face);
908 double flux=h*domaine_EF.surface(face)*tm;
909 for (int i1=0; i1<nb_som_face; i1++)
910 {
911 int glob2=face_sommets(face,i1);
912 for (int j1=0; j1<nb_som_face; j1++)
913 {
914 int glob1=face_sommets(face,j1);
915 matrice.coef(glob1,glob2) += flux;
916 }
917 }
918 }
919 }
920 }
921}
923{
924 static int testee=0;
925 if(testee)
926 return;
927 testee=1;
928}
929
930void Op_Dift_EF_Q1::calculer_pour_post(Champ_base& espace_stockage,const Nom& option,int comp) const
931{
932}
933
935{
936 // 12/04: Premiers efforts d'optimisation du code a tenir
937 // compte lors de la factorisation des pas de temps de stabilite
938
939 // Calcul de dt_stab
940 // La diffusivite est constante par elements donc
941 // il faut calculer dt_diff pour chaque element et
942 // dt_stab=Min(dt_diff (K) = h(K)*h(K)/(2*dimension*diffu2_(K)))
943 // ou diffu2_ est la somme des 2 diffusivite laminaire et turbulente
944
945 //GF
946 // alpha_dt_stab=(alpha+alpha_t)*alpha_dt_stab/alpha
947 // alpha_dt_stab=(nu+diff_nu_turb)*valeurs_diffusivite_dt/nu
948
949 // On remplit le tableau nu contenant la diffusivite en chaque elem
951
952 double dt_stab=1.e30;
953 double coef;
954 const Domaine_EF& mon_dom_EF = le_dom_EF.valeur();
955
956 const Domaine& mon_dom= mon_dom_EF.domaine();
957
958 DoubleVect diffu_turb(diffusivite_turbulente().valeurs());
959 DoubleTab diffu(nu_);
960 if (equation().que_suis_je().debute_par("Convection_Diffusion_Temp"))
961 {
962 double rhocp = mon_equation->milieu().capacite_calorifique().valeurs()(0, 0) * mon_equation->milieu().masse_volumique().valeurs()(0, 0);
963 diffu_turb /= rhocp;
964 diffu /= rhocp;
965 }
966 double alpha;
967
968 int mon_dom_nb_elem=mon_dom.nb_elem();
970 {
971 const DoubleTab& rho_elem = get_champ_masse_volumique().valeurs();
972 assert(rho_elem.size_array()==mon_dom_EF.nb_elem_tot());
973 for (int num_elem=0; num_elem<mon_dom_nb_elem; num_elem++)
974 {
975 alpha = diffu[num_elem] + diffu_turb[num_elem]; // PQ : 06/03
976 alpha/=rho_elem[num_elem];
977 // dt=1/(dimension/(pas*pas))/(2*alpha)
978
979 coef=mon_dom_EF.carre_pas_maille(num_elem)/(2.*dimension*(alpha+DMINFLOAT));
980
981 // dt_stab=min(dt);
982 if (coef<dt_stab) dt_stab = coef;
983 }
984 }
985 else
986 {
987
988 const Champ_base& champ_diffusivite = diffusivite_pour_pas_de_temps();
989 const DoubleTab& valeurs_diffusivite = champ_diffusivite.valeurs();
990 double valeurs_diffusivite_dt=-1;
991 int unif_diffu_dt;
992 const Nature_du_champ nature_champ = equation().inconnue().nature_du_champ();
993
994 if (sub_type(Champ_Uniforme,champ_diffusivite))
995 {
996 valeurs_diffusivite_dt=valeurs_diffusivite(0,0);
997 unif_diffu_dt=1;
998 }
999 else
1000 unif_diffu_dt=0;
1001 if (nature_champ!=multi_scalaire)
1002 {
1003 int nb_dim = valeurs_diffusivite.nb_dim();
1004 for (int num_elem=0; num_elem<mon_dom_nb_elem; num_elem++)
1005 {
1006 alpha = diffu[num_elem] + diffu_turb[num_elem]; // PQ : 06/03
1007 if(unif_diffu_dt==0)
1008 valeurs_diffusivite_dt=(nb_dim==1?valeurs_diffusivite(num_elem):valeurs_diffusivite(num_elem,0));
1009 alpha*=valeurs_diffusivite_dt/(diffu[num_elem]+DMINFLOAT);
1010 // dt=1/(dimension/(pas*pas))/(2*alpha)
1011 coef=mon_dom_EF.carre_pas_maille(num_elem)/(2.*dimension*(alpha+DMINFLOAT));
1012 assert(coef>=0);
1013 // dt_stab=min(dt);
1014 if (coef<dt_stab) dt_stab = coef;
1015 }
1016 }
1017 else
1018 {
1019 int nb_comp = valeurs_diffusivite.dimension(1);
1020 for (int nc=0; nc<nb_comp; nc++)
1021 {
1022 for (int num_elem=0; num_elem<mon_dom_nb_elem; num_elem++)
1023 {
1024 alpha = diffu(num_elem,nc) + diffu_turb[num_elem];
1025 //if(unif_diffu_dt==0)
1026 valeurs_diffusivite_dt=valeurs_diffusivite(0,nc);
1027 alpha*=valeurs_diffusivite_dt/(diffu(num_elem,nc)+DMINFLOAT);
1028 coef=mon_dom_EF.carre_pas_maille(num_elem)/(2.*dimension*(alpha+DMINFLOAT));
1029
1030 if (coef<dt_stab) dt_stab = coef;
1031 }
1032 }
1033 }
1034 }
1035
1036 dt_stab = Process::mp_min(dt_stab);
1037 return dt_stab;
1038}
1039
DoubleTab & valeurs() override
Renvoie le tableau des valeurs du champ au temps courant.
virtual DoubleTab & valeurs()=0
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_calc_interne Classe derivee de Champ_front_calc qui represente
const IntVect & face_map() const
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.
int nb_som_elem() const
Renvoie le nombre de sommets des elements geometriques constituants le domaine.
Definition Domaine.h:474
int_t nb_elem_tot() const
Definition Domaine.h:132
virtual void creer_tableau_elements(Array_base &, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT) const
creation d'un tableau parallele de valeurs aux elements.
Definition Domaine.cpp:851
IntTab_t & les_elems()
Definition Domaine.h:129
int_t nb_elem() const
Definition Domaine.h:131
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
int_t nb_som() const
Renvoie le nombre de sommets du domaine.
Definition Domaine.h:121
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_EF
Definition Domaine_EF.h:59
double carre_pas_maille(int i) const
Definition Domaine_EF.h:73
const DoubleTab & Bij() const
Definition Domaine_EF.h:92
const DoubleTab & Bij_thilde() const
Definition Domaine_EF.h:93
const DoubleVect & volumes_thilde() const
Definition Domaine_EF.h:85
virtual double face_normales(int face, int comp) const
Definition Domaine_VF.h:47
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
virtual double surface(int i) const
Definition Domaine_VF.h:53
int nb_som_face() const
renvoie le nombre de sommets par face.
Definition Domaine_VF.h:494
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 premiere_face_int() const
une face est interne ssi elle separe deux elements.
Definition Domaine_VF.h:463
int face_voisins(int num_face, int i) const
renvoie l'element voisin de numface dans la direction i.
Definition Domaine_VF.h:418
int nb_elem_tot() const
int nb_front_Cl() const
const Domaine & domaine() const
: class Echange_couplage_thermique
double flux_exterieur_impose(int i) const override
Classe Echange_global_impose Cette classe represente le cas particulier de la classe.
virtual double derivee_flux_exterieur_imposee(int i) const
virtual double h_imp(int num) const
Renvoie la valeur du coefficient d'echange de chaleur impose sur la i-eme composante.
virtual double T_ext(int num) const
Renvoie la valeur de la temperature imposee sur la i-eme composante du champ de frontiere.
Classe Echange_interne_global_impose: Cette classe represente le cas particulier de la classe.
Classe Echange_interne_global_parfait Cette classe represente le cas particulier d'un echange interne...
Class defining operators and methods for all reading operation in an input flow (file,...
Definition Entree.h:42
virtual const Champ_Inc_base & inconnue() const =0
virtual Nature_du_champ nature_du_champ() const
Definition Field_base.h:77
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
int nb_faces_tot() const
Definition Front_VF.h:58
int num_face(const int) const
Definition Front_VF.h:68
Classe Matrice_Morse Represente une matrice M (creuse), non necessairement carree.
const auto & get_tab2() const
const auto & get_tab1() const
auto & get_set_coeff()
double coef(int i, int j) const
int nb_colonnes() const override
Return local number of columns (=size on the current proc).
int nb_lignes() const override
Return local number of lines (=size on the current proc).
const Equation_base & equation() const
Renvoie la reference sur l'equation pointe par MorEqn::mon_equation.
Definition MorEqn.h:62
Classe Neumann_paroi Cette condition limite correspond a un flux impose pour l'equation de.
virtual double flux_impose(int i) const
Renvoie la valeur du flux impose sur la i-eme composante du champ representant le flux a la frontiere...
Definition Neumann.cpp:35
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
class Op_Conv_EF Cette classe represente l'operateur de convection associe a une equation de
Definition Op_Conv_EF.h:39
const Champ_Fonc_base & diffusivite_turbulente() const
class Op_Dift_EF_Q1 Cette classe represente l'operateur de diffusion
void calculer_pour_post(Champ_base &espace_stockage, const Nom &option, int comp) const override
const Champ_base & diffusivite() const override
DoubleTab & ajouter_vectoriel_template(const DoubleTab &, DoubleTab &) const
DoubleTab & ajouter(const DoubleTab &, DoubleTab &) const override
void verifier() const
DoubleTab & ajouter_scalaire_dim2_nbn_4(const DoubleTab &, DoubleTab &) const
DoubleTab & ajouter_scalaire_template(const DoubleTab &, DoubleTab &) const
void ajouter_bords(const DoubleTab &, DoubleTab &, int contrib_interne=1) const
void ajouter_contribution_new(const DoubleTab &, Matrice_Morse &) const
void ajouter_contribution(const DoubleTab &, Matrice_Morse &) const
double calculer_dt_stab() const override
Calcul dt_stab.
void ajouter_contributions_bords(Matrice_Morse &matrice) const
void associer_diffusivite(const Champ_base &) override
associe le champ de diffusivite
void contribuer_au_second_membre(DoubleTab &) const override
DOES NOTHING - to override in derived classes.
DoubleTab & ajouter_vectoriel_dim2_nbn_4(const DoubleTab &, DoubleTab &) const
void remplir_nu(DoubleTab &) const override
DoubleTab & ajouter_vectoriel_gen(const DoubleTab &, DoubleTab &) const
DoubleTab & ajouter_scalaire_gen(const DoubleTab &, DoubleTab &) const
DoubleTab & calculer(const DoubleTab &, DoubleTab &) const override
DoubleTab & ajouter_new(const DoubleTab &, DoubleTab &) const
DoubleTab & ajouter_scalaire_dim3_nbn_8(const DoubleTab &, DoubleTab &) const
void remplir_marqueur_elem_CL_paroi(ArrOfInt &, const Domaine_EF &, const Domaine_Cl_EF &) const
DoubleTab & ajouter_vectoriel_dim3_nbn_8(const DoubleTab &, DoubleTab &) const
int elem_contribue(const int elem) const
void modifier_flux(const Operateur_base &) const
multiplie le flux bordpar rho cp ou rho si necessaire
virtual const Champ_base & diffusivite_pour_pas_de_temps() const
Renvoie le champ_don correspondant a la vraie diffusivite du milieu qui sert pour le calcul du pas de...
DoubleTab flux_bords_
static double mp_min(double)
Definition Process.cpp:386
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
Definition Process.cpp:455
Classe de base des flux de sortie.
Definition Sortie.h:52
virtual const Champ_base & get_champ_masse_volumique() const
Renvoie le champ de masse volumique.
virtual int has_champ_masse_volumique() const
Renvoie 1 si la masse volumique a ete associee, 0 sinon.
_SIZE_ size_array() const
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
_SIZE_ size_totale() const
Definition TRUSTVect.tpp:61
int line_size() const
Definition TRUSTVect.tpp:67
virtual const MD_Vector & get_md_vector() const
Definition TRUSTVect.h:123