106 if (semi_impl.count(nom_inc))
return;
107 Matrice_Morse *mat[2] = { matrices.count(nom_inc) ? matrices.at(nom_inc) :
nullptr, matrices.count(o_nom_inc) ? matrices.at(o_nom_inc) :
nullptr };
113 DoubleTab Ai(ne_tot, 1);
114 IntVect polys(ne_tot);
115 for (
int e = 0; e < ne_tot; e++) polys(e) = e;
116 Ai_->valeur_aux_elems(dom.
xp(), polys, Ai);
118 const std::vector<std::map<mcIdType,double>>& interp =
equation().
probleme().
domaine().get_remapper(o_ech_->equation().probleme().domaine(),
true)->getCrudeMatrix();
124 for (
int e = 0; e < dom.
nb_elem(); e++)
128 for (
int n = 0; n < N; n++)
129 for (
int m = 0; m < N; m++)
130 sten[0].append_line(N * e + n, N * e + m);
132 for (
auto &&kv : interp[e])
134 for (
int o_e = (
int)kv.first, n = 0; n < N; n++)
135 for (
int m = 0; m < M; m++)
136 sten[1].append_line(N * e + n, M * o_e + m);
138 for (
int i = 0; i < 2; i++)
141 tableau_trier_retirer_doublons(sten[i]);
144 mat[i]->
nb_colonnes() ? *mat[i] += mat2 : *mat[i] = mat2;
153 &o_vals = semi_impl.count(o_nom_inc) ? semi_impl.at(o_nom_inc) : o_ech_->equation().inconnue().valeurs(), *pvals[2] = { &vals, &o_vals },
157 const int N[2] = { vals.
line_size(), o_vals.line_size() }, semi = int(semi_impl.count(nom_inc));
158 const int cL = lambda.dimension(0) == 1, o_cL = o_lambda.dimension(0) == 1;
159 Matrice_Morse *mat = !semi && matrices.count(nom_inc) ? matrices.at(nom_inc) :
nullptr, *o_mat = !semi && matrices.count(o_nom_inc) ? matrices.at(o_nom_inc) :
nullptr;
162 DoubleTrav Ai(ne_tot, 1), ep, o_ep, cond, o_cond, o_Ai(o_ne_tot, 1), v_e[2];
163 IntVect polys(ne_tot), o_polys(o_ne_tot);
164 for (
int e = 0; e < ne_tot; e++) polys(e) = e;
165 for (
int o_e = 0; o_e < o_ne_tot; o_e++) o_polys(o_e) = o_e;
166 Ai_->valeur_aux_elems(dom[0]->xp(), polys, Ai), o_ech_->Ai_->valeur_aux_elems(dom[1]->xp(), o_polys, o_Ai);
168 ep.
resize(ne_tot, 1),
ep_cond_->valeur_aux_elems(dom[0]->xp(), polys, ep);
169 if (o_ech_->ep_cond_)
170 o_ep.
resize(o_ne_tot, 1), o_ech_->ep_cond_->valeur_aux_elems(dom[1]->xp(), o_polys, o_ep);
172 cond.
resize(ne_tot, 1),
cond_->valeur_aux_elems(dom[0]->xp(), polys, cond);
174 o_cond.
resize(o_ne_tot, 1), o_ech_->cond_->valeur_aux_elems(dom[1]->xp(), o_polys, o_cond);
175 for (
int i = 0; i < 2; i++)
177 auto& flux = i ? o_ech_->flux_par_ : flux_par_;
180 v_e[i].
resize(0, D * N[i]);
188 const std::vector<std::map<mcIdType,double>>& interp =
equation().
probleme().
domaine().get_remapper(o_ech_->equation().probleme().domaine(),
true)->getCrudeMatrix();
191 for (
int e = 0; e < dom[0]->
nb_elem(); e++)
193 for (
auto &&kv : interp[e])
196 const int o_e = (int)kv.first;
205 double surf = std::min(Ai(e), o_Ai(o_e)) * kv.second, hf[2] = { 0, };
206 double invh = (ep.
size() ? ep(e) / (cond.
size() ? cond(e) : lambda(!cL * e, 0)) : 0) + (o_ep.
size() ? o_ep(o_e) / (o_cond.
size() ? o_cond(o_e) : o_lambda(!o_cL * o_e, 0)) : 0);
208 DoubleTrav f_h(2, std::max(N[0], N[1]));
209 for (
int i = 0; i < 2; i++)
211 auto& flux = i ? o_ech_->flux_par_ : flux_par_;
217 &lamb = ref_cast(
Fluide_base, pb[i]->milieu()).conductivite().passe(), &mu = ref_cast(
Fluide_base, pb[i]->milieu()).viscosite_dynamique().passe(),
219 int Clamb = lamb.
dimension(0) == 1, Cmu = mu.dimension(0) == 1, Crho = rho.dimension(0) == 1, Ccp = Cp.dimension(0) == 1, el = i ? o_e : e, nonlinear = 0;
223 DoubleTrav qpk(N[i]), dTf_qpk(N[i], N[i]), dTp_qpk(N[i]), qpi(N[i], N[i]), dTf_qpi(N[i], N[i], N[i]), dTp_qpi(N[i], N[i]), nv(N[i]);
224 in.
N = N[i], in.
D_h = dh(el), in.
D_ch = dh(el), in.
alpha = alpha ? &(*alpha)(el, 0) :
nullptr, in.
T = &(*pvals[i])(el, 0), in.
p = press(el), in.
v = nv.
addr();
225 in.
lambda = &lamb(!Clamb * el, 0), in.
mu = &mu(!Cmu * el, 0), in.
rho = &rho(!Crho * el, 0), in.
Cp = &Cp(!Ccp * el, 0), in.
Tp = 0;
227 for (
int d = 0; d < D; d++)
228 for (
int n = 0; n < N[i]; n++)
229 nv(n) += v_e[i](el, N[i] * d + n) * v_e[i](el, N[i] * d + n);
230 for (
int n = 0; n < N[0]; n++) nv(n) = sqrt(nv[n]);
236 for (
int n = 0; n < N[i]; n++) hf[i] += -dTf_qpk(n, n);
237 for (
int n = 0; n < N[i]; n++) f_h(i, n) = -dTf_qpk(n, n) / hf[i];
245 for (
int n = 0; n < N[0]; n++)
247 for (
int m = 0; m < N[0]; m++)
249 double fac = surf * f_h(0, n) * (hf[0] * (f_h(0, m) - (m == n)) - f_h(0, m) / invh);
250 secmem(e, n) += fac * vals(e, m),
bilan()(n) += fac * vals(e, m);
251 if (mat) (*mat)(N[0] * e + n, N[0] * e + m) -= fac;
253 for (
int m = 0; m < N[1]; m++)
255 double fac = surf / invh * f_h(0, n) * f_h(1, m);
256 secmem(e, n) += fac * o_vals(o_e, m),
bilan()(n) += fac * o_vals(o_e, m);
257 if (o_mat) (*o_mat)(N[0] * e + n, N[1] * o_e + m) -= fac;
virtual void creer_tableau_elements(Array_base &, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT) const
creation d'un tableau parallele de valeurs aux elements.
double xp(int num_elem, int k) const