TrioCFD 1.9.9_beta
TrioCFD documentation
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 // the volume inverse is now a DoubleTab
63 // this is to make the PISO solver work
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 // Multiply by density at vertices
111 if (!sub_type(Champ_Fonc_Q1_EF, rho))
112 {
113 Cerr << "The density is not at vertices in 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 // Assemble the matrix
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 // Pressure matrix: sparse matrix of size nb_poly x nb_poly.
137 // This function stores the matrix in a Morse matrix structure
138 // well suited to sparse matrices.
139 // We start by computing the sizes of arrays tab1 and tab2
140 // (coeff_ has the same size as tab2).
141 // For each polyhedron we associate:
142 // - a list of ints neighbors[i] = {j>i such that Mij is non-zero}
143 // - a list of reals values[i] = {Mij for j in neighbors[i]}
144 // - a real diagonal_term
145 // Temporary implementation:
146 // Assemble a pressure matrix for a hydraulic equation.
147 // Boundary conditions are injected into this matrix.
148 // This is possible because the pressure matrix is not shared
149 // by multiple equations on the same domain.
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 // build the vertex-element connectivity
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 // Addition of porosities.
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 // Iterate over vertices
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 // nb_coeff has been overestimated, but that is fine....
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 to boundaries
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 // account for boundary conditions: add term - int P on the boundary
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 // only works in 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 Assembles the pressure matrix for a quasi-compressible fluid where laplacian(P) is replaced by div(grad(P)/rho).
469 *
470 * @param (DoubleTab& tab_rho) density (mass per unit volume)
471 * @return (int) always returns 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 of the right-hand side:
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 we switched to pressure increment
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 // Take the minimum pressure as the reference pressure
557 // to have the same reference pressure in sequential and parallel
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
Assembles the pressure matrix for a quasi-compressible fluid where laplacian(P) is replaced by div(gr...
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
Assembly of the matrix div(porosity/rho * grad P) The type of the "rho" field to be provided depends ...
int get_resoudre_en_u() const
Returns the value of the resoudre_en_u_ flag (0 or 1) Returns -1 if the flag has not been initialized...
int set_resoudre_en_u(int flag)
Sets the value of the resoudre_en_u__ flag.
int get_resoudre_increment_pression() const
Returns the value of the resoudre_increment_pression_ flag (0 or 1) Returns -1 if the flag has not be...
int set_resoudre_increment_pression(int flag)
Sets the value of the resoudre_increment_pression_ flag.
class Champ_Don_base base class of Given Fields (not calculated)
DoubleTab & valeurs() override
Overrides Champ_base::valeurs() Returns the array of values.
class Champ_front_base Base class for the hierarchy of boundary fields.
virtual const DoubleTab & derivee_en_temps() const
virtual bool instationnaire() const
class Cond_lim_base Base class for the hierarchy of classes that represent the different boundary con...
virtual Frontiere_dis_base & frontiere_dis()
Returns the discretized boundary to which the boundary conditions apply.
Champ_front_base & champ_front()
class Cond_lim Generic class used to represent any class
Definition Cond_lim.h:31
static void verifier(const char *const msg, double)
Definition Debog.cpp:21
Dirichlet This class is the base class of the hierarchy of Dirichlet-type boundary conditions.
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
Returns the total number of vertices of the domain i.e. the number of real and virtual vertices on th...
Definition Domaine.h:123
int_t nb_som() const
Returns the number of vertices of the domain.
Definition Domaine.h:121
const ArrOfInt & get_type_sommet() const
void modifie_gradient(ArrOfDouble &grad_mod, const ArrOfDouble &grad, int num_som) const
class Domaine_Cl_dis_base Domaine_Cl_dis_base objects represent discretized boundary conditions
int nb_cond_lim() const
Returns the number of boundary conditions.
const Cond_lim & les_conditions_limites(int) const
Returns the i-th boundary condition.
class Domaine_EF
Definition Domaine_EF.h:56
const DoubleTab & Bij_thilde() const
Definition Domaine_EF.h:90
const DoubleVect & volumes_sommets_thilde() const
Definition Domaine_EF.h:83
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
Returns the neighbouring element of num_face in direction i.
Definition Domaine_VF.h:418
class Domaine_dis_base This class is the base of the hierarchy of discretized domains.
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
class Equation_base The role of an equation is the calculation of one or more fields....
Solveur_Masse_base & solv_masse()
Returns the mass solver associated with the 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 of a vector by the matrix.
virtual void dimensionner(int N, int M)
virtual const Matrice & get_bloc(int i, int j) const
Matrice_Morse_Sym class - Represents a sparse symmetric matrix M stored in Morse format.
Sortie & imprimer_formatte(Sortie &s) const override
Matrice_Morse class - Represents a (sparse) matrix M, not necessarily square,.
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
Matrice class - Generic class in the matrix hierarchy.
Definition Matrice.h:34
const Equation_base & equation() const
Returns the reference to the equation pointed to by MorEqn::mon_equation.
Definition MorEqn.h:62
Neumann_sortie_libre This class represents an open boundary without imposed velocity.
virtual double flux_impose(int i) const
Returns the value of the imposed flux on the i-th component of the field representing the flux at the...
Definition Neumann.cpp:35
static int dimension
Definition Objet_U.h:94
const Nom & que_suis_je() const
Returns the string identifying the class.
Definition Objet_U.cpp:104
virtual Entree & readOn(Entree &)
Reads an Objet_U from an input stream. Virtual method to override.
Definition Objet_U.cpp:289
virtual const Nom & le_nom() const
Returns the name of the Objet_U. Virtual method to override: returns "neant" in this implementation.
Definition Objet_U.cpp:317
static int bidim_axi
Definition Objet_U.h:97
virtual Sortie & printOn(Sortie &) const
Writes the object to an output stream. Virtual method to override.
Definition Objet_U.cpp:278
static double mp_min(double)
Definition Process.cpp:391
static double mp_max(double)
Definition Process.cpp:379
static void exit(int exit_code=-1)
Exit routine for TRUST within a Kokkos region.
Definition Process.cpp:466
static int je_suis_maitre()
Returns 1 if on the master processor of the current group (i.e. me() == 0), 0 otherwise.
Definition Process.cpp:82
virtual DoubleTab & appliquer_impl(DoubleTab &x) const =0
virtual DoubleTab & appliquer(DoubleTab &) const
Returns appliquer_impl(x/temporal_coefficient) if a temporal coefficient is set, otherwise returns ap...
Base class for output streams.
Definition Sortie.h:52
int_t get_list_size(int_t i_liste) const
Returns the number of elements in list 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")