TrioCFD 1.9.8
TrioCFD documentation
Loading...
Searching...
No Matches
Tenseur_Reynolds_Externe_VDF_Face.cpp
1/****************************************************************************
2* Copyright (c) 2015 - 2016, 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 <Tenseur_Reynolds_Externe_VDF_Face.h>
17#include <Champ_Uniforme.h>
18
19#include <Domaine_VDF.h>
20#include <Domaine_Cl_VDF.h>
21#include <Neumann_sortie_libre.h>
22#include <Dirichlet.h>
23#include <Dirichlet_homogene.h>
24#include <Symetrie.h>
25#include <Periodique.h>
26#include <Navier_Stokes_Turbulent.h>
27#include <Probleme_base.h>
28#include <Modele_turbulence_hyd_K_Eps.h>
29#include <TRUSTTrav.h>
30#include <Dirichlet_paroi_defilante.h>
31#include <Echange_externe_impose.h>
32#include <Neumann.h>
33#include <Neumann_homogene.h>
34#include <Champ_Face_VDF.h>
35#include <Transport_K_Eps.h>
36#include <TRUST_Ref.h>
37
38
39Implemente_instanciable_sans_constructeur_ni_destructeur(Tenseur_Reynolds_Externe_VDF_Face,"Tenseur_Reynolds_Externe_VDF_Face",Source_base);
40
41// XD tenseur_Reynolds_externe source_base tenseur_Reynolds_externe BRACE Use a neural network to estimate the values of
42// XD_CONT the Reynolds tensor. The structure of the neural networks is stored in a file located in the
43// XD_CONT share/reseaux_neurones directory.
44// XD attr nom_fichier chaine nom_fichier REQ The base name of the file.
45
49
54
55
56//// printOn
57//
58
60{
61 return s << que_suis_je() ;
62}
63
64
65//// readOn
66//
67
69{
70 Motcle accolade_ouverte("{");
71 Motcle accolade_fermee("}");
72 Motcle motlu;
73
74 is >> motlu;
75 if (motlu != accolade_ouverte)
76 {
77 Cerr << "On attendait { pour commencer a lire les constantes de Tenseur_Reynolds_Externe" << finl;
79 }
80 Motcles les_mots(1);
81 {
82 les_mots[0] = "nom_fichier";
83 }
84 is >> motlu;
85 while (motlu != accolade_fermee)
86 {
87 int rang=les_mots.search(motlu);
88 switch(rang)
89 {
90 case 0 :
91 {
92 is >> nn_casename;
93 break;
94 }
95 default :
96 {
97 Cerr << "On ne comprend pas le mot cle : " << motlu << " dans Tenseur_Reynolds_Externe" << finl;
99 }
100 }
101
102 is >> motlu;
103 }
104
105 readNN();
106
107 return is;
108// s >> la_source;
109// if (la_source->nb_comp() != dimension)
110// {
111// Cerr << "Erreur a la lecture du terme source de type " << que_suis_je() << finl;
112// Cerr << "le champ source doit avoir " << dimension << " composantes" << finl;
113// Process::exit();
114// }
115// return s ;
116}
117
119{
120 string path_NN;
121 path_NN = string(getenv("TrioCFD_project_directory")) + "/share/Turbulence/reseaux_neurones/";
122
123 string model_NN_file = path_NN + string(nn_casename) + ".keras";
124 string ppp_NN_file = path_NN + string(nn_casename) + ".ppp";
125
126 cout << "Chargement du reseau de neurones: " + model_NN_file << endl;
127 tbnn = new TBNN(model_NN_file,ppp_NN_file);
128}
129
131{
132 const Equation_base& eqn = pb.equation(0);
133 if ( !sub_type(Navier_Stokes_Turbulent,eqn) )
134 {
135 Cerr << "Error TRUST in " << que_suis_je() << finl;
136 Cerr << "Hydraulic equation not found" << finl;
138 }
139 else
140 {
141 probleme_ = pb;
142
143 eqn_NS_ = ref_cast(Navier_Stokes_Turbulent,eqn);
144
145 const Modele_turbulence_hyd_base& modele_turbulence = eqn_NS_->modele_turbulence();
146
147 const Modele_turbulence_hyd_K_Eps& modele_turbulence_keps = ref_cast(Modele_turbulence_hyd_K_Eps,modele_turbulence);
148
149 modele_K_Eps_ = modele_turbulence_keps;
150
151 eqn_transport_K_Eps_ = ref_cast(Transport_K_Eps,modele_K_Eps_->get_set_eq_transport());
152 }
153}
154
156 const Domaine_Cl_dis_base& domaine_Cl_dis)
157{
158 le_dom_VDF = ref_cast(Domaine_VDF, domaine_dis);
159 le_dom_Cl_VDF = ref_cast(Domaine_Cl_VDF, domaine_Cl_dis);
160
161 nelem_ = le_dom_VDF->nb_elem();
162}
163
164
165void Tenseur_Reynolds_Externe_VDF_Face::ajouter_blocs(matrices_t matrices, DoubleTab& secmem, const tabs_t& semi_impl) const
166{
167 const Domaine_VDF& domaine_VDF = le_dom_VDF.valeur();
168 const Domaine_Cl_VDF& domaine_Cl_VDF = le_dom_Cl_VDF.valeur();
169 const IntTab& face_voisins = domaine_VDF.face_voisins();
170 const IntVect& orientation = domaine_VDF.orientation();
171 const DoubleVect& porosite_surf = domaine_Cl_VDF.equation().milieu().porosite_face();
172 const DoubleVect& volumes_entrelaces = domaine_VDF.volumes_entrelaces();
173
174 int ndeb,nfin,ncomp,num_face,elem1,elem2;
175 double vol;
176
177 if (sub_type(Champ_Uniforme,la_source.valeur()))
178 {
179 const DoubleVect& s = la_source->valeurs();
180
181 // Boucle sur les conditions limites pour traiter les faces de bord
182
183 for (int n_bord=0; n_bord<domaine_VDF.nb_front_Cl(); n_bord++)
184 {
185
186 // pour chaque Condition Limite on regarde son type
187 // Si face de Dirichlet ou de Symetrie on ne fait rien
188 // Si face de Neumann on calcule la contribution au terme source
189
190 const Cond_lim& la_cl = domaine_Cl_VDF.les_conditions_limites(n_bord);
191
192 if (sub_type(Periodique,la_cl.valeur()))
193 {
194 const Front_VF& le_bord = ref_cast(Front_VF,la_cl->frontiere_dis());
195 ndeb = le_bord.num_premiere_face();
196 nfin = ndeb + le_bord.nb_faces();
197
198 for (num_face=ndeb; num_face<nfin; num_face++)
199 {
200 vol = volumes_entrelaces(num_face);
201 // for (ncomp=0; ncomp<dimension ; ncomp++)
202 ncomp = orientation(num_face);
203 secmem(num_face)+= s(ncomp)*vol;
204 }
205 }
206 else if (sub_type(Neumann_sortie_libre,la_cl.valeur()))
207 {
208 // const Neumann_sortie_libre& la_cl_neumann = ref_cast(Neumann_sortie_libre,la_cl.valeur());
209 const Front_VF& le_bord = ref_cast(Front_VF,la_cl->frontiere_dis());
210 ndeb = le_bord.num_premiere_face();
211 nfin = ndeb + le_bord.nb_faces();
212
213 for (num_face=ndeb; num_face<nfin; num_face++)
214 {
215 vol = volumes_entrelaces(num_face)*porosite_surf(num_face);
216 ncomp = orientation(num_face);
217 secmem(num_face)+= s(ncomp)*vol;
218 }
219
220 }
221 else if (sub_type(Symetrie,la_cl.valeur()))
222 { /* do nothing */ }
223 else if ((sub_type(Dirichlet, la_cl.valeur())) || (sub_type(Dirichlet_homogene, la_cl.valeur())))
224 { /* do nothing */ }
225 }
226
227
228 // Boucle sur les faces internes
229
230 ndeb = domaine_VDF.premiere_face_int();
231 for (num_face =domaine_VDF.premiere_face_int(); num_face<domaine_VDF.nb_faces(); num_face++)
232 {
233 vol = volumes_entrelaces(num_face)*porosite_surf(num_face);
234 ncomp = orientation(num_face);
235 secmem(num_face) += s(ncomp)*vol;
236
237 }
238 }
239 else // le champ source n'est plus uniforme
240 {
241 const DoubleTab& s = la_source->valeurs();
242
243 // Boucle sur les conditions limites pour traiter les faces de bord
244
245 for (int n_bord=0; n_bord<domaine_VDF.nb_front_Cl(); n_bord++)
246 {
247
248 // pour chaque Condition Limite on regarde son type
249 // Si face de Dirichlet ou de Symetrie on ne fait rien
250 // Si face de Neumann on calcule la contribution au terme source
251
252 const Cond_lim& la_cl = domaine_Cl_VDF.les_conditions_limites(n_bord);
253
254 if (sub_type(Neumann_sortie_libre,la_cl.valeur()))
255 {
256
257 // const Neumann_sortie_libre& la_cl_neumann = ref_cast(Neumann_sortie_libre,la_cl.valeur());
258 const Front_VF& le_bord = ref_cast(Front_VF,la_cl->frontiere_dis());
259 ndeb = le_bord.num_premiere_face();
260 nfin = ndeb + le_bord.nb_faces();
261
262 for (num_face=ndeb; num_face<nfin; num_face++)
263 {
264 vol = volumes_entrelaces(num_face)*porosite_surf(num_face);
265 ncomp = orientation(num_face);
266 elem1 = face_voisins(num_face,0);
267
268 if (elem1 != -1)
269 secmem(num_face)+= s(elem1,ncomp)*vol;
270 else
271 {
272 elem2 = face_voisins(num_face,1);
273 secmem(num_face)+= s(elem2,ncomp)*vol;
274 }
275 }
276
277 }
278 else if (sub_type(Symetrie,la_cl.valeur()))
279 { /* do nothing */ }
280 else if ((sub_type(Dirichlet, la_cl.valeur())) || (sub_type(Dirichlet_homogene, la_cl.valeur())))
281 { /* do nothing */ }
282 else if (sub_type(Periodique,la_cl.valeur()))
283 {
284 double s_face;
285 const Front_VF& le_bord = ref_cast(Front_VF,la_cl->frontiere_dis());
286 ndeb = le_bord.num_premiere_face();
287 nfin = ndeb + le_bord.nb_faces();
288 for (num_face=ndeb; num_face<nfin; num_face++)
289 {
290 vol = volumes_entrelaces(num_face)*porosite_surf(num_face);
291 ncomp = orientation(num_face);
292 s_face = 0.5*( s(face_voisins(num_face,0),ncomp) + s(face_voisins(num_face,1),ncomp) );
293 secmem(num_face) += s_face*vol;
294 }
295
296 }
297 }
298
299
300 // Boucle sur les faces internes
301
302 double s_face;
303 ndeb = domaine_VDF.premiere_face_int();
304 for (num_face =domaine_VDF.premiere_face_int(); num_face<domaine_VDF.nb_faces(); num_face++)
305 {
306
307 vol = volumes_entrelaces(num_face)*porosite_surf(num_face);
308 ncomp = orientation(num_face);
309 s_face = 0.5*( s(face_voisins(num_face,0),ncomp) + s(face_voisins(num_face,1),ncomp) );
310 secmem(num_face) += s_face*vol;
311
312 }
313 }
314}
315
316DoubleTab& Tenseur_Reynolds_Externe_VDF_Face::calculer(DoubleTab& resu) const
317{
318 resu = 0;
319 return ajouter(resu);
320}
321
323{
324 int nb_elem_tot = le_dom_VDF->nb_elem_tot();
325 int nb_faces_tot = le_dom_VDF->nb_faces_tot();
326 const IntTab& face_vois = le_dom_VDF->face_voisins();
327 const DoubleVect& volumes = le_dom_VDF->volumes();
328
329 DoubleTab valeurs_source(nb_elem_tot,dimension);
330 valeurs_source = 0;
331
333
334 DoubleTab tenseur_reynolds_elements(nb_elem_tot,dimension,dimension);
335 tenseur_reynolds_elements = 0;
336
337 Calcul_Tenseur_Reynolds( tenseur_reynolds_elements );
338
339 DoubleTab tenseur_reynolds_faces(nb_faces_tot,dimension,dimension);
340 tenseur_reynolds_faces = 0.;
341
342 for (int fac=0; fac<nb_faces_tot; fac++)
343 {
344 int elem1 = face_vois(fac,0);
345 int elem2 = face_vois(fac,1);
346 double vol = 0;
347 if (elem1!=-1)
348 {
349 for (int i=0; i<Objet_U::dimension; i++)
350 for (int j=0; j<Objet_U::dimension; j++)
351 {
352 tenseur_reynolds_faces(fac,i,j) += tenseur_reynolds_elements(elem1,i,j)*volumes(elem1);
353 }
354 vol += volumes(elem1);
355 }
356 if (elem2!=-1)
357 {
358 for (int i=0; i<Objet_U::dimension; i++)
359 for (int j=0; j<Objet_U::dimension; j++)
360 {
361 tenseur_reynolds_faces(fac,i,j) += tenseur_reynolds_elements(elem2,i,j)*volumes(elem2);
362 }
363 vol += volumes(elem2);
364 }
365 for (int i=0; i<Objet_U::dimension; i++)
366 for (int j=0; j<Objet_U::dimension; j++)
367 {
368 tenseur_reynolds_faces(fac,i,j) /= vol;
369 }
370 }
371
372 const IntTab& elem_faces = le_dom_VDF->elem_faces();
373 const IntTab& face_voisins = le_dom_VDF->face_voisins();
374 const DoubleVect& inverse_vol = le_dom_VDF->inverse_volumes();
375 const int nb_faces_elem=elem_faces.line_size();
376
377 int facei;
378 double signe=0.;
379 double div=0.;
380
381 for (int elem=0; elem<nb_elem_tot; elem++)
382 {
383 //Calcul de la divergence par element
384 for (int i=0; i<Objet_U::dimension; i++)
385 {
386 div=0.;
387 for (int facei_loc=0; facei_loc<nb_faces_elem; facei_loc++)
388 {
389 facei=elem_faces(elem,facei_loc);
390 signe=(face_voisins(facei,0)==elem)? 1.:-1.;
391
392 for (int j=0; j<Objet_U::dimension; j++)
393 {
394 div+=signe*le_dom_VDF->face_normales(facei,j)*tenseur_reynolds_faces(facei,i,j);
395 }
396 }
397 div*= inverse_vol(elem);
398 valeurs_source(elem,i) += div;
399 }
400 }
401
402 valeurs_source.echange_espace_virtuel();
403
404 la_source->valeurs( ) = valeurs_source;
405}
406
408{
410
411 la_source.OWN_PTR(Champ_Don_base)::typer( "Champ_Fonc_xyz" );
412}
413
415{
416 const Domaine_VDF& domaine_VDF = le_dom_VDF.valeur();
417 const Domaine_Cl_VDF& domaine_Cl_VDF = le_dom_Cl_VDF.valeur();
418
419 int nb_elem_tot=domaine_VDF.nb_elem_tot();
420 const Champ_Face_VDF& vitesse = ref_cast(Champ_Face_VDF,eqn_NS_->inconnue() );
421 assert (vitesse.valeurs().line_size() == 1);
422 DoubleTab gij(nb_elem_tot,dimension,dimension, vitesse.valeurs().line_size());
423 ref_cast_non_const(Champ_Face_VDF,vitesse).calcul_duidxj( vitesse.valeurs(),gij,domaine_Cl_VDF );
424
425 DoubleTab lambda_1(nb_elem_tot);
426 DoubleTab lambda_2(nb_elem_tot);
427 DoubleTab lambda_3(nb_elem_tot);
428 DoubleTab lambda_4(nb_elem_tot);
429 DoubleTab lambda_5(nb_elem_tot);
430
431 const DoubleTab& K_eps = eqn_transport_K_Eps_->inconnue().valeurs();
432
433 DoubleTab S_etoile(nb_elem_tot,dimension,dimension);
434 DoubleTab R_etoile(nb_elem_tot,dimension,dimension);
435
436 DoubleTab S2(nb_elem_tot,dimension,dimension);
437 DoubleTab R2(nb_elem_tot,dimension,dimension);
438 DoubleTab RS(nb_elem_tot,dimension,dimension);
439 DoubleTab SR(nb_elem_tot,dimension,dimension);
440
441 DoubleTab S3(nb_elem_tot,dimension,dimension);
442 DoubleTab R2S(nb_elem_tot,dimension,dimension);
443 DoubleTab RS2(nb_elem_tot,dimension,dimension);
444 DoubleTab S2R(nb_elem_tot,dimension,dimension);
445 DoubleTab SR2(nb_elem_tot,dimension,dimension);
446
447 DoubleTab R2S2(nb_elem_tot,dimension,dimension);
448 DoubleTab S2R2(nb_elem_tot,dimension,dimension);
449 DoubleTab SRS2(nb_elem_tot,dimension,dimension);
450 DoubleTab R2SR(nb_elem_tot,dimension,dimension);
451 DoubleTab RSR2(nb_elem_tot,dimension,dimension);
452 DoubleTab S2RS(nb_elem_tot,dimension,dimension);
453
454 DoubleTab RS2R2(nb_elem_tot,dimension,dimension);
455 DoubleTab R2S2R(nb_elem_tot,dimension,dimension);
456
457 DoubleTab L1Id(nb_elem_tot,dimension,dimension);
458 DoubleTab L2Id(nb_elem_tot,dimension,dimension);
459 DoubleTab L4Id(nb_elem_tot,dimension,dimension);
460 DoubleTab L5Id(nb_elem_tot,dimension,dimension);
461
462 for (int elem=0; elem<nelem_; elem++)
463 {
464
465 double k_sur_eps = K_eps(elem,0) / ( K_eps(elem,1) + 1.e-15 );
466
467 lambda_1(elem) = 0.;
468 lambda_2(elem) = 0.;
469 lambda_3(elem) = 0.;
470 lambda_4(elem) = 0.;
471 lambda_5(elem) = 0.;
472
473 for (int i=0; i<Objet_U::dimension; i++)
474 for (int j=0; j<Objet_U::dimension; j++)
475 {
476 S_etoile(elem,i,j) = 0.5*( gij(elem,i,j,0) + gij(elem,j,i,0) ) * k_sur_eps;
477 R_etoile(elem,i,j) = 0.5*( gij(elem,i,j,0) - gij(elem,j,i,0) ) * k_sur_eps;
478 }
479
480 for (int i=0; i<Objet_U::dimension; i++)
481 for (int j=0; j<Objet_U::dimension; j++)
482 {
483 S2(elem,i,j) = 0.;
484 R2(elem,i,j) = 0.;
485 SR(elem,i,j) = 0.;
486 RS(elem,i,j) = 0.;
487 L1Id(elem,i,j) = 0.;
488 L2Id(elem,i,j) = 0.;
489
490 for (int k=0; k<Objet_U::dimension; k++)
491 {
492 S2(elem,i,j) += S_etoile(elem,i,k)*S_etoile(elem,k,j) ;
493 R2(elem,i,j) += R_etoile(elem,i,k)*R_etoile(elem,k,j) ;
494 SR(elem,i,j) += S_etoile(elem,i,k)*R_etoile(elem,k,j) ;
495 RS(elem,i,j) += R_etoile(elem,i,k)*S_etoile(elem,k,j) ;
496 }
497
498 if (i==j)
499 {
500 lambda_1(elem) += S2(elem,i,j);
501 lambda_2(elem) += R2(elem,i,j);
502
503 L1Id(elem,i,j) += lambda_1(elem)/3.;
504 L2Id(elem,i,j) += lambda_2(elem)/3.;
505 }
506
507 }
508
509 for (int i=0; i<Objet_U::dimension; i++)
510 for (int j=0; j<Objet_U::dimension; j++)
511 {
512 S3(elem,i,j) = 0.;
513 R2S(elem,i,j) = 0.;
514 RS2(elem,i,j) = 0.;
515 S2R(elem,i,j) = 0.;
516 SR2(elem,i,j) = 0.;
517 L4Id(elem,i,j) = 0.;
518
519 for (int k=0; k<Objet_U::dimension; k++)
520 {
521 S3(elem,i,j) += S_etoile(elem,i,k)*S2(elem,k,j) ;
522 R2S(elem,i,j) += R2(elem,i,k)*S_etoile(elem,k,j) ;
523 RS2(elem,i,j) += R_etoile(elem,i,k)*S2(elem,k,j) ;
524 S2R(elem,i,j) += S2(elem,i,k)*R_etoile(elem,k,j) ;
525 SR2(elem,i,j) += S_etoile(elem,i,k)*R2(elem,k,j) ;
526 }
527
528 if (i==j)
529 {
530 lambda_3(elem) += S3(elem,i,j);
531 lambda_4(elem) += R2S(elem,i,j);
532
533 L4Id(elem,i,j) += lambda_4(elem)*2./3.;
534 }
535 }
536
537 for (int i=0; i<Objet_U::dimension; i++)
538 for (int j=0; j<Objet_U::dimension; j++)
539 {
540 S2R2(elem,i,j) = 0.;
541 R2S2(elem,i,j) = 0.;
542 SRS2(elem,i,j) = 0.;
543 R2SR(elem,i,j) = 0.;
544 RSR2(elem,i,j) = 0.;
545 S2RS(elem,i,j) = 0.;
546 L5Id(elem,i,j) = 0.;
547
548 for (int k=0; k<Objet_U::dimension; k++)
549 {
550 S2R2(elem,i,j) += S2(elem,i,k)*R2(elem,k,j) ;
551 R2S2(elem,i,j) += R2(elem,i,k)*S2(elem,k,j) ;
552 SRS2(elem,i,j) += SR(elem,i,k)*S2(elem,k,j) ;
553 R2SR(elem,i,j) += R2(elem,i,k)*SR(elem,k,j) ;
554 RSR2(elem,i,j) += RS(elem,i,k)*R2(elem,k,j) ;
555 S2RS(elem,i,j) += S2(elem,i,k)*RS(elem,k,j) ;
556 }
557
558 if (i==j)
559 {
560 lambda_5(elem) += R2S2(elem,i,j);
561
562 L5Id(elem,i,j) += lambda_5(elem)*2./3.;
563 }
564 }
565
566 for (int i=0; i<Objet_U::dimension; i++)
567 for (int j=0; j<Objet_U::dimension; j++)
568 {
569 RS2R2(elem,i,j) = 0.;
570 R2S2R(elem,i,j) = 0.;
571 for (int k=0; k<Objet_U::dimension; k++)
572 {
573 RS2R2(elem,i,j) += RS2(elem,i,k)*R2(elem,k,j) ;
574 R2S2R(elem,i,j) += R2(elem,i,k)*S2R(elem,k,j) ;
575 }
576 }
577 }
578
579 lambda_1_etoile_ = lambda_1;
580 lambda_2_etoile_ = lambda_2;
581 lambda_3_etoile_ = lambda_3;
582 lambda_4_etoile_ = lambda_4;
583 lambda_5_etoile_ = lambda_5;
584
585 T1_etoile_ = S_etoile;
586
587 T2_etoile_ = SR;
588 T2_etoile_ -= RS;
589
590 T3_etoile_ = S2;
591 T3_etoile_ -= L1Id;
592
593 T4_etoile_ = R2;
594 T4_etoile_ -= L2Id;
595
596 T5_etoile_ = RS2;
597 T5_etoile_ -= S2R;
598
599 T6_etoile_ = R2S;
600 T6_etoile_ += SR2;
601 T6_etoile_ -= L4Id;
602
603 T7_etoile_ = RSR2;
604 T7_etoile_ -= R2SR;
605
606 T8_etoile_ = SRS2;
607 T8_etoile_ -= S2RS;
608
609 T9_etoile_ = R2S2;
610 T9_etoile_ += S2R2;
611 T9_etoile_ -= L5Id;
612
613 T10_etoile_ = RS2R2;
614 T10_etoile_ -= R2S2R;
615}
616
618{
619 DoubleTab bij = Calcul_bij_TBNN(resu);
620
621 const DoubleTab& K_eps = eqn_transport_K_Eps_->inconnue().valeurs();
622
623 for (int elem=0; elem<nelem_; elem++)
624 {
625 for (int i=0; i<Objet_U::dimension; i++)
626 for (int j=0; j<Objet_U::dimension; j++)
627 {
628 resu(elem,i,j) = bij(elem,i,j) ;
629
630 if (i==j)
631 {
632 resu(elem,i,j) += 1./3.;
633 }
634
635 resu(elem,i,j) *= 2. * K_eps(elem,0);
636 }
637 }
638
639 return resu;
640}
641
643{
644 vector<double> b,lambda;
645 vector<vector<double>> T;
646
647 lambda.resize(5);
648 T.resize(11);
649 for (int i=0; i<11; i++)
650 T[i].resize(6);
651 T[0][0] = 1./6.;
652 T[0][1] = 0.;
653 T[0][2] = 0.;
654 T[0][3] = 1./6.;
655 T[0][4] = 0.;
656 T[0][5] = -1./3.;
657 for (int elem=0; elem<nelem_; elem++)
658 {
659 lambda[0] = lambda_1_etoile_(elem);
660 lambda[1] = lambda_2_etoile_(elem);
661 lambda[2] = lambda_3_etoile_(elem);
662 lambda[3] = lambda_4_etoile_(elem);
663 lambda[4] = lambda_5_etoile_(elem);
664 unsigned int k = 0;
665 for (int i=0; i<Objet_U::dimension; i++)
666 {
667 for (int j=i; j<Objet_U::dimension; j++)
668 {
669 T[1][k] = T1_etoile_(elem,i,j);
670 T[2][k] = T2_etoile_(elem,i,j);
671 T[3][k] = T3_etoile_(elem,i,j);
672 T[4][k] = T4_etoile_(elem,i,j);
673 T[5][k] = T5_etoile_(elem,i,j);
674 T[6][k] = T6_etoile_(elem,i,j);
675 T[7][k] = T7_etoile_(elem,i,j);
676 T[8][k] = T8_etoile_(elem,i,j);
677 T[9][k] = T9_etoile_(elem,i,j);
678 T[10][k] = T10_etoile_(elem,i,j);
679 k++;
680 }
681 }
682 b = tbnn->predict(lambda,T);
683 resu(elem,0,0) = b[0];
684 resu(elem,0,1) = b[1];
685 resu(elem,0,2) = b[2];
686 resu(elem,1,0) = b[1];
687 resu(elem,1,1) = b[3];
688 resu(elem,1,2) = b[4];
689 resu(elem,2,0) = b[2];
690 resu(elem,2,1) = b[4];
691 resu(elem,2,2) = b[5];
692 }
693
694 return resu;
695}
classe Champ_Don_base classe de base des Champs donnes (non calcules)
class Champ_Face_VDF Cette classe sert a representer un champ vectoriel dont on ne calcule
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 Cond_lim Classe generique servant a representer n'importe quelle classe
Definition Cond_lim.h:31
Classe Dirichlet_homogene Cette classe est la classe de base de la hierarchie des conditions aux limi...
classe Dirichlet Cette classe est la classe de base de la hierarchie des conditions aux limites de ty...
Definition Dirichlet.h:31
class Domaine_Cl_VDF
classe Domaine_Cl_dis_base Les objets Domaine_Cl_dis_base representent les conditions aux limites
const Cond_lim & les_conditions_limites(int) const
Renvoie la i-ieme condition aux limites.
class Domaine_VDF
Definition Domaine_VDF.h:64
int orientation(int) const override
inline DoubleVect& Domaine_VDF::porosite_face() {
int nb_faces() const
renvoie le nombre global de faces.
Definition Domaine_VF.h:471
DoubleVect & volumes_entrelaces()
Definition Domaine_VF.h:99
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
classe Domaine_dis_base Cette classe est la base de la hierarchie des domaines discretisees.
int nb_elem_tot() const
int nb_front_Cl() 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
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
DoubleVect & porosite_face()
Definition Milieu_base.h:62
Classe Modele_turbulence_hyd_K_Eps Cette classe represente le modele de turbulence (k,...
Classe Modele_turbulence_hyd_base Cette classe sert de base a la hierarchie des classes.
const Equation_base & equation() const
Renvoie la reference sur l'equation pointe par MorEqn::mon_equation.
Definition MorEqn.h:62
classe Navier_Stokes_Turbulent Cette classe represente l'equation de la dynamique pour un fluide
classe Neumann_sortie_libre Cette classe represente une frontiere ouverte sans vitesse imposee
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
classe Periodique Cette classe represente une condition aux limites periodique.
Definition Periodique.h:31
classe Probleme_base C'est un Probleme_U qui n'est pas un couplage.
virtual const Equation_base & equation(int) const =0
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
classe Source_base Un objet Source_base est un terme apparaissant au second membre d'une
Definition Source_base.h:42
virtual void completer()
Met a jour les references internes a l'objet Source_base.
virtual DoubleTab & ajouter(DoubleTab &) const
classe Symetrie Sur les faces de symetrie on a les proprietes suivantes:
Definition Symetrie.h:37
Definition TBNN.h:23
int line_size() const
Definition TRUSTVect.tpp:67
virtual void echange_espace_virtuel(IsExchangeBlocking exchange_type=IsExchangeBlocking::DefaultBlocking, const std::string kernel_name="noname")
class Tenseur_Reynolds_Externe_VDF_Face
void ajouter_blocs(matrices_t matrices, DoubleTab &secmem, const tabs_t &semi_impl) const override
void associer_pb(const Probleme_base &) override
DoubleTab & Calcul_bij_TBNN(DoubleTab &resu) const
void mettre_a_jour(double) override
DOES NOTHING - to override in derived classes.
void associer_domaines(const Domaine_dis_base &, const Domaine_Cl_dis_base &) override
void completer() override
Met a jour les references internes a l'objet Source_base.
DoubleTab & calculer(DoubleTab &) const override
classe Transport_K_Eps Cette classe represente l'equation de transport de l'energie cinetique