75 const Domaine_VEF& domaine_VEF = le_dom_vef.valeur();
77 const IntTab& elem_faces=domaine_VEF.
elem_faces();
82 const Domaine& domaine = domaine_VEF.
domaine();
87 const DoubleVect& volumes=domaine_VEF.
volumes();
90 int ncomp_ch_transporte;
92 if (transporte.
nb_dim() == 1)
93 ncomp_ch_transporte=1;
95 ncomp_ch_transporte= transporte.
dimension(1);
97 DoubleTab TbarK(nb_elem_tot, ncomp_ch_transporte);
98 DoubleTab Ttilde1(nb_faces_tot, ncomp_ch_transporte);
99 DoubleTab Ttilde2(nb_faces_tot, ncomp_ch_transporte);
104 for(f=0; f<nb_faces_tot; f++)
106 int elem=face_voisins(f,0);
107 if(ncomp_ch_transporte>1)
108 for(j=0; j<ncomp_ch_transporte; j++)
109 TbarK(elem, j)+=transporte(f, j);
111 TbarK(elem, 0)+=transporte(f);
112 elem=face_voisins(f,1);
115 if(ncomp_ch_transporte>1)
116 for(j=0; j<ncomp_ch_transporte; j++)
117 TbarK(elem, j)+=transporte(f, j);
119 TbarK(elem, 0)+=transporte(f);
123 for(f=0; f<nb_faces_tot; f++)
125 int elem=face_voisins(f,0);
126 if(ncomp_ch_transporte>1)
127 for(j=0; j<ncomp_ch_transporte; j++)
128 Ttilde1(f, j)=x*(TbarK(elem, j)-transporte(f, j));
130 Ttilde1(f, j)=x*(TbarK(elem, j)-transporte(f));
131 elem=face_voisins(f,1);
133 if(ncomp_ch_transporte>1)
134 for(j=0; j<ncomp_ch_transporte; j++)
135 Ttilde2(f, j)+=x*(TbarK(elem, j)-transporte(f, j));
137 Ttilde2(f, j)+=x*(TbarK(elem, j)-transporte(f));
138 else if(ncomp_ch_transporte>1)
139 Ttilde2(f, j)=transporte(f, j);
141 Ttilde2(f, j)=transporte(f);
144 for(f=0; f<nb_faces_tot; f++)
146 int elem2=face_voisins(f,1);
149 int elem1=face_voisins(f,0);
150 double alpha=volumes(elem1)/(volumes(elem1)+volumes(elem2));
151 for(j=0; j<ncomp_ch_transporte; j++)
156 if(ncomp_ch_transporte>1)
157 Tfj=transporte(f, j);
160 if( ( (Tfj<Ttilde1(f, j)) &&
161 (Tfj<Ttilde2(f, j)) ) ||
162 ( (Tfj>Ttilde1(f, j)) &&
163 (Tfj>Ttilde2(f, j)) ) )
165 Ttilde1(f, j)=Ttilde2(f, j)=Tfj;
169 if(Ttilde1(f, j)<Ttilde2(f, j))
171 epsilon=(Tfj-alpha*Ttilde1(f, j)+
172 (1-alpha)*Ttilde2(f, j))/alpha;
173 Ttilde2(f, j)-=epsilon;
174 Ttilde1(f, j)=(Tfj-(1-alpha)*Ttilde2(f, j))
179 epsilon=(Tfj-(1-alpha)*Ttilde2(f, j)+
180 alpha*Ttilde1(f, j))/(1-alpha);
181 Ttilde1(f, j)-=epsilon;
182 Ttilde2(f, j)=(Tfj-alpha*Ttilde1(f, j))
185 Cerr <<
"!!" << finl;
190 else if(ncomp_ch_transporte>1)
191 for(j=0; j<ncomp_ch_transporte; j++)
192 Ttilde1(f, j)=Ttilde2(f, j)=transporte(f, j);
194 Ttilde1(f, 0)=Ttilde2(f, 0)=transporte(f);
199 for(
int elem=0; elem<nb_elem_tot; elem++)
203 int face1=elem_faces(elem,f1);
205 if(face_voisins(face1,0)!=elem)
209 int face2=elem_faces(elem,f2);
211 if(face_voisins(face2,0)!=elem)
213 for(j=0; j<ncomp_ch_transporte; j++)
216 if(ncomp_ch_transporte>1)
217 Tfj1=transporte(face1, j);
219 Tfj1=transporte(face1);
221 if(ncomp_ch_transporte>1)
222 Tfj2=transporte(face2, j);
224 Tfj2=transporte(face2);
225 double T1=Ttilde1(face1, j);
227 T1=Ttilde2(face1, j);
228 double T2=Ttilde1(face2, j);
230 T2=Ttilde2(face2, j);
232 if((T1-T2)*(Tfj1-Tfj2)<1.e-12)
235 Ttilde1(face1, j)=Tfj1;
237 Ttilde2(face1, j)=Tfj1;
239 Ttilde1(face2, j)=Tfj2;
241 Ttilde2(face2, j)=Tfj2;
248 int nfac = domaine.nb_faces_elem();
249 int nsom = domaine.nb_som_elem();
250 int nb_som_facette = domaine.type_elem()->nb_som_face();
251 const Elem_geom_base& elem_geom = domaine.type_elem().valeur();
252 if ( sub_type(Hexaedre_VEF,elem_geom))
259 if ((nom_elem==
"Tetra_VEF")||(nom_elem==
"Tri_VEF"))
262 int poly,face_adj,fa7,i,n_bord;
263 int num_face, rang ,itypcl;
264 int num10,num20,num_som;
266 if (transporte.
nb_dim() == 1)
267 ncomp_ch_transporte=1;
269 ncomp_ch_transporte= transporte.
dimension(1);
284 int nb_faces_perio = 0;
286 for (n_bord=0; n_bord<domaine_VEF.
nb_front_Cl(); n_bord++)
292 nb_faces_perio += le_bord.
nb_faces();
297 if (ncomp_ch_transporte == 1)
298 tab.
resize(nb_faces_perio);
300 tab.
resize(nb_faces_perio,ncomp_ch_transporte);
304 for (n_bord=0; n_bord<domaine_VEF.
nb_front_Cl(); n_bord++)
312 int num2 = num1 + le_bord.
nb_faces();
313 for (num_face=num1; num_face<num2; num_face++)
315 if (ncomp_ch_transporte == 1)
316 tab(nb_faces_perio) = resu(num_face);
318 for (
int comp=0; comp<ncomp_ch_transporte; comp++)
319 tab(nb_faces_perio,comp) = resu(num_face,comp);
325 IntVect compteur(nsom);
337 for (poly=0; poly<nb_elem_tot; poly++)
340 rang = rang_elem_non_std(poly);
347 for (face_adj=0; face_adj<nfac; face_adj++)
348 face[face_adj]= elem_faces(poly,face_adj);
352 vs[j] = la_vitesse.
valeurs()(face[0],j)*porosite_face(face[0]);
353 for (i=1; i<nfac; i++)
354 vs[j]+= la_vitesse.
valeurs()(face[i],j)*porosite_face(face[i]);
362 for (j=0; j<nsom; j++)
373 for (j=0; j<nsom; j++)
375 num_som = domaine.sommet_elem(poly,j);
387 itypcl,porosite_face);
391 for (fa7=0; fa7<nfa7; fa7++)
395 cc[i] = facette_normales(poly,fa7,i);
398 cc[i] = normales_facettes_Cl(rang,fa7,i);
403 const IntTab& KEL=type_elem.
KEL();
404 for (i=0; i<nb_som_facette-1; i++)
409 psc+= vsom(KEL(i+2,fa7),j)*cc[j];
413 psc /= nb_som_facette;
414 num10 = face[KEL(0,fa7)];
415 num20 = face[KEL(1,fa7)];
417 for(
int comp=0; comp<ncomp_ch_transporte; comp++)
419 if(face_voisins(num10,0)==poly)
420 T1 = Ttilde1(num10, comp);
422 T1 = Ttilde2(num10, comp);
423 if(face_voisins(num20,0)==poly)
424 T2 = Ttilde1(num20, comp);
426 T2 = Ttilde2(num20, comp);
427 if( (transporte(num20)-transporte(num10)) * (T1-transporte(num10)) < 0)
428 convbis(psc,num10,num20,T1, T2, comp,
437 psc /= nb_som_facette;
438 num10 = face[KEL(0,fa7)];
439 num20 = face[KEL(1,fa7)];
442 for(
int comp=0; comp<ncomp_ch_transporte; comp++)
444 if(face_voisins(num10,0)==poly)
445 T1 = Ttilde1(num10, comp);
447 T1 = Ttilde2(num10, comp);
448 if(face_voisins(num20,0)==poly)
449 T2 = Ttilde1(num20, comp);
451 T2 = Ttilde2(num20, comp);
452 convbis(psc,num10,num20,T1, T2, comp,
474 for (n_bord=0; n_bord<domaine_VEF.
nb_front_Cl(); n_bord++)
485 int num2 = num1 + le_bord.
nb_faces();
486 for (num_face=num1; num_face<num2; num_face++)
490 psc += la_vitesse.
valeurs()(num_face,i)*face_normales(num_face,i)*porosite_face(num_face);
492 if (ncomp_ch_transporte == 1)
494 resu(num_face) -= psc*transporte(num_face);
495 flux_b(num_face,0) -= psc*transporte(num_face);
498 for (i=0; i<ncomp_ch_transporte; i++)
500 resu(num_face,i) -= psc*transporte(num_face,i);
501 flux_b(num_face,i) -= psc*transporte(num_face,i);
505 if (ncomp_ch_transporte == 1)
507 resu(num_face) -= psc*la_sortie_libre.
val_ext(num_face-num1);
508 flux_b(num_face,0) -= psc*la_sortie_libre.
val_ext(num_face-num1);
511 for (i=0; i<ncomp_ch_transporte; i++)
513 resu(num_face,i) -= psc*la_sortie_libre.
val_ext(num_face-num1,i);
514 flux_b(num_face,i) -= psc*la_sortie_libre.
val_ext(num_face-num1,i);
525 int num2 = num1 + le_bord.
nb_faces();
528 for (num_face=num1; num_face<num2; num_face++)
530 if (fait[num_face-num1] == 0)
534 if (ncomp_ch_transporte == 1)
536 diff1 = resu(num_face)-tab(nb_faces_perio);
537 diff2 = resu(voisine)-tab(nb_faces_perio+voisine-num_face);
538 resu(voisine) += diff1;
539 resu(num_face) += diff2;
540 flux_b(voisine,0) += diff1;
541 flux_b(num_face,0) += diff2;
544 for (
int comp=0; comp<ncomp_ch_transporte; comp++)
546 diff1 = resu(num_face,comp)-tab(nb_faces_perio,comp);
547 diff2 = resu(voisine,comp)-tab(nb_faces_perio+voisine-num_face,comp);
548 resu(voisine,comp) += diff1;
549 resu(num_face,comp) += diff2;
550 flux_b(voisine,comp) += diff1;
551 flux_b(num_face,comp) += diff2;
554 fait[num_face-num1]= 1;
555 fait[voisine-num1] = 1;