220 type_limit=
"vanleer";
226 enum type_operateur { amont, muscl, centre };
228 const DoubleTab& vitesse_face_absolue=velocity.
valeurs();
229 const DoubleVect& porosite_face = la_zcl_vef->equation().milieu().porosite_face();
232 DoubleTab transporte_face_;
233 DoubleTab vitesse_face_;
237 const DoubleTab& transporte_face = modif_par_porosite_si_flag(transporte,transporte_face_,!marq,porosite_face);
238 const DoubleTab& vitesse_face = modif_par_porosite_si_flag(vitesse_face_absolue,vitesse_face_,marq,porosite_face);
240 const IntTab& elem_faces = domaine_VEF.
elem_faces();
243 const Domaine& domaine = domaine_VEF.
domaine();
247 const IntTab& face_voisins = domaine_VEF.
face_voisins();
250 int nfac = domaine.nb_faces_elem();
251 int nsom = domaine.nb_som_elem();
252 const IntTab& sommet_elem = domaine.les_elems();
253 const DoubleTab& vecteur_face_facette = ref_cast_non_const(
Domaine_VEF,domaine_VEF).vecteur_face_facette();
256 const IntTab& les_elems=domaine.les_elems();
260 int option_appliquer_cl_dirichlet = (ordre==3 ? 1 : 0);
261 int option_calcul_flux_en_un_point = 0;
270 for (
int n_bord=0; n_bord<nb_bord; n_bord++)
277 for (
int ind_face=0; ind_face<nb_faces_tot; ind_face++)
279 int num_face = le_bord.
num_face(ind_face);
280 int elem = face_voisins(num_face,0);
290 ArrOfInt est_un_sommet_de_bord_(domaine_VEF.
nb_som_tot());
291 for (
int n_bord=0; n_bord<nb_bord; n_bord++)
299 for (
int ind_face=0; ind_face<nb_faces_tot; ind_face++)
300 for (
int som=0; som<size; som++)
302 int face = le_bord.
num_face(ind_face);
303 est_un_sommet_de_bord_[domaine_VEF.
face_sommets(face,som)]=1;
307 for (
int elem=0; elem<nb_elem_tot; elem++)
309 if (rang_elem_non_std(elem)!=-1)
313 for (
int n_som=0; n_som<nsom; n_som++)
314 if (est_un_sommet_de_bord_[les_elems(elem,n_som)])
322 for (
int n_bord=0; n_bord<nb_bord; n_bord++)
329 for (
int ind_face=0; ind_face<nb_faces_tot; ind_face++)
331 int num_face = le_bord.
num_face(ind_face);
351 if ((nom_elem==
"Tetra_VEF")||(nom_elem==
"Tri_VEF"))
354 const DoubleVect& porosite_elem = la_zcl_vef->equation().milieu().porosite_elem();
356 int poly,face_adj,fa7,i,j,n_bord;
358 int num10,num20,num_som;
359 int ncomp_ch_transporte=(transporte_face.
nb_dim() == 1?1:transporte_face.
dimension(1));
362 int nb_faces_perio = 0;
363 for (n_bord=0; n_bord<nb_bord; n_bord++)
374 if (ncomp_ch_transporte == 1)
375 tab.
resize(nb_faces_perio);
377 tab.
resize(nb_faces_perio,ncomp_ch_transporte);
380 for (n_bord=0; n_bord<nb_bord; n_bord++)
387 int num2 = num1 + le_bord.
nb_faces();
388 for (num_face=num1; num_face<num2; num_face++)
390 if (ncomp_ch_transporte == 1)
391 tab(nb_faces_perio) = resu(num_face);
393 for (
int comp=0; comp<ncomp_ch_transporte; comp++)
394 tab(nb_faces_perio,comp) = resu(num_face,comp);
400 int fac=0,elem1,elem2,comp0;
401 int nb_faces_ = domaine_VEF.
nb_faces();
405 DoubleTab gradient_elem(nb_elem_tot,ncomp_ch_transporte,
dimension);
413 gradient.ref(gradient_elem);
415 else if(
op_conv.type()==
"MUSCL")
418 gradient.resize(0, ncomp_ch_transporte,
dimension);
420 for (n_bord=0; n_bord<nb_bord; n_bord++)
425 int num2 = num1 + le_bord.
nb_faces();
428 for (fac=num1; fac<num2; fac++)
430 elem1=face_voisins(fac,0);
431 elem2=face_voisins(fac,1);
432 for (comp0=0; comp0<ncomp_ch_transporte; comp0++)
435 double grad1=gradient_elem(elem1, comp0, i);
436 double grad2=gradient_elem(elem2, comp0, i);
441 else if (sub_type(
Symetrie,la_cl.valeur()))
443 for (fac=num1; fac<num2; fac++)
445 elem1=face_voisins(fac,0);
446 for (comp0=0; comp0<ncomp_ch_transporte; comp0++)
448 gradient(fac, comp0, i) = gradient_elem(elem1, comp0, i);
455 for (comp0=0; comp0<ncomp_ch_transporte; comp0++)
458 double carre_surface=0;
462 double ndS=facenormales(fac,j);
463 carre_surface += ndS*ndS;
464 tmp += gradient(fac, comp0, j)*ndS;
466 gradient(fac, comp0, i) -= tmp*facenormales(fac,i)/carre_surface;
473 for (fac=premiere_face_int; fac<nb_faces_; fac++)
475 elem1=face_voisins(fac,0);
476 elem2=face_voisins(fac,1);
477 int minmod_pres_du_bord = 0;
479 for (comp0=0; comp0<ncomp_ch_transporte; comp0++)
482 double grad1=gradient_elem(elem1, comp0, i);
483 double grad2=gradient_elem(elem2, comp0, i);
484 if (minmod_pres_du_bord)
485 gradient(fac, comp0, i) = minmod(grad1, grad2);
490 gradient.echange_espace_virtuel();
502 const IntTab& KEL=type_elemvef.
KEL();
503 const DoubleTab& xv=domaine_VEF.
xv();
504 const DoubleTab& coord_sommets=domaine.coord_sommets();
511 double alpha = alpha_;
512 int nombre_passes = (alpha==1 ? 1 : 2);
513 for (
int passe=1; passe<=nombre_passes; passe++)
515 type_operateur type_op_boucle;
517 type_op_boucle = muscl;
518 else if (
op_conv.type()==
"AMONT")
519 type_op_boucle = amont;
521 type_op_boucle =centre;
524 type_op_boucle = centre;
525 gradient.ref(gradient_elem);
533 for (poly=0; poly<nb_elem_tot; poly++)
537 for (face_adj=0; face_adj<nfac; face_adj++)
539 int face_ = elem_faces(poly,face_adj);
540 face[face_adj]= face_;
541 if (face_<nb_faces_) contrib=1;
549 vs[j] = vitesse_face_absolue(face[0],j)*porosite_face[face[0]];
550 for (i=1; i<nfac; i++)
551 vs[j]+= vitesse_face_absolue(face[i],j)*porosite_face[face[i]];
557 for (i=0; i<nsom; i++)
559 vsom(i,j) = (vs[j] -
dimension*vitesse_face_absolue(face[i],j)*porosite_face[face[i]]);
564 for (j=0; j<nsom; j++)
566 num_som = sommet_elem(poly,j);
567 for (
int ncomp=0; ncomp<
dimension; ncomp++)
573 rang = rang_elem_non_std(poly);
574 int itypcl = (rang==-1 ? 0 : domaine_Cl_VEF.
type_elem_Cl(rang));
577 type_elemvef.
calcul_vc(face,vc,vs,vsom,velocity,itypcl,porosite_face);
584 for (i=0; i<nsom; i++)
586 xsom(i,j) = coord_sommets(les_elems(poly,i),j);
587 type_elemvef.
calcul_xg(xc,xsom,itypcl,idirichlet,n1,n2,n3);
593 double coeff=1./porosite_elem(poly);
598 for (fa7=0; fa7<nfa7; fa7++)
600 num10 = face[KEL(0,fa7)];
601 num20 = face[KEL(1,fa7)];
605 cc[i] = facette_normales(poly, fa7, i);
608 cc[i] = normales_facettes_Cl(rang,fa7,i);
611 double psc_c=0,psc_s=0,psc_m,psc_s2=0;
617 psc_s+=vsom(KEL(2,fa7),i)*cc[i];
619 psc_m=(psc_c+psc_s)/2.;
626 psc_s+=vsom(KEL(2,fa7),i)*cc[i];
627 psc_s2+=vsom(KEL(3,fa7),i)*cc[i];
629 psc_m=(psc_c+psc_s+psc_s2)/3.;
633 int appliquer_cl_dirichlet=0;
634 if (option_appliquer_cl_dirichlet)
637 appliquer_cl_dirichlet = 1;
642 int face_amont_m,dir;
645 face_amont_m = num10;
650 face_amont_m = num20;
654 int face_amont_c=face_amont_m;
655 int face_amont_s=face_amont_m;
656 int face_amont_s2=face_amont_m;
657 if (type_op_boucle==muscl && ordre==3)
659 face_amont_c = (psc_c >= 0) ? num10 : num20;
660 face_amont_s = (psc_s >= 0) ? num10 : num20;
661 face_amont_s2 = (psc_s2 >= 0) ? num10 : num20;
668 if (type_op_boucle==muscl)
670 item_m = face_amont_m;
671 item_c = face_amont_c;
672 item_s = face_amont_s;
673 item_s2 = face_amont_s2;
676 for (comp0=0; comp0<ncomp_ch_transporte; comp0++)
679 double inco_m = (ncomp_ch_transporte==1?transporte_face(face_amont_m):transporte_face(face_amont_m,comp0));
680 if (type_op_boucle==amont || appliquer_cl_dirichlet)
689 inco_m+= gradient(item_m,comp0,j)*vecteur_face_facette(poly,fa7,j,dir);
692 inco_m+= gradient(item_m,comp0,j)*vecteur_face_facette_Cl(rang,fa7,j,dir);
695 double inco_s = (ncomp_ch_transporte==1?transporte_face(face_amont_s):transporte_face(face_amont_s,comp0));
696 int sommet_s = sommet_elem(poly,KEL(2,fa7));
698 inco_s+= gradient(item_s,comp0,j)*(-xv(face_amont_s,j)+coord_sommets(sommet_s,j));
704 inco_s2 = (ncomp_ch_transporte==1?transporte_face(face_amont_s2):transporte_face(face_amont_s2,comp0));
705 int sommet_s2 = sommet_elem(poly,KEL(3,fa7));
707 inco_s2+= gradient(item_s2,comp0,j)*(-xv(face_amont_s2,j)+coord_sommets(sommet_s2,j));
716 inco_c = (ncomp_ch_transporte==1?transporte_face(face_amont_c):transporte_face(face_amont_c,comp0));
718 inco_c+= gradient(item_c,comp0,j)*(-xv(face_amont_c,j)+xc(j));
722 inco_c =
dimension*inco_m-inco_s-inco_s2;
726 if (calcul_flux_en_un_point || option_calcul_flux_en_un_point)
733 flux = (
dimension==2) ? (inco_c*psc_c + inco_s*psc_s + 4*inco_m*psc_m)/6
734 : (inco_c*psc_c + inco_s*psc_s + inco_s2*psc_s2 + 9*inco_m*psc_m)/12;
741 if (ncomp_ch_transporte == 1)
745 if (num10<nb_faces_bord) flux_b(num10,0) += flux;
746 if (num20<nb_faces_bord) flux_b(num20,0) -= flux;
750 resu(num10,comp0) -= flux;
751 resu(num20,comp0) += flux;
752 if (num10<nb_faces_bord) flux_b(num10,comp0) += flux;
753 if (num20<nb_faces_bord) flux_b(num20,comp0) -= flux;
769 for (n_bord=0; n_bord<nb_bord; n_bord++)
778 int num2 = num1 + le_bord.
nb_faces();
779 for (num_face=num1; num_face<num2; num_face++)
783 psc += vitesse_face(num_face,i)*facenormales(num_face,i);
785 if (ncomp_ch_transporte == 1)
787 resu(num_face) -= psc*transporte_face(num_face);
788 flux_b(num_face,0) = -psc*transporte_face(num_face);
791 for (i=0; i<ncomp_ch_transporte; i++)
793 resu(num_face,i) -= psc*transporte_face(num_face,i);
794 flux_b(num_face,i) = -psc*transporte_face(num_face,i);
798 if (ncomp_ch_transporte == 1)
800 resu(num_face) -= psc*la_sortie_libre.
val_ext(num_face-num1);
801 flux_b(num_face,0) = -psc*la_sortie_libre.
val_ext(num_face-num1);
804 for (i=0; i<ncomp_ch_transporte; i++)
806 resu(num_face,i) -= psc*la_sortie_libre.
val_ext(num_face-num1,i);
807 flux_b(num_face,i) = -psc*la_sortie_libre.
val_ext(num_face-num1,i);
817 int num2 = num1 + le_bord.
nb_faces();
820 for (num_face=num1; num_face<num2; num_face++)
822 if (fait[num_face-num1] == 0)
826 if (ncomp_ch_transporte == 1)
828 diff1 = resu(num_face)-tab(nb_faces_perio);
829 diff2 = resu(voisine)-tab(nb_faces_perio+voisine-num_face);
830 resu(voisine) += diff1;
831 resu(num_face) += diff2;
837 for (
int comp=0; comp<ncomp_ch_transporte; comp++)
839 diff1 = resu(num_face,comp)-tab(nb_faces_perio,comp);
840 diff2 = resu(voisine,comp)-tab(nb_faces_perio+voisine-num_face,comp);
841 resu(voisine,comp) += diff1;
842 resu(num_face,comp) += diff2;
848 fait[num_face-num1]= 1;
849 fait[voisine-num1] = 1;
861 Cout<<
"ajouter_Lstate_sensibility "<<finl;
864 const IntTab& elem_faces = domaine_VEF.
elem_faces();
867 const Domaine& domaine = domaine_VEF.
domaine();
872 int nfac = domaine.nb_faces_elem();
873 int nsom = domaine.nb_som_elem();
875 const IntTab& les_elems=domaine.les_elems();
876 int option_appliquer_cl_dirichlet = 0 ;
883 ArrOfInt est_un_sommet_de_bord_(domaine_VEF.
nb_som_tot());
884 for (
int n_bord=0; n_bord<nb_bord; n_bord++)
892 for (
int ind_face=0; ind_face<nb_faces_tot; ind_face++)
893 for (
int som=0; som<size; som++)
895 int face = le_bord.
num_face(ind_face);
896 est_un_sommet_de_bord_[domaine_VEF.
face_sommets(face,som)]=1;
900 for (
int elem=0; elem<nb_elem_tot; elem++)
902 if (rang_elem_non_std(elem)!=-1)
906 for (
int n_som=0; n_som<nsom; n_som++)
907 if (est_un_sommet_de_bord_[les_elems(elem,n_som)])
914 for (
int n_bord=0; n_bord<nb_bord; n_bord++)
921 for (
int ind_face=0; ind_face<nb_faces_tot; ind_face++)
923 int num_face = le_bord.
num_face(ind_face);
943 if ((nom_elem==
"Tetra_VEF")||(nom_elem==
"Tri_VEF"))
946 double psc, psc_inco;
947 int poly,face_adj,fa7,i,j,n_bord;
953 int nb_faces_perio = 0;
954 for (n_bord=0; n_bord<nb_bord; n_bord++)
965 if (ncomp_ch_transporte == 1)
966 tab.
resize(nb_faces_perio);
968 tab.
resize(nb_faces_perio,ncomp_ch_transporte);
971 for (n_bord=0; n_bord<nb_bord; n_bord++)
978 int num2 = num1 + le_bord.
nb_faces();
979 for (num_face=num1; num_face<num2; num_face++)
981 if (ncomp_ch_transporte == 1)
982 tab(nb_faces_perio) = resu(num_face);
984 for (
int comp=0; comp<ncomp_ch_transporte; comp++)
985 tab(nb_faces_perio,comp) = resu(num_face,comp);
992 int nb_faces_ = domaine_VEF.
nb_faces();
1008 flux_b.
resize(nb_faces_bord,ncomp_ch_transporte);
1011 const IntTab& KEL=type_elemvef.
KEL();
1022 for (poly=0; poly<nb_elem_tot; poly++)
1026 for (face_adj=0; face_adj<nfac; face_adj++)
1028 int face_ = elem_faces(poly,face_adj);
1029 face[face_adj]= face_;
1030 if (face_<nb_faces_) contrib=1;
1037 vs[j] = state_field(face[0],j);
1038 vs_inco[j] = inco(face[0],j);
1039 for (i=1; i<nfac; i++)
1041 vs[j]+= state_field(face[i],j);
1042 vs_inco[j] = inco(face[i],j);
1048 for (i=0; i<nsom; i++)
1051 vsom(i,j) = (vs[j] -
dimension*state_field(face[i],j));
1052 vsom_inco(i,j) = (vs_inco[j] -
dimension*inco(face[i],j));
1057 Cout <<
"Sensibility is currently working only with Tetra_VEF (3D) or Tri_VEF (2D)." << finl;
1062 rang = rang_elem_non_std(poly);
1063 int itypcl = (rang==-1 ? 0 : domaine_Cl_VEF.
type_elem_Cl(rang));
1066 calcul_vc(face,vc,vs,vsom,state_field,itypcl);
1067 calcul_vc(face,vc_inco,vs_inco,vsom_inco,inco,itypcl);
1071 for (fa7=0; fa7<nfa7; fa7++)
1073 num10 = face[KEL(0,fa7)];
1074 num20 = face[KEL(1,fa7)];
1079 cc[i] = facette_normales(poly, fa7, i);
1082 cc[i] = normales_facettes_Cl(rang,fa7,i);
1085 double psc_c=0,psc_s=0,psc_m,psc_s2=0;
1086 double psc_c_inco=0,psc_s_inco=0,psc_m_inco=0;
1092 psc_s+=vsom(KEL(2,fa7),i)*cc[i];
1093 psc_c_inco+=vc_inco[i]*cc[i];
1094 psc_s_inco+=vsom_inco(KEL(2,fa7),i)*cc[i];
1097 psc_m=(psc_c+psc_s)/2.;
1098 psc_m_inco=(psc_c_inco+psc_s_inco)/2.;
1105 psc_s+=vsom(KEL(2,fa7),i)*cc[i];
1106 psc_s2+=vsom(KEL(3,fa7),i)*cc[i];
1108 psc_m=(psc_c+psc_s+psc_s2)/3.;
1112 if (option_appliquer_cl_dirichlet)
1116 psc_m_inco = psc_c_inco;
1120 if(
false) Cout<<psc_m_inco<<finl;
1124 face_amont_m = num10;
1128 face_amont_m = num20;
1131 for (comp0=0; comp0<ncomp_ch_transporte; comp0++)
1134 double inco_m = (ncomp_ch_transporte==1?inco(face_amont_m):inco(face_amont_m,comp0));
1135 flux = inco_m*psc_m;
1137 if (ncomp_ch_transporte == 1)
1139 resu(num10) -= flux;
1140 resu(num20) += flux;
1141 if (num10<nb_faces_bord) flux_b(num10,0) += flux;
1142 if (num20<nb_faces_bord) flux_b(num20,0) -= flux;
1146 resu(num10,comp0) -= flux;
1147 resu(num20,comp0) += flux;
1148 if (num10<nb_faces_bord) flux_b(num10,comp0) += flux;
1149 if (num20<nb_faces_bord) flux_b(num20,comp0) -= flux;
1164 for (n_bord=0; n_bord<nb_bord; n_bord++)
1173 int num2 = num1 + le_bord.
nb_faces();
1174 for (num_face=num1; num_face<num2; num_face++)
1180 psc += state_field(num_face,i)*facenormales(num_face,i);
1181 psc_inco += inco(num_face,i)*facenormales(num_face,i);
1184 if (ncomp_ch_transporte == 1)
1186 resu(num_face) -= psc*inco(num_face);
1187 flux_b(num_face,0) -= psc*inco(num_face);
1190 for (i=0; i<ncomp_ch_transporte; i++)
1192 resu(num_face,i) -= psc*inco(num_face,i);
1193 flux_b(num_face,i) -= psc*inco(num_face,i);
1197 if (ncomp_ch_transporte == 1)
1199 resu(num_face) -= psc_inco*la_sortie_libre.
val_ext(num_face-num1);
1200 flux_b(num_face,0) -= psc_inco*la_sortie_libre.
val_ext(num_face-num1);
1203 for (i=0; i<ncomp_ch_transporte; i++)
1205 resu(num_face,i) -= psc_inco*la_sortie_libre.
val_ext(num_face-num1,i);
1206 flux_b(num_face,i) -= psc_inco*la_sortie_libre.
val_ext(num_face-num1,i);
1211 else if (sub_type(
Periodique,la_cl.valeur()))
1216 int num2 = num1 + le_bord.
nb_faces();
1219 for (num_face=num1; num_face<num2; num_face++)
1221 if (fait[num_face-num1] == 0)
1225 if (ncomp_ch_transporte == 1)
1227 diff1 = resu(num_face)-tab(nb_faces_perio);
1228 diff2 = resu(voisine)-tab(nb_faces_perio+voisine-num_face);
1229 resu(voisine) += diff1;
1230 resu(num_face) += diff2;
1233 for (
int comp=0; comp<ncomp_ch_transporte; comp++)
1235 diff1 = resu(num_face,comp)-tab(nb_faces_perio,comp);
1236 diff2 = resu(voisine,comp)-tab(nb_faces_perio+voisine-num_face,comp);
1237 resu(voisine,comp) += diff1;
1238 resu(num_face,comp) += diff2;
1241 fait[num_face-num1]= 1;
1242 fait[voisine-num1] = 1;
1252 Cout<<
"ajouter_Lsensibility_state "<<finl;
1255 const IntTab& elem_faces = domaine_VEF.
elem_faces();
1256 const DoubleTab& facenormales = domaine_VEF.
face_normales();
1258 const Domaine& domaine = domaine_VEF.
domaine();
1260 const int nb_elem_tot = domaine_VEF.
nb_elem_tot();
1263 int nfac = domaine.nb_faces_elem();
1264 int nsom = domaine.nb_som_elem();
1266 const IntTab& les_elems=domaine.les_elems();
1267 int option_appliquer_cl_dirichlet = 0 ;
1275 ArrOfInt est_un_sommet_de_bord_(domaine_VEF.
nb_som_tot());
1276 for (
int n_bord=0; n_bord<nb_bord; n_bord++)
1284 for (
int ind_face=0; ind_face<nb_faces_tot; ind_face++)
1285 for (
int som=0; som<size; som++)
1287 int face = le_bord.
num_face(ind_face);
1288 est_un_sommet_de_bord_[domaine_VEF.
face_sommets(face,som)]=1;
1292 for (
int elem=0; elem<nb_elem_tot; elem++)
1294 if (rang_elem_non_std(elem)!=-1)
1298 for (
int n_som=0; n_som<nsom; n_som++)
1299 if (est_un_sommet_de_bord_[les_elems(elem,n_som)])
1307 for (
int n_bord=0; n_bord<nb_bord; n_bord++)
1314 for (
int ind_face=0; ind_face<nb_faces_tot; ind_face++)
1316 int num_face = le_bord.
num_face(ind_face);
1336 if ((nom_elem==
"Tetra_VEF")||(nom_elem==
"Tri_VEF"))
1340 int poly,face_adj,fa7,i,j,n_bord;
1343 int ncomp_ch_transporte=(state_field.
nb_dim() == 1?1:state_field.
dimension(1));
1346 int nb_faces_perio = 0;
1347 for (n_bord=0; n_bord<nb_bord; n_bord++)
1353 nb_faces_perio+=le_bord.
nb_faces();
1358 if (ncomp_ch_transporte == 1)
1359 tab.
resize(nb_faces_perio);
1361 tab.
resize(nb_faces_perio,ncomp_ch_transporte);
1364 for (n_bord=0; n_bord<nb_bord; n_bord++)
1371 int num2 = num1 + le_bord.
nb_faces();
1372 for (num_face=num1; num_face<num2; num_face++)
1374 if (ncomp_ch_transporte == 1)
1375 tab(nb_faces_perio) = resu(num_face);
1377 for (
int comp=0; comp<ncomp_ch_transporte; comp++)
1378 tab(nb_faces_perio,comp) = resu(num_face,comp);
1385 int nb_faces_ = domaine_VEF.
nb_faces();
1386 ArrOfInt face(nfac);
1401 flux_b.
resize(nb_faces_bord,ncomp_ch_transporte);
1404 const IntTab& KEL=type_elemvef.
KEL();
1413 for (poly=0; poly<nb_elem_tot; poly++)
1417 for (face_adj=0; face_adj<nfac; face_adj++)
1419 int face_ = elem_faces(poly,face_adj);
1420 face[face_adj]= face_;
1421 if (face_<nb_faces_) contrib=1;
1428 vs[j] = inco(face[0],j);
1429 vs_state[j] = state_field(face[0],j);
1430 for (i=1; i<nfac; i++)
1432 vs[j]+= inco(face[i],j);
1433 vs_state[j] = state_field(face[i],j);
1439 for (i=0; i<nsom; i++)
1442 vsom(i,j) = (vs[j] -
dimension*inco(face[i],j));
1443 vsom_state(i,j) = (vs_state[j] -
dimension*state_field(face[i],j));
1448 Cout <<
"Sensibility is currently working only with Tetra_VEF (3D) or Tri_VEF (2D)." << finl;
1453 rang = rang_elem_non_std(poly);
1454 int itypcl = (rang==-1 ? 0 : domaine_Cl_VEF.
type_elem_Cl(rang));
1458 calcul_vc(face,vc_state,vs_state,vsom_state,state_field,itypcl);
1461 for (fa7=0; fa7<nfa7; fa7++)
1463 num10 = face[KEL(0,fa7)];
1464 num20 = face[KEL(1,fa7)];
1469 cc[i] = facette_normales(poly, fa7, i);
1472 cc[i] = normales_facettes_Cl(rang,fa7,i);
1475 double psc_c=0,psc_s=0,psc_m,psc_s2=0;
1476 double psc_m_state=0.,psc_c_state=0.,psc_s_state=0.;
1482 psc_s+=vsom(KEL(2,fa7),i)*cc[i];
1483 psc_c_state+=vc_state[i]*cc[i];
1484 psc_s_state+=vsom_state(KEL(2,fa7),i)*cc[i];
1487 psc_m=(psc_c+psc_s)/2.;
1488 psc_m_state=(psc_c_state+psc_s_state)/2.;
1495 psc_s+=vsom(KEL(2,fa7),i)*cc[i];
1496 psc_s2+=vsom(KEL(3,fa7),i)*cc[i];
1498 psc_m=(psc_c+psc_s+psc_s2)/3.;
1503 if (option_appliquer_cl_dirichlet)
1508 psc_m_state = psc_c_state;
1513 if(
false) Cout<<psc_m_state<<finl;
1517 face_amont_m = num10;
1521 face_amont_m = num20;
1524 for (comp0=0; comp0<ncomp_ch_transporte; comp0++)
1527 double inco_m = (ncomp_ch_transporte==1?state_field(face_amont_m):state_field(face_amont_m,comp0));
1529 flux = inco_m*psc_m;
1531 if (ncomp_ch_transporte == 1)
1533 resu(num10) -= flux;
1534 resu(num20) += flux;
1535 if (num10<nb_faces_bord) flux_b(num10,0) += flux;
1536 if (num20<nb_faces_bord) flux_b(num20,0) -= flux;
1540 resu(num10,comp0) -= flux;
1541 resu(num20,comp0) += flux;
1542 if (num10<nb_faces_bord) flux_b(num10,0) += flux;
1543 if (num20<nb_faces_bord) flux_b(num20,0) -= flux;
1558 for (n_bord=0; n_bord<nb_bord; n_bord++)
1567 int num2 = num1 + le_bord.
nb_faces();
1568 for (num_face=num1; num_face<num2; num_face++)
1572 psc += inco(num_face,i)*facenormales(num_face,i);
1574 if (ncomp_ch_transporte == 1)
1576 resu(num_face) -= psc*state_field(num_face);
1577 flux_b(num_face,0) -= psc*state_field(num_face);
1580 for (i=0; i<ncomp_ch_transporte; i++)
1582 resu(num_face,i) -= psc*state_field(num_face,i);
1583 flux_b(num_face,i) -= psc*state_field(num_face,i);
1587 if (ncomp_ch_transporte == 1)
1589 resu(num_face) -= psc*la_sortie_libre.
val_ext(num_face-num1);
1590 flux_b(num_face) -= psc*la_sortie_libre.
val_ext(num_face-num1);
1593 for (i=0; i<ncomp_ch_transporte; i++)
1595 resu(num_face,i) -= psc*la_sortie_libre.
val_ext(num_face-num1,i);
1596 flux_b(num_face,i) -= psc*la_sortie_libre.
val_ext(num_face-num1,i);
1601 else if (sub_type(
Periodique,la_cl.valeur()))
1606 int num2 = num1 + le_bord.
nb_faces();
1609 for (num_face=num1; num_face<num2; num_face++)
1611 if (fait[num_face-num1] == 0)
1615 if (ncomp_ch_transporte == 1)
1617 diff1 = resu(num_face)-tab(nb_faces_perio);
1618 diff2 = resu(voisine)-tab(nb_faces_perio+voisine-num_face);
1619 resu(voisine) += diff1;
1620 resu(num_face) += diff2;
1623 for (
int comp=0; comp<ncomp_ch_transporte; comp++)
1625 diff1 = resu(num_face,comp)-tab(nb_faces_perio,comp);
1626 diff2 = resu(voisine,comp)-tab(nb_faces_perio+voisine-num_face,comp);
1627 resu(voisine,comp) += diff1;
1628 resu(num_face,comp) += diff2;
1631 fait[num_face-num1]= 1;
1632 fait[voisine-num1] = 1;
2004 Cerr <<
"add_diffusion_term" << finl;
2006 const Domaine_VEF& domaine_VEF = le_dom_vef.valeur();
2009 int nb_dim = resu.
nb_dim();
2015 const IntTab& elemfaces = domaine_VEF.
elem_faces();
2016 const IntTab& face_voisins = domaine_VEF.
face_voisins();
2018 int nb_faces = domaine_VEF.
nb_faces();
2033 for (n_bord0=0; n_bord0<nb_bords; n_bord0++)
2040 int nb_faces_bord_reel = le_bord.
nb_faces();
2046 for (ind_face=num1; ind_face<nb_faces_bord_reel; ind_face++)
2049 fac_asso = le_bord.
num_face(fac_asso);
2050 num_face = le_bord.
num_face(ind_face);
2051 for (
int kk=0; kk<2; kk++)
2053 int elem = face_voisins(num_face, kk);
2054 for (i0=0; i0<nb_faces_elem; i0++)
2056 if ( ( (j= elemfaces(elem,i0)) > num_face ) && (j != fac_asso ) )
2058 valA =
viscA(num_face,j,elem);
2059 for (
int nc=0; nc<nb_comp; nc++)
2061 resu(num_face,nc)+=valA*state(j,nc);
2062 resu(num_face,nc)-=valA*state(num_face,nc);
2065 resu(j,nc)+=0.5*valA*state(num_face,nc);
2066 resu(j,nc)-=0.5*valA*state(j,nc);
2077 for (ind_face=num1; ind_face<num2; ind_face++)
2079 num_face = le_bord.
num_face(ind_face);
2080 int elem=face_voisins(num_face,0);
2083 for (
int i=0; i<nb_faces_elem; i++)
2084 if (( (j= elemfaces(elem,i)) > num_face ) || (ind_face>=nb_faces_bord_reel))
2086 valA =
viscA(num_face,j,elem);
2087 for (
int nc=0; nc<nb_comp; nc++)
2089 double flux=valA*(state(j,nc)-state(num_face,nc));
2090 if (ind_face<nb_faces_bord_reel)
2092 resu(num_face,nc)+=flux;
2093 tab_flux_bords(num_face,nc)+=flux;
2110 for (
int k=0; k<2; k++)
2112 int elem = face_voisins(num_face,k);
2113 for (i0=0; i0<nb_faces_elem; i0++)
2115 if ( (j= elemfaces(elem,i0)) > num_face )
2121 el1 = face_voisins(j,0);
2122 el2 = face_voisins(j,1);
2123 if((el1==-1)||(el2==-1))
2128 valA =
viscA(num_face,j,elem);
2129 for (
int nc=0; nc<nb_comp; nc++)
2131 resu(num_face,nc)+=valA*state(j,nc);
2132 resu(num_face,nc)-=valA*state(num_face,nc);
2135 resu(j,nc)+=valA*state(num_face,nc);
2136 resu(j,nc)-=valA*state(j,nc);
2149 for (
int n_bord=0; n_bord<nb_bords; n_bord++)
2152 if (sub_type(
Symetrie,la_cl.valeur()))
2156 int nfin = ndeb + le_bord.
nb_faces();
2157 for (
int face=ndeb; face<nfin; face++)
2158 tab_flux_bords(face,0) = 0.;
2188 Cerr <<
"add_diffusion_scalar_term" << finl;
2190 const Domaine_VEF& domaine_VEF = le_dom_vef.valeur();
2193 const IntTab& elemfaces = domaine_VEF.
elem_faces();
2194 const IntTab& face_voisins = domaine_VEF.
face_voisins();
2196 int nb_faces = domaine_VEF.
nb_faces();
2199 int n_bord, ind_face;
2207 for (n_bord=0; n_bord<nb_bords; n_bord++)
2214 int nb_faces_bord_reel = le_bord.
nb_faces();
2220 for (ind_face=num1; ind_face<nb_faces_bord_reel; ind_face++)
2222 num_face = le_bord.
num_face(ind_face);
2224 fac_asso = le_bord.
num_face(fac_asso);
2225 for (
int kk=0; kk<2; kk++)
2227 int elem = face_voisins(num_face,kk);
2228 for (i=0; i<nb_faces_elem; i++)
2230 if ( ( (j= elemfaces(elem,i)) > num_face ) && (j != fac_asso) )
2232 valA =
viscA(num_face,j,elem, diffu);
2233 resu(num_face)+=valA*inconnue(j);
2234 resu(num_face)-=valA*inconnue(num_face);
2237 resu(j)+=0.5*valA*inconnue(num_face);
2238 resu(j)-=0.5*valA*inconnue(j);
2250 for (ind_face=num1; ind_face<num2; ind_face++)
2252 num_face = le_bord.
num_face(ind_face);
2253 int elem = face_voisins(num_face,0);
2255 for (i=0; i<nb_faces_elem; i++)
2257 if (( (j= elemfaces(elem,i)) > num_face ) || (ind_face>=nb_faces_bord_reel))
2259 valA =
viscA(num_face,j,elem,diffu);
2261 if (ind_face<nb_faces_bord_reel)
2263 flux=valA*(inconnue(j)-inconnue(num_face));
2267 tab_flux_bords(num_face,0)-=flux;
2268 resu(num_face)+=flux;
2273 flux=valA*(inconnue(num_face)-inconnue(j));
2274 if (j<premiere_face_int)
2275 tab_flux_bords(j,0)-=flux;
2285 for (num_face=premiere_face_int; num_face<nb_faces; num_face++)
2287 for (
int k=0; k<2; k++)
2289 int elem = face_voisins(num_face,k);
2291 for (i=0; i<nb_faces_elem; i++)
2293 j=elemfaces(elem,i);
2300 el1 = face_voisins(j,0);
2301 el2 = face_voisins(j,1);
2302 if((el1==-1)||(el2==-1))
2307 valA =
viscA(num_face,j,elem,diffu);
2308 resu(num_face)+=valA*inconnue(j);
2309 resu(num_face)-=valA*inconnue(num_face);
2312 resu(j)+=valA*inconnue(num_face);
2313 resu(j)-=valA*inconnue(j);
2323 for (n_bord=0; n_bord<nb_bords; n_bord++)
2332 int nfin = ndeb + le_bord.
nb_faces();
2333 for (
int face=ndeb; face<nfin; face++)
2337 tab_flux_bords(face,0) = flux;
2345 int nfin = ndeb + le_bord.
nb_faces();
2346 for (
int face=ndeb; face<nfin; face++)
2348 flux=la_cl_paroi.
h_imp(face-ndeb)*(la_cl_paroi.
T_ext(face-ndeb)-inconnue(face))*domaine_VEF.
surface(face);
2350 tab_flux_bords(face,0) = flux;
2354 || sub_type(
Symetrie,la_cl.valeur())
2359 int nfin = ndeb + le_bord.
nb_faces();
2360 for (
int face=ndeb; face<nfin; face++)
2361 tab_flux_bords(face,0) = 0.;