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();
198 int poly,poly1,poly2,face_adj,fa7,i,j,n_bord;
199 int num_face, rang ,itypcl;
200 int num10,num20,num3,num_som;
216 if ((nom_elem==
"Tetra_VEF")||(nom_elem==
"Tri_VEF")) istetra=1;
218 const int ncomp_ch_transporte= transporte.
line_size();
219 int fac,elem1,elem2,comp0;
220 int nb_faces_ = domaine_VEF.
nb_faces();
223 DoubleVect flux(ncomp_ch_transporte);
224 DoubleVect fluxsom(ncomp_ch_transporte);
225 DoubleVect fluxg(ncomp_ch_transporte);
228 int nb_faces_perio = 0;
229 for (n_bord=0; n_bord<domaine_VEF.
nb_front_Cl(); n_bord++)
236 int num2 = num1 + le_bord.
nb_faces();
237 for (num_face=num1; num_face<num2; num_face++)
242 DoubleTab tab(nb_faces_perio,ncomp_ch_transporte);
245 for (n_bord=0; n_bord<domaine_VEF.
nb_front_Cl(); n_bord++)
252 int num2 = num1 + le_bord.
nb_faces();
253 for (num_face=num1; num_face<num2; num_face++)
255 for (
int comp=0; comp<ncomp_ch_transporte; comp++)
256 tab(nb_faces_perio,comp) = resu(num_face,comp);
268 DoubleTab gradient_elem(0, ncomp_ch_transporte,
dimension);
273 for (fac=0; fac< premiere_face_int; fac++)
275 elem1=face_voisins(fac,0);
276 if(ncomp_ch_transporte==1)
279 gradient_elem(elem1, 0, i) +=
280 face_normales(fac,i)*transporte(fac);
283 for (comp0=0; comp0<ncomp_ch_transporte; comp0++)
285 gradient_elem(elem1, comp0, i) +=
286 face_normales(fac,i)*transporte(fac,comp0);
290 for (; fac<nb_faces_; fac++)
292 elem1=face_voisins(fac,0);
293 elem2=face_voisins(fac,1);
294 if(ncomp_ch_transporte==1)
297 gradient_elem(elem1, 0, i) +=
298 face_normales(fac,i)*transporte(fac);
299 gradient_elem(elem2, 0, i) -=
300 face_normales(fac,i)*transporte(fac);
303 for (comp0=0; comp0<ncomp_ch_transporte; comp0++)
306 gradient_elem(elem1, comp0, i) +=
307 face_normales(fac,i)*transporte(fac,comp0);
308 gradient_elem(elem2, comp0, i) -=
309 face_normales(fac,i)*transporte(fac,comp0);
314 for (
int elem=0; elem<nb_elem; elem++)
315 for (comp0=0; comp0<ncomp_ch_transporte; comp0++)
317 gradient_elem(elem,comp0,i) /= volumes(elem);
345 for (poly=0; poly<nb_elem; poly++)
347 rang = rang_elem_non_std(poly);
354 for (face_adj=0; face_adj<nfac; face_adj++)
355 face(face_adj)= elem_faces(poly,face_adj);
363 vs(j) = la_vitesse.
valeurs()(face(0),j)*porosite_face(face(0));
364 for (i=1; i<nfac; i++)
365 vs(j)+= la_vitesse.
valeurs()(face(i),j)*porosite_face(face(i));
371 for (j=0; j<nsom; j++)
382 for (j=0; j<nsom; j++)
384 num_som = domaine.sommet_elem(poly,j);
385 for (
int ncomp=0; ncomp<
dimension; ncomp++)
395 for (fa7=0; fa7<nfa7; fa7++)
400 num10 = face(KEL(0,fa7));
401 num20 = face(KEL(1,fa7));
402 num3 = face(KEL(2,fa7));
406 poly1 = face_voisins(num10,0);
408 poly1 = face_voisins(num10,1);
410 poly2 = face_voisins(num20,0);
412 poly2 = face_voisins(num20,1);
414 scom = les_Polys(poly,KEL(2,fa7));
419 rx0(i) = xv(num20,i)-xv(num10,i);
425 cc[i] = facette_normales(poly, fa7, i);
428 cc[i] = normales_facettes_Cl(rang,fa7,i);
434 for (i=0; i<nb_som_facette-1; i++)
442 psc+=((vsom(KEL(i+2,fa7),j) + la_vitesse.
valeurs()(num3,j) * porosite_face(num3)))*cc[j];
444 convkschemas(
K,ncomp_ch_transporte,
dimension,poly,poly1,poly2,num10,num20,psc,transporte,
445 fluent_,flux,rx0,gradient_elem);
459 if (ncomp_ch_transporte == 1)
463 xm = 0.5 *(coord(scom,j)+xv(num3,j));
467 fluxsom(0) += gradient_elem(poly,0,j)*(coord(scom,j)-xm);
469 fluxsom(0) += (teta*gradient_elem(poly,0,j) + (1.- teta)*gradient_elem(poly1,0,j))*(coord(scom,j)-xm);
474 fluxsom(0) += gradient_elem(poly,0,j)*(coord(scom,j)-xm);
476 fluxsom(0) += (teta*gradient_elem(poly,0,j) + (1.- teta)*gradient_elem(poly2,0,j))*(coord(scom,j)-xm);
479 fluxsom(0) += flux(0);
484 for (comp0=0; comp0<ncomp_ch_transporte; comp0++)
486 fluxsom(comp0) = flux(comp0);
489 xm = 0.5 *(coord(scom,j)+xv(num3,j));
493 fluxsom(comp0) += gradient_elem(poly,comp0,j)*(coord(scom,j)-xm);
495 fluxsom(comp0) += (teta*gradient_elem(poly,comp0,j) + (1.-teta)*gradient_elem(poly1,comp0,j))*(coord(scom,j)-xm);
500 fluxsom(comp0) += gradient_elem(poly,comp0,j)*(coord(scom,j)-xm);
502 fluxsom(comp0) += (teta*gradient_elem(poly,comp0,j) + (1.-teta)*gradient_elem(poly2,comp0,j))*(coord(scom,j)-xm);
505 fluxsom(comp0) *= psc;
514 if (ncomp_ch_transporte == 1)
518 xm = 0.5 *(coord(scom,j)+xv(num3,j));
522 fluxg(0) += gradient_elem(poly,0,j)*(xg(poly,j)-xm);
524 fluxg(0) += (teta*gradient_elem(poly,0,j) + (1.- teta)*gradient_elem(poly1,0,j))*(xg(poly,j)-xm);
530 fluxg(0) += gradient_elem(poly,0,j)*(xg(poly,j)-xm);
532 fluxg(0) += (teta*gradient_elem(poly,0,j) + (1.- teta)*gradient_elem(poly2,0,j))*(xg(poly,j)-xm);
541 for (comp0=0; comp0<ncomp_ch_transporte; comp0++)
543 fluxg(comp0) = flux(comp0);
546 xm = 0.5 *(coord(scom,j)+xv(num3,j));
550 fluxg(comp0) += gradient_elem(poly,comp0,j)*(xg(poly,j)-xm);
552 fluxg(comp0) += (teta*gradient_elem(poly,comp0,j) + (1.-teta)*gradient_elem(poly1,comp0,j))*(xg(poly,j)-xm);
558 fluxg(comp0) += gradient_elem(poly,comp0,j)*(xg(poly,j)-xm);
560 fluxg(comp0) += (teta*gradient_elem(poly,comp0,j) + (1.-teta)*gradient_elem(poly2,comp0,j))*(xg(poly,j)-xm);
569 for (comp0=0; comp0<ncomp_ch_transporte; comp0++)
571 resu(num10,comp0) -= ( 0.5*(fluxsom(comp0)+fluxg(comp0)) );
572 resu(num20,comp0) += ( 0.5*(fluxsom(comp0)+fluxg(comp0)) );
579 for (poly=0; poly<nb_elem_tot; poly++)
582 for (face_adj=0; face_adj<nfac; face_adj++)
583 if(face_adj<nb_faces)
break;
586 rang = rang_elem_non_std(poly);
593 for (face_adj=0; face_adj<nfac; face_adj++)
595 face(face_adj)= elem_faces(poly,face_adj);
605 vs(j) = la_vitesse.
valeurs()(face(0),j)*porosite_face(face(0));
606 for (i=1; i<nfac; i++)
607 vs(j)+= la_vitesse.
valeurs()(face(i),j)*porosite_face(face(j));
610 for (j=0; j<nsom; j++)
612 num_som = domaine.sommet_elem(poly,j);
623 for (fa7=0; fa7<nfa7; fa7++)
628 num10 = face(KEL(0,fa7));
629 num20 = face(KEL(1,fa7));
630 num3 = face(KEL(2,fa7));
634 poly1 = face_voisins(num10,0);
637 poly1 = face_voisins(num10,1);
640 poly2 = face_voisins(num20,0);
643 poly2 = face_voisins(num20,1);
646 scom = les_Polys(poly,KEL(2,fa7));
651 rx0(i) = xv(num20,i)-xv(num10,i);
657 cc[i] = facette_normales(poly, fa7, i);
660 cc[i] = normales_facettes_Cl(rang,fa7,i);
666 for (i=0; i<nb_som_facette-1; i++)
674 psc+=((vsom(KEL(i+2,fa7),j) + la_vitesse.
valeurs()(num3,j) * porosite_face(num3)))*cc[j];
676 convkschemas(
K,ncomp_ch_transporte,
dimension,poly,poly1,poly2,num10,num20,psc,transporte,
677 fluent_,flux,rx0,gradient_elem);
692 if (ncomp_ch_transporte == 1)
696 xm = 0.5 *(coord(scom,j)+xv(num3,j));
700 fluxsom(0) += gradient_elem(poly,0,j)*(coord(scom,j)-xm);
702 fluxsom(0) += (teta*gradient_elem(poly,0,j) + (1.- teta)*gradient_elem(poly1,0,j))*(coord(scom,j)-xm);
707 fluxsom(0) += gradient_elem(poly,0,j)*(coord(scom,j)-xm);
709 fluxsom(0) += (teta*gradient_elem(poly,0,j) + (1.- teta)*gradient_elem(poly2,0,j))*(coord(scom,j)-xm);
712 fluxsom(0) += flux(0);
717 for (comp0=0; comp0<ncomp_ch_transporte; comp0++)
719 fluxsom(comp0) = flux(comp0);
722 xm = 0.5 *(coord(scom,j)+xv(num3,j));
726 fluxsom(comp0) += gradient_elem(poly,comp0,j)*(coord(scom,j)-xm);
728 fluxsom(comp0) += (teta*gradient_elem(poly,comp0,j) + (1.-teta)*gradient_elem(poly1,comp0,j))*(coord(scom,j)-xm);
733 fluxsom(comp0) += gradient_elem(poly,comp0,j)*(coord(scom,j)-xm);
735 fluxsom(comp0) += (teta*gradient_elem(poly,comp0,j) + (1.-teta)*gradient_elem(poly2,comp0,j))*(coord(scom,j)-xm);
738 fluxsom(comp0) *= psc;
747 if (ncomp_ch_transporte == 1)
751 xm = 0.5 *(coord(scom,j)+xv(num3,j));
755 fluxg(0) += gradient_elem(poly,0,j)*(xg(poly,j)-xm);
757 fluxg(0) += (teta*gradient_elem(poly,0,j) + (1.- teta)*gradient_elem(poly1,0,j))*(xg(poly,j)-xm);
762 fluxg(0) += gradient_elem(poly,0,j)*(xg(poly,j)-xm);
764 fluxg(0) += (teta*gradient_elem(poly,0,j) + (1.- teta)*gradient_elem(poly2,0,j))*(xg(poly,j)-xm);
772 for (comp0=0; comp0<ncomp_ch_transporte; comp0++)
774 fluxg(comp0) = flux(comp0);
777 xm = 0.5 *(coord(scom,j)+xv(num3,j));
781 fluxg(comp0) += gradient_elem(poly,comp0,j)*(xg(poly,j)-xm);
783 fluxg(comp0) += (teta*gradient_elem(poly,comp0,j) + (1.-teta)*gradient_elem(poly1,comp0,j))*(xg(poly,j)-xm);
788 fluxg(comp0) += gradient_elem(poly,comp0,j)*(xg(poly,j)-xm);
790 fluxg(comp0) += (teta*gradient_elem(poly,comp0,j) + (1.-teta)*gradient_elem(poly2,comp0,j))*(xg(poly,j)-xm);
800 for (comp0=0; comp0<ncomp_ch_transporte; comp0++)
802 resu(num10,comp0) -= ( 0.5*(fluxsom(comp0)+fluxg(comp0)) );
803 resu(num20,comp0) += ( 0.5*(fluxsom(comp0)+fluxg(comp0)) );
823 for (n_bord=0; n_bord<domaine_VEF.
nb_front_Cl(); n_bord++)
832 int num2 = num1 + le_bord.
nb_faces();
833 for (num_face=num1; num_face<num2; num_face++)
837 psc += la_vitesse.
valeurs()(num_face,i)*face_normales(num_face,i)*porosite_face(num_face);
839 for (i=0; i<ncomp_ch_transporte; i++)
841 resu(num_face,i) -= psc*transporte(num_face,i);
842 flux_b(num_face,i) -= psc*transporte(num_face,i);
846 for (i=0; i<ncomp_ch_transporte; i++)
848 resu(num_face,i) -= psc*la_sortie_libre.
val_ext(num_face-num1,i);
849 flux_b(num_face,i) -= psc*la_sortie_libre.
val_ext(num_face-num1,i);
860 int num2 = num1 + le_bord.
nb_faces();
863 for (num_face=num1; num_face<num2; num_face++)
865 if (fait[num_face-num1] == 0)
868 for (
int comp=0; comp<ncomp_ch_transporte; comp++)
870 diff1 = resu(num_face,comp)-tab(nb_faces_perio,comp);
871 diff2 = resu(voisine,comp)-tab(nb_faces_perio+voisine-num_face,comp);
872 resu(voisine,comp) += diff1;
873 resu(num_face,comp) += diff2;
874 flux_b(voisine,comp) += diff1;
875 flux_b(num_face,comp) += diff2;
877 fait[num_face-num1]= 1;
878 fait[voisine-num1] = 1;