[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Getfem-commits] (no subject)
From: |
Konstantinos Poulios |
Subject: |
[Getfem-commits] (no subject) |
Date: |
Sun, 6 Aug 2017 19:19:48 -0400 (EDT) |
branch: devel-logari81
commit 26f216c888fbd0edf13953fe2c6ad8012327f02a
Author: Konstantinos Poulios <address@hidden>
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++) {