TRUST 1.9.8
HPC thermohydraulic platform
Loading...
Searching...
No Matches
Assembleur_P_EF.cpp
1/****************************************************************************
2* Copyright (c) 2025, CEA
3* All rights reserved.
4*
5* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
6* 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
7* 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
8* 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
9*
10* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
11* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
12* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
13*
14*****************************************************************************/
15
16#include <Assembleur_P_EF.h>
17#include <Domaine_Cl_EF.h>
18#include <Domaine_EF.h>
19#include <Neumann_sortie_libre.h>
20#include <Dirichlet.h>
21#include <Matrice_Bloc.h>
22
23#include <Array_tools.h>
24#include <Debog.h>
25#include <Connectivite_som_elem.h>
26#include <Static_Int_Lists.h>
27#include <Champ_Fonc_Q1_EF.h>
28
29Implemente_instanciable(Assembleur_P_EF,"Assembleur_P_EF",Assembleur_base);
30
32{
33 return s << que_suis_je() << " " << le_nom() ;
34}
35
37{
39}
40
41
42void calculer_inv_volume_special(DoubleTab& inv_volumes_som, const Domaine_Cl_EF& domaine_Cl_EF,const DoubleTab& volumes_som,const DoubleTab& marqueur)
43{
44 inv_volumes_som=volumes_som;
45 // MODIF GB
46 inv_volumes_som=0.;
47 int taille=volumes_som.dimension_tot(0);
48 for (int i=0; i<taille; i++)
49 // MODIF GB
50 // if (marqueur(i,0))
51 {
52 double marq_norm2 = 0.;
53 for (int comp=0; comp<Objet_U::dimension; comp++) marq_norm2 += marqueur(i,comp)*marqueur(i,comp);
54 if (marq_norm2)
55 for (int comp=0; comp<Objet_U::dimension; comp++)
56 inv_volumes_som(i,comp)=1./volumes_som(i,comp);
57 }
58
59}
60void calculer_inv_volume(DoubleTab& inv_volumes_som, const Domaine_Cl_EF& domaine_Cl_EF,const DoubleVect& volumes_som)
61{
62 // maintenant l 'inverse du volume est un DoubleTab
63 // c'est pour faire fonctionner le Piso
64
65 const DoubleTab* doubleT = dynamic_cast<const DoubleTab*>(&volumes_som);
66 if (doubleT)
67 {
68 DoubleTab marqueur(*doubleT);
69 marqueur=1;
70 domaine_Cl_EF.equation().solv_masse().appliquer_impl(marqueur);
71 calculer_inv_volume_special(inv_volumes_som, domaine_Cl_EF,*doubleT,marqueur);
72 return;
73 }
74
75 DoubleTab marqueur;
76 marqueur=(volumes_som);
77 marqueur=1;
78 domaine_Cl_EF.equation().solv_masse().appliquer(marqueur);
79 int taille=volumes_som.size_totale();
80 inv_volumes_som.resize(taille,Objet_U::dimension);
81 // marqueur
82 {
83 for (int i=0; i<taille; i++)
84 if (marqueur(i))
85 for (int comp=0; comp<Objet_U::dimension; comp++)
86 inv_volumes_som(i,comp)=1./volumes_som(i);
87 }
88}
89/*
90DoubleTab inv_volumes_som;
91 inv_volumes_som=(volumes_som);
92 Debog::verifier("volumes_som",inv_volumes_som);
93 inv_volumes_som=1;
94 le_dom_Cl_EF->equation().solv_masse().appliquer(inv_volumes_som);
95 for (int i=0;i<inv_volumes_som.size_totale()*0;i++)
96 inv_volumes_som(i)=1./volumes_som(i);
97*/
98
100{
101 const Domaine_EF& domaine_EF = ref_cast(Domaine_EF, le_dom_EF.valeur());
102 const DoubleVect& volumes_som=domaine_EF.volumes_sommets_thilde();
103
104
105 return assembler_mat(la_matrice,volumes_som,1,1);
106}
107
109{
110 // On multiplie par la masse volumique aux sommets
111 if (!sub_type(Champ_Fonc_Q1_EF, rho))
112 {
113 Cerr << "La masse volumique n'est pas aux sommets dans Assembleur_P_EF::assembler_rho_variable." << finl;
115 }
116 const DoubleVect& volumes_som=ref_cast(Domaine_EF, le_dom_EF.valeur()).volumes_sommets_thilde();
117 const DoubleVect& masse_volumique=rho.valeurs();
118 DoubleVect quantitee_som(volumes_som);
119 int size=quantitee_som.size_array();
120 for (int i=0; i<size; i++)
121 quantitee_som(i)=(volumes_som(i)*masse_volumique(i));
122
123 // On assemble la matrice
124 return assembler_mat(la_matrice,quantitee_som,1,1);
125}
126
127
128int Assembleur_P_EF::assembler_mat(Matrice& la_matrice,const DoubleVect& volumes_som,int incr_pression,int resoudre_en_u)
129{
130
131 DoubleTab inv_volumes_som;
132 calculer_inv_volume(inv_volumes_som, le_dom_Cl_EF.valeur(), volumes_som);
133 set_resoudre_increment_pression(incr_pression);
134 set_resoudre_en_u(resoudre_en_u);
135 Cerr << "Assemblage de la matrice de pression en cours..." << finl;
136 // Matrice de pression :matrice creuse de taille nb_poly x nb_poly
137 // Cette fonction range la matrice dans une structure de matrice morse
138 // bien adaptee aux matrices creuses.
139 // On commence par calculer les tailles des tableaux tab1 et tab2
140 // (coeff_ a la meme taille que tab2)
141 // A chaque polyedre on associe :
142 // - une liste d'ints voisins[i] = {j>i t.q Mij est non nul }
143 // - une liste de reels valeurs[i] = {Mij pour j dans Voisins[i]}
144 // - un reel terme_diag
145 // Implementation temporaire:
146 // On assemble une matrice de pression pour une equation d'hydraulique
147 // On injecte dans cette matrice les conditions aux limites
148 // On peut faire cela car a priori la matrice de pression n'est pas
149 // partagee par plusieurs equations sur une meme domaine.
150
151 const Domaine_EF& le_dom = le_dom_EF.valeur();
152 const Domaine_Cl_EF& le_dom_cl = le_dom_Cl_EF.valeur();
153 les_coeff_pression.resize(le_dom_cl.nb_faces_Cl());
154 int n1 = le_dom.domaine().nb_elem_tot();
155 int n2 = le_dom.domaine().nb_elem();
156 //Journal() << "n1= " << n1 << " n2= " << n2 << finl;
157 int elem2;
158
159 has_P_ref=0;
160
161
162 // on construit la connectivite som_elem
163 int nb_sommets_tot=le_dom.domaine().nb_som_tot();
164 Static_Int_Lists som_elem;
165 construire_connectivite_som_elem(nb_sommets_tot,le_dom.domaine().les_elems(),som_elem,1);
166
167 //const IntTab& face_voisins = le_dom.face_voisins();
168 // const DoubleTab& face_normales = le_dom.face_normales();
169 // const Conds_lim& les_cl = le_dom_cl.les_conditions_limites();
170
171 // int premiere_face_std=le_dom.premiere_face_std();
172 // Rajout des porosites.
173
174 la_matrice.typer("Matrice_Bloc");
175 Matrice_Bloc& matrice=ref_cast(Matrice_Bloc, la_matrice.valeur());
176 matrice.dimensionner(1,2);
177 matrice.get_bloc(0,0).typer("Matrice_Morse_Sym");
178 matrice.get_bloc(0,1).typer("Matrice_Morse");
179
180 Matrice_Morse_Sym& MBrr = ref_cast(Matrice_Morse_Sym,matrice.get_bloc(0,0).valeur());
181 Matrice_Morse& MBrv = ref_cast (Matrice_Morse,matrice.get_bloc(0,1).valeur());
182 MBrr.dimensionner(n2,0);
183 MBrv.dimensionner(n2,n1-n2,0);
184
185
186 // On parcourt les sommets
187 const IntTab& sommets_elem=le_dom.domaine().les_elems();
188 int nb_coeff_rr=0;
189 int nb_coeff_rv=0;
190 //int nb_elem=n2;
191 int nb_som_elem=sommets_elem.dimension(1);
192 for (int elem1=0; elem1<n1; elem1++)
193 for (int s=0; s<nb_som_elem; s++)
194 {
195 int num_som=sommets_elem(elem1,s);
196 int nb_voisin=som_elem.get_list_size(num_som);
197 for (int i2=0; i2<nb_voisin; i2++)
198 {
199 elem2 = som_elem(num_som,i2);
200 if (elem1 >= elem2)
201 {
202 if(elem1<n2)
203 nb_coeff_rr++;
204 else if(elem2<n2)
205 nb_coeff_rv++;
206 }
207 else // elem2 > elem1
208 {
209 if(elem2<n2)
210 nb_coeff_rr++;
211 else
212
213 if(elem1<n2)
214 nb_coeff_rv++;
215 }
216 }
217 }
218 // on a surevalue nb_coeff mais bon....
219 IntTab indice_rr(nb_coeff_rr,2);
220 IntTab indice_rv(nb_coeff_rv,2);
221 nb_coeff_rr=0;
222 nb_coeff_rv=0;
223 for (int elem1=0; elem1<n1; elem1++)
224 for (int s=0; s<nb_som_elem; s++)
225 {
226 int num_som=sommets_elem(elem1,s);
227 int nb_voisin=som_elem.get_list_size(num_som);
228 for (int i2=0; i2<nb_voisin; i2++)
229 {
230 elem2 = som_elem(num_som,i2);
231 if (elem1 >= elem2)
232 {
233 if(elem1<n2)
234 {
235 indice_rr(nb_coeff_rr,0)=elem2;
236 indice_rr(nb_coeff_rr,1)=elem1;
237 nb_coeff_rr++;
238 }
239 else if(elem2<n2)
240 {
241 indice_rv(nb_coeff_rv,0)=elem2;
242 indice_rv(nb_coeff_rv,1)=elem1;
243 nb_coeff_rv++;
244 }
245 }
246 else // elem2 > elem1
247 {
248 if(elem2<n2)
249 {
250 indice_rr(nb_coeff_rr,0)=elem1;
251 indice_rr(nb_coeff_rr,1)=elem2;
252 nb_coeff_rr++;
253 }
254 else
255
256 if(elem1<n2)
257 {
258 indice_rv(nb_coeff_rv,0)=elem1;
259 indice_rv(nb_coeff_rv,1)=elem2;
260 nb_coeff_rv++;
261 }
262 }
263 }
264 }
265 tableau_trier_retirer_doublons(indice_rr);
266
267 tableau_trier_retirer_doublons(indice_rv);
268 for (int ii=0; ii<indice_rv.dimension(0); ii++) indice_rv(ii,1)-=n2;
269 MBrr.dimensionner(indice_rr);
270 if (indice_rv.size()>0)
271 MBrv.dimensionner(indice_rv);
272 MBrr.get_set_coeff() = 0;
273 MBrv.get_set_coeff() = 0;
274 const DoubleTab& Bthilde=le_dom.Bij_thilde();
275 const DoubleTab& xs = le_dom.domaine().les_sommets();
276 for (int elem1=0; elem1<n1; elem1++)
277 for (int s=0; s<nb_som_elem; s++)
278 {
279 int num_som=sommets_elem(elem1,s);
280 int nb_voisin=som_elem.get_list_size(num_som);
281 for (int i2=0; i2<nb_voisin; i2++)
282 {
283 elem2 = som_elem(num_som,i2);
284 int s2=0;
285 while ((s2<nb_som_elem)&&(num_som!=sommets_elem(elem2,s2))) s2++;
286 assert(num_som==sommets_elem(elem2,s2));
287 double val=0;
288 for (int dir=0; dir<dimension; dir++)
289 val+=Bthilde(elem1,s,dir)*Bthilde(elem2,s2,dir)*inv_volumes_som(num_som,dir);
290
291 if (bidim_axi)
292 {
293 const double r_s = xs(num_som, 0);
294 const double r_e1 = le_dom.xp(elem1, 0);
295 const double r_e2 = le_dom.xp(elem2, 0);
296 const double w = r_s / (r_e1 * r_e2);
297 val *= w;
298 }
299
300 if (elem1 <= elem2)
301 {
302// Cerr<<"ici "<<elem1 <<" "<<elem2 << " "<<s<<finl;
303 if(elem2<n2)
304 MBrr(elem1,elem2)+=val;
305
306 else
307
308 if(elem1<n2)
309 MBrv.coef(elem1,elem2-n2)+=val;
310 }
311 }
312 }
313 if (0)
314 {
315 DoubleTab test(n1),res(n2);
316 test=1;
317 res=10;
318 matrice.multvect(test,res);
319 Cerr<<" laplacien 1 "<<mp_max_abs_vect(res)<<finl;
320 Cerr<<res<<finl;
321 //matrice.imprimer(Cerr);
322 MBrr.imprimer_formatte(Cerr);
323 }
324
325 //Debog::verifier_Mat_elems("Assemblage EF avt bord ",matrice);
326
327 // correction due aux bors
328 // const IntTab& faces_sommets=le_dom.face_sommets();
329 // int nb_som_face=faces_sommets.dimension(1);
330 // const IntTab& face_voisins = le_dom.face_voisins();
331 //const DoubleTab& face_normales = le_dom.face_normales();
332 const Domaine_Cl_EF& domaine_Cl_EF = le_dom_Cl_EF.valeur();
333 // prise en compte des " cl " ajout du temr - int P sur le bord
334 //int elem_ref=-2;
335 for (int n_bord=0; n_bord<le_dom.nb_front_Cl(); n_bord++)
336 {
337 const Cond_lim& la_cl = domaine_Cl_EF.les_conditions_limites(n_bord);
338 if (sub_type(Neumann_sortie_libre,la_cl.valeur()) )
339 {
340 MBrr.set_est_definie(1);
341 /*
342 if (has_P_ref==0)
343 {
344 const Front_VF& le_bord = ref_cast(Front_VF,la_cl->frontiere_dis());
345 int face=le_bord.num_premiere_face();
346 assert(le_bord.nb_faces()>0);
347 elem_ref=face_voisins(face,0);
348 }
349 */
350 has_P_ref=1;
351 }
352 }
353 /*
354 else {
355 const Front_VF& le_bord = ref_cast(Front_VF,la_cl->frontiere_dis());
356 int num1 = 0;//le_bord.num_premiere_face();
357 int num2 = le_bord.nb_faces_tot();
358 // test..........
359 //num2=0;
360 // ppovisoire !!!!!!
361 for (int ind_face=num1; ind_face<num2; ind_face++)
362 {
363 int face=le_bord.num_face(ind_face);
364
365 for (int sf=0;sf<nb_som_face;sf++)
366 {
367 int num_som=faces_sommets(face,sf);
368 */
369 int nb_som=le_dom.domaine().nb_som();
370 const ArrOfInt& type_sommet=domaine_Cl_EF.get_type_sommet();
371 for (int num_som=0; num_som<nb_som; num_som++)
372 {
373 int nb_voisin=som_elem.get_list_size(num_som);
374 // if (type_sommet(num_som)==0) ???
375
376 if (type_sommet[num_som]==1)
377 for (int i2=0; i2<nb_voisin; i2++)
378 {
379 elem2 = som_elem(num_som,i2);
380 // ne marche qu'en 2D !!!!!!!
381 //int nb_voisin=som_elem.get_list_size(num_som);
382 for (int i1=0; i1<nb_voisin; i1++)
383 {
384 int elem1 = som_elem(num_som,i1);
385 int s1=0;
386 while ((s1<nb_som_elem)&&(num_som!=sommets_elem(elem1,s1))) s1++;
387 int s2=0;
388 while ((s2<nb_som_elem)&&(num_som!=sommets_elem(elem2,s2))) s2++;
389 assert(num_som==sommets_elem(elem2,s2));
390 assert(num_som==sommets_elem(elem1,s1));
391 double val=0;
392 ArrOfDouble grad_mod(dimension),grad(dimension);
393 // double grad_n=0;
394 for (int comp=0; comp<dimension; comp++)
395 {
396 // grad_n+=Bthilde(elem2,s2,comp)*face_normales(face,comp);
397 grad[comp]=Bthilde(elem2,s2,comp);
398 }
399 // grad_n/=(le_dom.surface(face)*le_dom.surface(face));
400 domaine_Cl_EF.modifie_gradient(grad_mod,grad,num_som);
401 for (int dir=0; dir<dimension; dir++)
402 val-=Bthilde(elem1,s1,dir)*grad_mod[dir]*inv_volumes_som(num_som,dir);
403 // val-=Bthilde(elem1,s1,dir)*face_normales(face,dir)*grad_n*inv_volumes_som(num_som,dir);
404 // val=0;
405// for (int dir=0;dir<dimension;dir++)
406// val-=Bthilde(elem1,s1,dir)*Bthilde(elem2,s2,dir);
407 // val*=-1;
408 if (bidim_axi)
409 {
410 const double r_s = xs(num_som, 0);
411 const double r_e1 = le_dom.xp(elem1, 0);
412 const double r_e2 = le_dom.xp(elem2, 0);
413 const double w = r_s / (r_e1 * r_e2);
414 val *= w;
415 }
416
417 // assert(val==0);
418 if (elem1 <= elem2)
419 {
420 if(elem2<n2)
421 MBrr(elem1,elem2)+=val;
422
423 else
424
425 if(elem1<n2)
426 MBrv.coef(elem1,elem2-n2)+=val;
427 }
428 }
429 }
430
431 }
432 /*
433 }
434 }
435 */
437 //if (je_suis_maitre()) MBrr(elem_ref,elem_ref)*=2;
438 if (0)
439 if (!(has_P_ref))
440 {
441 Cerr<<"Pas de pression imposee --> P(0)=0"<<finl;
442 if (je_suis_maitre())
443 MBrr(0,0) *= 2;
444 MBrr.set_est_definie(1);
445 has_P_ref=1;
446 }
447 // test
448 if (0)
449 {
450 DoubleTab test(n1),res(n2);
451 test=1;
452 res=10;
453 matrice.multvect(test,res);
454 Cerr<<" laplacien 1 "<<mp_max_abs_vect(res)<<finl;
455 Cerr<<res<<finl;
456 //matrice.imprimer(Cerr);
457 MBrr.imprimer_formatte(Cerr);
458 }
459 // Debog::verifier_Mat_elems("Asse",matrice);
460// MBrr.coeff_*=-1;
461 // matrice.imprimer(Cerr);exit();
462 // exit();
463 Cerr << "Fin de l'assemblage de la matrice de pression" << finl;
464 return 1;
465
466}
467
468/*! @brief Assemble la matrice de pression pour un fluide quasi compressible laplacein(P) est remplace par div(grad(P)/rho).
469 *
470 * @param (DoubleTab& tab_rho) mass volumique
471 * @return (int) renvoie toujours 1
472 */
473int Assembleur_P_EF::assembler_QC(const DoubleTab& tab_rho, Matrice& matrice)
474{
475 Cerr << "Assemblage de la matrice de pression pour Quasi Compressible en cours..." << finl;
476 assembler(matrice);
479 Matrice_Bloc& matrice_bloc= ref_cast(Matrice_Bloc,matrice.valeur());
480 Matrice_Morse_Sym& la_matrice =ref_cast(Matrice_Morse_Sym,matrice_bloc.get_bloc(0,0).valeur());
481 if ((la_matrice.get_est_definie()!=1)&&(1))
482 {
483 Cerr<<"Pas de pression imposee --> P(0)=0"<<finl;
484 if (je_suis_maitre())
485 la_matrice(0,0) *= 2;
486 la_matrice.set_est_definie(1);
487 }
488
489 Cerr << "Fin de l'assemblage de la matrice de pression" << finl;
490 return 1;
491}
492
494{
495 Debog::verifier("secmem dans modifier secmem",secmem);
496
497 const Domaine_EF& le_dom = le_dom_EF.valeur();
498 const Domaine_Cl_EF& le_dom_cl = le_dom_Cl_EF.valeur();
499 int nb_cond_lim = le_dom_cl.nb_cond_lim();
500 const IntTab& face_voisins = le_dom.face_voisins();
501
502 // Modification du second membre :
503 int i;
504 for (i=0; i<nb_cond_lim; i++)
505 {
506 const Cond_lim_base& la_cl_base = le_dom_cl.les_conditions_limites(i).valeur();
507 const Front_VF& la_front_dis = ref_cast(Front_VF,la_cl_base.frontiere_dis());
508 const Champ_front_base& champ_front = la_cl_base.champ_front();
509 int ndeb = la_front_dis.num_premiere_face();
510 int nfin = ndeb + la_front_dis.nb_faces();
511
512 // GF on est passe en increment de pression
513 if ((sub_type(Neumann_sortie_libre,la_cl_base)) && (!get_resoudre_increment_pression()))
514 {
515 double Pimp, coef;
516 const Neumann_sortie_libre& la_cl_Neumann = ref_cast(Neumann_sortie_libre, la_cl_base);
517 // const Front_VF& la_front_dis = ref_cast(Front_VF,la_cl_base.frontiere_dis());
518 //int ndeb = la_front_dis.num_premiere_face();
519 //int nfin = ndeb + la_front_dis.nb_faces();
520 for (int num_face=ndeb; num_face<nfin; num_face++)
521 {
522 Pimp = la_cl_Neumann.flux_impose(num_face-ndeb);
523 coef = les_coeff_pression[num_face]*Pimp;
524 secmem[face_voisins(num_face,0)] += coef;
525 }
526 }
527 else if (sub_type(Dirichlet,la_cl_base) && champ_front.instationnaire() && get_resoudre_en_u())
528 {
529 const DoubleTab& Gpt = champ_front.derivee_en_temps();
530 bool ch_unif = (Gpt.nb_dim()==1);
531 for (int num_face=ndeb; num_face<nfin; num_face++)
532 {
533 double Stt = 0.;
534 for (int k=0; k<dimension; k++)
535 {
536 double Gpoint = ch_unif ? Gpt(k) : Gpt(num_face - ndeb, k);
537 Stt -= Gpoint * le_dom.face_normales(num_face, k);
538 }
539 secmem(face_voisins(num_face,0)) += Stt;
540 }
541 }
542 }
543 secmem.echange_espace_virtuel();
544 Debog::verifier("secmem dans modifier secmem fin",secmem);
545 return 1;
546}
547
549{
550 Debog::verifier("pression dans modifier solution in",pression);
551 // Projection :
552 double press_0;
553 if(!has_P_ref)
554 {
555 //abort();
556 // On prend la pression minimale comme pression de reference
557 // afin d'avoir la meme pression de reference en sequentiel et parallele
558 press_0=DMAXFLOAT;
559 int n,nb_elem=le_dom_EF->domaine().nb_elem();
560 for(n=0; n<nb_elem; n++)
561 if (pression[n] < press_0)
562 press_0 = pression[n];
563 press_0 = Process::mp_min(press_0);
564
565 for(n=0; n<nb_elem; n++)
566 pression[n] -=press_0;
567
568 pression.echange_espace_virtuel();
569 }
570 return 1;
571}
572
574{
575 return le_dom_EF.valeur();
576}
577
579{
580 return le_dom_Cl_EF.valeur();
581}
582
584{
585 le_dom_EF = ref_cast(Domaine_EF,le_dom_dis);
586}
587
589{
590 le_dom_Cl_EF = ref_cast(Domaine_Cl_EF, le_dom_Cl_dis);
591}
592
594{
595 mon_equation=Eqn;
596}
const Domaine_dis_base & domaine_dis_base() const override
void associer_domaine_cl_dis_base(const Domaine_Cl_dis_base &) override
void associer_domaine_dis_base(const Domaine_dis_base &) override
const Domaine_Cl_dis_base & domaine_Cl_dis_base() const override
void completer(const Equation_base &) override
int modifier_solution(DoubleTab &) override
DoubleTab les_coeff_pression
int assembler(Matrice &) override
int assembler_QC(const DoubleTab &, Matrice &) override
Assemble la matrice de pression pour un fluide quasi compressible laplacein(P) est remplace par div(g...
int assembler_mat(Matrice &, const DoubleVect &, int incr_pression, int resoudre_en_u) override
int modifier_secmem(DoubleTab &) override
int assembler_rho_variable(Matrice &, const Champ_Don_base &rho) override
Assemblage de la matrice div( porosite/rho * grad P ) Le type du champ "rho" a fournir depend de la d...
int get_resoudre_en_u() const
Renvoie la valeur du drapeau resoudre_en_u_ (0 ou 1) Renvoie -1 si le drapeau n'a pas ete initialise.
int set_resoudre_en_u(int flag)
Definit la valeur du drapeau resoudre_en_u__.
int get_resoudre_increment_pression() const
Renvoie la valeur du drapeau resoudre_increment_pression_ (0 ou 1) Renvoie -1 si le drapeau n'a pas e...
int set_resoudre_increment_pression(int flag)
Definit la valeur du drapeau resoudre_increment_pression_.
classe Champ_Don_base classe de base des Champs donnes (non calcules)
DoubleTab & valeurs() override
Surcharge Champ_base::valeurs() Renvoie le tableau des valeurs.
classe Champ_front_base Classe de base pour la hierarchie des champs aux frontieres.
virtual const DoubleTab & derivee_en_temps() const
virtual bool instationnaire() const
classe Cond_lim_base Classe de base pour la hierarchie des classes qui representent les differentes c...
virtual Frontiere_dis_base & frontiere_dis()
Renvoie la frontiere discretisee a laquelle les conditions aux limites s'appliquent.
Champ_front_base & champ_front()
classe Cond_lim Classe generique servant a representer n'importe quelle classe
Definition Cond_lim.h:31
static void verifier(const char *const msg, double)
Definition Debog.cpp:21
classe Dirichlet Cette classe est la classe de base de la hierarchie des conditions aux limites de ty...
Definition Dirichlet.h:31
int_t nb_elem_tot() const
Definition Domaine.h:132
DoubleTab_t & les_sommets()
Definition Domaine.h:113
IntTab_t & les_elems()
Definition Domaine.h:129
int_t nb_elem() const
Definition Domaine.h:131
int_t nb_som_tot() const
Renvoie le nombre total de sommets du domaine i.e. le nombre de sommets reels et virtuels sur le proc...
Definition Domaine.h:123
int_t nb_som() const
Renvoie le nombre de sommets du domaine.
Definition Domaine.h:121
const ArrOfInt & get_type_sommet() const
void modifie_gradient(ArrOfDouble &grad_mod, const ArrOfDouble &grad, int num_som) const
classe Domaine_Cl_dis_base Les objets Domaine_Cl_dis_base representent les conditions aux limites
int nb_cond_lim() const
Renvoie le nombre de conditions aux limites.
const Cond_lim & les_conditions_limites(int) const
Renvoie la i-ieme condition aux limites.
class Domaine_EF
Definition Domaine_EF.h:59
const DoubleTab & Bij_thilde() const
Definition Domaine_EF.h:93
const DoubleVect & volumes_sommets_thilde() const
Definition Domaine_EF.h:86
virtual double face_normales(int face, int comp) const
Definition Domaine_VF.h:47
double xp(int num_elem, int k) const
Definition Domaine_VF.h:77
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_front_Cl() const
const Domaine & domaine() const
Class defining operators and methods for all reading operation in an input flow (file,...
Definition Entree.h:42
classe Equation_base Le role d'une equation est le calcul d'un ou plusieurs champs....
Solveur_Masse_base & solv_masse()
Renvoie le solveur de masse associe a l'equation.
class Front_VF
Definition Front_VF.h:36
int nb_faces() const
Definition Front_VF.h:53
int num_premiere_face() const
Definition Front_VF.h:63
virtual DoubleVect & multvect(const DoubleVect &, DoubleVect &) const
Multiplication d'un vecteur par la matrice.
virtual void dimensionner(int N, int M)
virtual const Matrice & get_bloc(int i, int j) const
Classe Matrice_Morse_Sym Represente une matrice M (creuse) symetrique stockee au format Morse.
Sortie & imprimer_formatte(Sortie &s) const override
Classe Matrice_Morse Represente une matrice M (creuse), non necessairement carree.
void dimensionner(int n, _SIZE_ nnz)
Size the matrix with n lines and n columns and nnz zero-values coefficients.
auto & get_set_coeff()
double coef(int i, int j) const
void set_est_definie(int)
int get_est_definie() const
Classe Matrice Classe generique de la hierarchie des matrices.
Definition Matrice.h:34
const Equation_base & equation() const
Renvoie la reference sur l'equation pointe par MorEqn::mon_equation.
Definition MorEqn.h:62
classe Neumann_sortie_libre Cette classe represente une frontiere ouverte sans vitesse imposee
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
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 const Nom & le_nom() const
Donne le nom de l'Objet_U Methode a surcharger : renvoie "neant" dans cette implementation.
Definition Objet_U.cpp:319
static int bidim_axi
Definition Objet_U.h:102
virtual Sortie & printOn(Sortie &) const
Ecriture de l'objet sur un flot de sortie Methode a surcharger.
Definition Objet_U.cpp:282
static double mp_min(double)
Definition Process.cpp:386
static double mp_max(double)
Definition Process.cpp:376
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
virtual DoubleTab & appliquer_impl(DoubleTab &x) const =0
virtual DoubleTab & appliquer(DoubleTab &) const
renvoie appliquer_impl(x/coeffient_temporelle) si on a un coefficient temporel sinon renvoie applique...
Classe de base des flux de sortie.
Definition Sortie.h:52
int_t get_list_size(int_t i_liste) const
renvoie le nombre d'elements de la liste i
_SIZE_ size_array() const
int nb_dim() const
Definition TRUSTTab.h:199
void resize(_SIZE_ n, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT)
Definition TRUSTTab.tpp:469
_SIZE_ dimension_tot(int) const override
Definition TRUSTTab.tpp:160
_SIZE_ dimension(int d) const
Definition TRUSTTab.tpp:133
_SIZE_ size() const
Definition TRUSTVect.tpp:45
_SIZE_ size_totale() const
Definition TRUSTVect.tpp:61
virtual void echange_espace_virtuel(IsExchangeBlocking exchange_type=IsExchangeBlocking::DefaultBlocking, const std::string kernel_name="noname")