106 const Domaine_VDF& domaine_VDF = le_dom_VDF_.valeur();
107 const IntTab& face_voisins = domaine_VDF.
face_voisins();
108 const DoubleVect& volumes = domaine_VDF.
volumes();
110 DoubleTab& prov_face = ref_cast_non_const(DoubleTab,
prov_face_);
111 if (prov_face.
size() == 0)
121 for (
int j = 0; j < nb_comp; j++)
123 for (
int i = 0; i < temp_F.
dimension(0); i++)
124 temp_F(i, 0) = F(i, j);
127 for (
int i = 0; i < prov_face.
dimension(0); i++)
128 temp_prov_face(i, j) = prov_face(i, 0);
133 int nbfaces = domaine_VDF.
nb_faces();
136 DoubleTab kappa_face(prov_face.
dimension(0), nb_comp * nb_comp);
138 for (
int j = 0; j < nb_comp * nb_comp; j++)
140 for (
int fac = ndeb; fac < nbfaces; fac++)
142 el0 = face_voisins(fac, 0);
143 el1 = face_voisins(fac, 1);
147 kappa_face(fac, j) = (vol0 * kappa_var(el0, j) + vol1 * kappa_var(el1, j)) / (vol0 + vol1);
152 DoubleTab temp_prov_face2 = temp_prov_face;
154 for (
int j = 0; j < nb_comp; j++)
156 for (
int i = 0; i < prov_face.
dimension(0); i++)
158 prov_face(i, 0) = temp_prov_face(i, j);
159 for (
int k = 0; k < nb_comp; k++)
160 temp_prov_face2(i, k) += prov_face(i, 0) * kappa_face(i, j + k * nb_comp);
168 for (
int j = 0; j < nb_comp; j++)
170 for (
int i = 0; i < prov_face.
dimension(0); i++)
171 prov_face(i, 0) = temp_prov_face2(i, j);
172 opdiv.
calculer(prov_face, temp_resu);
173 for (
int i = 0; i < temp_resu.
dimension(0); i++)
174 resu(i, j) = temp_resu(i, 0);
185 const Domaine_VDF& domaine_VDF = le_dom_VDF_.valeur();
253 if (getenv(
"TRUST_GMRES"))
258 Nom str =
"Petsc Cholesky { impr }";
270 DoubleTab x1(nb_elem, 2);
273 double *x1_addr = x1.
addr();
275 for (
int i = 0; i < nb_elem; i++)
277 X_c(i + (j * nb_elem)) = c(i, j);
278 X_mutilde(i + (j * nb_elem)) = mutilde(i, j);
281 for (
int n_elem = 0; n_elem < c.
size_totale(); n_elem++)
283 x1_addr[n_elem] = X_c(n_elem);
284 x1_addr[n_elem + c.
size_totale()] = X_mutilde(n_elem);
287 DoubleTab sm_c(nb_elem_tot);
288 DoubleTab sm_mutilde(nb_elem_tot);
289 DoubleTab second_membre(nb_elem_tot, 2);
294 double *sm_addr = second_membre.
addr();
296 for (
int i = 0; i < nb_elem; i++)
298 sm_c(i + (j * nb_elem)) = c(i, j);
300 sm_mutilde(i + (j * nb_elem)) = betaMatrix(j) * fermeture.
call_dWdc(c(i, j));
302 for (
int n_elem = 0; n_elem < nb_elem_tot; n_elem++)
304 sm_addr[n_elem] = sm_c(n_elem);
305 sm_addr[n_elem + nb_elem] = sm_mutilde(n_elem);
314 for (
int n_elem = 0; n_elem < nb_elem; n_elem++)
316 c_demi(n_elem) = x1_addr[n_elem];
317 mutilde_demi(n_elem) = x1_addr[n_elem + nb_elem];
323 resolution_jfnk(c, mutilde, matrice_diffusion_CH, c_demi, mutilde_demi);
325 const double theta = 0.6;
333 for (
int n_elem = 0; n_elem < nb_elem; n_elem++)
339 c_demi(n_elem, j) -= (1 - theta) * c(n_elem, j);
340 c_demi(n_elem, j) /= theta;
350 mutilde_demi(n_elem, j) -= (1 - theta) * mutilde(n_elem, j);
351 mutilde_demi(n_elem, j) /= theta;
376 mutilde = mutilde_demi;
394 if (prov_elem.
size() == 0)
399 DoubleTab temp_mutilde(mutilde.
dimension(0), 1);
401 DoubleTab temp_prov_elem = temp_mutilde;
408 DoubleTab temp_prov_elem2 = prov_elem;
411 for (
int j = 0; j < prov_elem.
line_size(); j++)
413 for (
int i = 0; i < prov_elem.
dimension(0); i++)
415 temp_prov_elem(i, 0) = prov_elem(i, j);
416 for (
int k = 0; k < nb_comp; k++)
418 temp_prov_elem2(i, k) += temp_prov_elem(i, 0) * fermeture.
get_kappaMatrix()(j + k * nb_comp);
422 prov_elem = temp_prov_elem2;
449 Cerr <<
"Type de schema errone !!" << finl;
551 const Domaine_VDF& domaine_VDF = le_dom_VDF_.valeur();
552 const IntTab& face_voisins = domaine_VDF.
face_voisins();
553 const IntTab& elem_faces = domaine_VDF.
elem_faces();
554 const DoubleTab& positions = domaine_VDF.
xp();
567 int nb_faces_au_bord;
570 double dvarkeep = 0.;
572 const double theta = 0.6;
573 double kappa_naire_interpolee = 0.;
577 Cerr <<
"Explicit mobility: Building matrix A used in JFNK..." << finl;
593 if (fermeture.get_kappa_ind() == 0)
595 for (
int i = 0; i < nb_elem; i++)
597 kappa_Matrix_var(i, j) = fermeture.get_kappaMatrix()(j);
601 kappa_Matrix_var = fermeture.call_kappa_func_c_naire(c);
619 dimensionnement = (2 * nb_compo_ + 1) * nb_elem;
621 for (
int elem = 0; elem < nb_elem; elem++)
623 for (
int ncomp = 0; ncomp < 2 * nb_compo_; ncomp++)
625 f0 = elem_faces(elem, ncomp);
626 voisin = face_voisins(f0, 0);
627 if (face_voisins(f0, 0) == elem)
628 voisin = face_voisins(f0, 1);
640 dimensionnement += nb_elem;
656 for (
int elem = 0; elem < nb_elem; elem++)
658 valeur_diag_naire = 0.;
660 nb_faces_au_bord = 0;
664 tab2(compt2) = (ligne * nb_elem) + elem;
667 tab1(compt1) = compt2;
671 for (
int ncomp = 0; ncomp < 2 * nb_compo_; ncomp++)
673 f0 = elem_faces(elem, ncomp);
674 voisin = face_voisins(f0, 0);
675 if (face_voisins(f0, 0) == elem)
676 voisin = face_voisins(f0, 1);
683 for (
int ncomp = 0; ncomp < 2 * nb_compo_ - nb_faces_au_bord; ncomp++)
685 min_tri = nb_elem + 1;
690 for (
int ncomp_tri = 0; ncomp_tri < 2 * nb_compo_; ncomp_tri++)
692 f0 = elem_faces(elem, ncomp_tri);
695 voisin = face_voisins(f0, 0);
696 if (face_voisins(f0, 0) == elem)
697 voisin = face_voisins(f0, 1);
706 if (voisin != -1 && old_tri == -1)
708 dvar2 = pow((positions(elem, ori(f0)) - positions(voisin, ori(f0))), 2);
710 kappa_naire_interpolee = pow(std::fabs(kappa_Matrix_var(elem, j) * kappa_Matrix_var(voisin, j)), 0.5);
713 if (kappa_Matrix_var(elem, j) == 0 || kappa_Matrix_var(voisin, j) == 0)
714 kappa_naire_interpolee = 0;
716 kappa_naire_interpolee = 2. / (1. / kappa_Matrix_var(elem, j) + 1. / kappa_Matrix_var(voisin, j));
719 kappa_naire_interpolee = (kappa_Matrix_var(elem, j) + kappa_Matrix_var(voisin, j)) / 2.;
720 valeur_diag_naire(mat) += theta * kappa_naire_interpolee * (dt / dvar2);
726 if (voisin > old_tri)
728 min_tri = std::min(min_tri, voisin);
729 if (min_tri == voisin)
730 dvarkeep = pow((positions(elem, ori(f0)) - positions(voisin, ori(f0))), 2);
735 if (old_tri < elem && min_tri > elem)
737 coeff(compt) = valeur_diag_naire(mat);
745 kappa_naire_interpolee = pow(std::fabs(kappa_Matrix_var(elem, j) * kappa_Matrix_var(min_tri, j)), 0.5);
748 if (kappa_Matrix_var(elem, j) == 0 || kappa_Matrix_var(min_tri, j) == 0)
749 kappa_naire_interpolee = 0;
751 kappa_naire_interpolee = 2. / (1. / kappa_Matrix_var(elem, j) + 1. / kappa_Matrix_var(min_tri, j));
754 kappa_naire_interpolee = (kappa_Matrix_var(elem, j) + kappa_Matrix_var(min_tri, j)) / 2.;
756 coeff(compt) = -theta * kappa_naire_interpolee * (dt / dvarkeep);
763 if (ncomp == 2 * nb_compo_ - nb_faces_au_bord - 1 && min_tri < elem)
765 coeff(compt) = valeur_diag_naire(mat);
782 for (
int elem = 0; elem < nb_elem; elem++)
784 valeur_diag_naire = 0.;
786 nb_faces_au_bord = 0;
789 tab1(compt1) = compt2 + 1;
793 for (
int ncomp = 0; ncomp < 2 * nb_compo_; ncomp++)
795 f0 = elem_faces(elem, ncomp);
796 voisin = face_voisins(f0, 0);
797 if (face_voisins(f0, 0) == elem)
798 voisin = face_voisins(f0, 1);
806 for (
int ncomp = 0; ncomp < 2 * nb_compo_ - nb_faces_au_bord; ncomp++)
808 min_tri = nb_elem + 1;
812 for (
int ncomp_tri = 0; ncomp_tri < 2 * nb_compo_; ncomp_tri++)
814 f0 = elem_faces(elem, ncomp_tri);
817 voisin = face_voisins(f0, 0);
818 if (face_voisins(f0, 0) == elem)
819 voisin = face_voisins(f0, 1);
826 if (voisin != -1 && old_tri == -1)
828 dvar2 = pow((positions(elem, ori(f0)) - positions(voisin, ori(f0))), 2);
829 valeur_diag_naire(mat) += -fermeture.get_alphaMatrix()(j) / dvar2;
835 if (voisin > old_tri)
837 min_tri = std::min(min_tri, voisin);
838 if (min_tri == voisin)
839 dvarkeep = pow((positions(elem, ori(f0)) - positions(voisin, ori(f0))), 2);
844 if (old_tri < elem && min_tri > elem)
846 coeff(compt) = valeur_diag_naire(mat);
847 tab2(compt2) = nb_elem * (mat) + elem;
853 coeff(compt) = fermeture.get_alphaMatrix()(j) / dvarkeep;
854 tab2(compt2) = min_tri + nb_elem * (mat);
860 if (ncomp == 2 * nb_compo_ - nb_faces_au_bord - 1 && min_tri < elem)
862 coeff(compt) = valeur_diag_naire(mat);
863 tab2(compt2) = elem + (mat) * nb_elem;
892 tab1(compt1) = dimensionnement + 1;
895 if (compt != dimensionnement)
897 Cerr <<
"Erreur lors du calcul de la matrice du point fixe : nombre d'elements non nuls calcules different du nombre d'elements non nuls prevus" << finl;
903 Cerr <<
"Implicit mobility: the matrix A used in JFNK is not implemented." << finl;
904 matrice_diffusion_CH.
clean();
908 Cerr <<
"STOP: argument mobilite_explicite cannot be different than 0 or 1." << finl;
909 Cerr <<
"==> Must have an error in the code." << finl;
919 const Domaine_VDF& domaine_VDF = le_dom_VDF_.valeur();
927 const double theta = 0.6;
929 DoubleVect second_membre(2 * nb_elem_tot);
930 DoubleTab Ax1(2 * nb_elem_tot);
931 DoubleTab terme_non_lin(c);
935 for (
int n_elem = 0; n_elem < nb_elem; n_elem++)
936 x1_c(n_elem, j) = x1(n_elem + (j * nb_elem));
943 terme_non_lin = fermeture.call_dWdc_naire(x1_c);
946 for (
int n_elem = 0; n_elem < nb_elem; n_elem++)
948 second_membre(n_elem + (j * nb_elem)) = c(n_elem, j);
949 if (fermeture.get_type_potentiel_analytique() == 0)
950 terme_non_lin(n_elem, j) *= fermeture.get_betaMatrix()(j);
951 second_membre(nb_elem_tot + n_elem + (j * nb_elem)) = terme_non_lin(n_elem, j);
962 DoubleTab Ax1_c(nb_elem_tot);
963 DoubleTab Ax1_mutilde(nb_elem_tot);
964 for (
int n_elem = 0; n_elem < nb_elem_tot; n_elem++)
966 Ax1_c(n_elem) = Ax1(n_elem);
967 Ax1_mutilde(n_elem) = Ax1(n_elem + nb_elem_tot);
973 for (
int n_elem = 0; n_elem < nb_elem_tot; n_elem++)
975 Ax1(n_elem) = Ax1_c(n_elem);
976 Ax1(n_elem + nb_elem_tot) = Ax1_mutilde(n_elem);
982 for (
int n_elem = 0; n_elem < 2 * nb_elem_tot; n_elem++)
983 v0(n_elem) = (Ax1(n_elem) - second_membre(n_elem));
991 DoubleTab x1_mutilde(c);
992 DoubleTab div_alpha_gradC(c);
993 DoubleTab div_kappa_grad_mu(c);
998 for (
int n_elem = 0; n_elem < nb_elem; n_elem++)
999 x1_mutilde(n_elem, j) = x1(nb_elem_tot + n_elem + (j * nb_elem));
1003 if (fermeture.get_kappa_ind() == 0)
1005 for (
int i = 0; i < nb_elem; i++)
1007 kappa_Matrix_var(i, j) = fermeture.get_kappaMatrix()(j);
1011 kappa_Matrix_var = fermeture.call_kappa_func_c_naire(x1_c);
1017 Cerr <<
"La taille de mu = " << x1_mutilde.
dimension(0) <<
", " << x1_mutilde.
dimension(1) << finl;
1018 Cerr <<
"La taille de div_alpha = " << div_alpha_gradC.
dimension(0) <<
", " << div_alpha_gradC.
dimension(1) << finl;
1019 Cerr <<
"La taille de div_kappa = " << div_kappa_grad_mu.
dimension(0) <<
", " << div_kappa_grad_mu.
dimension(1) << finl;
1023 for (
int n_elem = 0; n_elem < nb_elem; n_elem++)
1025 indice_tot = n_elem + (j * nb_elem);
1029 Ax1(indice_tot) = x1_c(n_elem, j) - theta * dt * div_kappa_grad_mu(n_elem, j);
1030 Ax1(indice_tot + nb_elem_tot) = x1_mutilde(n_elem, j) + div_alpha_gradC(n_elem, j);
1035 for (
int n_elem = 0; n_elem < 2 * nb_elem_tot; n_elem++)
1036 v0(n_elem) = (Ax1(n_elem) - second_membre(n_elem));
1077 int i, j, nk, i0, im, it, ii;
1078 double tem = 1., res, ccos, ssin;
1080 const Domaine_VDF& domaine_VDF = le_dom_VDF_.valeur();
1090 for (
int nelem = 0; nelem < nb_elem; nelem++)
1092 x1(nelem + (ncomponent * nb_elem)) = c(nelem, ncomponent);
1093 x1(nelem + (ncomponent * nb_elem) + nb_elem_tot) = mutilde(nelem, ncomponent);
1097 DoubleTab v(ns,
nkr_);
1099 DoubleVect r(
nkr_ + 1);
1113 for (ii = 0; ii < c.
size(); ii++)
1114 res += v0(ii) * v0(ii);
1116 res += v0(ii) * v0(ii);
1128 Cout <<
"Source Concentration Phase Field - JFNK" << finl;
1129 Cout <<
"Stopping rule scalar : " <<
rtol_ << finl;
1142 for (j = 0; j <
nkr_; j++)
1144 for (ii = 0; ii < ns; ii++)
1152 for (i = 0; i <= j; i++)
1155 for (ii = 0; ii < c.
size(); ii++)
1156 h(i, j) += v0(ii) * v(ii, i);
1158 h(i, j) += v0(ii) * v(ii, i);
1162 h(i, j) =
mp_sum(h(i, j));
1164 for (ii = 0; ii < ns; ii++)
1165 v0(ii) -= h(i, j) * v(ii, i);
1174 for (ii = 0; ii < c.
size(); ii++)
1175 tem += v0(ii) * v0(ii);
1177 tem += v0(ii) * v0(ii);
1195 for (i = 0; i < nk; i++)
1198 tem = 1. / sqrt(h(i, i) * h(i, i) + h(im, i) * h(im, i));
1199 ccos = h(i, i) * tem;
1200 ssin = -h(im, i) * tem;
1201 for (j = i; j < nk; j++)
1204 h(i, j) = ccos * tem - ssin * h(im, j);
1205 h(im, j) = ssin * tem + ccos * h(im, j);
1207 r[im] = ssin * r[i];
1212 for (i = nk - 1; i >= 0; i--)
1215 for (i0 = i - 1; i0 >= 0; i0--)
1216 r[i0] -= h(i0, i) * r[i];
1218 for (i = 0; i < nk; i++)
1219 for (ii = 0; ii < ns; ii++)
1220 x1(ii) += r[i] * v(ii, i);
1228 for (ii = 0; ii < c.
size(); ii++)
1229 res += v0(ii) * v0(ii);
1231 res += v0(ii) * v0(ii);
1236 Cerr <<
" - At it = " << it <<
", residu scalar = " << res << finl;
1244 for (
int n_elem = 0; n_elem < nb_elem; n_elem++)
1246 c_demi(n_elem, ncomponent) = x1(n_elem + (ncomponent * nb_elem));
1247 mutilde_demi(n_elem, ncomponent) = x1(n_elem + nb_elem_tot + (ncomponent * nb_elem));
1251 Cerr <<
"Number of iterations to reach convergence : " << it + 1 << finl;
1263 for (
int n_elem = 0; n_elem < nb_elem; n_elem++)
1265 c_demi(n_elem, ncomponent) = x1(n_elem + (ncomponent * nb_elem));
1266 mutilde_demi(n_elem, ncomponent) = x1(n_elem + nb_elem_tot + (ncomponent * nb_elem));
1270 Cerr <<
"Stopped before convergence" << finl;
virtual void creer_tableau_elements(Array_base &, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT) const
creation d'un tableau parallele de valeurs aux elements.
int elem_faces(int i, int j) const
renvoie le numero de le ieme face de la maille num_elem la facon dont ces faces sont numerotees est
int face_voisins(int num_face, int i) const
renvoie l'element voisin de numface dans la direction i.