42   using bgeot::base_rational_fraction;
 
   45     if (gmm::mat_nrows(M_) == 0) {
 
   46       GMM_ASSERT2(have_pgt() && have_G() && 
have_pf(), 
"cannot compute M");
 
   48       pf_->mat_trans(M_,
G(),pgt());
 
   54     GMM_ASSERT3(convex_num_ != 
size_type(-1), 
"");
 
   58   bool fem_interpolation_context::is_convex_num_valid()
 const {
 
   64                 "Face number is asked but not defined");
 
   86   static inline void spec_mat_tmult_(
const base_tensor &g, 
const base_matrix &B,
 
   89     size_type M = t.adjust_sizes_changing_last(g, P);
 
   90     bgeot::mat_tmult(&(*(g.begin())), &(*(B.begin())), &(*(t.begin())),M,N,P);
 
   93   void fem_interpolation_context::pfp_base_value(base_tensor& t,
 
   94                                                  const pfem_precomp &pfp__) {
 
   95     const pfem &pf__ = pfp__->get_pfem();
 
   98     if (pf__->is_standard())
 
  101       if (pf__->is_on_real_element())
 
  102         pf__->real_base_value(*
this, t);
 
  104         switch(pf__->vectorial_type()) {
 
  105         case virtual_fem::VECTORIAL_NOTRANSFORM_TYPE:
 
  106           t = pfp__->val(ii()); 
break;
 
  107         case virtual_fem::VECTORIAL_PRIMAL_TYPE:
 
  108           t.mat_transp_reduction(pfp__->val(ii()), 
K(), 1); 
break;
 
  109         case virtual_fem::VECTORIAL_DUAL_TYPE:
 
  110           t.mat_transp_reduction(pfp__->val(ii()), B(), 1); 
break;
 
  112         if (!(pf__->is_equivalent())) {
 
  114           { base_tensor u = t; t.mat_transp_reduction(u, 
M(), 0); }
 
  126       if (pf_->is_on_real_element())
 
  127         pf_->real_base_value(*
this, t);
 
  130           switch(pf_->vectorial_type()) {
 
  131           case virtual_fem::VECTORIAL_NOTRANSFORM_TYPE:
 
  132             t = pfp_->val(ii()); 
break;
 
  133           case virtual_fem::VECTORIAL_PRIMAL_TYPE:
 
  134             t.mat_transp_reduction(pfp_->val(ii()), 
K(), 1); 
break;
 
  135           case virtual_fem::VECTORIAL_DUAL_TYPE:
 
  136             t.mat_transp_reduction(pfp_->val(ii()), B(), 1); 
break;
 
  140           switch(pf_->vectorial_type()) {
 
  141           case virtual_fem::VECTORIAL_NOTRANSFORM_TYPE:
 
  142             pf_->base_value(
xref(), t); 
break;
 
  143           case virtual_fem::VECTORIAL_PRIMAL_TYPE:
 
  145               base_tensor u; pf_->base_value(
xref(), u);
 
  146               t.mat_transp_reduction(u,
K(),1);
 
  148           case virtual_fem::VECTORIAL_DUAL_TYPE:
 
  150               base_tensor u; pf_->base_value(
xref(), u);
 
  151               t.mat_transp_reduction(u,B(),1);
 
  155         if (withM && !(pf_->is_equivalent()))
 
  156           { base_tensor u = t; t.mat_transp_reduction(u, 
M(), 0); }
 
  161   void fem_interpolation_context::pfp_grad_base_value
 
  162   (base_tensor& t, 
const pfem_precomp &pfp__) {
 
  163     const pfem &pf__ = pfp__->get_pfem();
 
  166     if (pf__->is_standard()) {
 
  168       spec_mat_tmult_(pfp__->grad(ii()), B(), t);
 
  170       if (pf__->is_on_real_element())
 
  171         pf__->real_grad_base_value(*
this, t);
 
  173         switch(pf__->vectorial_type()) {
 
  174         case virtual_fem::VECTORIAL_PRIMAL_TYPE:
 
  178             spec_mat_tmult_(pfp__->grad(ii()), B(), u);
 
  179             t.mat_transp_reduction(u, 
K(), 1);
 
  182         case virtual_fem::VECTORIAL_DUAL_TYPE:
 
  186             spec_mat_tmult_(pfp__->grad(ii()), B(), u);
 
  187             t.mat_transp_reduction(u, B(), 1);
 
  192           spec_mat_tmult_(pfp__->grad(ii()), B(), t);
 
  194         if (!(pf__->is_equivalent())) {
 
  196           base_tensor u = t; t.mat_transp_reduction(u, 
M(), 0);
 
  205     if (pfp_ && 
ii_ != 
size_type(-1) && pf_->is_standard()) {
 
  207       spec_mat_tmult_(pfp_->grad(ii()), B(), t);
 
  209       if (
pf()->is_on_real_element())
 
  210         pf()->real_grad_base_value(*
this, t);
 
  213           switch(
pf()->vectorial_type()) {
 
  214           case virtual_fem::VECTORIAL_PRIMAL_TYPE:
 
  218               spec_mat_tmult_(pfp_->grad(ii()), B(), u);
 
  219               t.mat_transp_reduction(u, 
K(), 1);
 
  222           case virtual_fem::VECTORIAL_DUAL_TYPE:
 
  226               spec_mat_tmult_(pfp_->grad(ii()), B(), u);
 
  227               t.mat_transp_reduction(u, B(), 1);
 
  232             spec_mat_tmult_(pfp_->grad(ii()), B(), t);
 
  237           pf()->grad_base_value(
xref(), u);
 
  240             spec_mat_tmult_(u, B(), t);
 
  241             switch(
pf()->vectorial_type()) {
 
  242             case virtual_fem::VECTORIAL_PRIMAL_TYPE:
 
  243               u = t; t.mat_transp_reduction(u, 
K(), 1); 
break;
 
  244             case virtual_fem::VECTORIAL_DUAL_TYPE:
 
  245               u = t; t.mat_transp_reduction(u, B(), 1);  
break;
 
  250         if (withM && !(
pf()->is_equivalent()))
 
  251           { base_tensor u = t; t.mat_transp_reduction(u, 
M(), 0); }
 
  258     if (
pf()->is_on_real_element())
 
  259       pf()->real_hess_base_value(*
this, t);
 
  263         tt = 
pfp()->hess(ii());
 
  265         pf()->hess_base_value(
xref(), tt);
 
  267       switch(
pf()->vectorial_type()) {
 
  268       case virtual_fem::VECTORIAL_PRIMAL_TYPE:
 
  269         { base_tensor u = tt; tt.mat_transp_reduction(u, 
K(), 1); } 
break;
 
  270       case virtual_fem::VECTORIAL_DUAL_TYPE:
 
  271         { base_tensor u = tt; tt.mat_transp_reduction(u, B(), 1); } 
break;
 
  276         tt.adjust_sizes(tt.sizes()[0], tt.sizes()[1], gmm::sqr(tt.sizes()[2]));
 
  277         t.mat_transp_reduction(tt, B3(), 2);
 
  278         if (!pgt()->is_linear()) {
 
  280             tt.mat_transp_reduction(
pfp()->grad(ii()), B32(), 2);
 
  283             pf()->grad_base_value(
xref(), u);
 
  284             tt.mat_transp_reduction(u, B32(), 2);
 
  288         if (!(
pf()->is_equivalent()) && withM)
 
  289           { tt = t; t.mat_transp_reduction(tt, 
M(), 0); }
 
  294   void fem_interpolation_context::set_pfp(pfem_precomp newpfp) {
 
  295     if (pfp_ != newpfp) {
 
  297       if (pfp_) { pf_ = 
pfp()->get_pfem(); }
 
  303   void fem_interpolation_context::set_pf(
pfem newpf) {
 
  311                                     base_tensor &t, 
bool withM)
 const 
  315                                     base_tensor &t, 
bool withM)
 const 
  319                                          base_tensor &t, 
bool withM)
 const 
  326   enum ddl_type { LAGRANGE, NORMAL_DERIVATIVE, DERIVATIVE, MEAN_VALUE,
 
  327                   BUBBLE1, LAGRANGE_NONCONFORMING, GLOBAL_DOF,
 
  328                   SECOND_DERIVATIVE, NORMAL_COMPONENT, EDGE_COMPONENT,
 
  333     gmm::int16_type hier_degree;
 
  336     bool operator < (
const ddl_elem &l)
 const {
 
  337       if (t < l.t) 
return true;
 
  338       if (t > l.t) 
return false;
 
  339       if (hier_degree < l.hier_degree) 
return true;
 
  340       if (hier_degree > l.hier_degree) 
return false;
 
  341       if (hier_raff < l.hier_raff) 
return true;
 
  342       if (hier_raff > l.hier_raff) 
return false;
 
  343       if (spec < l.spec) 
return true;
 
  346     ddl_elem(ddl_type s = LAGRANGE, gmm::int16_type k = -1, 
short_type l = 0,
 
  348       : t(s), hier_degree(k), hier_raff(l), spec(spec_) {}
 
  351   struct dof_description {
 
  352     std::vector<ddl_elem> ddl_desc;
 
  354     dim_type coord_index;
 
  359     { linkable = 
true; all_faces = 
false; coord_index = 0; xfem_index = 0; }
 
  362   struct dof_description_comp__ {
 
  363     int operator()(
const dof_description &m, 
const dof_description &n) 
const;
 
  368   int dof_description_comp__::operator()(
const dof_description &m,
 
  369                                          const dof_description &n)
 const {
 
  370     int nn = gmm::lexicographical_less<std::vector<ddl_elem> >()
 
  371       (m.ddl_desc, n.ddl_desc);
 
  372     if (nn < 0) 
return -1;
 
  373     if (nn > 0) 
return 1;
 
  374     nn = int(m.linkable) - int(n.linkable);
 
  375     if (nn < 0) 
return -1;
 
  376     if (nn > 0) 
return 1;
 
  377     nn = int(m.coord_index) - int(n.coord_index);
 
  378     if (nn < 0) 
return -1;
 
  379     if (nn > 0) 
return 1;
 
  380     nn = int(m.xfem_index) - int(n.xfem_index);
 
  381     if (nn < 0) 
return -1;
 
  382     if (nn > 0) 
return 1;
 
  383     nn = int(m.all_faces) - int(n.all_faces);
 
  384     if (nn < 0) 
return -1;
 
  385     if (nn > 0) 
return 1;
 
  389   typedef dal::dynamic_tree_sorted<dof_description, dof_description_comp__> dof_d_tab;
 
  392     THREAD_SAFE_STATIC dim_type n_old = dim_type(-2);
 
  397       l.ddl_desc.resize(n);
 
  398       std::fill(l.ddl_desc.begin(), l.ddl_desc.end(), ddl_elem(LAGRANGE));
 
  399       p_old = &(tab[tab.add_norepeat(l)]);
 
  406     THREAD_SAFE_STATIC dim_type n_old = dim_type(-2);
 
  412       l.ddl_desc.resize(n);
 
  414       std::fill(l.ddl_desc.begin(), l.ddl_desc.end(), ddl_elem(LAGRANGE));
 
  415       p_old = &(tab[tab.add_norepeat(l)]);
 
  423     dof_description l = *p;
 
  424     for (
size_type i = 0; i < l.ddl_desc.size(); ++i)
 
  425       l.ddl_desc[i].hier_degree = gmm::int16_type(deg);
 
  426     return &(tab[tab.add_norepeat(l)]);
 
  436     dof_description l = *p; l.xfem_index = ind;
 
  437     return &(tab[tab.add_norepeat(l)]);
 
  441     THREAD_SAFE_STATIC dim_type n_old = dim_type(-2);
 
  446       l.ddl_desc.resize(n);
 
  447       std::fill(l.ddl_desc.begin(), l.ddl_desc.end(),
 
  448                 ddl_elem(IPK_CENTER, -1, 0, k_ind));
 
  449       p_old = &(tab[tab.add_norepeat(l)]);
 
  459     dof_description l = *p;
 
  461     return &(tab[tab.add_norepeat(l)]);
 
  466     dof_description l = *p;
 
  467     for (
size_type i = 0; i < l.ddl_desc.size(); ++i)
 
  468       l.ddl_desc[i].hier_raff = deg;
 
  469     return &(tab[tab.add_norepeat(l)]);
 
  474     dof_description l; l.linkable = 
false;
 
  475     l.ddl_desc.resize(n);
 
  476     std::fill(l.ddl_desc.begin(), l.ddl_desc.end(), ddl_elem(LAGRANGE));
 
  477     return &(tab[tab.add_norepeat(l)]);
 
  483     l.ddl_desc.resize(n);
 
  484     std::fill(l.ddl_desc.begin(), l.ddl_desc.end(), ddl_elem(BUBBLE1));
 
  485     return &(tab[tab.add_norepeat(l)]);
 
  491     l.ddl_desc.resize(n);
 
  492     std::fill(l.ddl_desc.begin(), l.ddl_desc.end(), ddl_elem(LAGRANGE));
 
  493     l.ddl_desc.at(num_der) = ddl_elem(DERIVATIVE);
 
  494     return &(tab[tab.add_norepeat(l)]);
 
  501     l.ddl_desc.resize(n);
 
  502     std::fill(l.ddl_desc.begin(), l.ddl_desc.end(), ddl_elem(LAGRANGE));
 
  503     l.ddl_desc[num_der1] = ddl_elem(SECOND_DERIVATIVE);
 
  504     l.ddl_desc[num_der2] = ddl_elem(SECOND_DERIVATIVE);
 
  505     return &(tab[tab.add_norepeat(l)]);
 
  511     l.ddl_desc.resize(n);
 
  512     std::fill(l.ddl_desc.begin(), l.ddl_desc.end(),
 
  513               ddl_elem(NORMAL_DERIVATIVE));
 
  514     return &(tab[tab.add_norepeat(l)]);
 
  520     l.ddl_desc.resize(n);
 
  521     std::fill(l.ddl_desc.begin(), l.ddl_desc.end(),
 
  522               ddl_elem(NORMAL_COMPONENT));
 
  523     return &(tab[tab.add_norepeat(l)]);
 
  529     l.ddl_desc.resize(n);
 
  530     std::fill(l.ddl_desc.begin(), l.ddl_desc.end(),
 
  531               ddl_elem(EDGE_COMPONENT));
 
  532     return &(tab[tab.add_norepeat(l)]);
 
  538     l.ddl_desc.resize(n);
 
  539     std::fill(l.ddl_desc.begin(), l.ddl_desc.end(), ddl_elem(MEAN_VALUE));
 
  540     return &(tab[tab.add_norepeat(l)]);
 
  547     l.ddl_desc.resize(n);
 
  549     std::fill(l.ddl_desc.begin(), l.ddl_desc.end(),ddl_elem(GLOBAL_DOF));
 
  550     return &(tab[tab.add_norepeat(l)]);
 
  555     size_type nb1 = a->ddl_desc.size(), nb2 = b->ddl_desc.size();
 
  557     l.linkable = a->linkable && b->linkable;
 
  558     l.coord_index = std::max(a->coord_index, b->coord_index); 
 
  559     l.xfem_index = a->xfem_index;
 
  560     l.all_faces = a->all_faces || b->all_faces;
 
  561     GMM_ASSERT2(a->xfem_index == b->xfem_index, 
"Invalid product of dof");
 
  562     l.ddl_desc.resize(nb1+nb2);
 
  563     std::copy(a->ddl_desc.begin(), a->ddl_desc.end(), l.ddl_desc.begin());
 
  564     std::copy(b->ddl_desc.begin(), b->ddl_desc.end(), l.ddl_desc.begin()+nb1);
 
  567       gmm::int16_type deg = -1;
 
  568       for (
size_type i = 0; i < l.ddl_desc.size(); ++i)
 
  569         deg = std::max(deg, l.ddl_desc[i].hier_degree);
 
  570       for (
size_type i = 0; i < l.ddl_desc.size(); ++i)
 
  571         l.ddl_desc[i].hier_degree = deg;
 
  575       for (
size_type i = 0; i < l.ddl_desc.size(); ++i)
 
  576         deg = std::max(deg, l.ddl_desc[i].hier_raff);
 
  577       for (
size_type i = 0; i < l.ddl_desc.size(); ++i)
 
  578         l.ddl_desc[i].hier_raff = deg;
 
  580     return &(tab[tab.add_norepeat(l)]);
 
  589     std::vector<ddl_elem>::const_iterator
 
  590       ita = a->ddl_desc.begin(), itae = a->ddl_desc.end(),
 
  591       itb = b->ddl_desc.begin(), itbe = b->ddl_desc.end();
 
  592     for (; ita != itae && itb != itbe; ++ita, ++itb)
 
  594       if ((nn = 
int(ita->t) - int (itb->t)) != 0) 
return nn;
 
  595       if ((nn = 
int(ita->hier_degree) - int (itb->hier_degree)) != 0)
 
  598     for (; ita != itae; ++ita) 
if (ita->t != LAGRANGE) 
return 1;
 
  599     for (; itb != itbe; ++itb) 
if (itb->t != LAGRANGE) 
return -1;
 
  608     if (a == b) 
return 0;
 
  610     if ((nn = 
int(a->coord_index) - 
int(b->coord_index)) != 0) 
return nn;
 
  611     if ((nn = 
int(a->linkable) - 
int(b->linkable)) != 0) 
return nn;
 
  612     if ((nn = 
int(a->xfem_index) - 
int(b->xfem_index)) != 0) 
return nn;
 
  613     return dof_weak_compatibility(a,b);
 
  617   { 
return a->linkable; }
 
  623   { 
return a->xfem_index; }
 
  626   { 
return a->coord_index; }
 
  630     if (a->coord_index != b->coord_index) 
return false;
 
  631     if (a->linkable != b->linkable) 
return false;
 
  632     if (a->xfem_index != b->xfem_index) 
return false;
 
  633     std::vector<ddl_elem>::const_iterator
 
  634       ita = a->ddl_desc.begin(), itae = a->ddl_desc.end(),
 
  635       itb = b->ddl_desc.begin(), itbe = b->ddl_desc.end();
 
  636     for (; ita != itae && itb != itbe; ++ita, ++itb)
 
  637     { 
if (ita->t != itb->t) 
return false; }
 
  638     for (; ita != itae; ++ita) 
if (ita->t != LAGRANGE) 
return false;
 
  639     for (; itb != itbe; ++itb) 
if (itb->t != LAGRANGE) 
return false;
 
  650                              const dal::bit_vector &faces) {
 
  652     cv_node.points().resize(nb+1);
 
  653     cv_node.points()[nb] = pt;
 
  654     dof_types_.resize(nb+1);
 
  655     face_tab.resize(nb+1);
 
  657     cvs_node->add_point_adaptative(nb, 
short_type(-1));
 
  658     for (dal::bv_visitor f(faces); !f.finished(); ++f) {
 
  659       cvs_node->add_point_adaptative(nb, 
short_type(f));
 
  667     dal::bit_vector faces;
 
  668     for (
short_type f = 0; f < cvs_node->nb_faces(); ++f)
 
  669       if (d->all_faces || gmm::abs(cvr->is_in_face(f, pt)) < 1.0E-7)
 
  674   void virtual_fem::init_cvs_node() {
 
  675     cvs_node->init_for_adaptative(cvr->structure());
 
  681   void virtual_fem::unfreeze_cvs_node() {
 
  682     cv_node.structure() = cvs_node;
 
  686   const std::vector<short_type> &
 
  688     static const std::vector<short_type> no_faces;
 
  689     return (i < face_tab.size()) ? face_tab[i] : no_faces;
 
  692   void virtual_fem::copy(
const virtual_fem &f) {
 
  693     dof_types_ = f.dof_types_;
 
  694     cvs_node = bgeot::new_convex_structure();
 
  695     *cvs_node = *f.cvs_node; 
 
  697     cv_node.structure() = cvs_node;
 
  702     ntarget_dim = f.ntarget_dim;
 
  704     is_equiv = f.is_equiv;
 
  707     is_polycomp = f.is_polycomp;
 
  708     real_element_defined = f.real_element_defined;
 
  709     is_standard_fem = f.is_standard_fem;
 
  710     es_degree = f.es_degree;
 
  711     hier_raff = f.hier_raff;
 
  712     debug_name_ = f.debug_name_;
 
  713     face_tab = f.face_tab;
 
  720   class PK_fem_ : 
public fem<base_poly> {
 
  729     base_poly l0(N, 0), l1(N, 0);
 
  731     l0.one(); l1.one(); p = l0;
 
  734       for (
short_type nn = 0; nn < N; ++nn) l0 -= base_poly(N, 1, nn);
 
  738         w[nn]=
short_type(floor(0.5+bgeot::to_scalar((cv_node.points()[i])[nn-1]*opt_long_scalar_type(K))));
 
  742       for (
int nn = 0; nn <= N; ++nn)
 
  743         for (
int j = 0; j < w[nn]; ++j) {
 
  745             p *= (l0 * (opt_long_scalar_type(K) / opt_long_scalar_type(j+1)))
 
  746               - (l1 * (opt_long_scalar_type(j) / opt_long_scalar_type(j+1)));
 
  748             p *= (base_poly(N,1,
short_type(nn-1)) * (opt_long_scalar_type(K)/opt_long_scalar_type(j+1)))
 
  749               - (l1 * (opt_long_scalar_type(j) / opt_long_scalar_type(j+1)));
 
  756     dim_ = cvr->structure()->dim();
 
  757     is_standard_fem = is_equiv = is_pol = is_lag = 
true;
 
  764       add_node(k==0 ? lagrange_0_dof(nc) : 
lagrange_dof(nc), cvn->points()[i]);
 
  767     for (
size_type r = 0; r < R; r++) calc_base_func(base_[r], r, k);
 
  770   static pfem PK_fem(fem_param_list ¶ms,
 
  771         std::vector<dal::pstatic_stored_object> &dependencies) {
 
  772     GMM_ASSERT1(params.size() == 2, 
"Bad number of parameters : " 
  773                 << params.size() << 
" should be 2.");
 
  774     GMM_ASSERT1(params[0].type() == 0 && params[1].type() == 0,
 
  775                 "Bad type of parameters");
 
  776     int n = dim_type(::floor(params[0].num() + 0.01));
 
  777     int k = 
short_type(::floor(params[1].num() + 0.01));
 
  778     GMM_ASSERT1(n > 0 && n < 100 && k >= 0 && k <= 150 &&
 
  779                 double(n) == params[0].num() && 
double(k) == params[1].num(),
 
  782     dependencies.push_back(p->ref_convex(0));
 
  783     dependencies.push_back(p->node_tab(0));
 
  792   struct tproduct_femi : 
public fem<base_poly> {
 
  797     if (fi2->target_dim() != 1) std::swap(fi1, fi2);
 
  798     GMM_ASSERT1(fi2->target_dim() == 1, 
"dimensions mismatch");
 
  801     is_equiv = fi1->is_equivalent() && fi2->is_equivalent();
 
  802     GMM_ASSERT1(is_equiv,
 
  803                 "Product of non equivalent elements not available, sorry.");
 
  804     is_lag = fi1->is_lagrange() && fi2->is_lagrange();
 
  805     is_standard_fem = fi1->is_standard() && fi2->is_standard();
 
  806     es_degree = 
short_type(fi1->estimated_degree() + fi2->estimated_degree());
 
  809       = bgeot::convex_direct_product(fi1->node_convex(0), fi2->node_convex(0));
 
  811     dim_ = cvr->structure()->dim();
 
  814     ntarget_dim = fi2->target_dim();
 
  815     base_.resize(cv.nb_points() * ntarget_dim);
 
  817     for (j = 0, r = 0; j < fi2->nb_dof(0); ++j)
 
  818       for (i = 0; i < fi1->nb_dof(0); ++i, ++r)
 
  819         add_node(
product_dof(fi1->dof_types()[i], fi2->dof_types()[j]),
 
  822     for (j = 0, r = 0; j < fi2->nb_base_components(0); j++)
 
  823       for (i = 0; i < fi1->nb_base_components(0); i++, ++r) {
 
  824         base_[r] = fi1->base()[i];
 
  825         base_[r].direct_product(fi2->base()[j]);
 
  829   static pfem product_fem(fem_param_list ¶ms,
 
  830         std::vector<dal::pstatic_stored_object> &dependencies) {
 
  831     GMM_ASSERT1(params.size() == 2, 
"Bad number of parameters : " 
  832                 << params.size() << 
" should be 2.");
 
  833     GMM_ASSERT1(params[0].type() == 1 && params[1].type() == 1,
 
  834                 "Bad type of parameters");
 
  835     pfem pf1 = params[0].method();
 
  836     pfem pf2 = params[1].method();
 
  837     GMM_ASSERT1(pf1->is_polynomial() && pf2->is_polynomial(),
 
  838                 "Both arguments to FEM_PRODUCT must be polynomial FEM");
 
  839     pfem p = std::make_shared<tproduct_femi>(
ppolyfem(pf1.get()),
 
  841     dependencies.push_back(p->ref_convex(0));
 
  842     dependencies.push_back(p->node_tab(0));
 
  850   struct thierach_femi : 
public fem<base_poly> {
 
  855     : fem<base_poly>(*fi1) {
 
  856     grad_computed_ = 
false;
 
  857     hess_computed_ = 
false;
 
  858     GMM_ASSERT1(fi2->target_dim()==fi1->target_dim(), 
"dimensions mismatch.");
 
  859     GMM_ASSERT1(fi2->basic_structure(0) == fi1->basic_structure(0),
 
  860                 "Incompatible elements.");
 
  861     GMM_ASSERT1(fi1->is_equivalent() &&  fi2->is_equivalent(), 
"Sorry, " 
  862                 "no hierachical construction for non tau-equivalent fems.");
 
  863     es_degree = fi2->estimated_degree();
 
  866     for (
size_type i = 0; i < fi2->nb_dof(0); ++i) {
 
  868       for (
size_type j = 0; j < fi1->nb_dof(0); ++j) {
 
  869         if ( gmm::vect_dist2(fi2->node_of_dof(0,i),
 
  870                              fi1->node_of_dof(0,j)) < 1e-13
 
  871              && dof_hierarchical_compatibility(fi2->dof_types()[i],
 
  872                                                fi1->dof_types()[j]))
 
  873             { found = 
true; 
break; }
 
  876         add_node(deg_hierarchical_dof(fi2->dof_types()[i],
 
  877                                       fi1->estimated_degree()),
 
  878                  fi2->node_of_dof(0,i));
 
  880         base_[
nb_dof(0)-1] = (fi2->base())[i];
 
  885   struct thierach_femi_comp : 
public fem<bgeot::polynomial_composite> {
 
  890     : fem<
bgeot::polynomial_composite>(*fi1) {
 
  891     GMM_ASSERT1(fi2->target_dim()==fi1->target_dim(), 
"dimensions mismatch.");
 
  892     GMM_ASSERT1(fi2->basic_structure(0) == fi1->basic_structure(0),
 
  893                 "Incompatible elements.");
 
  894     GMM_ASSERT1(fi1->is_equivalent() &&  fi2->is_equivalent(), 
"Sorry, " 
  895                 "no hierachical construction for non tau-equivalent fems.");
 
  897     es_degree = std::max(fi2->estimated_degree(), fi1->estimated_degree());
 
  900     hier_raff = 
short_type(fi1->hierarchical_raff() + 1);
 
  902     for (
size_type i = 0; i < fi2->nb_dof(0); ++i) {
 
  904       for (
size_type j = 0; j < fi1->nb_dof(0); ++j) {
 
  905         if ( gmm::vect_dist2(fi2->node_of_dof(0,i),
 
  906                              fi1->node_of_dof(0,j)) < 1e-13
 
  907              && dof_hierarchical_compatibility(fi2->dof_types()[i],
 
  908                                                fi1->dof_types()[j]))
 
  909           { found = 
true; 
break; }
 
  912         add_node(raff_hierarchical_dof(fi2->dof_types()[i], hier_raff),
 
  913                  fi2->node_of_dof(0,i));
 
  915         base_[
nb_dof(0)-1] = (fi2->base())[i];
 
  920   static pfem gen_hierarchical_fem
 
  921   (fem_param_list ¶ms, std::vector<dal::pstatic_stored_object> &deps) {
 
  922     GMM_ASSERT1(params.size() == 2, 
"Bad number of parameters : " 
  923                 << params.size() << 
" should be 2.");
 
  924     GMM_ASSERT1(params[0].type() == 1 && params[1].type() == 1,
 
  925                 "Bad type of parameters");
 
  926     pfem pf1 = params[0].method();
 
  927     pfem pf2 = params[1].method();
 
  928     if (pf1->is_polynomial() && pf2->is_polynomial())
 
  929       return std::make_shared<thierach_femi>(
ppolyfem(pf1.get()),
 
  931     GMM_ASSERT1(pf1->is_polynomialcomp() && pf2->is_polynomialcomp(),
 
  935     deps.push_back(p->ref_convex(0));
 
  936     deps.push_back(p->node_tab(0));
 
  944   static pfem PK_hierarch_fem(fem_param_list ¶ms,
 
  945                               std::vector<dal::pstatic_stored_object> &) {
 
  946     GMM_ASSERT1(params.size() == 2, 
"Bad number of parameters : " 
  947                 << params.size() << 
" should be 2.");
 
  948     GMM_ASSERT1(params[0].type() == 0 && params[1].type() == 0,
 
  949                 "Bad type of parameters");
 
  950     int n = int(::floor(params[0].num() + 0.01));
 
  951     int k = int(::floor(params[1].num() + 0.01)), s;
 
  952     GMM_ASSERT1(n > 0 && n < 100 && k > 0 && k <= 150 &&
 
  953                 double(n) == params[0].num() && 
double(k) == params[1].num(),
 
  955     std::stringstream name;
 
  957       name << 
"FEM_PK(" << n << 
",1)";
 
  959       for (s = 2; s <= k; ++s) 
if ((k % s) == 0) 
break;
 
  960       name << 
"FEM_GEN_HIERARCHICAL(FEM_PK_HIERARCHICAL(" << n << 
"," 
  961            << k/s << 
"), FEM_PK(" << n << 
"," << k << 
"))";
 
  966   static pfem QK_hierarch_fem(fem_param_list ¶ms,
 
  967                               std::vector<dal::pstatic_stored_object> &) {
 
  968     GMM_ASSERT1(params.size() == 2, 
"Bad number of parameters : " 
  969                 << params.size() << 
" should be 2.");
 
  970     GMM_ASSERT1(params[0].type() == 0 && params[1].type() == 0,
 
  971                 "Bad type of parameters");
 
  972     int n = int(::floor(params[0].num() + 0.01));
 
  973     int k = int(::floor(params[1].num() + 0.01));
 
  974     GMM_ASSERT1(n > 0 && n < 100 && k > 0 && k <= 150 &&
 
  975                 double(n) == params[0].num() && 
double(k) == params[1].num(),
 
  977     std::stringstream name;
 
  979       name << 
"FEM_PK_HIERARCHICAL(1," << k << 
")";
 
  981       name << 
"FEM_PRODUCT(FEM_PK_HIERARCHICAL(" << n-1 << 
"," << k
 
  982            << 
"),FEM_PK_HIERARCHICAL(1," << k << 
"))";
 
  986   static pfem prism_PK_hierarch_fem(fem_param_list ¶ms,
 
  987         std::vector<dal::pstatic_stored_object> &) {
 
  988     GMM_ASSERT1(params.size() == 2, 
"Bad number of parameters : " 
  989                 << params.size() << 
" should be 2.");
 
  990     GMM_ASSERT1(params[0].type() == 0 && params[1].type() == 0,
 
  991                 "Bad type of parameters");
 
  992     int n = int(::floor(params[0].num() + 0.01));
 
  993     int k = int(::floor(params[1].num() + 0.01));
 
  994     GMM_ASSERT1(n > 1 && n < 100 && k >= 0 && k <= 150 &&
 
  995                 double(n) == params[0].num() && 
double(k) == params[1].num(),
 
  997     std::stringstream name;
 
  999       name << 
"FEM_QK_HIERARCHICAL(1," << k << 
")";
 
 1001       name << 
"FEM_PRODUCT(FEM_PK_HIERARCHICAL(" << n-1 << 
"," << k
 
 1002            << 
"),FEM_PK_HIERARCHICAL(1," << k << 
"))";
 
 1011   static pfem QK_fem_(fem_param_list ¶ms, 
bool discontinuous) {
 
 1012     const char *fempk = discontinuous ? 
"FEM_PK_DISCONTINUOUS" : 
"FEM_PK";
 
 1013     const char *femqk = discontinuous ? 
"FEM_QK_DISCONTINUOUS" : 
"FEM_QK";
 
 1014     GMM_ASSERT1(params.size() == 2 || (discontinuous && params.size() == 3),
 
 1015                 "Bad number of parameters : " 
 1016                 << params.size() << 
" should be 2.");
 
 1017     GMM_ASSERT1(params[0].type() == 0 && params[1].type() == 0 &&
 
 1018                 (params.size() != 3 || params[2].type() == 0),
 
 1019                 "Bad type of parameters");
 
 1020     int n = int(::floor(params[0].num() + 0.01));
 
 1021     int k = int(::floor(params[1].num() + 0.01));
 
 1023     if (discontinuous && params.size() == 3) {
 
 1024       scalar_type v = params[2].num();
 
 1025       GMM_ASSERT1(v >= 0 && v <= 1, 
"Bad value for alpha: " << v);
 
 1026       snprintf(alpha, 127, 
",%g", v);
 
 1028     GMM_ASSERT1(n > 0 && n < 100 && k >= 0 && k <= 150 &&
 
 1029                 double(n) == params[0].num() && 
double(k) == params[1].num(),
 
 1031     std::stringstream name;
 
 1033       name << fempk << 
"(1," << k << 
alpha << 
")";
 
 1035       name << 
"FEM_PRODUCT(" << femqk << 
"(" << n-1 << 
"," 
 1036            << k << 
alpha << 
")," << fempk << 
"(1," << k << 
alpha << 
"))";
 
 1040   static pfem QK_fem(fem_param_list ¶ms,
 
 1041                      std::vector<dal::pstatic_stored_object> &) {
 
 1042     return QK_fem_(params, 
false);
 
 1045   static pfem QK_discontinuous_fem(fem_param_list ¶ms,
 
 1046                                    std::vector<dal::pstatic_stored_object> &) {
 
 1047     return QK_fem_(params, 
true);
 
 1055   static pfem prism_PK_fem(fem_param_list ¶ms,
 
 1056                            std::vector<dal::pstatic_stored_object> &) {
 
 1057     GMM_ASSERT1(params.size() == 2, 
"Bad number of parameters : " 
 1058                 << params.size() << 
" should be 2.");
 
 1059     GMM_ASSERT1(params[0].type() == 0 && params[1].type() == 0,
 
 1060                 "Bad type of parameters");
 
 1061     int n = int(::floor(params[0].num() + 0.01));
 
 1062     int k = int(::floor(params[1].num() + 0.01));
 
 1063     GMM_ASSERT1(n > 1 && n < 100 && k >= 0 && k <= 150 &&
 
 1064                 double(n) == params[0].num() && 
double(k) == params[1].num(),
 
 1066     std::stringstream name;
 
 1068       name << 
"FEM_QK(1," << k << 
")";
 
 1070       name << 
"FEM_PRODUCT(FEM_PK(" << n-1 << 
"," << k << 
"),FEM_PK(1," 
 1076   prism_PK_discontinuous_fem(fem_param_list ¶ms,
 
 1077                              std::vector<dal::pstatic_stored_object> &) {
 
 1078     GMM_ASSERT1(params.size() == 2 || params.size() == 3,
 
 1079                 "Bad number of parameters : " 
 1080                 << params.size() << 
" should be 2 or 3.");
 
 1081     GMM_ASSERT1(params[0].type() == 0 && params[1].type() == 0 &&
 
 1082                 (params.size() != 3 || params[2].type() == 0),
 
 1083                 "Bad type of parameters");
 
 1084     int n = int(::floor(params[0].num() + 0.01));
 
 1085     int k = int(::floor(params[1].num() + 0.01));
 
 1087     if (params.size() == 3) {
 
 1088       scalar_type v = params[2].num();
 
 1089       GMM_ASSERT1(v >= 0 && v <= 1, 
"Bad value for alpha: " << v);
 
 1090       snprintf(alpha, 127, 
",%g", v);
 
 1092     GMM_ASSERT1(n > 1 && n < 100 && k >= 0 && k <= 150 &&
 
 1093                 double(n) == params[0].num() && 
double(k) == params[1].num(),
 
 1095     std::stringstream name;
 
 1097       name << 
"FEM_QK_DISCONTINUOUS(1," << k << 
alpha << 
")";
 
 1099       name << 
"FEM_PRODUCT(FEM_PK_DISCONTINUOUS(" << n-1 << 
"," << k << 
alpha 
 1100            << 
"),FEM_PK_DISCONTINUOUS(1," 
 1101            << k << 
alpha << 
"))";
 
 1109    static pfem P1_nonconforming_fem(fem_param_list ¶ms,
 
 1110         std::vector<dal::pstatic_stored_object> &dependencies) {
 
 1111     GMM_ASSERT1(params.size() == 0, 
"Bad number of parameters ");
 
 1112     auto p = std::make_shared<fem<base_poly>>();
 
 1115     p->is_standard() = p->is_equivalent() = 
true;
 
 1116     p->is_polynomial() = p->is_lagrange() = 
true;
 
 1117     p->estimated_degree() = 1;
 
 1119     p->base().resize(3);
 
 1121     p->add_node(
lagrange_dof(2), base_small_vector(0.5, 0.5));
 
 1122     read_poly(p->base()[0], 2, 
"2*x + 2*y - 1");
 
 1123     p->add_node(
lagrange_dof(2), base_small_vector(0.0, 0.5));
 
 1124     read_poly(p->base()[1], 2, 
"1 - 2*x");
 
 1125     p->add_node(
lagrange_dof(2), base_small_vector(0.5, 0.0));
 
 1126     read_poly(p->base()[2], 2, 
"1 - 2*y");
 
 1127     dependencies.push_back(p->ref_convex(0));
 
 1128     dependencies.push_back(p->node_tab(0));
 
 1160    build_Q2_incomplete_fem(fem_param_list ¶ms,
 
 1161                            std::vector<dal::pstatic_stored_object> &deps,
 
 1162                            bool discontinuous) {
 
 1163     GMM_ASSERT1(params.size() <= 1, 
"Bad number of parameters");
 
 1165     if (params.size() > 0) {
 
 1166       GMM_ASSERT1(params[0].type() == 0, 
"Bad type of parameters");
 
 1167       n = dim_type(::floor(params[0].num() + 0.01));
 
 1168        GMM_ASSERT1(n == 2 || n == 3, 
"Bad parameter, expected value 2 or 3");
 
 1170     auto p = std::make_shared<fem<base_poly>>();
 
 1173     p->is_standard() = p->is_equivalent() = 
true;
 
 1174     p->is_polynomial() = p->is_lagrange() = 
true;
 
 1175     p->estimated_degree() = 2;
 
 1177     p->base().resize(n == 2 ? 8 : 20);
 
 1178     auto lag_dof = discontinuous ? lagrange_nonconforming_dof(n) 
 
 1183         ( 
"1 - 2*x^2*y - 2*x*y^2 + 2*x^2 + 5*x*y + 2*y^2 - 3*x - 3*y;" 
 1184           "4*(x^2*y - x^2 - x*y + x);" 
 1185           "2*x*y*y - 2*x*x*y + 2*x*x - x*y - x;" 
 1186           "4*(x*y*y - x*y - y*y + y);" 
 1188           "2*x*x*y - 2*x*y*y - x*y + 2*y*y - y;" 
 1190           "2*x*x*y + 2*x*y*y - 3*x*y;");
 
 1194       p->add_node(lag_dof, base_small_vector(0.0, 0.0));
 
 1195       p->add_node(lag_dof, base_small_vector(0.5, 0.0));
 
 1196       p->add_node(lag_dof, base_small_vector(1.0, 0.0));
 
 1197       p->add_node(lag_dof, base_small_vector(0.0, 0.5));
 
 1198       p->add_node(lag_dof, base_small_vector(1.0, 0.5));
 
 1199       p->add_node(lag_dof, base_small_vector(0.0, 1.0));
 
 1200       p->add_node(lag_dof, base_small_vector(0.5, 1.0));
 
 1201       p->add_node(lag_dof, base_small_vector(1.0, 1.0));
 
 1204         (
"1 + 2*x^2*y*z + 2*x*y^2*z + 2*x*y*z^2" 
 1205            " - 2*x^2*y - 2*x^2*z - 2*x*y^2 - 2*y^2*z - 2*y*z^2 - 2*x*z^2 - 7*x*y*z" 
 1206            " + 2*x^2 + 2*y^2 + 2*z^2 + 5*y*z + 5*x*z + 5*x*y - 3*x - 3*y - 3*z;" 
 1207          "4*( - x^2*y*z + x*y*z + x^2*z - x*z + x^2*y - x*y - x^2 + x);" 
 1208          "2*x^2*y*z - 2*x*y^2*z - 2*x*y*z^2" 
 1209            " - 2*x^2*y - 2*x^2*z + 2*x*y^2 + 2*x*z^2 + 3*x*y*z + 2*x^2 - x*y - x*z - x;" 
 1210          "4*( - x*y^2*z + x*y^2 + y^2*z + x*y*z - x*y - y^2 - y*z + y);" 
 1211          "4*(x*y^2*z - x*y^2 - x*y*z + x*y);" 
 1212          " - 2*x^2*y*z + 2*x*y^2*z - 2*x*y*z^2" 
 1213            " + 2*x^2*y - 2*x*y^2 - 2*y^2*z + 2*y*z^2 + 3*x*y*z - x*y + 2*y^2 - y*z - y;" 
 1214          "4*(x^2*y*z - x^2*y - x*y*z + x*y);" 
 1215          " - 2*x^2*y*z - 2*x*y^2*z + 2*x*y*z^2 + 2*x^2*y + 2*x*y^2 + x*y*z - 3*x*y;" 
 1216          "4*( - x*y*z^2 + x*z^2 + y*z^2 + x*y*z - x*z - y*z - z^2 + z);" 
 1217          "4*(x*y*z^2 - x*y*z - x*z^2 + x*z);" 
 1218          "4*(x*y*z^2 - x*y*z - y*z^2 + y*z);" 
 1219          "4*( - x*y*z^2 + x*y*z);" 
 1220          " - 2*x^2*y*z - 2*x*y^2*z + 2*x*y*z^2" 
 1221            " + 2*x^2*z + 2*y^2*z - 2*x*z^2 - 2*y*z^2 + 3*x*y*z - x*z - y*z + 2*z^2 - z;" 
 1222          "4*(x^2*y*z - x^2*z - x*y*z + x*z);" 
 1223          " - 2*x^2*y*z + 2*x*y^2*z - 2*x*y*z^2 + 2*x^2*z + 2*x*z^2 + x*y*z - 3*x*z;" 
 1224          "4*(x*y^2*z - y^2*z - x*y*z + y*z);" 
 1225          "4*( - x*y^2*z + x*y*z);" 
 1226          "2*x^2*y*z - 2*x*y^2*z - 2*x*y*z^2 + 2*y^2*z + 2*y*z^2 + x*y*z - 3*y*z;" 
 1227          "4*( - x^2*y*z + x*y*z);" 
 1228          "2*x^2*y*z + 2*x*y^2*z + 2*x*y*z^2 - 5*x*y*z;");
 
 1230       for (
int i = 0; i < 20; ++i) p->base()[i] = 
read_base_poly(3, s);
 
 1232       p->add_node(lag_dof, base_small_vector(0.0, 0.0, 0.0));
 
 1233       p->add_node(lag_dof, base_small_vector(0.5, 0.0, 0.0));
 
 1234       p->add_node(lag_dof, base_small_vector(1.0, 0.0, 0.0));
 
 1235       p->add_node(lag_dof, base_small_vector(0.0, 0.5, 0.0));
 
 1236       p->add_node(lag_dof, base_small_vector(1.0, 0.5, 0.0));
 
 1237       p->add_node(lag_dof, base_small_vector(0.0, 1.0, 0.0));
 
 1238       p->add_node(lag_dof, base_small_vector(0.5, 1.0, 0.0));
 
 1239       p->add_node(lag_dof, base_small_vector(1.0, 1.0, 0.0));
 
 1241       p->add_node(lag_dof, base_small_vector(0.0, 0.0, 0.5));
 
 1242       p->add_node(lag_dof, base_small_vector(1.0, 0.0, 0.5));
 
 1243       p->add_node(lag_dof, base_small_vector(0.0, 1.0, 0.5));
 
 1244       p->add_node(lag_dof, base_small_vector(1.0, 1.0, 0.5));
 
 1246       p->add_node(lag_dof, base_small_vector(0.0, 0.0, 1.0));
 
 1247       p->add_node(lag_dof, base_small_vector(0.5, 0.0, 1.0));
 
 1248       p->add_node(lag_dof, base_small_vector(1.0, 0.0, 1.0));
 
 1249       p->add_node(lag_dof, base_small_vector(0.0, 0.5, 1.0));
 
 1250       p->add_node(lag_dof, base_small_vector(1.0, 0.5, 1.0));
 
 1251       p->add_node(lag_dof, base_small_vector(0.0, 1.0, 1.0));
 
 1252       p->add_node(lag_dof, base_small_vector(0.5, 1.0, 1.0));
 
 1253       p->add_node(lag_dof, base_small_vector(1.0, 1.0, 1.0));
 
 1255     deps.push_back(p->ref_convex(0));
 
 1256     deps.push_back(p->node_tab(0));
 
 1261   static pfem Q2_incomplete_fem
 
 1262   (fem_param_list ¶ms, std::vector<dal::pstatic_stored_object> &deps)
 
 1263   { 
return build_Q2_incomplete_fem(params, deps, 
false); }
 
 1265   static pfem Q2_incomplete_discontinuous_fem
 
 1266   (fem_param_list ¶ms, std::vector<dal::pstatic_stored_object> &deps)
 
 1267   { 
return build_Q2_incomplete_fem(params, deps, 
true); }
 
 1298   build_pyramid_QK_fem(
short_type k, 
bool disc, scalar_type alpha=0) {
 
 1299     auto p = std::make_shared<fem<base_rational_fraction>>();
 
 1302     p->is_standard() = p->is_equivalent() = 
true;
 
 1303     p->is_polynomial() = 
false;
 
 1304     p->is_lagrange() = 
true;
 
 1305     p->estimated_degree() = k;
 
 1307     auto lag_dof = disc ? lagrange_nonconforming_dof(3) : 
lagrange_dof(3);
 
 1310       p->base().resize(1);
 
 1312       p->add_node(lagrange_0_dof(3), base_small_vector(0.0, 0.0, 0.5));
 
 1313     } 
else if (k == 1) {
 
 1314       p->base().resize(5);
 
 1315       base_rational_fraction 
 
 1323       p->add_node(lag_dof, base_small_vector(-1.0, -1.0, 0.0));
 
 1324       p->add_node(lag_dof, base_small_vector( 1.0, -1.0, 0.0));
 
 1325       p->add_node(lag_dof, base_small_vector(-1.0,  1.0, 0.0));
 
 1326       p->add_node(lag_dof, base_small_vector( 1.0,  1.0, 0.0));
 
 1327       p->add_node(lag_dof, base_small_vector( 0.0,  0.0, 1.0));
 
 1329     } 
else if (k == 2) {
 
 1330       p->base().resize(14);
 
 1342       std::vector<base_node> points = { base_node(-1.0, -1.0, 0.0),
 
 1343                                         base_node( 0.0, -1.0, 0.0),
 
 1344                                         base_node( 1.0, -1.0, 0.0),
 
 1345                                         base_node(-1.0,  0.0, 0.0),
 
 1346                                         base_node( 0.0,  0.0, 0.0),
 
 1347                                         base_node( 1.0,  0.0, 0.0),
 
 1348                                         base_node(-1.0,  1.0, 0.0),
 
 1349                                         base_node( 0.0,  1.0, 0.0),
 
 1350                                         base_node( 1.0,  1.0, 0.0),
 
 1351                                         base_node(-0.5, -0.5, 0.5),
 
 1352                                         base_node( 0.5, -0.5, 0.5),
 
 1353                                         base_node(-0.5,  0.5, 0.5),
 
 1354                                         base_node( 0.5,  0.5, 0.5),
 
 1355                                         base_node( 0.0,  0.0, 1.0) };
 
 1357       if (disc && alpha != scalar_type(0)) {
 
 1359           gmm::mean_value(points.begin(), points.end());
 
 1360         for (
auto && pt : points)
 
 1361           pt = (1-
alpha)*pt + alpha*G;
 
 1365           S[1] = 1. / (1-
alpha);
 
 1378       p->base()[ 0] = Q*Q*xi0*xi1*(x*y-z*un_z);
 
 1379       p->base()[ 1] = -Q*Q*xi0*xi1*xi2*y*4.;
 
 1380       p->base()[ 2] = Q*Q*xi1*xi2*(-x*y-z*un_z);
 
 1381       p->base()[ 3] = -Q*Q*xi3*xi0*xi1*x*4.;
 
 1382       p->base()[ 4] = Q*Q*xi0*xi1*xi2*xi3*16.;
 
 1383       p->base()[ 5] = Q*Q*xi1*xi2*xi3*x*4.;
 
 1384       p->base()[ 6] = Q*Q*xi3*xi0*(-x*y-z*un_z);
 
 1385       p->base()[ 7] = Q*Q*xi2*xi3*xi0*y*4.;
 
 1386       p->base()[ 8] = Q*Q*xi2*xi3*(x*y-z*un_z);
 
 1387       p->base()[ 9] = Q*z*xi0*xi1*4.;
 
 1388       p->base()[10] = Q*z*xi1*xi2*4.;
 
 1389       p->base()[11] = Q*z*xi3*xi0*4.;
 
 1390       p->base()[12] = Q*z*xi2*xi3*4.;
 
 1391       p->base()[13] = z*(z*2-ones);
 
 1393       for (
const auto &pt : points)
 
 1394         p->add_node(lag_dof, pt);
 
 1396     } 
else GMM_ASSERT1(
false, 
"Sorry, pyramidal Lagrange fem " 
 1397                        "implemented only for degree 0, 1 or 2");
 
 1403   static pfem pyramid_QK_fem
 
 1404   (fem_param_list ¶ms, std::vector<dal::pstatic_stored_object> &deps) {
 
 1405     GMM_ASSERT1(params.size() <= 1, 
"Bad number of parameters");
 
 1407     if (params.size() > 0) {
 
 1408       GMM_ASSERT1(params[0].type() == 0, 
"Bad type of parameters");
 
 1409       k = dim_type(::floor(params[0].num() + 0.01));
 
 1411     pfem p = build_pyramid_QK_fem(k, 
false);
 
 1412     deps.push_back(p->ref_convex(0));
 
 1413     deps.push_back(p->node_tab(0));
 
 1417   static pfem pyramid_QK_disc_fem
 
 1418   (fem_param_list ¶ms, std::vector<dal::pstatic_stored_object> &deps) {
 
 1419     GMM_ASSERT1(params.size() <= 2, 
"Bad number of parameters");
 
 1421     if (params.size() > 0) {
 
 1422       GMM_ASSERT1(params[0].type() == 0, 
"Bad type of parameters");
 
 1423       k = dim_type(::floor(params[0].num() + 0.01));
 
 1425     scalar_type 
alpha(0);
 
 1426     if (params.size() > 1) {
 
 1427       GMM_ASSERT1(params[1].type() == 0, 
"Bad type of parameters");
 
 1428       alpha = params[1].num();
 
 1430     pfem p = build_pyramid_QK_fem(k, 
true, alpha);
 
 1431     deps.push_back(p->ref_convex(0));
 
 1432     deps.push_back(p->node_tab(0));
 
 1455   static pfem build_pyramid_Q2_incomplete_fem(
bool disc) {
 
 1456     auto p = std::make_shared<fem<base_rational_fraction>>();
 
 1459     p->is_standard() = p->is_equivalent() = 
true;
 
 1460     p->is_polynomial() = 
false;
 
 1461     p->is_lagrange() = 
true;
 
 1462     p->estimated_degree() = 2;
 
 1464     auto lag_dof = disc ? lagrange_nonconforming_dof(3) : 
lagrange_dof(3);
 
 1466     p->base().resize(13);
 
 1489     p->base()[ 0] = mmm0_ * pmmm + base_rational_fraction(mmm0_ * xy, p00m); 
 
 1490     p->base()[ 1] = base_rational_fraction(pp0m * pm0m * p0mm * 0.5, p00m);  
 
 1491     p->base()[ 2] = mpm0_ * ppmm - base_rational_fraction(mpm0_ * xy, p00m); 
 
 1492     p->base()[ 3] = base_rational_fraction(p0pm * p0mm * pm0m * 0.5, p00m);  
 
 1493     p->base()[ 4] = base_rational_fraction(p0pm * p0mm * pp0m * 0.5, p00m);  
 
 1494     p->base()[ 5] = mmp0_ * pmpm - base_rational_fraction(mmp0_ * xy, p00m); 
 
 1495     p->base()[ 6] = base_rational_fraction(pp0m * pm0m * p0pm * 0.5, p00m);  
 
 1496     p->base()[ 7] = mpp0_ * pppm + base_rational_fraction(mpp0_ * xy, p00m); 
 
 1497     p->base()[ 8] = base_rational_fraction(pm0m * p0mm * z, p00m);           
 
 1498     p->base()[ 9] = base_rational_fraction(pp0m * p0mm * z, p00m);           
 
 1499     p->base()[10] = base_rational_fraction(pm0m * p0pm * z, p00m);           
 
 1500     p->base()[11] = base_rational_fraction(pp0m * p0pm * z, p00m);           
 
 1503     p->add_node(lag_dof, base_small_vector(-1.0, -1.0, 0.0));
 
 1504     p->add_node(lag_dof, base_small_vector( 0.0, -1.0, 0.0));
 
 1505     p->add_node(lag_dof, base_small_vector( 1.0, -1.0, 0.0));
 
 1506     p->add_node(lag_dof, base_small_vector(-1.0,  0.0, 0.0));
 
 1507     p->add_node(lag_dof, base_small_vector( 1.0,  0.0, 0.0));
 
 1508     p->add_node(lag_dof, base_small_vector(-1.0,  1.0, 0.0));
 
 1509     p->add_node(lag_dof, base_small_vector( 0.0,  1.0, 0.0));
 
 1510     p->add_node(lag_dof, base_small_vector( 1.0,  1.0, 0.0));
 
 1511     p->add_node(lag_dof, base_small_vector(-0.5, -0.5, 0.5));
 
 1512     p->add_node(lag_dof, base_small_vector( 0.5, -0.5, 0.5));
 
 1513     p->add_node(lag_dof, base_small_vector(-0.5,  0.5, 0.5));
 
 1514     p->add_node(lag_dof, base_small_vector( 0.5,  0.5, 0.5));
 
 1515     p->add_node(lag_dof, base_small_vector( 0.0,  0.0, 1.0));
 
 1521   static pfem pyramid_Q2_incomplete_fem
 
 1522   (fem_param_list ¶ms, std::vector<dal::pstatic_stored_object> &deps) {
 
 1523     GMM_ASSERT1(params.size() == 0, 
"Bad number of parameters");
 
 1524     pfem p = build_pyramid_Q2_incomplete_fem(
false);
 
 1525     deps.push_back(p->ref_convex(0));
 
 1526     deps.push_back(p->node_tab(0));
 
 1530   static pfem pyramid_Q2_incomplete_disc_fem
 
 1531   (fem_param_list ¶ms, std::vector<dal::pstatic_stored_object> &deps) {
 
 1532     GMM_ASSERT1(params.size() == 0, 
"Bad number of parameters");
 
 1533     pfem p = build_pyramid_Q2_incomplete_fem(
true);
 
 1534     deps.push_back(p->ref_convex(0));
 
 1535     deps.push_back(p->node_tab(0));
 
 1557   static pfem build_prism_incomplete_P2_fem(
bool disc) {
 
 1558     auto p = std::make_shared<fem<base_rational_fraction>>();
 
 1561     p->is_standard() = p->is_equivalent() = 
true;
 
 1562     p->is_polynomial() = 
false;
 
 1563     p->is_lagrange() = 
true;
 
 1564     p->estimated_degree() = 2;
 
 1566     auto lag_dof = disc ? lagrange_nonconforming_dof(3) : 
lagrange_dof(3);
 
 1568     p->base().resize(15);
 
 1571       ( 
"-2*y*z^2-2*x*z^2+2*z^2-2*y^2*z-4*x*y*z+5*y*z-2*x^2*z+5*x*z" 
 1572           "-3*z+2*y^2+4*x*y-3*y+2*x^2-3*x+1;" 
 1573         "4*(x*y*z+x^2*z-x*z-x*y-x^2+x);" 
 1574         "2*x*z^2-2*x^2*z-x*z+2*x^2-x;" 
 1575         "4*(y^2*z+x*y*z-y*z-y^2-x*y+y);" 
 1577         "2*y*z^2-2*y^2*z-y*z+2*y^2-y;" 
 1578         "4*(y*z^2+x*z^2-z^2-y*z-x*z+z);" 
 1581         "-2*y*z^2-2*x*z^2+2*z^2+2*y^2*z+4*x*y*z-y*z+2*x^2*z-x*z-z;" 
 1582         "4*(-x*y*z-x^2*z+x*z);" 
 1583         "2*x*z^2+2*x^2*z-3*x*z;" 
 1584         "4*(-y^2*z-x*y*z+y*z);" 
 1586         "2*y*z^2+2*y^2*z-3*y*z;");
 
 1588     for (
int i = 0; i < 15; ++i)
 
 1591     p->add_node(lag_dof, base_small_vector(0.0, 0.0, 0.0));
 
 1592     p->add_node(lag_dof, base_small_vector(0.5, 0.0, 0.0));
 
 1593     p->add_node(lag_dof, base_small_vector(1.0, 0.0, 0.0));
 
 1594     p->add_node(lag_dof, base_small_vector(0.0, 0.5, 0.0));
 
 1595     p->add_node(lag_dof, base_small_vector(0.5, 0.5, 0.0));
 
 1596     p->add_node(lag_dof, base_small_vector(0.0, 1.0, 0.0));
 
 1597     p->add_node(lag_dof, base_small_vector(0.0, 0.0, 0.5));
 
 1598     p->add_node(lag_dof, base_small_vector(1.0, 0.0, 0.5));
 
 1599     p->add_node(lag_dof, base_small_vector(0.0, 1.0, 0.5));
 
 1600     p->add_node(lag_dof, base_small_vector(0.0, 0.0, 1.0));
 
 1601     p->add_node(lag_dof, base_small_vector(0.5, 0.0, 1.0));
 
 1602     p->add_node(lag_dof, base_small_vector(1.0, 0.0, 1.0));
 
 1603     p->add_node(lag_dof, base_small_vector(0.0, 0.5, 1.0));
 
 1604     p->add_node(lag_dof, base_small_vector(0.5, 0.5, 1.0));
 
 1605     p->add_node(lag_dof, base_small_vector(0.0, 1.0, 1.0));
 
 1611   static pfem prism_incomplete_P2_fem
 
 1612   (fem_param_list ¶ms, std::vector<dal::pstatic_stored_object> &deps) {
 
 1613     GMM_ASSERT1(params.size() == 0, 
"Bad number of parameters");
 
 1614     pfem p = build_prism_incomplete_P2_fem(
false);
 
 1615     deps.push_back(p->ref_convex(0));
 
 1616     deps.push_back(p->node_tab(0));
 
 1620   static pfem prism_incomplete_P2_disc_fem
 
 1621   (fem_param_list ¶ms, std::vector<dal::pstatic_stored_object> &deps) {
 
 1622     GMM_ASSERT1(params.size() == 0, 
"Bad number of parameters");
 
 1623     pfem p = build_prism_incomplete_P2_fem(
true);
 
 1624     deps.push_back(p->ref_convex(0));
 
 1625     deps.push_back(p->node_tab(0));
 
 1633   struct P1_wabbfoaf_ : 
public PK_fem_ {
 
 1634     P1_wabbfoaf_(dim_type nc);
 
 1637   P1_wabbfoaf_::P1_wabbfoaf_(dim_type nc) : PK_fem_(nc, 1) {
 
 1638     is_lag = 
false; es_degree = 2;
 
 1639     base_node pt(nc); pt.fill(0.5);
 
 1640     unfreeze_cvs_node();
 
 1643     base_[nc+1] = base_[1]; base_[nc+1] *= scalar_type(1 << nc);
 
 1644     for (
int i = 2; i <= nc; ++i) base_[nc+1] *= base_[i];
 
 1650   static pfem P1_with_bubble_on_a_face(fem_param_list ¶ms,
 
 1651         std::vector<dal::pstatic_stored_object> &dependencies) {
 
 1652     GMM_ASSERT1(params.size() == 1, 
"Bad number of parameters : " 
 1653                 << params.size() << 
" should be 1.");
 
 1654     GMM_ASSERT1(params[0].type() == 0, 
"Bad type of parameters");
 
 1655     int n = int(::floor(params[0].num() + 0.01));
 
 1656     GMM_ASSERT1(n > 1 && n < 100 && 
double(n) == params[0].num(),
 
 1658     pfem p  = std::make_shared<P1_wabbfoaf_>(dim_type(n));
 
 1659     dependencies.push_back(p->ref_convex(0));
 
 1660     dependencies.push_back(p->node_tab(0));
 
 1670   struct CIPK_SQUARE_ : 
public fem<base_poly> {
 
 1672     mutable base_matrix K;
 
 1673     base_small_vector norient;
 
 1674     mutable bgeot::pgeotrans_precomp pgp;
 
 1678     bgeot::pstored_point_tab pC;
 
 1680     virtual void mat_trans(base_matrix &M, 
const base_matrix &G,
 
 1682     CIPK_SQUARE_(dim_type nc_);
 
 1685   void CIPK_SQUARE_::mat_trans(base_matrix &M,
 
 1686                               const base_matrix &G,
 
 1694     dim_type N = dim_type(G.nrows());
 
 1696     if (pgt != pgt_stored) {
 
 1698       pgp = bgeot::geotrans_precomp(pgt, pC, 0);
 
 1702     scalar_type s0(0), m0(M_PI);
 
 1703     for (
size_type i = 0; i < N; ++i, m0*=M_PI) s0 += m0 * K(i, 0);
 
 1704     scalar_type s1(0), m1(M_PI);
 
 1705     for (
size_type i = 0; i < N; ++i, m1*=M_PI) s1 += m1 * K(i, 1);
 
 1706     scalar_type a0 = gmm::sgn(s0), a1 = gmm::sgn(s1);
 
 1710       if (K(i, 0) * a0 < K(i, 1) * a1 - 1e-6) 
break;
 
 1711       if (K(i, 0) * a0 > K(i, 1) * a1 + 1e-6) { inv = 
true; 
break; }
 
 1715       for (
size_type i = 1, l = 1; i < k; ++i)
 
 1717           { 
if (((i-j) % 2) == 1) M(l, l) = -1.0; } 
 
 1721       for (
size_type i = 1, l = 1; i < k; ++i)
 
 1723           { 
if ((j % 2) == 1) M(l, l) = -1.0; } 
 
 1728       for (
size_type i = 1, l = 1; i < k; ++i)
 
 1730           { M(l, l) = 0.0; M(l, l+i-2*j) = 1.0; }
 
 1734   CIPK_SQUARE_::CIPK_SQUARE_(dim_type k_) {
 
 1739     dim_ = cvr->structure()->dim();
 
 1743     is_standard_fem = is_lag = is_equiv = 
false;
 
 1744     base_.resize((k+1)*(k+2)/2);
 
 1746     std::vector<base_node> C(1);
 
 1747     C[0] = base_node(0.5, 0.5);
 
 1748     pC = bgeot::store_point_tab(C);
 
 1751     read_poly(X, 2, 
"x-0.5"); read_poly(Y, 2, 
"y-0.5");
 
 1753     base_[0] = bgeot::one_poly(2);
 
 1754     add_node(ipk_center_dof(2,0), C[0]);
 
 1756     for (
size_type i = 1, l = 1; i < k; ++i)
 
 1757       for (
size_type j = 0; j <= i; ++j, ++l) { 
 
 1758         base_[l] = base_[0];
 
 1759         for (
size_type n = 0; n < i-j; ++n) base_[l] *= X;
 
 1760         for (
size_type n = 0; n < j; ++n) base_[l] *= Y;
 
 1762         add_node(ipk_center_dof(2,l), C[0]);
 
 1766   static pfem CIPK_SQUARE(fem_param_list ¶ms,
 
 1767         std::vector<dal::pstatic_stored_object> &dependencies) {
 
 1768     GMM_ASSERT1(params.size() == 1, 
"Bad number of parameters : " 
 1769                 << params.size() << 
" should be 1.");
 
 1770     GMM_ASSERT1(params[0].type() == 0, 
"Bad type of parameters");
 
 1771     int k = int(::floor(params[0].num() + 0.01));
 
 1772     GMM_ASSERT1(k >= 0 && k < 50 && 
double(k) == params[0].num(),
 
 1774     pfem p = std::make_shared<CIPK_SQUARE_>(dim_type(k));
 
 1775     dependencies.push_back(p->ref_convex(0));
 
 1776     dependencies.push_back(p->node_tab(0));
 
 1788   struct RTk_ : 
public fem<base_poly> {
 
 1790     mutable base_matrix K;
 
 1791     base_small_vector norient;
 
 1792     mutable bgeot::pgeotrans_precomp pgp;
 
 1796     virtual void mat_trans(base_matrix &M, 
const base_matrix &G,
 
 1798     RTk_(dim_type nc_, dim_type k_);
 
 1801   void RTk_::mat_trans(base_matrix &M,
 
 1802                        const base_matrix &G,
 
 1804     dim_type N = dim_type(G.nrows());
 
 1806     if (pgt != pgt_stored) {
 
 1808       pgp = bgeot::geotrans_precomp(pgt, node_tab(0), 0);
 
 1811     GMM_ASSERT1(N == nc, 
"Sorry, this element works only in dimension " << nc);
 
 1814     for (
unsigned j = 0; j <= nb_dof(0); ++j) {
 
 1816       if (faces_of_dof(0, j).size()) {
 
 1817         unsigned nf = faces_of_dof(0, j)[0];
 
 1818         if (!(pgt->is_linear()))
 
 1821         gmm::mult(gmm::transposed(K), cvr->normals()[nf], n);
 
 1827         if (ps < 0) M(j, j) *= scalar_type(-1);
 
 1828         if (gmm::abs(ps) < 1E-8)
 
 1829           GMM_WARNING2(
"RTk : The normal orientation may be incorrect");
 
 1846   RTk_::RTk_(dim_type nc_, dim_type k_) {
 
 1852     for (
unsigned i = 1; i < nc; ++i) norient[i] = norient[i-1]*M_PI;
 
 1855     dim_ = cvr->structure()->dim();
 
 1859     is_standard_fem = is_lag = is_equiv = 
false;
 
 1861     vtype = VECTORIAL_PRIMAL_TYPE;
 
 1863     bgeot::pconvex_ref cvn
 
 1867     for (
unsigned i = 1; i < nc; ++i) nddl *= (k+i);
 
 1868     for (
unsigned i = 1; i < nc; ++i) nddl /= i;
 
 1869     std::vector<bgeot::base_poly> base_RT(nddl*nc, base_poly(nc,0));
 
 1874     for (
unsigned i = 0; i < nddl_pk; ++i)
 
 1875       for (
unsigned j = 0; j < nc; ++j) {
 
 1876         base_RT[i*nc + j * (nddl_pk*nc+1)] = PK.base()[i];
 
 1881       base_poly p0(nc,0); p0.add_monomial(1., pi);
 
 1883       if (pi.degree() == k) {
 
 1884         for (dim_type j = 0; j < nc; ++j) {
 
 1885           base_poly p(nc,0); p.add_monomial(1., pi);
 
 1886           base_RT[nddl_pk*nc*nc + l * nc + j] = p * base_poly(nc, 1, j);
 
 1890       for (dim_type j = 0; j < nc; ++j)
 
 1891         { pi[j]++; 
if (pi[j] == k+1) pi[j] = 0; 
else break; }
 
 1892     } 
while(pi.degree() != 0);
 
 1893     GMM_ASSERT2(nddl_pk*nc+l == nddl, 
"Internal error");
 
 1896     base_matrix A(nddl, nddl);
 
 1897     unsigned ipoint = 0;
 
 1898     for (
unsigned i = 0; i < cvn->nb_points(); ++i) {
 
 1899       l = 0; 
unsigned cpt_found = 0;
 
 1900       for(dim_type j = 0; j < nc+1; ++j)
 
 1901         if (gmm::abs(cvn->is_in_face(j, cvn->points()[i])) < 1E-10)
 
 1902           { l = j; cpt_found++; }
 
 1904       switch (cpt_found) {
 
 1906         for (
unsigned j = 0; j < nddl; ++j) {
 
 1907           for (
unsigned m = 0; m < nc; ++m)
 
 1908             A(ipoint+m, j) = base_RT[j*nc+m].eval(cvn->points()[i].begin());
 
 1910         for (dim_type m = 0; m < nc; ++m)
 
 1911           add_node(to_coord_dof(
lagrange_dof(nc), m), cvn->points()[i]);
 
 1913         ipoint += nc; 
break;
 
 1915          for (
unsigned j = 0; j < nddl; ++j) {
 
 1916           base_small_vector v(nc);
 
 1917           for (
unsigned m = 0; m < nc; ++m)
 
 1918             v[m] = base_RT[j*nc+m].eval(cvn->points()[i].begin());
 
 1921         add_node(normal_component_dof(nc), cvn->points()[i]);
 
 1926     GMM_ASSERT2(ipoint == nddl, 
"Internal error");
 
 1930     base_.resize(nddl*nc, base_poly(nc,0));
 
 1933         for (
unsigned m = 0; m < nc; ++m)
 
 1934           if (gmm::abs(A(j, i)) > 1e-14)
 
 1935             base_[i+m*nddl] += base_RT[j*nc+m] * A(j, i);
 
 1938   static pfem RTk(fem_param_list ¶ms,
 
 1939         std::vector<dal::pstatic_stored_object> &dependencies) {
 
 1940     GMM_ASSERT1(params.size() == 2, 
"Bad number of parameters : " 
 1941                 << params.size() << 
" should be 2.");
 
 1942     GMM_ASSERT1(params[0].type() == 0, 
"Bad type of parameters");
 
 1943     GMM_ASSERT1(params[1].type() == 0, 
"Bad type of parameters");
 
 1944     int n = int(::floor(params[0].num() + 0.01));
 
 1945     int k = int(::floor(params[1].num() + 0.01));
 
 1946     GMM_ASSERT1(n > 1 && n < 100 && 
double(n) == params[0].num(),
 
 1948     GMM_ASSERT1(k >= 0 && k < 100 && 
double(k) == params[1].num(),
 
 1950     pfem p = std::make_shared<RTk_>(dim_type(n), dim_type(k));
 
 1951     dependencies.push_back(p->ref_convex(0));
 
 1952     dependencies.push_back(p->node_tab(0));
 
 2046   static pfem P1_RT0(fem_param_list ¶ms,
 
 2047         std::vector<dal::pstatic_stored_object> &) {
 
 2048     GMM_ASSERT1(params.size() == 1, 
"Bad number of parameters : " 
 2049                 << params.size() << 
" should be 1.");
 
 2050     GMM_ASSERT1(params[0].type() == 0, 
"Bad type of parameters");
 
 2051     int n = int(::floor(params[0].num() + 0.01));
 
 2052     GMM_ASSERT1(n > 1 && n < 100 && 
double(n) == params[0].num(),
 
 2054     std::stringstream name;
 
 2055     name << 
"FEM_RTK(" << n << 
",0)";
 
 2069   struct P1_RT0Q_ : 
public fem<base_poly> {
 
 2071     mutable base_matrix K;
 
 2072     base_small_vector norient;
 
 2073     mutable bgeot::pgeotrans_precomp pgp;
 
 2077     virtual void mat_trans(base_matrix &M, 
const base_matrix &G,
 
 2079     P1_RT0Q_(dim_type nc_);
 
 2082   void P1_RT0Q_::mat_trans(base_matrix &M,
 
 2083                           const base_matrix &G,
 
 2085     dim_type N = dim_type(G.nrows());
 
 2087     if (pgt != pgt_stored) {
 
 2089       pgp = bgeot::geotrans_precomp(pgt, node_tab(0),0);
 
 2092     GMM_ASSERT1(N == nc, 
"Sorry, this element works only in dimension " << nc);
 
 2095     for (
unsigned i = 0; i < unsigned(2*nc); ++i) {
 
 2096       if (!(pgt->is_linear()))
 
 2099       gmm::mult(gmm::transposed(K), cvr->normals()[i], n);
 
 2104       if (ps < 0) M(i, i) *= scalar_type(-1);
 
 2105       if (gmm::abs(ps) < 1E-8)
 
 2106         GMM_WARNING2(
"RT0Q : The normal orientation may be incorrect");
 
 2110   P1_RT0Q_::P1_RT0Q_(dim_type nc_) {
 
 2116     for (
unsigned i = 1; i < nc; ++i) norient[i] = norient[i-1]*M_PI;
 
 2119     dim_ = cvr->structure()->dim();
 
 2123     is_standard_fem = is_lag = is_equiv = 
false;
 
 2125     vtype = VECTORIAL_PRIMAL_TYPE;
 
 2126     base_.resize(nc*2*nc);
 
 2129       base_[j] = bgeot::null_poly(nc);
 
 2132       base_[2*i+i*2*nc] = base_poly(nc, 1, i);
 
 2133       base_[2*i+1+i*2*nc] = base_poly(nc, 1, i) - bgeot::one_poly(nc);
 
 2136     base_node pt(nc); pt.fill(0.5);
 
 2140       add_node(normal_component_dof(nc), pt);
 
 2142       add_node(normal_component_dof(nc), pt);
 
 2147   static pfem P1_RT0Q(fem_param_list ¶ms,
 
 2148         std::vector<dal::pstatic_stored_object> &dependencies) {
 
 2149     GMM_ASSERT1(params.size() == 1, 
"Bad number of parameters : " 
 2150                 << params.size() << 
" should be 1.");
 
 2151     GMM_ASSERT1(params[0].type() == 0, 
"Bad type of parameters");
 
 2152     int n = int(::floor(params[0].num() + 0.01));
 
 2153     GMM_ASSERT1(n > 1 && n < 100 && 
double(n) == params[0].num(),
 
 2155     pfem p = std::make_shared<P1_RT0Q_>(dim_type(n));
 
 2156     dependencies.push_back(p->ref_convex(0));
 
 2157     dependencies.push_back(p->node_tab(0));
 
 2166   struct BDMk_ : 
public fem<base_poly> {
 
 2168     mutable base_matrix K;
 
 2169     base_small_vector norient;
 
 2170     mutable bgeot::pgeotrans_precomp pgp;
 
 2174     virtual void mat_trans(base_matrix &M, 
const base_matrix &G,
 
 2176     BDMk_(dim_type nc_, dim_type k_);
 
 2179   void BDMk_::mat_trans(base_matrix &M,
 
 2180                        const base_matrix &G,
 
 2182     dim_type N = dim_type(G.nrows());
 
 2184     if (pgt != pgt_stored) {
 
 2186       pgp = bgeot::geotrans_precomp(pgt, node_tab(0), 0);
 
 2189     GMM_ASSERT1(N == nc, 
"Sorry, this element works only in dimension " << nc);
 
 2192     for (
unsigned j = 0; j <= nb_dof(0); ++j) {
 
 2194       if (faces_of_dof(0, j).size()) {
 
 2195         unsigned nf = faces_of_dof(0, j)[0];
 
 2196         if (!(pgt->is_linear()))
 
 2199         gmm::mult(gmm::transposed(K), cvr->normals()[nf], n);
 
 2205         if (ps < 0) M(j, j) *= scalar_type(-1);
 
 2206         if (gmm::abs(ps) < 1E-8)
 
 2207           GMM_WARNING2(
"RTk : The normal orientation may be incorrect");
 
 2218   BDMk_::BDMk_(dim_type nc_, dim_type k_) {
 
 2224     for (
unsigned i = 1; i < nc; ++i) norient[i] = norient[i-1]*M_PI;
 
 2227     dim_ = cvr->structure()->dim();
 
 2231     is_standard_fem = is_lag = is_equiv = 
false;
 
 2233     vtype = VECTORIAL_PRIMAL_TYPE;
 
 2235     bgeot::pconvex_ref cvn
 
 2240     size_type nddl_pk = (PK.base()).size(), nddl = nddl_pk * nc;
 
 2241     std::vector<bgeot::base_poly> base_BDM(nddl*nc, base_poly(nc,0));
 
 2242     for (
unsigned i = 0; i < nddl_pk; ++i)
 
 2243       for (
unsigned j = 0; j < nc; ++j) {
 
 2244         base_BDM[i*nc + j * (nddl_pk*nc+1)] = PK.base()[i];
 
 2246     GMM_ASSERT2(nddl_pk*nc == nddl, 
"Internal error");
 
 2249     base_matrix A(nddl, nddl);
 
 2250     unsigned ipoint = 0;
 
 2251     for (
unsigned i = 0; i < cvn->nb_points(); ++i) {
 
 2252       unsigned l = 0; 
unsigned cpt_found = 0;
 
 2253       for(dim_type j = 0; j < nc+1; ++j)
 
 2254         if (gmm::abs(cvn->is_in_face(j, cvn->points()[i])) < 1E-10)
 
 2255           { l = j; cpt_found++; }
 
 2257       if (cpt_found == 1) { 
 
 2258         for (
unsigned j = 0; j < nddl; ++j) {
 
 2259           base_small_vector v(nc);
 
 2260           for (
unsigned m = 0; m < nc; ++m)
 
 2261             v[m] = base_BDM[j*nc+m].eval(cvn->points()[i].begin());
 
 2264         add_node(normal_component_dof(nc), cvn->points()[i]);
 
 2269     base_node barycenter(nc); barycenter.fill(1./(nc+1));
 
 2272       bgeot::pbasic_mesh pm;
 
 2273       bgeot::pmesh_precomposite pmp;
 
 2278       mf.set_classical_finite_element(pm->convex_index(), bgeot::dim_type(k-1));
 
 2281       mfd.set_classical_finite_element(pm->convex_index(), k);
 
 2283       mim.set_integration_method(bgeot::dim_type(k*(k-1)));
 
 2285       gmm::sub_interval Iu(0, mfd.nb_dof()), Ip(Iu.last(), mf.nb_dof());
 
 2286       base_vector u(mfd.nb_dof()), p(mf.nb_dof());
 
 2287       ga_workspace workspace;
 
 2288       workspace.add_fem_variable(
"u", mfd, Iu, u);
 
 2289       workspace.add_fem_variable(
"p", mf, Ip, p);
 
 2290       workspace.add_expression(
"Div(u).Test_p", mim);
 
 2291       workspace.assembly(2);
 
 2292       gmm::sub_interval IA1(ipoint, mf.nb_dof()), IA2(0, nddl);
 
 2293       if (gmm::mat_nrows(workspace.assembled_matrix()))
 
 2294         gmm::add(gmm::sub_matrix(workspace.assembled_matrix(), Ip, Iu),
 
 2295                  gmm::sub_matrix(A, IA1, IA2));
 
 2297       for (
size_type i = 0; i < mf.nb_dof(); ++i) {
 
 2298         add_node(ipk_center_dof(nc, ipoint), barycenter);
 
 2304 #     if defined(GMM_USES_LAPACK) 
 2305       base_vector EIG(nddl);
 
 2306       base_matrix U(nddl, nddl), V(nddl, nddl), AA(A);
 
 2307       gmm::svd(AA, U, V, EIG);
 
 2311         if (gmm::abs(EIG[i]) < 1E-16) {
 
 2312           gmm::copy(gmm::mat_row(V, i), gmm::mat_row(A, ipoint));
 
 2313           add_node(ipk_center_dof(nc, ipoint), barycenter); ++ipoint;
 
 2316       GMM_ASSERT2(
false, 
"You need Lapack to useget BDMk with k > 2");
 
 2320     GMM_ASSERT2(ipoint == nddl, 
"Internal error");
 
 2324     base_.resize(nddl*nc, base_poly(nc,0));
 
 2327         for (
unsigned m = 0; m < nc; ++m)
 
 2328           if (gmm::abs(A(j, i)) > 1e-14)
 
 2329             base_[i+m*nddl] += base_BDM[j*nc+m] * A(j, i);
 
 2336   static pfem BDMk(fem_param_list ¶ms,
 
 2337         std::vector<dal::pstatic_stored_object> &dependencies) {
 
 2338     GMM_ASSERT1(params.size() == 2, 
"Bad number of parameters for BDM element: " 
 2339                 << params.size() << 
" should be 2.");
 
 2340     GMM_ASSERT1(params[0].type() == 0, 
"Bad type of parameters");
 
 2341     GMM_ASSERT1(params[1].type() == 0, 
"Bad type of parameters");
 
 2342     int n = int(::floor(params[0].num() + 0.01));
 
 2343     int k = int(::floor(params[1].num() + 0.01));
 
 2344     GMM_ASSERT1(n > 1 && n < 100 && 
double(n) == params[0].num(),
 
 2345                 "Bad parameter n for BDM element");
 
 2346     GMM_ASSERT1(k >= 1 && k < 100 && 
double(k) == params[1].num(),
 
 2347                 "Bad parameter k for BDM element");
 
 2348     pfem p = std::make_shared<BDMk_>(dim_type(n), dim_type(k));
 
 2349     dependencies.push_back(p->ref_convex(0));
 
 2350     dependencies.push_back(p->node_tab(0));
 
 2359   struct P1_nedelec_ : 
public fem<base_poly> {
 
 2361     base_small_vector norient;
 
 2362     std::vector<base_small_vector> tangents;
 
 2363     mutable bgeot::pgeotrans_precomp pgp;
 
 2365     mutable pfem_precomp pfp;
 
 2367     virtual void mat_trans(base_matrix &M, 
const base_matrix &G,
 
 2369     P1_nedelec_(dim_type nc_);
 
 2372   void P1_nedelec_::mat_trans(base_matrix &M, 
const base_matrix &G,
 
 2375     GMM_ASSERT1(G.nrows() == nc,
 
 2376                 "Sorry, this element works only in dimension " << nc);
 
 2378     if (pgt != pgt_stored) {
 
 2380       pgp = bgeot::geotrans_precomp(pgt, node_tab(0), 0);
 
 2381       pfp = 
fem_precomp(std::make_shared<P1_nedelec_>(nc), node_tab(0), 0);
 
 2383     fem_interpolation_context ctx(pgp,pfp,0,G,0);
 
 2385     for (
unsigned i = 0; i < nb_dof(0); ++i) {
 
 2389       gmm::mult(gmm::transposed(ctx.B()), t, v);
 
 2391       if (ps < 0) v *= scalar_type(-1);
 
 2392       if (gmm::abs(ps) < 1E-8)
 
 2393         GMM_WARNING2(
"Nedelec element: " 
 2394                      "The normal orientation may be incorrect");
 
 2396       const bgeot::base_tensor &tt = pfp->val(i);
 
 2397       for (
size_type j = 0; j < nb_dof(0); ++j) {
 
 2398         scalar_type a = scalar_type(0);
 
 2399         for (
size_type k = 0; k < nc; ++k) a += tt(j, k) * v[k];
 
 2408   P1_nedelec_::P1_nedelec_(dim_type nc_) {
 
 2413     for (
unsigned i = 1; i < nc; ++i) norient[i] = norient[i-1]*M_PI;
 
 2416     dim_ = cvr->structure()->dim();
 
 2420     is_standard_fem = is_lag = is_equiv = 
false;
 
 2422     vtype = VECTORIAL_DUAL_TYPE;
 
 2423     base_.resize(nc*(nc+1)*nc/2);
 
 2424     tangents.resize(nc*(nc+1)*nc/2);
 
 2426     std::vector<base_poly> lambda(nc+1);
 
 2427     std::vector<base_vector> grad_lambda(nc+1);
 
 2428     lambda[0] = bgeot::one_poly(nc);
 
 2430     gmm::fill(grad_lambda[0], scalar_type(-1));
 
 2432       lambda[i] = base_poly(nc, 1, 
short_type(i-1));
 
 2433       lambda[0] -= lambda[i];
 
 2435       grad_lambda[i][i-1] = 1;
 
 2440       for (
size_type l = k+1; l <= nc; ++l, ++j) {
 
 2442           base_[j+i*(nc*(nc+1)/2)] = lambda[k] * grad_lambda[l][i]
 
 2443             - lambda[l] * grad_lambda[k][i];
 
 2446         base_node pt = (cvr->points()[k] + cvr->points()[l]) / scalar_type(2);
 
 2447         add_node(edge_component_dof(nc), pt);
 
 2448         tangents[j] = cvr->points()[l] - cvr->points()[k];
 
 2453   static pfem P1_nedelec(fem_param_list ¶ms,
 
 2454         std::vector<dal::pstatic_stored_object> &dependencies) {
 
 2455     GMM_ASSERT1(params.size() == 1, 
"Bad number of parameters : " 
 2456                 << params.size() << 
" should be 1.");
 
 2457     GMM_ASSERT1(params[0].type() == 0, 
"Bad type of parameters");
 
 2458     int n = int(::floor(params[0].num() + 0.01));
 
 2459     GMM_ASSERT1(n > 1 && n < 100 && 
double(n) == params[0].num(),
 
 2461     pfem p = std::make_shared<P1_nedelec_>(dim_type(n));
 
 2462     dependencies.push_back(p->ref_convex(0));
 
 2463     dependencies.push_back(p->node_tab(0));
 
 2472   struct P1_wabbfoafla_ : 
public PK_fem_
 
 2477   P1_wabbfoafla_::P1_wabbfoafla_() : PK_fem_(2, 1) {
 
 2478     unfreeze_cvs_node();
 
 2480     base_node pt(2); pt.fill(0.5);
 
 2484     read_poly(base_[0], 2, 
"1 - y - x");
 
 2485     read_poly(base_[1], 2, 
"x*(1 - 2*y)");
 
 2486     read_poly(base_[2], 2, 
"y*(1 - 2*x)");
 
 2487     read_poly(base_[3], 2, 
"4*x*y");
 
 2490   static pfem P1_with_bubble_on_a_face_lagrange(fem_param_list ¶ms,
 
 2491         std::vector<dal::pstatic_stored_object> &dependencies) {
 
 2492     GMM_ASSERT1(params.size() == 0, 
"Bad number of parameters");
 
 2493     pfem p = std::make_shared<P1_wabbfoafla_>();
 
 2494     dependencies.push_back(p->ref_convex(0));
 
 2495     dependencies.push_back(p->node_tab(0));
 
 2504   static const double fem_coef_gausslob_1[4] =
 
 2505     { 1.000000000000000e+00, -1.000000000000000e+00, 0.000000000000000e-01,
 
 2506       1.000000000000000e+00 };
 
 2508   static const double fem_coef_gausslob_2[9] =
 
 2509     { 1.000000000000000e+00, -3.000000000000000e+00, 2.000000000000000e+00,
 
 2510       0.000000000000000e-01, 4.000000000000000e+00, -4.000000000000000e+00,
 
 2511       0.000000000000000e-01, -1.000000000000000e+00, 2.000000000000000e+00 };
 
 2513   static const double fem_coef_gausslob_3[16] =
 
 2514     { 1.000000000000000e+00, -6.000000000000000e+00, 1.000000000000000e+01,
 
 2515       -5.000000000000000e+00, 0.000000000000000e-01, 8.090169943749474e+00,
 
 2516       -1.927050983124842e+01, 1.118033988749895e+01, 0.000000000000000e-01,
 
 2517       -3.090169943749474e+00, 1.427050983124842e+01, -1.118033988749895e+01,
 
 2518       0.000000000000000e-01, 1.000000000000000e+00, -5.000000000000000e+00,
 
 2519       5.000000000000000e+00 };
 
 2521   static const double fem_coef_gausslob_4[25] =
 
 2522     { 1.000000000000000e+00, -1.000000000000000e+01, 3.000000000000000e+01,
 
 2523       -3.500000000000000e+01, 1.400000000000000e+01, 0.000000000000000e-01,
 
 2524       1.351300497744848e+01, -5.687234826567877e+01, 7.602600995489696e+01,
 
 2525       -3.266666666666667e+01, 0.000000000000000e-01, -5.333333333333333e+0,
 
 2526       4.266666666666667e+01, -7.466666666666667e+01, 3.733333333333333e+01,
 
 2527       0.000000000000000e-01, 2.820328355884853e+00, -2.479431840098789e+01,
 
 2528       5.464065671176971e+01, -3.266666666666667e+01, 0.000000000000000e-01,
 
 2529       -1.000000000000000e+00, 9.000000000000000e+00, -2.100000000000000e+01,
 
 2530       1.400000000000000e+01 };
 
 2532   static const double fem_coef_gausslob_5[36] =
 
 2533     { 1.000000000000000e+00, -1.500000000000000e+01, 7.000000000000000e+01,
 
 2534       -1.400000000000000e+02, 1.260000000000000e+02, -4.200000000000000e+01,
 
 2535       0.000000000000000e-01, 2.028283187263934e+01, -1.315819844629968e+02,
 
 2536       2.996878573260126e+02, -2.884609153819731e+02, 1.000722106463179e+02,
 
 2537       0.000000000000000e-01, -8.072374540610696e+00, 9.849823568607377e+01,
 
 2538       -2.894574355386068e+02, 3.201990314777874e+02, -1.211674570846437e+02,
 
 2539       0.000000000000000e-01, 4.489369296352334e+00, -6.035445290945900e+01,
 
 2540       2.203358804738940e+02, -2.856382539454310e+02, 1.211674570846437e+02,
 
 2541       0.000000000000000e-01, -2.699826628380976e+00, 3.743820168638206e+01,
 
 2542       -1.465663022612998e+02, 2.119001378496167e+02, -1.000722106463179e+02,
 
 2543       0.000000000000000e-01, 1.000000000000000e+00, -1.400000000000000e+01,
 
 2544       5.600000000000000e+01, -8.400000000000000e+01, 4.200000000000000e+01 };
 
 2546   static const double fem_coef_gausslob_6[49] =
 
 2547     { 1.000000000000000e+00, -2.100000000000000e+01, 1.400000000000000e+02,
 
 2548       -4.200000000000000e+02, 6.300000000000000e+02, -4.620000000000000e+02,
 
 2549       1.320000000000000e+02, 0.000000000000000e-01, 2.840315320583963e+01,
 
 2550       -2.618707992013254e+02, 8.915455952644434e+02, -1.426720320066430e+03,
 
 2551       1.086906031987037e+03, -3.182636611895653e+02, 0.000000000000000e-01,
 
 2552       -1.133797045109102e+01, 1.954053162272040e+02, -8.515354909154440e+02,
 
 2553       1.555570646517052e+03, -1.285566162567286e+03, 3.974636611895653e+02,
 
 2554       0.000000000000000e-01, 6.400000000000000e+00, -1.216000000000000e+02,
 
 2555       6.528000000000000e+02, -1.382400000000000e+03, 1.267200000000000e+03,
 
 2556       -4.224000000000000e+02, 0.000000000000000e-01, -4.099929626153486e+00,
 
 2557       8.051601475380118e+01, -4.643586932712080e+02, 1.089694751524101e+03,
 
 2558       -1.099215804570106e+03, 3.974636611895653e+02, 0.000000000000000e-01,
 
 2559       2.634746871404869e+00, -5.245053177967978e+01, 3.115485889222086e+02,
 
 2560       -7.661450779747230e+02, 8.226759351503546e+02, -3.182636611895653e+02,
 
 2561       0.000000000000000e-01, -1.000000000000000e+00, 2.000000000000000e+01,
 
 2562       -1.200000000000000e+02, 3.000000000000000e+02, -3.300000000000000e+02,
 
 2563       1.320000000000000e+02 };
 
 2565   static const double fem_coef_gausslob_7[64] =
 
 2566     { 1.000000000000000e+00, -2.800000000000000e+01, 2.520000000000000e+02,
 
 2567       -1.050000000000000e+03, 2.310000000000000e+03, -2.772000000000000e+03,
 
 2568       1.716000000000000e+03, -4.290000000000000e+02, 0.000000000000000e-01,
 
 2569       3.787519721423474e+01, -4.699045385400572e+02, 2.217166528901653e+03,
 
 2570       -5.195916436930171e+03, 6.469992588404291e+03, -4.101225846986446e+03,
 
 2571       1.042012507936495e+03, 0.000000000000000e-01, -1.513857963869697e+01,
 
 2572       3.497259983590744e+02, -2.101837798737552e+03, 5.599947843186200e+03,
 
 2573       -7.539551580657127e+03, 5.032695631593761e+03, -1.325841514105659e+03,
 
 2574       0.000000000000000e-01, 8.595816328530350e+00, -2.189405837038675e+02,
 
 2575       1.612357003153179e+03, -4.947308401212060e+03, 7.342604827965170e+03,
 
 2576       -5.255204822337236e+03, 1.457896159806284e+03, 0.000000000000000e-01,
 
 2577       -5.620377978515898e+00, 1.480753190084385e+02, -1.171440824431867e+03,
 
 2578       3.964008996775197e+03, -6.427195249873722e+03, 4.950068296306753e+03,
 
 2579       -1.457896159806284e+03, 0.000000000000000e-01, 3.883318851088245e+00,
 
 2580       -1.038534676200790e+02, 8.481025943868683e+02, -3.011828579891082e+03,
 
 2581       5.186049587313396e+03, -4.248194967145850e+03, 1.325841514105659e+03,
 
 2582       0.000000000000000e-01, -2.595374776640464e+00, 6.989727249649080e+01,
 
 2583       -5.793475032722815e+02, 2.106096578071916e+03, -3.744900173152008e+03,
 
 2584       3.192861708569018e+03, -1.042012507936495e+03, 0.000000000000000e-01,
 
 2585       1.000000000000000e+00, -2.700000000000000e+01, 2.250000000000000e+02,
 
 2586       -8.250000000000000e+02, 1.485000000000000e+03, -1.287000000000000e+03,
 
 2587       4.290000000000000e+02 };
 
 2589   static const double fem_coef_gausslob_8[81] =
 
 2590     { 1.000000000000000e+00, -3.600000000000000e+01, 4.200000000000000e+02,
 
 2591       -2.310000000000000e+03, 6.930000000000000e+03, -1.201200000000000e+04,
 
 2592       1.201200000000000e+04, -6.435000000000000e+03, 1.430000000000000e+03,
 
 2593       0.000000000000000e-01, 4.869949034318613e+01, -7.815432549965997e+02,
 
 2594       4.860656931912704e+03, -1.551737634456316e+04, 2.788918324236022e+04,
 
 2595       -2.854121637661796e+04, 1.553203650368708e+04, -3.490440192125469e+03,
 
 2596       0.000000000000000e-01, -1.947740331442309e+01, 5.805138088476765e+02,
 
 2597       -4.583922431826645e+03, 1.659300238583299e+04, -3.217606831061953e+04,
 
 2598       3.461498040096808e+04, -1.950464316590829e+04, 4.495614716020147e+03,
 
 2599       0.000000000000000e-01, 1.108992781389876e+01, -3.644117397881921e+02,
 
 2600       3.513408770397022e+03, -1.458458798126453e+04, 3.105326914181443e+04,
 
 2601       -3.569574046476449e+04, 2.111700401254369e+04, -5.050031666751820e+03,
 
 2602       0.000000000000000e-01, -7.314285714285714e+00, 2.486857142857143e+02,
 
 2603       -2.574628571428571e+03, 1.174674285714286e+04, -2.719451428571429e+04,
 
 2604       3.347017142857143e+04,  -2.091885714285714e+04, 5.229714285714286e+03,
 
 2605       0.000000000000000e-01, 5.181491353118710e+00, -1.789312751409961e+02,
 
 2606       1.913693930879634e+03, -9.161425477258226e+03, 2.246586272145708e+04,
 
 2607       -2.927759904600966e+04, 1.928324932147088e+04, -5.050031666751820e+03,
 
 2608       0.000000000000000e-01, -3.748881746893966e+00, 1.304893011815078e+02,
 
 2609       -1.418925315009559e+03, 6.967886161876575e+03, -1.767073170824305e+04,
 
 2610       2.395969028817416e+04, -1.646027456225289e+04, 4.495614716020147e+03,
 
 2611       0.000000000000000e-01, 2.569661265399177e+00, -8.980255438911062e+01,
 
 2612       9.847166850754155e+02, -4.899241601766511e+03, 1.264999919894514e+04,
 
 2613       -1.754928623032154e+04, 1.239148503331668e+04, -3.490440192125469e+03,
 
 2614       0.000000000000000e-01, -1.000000000000000e+00, 3.500000000000000e+01,
 
 2615       -3.850000000000000e+02, 1.925000000000000e+03, -5.005000000000000e+03,
 
 2616       7.007000000000000e+03, -5.005000000000000e+03, 1.430000000000000e+03 };
 
 2618   static const double fem_coef_gausslob_9[100] =
 
 2619     { 1.000000000000000e+00, -4.500000000000000e+01, 6.600000000000000e+02,
 
 2620       -4.620000000000000e+03, 1.801800000000000e+04, -4.204200000000000e+04,
 
 2621       6.006000000000000e+04, -5.148000000000000e+04, 2.431000000000000e+04,
 
 2622       -4.862000000000000e+03, 0.000000000000000e-01, 6.087629005856384e+01,
 
 2623       -1.226341297551814e+03, 9.697405499616728e+03, -4.021760400071670e+04,
 
 2624       9.725280603247945e+04, -1.421240159771644e+05, 1.237105621496494e+05,
 
 2625       -5.906188663911807e+04, 1.190819794274692e+04, 0.000000000000000e-01,
 
 2626       -2.435589341485964e+01, 9.095415690555422e+02, -9.111255870205338e+03,
 
 2627       4.276661412893713e+04, -1.114146601604227e+05, 1.709573510663859e+05,
 
 2628       -1.539309822784481e+05, 7.531473186776967e+04, -1.546698442965720e+04,
 
 2629       0.000000000000000e-01, 1.388757697026791e+01, -5.717395054991898e+02,
 
 2630       6.975542885191629e+03, -3.743822964286359e+04, 1.068054892026842e+05,
 
 2631       -1.747039036097183e+05, 1.648204809285228e+05, -8.352714678107793e+04,
 
 2632       1.762561894579012e+04, 0.000000000000000e-01, -9.198709522206266e+00,
 
 2633       3.919017281073292e+02, -5.132147808492991e+03, 3.020136030457121e+04,
 
 2634       -9.337958558844686e+04, 1.629937209113228e+05, -1.619399017586618e+05,
 
 2635       8.553993533073839e+04, -1.866608440961585e+04, 0.000000000000000e-01,
 
 2636       6.589286067498368e+00, -2.852085019651226e+02, 3.859417687766574e+03,
 
 2637       -2.381847798089535e+04, 7.784545414265617e+04, -1.434184925463668e+05,
 
 2638       1.495994578589254e+05, -8.245482435580428e+04, 1.866608440961585e+04,
 
 2639       0.000000000000000e-01, -4.905768350885374e+00, 2.141208512030290e+02,
 
 2640       -2.948048350518040e+03, 1.867520721718195e+04, -6.311993447254502e+04,
 
 2641       1.208313444661297e+05, -1.311255887283438e+05, 7.510342373103317e+04,
 
 2642       -1.762561894579012e+04, 0.000000000000000e-01, 3.659127863806492e+00,
 
 2643       -1.604518938956052e+02, 2.230466872754075e+03, -1.433960781600324e+04,
 
 2644       4.943623515122416e+04, -9.697372467640532e+04, 1.082245668039501e+05,
 
 2645       -6.388812799914516e+04, 1.546698442965720e+04, 0.000000000000000e-01,
 
 2646       -2.551909672185327e+00, 1.121770505458310e+02, -1.567380916112636e+03,
 
 2647       1.015673778978859e+04, -3.539780430762936e+04, 7.040572036581639e+04,
 
 2648       -7.991059497559391e+04, 4.811189484560421e+04, -1.190819794274692e+04,
 
 2649       0.000000000000000e-01, 1.000000000000000e+00, -4.400000000000000e+01,
 
 2650       6.160000000000000e+02, -4.004000000000000e+03, 1.401400000000000e+04,
 
 2651       -2.802800000000000e+04, 3.203200000000000e+04, -1.944800000000000e+04,
 
 2652       4.862000000000000e+03 };
 
 2654   static const double fem_coef_gausslob_10[121] =
 
 2655     { 1.000000000000000e+00, -5.500000000000000e+01, 9.900000000000000e+02,
 
 2656       -8.580000000000000e+03, 4.204200000000000e+04, -1.261260000000000e+05,
 
 2657       2.402400000000000e+05, -2.917200000000000e+05, 2.187900000000000e+05,
 
 2658       -9.237800000000000e+04, 1.679600000000000e+04, 0.000000000000000e-01,
 
 2659       7.440573476392379e+01, -1.837547309495916e+03, 1.797721877249297e+04,
 
 2660       -9.362519219895049e+04, 2.909773746534557e+05, -5.668103968059107e+05,
 
 2661       6.987888266998443e+05, -5.297630128145374e+05, 2.254581472606030e+05,
 
 2662       -4.123982399226536e+04, 0.000000000000000e-01, -2.977479259019735e+01,
 
 2663       1.361302600480045e+03, -1.684411461834327e+04, 9.915381814787320e+04,
 
 2664       -3.316413447923031e+05, 6.777335995676564e+05, -8.637075009663581e+05,
 
 2665       6.706702925312933e+05, -2.905859066780586e+05, 5.388962900035043e+04,
 
 2666       0.000000000000000e-01, 1.699123898926703e+01, -8.563552206749944e+02,
 
 2667       1.288193007592445e+04, -8.652550760766087e+04, 3.163119148667456e+05,
 
 2668       -6.879421746683590e+05, 9.173107022760963e+05, -7.368809317678005e+05,
 
 2669       3.277210563158369e+05, -6.203762550909711e+04, 0.000000000000000e-01,
 
 2670       -1.128077599537177e+01, 5.884060270969327e+02, -9.496934299975062e+03,
 
 2671       6.981839702203256e+04, -2.759867860090975e+05, 6.390150586777585e+05,
 
 2672       -8.953334100127128e+05, 7.481407085083284e+05, -3.434511859876541e+05,
 
 2673       6.671702685021839e+04, 0.000000000000000e-01, 8.126984126984127e+00,
 
 2674       -4.307301587301587e+02, 7.184253968253968e+03, -5.536101587301587e+04,
 
 2675       2.309526349206349e+05, -5.631187301587302e+05, 8.261892063492063e+05,
 
 2676       -7.184253968253968e+05, 3.412520634920635e+05, -6.825041269841270e+04,
 
 2677       0.000000000000000e-01, -6.131078401763724e+00, 3.277460052754944e+02,
 
 2678       -5.563892337052540e+03, 4.401679638240306e+04, -1.898229640674875e+05,
 
 2679       4.802970424048780e+05, -7.315927845245721e+05, 6.593462428792687e+05,
 
 2680       -3.237190825145298e+05, 6.671702685021839e+04, 0.000000000000000e-01,
 
 2681       4.719539826177156e+00, -2.535442364309725e+02, 4.348374949258725e+03,
 
 2682       -3.493745849693315e+04, 1.537770968392435e+05, -3.987659746141970e+05,
 
 2683       6.242937855878344e+05, -5.790845728346388e+05, 2.926551987751342e+05,
 
 2684       -6.203762550909711e+04, 0.000000000000000e-01, -3.595976071589556e+00,
 
 2685       1.937484128537626e+02, -3.342868418261306e+03, 2.710687970739982e+04,
 
 2686       -1.208013807254569e+05, 3.181552127960248e+05, -5.073176789159280e+05,
 
 2687       4.804304374445346e+05, -2.483103833254456e+05, 5.388962900035043e+04,
 
 2688       0.000000000000000e-01, 2.539125352570295e+00, -1.370261203741934e+02,
 
 2689       2.372031907702074e+03, -1.933271708314826e+04, 8.675745431426523e+04,
 
 2690       -2.305316371991209e+05, 3.716008535065897e+05, -3.564317671210514e+05,
 
 2691       1.869400926620506e+05, -4.123982399226536e+04, 0.000000000000000e-01,
 
 2692       -1.000000000000000e+00, 5.400000000000000e+01, -9.360000000000000e+02,
 
 2693       7.644000000000000e+03, -3.439800000000000e+04, 9.172800000000000e+04,
 
 2694       -1.485120000000000e+05, 1.432080000000000e+05, -7.558200000000000e+04,
 
 2695       1.679600000000000e+04 };
 
 2697   static const double fem_coef_gausslob_11[144] =
 
 2698     { 1.000000000000000e+00, -6.600000000000000e+01, 1.430000000000000e+03,
 
 2699       -1.501500000000000e+04, 9.009000000000000e+04, -3.363360000000000e+05,
 
 2700       8.168160000000000e+05, -1.312740000000000e+06, 1.385670000000000e+06,
 
 2701       -9.237800000000000e+05, 3.527160000000000e+05, -5.878600000000000e+04,
 
 2702       0.000000000000000e-01, 8.928790437897459e+01, -2.652104227906408e+03,
 
 2703       3.141784850363868e+04, -2.002791716233576e+05, 7.743819221375186e+05,
 
 2704       -1.922871126014229e+06, 3.137025618338122e+06, -3.346678943928588e+06,
 
 2705       2.248625248986712e+06, -8.636670995581690e+05, 1.446085194818801e+05,
 
 2706       0.000000000000000e-01, -3.573451504477809e+01, 1.963011183403142e+03,
 
 2707       -2.937610003978132e+04, 2.114542549822465e+05, -8.792000471014727e+05,
 
 2708       2.288870840565664e+06, -3.858042797257275e+06, 4.213930780912515e+06,
 
 2709       -2.881507044264936e+06, 1.121761824282757e+06, -1.898189887480762e+05,
 
 2710       0.000000000000000e-01, 2.040222049137883e+01,  -1.235400296692680e+03,
 
 2711       2.244501976036562e+04, -1.840644193090062e+05, 8.352985709834925e+05,
 
 2712       -2.311501023251837e+06, 4.072373742578464e+06, -4.597525083798586e+06,
 
 2713       3.224564284996090e+06, -1.280533828091591e+06, 2.201577342088092e+05,
 
 2714       0.000000000000000e-01, -1.356395972416294e+01, 8.500434612026409e+02,
 
 2715       -1.656519758544980e+04, 1.484886632288921e+05, -7.274015626850215e+05,
 
 2716       2.139270125221522e+06, -3.953929242730888e+06, 4.636483776329532e+06,
 
 2717       -3.352298848558998e+06, 1.364514095203156e+06, -2.393982879242230e+05,
 
 2718       0.000000000000000e-01, 9.803369220897211e+00, -6.243148521745071e+02,
 
 2719       1.257271925920887e+04, -1.180754347844014e+05, 6.096877374094766e+05,
 
 2720       -1.885008008173690e+06, 3.641310114569300e+06, -4.434918589444567e+06,
 
 2721       3.311645240511804e+06, -1.385401912847929e+06, 2.488026449837513e+05,
 
 2722       0.000000000000000e-01, -7.447686911212630e+00, 4.784415903433910e+02,
 
 2723       -9.808275331323619e+03, 9.456732952354300e+04, -5.045513347291155e+05,
 
 2724       1.617062776783016e+06, -3.237833360324115e+06, 4.079238919323811e+06,
 
 2725       -3.141771586138831e+06, 1.351427181973335e+06, -2.488026449837513e+05,
 
 2726       0.000000000000000e-01, 5.819619912607334e+00, -3.757783851118444e+02,
 
 2727       7.785050290867036e+03, -7.625636515182549e+04, 4.153153824802320e+05,
 
 2728       -1.363841143951918e+06, 2.804561170833446e+06, -3.631789084056234e+06,
 
 2729       2.874063732359706e+06, -1.268867071963298e+06, 2.393982879242230e+05,
 
 2730       0.000000000000000e-01, -4.587084978600364e+00, 2.971291972095372e+02,
 
 2731       -6.195597982053585e+03, 6.128651035627590e+04, -3.381847677955126e+05,
 
 2732       1.128582073344179e+06, -2.364480249965060e+06, 3.125557361498120e+06,
 
 2733       -2.527901385564680e+06, 1.141201248205309e+06, -2.201577342088092e+05,
 
 2734       0.000000000000000e-01, 3.549738472143437e+00, -2.303803824096343e+02,
 
 2735       4.822860472410032e+03, -4.799737703690675e+04, 2.670306747478879e+05,
 
 2736       -9.003482951717774e+05, 1.909697516429202e+06, -2.560483668180433e+06,
 
 2737       2.103933182581560e+06, -9.662470519460815e+05, 1.898189887480762e+05,
 
 2738       0.000000000000000e-01, -2.529605817247381e+00, 1.643527121363626e+02,
 
 2739       -3.448327347881922e+03, 3.443600981453996e+04, -1.924805754474854e+05,
 
 2740       6.528637806490704e+05, -1.394862512471197e+06, 1.886334531344429e+06,
 
 2741       -1.565422824908427e+06, 7.270266147425120e+05, -1.446085194818801e+05,
 
 2742       0.000000000000000e-01, 1.000000000000000e+00, -6.500000000000000e+01,
 
 2743       1.365000000000000e+03, -1.365000000000000e+04, 7.644000000000000e+04,
 
 2744       -2.598960000000000e+05, 5.569200000000000e+05, -7.558200000000000e+05,
 
 2745       6.298500000000000e+05, -2.939300000000000e+05, 5.878600000000000e+04 };
 
 2747   static const double fem_coef_gausslob_12[169] =
 
 2748     { 1.000000000000000e+00, -7.800000000000000e+01, 2.002000000000000e+03,
 
 2749       -2.502500000000000e+04, 1.801800000000000e+05, -8.168160000000000e+05,
 
 2750       2.450448000000000e+06, -4.988412000000000e+06, 6.928350000000000e+06,
 
 2751       -6.466460000000000e+06, 3.879876000000000e+06, -1.352078000000000e+06,
 
 2752       2.080120000000000e+05, 0.000000000000000e-01, 1.055228477237708e+02,
 
 2753       -3.710649283521791e+03, 5.230891096204477e+04, -4.000264992878070e+05,
 
 2754       1.877737871587605e+06, -5.758751500257082e+06, 1.189876582421287e+07,
 
 2755       -1.670085336595664e+07, 1.570840983751716e+07, -9.480360124877962e+06,
 
 2756       3.318799039873028e+06, -5.124248673374161e+05, 0.000000000000000e-01,
 
 2757       -4.223530748650643e+01, 2.744602756239140e+03, -4.883026612748412e+04,
 
 2758       4.213447894212839e+05, -2.125569662252139e+06, 6.831231541213443e+06,
 
 2759       -1.457745185889376e+07, 2.094131826427298e+07, -2.004063010887189e+07,
 
 2760       1.225627209853367e+07, -4.335340118801754e+06, 6.749529540569050e+05,
 
 2761       0.000000000000000e-01, 2.412126940135046e+01, -1.727728082317750e+03,
 
 2762       3.727953470399318e+04, -3.660428937429080e+05, 2.013286677665669e+06,
 
 2763       -6.871455230919223e+06, 1.531439984708661e+07, -2.272429867457359e+07,
 
 2764       2.229291249432404e+07, -1.390087225188044e+07, 4.993770899110666e+06,
 
 2765       -7.872767949619026e+05, 0.000000000000000e-01, -1.605014152757175e+01,
 
 2766       1.189832345018574e+03, -2.753035300171167e+04, 2.951729666043859e+05,
 
 2767       -1.750245295939125e+06, 6.340418364700963e+06, -1.480658414760223e+07,
 
 2768       2.279585234765233e+07, -2.303126179585568e+07, 1.470734589654657e+07,
 
 2769       -5.387526099148482e+06, 8.631843338394749e+05, 0.000000000000000e-01,
 
 2770       1.162284069412542e+01, -8.756167723813171e+02, 2.093616690467957e+04,
 
 2771       -2.350848402511507e+05, 1.467905987404880e+06, -5.583024412516426e+06,
 
 2772       1.360724316266146e+07, -2.172800271110029e+07, 2.264080373496021e+07,
 
 2773       -1.484050586374976e+07, 5.558088637639386e+06, -9.074958680213037e+05,
 
 2774       0.000000000000000e-01, -8.865800865800866e+00, 6.738008658008658e+02,
 
 2775       -1.640173160173160e+04, 1.890632034632035e+05, -1.219313593073593e+06,
 
 2776       4.803100813852814e+06, -1.211898237229437e+07, 1.998830268398268e+07,
 
 2777       -2.144876606060606e+07, 1.443281454545455e+07, -5.532578909090909e+06,
 
 2778       9.220964848484848e+05, 0.000000000000000e-01, 6.984318980773296e+00,
 
 2779       -5.335955916987455e+02, 1.312836634638491e+04, -1.537652068533838e+05,
 
 2780       1.012269836848560e+06, -4.084347297774684e+06, 1.057602476941974e+07,
 
 2781       -1.790936242524428e+07, 1.971847079705798e+07, -1.359625813912256e+07,
 
 2782       5.331861778616258e+06, -9.074958680213037e+05, 0.000000000000000e-01,
 
 2783       -5.596679201904262e+00, 4.289927383042951e+02, -1.062596939367885e+04,
 
 2784       1.257256555151274e+05, -8.388435073376655e+05, 3.440109149730765e+06,
 
 2785       -9.074697250266149e+06, 1.567950042058767e+07, -1.762881516112804e+07,
 
 2786       1.241472483931862e+07, -4.970685906925217e+06, 8.631843338394749e+05,
 
 2787       0.000000000000000e-01, 4.489137849846207e+00, -3.448281543178960e+02,
 
 2788       8.578250876817155e+03, -1.021659510074640e+05, 6.876731048919487e+05,
 
 2789       -2.851145716716003e+06, 7.618634882796075e+06, -1.335715271315875e+07,
 
 2790       1.525930546501226e+07, -1.092966082914868e+07, 4.453550640432165e+06,
 
 2791       -7.872767949619026e+05, 0.000000000000000e-01, -3.514808358523940e+00,
 
 2792       2.703477424140389e+02, -6.743800341396192e+03, 8.065306199056715e+04,
 
 2793       -5.459331868312813e+05, 2.279586137602263e+06, -6.143562568432354e+06,
 
 2794       1.087848437431968e+07, -1.256803423488744e+07, 9.114425759470104e+06,
 
 2795       -3.764095329881106e+06, 6.749529540569050e+05, 0.000000000000000e-01,
 
 2796       2.522322790441051e+00, -1.941585635394145e+02, 4.850890672082830e+03,
 
 2797       -5.815428585185421e+04, 3.949277670351431e+05, -1.655905848916830e+06,
 
 2798       4.485333711312109e+06, -7.989838200781784e+06, 9.294715032477446e+06,
 
 2799       -6.793611930544113e+06, 2.830299368175965e+06, -5.124248673374161e+05,
 
 2800       0.000000000000000e-01, -1.000000000000000e+00, 7.700000000000000e+01,
 
 2801       -1.925000000000000e+03, 2.310000000000000e+04, -1.570800000000000e+05,
 
 2802       6.597360000000000e+05, -1.790712000000000e+06, 3.197700000000000e+06,
 
 2803       -3.730650000000000e+06, 2.735810000000000e+06, -1.144066000000000e+06,
 
 2804       2.080120000000000e+05 };
 
 2806   static const double fem_coef_gausslob_13[196] =
 
 2807     { 1.000000000000000e+00, -9.100000000000000e+01, 2.730000000000000e+03,
 
 2808       -4.004000000000000e+04, 3.403400000000000e+05, -1.837836000000000e+06,
 
 2809       6.651216000000000e+06, -1.662804000000000e+07, 2.909907000000000e+07,
 
 2810       -3.556553000000000e+07, 2.974571600000000e+07, -1.622493600000000e+07,
 
 2811       5.200300000000000e+06, -7.429000000000000e+05, 0.000000000000000e-01,
 
 2812       1.231105960095249e+02, -5.057514000718615e+03, 8.362619816879477e+04,
 
 2813       -7.548172444491492e+05, 4.219784854542762e+06, -1.560990588170226e+07,
 
 2814       3.960523865471669e+07, -7.003645336672149e+07, 8.625846242015506e+07,
 
 2815       -7.256273938600024e+07, 3.975792117062384e+07, -1.278833059440045e+07,
 
 2816       1.832147578471145e+06, 0.000000000000000e-01, -4.927732466948325e+01,
 
 2817       3.738734011094227e+03, -7.796486012083982e+04, 7.935560370804071e+05,
 
 2818       -4.765562636392240e+06, 1.846680880578437e+07, -4.837506802694851e+07,
 
 2819       8.753277424234758e+07, -1.096660444159086e+08, 9.346798694406962e+07,
 
 2820       -5.173889595224656e+07, 1.677849814552107e+07, -2.419777739872722e+06,
 
 2821       0.000000000000000e-01, 2.814884111282567e+01, -2.353904695653627e+03,
 
 2822       5.948276501192433e+04, -6.883051529064705e+05, 4.502895601024915e+06,
 
 2823       -1.851735708867110e+07, 5.063079101609929e+07, -9.458217148027056e+07,
 
 2824       1.214199817163488e+08, -1.054743067017811e+08, 5.927651305189011e+07,
 
 2825       -1.946011726944643e+07, 2.834919298555227e+06, 0.000000000000000e-01,
 
 2826       -1.874042032746388e+01, 1.621968976936385e+03, -4.394233902947216e+04,
 
 2827       5.547892506224127e+05, -3.908876121817967e+06, 1.704431633766850e+07,
 
 2828       -4.878627691196220e+07, 9.448003328782282e+07, -1.248200449226441e+08,
 
 2829       1.109678546438889e+08, -6.355498649510845e+07, 2.119358718443647e+07,
 
 2830       -3.128057142433586e+06, 0.000000000000000e-01, 1.358783086373605e+01,
 
 2831       -1.195146716951513e+03, 3.345811195278515e+04, -4.422483366082136e+05,
 
 2832       3.278781781106079e+06, -1.499532485039955e+07, 4.474689669452104e+07,
 
 2833       -8.978037194074775e+07, 1.222039761714010e+08, -1.114085938050346e+08,
 
 2834       6.517880226738924e+07, -2.213159774622623e+07, 3.317403211532315e+06,
 
 2835       0.000000000000000e-01, -1.039065134180050e+01, 9.220321824274881e+02,
 
 2836       -2.627964906979335e+04, 3.565631308351814e+05, -2.729347397416285e+06,
 
 2837       1.291899991743804e+07, -3.987098284679090e+07, 8.253644504125924e+07,
 
 2838       -1.155541226713629e+08, 1.080161713852185e+08, -6.460510650895925e+07,
 
 2839       2.236736005147009e+07, -3.410612094153076e+06, 0.000000000000000e-01,
 
 2840       8.225051804237637e+00, -7.337438600306013e+02, 2.113982918743374e+04,
 
 2841       -2.914573383452468e+05, 2.277144431399071e+06, -1.103660550091489e+07,
 
 2842       3.493361321847434e+07, -7.418006034176242e+07, 1.064417028079657e+08,
 
 2843       -1.018292957440870e+08, 6.222452923525811e+07, -2.197059717251990e+07,
 
 2844       3.410612094153076e+06, 0.000000000000000e-01,  -6.651370533890156e+00,
 
 2845       5.953674398464600e+02, -1.727143617692029e+04, 2.405949101477657e+05,
 
 2846       -1.905359074321061e+06, 9.386078020968711e+06, -3.025905095154839e+07,
 
 2847       6.552811535463406e+07, -9.594395490329804e+07, 9.365009838355809e+07,
 
 2848       -5.835707981219508e+07, 2.099464400369387e+07, -3.317403211532315e+06,
 
 2849       0.000000000000000e-01, 5.430796129527214e+00, -4.871978584294892e+02,
 
 2850       1.419769025501944e+04, -1.991370307462581e+05, 1.591472100521582e+06,
 
 2851       -7.928247009292726e+06, 2.589562028603176e+07, -5.690356974983853e+07,
 
 2852       8.463743197871011e+07, -8.398458536550263e+07, 5.322039739169053e+07,
 
 2853       -1.947115566720015e+07, 3.128057142433586e+06, 0.000000000000000e-01,
 
 2854       -4.414467779036191e+00, 3.966097971621681e+02, -1.159268854505275e+04,
 
 2855       1.633445673328560e+05, -1.313458735263122e+06, 6.593624701202045e+06,
 
 2856       -2.173390279168494e+07, 4.826160481317836e+07, -7.262663174126566e+07,
 
 2857       7.298651647234048e+07, -4.687881110584063e+07, 1.739383361177152e+07,
 
 2858       -2.834919298555227e+06, 0.000000000000000e-01, 3.487743182287134e+00,
 
 2859       -3.136500314357888e+02, 9.185689380767778e+03, -1.298134042763866e+05,
 
 2860       1.048017196494400e+06, -5.287706376855868e+06, 1.753577438278919e+07,
 
 2861       -3.921741432164137e+07, 5.949694434313328e+07, -6.033542452985016e+07,
 
 2862       3.913958191606598e+07, -1.467861247282431e+07, 2.419777739872722e+06,
 
 2863       0.000000000000000e-01, -2.516624450464659e+00, 2.264447557529062e+02,
 
 2864       -6.639311014646825e+03, 9.399061131310191e+04, -7.605959998781342e+05,
 
 2865       3.848998924774717e+06, -1.281093272369737e+07, 2.877371846174006e+07,
 
 2866       -4.386952078323465e+07, 4.473878170318014e+07, -2.920546515856783e+07,
 
 2867       1.102958792572444e+07, -1.832147578471145e+06, 0.000000000000000e-01,
 
 2868       1.000000000000000e+00, -9.000000000000000e+01, 2.640000000000000e+03,
 
 2869       -3.740000000000000e+04, 3.029400000000000e+05, -1.534896000000000e+06,
 
 2870       5.116320000000000e+06, -1.151172000000000e+07, 1.758735000000000e+07,
 
 2871       -1.797818000000000e+07, 1.176753600000000e+07, -4.457400000000000e+06,
 
 2872       7.429000000000000e+05 };
 
 2874   static const double fem_coef_gausslob_14[225] =
 
 2875     { 1.000000000000000e+00, -1.050000000000000e+02, 3.640000000000000e+03,
 
 2876       -6.188000000000000e+04, 6.126120000000000e+05, -3.879876000000000e+06,
 
 2877       1.662804000000000e+07, -4.988412000000000e+07, 1.066965900000000e+08,
 
 2878       -1.636014380000000e+08, 1.784742960000000e+08, -1.352078000000000e+08,
 
 2879       6.760390000000000e+07, -2.005830000000000e+07, 2.674440000000000e+06,
 
 2880       0.000000000000000e-01, 1.420511699552723e+02, -6.740724197514907e+03,
 
 2881       1.291563810650317e+05, -1.357536885890637e+06, 8.899789739175488e+06,
 
 2882       -3.898284725729828e+07, 1.186784002318284e+08, -2.564866709310747e+08,
 
 2883       3.962828733570607e+08, -4.348015522628213e+08, 3.308658899677545e+08,
 
 2884       -1.660170000478420e+08, 4.939776003229131e+07, -6.601663651220939e+06,
 
 2885       0.000000000000000e-01, -5.686066782897496e+01, 4.980782943180571e+03,
 
 2886       -1.202886759366057e+05, 1.425067611910860e+06, -1.003204881513823e+07,
 
 2887       4.601736532886305e+07, -1.446080878593359e+08, 3.197256124417587e+08,
 
 2888       -5.024241189222256e+08, 5.584380089699472e+08, -4.292685524711295e+08,
 
 2889       2.171358326952990e+08, -6.503152653250142e+07, 8.737812306213077e+06,
 
 2890       0.000000000000000e-01, 3.248522677540712e+01, -3.136209432322820e+03,
 
 2891       9.172216152088957e+04, -1.234458149638161e+06, 9.460578149039340e+06,
 
 2892       -4.602710110035357e+07, 1.508977142152744e+08, -3.443000936718750e+08,
 
 2893       5.541917935770469e+08, -6.276282328622294e+08, 4.896977188070307e+08,
 
 2894       -2.507043130148833e+08, 7.583045543918066e+07, -1.027267982590785e+07,
 
 2895       0.000000000000000e-01, -2.163547691954172e+01, 2.161829695966707e+03,
 
 2896       -6.777232432848026e+04, 9.945601317987818e+05, -8.202377657972944e+06,
 
 2897       4.227975782999525e+07, -1.449995018490026e+08, 3.427553248466447e+08,
 
 2898       -5.674380093336526e+08, 6.573468625138306e+08, -5.224446315267705e+08,
 
 2899       2.715766154508912e+08, -8.319461131269656e+07, 1.139164303704407e+07,
 
 2900       0.000000000000000e-01, 1.569978564006007e+01, -1.594280678736617e+03,
 
 2901       5.164364569735884e+04, -7.932250762767995e+05, 6.879605840139093e+06,
 
 2902       -3.716431671531196e+07, 1.327627119052969e+08, -3.248633554644047e+08,
 
 2903       5.536614212284358e+08, -6.572276042331931e+08, 5.332102141003966e+08,
 
 2904       -2.820526436178851e+08, 8.770029066945359e+07, -1.216316370145453e+07,
 
 2905       0.000000000000000e-01, -1.202518395631915e+01, 1.231993083463710e+03,
 
 2906       -4.063141778456666e+04, 6.405521495953326e+05, -5.734055805513453e+06,
 
 2907       3.204057307537486e+07, -1.182863821502541e+08, 2.983631937198568e+08,
 
 2908       -5.225422090403253e+08, 6.354190974001179e+08, -5.265537919663995e+08,
 
 2909       2.837551732890861e+08, -8.968009595208465e+07, 1.261735673043107e+07,
 
 2910       0.000000000000000e-01, 9.547785547785548e+00, -9.834219114219114e+02,
 
 2911       3.278709557109557e+04, -5.252427785547786e+05, 4.798602442890443e+06,
 
 2912       -2.744701911421911e+07, 1.038669217715618e+08, -2.685490364568765e+08,
 
 2913       4.816180870862471e+08, -5.987952711608392e+08, 5.064437616783217e+08,
 
 2914       -2.780475554312354e+08, 8.937242853146853e+07, -1.276748979020979e+07,
 
 2915       0.000000000000000e-01, -7.763592643695499e+00, 8.024013730981778e+02,
 
 2916       -2.693903659000494e+04, 4.360799342555947e+05, -4.038452021764897e+06,
 
 2917       2.347605516322762e+07, -9.046087127754393e+07, 2.384165701554799e+08,
 
 2918       -4.360078989902932e+08, 5.526354677146948e+08, -4.761786531169400e+08,
 
 2919       2.660933883812130e+08, -8.696289827395033e+07, 1.261735673043107e+07,
 
 2920       0.000000000000000e-01, 6.402657115106499e+00, -6.632652203626004e+02,
 
 2921       2.237191510124190e+04, -3.647008347515229e+05, 3.408912135873189e+06,
 
 2922       -2.004238739169268e+07, 7.824760241311718e+07, -2.092325230710293e+08,
 
 2923       3.885803431690498e+08, -5.004334616015021e+08, 4.381904244262927e+08,
 
 2924       -2.487967617473505e+08, 8.258400115090981e+07, -1.216316370145453e+07,
 
 2925       0.000000000000000e-01, -5.303584550798654e+00, 5.502727059685037e+02,
 
 2926       -1.861988467344103e+04, 3.050015660700474e+05, -2.869271809771707e+06,
 
 2927       1.700462338220501e+07, -6.701518639186630e+07, 1.811217810430339e+08,
 
 2928       -3.403535526125257e+08, 4.438883801280693e+08, -3.938531369776322e+08,
 
 2929       2.266861847568459e+08, -7.628839120592035e+07, 1.139164303704407e+07,
 
 2930       0.000000000000000e-01, 4.356127432886088e+00, -4.524531153029460e+02,
 
 2931       1.534317874813675e+04, -2.521565333504139e+05, 2.382646312619400e+06,
 
 2932       -1.419908547341188e+07, 5.633074020272954e+07, -1.534171364617007e+08,
 
 2933       2.907942363862238e+08, -3.828802350952767e+08, 3.432339697459343e+08,
 
 2934       -1.997222564631490e+08, 6.798706212352923e+07, -1.027267982590785e+07,
 
 2935       0.000000000000000e-01, -3.466327490120249e+00, 3.602867454806401e+02,
 
 2936       -1.223518159744950e+04, 2.015152850494290e+05, -1.909713800970267e+06,
 
 2937       1.142278748458884e+07, -4.551909122318173e+07, 1.246206804545239e+08,
 
 2938       -2.376275441309645e+08, 3.149824199011395e+08, -2.844660497989077e+08,
 
 2939       1.668669076381706e+08, -5.729784575448167e+07, 8.737812306213077e+06,
 
 2940       0.000000000000000e-01, 2.512080922932578e+00, -2.612119914965073e+02,
 
 2941       8.878143206793750e+03, -1.464124202177336e+05, 1.389929291394544e+06,
 
 2942       -8.332053211967151e+06, 3.329158201137647e+07, -9.143262460433713e+07,
 
 2943       1.749809182259230e+08, -2.329047114119376e+08, 2.113183971320489e+08,
 
 2944       -1.245975118891604e+08, 4.302553108480184e+07, -6.601663651220939e+06,
 
 2945       0.000000000000000e-01, -1.000000000000000e+00, 1.040000000000000e+02,
 
 2946       -3.536000000000000e+03, 5.834400000000000e+04, -5.542680000000000e+05,
 
 2947       3.325608000000000e+06, -1.330243200000000e+07, 3.658168800000000e+07,
 
 2948       -7.011490200000000e+07, 9.348653600000000e+07, -8.498776000000000e+07,
 
 2949       5.022004000000000e+07, -1.738386000000000e+07, 2.674440000000000e+06 };
 
 2951   static const double fem_coef_gausslob_16[289] =
 
 2952     { 1.000000000000000e+00, -1.360000000000000e+02, 6.120000000000000e+03,
 
 2953       -1.356600000000000e+05, 1.763580000000000e+06, -1.481407200000000e+07,
 
 2954       8.535727200000000e+07, -3.505745100000000e+08, 1.051723530000000e+09,
 
 2955       -2.337163400000000e+09, 3.866943080000000e+09, -4.745793780000000e+09,
 
 2956       4.259045700000000e+09, -2.714556600000000e+09, 1.163381400000000e+09,
 
 2957       -3.005401950000000e+08, 3.535767000000000e+07, 0.000000000000000e-01,
 
 2958       1.839908474110340e+02, -1.132675577023645e+04, 2.828774748172428e+05,
 
 2959       -3.903228397113182e+06, 3.393217989215092e+07, -1.997936813387011e+08,
 
 2960       8.326183533203730e+08, -2.523654441487500e+09, 5.650496513849965e+09,
 
 2961       -9.402288564814163e+09, 1.159004125992500e+10, -1.043753556167033e+10,
 
 2962       6.671119113102151e+09, -2.865585732582308e+09, 7.416762022559170e+08,
 
 2963       -8.739414676532781e+07, 0.000000000000000e-01, -7.365158560983221e+01,
 
 2964       8.363752486870456e+03, -2.630512922725150e+05, 4.088268892503375e+06,
 
 2965       -3.814296099037553e+07, 2.350888858038512e+08, -1.010915772862718e+09,
 
 2966       3.133749897384450e+09, -7.134585101325640e+09, 1.202392366962845e+10,
 
 2967       -1.496979454364896e+10, 1.358833701849443e+10, -8.740756338653663e+09,
 
 2968       3.774397412355719e+09, -9.811765345365573e+08, 1.160408606498937e+08,
 
 2969       0.000000000000000e-01, 4.208515410469884e+01, -5.266887544418802e+03,
 
 2970       2.004067164817591e+05, -3.534528216742270e+06, 3.586506864599599e+07,
 
 2971       -2.342572871648561e+08, 1.050195570375994e+09, -3.357626237614668e+09,
 
 2972       7.826157982970905e+09, -1.343314504492630e+10, 1.696909064108448e+10,
 
 2973       -1.558480944857237e+10, 1.012167818105129e+10, -4.405611470443590e+09,
 
 2974       1.152926420144654e+09, -1.371250292488943e+08, 0.000000000000000e-01,
 
 2975       -2.804154671449467e+01, 3.632134644860107e+03, -1.481030987143817e+05,
 
 2976       2.845430205439061e+06, -3.103475950537538e+07, 2.145184209516461e+08,
 
 2977       -1.004950951655481e+09, 3.325504487572721e+09, -7.965634686855131e+09,
 
 2978       1.397533464514550e+10, -1.797134014690632e+10, 1.674913384367476e+10,
 
 2979       -1.101142723314074e+10, 4.842306972881947e+09, -1.278281396603255e+09,
 
 2980       1.531698732399162e+08, 0.000000000000000e-01, 2.036791285538472e+01,
 
 2981       -2.681212491930484e+03, 1.129589658306899e+05, -2.270501508829428e+06,
 
 2982       2.601887714173907e+07, -1.882644410377163e+08, 9.175357517098464e+08,
 
 2983       -3.139134215049928e+09, 7.731773974122787e+09, -1.388518223176127e+10,
 
 2984       1.820883321323428e+10, -1.725391802961138e+10, 1.150422262078233e+10,
 
 2985       -5.120395806896533e+09, 1.365808881323657e+09, -1.651383905702324e+08,
 
 2986       0.000000000000000e-01, -1.562975981216744e+01, 2.075857199589987e+03,
 
 2987       -8.904128307330524e+04, 1.836683464233000e+06, -2.171339625537650e+07,
 
 2988       1.623702309776589e+08, -8.168673425840398e+08, 2.877184244039678e+09,
 
 2989       -7.272633187920932e+09, 1.336161532561319e+10, -1.787465369706492e+10,
 
 2990       1.723415209556249e+10, -1.166677727073840e+10, 5.262202876034756e+09,
 
 2991       -1.420107794637259e+09, 1.734782145645626e+08, 0.000000000000000e-01,
 
 2992       1.245158740600359e+01, -1.662689739514946e+03, 7.210078018619273e+04,
 
 2993       -1.511262926531350e+06, 1.823010400853032e+07, -1.394732137018548e+08,
 
 2994       7.186625912313578e+08, -2.591802100670653e+09, 6.699969496687534e+09,
 
 2995       -1.256822106464210e+10, 1.713562111741701e+10, -1.680796707246793e+10,
 
 2996       1.155571599892056e+10, -5.285087289024682e+09, 1.444204616664480e+09,
 
 2997       -1.784123720377501e+08, 0.000000000000000e-01, -1.018430458430458e+01,
 
 2998       1.364696814296814e+03, -5.959855042735043e+04, 1.262405659052059e+06,
 
 2999       -1.543602456068376e+07, 1.199989722604507e+08, -6.293065120124320e+08,
 
 3000       2.311744565308469e+09, -6.087583637383061e+09, 1.162721665412277e+10,
 
 3001       -1.612769282864336e+10, 1.607722369253147e+10, -1.122097126220979e+10,
 
 3002       5.203928701314685e+09, -1.440373122685315e+09, 1.800466403356643e+08,
 
 3003       0.000000000000000e-01, 8.484036081962663e+00, -1.139564172918365e+03,
 
 3004       5.000628114583172e+04, -1.066865683702600e+06, 1.316848914076596e+07,
 
 3005       -1.035421266853741e+08, 5.500823983897466e+08, -2.049399257475671e+09,
 
 3006       5.477078740096760e+09, -1.061962761323504e+10, 1.495184835525608e+10,
 
 3007       -1.512401891411349e+10, 1.070494963879464e+10, -5.031502683587495e+09,
 
 3008       1.410393335939522e+09, -1.784123720377501e+08, 0.000000000000000e-01,
 
 3009       -7.151250283691663e+00, 9.621468006776697e+02, -4.236328367402523e+04,
 
 3010       9.083924059514159e+05, -1.128778312795541e+07, 8.948673396532559e+07,
 
 3011       -4.799806642461592e+08, 1.807454740270899e+09, -4.886699456126079e+09,
 
 3012       9.591077381959552e+09, -1.367409274689175e+10, 1.400781324267719e+10,
 
 3013       -1.004054471299105e+10, 4.777971704223384e+09, -1.355543638395742e+09,
 
 3014       1.734782145645626e+08, 0.000000000000000e-01, 6.060147075943005e+00,
 
 3015       -8.163167553056976e+02, 3.602890134025652e+04, -7.753708269797396e+05,
 
 3016       9.681484150831325e+06, -7.721340002337801e+07, 4.170906086685726e+08,
 
 3017       -1.583343835764609e+09, 4.319156776154927e+09, -8.559301071696637e+09,
 
 3018       1.232825943540154e+10, -1.276387222258454e+10, 9.248884856115279e+09,
 
 3019       -4.449869455469566e+09, 1.276405367800062e+09, -1.651383905702324e+08,
 
 3020       0.000000000000000e-01, -5.123522643555085e+00, 6.907394286218810e+02,
 
 3021       -3.053901287681582e+04, 6.589382296622791e+05, -8.256408016568484e+06,
 
 3022       6.613528180437879e+07, -3.591109349416936e+08, 1.371451685008549e+09,
 
 3023       -3.766497172573159e+09, 7.519828793959344e+09, -1.091857986975193e+10,
 
 3024       1.140164818726860e+10, -8.336452758217789e+09, 4.048470812623064e+09,
 
 3025       -1.172436575235404e+09, 1.531698732399162e+08, 0.000000000000000e-01,
 
 3026       4.271888353674923e+00, -5.762713061877649e+02, 2.550919052304026e+04,
 
 3027       -5.514258520673562e+05, 6.926418073801134e+06, -5.565457178175802e+07,
 
 3028       3.033329010654617e+08, -1.163492208450654e+09, 3.211252052317023e+09,
 
 3029       -6.446888262886903e+09, 9.417864122967573e+09, -9.899668972442366e+09,
 
 3030       7.289624669351123e+09, -3.566718678141100e+09, 1.041074047837655e+09,
 
 3031       -1.371250292488943e+08, 0.000000000000000e-01, -3.434977405385288e+00,
 
 3032       4.635617485626016e+02, -2.053688028669370e+04, 4.444943513906060e+05,
 
 3033       -5.592632684586483e+06, 4.503253959356561e+07, -2.460675245081598e+08,
 
 3034       9.466718497394927e+08, -2.621823641133609e+09, 5.284002694315866e+09,
 
 3035       -7.752423037115038e+09, 8.187712309040204e+09, -6.060153271928369e+09,
 
 3036       2.981652672294607e+09, -8.754772358617425e+08, 1.160408606498937e+08,
 
 3037       0.000000000000000e-01, 2.505373764729175e+00, -3.381913429670035e+02,
 
 3038       1.499009100007397e+04, -3.246847962658711e+05, 4.089321087106837e+06,
 
 3039       -3.296978262323839e+07, 1.804331430493320e+08, -6.954301078105766e+08,
 
 3040       1.930060872117711e+09, -3.899125665782255e+09, 5.735918309736332e+09,
 
 3041       -6.075963842786729e+09, 4.511802094762441e+09, -2.227740310582889e+09,
 
 3042       6.566301459893279e+08, -8.739414676532781e+07, 0.000000000000000e-01,
 
 3043       -1.000000000000000e+00, 1.350000000000000e+02, -5.985000000000000e+03,
 
 3044       1.296750000000000e+05, -1.633905000000000e+06, 1.318016700000000e+07,
 
 3045       -7.217710500000000e+07, 2.783974050000000e+08, -7.733261250000000e+08,
 
 3046       1.563837275000000e+09, -2.303105805000000e+09, 2.442687975000000e+09,
 
 3047       -1.816357725000000e+09, 8.981988750000000e+08, -2.651825250000000e+08,
 
 3048       3.535767000000000e+07 };
 
 3050   static const double fem_coef_gausslob_24[625] =
 
 3051     { 1.000000000000000e+00, -3.000000000000000e+02, 2.990000000000000e+04,
 
 3052       -1.480050000000000e+06, 4.351347000000000e+07, -8.412604200000000e+08,
 
 3053       1.141710570000000e+10, -1.137633032250000e+11, 8.595449577000000e+11,
 
 3054       -5.042663751840000e+12, 2.337962284944000e+13, -8.678799391080000e+13,
 
 3055       2.603639817324000e+14, -6.351736697208000e+14, 1.264298066396640e+15,
 
 3056       -2.054484357894540e+15, 2.719170473683950e+15, -2.914666390092600e+15,
 
 3057       2.505590405518200e+15, -1.701164012167620e+15, 8.910859111354200e+14,
 
 3058       -3.471763290138000e+14, 9.468445336740000e+13, -1.612380184155000e+13,
 
 3059       1.289904147324000e+12, 0.000000000000000e-01, 4.058641271792565e+02,
 
 3060       -5.527892747506228e+04, 3.080680865091051e+06, -9.608544697986574e+07,
 
 3061       1.921815551511292e+09, -2.664514371195282e+10, 2.693344195607988e+11,
 
 3062       -2.055620699316044e+12, 1.214897536784061e+13, -5.664114215003022e+13,
 
 3063       2.111637034506248e+14, -6.356401824720572e+14, 1.554903769748071e+15,
 
 3064       -3.101863582054997e+15, 5.049759901096915e+15, -6.693732300831693e+15,
 
 3065       7.184248666000200e+15, -6.182729556103940e+15, 4.201716500300169e+15,
 
 3066       -2.202700032171432e+15, 8.588067464630930e+14, -2.343664562972425e+14,
 
 3067       3.993223187351215e+13, -3.196139551478179e+12, 0.000000000000000e-01,
 
 3068       -1.624756704002590e+02, 4.076566744849383e+04, -2.856559180759908e+06,
 
 3069       1.002242332396244e+08, -2.149192199655287e+09, 3.116591524589708e+10,
 
 3070       -3.248555446646729e+11, 2.534404897909630e+12, -1.522400128496926e+13,
 
 3071       7.186059820369571e+13, -2.704952845330370e+14, 8.204876425573068e+14,
 
 3072       -2.019503996546278e+15, 4.049106649016715e+15, -6.619542027745681e+15,
 
 3073       8.805466617020362e+15, -9.478911036302426e+15, 8.178282706527972e+15,
 
 3074       -5.570062256804815e+15, 2.925593222099543e+15, -1.142548313369483e+15,
 
 3075       3.122535907953383e+14, -5.327144417235540e+13, 4.268671053543734e+12,
 
 3076       0.000000000000000e-01, 9.285790471348058e+01, -2.567292232023452e+04,
 
 3077       2.172505008713478e+06, -8.632693629032278e+07, 2.009759260312978e+09,
 
 3078       -3.083881003217180e+10, 3.346965047874316e+11, -2.690206053619648e+12,
 
 3079       1.652940573703274e+13, -7.940281485029880e+13, 3.030598877175188e+14,
 
 3080       -9.295754861643471e+14, 2.308921995608790e+15, -4.664329550291535e+15,
 
 3081       7.673380080847903e+15, -1.026158278560169e+16, 1.109639715400819e+16,
 
 3082       -9.611028022799504e+15, 6.567868332535721e+15, -3.459765425094874e+15,
 
 3083       1.354622808613475e+15, -3.710479852977045e+14, 6.342841599973944e+13,
 
 3084       -5.091588188794019e+12, 0.000000000000000e-01, -6.190263201810896e+01,
 
 3085       1.771295817306943e+04, -1.605426884400296e+06, 6.937138005497782e+07,
 
 3086       -1.732266817595608e+09, 2.807090718452186e+10, -3.177491729312126e+11,
 
 3087       2.638958096874092e+12, -1.663806369766778e+13, 8.158796865135113e+13,
 
 3088       -3.166342096198069e+14, 9.845663378570931e+14, -2.473337869447428e+15,
 
 3089       5.044014753850598e+15, -8.364663482728635e+15, 1.126254226203764e+16,
 
 3090       -1.225027170970453e+16, 1.066427200479037e+16, -7.319785257851210e+15,
 
 3091       3.870748078365627e+15, -1.520689469004945e+15, 4.177883147633562e+14,
 
 3092       -7.160927970988626e+13, 5.762006100161049e+12, 0.000000000000000e-01,
 
 3093       4.501042175430940e+01, -1.308958048352837e+04, 1.225547369430789e+06,
 
 3094       -5.535760993480313e+07, 1.449945861634959e+09, -2.454369660090688e+10,
 
 3095       2.883865544213490e+11, -2.470900824125910e+12, 1.598637745987517e+13,
 
 3096       -8.009303566237079e+13, 3.164491556576764e+14, -9.988976501079246e+14,
 
 3097       2.541436559580714e+15, -5.239264041161704e+15, 8.769361705836964e+15,
 
 3098       -1.190220432935039e+16, 1.303612471279278e+16, -1.141726255498977e+16,
 
 3099       7.878336148801056e+15, -4.185657107040718e+15, 1.651238357905402e+15,
 
 3100       -4.553312625304459e+14, 7.830179054235796e+13, -6.319165567954503e+12,
 
 3101       0.000000000000000e-01, -3.460823180120079e+01, 1.015469610544880e+04,
 
 3102       -9.679531870145017e+05, 4.485134755229398e+07, -1.210735945225935e+09,
 
 3103       2.114609948086286e+10, -2.559531795223062e+11, 2.252595670603948e+12,
 
 3104       -1.492191456512238e+13, 7.630937241452699e+13, -3.068986895462340e+14,
 
 3105       9.837309848042438e+14, -2.536329824251836e+15, 5.289429958022946e+15,
 
 3106       -8.942835505684019e+15, 1.224496508118832e+16, -1.351567177210176e+16,
 
 3107       1.191830727462528e+16, -8.273935552638878e+15, 4.419525275428065e+15,
 
 3108       -1.751884239411906e+15, 4.851652818736986e+14, -8.375521716296401e+13,
 
 3109       6.782865257514837e+12, 0.000000000000000e-01, 2.766582877253528e+01,
 
 3110       -8.161941725332768e+03, 7.865526415735044e+05, -3.702889412503837e+07,
 
 3111       1.019390720188427e+09, -1.819645578676150e+10, 2.252249000861092e+11,
 
 3112       -2.025483052842698e+12, 1.369084263890056e+13, -7.131369560391163e+13,
 
 3113       2.915943262851778e+14, -9.485944639479267e+14, 2.478119277999363e+15,
 
 3114       -5.228788122037598e+15, 8.932615077176731e+15, -1.234455468758280e+16,
 
 3115       1.373835480205531e+16, -1.220422101884528e+16, 8.528504524807064e+15,
 
 3116       -4.582579019928659e+15, 1.826238758482371e+15, -5.082003015125067e+14,
 
 3117       8.811547249928783e+13, -7.164301017225998e+12, 0.000000000000000e-01,
 
 3118       -2.275670591599455e+01, 6.737590226239552e+03, -6.539504206517175e+05,
 
 3119       3.111139106156313e+07, -8.679722967903971e+08, 1.573365420642779e+10,
 
 3120       -1.979909637705803e+11, 1.810880611538906e+12, -1.244463025448231e+13,
 
 3121       6.585374856883214e+13, -2.732735801573156e+14, 9.011914571652850e+14,
 
 3122       -2.383831456114384e+15, 5.087291841992724e+15, -8.780953301699755e+15,
 
 3123       1.224889816733013e+16, -1.374781660040675e+16, 1.230672077620068e+16,
 
 3124       -8.660226214361099e+15, 4.682883135541219e+15, -1.876981572450838e+15,
 
 3125       5.250670186065034e+14, -9.147680701891190e+13, 7.470231264323625e+12,
 
 3126       0.000000000000000e-01, 1.912965144613660e+01, -5.677631395079384e+03,
 
 3127       5.537935689545739e+05, -2.653927821530689e+07, 7.474036306614312e+08,
 
 3128       -1.369940651896189e+10, 1.745319507247928e+11, -1.617301631376405e+12,
 
 3129       1.126327452432594e+13, -6.039298017983792e+13, 2.538313181524926e+14,
 
 3130       -8.473116290006231e+14, 2.267097817730376e+15, -4.890112526330036e+15,
 
 3131       8.524655979372967e+15, -1.200076621013731e+16, 1.358349523272153e+16,
 
 3132       -1.225446423734989e+16, 8.685297402148473e+15, -4.727405822382261e+15,
 
 3133       1.906317065479628e+15, -5.362492238636365e+14, 9.390516767804315e+13,
 
 3134       -7.704880889559378e+12, 0.000000000000000e-01, -1.635497697368700e+01,
 
 3135       4.862656953497025e+03, -4.759804636482565e+05, 2.293041632316653e+07,
 
 3136       -6.502015538842764e+08, 1.201606379408697e+10, -1.545199230484324e+11,
 
 3137       1.446437458063616e+12, -1.018096106218994e+13, 5.518468570532575e+13,
 
 3138       -2.344620385089091e+14, 7.909885622725649e+14, -2.138165417503776e+15,
 
 3139       4.657339854616682e+15, -8.194527986057532e+15, 1.163730420250179e+16,
 
 3140       -1.328057957790062e+16, 1.207345046837354e+16, -8.618482475976474e+15,
 
 3141       4.722435616707614e+15, -1.916176031917556e+15, 5.421466879431477e+14,
 
 3142       -9.544980641239802e+13, 7.870911362255844e+12, 0.000000000000000e-01,
 
 3143       1.417066207624127e+01, -4.218698704765500e+03, 4.140273580736256e+05,
 
 3144       -2.002373113338682e+07, 5.706909517514257e+08, -1.061235738178459e+10,
 
 3145       1.374488760853391e+11, -1.296867134188179e+12, 9.206001697332345e+12,
 
 3146       -5.034424091354864e+13, 2.158419782218546e+14, -7.348173021384713e+14,
 
 3147       2.004252206567683e+15, -4.404149060382797e+15, 7.815178748758451e+15,
 
 3148       -1.118956431220418e+16, 1.286957131473114e+16, -1.178684055128811e+16,
 
 3149       8.473168167228462e+15, -4.673705358375533e+15, 1.908297467260950e+15,
 
 3150       -5.431049066701974e+14, 9.614927445703371e+13, -7.969947411626695e+12,
 
 3151       0.000000000000000e-01, -1.240846755882427e+01, 3.697723332529632e+03,
 
 3152       -3.636177333437864e+05, 1.763791694375029e+07, -5.046596469793725e+08,
 
 3153       9.429433336134134e+09, -1.228099190218494e+11, 1.166008419408402e+12,
 
 3154       -8.333618884154624e+12, 4.590449180645647e+13, -1.982963080519099e+14,
 
 3155       6.803133908337801e+14, -1.870091239145240e+15, 4.141349396659428e+15,
 
 3156       -7.405302748248103e+15, 1.068239700855010e+16, -1.237594459251991e+16,
 
 3157       1.141465416121965e+16, -8.261228940134621e+15, 4.586380576952005e+15,
 
 3158       -1.884249466545215e+15, 5.394272826690079e+14, -9.603440259637641e+13,
 
 3159       8.002866883031367e+12, 0.000000000000000e-01, 1.095558179466470e+01,
 
 3160       -3.267249008495488e+03, 3.217786804294041e+05, -1.564425754031200e+07,
 
 3161       4.489762785029423e+08, -8.420409805207488e+09, 1.101506623685581e+11,
 
 3162       -1.051033145830932e+12, 7.553210200363392e+12, -4.185258869687206e+13,
 
 3163       1.819278279112502e+14, -6.282336154227903e+14, 1.738507104235632e+15,
 
 3164       -3.876120340749998e+15, 6.978305450391071e+15, -1.013471839778258e+16,
 
 3165       1.182005159615111e+16, -1.097352991130819e+16, 7.992846614334175e+15,
 
 3166       -4.464988119249731e+15, 1.845417602986293e+15, -5.313770797673897e+14,
 
 3167       9.512946342200696e+13, -7.969947411626695e+12, 0.000000000000000e-01,
 
 3168       -9.733404845062563e+00, 2.904495367336991e+03, -2.863957452026712e+05,
 
 3169       1.394908621565543e+07, -4.012835563442479e+08, 7.548227155070059e+09,
 
 3170       -9.908687724892865e+10, 9.492474279583278e+11, -6.852122094227041e+12,
 
 3171       3.815223404048325e+13, -1.667054040084672e+14, 5.788252023371522e+14,
 
 3172       -1.610924210936436e+15, 3.612762299121459e+15, -6.543084510709907e+15,
 
 3173       9.560030643675167e+15, -1.121725598566102e+16, 1.047660019645038e+16,
 
 3174       -7.676343347474552e+15, 4.313320840279778e+15, -1.792974677700824e+15,
 
 3175       5.191726764406062e+14, -9.345206628174223e+13, 7.870911362255844e+12,
 
 3176       0.000000000000000e-01, 8.685152146887849e+00, -2.592917301003156e+03,
 
 3177       2.559159080755008e+05, -1.248235381982623e+07, 3.597715754514247e+08,
 
 3178       -6.783361410773893e+09, 8.929618961811727e+10, -8.582135820103382e+11,
 
 3179       6.217423158689400e+12, -3.475607425638306e+13, 1.525197220141970e+14,
 
 3180       -5.320009405626489e+14, 1.487763351500956e+15, -3.353349463718517e+15,
 
 3181       6.104800041187937e+15, -8.967037300250809e+15, 1.057820092203265e+16,
 
 3182       -9.933456336414407e+15, 7.318037585534789e+15, -4.134330534453634e+15,
 
 3183       1.727837357443638e+15, -5.029774927870322e+14, 9.101197367138191e+13,
 
 3184       -7.704880889559378e+12, 0.000000000000000e-01, -7.768227503689160e+00,
 
 3185       2.320048262018063e+03, -2.291579825895192e+05, 1.118998178170061e+07,
 
 3186       -3.230127412726743e+08, 6.101825984880789e+09, -8.050592964465223e+10,
 
 3187       7.757517929934399e+11, -5.636578411502579e+12, 3.161187883403309e+13,
 
 3188       -1.392153217132889e+14, 4.874510273126649e+14, -1.368719368735070e+15,
 
 3189       3.098228256202772e+15, -5.665515780120550e+15, 8.360206053329256e+15,
 
 3190       -9.909089467205730e+15, 9.350136076665120e+15, -6.922098442148973e+15,
 
 3191       3.930003596385763e+15, -1.650608740098542e+15, 4.828842861248500e+14,
 
 3192       -8.780874332485509e+13, 7.470231264323625e+12, 0.000000000000000e-01,
 
 3193       6.949251795654158e+00, -2.076080736426886e+03, 2.051850668187582e+05,
 
 3194       -1.002851556374879e+07, 2.898385274463058e+08, -5.483488755332865e+09,
 
 3195       7.247948130849744e+10, -6.998845716368053e+11, 5.097508994937879e+12,
 
 3196       -2.866481138828522e+13, 1.266058930533223e+14, -4.447041797385597e+14,
 
 3197       1.252927498139101e+15, -2.846337193255717e+15, 5.224630116918579e+15,
 
 3198       -7.740148279482860e+15, 9.211839907560781e+15, -8.729031202403334e+15,
 
 3199       6.490342376708594e+15, -3.701195553992629e+15, 1.561498591338377e+15,
 
 3200       -4.588915147832623e+14, 8.382775191413614e+13, -7.164301017225998e+12,
 
 3201       0.000000000000000e-01, -6.200545901231066e+00, 1.852852310460863e+03,
 
 3202       -1.832115058838774e+05, 8.961081566680860e+06, -2.592406841374813e+08,
 
 3203       4.910586592056635e+09, -6.500190149790611e+10, 6.287466876199138e+11,
 
 3204       -4.588252565931313e+12, 2.585696625207004e+13, -1.144768233740891e+14,
 
 3205       4.031460020145847e+14, -1.139023606360627e+15, 2.595327972551887e+15,
 
 3206       -4.779021130665880e+15, 7.103675353349177e+15, -8.483943776806492e+15,
 
 3207       8.068562477979859e+15, -6.021870692282251e+15, 3.447372991345801e+15,
 
 3208       -1.460201300789598e+15, 4.308660981996213e+14, -7.903354901739207e+13,
 
 3209       6.782865257514837e+12, 0.000000000000000e-01, 5.497265260133587e+00,
 
 3210       -1.643010914375697e+03, 1.625245542407611e+05, -7.953853255844527e+06,
 
 3211       2.302798044521235e+08, -4.366227075820252e+09, 5.786337032883471e+10,
 
 3212       -5.604566478207931e+11, 4.096239643506256e+12, -2.312433390636899e+13,
 
 3213       1.025754064938261e+14, -3.619933583977279e+14, 1.025085118853682e+15,
 
 3214       -2.341436140046740e+15, 4.322778692729082e+15, -6.443312152718818e+15,
 
 3215       7.717747123310279e+15, -7.362354286134902e+15, 5.512353176524103e+15,
 
 3216       -3.166155510128892e+15, 1.345687520087759e+15, -3.984797768116558e+14,
 
 3217       7.335818308855012e+13, -6.319165567954503e+12, 0.000000000000000e-01,
 
 3218       -4.814420396783881e+00, 1.439137261510244e+03, -1.424001050225189e+05,
 
 3219       6.972107765750786e+06, -2.019777804539574e+08, 3.832494908082456e+09,
 
 3220       -5.083618287186299e+10, 4.929144471099037e+11, -3.606960360420349e+12,
 
 3221       2.039001482865880e+13, -9.058350359554217e+13, 3.202053356214614e+14,
 
 3222       -9.083926524953095e+14, 2.078951013598256e+15, -3.846222877659622e+15,
 
 3223       5.745792065253601e+15, -6.898564020656367e+15, 6.597335811773795e+15,
 
 3224       -4.952528004193797e+15, 2.852412393699805e+15, -1.215806035913631e+15,
 
 3225       3.610885650804218e+14, -6.667886669397892e+13, 5.762006100161049e+12,
 
 3226       0.000000000000000e-01, 4.122502768575858e+00, -1.232445305915745e+03,
 
 3227       1.219756720552666e+05, -5.974119340666288e+06, 1.731450552812862e+08,
 
 3228       -3.287266438655767e+09, 4.363384253154989e+10, -4.234185297825935e+11,
 
 3229       3.101259925467429e+12, -1.754945237689139e+13, 7.805398522969187e+13,
 
 3230       -2.762644893141324e+14, 7.848217578377621e+14, -1.798840649081661e+15,
 
 3231       3.333370625337169e+15, -4.988259107765304e+15, 6.000070847701146e+15,
 
 3232       -5.749271353120764e+15, 4.324788417805135e+15, -2.496262406568326e+15,
 
 3233       1.066418114121039e+15, -3.174727574108465e+14, 5.876970053131701e+13,
 
 3234       -5.091588188794019e+12, 0.000000000000000e-01, -3.378098091794216e+00,
 
 3235       1.009981094027902e+03, -9.997415292076045e+04, 4.897701324351262e+06,
 
 3236       -1.419932385393241e+08, 2.696914741487987e+09, -3.581511558046563e+10,
 
 3237       3.477438352489987e+11, -2.548653261914288e+12, 1.443296944374584e+13,
 
 3238       -6.424560812216257e+13, 2.275969917931459e+14, -6.472060159591627e+14,
 
 3239       1.485016620793322e+15, -2.755030677045359e+15, 4.127938042773006e+15,
 
 3240       -4.971860898078912e+15, 4.770796079822418e+15, -3.594142516031414e+15,
 
 3241       2.077829100777859e+15, -8.891455208945626e+14, 2.651635856092349e+14,
 
 3242       -4.917666111269423e+13, 4.268671053543734e+12, 0.000000000000000e-01,
 
 3243       2.493031698759675e+00, -7.454011644125376e+02, 7.379166798110049e+04,
 
 3244       -3.615566630393531e+06, 1.048426846839652e+08, -1.991802210178859e+09,
 
 3245       2.645916950749144e+10, -2.569938254028299e+11, 1.884300408926143e+12,
 
 3246       -1.067564580288449e+13, 4.754491961430585e+13, -1.685282542848975e+14,
 
 3247       4.795322158961934e+14, -1.101030336950954e+15, 2.044141709763629e+15,
 
 3248       -3.065196721720791e+15, 3.694953407319221e+15, -3.548705940334544e+15,
 
 3249       2.676012339710790e+15, -1.548605987126603e+15, 6.633870802695019e+14,
 
 3250       -1.980596394144405e+14, 3.677511736196415e+13, -3.196139551478179e+12,
 
 3251       0.000000000000000e-01, -1.000000000000000e+00, 2.990000000000000e+02,
 
 3252       -2.960100000000000e+04, 1.450449000000000e+06, -4.206302100000000e+07,
 
 3253       7.991973990000000e+08, -1.061790830100000e+10, 1.031453949240000e+11,
 
 3254       -7.563995627760000e+11, 4.286264189064000e+12, -1.909335866037600e+13,
 
 3255       6.769463525042400e+13, -1.926693464819760e+14, 4.425043232388240e+14,
 
 3256       -8.217937431578160e+14, 1.232690614736724e+15, -1.486479858947226e+15,
 
 3257       1.428186531145374e+15, -1.077403874372826e+15, 6.237601377947940e+14,
 
 3258       -2.673257733406260e+14, 7.985055567317400e+13, -1.483389769422600e+13,
 
 3259       1.289904147324000e+12 };
 
 3261   static const double fem_coef_gausslob_32[1089] =
 
 3262     { 1.000000000000000e+00, -5.280000000000000e+02, 9.275200000000000e+04,
 
 3263       -8.115800000000000e+06, 4.236447600000000e+08, -1.462986571200000e+10,
 
 3264       3.573867195360000e+11, -6.471252385884000e+12, 8.987850535950000e+13,
 
 3265       -9.826716585972000e+14, 8.629643838226320e+15, -6.184578084062196e+16,
 
 3266       3.663173172867608e+17, -1.811459261308158e+18, 7.539120925634905e+18,
 
 3267       -2.657540126286304e+19, 7.972620378858912e+19, -2.042658293145551e+20,
 
 3268       4.479513800757788e+20, -8.416770667739633e+20, 1.354699278902855e+21,
 
 3269       -1.864910695632502e+21, 2.189242990525111e+21, -2.181310950704368e+21,
 
 3270       1.832301198591669e+21, -1.285429763935079e+21, 7.434251911077520e+20,
 
 3271       -3.481117958361696e+20, 1.286127324517868e+20, -3.607069737728273e+19,
 
 3272       7.214139475456547e+18, -9.163120704712953e+17, 5.553406487704820e+16,
 
 3273       0.000000000000000e-01, 7.143214682034540e+02, -1.714133648848133e+05,
 
 3274       1.688198752795928e+07, -9.347155797218437e+08, 3.338933321339879e+10,
 
 3275       -8.331872976904955e+11, 1.530331866800279e+13, -2.146891160964000e+14,
 
 3276       2.364531150945150e+15,  -2.087974965454055e+16, 1.502766434956253e+17,
 
 3277       -8.930913114593062e+17, 4.428285547618542e+18, -1.847053591535166e+19,
 
 3278       6.522650112096549e+19, -1.959752299775458e+20, 5.027465769775919e+20,
 
 3279       -1.103711061615762e+21, 2.075747280986809e+21, -3.343657099618051e+21,
 
 3280       4.606186697816854e+21, -5.410587449851726e+21, 5.393904740095235e+21,
 
 3281       -4.533054367123241e+21, 3.181470251931304e+21, -1.840698151594781e+21,
 
 3282       8.622096114618880e+20, -3.186487205259235e+20, 8.939310241964093e+19,
 
 3283       -1.788315002192243e+19, 2.271972224754086e+18, -1.377242653770284e+17,
 
 3284       0.000000000000000e-01, -2.859599139140576e+02, 1.263498115660723e+05,
 
 3285       -1.563762114667972e+07, 9.735262028286150e+08, -3.727077001705718e+10,
 
 3286       9.724728419064618e+11, -1.841437932011095e+13, 2.640184847320257e+14,
 
 3287       -2.955001754223333e+15, 2.641501188215526e+16, -1.919333187312935e+17,
 
 3288       1.149300695265413e+18, -5.733477927220639e+18, 2.403400433666191e+19,
 
 3289       -8.522440623029794e+19, 2.569470483161848e+20, -6.610937005531425e+20,
 
 3290       1.454972285683492e+21, -2.742254919882459e+21, 4.425523119288710e+21,
 
 3291       -6.106476088763322e+21, 7.183124069502222e+21, -7.170000472640595e+21,
 
 3292       6.032425263760434e+21, -4.238001893187230e+21, 2.454158919196046e+21,
 
 3293       -1.150483843370953e+21, 4.254938488755735e+20, -1.194452209653931e+20,
 
 3294       2.390927098916194e+19, -3.039204212011252e+18, 1.843238572103207e+17,
 
 3295       0.000000000000000e-01, 1.634368826450262e+02, -7.956978254181237e+04,
 
 3296       1.188506225092293e+07, -8.373897346830345e+08, 3.478333876388285e+10,
 
 3297       -9.598393772867426e+11, 1.891593013667364e+13, -2.793128536050818e+14,
 
 3298       3.196655214719607e+15, -2.907291848273606e+16, 2.141468780998689e+17,
 
 3299       -1.296440193900301e+18, 6.525499955570070e+18, -2.755634128784674e+19,
 
 3300       9.831738858873329e+19, -2.979627701541287e+20, 7.700118175018154e+20,
 
 3301       -1.701110443974214e+21, 3.216663602425906e+21, -5.205922417479511e+21,
 
 3302       7.201199888459469e+21, -8.489441777094031e+21, 8.490373918346112e+21,
 
 3303       -7.155631502801035e+21, 5.034836798969603e+21, -2.919618180375494e+21,
 
 3304       1.370386674687711e+21, -5.073912120857659e+20, 1.425804015450344e+20,
 
 3305       -2.856660788223791e+19, 3.634277715764878e+18, -2.205841595819251e+17,
 
 3306       0.000000000000000e-01, -1.089624682152292e+02, 5.490286557349962e+04,
 
 3307       -8.781653856365252e+06, 6.724119974793967e+08, -2.993574836604601e+10,
 
 3308       8.717420300323828e+11, -1.790617757376325e+13, 2.730388108651176e+14,
 
 3309       -3.204823752640508e+15, 2.974036495407882e+16, -2.226577421064578e+17,
 
 3310       1.366028725355318e+18, -6.951897867287077e+18, 2.962837694696566e+19,
 
 3311       -1.065339992825695e+20, 3.250038142137898e+20, -8.446629720680499e+20,
 
 3312       1.875178351120271e+21, -3.560917379168056e+21, 5.784532874816462e+21,
 
 3313       -8.027770029015426e+21, 9.491255762425382e+21, -9.516676697643140e+21,
 
 3314       8.038962462344214e+21, -5.667965587919967e+21, 3.292818343972966e+21,
 
 3315       -1.548126823651629e+21, 5.740631512413311e+20, -1.615361972833789e+20,
 
 3316       3.240477969405117e+19, -4.127262310667621e+18, 2.507669351857205e+17,
 
 3317       0.000000000000000e-01, 7.924220268285228e+01, -4.057928795465258e+04,
 
 3318       6.704332297502558e+06, -5.364604956918865e+08, 2.503646198522573e+10,
 
 3319       -7.610195551213778e+11, 1.621371476972958e+13, -2.548664517300070e+14,
 
 3320       3.067722734616486e+15, -2.906734241270257e+16, 2.214249975700081e+17,
 
 3321       -1.378338812356282e+18, 7.101001568235638e+18, -3.058038376939241e+19,
 
 3322       1.109399051188740e+20, -3.410471802537065e+20, 8.922579803599067e+20,
 
 3323       -1.992320553154499e+21, 3.802564715982721e+21, -6.204660474711801e+21,
 
 3324       8.644825045503473e+21, -1.025665248235139e+22, 1.031630159337718e+22,
 
 3325       -8.738843624083011e+21, 6.176944575139345e+21, -3.596664164242111e+21,
 
 3326       1.694457654020145e+21, -6.294971162057861e+20, 1.774358410868178e+20,
 
 3327       -3.564953335849152e+19, 4.546981308698057e+18, -2.766285114923478e+17,
 
 3328       0.000000000000000e-01, -6.094810716099949e+01, 3.149084615481936e+04,
 
 3329       -5.296674502372112e+06, 4.346997745238327e+08, -2.090081537881765e+10,
 
 3330       6.551264846374850e+11, -1.436792716105805e+13, 2.318076448212311e+14,
 
 3331       -2.854539793592080e+15, 2.758693070051896e+16, -2.137570364709653e+17,
 
 3332       1.350278421513405e+18, -7.045142142783022e+18, 3.067459655658656e+19,
 
 3333       -1.123483766643411e+20, 3.482651662900422e+20, -9.178174833360337e+20,
 
 3334       2.062604456625362e+21, -3.959135109240898e+21, 6.492786887393485e+21,
 
 3335       -9.086987198956428e+21, 1.082464243206250e+22, -1.092690369776145e+22,
 
 3336       9.286162259274268e+21, -6.583075803335110e+21, 3.843334757170004e+21,
 
 3337       -1.815042549975247e+21, 6.757786079688690e+20, -1.908640091400089e+20,
 
 3338       3.841802724253007e+19, -4.908370532055551e+18, 2.990786503802649e+17,
 
 3339       0.000000000000000e-01, 4.874762271398016e+01, -2.532459924379460e+04,
 
 3340       4.306289111489640e+06, -3.590409832532830e+08, 1.760136771205027e+10,
 
 3341       -5.636351004936871e+11, 1.263327395525212e+13, -2.081295681322519e+14,
 
 3342       2.613155513828582e+15, -2.570230208401814e+16, 2.023153786109967e+17,
 
 3343       -1.296022489490302e+18, 6.846470251956364e+18, -3.013872322115386e+19,
 
 3344       1.114644422978128e+20, -3.485183237291328e+20, 9.255531281005032e+20,
 
 3345       -2.094244828319674e+21, 4.044473148145946e+21, -6.669094801072411e+21,
 
 3346       9.379689895649970e+21, -1.122286017421572e+22, 1.137425276024759e+22,
 
 3347       -9.701397530693913e+21, 6.900090712824613e+21, -4.040491989417283e+21,
 
 3348       1.913372195656766e+21, -7.141717651945982e+20, 2.021704584417841e+20,
 
 3349       -4.077964478229480e+19, 5.220210907153068e+18, -3.186495777814819e+17,
 
 3350       0.000000000000000e-01, -4.013085745911482e+01, 2.092265556924549e+04,
 
 3351       -3.583307397906160e+06, 3.019036845311046e+08, -1.499682567334736e+10,
 
 3352       4.875419883971985e+11, -1.110534210962378e+13, 1.859662144990967e+14,
 
 3353       -2.372232833495577e+15, 2.368570555021916e+16, -1.890606460337203e+17,
 
 3354       1.226710982466906e+18, -6.556236864370271e+18, 2.916718348444145e+19,
 
 3355       -1.089043462231537e+20, 3.434548724554294e+20, -9.192120758302752e+20,
 
 3356       2.094521354663323e+21, -4.070706954543361e+21, 6.750946202167051e+21,
 
 3357       -9.544297656724117e+21, 1.147387384551836e+22, -1.167874642179135e+22,
 
 3358       1.000023491239336e+22, -7.138163819152158e+21, 4.193633752898508e+21,
 
 3359       -1.991877420085289e+21, 7.455334138647318e+20, -2.115867266165027e+20,
 
 3360       4.277941431548355e+19, -5.488110031116298e+18, 3.356769581362759e+17,
 
 3361       0.000000000000000e-01, 3.377658303742900e+01, -1.765321539233928e+04,
 
 3362       3.038340440514934e+06, -2.578584606807322e+08, 1.292884612296167e+10,
 
 3363       -4.249332478575872e+11, 9.796453340445514e+12, -1.661322016030880e+14,
 
 3364       2.146412285165976e+15, -2.170063067679739e+16, 1.753071524663780e+17,
 
 3365       -1.150445213494342e+18, 6.214123504683469e+18, -2.791805131931260e+19,
 
 3366       1.051885109311114e+20, -3.345072958360405e+20, 9.021185531229185e+20,
 
 3367       -2.069976464960887e+21, 4.048800325514122e+21, -6.754020775002269e+21,
 
 3368       9.599959543792231e+21, -1.159763408249418e+22, 1.185806715330365e+22,
 
 3369       -1.019594067425241e+22, 7.305655578610319e+21, -4.307135697275206e+21,
 
 3370       2.052428738060058e+21, -7.705007825196310e+20, 2.192794049399991e+20,
 
 3371       -4.444874922276286e+19, 5.715873383290923e+18, -3.503832522669480e+17,
 
 3372       0.000000000000000e-01, -2.892964123166297e+01, 1.514678464159201e+04,
 
 3373       -2.616230196259168e+06, 2.232056370284014e+08, -1.126780271399590e+10,
 
 3374       3.733563821201946e+11, -8.686293054983950e+12, 1.487584698214981e+14,
 
 3375       -1.941627928264148e+15, 1.983312707085937e+16, -1.618550810194144e+17,
 
 3376       1.072675099399285e+18, -5.848903282733471e+18, 2.651290247911275e+19,
 
 3377       -1.007365700808825e+20, 3.228755039109242e+20, -8.771430385090572e+20,
 
 3378       2.026394505724555e+21, -3.988616003559215e+21, 6.692583651440911e+21,
 
 3379       -9.564190176741721e+21, 1.161237649908247e+22, -1.192826855978758e+22,
 
 3380       1.030040441263462e+22, -7.409917359938946e+21, 4.384750316004612e+21,
 
 3381       -2.096582122064279e+21, 7.895856427194460e+20, -2.253772189916786e+20,
 
 3382       4.581095810605600e+19, -5.906211978906061e+18, 3.629208802827826e+17,
 
 3383       0.000000000000000e-01, 2.513021588285159e+01, -1.317482888832123e+04,
 
 3384       2.281636380391524e+06, -1.954241069277852e+08, 9.915879553852877e+09,
 
 3385       -3.305907224268159e+11, 7.745610540950591e+12, -1.336744677758923e+14,
 
 3386       1.759053047347007e+15, -1.812022604295268e+16, 1.491398073535739e+17,
 
 3387       -9.967823580408796e+17, 5.480122870501913e+18, -2.504020332812559e+19,
 
 3388       9.587106380784488e+19, -3.095239755572209e+20, 8.466795723536765e+20,
 
 3389       -1.968748626171725e+21, 3.898845137794306e+21, -6.579450581556874e+21,
 
 3390       9.452948974562387e+21, -1.153486704390072e+22, 1.190416296509360e+22,
 
 3391       -1.032457212621363e+22, 7.457660044656362e+21, -4.429851231444799e+21,
 
 3392       2.125705105699995e+21, -8.032242691112874e+20, 2.299857495593084e+20,
 
 3393       -4.688429048988357e+19, 6.061137852550284e+18, -3.733965028540281e+17,
 
 3394       0.000000000000000e-01, -2.208386882313948e+01,  1.158936145601140e+04,
 
 3395       -2.011104324155879e+06, 1.727696977814699e+08, -8.800873732349352e+09,
 
 3396       2.948204525687799e+11, -6.945679729271358e+12, 1.206045724118162e+14,
 
 3397       -1.597549338531331e+15, 1.657073913780072e+16, -1.373597907391489e+17,
 
 3398       9.246697496818755e+17, -5.120171153308929e+18, 2.356084529994870e+19,
 
 3399       -9.082843603687474e+19, 2.951965214544448e+20, -8.126535950009281e+20,
 
 3400       1.901181843699431e+21, -3.786945462658442e+21, 6.425892713139728e+21,
 
 3401       -9.280555773871743e+21, 1.138038464790677e+22, -1.179939706531010e+22,
 
 3402       1.027858871223671e+22, -7.455106011504378e+21, 4.445547883990988e+21,
 
 3403       -2.141041178542259e+21, 8.118044630932303e+20, -2.331957228005324e+20,
 
 3404       4.768370096691469e+19, -6.182197530650295e+18, 3.818855272205113e+17,
 
 3405       0.000000000000000e-01, 1.959414243804128e+01, -1.029081802559516e+04,
 
 3406       1.788568172854703e+06, -1.540118150914350e+08, 7.869521604579143e+09,
 
 3407       -2.646147373681910e+11, 6.261419532268355e+12, -1.092584911616051e+14,
 
 3408       1.455025808801897e+15, -1.517863644621452e+16, 1.265704706962783e+17,
 
 3409       -8.572524657708660e+17, 4.776247526570586e+18, -2.211426166036566e+19,
 
 3410       8.577380339701724e+19, -2.804435586124510e+20, 7.765584710933440e+20,
 
 3411       -1.827036131219099e+21, 3.659136530638906e+21, -6.241580538370836e+21,
 
 3412       9.059595877078572e+21, -1.116262879266932e+22, 1.162640401193756e+22,
 
 3413       -1.017180635719499e+22, 7.408032173818105e+21, -4.434731590925861e+21,
 
 3414       2.143740476291448e+21, -8.156798285468939e+20, 2.350876961959084e+20,
 
 3415       -4.822189338581046e+19, 6.270614615621034e+18, -3.884411477495515e+17,
 
 3416       0.000000000000000e-01, -1.752536768073206e+01, 9.210004044516183e+03,
 
 3417       -1.602710362254713e+06, 1.382643168640165e+08, -7.082209191374808e+09,
 
 3418       2.388593247336584e+11, -5.671955040601066e+12, 9.936819687224059e+13,
 
 3419       -1.329133616843959e+15, 1.393095353694366e+16, -1.167468019716584e+17,
 
 3420       7.948230830253194e+17, -4.451987054929648e+18, 2.072406047410437e+19,
 
 3421       -8.081630829587058e+19, 2.656550395781670e+20, -7.395103797274482e+20,
 
 3422       1.748920815324121e+21, -3.520456085792643e+21, 6.034597075619834e+21,
 
 3423       -8.800877008017673e+21, 1.089363982096666e+22, -1.139632655550776e+22,
 
 3424       1.001274028996965e+22, -7.321760958016250e+21, 4.400085249649023e+21,
 
 3425       -2.134871514399776e+21, 8.151766211905410e+20, -2.357346041272461e+20,
 
 3426       4.850993390791870e+19, -6.327377892472496e+18, 3.931001229299567e+17,
 
 3427       0.000000000000000e-01, 1.578106132320405e+01, -8.297465341460668e+03,
 
 3428       1.445356637015484e+06, -1.248763055461196e+08, 6.409121288934440e+09,
 
 3429       -2.166867323836831e+11, 5.160255428324136e+12, -9.069980923376013e+13,
 
 3430       1.217593153323901e+15, -1.281217702947176e+16, 1.078222149705347e+17,
 
 3431       -7.373025946691738e+17, 4.148685852384210e+18, -1.940267191328230e+19,
 
 3432       7.602301795140850e+19, -2.510934651183994e+20, 7.023105241061891e+20,
 
 3433       -1.668804442314510e+21, 3.374862747204858e+21, -5.811516441898685e+21,
 
 3434       8.513453677248631e+21, -1.058376696971405e+22, 1.111895644585412e+22,
 
 3435       -9.809014479986894e+21, 7.201130357372178e+21, -4.344074707924148e+21,
 
 3436       2.115422234515678e+21, -8.105961395642809e+20, 2.352029716821803e+20,
 
 3437       -4.855759087275033e+19, 6.353294711027987e+18, -3.958864781209368e+17,
 
 3438       0.000000000000000e-01, -1.429082487951404e+01, 7.516973886624383e+03,
 
 3439       -1.310468641451437e+06, 1.133605392742571e+08, -5.827511997735239e+09,
 
 3440       1.974178249055285e+11, -4.712515373341917e+12, 8.305450385112180e+13,
 
 3441       -1.118328972822835e+15, 1.180653064142852e+16, -9.971166758181266e+16,
 
 3442       6.844038883665075e+17, -3.866168854945464e+18, 1.815490936983781e+19,
 
 3443       -7.143043815405257e+19, 2.369235292422868e+20, -6.655061581666021e+20,
 
 3444       1.588114879269808e+21, -3.225364968659972e+21, 5.577529629049808e+21,
 
 3445       -8.204710901105034e+21, 1.024169036500672e+22, -1.080270746628453e+22,
 
 3446       9.567317871713345e+21, -7.050459812170524e+21, 4.268932026970228e+21,
 
 3447       -2.086295163199683e+21, 8.022143863884770e+20, -2.335532639673231e+20,
 
 3448       4.837349156604751e+19, -6.349020768043736e+18, 3.968137980027335e+17,
 
 3449       0.000000000000000e-01, 1.300209931372656e+01, -6.841393840416191e+03,
 
 3450       1.193492661387020e+06, -1.033456200764548e+08, 5.319778623982719e+09,
 
 3451       -1.805161947596514e+11, 4.317533185036128e+12, -7.626509475155619e+13,
 
 3452       1.029508945956098e+15, -1.089906772387182e+16, 9.232461935811958e+16,
 
 3453       -6.357336264452389e+17, 3.603376239255576e+18, -1.698055636889742e+19,
 
 3454       6.705347306221760e+19, -2.232368248073979e+20, 6.294452022548759e+20,
 
 3455       -1.507836188614350e+21, 3.074157987189278e+21, -5.336595912526426e+21,
 
 3456       7.880489249366001e+21, -9.874488341898865e+21, 1.045462363245188e+22,
 
 3457       -9.293378659359744e+21, 6.873520006757566e+21, -4.176636208226636e+21,
 
 3458       2.048299449271481e+21, -7.902800175855315e+20, 2.308396453521622e+20,
 
 3459       -4.796514797886738e+19, 6.315072588841990e+18, -3.958864781209368e+17,
 
 3460       0.000000000000000e-01, -1.187480374787823e+01, 6.249975469245804e+03,
 
 3461       -1.090926975816432e+06, 9.454341715249161e+07, -4.872094426264295e+09,
 
 3462       1.655534657183789e+11, -3.966168303111664e+12, 7.019129535830873e+13,
 
 3463       -9.495382387492220e+14, 1.007610862599221e+16, -8.557186874129430e+16,
 
 3464       5.908530248892806e+17, -3.358744210862016e+18, 1.587616779782261e+19,
 
 3465       -6.289207145157216e+19, 2.100713184820985e+20, -5.943219992524428e+20,
 
 3466       1.428595119033459e+21, -2.922754970902040e+21, 5.091600520853282e+21,
 
 3467       -7.545231007708337e+21, 9.487734903251288e+21, -1.008041543577854e+22,
 
 3468       8.991956191593799e+21, -6.673509171379833e+21, 4.068893946683280e+21,
 
 3469       -2.002141237919232e+21, 7.750111453424084e+20, -2.271093028431890e+20,
 
 3470       4.733888021452981e+19, -6.251826041286116e+18, 3.931001229299567e+17,
 
 3471       0.000000000000000e-01, 1.087774446529347e+01, -5.726532522119743e+03,
 
 3472       1.000026921141720e+06, -8.672640379209894e+07, 4.473426627332310e+09,
 
 3473       -1.521830785057648e+11, 3.650893458666403e+12, -6.471493237339299e+13,
 
 3474       8.770338012270925e+14, -9.325329559951301e+15, 7.936874744339234e+16,
 
 3475       -5.493120646406107e+17, 3.130441935246294e+18, -1.483627518494573e+19,
 
 3476       5.893595494590624e+19, -1.974260043524307e+20, 5.602136541583943e+20,
 
 3477       -1.350733620606971e+21, 2.772103374812838e+21, -4.844503527518292e+21,
 
 3478       7.202129004924270e+21, -9.085610385118606e+21, 9.684512731454793e+21,
 
 3479       -8.666845324741530e+21, 6.453034816508831e+21, -3.947120866745059e+21,
 
 3480       1.948412902571092e+21, -7.565912375504262e+20, 2.224014019524002e+20,
 
 3481       -4.649964958533596e+19, 6.159502112364614e+18, -3.884411477495515e+17,
 
 3482       0.000000000000000e-01, -9.986140223631332e+00, 5.258180249016786e+03,
 
 3483       -9.185985927746997e+05, 7.971153565650261e+07, -4.114819554974130e+09,
 
 3484       1.401203840137855e+11, -3.365432249133715e+12, 5.973558126785002e+13,
 
 3485       -8.107918476058353e+14, 8.635671857055418e+15, -7.363618322103649e+16,
 
 3486       5.106667921634938e+17,  -2.916510065095704e+18, 1.385415474244305e+19,
 
 3487       -5.516783142970931e+19, 1.852714215024819e+20, -5.271074464383260e+20,
 
 3488       1.274366202537370e+21, -2.622681385943975e+21, 4.596469304424025e+21,
 
 3489       -6.853262795168416e+21, 8.671008970964122e+21, -9.270120999117532e+21,
 
 3490       8.320885075782802e+21, -6.214097196642535e+21, 3.812422050430118e+21,
 
 3491       -1.887580884371838e+21, 7.351640810621922e+20, -2.167456694682573e+20,
 
 3492       4.545079901812915e+19, -6.038139340406067e+18, 3.818855272205113e+17,
 
 3493       0.000000000000000e-01, 9.179865311132163e+00, -4.834435688158695e+03,
 
 3494       8.448504512588955e+05, -7.334848338052211e+07, 3.788859743400152e+09,
 
 3495       -1.291272970868570e+11, 3.104465491388026e+12, -5.516672358352230e+13,
 
 3496       7.497538905042167e+14, -7.997160527339879e+15, 6.830050930752028e+16,
 
 3497       -4.744858033268795e+17, 2.714931990926294e+18, -1.292227727069609e+19,
 
 3498       5.156543365822560e+19, -1.735567332289304e+20, 4.949202035461436e+20,
 
 3499       -1.199422235955881e+21, 2.474571823687724e+21, -4.347969142753134e+21,
 
 3500       6.499709691677232e+21, -8.245627749154246e+21, 8.839266680637617e+21,
 
 3501       -7.955961175047700e+21, 5.958068545674167e+21, -3.665569136784129e+21,
 
 3502       1.819971125502232e+21, -7.108274904080239e+20, 2.101605178572964e+20,
 
 3503       -4.419368247642274e+19, 5.887550238778617e+18, -3.733965028540281e+17,
 
 3504       0.000000000000000e-01, -8.442157387023658e+00, 4.446553379007233e+03,
 
 3505       -7.772828492878541e+05, 6.751075382325961e+07, -3.489264209336539e+09,
 
 3506       1.190001385182876e+11, -2.863388547750731e+12, 5.093235749821151e+13,
 
 3507       -6.929732092529343e+14, 7.400674318693824e+15, -6.329249553366740e+16,
 
 3508       4.403495020338399e+17, -2.523657530207839e+18, 1.203252080967825e+19,
 
 3509       -4.810263202989546e+19, 1.622139284826088e+20, -4.635104707077193e+20,
 
 3510       1.125673633860567e+21, -2.327511860731306e+21, 4.098851177315484e+21,
 
 3511       -6.141619421494262e+21, 7.810022020551529e+21, -8.392815674436741e+21,
 
 3512       7.572989471395764e+21, -5.685659534933809e+21, 3.506969466398297e+21,
 
 3513       -1.745750145592470e+21, 6.836250778812437e+20, -2.026505202012846e+20,
 
 3514       4.272714338022826e+19, -5.707256190142981e+18, 3.629208802827826e+17,
 
 3515       0.000000000000000e-01, 7.758620432176431e+00, -4.087010780643976e+03,
 
 3516       7.146017483117621e+05, -6.208866298624787e+07, 3.210548205967185e+09,
 
 3517       -1.095595506626254e+11, 2.638102073062174e+12, -4.696390598303079e+13,
 
 3518       6.395814992099562e+14, -6.837680401038084e+15, 5.854580721511378e+16,
 
 3519       -4.078439182746133e+17, 2.340589674143266e+18, -1.117619206099512e+19,
 
 3520       4.474976818167516e+19, -1.511594767319364e+20, 4.326839217130804e+20,
 
 3521       -1.052747833818875e+21, 2.180916376866737e+21, -3.848371023940319e+21,
 
 3522       5.778239784350781e+21, -7.363608932672221e+21, 7.930445122237345e+21,
 
 3523       -7.171862635842173e+21, 5.396860454297140e+21, -3.336620071079666e+21,
 
 3524       1.664898414527208e+21, -6.535348447882521e+20, 1.942028797566696e+20,
 
 3525       -4.104676746515045e+19, 5.496390689251412e+18, -3.503832522669480e+17,
 
 3526       0.000000000000000e-01,  -7.116397718865410e+00, 3.749079648317452e+03,
 
 3527       -6.556462179536947e+05, 5.698334876317732e+07, -2.947736407946278e+09,
 
 3528       1.006414850064029e+11, -2.424817814258759e+12, 4.319719539696606e+13,
 
 3529       -5.887538442457942e+14, 6.299924892323114e+15, -5.399488828717867e+16,
 
 3530       3.765493816021260e+17, -2.163536905559044e+18, 1.034386803998833e+19,
 
 3531       -4.147323866260055e+19, 1.402934443266815e+20, -4.021917192563760e+20,
 
 3532       9.801245774469403e+20, -2.033870287254597e+21, 3.595172619362371e+21,
 
 3533       -5.407874926278053e+21, 6.904593808205439e+21, -7.450539640286401e+21,
 
 3534       6.751333782133479e+21, -5.090837485270753e+21, 3.154034661016916e+21,
 
 3535       -1.577170275266693e+21, 6.204523939342194e+20, -1.847822507348537e+20,
 
 3536       3.914377458647115e+19, -5.253552629244530e+18, 3.356769581362759e+17,
 
 3537       0.000000000000000e-01, 6.503405049947615e+00, -3.426426844095358e+03,
 
 3538       5.993202798185401e+05, -5.210105929407407e+07, 2.696081626301935e+09,
 
 3539       -9.208817752140222e+10, 2.219856964226088e+12, -3.956916806058024e+13,
 
 3540       5.396682472814272e+14, -5.779046608150560e+15, 4.957204191401071e+16,
 
 3541       -3.460227309661112e+17, 1.990124376198793e+18, -9.525027063011665e+18,
 
 3542       3.823419916527245e+19, -1.294955870987350e+20, 3.717202435921960e+20,
 
 3543       -9.071121012468153e+20, 1.885079625280803e+21, -3.337199379905083e+21,
 
 3544       5.027744029565647e+21, -6.429775852763725e+21, 6.949963688436526e+21,
 
 3545       -6.308792489007701e+21, 4.765750352591050e+21, -2.958122806424166e+21,
 
 3546       1.482030100296912e+21, -5.841647400501416e+20, 1.743227189970331e+20,
 
 3547       -3.700329724016468e+19, 4.976575581854351e+18, -3.186495777814819e+17,
 
 3548       0.000000000000000e-01, -5.907497514106532e+00, 3.112678595829013e+03,
 
 3549       -5.445178292388210e+05, 4.734677219183480e+07, -2.450744429063559e+09,
 
 3550       8.373760838189771e+10, -2.019407140707212e+12, 3.601376581781814e+13,
 
 3551       -4.914525865076907e+14, 5.266042927583444e+15, -4.520313655093684e+16,
 
 3552       3.157692701941383e+17, -1.817642904902012e+18, 8.707370090912989e+18,
 
 3553       -3.498599158499494e+19, 1.186170493957938e+20, -3.408681448268105e+20,
 
 3554       8.327925173944575e+20, -1.732759335262471e+21, 3.071495239478500e+21,
 
 3555       -4.633677555133575e+21, 5.934150774303194e+21, -6.423619232920034e+21,
 
 3556       5.839849717449368e+21, -4.418427829351906e+21, 2.746981777317360e+21,
 
 3557       -1.378544874829898e+21, 5.443069194938188e+20, -1.627146166161762e+20,
 
 3558       3.460155133741941e+19, -4.662146280112927e+18, 2.990786503802649e+17,
 
 3559       0.000000000000000e-01, 5.315369270978286e+00, -2.800843064095075e+03,
 
 3560       4.900224139921877e+05, -4.261558203433840e+07, 2.206354210150574e+09,
 
 3561       -7.540878769771313e+10, 1.819175365822707e+12, -3.245589496559513e+13,
 
 3562       4.431044900769581e+14, -4.750435903707279e+15, 4.080066038394767e+16,
 
 3563       -2.851956961225284e+17, 1.642785899790599e+18, -7.875595013484737e+18,
 
 3564       3.166934141851351e+19, -1.074644294009643e+20, 3.091013384752239e+20,
 
 3565       -7.559132271023600e+20, 1.574408999942342e+21, -2.793807988826481e+21,
 
 3566       4.219517259473626e+21, -5.410137053845813e+21, 5.863599367756335e+21,
 
 3567       -5.337558212358710e+21, 4.043769184497504e+21, -2.517518733791446e+21,
 
 3568       1.265191806068099e+21, -5.002850262989436e+20, 1.497812681253764e+20,
 
 3569       -3.190085448905626e+19, 4.305131059057072e+18, -2.766285114923478e+17,
 
 3570       0.000000000000000e-01, -4.710772351834030e+00, 2.482373368683492e+03,
 
 3571       -4.343438634071739e+05, 3.777856440947868e+07, -1.956282178028853e+09,
 
 3572       6.687710881826573e+10, -1.613799071688983e+12, 2.880102840436904e+13,
 
 3573       -3.933509953446171e+14, 4.218785748675981e+15, -3.625111116519231e+16,
 
 3574       2.535230396849270e+17, -1.461153893751222e+18, 7.009048271913450e+18,
 
 3575       -2.820301208876073e+19, 9.576835312471221e+19, -2.756632919785344e+20,
 
 3576       6.746687832309763e+20, -1.406360250100074e+21, 2.497787658823857e+21,
 
 3577       -3.775905442111079e+21, 4.846020652107188e+21, -5.257496778824818e+21,
 
 3578       4.790865278530114e+21, -3.633565158982738e+21, 2.264711978580421e+21,
 
 3579       -1.139484606704540e+21, 4.511274997631573e+20, -1.352342175988863e+20,
 
 3580       2.884004791547230e+19, -3.897279615275436e+18, 2.507669351857205e+17,
 
 3581       0.000000000000000e-01, 4.070989770987400e+00, -2.145310206509185e+03,
 
 3582       3.753936962817004e+05, -3.265459454227024e+07, 1.691185508550510e+09,
 
 3583       -5.782472303217436e+10, 1.395652621524724e+12, -2.491398584416296e+13,
 
 3584       3.403599167085817e+14, -3.651608452505086e+15, 3.138862675548854e+16,
 
 3585       -2.196030665561983e+17, 1.266200972268635e+18, -6.076691812326445e+18,
 
 3586       2.446363025550984e+19, -8.311520079137181e+19, 2.393790730533568e+20,
 
 3587       -5.862224225217512e+20, 1.222781062900224e+21, -2.173219858365351e+21,
 
 3588       3.287615107047680e+21, -4.222527251629046e+21, 4.584681175928391e+21,
 
 3589       -4.181215238485294e+21, 3.173915831158933e+21, -1.979997675938663e+21,
 
 3590       9.971596317435381e+20, -3.951620422561584e+20, 1.185761286177830e+20,
 
 3591       -2.531374184616153e+19, 3.424415390856724e+18, -2.205841595819251e+17,
 
 3592       0.000000000000000e-01, -3.358090451409268e+00, 1.769674233094550e+03,
 
 3593       -3.096791496404924e+05, 2.694027470522958e+07, -1.395380783042074e+09,
 
 3594       4.771664530498290e+10, -1.151859937920620e+12, 2.056566436202355e+13,
 
 3595       -2.810129791321012e+14, 3.015587336970416e+15, -2.592812452685370e+16,
 
 3596       1.814511218788989e+17, -1.046544742872117e+18, 5.024209499496014e+18,
 
 3597       -2.023384009065594e+19, 6.877115067771995e+19, -1.981490581745830e+20,
 
 3598       4.854671646250063e+20, -1.013093139325803e+21, 1.801437605201838e+21,
 
 3599       -2.726610427990654e+21, 3.503909183048419e+21, -3.806619619529808e+21,
 
 3600       3.473717880327268e+21, -2.638522642188920e+21, 1.647082019674793e+21,
 
 3601       -8.300649678444784e+20, 3.291782934571713e+20, -9.884928188742345e+19,
 
 3602       2.111857359313218e+19, -2.859159218719010e+18, 1.843238572103207e+17,
 
 3603       0.000000000000000e-01, 2.488636218117664e+00, -1.311502616747683e+03,
 
 3604       2.295099147207366e+05, -1.996696431094197e+07, 1.034261165808075e+09,
 
 3605       -3.537054923192207e+10, 8.539117568460436e+11, -1.524770635014292e+13,
 
 3606       2.083740755848528e+14, -2.236412246676083e+15, 1.923184048547382e+16,
 
 3607       -1.346128075294067e+17, 7.765487558375990e+17, -3.728808938617731e+18,
 
 3608       1.502032959138465e+19, -5.106384693104742e+19, 1.471677691807719e+20,
 
 3609       -3.606628515829967e+20, 7.528686576360846e+20, -1.339136443296313e+21,
 
 3610       2.027551807534738e+21, -2.606468672347013e+21, 2.832680005398635e+21,
 
 3611       -2.585940609411422e+21, 1.964981315222245e+21, -1.227139920687813e+21,
 
 3612       6.186996825719858e+20, -2.454684425809199e+20, 7.374666999744300e+19,
 
 3613       -1.576324668155186e+19, 2.135204267310823e+18, -1.377242653770284e+17,
 
 3614       0.000000000000000e-01, -1.000000000000000e+00, 5.270000000000000e+02,
 
 3615       -9.222500000000000e+04, 8.023575000000000e+06, -4.156211850000000e+08,
 
 3616       1.421424452700000e+10, -3.431724750090000e+11, 6.128079910875000e+12,
 
 3617       -8.375042544862500e+13, 8.989212331485750e+14, -7.730722605077745e+15,
 
 3618       5.411505823554421e+16, -3.122022590512166e+17, 1.499257002256941e+18,
 
 3619       -6.039863923377964e+18, 2.053553733948508e+19, -5.919066644910405e+19,
 
 3620       1.450751628654511e+20, -3.028762172103277e+20, 5.388008495636356e+20,
 
 3621       -8.158984293392197e+20, 1.049012266293282e+21, -1.140230724231829e+21,
 
 3622       1.041080226472539e+21, -7.912209721191298e+20, 4.942087918159488e+20,
 
 3623       -2.492163992918032e+20, 9.889539654436636e+19, -2.971733590742043e+19,
 
 3624       6.353361469862300e+18, -8.607780055942471e+17, 5.553406487704820e+16 };
 
 3626   static const double *fem_coeff_gausslob[] =
 
 3627     { 0, fem_coef_gausslob_1, fem_coef_gausslob_2, fem_coef_gausslob_3,
 
 3628       fem_coef_gausslob_4, fem_coef_gausslob_5, fem_coef_gausslob_6, fem_coef_gausslob_7, fem_coef_gausslob_8,
 
 3629       fem_coef_gausslob_9, fem_coef_gausslob_10, fem_coef_gausslob_11, fem_coef_gausslob_12, fem_coef_gausslob_13,
 
 3630       fem_coef_gausslob_14, 0, fem_coef_gausslob_16, 0, 0, 0, 0, 0, 0, 0, fem_coef_gausslob_24, 0, 0, 0, 0, 0, 0, 0,
 
 3631       fem_coef_gausslob_32, };
 
 3633   const unsigned fem_coeff_gausslob_max_k = 33;
 
 3636   class PK_GL_fem_ : 
public fem<base_poly> {
 
 3638     PK_GL_fem_(
unsigned k);
 
 3641   PK_GL_fem_::PK_GL_fem_(
unsigned k) {
 
 3643     dim_ = cvr->structure()->dim();
 
 3644     is_standard_fem = is_equiv = is_pol = is_lag = 
true;
 
 3646     GMM_ASSERT1(k < fem_coeff_gausslob_max_k && fem_coeff_gausslob[k],
 
 3647                 "try another degree");
 
 3649     std::stringstream sstr; sstr << 
"IM_GAUSSLOBATTO1D(" << k*2-1 << 
")";
 
 3651     std::vector<base_node> points(k+1);
 
 3653       points[i] = gl_im->approx_method()->point(i);
 
 3655     std::sort(points.begin(),points.end());
 
 3659     const double *coefs = fem_coeff_gausslob[k];
 
 3662       std::copy(coefs, coefs+k+1, base_[r].begin());
 
 3667   static pfem PK_GL_fem(fem_param_list ¶ms,
 
 3668         std::vector<dal::pstatic_stored_object> &dependencies) {
 
 3669     GMM_ASSERT1(params.size() == 1, 
"Bad number of parameters : " 
 3670                 << params.size() << 
" should be 1.");
 
 3671     GMM_ASSERT1(params[0].type() == 0, 
"Bad type of parameters");
 
 3672     int k = int(::floor(params[0].num() + 0.01));
 
 3673     pfem p = std::make_shared<PK_GL_fem_>(k);
 
 3674     dependencies.push_back(p->ref_convex(0));
 
 3675     dependencies.push_back(p->node_tab(0));
 
 3683   struct hermite_segment__ : 
public fem<base_poly> {
 
 3684     virtual void mat_trans(base_matrix &M, 
const base_matrix &G,
 
 3686     hermite_segment__();
 
 3689   void hermite_segment__::mat_trans(base_matrix &M,
 
 3690                                     const base_matrix &G,
 
 3692     THREAD_SAFE_STATIC bgeot::pgeotrans_precomp pgp;
 
 3694     THREAD_SAFE_STATIC base_matrix K(1, 1);
 
 3695     THREAD_SAFE_STATIC base_vector r(1);
 
 3696     dim_type N = dim_type(G.nrows());
 
 3698     if (pgt != pgt_stored) {
 
 3700       for (
size_type i = 0; i < N; ++i) r[i] = ::exp(
double(i));
 
 3702       pgp = bgeot::geotrans_precomp(pgt, node_tab(0), 0);
 
 3708     if (N == 1) M(1, 1) = K(0,0);
 
 3710       * gmm::sgn(gmm::vect_sp(gmm::mat_col(K, 0), r));
 
 3712     if (!(pgt->is_linear())) 
gmm::mult(G, pgp->grad(3), K);
 
 3713     if (N == 1) M(3, 3) = K(0,0);
 
 3715       * gmm::sgn(gmm::vect_sp(gmm::mat_col(K, 0), r));
 
 3721   hermite_segment__::hermite_segment__() {
 
 3724     dim_ = cvr->structure()->dim();
 
 3728     is_standard_fem = is_lag = is_equiv = 
false;
 
 3732     read_poly(base_[0], 1, 
"(1 - x)^2*(2*x + 1)");
 
 3735     read_poly(base_[1], 1, 
"x*(x - 1)*(x - 1)");
 
 3738     read_poly(base_[2], 1, 
"x*x*(3  - 2*x)");
 
 3741     read_poly(base_[3], 1, 
"x*x*(x - 1)");
 
 3748   struct hermite_triangle__ : 
public fem<base_poly> {
 
 3749     virtual void mat_trans(base_matrix &M, 
const base_matrix &G,
 
 3751     hermite_triangle__();
 
 3754   void hermite_triangle__::mat_trans(base_matrix &M,
 
 3755                                     const base_matrix &G,
 
 3758     THREAD_SAFE_STATIC bgeot::pgeotrans_precomp pgp;
 
 3760     THREAD_SAFE_STATIC base_matrix K(2, 2);
 
 3761     dim_type N = dim_type(G.nrows());
 
 3763     GMM_ASSERT1(N == 2, 
"Sorry, this version of hermite " 
 3764                 "element works only in dimension two.")
 
 3765     if (pgt != pgt_stored)
 
 3766       { pgt_stored = pgt; pgp = bgeot::geotrans_precomp(pgt, node_tab(0), 0); }
 
 3771       if (i && !(pgt->is_linear())) 
gmm::mult(G, pgp->grad(i*3), K);
 
 3772       gmm::copy(K, gmm::sub_matrix(M, gmm::sub_interval(1+3*i, 2)));
 
 3776   hermite_triangle__::hermite_triangle__() {
 
 3778     dim_ = cvr->structure()->dim();
 
 3782     is_standard_fem = is_lag = is_equiv = 
false;
 
 3786     read_poly(base_[0], 2, 
"(1 - x - y)*(1 + x + y - 2*x*x - 11*x*y - 2*y*y)");
 
 3789     read_poly(base_[1], 2, 
"x*(1 - x - y)*(1 - x - 2*y)");
 
 3792     read_poly(base_[2], 2, 
"y*(1 - x - y)*(1 - 2*x - y)");
 
 3795     read_poly(base_[3], 2, 
"-2*x*x*x + 7*x*x*y + 7*x*y*y + 3*x*x - 7*x*y");
 
 3798     read_poly(base_[4], 2, 
"x*x*x - 2*x*x*y - 2*x*y*y - x*x + 2*x*y");
 
 3801     read_poly(base_[5], 2, 
"x*y*(2*x + y - 1)");
 
 3804     read_poly(base_[6], 2, 
"7*x*x*y + 7*x*y*y - 2*y*y*y + 3*y*y - 7*x*y");
 
 3807     read_poly(base_[7], 2, 
"x*y*(x + 2*y - 1)");
 
 3810     read_poly(base_[8], 2, 
"y*y*y - 2*y*y*x - 2*y*x*x - y*y + 2*x*y");
 
 3812     add_node(
lagrange_dof(2), base_node(1.0/3.0, 1.0/3.0));
 
 3813     read_poly(base_[9], 2, 
"27*x*y*(1 - x - y)");
 
 3821   struct hermite_tetrahedron__ : 
public fem<base_poly> {
 
 3822     virtual void mat_trans(base_matrix &M, 
const base_matrix &G,
 
 3824     hermite_tetrahedron__();
 
 3827   void hermite_tetrahedron__::mat_trans(base_matrix &M,
 
 3828                                     const base_matrix &G,
 
 3830     THREAD_SAFE_STATIC bgeot::pgeotrans_precomp pgp;
 
 3832     THREAD_SAFE_STATIC base_matrix K(3, 3);
 
 3833     dim_type N = dim_type(G.nrows());
 
 3834     GMM_ASSERT1(N == 3, 
"Sorry, this version of hermite " 
 3835                 "element works only on dimension three.")
 
 3836     if (pgt != pgt_stored)
 
 3837       { pgt_stored = pgt; pgp = bgeot::geotrans_precomp(pgt, node_tab(0), 0); }
 
 3842       if (k && !(pgt->is_linear())) 
gmm::mult(G, pgp->grad(k*4), K);
 
 3843       gmm::copy(K, gmm::sub_matrix(M, gmm::sub_interval(1+4*k, 3)));
 
 3847   hermite_tetrahedron__::hermite_tetrahedron__() {
 
 3849     dim_ = cvr->structure()->dim();
 
 3853     is_standard_fem = is_lag = is_equiv = 
false;
 
 3856       ( 
"1 - 3*x*x - 13*x*y - 13*x*z - 3*y*y - 13*y*z - 3*z*z + 2*x*x*x" 
 3857         "+ 13*x*x*y + 13*x*x*z + 13*x*y*y + 33*x*y*z + 13*x*z*z + 2*y*y*y" 
 3858         "+ 13*y*y*z + 13*y*z*z + 2*z*z*z;" 
 3859         "x - 2*x*x - 3*x*y - 3*x*z + x*x*x + 3*x*x*y + 3*x*x*z + 2*x*y*y" 
 3860         "+ 4*x*y*z + 2*x*z*z;" 
 3861         "y - 3*x*y - 2*y*y - 3*y*z + 2*x*x*y + 3*x*y*y + 4*x*y*z" 
 3862         "+ y*y*y + 3*y*y*z + 2*y*z*z;" 
 3863         "z - 3*x*z - 3*y*z - 2*z*z + 2*x*x*z + 4*x*y*z + 3*x*z*z" 
 3864         "+ 2*y*y*z + 3*y*z*z + z*z*z;" 
 3865         "3*x*x - 7*x*y - 7*x*z - 2*x*x*x + 7*x*x*y + 7*x*x*z + 7*x*y*y" 
 3866         "+ 7*x*y*z + 7*x*z*z;" 
 3867         "-x*x + 2*x*y + 2*x*z + x*x*x - 2*x*x*y - 2*x*x*z - 2*x*y*y" 
 3868         "- 2*x*y*z - 2*x*z*z;" 
 3869         "-x*y + 2*x*x*y + x*y*y;" 
 3870         "-x*z + 2*x*x*z + x*z*z;" 
 3871         "-7*x*y + 3*y*y - 7*y*z + 7*x*x*y + 7*x*y*y + 7*x*y*z - 2*y*y*y" 
 3872         "+ 7*y*y*z + 7*y*z*z;" 
 3873         "-x*y + x*x*y + 2*x*y*y;" 
 3874         "2*x*y - y*y + 2*y*z - 2*x*x*y - 2*x*y*y - 2*x*y*z + y*y*y" 
 3875         "- 2*y*y*z - 2*y*z*z;" 
 3876         "-y*z + 2*y*y*z + y*z*z;" 
 3877         "-7*x*z - 7*y*z + 3*z*z + 7*x*x*z + 7*x*y*z + 7*x*z*z + 7*y*y*z" 
 3878         "+ 7*y*z*z - 2*z*z*z;" 
 3879         "-x*z + x*x*z + 2*x*z*z;" 
 3880         "-y*z + y*y*z + 2*y*z*z;" 
 3881         "2*x*z + 2*y*z - z*z - 2*x*x*z - 2*x*y*z - 2*x*z*z - 2*y*y*z" 
 3882         "- 2*y*z*z + z*z*z;" 
 3884         "27*y*z - 27*x*y*z - 27*y*y*z - 27*y*z*z;" 
 3885         "27*x*z - 27*x*x*z - 27*x*y*z - 27*x*z*z;" 
 3886         "27*x*y - 27*x*x*y - 27*x*y*y - 27*x*y*z;");
 
 3889     for (
unsigned k = 0; k < 5; ++k) {
 
 3890       for (
unsigned i = 0; i < 4; ++i) {
 
 3892         pt[0] = pt[1] = pt[2] = ((k == 4) ? 1.0/3.0 : 0.0);
 
 3893         if (k == 4 && i) pt[i-1] = 0.0;
 
 3894         if (k < 4 && k) pt[k-1] = 1.0;
 
 3901   static pfem Hermite_fem(fem_param_list ¶ms,
 
 3902         std::vector<dal::pstatic_stored_object> &dependencies) {
 
 3903     GMM_ASSERT1(params.size() == 1, 
"Bad number of parameters : " 
 3904                 << params.size() << 
" should be 1.");
 
 3905     GMM_ASSERT1(params[0].type() == 0, 
"Bad type of parameters");
 
 3906     int d = int(::floor(params[0].num() + 0.01));
 
 3909     case 1 : p = std::make_shared<hermite_segment__>(); 
break;
 
 3910     case 2 : p = std::make_shared<hermite_triangle__>(); 
break;
 
 3911     case 3 : p = std::make_shared<hermite_tetrahedron__>(); 
break;
 
 3912     default : GMM_ASSERT1(
false, 
"Sorry, Hermite element in dimension " 
 3913                           << d << 
" not available");
 
 3915     dependencies.push_back(p->ref_convex(0));
 
 3916     dependencies.push_back(p->node_tab(0));
 
 3924   struct argyris_triangle__ : 
public fem<base_poly> {
 
 3925     virtual void mat_trans(base_matrix &M, 
const base_matrix &G,
 
 3927     argyris_triangle__();
 
 3930   void argyris_triangle__::mat_trans(base_matrix &M,
 
 3931                                     const base_matrix &G,
 
 3934     THREAD_SAFE_STATIC bgeot::pgeotrans_precomp pgp;
 
 3935     THREAD_SAFE_STATIC pfem_precomp pfp;
 
 3937     THREAD_SAFE_STATIC base_matrix K(2, 2);
 
 3938     dim_type N = dim_type(G.nrows());
 
 3939     GMM_ASSERT1(N == 2, 
"Sorry, this version of argyris " 
 3940                 "element works only on dimension two.")
 
 3941     if (pgt != pgt_stored) {
 
 3943       pgp = bgeot::geotrans_precomp(pgt, node_tab(0), 0);
 
 3944       pfp = 
fem_precomp(std::make_shared<argyris_triangle__>(), node_tab(0), 0);
 
 3949     for (
unsigned k = 0; k < 3; ++k) {
 
 3950       if (k && !(pgt->is_linear())) 
gmm::mult(G, pgp->grad(6*k), K);
 
 3951       M(1+6*k, 1+6*k) = K(0,0); M(1+6*k, 2+6*k) = K(0,1);
 
 3952       M(2+6*k, 1+6*k) = K(1,0); M(2+6*k, 2+6*k) = K(1,1);
 
 3953       if (!(pgt->is_linear())) {
 
 3954         base_matrix XX[2], H(2,4), B(2,2), X(2,2);
 
 3955         XX[0] = XX[1] = base_matrix(2,2);
 
 3958         for (
unsigned j = 0; j < 2; ++j) {
 
 3959           XX[j](0,0) = B(0, j)*H(0, 0) + B(1, j)*H(1, 0);
 
 3960           XX[j](0,1) = XX[j](1,0) = B(0, j)*H(0, 1) + B(1, j)*H(1, 1);
 
 3961           XX[j](1,1) = B(0, j)*H(0, 3) + B(1, j)*H(1, 3);
 
 3963         for (
unsigned j = 0; j < 2; ++j) {
 
 3964           gmm::copy(gmm::scaled(XX[0], K(j,0)), X);
 
 3965           gmm::add(gmm::scaled(XX[1], K(j,1)), X);
 
 3966           M(1+j+6*k, 3+6*k) = X(0,0); M(1+j+6*k, 4+6*k) = X(1, 0);
 
 3967           M(1+j+6*k, 5+6*k) = X(1, 1);
 
 3970       scalar_type a = K(0,0), b = K(0,1), c = K(1,0), d = K(1,1);
 
 3971       M(3+6*k, 3+6*k) = a*a;     M(3+6*k, 4+6*k) = a*b;       M(3+6*k, 5+6*k) = b*b;
 
 3972       M(4+6*k, 3+6*k) = 2.0*a*c; M(4+6*k, 4+6*k) = b*c + a*d; M(4+6*k, 5+6*k) = 2.0*b*d;
 
 3973       M(5+6*k, 3+6*k) = c*c;     M(5+6*k, 4+6*k) = c*d;       M(5+6*k, 5+6*k) = d*d;
 
 3976     THREAD_SAFE_STATIC base_matrix W(3, 21);
 
 3977     base_small_vector norient(M_PI, M_PI * M_PI);
 
 3979     for (
unsigned i = 18; i < 21; ++i) {
 
 3980       if (!(pgt->is_linear()))
 
 3983       gmm::mult(gmm::transposed(K), cvr->normals()[i-18], n);
 
 3987       if (ps < 0) n *= scalar_type(-1);
 
 3988       if (gmm::abs(ps) < 1E-8)
 
 3989         GMM_WARNING2(
"Argyris : The normal orientation may be incorrect");
 
 3991       const bgeot::base_tensor &t = pfp->grad(i);
 
 3992       for (
unsigned j = 0; j < 21; ++j)
 
 3993         W(i-18, j) = t(j, 0, 0) * v[0] + t(j, 0, 1) * v[1];
 
 3995     THREAD_SAFE_STATIC base_matrix A(3,3);
 
 3996     THREAD_SAFE_STATIC bgeot::base_vector w(3);
 
 3997     THREAD_SAFE_STATIC bgeot::base_vector coeff(3);
 
 3998     THREAD_SAFE_STATIC gmm::sub_interval SUBI(18, 3);
 
 3999     THREAD_SAFE_STATIC gmm::sub_interval SUBJ(0, 3);
 
 4000     gmm::copy(gmm::sub_matrix(W, SUBJ, SUBI), A);
 
 4002     gmm::copy(gmm::transposed(A), gmm::sub_matrix(M, SUBI));
 
 4004     for (
unsigned j = 0; j < 18; ++j) {
 
 4006       gmm::mult(A, gmm::scaled(w, -1.0), coeff);
 
 4007       gmm::copy(coeff, gmm::sub_vector(gmm::mat_row(M, j), SUBI));
 
 4011   argyris_triangle__::argyris_triangle__() {
 
 4013     dim_ = cvr->structure()->dim();
 
 4018     is_standard_fem = is_equiv = 
false;
 
 4022       (
"1 - 10*x^3 - 10*y^3 + 15*x^4 - 30*x*x*y*y" 
 4023        "+ 15*y*y*y*y - 6*x^5 + 30*x*x*x*y*y + 30*x*x*y*y*y - 6*y^5;" 
 4024        "x - 6*x*x*x - 11*x*y*y + 8*x*x*x*x + 10*x*x*y*y" 
 4025        "+ 18*x*y*y*y - 3*x*x*x*x*x + x*x*x*y*y - 10*x*x*y*y*y - 8*x*y*y*y*y;" 
 4026        "y - 11*x*x*y - 6*y*y*y + 18*x*x*x*y + 10*x*x*y*y" 
 4027        "+ 8*y*y*y*y - 8*x*x*x*x*y - 10*x*x*x*y*y + x*x*y*y*y - 3*y*y*y*y*y;" 
 4028        "0.5*x*x - 1.5*x*x*x + 1.5*x*x*x*x - 1.5*x*x*y*y" 
 4029        "- 0.5*x*x*x*x*x + 1.5*x*x*x*y*y + x*x*y*y*y;" 
 4030        "x*y - 4*x*x*y - 4*x*y*y + 5*x*x*x*y + 10*x*x*y*y" 
 4031        "+ 5*x*y*y*y - 2*x*x*x*x*y - 6*x*x*x*y*y - 6*x*x*y*y*y - 2*x*y*y*y*y;" 
 4032        "0.5*y*y - 1.5*y*y*y - 1.5*x*x*y*y + 1.5*y*y*y*y + x*x*x*y*y" 
 4033        "+ 1.5*x*x*y*y*y - 0.5*y*y*y*y*y;" 
 4034        "10*x^3 - 15*x^4 + 15*x*x*y*y + 6*x^5 - 15*x*x*x*y*y - 15*x*x*y*y*y;" 
 4035        "-4*x*x*x + 7*x*x*x*x - 3.5*x*x*y*y - 3*x*x*x*x*x + 3.5*x*x*x*y*y" 
 4037        "-5*x*x*y + 14*x*x*x*y + 18.5*x*x*y*y - 8*x*x*x*x*y" 
 4038        "- 18.5*x*x*x*y*y - 13.5*x*x*y*y*y;" 
 4039        "0.5*x*x*x - x*x*x*x + 0.25*x*x*y*y + 0.5*x*x*x*x*x" 
 4040        "- 0.25*x*x*x*y*y - 0.25*x*x*y*y*y;" 
 4041        "x*x*y - 3*x*x*x*y - 3.5*x*x*y*y + 2*x*x*x*x*y + 3.5*x*x*x*y*y" 
 4043        "1.25*x*x*y*y - 0.75*x*x*x*y*y - 1.25*x*x*y*y*y;" 
 4044        "10*y*y*y + 15*x*x*y*y - 15*y^4 - 15*x*x*x*y*y - 15*x*x*y*y*y + 6*y^5;" 
 4045        "-5*x*y*y + 18.5*x*x*y*y + 14*x*y*y*y - 13.5*x*x*x*y*y" 
 4046        "- 18.5*x*x*y*y*y - 8*x*y*y*y*y;" 
 4047        "-4*y*y*y - 3.5*x*x*y*y + 7*y*y*y*y + 3.5*x*x*x*y*y" 
 4048        "+ 3.5*x*x*y*y*y - 3*y*y*y*y*y;" 
 4049        "1.25*x*x*y*y - 1.25*x*x*x*y*y - 0.75*x*x*y*y*y;" 
 4050        "x*y*y - 3.5*x*x*y*y - 3*x*y*y*y + 2.5*x*x*x*y*y + 3.5*x*x*y*y*y" 
 4052        "0.5*y*y*y + 0.25*x*x*y*y - y*y*y*y - 0.25*x*x*x*y*y" 
 4053        "- 0.25*x*x*y*y*y + 0.5*y*y*y*y*y;" 
 4054        "sqrt(2) * (-8*x*x*y*y + 8*x*x*x*y*y + 8*x*x*y*y*y);" 
 4055        "-16*x*y*y + 32*x*x*y*y + 32*x*y*y*y - 16*x*x*x*y*y" 
 4056        "- 32*x*x*y*y*y - 16*x*y*y*y*y;" 
 4057        "-16*x*x*y + 32*x*x*x*y + 32*x*x*y*y - 16*x*x*x*x*y" 
 4058        "- 32*x*x*x*y*y - 16*x*x*y*y*y;");
 
 4061     for (
unsigned k = 0; k < 7; ++k) {
 
 4062       for (
unsigned i = 0; i < 3; ++i) {
 
 4065           pt[0] = pt[1] = 0.5; 
if (i) pt[i-1] = 0.0;
 
 4069           pt[0] = pt[1] = 0.0; 
if (k/2) pt[k/2-1] = 1.0;
 
 4072                                            dim_type((i == 2) ? 1:0)), pt);
 
 4082   static pfem triangle_Argyris_fem(fem_param_list ¶ms,
 
 4083         std::vector<dal::pstatic_stored_object> &dependencies) {
 
 4084     GMM_ASSERT1(params.size() == 0, 
"Bad number of parameters");
 
 4085     pfem p = std::make_shared<argyris_triangle__>();
 
 4086     dependencies.push_back(p->ref_convex(0));
 
 4087     dependencies.push_back(p->node_tab(0));
 
 4095   struct morley_element__ : 
public fem<base_poly> {
 
 4096     virtual void mat_trans(base_matrix &M, 
const base_matrix &G,
 
 4098     morley_element__(dim_type);
 
 4101   void morley_element__::mat_trans(base_matrix &M,
 
 4102                                     const base_matrix &G,
 
 4105     THREAD_SAFE_STATIC bgeot::pgeotrans_precomp pgp;
 
 4106     THREAD_SAFE_STATIC pfem_precomp pfp;
 
 4109     dim_type N = dim_type(G.nrows());
 
 4111     GMM_ASSERT1(N == n, 
"Sorry, this version of morley " 
 4112                 "element works only for indentical dimensions.")
 
 4114     if (pgt != pgt_stored) {
 
 4116       pgp = bgeot::geotrans_precomp(pgt, node_tab(0), 0);
 
 4117       pfp = 
fem_precomp(std::make_shared<morley_element__>(n), node_tab(0), 0);
 
 4121     THREAD_SAFE_STATIC base_matrix W(n+1, nddl);
 
 4122     dim_type nfd = (n == 2) ? 3 : 6;
 
 4124     base_matrix K(n, n);
 
 4125     base_small_vector norient(n);
 
 4127     for (dim_type i = 1; i < n; ++i)
 
 4128       norient[i] = M_PI * norient[i-1];
 
 4129     if (pgt->is_linear())
 
 4131     for (
unsigned i = nfd; i < nddl; ++i) {
 
 4132       if (!(pgt->is_linear()))
 
 4135       gmm::mult(gmm::transposed(K), cvr->normals()[i-nfd], nn);
 
 4139       if (ps < 0) nn *= scalar_type(-1);
 
 4140       if (gmm::abs(ps) < 1E-8)
 
 4141         GMM_WARNING2(
"Morley : The normal orientation may be incorrect");
 
 4143       const bgeot::base_tensor &t = pfp->grad(i);
 
 4144       for (
unsigned j = 0; j < nddl; ++j)
 
 4146           W(i-nfd, j) = t(j, 0, 0) * v[0] + t(j, 0, 1) * v[1];
 
 4148           W(i-nfd, j) = t(j, 0, 0) * v[0] + t(j, 0, 1) * v[1] + t(j, 0, 2)*v[2];
 
 4151     base_matrix A(n+1, n+1);
 
 4153     base_vector coeff(n+1);
 
 4154     gmm::sub_interval SUBI(nfd, n+1);
 
 4155     gmm::sub_interval SUBJ(0, n+1);
 
 4156     gmm::copy(gmm::sub_matrix(W, SUBJ, SUBI), A);
 
 4158     gmm::copy(gmm::transposed(A), gmm::sub_matrix(M, SUBI));
 
 4160     for (
unsigned j = 0; j < nfd; ++j) {
 
 4162       gmm::mult(A, gmm::scaled(w, -1.0), coeff);
 
 4163       gmm::copy(coeff, gmm::sub_vector(gmm::mat_row(M, j), SUBI));
 
 4167   morley_element__::morley_element__(dim_type n) {
 
 4169     dim_ = cvr->structure()->dim();
 
 4173     is_standard_fem = is_lag = is_equiv = 
false;
 
 4178       std::stringstream s(
"1 - x - y + 2*x*y;  (x + y + x^2 - 2*x*y - y^2)/2;" 
 4179                           "(x + y - x^2 - 2*x*y + y^2)/2;" 
 4180                           "((x+y)^2 - x - y)*sqrt(2)/2;  x*(x-1);  y*(y-1);");
 
 4182       for (
unsigned k = 0; k < 6; ++k)
 
 4195         (
"5/3 - 16/9*x - 28/9*y - 28/9*z + 8/9*x^2 + 8/3*x*y + 8/3*x*z" 
 4196          " - 4/9*y^2 + 20/3*y*z - 4/9*z^2;" 
 4197          "5/3 - 28/9*x - 16/9*y - 28/9*z - 4/9*x^2 + 8/3*x*y + 20/3*x*z" 
 4198          " + 8/9*y^2 + 8/3*y*z - 4/9*z^2;" 
 4199          "5/3 - 28/9*x - 28/9*y - 16/9*z - 4/9*x^2 + 20/3*x*y + 8/3*x*z" 
 4200          " - 4/9*y^2 + 8/3*y*z + 8/9*z^2;" 
 4201          "-4/3 + 20/9*x + 20/9*y + 32/9*z + 8/9*x^2 - 4/3*x*y - 16/3*x*z" 
 4202          " + 8/9*y^2 - 16/3*y*z - 16/9*z^2;" 
 4203          "-4/3 + 20/9*x + 32/9*y + 20/9*z + 8/9*x^2 - 16/3*x*y - 4/3*x*z" 
 4204          " - 16/9*y^2 - 16/3*y*z + 8/9*z^2;" 
 4205          "-4/3 + 32/9*x + 20/9*y + 20/9*z - 16/9*x^2 - 16/3*x*y - 16/3*x*z" 
 4206          " + 8/9*y^2 - 4/3*y*z + 8/9*z^2;" 
 4207          "sqrt(3)*(3/8 - x - y - z + 1/2*x^2 + 3/2*x*y + 3/2*x*z + 1/2*y^2" 
 4208          " + 3/2*y*z + 1/2*z^2);" 
 4209          "-1/8 - 2/3*x + 1/3*y + 1/3*z + 11/6*x^2 - 1/2*x*y - 1/2*x*z" 
 4210          " - 1/6*y^2 - 1/2*y*z - 1/6*z^2;" 
 4211          "-1/8 + 1/3*x - 2/3*y + 1/3*z - 1/6*x^2 - 1/2*x*y - 1/2*x*z" 
 4212          " + 11/6*y^2 - 1/2*y*z - 1/6*z^2;" 
 4213          "-1/8 + 1/3*x + 1/3*y - 2/3*z - 1/6*x^2 - 1/2*x*y - 1/2*x*z" 
 4214          " - 1/6*y^2 - 1/2*y*z + 11/6*z^2;");
 
 4216       for (
unsigned k = 0; k < 10; ++k)
 
 4232   static pfem element_Morley_fem(fem_param_list ¶ms,
 
 4233         std::vector<dal::pstatic_stored_object> &dependencies) {
 
 4234     GMM_ASSERT1(params.size() == 1, 
"Bad number of parameters");
 
 4235     int n = dim_type(::floor(params[0].num() + 0.01));
 
 4236     GMM_ASSERT1(n > 0 && n < 4, 
"Bad parameters");
 
 4237     pfem p = std::make_shared<morley_element__>(dim_type(n));
 
 4238     dependencies.push_back(p->ref_convex(0));
 
 4239     dependencies.push_back(p->node_tab(0));
 
 4247   struct PK_discont_ : 
public PK_fem_ {
 
 4250     PK_discont_(dim_type nc, 
short_type k, scalar_type alpha=scalar_type(0))
 
 4253       std::fill(dof_types_.begin(),
 
 4254                 dof_types_.end(), lagrange_nonconforming_dof(nc));
 
 4256       if (alpha != scalar_type(0)) {
 
 4258           gmm::mean_value(cv_node.points().begin(), cv_node.points().end());
 
 4259         for (
size_type i=0; i < cv_node.nb_points(); ++i)
 
 4260           cv_node.points()[i] = (1-
alpha)*cv_node.points()[i] + 
alpha*G;
 
 4264           S[1] = 1. / (1-
alpha);
 
 4272   static pfem PK_discontinuous_fem(fem_param_list ¶ms,
 
 4273         std::vector<dal::pstatic_stored_object> &dependencies) {
 
 4274     GMM_ASSERT1(params.size() == 2 || params.size() == 3,
 
 4275                 "Bad number of parameters : " 
 4276                 << params.size() << 
" should be 2 or 3.");
 
 4277     GMM_ASSERT1(params[0].type() == 0 && params[1].type() == 0 &&
 
 4278                 (params.size() != 3 || params[2].type() == 0),
 
 4279                 "Bad type of parameters");
 
 4280     int n = int(::floor(params[0].num() + 0.01));
 
 4281     int k = int(::floor(params[1].num() + 0.01));
 
 4282     scalar_type 
alpha = 0.;
 
 4283     if (params.size() == 3) 
alpha = params[2].num();
 
 4284     GMM_ASSERT1(n > 0 && n < 100 && k >= 0 && k <= 150 && alpha >= 0 &&
 
 4285                 alpha < 1 && 
double(n) == params[0].num()
 
 4286                 && 
double(k) == params[1].num(), 
"Bad parameters");
 
 4287     pfem p = std::make_shared<PK_discont_>(dim_type(n), 
short_type(k), alpha);
 
 4288     dependencies.push_back(p->ref_convex(0));
 
 4289     dependencies.push_back(p->node_tab(0));
 
 4297   struct PK_conn_int_ : 
public PK_fem_ {
 
 4302       scalar_type 
alpha = 0.1;
 
 4304       std::fill(dof_types_.begin(), dof_types_.end(), 
lagrange_dof(nc));
 
 4305       if (alpha != scalar_type(0)) {
 
 4307           gmm::mean_value(cv_node.points().begin(), cv_node.points().end());
 
 4308         for (
size_type i=0; i < cv_node.nb_points(); ++i)
 
 4309           cv_node.points()[i] = (1-
alpha)*cv_node.points()[i] + 
alpha*G;
 
 4313           S[1] = 1. / (1-
alpha);
 
 4321   static pfem conn_int_PK_fem(fem_param_list ¶ms,
 
 4322         std::vector<dal::pstatic_stored_object> &dependencies) {
 
 4323     GMM_ASSERT1(params.size() == 2, 
"Bad number of parameters : " 
 4324                 << params.size() << 
" should be 2.");
 
 4325     GMM_ASSERT1(params[0].type() == 0 && params[1].type() == 0,
 
 4326                 "Bad type of parameters");
 
 4327     int n = int(::floor(params[0].num() + 0.01));
 
 4328     int k = int(::floor(params[1].num() + 0.01));
 
 4329     GMM_ASSERT1(n > 0 && n < 100 && k >= 0 && k <= 150
 
 4330                 && 
double(n) == params[0].num()
 
 4331                 && 
double(k) == params[1].num(), 
"Bad parameters");
 
 4332     pfem p = std::make_shared<PK_conn_int_>(dim_type(n), 
short_type(k));
 
 4333     dependencies.push_back(p->ref_convex(0));
 
 4334     dependencies.push_back(p->node_tab(0));
 
 4345   struct PK_int_ : 
public PK_fem_ {
 
 4348     PK_int_(dim_type nc, 
short_type k, bgeot::pconvex_ref cvr_)
 
 4352       scalar_type 
alpha = 0.1;
 
 4353       std::fill(dof_types_.begin(),
 
 4354                   dof_types_.end(), lagrange_nonconforming_dof(nc));
 
 4356       if (alpha != scalar_type(0)) {
 
 4358           gmm::mean_value(cv_node.points().begin(), cv_node.points().end());
 
 4359         for (
size_type i=0; i < cv_node.nb_points(); ++i)
 
 4360           cv_node.points()[i] = (1-
alpha)*cv_node.points()[i] + 
alpha*G;
 
 4364           S[1] = 1. / (1-
alpha);
 
 4372   static pfem simplex_IPK_fem(fem_param_list ¶ms,
 
 4373         std::vector<dal::pstatic_stored_object> &dependencies) {
 
 4374     GMM_ASSERT1(params.size() == 2, 
"Bad number of parameters : " 
 4375                 << params.size() << 
" should be 2.");
 
 4376     GMM_ASSERT1(params[0].type() == 0 && params[1].type() == 0,
 
 4377                 "Bad type of parameters");
 
 4378     int n = int(::floor(params[0].num() + 0.01));
 
 4379     int k = int(::floor(params[1].num() + 0.01));
 
 4380     GMM_ASSERT1(n > 0 && n < 100 && k >= 0 && k <= 150
 
 4381                 && 
double(n) == params[0].num()
 
 4382                 && 
double(k) == params[1].num(), 
"Bad parameters");
 
 4385     dependencies.push_back(p->ref_convex(0));
 
 4386     dependencies.push_back(p->node_tab(0));
 
 4390   static pfem parallelepiped_IPK_fem(fem_param_list ¶ms,
 
 4391         std::vector<dal::pstatic_stored_object> &dependencies) {
 
 4392     GMM_ASSERT1(params.size() == 2, 
"Bad number of parameters : " 
 4393                 << params.size() << 
" should be 2.");
 
 4394     GMM_ASSERT1(params[0].type() == 0 && params[1].type() == 0,
 
 4395                 "Bad type of parameters");
 
 4396     int n = int(::floor(params[0].num() + 0.01));
 
 4397     int k = int(::floor(params[1].num() + 0.01));
 
 4398     GMM_ASSERT1(n > 0 && n < 100 && k >= 0 && k <= 150
 
 4399                 && 
double(n) == params[0].num()
 
 4400                 && 
double(k) == params[1].num(), 
"Bad parameters");
 
 4403     dependencies.push_back(p->ref_convex(0));
 
 4404     dependencies.push_back(p->node_tab(0));
 
 4408   static pfem prism_IPK_fem(fem_param_list ¶ms,
 
 4409         std::vector<dal::pstatic_stored_object> &dependencies) {
 
 4410     GMM_ASSERT1(params.size() == 2, 
"Bad number of parameters : " 
 4411                 << params.size() << 
" should be 2.");
 
 4412     GMM_ASSERT1(params[0].type() == 0 && params[1].type() == 0,
 
 4413                 "Bad type of parameters");
 
 4414     int n = int(::floor(params[0].num() + 0.01));
 
 4415     int k = int(::floor(params[1].num() + 0.01));
 
 4416     GMM_ASSERT1(n > 0 && n < 100 && k >= 0 && k <= 150
 
 4417                 && 
double(n) == params[0].num()
 
 4418                 && 
double(k) == params[1].num(), 
"Bad parameters");
 
 4421     dependencies.push_back(p->ref_convex(0));
 
 4422     dependencies.push_back(p->node_tab(0));
 
 4431   struct PK_with_cubic_bubble_ : 
public PK_fem_ {
 
 4432     PK_with_cubic_bubble_(dim_type nc, 
short_type k);
 
 4435   PK_with_cubic_bubble_::PK_with_cubic_bubble_(dim_type nc, 
short_type k)
 
 4437     unfreeze_cvs_node();
 
 4438     is_lag = 
false; es_degree = 
short_type(nc+1);
 
 4449     base_[j] = base_poly(nc, 0);
 
 4451     for (
size_type i = 0; i < P1.nb_dof(0); i++) base_[j] *= P1.base()[i];
 
 4454   static pfem PK_with_cubic_bubble(fem_param_list ¶ms,
 
 4455         std::vector<dal::pstatic_stored_object> &dependencies) {
 
 4456     GMM_ASSERT1(params.size() == 2, 
"Bad number of parameters : " 
 4457                 << params.size() << 
" should be 2.");
 
 4458     GMM_ASSERT1(params[0].type() == 0 && params[1].type() == 0,
 
 4459                 "Bad type of parameters");
 
 4460     int n = int(::floor(params[0].num() + 0.01));
 
 4461     int k = int(::floor(params[1].num() + 0.01));
 
 4462     GMM_ASSERT1(k < n+1, 
"dimensions mismatch");
 
 4463     GMM_ASSERT1(n > 0 && n < 100 && k >= 0 && k <= 150 &&
 
 4464                 double(n) == params[0].num() && 
double(k) == params[1].num(),
 
 4466     pfem p = std::make_shared<PK_with_cubic_bubble_>(dim_type(n),
 
 4468     dependencies.push_back(p->ref_convex(0));
 
 4469     dependencies.push_back(p->node_tab(0));
 
 4479                              bool discont=
false, scalar_type alpha=0) {
 
 4482     THREAD_SAFE_STATIC 
pfem fem_last = 
nullptr;
 
 4483     THREAD_SAFE_STATIC 
bool complete_last = 0;
 
 4484     THREAD_SAFE_STATIC 
bool discont_last = 0;
 
 4485     THREAD_SAFE_STATIC scalar_type alpha_last = 0;
 
 4488     if (pgt_last == pgt && k_last == k && complete_last == complete &&
 
 4489         discont_last == discont && alpha_last == alpha)
 
 4492     dim_type n = pgt->structure()->dim();
 
 4493     dim_type nbp = dim_type(pgt->basic_structure()->nb_points());
 
 4494     std::stringstream name;
 
 4495     std::string suffix(discont ? 
"_DISCONTINUOUS" : 
"");
 
 4496     GMM_ASSERT2(discont || alpha == scalar_type(0),
 
 4497                 "Cannot use an alpha parameter in continuous elements.");
 
 4498     std::stringstream arg_;
 
 4499     if (discont && alpha != scalar_type(0))
 
 4500       arg_ << 
"," << 
alpha;
 
 4501     std::string arg(arg_.str());
 
 4504     if (bgeot::is_torus_geom_trans(pgt) && n == 3) n = 2;
 
 4509         name << 
"FEM_PK" << suffix << 
"(" << n << 
"," << k << arg << 
")";
 
 4514     if (!found && nbp == (
size_type(1) << n))
 
 4516         if (!complete && k == 2 && (n == 2 || n == 3) &&
 
 4518           GMM_ASSERT2(alpha == scalar_type(0),
 
 4519                       "Cannot use an alpha parameter in incomplete Q2" 
 4521           name << 
"FEM_Q2_INCOMPLETE" << suffix << 
"(" << n << 
")";
 
 4523           name << 
"FEM_QK" << suffix << 
"(" << n << 
"," << k << arg << 
")";
 
 4528     if (!found && nbp == 2 * n)
 
 4530         if (!complete && k == 2 && n == 3 &&
 
 4532           GMM_ASSERT2(alpha == scalar_type(0),
 
 4533                       "Cannot use an alpha parameter in incomplete prism" 
 4535           name << 
"FEM_PRISM_INCOMPLETE_P2" << suffix;
 
 4537           name << 
"FEM_PRISM_PK" << suffix << 
"(" << n << 
"," << k << arg << 
")";
 
 4542     if (!found && nbp == 5)
 
 4544         if (!complete && k == 2 &&
 
 4546           GMM_ASSERT2(alpha == scalar_type(0),
 
 4547                       "Cannot use an alpha parameter in incomplete pyramid" 
 4549           name << 
"FEM_PYRAMID_Q2_INCOMPLETE" << suffix;
 
 4551           name << 
"FEM_PYRAMID_QK" << suffix << 
"(" << k << arg << 
")";
 
 4557     GMM_ASSERT1(found, 
"This element is not taken into account. Contact us");
 
 4561     complete_last = complete;
 
 4562     discont_last = discont;
 
 4569     return classical_fem_(pgt, k, complete);
 
 4573                                    scalar_type alpha, 
bool complete) {
 
 4574     return classical_fem_(pgt, k, complete, 
true, alpha);
 
 4581   pfem structured_composite_fem_method(fem_param_list ¶ms,
 
 4582         std::vector<dal::pstatic_stored_object> &dependencies);
 
 4583   pfem PK_composite_hierarch_fem(fem_param_list ¶ms,
 
 4584         std::vector<dal::pstatic_stored_object> &dependencies);
 
 4585   pfem PK_composite_full_hierarch_fem(fem_param_list ¶ms,
 
 4586         std::vector<dal::pstatic_stored_object> &dependencies);
 
 4587   pfem HCT_triangle_fem(fem_param_list ¶ms,
 
 4588         std::vector<dal::pstatic_stored_object> &dependencies);
 
 4589   pfem reduced_HCT_triangle_fem(fem_param_list ¶ms,
 
 4590         std::vector<dal::pstatic_stored_object> &dependencies);
 
 4591   pfem reduced_quadc1p3_fem(fem_param_list ¶ms,
 
 4592         std::vector<dal::pstatic_stored_object> &dependencies);
 
 4593   pfem quadc1p3_fem(fem_param_list ¶ms,
 
 4594         std::vector<dal::pstatic_stored_object> &dependencies);
 
 4595   pfem P1bubbletriangle_fem(fem_param_list ¶ms,
 
 4596         std::vector<dal::pstatic_stored_object> &dependencies);
 
 4597   pfem hho_method(fem_param_list ¶ms,
 
 4598         std::vector<dal::pstatic_stored_object> &dependencies);
 
 4601     fem_naming_system() : 
dal::naming_system<virtual_fem>(
"FEM") {
 
 4602       add_suffix(
"HERMITE", Hermite_fem);
 
 4603       add_suffix(
"ARGYRIS", triangle_Argyris_fem);
 
 4604       add_suffix(
"MORLEY", element_Morley_fem);
 
 4605       add_suffix(
"PK", PK_fem);
 
 4606       add_suffix(
"QK", QK_fem);
 
 4607       add_suffix(
"QK_DISCONTINUOUS", QK_discontinuous_fem);
 
 4608       add_suffix(
"PRISM_PK", prism_PK_fem);
 
 4609       add_suffix(
"PK_PRISM", prism_PK_fem); 
 
 4610       add_suffix(
"PK_DISCONTINUOUS", PK_discontinuous_fem);
 
 4611       add_suffix(
"PRISM_PK_DISCONTINUOUS", prism_PK_discontinuous_fem);
 
 4612       add_suffix(
"PK_PRISM_DISCONTINUOUS", prism_PK_discontinuous_fem); 
 
 4613       add_suffix(
"SIMPLEX_IPK", simplex_IPK_fem);
 
 4614       add_suffix(
"PRISM_IPK", prism_IPK_fem);
 
 4615       add_suffix(
"QUAD_IPK", parallelepiped_IPK_fem);
 
 4616       add_suffix(
"SIMPLEX_CIPK", conn_int_PK_fem);
 
 4617       add_suffix(
"PK_WITH_CUBIC_BUBBLE", PK_with_cubic_bubble);
 
 4618       add_suffix(
"PRODUCT", product_fem);
 
 4619       add_suffix(
"P1_NONCONFORMING", P1_nonconforming_fem);
 
 4620       add_suffix(
"P1_BUBBLE_FACE", P1_with_bubble_on_a_face);
 
 4621       add_suffix(
"P1_BUBBLE_FACE_LAG", P1_with_bubble_on_a_face_lagrange);
 
 4622       add_suffix(
"P1_PIECEWISE_LINEAR_BUBBLE", P1bubbletriangle_fem);
 
 4623       add_suffix(
"GEN_HIERARCHICAL", gen_hierarchical_fem);
 
 4624       add_suffix(
"PK_HIERARCHICAL", PK_hierarch_fem);
 
 4625       add_suffix(
"QK_HIERARCHICAL", QK_hierarch_fem);
 
 4626       add_suffix(
"PRISM_PK_HIERARCHICAL", prism_PK_hierarch_fem);
 
 4627       add_suffix(
"PK_PRISM_HIERARCHICAL", prism_PK_hierarch_fem); 
 
 4628       add_suffix(
"STRUCTURED_COMPOSITE", structured_composite_fem_method);
 
 4629       add_suffix(
"PK_HIERARCHICAL_COMPOSITE", PK_composite_hierarch_fem);
 
 4630       add_suffix(
"PK_FULL_HIERARCHICAL_COMPOSITE",
 
 4631                  PK_composite_full_hierarch_fem);
 
 4632       add_suffix(
"PK_GAUSSLOBATTO1D", PK_GL_fem);
 
 4633       add_suffix(
"QUAD_CIPK", CIPK_SQUARE);
 
 4634       add_suffix(
"Q2_INCOMPLETE", Q2_incomplete_fem);
 
 4635       add_suffix(
"Q2_INCOMPLETE_DISCONTINUOUS", Q2_incomplete_discontinuous_fem);
 
 4636       add_suffix(
"HCT_TRIANGLE", HCT_triangle_fem);
 
 4637       add_suffix(
"REDUCED_HCT_TRIANGLE", reduced_HCT_triangle_fem);
 
 4638       add_suffix(
"QUADC1_COMPOSITE", quadc1p3_fem);
 
 4639       add_suffix(
"REDUCED_QUADC1_COMPOSITE", reduced_quadc1p3_fem);
 
 4640       add_suffix(
"HHO", hho_method);
 
 4641       add_suffix(
"RT0", P1_RT0);
 
 4642       add_suffix(
"RTK", RTk);
 
 4643       add_suffix(
"BDMK", BDMk);
 
 4644       add_suffix(
"RT0Q", P1_RT0Q);
 
 4645       add_suffix(
"NEDELEC", P1_nedelec);
 
 4646       add_suffix(
"PYRAMID_QK", pyramid_QK_fem);
 
 4647       add_suffix(
"PYRAMID_QK_DISCONTINUOUS", pyramid_QK_disc_fem);
 
 4648       add_suffix(
"PYRAMID_LAGRANGE", pyramid_QK_fem); 
 
 4649       add_suffix(
"PYRAMID_DISCONTINUOUS_LAGRANGE", pyramid_QK_disc_fem); 
 
 4650       add_suffix(
"PYRAMID_Q2_INCOMPLETE", pyramid_Q2_incomplete_fem);
 
 4651       add_suffix(
"PYRAMID_Q2_INCOMPLETE_DISCONTINUOUS",
 
 4652                  pyramid_Q2_incomplete_disc_fem);
 
 4653       add_suffix(
"PRISM_INCOMPLETE_P2", prism_incomplete_P2_fem);
 
 4654       add_suffix(
"PRISM_INCOMPLETE_P2_DISCONTINUOUS",
 
 4655                  prism_incomplete_P2_disc_fem);
 
 4672     auto *p_torus = 
dynamic_cast<const torus_fem *
>(p.get());
 
 4673     if (p_torus) 
return instance.shorter_name_of_method(p_torus->get_original_pfem());
 
 4674     return instance.shorter_name_of_method(p);
 
 4677       shorter_name_of_method(p);
 
 4681   void add_fem_name(std::string name,
 
 4691     THREAD_SAFE_STATIC 
pfem pf = 
nullptr;
 
 4694     if (d != n || r != k) {
 
 4695       std::stringstream name;
 
 4696       name << 
"FEM_PK(" << n << 
"," << k << 
")";
 
 4704     THREAD_SAFE_STATIC 
pfem pf = 
nullptr;
 
 4707     if (d != n || r != k) {
 
 4708       std::stringstream name;
 
 4709       name << 
"FEM_QK(" << n << 
"," << k << 
")";
 
 4717     THREAD_SAFE_STATIC 
pfem pf = 
nullptr;
 
 4720     if (d != n || r != k) {
 
 4721       std::stringstream name;
 
 4722       name << 
"FEM_PRISM_PK(" << n << 
"," << k << 
")";
 
 4734   DAL_DOUBLE_KEY(pre_fem_key_, 
pfem, bgeot::pstored_point_tab);
 
 4736   fem_precomp_::fem_precomp_(
const pfem pff, 
const bgeot::pstored_point_tab ps) :
 
 4738     DAL_STORED_OBJECT_DEBUG_CREATED(
this, 
"Fem_precomp");
 
 4739     for (
const auto &p : *pspt)
 
 4740       GMM_ASSERT1(p.size() == pf->dim(), 
"dimensions mismatch");
 
 4743   void fem_precomp_::init_val()
 const {
 
 4744     c.resize(pspt->size());
 
 4745     for (
size_type i = 0; i < pspt->size(); ++i)
 
 4746       pf->base_value((*pspt)[i], c[i]);
 
 4749   void fem_precomp_::init_grad()
 const {
 
 4750     pc.resize(pspt->size());
 
 4751     for (
size_type i = 0; i < pspt->size(); ++i)
 
 4752       pf->grad_base_value((*pspt)[i], pc[i]);
 
 4755   void fem_precomp_::init_hess()
 const {
 
 4756     hpc.resize(pspt->size());
 
 4757     for (
size_type i = 0; i < pspt->size(); ++i)
 
 4758       pf->hess_base_value((*pspt)[i], hpc[i]);
 
 4762                            dal::pstatic_stored_object dep) {
 
 4763     dal::pstatic_stored_object_key pk = std::make_shared<pre_fem_key_>(pf,pspt);
 
 4765     if (o) 
return std::dynamic_pointer_cast<const fem_precomp_>(o);
 
 4766     pfem_precomp p = std::make_shared<fem_precomp_>(pf, pspt);
 
 4773   void fem_precomp_pool::clear() {
 
 4774     for (
const pfem_precomp &p : precomps)
 
const base_matrix & K() const
See getfem kernel doc for these matrices.
 
const base_matrix & G() const
matrix whose columns are the vertices of the convex
 
size_type ii_
if pgp != 0, it is the same as pgp's one
 
const base_node & xref() const
coordinates of the current point, in the reference convex.
 
Vector of integer (16 bits type) which represent the powers of a monomial.
 
Associate a name to a method descriptor and store method descriptors.
 
static T & instance()
Instance from the current thread.
 
structure passed as the argument of fem interpolation functions.
 
Torus fem, the real grad base value is modified to compute radial grad of F/R.
 
Base class for finite element description.
 
A simple singleton implementation.
 
a balanced tree stored in a dal::dynamic_array
 
Miscelleanous assembly routines for common terms. Use the low-level generic assembly....
 
Definition of the finite element methods.
 
Integration methods (exact and approximated) on convexes.
 
Tools for multithreaded, OpenMP and Boost based parallelization.
 
Provides mesh and mesh fem of torus.
 
Miscelleanous algorithms on containers.
 
void copy(const L1 &l1, L2 &l2)
*/
 
number_traits< typename linalg_traits< V >::value_type >::magnitude_type vect_norm2(const V &v)
Euclidean norm of a vector.
 
void fill(L &l, typename gmm::linalg_traits< L >::value_type x)
*/
 
number_traits< typename linalg_traits< M >::value_type >::magnitude_type mat_euclidean_norm(const M &m)
Euclidean norm of a matrix.
 
void resize(V &v, size_type n)
*/
 
void clean(L &l, double threshold)
Clean a vector or matrix (replace near-zero entries with zeroes).
 
void mult(const L1 &l1, const L2 &l2, L3 &l3)
*/
 
strongest_value_type< V1, V2 >::value_type vect_sp(const V1 &v1, const V2 &v2)
*/
 
void add(const L1 &l1, L2 &l2)
*/
 
void lu_inverse(const DenseMatrixLU &LU, const Pvector &pvector, const DenseMatrix &AInv_)
Given an LU factored matrix, build the inverse of the matrix.
 
pdof_description derivative_dof(dim_type d, dim_type r)
Description of a unique dof of derivative type.
 
int dof_description_compare(pdof_description a, pdof_description b)
Gives a total order on the dof description compatible with the identification.
 
pdof_description second_derivative_dof(dim_type d, dim_type num_der1, dim_type num_der2)
Description of a unique dof of second derivative type.
 
pdof_description mean_value_dof(dim_type d)
Description of a unique dof of mean value type.
 
bool dof_linkable(pdof_description)
Says if the dof is linkable.
 
bool dof_compatibility(pdof_description, pdof_description)
Says if the two dofs can be identified.
 
pdof_description xfem_dof(pdof_description p, size_type ind)
Description of a special dof for Xfem.
 
pdof_description lagrange_dof(dim_type d)
Description of a unique dof of lagrange type (value at the node).
 
size_type dof_xfem_index(pdof_description)
Returns the xfem_index of dof (0 for normal dof)
 
pdof_description global_dof(dim_type d)
Description of a global dof, i.e.
 
pdof_description normal_derivative_dof(dim_type d)
Description of a unique dof of normal derivative type (normal derivative at the node,...
 
dof_description * pdof_description
Type representing a pointer on a dof_description.
 
pdof_description product_dof(pdof_description pnd1, pdof_description pnd2)
Product description of the descriptions *pnd1 and *pnd2.
 
void add_node(const pdof_description &d, const base_node &pt, const dal::bit_vector &faces)
internal function adding a node to an element for the creation of a finite element method.
 
virtual void real_hess_base_value(const fem_interpolation_context &c, base_tensor &t, bool withM=true) const
Give the hessian of all components of the base functions at the current point of the fem_interpolatio...
 
size_type convex_num() const
get the current convex number
 
std::shared_ptr< const getfem::virtual_fem > pfem
type of pointer on a fem description
 
virtual void real_grad_base_value(const fem_interpolation_context &c, base_tensor &t, bool withM=true) const
Give the gradient of all components of the base functions at the current point of the fem_interpolati...
 
bool have_pfp() const
true if a fem_precomp_ has been supplied.
 
const base_matrix & M() const
non tau-equivalent transformation matrix.
 
virtual size_type nb_base(size_type cv) const
Number of basis functions.
 
const fem< bgeot::polynomial_composite > * ppolycompfem
Polynomial composite FEM.
 
pfem fem_descriptor(const std::string &name)
get a fem descriptor from its string name.
 
void hess_base_value(base_tensor &t, bool withM=true) const
fill the tensor with the hessian of the base functions (taken at point this->xref())
 
bool have_pf() const
true if the pfem is available.
 
pfem classical_discontinuous_fem(bgeot::pgeometric_trans pg, short_type k, scalar_type alpha=0, bool complete=false)
Give a pointer on the structures describing the classical polynomial discontinuous fem of degree k on...
 
void grad_base_value(base_tensor &t, bool withM=true) const
fill the tensor with the gradient of the base functions (taken at point this->xref())
 
pfem classical_fem(bgeot::pgeometric_trans pgt, short_type k, bool complete=false)
Give a pointer on the structures describing the classical polynomial fem of degree k on a given conve...
 
void base_value(base_tensor &t, bool withM=true) const
fill the tensor with the values of the base functions (taken at point this->xref())
 
short_type face_num() const
get the current face number
 
const pfem pf() const
get the current FEM descriptor
 
pfem_precomp fem_precomp(pfem pf, bgeot::pstored_point_tab pspt, dal::pstatic_stored_object dep)
Handles precomputations for FEM.
 
bool is_on_face() const
On a face ?
 
pfem_precomp pfp() const
get the current fem_precomp_
 
const fem< bgeot::base_poly > * ppolyfem
Classical polynomial FEM.
 
virtual size_type nb_dof(size_type) const
Number of degrees of freedom.
 
virtual void real_base_value(const fem_interpolation_context &c, base_tensor &t, bool withM=true) const
Give the value of all components of the base functions at the current point of the fem_interpolation_...
 
std::string name_of_fem(pfem p)
get the string name of a fem descriptor.
 
pconvex_structure prism_incomplete_P2_structure()
Give a pointer on the 3D quadratic incomplete prism structure.
 
pconvex_ref convex_ref_product(pconvex_ref a, pconvex_ref b)
tensorial product of two convex ref.
 
pconvex_structure pyramid_Q2_incomplete_structure()
Give a pointer on the 3D quadratic incomplete pyramid structure.
 
gmm::uint16_type short_type
used as the common short type integer in the library
 
pconvex_structure pyramid_QK_structure(dim_type k)
Give a pointer on the 3D pyramid structure for a degree k = 1 or 2.
 
base_poly read_base_poly(short_type n, std::istream &f)
read a base_poly on the stream ist.
 
pconvex_ref pyramid_QK_of_reference(dim_type k)
pyramidal element of reference of degree k (k = 1 or 2 only)
 
polynomial< T > poly_substitute_var(const polynomial< T > &P, const polynomial< T > &S, size_type subs_dim)
polynomial variable substitution
 
pconvex_ref simplex_of_reference(dim_type nc, short_type K)
returns a simplex of reference of dimension nc and degree k
 
void structured_mesh_for_convex(pconvex_ref cvr, short_type k, pbasic_mesh &pm, pmesh_precomposite &pmp, bool force_simplexification)
This function returns a mesh in pm which contains a refinement of the convex cvr if force_simplexific...
 
pconvex_structure parallelepiped_structure(dim_type nc, dim_type k)
Give a pointer on the structures of a parallelepiped of dimension d.
 
pconvex_structure Q2_incomplete_structure(dim_type nc)
Give a pointer on the structures of a incomplete Q2 quadrilateral/hexahedral of dimension d = 2 or 3.
 
pconvex_structure prism_P1_structure(dim_type nc)
Give a pointer on the structures of a prism of dimension d.
 
pconvex_ref parallelepiped_of_reference(dim_type nc, dim_type k)
parallelepiped of reference of dimension nc (and degree 1)
 
pconvex_structure simplex_structure(dim_type nc)
Give a pointer on the structures of a simplex of dimension d.
 
size_t size_type
used as the common size type in the library
 
std::shared_ptr< const bgeot::geometric_trans > pgeometric_trans
pointer type for a geometric transformation
 
size_type alpha(short_type n, short_type d)
Return the value of  which is the number of monomials of a polynomial of  variables and degree .
 
pconvex_ref prism_of_reference(dim_type nc)
prism of reference of dimension nc (and degree 1)
 
void add_stored_object(pstatic_stored_object_key k, pstatic_stored_object o, permanence perm)
Add an object with two optional dependencies.
 
void add_dependency(pstatic_stored_object o1, pstatic_stored_object o2)
Add a dependency, object o1 will depend on object o2.
 
void del_stored_object(const pstatic_stored_object &o, bool ignore_unstored)
Delete an object and the object which depend on it.
 
pstatic_stored_object search_stored_object(pstatic_stored_object_key k)
Gives a pointer to an object from a key pointer.
 
bool exists_stored_object(pstatic_stored_object o)
Test if an object is stored.
 
GEneric Tool for Finite Element Methods.
 
pintegration_method int_method_descriptor(std::string name, bool throw_if_not_found=true)
Get an integration method from its name .