getfem-commits
[Top][All Lists]
Advanced

[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: Thu, 20 Dec 2018 03:46:29 -0500 (EST)

branch: integration-point-variables
commit 14147e6bcbec3a69e92f04f5f521eefc65e873a2
Author: Konstantinos Poulios <address@hidden>
Date:   Thu Dec 20 01:46:38 2018 +0100

    Code cleanup
---
 interface/src/gf_asm.cc                         |   4 +-
 src/getfem/getfem_generic_assembly.h            |  10 +-
 src/getfem_generic_assembly_compile_and_exec.cc |  97 ++--
 src/getfem_generic_assembly_semantic.cc         |   7 +-
 src/getfem_generic_assembly_tree.cc             | 663 ++++++++++++------------
 src/getfem_generic_assembly_workspace.cc        |   7 +-
 src/getfem_mesh.cc                              |   2 +-
 src/getfem_models.cc                            |  54 +-
 8 files changed, 420 insertions(+), 424 deletions(-)

diff --git a/interface/src/gf_asm.cc b/interface/src/gf_asm.cc
index 42416af..2bf431a 100644
--- a/interface/src/gf_asm.cc
+++ b/interface/src/gf_asm.cc
@@ -799,9 +799,9 @@ void gf_asm(getfemint::mexargs_in& m_in, 
getfemint::mexargs_out& m_out) {
       functions are only available for variables, not for constants.
 
       `select_output` is an optional parameter which allows to reduce the
-      output vecotr (for `order` equal to 1) or the matrix (for `order`
+      output vector (for `order` equal to 1) or the matrix (for `order`
       equal to 2) to the degrees of freedom of the specified variables.
-      One variable has to be specified for a vector ouptut and two for a
+      One variable has to be specified for a vector output and two for a
       matrix output.
 
       Note that if several variables are given, the assembly of the
diff --git a/src/getfem/getfem_generic_assembly.h 
b/src/getfem/getfem_generic_assembly.h
index 265ba11..9468406 100644
--- a/src/getfem/getfem_generic_assembly.h
+++ b/src/getfem/getfem_generic_assembly.h
@@ -287,16 +287,18 @@ namespace getfem {
       }
 
       var_description(bool is_var, bool is_fem,
-                      const mesh_fem *mmf, gmm::sub_interval I_,
+                      const mesh_fem *mf_, gmm::sub_interval I_,
                       const model_real_plain_vector *v, const im_data *imd_,
                       size_type Q)
-        : is_variable(is_var), is_fem_dofs(is_fem), mf(mmf), I(I_), V(v),
-          imd(imd_), qdims(1) {
+        : is_variable(is_var), is_fem_dofs(is_fem), mf(mf_), I(I_), V(v),
+          imd(imd_), qdims(1)
+      {
         GMM_ASSERT1(Q > 0, "Bad dimension");
         qdims[0] = Q;
       }
       var_description() : is_variable(false), is_fem_dofs(false),
-                          mf(0), V(0), imd(0), qdims(1) { qdims[0] = 1; }
+                          mf(0), V(0), imd(0), qdims(1)
+      { qdims[0] = 1; }
     };
 
   public:
diff --git a/src/getfem_generic_assembly_compile_and_exec.cc 
b/src/getfem_generic_assembly_compile_and_exec.cc
index baaa936..243d409 100644
--- a/src/getfem_generic_assembly_compile_and_exec.cc
+++ b/src/getfem_generic_assembly_compile_and_exec.cc
@@ -220,6 +220,7 @@ namespace getfem {
       size_type s1 = pf1->nb_dof(cv_1) * Qmult1;
       size_type Qmult2 = qdim2 / pf2->target_dim();
       size_type s2 = pf2->nb_dof(cv_2) * Qmult2;
+      GMM_ASSERT1(s1 > 0 && s2 >0, "Element without degrees of freedom");
       if (t.sizes()[0] != s1 || t.sizes()[1] != s2) {
         bgeot::multi_index mi = t.sizes();
         mi[0] = s1; mi[1] = s2;
@@ -3378,15 +3379,16 @@ namespace getfem {
 
   // Performs Aij Bkl -> Cijkl, partially unrolled version
   template<int S1> struct ga_instruction_simple_tmult_unrolled
-    : public ga_instruction {
+  : public ga_instruction {
     base_tensor &t, &tc1, &tc2;
     virtual int exec() {
       size_type s2 = tc2.size();
+      GA_DEBUG_ASSERT(tc1.size() == S1,
+                      "Wrong sizes " << tc1.size() << " != " << S1);
       GA_DEBUG_INFO("Instruction: simple tensor product, unrolled with "
-                    << tc1.size() << " operations");
-      GA_DEBUG_ASSERT(t.size() == tc1.size() * s2, "Wrong sizes");
-      GA_DEBUG_ASSERT(tc1.size() == S1, "Wrong sizes");
-
+                    << S1 << " operations");
+      GA_DEBUG_ASSERT(t.size() == S1 * s2,
+                      "Wrong sizes " << t.size() << " != " << S1 << "*" << s2);
       base_tensor::iterator it = t.begin(), it2 = tc2.begin();
       for (size_type ii = 0; ii < s2; ++ii, ++it2) {
         base_tensor::iterator it1 = tc1.begin();
@@ -3987,7 +3989,7 @@ namespace getfem {
 
 
   struct ga_instruction_scalar_assembly : public ga_instruction {
-    base_tensor &t;
+    const base_tensor &t;
     scalar_type &E, &coeff;
      virtual int exec() {
       GA_DEBUG_INFO("Instruction: scalar term assembly");
@@ -4000,7 +4002,7 @@ namespace getfem {
   };
 
   struct ga_instruction_fem_vector_assembly : public ga_instruction {
-    base_tensor &t;
+    const base_tensor &t;
     base_vector &Vr, &Vn;
     const fem_interpolation_context &ctx;
     const gmm::sub_interval &Ir, &In;
@@ -4016,7 +4018,9 @@ namespace getfem {
         if (empty_weight) elem.resize(0);
         elem.resize(t.size());
         if (!empty_weight) {
-          auto itt = t.begin(); auto it = elem.begin(), ite = elem.end();
+          auto itt = t.begin();
+          auto it = elem.begin();
+          const auto ite = elem.end();
           size_type nd = ((t.size()) >> 2);
           for (size_type i = 0; i < nd; ++i) {
             *it++ = (*itt++) * coeff; *it++ = (*itt++) * coeff;
@@ -4025,7 +4029,9 @@ namespace getfem {
           for (; it != ite;) *it++ = (*itt++) * coeff;
         }
       } else if (!empty_weight) {
-        auto itt = t.begin(); auto it = elem.begin(), ite = elem.end();
+        auto itt = t.begin();
+        auto it = elem.begin();
+        const auto ite = elem.end();
         size_type nd = ((t.size()) >> 2);
         for (size_type i = 0; i < nd; ++i) {
           *it++ += (*itt++) * coeff; *it++ += (*itt++) * coeff;
@@ -4058,7 +4064,7 @@ namespace getfem {
       return 0;
     }
     ga_instruction_fem_vector_assembly
-    (base_tensor &t_, base_vector &Vr_, base_vector &Vn_,
+    (const base_tensor &t_, base_vector &Vr_, base_vector &Vn_,
      const fem_interpolation_context &ctx_,
      const gmm::sub_interval &Ir_, const gmm::sub_interval &In_,
      const mesh_fem *mfn_, const mesh_fem **mfg_,
@@ -4074,7 +4080,7 @@ namespace getfem {
     base_vector &V;
     const gmm::sub_interval &I;
     scalar_type &coeff;
-     virtual int exec() {
+    virtual int exec() {
       GA_DEBUG_INFO("Instruction: vector term assembly for "
                     "fixed size variable");
       gmm::add(gmm::scaled(t.as_vector(), coeff), gmm::sub_vector(V, I));
@@ -4268,7 +4274,7 @@ namespace getfem {
           } else {
             for (auto itt = ct1.begin(); itt != ct1.end(); ++itt)
               for (size_type q = 0; q < qmult1; ++q)
-                  *itd++ += *itt + q;
+                *itd++ += *itt + q;
           }
         } else
           for (size_type i=0; i < s1; ++i) dofs1[i] += i;
@@ -4712,9 +4718,9 @@ namespace getfem {
     } else {
       if (gis.var_intervals.find(varname) == gis.var_intervals.end()) {
         const mesh_fem *mf = workspace.associated_mf(varname);
-        size_type nd = mf ? mf->nb_basic_dof() :
-          gmm::vect_size(workspace.value(varname));
-        gis.var_intervals[varname]=gmm::sub_interval(gis.nb_dof, nd);
+        size_type nd = mf ? mf->nb_basic_dof()
+                          : gmm::vect_size(workspace.value(varname));
+        gis.var_intervals[varname] = gmm::sub_interval(gis.nb_dof, nd);
         gis.nb_dof += nd;
       }
       gis.max_dof = std::max(gis.max_dof,
@@ -6696,7 +6702,7 @@ namespace getfem {
         if ((version == td.interpolation) &&
             ((version == 0 && td.order == order) || // Assembly
              ((version > 0 && (td.order == size_type(-1) || // Assignment
-                                td.order == size_type(-2) - order))))) {
+                               td.order == size_type(-2) - order))))) {
           ga_tree *added_tree = 0;
           if (td.interpolation) {
             gis.interpolation_trees.push_back(*(td.ptree));
@@ -6756,14 +6762,14 @@ namespace getfem {
                               "Invalid vector or tensor quantity. An order 1 "
                               "weak form has to be a scalar quantity");
                   const mesh_fem *mf=workspace.associated_mf(root->name_test1);
-                  const mesh_fem **mfg = 0;
                   add_interval_to_gis(workspace, root->name_test1, gis);
 
                   if (mf) {
-                    const std::string &intn1 = root->interpolate_name_test1;
+                    const mesh_fem **mfg = 0;
                     const gmm::sub_interval *Ir = 0, *In = 0;
+                    const std::string &intn1 = root->interpolate_name_test1;
                     bool secondary = intn1.size() &&
-                      workspace.secondary_domain_exists(intn1);
+                                     workspace.secondary_domain_exists(intn1);
                     if (intn1.size() && !secondary &&
                         workspace.variable_group_exists(root->name_test1)) {
                       ga_instruction_set::variable_group_info &vgi =
@@ -6778,12 +6784,13 @@ namespace getfem {
                       In = &(workspace.interval_of_variable(root->name_test1));
                     }
                     fem_interpolation_context &ctx
-                      = intn1.size() ?
-                      (secondary ? rmi.secondary_domain_infos.ctx
-                       : rmi.interpolate_infos[intn1].ctx) : gis.ctx;
-                    bool interpolate
-                      = (!intn1.empty() && intn1.compare("neighbour_elt")!=0 &&
-                         !secondary);
+                      = intn1.size()
+                      ? (secondary ? rmi.secondary_domain_infos.ctx
+                                   : rmi.interpolate_infos[intn1].ctx)
+                      : gis.ctx;
+                    bool interpolate = !(intn1.empty() ||
+                                         intn1 == "neighbour_elt" ||
+                                         secondary);
                     pgai = std::make_shared<ga_instruction_fem_vector_assembly>
                       (root->tensor(), workspace.unreduced_vector(),
                        workspace.assembled_vector(), ctx, *Ir, *In, mf, mfg,
@@ -6810,19 +6817,19 @@ namespace getfem {
                       workspace.secondary_domain_exists(intn1);
                   bool secondary2 = intn2.size() &&
                       workspace.secondary_domain_exists(intn2);
-                  fem_interpolation_context &ctx1
-                      = intn1.size() ?
-                      (secondary1 ? rmi.secondary_domain_infos.ctx
-                       : rmi.interpolate_infos[intn1].ctx) : gis.ctx;
-                  fem_interpolation_context &ctx2
-                      = intn2.size() ?
-                      (secondary2 ? rmi.secondary_domain_infos.ctx
-                       : rmi.interpolate_infos[intn2].ctx) : gis.ctx;
-                  bool interpolate
-                    = (!intn1.empty() && intn1.compare("neighbour_elt")!=0 &&
-                       !secondary1) ||
-                    (!intn2.empty() && intn2.compare("neighbour_elt")!=0 &&
-                     !secondary2);
+                  fem_interpolation_context
+                    &ctx1 = intn1.size()
+                          ? (secondary1 ? rmi.secondary_domain_infos.ctx
+                                        : rmi.interpolate_infos[intn1].ctx)
+                          : gis.ctx,
+                    &ctx2 = intn2.size()
+                          ? (secondary2 ? rmi.secondary_domain_infos.ctx
+                                        : rmi.interpolate_infos[intn2].ctx)
+                          : gis.ctx;
+                  bool interpolate = !(intn1.empty() || intn1 == 
"neighbour_elt"
+                                       || secondary1) ||
+                                     !(intn2.empty() || intn2 == 
"neighbour_elt"
+                                       || secondary2);
 
                   add_interval_to_gis(workspace, root->name_test1, gis);
                   add_interval_to_gis(workspace, root->name_test2, gis);
@@ -6862,23 +6869,23 @@ namespace getfem {
                     In2 = &(workspace.interval_of_variable(root->name_test2));
                   }
 
-                  if (!interpolate && mfg1 == 0 && mfg2 == 0 && mf1 && mf2
-                      && mf1->get_qdim() == 1 && mf2->get_qdim() == 1
-                      && !(mf1->is_reduced()) && !(mf2->is_reduced())) {
+                  bool simple = !interpolate &&
+                                mfg1 == 0 && mfg2 == 0 && mf1 && mf2 &&
+                                !(mf1->is_reduced()) && !(mf2->is_reduced());
+                  if (simple && mf1->get_qdim() == 1 && mf2->get_qdim() == 1) {
                     pgai = std::make_shared
                       <ga_instruction_matrix_assembly_standard_scalar<>>
                       (root->tensor(), workspace.assembled_matrix(), ctx1, 
ctx2,
                        *In1, *In2, mf1, mf2,
                        gis.coeff, *alpha1, *alpha2, gis.nbpt, gis.ipt);
-                  } else if (!interpolate && mfg1 == 0 && mfg2==0 && mf1 && mf2
-                             && !(mf1->is_reduced()) && !(mf2->is_reduced())) {
-                    if (root->sparsity() == 10 && root->t.qdim()==2)
+                  } else if (simple) {
+                    if (root->sparsity() == 10 && root->t.qdim() == 2)
                       pgai = std::make_shared
                         
<ga_instruction_matrix_assembly_standard_vector_opt10_2>
                         (root->tensor(), 
workspace.assembled_matrix(),ctx1,ctx2,
                          *In1, *In2, mf1, mf2,
                          gis.coeff, *alpha1, *alpha2, gis.nbpt, gis.ipt);
-                    else if (root->sparsity() == 10 && root->t.qdim()==3)
+                    else if (root->sparsity() == 10 && root->t.qdim() == 3)
                       pgai = std::make_shared
                         
<ga_instruction_matrix_assembly_standard_vector_opt10_3>
                         (root->tensor(), 
workspace.assembled_matrix(),ctx1,ctx2,
diff --git a/src/getfem_generic_assembly_semantic.cc 
b/src/getfem_generic_assembly_semantic.cc
index 956f801..baa422f 100644
--- a/src/getfem_generic_assembly_semantic.cc
+++ b/src/getfem_generic_assembly_semantic.cc
@@ -1764,9 +1764,10 @@ namespace getfem {
             if (n == 1) {
               if (test) {
                 pnode->init_vector_tensor(1);
-                pnode->tensor()[0]=scalar_type(1);
+                pnode->tensor()[0] = scalar_type(1);
               }
-              else pnode->init_scalar_tensor(workspace.value(name)[0]);
+              else
+                pnode->init_scalar_tensor(workspace.value(name)[0]);
             } else {
               if (test) {
                 pnode->init_matrix_tensor(n,n);
@@ -1794,7 +1795,7 @@ namespace getfem {
                                    "Invalid null size of variable " << name);
             if (mii.size() > 6)
               ga_throw_error(pnode->expr, pnode->pos,
-                            "Tensor with too much dimensions. Limited to 6");
+                            "Tensor with too many dimensions. Limited to 6");
 
             switch (prefix_id) {
             case 0: // value
diff --git a/src/getfem_generic_assembly_tree.cc 
b/src/getfem_generic_assembly_tree.cc
index caffa4f..dce3a2e 100644
--- a/src/getfem_generic_assembly_tree.cc
+++ b/src/getfem_generic_assembly_tree.cc
@@ -186,7 +186,7 @@ namespace getfem {
   //=========================================================================
 
   void ga_throw_error_msg(pstring expr, size_type pos,
-                         const std::string &msg) {
+                          const std::string &msg) {
     int length_before = 70, length_after = 70;
     if (expr && expr->size()) {
       int first = std::max(0, int(pos)-length_before);
@@ -218,12 +218,11 @@ namespace getfem {
   void ga_tree_node::mult_test(const pga_tree_node n0, const pga_tree_node n1) 
{
     
     size_type test0 = n0->test_function_type, test1 = n1->test_function_type;
-    if (test0 && test1 && (test0 == test1 ||
-                          test0 >= 3 || test1 >= 3))
+    if (test0 && test1 && (test0 == test1 || test0 >= 3 || test1 >= 3))
       ga_throw_error(expr, pos,
-                    "Incompatibility of test functions in product.");
+                     "Incompatibility of test functions in product.");
     GMM_ASSERT1(test0 != size_type(-1) && test1 != size_type(-1),
-               "internal error");
+                "internal error");
     
     test_function_type = test0 + test1;
     
@@ -288,7 +287,7 @@ namespace getfem {
   }
   
   void ga_tree::add_name(const char *name, size_type length, size_type pos,
-                        pstring expr) {
+                         pstring expr) {
     while (current_node && current_node->node_type != GA_NODE_OP)
       current_node = current_node->parent;
     if (current_node) {
@@ -304,23 +303,23 @@ namespace getfem {
   
   void ga_tree::add_sub_tree(ga_tree &sub_tree) {
     if (current_node &&
-       (current_node->node_type == GA_NODE_PARAMS ||
-        current_node->node_type == GA_NODE_INTERPOLATE_FILTER ||
-        current_node->node_type == GA_NODE_C_MATRIX)) {
+        (current_node->node_type == GA_NODE_PARAMS ||
+         current_node->node_type == GA_NODE_INTERPOLATE_FILTER ||
+         current_node->node_type == GA_NODE_C_MATRIX)) {
       GMM_ASSERT1(sub_tree.root, "Invalid tree operation");
       current_node->adopt_child(sub_tree.root);
     } else {
       GMM_ASSERT1(sub_tree.root, "Invalid tree operation");
       while (current_node && current_node->node_type != GA_NODE_OP)
-       current_node = current_node->parent;
+        current_node = current_node->parent;
       if (current_node) {
-       current_node->adopt_child(sub_tree.root);
-       current_node = sub_tree.root;
+        current_node->adopt_child(sub_tree.root);
+        current_node = sub_tree.root;
       }
       else {
-       GMM_ASSERT1(root == nullptr, "Invalid tree operation");
-       current_node = root = sub_tree.root;
-       root->parent = nullptr;
+        GMM_ASSERT1(root == nullptr, "Invalid tree operation");
+        current_node = root = sub_tree.root;
+        root->parent = nullptr;
       }
     }
     sub_tree.root = sub_tree.current_node = nullptr;
@@ -329,8 +328,8 @@ namespace getfem {
   void ga_tree::add_params(size_type pos, pstring expr) {
     GMM_ASSERT1(current_node, "internal error");
     while (current_node && current_node->parent &&
-          current_node->parent->node_type == GA_NODE_OP &&
-          ga_operator_priorities[current_node->parent->op_type] >= 4)
+           current_node->parent->node_type == GA_NODE_OP &&
+           ga_operator_priorities[current_node->parent->op_type] >= 4)
       current_node = current_node->parent;
     pga_tree_node new_node = new ga_tree_node(GA_NODE_PARAMS, pos, expr);
     new_node->parent = current_node->parent;
@@ -358,26 +357,26 @@ namespace getfem {
   }
   
   void ga_tree::add_op(GA_TOKEN_TYPE op_type, size_type pos,
-                      pstring expr) {
+                       pstring expr) {
     while (current_node && current_node->parent &&
-          current_node->parent->node_type == GA_NODE_OP &&
-          ga_operator_priorities[current_node->parent->op_type]
-          >= ga_operator_priorities[op_type])
+           current_node->parent->node_type == GA_NODE_OP &&
+           ga_operator_priorities[current_node->parent->op_type]
+           >= ga_operator_priorities[op_type])
       current_node = current_node->parent;
     pga_tree_node new_node = new ga_tree_node(op_type, pos, expr);
     if (current_node) {
       if (op_type == GA_UNARY_MINUS
-         || op_type == GA_SYM || op_type == GA_SKEW
-         || op_type == GA_TRACE || op_type == GA_DEVIATOR
-         || op_type == GA_PRINT) {
-       current_node->adopt_child(new_node);
+          || op_type == GA_SYM || op_type == GA_SKEW
+          || op_type == GA_TRACE || op_type == GA_DEVIATOR
+          || op_type == GA_PRINT) {
+        current_node->adopt_child(new_node);
       } else {
-       new_node->parent = current_node->parent;
-       if (current_node->parent)
-         current_node->parent->replace_child(current_node, new_node);
-       else
-         root = new_node;
-       new_node->adopt_child(current_node);
+        new_node->parent = current_node->parent;
+        if (current_node->parent)
+          current_node->parent->replace_child(current_node, new_node);
+        else
+          root = new_node;
+        new_node->adopt_child(current_node);
       }
     } else {
       if (root) new_node->adopt_child(root);
@@ -390,7 +389,7 @@ namespace getfem {
   void ga_tree::clear_node_rec(pga_tree_node pnode) {
     if (pnode) {
       for (pga_tree_node &child : pnode->children)
-       clear_node_rec(child);
+        clear_node_rec(child);
       delete pnode;
       current_node = nullptr;
     }
@@ -400,13 +399,13 @@ namespace getfem {
     if (pnode) {
       pga_tree_node parent = pnode->parent;
       if (parent) { // keep all siblings of pnode
-       size_type j = 0;
-       for (pga_tree_node &sibling : parent->children)
-         if (sibling != pnode)
-           parent->children[j++] = sibling;
-       parent->children.resize(j);
+        size_type j = 0;
+        for (pga_tree_node &sibling : parent->children)
+          if (sibling != pnode)
+            parent->children[j++] = sibling;
+        parent->children.resize(j);
       } else
-       root = nullptr;
+        root = nullptr;
     }
     clear_node_rec(pnode);
   }
@@ -432,7 +431,7 @@ namespace getfem {
   }
   
   void ga_tree::copy_node(pga_tree_node pnode, pga_tree_node parent,
-                         pga_tree_node &child) {
+                          pga_tree_node &child) {
     GMM_ASSERT1(child == nullptr, "Internal error");
     child = new ga_tree_node();
     *child = *pnode;
@@ -444,7 +443,7 @@ namespace getfem {
   }
   
   void ga_tree::duplicate_with_operation(pga_tree_node pnode,
-                                        GA_TOKEN_TYPE op_type) {
+                                         GA_TOKEN_TYPE op_type) {
     pga_tree_node newop = new ga_tree_node(op_type, pnode->pos, pnode->expr);
     newop->children.resize(2, nullptr);
     newop->children[0] = pnode;
@@ -1091,65 +1090,65 @@ namespace getfem {
       GMM_ASSERT1(pnode->nbc1 == pnode->tensor_order(), "Invalid C_MATRIX");
       switch (pnode->tensor_order()) {
       case 0:
-       ga_print_node(pnode->children[0], str);
-       break;
-       
+        ga_print_node(pnode->children[0], str);
+        break;
+
       case 1:
-       str << "[";
-       for (size_type i = 0; i < pnode->tensor_proper_size(0); ++i) {
-         if (i != 0) str << ",";
-         ga_print_node(pnode->children[i], str);
-       }
-       str << "]";
-       break;
-       
+        str << "[";
+        for (size_type i = 0; i < pnode->tensor_proper_size(0); ++i) {
+          if (i != 0) str << ",";
+          ga_print_node(pnode->children[i], str);
+        }
+        str << "]";
+        break;
+
       case 2: case 3: case 4:
-       {
-         size_type ii(0);
-         size_type n0 = pnode->tensor_proper_size(0);
-         size_type n1 = pnode->tensor_proper_size(1);
-         size_type n2 = ((pnode->tensor_order() > 2) ?
-                         pnode->tensor_proper_size(2) : 1);
-         size_type n3 = ((pnode->tensor_order() > 3) ?
-                         pnode->tensor_proper_size(3) : 1);
-         if (n3 > 1) str << "[";
-         for (size_type l = 0; l < n3; ++l) {
-           if (l != 0) str << ",";
-           if (n2 > 1) str << "[";
-           for (size_type k = 0; k < n2; ++k) {
-             if (k != 0) str << ",";
-             if (n1 > 1) str << "[";
-             for (size_type j = 0; j < n1; ++j) {
-               if (j != 0) str << ",";
-               if (n0 > 1) str << "[";
-               for (size_type i = 0; i < n0; ++i) {
-                 if (i != 0) str << ",";
-                 ga_print_node(pnode->children[ii++], str);
-               }
-               if (n0 > 1) str << "]";
-             }
-             if (n1 > 1) str << "]";
-           }
-           if (n2 > 1) str << "]";
-         }
-         if (n3 > 1) str << "]";
-       }
-       break;
-       
+        {
+          size_type ii(0);
+          size_type n0 = pnode->tensor_proper_size(0);
+          size_type n1 = pnode->tensor_proper_size(1);
+          size_type n2 = ((pnode->tensor_order() > 2) ?
+                          pnode->tensor_proper_size(2) : 1);
+          size_type n3 = ((pnode->tensor_order() > 3) ?
+                          pnode->tensor_proper_size(3) : 1);
+          if (n3 > 1) str << "[";
+          for (size_type l = 0; l < n3; ++l) {
+            if (l != 0) str << ",";
+            if (n2 > 1) str << "[";
+            for (size_type k = 0; k < n2; ++k) {
+              if (k != 0) str << ",";
+              if (n1 > 1) str << "[";
+              for (size_type j = 0; j < n1; ++j) {
+                if (j != 0) str << ",";
+                if (n0 > 1) str << "[";
+                for (size_type i = 0; i < n0; ++i) {
+                  if (i != 0) str << ",";
+                  ga_print_node(pnode->children[ii++], str);
+                }
+                if (n0 > 1) str << "]";
+              }
+              if (n1 > 1) str << "]";
+            }
+            if (n2 > 1) str << "]";
+          }
+          if (n3 > 1) str << "]";
+        }
+        break;
+
       case 5: case 6: case 7: case 8:
-       str << "Reshape([";
-       for (size_type i = 0; i < pnode->tensor_proper_size(); ++i) {
-         if (i != 0) str << ";";
-         ga_print_node(pnode->children[i], str);
-       }
-       str << "]";
-       for (size_type i = 0; i < pnode->tensor_order(); ++i) {
-         if (i != 0) str << ", ";
-         str << pnode->tensor_proper_size(i);
-       }
-       str << ")";
-       break;
-       
+        str << "Reshape([";
+        for (size_type i = 0; i < pnode->tensor_proper_size(); ++i) {
+          if (i != 0) str << ";";
+          ga_print_node(pnode->children[i], str);
+        }
+        str << "]";
+        for (size_type i = 0; i < pnode->tensor_order(); ++i) {
+          if (i != 0) str << ", ";
+          str << pnode->tensor_proper_size(i);
+        }
+        str << ")";
+        break;
+
       default: GMM_ASSERT1(false, "Invalid tensor dimension");
       }
       break;
@@ -1291,149 +1290,149 @@ namespace getfem {
       pga_tree_node pchild = children[pnode->nbc1+1];
 
       if (po || pt) {
-       if (!(pchild->children.empty()) || pchild->node_type != GA_NODE_NAME)
-         ga_throw_error(pchild->expr, pchild->pos, "Error in macro "
-                        "expansion. Only variable name are allowed for macro "
-                        "parameter preceded by Grad_ Hess_ Test_ or Test2_ "
-                        "prefixes.");
-       switch(pnode->op_type) {
-       case GA_NAME : pnode->node_type = GA_NODE_NAME; break;
-       case GA_INTERPOLATE : pnode->node_type = GA_NODE_INTERPOLATE; break;
-       case GA_ELEMENTARY : pnode->node_type = GA_NODE_ELEMENTARY; break;
-       case GA_SECONDARY_DOMAIN :
+        if (!(pchild->children.empty()) || pchild->node_type != GA_NODE_NAME)
+          ga_throw_error(pchild->expr, pchild->pos, "Error in macro "
+                         "expansion. Only variable name are allowed for macro "
+                         "parameter preceded by Grad_ Hess_ Test_ or Test2_ "
+                         "prefixes.");
+        switch(pnode->op_type) {
+        case GA_NAME : pnode->node_type = GA_NODE_NAME; break;
+        case GA_INTERPOLATE : pnode->node_type = GA_NODE_INTERPOLATE; break;
+        case GA_ELEMENTARY : pnode->node_type = GA_NODE_ELEMENTARY; break;
+        case GA_SECONDARY_DOMAIN :
           pnode->node_type = GA_NODE_SECONDARY_DOMAIN; break;
-       case GA_XFEM_PLUS : pnode->node_type = GA_NODE_XFEM_PLUS; break;
-       case GA_XFEM_MINUS: pnode->node_type = GA_NODE_XFEM_MINUS; break;
-       default:break;
-       }
-       pnode->name = pchild->name;
-       if (pt == 1) pnode->name = "Test_" + pnode->name;
-       if (pt == 2) pnode->name = "Test2_" + pnode->name;
-       if (po == 1) pnode->name = "Grad_" + pnode->name;
-       if (po == 2) pnode->name = "Hess_" + pnode->name;
-       if (po == 3) pnode->name = "Div_" + pnode->name;
+        case GA_XFEM_PLUS : pnode->node_type = GA_NODE_XFEM_PLUS; break;
+        case GA_XFEM_MINUS: pnode->node_type = GA_NODE_XFEM_MINUS; break;
+        default:break;
+        }
+        pnode->name = pchild->name;
+        if (pt == 1) pnode->name = "Test_" + pnode->name;
+        if (pt == 2) pnode->name = "Test2_" + pnode->name;
+        if (po == 1) pnode->name = "Grad_" + pnode->name;
+        if (po == 2) pnode->name = "Hess_" + pnode->name;
+        if (po == 3) pnode->name = "Div_" + pnode->name;
       } else {   
-       pga_tree_node pnode_old = pnode;
-       pnode = nullptr;
-       tree.copy_node(pchild, pnode_old->parent, pnode);
-       if (pnode_old->parent)
-         pnode_old->parent->replace_child(pnode_old, pnode);
-       else
-         tree.root = pnode;
-       GMM_ASSERT1(pnode_old->children.empty(), "Internal error");
-       delete pnode_old;
+        pga_tree_node pnode_old = pnode;
+        pnode = nullptr;
+        tree.copy_node(pchild, pnode_old->parent, pnode);
+        if (pnode_old->parent)
+          pnode_old->parent->replace_child(pnode_old, pnode);
+        else
+          tree.root = pnode;
+        GMM_ASSERT1(pnode_old->children.empty(), "Internal error");
+        delete pnode_old;
       }
     }
   }
   
   static void ga_expand_macro(ga_tree &tree, pga_tree_node pnode,
-                             const ga_macro_dictionnary &macro_dict) {
+                              const ga_macro_dictionnary &macro_dict) {
     if (!pnode) return;
     
     if (pnode->node_type == GA_NODE_PARAMS) {
       
       for (size_type i = 1; i < pnode->children.size(); ++i)
-       ga_expand_macro(tree, pnode->children[i], macro_dict);
+        ga_expand_macro(tree, pnode->children[i], macro_dict);
 
       if (pnode->children[0]->node_type != GA_NODE_NAME) {
-       ga_expand_macro(tree, pnode->children[0], macro_dict);
+        ga_expand_macro(tree, pnode->children[0], macro_dict);
       } else {
-       
-       if (macro_dict.macro_exists(pnode->children[0]->name)) {
-         
-         const ga_macro &gam = macro_dict.get_macro(pnode->children[0]->name);
-         
-         if (gam.nb_params()==0) { // Macro without parameters
-           pga_tree_node pnode_old = pnode->children[0];
-           pnode->children[0] = nullptr;
-           tree.copy_node(gam.tree().root,
-                          pnode_old->parent,pnode->children[0]);
-           GMM_ASSERT1(pnode_old->children.empty(), "Internal error");
-           delete pnode_old;
-           
-         } else { // Macro with parameters
-           
-           if (gam.nb_params()+1 != pnode->children.size())
-             ga_throw_error(pnode->expr, pnode->pos,
-                            "Bad number of parameters in the use of macro '"
-                            << gam.name() << "'. Expected " << gam.nb_params()
-                            << " found " << pnode->children.size()-1 << ".");
-           
-           pga_tree_node pnode_old = pnode;
-           pnode = nullptr;
-           tree.copy_node(gam.tree().root, pnode_old->parent, pnode);
-           if (pnode_old->parent)
-             pnode_old->parent->replace_child(pnode_old, pnode);
-           else
-             tree.root = pnode;
-           ga_replace_macro_params(tree, pnode, pnode_old->children);
-         }
-       }
+
+        if (macro_dict.macro_exists(pnode->children[0]->name)) {
+
+          const ga_macro &gam = macro_dict.get_macro(pnode->children[0]->name);
+
+          if (gam.nb_params()==0) { // Macro without parameters
+            pga_tree_node pnode_old = pnode->children[0];
+            pnode->children[0] = nullptr;
+            tree.copy_node(gam.tree().root,
+                           pnode_old->parent,pnode->children[0]);
+            GMM_ASSERT1(pnode_old->children.empty(), "Internal error");
+            delete pnode_old;
+
+          } else { // Macro with parameters
+
+            if (gam.nb_params()+1 != pnode->children.size())
+              ga_throw_error(pnode->expr, pnode->pos,
+                             "Bad number of parameters in the use of macro '"
+                             << gam.name() << "'. Expected " << gam.nb_params()
+                             << " found " << pnode->children.size()-1 << ".");
+
+            pga_tree_node pnode_old = pnode;
+            pnode = nullptr;
+            tree.copy_node(gam.tree().root, pnode_old->parent, pnode);
+            if (pnode_old->parent)
+              pnode_old->parent->replace_child(pnode_old, pnode);
+            else
+              tree.root = pnode;
+            ga_replace_macro_params(tree, pnode, pnode_old->children);
+          }
+        }
       }
 
     } else if (pnode->node_type == GA_NODE_NAME &&
-              macro_dict.macro_exists(pnode->name)) {
+               macro_dict.macro_exists(pnode->name)) {
       // Macro without parameters
       const ga_macro &gam = macro_dict.get_macro(pnode->name);
       if (gam.nb_params() != 0)
-       ga_throw_error(pnode->expr, pnode->pos,
-                        "Bad number of parameters in the use of macro '"
-                        << gam.name() << "'. Expected " << gam.nb_params()
-                        << " none found.");
+        ga_throw_error(pnode->expr, pnode->pos,
+                         "Bad number of parameters in the use of macro '"
+                         << gam.name() << "'. Expected " << gam.nb_params()
+                         << " none found.");
 
       pga_tree_node pnode_old = pnode;
       pnode = nullptr;
       tree.copy_node(gam.tree().root, pnode_old->parent, pnode);
       if (pnode_old->parent)
-       pnode_old->parent->replace_child(pnode_old, pnode);
+        pnode_old->parent->replace_child(pnode_old, pnode);
       else
-       tree.root = pnode;
+        tree.root = pnode;
       GMM_ASSERT1(pnode_old->children.empty(), "Internal error");
       delete pnode_old;
     } else {
       for (size_type i = 0; i < pnode->children.size(); ++i)
-       ga_expand_macro(tree, pnode->children[i], macro_dict);
+        ga_expand_macro(tree, pnode->children[i], macro_dict);
     }
   }
 
   static void ga_mark_macro_params_rec(const pga_tree_node pnode,
-                                      const std::vector<std::string> &params) {
+                                       const std::vector<std::string> &params) 
{
     if (!pnode) return;
     for (size_type i = 0; i < pnode->children.size(); ++i)
       ga_mark_macro_params_rec(pnode->children[i], params);
     
     if (pnode->node_type == GA_NODE_NAME ||
-       pnode->node_type == GA_NODE_INTERPOLATE ||
-       pnode->node_type == GA_NODE_ELEMENTARY ||
-       pnode->node_type == GA_NODE_SECONDARY_DOMAIN ||
-       pnode->node_type == GA_NODE_XFEM_PLUS ||
-       pnode->node_type == GA_NODE_XFEM_MINUS) {
+        pnode->node_type == GA_NODE_INTERPOLATE ||
+        pnode->node_type == GA_NODE_ELEMENTARY ||
+        pnode->node_type == GA_NODE_SECONDARY_DOMAIN ||
+        pnode->node_type == GA_NODE_XFEM_PLUS ||
+        pnode->node_type == GA_NODE_XFEM_MINUS) {
       std::string name = pnode->name;
       size_type po = ga_parse_prefix_operator(name);
       size_type pt = ga_parse_prefix_test(name);
 
       for (size_type i = 0; i < params.size(); ++i)
-       if (name.compare(params[i]) == 0) {
-         pnode->name = name;
-         switch(pnode->node_type) {
-         case GA_NODE_NAME : pnode->op_type = GA_NAME; break;
-         case GA_NODE_INTERPOLATE : pnode->op_type = GA_INTERPOLATE; break;
-         case GA_NODE_ELEMENTARY : pnode->op_type = GA_ELEMENTARY; break;
-         case GA_NODE_SECONDARY_DOMAIN :
+        if (name.compare(params[i]) == 0) {
+          pnode->name = name;
+          switch(pnode->node_type) {
+          case GA_NODE_NAME : pnode->op_type = GA_NAME; break;
+          case GA_NODE_INTERPOLATE : pnode->op_type = GA_INTERPOLATE; break;
+          case GA_NODE_ELEMENTARY : pnode->op_type = GA_ELEMENTARY; break;
+          case GA_NODE_SECONDARY_DOMAIN :
             pnode->op_type = GA_SECONDARY_DOMAIN; break;
-         case GA_NODE_XFEM_PLUS : pnode->op_type = GA_XFEM_PLUS; break;
-         case GA_NODE_XFEM_MINUS: pnode->op_type = GA_XFEM_MINUS; break;
-         default:break;
-         }
-         pnode->node_type = GA_NODE_MACRO_PARAM;
-         pnode->nbc1 = i; pnode->nbc2 = po; pnode->nbc3 = pt;
-       }
+          case GA_NODE_XFEM_PLUS : pnode->op_type = GA_XFEM_PLUS; break;
+          case GA_NODE_XFEM_MINUS: pnode->op_type = GA_XFEM_MINUS; break;
+          default:break;
+          }
+          pnode->node_type = GA_NODE_MACRO_PARAM;
+          pnode->nbc1 = i; pnode->nbc2 = po; pnode->nbc3 = pt;
+        }
     }
   }
   
   static void ga_mark_macro_params(ga_macro &gam,
-                                  const std::vector<std::string> &params,
-                                  const ga_macro_dictionnary &macro_dict) {
+                                   const std::vector<std::string> &params,
+                                   const ga_macro_dictionnary &macro_dict) {
     if (gam.tree().root) {
       ga_mark_macro_params_rec(gam.tree().root, params);
       ga_expand_macro(gam.tree(), gam.tree().root, macro_dict);
@@ -1459,7 +1458,7 @@ namespace getfem {
   { macros[gam.name()] = gam; }
 
   void ga_macro_dictionnary::add_macro(const std::string &name,
-                                      const std::string &expr)
+                                       const std::string &expr)
   { ga_tree tree; ga_read_string_reg("Def "+name+":="+expr, tree, *this); }
 
   void ga_macro_dictionnary::del_macro(const std::string &name) {
@@ -1476,7 +1475,7 @@ namespace getfem {
   // Read a term with an (implicit) pushdown automaton.
   static GA_TOKEN_TYPE ga_read_term(pstring expr, size_type &pos,
                                     ga_tree &tree,
-                                   ga_macro_dictionnary &macro_dict) {
+                                    ga_macro_dictionnary &macro_dict) {
     size_type token_pos, token_length;
     GA_TOKEN_TYPE t_type;
     int state = 1; // 1 = reading term, 2 = reading after term
@@ -1528,60 +1527,60 @@ namespace getfem {
           tree.add_op(GA_DEVIATOR, token_pos, expr);
           state = 1; break;
 
-       case GA_DEF:
-         {
-           ga_macro gam;
-           t_type = ga_get_token(*expr, pos, token_pos, token_length);
-           if (t_type != GA_NAME)
+        case GA_DEF:
+          {
+            ga_macro gam;
+            t_type = ga_get_token(*expr, pos, token_pos, token_length);
+            if (t_type != GA_NAME)
               ga_throw_error(expr, pos,
                              "Macro definition should begin with macro name");
-           gam.name() = std::string(&((*expr)[token_pos]), token_length);
-           if (ga_check_name_validity(gam.name()))
-             ga_throw_error(expr, pos-1, "Invalid macro name.")
-           t_type = ga_get_token(*expr, pos, token_pos, token_length);
-           std::vector<std::string> params;
+            gam.name() = std::string(&((*expr)[token_pos]), token_length);
+            if (ga_check_name_validity(gam.name()))
+              ga_throw_error(expr, pos-1, "Invalid macro name.")
+            t_type = ga_get_token(*expr, pos, token_pos, token_length);
+            std::vector<std::string> params;
             if (t_type == GA_LPAR) {
-             t_type = ga_get_token(*expr, pos, token_pos, token_length);
-             while (t_type == GA_NAME) {
-               params.push_back(std::string(&((*expr)[token_pos]),
-                                            token_length));
-               if (ga_check_name_validity(params.back()))
-                 ga_throw_error(expr, pos-1, "Invalid macro parameter name.");
-               for (size_type i = 0; i+1 < params.size(); ++i)
-                 if (params.back().compare(params[i]) == 0)
-                   ga_throw_error(expr, pos-1,
-                                  "Invalid repeated macro parameter name.");
-               t_type = ga_get_token(*expr, pos, token_pos, token_length);
-               if (t_type == GA_COMMA)
-                 t_type = ga_get_token(*expr, pos, token_pos, token_length);
-             }
-             if (t_type != GA_RPAR)
-               ga_throw_error(expr, pos-1,
-                             "Missing right parenthesis in macro definition.");
-             t_type = ga_get_token(*expr, pos, token_pos, token_length);
-           }
-           if (t_type != GA_COLON_EQ)
-             ga_throw_error(expr, pos-1, "Missing := for macro definition.");
-
-           t_type = ga_read_term(expr, pos, gam.tree(), macro_dict);
-           if (gam.tree().root)
-             ga_expand_macro(gam.tree(), gam.tree().root, macro_dict);
-           gam.nb_params() = params.size();
-           if (params.size())
-             ga_mark_macro_params(gam, params, macro_dict);
-           macro_dict.add_macro(gam);
-
-           // cout << "macro \"" << gam.name() << "\" registered with "
-           //   << gam.nb_params() << " params  := "
-           //   << ga_tree_to_string(gam.tree()) << endl;
-           
-           if (t_type == GA_END) return t_type;
+              t_type = ga_get_token(*expr, pos, token_pos, token_length);
+              while (t_type == GA_NAME) {
+                params.push_back(std::string(&((*expr)[token_pos]),
+                                             token_length));
+                if (ga_check_name_validity(params.back()))
+                  ga_throw_error(expr, pos-1, "Invalid macro parameter name.");
+                for (size_type i = 0; i+1 < params.size(); ++i)
+                  if (params.back().compare(params[i]) == 0)
+                    ga_throw_error(expr, pos-1,
+                                   "Invalid repeated macro parameter name.");
+                t_type = ga_get_token(*expr, pos, token_pos, token_length);
+                if (t_type == GA_COMMA)
+                  t_type = ga_get_token(*expr, pos, token_pos, token_length);
+              }
+              if (t_type != GA_RPAR)
+                ga_throw_error(expr, pos-1,
+                              "Missing right parenthesis in macro 
definition.");
+              t_type = ga_get_token(*expr, pos, token_pos, token_length);
+            }
+            if (t_type != GA_COLON_EQ)
+              ga_throw_error(expr, pos-1, "Missing := for macro definition.");
+
+            t_type = ga_read_term(expr, pos, gam.tree(), macro_dict);
+            if (gam.tree().root)
+              ga_expand_macro(gam.tree(), gam.tree().root, macro_dict);
+            gam.nb_params() = params.size();
+            if (params.size())
+              ga_mark_macro_params(gam, params, macro_dict);
+            macro_dict.add_macro(gam);
+
+            // cout << "macro \"" << gam.name() << "\" registered with "
+            //      << gam.nb_params() << " params  := "
+            //      << ga_tree_to_string(gam.tree()) << endl;
+
+            if (t_type == GA_END) return t_type;
             else if (t_type != GA_SEMICOLON)
               ga_throw_error(expr, pos-1,
-                            "Syntax error at the end of macro definition.");
-           state = 1;
-         }
-         break;
+                             "Syntax error at the end of macro definition.");
+            state = 1;
+          }
+          break;
 
         case GA_INTERPOLATE:
           {
@@ -1780,66 +1779,66 @@ namespace getfem {
             size_type tensor_order(1);
             bool foundcomma(false), foundsemi(false);
 
-           r_type = ga_read_term(expr, pos, sub_tree, macro_dict);
-           size_type nb_comp = 0;
-           tree.add_matrix(token_pos, expr);
-           
-           if (sub_tree.root->node_type == GA_NODE_C_MATRIX) { // nested format
-             bgeot::multi_index mii;
-             do {
-               if (nb_comp) {
-                 sub_tree.clear();
-                 r_type = ga_read_term(expr, pos, sub_tree, macro_dict);
-               }
-               // in the nested format only "," and "]" are expected
-               if (sub_tree.root->node_type != GA_NODE_C_MATRIX || 
-                   (r_type != GA_COMMA && r_type != GA_RBRACKET))
+            r_type = ga_read_term(expr, pos, sub_tree, macro_dict);
+            size_type nb_comp = 0;
+            tree.add_matrix(token_pos, expr);
+
+            if (sub_tree.root->node_type == GA_NODE_C_MATRIX) { // nested 
format
+              bgeot::multi_index mii;
+              do {
+                if (nb_comp) {
+                  sub_tree.clear();
+                  r_type = ga_read_term(expr, pos, sub_tree, macro_dict);
+                }
+                // in the nested format only "," and "]" are expected
+                if (sub_tree.root->node_type != GA_NODE_C_MATRIX ||
+                    (r_type != GA_COMMA && r_type != GA_RBRACKET))
                   ga_throw_error(expr, pos-1, "Bad explicit "
                                  "vector/matrix/tensor format.");
 
-               // convert a row vector [a,b] to a column vector [a;b]
+                // convert a row vector [a,b] to a column vector [a;b]
                 if (sub_tree.root->marked &&
-                   sub_tree.root->tensor().sizes()[0] == 1 &&
-                   sub_tree.root->tensor().size() != 1) {
-                 bgeot::multi_index mi = sub_tree.root->tensor().sizes();
-                 for (size_type i = mi.size()-1; i > 0; i--)
-                   mi[i-1] = mi[i];
-                 mi.pop_back();
-                 sub_tree.root->tensor().adjust_sizes(mi);
-               }
-               if (!nb_comp) mii = sub_tree.root->tensor().sizes();
-               else {
-                 const bgeot::multi_index &mi=sub_tree.root->tensor().sizes();
-                 bool cmp = true;
-                 if (mii.size() == mi.size()) {
-                    for (size_type i = 0; i < mi.size(); ++i)
-                      if (mi[i] != mii[i]) cmp = false;
-                 } else cmp = false;
-                 if (!cmp)
-                   ga_throw_error(expr, pos-1, "Bad explicit "
+                    sub_tree.root->tensor().sizes()[0] == 1 &&
+                    sub_tree.root->tensor().size() != 1) {
+                  bgeot::multi_index mi = sub_tree.root->tensor().sizes();
+                  for (size_type i = mi.size()-1; i > 0; i--)
+                    mi[i-1] = mi[i];
+                  mi.pop_back();
+                  sub_tree.root->tensor().adjust_sizes(mi);
+                }
+                if (!nb_comp) mii = sub_tree.root->tensor().sizes();
+                else {
+                  const bgeot::multi_index &mi=sub_tree.root->tensor().sizes();
+                  bool cmp = true;
+                  if (mii.size() == mi.size()) {
+                     for (size_type i = 0; i < mi.size(); ++i)
+                       if (mi[i] != mii[i]) cmp = false;
+                  } else cmp = false;
+                  if (!cmp)
+                    ga_throw_error(expr, pos-1, "Bad explicit "
                                    "vector/matrix/tensor format.");
-               }
-               for (size_type i = 0; i < sub_tree.root->children.size(); ++i) {
-                 sub_tree.root->children[i]->parent = tree.current_node;
-                 tree.current_node->children.push_back
-                   (sub_tree.root->children[i]);
-               }
-               sub_tree.root->children.resize(0);
-               nb_comp++;
-             } while (r_type != GA_RBRACKET);
-             tree.current_node->marked = false;
-             mii.push_back(nb_comp);
-             tree.current_node->tensor().adjust_sizes(mii);
-           } else { // non nested format
-             do {
-               if (nb_comp) {
-                 sub_tree.clear();
-                 r_type = ga_read_term(expr, pos, sub_tree, macro_dict);
-               }
-               nb_comp++;
-               
-               tree.add_sub_tree(sub_tree);
-               
+                }
+                for (size_type i = 0; i < sub_tree.root->children.size(); ++i) 
{
+                  sub_tree.root->children[i]->parent = tree.current_node;
+                  tree.current_node->children.push_back
+                    (sub_tree.root->children[i]);
+                }
+                sub_tree.root->children.resize(0);
+                nb_comp++;
+              } while (r_type != GA_RBRACKET);
+              tree.current_node->marked = false;
+              mii.push_back(nb_comp);
+              tree.current_node->tensor().adjust_sizes(mii);
+            } else { // non nested format
+              do {
+                if (nb_comp) {
+                  sub_tree.clear();
+                  r_type = ga_read_term(expr, pos, sub_tree, macro_dict);
+                }
+                nb_comp++;
+
+                tree.add_sub_tree(sub_tree);
+
                 ++n1; ++n2; ++n3;
                 if (tensor_order < 2) ++nbc1;
                 if (tensor_order < 3) ++nbc2;
@@ -1888,42 +1887,42 @@ namespace getfem {
                                  "separated by ',', ';', ',,' and ';;' and "
                                  "be ended by ']'.");
                 }
-               
-             } while (r_type != GA_RBRACKET);
-             bgeot::multi_index mi;
-             nbc1 = tree.current_node->nbc1; nbc2 = tree.current_node->nbc2;
-             nbc3 = tree.current_node->nbc3;
-             
-             size_type nbl = tree.current_node->children.size()
-               / (nbc2 * nbc1 * nbc3);
-             switch(tensor_order) {
-             case 1:
-               /* mi.push_back(1); */ mi.push_back(nbc1); break;
-             case 2:
-               mi.push_back(nbl); if (nbc1 > 1) mi.push_back(nbc1); break; 
-             case 3:
-               mi.push_back(nbl); mi.push_back(nbc2);
-               mi.push_back(nbc1);
-               break;
-             case 4:
-               mi.push_back(nbl); mi.push_back(nbc3);
-               mi.push_back(nbc2); mi.push_back(nbc1);
-               break;
-             default: GMM_ASSERT1(false, "Internal error");
-             }
-             tree.current_node->tensor().adjust_sizes(mi);
-             std::vector<pga_tree_node> children = tree.current_node->children;
-             auto it = tree.current_node->children.begin();
-             for (size_type i = 0; i < nbc1; ++i)
-               for (size_type j = 0; j < nbc2; ++j)
-                 for (size_type k = 0; k < nbc3; ++k)
-                   for (size_type l = 0; l < nbl; ++l, ++it)
-                     *it = children[i+nbc1*(j+nbc2*(k+nbc3*l))];
-             tree.current_node->marked = true;
-           }
+
+              } while (r_type != GA_RBRACKET);
+              bgeot::multi_index mi;
+              nbc1 = tree.current_node->nbc1; nbc2 = tree.current_node->nbc2;
+              nbc3 = tree.current_node->nbc3;
+
+              size_type nbl = tree.current_node->children.size()
+                / (nbc2 * nbc1 * nbc3);
+              switch(tensor_order) {
+              case 1:
+                /* mi.push_back(1); */ mi.push_back(nbc1); break;
+              case 2:
+                mi.push_back(nbl); if (nbc1 > 1) mi.push_back(nbc1); break;
+              case 3:
+                mi.push_back(nbl); mi.push_back(nbc2);
+                mi.push_back(nbc1);
+                break;
+              case 4:
+                mi.push_back(nbl); mi.push_back(nbc3);
+                mi.push_back(nbc2); mi.push_back(nbc1);
+                break;
+              default: GMM_ASSERT1(false, "Internal error");
+              }
+              tree.current_node->tensor().adjust_sizes(mi);
+              std::vector<pga_tree_node> children = 
tree.current_node->children;
+              auto it = tree.current_node->children.begin();
+              for (size_type i = 0; i < nbc1; ++i)
+                for (size_type j = 0; j < nbc2; ++j)
+                  for (size_type k = 0; k < nbc3; ++k)
+                    for (size_type l = 0; l < nbl; ++l, ++it)
+                      *it = children[i+nbc1*(j+nbc2*(k+nbc3*l))];
+              tree.current_node->marked = true;
+            }
           }
-         tree.current_node->nbc1 = tree.current_node->tensor().sizes().size();
-         state = 2;
+          tree.current_node->nbc1 = tree.current_node->tensor().sizes().size();
+          state = 2;
           break;
 
         default:
@@ -1973,7 +1972,7 @@ namespace getfem {
 
   // Syntax analysis of a string. Conversion to a tree. register the macros.
   void ga_read_string_reg(const std::string &expr, ga_tree &tree,
-                         ga_macro_dictionnary &macro_dict) {
+                          ga_macro_dictionnary &macro_dict) {
     size_type pos = 0, token_pos, token_length;
     tree.clear();
     GA_TOKEN_TYPE t = ga_get_token(expr, pos, token_pos, token_length);
@@ -1995,7 +1994,7 @@ namespace getfem {
   // Syntax analysis of a string. Conversion to a tree.
   // Do not register the macros (but expand them).
   void ga_read_string(const std::string &expr, ga_tree &tree,
-                     const ga_macro_dictionnary &macro_dict) {
+                      const ga_macro_dictionnary &macro_dict) {
     ga_macro_dictionnary macro_dict_loc(true, macro_dict);
     ga_read_string_reg(expr, tree, macro_dict_loc);
   }
diff --git a/src/getfem_generic_assembly_workspace.cc 
b/src/getfem_generic_assembly_workspace.cc
index af872ec..77f6a5c 100644
--- a/src/getfem_generic_assembly_workspace.cc
+++ b/src/getfem_generic_assembly_workspace.cc
@@ -80,7 +80,6 @@ namespace getfem {
        gmm::vect_size(VV)/(imd.nb_filtered_index() * imd.nb_tensor_elem()));
   }
 
-
   bool ga_workspace::variable_exists(const std::string &name) const {
     return (md && md->variable_exists(name)) ||
       (parent_workspace && parent_workspace->variable_exists(name)) ||
@@ -216,7 +215,7 @@ namespace getfem {
   size_type ga_workspace::qdim(const std::string &name) const {
     VAR_SET::const_iterator it = variables.find(name);
     if (it != variables.end()) {
-      const mesh_fem *mf =  it->second.is_fem_dofs ? it->second.mf : 0;
+      const mesh_fem *mf = it->second.is_fem_dofs ? it->second.mf : 0;
       const im_data *imd = it->second.imd;
       size_type n = it->second.qdim();
       if (mf) {
@@ -475,8 +474,8 @@ namespace getfem {
         for (const var_trans_pair &var : expr_variables) {
           if (!(is_constant(var.varname))) {
             ga_tree dtree = (remain ? tree : *(trees[ind_tree].ptree));
-            // cout << "Derivation with respect to " << var.first << " : "
-            //     << var.second << " of " << ga_tree_to_string(dtree) << endl;
+            // cout << "Derivation with respect to " << var.varname << " : "
+            //     << var.transname << " of " << ga_tree_to_string(dtree) << 
endl;
             GA_TIC;
             ga_derivative(dtree, *this, m, var.varname, var.transname, 
1+order);
             // cout << "Result : " << ga_tree_to_string(dtree) << endl;
diff --git a/src/getfem_mesh.cc b/src/getfem_mesh.cc
index edf8d96..e189e6e 100644
--- a/src/getfem_mesh.cc
+++ b/src/getfem_mesh.cc
@@ -363,7 +363,7 @@ namespace getfem {
     }
     bgeot::mesh_structure::sup_convex(ic);
     if (sup_points)
-      for (size_type ip = 0; ip < ipt.size(); ++ip) sup_point(ipt[ip]);
+      for (const size_type &ip : ipt) sup_point(ip);
     trans_exists.sup(ic);
     sup_convex_from_regions(ic);
     if (Bank_info.get()) Bank_sup_convex_from_green(ic);
diff --git a/src/getfem_models.cc b/src/getfem_models.cc
index 4f55c21..1f7c6e1 100644
--- a/src/getfem_models.cc
+++ b/src/getfem_models.cc
@@ -1005,8 +1005,8 @@ namespace getfem {
          for  (size_type j = 0; j < bricks[ibb].mims.size(); ++j)
            if (bricks[ibb].mims[j] == mim) found = true;
        }
-       for(VAR_SET::iterator it2 = variables.begin();
-           it2 != variables.end(); ++it2) {
+       for (VAR_SET::iterator it2 = variables.begin();
+            it2 != variables.end(); ++it2) {
          if (it2->second.is_fem_dofs &&
              (it2->second.filter & VDESCRFILTER_INFSUP) &&
              mim == it2->second.mim) found = true;
@@ -1906,22 +1906,16 @@ namespace getfem {
 
       if (brick.is_update_brick) //contributions of pure update bricks must be 
deleted
       {
-        for (size_type i = 0; i < brick.cmatlist.size(); ++i)
-        {
-          gmm::clear(brick.cmatlist[i]);
-        }
+        for (auto &&mat : brick.cmatlist)
+          gmm::clear(mat);
 
-        for (size_type i = 0; i < brick.cveclist.size(); ++i)
-          for (size_type j = 0; j < brick.cveclist[i].size(); ++j)
-          {
-            gmm::clear(brick.cveclist[i][j]);
-          }
+        for (auto &&vecs : brick.cveclist)
+          for (auto &&vec : vecs)
+            gmm::clear(vec);
 
-        for (size_type i = 0; i < brick.cveclist_sym.size(); ++i)
-          for (size_type j = 0; j < brick.cveclist_sym[i].size(); ++j)
-          {
-            gmm::clear(brick.cveclist_sym[i][j]);
-          }
+        for (auto &&vecs : brick.cveclist_sym)
+          for (auto &&vec : vecs)
+            gmm::clear(vec);
       }
     }
     else //not cplx
@@ -1966,22 +1960,16 @@ namespace getfem {
 
       if (brick.is_update_brick) //contributions of pure update bricks must be 
deleted
       {
-        for (size_type i = 0; i < brick.rmatlist.size(); ++i)
-        {
-          gmm::clear(brick.rmatlist[i]);
-        }
+        for (auto &&mat : brick.rmatlist)
+          gmm::clear(mat);
 
-        for (size_type i = 0; i < brick.rveclist.size(); ++i)
-          for (size_type j = 0; j < brick.rveclist[i].size(); ++j)
-          {
-            gmm::clear(brick.rveclist[i][j]);
-          }
+        for (auto &&vecs : brick.rveclist)
+          for (auto &&vec : vecs)
+            gmm::clear(vec);
 
-        for (size_type i = 0; i < brick.rveclist_sym.size(); ++i)
-          for (size_type j = 0; j < brick.rveclist_sym[i].size(); ++j)
-          {
-            gmm::clear(brick.rveclist_sym[i][j]);
-          }
+        for (auto &&vecs : brick.rveclist_sym)
+          for (auto &&vec : vecs)
+            gmm::clear(vec);
       }
     }
   }
@@ -2583,7 +2571,7 @@ namespace getfem {
               if (brick.pbr->is_linear()
                   && (!is_linear() || (version & BUILD_WITH_COMPLETE_RHS))) {
                 gmm::mult_add(gmm::transposed(brick.rmatlist[j]),
-                             gmm::scaled(it1->second.complex_value[0],
+                              gmm::scaled(it1->second.complex_value[0],
                                           complex_type(-alpha2)),
                               gmm::sub_vector(crhs, I2));
               }
@@ -2731,8 +2719,8 @@ namespace getfem {
         exception.rethrow();
       } //end of distro scope
 
-      if (version & BUILD_RHS) gmm::add(gmm::scaled(residual, 
scalar_type(-1)), rrhs);
-
+      if (version & BUILD_RHS)
+        gmm::add(gmm::scaled(residual, scalar_type(-1)), rrhs);
     }
 
     // Post simplification for dof constraints



reply via email to

[Prev in Thread] Current Thread [Next in Thread]