355 const std::string& nom_inco = op_elem_->equation().inconnue().le_nom().getString();
359 std::vector<Matrice_Morse*> mat(n_ext);
366 std::vector<std::reference_wrapper<const Domaine_PolyMAC_MPFA>> domaine;
367 std::vector<std::reference_wrapper<const Conds_lim>> cls;
368 std::vector<std::reference_wrapper<const IntTab>> fcl, e_f, f_e, f_s;
369 std::vector<std::reference_wrapper<const DoubleVect>> fs;
370 std::vector<std::reference_wrapper<const DoubleTab>> inco, nf, xp, xs, xv, diffu;
373 for (
int i = 0; i < n_ext; M = std::max(M, N[i]), i++)
375 std::string nom_mat = i ? nom_inco +
"/" + op_elem_->op_ext[i]->equation().probleme().le_nom().getString() : nom_inco;
377 mat[i] = !semi_impl.count(nom_inco) && matrices.count(nom_mat) ? matrices.at(nom_mat) :
nullptr;
379 domaine.push_back(std::ref(ref_cast(
Domaine_PolyMAC_MPFA, op_elem_->op_ext[i]->equation().domaine_dis())));
381 f_e.push_back(std::ref(domaine[i].get().face_voisins()));
382 e_f.push_back(std::ref(domaine[i].get().elem_faces()));
383 f_s.push_back(std::ref(domaine[i].get().face_sommets()));
385 fs.push_back(std::ref(domaine[i].get().face_surfaces()));
386 nf.push_back(std::ref(domaine[i].get().face_normales()));
388 xp.push_back(std::ref(domaine[i].get().xp()));
389 xv.push_back(std::ref(domaine[i].get().xv()));
390 xs.push_back(std::ref(domaine[i].get().domaine().coord_sommets()));
392 cls.push_back(std::ref(op_elem_->op_ext[i]->equation().domaine_Cl_dis().les_conditions_limites()));
396 const Champ_Inc_base& ch_inc = op_elem_->op_ext[i]->has_champ_inco() ? op_elem_->op_ext[i]->mon_inconnue() : op_elem_->op_ext[i]->
equation().
inconnue();
399 inco.push_back(std::ref(semi_impl.count(nom_mat) ? semi_impl.at(nom_mat) : ch.
valeurs()));
401 N.push_back(inco[i].get().line_size());
402 fcl.push_back(std::ref(ch.
fcl()));
408 DoubleTrav flux(N[0]);
410 for (
int f = 0; f < domaine0.
nb_faces(); f++)
414 for (
int i = op_elem_->tab_phif_d()(f); i < op_elem_->tab_phif_d()(f + 1); i++)
416 const int eb = op_elem_->tab_phif_e()(i);
421 for (
int n = 0; n < N[0]; n++)
422 flux(n) += op_elem_->tab_phif_c()(i, n) * fs[0](f) * inco[0](eb, n);
425 for (
int j = 0; j < 2; j++)
427 const int e = f_e[0](f, j);
430 if (e < domaine[0].get().nb_elem())
431 for (
int n = 0; n < N[0]; n++)
432 (*mat[0])(N[0] * e + n, N[0] * eb + n) += (j ? 1 : -1) * op_elem_->tab_phif_c()(i, n) * fs[0](f);
436 else if (fcl[0](fb, 0) == 1 || fcl[0](fb, 0) == 2)
438 for (
int n = 0; n < N[0]; n++)
439 flux(n) += (op_elem_->tab_phif_c()(i, n) ? op_elem_->tab_phif_c()(i, n) * fs[0](f) * ref_cast(
Echange_impose_base, cls[0].get()[fcl[0](fb, 1)].valeur()).T_ext(fcl[0](fb, 2), n) : 0);
441 else if (fcl[0](fb, 0) == 4)
443 for (
int n = 0; n < N[0]; n++)
444 flux(n) += (op_elem_->tab_phif_c()(i, n) ? op_elem_->tab_phif_c()(i, n) * fs[0](f) * ref_cast(
Neumann_paroi, cls[0].get()[fcl[0](fb, 1)].valeur()).flux_impose(fcl[0](fb, 2), n) : 0);
446 else if (fcl[0](fb, 0) == 6)
448 for (
int n = 0; n < N[0]; n++)
449 flux(n) += (op_elem_->tab_phif_c()(i, n) ? op_elem_->tab_phif_c()(i, n) * fs[0](f) * ref_cast(
Dirichlet, cls[0].get()[fcl[0](fb, 1)].valeur()).val_imp(fcl[0](fb, 2), n) : 0);
453 for (
int j = 0; j < 2; j++)
455 const int e = f_e[0](f, j);
458 if (e < domaine[0].get().nb_elem())
459 for (
int n = 0; n < N[0]; n++)
460 secmem(e, n) += (j ? -1 : 1) * flux(n);
464 for (
int n = 0; n < N[0]; n++)
465 op_elem_->flux_bords()(f, n) = flux(n);
471 DoubleTab *pqpi = op_elem_->equation().sources().size() &&
477 double i3[3][3] = { { 1, 0, 0 }, { 0, 1, 0 }, { 0, 0, 1 } }, eps = 1e-8, eps_g = 1e-6, fac[3];
479 std::vector<std::array<int, 2>> s_pe, s_pf;
480 std::map<std::array<int, 2>, std::array<int, 2>> m_pf;
481 std::vector<double> surf_fs, vol_es;
482 std::vector<std::array<std::array<double, 3>, 2>> vec_fs;
483 std::vector<std::vector<int>> se_f;
484 std::vector<int> type_f;
486 IntTrav i_efs, i_e, i_eq_flux, i_eq_cont, i_eq_pbm, piv(1);
492 DoubleTrav A, B, Ff, Fec, Qf, Qec, Tefs, C, X, Y, W(1), S, x_fs;
495 std::vector<DoubleTrav> Ts_tab(n_ext), Sigma_tab(n_ext), Lvap_tab(n_ext);
497 for (
int i = 0; i < n_ext; i++)
502 const int nbelem_tot = domaine[i].get().nb_elem_tot(), nb_max_sat = N[i] * (N[i] - 1) / 2;
504 if (op_elem_->op_ext[i]->equation().probleme().has_correlation(
"flux_parietal"))
506 Ts_tab[i].resize(nbelem_tot, nb_max_sat);
507 Sigma_tab[i].resize(nbelem_tot, nb_max_sat);
508 Lvap_tab[i].resize(nbelem_tot, nb_max_sat);
512 for (
int k = 0; k < N[i]; k++)
513 for (
int l = k + 1; l < N[i]; l++)
517 const int ind_trav = (k * (N[i] - 1) - (k - 1) * (k) / 2) + (l - k - 1);
528 for (
int ii = 0; ii < nbelem_tot; ii++)
530 Ts_tab[i](ii, ind_trav) = tsat(ii);
531 Sigma_tab[i](ii, ind_trav) = sig(ii);
534 z_sat.
Lvap(press.
get_span_tot() , Lvap_tab[i].get_span_tot(), nb_max_sat, ind_trav);
539 for (
int i_s = 0; i_s < op_elem_->tab_som_ext().dimension(0); i_s++)
541 const int s = op_elem_->tab_som_ext()(i_s);
543 if (s < domaine0.
nb_som())
549 for (
int i = som_ext_d(i_s, 0); i < som_ext_d(i_s + 1, 0); i++, n_e++)
550 s_pe.push_back( { { som_ext_pe(i, 0), som_ext_pe(i, 1) } });
554 for (
int i = som_ext_d(i_s, 1); i < som_ext_d(i_s + 1, 1); i++)
555 for (
int j = 0; j < 2; j++)
556 m_pf[ { { som_ext_pf(i, j ? 2 : 0), som_ext_pf(i, j ? 3 : 1) } }] = { { som_ext_pf(i, j ? 0 : 2), som_ext_pf(i, j ? 1 : 3) } };
562 se_f.resize(std::max(
int(se_f.size()), n_e));
564 for (
int i = 0; i < n_e; i++)
569 int sp = p ? s_dist[s].at(op_elem_->op_ext[p]) : s;
571 for (
int j = 0; j < e_f[p].get().dimension(1); j++)
573 const int f = e_f[p](e, j);
579 for ( ; k < f_s[p].get().dimension(1); k++)
582 if (sb < 0)
continue;
591 se_f[i].push_back(f);
594 std::array<int, 2> pf0 = { { p, f } };
595 std::array<int, 2> pf = m_pf.count(pf0) && m_pf[pf0] < pf0 ? m_pf[pf0] : pf0;
597 int l = (int) (std::lower_bound(s_pf.begin(), s_pf.end(), pf) - s_pf.begin());
599 if (l == (
int) s_pf.size() || s_pf[l] != pf)
601 s_pf.insert(s_pf.begin() + l, pf);
604 surf_fs.insert(surf_fs.begin() + l, fs[p](f) / 2);
605 vec_fs.insert(vec_fs.begin() + l, { { { xs[p](sp, 0) - xv[p](f, 0), xs[p](sp, 1) - xv[p](f, 1), 0 }, { 0, 0, 0 } } });
609 surf_fs.insert(surf_fs.begin() + l, 0);
610 vec_fs.insert(vec_fs.begin() + l, { { { 0, 0, 0 }, { 0, 0, 0 } } });
612 for (
int m = 0; m < 2; m++)
616 sb = f_s[p](f, m ? (k + 1 < f_s[p].get().dimension(1) && f_s[p](f, k + 1) >= 0 ? k + 1 : 0) : k - 1);
620 for (
int n = f_s[p].get().dimension(1) - 1; (sb = f_s[p](f, n)) == -1;)
624 auto v = domaine0.
cross(D, D, &xs[p](sp, 0), &xs[p](sb, 0), &xv[p](f, 0), &xv[p](f, 0));
626 surf_fs[l] += std::fabs(domaine0.
dot(&v[0], &nf[p](f, 0))) / fs[p](f) / 4;
628 for (
int d = 0; d < D; d++)
629 vec_fs[l][m][d] = (xs[p](sp, d) + xs[p](sb, d)) / 2 - xv[p](f, d);
636 int n_f = (int) s_pf.size();
639 for (
int i = 0; i < n_e; i++)
642 for (
int j = 0; j < (int) se_f[i].size(); j++)
644 std::array<int, 2> pf0 = { p, se_f[i][j] };
645 std::array<int, 2> pf = m_pf.count(pf0) && m_pf[pf0] < pf0 ? m_pf[pf0] : pf0;
647 se_f[i][j] = (int) (std::lower_bound(s_pf.begin(), s_pf.end(), pf) - s_pf.begin());
655 for (
int i = 0; i < n_e; vol_s += vol_es[i], i++)
661 for (
int j = 0; j < (int) se_f[i].size(); j++)
666 vol_es[i] += surf_fs[k] * std::fabs(domaine0.dot(&xp[p](e, 0), &nf[pb](f, 0), &xv[pb](f, 0))) / fs[pb](f) / D;
671 int mix = som_mix(i_s), Nm = mix ? 1 : N[s_pe[0][0]];
674 for (
int i = 0; i < n_e; i++)
675 n_ef = std::max(n_ef,
int(se_f[i].size()));
677 i_efs.resize(n_e, n_ef, 1 + M * mix);
681 for (
int i = 0; i < n_e; i++)
686 for (
int j = 0; j < (int) se_f[i].size(); j++)
689 for (
int n = 0; n < (mix ? N[p] : 1); n++, t_eq++)
690 i_efs(i, j, n) = t_eq;
693 int f = s_pf[k][0] == p && (e == f_e[p](s_pf[k][1], 0) || e == f_e[p](s_pf[k][1], 1)) ? s_pf[k][1] : m_pf.at(s_pf[k])[1];
697 && op_elem_->op_ext[p]->equation().probleme().has_correlation(
"flux_parietal")
698 && fcl[p](f, 0) && fcl[p](f, 0) != 5)
700 i_efs(i, j, M) = t_eq++;
705 i_e.resize(n_e, mix ? M : 1);
710 for (
int i = 0; i < n_e; i++)
714 for (
int n = 0; n < (mix ? N[p] : 1); n++, t_e++, t_ec++)
720 i_eq_flux.resize(n_f, mix ? M : 1);
722 i_eq_cont.resize(n_f, mix ? M : 1);
726 for (
int i = 0; i < n_f; i++)
729 int p2 = m_pf.count(s_pf[i]) ? m_pf[s_pf[i]][0] : p1;
730 int p12[2] = { p1, p2 };
731 int n12[2] = { N[p1], N[p2] };
734 type_f[i] = fcl[p1](f, 0);
736 if (type_f[i] && type_f[i] != 5)
737 for (
int j = 0; j < 2; j++)
740 && op_elem_->op_ext[p12[j]]->equation().probleme().has_correlation(
"flux_parietal"))
745 if (n12[0] != n12[1])
747 Cerr <<
"Op_Diff_PolyMAC_MPFA_Elem : incompatibility between " << op_elem_->op_ext[p1]->equation().probleme().le_nom() <<
748 " and " << op_elem_->op_ext[p2]->equation().probleme().le_nom() <<
" ( " << n12[0]
749 <<
" vs " << n12[1] <<
" components)!" << finl;
754 if (type_f[i] != 6 && type_f[i] != 7 && type_f[i] != 1 && type_f[i] != 2)
755 for (
int n = 0; n < (mix ? n12[0] : 1); n++)
762 if (type_f[i] != 4 && type_f[i] != 5)
763 for (
int n = 0; n < (mix ? n12[0] : 1); n++)
773 i_eq_pbm.resize(t_eq);
776 for (
int i = 0; i < n_e; i++)
780 for (
int j = 0; j < (int) se_f[i].size(); j++)
781 if (i_efs(i, j, M) >= 0)
782 for (
int n = 0; n < N[p]; n++)
784 i_eq_pbm(i_efs(i, j, n)) = k;
792 for (
int essai = 0; essai < 3; essai++)
797 const int nc = (D - 1) * n_f;
798 const int nl = D * (D - 1) / 2 * t_e;
799 const int n_m = std::max(nc, nl);
801 C.resize(Nm, nc, nl);
808 for (
int i = 0; i < n_e; i++)
813 for (
int d = 0; d < D; d++)
814 for (
int db = 0; db < d; db++, il += !mix)
815 for (
int n = 0; n < N[p]; n++, il += mix)
816 for (
int j = 0; j < (int) se_f[i].size(); j++)
819 const int f = (s_pf[k][0] == p) ? s_pf[k][1] : m_pf[s_pf[k]][1];
820 const int sgn = e == f_e[p](f, 0) ? 1 : -1;
822 for (
int l = 0; l < D; l++)
823 fac[l] = sgn * domaine0.nu_dot(&diffu[p].get(), e, n, &nf[p](f, 0), i3[l]) * surf_fs[k] / fs[p](f) / vol_es[i];
825 Y(!mix * n, il) += fac[d] * (xv[p](f, db) - xp[p](e, db)) - fac[db] * (xv[p](f, d) - xp[p](e, d));
827 for (
int l = 0; l < D - 1; l++)
828 C(!mix * n, (D - 1) * k + l, il) += fac[db] * vec_fs[k][l][d] - fac[d] * vec_fs[k][l][db];
834 int nw = -1, rk=-1, infoo=-1;
835 F77NAME(dgelsy)(&nl, &nc, &un, &C(0, 0, 0), &nl, &Y(0, 0), &n_m, &piv(0), &eps_g, &rk, &W(0), &nw, &infoo);
837 W.resize(nw = (
int) (std::lrint(W(0))));
840 for (
int n = 0; n < Nm; n++)
841 piv = 0, F77NAME(dgelsy)(&nl, &nc, &un, &C(n, 0, 0), &nl, &Y(n, 0), &n_m, &piv(0), &eps_g, &rk, &W(0), &nw, &infoo);
844 x_fs.resize(Nm, n_f, D);
845 for (
int n = 0; n < Nm; n++)
846 for (
int i = 0; i < n_f; i++)
851 for (
int d = 0; d < D; d++)
852 for (x_fs(n, i, d) = xv[p](f, d), k = 0; k < D - 1; k++)
853 x_fs(n, i, d) += std::min(std::max(Y(n, (D - 1) * i + k), 0.), 0.5) * vec_fs[i][k][d];
857 A.resize(Nm, t_eq, t_eq);
858 B.resize(Nm, t_ec = t_e + 1, t_eq);
859 Ff.resize(Nm, t_eq, t_eq);
860 Fec.resize(Nm, t_eq, t_ec);
864 Qf.resize(n_e, t_eq, M, M);
865 Qec.resize(n_e, t_ec, M, M);
869 Tefs.resize(Nm, t_eq);
871 for (
int i = 0; i < n_e; i++)
876 for (
int j = 0; j < (int) se_f[i].size(); j++)
878 for (
int n = 0; n < N[p]; n++)
879 Tefs(!mix * n, i_efs(i, j, mix * n)) = inco[p](e, n);
881 if (mix && i_efs(i, j, M) >= 0)
882 Tefs(0, i_efs(i, j, M)) = inco[p](e, 0);
889 for (
int it = 0; !cv && it < 100; it++)
898 for (
int i = 0; i < n_e; i++)
902 n_ef = (int) se_f[i].size();
904 C.resize(Nm, n_ef, D);
905 const int n_m = std::max(D, n_ef);
907 Y.resize(Nm, D, n_m);
908 X.resize(Nm, n_ef, D);
914 for (
int n = 0; n < Nm; n++)
915 for (
int j = 0; j < n_ef; j++)
918 const int pb = s_pf[k][0];
919 const int f = s_pf[k][1];
921 for (
int d = 0; d < D; d++)
922 C(n, j, d) = (essai ? x_fs(n, k, d) : xv[pb](f, d)) - xp[p](e, d);
927 for (
int n = 0; n < Nm; n++)
928 for (
int d = 0; d < D; d++)
931 int nw = -1, rk=-1, infoo=-1;
933 F77NAME(dgelsy)(&D, &n_ef, &D, &C(0, 0, 0), &D, &Y(0, 0, 0), &n_m, &piv(0), &eps_g, &rk, &W(0), &nw, &infoo);
935 nw = (int) (std::lrint(W(0)));
940 for (
int n = 0; n < Nm; n++)
943 F77NAME(dgelsy)(&D, &n_ef, &D, &C(n, 0, 0), &D, &Y(n, 0, 0), &n_m, &piv(0), &eps_g, &rk, &W(0), &nw, &infoo);
946 for (
int n = 0; n < Nm; n++)
947 for (
int j = 0; j < n_ef; j++)
948 for (
int d = 0; d < D; d++)
949 X(n, j, d) = Y(n, d, j);
953 for (
int n = 0; n < Nm; n++)
954 for (
int j = 0; j < n_ef; j++)
957 const int pb = s_pf[k][0];
958 const int f = s_pf[k][1];
959 const int sgn = (pb == p) && (e == f_e[p](f, 0)) ? 1 : -1;
961 for (
int d = 0; d < D; d++)
962 X(n, j, d) = surf_fs[k] / vol_es[i] * sgn * nf[pb](f, d) / fs[pb](f);
967 for (
int j = 0; j < n_ef; j++)
970 const int f = (s_pf[k][0] == p) &&
971 (e == f_e[p](s_pf[k][1], 0) || e == f_e[p](s_pf[k][1], 1)) ? s_pf[k][1] : m_pf[s_pf[k]][1];
973 const int sgn_l = (e == f_e[p](f, 0)) ? 1 : -1;
974 const int sgn = (p == s_pf[k][0]) && (f == s_pf[k][1]) ?
978 for (
int l = 0; l < n_ef; l++)
980 for (
int n = 0; n < N[p]; n++)
982 const double x = sgn_l * domaine0.nu_dot(&diffu[p].get(), e, n, &nf[p](f, 0), &X(!mix * n, l, 0)) / fs[p](f);
983 const double y = x * surf_fs[k];
986 Fec(!mix * n, i_efs(i, j, mix * n), t_e) += y * (Tefs(!mix * n, i_efs(i, l, mix * n)) - inco[p](e, n));
988 Ff(!mix * n, i_efs(i, j, mix * n), i_efs(i, l, mix * n)) += y;
990 Fec(!mix * n, i_efs(i, j, mix * n), i_e(i, mix * n)) -= y;
993 int i_eq = i_eq_flux(k, mix * n);
996 i_eq = i_eq_flux(k, 0);
1000 B(!mix * n, t_e, i_eq) += x * (Tefs(!mix * n, i_efs(i, l, mix * n)) - inco[p](e, n));
1002 A(!mix * n, i_efs(i, l, mix * n), i_eq) -= x;
1004 B(!mix * n, i_e(i, mix * n), i_eq) -= x;
1008 i_eq = i_eq_cont(k, mix * n);
1010 i_eq = i_eq_cont(k, 0);
1012 if (sgn > 0 && (type_f[k] && type_f[k] < 4) && (i_eq >= 0) )
1015 const double h = (type_f[k] == 3) ? -1 :
1016 ref_cast(
Echange_impose_base, cls[p].get()[fcl[p](f, 1)].valeur()).h_imp(fcl[p](f, 1), !mix || (i_eq == i_eq_cont(k, n)) ? n : 0);
1019 1. / std::max(h, 1e-10);
1021 B(!mix * n, t_e, i_eq) += invh * x * (Tefs(!mix * n, i_efs(i, l, mix * n)) - inco[p](e, n));
1023 A(!mix * n, i_efs(i, l, mix * n), i_eq) -= invh * x;
1025 B(!mix * n, i_e(i, mix * n), i_eq) -= invh * x;
1032 i_eq = i_eq_pbm(i_efs(i, j, mix * n));
1035 B(!mix * n, t_e, i_eq) += x * (Tefs(!mix * n, i_efs(i, l, mix * n)) - inco[p](e, n));
1037 A(!mix * n, i_efs(i, l, mix * n), i_eq) -= x;
1039 B(!mix * n, i_e(i, mix * n), i_eq) -= x;
1046 if (mix && i_efs(i, j, M) >= 0)
1049 int i_eq = i_eq_cont(k, 0);
1053 B(0, t_e, i_eq) += sgn * Tefs(0, i_efs(i, j, M));
1055 A(0, i_efs(i, j, M), i_eq) -= sgn;
1062 const DoubleTab *alpha = sub_type(
Pb_Multiphase, pbp) ? &ref_cast(
Pb_Multiphase, pbp).equation_masse().inconnue().passe() :
nullptr;
1073 const int Clambda = (lambda.dimension(0) == 1), Cmu = (mu.dimension(0) == 1),
1074 Crho = (rho.dimension(0) == 1), Ccp = (Cp.dimension(0) == 1);
1079 DoubleTrav Tf(N[p]), qpk(N[p]), dTf_qpk(N[p], N[p]),
1080 dTp_qpk(N[p]), qpi(N[p], N[p]), dTf_qpi(N[p], N[p], N[p]),
1081 dTp_qpi(N[p], N[p]), nv(N[p]), d_nuc(N[p]);
1087 in.
y = (e == f_e[p](f, 0)) ? domaine[p].get().dist_face_elem0(f, e) : domaine[p].get().dist_face_elem1(f, e);
1090 in.
alpha = alpha ? &(*alpha)(e, 0) : nullptr;
1094 in.
Tp = Tefs(0, i_efs(i, j, M));
1095 in.
lambda = &lambda(!Clambda * e, 0);
1096 in.
mu = &mu(!Cmu * e, 0);
1097 in.
rho = &rho(!Crho * e, 0);
1098 in.
Cp = &Cp(!Ccp * e, 0);
1102 in.
Lvap = &Lvap_tab[p](e, 0);
1103 in.
Sigma = &Sigma_tab[p](e, 0);
1104 in.
Tsat = &Ts_tab[p](e, 0);
1123 for (
int d = 0; d < D; d++)
1124 for (
int n = 0; n < N[p]; n++)
1125 nv(n) += std::pow(vit(domaine[p].get().nb_faces_tot() + D * e + d, n), 2);
1127 for (
int n = 0; n < N[p]; n++)
1129 nv(n) = sqrt(nv(n));
1130 Tf(n) = corr.
T_at_wall() ? Tefs(0, i_efs(i, j, n)) : inco[p](e, n);
1137 for (
int n = 0; n < N[p]; n++)
1139 i_eq = i_eq_pbm(i_efs(i, j, n));
1141 B(0, t_e, i_eq) -= qpk(n);
1143 A(0, i_efs(i, j, M), i_eq) += dTp_qpk(n);
1145 for (
int m = 0; corr.
T_at_wall() && m < N[p]; m++)
1146 A(0, i_efs(i, j, m), i_eq) += dTf_qpk(n, m);
1150 i_eq = i_eq_flux(k, 0);
1152 for (
int k1 = 0; k1 < N[p]; k1++)
1153 for (
int k2 = k1 + 1; k2 < N[p]; k2++)
1155 B(0, t_e, i_eq) += qpi(k1, k2);
1157 A(0, i_efs(i, j, M), i_eq) -= dTp_qpi(k1, k2);
1159 for (
int n = 0; corr.
T_at_wall() && n < N[p]; n++)
1160 A(0, i_efs(i, j, n), i_eq) -= dTf_qpi(k1, k2, n);
1163 for (
int k1 = 0; k1 < N[p]; k1++)
1164 for (
int k2 = k1 + 1; k2 < N[p]; k2++)
1166 Qec(i, t_e, k1, k2) += surf_fs[k] * qpi(k1, k2);
1168 Qf(i, i_efs(i, j, M), k1, k2) += surf_fs[k] * dTp_qpi(k1, k2);
1170 for (
int m = 0; corr.
T_at_wall() && m < N[p]; m++)
1171 Qf(i, i_efs(i, j, m), k1, k2) += surf_fs[k] * dTf_qpi(k1, k2, m);
1174 if (d_nuc_.dimension(0) && !d_nuc_a_jour_)
1175 for (
int k1 = 0; k1 < N[p]; k1++)
1176 d_nuc_(e, k1) += d_nuc(k1), d_nuc_a_jour_ = 1;
1180 for (
int n = 0; n < N[p]; n++)
1182 const int i_eq = i_eq_cont(k, mix * n);
1185 B(!mix * n, t_e, i_eq) += sgn * Tefs(!mix * n, i_efs(i, j, mix * n));
1187 A(!mix * n, i_efs(i, j, mix * n), i_eq) -= sgn;
1193 if (type_f[k] == 1 || type_f[k] == 2)
1194 for (
int n = 0; n < N[p]; n++)
1196 const int i_eq = i_eq_cont(k, mix * n);
1198 B(!mix * n, t_e, i_eq) -= ref_cast(
Echange_impose_base, cls[p].get()[fcl[p](f, 1)].valeur()).T_ext(fcl[p](f, 2), n);
1202 for (
int n = 0; n < N[p]; n++)
1204 const int i_eq = i_eq_cont(k, mix * n);
1206 B(!mix * n, t_e, i_eq) -= ref_cast(
Dirichlet, cls[p].get()[fcl[p](f, 1)].valeur()).val_imp(fcl[p](f, 2), n);
1210 for (
int n = 0; n < N[p]; n++)
1212 const int i_eq = i_eq_flux(k, mix * n);
1214 B(!mix * n, t_e, i_eq) -= ref_cast(
Neumann, cls[p].get()[fcl[p](f, 1)].valeur()).flux_impose(fcl[p](f, 2), n);
1219 int nw = -1, rk=-1, infoo=-1;
1221 F77NAME(dgelsy)(&t_eq, &t_eq, &t_ec, &A(0, 0, 0), &t_eq, &B(0, 0, 0), &t_eq, &piv(0), &eps, &rk, &W(0), &nw, &infoo);
1225 nw = (int) (std::lrint(W(0)));
1228 for (
int n = 0; n < Nm; n++)
1231 F77NAME(dgelsy)(&t_eq, &t_eq, &t_ec, &A(n, 0, 0), &t_eq, &B(n, 0, 0), &t_eq, &piv(0), &eps, &rk, &W(0), &nw, &infoo);
1235 for (
int n = 0; n < Nm; n++)
1238 for (
int i = 0; i < t_eq; i++)
1240 Tefs(n, i) += B(n, t_e, i);
1241 cv &= !nonlinear || std::fabs(B(n, t_e, i)) < 1e-3;
1246 if (!cv && essai < 2)
1250 Cerr <<
"non-convergence des T_efs!" << finl;
1255 for (
int n = 0; n < Nm; n++)
1256 for (
int i = 0; i < t_eq; i++)
1257 for (
int j = 0; j < t_ec; j++)
1258 for (k = 0; k < t_eq; k++)
1259 Fec(n, i, j) += Ff(n, i, k) * B(n, j, k);
1262 for (
int i = 0; i < n_e; i++)
1263 for (
int j = 0; j < t_ec; j++)
1264 for (k = 0; k < t_eq; k++)
1265 for (
int k1 = 0; k1 < M; k1++)
1266 for (
int k2 = k1 + 1; k2 < M; k2++)
1267 Qec(i, j, k1, k2) += Qf(i, k, k1, k2) * B(0, j, k);
1273 A.resize(Nm, t_e, t_e);
1276 for (
int m = 0; m < Nm; m++)
1277 for (
int i = 0; i < n_e; i++)
1279 const int p = s_pe[i][0];
1281 for (
int j = 0; j < (int) se_f[i].size(); j++)
1282 for (
int n = 0; n < (mix ? N[p] : 1); n++)
1283 for (
int l = 0; l < t_e; l++)
1284 A(m, i_e(i, n), l) -= Fec(m, i_efs(i, j, n), l);
1289 for (
int n = 0; n < Nm; n++)
1290 for (
int i = 0; i < t_e; i++)
1291 for (
int j = 0; j <= i; j++)
1293 A(n, i, j) = A(n, j, i) = (A(n, i, j) + A(n, j, i)) / 2.;
1297 int nw = -1, infoo=-1;
1298 F77NAME(DSYEV)(
"N",
"U", &t_e, &A(0, 0, 0), &t_e, S.addr(), &W(0), &nw, &infoo);
1300 nw = (int) (std::lrint(W(0)));
1305 for (
int n = 0; n < Nm; n++)
1306 F77NAME(DSYEV)(
"N",
"U", &t_e, &A(n, 0, 0), &t_e, &S(0), &W(0), &nw, &infoo), cv &= S(0) > -1e-8 * vol_s;
1313 for (
int i = 0; i < n_e; i++)
1315 const int e = s_pe[i][1];
1317 if ((s_pe[i][0] == 0) && (e < domaine[0].get().nb_elem()))
1318 for (
int j = 0; j < (int) se_f[i].size(); j++)
1321 const int f = s_pf[k][0] ? m_pf[s_pf[k]][1] : s_pf[k][1];
1323 for (
int n = 0; n < N[0]; n++)
1325 secmem(e, n) += Fec(!mix * n, i_efs(i, j, mix * n), t_e);
1327 if (f < domaine0.premiere_face_int())
1328 op_elem_->flux_bords()(f, n) += Fec(!mix * n, i_efs(i, j, mix * n), t_e);
1330 for (k = 0; k < n_e; k++)
1332 const int p = s_pe[k][0];
1336 const int eb = s_pe[k][1];
1338 for (
int m = (mix ? 0 : n); m < (mix ? N[p] : n + 1); m++)
1339 (*mat[p])(N[0] * e + n, N[p] * eb + m) -= Fec(!mix * n, i_efs(i, j, mix * n), i_e(k, mix * m));
1348 for (
int i = 0; i < n_e; i++)
1349 if (s_pe[i][0] == 0)
1351 const int e = s_pe[i][1];
1353 for (
int k1 = 0; k1 < N[0]; k1++)
1354 for (
int k2 = k1 + 1; k2 < N[0]; k2++)
1355 (*pqpi)(e, k1, k2) += Qec(i, t_e, k1, k2);
1361 (*pqpi).echange_espace_virtuel();