45 Cerr <<
"Assemblage de la matrice de pression ... " ;
46 statistics().begin_count(STD_COUNTERS::matrix_assembly,statistics().get_last_opened_counter_level()+1);
47 la_matrice.typer(
"Matrice_Morse");
52 const IntTab& e_f = domaine.elem_faces(), &fcl = ch.
fcl();
54 int i, j, e, f, fb, ne = domaine.nb_elem(), ne_tot = domaine.nb_elem_tot(), nf = domaine.nb_faces(), nf_tot = domaine.nb_faces_tot();
62 Stencil stencil(0, 2);
64 for (e = 0; e < ne; e++)
67 for (e = 0; e < ne_tot; e++)
68 for (domaine.W2(
nullptr, e, w2), i = 0; i < w2.
dimension(1); i++)
69 if (fcl(f = e_f(e, i), 0) == 1 && f < nf) stencil.
append_line(ne_tot + f, ne_tot + f);
72 if (w2(i, j, 0)) stencil.
append_line(ne_tot + f, ne_tot + e_f(e, j));
74 tableau_trier_retirer_doublons(stencil);
88 for (e = 0; e < ne_tot; e++)
90 domaine.W2(
nullptr, e, w2);
91 double m_ee = 0, m_fe, m_ef, coeff;
92 for (i = 0; i < w2.
dimension(0); i++, m_ee += m_ef)
94 f = e_f(e, i), coeff = diag.
size_totale() ? pf(f) * vf(f) / diag(f) : 1;
95 for (m_ef = 0, m_fe = 0, j = 0; j < w2.
dimension(1); j++)
99 if (f < domaine.nb_faces() && fcl(f, 0) != 1) mat(ne_tot + f, ne_tot + fb) += coeff * pe(e) * w2(i, j, 0);
100 else if (f < domaine.nb_faces() && i == j) mat(ne_tot + f, ne_tot + fb) = 1;
101 m_ef += coeff * pe(e) * w2(i, j, 0), m_fe += coeff * pe(e) * w2(i, j, 0);
103 if (e < domaine.nb_elem()) mat(e, ne_tot + f) -= m_ef;
104 if (f < domaine.nb_faces() && fcl(f, 0) != 1) mat(ne_tot + f, e) -= m_fe;
106 if (e < domaine.nb_elem()) mat(e, e) += m_ee;
111 for (
int n_bord=0; n_bord<le_dom_PolyMAC_CDO->nb_front_Cl(); n_bord++)
112 if (sub_type(
Neumann_sortie_libre, le_dom_Cl_PolyMAC_CDO->les_conditions_limites(n_bord).valeur()) )
115 Cerr << statistics().get_time_since_last_open(STD_COUNTERS::matrix_assembly) <<
" s" << finl;
116 statistics().end_count(STD_COUNTERS::matrix_assembly);
125 ne_tot = domaine.nb_elem_tot(), nf_tot = domaine.nb_faces_tot();
126 const IntTab& fcl = ref_cast(
Champ_Face_PolyMAC_HFV, mon_equation->inconnue()).fcl(), &e_f = domaine.elem_faces();
127 Stencil sten_a(0, 2), sten_p(0, 2), sten_v(0, 2);
132 for (e = 0; e < domaine.nb_elem(); e++)
133 for (n = 0; n < N; n++) sten_a.append_line(e, N * e + n);
135 for (e = 0; e < domaine.nb_elem_tot(); e++)
136 for (domaine.W2(
nullptr, e, w2), i = 0; i < w2.
dimension(0); i++)
137 if ((f = e_f(e, i)) >= domaine.nb_faces())
continue;
139 for (sten_p.append_line(!aux_only * ne_tot + f, e), j = 0; j < w2.
dimension(1); j++)
141 if (w2(i, j, 0) && fcl(fb = e_f(e, j), 0) != 1)
142 for (m = 0; m < M; m++)
143 sten_p.append_line(M * (!aux_only * ne_tot + f) + m, M * (ne_tot + fb) + m);
145 else if (fcl(f, 0) == 1)
146 for (m = 0; m < M; m++) sten_p.append_line(M * (!aux_only * ne_tot + f) + m, M * (ne_tot + f) + m);
147 else for (n = 0, m = 0; n < N; n++, m += (M > 1)) sten_v.
append_line(M * (!aux_only * ne_tot + f) + m, N * f + n);
149 tableau_trier_retirer_doublons(sten_v), tableau_trier_retirer_doublons(sten_p);
159 const Conds_lim& cls = le_dom_Cl_PolyMAC_CDO->les_conditions_limites();
162 const IntTab& fcl = ref_cast(
Champ_Face_PolyMAC_HFV, mon_equation->inconnue()).fcl(), &e_f = domaine.elem_faces();
163 const DoubleVect& ve = domaine.volumes(), &pe =
equation().
milieu().
porosite_elem(), &fs = domaine.face_surfaces(), &vf = domaine.volumes_entrelaces();
164 int i, j, e, f, fb, n, N = vit.
line_size(), m, M = press.line_size(), ne_tot = domaine.nb_elem_tot(), d, D =
dimension;
165 Matrice_Morse *mat_a = alpha ? matrices.at(
"alpha") :
nullptr, &mat_p = *matrices.at(
"pression"), &mat_v = *matrices.at(
"vitesse");
166 DoubleTrav w2, fac(N);
174 for (e = 0; e < domaine.nb_elem(); e++)
175 for (secmem(e) = -pe(e) * ve(e), n = 0; n < N; n++) secmem(e) += pe(e) * ve(e) * (*alpha)(e, n);
178 for (e = 0; e < domaine.nb_elem(); e++)
179 for (n = 0; n < N; n++) (*mat_a)(e, N * e + n) = -pe(e) * ve(e);
182 for (mat_p.get_set_coeff() = 0, mat_v.get_set_coeff() = 0, e = 0; e < ne_tot; e++)
183 for (domaine.W2(
nullptr, e, w2), i = 0; i < w2.
dimension(0); i++)
184 if ((f = e_f(e, i)) >= domaine.nb_faces())
continue;
187 for (acc = 0, j = 0; j < w2.
dimension(1); acc+= pe(e) * vf(f) * w2(i, j, 0), j++)
188 for (m = 0; m < M; m++)
189 secmem(!aux_only * ne_tot + f, m) -= pe(e) * vf(f) * w2(i, j, 0) * (press(ne_tot + e_f(e, j), m) - press(e, m));
190 for (m = 0; m < M; m++) mat_p(M * (!aux_only * ne_tot + f) + m, M * e + m) -= acc;
192 if (w2(i, j, 0) && fcl(fb = e_f(e, j), 0) != 1)
193 for (m = 0; m <M; m++)
194 mat_p(M * (!aux_only * ne_tot + f) + m, M * (ne_tot + fb) + m) += pe(e) * vf(f) * w2(i, j, 0);
196 else if (fcl(f, 0) == 1)
198 for (m = 0; m < M; m++) secmem(M * (!aux_only * ne_tot + f) + m) = fs(f) * (ref_cast(
Neumann, cls[fcl(f, 1)].valeur()).flux_impose(fcl(f, 2), m) - press(ne_tot + f, m));
199 for (m = 0; m < M; m++) mat_p(M * (!aux_only * ne_tot + f) + m, M * (ne_tot + f) + m) = fs(f);
205 for (ar_tot = 0, n = 0; n < N; n++) ar_tot += (*alpha_rho)(e, n);
206 for (n = 0; n < N; n++) fac(n) = (*alpha_rho)(e, n) / ar_tot;
208 else if (M != N)
abort();
210 for (n = 0, m = 0; n < N; n++, m += (M > 1)) secmem(!aux_only * ne_tot + f, m) += vf(f) * fac(n) * vit(f, n);
212 for (d = 0; d < D; d++)
213 for (n = 0, m = 0; n < N; n++, m += (M > 1))
214 secmem(!aux_only * ne_tot + f, m) -= vf(f) * fac(n) * nf(f, d) / fs(f) * ref_cast(
Dirichlet, cls[fcl(f, 1)].valeur()).val_imp(fcl(f, 2), N * d + n);
215 for (n = 0, m = 0; n < N; n++, m += (M > 1)) mat_v(M * (!aux_only * ne_tot + f) + m, N * f + n) -= vf(f) * fac(n);