73 DoubleTab& resu)
const
79 const IntTab& elem_faces = domaine_VEF.
elem_faces();
82 const Domaine& domaine = domaine_VEF.
domaine();
89 const DoubleVect& volumes = domaine_VEF.
volumes();
93 int nfac = domaine.nb_faces_elem();
94 int nsom = domaine.nb_som_elem();
95 int nb_som_facette = domaine.type_elem()->nb_som_face();
96 double inverse_nb_som_facette=1./nb_som_facette;
97 DoubleTab& vecteur_face_facette = ref_cast_non_const(
Domaine_VEF,domaine_VEF).vecteur_face_facette();
112 if ((nom_elem==
"Tetra_VEF")||(nom_elem==
"Tri_VEF"))
116 int poly,face_adj,fa7,i,j,n_bord;
117 int num_face, rang ,itypcl;
118 int num10,num20,num_som;
119 int ncomp_ch_transporte;
120 if (transporte.
nb_dim() == 1)
121 ncomp_ch_transporte=1;
123 ncomp_ch_transporte= transporte.
dimension(1);
126 int nb_faces_perio = 0;
127 for (n_bord=0; n_bord<domaine_VEF.
nb_front_Cl(); n_bord++)
134 int num2 = num1 + le_bord.
nb_faces();
135 for (num_face=num1; num_face<num2; num_face++)
141 if (ncomp_ch_transporte == 1)
142 tab.
resize(nb_faces_perio);
144 tab.
resize(nb_faces_perio,ncomp_ch_transporte);
147 for (n_bord=0; n_bord<domaine_VEF.
nb_front_Cl(); n_bord++)
155 int num2 = num1 + le_bord.
nb_faces();
156 for (num_face=num1; num_face<num2; num_face++)
158 if (ncomp_ch_transporte == 1)
159 tab(nb_faces_perio) = resu(num_face);
161 for (
int comp=0; comp<ncomp_ch_transporte; comp++)
162 tab(nb_faces_perio,comp) = resu(num_face,comp);
168 int fac=0,elem1,elem2,comp;
169 int nb_faces_ = domaine_VEF.
nb_faces();
172 DoubleTab gradient_elem(nb_elem_tot,ncomp_ch_transporte,
dimension);
174 DoubleTab gradient(0, ncomp_ch_transporte,
dimension);
191 for (fac=0; fac< premiere_face_int; fac++)
193 for (comp=0; comp<ncomp_ch_transporte; comp++)
195 gradient(fac, comp, i)
200 for (; fac<nb_faces_; fac++)
202 elem1=face_voisins(fac,0);
203 elem2=face_voisins(fac,1);
204 double vol1=volumes(elem1);
205 double vol2=volumes(elem2);
206 double inverse_voltot=1./(vol1+vol2);
207 for (comp=0; comp<ncomp_ch_transporte; comp++)
210 double grad1=gradient_elem(elem1, comp, i);
211 double grad2=gradient_elem(elem2, comp, i);
212 double gradc=(vol1*grad1 + vol2*grad2)*inverse_voltot;
213 gradient(fac, comp, i) = minmod(grad1, grad2, gradc);
217 gradient.echange_espace_virtuel();
226 const IntTab& KEL=type_elemvef.
KEL();
239 const DoubleTab& vitesse_face=la_vitesse.
valeurs();
241 for (poly=0; poly<nb_elem_tot; poly++)
244 rang = rang_elem_non_std(poly);
251 for (face_adj=0; face_adj<nfac; face_adj++)
252 face(face_adj)= elem_faces(poly,face_adj);
256 vs(j) = vitesse_face(face(0),j)*porosite_face(face(0));
257 for (i=1; i<nfac; i++)
258 vs(j)+= vitesse_face(face(i),j)*porosite_face(face(i));
264 for (i=0; i<nsom; i++)
266 vsom(i,j) = vs[j] -
dimension*vitesse_face(face[i],j)*porosite_face(face[i]);
272 for (j=0; j<nsom; j++)
274 num_som = domaine.sommet_elem(poly,j);
285 for (fa7=0; fa7<nfa7; fa7++)
287 num10 = face(KEL(0,fa7));
288 num20 = face(KEL(1,fa7));
292 cc[i] = facette_normales(poly, fa7, i);
295 cc[i] = normales_facettes_Cl(rang,fa7,i);
298 for (i=0; i<nb_som_facette; i++)
301 if (i==nb_som_facette-1)
311 psc+= vsom(KEL(i+2,fa7),j)*cc[j];
313 psc *= inverse_nb_som_facette;
328 if (ncomp_ch_transporte == 1)
330 flux = transporte(amont);
333 flux += gradient(amont,0,ii)*vecteur_face_facette(poly,fa7,ii,0);
336 flux += gradient(amont,0,ii)*vecteur_face_facette(poly,fa7,ii,1);
343 for (comp2=0; comp2<ncomp_ch_transporte; comp2++)
345 flux = transporte(amont,comp2);
348 flux += gradient(amont,comp2,ii)*vecteur_face_facette(poly,fa7,ii,0);
351 flux += gradient(amont,comp2,ii)*vecteur_face_facette(poly,fa7,ii,1);
353 resu(num10,comp2) -= flux;
354 resu(num20,comp2) += flux;
378 for (n_bord=0; n_bord<domaine_VEF.
nb_front_Cl(); n_bord++)
387 int num2 = num1 + le_bord.
nb_faces();
388 for (num_face=num1; num_face<num2; num_face++)
392 psc += la_vitesse.
valeurs()(num_face,i)*face_normales(num_face,i)*porosite_face(num_face);
394 if (ncomp_ch_transporte == 1)
396 resu(num_face) -= psc*transporte(num_face);
397 flux_b(num_face,0) -= psc*transporte(num_face);
400 for (i=0; i<ncomp_ch_transporte; i++)
402 resu(num_face,i) -= psc*transporte(num_face,i);
403 flux_b(num_face,i) -= psc*transporte(num_face,i);
407 if (ncomp_ch_transporte == 1)
409 resu(num_face) -= psc*la_sortie_libre.
val_ext(num_face-num1);
410 flux_b(num_face,0) -= psc*la_sortie_libre.
val_ext(num_face-num1);
413 for (i=0; i<ncomp_ch_transporte; i++)
415 resu(num_face,i) -= psc*la_sortie_libre.
val_ext(num_face-num1,i);
416 flux_b(num_face,i) -= psc*la_sortie_libre.
val_ext(num_face-num1,i);
427 int num2 = num1 + le_bord.
nb_faces();
430 for (num_face=num1; num_face<num2; num_face++)
432 if (fait[num_face-num1] == 0)
436 if (ncomp_ch_transporte == 1)
438 diff1 = resu(num_face)-tab(nb_faces_perio);
439 diff2 = resu(voisine)-tab(nb_faces_perio+voisine-num_face);
440 resu(voisine) += diff1;
441 resu(num_face) += diff2;
442 flux_b(voisine,0) += diff1;
443 flux_b(num_face,0) += diff2;
446 for (
int comp2=0; comp2<ncomp_ch_transporte; comp2++)
448 diff1 = resu(num_face,comp2)-tab(nb_faces_perio,comp2);
449 diff2 = resu(voisine,comp2)-tab(nb_faces_perio+voisine-num_face,comp2);
450 resu(voisine,comp2) += diff1;
451 resu(num_face,comp2) += diff2;
452 flux_b(voisine,comp2) += diff1;
453 flux_b(num_face,comp2) += diff2;
456 fait[num_face-num1]= 1;
457 fait[voisine-num1] = 1;