105 Cerr <<
"[DG] Starting the pressure matrix assembly ... ";
106 statistics().begin_count(STD_COUNTERS::matrix_assembly,statistics().get_last_opened_counter_level()+1);
107 la_matrice.typer(
"Matrice_Morse");
115 const BasisFunction& bfunc = domaine.get_basisFunction(nordre);
116 const int nb_basis_func = bfunc.
nb_bfunc();
120 int nb_elem_tot = le_dom_dg_->nb_elem_tot();
121 int size_inc = indices_glob_elem(nb_elem_tot);
123 const Stencil& stencil_sorted = domaine.get_stencil_sorted();
124 const int nb_stencil_max = stencil_sorted.
dimension(1);
131 int row, col, indice;
134 for (
int nelem = 0; nelem < nb_elem_tot; nelem++)
137 for (
int k = 0; k < nb_stencil_max; k++)
139 if (stencil_sorted(nelem, k) < 0)
141 nb_indices_line += nb_basis_func;
143 for (
int k = 0; k < nb_basis_func; k++)
144 tab1(indices_glob_elem(nelem) + k + 1) = nb_indices_line + tab1(indices_glob_elem(nelem) + k);
149 for (
int nelem = 0; nelem < nb_elem_tot; nelem++)
151 row = tab1[indices_glob_elem(nelem)] - 1;
152 nb_indices_line = tab1[indices_glob_elem(nelem) + 1] - tab1[indices_glob_elem(nelem)];
154 for (
int k = 0; k < nb_stencil_max; k++)
156 if (stencil_sorted(nelem,k) < 0)
break;
157 col = indices_glob_elem(stencil_sorted(nelem,k))+1;
158 for (
int j=0; j<nb_basis_func; j++)
159 for (
int i=0; i<nb_basis_func; i++)
160 tab2[row+indice+j+nb_indices_line*i] = col+j;
161 indice += nb_basis_func;
174 DoubleTab divergence(nb_pts_integ_max);
176 for (
int e = 0; e < le_dom_dg_->nb_elem(); e++)
179 int ind_elem = indices_glob_elem(e);
180 for (
int i = 0; i < nb_basis_func; i++)
181 for (
int j = 0; j < nb_basis_func; j++)
186 divergence(k) += grad_fbase_elem(i,k,d) * grad_fbase_elem(j,k,d);
189 mat(ind_elem+i, ind_elem+j) += coeff;
194 const IntTab& face_voisins = domaine.face_voisins();
196 int premiere_face_int = domaine.premiere_face_int();
197 const DoubleTab& face_normales = domaine.face_normales();
201 DoubleTab product(nb_pts_int_fac);
202 DoubleTab scalar_product(nb_pts_int_fac);
204 DoubleTab fbase0(nb_basis_func, nb_pts_int_fac);
205 DoubleTab fbase1(nb_basis_func, nb_pts_int_fac);
210 for (
int f = premiere_face_int; f < domaine.nb_faces(); f++)
213 elem0 = face_voisins(f, 0);
214 elem1 = face_voisins(f, 1);
216 int ind_elem0 = indices_glob_elem(elem0);
217 int ind_elem1 = indices_glob_elem(elem1);
219 double sur_f = domaine.face_surfaces(f);
221 double h_T = sqrt(std::min(domaine.carre_pas_maille(elem0), domaine.carre_pas_maille(elem1)));
222 double invh_T = 1. / h_T;
227 for (
int i_elem = 0; i_elem < 2; i_elem++)
229 int elem = face_voisins(f, i_elem);
230 int ind_elem = indices_glob_elem(elem);
234 for (
int i = 0; i < nb_basis_func; i++)
235 for (
int j = 0; j < nb_basis_func; j++)
237 for (
int k = 0; k < nb_pts_int_fac; k++)
238 product(k) = fbase0(i, k) * fbase0(j, k);
241 mat(ind_elem + i, ind_elem + j) += coeff;
249 for (
int i = 0; i < nb_basis_func; i++)
250 for (
int j = 0; j < nb_basis_func; j++)
252 for (
int k = 0; k < nb_pts_int_fac; k++)
253 product(k) = fbase0(i, k) * fbase1(j, k);
256 coeff = eta_F(f) * invh_T *integral;
257 mat(ind_elem0 + i, ind_elem1 + j) -= coeff;
258 mat(ind_elem1 + j, ind_elem0 + i) -= coeff;
267 for (
int i = 0; i < nb_basis_func; i++)
270 for (
int k = 0; k < nb_pts_int_fac; k++)
272 scalar_product(k) += face_normales(f, d) / sur_f * grad_fbase0(i, k, d);
274 for (
int j = 0; j < nb_basis_func; j++)
276 for (
int k = 0; k < nb_pts_int_fac; k++)
277 product(k) = scalar_product(k) * fbase0(j, k);
280 mat(ind_elem0 + i, ind_elem0 + j) -= 0.5 *integral;
281 mat(ind_elem0 + j, ind_elem0 + i) -= 0.5 *integral;
284 for (
int j = 0; j < nb_basis_func; j++)
286 for (
int k = 0; k < nb_pts_int_fac; k++)
287 product(k) = scalar_product(k) * fbase1(j, k);
290 mat(ind_elem0 + i, ind_elem1 + j) += 0.5 *integral;
291 mat(ind_elem1 + j, ind_elem0 + i) += 0.5 *integral;
296 for (
int k = 0; k < nb_pts_int_fac; k++)
298 scalar_product(k) += face_normales(f, d) / sur_f * grad_fbase1(i, k, d);
300 for (
int j = 0; j < nb_basis_func; j++)
302 for (
int k = 0; k < nb_pts_int_fac; k++)
303 product(k) = scalar_product(k) * fbase1(j, k);
305 mat(ind_elem1 + i, ind_elem1 + j) += 0.5 *integral;
306 mat(ind_elem1 + j, ind_elem1 + i) += 0.5 *integral;
309 for (
int j = 0; j < nb_basis_func; j++)
311 for (
int k = 0; k < nb_pts_int_fac; k++)
312 product(k) = scalar_product(k) * fbase0(j, k);
315 mat(ind_elem1 + i, ind_elem0 + j) -= 0.5 *integral;
316 mat(ind_elem0 + j, ind_elem1 + i) -= 0.5 *integral;
322 for (
int f = 0; f < premiere_face_int; f++)
325 if ((ch.
fcl()(f, 0)==6)||(ch.
fcl()(f, 0)==7))
327 int elem = face_voisins(f, 0);
328 int ind_elem = indices_glob_elem(elem);
333 double h_T = sqrt(domaine.carre_pas_maille(elem));
334 double invh_T = 1. / h_T;
335 double sur_f = domaine.face_surfaces(f);
337 for (
int i = 0; i < nb_basis_func; i++)
340 for (
int k = 0; k < nb_pts_int_fac; k++)
342 scalar_product(k) += face_normales(f, d) / sur_f * grad_fbase0(i, k, d);
344 for (
int j = 0; j < nb_basis_func; j++)
346 for (
int k = 0; k < nb_pts_int_fac; k++)
347 product(k) = fbase0(i, k) * fbase0(j, k);
350 mat(ind_elem + i, ind_elem + j) += coeff;
352 for (
int k = 0; k < nb_pts_int_fac; k++)
353 product(k) = scalar_product(k) * fbase0(j, k);
356 mat(ind_elem + i, ind_elem + j) -= integral;
357 mat(ind_elem + j, ind_elem + i) -= integral;
364 Cerr << statistics().get_time_since_last_open(STD_COUNTERS::matrix_assembly) <<
" s" << finl;
365 statistics().end_count(STD_COUNTERS::matrix_assembly);