16#include <BasisFunction.h>
17#include <TRUSTTab_parts.h>
18#include <Matrix_tools.h>
19#include <Array_tools.h>
42 int nb_elem_tot = dom_->nb_elem_tot();
45 for (
int e = 0; e < nb_elem_tot; e++)
72 int nb_elem_tot = dom_->nb_elem_tot();
74 int current_indice = 0;
75 for (
int e = 0; e < nb_elem_tot; e++)
79 indice.
append_line( current_indice+i, current_indice+j);
85 tableau_trier_retirer_doublons(indice);
101 const DoubleVect& ve = domaine.volumes();
102 int current_indice = 0;
106 DoubleTab fbase(
nb_bfunc_, nb_pts_integ_max);
108 for (
int e = 0; e < domaine.nb_elem_tot(); e++)
110 int nb_pts_integ = tab_pts_integ(e);
113 gramSchmidt(fbase, quad, e, current_indice, nb_pts_integ, ve(e), 0);
146 DoubleTab product(nb_pts_integ);
149 for (
int j = 0; j < index; ++j)
151 for (
int k = 0; k < nb_pts_integ ; k++)
152 product(k) = fbase(index, k) * fbase(j, k);
156 for (
int k = 0; k < nb_pts_integ ; k++)
157 product(k) = fbase(j, k) * fbase(j, k);
161 double projection = numerateur / denominateur;
163 for (
int k = 0; k < nb_pts_integ ; k++)
164 fbase(index,k) -= projection * fbase(j,k);
165 for (
int l = 0; l < j+1; l++)
170 for (
int k = 0; k < nb_pts_integ ; k++)
171 product(k) = fbase(index, k) * fbase(index, k);
173 for (
int j = 0; j < index+1 ; j++)
175 for (
int k = 0; k < nb_pts_integ ; k++)
176 fbase(index, k) /= sqrt(norm);
179 gramSchmidt(fbase, quad, num_elem, current_indice, nb_pts_integ, volume, index + 1);
193 DoubleTab fbase(
nb_bfunc_, nb_pts_integ_max);
194 DoubleTab product(nb_pts_integ_max);
203 for (
int k = 0; k < tab_pts_integ(nelem) ; k++)
204 product(k) = fbase(i, k) * fbase(j, k);
234 const DoubleTab& xp = domaine.xp();
238 double invh = 1./sqrt(domaine.carre_pas_maille(nelem));
243 if (
order_ == 0)
continue;
245 fbasis(1, pt) = (integ_points(quad.
ind_pts_integ(nelem) + pt, 0) - xp(nelem,0))*invh;
246 fbasis(2, pt) = (integ_points(quad.
ind_pts_integ(nelem) + pt, 1) - xp(nelem,1))*invh;
248 if (
order_ == 1)
continue;
249 fbasis(3, pt) = (integ_points(quad.
ind_pts_integ(nelem) + pt, 0) - xp(nelem,0))*invh*(integ_points(quad.
ind_pts_integ(nelem) + pt, 1) - xp(nelem,1))*invh;
250 fbasis(4, pt) = (integ_points(quad.
ind_pts_integ(nelem) + pt, 0) - xp(nelem,0))*invh*(integ_points(quad.
ind_pts_integ(nelem) + pt, 0) - xp(nelem,0))*invh;
251 fbasis(5, pt) = (integ_points(quad.
ind_pts_integ(nelem) + pt, 1) - xp(nelem,1))*invh*(integ_points(quad.
ind_pts_integ(nelem) + pt, 1) - xp(nelem,1))*invh;
252 if (
order_ == 2)
continue;
285 for (
int k = 0; k < nb_pts_integ; k++)
290 for (
int j=0; j<i+1; j++)
292 fbasis(i,k) = multvect;
294 else if (fbasis.
nb_dim() == 3)
299 for (
int j=0; j<i+1; j++)
301 fbasis(i,k,l) = multvect;
327 const DoubleTab& xp = domaine.xp();
334 double invh = 1./sqrt(domaine.carre_pas_maille(nelem));
336 for (
int pt = 0; pt < nb_points; pt++)
339 if (
order_ == 0)
continue;
341 fbasis(1, pt) = (coords(pt, 0) - xp(nelem,0))*invh;
342 fbasis(2, pt) = (coords(pt, 1) - xp(nelem,1))*invh;
344 if (
order_ == 1)
continue;
346 fbasis(3, pt) = (coords(pt, 0) - xp(nelem,0))*invh*(coords(pt, 1) - xp(nelem,1))*invh;
347 fbasis(4, pt) = (coords(pt, 0) - xp(nelem,0))*invh*(coords(pt, 0) - xp(nelem,0))*invh;
348 fbasis(5, pt) = (coords(pt, 1) - xp(nelem,1))*invh*(coords(pt, 1) - xp(nelem,1))*invh;
350 if (
order_ == 2)
continue;
372 int nb_pts_integ_max = div_fbasis.
dimension(2);
378 div_fbasis(dim,i,j) = grad_fbase_elem(i,j,dim);
405 const DoubleTab& xp = domaine.xp();
409 double invh = 1./sqrt(domaine.carre_pas_maille(nelem));
414 grad_fbasis(1, pt, 0) = invh;
415 grad_fbasis(1, pt, 1) = 0.;
416 grad_fbasis(2, pt, 0) = 0.;
417 grad_fbasis(2, pt, 1) = invh;
419 if (
order_ == 1)
continue;
420 grad_fbasis(3, pt, 0) = invh*(integ_points(ind_elem+pt, 1) - xp(nelem,1))*invh;
421 grad_fbasis(3, pt, 1) = invh*(integ_points(ind_elem+pt, 0) - xp(nelem,0))*invh;
422 grad_fbasis(4, pt, 0) = 2*invh*(integ_points(ind_elem+pt, 0) - xp(nelem,0))*invh;
423 grad_fbasis(4, pt, 1) = 0.;
424 grad_fbasis(5, pt, 0) = 0.;
425 grad_fbasis(5, pt, 1) = 2*invh*(integ_points(ind_elem+pt, 1) - xp(nelem,1))*invh;
427 if (
order_ == 2)
continue;
464 const DoubleTab& xp = domaine.xp();
468 double invh = 1./sqrt(domaine.carre_pas_maille(nelem));
470 for (
int pt = 0; pt < nb_pts_integ_on_facets; pt++)
473 if (
order_ == 0)
continue;
475 fbasis(1, pt) = (integ_points_on_facets(num_face, pt, 0) - xp(nelem,0))*invh;
476 fbasis(2, pt) = (integ_points_on_facets(num_face, pt, 1) - xp(nelem,1))*invh;
478 if (
order_ == 1)
continue;
479 fbasis(3, pt) = (integ_points_on_facets(num_face, pt, 0) - xp(nelem,0))*invh*(integ_points_on_facets(num_face, pt, 1) - xp(nelem,1))*invh;
480 fbasis(4, pt) = (integ_points_on_facets(num_face, pt, 0) - xp(nelem,0))*invh*(integ_points_on_facets(num_face, pt, 0) - xp(nelem,0))*invh;
481 fbasis(5, pt) = (integ_points_on_facets(num_face, pt, 1) - xp(nelem,1))*invh*(integ_points_on_facets(num_face, pt, 1) - xp(nelem,1))*invh;
482 if (
order_ == 2)
continue;
518 const DoubleTab& xp = domaine.xp();
523 double invh = 1./sqrt(domaine.carre_pas_maille(nelem));
525 for (
int pt = 0; pt < nb_pts_integ_on_facets; pt++)
528 grad_fbasis(1, pt, 0) = invh;
529 grad_fbasis(1, pt, 1) = 0.;
530 grad_fbasis(2, pt, 0) = 0.;
531 grad_fbasis(2, pt, 1) = invh;
533 if (
order_ == 1)
continue;
535 grad_fbasis(3, pt, 0) = invh*(integ_points_on_facets(num_face, pt, 1) - xp(nelem,1))*invh;
536 grad_fbasis(3, pt, 1) = invh*(integ_points_on_facets(num_face, pt, 0) - xp(nelem,0))*invh;
537 grad_fbasis(4, pt, 0) = 2*invh*(integ_points_on_facets(num_face, pt, 0) - xp(nelem,0))*invh;
538 grad_fbasis(4, pt, 1) = 0.;
539 grad_fbasis(5, pt, 0) = 0.;
540 grad_fbasis(5, pt, 1) = 2*invh*(integ_points_on_facets(num_face, pt, 1) - xp(nelem,1))*invh;
541 if (
order_ == 2)
continue;
569 int nb_pts_integ_max = div_fbasis.
dimension(1);
575 div_fbasis(dim,i,j) = grad_fbase_elem(i,j,dim);
605 const DoubleVect& ve = domaine.volumes();
607 DoubleTab fbase(
nb_bfunc_, nb_pts_integ_max);
613 double invV = 1./ve(nelem);
614 matrice(0, 0) = invV;
628 sumx2 += weights(quad.
ind_pts_integ(nelem)+f)*ve(nelem)*fbase(1,f)*fbase(1,f);
629 sumxy += weights(quad.
ind_pts_integ(nelem)+f)*ve(nelem)*fbase(1,f)*fbase(2,f);;
630 sumy2 += weights(quad.
ind_pts_integ(nelem)+f)*ve(nelem)*fbase(2,f)*fbase(2,f);
633 double inv_det = 1./(sumy2*sumx2 - sumxy*sumxy);
635 matrice(1, 1) = sumy2*inv_det;
636 matrice(2, 2) = sumx2*inv_det;
638 matrice(1, 2) = -sumxy*inv_det;
639 matrice(2, 1) = -sumxy*inv_det;
674 int nb_elem_tot = domaine.nb_elem_tot();
677 const IntTab& nfaces_elem = domaine.get_nfaces_elem();
680 const DoubleTab& sig=domaine.get_sig();
681 for (
int e = 0; e < nb_elem_tot; e++)
684 if(nfaces_elem(e)==3)
686 eta_elem(e) = 6. / M_PI * (sig(e)*sig(e))*(ordre + 1.)*(ordre + 2.);
694 for (
unsigned int f = 0; f < (
unsigned int) domaine.premiere_face_int(); f++)
696 int elem0 = domaine.face_voisins(f, 0);
700 for (
unsigned int f = domaine.premiere_face_int(); f < (
unsigned int) domaine.nb_faces(); f++)
702 unsigned int elem0 = domaine.face_voisins(f, 0);
703 unsigned int elem1 = domaine.face_voisins(f, 1);
706 eta_facet(f) = 2. * eta_t0 * eta_t1 / (eta_t0 + eta_t1);
void eval_grad_bfunc(const Quadrature_base &quad, const int &nelem, DoubleTab &fbasis) const
Evaluates the gradients of all basis functions at the element quadrature points.
void eval_grad_bfunc_on_facets(const Quadrature_base &quad, const int &nelem, const int &num_face, DoubleTab &grad_fbasis) const
Evaluates the gradients of all basis functions of element nelem at the quadrature points of face num_...
void orthonormalize(const int &nelem, const int &nb_pts_integ, DoubleTab &fbasis) const
Applies the pre-computed Gram-Schmidt transition matrix to a raw basis evaluation.
Matrice_Morse transition_matrix_
void eval_bfunc_on_facets(const Quadrature_base &quad, const int &nelem, const int &num_face, DoubleTab &grad_fbasis) const
Evaluates all basis functions of element nelem at the quadrature points of face num_face.
void allocate_transition_matrix()
Allocates the sparsity pattern of the block-diagonal transition matrix.
void eval_bfunc(const Quadrature_base &quad, const int &nelem, DoubleTab &fbasis) const
Evaluates all basis functions at the element quadrature points.
void eval_div_bfunc(const Quadrature_base &quad, const int &nelem, DoubleTab &div_fbasis) const
void gramSchmidt(DoubleTab &fbase, const Quadrature_base &quad, const int &num_elem, const int ¤t_indice, const int &nb_pts_integ, const double &volume, int index)
Recursively orthonormalizes the local basis using the modified Gram-Schmidt process.
void initialize(const Domaine_DG &dom, const int &order, const bool &gram_schmidt)
Initializes the basis function object for a given DG domain and polynomial order.
void build_transition_matrix()
Computes and stores the Gram-Schmidt orthonormalization coefficients.
const int & get_order() const
void compute_stab_param()
Computes the SIP penalty stabilization parameters eta_elem and eta_facet.
const Matrice_Dense eval_invMassMatrix(const Quadrature_base &quad, const int &nelem) const
Computes the inverse of the local L2 mass matrix for element nelem.
IntTab indices_glob_elem_
const Matrice_Dense build_local_mass_matrix(const Quadrature_base &quad, const int nelem) const
Computes the local L2 mass matrix M_ij = integral of phi_i * phi_j on element nelem.
void eval_div_bfunc_on_facets(const Quadrature_base &quad, const int &nelem, const int &num_face, DoubleTab &div_fbasis) const
Evaluates the divergence of the basis functions at the quadrature points of face num_face.
const bool & gram_schmidt() const
static int Nb_col_from_order(const int order)
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
int ind_pts_integ(int e) const
int nb_pts_integ(int e) const
const DoubleTab & get_weights() const
const DoubleTab & get_integ_points_facets() const
const DoubleTab & get_integ_points() const
int nb_pts_integ_max() const
const IntTab & get_tab_nb_pts_integ() const
double compute_integral_on_elem(int num_elem, Parser_U &parser) const
int nb_pts_integ_facets() const
_SIZE_ dimension(int d) const