getfem-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Getfem-commits] r4915 - in /trunk/getfem/src: getfem/getfem_linearized_


From: Yves . Renard
Subject: [Getfem-commits] r4915 - in /trunk/getfem/src: getfem/getfem_linearized_plates.h getfem_generic_assembly.cc getfem_linearized_plates.cc
Date: Fri, 27 Mar 2015 13:25:38 -0000

Author: renard
Date: Fri Mar 27 14:25:38 2015
New Revision: 4915

URL: http://svn.gna.org/viewcvs/getfem?rev=4915&view=rev
Log:
Avoiding multiple computation of the elementary transformation

Modified:
    trunk/getfem/src/getfem/getfem_linearized_plates.h
    trunk/getfem/src/getfem_generic_assembly.cc
    trunk/getfem/src/getfem_linearized_plates.cc

Modified: trunk/getfem/src/getfem/getfem_linearized_plates.h
URL: 
http://svn.gna.org/viewcvs/getfem/trunk/getfem/src/getfem/getfem_linearized_plates.h?rev=4915&r1=4914&r2=4915&view=diff
==============================================================================
--- trunk/getfem/src/getfem/getfem_linearized_plates.h  (original)
+++ trunk/getfem/src/getfem/getfem_linearized_plates.h  Fri Mar 27 14:25:38 2015
@@ -51,7 +51,7 @@
 
 
   /** Add a term corresponding to the classical Reissner-Mindlin plate
-      model for which `U` is the transverse displacement,
+      model for which `u3` is the transverse displacement,
       `Theta` the rotation of
       fibers normal to the midplane, 'param_E' the Young Modulus,
       `param_nu` the poisson ratio,
@@ -76,16 +76,11 @@
    */
   size_type add_Mindlin_Reissner_plate_brick
   (model &md, const mesh_im &mim, const mesh_im &mim_reduced,
-   const std::string &U,
+   const std::string &u3,
    const std::string &Theta, const std::string &param_E,
    const std::string &param_nu, const std::string &param_epsilon,
    const std::string &param_kappa, size_type variant = size_type(2), 
    size_type region = size_type(-1));
-
-
-
-
-
 
 
   /* ******************************************************************** */

Modified: trunk/getfem/src/getfem_generic_assembly.cc
URL: 
http://svn.gna.org/viewcvs/getfem/trunk/getfem/src/getfem_generic_assembly.cc?rev=4915&r1=4914&r2=4915&view=diff
==============================================================================
--- trunk/getfem/src/getfem_generic_assembly.cc (original)
+++ trunk/getfem/src/getfem_generic_assembly.cc Fri Mar 27 14:25:38 2015
@@ -1560,6 +1560,12 @@
       std::map<var_trans_pair, base_tensor> derivatives;
     };
 
+    struct elementary_trans_info {
+      base_matrix M;
+      const mesh_fem *mf;
+      size_type icv;
+    };
+
     std::set<std::string> transformations;
 
     struct region_mim_instructions {
@@ -1579,6 +1585,7 @@
       std::map<std::string, std::set<std::string> > transformations;
       std::set<std::string> transformations_der;
       std::map<std::string, interpolate_info> interpolate_infos;
+      std::map<std::string, elementary_trans_info> elementary_trans_infos;
 
       ga_instruction_list instructions;
       std::map<scalar_type, std::list<pga_tree_node> > node_list;
@@ -2678,23 +2685,30 @@
   struct ga_instruction_elementary_transformation {
     const base_vector &coeff_in;
     base_vector coeff_out;
-    base_matrix M;
     pelementary_transformation elemtrans;
     const mesh_fem &mf;
     fem_interpolation_context &ctx;
+    base_matrix &M;
+    const mesh_fem **mf_M;
+    size_type &icv;
 
     void do_transformation(void) {
       size_type nn = gmm::vect_size(coeff_in);
+      if (M.size() == 0 || icv != ctx.convex_num() || &mf != *mf_M) {
+        gmm::resize(M, nn, nn);
+        *mf_M = &mf; icv = ctx.convex_num();
+        elemtrans->give_transformation(mf, icv, M);
+      }
       coeff_out.resize(nn);
-      gmm::resize(M, nn, nn);
-      elemtrans->give_transformation(mf, ctx.convex_num(), M);
       gmm::mult(M, coeff_in, coeff_out); // remember: coeff == coeff_out
     }
 
     ga_instruction_elementary_transformation
     (const base_vector &co, pelementary_transformation e,
-     const mesh_fem &mf_, fem_interpolation_context &ctx_)
-      : coeff_in(co), elemtrans(e), mf(mf_), ctx(ctx_) {}
+     const mesh_fem &mf_, fem_interpolation_context &ctx_, base_matrix &M_,
+     const mesh_fem **mf_M_, size_type &icv_)
+      : coeff_in(co), elemtrans(e), mf(mf_), ctx(ctx_),
+        M(M_), mf_M(mf_M_), icv(icv_) {}
     ~ga_instruction_elementary_transformation() {};
   };
 
@@ -2711,9 +2725,11 @@
     ga_instruction_elementary_transformation_val
     (base_tensor &tt, base_tensor &Z_, const base_vector &co, size_type q,
      pelementary_transformation e, const mesh_fem &mf_,
-     fem_interpolation_context &ctx_)
+     fem_interpolation_context &ctx_, base_matrix &M_,
+     const mesh_fem **mf_M_, size_type &icv_)
       : ga_instruction_val(tt, Z_, coeff_out, q),
-        ga_instruction_elementary_transformation(co, e, mf_, ctx_) {}
+        ga_instruction_elementary_transformation(co, e, mf_, ctx_, M_,
+                                                 mf_M_, icv_) {}
   };
 
   struct ga_instruction_elementary_transformation_grad
@@ -2728,9 +2744,11 @@
     ga_instruction_elementary_transformation_grad
     (base_tensor &tt, base_tensor &Z_, const base_vector &co, size_type q,
      pelementary_transformation e, const mesh_fem &mf_,
-     fem_interpolation_context &ctx_)
+     fem_interpolation_context &ctx_, base_matrix &M_,
+     const mesh_fem **mf_M_, size_type &icv_)
       : ga_instruction_grad(tt, Z_, coeff_out, q),
-        ga_instruction_elementary_transformation(co, e, mf_, ctx_) {}
+        ga_instruction_elementary_transformation(co, e, mf_, ctx_, M_,
+                                                 mf_M_, icv_) {}
   };
 
   struct ga_instruction_elementary_transformation_hess
@@ -2745,9 +2763,11 @@
     ga_instruction_elementary_transformation_hess
     (base_tensor &tt, base_tensor &Z_, const base_vector &co, size_type q,
      pelementary_transformation e, const mesh_fem &mf_,
-     fem_interpolation_context &ctx_)
+     fem_interpolation_context &ctx_, base_matrix &M_,
+     const mesh_fem **mf_M_, size_type &icv_)
       : ga_instruction_hess(tt, Z_, coeff_out, q),
-        ga_instruction_elementary_transformation(co, e, mf_, ctx_) {}
+        ga_instruction_elementary_transformation(co, e, mf_, ctx_, M_,
+                                                 mf_M_, icv_) {}
   };
 
   struct ga_instruction_update_group_info : public ga_instruction {
@@ -2960,25 +2980,28 @@
   struct ga_instruction_elementary_transformation_base {
     base_tensor t_in;
     base_tensor &t_out;
-    base_matrix M;
     pelementary_transformation elemtrans;
     const mesh_fem &mf;
     fem_interpolation_context &ctx;
+    base_matrix &M;
+    const mesh_fem **mf_M;
+    size_type &icv;
 
     void do_transformation(size_type n) {
-      gmm::resize(M, n, n);
-      elemtrans->give_transformation(mf, ctx.convex_num(), M);
-      // cout << "M = " << M << endl;
+      if (M.size() == 0 || icv != ctx.convex_num() || &mf != *mf_M) {
+        gmm::resize(M, n, n);
+        *mf_M = &mf; icv = ctx.convex_num();
+        elemtrans->give_transformation(mf, icv, M);
+      }
       t_out.mat_reduction(t_in, M, 0);
-      // cout << "t_out = " << t_out << endl;
-      // cout << "t_in = " << t_in << endl;
-      // gmm::copy(t_in.as_vector(), t_out.as_vector());
     }
 
     ga_instruction_elementary_transformation_base
     (base_tensor &t_, pelementary_transformation e, const mesh_fem &mf_,
-     fem_interpolation_context &ctx_)
-      : t_out(t_), elemtrans(e), mf(mf_), ctx(ctx_) {}
+     fem_interpolation_context &ctx_, base_matrix &M_,
+     const mesh_fem **mf_M_, size_type &icv_)
+      : t_out(t_), elemtrans(e), mf(mf_), ctx(ctx_),
+        M(M_), mf_M(mf_M_), icv(icv_) {}
   };
 
   struct ga_instruction_elementary_transformation_val_base
@@ -2999,9 +3022,11 @@
     ga_instruction_elementary_transformation_val_base
     (base_tensor &t_, base_tensor &Z_, size_type q,
      pelementary_transformation e, const mesh_fem &mf_,
-     fem_interpolation_context &ctx_)
+     fem_interpolation_context &ctx_, base_matrix &M_,
+     const mesh_fem **mf_M_, size_type &icv_)
       : ga_instruction_copy_val_base(t_in, Z_, q),
-        ga_instruction_elementary_transformation_base(t_, e, mf_, ctx_) {}
+        ga_instruction_elementary_transformation_base(t_, e, mf_, ctx_, M_,
+                                                      mf_M_, icv_) {}
   };
 
   struct ga_instruction_elementary_transformation_grad_base
@@ -3022,9 +3047,11 @@
     ga_instruction_elementary_transformation_grad_base
     (base_tensor &t_, base_tensor &Z_, size_type q,
      pelementary_transformation e, const mesh_fem &mf_,
-     fem_interpolation_context &ctx_)
+     fem_interpolation_context &ctx_, base_matrix &M_,
+     const mesh_fem **mf_M_, size_type &icv_)
       : ga_instruction_copy_grad_base(t_in, Z_, q),
-        ga_instruction_elementary_transformation_base(t_, e, mf_, ctx_) {}
+        ga_instruction_elementary_transformation_base(t_, e, mf_, ctx_, M_,
+                                                      mf_M_, icv_) {}
   };
 
   struct ga_instruction_elementary_transformation_hess_base
@@ -3045,9 +3072,11 @@
     ga_instruction_elementary_transformation_hess_base
     (base_tensor &t_, base_tensor &Z_, size_type q,
      pelementary_transformation e, const mesh_fem &mf_,
-     fem_interpolation_context &ctx_)
+     fem_interpolation_context &ctx_, base_matrix &M_,
+     const mesh_fem **mf_M_, size_type &icv_)
       : ga_instruction_copy_hess_base(t_in, Z_, q),
-        ga_instruction_elementary_transformation_base(t_, e, mf_, ctx_) {}
+        ga_instruction_elementary_transformation_base(t_, e, mf_, ctx_, M_,
+                                                      mf_M_, icv_) {}
   };
 
 
@@ -7741,25 +7770,37 @@
                rmi.local_dofs[pnode->name], workspace.qdim(pnode->name));
             break;
           case GA_NODE_ELEMENTARY_VAL:
-            pgai = new ga_instruction_elementary_transformation_val
-              (pnode->t, rmi.base[mf],
-               rmi.local_dofs[pnode->name], workspace.qdim(pnode->name),
-               workspace.elementary_transformation(pnode->elementary_name),
-               *mf, gis.ctx);
+            {
+              ga_instruction_set::elementary_trans_info &eti
+                = rmi.elementary_trans_infos[pnode->elementary_name];
+              pgai = new ga_instruction_elementary_transformation_val
+                (pnode->t, rmi.base[mf],
+                 rmi.local_dofs[pnode->name], workspace.qdim(pnode->name),
+                 workspace.elementary_transformation(pnode->elementary_name),
+                 *mf, gis.ctx, eti.M, &(eti.mf), eti.icv);
+            }
             break;
           case GA_NODE_ELEMENTARY_GRAD:
-            pgai = new ga_instruction_elementary_transformation_grad
-              (pnode->t, rmi.grad[mf],
-               rmi.local_dofs[pnode->name], workspace.qdim(pnode->name),
-               workspace.elementary_transformation(pnode->elementary_name),
-               *mf, gis.ctx);
+            {
+              ga_instruction_set::elementary_trans_info &eti
+                = rmi.elementary_trans_infos[pnode->elementary_name];
+              pgai = new ga_instruction_elementary_transformation_grad
+                (pnode->t, rmi.grad[mf],
+                 rmi.local_dofs[pnode->name], workspace.qdim(pnode->name),
+                 workspace.elementary_transformation(pnode->elementary_name),
+                 *mf, gis.ctx, eti.M, &(eti.mf), eti.icv);
+            }
             break;
           case GA_NODE_ELEMENTARY_HESS:
-            pgai = new ga_instruction_elementary_transformation_hess
-              (pnode->t, rmi.hess[mf],
-               rmi.local_dofs[pnode->name], workspace.qdim(pnode->name),
-               workspace.elementary_transformation(pnode->elementary_name),
-               *mf, gis.ctx);
+            {
+              ga_instruction_set::elementary_trans_info &eti
+                = rmi.elementary_trans_infos[pnode->elementary_name];
+              pgai = new ga_instruction_elementary_transformation_hess
+                (pnode->t, rmi.hess[mf],
+                 rmi.local_dofs[pnode->name], workspace.qdim(pnode->name),
+                 workspace.elementary_transformation(pnode->elementary_name),
+                 *mf, gis.ctx, eti.M, &(eti.mf), eti.icv);
+            }
             break;
           default: break;
           }
@@ -7870,22 +7911,34 @@
               (pnode->t, rmi.hess[mf], mf->get_qdim());
             break;
           case GA_NODE_ELEMENTARY_TEST:
-            pgai = new ga_instruction_elementary_transformation_val_base
-              (pnode->t, rmi.base[mf], mf->get_qdim(),
-               workspace.elementary_transformation(pnode->elementary_name),
-               *mf, gis.ctx);
+            {
+              ga_instruction_set::elementary_trans_info &eti
+                = rmi.elementary_trans_infos[pnode->elementary_name];
+              pgai = new ga_instruction_elementary_transformation_val_base
+                (pnode->t, rmi.base[mf], mf->get_qdim(),
+                 workspace.elementary_transformation(pnode->elementary_name),
+                 *mf, gis.ctx, eti.M, &(eti.mf), eti.icv);
+            }
             break;
           case GA_NODE_ELEMENTARY_GRAD_TEST:
-            pgai = new ga_instruction_elementary_transformation_grad_base
-              (pnode->t, rmi.grad[mf], mf->get_qdim(),
-               workspace.elementary_transformation(pnode->elementary_name),
-               *mf, gis.ctx);
+            {
+              ga_instruction_set::elementary_trans_info &eti
+                = rmi.elementary_trans_infos[pnode->elementary_name];
+              pgai = new ga_instruction_elementary_transformation_grad_base
+                (pnode->t, rmi.grad[mf], mf->get_qdim(),
+                 workspace.elementary_transformation(pnode->elementary_name),
+                 *mf, gis.ctx, eti.M, &(eti.mf), eti.icv);
+            }
             break;
           case GA_NODE_ELEMENTARY_HESS_TEST:
-            pgai = new ga_instruction_elementary_transformation_hess_base
-              (pnode->t, rmi.hess[mf], mf->get_qdim(),
-               workspace.elementary_transformation(pnode->elementary_name),
-               *mf, gis.ctx);
+            {
+              ga_instruction_set::elementary_trans_info &eti
+                = rmi.elementary_trans_infos[pnode->elementary_name];
+              pgai = new ga_instruction_elementary_transformation_hess_base
+                (pnode->t, rmi.hess[mf], mf->get_qdim(),
+                 workspace.elementary_transformation(pnode->elementary_name),
+                 *mf, gis.ctx, eti.M, &(eti.mf), eti.icv);
+            }
             break;
           default: break;
           }

Modified: trunk/getfem/src/getfem_linearized_plates.cc
URL: 
http://svn.gna.org/viewcvs/getfem/trunk/getfem/src/getfem_linearized_plates.cc?rev=4915&r1=4914&r2=4915&view=diff
==============================================================================
--- trunk/getfem/src/getfem_linearized_plates.cc        (original)
+++ trunk/getfem/src/getfem_linearized_plates.cc        Fri Mar 27 14:25:38 2015
@@ -109,13 +109,16 @@
     virtual void give_transformation(const mesh_fem &mf, size_type cv,
                                      base_matrix &M) const{
 
+      DEFINE_STATIC_THREAD_LOCAL(base_matrix, M_old);
+      DEFINE_STATIC_THREAD_LOCAL_INITIALIZED(pfem, pf_old, 0);
+        
       // Obtaining the fem descriptors
       pfem pf1 = mf.fem_of_element(cv);
       size_type N = 2;
       GMM_ASSERT1(pf1->dim() == 2, "This projection is only defined "
                   "for two-dimensional elements");
       size_type qmult =  N / pf1->target_dim();
-
+      
       bool simplex = false;
       if (pf1->ref_convex(cv) == bgeot::simplex_of_reference(dim_type(N))) {
         simplex = true;
@@ -126,7 +129,10 @@
         GMM_ASSERT1(false, "Cannot adapt the method for such an element.");
       }
 
-      // GMM_ASSERT1(pf1->is_equivalent(), "For tau-equivalent fem only."); // 
A remplacer par si non tau équivalent faire le calcul à chaque fois
+      if (pf1 == pf_old && pf1->is_equivalent() && M.size() == M_old.size()) {
+        gmm::copy(M_old, M);
+        return;
+      }
 
       std::stringstream fem_desc;
       fem_desc << "FEM_RT0" << (simplex ? "":"Q") << "(" << N << ")";
@@ -183,6 +189,7 @@
                   "Element not convenient for projection");
       gmm::mult(aux2, gmm::transposed(B), M);
       gmm::clean(M, 1E-15);
+      M_old = M; pf_old = pf1;
     }
   };
 




reply via email to

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