158 DoubleTab& resu)
const
161 const Domaine_VEF& domaine_VEF = le_dom_vef.valeur();
164 const IntTab& elem_faces = domaine_VEF.
elem_faces();
165 const DoubleTab& face_normales = domaine_VEF.
face_normales();
167 const Domaine& domaine = domaine_VEF.
domaine();
168 const int nb_faces = domaine_VEF.
nb_faces();
170 const int nb_elem = domaine_VEF.
nb_elem();
173 const IntTab& face_voisins = domaine_VEF.
face_voisins();
174 const DoubleVect& volumes = domaine_VEF.
volumes();
175 const DoubleTab& xv = domaine_VEF.
xv();
176 const DoubleTab& xg = domaine_VEF.
xp();
177 const DoubleTab& coord = domaine.coord_sommets();
179 const IntTab& les_Polys = domaine.les_elems();
183 int nfac = domaine.nb_faces_elem();
184 int nsom = domaine.nb_som_elem();
185 int nb_som_facette = domaine.type_elem()->nb_som_face();
196 int poly,poly1,poly2,face_adj,fa7,i,j,n_bord;
197 int num_face, rang ,itypcl;
198 int num10,num20,num3,num_som;
213 if ((nom_elem==
"Tetra_VEF")||(nom_elem==
"Tri_VEF")) istetra=1;
215 const int ncomp_ch_transporte= transporte.
line_size();
216 int fac,elem1,elem2,comp0;
217 int nb_faces_ = domaine_VEF.
nb_faces();
220 DoubleVect flux(ncomp_ch_transporte);
221 DoubleVect fluxsom(ncomp_ch_transporte);
222 DoubleVect fluxg(ncomp_ch_transporte);
225 int nb_faces_perio = 0;
226 for (n_bord=0; n_bord<domaine_VEF.
nb_front_Cl(); n_bord++)
233 int num2 = num1 + le_bord.
nb_faces();
234 for (num_face=num1; num_face<num2; num_face++)
239 DoubleTab tab(nb_faces_perio,ncomp_ch_transporte);
242 for (n_bord=0; n_bord<domaine_VEF.
nb_front_Cl(); n_bord++)
249 int num2 = num1 + le_bord.
nb_faces();
250 for (num_face=num1; num_face<num2; num_face++)
252 for (
int comp=0; comp<ncomp_ch_transporte; comp++)
253 tab(nb_faces_perio,comp) = resu(num_face,comp);
265 DoubleTab gradient_elem(0, ncomp_ch_transporte,
dimension);
270 for (fac=0; fac< premiere_face_int; fac++)
272 elem1=face_voisins(fac,0);
273 if(ncomp_ch_transporte==1)
276 gradient_elem(elem1, 0, i) +=
277 face_normales(fac,i)*transporte(fac);
280 for (comp0=0; comp0<ncomp_ch_transporte; comp0++)
282 gradient_elem(elem1, comp0, i) +=
283 face_normales(fac,i)*transporte(fac,comp0);
287 for (; fac<nb_faces_; fac++)
289 elem1=face_voisins(fac,0);
290 elem2=face_voisins(fac,1);
291 if(ncomp_ch_transporte==1)
294 gradient_elem(elem1, 0, i) +=
295 face_normales(fac,i)*transporte(fac);
296 gradient_elem(elem2, 0, i) -=
297 face_normales(fac,i)*transporte(fac);
300 for (comp0=0; comp0<ncomp_ch_transporte; comp0++)
303 gradient_elem(elem1, comp0, i) +=
304 face_normales(fac,i)*transporte(fac,comp0);
305 gradient_elem(elem2, comp0, i) -=
306 face_normales(fac,i)*transporte(fac,comp0);
311 for (
int elem=0; elem<nb_elem; elem++)
312 for (comp0=0; comp0<ncomp_ch_transporte; comp0++)
314 gradient_elem(elem,comp0,i) /= volumes(elem);
341 for (poly=0; poly<nb_elem; poly++)
343 rang = rang_elem_non_std(poly);
350 for (face_adj=0; face_adj<nfac; face_adj++)
351 face(face_adj)= elem_faces(poly,face_adj);
359 vs(j) = la_vitesse.
valeurs()(face(0),j)*porosite_face(face(0));
360 for (i=1; i<nfac; i++)
361 vs(j)+= la_vitesse.
valeurs()(face(i),j)*porosite_face(face(i));
367 for (j=0; j<nsom; j++)
378 for (j=0; j<nsom; j++)
380 num_som = domaine.sommet_elem(poly,j);
381 for (
int ncomp=0; ncomp<
dimension; ncomp++)
391 for (fa7=0; fa7<nfa7; fa7++)
396 num10 = face(KEL(0,fa7));
397 num20 = face(KEL(1,fa7));
398 num3 = face(KEL(2,fa7));
402 poly1 = face_voisins(num10,0);
404 poly1 = face_voisins(num10,1);
406 poly2 = face_voisins(num20,0);
408 poly2 = face_voisins(num20,1);
410 scom = les_Polys(poly,KEL(2,fa7));
415 rx0(i) = xv(num20,i)-xv(num10,i);
421 cc[i] = facette_normales(poly, fa7, i);
424 cc[i] = normales_facettes_Cl(rang,fa7,i);
430 for (i=0; i<nb_som_facette-1; i++)
438 psc+=((vsom(KEL(i+2,fa7),j) + la_vitesse.
valeurs()(num3,j) * porosite_face(num3)))*cc[j];
440 convkschemas(
K,ncomp_ch_transporte,
dimension,poly,poly1,poly2,num10,num20,psc,transporte,
441 fluent_,flux,rx0,gradient_elem);
455 if (ncomp_ch_transporte == 1)
459 xm = 0.5 *(coord(scom,j)+xv(num3,j));
463 fluxsom(0) += gradient_elem(poly,0,j)*(coord(scom,j)-xm);
465 fluxsom(0) += (teta*gradient_elem(poly,0,j) + (1.- teta)*gradient_elem(poly1,0,j))*(coord(scom,j)-xm);
470 fluxsom(0) += gradient_elem(poly,0,j)*(coord(scom,j)-xm);
472 fluxsom(0) += (teta*gradient_elem(poly,0,j) + (1.- teta)*gradient_elem(poly2,0,j))*(coord(scom,j)-xm);
475 fluxsom(0) += flux(0);
480 for (comp0=0; comp0<ncomp_ch_transporte; comp0++)
482 fluxsom(comp0) = flux(comp0);
485 xm = 0.5 *(coord(scom,j)+xv(num3,j));
489 fluxsom(comp0) += gradient_elem(poly,comp0,j)*(coord(scom,j)-xm);
491 fluxsom(comp0) += (teta*gradient_elem(poly,comp0,j) + (1.-teta)*gradient_elem(poly1,comp0,j))*(coord(scom,j)-xm);
496 fluxsom(comp0) += gradient_elem(poly,comp0,j)*(coord(scom,j)-xm);
498 fluxsom(comp0) += (teta*gradient_elem(poly,comp0,j) + (1.-teta)*gradient_elem(poly2,comp0,j))*(coord(scom,j)-xm);
501 fluxsom(comp0) *= psc;
510 if (ncomp_ch_transporte == 1)
514 xm = 0.5 *(coord(scom,j)+xv(num3,j));
518 fluxg(0) += gradient_elem(poly,0,j)*(xg(poly,j)-xm);
520 fluxg(0) += (teta*gradient_elem(poly,0,j) + (1.- teta)*gradient_elem(poly1,0,j))*(xg(poly,j)-xm);
526 fluxg(0) += gradient_elem(poly,0,j)*(xg(poly,j)-xm);
528 fluxg(0) += (teta*gradient_elem(poly,0,j) + (1.- teta)*gradient_elem(poly2,0,j))*(xg(poly,j)-xm);
537 for (comp0=0; comp0<ncomp_ch_transporte; comp0++)
539 fluxg(comp0) = flux(comp0);
542 xm = 0.5 *(coord(scom,j)+xv(num3,j));
546 fluxg(comp0) += gradient_elem(poly,comp0,j)*(xg(poly,j)-xm);
548 fluxg(comp0) += (teta*gradient_elem(poly,comp0,j) + (1.-teta)*gradient_elem(poly1,comp0,j))*(xg(poly,j)-xm);
554 fluxg(comp0) += gradient_elem(poly,comp0,j)*(xg(poly,j)-xm);
556 fluxg(comp0) += (teta*gradient_elem(poly,comp0,j) + (1.-teta)*gradient_elem(poly2,comp0,j))*(xg(poly,j)-xm);
565 for (comp0=0; comp0<ncomp_ch_transporte; comp0++)
567 resu(num10,comp0) -= ( 0.5*(fluxsom(comp0)+fluxg(comp0)) );
568 resu(num20,comp0) += ( 0.5*(fluxsom(comp0)+fluxg(comp0)) );
575 for (poly=0; poly<nb_elem_tot; poly++)
578 for (face_adj=0; face_adj<nfac; face_adj++)
579 if(face_adj<nb_faces)
break;
582 rang = rang_elem_non_std(poly);
589 for (face_adj=0; face_adj<nfac; face_adj++)
591 face(face_adj)= elem_faces(poly,face_adj);
601 vs(j) = la_vitesse.
valeurs()(face(0),j)*porosite_face(face(0));
602 for (i=1; i<nfac; i++)
603 vs(j)+= la_vitesse.
valeurs()(face(i),j)*porosite_face(face(j));
606 for (j=0; j<nsom; j++)
608 num_som = domaine.sommet_elem(poly,j);
619 for (fa7=0; fa7<nfa7; fa7++)
624 num10 = face(KEL(0,fa7));
625 num20 = face(KEL(1,fa7));
626 num3 = face(KEL(2,fa7));
630 poly1 = face_voisins(num10,0);
633 poly1 = face_voisins(num10,1);
636 poly2 = face_voisins(num20,0);
639 poly2 = face_voisins(num20,1);
642 scom = les_Polys(poly,KEL(2,fa7));
647 rx0(i) = xv(num20,i)-xv(num10,i);
653 cc[i] = facette_normales(poly, fa7, i);
656 cc[i] = normales_facettes_Cl(rang,fa7,i);
662 for (i=0; i<nb_som_facette-1; i++)
670 psc+=((vsom(KEL(i+2,fa7),j) + la_vitesse.
valeurs()(num3,j) * porosite_face(num3)))*cc[j];
672 convkschemas(
K,ncomp_ch_transporte,
dimension,poly,poly1,poly2,num10,num20,psc,transporte,
673 fluent_,flux,rx0,gradient_elem);
688 if (ncomp_ch_transporte == 1)
692 xm = 0.5 *(coord(scom,j)+xv(num3,j));
696 fluxsom(0) += gradient_elem(poly,0,j)*(coord(scom,j)-xm);
698 fluxsom(0) += (teta*gradient_elem(poly,0,j) + (1.- teta)*gradient_elem(poly1,0,j))*(coord(scom,j)-xm);
703 fluxsom(0) += gradient_elem(poly,0,j)*(coord(scom,j)-xm);
705 fluxsom(0) += (teta*gradient_elem(poly,0,j) + (1.- teta)*gradient_elem(poly2,0,j))*(coord(scom,j)-xm);
708 fluxsom(0) += flux(0);
713 for (comp0=0; comp0<ncomp_ch_transporte; comp0++)
715 fluxsom(comp0) = flux(comp0);
718 xm = 0.5 *(coord(scom,j)+xv(num3,j));
722 fluxsom(comp0) += gradient_elem(poly,comp0,j)*(coord(scom,j)-xm);
724 fluxsom(comp0) += (teta*gradient_elem(poly,comp0,j) + (1.-teta)*gradient_elem(poly1,comp0,j))*(coord(scom,j)-xm);
729 fluxsom(comp0) += gradient_elem(poly,comp0,j)*(coord(scom,j)-xm);
731 fluxsom(comp0) += (teta*gradient_elem(poly,comp0,j) + (1.-teta)*gradient_elem(poly2,comp0,j))*(coord(scom,j)-xm);
734 fluxsom(comp0) *= psc;
743 if (ncomp_ch_transporte == 1)
747 xm = 0.5 *(coord(scom,j)+xv(num3,j));
751 fluxg(0) += gradient_elem(poly,0,j)*(xg(poly,j)-xm);
753 fluxg(0) += (teta*gradient_elem(poly,0,j) + (1.- teta)*gradient_elem(poly1,0,j))*(xg(poly,j)-xm);
758 fluxg(0) += gradient_elem(poly,0,j)*(xg(poly,j)-xm);
760 fluxg(0) += (teta*gradient_elem(poly,0,j) + (1.- teta)*gradient_elem(poly2,0,j))*(xg(poly,j)-xm);
768 for (comp0=0; comp0<ncomp_ch_transporte; comp0++)
770 fluxg(comp0) = flux(comp0);
773 xm = 0.5 *(coord(scom,j)+xv(num3,j));
777 fluxg(comp0) += gradient_elem(poly,comp0,j)*(xg(poly,j)-xm);
779 fluxg(comp0) += (teta*gradient_elem(poly,comp0,j) + (1.-teta)*gradient_elem(poly1,comp0,j))*(xg(poly,j)-xm);
784 fluxg(comp0) += gradient_elem(poly,comp0,j)*(xg(poly,j)-xm);
786 fluxg(comp0) += (teta*gradient_elem(poly,comp0,j) + (1.-teta)*gradient_elem(poly2,comp0,j))*(xg(poly,j)-xm);
796 for (comp0=0; comp0<ncomp_ch_transporte; comp0++)
798 resu(num10,comp0) -= ( 0.5*(fluxsom(comp0)+fluxg(comp0)) );
799 resu(num20,comp0) += ( 0.5*(fluxsom(comp0)+fluxg(comp0)) );
818 for (n_bord=0; n_bord<domaine_VEF.
nb_front_Cl(); n_bord++)
827 int num2 = num1 + le_bord.
nb_faces();
828 for (num_face=num1; num_face<num2; num_face++)
832 psc += la_vitesse.
valeurs()(num_face,i)*face_normales(num_face,i)*porosite_face(num_face);
834 for (i=0; i<ncomp_ch_transporte; i++)
836 resu(num_face,i) -= psc*transporte(num_face,i);
837 flux_b(num_face,i) -= psc*transporte(num_face,i);
841 for (i=0; i<ncomp_ch_transporte; i++)
843 resu(num_face,i) -= psc*la_sortie_libre.
val_ext(num_face-num1,i);
844 flux_b(num_face,i) -= psc*la_sortie_libre.
val_ext(num_face-num1,i);
855 int num2 = num1 + le_bord.
nb_faces();
858 for (num_face=num1; num_face<num2; num_face++)
860 if (fait[num_face-num1] == 0)
863 for (
int comp=0; comp<ncomp_ch_transporte; comp++)
865 diff1 = resu(num_face,comp)-tab(nb_faces_perio,comp);
866 diff2 = resu(voisine,comp)-tab(nb_faces_perio+voisine-num_face,comp);
867 resu(voisine,comp) += diff1;
868 resu(num_face,comp) += diff2;
869 flux_b(voisine,comp) += diff1;
870 flux_b(num_face,comp) += diff2;
872 fait[num_face-num1]= 1;
873 fait[voisine-num1] = 1;