branch: devel-logari81 commit 26f216c888fbd0edf13953fe2c6ad8012327f02a Author: Konstantinos Poulios <logar...@gmail.com> Date: Mon Aug 7 01:17:01 2017 +0200
white space and minor coding style normalization --- src/bgeot_convex_ref.cc | 21 +- src/bgeot_convex_structure.cc | 51 +- src/bgeot_geometric_trans.cc | 14 +- src/bgeot_poly.cc | 56 +- src/getfem/bgeot_convex_ref.h | 16 +- src/getfem/bgeot_convex_structure.h | 2 +- src/getfem/bgeot_geometric_trans.h | 12 +- src/getfem/bgeot_kdtree.h | 29 +- src/getfem_contact_and_friction_common.cc | 8 +- src/getfem_export.cc | 20 +- src/getfem_fem.cc | 80 +-- src/getfem_import.cc | 32 +- src/getfem_integration.cc | 869 +++++++++++++++--------------- src/getfem_mesh.cc | 4 +- src/getfem_mesh_fem.cc | 118 ++-- 15 files changed, 678 insertions(+), 654 deletions(-) diff --git a/src/bgeot_convex_ref.cc b/src/bgeot_convex_ref.cc index 53c779f..2b3abe4 100644 --- a/src/bgeot_convex_ref.cc +++ b/src/bgeot_convex_ref.cc @@ -444,15 +444,18 @@ namespace bgeot { dal::pstatic_stored_object_key pk = std::make_shared<product_ref_key_>(a, b); dal::pstatic_stored_object o = dal::search_stored_object(pk); - if (o) return std::dynamic_pointer_cast<const convex_of_reference>(o); - pconvex_ref p = std::make_shared<product_ref_>(a, b); - dal::add_stored_object(pk, p, a, b, - convex_product_structure(a->structure(), - b->structure()), - p->pspt(), dal::PERMANENT_STATIC_OBJECT); - pconvex_ref p1 = basic_convex_ref(p); - if (p != p1) add_dependency(p, p1); - return p; + if (o) + return std::dynamic_pointer_cast<const convex_of_reference>(o); + else { + pconvex_ref p = std::make_shared<product_ref_>(a, b); + dal::add_stored_object(pk, p, a, b, + convex_product_structure(a->structure(), + b->structure()), + p->pspt(), dal::PERMANENT_STATIC_OBJECT); + pconvex_ref p1 = basic_convex_ref(p); + if (p != p1) add_dependency(p, p1); + return p; + } } pconvex_ref parallelepiped_of_reference(dim_type nc, dim_type k) { diff --git a/src/bgeot_convex_structure.cc b/src/bgeot_convex_structure.cc index bb936f3..fe14175 100644 --- a/src/bgeot_convex_structure.cc +++ b/src/bgeot_convex_structure.cc @@ -299,7 +299,7 @@ namespace bgeot { : convex_product_structure(cv1->faces_structure()[i], cv2); faces[i] = std::vector<short_type>(cv1->nb_points_of_face(i) - * cv2->nb_points()); + * cv2->nb_points()); for (short_type j = 0; j < cv1->nb_points_of_face(i); j++) for (short_type l = 0; l < cv2->nb_points(); l++) { @@ -361,18 +361,23 @@ namespace bgeot { DAL_DOUBLE_KEY(parallelepiped_key_, dim_type, dim_type); pconvex_structure parallelepiped_structure(dim_type nc, dim_type k) { - if (nc <= 1) return simplex_structure(nc, k); + if (nc <= 1) + return simplex_structure(nc, k); + dal::pstatic_stored_object_key pcsk = std::make_shared<parallelepiped_key_>(nc, k); dal::pstatic_stored_object o = dal::search_stored_object(pcsk); - if (o) return ((std::dynamic_pointer_cast<const parallelepiped_>(o))->p); - auto p = std::make_shared<parallelepiped_>(); - p->p = convex_product_structure(parallelepiped_structure(dim_type(nc-1),k), - simplex_structure(1,k)); - dal::add_stored_object(pcsk, dal::pstatic_stored_object(p), p->p, - dal::PERMANENT_STATIC_OBJECT); - return p->p; + if (o) + return ((std::dynamic_pointer_cast<const parallelepiped_>(o))->p); + else { + auto p = std::make_shared<parallelepiped_>(); + p->p = convex_product_structure(parallelepiped_structure(dim_type(nc-1),k), + simplex_structure(1,k)); + dal::add_stored_object(pcsk, dal::pstatic_stored_object(p), p->p, + dal::PERMANENT_STATIC_OBJECT); + return p->p; + } } /* ******************************************************************** */ @@ -398,7 +403,7 @@ namespace bgeot { p->Nc = nc; p->nbpt = (nc == 2) ? 8 : 20; p->nbf = (nc == 2) ? 4 : 6; - p->basic_pcvs = parallelepiped_structure(nc); + p->basic_pcvs = parallelepiped_structure(nc); // k=1 p->faces_struct.resize(p->nbf); p->faces = std::vector< std::vector<short_type> >(p->nbf); p->dir_points_ = std::vector<short_type>(p->Nc + 1); @@ -468,24 +473,24 @@ namespace bgeot { pconvex_structure pyramidal_structure(dim_type k) { GMM_ASSERT1(k == 1 || k == 2, "Sorry, pyramidal elements implemented " - "only for degree one or two."); + "only for degree one or two."); dal::pstatic_stored_object_key pcsk = std::make_shared<pyramidal_structure_key_>(k); dal::pstatic_stored_object o = dal::search_stored_object(pcsk); - if (o) return std::dynamic_pointer_cast<const convex_structure>(o); + if (o) + return std::dynamic_pointer_cast<const convex_structure>(o); auto p = std::make_shared<pyramidal_structure_>(); pconvex_structure pcvs(p); - + p->Nc = 3; p->dir_points_ = std::vector<short_type>(p->Nc + 1); - if (k == 1) { p->nbpt = 5; p->nbf = 5; p->auto_basic = true; - // 4 + // 4 // /||| // / || | // 2-|--|-3 @@ -508,12 +513,12 @@ namespace bgeot { p->faces_struct[0] = parallelepiped_structure(2); for (int i = 1; i < p->nbf; i++) - p->faces_struct[i] = simplex_structure(2); + p->faces_struct[i] = simplex_structure(2); dal::add_stored_object(pcsk, pcvs, parallelepiped_structure(2), - simplex_structure(2), - dal::PERMANENT_STATIC_OBJECT); - + simplex_structure(2), + dal::PERMANENT_STATIC_OBJECT); + } else { p->nbpt = 14; p->nbf = 5; @@ -544,15 +549,15 @@ namespace bgeot { p->faces_struct[0] = parallelepiped_structure(2, 2); for (int i = 1; i < p->nbf; i++) - p->faces_struct[i] = simplex_structure(2, 2); + p->faces_struct[i] = simplex_structure(2, 2); dal::add_stored_object(pcsk, pcvs, parallelepiped_structure(2, 2), - simplex_structure(2, 2), - dal::PERMANENT_STATIC_OBJECT); + simplex_structure(2, 2), + dal::PERMANENT_STATIC_OBJECT); } return pcvs; } - + /* ******************************************************************** */ /* Generic dummy convex with n global nodes. */ /* ******************************************************************** */ diff --git a/src/bgeot_geometric_trans.cc b/src/bgeot_geometric_trans.cc index 1d611e5..b07fc04 100644 --- a/src/bgeot_geometric_trans.cc +++ b/src/bgeot_geometric_trans.cc @@ -472,8 +472,8 @@ namespace bgeot { { vertex = false; break; } if (vertex) vertices_.push_back(ip); } - auto dimension = dim(); - if (dynamic_cast<const torus_geom_trans *>(this)) dimension -= 1; + dim_type dimension = dim(); + if (dynamic_cast<const torus_geom_trans *>(this)) --dimension; GMM_ASSERT1(vertices_.size() > dimension, "Internal error"); } @@ -801,7 +801,7 @@ namespace bgeot { "2*x*x*y + 2*x*y*y - 3*x*y;"); for (int i = 0; i < 8; ++i) - trans[i] = bgeot::read_base_poly(2, s); + trans[i] = read_base_poly(2, s); } else { std::stringstream s ("1 + 2*x^2*y*z + 2*x*y^2*z + 2*x*y*z^2" @@ -831,7 +831,7 @@ namespace bgeot { "2*x^2*y*z + 2*x*y^2*z + 2*x*y*z^2 - 5*x*y*z;"); for (int i = 0; i < 20; ++i) - trans[i] = bgeot::read_base_poly(3, s); + trans[i] = read_base_poly(3, s); } fill_standard_vertices(); } @@ -907,14 +907,14 @@ namespace bgeot { }; static pgeometric_trans - pyramidal_gt(gt_param_list& params, - std::vector<dal::pstatic_stored_object> &dependencies) { + pyramidal_gt(gt_param_list& params, + std::vector<dal::pstatic_stored_object> &deps) { GMM_ASSERT1(params.size() == 1, "Bad number of parameters : " << params.size() << " should be 1."); GMM_ASSERT1(params[0].type() == 0, "Bad type of parameters"); int k = int(::floor(params[0].num() + 0.01)); - dependencies.push_back(pyramidal_element_of_reference(dim_type(k))); + deps.push_back(pyramidal_element_of_reference(dim_type(k))); return std::make_shared<pyramidal_trans_>(dim_type(k)); } diff --git a/src/bgeot_poly.cc b/src/bgeot_poly.cc index de5ba06..545125e 100644 --- a/src/bgeot_poly.cc +++ b/src/bgeot_poly.cc @@ -33,9 +33,9 @@ namespace bgeot { static bool init = false; if (!init) { for (short_type i = 0; i < STORED; ++i) { - alpha_M_(i, 0) = alpha_M_(0, i) = 1; - for (short_type j = 1; j <= i; ++j) - alpha_M_(i,j) = alpha_M_(j,i) = (alpha_M_(i, j-1) * (i+j)) / j; + alpha_M_(i, 0) = alpha_M_(0, i) = 1; + for (short_type j = 1; j <= i; ++j) + alpha_M_(i,j) = alpha_M_(j,i) = (alpha_M_(i, j-1) * (i+j)) / j; } init = true; } @@ -46,7 +46,7 @@ namespace bgeot { size_type alpha(short_type n, short_type d) { alpha_init_(); GMM_ASSERT1(n < STORED && d < STORED, - "alpha called with n = " << n << " and d = " << d); + "alpha called with n = " << n << " and d = " << d); return alpha_(n,d); } @@ -56,7 +56,7 @@ namespace bgeot { size_type g_idx = global_index_; short_type deg = degree_; reverse_iterator it = rbegin() + 1; for (l = short_type(n-2); l != short_type(-1); --l, ++it) - if (*it != 0) break; + if (*it != 0) break; short_type a = (*this)[n-1]; (*this)[n-1] = 0; (*this)[short_type(l+1)] = short_type(a + 1); if (l != short_type(-1)) ((*this)[l])--; @@ -73,12 +73,12 @@ namespace bgeot { size_type g_idx = global_index_; short_type deg = degree_; reverse_iterator it = rbegin(); for (l = short_type(n-1); l != short_type(-1); --l, ++it) { - if (*it != 0) break; + if (*it != 0) break; } if (l != short_type(-1)) { - short_type a = (*this)[l]; - (*this)[l] = 0; (*this)[n-1] = short_type(a - 1); - if (l > 0) ((*this)[l-1])++; + short_type a = (*this)[l]; + (*this)[l] = 0; (*this)[n-1] = short_type(a - 1); + if (l > 0) ((*this)[l-1])++; else if (short_type(deg+1)) degree_ = short_type(deg-1); } if (g_idx+1) global_index_ = g_idx-1; @@ -144,20 +144,20 @@ namespace bgeot { else if (s == "u" && n > 5) result = base_poly(n, 1, 5); else if (s == "t" && n > 6) result = base_poly(n, 1, 6); else if (s == "sqrt") { - base_poly p = read_expression(n, f); - if (p.degree() > 0) parse_error(1); - result.one(); result *= sqrt(p[0]); + base_poly p = read_expression(n, f); + if (p.degree() > 0) parse_error(1); + result.one(); result *= sqrt(p[0]); } else { parse_error(2); } break; case 5 : switch (s[0]) { case '(' : - result = read_base_poly(n, f); - j = get_next_token(s, f); - if (j != 5 || s[0] != ')') parse_error(3); - break; - default : parse_error(4); + result = read_base_poly(n, f); + j = get_next_token(s, f); + if (j != 5 || s[0] != ')') parse_error(3); + break; + default : parse_error(4); } break; default : parse_error(5); @@ -178,8 +178,8 @@ namespace bgeot { } void do_bin_op(std::vector<base_poly> &value_list, - std::vector<int> &op_list, - std::vector<int> &prior_list) { + std::vector<int> &op_list, + std::vector<int> &prior_list) { base_poly &p2 = *(value_list.rbegin()); if (op_list.back() != 6) { assert(value_list.size()>1); @@ -190,14 +190,14 @@ namespace bgeot { case 3 : p1 += p2; break; case 4 : p1 -= p2; break; case 5 : - { - if (p2.degree() > 0) parse_error(7); - int pow = int(to_scalar(p2[0])); - if (p2[0] != opt_long_scalar_type(pow) || pow < 0) parse_error(8); - base_poly p = p1; p1.one(); - for (int i = 0; i < pow; ++i) p1 *= p; - } - break; + { + if (p2.degree() > 0) parse_error(7); + int pow = int(to_scalar(p2[0])); + if (p2[0] != opt_long_scalar_type(pow) || pow < 0) parse_error(8); + base_poly p = p1; p1.one(); + for (int i = 0; i < pow; ++i) p1 *= p; + } + break; default: assert(0); } value_list.pop_back(); @@ -223,7 +223,7 @@ namespace bgeot { operator_priority_(i, i ? s[0] : '0', prior, op); while (op) { while (!prior_list.empty() && prior_list.back() <= prior) - do_bin_op(value_list, op_list, prior_list); + do_bin_op(value_list, op_list, prior_list); value_list.push_back(read_expression(n, f)); op_list.push_back(op); diff --git a/src/getfem/bgeot_convex_ref.h b/src/getfem/bgeot_convex_ref.h index 8834afe..66db71e 100644 --- a/src/getfem/bgeot_convex_ref.h +++ b/src/getfem/bgeot_convex_ref.h @@ -111,12 +111,12 @@ namespace bgeot { */ virtual scalar_type is_in_face(short_type, const base_node &) const =0; /// return the normal vector for each face. - const std::vector<base_small_vector> &normals(void) const + const std::vector<base_small_vector> &normals() const { return normals_; } /// return the vertices of the reference convex. - const stored_point_tab &points(void) const { return *ppoints; } - const stored_point_tab &points(void) { return *ppoints; } - pstored_point_tab pspt(void) const { return ppoints; } + const stored_point_tab &points() const { return *ppoints; } + const stored_point_tab &points() { return *ppoints; } + pstored_point_tab pspt() const { return ppoints; } virtual ~convex_of_reference() { DAL_STORED_OBJECT_DEBUG_DESTROYED(this, "Convex of reference"); } @@ -130,7 +130,7 @@ namespace bgeot { /// return the associated order 1 reference convex. inline pconvex_ref basic_convex_ref(pconvex_ref cvr) - { if (cvr->auto_basic) return cvr; else return cvr->basic_convex_ref_; } + { return cvr->auto_basic ? cvr : cvr->basic_convex_ref_; } //@name public functions for obtaining a convex of reference @@ -147,13 +147,11 @@ namespace bgeot { */ pconvex_ref Q2_incomplete_reference(dim_type d); /** tensorial product of two convex ref. - in order to ensure unicity, it is required the a->dim() >= b->dim() - */ + in order to ensure unicity, it is required the a->dim() >= b->dim() */ /** Pyramidal element of reference of degree k (k = 1 or 2 only) */ pconvex_ref pyramidal_element_of_reference(dim_type k); pconvex_ref convex_ref_product(pconvex_ref a, pconvex_ref b); - /** equilateral simplex (degree 1). used only for mesh quality estimations - */ + /** equilateral simplex (degree 1). used only for mesh quality estimations */ pconvex_ref equilateral_simplex_of_reference(dim_type nc); /** generic convex with n global nodes */ diff --git a/src/getfem/bgeot_convex_structure.h b/src/getfem/bgeot_convex_structure.h index 0dcb509..9a8cbe3 100644 --- a/src/getfem/bgeot_convex_structure.h +++ b/src/getfem/bgeot_convex_structure.h @@ -118,7 +118,7 @@ namespace bgeot { /** Give a pointer array on the structures of the faces. * faces_structure()[i] is a pointer on the structure of the face i. */ - inline const convex_structure_faces_ct &faces_structure(void) const + inline const convex_structure_faces_ct &faces_structure() const { return faces_struct; } /** Return "direct" points indexes for a given face. * @param i the face number. diff --git a/src/getfem/bgeot_geometric_trans.h b/src/getfem/bgeot_geometric_trans.h index 01d1deb..9851024 100644 --- a/src/getfem/bgeot_geometric_trans.h +++ b/src/getfem/bgeot_geometric_trans.h @@ -126,7 +126,7 @@ namespace bgeot { pconvex_structure structure() const { return cvr->structure(); } /// Basic structure of the reference element. pconvex_structure basic_structure() const - { return bgeot::basic_structure(cvr->structure()); } + { return bgeot::basic_structure(cvr->structure()); } /// Gives the value of the functions vector at a certain point. virtual void poly_vector_val(const base_node &pt, base_vector &val) const = 0; /// Gives the value of a subgroup of the functions vector at a certain point. @@ -163,7 +163,7 @@ namespace bgeot { if the transformation is linear, x is not used at all */ size_type complexity() const { return complexity_; } virtual ~geometric_trans() - { DAL_STORED_OBJECT_DEBUG_DESTROYED(this, "Geometric transformation"); } + { DAL_STORED_OBJECT_DEBUG_DESTROYED(this, "Geometric transformation"); } geometric_trans() { DAL_STORED_OBJECT_DEBUG_CREATED(this, "Geometric transformation"); } }; @@ -251,14 +251,14 @@ namespace bgeot { * * pt is the position of the evaluation point on the reference element */ - base_small_vector APIDECL compute_normal(const geotrans_interpolation_context& c, - size_type face); + base_small_vector APIDECL + compute_normal(const geotrans_interpolation_context& c, size_type face); /** return the local basis (i.e. the normal in the first column, and the * tangent vectors in the other columns */ - base_matrix - APIDECL compute_local_basis(const geotrans_interpolation_context& c, + base_matrix APIDECL + compute_local_basis(const geotrans_interpolation_context& c, size_type face); //@} diff --git a/src/getfem/bgeot_kdtree.h b/src/getfem/bgeot_kdtree.h index 9d45555..81c00e9 100644 --- a/src/getfem/bgeot_kdtree.h +++ b/src/getfem/bgeot_kdtree.h @@ -52,7 +52,7 @@ namespace bgeot { virtual ~kdtree_elt_base() {} }; - /// store a point and the associated index for the kdtree. + /// store a point and the associated index for the kdtree. /* std::pair<size_type,base_node> is not ok since it does not have a suitable overloaded swap function ... */ @@ -69,15 +69,15 @@ namespace bgeot { typedef std::vector<index_node_pair> kdtree_tab_type; /** Balanced tree over a set of points. - + Once the tree have been built, it is possible to query very quickly for the list of points lying in a given box. Note that this is not a dynamic structure: once you start to call kdtree::points_in_box, you should not use anymore kdtree::add_point. - + Here is an example of use (which tries to find the mapping between the dof of the mesh_fem and the node numbers of its mesh): - + @code void dof_to_nodes(const getfem::mesh_fem &mf) { const getfem::getfem_mesh &m = mf.linked_mesh(); @@ -94,9 +94,9 @@ namespace bgeot { tree.points_in_box(t, P, P2); if (t.size()) { assert(t.size() == 1); - cout << " dof " << d << " maps to mesh node " << t[0].i << "\n"; + cout << " dof " << d << " maps to mesh node " << t[0].i << "\n"; } - } + } } @endcode */ @@ -110,30 +110,31 @@ namespace bgeot { void clear() { clear_tree(); pts = kdtree_tab_type(); N = 0; } void reserve(size_type n) { pts.reserve(n); } /// insert a new point - size_type add_point(const base_node& n) { + size_type add_point(const base_node& n) { size_type i = pts.size(); add_point_with_id(n,i); return i; } /// insert a new point, with an associated number. void add_point_with_id(const base_node& n, size_type i) { - if (pts.size() == 0) N = n.size(); - else if (N != n.size()) - GMM_ASSERT2(false, "invalid dimension"); + if (pts.size() == 0) + N = n.size(); + else + GMM_ASSERT2(N == n.size(), "invalid dimension"); if (tree) clear_tree(); pts.push_back(index_node_pair(i, n)); } size_type nb_points() const { return pts.size(); } const kdtree_tab_type &points() const { return pts; } - /* fills ipts with the indexes of points in the box + /* fills ipts with the indexes of points in the box [min,max] */ void points_in_box(kdtree_tab_type &ipts, - const base_node &min, - const base_node &max); + const base_node &min, + const base_node &max); /* assigns at ipt the index of the nearest neighbor at location pos and returns the square of the distance to this point*/ scalar_type nearest_neighbor(index_node_pair &ipt, const base_node &pos); private: - typedef std::vector<size_type>::const_iterator ITER; + typedef std::vector<size_type>::const_iterator ITER; void clear_tree(); }; } diff --git a/src/getfem_contact_and_friction_common.cc b/src/getfem_contact_and_friction_common.cc index d65366d..385ce8c 100644 --- a/src/getfem_contact_and_friction_common.cc +++ b/src/getfem_contact_and_friction_common.cc @@ -1104,7 +1104,7 @@ namespace getfem { for (size_type subiter(0);;) { pps(a, hessa); - det = gmm::abs(bgeot::lu_inverse(&(*(hessa.begin())),N-1, false)); + det = gmm::abs(bgeot::lu_inverse(&(*(hessa.begin())),N-1, false)); if (det > 1E-15) break; for (size_type i = 0; i < N-1; ++i) a[i] += gmm::random() * 1E-7; @@ -1164,7 +1164,7 @@ namespace getfem { for (size_type subiter(0);;) { pps(a, hessa); - det = gmm::abs(bgeot::lu_inverse(&(*(hessa.begin())),N-1, false)); + det = gmm::abs(bgeot::lu_inverse(&(*(hessa.begin())),N-1, false)); if (det > 1E-15) break; for (size_type i = 0; i < N-1; ++i) a[i] += gmm::random() * 1E-7; @@ -2677,8 +2677,8 @@ namespace getfem { if (args.size() != 6) return false; size_type N = args[0]->size(); if (N == 0 || args[1]->size() != N || args[2]->size() != N - || args[3]->size() != 1 || args[4]->size() > 3 - || args[4]->size() == 0 || args[5]->size() != 1 ) return false; + || args[3]->size() != 1 || args[4]->size() > 3 + || args[4]->size() == 0 || args[5]->size() != 1 ) return false; ga_init_vector(sizes, N); return true; } diff --git a/src/getfem_export.cc b/src/getfem_export.cc index 14da099..7edd6cf 100644 --- a/src/getfem_export.cc +++ b/src/getfem_export.cc @@ -168,11 +168,11 @@ namespace getfem pfem classical_pf1 = discontinuous ? classical_discontinuous_fem(pgt, 1) : classical_fem(pgt, 1); - short_type degree = 1; - if ((pf != classical_pf1 && pf->estimated_degree() > 1) || - pgt->structure() != pgt->basic_structure()) - degree = 2; - + short_type degree = 1; + if ((pf != classical_pf1 && pf->estimated_degree() > 1) || + pgt->structure() != pgt->basic_structure()) + degree = 2; + pmf->set_finite_element(cv, discontinuous ? classical_discontinuous_fem(pgt, degree) : classical_fem(pgt, degree)); @@ -480,9 +480,9 @@ namespace getfem for (dal::bv_visitor cv(mf.convex_index()); !cv.finished(); ++cv) { bgeot::pgeometric_trans pgt2 = mf.linked_mesh().trans_of_convex(cv); GMM_ASSERT1(basic_structure(pgt->structure()) == - basic_structure(pgt2->structure()), - "Cannot export this mesh to opendx, it contains " - "different convex types. Slice it first."); + basic_structure(pgt2->structure()), + "Cannot export this mesh to opendx, it contains " + "different convex types. Slice it first."); pfem pf = mf.fem_of_element(cv); bool discontinuous = false; for (unsigned i=0; i < pf->nb_dof(cv); ++i) { @@ -875,7 +875,7 @@ namespace getfem if (!dof_linkable(pf->dof_types()[i])) { discontinuous = true; break; } } pfem classical_pf1 = discontinuous ? - classical_discontinuous_fem(pgt, 1) : classical_fem(pgt, 1); + classical_discontinuous_fem(pgt, 1) : classical_fem(pgt, 1); pmf->set_finite_element(cv, classical_pf1); } psl = NULL; @@ -890,7 +890,7 @@ namespace getfem case 4: if ( 2 == pmf->fem_of_element(cv)->dim() ) t = POS_QU; else if (3 == pmf->fem_of_element(cv)->dim()) t = POS_SI; - break; + break; case 6: t = POS_PR; break; case 8: t = POS_HE; break; case 5: t = POS_PY; break; diff --git a/src/getfem_fem.cc b/src/getfem_fem.cc index 96a1b8f..5d81180 100644 --- a/src/getfem_fem.cc +++ b/src/getfem_fem.cc @@ -36,6 +36,8 @@ namespace getfem { + using bgeot::read_base_poly; + using bgeot::base_rational_fraction; const base_matrix& fem_interpolation_context::M() const { if (gmm::mat_nrows(M_) == 0) { @@ -1157,7 +1159,7 @@ namespace getfem { "4*(x*y - x*x*y);" "2*x*x*y + 2*x*y*y - 3*x*y;"); - for (int i = 0; i < 8; ++i) p->base()[i] = bgeot::read_base_poly(2, s); + for (int i = 0; i < 8; ++i) p->base()[i] = read_base_poly(2, s); p->add_node(lagrange_dof(2), base_small_vector(0.0, 0.0)); p->add_node(lagrange_dof(2), base_small_vector(0.5, 0.0)); @@ -1195,7 +1197,7 @@ namespace getfem { "4*( - x^2*y*z + x*y*z);" "2*x^2*y*z + 2*x*y^2*z + 2*x*y*z^2 - 5*x*y*z;"); - for (int i = 0; i < 20; ++i) p->base()[i] = bgeot::read_base_poly(3, s); + for (int i = 0; i < 20; ++i) p->base()[i] = read_base_poly(3, s); p->add_node(lagrange_dof(3), base_small_vector(0.0, 0.0, 0.0)); p->add_node(lagrange_dof(3), base_small_vector(0.5, 0.0, 0.0)); @@ -1256,7 +1258,7 @@ namespace getfem { // 0---1---2 static pfem build_pyramidal_pk_fem(short_type k, bool disc) { - auto p = std::make_shared<fem<bgeot::base_rational_fraction>>(); + auto p = std::make_shared<fem<base_rational_fraction>>(); p->mref_convex() = bgeot::pyramidal_element_of_reference(1); p->dim() = 3; p->is_standard() = p->is_equivalent() = true; @@ -1268,17 +1270,17 @@ namespace getfem { if (k == 0) { p->base().resize(1); - p->base()[0] = bgeot::read_base_poly(3, "1"); + p->base()[0] = read_base_poly(3, "1"); p->add_node(lagrange_0_dof(3), base_small_vector(0.0, 0.0, 0.5)); } else if (k == 1) { p->base().resize(5); - bgeot::base_rational_fraction // Q = xy/(1-z) - Q(bgeot::read_base_poly(3, "x*y"), bgeot::read_base_poly(3, "1-z")); - p->base()[0] = (bgeot::read_base_poly(3, "1-x-y-z") + Q)*0.25; - p->base()[1] = (bgeot::read_base_poly(3, "1+x-y-z") - Q)*0.25; - p->base()[2] = (bgeot::read_base_poly(3, "1-x+y-z") - Q)*0.25; - p->base()[3] = (bgeot::read_base_poly(3, "1+x+y-z") + Q)*0.25; - p->base()[4] = bgeot::read_base_poly(3, "z"); + base_rational_fraction // Q = xy/(1-z) + Q(read_base_poly(3, "x*y"), read_base_poly(3, "1-z")); + p->base()[0] = (read_base_poly(3, "1-x-y-z") + Q)*0.25; + p->base()[1] = (read_base_poly(3, "1+x-y-z") - Q)*0.25; + p->base()[2] = (read_base_poly(3, "1-x+y-z") - Q)*0.25; + p->base()[3] = (read_base_poly(3, "1+x+y-z") + Q)*0.25; + p->base()[4] = read_base_poly(3, "z"); p->add_node(lag_dof, base_small_vector(-1.0, -1.0, 0.0)); p->add_node(lag_dof, base_small_vector( 1.0, -1.0, 0.0)); @@ -1289,16 +1291,16 @@ namespace getfem { } else if (k == 2) { p->base().resize(14); - base_poly xi0 = bgeot::read_base_poly(3, "(1-z-x)*0.5"); - base_poly xi1 = bgeot::read_base_poly(3, "(1-z-y)*0.5"); - base_poly xi2 = bgeot::read_base_poly(3, "(1-z+x)*0.5"); - base_poly xi3 = bgeot::read_base_poly(3, "(1-z+y)*0.5"); - base_poly x = bgeot::read_base_poly(3, "x"); - base_poly y = bgeot::read_base_poly(3, "y"); - base_poly z = bgeot::read_base_poly(3, "z"); - base_poly ones = bgeot::read_base_poly(3, "1"); - base_poly un_z = bgeot::read_base_poly(3, "1-z"); - bgeot::base_rational_fraction Q(bgeot::read_base_poly(3, "1"), un_z); + base_poly xi0 = read_base_poly(3, "(1-z-x)*0.5"); + base_poly xi1 = read_base_poly(3, "(1-z-y)*0.5"); + base_poly xi2 = read_base_poly(3, "(1-z+x)*0.5"); + base_poly xi3 = read_base_poly(3, "(1-z+y)*0.5"); + base_poly x = read_base_poly(3, "x"); + base_poly y = read_base_poly(3, "y"); + base_poly z = read_base_poly(3, "z"); + base_poly ones = read_base_poly(3, "1"); + base_poly un_z = read_base_poly(3, "1-z"); + base_rational_fraction Q(read_base_poly(3, "1"), un_z); p->base()[ 0] = Q*Q*xi0*xi1*(x*y-z*un_z); p->base()[ 1] = -Q*Q*xi0*xi1*xi2*y*4.; @@ -1313,7 +1315,7 @@ namespace getfem { p->base()[10] = Q*z*xi1*xi2*4.; p->base()[11] = Q*z*xi3*xi0*4.; p->base()[12] = Q*z*xi2*xi3*4.; - p->base()[13] = bgeot::read_base_poly(3, "z*(2*z-1)"); + p->base()[13] = read_base_poly(3, "z*(2*z-1)"); p->add_node(lag_dof, base_small_vector(-1.0, -1.0, 0.0)); p->add_node(lag_dof, base_small_vector( 0.0, -1.0, 0.0)); @@ -1338,8 +1340,7 @@ namespace getfem { static pfem pyramidal_pk_fem - (fem_param_list ¶ms, - std::vector<dal::pstatic_stored_object> &dependencies) { + (fem_param_list ¶ms, std::vector<dal::pstatic_stored_object> &deps) { GMM_ASSERT1(params.size() <= 1, "Bad number of parameters"); short_type k = 2; if (params.size() > 0) { @@ -1347,14 +1348,13 @@ namespace getfem { k = dim_type(::floor(params[0].num() + 0.01)); } pfem p = build_pyramidal_pk_fem(k, false); - dependencies.push_back(p->ref_convex(0)); - dependencies.push_back(p->node_tab(0)); + deps.push_back(p->ref_convex(0)); + deps.push_back(p->node_tab(0)); return p; } static pfem pyramidal_disc_pk_fem - (fem_param_list ¶ms, - std::vector<dal::pstatic_stored_object> &dependencies) { + (fem_param_list ¶ms, std::vector<dal::pstatic_stored_object> &deps) { GMM_ASSERT1(params.size() <= 1, "Bad number of parameters"); short_type k = 2; if (params.size() > 0) { @@ -1362,18 +1362,18 @@ namespace getfem { k = dim_type(::floor(params[0].num() + 0.01)); } pfem p = build_pyramidal_pk_fem(k, true); - dependencies.push_back(p->ref_convex(0)); - dependencies.push_back(p->node_tab(0)); + deps.push_back(p->ref_convex(0)); + deps.push_back(p->node_tab(0)); return p; } - /* ******************************************************************** */ - /* P1 element with a bubble base fonction on a face */ - /* ******************************************************************** */ + /* ******************************************************************** */ + /* P1 element with a bubble base fonction on a face */ + /* ******************************************************************** */ - struct P1_wabbfoaf_ : public PK_fem_ { - P1_wabbfoaf_(dim_type nc); - }; + struct P1_wabbfoaf_ : public PK_fem_ { + P1_wabbfoaf_(dim_type nc); + }; P1_wabbfoaf_::P1_wabbfoaf_(dim_type nc) : PK_fem_(nc, 1) { is_lag = false; es_degree = 2; @@ -3136,7 +3136,7 @@ namespace getfem { base_node pt(3); for (unsigned k = 0; k < 5; ++k) { for (unsigned i = 0; i < 4; ++i) { - base_[k*4+i] = bgeot::read_base_poly(3, s); + base_[k*4+i] = read_base_poly(3, s); pt[0] = pt[1] = pt[2] = ((k == 4) ? 1.0/3.0 : 0.0); if (k == 4 && i) pt[i-1] = 0.0; if (k < 4 && k) pt[k-1] = 1.0; @@ -3308,7 +3308,7 @@ namespace getfem { base_node pt(2); for (unsigned k = 0; k < 7; ++k) { for (unsigned i = 0; i < 3; ++i) { - base_[k*3+i] = bgeot::read_base_poly(2, s); + base_[k*3+i] = read_base_poly(2, s); if (k == 6) { pt[0] = pt[1] = 0.5; if (i) pt[i-1] = 0.0; add_node(normal_derivative_dof(2), pt); @@ -3416,7 +3416,7 @@ namespace getfem { "((x+y)^2 - x - y)*sqrt(2)/2; x*(x-1); y*(y-1);"); for (unsigned k = 0; k < 6; ++k) - base_[k] = bgeot::read_base_poly(2, s); + base_[k] = read_base_poly(2, s); add_node(lagrange_dof(2), base_node(0.0, 0.0)); add_node(lagrange_dof(2), base_node(1.0, 0.0)); @@ -3556,7 +3556,7 @@ namespace getfem { std::stringstream name; // Identifying if it is a torus structure - if(bgeot::is_torus_geom_trans(pgt) && n == 3) n = 2; + if (bgeot::is_torus_geom_trans(pgt) && n == 3) n = 2; /* Identifying P1-simplexes. */ if (nbp == n+1) diff --git a/src/getfem_import.cc b/src/getfem_import.cc index 6860d80..524f7ed 100644 --- a/src/getfem_import.cc +++ b/src/getfem_import.cc @@ -123,7 +123,7 @@ namespace getfem { nodes.resize(6); } break; case 7: { /* PYRAMID */ - nodes.resize(5); + nodes.resize(5); } break; case 8: { /* 2ND ORDER LINE */ nodes.resize(3); @@ -329,10 +329,10 @@ namespace getfem { size_type j; f >> j; std::map<size_type, size_type>::iterator - it = msh_node_2_getfem_node.find(j); + it = msh_node_2_getfem_node.find(j); GMM_ASSERT1(it != msh_node_2_getfem_node.end(), - "Invalid node ID " << j << " in gmsh element " - << (ci.id + 1)); + "Invalid node ID " << j << " in gmsh element " + << (ci.id + 1)); ci.nodes[i] = it->second; } if(ci.type != 15) ci.set_pgt(); @@ -715,11 +715,11 @@ namespace getfem { for (size_type i=0; i < nnode; ++i) { size_type j; s >> j; - std::map<size_type, size_type>::iterator - it = msh_node_2_getfem_node.find(j); + std::map<size_type, size_type>::iterator + it = msh_node_2_getfem_node.find(j); GMM_ASSERT1(it != msh_node_2_getfem_node.end(), - "Invalid node ID " << j << " in GiD element " << cv_id); - cv_nodes[i] = it->second; + "Invalid node ID " << j << " in GiD element " << cv_id); + cv_nodes[i] = it->second; } getfem_cv_nodes.resize(nnode); for (size_type i=0; i < nnode; ++i) { @@ -1105,7 +1105,7 @@ namespace getfem { getfem_cv_nodes.begin())); if (itype < elt_cnt.size()) elt_cnt[itype] += 1; - } + } } } } @@ -1157,12 +1157,14 @@ namespace getfem { /*NE: nombre d'elements (premier nombre du fichier .noboite) NP: nombre de points (deuxieme nombre du fichier .noboite) - ligne_debut_NP: la ligne commence la liste des coordonnees des points dans le fichier .noboite*/ + ligne_debut_NP: la ligne commence la liste des coordonnees des points dans le + fichier .noboite*/ f >> NE>>NP; ligne_debut_NP=NE*4/6+3; - //passer 3 premiers lignes du fichier .noboite (la liste des elements commence a la quatrieme ligne) + //passer 3 premiers lignes du fichier .noboite (la liste des elements commence a la + //quatrieme ligne) string contenu; for (i=1; i<=ligne_debut_NP; i++){ getline(f, contenu); @@ -1211,16 +1213,16 @@ namespace getfem { if(fichier_GiD) // si l'ouverture a r�ussi { - // instructions - fichier_GiD.close(); // on referme le fichier + // instructions + fichier_GiD.close(); // on referme le fichier } else // sinon cerr << "Erreur � l'ouverture !" << endl; if(f) // si l'ouverture a r�ussi { - // instructions - //f.close(); // on referme le fichier + // instructions + //f.close(); // on referme le fichier } else // sinon cerr << "Erreur � l'ouverture !" << endl; diff --git a/src/getfem_integration.cc b/src/getfem_integration.cc index 047fc3f..85f5233 100644 --- a/src/getfem_integration.cc +++ b/src/getfem_integration.cc @@ -33,10 +33,10 @@ namespace getfem { /* - * dummy integration method + * dummy integration method */ static pintegration_method im_none(im_param_list ¶ms, - std::vector<dal::pstatic_stored_object> &) { + std::vector<dal::pstatic_stored_object> &) { GMM_ASSERT1(params.size() == 0, "IM_NONE does not accept any parameter"); return std::make_shared<integration_method>(); } @@ -49,7 +49,7 @@ namespace getfem { hum->resize(i); bgeot::power_index mi(P.dim()); mi[P.dim()-1] = P.degree(); for (size_type k = i; k > j; --k, --mi) - (*hum)[k-1] = int_monomial(mi); + (*hum)[k-1] = int_monomial(mi); } base_poly::const_iterator it = P.begin(), ite = P.end(); std::vector<long_scalar_type>::const_iterator itb = int_monomials.begin(); @@ -68,11 +68,11 @@ namespace getfem { hum->resize(i); bgeot::power_index mi(P.dim()); mi[P.dim()-1] = P.degree(); for (size_type k = i; k > j; --k, --mi) - (*hum)[k-1] = int_monomial_on_face(mi, f); + (*hum)[k-1] = int_monomial_on_face(mi, f); } base_poly::const_iterator it = P.begin(), ite = P.end(); std::vector<long_scalar_type>::const_iterator itb = hum->begin(); - for ( ; it != ite; ++it, ++itb) + for ( ; it != ite; ++it, ++itb) res += long_scalar_type(*it) * long_scalar_type(*itb); return res; } @@ -85,8 +85,8 @@ namespace getfem { long_scalar_type int_monomial(const bgeot::power_index &power) const; - long_scalar_type int_monomial_on_face(const bgeot::power_index &power, - short_type f) const; + long_scalar_type int_monomial_on_face(const bgeot::power_index &power, + short_type f) const; simplex_poly_integration_(bgeot::pconvex_structure c) { cvs = c; int_face_monomials.resize(c->nb_faces()); } @@ -101,38 +101,39 @@ namespace getfem { itme = power.end(); for ( ; itm != itme; ++itm) for (int k = 1; k <= *itm; ++k, ++fa) - res *= long_scalar_type(k) / long_scalar_type(fa); - + res *= long_scalar_type(k) / long_scalar_type(fa); + for (int k = 0; k < cvs->dim(); k++) { res /= long_scalar_type(fa); fa++; } return res; } - + long_scalar_type simplex_poly_integration_::int_monomial_on_face (const bgeot::power_index &power, short_type f) const { long_scalar_type res = LONG_SCAL(0); - + if (f == 0 || power[f-1] == 0.0) { res = (f == 0) ? sqrt(long_scalar_type(cvs->dim())) : LONG_SCAL(1); short_type fa = 1; bgeot::power_index::const_iterator itm = power.begin(), - itme = power.end(); + itme = power.end(); for ( ; itm != itme; ++itm) - for (int k = 1; k <= *itm; ++k, ++fa) - res *= long_scalar_type(k) / long_scalar_type(fa); - + for (int k = 1; k <= *itm; ++k, ++fa) + res *= long_scalar_type(k) / long_scalar_type(fa); + for (int k = 1; k < cvs->dim(); k++) { res/=long_scalar_type(fa); fa++; } } return res; } - static pintegration_method exact_simplex(im_param_list ¶ms, - std::vector<dal::pstatic_stored_object> &dependencies) { + static pintegration_method + exact_simplex(im_param_list ¶ms, + std::vector<dal::pstatic_stored_object> &dependencies) { GMM_ASSERT1(params.size() == 1, "Bad number of parameters : " - << params.size() << " should be 1."); + << params.size() << " should be 1."); GMM_ASSERT1(params[0].type() == 0, "Bad type of parameters"); int n = int(::floor(params[0].num() + 0.01)); GMM_ASSERT1(n > 0 && n < 100 && double(n) == params[0].num(), - "Bad parameters"); + "Bad parameters"); dependencies.push_back(bgeot::simplex_structure(dim_type(n))); ppoly_integration ppi = std::make_shared<simplex_poly_integration_> (bgeot::simplex_structure(dim_type(n))); @@ -148,8 +149,8 @@ namespace getfem { long_scalar_type int_monomial(const bgeot::power_index &power) const; - long_scalar_type int_monomial_on_face(const bgeot::power_index &power, - short_type f) const; + long_scalar_type int_monomial_on_face(const bgeot::power_index &power, + short_type f) const; plyint_mul_structure_(ppoly_integration a, ppoly_integration b); }; @@ -161,7 +162,7 @@ namespace getfem { std::copy(power.begin() + cv1->dim(), power.end(), mi2.begin()); return cv1->int_monomial(mi1) * cv2->int_monomial(mi2); } - + long_scalar_type plyint_mul_structure_::int_monomial_on_face (const bgeot::power_index &power, short_type f) const { bgeot::power_index mi1(cv1->dim()), mi2(cv2->dim()); @@ -172,30 +173,31 @@ namespace getfem { return cv1->int_monomial_on_face(mi1,f) * cv2->int_monomial(mi2); else return cv1->int_monomial(mi1) - * cv2->int_monomial_on_face(mi2, short_type(f-nfx)); + * cv2->int_monomial_on_face(mi2, short_type(f-nfx)); } - - plyint_mul_structure_::plyint_mul_structure_(ppoly_integration a, - ppoly_integration b) { + + plyint_mul_structure_::plyint_mul_structure_(ppoly_integration a, + ppoly_integration b) { cv1 = a; cv2 = b; cvs = bgeot::convex_product_structure(cv1->structure(), - cv2->structure()); + cv2->structure()); int_face_monomials.resize(cvs->nb_faces()); } - static pintegration_method product_exact(im_param_list ¶ms, - std::vector<dal::pstatic_stored_object> &dependencies) { + static pintegration_method + product_exact(im_param_list ¶ms, + std::vector<dal::pstatic_stored_object> &dependencies) { GMM_ASSERT1(params.size() == 2, "Bad number of parameters : " - << params.size() << " should be 2."); - GMM_ASSERT1(params[0].type() == 1 && params[1].type() == 1, - "Bad type of parameters"); + << params.size() << " should be 2."); + GMM_ASSERT1(params[0].type() == 1 && params[1].type() == 1, + "Bad type of parameters"); pintegration_method a = params[0].method(); pintegration_method b = params[1].method(); GMM_ASSERT1(a->type() == IM_EXACT && b->type() == IM_EXACT, - "Bad parameters"); + "Bad parameters"); dependencies.push_back(a); dependencies.push_back(b); dependencies.push_back(bgeot::convex_product_structure(a->structure(), - b->structure())); + b->structure())); ppoly_integration ppi = std::make_shared<plyint_mul_structure_> (a->exact_method(), b->exact_method()); return std::make_shared<integration_method>(ppi); @@ -205,36 +207,38 @@ namespace getfem { /* integration on parallelepiped. */ /* ******************************************************************** */ - static pintegration_method exact_parallelepiped(im_param_list ¶ms, - std::vector<dal::pstatic_stored_object> &) { + static pintegration_method + exact_parallelepiped(im_param_list ¶ms, + std::vector<dal::pstatic_stored_object> &) { GMM_ASSERT1(params.size() == 1, "Bad number of parameters : " - << params.size() << " should be 1."); + << params.size() << " should be 1."); GMM_ASSERT1(params[0].type() == 0, "Bad type of parameters"); int n = int(::floor(params[0].num() + 0.01)); GMM_ASSERT1(n > 0 && n < 100 && double(n) == params[0].num(), - "Bad parameters"); + "Bad parameters"); std::stringstream name; if (n == 1) name << "IM_EXACT_SIMPLEX(1)"; - else + else name << "IM_PRODUCT(IM_EXACT_PARALLELEPIPED(" << n-1 - << "),IM_EXACT_SIMPLEX(1)))"; + << "),IM_EXACT_SIMPLEX(1)))"; return int_method_descriptor(name.str()); } - static pintegration_method exact_prism(im_param_list ¶ms, - std::vector<dal::pstatic_stored_object> &) { + static pintegration_method + exact_prism(im_param_list ¶ms, + std::vector<dal::pstatic_stored_object> &) { GMM_ASSERT1(params.size() == 1, "Bad number of parameters : " - << params.size() << " should be 1."); + << params.size() << " should be 1."); GMM_ASSERT1(params[0].type() == 0, "Bad type of parameters"); int n = int(::floor(params[0].num() + 0.01)); GMM_ASSERT1(n > 1 && n < 100 && double(n) == params[0].num(), - "Bad parameters"); + "Bad parameters"); std::stringstream name; name << "IM_PRODUCT(IM_EXACT_SIMPLEX(" << n-1 - << "),IM_EXACT_SIMPLEX(1))"; + << "),IM_EXACT_SIMPLEX(1))"; return int_method_descriptor(name.str()); } @@ -243,116 +247,116 @@ namespace getfem { /* ********************************************************************* */ void approx_integration::add_point(const base_node &pt, - scalar_type w,short_type f) { + scalar_type w,short_type f) { GMM_ASSERT1(!valid, "Impossible to modify a valid integration method."); if (gmm::abs(w) > 1.0E-15) { ++f; GMM_ASSERT1(f <= cvr->structure()->nb_faces(), "Wrong argument."); size_type i = pt_to_store[f].search_node(pt); if (i == size_type(-1)) { - i = pt_to_store[f].add_node(pt); - int_coeffs.resize(int_coeffs.size() + 1); - for (size_type j = f; j <= cvr->structure()->nb_faces(); ++j) - repartition[j] += 1; - for (size_type j = int_coeffs.size(); j > repartition[f]; --j) - int_coeffs[j-1] = int_coeffs[j-2]; - int_coeffs[repartition[f]-1] = 0.0; + i = pt_to_store[f].add_node(pt); + int_coeffs.resize(int_coeffs.size() + 1); + for (size_type j = f; j <= cvr->structure()->nb_faces(); ++j) + repartition[j] += 1; + for (size_type j = int_coeffs.size(); j > repartition[f]; --j) + int_coeffs[j-1] = int_coeffs[j-2]; + int_coeffs[repartition[f]-1] = 0.0; } int_coeffs[((f == 0) ? 0 : repartition[f-1]) + i] += w; } } void approx_integration::add_point_norepeat(const base_node &pt, - scalar_type w, - short_type f) { + scalar_type w, + short_type f) { short_type f2 = f; ++f2; if (pt_to_store[f2].search_node(pt) == size_type(-1)) add_point(pt,w,f); } void approx_integration::add_point_full_symmetric(base_node pt, - scalar_type w) { + scalar_type w) { dim_type n = cvr->structure()->dim(); dim_type k; base_node pt2(n); if (n+1 == cvr->structure()->nb_faces()) { // simplices - // for a point at (x,y) you have to consider the other points + // for a point at (x,y) you have to consider the other points // at (y,x) (x,1-x-y) (1-x-y,x) (y,1-x-y) (1-x-y,y) base_node pt3(n+1); std::copy(pt.begin(), pt.end(), pt3.begin()); pt3[n] = 1; for (k = 0; k < n; ++k) pt3[n] -= pt[k]; std::vector<int> ind(n); std::fill(ind.begin(), ind.end(), 0); - std::vector<bool> ind2(n+1); + std::vector<bool> ind2(n+1); for (;;) { - - std::fill(ind2.begin(), ind2.end(), false); - bool good = true; - for (k = 0; k < n; ++k) - if (ind2[ind[k]]) { good = false; break; } else ind2[ind[k]] = true; - if (good) { - for (k = 0; k < n; ++k) pt2[k] = pt3[ind[k]]; - add_point_norepeat(pt2, w); - } - ind[0]++; k = 0; - while(ind[k] == n+1) { ind[k++] = 0; if (k == n) return; ind[k]++; } + + std::fill(ind2.begin(), ind2.end(), false); + bool good = true; + for (k = 0; k < n; ++k) + if (ind2[ind[k]]) { good = false; break; } else ind2[ind[k]] = true; + if (good) { + for (k = 0; k < n; ++k) pt2[k] = pt3[ind[k]]; + add_point_norepeat(pt2, w); + } + ind[0]++; k = 0; + while(ind[k] == n+1) { ind[k++] = 0; if (k == n) return; ind[k]++; } } } else if (cvr->structure()->nb_points() == (size_type(1) << n)) { // parallelepidedic for (size_type i = 0; i < (size_type(1) << n); ++i) { - for (k = 0; k < n; ++k) - if (i & (size_type(1) << k)) pt2[k]=pt[k]; else pt2[k] = 1.0-pt[k]; - add_point_norepeat(pt2, w); + for (k = 0; k < n; ++k) + if (i & (size_type(1) << k)) pt2[k]=pt[k]; else pt2[k] = 1.0-pt[k]; + add_point_norepeat(pt2, w); } } else GMM_ASSERT1(false, "Fully symmetric option is only valid for" - "simplices and parallelepipedic elements"); + "simplices and parallelepipedic elements"); } void approx_integration::add_method_on_face(pintegration_method ppi, - short_type f) { + short_type f) { papprox_integration pai = ppi->approx_method(); GMM_ASSERT1(!valid, "Impossible to modify a valid integration method."); GMM_ASSERT1(pai->structure() == structure()->faces_structure()[f], - "structures missmatch"); + "structures missmatch"); GMM_ASSERT1(ppi->type() == IM_APPROX, "Impossible with an exact method."); dim_type N = pai->structure()->dim(); scalar_type det = 1.0; base_node pt(N+1); - std::vector<base_node> pts(N); + std::vector<base_node> pts(N); for (size_type i = 0; i < N; ++i) pts[i] = (cvr->dir_points_of_face(f))[i+1] - - (cvr->dir_points_of_face(f))[0]; + - (cvr->dir_points_of_face(f))[0]; if (N) { base_matrix a(N+1, N), b(N, N), tmp(N, N); for (dim_type i = 0; i < N+1; ++i) - for (dim_type j = 0; j < N; ++j) - a(i, j) = pts[j][i]; - + for (dim_type j = 0; j < N; ++j) + a(i, j) = pts[j][i]; + gmm::mult(gmm::transposed(a), a, b); det = ::sqrt(gmm::abs(gmm::lu_det(b))); } for (size_type i = 0; i < pai->nb_points_on_convex(); ++i) { pt = (cvr->dir_points_of_face(f))[0]; for (dim_type j = 0; j < N; ++j) - pt += pts[j] * ((*(pai->pintegration_points()))[i])[j]; + pt += pts[j] * ((*(pai->pintegration_points()))[i])[j]; add_point(pt, pai->coeff(i) * det, f); } } - void approx_integration::valid_method(void) { + void approx_integration::valid_method() { std::vector<base_node> ptab(int_coeffs.size()); // std::vector<scalar_type> int_coeffs2(int_coeffs); size_type i = 0; for (short_type f = 0; f <= cvr->structure()->nb_faces(); ++f) { // size_type j = i; for (PT_TAB::const_iterator it = pt_to_store[f].begin(); - it != pt_to_store[f].end(); ++it /* , ++j */) { - // int_coeffs[i] = int_coeffs2[j]; - ptab[i++] = *it; + it != pt_to_store[f].end(); ++it /* , ++j */) { + // int_coeffs[i] = int_coeffs2[j]; + ptab[i++] = *it; } } GMM_ASSERT1(i == int_coeffs.size(), "internal error."); @@ -365,60 +369,61 @@ namespace getfem { /* ********************************************************************* */ /* methods stored in getfem_im_list.h */ /* ********************************************************************* */ - + /// search a method in getfem_im_list.h - static pintegration_method im_list_integration(std::string name, - std::vector<dal::pstatic_stored_object> &dependencies) { + static pintegration_method + im_list_integration(std::string name, + std::vector<dal::pstatic_stored_object> &dependencies) { // cerr << "searching " << name << endl; for (int i = 0; i < NB_IM; ++i) if (!name.compare(im_desc_tab[i].method_name)) { - bgeot::pgeometric_trans pgt - = bgeot::geometric_trans_descriptor(im_desc_tab[i].geotrans_name); - dim_type N = pgt->structure()->dim(); - base_node pt(N); - auto pai = std::make_shared<approx_integration>(pgt->convex_ref()); - size_type fr = im_desc_tab[i].firstreal; - for (size_type j = 0; j < im_desc_tab[i].nb_points; ++j) { - for (dim_type k = 0; k < N; ++k) - pt[k] = atof(im_desc_real[fr+j*(N+1)+k]); - // pt[k] = LONG_SCALAR_ATOF(im_desc_real[fr+j*(N+1)+k]); - - switch (im_desc_node_type[im_desc_tab[i].firsttype + j]) { - case 2: { + bgeot::pgeometric_trans pgt + = bgeot::geometric_trans_descriptor(im_desc_tab[i].geotrans_name); + dim_type N = pgt->structure()->dim(); + base_node pt(N); + auto pai = std::make_shared<approx_integration>(pgt->convex_ref()); + size_type fr = im_desc_tab[i].firstreal; + for (size_type j = 0; j < im_desc_tab[i].nb_points; ++j) { + for (dim_type k = 0; k < N; ++k) + pt[k] = atof(im_desc_real[fr+j*(N+1)+k]); + // pt[k] = LONG_SCALAR_ATOF(im_desc_real[fr+j*(N+1)+k]); + + switch (im_desc_node_type[im_desc_tab[i].firsttype + j]) { + case 2: { base_node pt2(pt.size()); for (bgeot::permutation p(pt.size()); !p.finished(); ++p) { p.apply_to(pt,pt2); - pai->add_point_full_symmetric(pt2, - atof(im_desc_real[fr+j*(N+1)+N])); - // pai->add_point_full_symmetric(pt2, - // LONG_SCALAR_ATOF(im_desc_real[fr+j*(N+1)+N])); + pai->add_point_full_symmetric(pt2, + atof(im_desc_real[fr+j*(N+1)+N])); + // pai->add_point_full_symmetric(pt2, + // LONG_SCALAR_ATOF(im_desc_real[fr+j*(N+1)+N])); } - } break; - case 1: { - pai->add_point_full_symmetric(pt,atof(im_desc_real[fr+j*(N+1)+N])); - // pai->add_point_full_symmetric(pt, - // LONG_SCALAR_ATOF(im_desc_real[fr+j*(N+1)+N])); - } break; - case 0: { - pai->add_point(pt, atof(im_desc_real[fr+j*(N+1)+N])); - // pai->add_point(pt,LONG_SCALAR_ATOF(im_desc_real[fr+j*(N+1)+N])); - } break; - default: GMM_ASSERT1(false, ""); - } - } - - for (short_type f = 0; N > 0 && f < pgt->structure()->nb_faces(); ++f) - pai->add_method_on_face - (int_method_descriptor - (im_desc_face_meth[im_desc_tab[i].firstface + f]), f); - - pai->valid_method(); + } break; + case 1: { + pai->add_point_full_symmetric(pt,atof(im_desc_real[fr+j*(N+1)+N])); + // pai->add_point_full_symmetric(pt, + // LONG_SCALAR_ATOF(im_desc_real[fr+j*(N+1)+N])); + } break; + case 0: { + pai->add_point(pt, atof(im_desc_real[fr+j*(N+1)+N])); + // pai->add_point(pt,LONG_SCALAR_ATOF(im_desc_real[fr+j*(N+1)+N])); + } break; + default: GMM_ASSERT1(false, ""); + } + } + + for (short_type f = 0; N > 0 && f < pgt->structure()->nb_faces(); ++f) + pai->add_method_on_face + (int_method_descriptor + (im_desc_face_meth[im_desc_tab[i].firstface + f]), f); + + pai->valid_method(); // cerr << "finding " << name << endl; - pintegration_method p(std::make_shared<integration_method>(pai)); - dependencies.push_back(p->approx_method()->ref_convex()); - dependencies.push_back(p->approx_method()->pintegration_points()); - return p; + pintegration_method p(std::make_shared<integration_method>(pai)); + dependencies.push_back(p->approx_method()->ref_convex()); + dependencies.push_back(p->approx_method()->pintegration_points()); + return p; } return pintegration_method(); } @@ -450,7 +455,7 @@ namespace getfem { (base_poly(1,1,0) * polynomials[nb_lp-1] * ((2.0 * long_scalar_type(nb_lp) - 1.0) / long_scalar_type(nb_lp))) + (polynomials[nb_lp-2] - * ((1.0 - long_scalar_type(nb_lp)) / long_scalar_type(nb_lp))); + * ((1.0 - long_scalar_type(nb_lp)) / long_scalar_type(nb_lp))); roots[nb_lp].resize(nb_lp); roots[nb_lp][nb_lp/2] = 0.0; long_scalar_type a = -1.0, b, c, d, e, cv, ev, ecart, ecart2; @@ -474,7 +479,7 @@ namespace getfem { roots[nb_lp][nb_lp-k-1] = -c; a = b; } - } + } } }; @@ -484,30 +489,30 @@ namespace getfem { gauss_approx_integration_::gauss_approx_integration_(short_type nbpt) { GMM_ASSERT1(nbpt <= 32000, "too much points"); - + cvr = bgeot::simplex_of_reference(1); std::vector<base_node> int_points(nbpt+2); int_coeffs.resize(nbpt+2); repartition.resize(3); - repartition[0] = nbpt; + repartition[0] = nbpt; repartition[1] = nbpt + 1; - repartition[2] = nbpt + 2; - + repartition[2] = nbpt + 2; + Legendre_polynomials Lp; Lp.init(nbpt); - + for (short_type i = 0; i < nbpt; ++i) { int_points[i].resize(1); long_scalar_type lr = Lp.roots[nbpt][i]; int_points[i][0] = 0.5 + 0.5 * bgeot::to_scalar(lr); int_coeffs[i] = bgeot::to_scalar((1.0 - gmm::sqr(lr)) - / gmm::sqr( long_scalar_type(nbpt) - * (Lp.polynomials[nbpt-1].eval(&lr)))); + / gmm::sqr( long_scalar_type(nbpt) + * (Lp.polynomials[nbpt-1].eval(&lr)))); } - + int_points[nbpt].resize(1); int_points[nbpt][0] = 1.0; int_coeffs[nbpt] = 1.0; - + int_points[nbpt+1].resize(1); int_points[nbpt+1][0] = 0.0; int_coeffs[nbpt+1] = 1.0; pint_points = bgeot::store_point_tab(int_points); @@ -515,14 +520,15 @@ namespace getfem { } - static pintegration_method gauss1d(im_param_list ¶ms, - std::vector<dal::pstatic_stored_object> &dependencies) { + static pintegration_method + gauss1d(im_param_list ¶ms, + std::vector<dal::pstatic_stored_object> &dependencies) { GMM_ASSERT1(params.size() == 1, "Bad number of parameters : " - << params.size() << " should be 1."); + << params.size() << " should be 1."); GMM_ASSERT1(params[0].type() == 0, "Bad type of parameters"); int n = int(::floor(params[0].num() + 0.01)); GMM_ASSERT1(n >= 0 && n < 32000 && double(n) == params[0].num(), - "Bad parameters"); + "Bad parameters"); if (n & 1) { std::stringstream name; name << "IM_GAUSS1D(" << n-1 << ")"; @@ -530,7 +536,7 @@ namespace getfem { } else { papprox_integration - pai = std::make_shared<gauss_approx_integration_>(short_type(n/2 + 1)); + pai = std::make_shared<gauss_approx_integration_>(short_type(n/2 + 1)); pintegration_method p = std::make_shared<integration_method>(pai); dependencies.push_back(p->approx_method()->ref_convex()); dependencies.push_back(p->approx_method()->pintegration_points()); @@ -553,97 +559,98 @@ namespace getfem { : approx_integration(bgeot::simplex_of_reference(nc)) { size_type R = bgeot::alpha(nc,k); - base_node c(nc); + base_node c(nc); if (nc == 0) { add_point(c, scalar_type(1)); } else { - + std::stringstream name; name << "IM_EXACT_SIMPLEX(" << int(nc) << ")"; ppoly_integration ppi = int_method_descriptor(name.str())->exact_method(); - + size_type sum = 0, l; c.fill(scalar_type(0.0)); if (k == 0) c.fill(1.0 / scalar_type(nc+1)); - + gmm::dense_matrix<long_scalar_type> M(R, R); std::vector<long_scalar_type> F(R), U(R); std::vector<bgeot::power_index> base(R); std::vector<base_node> nodes(R); - + bgeot::power_index pi(nc); - + for (size_type r = 0; r < R; ++r, ++pi) { - base[r] = pi; nodes[r] = c; - if (k != 0 && nc > 0) { - l = 0; c[l] += 1.0 / scalar_type(k); sum++; - while (sum > k) { - sum -= int(floor(0.5+(c[l] * k))); - c[l] = 0.0; l++; if (l == nc) break; - c[l] += 1.0 / scalar_type(k); sum++; - } - } + base[r] = pi; nodes[r] = c; + if (k != 0 && nc > 0) { + l = 0; c[l] += 1.0 / scalar_type(k); sum++; + while (sum > k) { + sum -= int(floor(0.5+(c[l] * k))); + c[l] = 0.0; l++; if (l == nc) break; + c[l] += 1.0 / scalar_type(k); sum++; + } + } } // if (nc == 1) { -// M = bgeot::vsmatrix<long_scalar_type>((R+1)/2, (R+1)/2); -// U = F = bgeot::vsvector<long_scalar_type>((R+1)/2); -// gmm::clear(M); +// M = bgeot::vsmatrix<long_scalar_type>((R+1)/2, (R+1)/2); +// U = F = bgeot::vsvector<long_scalar_type>((R+1)/2); +// gmm::clear(M); // } for (size_type r = 0; r < R; ++r) { -// if (nc == 1) { -// if (r < (R+1)/2) { -// F[r] = ppi->int_monomial(base[R-1-r]); -// cout << "F[" << r << "] = " << F[r] << endl; -// } -// } -// else { - F[r] = ppi->int_monomial(base[r]); - //cout << "F[" << r << "] = " << F[r] << endl; -// } - for (size_type q = 0; q < R; ++q) { -// if (nc == 1) { -// if (r < (R+1)/2) { -// if (q < (R+1)/2) -// M(r, q) += bgeot::eval_monomial(base[R-1-r], nodes[q].begin()); -// else -// M(r, R-1-q) += bgeot::eval_monomial(base[R-1-r], -// nodes[q].begin()); -// } -// } -// else - M(r, q) = bgeot::eval_monomial(base[r], nodes[q].begin()); - } +// if (nc == 1) { +// if (r < (R+1)/2) { +// F[r] = ppi->int_monomial(base[R-1-r]); +// cout << "F[" << r << "] = " << F[r] << endl; +// } +// } +// else { + F[r] = ppi->int_monomial(base[r]); + //cout << "F[" << r << "] = " << F[r] << endl; +// } + for (size_type q = 0; q < R; ++q) { +// if (nc == 1) { +// if (r < (R+1)/2) { +// if (q < (R+1)/2) +// M(r, q) += bgeot::eval_monomial(base[R-1-r], nodes[q].begin()); +// else +// M(r, R-1-q) += bgeot::eval_monomial(base[R-1-r], +// nodes[q].begin()); +// } +// } +// else + M(r, q) = bgeot::eval_monomial(base[r], nodes[q].begin()); + } } - + gmm::lu_solve(M, U, F); for (size_type r = 0; r < R; ++r) - add_point(nodes[r], bgeot::to_scalar(U[r])); - + add_point(nodes[r], bgeot::to_scalar(U[r])); + std::stringstream name2; name2 << "IM_NC(" << int(nc-1) << "," << int(k) << ")"; for (short_type f = 0; f < structure()->nb_faces(); ++f) - add_method_on_face(int_method_descriptor(name2.str()), f); + add_method_on_face(int_method_descriptor(name2.str()), f); } valid_method(); } - static pintegration_method Newton_Cotes(im_param_list ¶ms, - std::vector<dal::pstatic_stored_object> &dependencies) { + static pintegration_method + Newton_Cotes(im_param_list ¶ms, + std::vector<dal::pstatic_stored_object> &dependencies) { GMM_ASSERT1(params.size() == 2, "Bad number of parameters : " - << params.size() << " should be 2."); + << params.size() << " should be 2."); GMM_ASSERT1(params[0].type() == 0 && params[1].type() == 0, - "Bad type of parameters"); + "Bad type of parameters"); int n = int(::floor(params[0].num() + 0.01)); int k = int(::floor(params[1].num() + 0.01)); GMM_ASSERT1(n >= 0 && n < 100 && k >= 0 && k <= 150 && - double(n) == params[0].num() && double(k) == params[1].num(), - "Bad parameters"); + double(n) == params[0].num() && double(k) == params[1].num(), + "Bad parameters"); papprox_integration pai = std::make_shared<Newton_Cotes_approx_integration_>(dim_type(n), - short_type(k)); + short_type(k)); pintegration_method p = std::make_shared<integration_method>(pai); dependencies.push_back(p->approx_method()->ref_convex()); dependencies.push_back(p->approx_method()->pintegration_points()); @@ -661,7 +668,7 @@ namespace getfem { a_int_pro_integration::a_int_pro_integration(papprox_integration a, - papprox_integration b) { + papprox_integration b) { cvr = bgeot::convex_ref_product(a->ref_convex(), b->ref_convex()); size_type n1 = a->nb_points_on_convex(); size_type n2 = b->nb_points_on_convex(); @@ -672,12 +679,12 @@ namespace getfem { repartition[0] = n1 * n2; for (size_type i1 = 0; i1 < n1; ++i1) for (size_type i2 = 0; i2 < n2; ++i2) { - int_coeffs[i1 + i2 * n1] = a->coeff(i1) * b->coeff(i2); - int_points[i1 + i2 * n1].resize(dim()); - std::copy(a->point(i1).begin(), a->point(i1).end(), - int_points[i1 + i2 * n1].begin()); - std::copy(b->point(i2).begin(), b->point(i2).end(), - int_points[i1 + i2 * n1].begin() + a->dim()); + int_coeffs[i1 + i2 * n1] = a->coeff(i1) * b->coeff(i2); + int_points[i1 + i2 * n1].resize(dim()); + std::copy(a->point(i1).begin(), a->point(i1).end(), + int_points[i1 + i2 * n1].begin()); + std::copy(b->point(i2).begin(), b->point(i2).end(), + int_points[i1 + i2 * n1].begin() + a->dim()); } short_type f = 0; for (short_type f1 = 0; f1 < a->structure()->nb_faces(); ++f1, ++f) { @@ -688,16 +695,16 @@ namespace getfem { int_points.resize(repartition[f+1]); int_coeffs.resize(repartition[f+1]); for (size_type i1 = 0; i1 < n1; ++i1) - for (size_type i2 = 0; i2 < n2; ++i2) { - int_coeffs[w + i1 + i2 * n1] = a->coeff_on_face(f1, i1) - * b->coeff(i2); - int_points[w + i1 + i2 * n1].resize(dim()); - std::copy(a->point_on_face(f1, i1).begin(), - a->point_on_face(f1, i1).end(), - int_points[w + i1 + i2 * n1].begin()); - std::copy(b->point(i2).begin(), b->point(i2).end(), - int_points[w + i1 + i2 * n1].begin() + a->dim()); - } + for (size_type i2 = 0; i2 < n2; ++i2) { + int_coeffs[w + i1 + i2 * n1] = a->coeff_on_face(f1, i1) + * b->coeff(i2); + int_points[w + i1 + i2 * n1].resize(dim()); + std::copy(a->point_on_face(f1, i1).begin(), + a->point_on_face(f1, i1).end(), + int_points[w + i1 + i2 * n1].begin()); + std::copy(b->point(i2).begin(), b->point(i2).end(), + int_points[w + i1 + i2 * n1].begin() + a->dim()); + } } for (short_type f2 = 0; f2 < b->structure()->nb_faces(); ++f2, ++f) { n1 = a->nb_points_on_convex(); @@ -707,46 +714,48 @@ namespace getfem { int_points.resize(repartition[f+1]); int_coeffs.resize(repartition[f+1]); for (size_type i1 = 0; i1 < n1; ++i1) - for (size_type i2 = 0; i2 < n2; ++i2) { - int_coeffs[w + i1 + i2 * n1] = a->coeff(i1) - * b->coeff_on_face(f2, i2); - int_points[w + i1 + i2 * n1].resize(dim()); - std::copy(a->point(i1).begin(), a->point(i1).end(), - int_points[w + i1 + i2 * n1].begin()); - std::copy(b->point_on_face(f2, i2).begin(), - b->point_on_face(f2, i2).end(), - int_points[w + i1 + i2 * n1].begin() + a->dim()); - } + for (size_type i2 = 0; i2 < n2; ++i2) { + int_coeffs[w + i1 + i2 * n1] = a->coeff(i1) + * b->coeff_on_face(f2, i2); + int_points[w + i1 + i2 * n1].resize(dim()); + std::copy(a->point(i1).begin(), a->point(i1).end(), + int_points[w + i1 + i2 * n1].begin()); + std::copy(b->point_on_face(f2, i2).begin(), + b->point_on_face(f2, i2).end(), + int_points[w + i1 + i2 * n1].begin() + a->dim()); + } } pint_points = bgeot::store_point_tab(int_points); valid = true; } - static pintegration_method product_approx(im_param_list ¶ms, - std::vector<dal::pstatic_stored_object> &dependencies) { + static pintegration_method + product_approx(im_param_list ¶ms, + std::vector<dal::pstatic_stored_object> &dependencies) { GMM_ASSERT1(params.size() == 2, "Bad number of parameters : " - << params.size() << " should be 2."); + << params.size() << " should be 2."); GMM_ASSERT1(params[0].type() == 1 && params[1].type() == 1, - "Bad type of parameters"); + "Bad type of parameters"); pintegration_method a = params[0].method(); pintegration_method b = params[1].method(); GMM_ASSERT1(a->type() == IM_APPROX && b->type() == IM_APPROX, - "Bad parameters"); + "Bad parameters"); papprox_integration pai = std::make_shared<a_int_pro_integration>(a->approx_method(), - b->approx_method()); + b->approx_method()); pintegration_method p = std::make_shared<integration_method>(pai); dependencies.push_back(p->approx_method()->ref_convex()); dependencies.push_back(p->approx_method()->pintegration_points()); return p; } - static pintegration_method product_which(im_param_list ¶ms, - std::vector<dal::pstatic_stored_object> &dependencies) { + static pintegration_method + product_which(im_param_list ¶ms, + std::vector<dal::pstatic_stored_object> &dependencies) { GMM_ASSERT1(params.size() == 2, "Bad number of parameters : " - << params.size() << " should be 2."); + << params.size() << " should be 2."); GMM_ASSERT1(params[0].type() == 1 && params[1].type() == 1, - "Bad type of parameters"); + "Bad type of parameters"); pintegration_method a = params[0].method(); pintegration_method b = params[1].method(); if (a->type() == IM_EXACT || b->type() == IM_EXACT) @@ -759,42 +768,44 @@ namespace getfem { /* integration on parallelepiped with Newton Cotes formulae */ /* ********************************************************************* */ - static pintegration_method Newton_Cotes_para(im_param_list ¶ms, - std::vector<dal::pstatic_stored_object> &) { + static pintegration_method + Newton_Cotes_para(im_param_list ¶ms, + std::vector<dal::pstatic_stored_object> &) { GMM_ASSERT1(params.size() == 2, "Bad number of parameters : " - << params.size() << " should be 2."); + << params.size() << " should be 2."); GMM_ASSERT1(params[0].type() == 0 && params[1].type() == 0, - "Bad type of parameters"); + "Bad type of parameters"); int n = int(::floor(params[0].num() + 0.01)); int k = int(::floor(params[1].num() + 0.01)); GMM_ASSERT1(n > 0 && n < 100 && k >= 0 && k <= 150 && - double(n) == params[0].num() && double(k) == params[1].num(), - "Bad parameters"); + double(n) == params[0].num() && double(k) == params[1].num(), + "Bad parameters"); std::stringstream name; if (n == 1) name << "IM_NC(1," << k << ")"; - else + else name << "IM_PRODUCT(IM_NC_PARALLELEPIPED(" << n-1 << "," << k - << "),IM_NC(1," << k << "))"; + << "),IM_NC(1," << k << "))"; return int_method_descriptor(name.str()); } - static pintegration_method Newton_Cotes_prism(im_param_list ¶ms, - std::vector<dal::pstatic_stored_object> &) { + static pintegration_method + Newton_Cotes_prism(im_param_list ¶ms, + std::vector<dal::pstatic_stored_object> &) { GMM_ASSERT1(params.size() == 2, "Bad number of parameters : " - << params.size() << " should be 2."); + << params.size() << " should be 2."); GMM_ASSERT1(params[0].type() == 0 && params[1].type() == 0, - "Bad type of parameters"); + "Bad type of parameters"); int n = int(::floor(params[0].num() + 0.01)); int k = int(::floor(params[1].num() + 0.01)); GMM_ASSERT1(n > 1 && n < 100 && k >= 0 && k <= 150 && - double(n) == params[0].num() && double(k) == params[1].num(), - "Bad parameters"); + double(n) == params[0].num() && double(k) == params[1].num(), + "Bad parameters"); std::stringstream name; name << "IM_PRODUCT(IM_NC(" << n-1 << "," << k << "),IM_NC(1," - << k << "))"; + << k << "))"; return int_method_descriptor(name.str()); } @@ -802,24 +813,25 @@ namespace getfem { /* integration on parallelepiped with Gauss formulae */ /* ********************************************************************* */ - static pintegration_method Gauss_paramul(im_param_list ¶ms, - std::vector<dal::pstatic_stored_object> &) { + static pintegration_method + Gauss_paramul(im_param_list ¶ms, + std::vector<dal::pstatic_stored_object> &) { GMM_ASSERT1(params.size() == 2, "Bad number of parameters : " - << params.size() << " should be 2."); + << params.size() << " should be 2."); GMM_ASSERT1(params[0].type() == 0 && params[1].type() == 0, - "Bad type of parameters"); + "Bad type of parameters"); int n = int(::floor(params[0].num() + 0.01)); int k = int(::floor(params[1].num() + 0.01)); GMM_ASSERT1(n > 0 && n < 100 && k >= 0 && k <= 150 && - double(n) == params[0].num() && double(k) == params[1].num(), - "Bad parameters"); + double(n) == params[0].num() && double(k) == params[1].num(), + "Bad parameters"); std::stringstream name; if (n == 1) name << "IM_GAUSS1D(" << k << ")"; - else + else name << "IM_PRODUCT(IM_GAUSS_PARALLELEPIPED(" << n-1 << "," << k - << "),IM_GAUSS1D(" << k << "))"; + << "),IM_GAUSS1D(" << k << "))"; return int_method_descriptor(name.str()); } @@ -828,8 +840,8 @@ namespace getfem { /* ******************************************************************** */ struct quasi_polar_integration : public approx_integration { - quasi_polar_integration(papprox_integration base_im, - size_type ip1, size_type ip2=size_type(-1)) : + quasi_polar_integration(papprox_integration base_im, + size_type ip1, size_type ip2=size_type(-1)) : approx_integration ((base_im->structure() == bgeot::parallelepiped_structure(3)) ? bgeot::pyramidal_element_of_reference(1) @@ -839,11 +851,11 @@ namespace getfem { enum { SQUARE, PRISM, TETRA_CYL, PRISM2, PYRAMID } what; if (N == 2) what = SQUARE; else if (base_im->structure() == bgeot::prism_structure(3)) - what = (ip2 == size_type(-1) || ip1 == ip2) ? PRISM2 : PRISM; + what = (ip2 == size_type(-1) || ip1 == ip2) ? PRISM2 : PRISM; else if (base_im->structure() == bgeot::simplex_structure(3)) - what = TETRA_CYL; + what = TETRA_CYL; else if (base_im->structure() == bgeot::parallelepiped_structure(3)) - what = PYRAMID; + what = PYRAMID; else GMM_ASSERT1(false, "Incoherent integration method"); // The first geometric transformation collapse a face of @@ -855,8 +867,8 @@ namespace getfem { bgeot::pgeometric_trans pgt2 = bgeot::simplex_geotrans(N, 1); std::vector<base_node> nodes2(N+1); if (what == PYRAMID) { - pgt2 = bgeot::pyramidal_geotrans(1); - nodes2.resize(5); + pgt2 = bgeot::pyramidal_geotrans(1); + nodes2.resize(5); } std::vector<size_type> other_nodes; // for the construction of node2 bgeot::pgeometric_trans pgt3 = bgeot::simplex_geotrans(N, 1); @@ -864,162 +876,163 @@ namespace getfem { switch (what) { case SQUARE : - nodes1[3] = nodes1[1]; - nodes2[ip1] = nodes1[1]; ip2 = ip1; - other_nodes.push_back(0); - other_nodes.push_back(2); - break; + nodes1[3] = nodes1[1]; + nodes2[ip1] = nodes1[1]; ip2 = ip1; + other_nodes.push_back(0); + other_nodes.push_back(2); + break; case PRISM : - nodes1[4] = nodes1[0]; nodes1[5] = nodes1[1]; - nodes2[ip1] = nodes1[0]; - nodes2[ip2] = nodes1[1]; - other_nodes.push_back(2); - other_nodes.push_back(6); - break; + nodes1[4] = nodes1[0]; nodes1[5] = nodes1[1]; + nodes2[ip1] = nodes1[0]; + nodes2[ip2] = nodes1[1]; + other_nodes.push_back(2); + other_nodes.push_back(6); + break; case TETRA_CYL : - nodes3[0] = nodes1[0]; nodes3[1] = nodes1[1]; - nodes3[2] = nodes1[2]; nodes3[3] = nodes1[4]; - // nodes1[4] = nodes1[0]; nodes1[7] = base_node(1.0, 1.0, 2.0); - nodes2[ip1] = nodes1[1]; ip2 = ip1; - other_nodes.push_back(0); - other_nodes.push_back(2); - other_nodes.push_back(4); - break; + nodes3[0] = nodes1[0]; nodes3[1] = nodes1[1]; + nodes3[2] = nodes1[2]; nodes3[3] = nodes1[4]; + // nodes1[4] = nodes1[0]; nodes1[7] = base_node(1.0, 1.0, 2.0); + nodes2[ip1] = nodes1[1]; ip2 = ip1; + other_nodes.push_back(0); + other_nodes.push_back(2); + other_nodes.push_back(4); + break; case PRISM2 : - nodes2[ip1] = nodes1[4]; - other_nodes.push_back(0); - other_nodes.push_back(1); - other_nodes.push_back(2); - break; + nodes2[ip1] = nodes1[4]; + other_nodes.push_back(0); + other_nodes.push_back(1); + other_nodes.push_back(2); + break; case PYRAMID : - ip2 = ip1 = 0; - nodes1[0] = base_node(-1.,-1., 0.); - nodes1[1] = base_node( 1.,-1., 0.); - nodes1[2] = base_node(-1., 1., 0.); - nodes1[3] = base_node( 1., 1., 0.); - nodes1[4] = base_node( 0., 0., 1.); - nodes1[5] = nodes1[6] = nodes1[7] = nodes1[4]; - nodes2[ip1] = nodes1[0]; - other_nodes.push_back(4); - other_nodes.push_back(3); - other_nodes.push_back(2); - other_nodes.push_back(1); + ip2 = ip1 = 0; + nodes1[0] = base_node(-1.,-1., 0.); + nodes1[1] = base_node( 1.,-1., 0.); + nodes1[2] = base_node(-1., 1., 0.); + nodes1[3] = base_node( 1., 1., 0.); + nodes1[4] = base_node( 0., 0., 1.); + nodes1[5] = nodes1[6] = nodes1[7] = nodes1[4]; + nodes2[ip1] = nodes1[0]; + other_nodes.push_back(4); + other_nodes.push_back(3); + other_nodes.push_back(2); + other_nodes.push_back(1); } for (size_type i = 0; i <= nodes2.size()-1; ++i) - if (i != ip1 && i != ip2) { - GMM_ASSERT3(!other_nodes.empty(), ""); - nodes2[i] = nodes1[other_nodes.back()]; - other_nodes.pop_back(); - } + if (i != ip1 && i != ip2) { + GMM_ASSERT3(!other_nodes.empty(), ""); + nodes2[i] = nodes1[other_nodes.back()]; + other_nodes.pop_back(); + } - base_matrix G1, G2, G3; + base_matrix G1, G2, G3; base_matrix K(N, N), grad(N, N), K3(N, N), K4(N, N); base_node normal1(N), normal2(N); bgeot::geotrans_inv_convex gic(nodes2, pgt2); scalar_type J1, J2, J3(1), J4(1); - + bgeot::vectors_to_base_matrix(G1, nodes1); bgeot::vectors_to_base_matrix(G2, nodes2); for (size_type nc = 0; nc < 2; ++nc) { - - if (what == TETRA_CYL) { - if (nc == 1) nodes3[0] = nodes1[3]; - bgeot::vectors_to_base_matrix(G3, nodes3); - pgt3->poly_vector_grad(nodes1[0], grad); - gmm::mult(gmm::transposed(grad), gmm::transposed(G3), K3); - J3 = gmm::abs(gmm::lu_inverse(K3)); /* = 1 */ - } - - for (size_type i=0; i < base_im->nb_points(); ++i) { - - gmm::copy(gmm::identity_matrix(), K4); J4 = J1 = scalar_type(1); - - size_type fp = size_type(-1); // Search the face number in the - if (i >= base_im->nb_points_on_convex()) { // original element - size_type ii = i - base_im->nb_points_on_convex(); - for (short_type ff=0; ff < base_im->structure()->nb_faces(); ++ff) { - if (ii < base_im->nb_points_on_face(ff)) { fp = ff; break; } - else ii -= base_im->nb_points_on_face(ff); - } - normal1 = base_im->ref_convex()->normals()[fp]; - } - - base_node P = base_im->point(i); - if (what == TETRA_CYL) { - P = pgt3->transform(P, nodes3); - scalar_type x = P[0], y = P[1], one_minus_z = 1.0 - P[2]; - K4(0, 1) = - y / one_minus_z; - K4(1, 1) = 1.0 - x / one_minus_z; - K4(2, 1) = - x * y / gmm::sqr(one_minus_z); - J4 = gmm::abs(gmm::lu_det(K4)); - P[1] *= (1.0 - x / one_minus_z); - } - if (what == PRISM2) { - scalar_type x = P[0], y = P[1], one_minus_z = 1.0 - P[2]; - K4(0,0) = one_minus_z; K4(2,0) = -x; - K4(1,1) = one_minus_z; K4(2,1) = -y; - J4 = gmm::abs(gmm::lu_det(K4)); - P[0] *= one_minus_z; - P[1] *= one_minus_z; - } - - base_node P1 = pgt1->transform(P, nodes1), P2(N); - pgt1->poly_vector_grad(P, grad); - gmm::mult(gmm::transposed(grad), gmm::transposed(G1), K); - J1 = gmm::abs(gmm::lu_det(K)) * J3 * J4; - - if (fp != size_type(-1) && J1 > 1E-10 && J4 > 1E-10) { - if (what == TETRA_CYL) { - gmm::mult(K3, normal1, normal2); - normal1 = normal2; - } - gmm::lu_inverse(K4); - gmm::lu_inverse(K); - gmm::mult(K4, normal1, normal2); - gmm::mult(K, normal2, normal1); - normal2 = normal1; - J1 *= gmm::vect_norm2(normal2); - normal2 /= gmm::vect_norm2(normal2); - } - gic.invert(P1, P2); - GMM_ASSERT1(pgt2->convex_ref()->is_in(P2) < 1E-8, - "Point not in the convex ref : " << P2); - - pgt2->poly_vector_grad(P2, grad); - gmm::mult(gmm::transposed(grad), gmm::transposed(G2), K); - J2 = gmm::abs(gmm::lu_det(K)); /* = 1 */ - - if (i < base_im->nb_points_on_convex()) - add_point(P2, base_im->coeff(i)*J1/J2, short_type(-1)); - else if (J1 > 1E-10) { - short_type f = short_type(-1); - for (short_type ff = 0; ff <= N; ++ff) - if (gmm::abs(pgt2->convex_ref()->is_in_face(ff, P2)) < 1E-8) { - GMM_ASSERT1(f == short_type(-1), - "An integration point is common to two faces"); - f = ff; - } - if (f != short_type(-1)) { - gmm::mult(K, normal2, normal1); - add_point(P2,base_im->coeff(i)*J1*gmm::vect_norm2(normal1)/J2,f); - } - // else { cout << "Point " << P2 << " eliminated" << endl; } - } - } - if (what != TETRA_CYL) break; + + if (what == TETRA_CYL) { + if (nc == 1) nodes3[0] = nodes1[3]; + bgeot::vectors_to_base_matrix(G3, nodes3); + pgt3->poly_vector_grad(nodes1[0], grad); + gmm::mult(gmm::transposed(grad), gmm::transposed(G3), K3); + J3 = gmm::abs(gmm::lu_inverse(K3)); /* = 1 */ + } + + for (size_type i=0; i < base_im->nb_points(); ++i) { + + gmm::copy(gmm::identity_matrix(), K4); J4 = J1 = scalar_type(1); + + size_type fp = size_type(-1); // Search the face number in the + if (i >= base_im->nb_points_on_convex()) { // original element + size_type ii = i - base_im->nb_points_on_convex(); + for (short_type ff=0; ff < base_im->structure()->nb_faces(); ++ff) { + if (ii < base_im->nb_points_on_face(ff)) { fp = ff; break; } + else ii -= base_im->nb_points_on_face(ff); + } + normal1 = base_im->ref_convex()->normals()[fp]; + } + + base_node P = base_im->point(i); + if (what == TETRA_CYL) { + P = pgt3->transform(P, nodes3); + scalar_type x = P[0], y = P[1], one_minus_z = 1.0 - P[2]; + K4(0, 1) = - y / one_minus_z; + K4(1, 1) = 1.0 - x / one_minus_z; + K4(2, 1) = - x * y / gmm::sqr(one_minus_z); + J4 = gmm::abs(gmm::lu_det(K4)); + P[1] *= (1.0 - x / one_minus_z); + } + if (what == PRISM2) { + scalar_type x = P[0], y = P[1], one_minus_z = 1.0 - P[2]; + K4(0,0) = one_minus_z; K4(2,0) = -x; + K4(1,1) = one_minus_z; K4(2,1) = -y; + J4 = gmm::abs(gmm::lu_det(K4)); + P[0] *= one_minus_z; + P[1] *= one_minus_z; + } + + base_node P1 = pgt1->transform(P, nodes1), P2(N); + pgt1->poly_vector_grad(P, grad); + gmm::mult(gmm::transposed(grad), gmm::transposed(G1), K); + J1 = gmm::abs(gmm::lu_det(K)) * J3 * J4; + + if (fp != size_type(-1) && J1 > 1E-10 && J4 > 1E-10) { + if (what == TETRA_CYL) { + gmm::mult(K3, normal1, normal2); + normal1 = normal2; + } + gmm::lu_inverse(K4); + gmm::lu_inverse(K); + gmm::mult(K4, normal1, normal2); + gmm::mult(K, normal2, normal1); + normal2 = normal1; + J1 *= gmm::vect_norm2(normal2); + normal2 /= gmm::vect_norm2(normal2); + } + gic.invert(P1, P2); + GMM_ASSERT1(pgt2->convex_ref()->is_in(P2) < 1E-8, + "Point not in the convex ref : " << P2); + + pgt2->poly_vector_grad(P2, grad); + gmm::mult(gmm::transposed(grad), gmm::transposed(G2), K); + J2 = gmm::abs(gmm::lu_det(K)); /* = 1 */ + + if (i < base_im->nb_points_on_convex()) + add_point(P2, base_im->coeff(i)*J1/J2, short_type(-1)); + else if (J1 > 1E-10) { + short_type f = short_type(-1); + for (short_type ff = 0; ff <= N; ++ff) + if (gmm::abs(pgt2->convex_ref()->is_in_face(ff, P2)) < 1E-8) { + GMM_ASSERT1(f == short_type(-1), + "An integration point is common to two faces"); + f = ff; + } + if (f != short_type(-1)) { + gmm::mult(K, normal2, normal1); + add_point(P2,base_im->coeff(i)*J1*gmm::vect_norm2(normal1)/J2,f); + } + // else { cout << "Point " << P2 << " eliminated" << endl; } + } + } + if (what != TETRA_CYL) break; } valid_method(); } }; - static pintegration_method quasi_polar(im_param_list ¶ms, - std::vector<dal::pstatic_stored_object> &dependencies) { + static pintegration_method + quasi_polar(im_param_list ¶ms, + std::vector<dal::pstatic_stored_object> &dependencies) { GMM_ASSERT1(params.size() >= 1 && params[0].type() == 1, - "Bad parameters for quasi polar integration: the first " - "parameter should be an integration method"); + "Bad parameters for quasi polar integration: the first " + "parameter should be an integration method"); pintegration_method a = params[0].method(); GMM_ASSERT1(a->type()==IM_APPROX,"need an approximate integration method"); int ip1 = 0, ip2 = 0; @@ -1027,31 +1040,32 @@ namespace getfem { GMM_ASSERT1(params.size() == 1, "Bad number of parameters"); } else { GMM_ASSERT1(params.size() == 2 || params.size() == 3, - "Bad number of parameters : " << params.size() - << " should be 2 or 3."); + "Bad number of parameters : " << params.size() + << " should be 2 or 3."); GMM_ASSERT1(params[1].type() == 0 - && params.back().type() == 0, "Bad type of parameters"); + && params.back().type() == 0, "Bad type of parameters"); ip1 = int(::floor(params[1].num() + 0.01)); ip2 = int(::floor(params.back().num() + 0.01)); } int N = a->approx_method()->dim(); GMM_ASSERT1(N >= 2 && N <= 3 && ip1 >= 0 && ip2 >= 0 && ip1 <= N - && ip2 <= N, "Bad parameters"); + && ip2 <= N, "Bad parameters"); papprox_integration pai = std::make_shared<quasi_polar_integration>(a->approx_method(), - ip1, ip2); + ip1, ip2); pintegration_method p = std::make_shared<integration_method>(pai); dependencies.push_back(p->approx_method()->ref_convex()); dependencies.push_back(p->approx_method()->pintegration_points()); return p; } - static pintegration_method pyramid(im_param_list ¶ms, - std::vector<dal::pstatic_stored_object> &dependencies) { + static pintegration_method + pyramid(im_param_list ¶ms, + std::vector<dal::pstatic_stored_object> &dependencies) { GMM_ASSERT1(params.size() == 1 && params[0].type() == 1, - "Bad parameters for pyramid integration: the first " - "parameter should be an integration method"); + "Bad parameters for pyramid integration: the first " + "parameter should be an integration method"); pintegration_method a = params[0].method(); GMM_ASSERT1(a->type()==IM_APPROX,"need an approximate integration method"); int N = a->approx_method()->dim(); @@ -1071,8 +1085,9 @@ namespace getfem { /* Naming system */ /* ******************************************************************** */ - pintegration_method structured_composite_int_method(im_param_list &, - std::vector<dal::pstatic_stored_object> &); + pintegration_method + structured_composite_int_method(im_param_list &, + std::vector<dal::pstatic_stored_object> &); pintegration_method HCT_composite_int_method(im_param_list ¶ms, std::vector<dal::pstatic_stored_object> &dependencies); @@ -1109,7 +1124,7 @@ namespace getfem { }; pintegration_method int_method_descriptor(std::string name, - bool throw_if_not_found) { + bool throw_if_not_found) { size_type i = 0; return dal::singleton<im_naming_system>::instance().method (name, i, throw_if_not_found); @@ -1122,13 +1137,13 @@ namespace getfem { // allows the add of an integration method. void add_integration_name(std::string name, - dal::naming_system<integration_method>::pfunction f) { + dal::naming_system<integration_method>::pfunction f) { dal::singleton<im_naming_system>::instance().add_suffix(name, f); } /* Fonctions pour la ref. directe. */ - + pintegration_method exact_simplex_im(size_type n) { DEFINE_STATIC_THREAD_LOCAL_INITIALIZED(pintegration_method, pim, 0); DEFINE_STATIC_THREAD_LOCAL_INITIALIZED(size_type, d, -2); @@ -1186,20 +1201,20 @@ namespace getfem { if (nbp == n+1) if (cvs == bgeot::simplex_structure(dim_type(n))) - { name << "IM_EXACT_SIMPLEX("; found = true; } - + { name << "IM_EXACT_SIMPLEX("; found = true; } + /* Identifying Q1-parallelepiped. */ if (!found && nbp == (size_type(1) << n)) if (cvs == bgeot::parallelepiped_structure(dim_type(n))) - { name << "IM_EXACT_PARALLELEPIPED("; found = true; } + { name << "IM_EXACT_PARALLELEPIPED("; found = true; } /* Identifying Q1-prisms. */ - + if (!found && nbp == 2 * n) if (cvs == bgeot::prism_structure(dim_type(n))) - { name << "IM_EXACT_PRISM("; found = true; } - + { name << "IM_EXACT_PRISM("; found = true; } + // To be completed if (found) { @@ -1208,7 +1223,7 @@ namespace getfem { cvs_last = cvs; return im_last; } - + GMM_ASSERT1(false, "This element is not taken into account. Contact us"); } @@ -1247,7 +1262,7 @@ namespace getfem { << " of degree >= " << int(degree)); } else if (cvs->is_product(&a,&b) || (bgeot::basic_structure(cvs).get() && bgeot::basic_structure(cvs)->is_product(&a,&b))) { - name << "IM_PRODUCT(" + name << "IM_PRODUCT(" << name_of_int_method(classical_approx_im_(a,degree)) << "," << name_of_int_method(classical_approx_im_(b,degree)) << ")"; } else GMM_ASSERT1(false, "unknown convex structure!"); @@ -1255,7 +1270,7 @@ namespace getfem { } pintegration_method classical_approx_im(bgeot::pgeometric_trans pgt, - dim_type degree) { + dim_type degree) { DEFINE_STATIC_THREAD_LOCAL_INITIALIZED(bgeot::pgeometric_trans, pgt_last, 0); DEFINE_STATIC_THREAD_LOCAL(dim_type, degree_last); DEFINE_STATIC_THREAD_LOCAL_INITIALIZED(pintegration_method, im_last, 0); @@ -1267,13 +1282,13 @@ namespace getfem { return im_last; } - pintegration_method im_none(void) { + pintegration_method im_none() { DEFINE_STATIC_THREAD_LOCAL_INITIALIZED(pintegration_method,im_last,0); if (!im_last) im_last = int_method_descriptor("IM_NONE"); return im_last; } - /* try to integrate all monomials up to order 'order' and return the + /* try to integrate all monomials up to order 'order' and return the max. error */ scalar_type test_integration_error(papprox_integration pim, dim_type order) { short_type dim = pim->dim(); @@ -1282,10 +1297,10 @@ namespace getfem { for (bgeot::power_index idx(dim); idx.degree() <= order; ++idx) { opt_long_scalar_type sum(0), realsum; for (size_type i=0; i < pim->nb_points_on_convex(); ++i) { - opt_long_scalar_type prod = pim->coeff(i); - for (size_type d=0; d < dim; ++d) - prod *= pow(opt_long_scalar_type(pim->point(i)[d]), idx[d]); - sum += prod; + opt_long_scalar_type prod = pim->coeff(i); + for (size_type d=0; d < dim; ++d) + prod *= pow(opt_long_scalar_type(pim->point(i)[d]), idx[d]); + sum += prod; } realsum = exact->exact_method()->int_monomial(idx); error = std::max(error, gmm::abs(realsum-sum)); @@ -1295,7 +1310,7 @@ namespace getfem { papprox_integration get_approx_im_or_fail(pintegration_method pim) { GMM_ASSERT1(pim->type() == IM_APPROX, "error estimate work only with " - "approximate integration methods"); + "approximate integration methods"); return pim->approx_method(); } diff --git a/src/getfem_mesh.cc b/src/getfem_mesh.cc index caeb31d..84a21d5 100644 --- a/src/getfem_mesh.cc +++ b/src/getfem_mesh.cc @@ -299,8 +299,8 @@ namespace getfem { } size_type mesh::add_pyramid(size_type a, size_type b, - size_type c, size_type d, size_type e) { - size_type ipt[5]; ipt[0] = a; ipt[1] = b; ipt[2] = c; ipt[3] = d; ipt[4] = e; + size_type c, size_type d, size_type e) { + size_type ipt[5] = {a, b, c, d, e}; return add_convex(bgeot::pyramidal_geotrans(1), &(ipt[0])); } diff --git a/src/getfem_mesh_fem.cc b/src/getfem_mesh_fem.cc index c3b4927..0816453 100644 --- a/src/getfem_mesh_fem.cc +++ b/src/getfem_mesh_fem.cc @@ -143,20 +143,20 @@ namespace getfem { " and target_dim " << int(pf->target_dim()) << " of " << name_of_fem(pf)); - + if (cv == f_elems.size()) { - f_elems.push_back(pf); - fe_convex.add(cv); - dof_enumeration_made = false; + f_elems.push_back(pf); + fe_convex.add(cv); + dof_enumeration_made = false; touch(); v_num = act_counter(); } else { - if (cv > f_elems.size()) f_elems.resize(cv+1); - if (!fe_convex.is_in(cv) || f_elems[cv] != pf) { - fe_convex.add(cv); - f_elems[cv] = pf; - dof_enumeration_made = false; - touch(); v_num = act_counter(); - } + if (cv > f_elems.size()) f_elems.resize(cv+1); + if (!fe_convex.is_in(cv) || f_elems[cv] != pf) { + fe_convex.add(cv); + f_elems[cv] = pf; + dof_enumeration_made = false; + touch(); v_num = act_counter(); + } } } } @@ -335,7 +335,7 @@ namespace getfem { // Information for global dof dal::bit_vector encountered_global_dof, processed_elt; dal::dynamic_array<size_type> ind_global_dof; - + // Auxilliary variables std::vector<size_type> itab; base_node P(linked_mesh().dim()); @@ -349,25 +349,25 @@ namespace getfem { bgeot::pgeotrans_precomp pgp = 0; for (dal::bv_visitor cv(linked_mesh().convex_index()); - !cv.finished(); ++cv) { + !cv.finished(); ++cv) { if (fe_convex.is_in(cv)) { - gmm::copy(linked_mesh().points_of_convex(cv)[0], bmin); - gmm::copy(bmin, bmax); - for (size_type i = 0; i < linked_mesh().nb_points_of_convex(cv); ++i) { - const base_node &pt = linked_mesh().points_of_convex(cv)[i]; - for (size_type d = 1; d < bmin.size(); ++d) { - bmin[d] = std::min(bmin[d], pt[d]); - bmax[d] = std::max(bmax[d], pt[d]); - } - } - elt_car_sizes[cv] = gmm::vect_dist2_sqr(bmin, bmax); + gmm::copy(linked_mesh().points_of_convex(cv)[0], bmin); + gmm::copy(bmin, bmax); + for (size_type i = 0; i < linked_mesh().nb_points_of_convex(cv); ++i) { + const base_node &pt = linked_mesh().points_of_convex(cv)[i]; + for (size_type d = 1; d < bmin.size(); ++d) { + bmin[d] = std::min(bmin[d], pt[d]); + bmax[d] = std::max(bmax[d], pt[d]); + } + } + elt_car_sizes[cv] = gmm::vect_dist2_sqr(bmin, bmax); } } dal::bit_vector cv_done; - + for (dal::bv_visitor cv(linked_mesh().convex_index()); - !cv.finished(); ++cv) { // Loop on elements + !cv.finished(); ++cv) { // Loop on elements if (!fe_convex.is_in(cv)) continue; pfem pf = fem_of_element(cv); if (pf != first_pf) is_uniform_ = false; @@ -400,34 +400,34 @@ namespace getfem { pgp->transform(linked_mesh().points_of_convex(cv), i, P); size_type idof = nbdof; - if (dof_nodes[cv].nb_points() > 0) { - scalar_type dist = dof_nodes[cv].nearest_neighbor(ipt, P); - if (gmm::abs(dist) <= 1e-6*elt_car_sizes[cv]) { - fd.ind_node=ipt.i; - auto it = dof_sorts[cv].find(fd); - if (it != dof_sorts[cv].end()) idof = it->second; - } - } - + if (dof_nodes[cv].nb_points() > 0) { + scalar_type dist = dof_nodes[cv].nearest_neighbor(ipt, P); + if (gmm::abs(dist) <= 1e-6*elt_car_sizes[cv]) { + fd.ind_node=ipt.i; + auto it = dof_sorts[cv].find(fd); + if (it != dof_sorts[cv].end()) idof = it->second; + } + } + if (idof == nbdof) { - nbdof += Qdim / pf->target_dim(); - - linked_mesh().neighbours_of_convex(cv, pf->faces_of_dof(cv, i), s); - for (size_type ncv : s) { // For each unscanned neighbour - if (!cv_done[ncv] && fe_convex.is_in(ncv)) { // add the dof - - fd.ind_node = size_type(-1); - if (dof_nodes[ncv].nb_points() > 0) { - scalar_type dist = dof_nodes[ncv].nearest_neighbor(ipt, P); - if (gmm::abs(dist) <= 1e-6*elt_car_sizes[ncv]) - fd.ind_node=ipt.i; - } - if (fd.ind_node == size_type(-1)) - fd.ind_node = dof_nodes[ncv].add_point(P); - dof_sorts[ncv][fd] = idof; - } - } - } + nbdof += Qdim / pf->target_dim(); + + linked_mesh().neighbours_of_convex(cv, pf->faces_of_dof(cv, i), s); + for (size_type ncv : s) { // For each unscanned neighbour + if (!cv_done[ncv] && fe_convex.is_in(ncv)) { // add the dof + + fd.ind_node = size_type(-1); + if (dof_nodes[ncv].nb_points() > 0) { + scalar_type dist = dof_nodes[ncv].nearest_neighbor(ipt, P); + if (gmm::abs(dist) <= 1e-6*elt_car_sizes[ncv]) + fd.ind_node=ipt.i; + } + if (fd.ind_node == size_type(-1)) + fd.ind_node = dof_nodes[ncv].add_point(P); + dof_sorts[ncv][fd] = idof; + } + } + } itab[i] = idof; } } @@ -571,8 +571,8 @@ namespace getfem { } else if (bgeot::casecmp(tmp, "DOF_ENUMERATION") == 0) { dal::bit_vector doflst; dof_structure.clear(); dof_enumeration_made = false; - is_uniform_ = true; - size_type nbdof_unif = size_type(-1); + is_uniform_ = true; + size_type nbdof_unif = size_type(-1); touch(); v_num = act_counter(); while (true) { bgeot::get_token(ist, tmp); @@ -585,11 +585,11 @@ namespace getfem { std::vector<size_type> tab; if (convex_index().is_in(ic) && tmp.size() && isdigit(tmp[0]) && tmp2 == ":") { - size_type nbd = nb_basic_dof_of_element(ic); - if (nbdof_unif == size_type(-1)) - nbdof_unif = nbd; - else if (nbdof_unif != nbd) - is_uniform_ = false; + size_type nbd = nb_basic_dof_of_element(ic); + if (nbdof_unif == size_type(-1)) + nbdof_unif = nbd; + else if (nbdof_unif != nbd) + is_uniform_ = false; tab.resize(nb_basic_dof_of_element(ic)); for (size_type i=0; i < fem_of_element(ic)->nb_dof(ic); i++) {