33 const Conds_lim& cls = iter_->domaine_Cl().les_conditions_limites();
34 const IntTab& f_e = domaine.face_voisins(), &e_f = domaine.elem_faces(), &fcl = ch.
fcl();
35 const DoubleTab& vit = ch.
passe(), &vfd = domaine.volumes_entrelaces_dir();
42 const DoubleTab& inco = semi_impl.count(nom_inco) ? semi_impl.at(nom_inco) : ch.
valeurs(),
46 Matrice_Morse *mat = matrices.count(nom_inco) && !semi_impl.count(nom_inco) ? matrices.at(nom_inco) :
nullptr;
48 int i, j, k, e = -100, eb, f, fb, fd, m, n, N = inco.
line_size(), d, D =
dimension, comp = !
incompressible_;
50 DoubleTrav dfac(2, N, N), masse(N, N);
51 for (f = 0; f < domaine.nb_faces_tot(); f++)
53 const bool is_interne = (f_e(f, 0) >= 0 && f_e(f, 1) >= 0);
54 const bool is_bord = ((f_e(f, 0) >= 0 && f_e(f, 1) < 0) || (f_e(f, 0) < 0 && f_e(f, 1) >= 0));
55 const bool is_neum_or_diric = (fcl(f, 0) == 1 || fcl(f, 0) == 3);
57 if (is_interne || (is_bord && is_neum_or_diric))
62 for (i = 1, dfac = 0; i >= 0; i--)
65 for (masse = 0, e = f_e(f, f_e(f, i) >= 0 ? i : !i), n = 0; n < N; n++)
66 masse(n, n) = a_r ? (*a_r)(e, n) : 1;
70 corr->
ajouter(&(*alp)(e, 0), &rho(e, 0), masse);
73 for (n = 0; n < N; n++)
77 for (m = 0; m < N; m++)
79 const int ind = fcl(f, 0) == 1 ? 0 : i;
80 const int ind_por = eb >= 0 ? eb : f_e(f, f_e(f, i) >= 0 ? i : !i);
81 double dd = (vit(f, m) * (i ? -1 : 1) >= 0 ? 1. : vit(f, m) ? -1. : 0.);
83 dfac(ind, n, m) += fs(f) * vit(f, m) * pe(ind_por) * masse(n, m) * (1. + dd) / 2;
90 for (i = 0, dfac = 0; i < 2; i++)
93 for (masse = 0, e = f_e(f, f_e(f, i) >= 0 ? i : !i), n = 0; n < N; n++)
94 masse(n, n) = a_r ? (*a_r)(e, n) : 1;
98 corr->
ajouter(&(*alp)(e, 0), &rho(e, 0), masse);
101 for (n = 0; n < N; n++)
105 for (m = 0; m < N; m++)
107 const int ind = fcl(f, 0) == 1 ? (f_e(f, 0) >= 0 ? 0 : 1) : i;
108 const int ind_por = eb >= 0 ? eb : f_e(f, f_e(f, i) >= 0 ? i : !i);
109 double dd = (vit(f, m) * (i ? -1 : 1) >= 0 ? 1. : vit(f, m) ? -1. : 0.);
111 dfac(ind, n, m) += fs(f) * vit(f, m) * pe(ind_por) * masse(n, m) * (1. + dd) / 2;
118 for (i = 0; i < 2; i++)
119 if ((e = f_e(f, i)) >= 0)
121 for (k = 0; k < e_f.dimension(1); k++)
124 if (fb >= 0 && (domaine.orientation(fb) == domaine.orientation(f)))
125 if (fb < domaine.nb_faces())
126 if (f_e(f, i == 0 ? 1 : 0) < 0 || (f_e(f, 0) >= 0 && f_e(f, 1) >= 0))
129 for (j = 1; j >= 0; j--)
131 eb = f_e(f, j), fd = (j == i ? fb : domaine.face_amont_princ(fb, j) );
133 for (n = 0; n < N; n++)
134 for (m = 0; m < N; m++)
138 double fac = (i ? -1 : 1) * vfd(fb, e != f_e(fb, 0)) * dfac(!j, n, m) / ve(e);
142 secmem(fb, n) -= fac * inco(fd, m);
145 for (d = 0; d < D; d++)
147 if (sub_type(
Dirichlet, cls[fcl(f, 1)].valeur()))
155 secmem(fb, n) += fac * inco(fb, m);
161 (*mat)(N * fb + n, N * fd + m) += fac;
163 (*mat)(N * fb + n, N * fb + m) -= fac;
168 for (j = 0; j < 2; j++)
170 eb = f_e(f, j), fd = (j == i ? fb : domaine.face_amont_princ(fb, j) );
172 for (n = 0; n < N; n++)
173 for (m = 0; m < N; m++)
177 double fac = (i ? -1 : 1) * vfd(fb, e != f_e(fb, 0)) * dfac(j, n, m) / ve(e);
181 secmem(fb, n) -= fac * inco(fd, m);
184 for (d = 0; d < D; d++)
186 if (sub_type(
Dirichlet, cls[fcl(f, 1)].valeur()))
194 secmem(fb, n) += fac * inco(fb, m);
200 (*mat)(N * fb + n, N * fd + m) += fac;
202 (*mat)(N * fb + n, N * fb + m) -= fac;