getfem-commits
[Top][All Lists]
Advanced

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

[Getfem-commits] r5450 - in /trunk/getfem: contrib/opt_assembly/ src/ sr


From: Yves . Renard
Subject: [Getfem-commits] r5450 - in /trunk/getfem: contrib/opt_assembly/ src/ src/getfem/
Date: Fri, 28 Oct 2016 08:15:43 -0000

Author: renard
Date: Fri Oct 28 10:15:42 2016
New Revision: 5450

URL: http://svn.gna.org/viewcvs/getfem?rev=5450&view=rev
Log:
minor optimizations

Modified:
    trunk/getfem/contrib/opt_assembly/opt_assembly.cc
    trunk/getfem/src/getfem/bgeot_geometric_trans.h
    trunk/getfem/src/getfem/getfem_mesh_fem.h
    trunk/getfem/src/getfem_generic_assembly.cc

Modified: trunk/getfem/contrib/opt_assembly/opt_assembly.cc
URL: 
http://svn.gna.org/viewcvs/getfem/trunk/getfem/contrib/opt_assembly/opt_assembly.cc?rev=5450&r1=5449&r2=5450&view=diff
==============================================================================
--- trunk/getfem/contrib/opt_assembly/opt_assembly.cc   (original)
+++ trunk/getfem/contrib/opt_assembly/opt_assembly.cc   Fri Oct 28 10:15:42 2016
@@ -255,7 +255,7 @@
   chrono ch;
   
   bool all = false;
-  bool select = true;
+  bool select = false;
   int only_one = 1;
 
   if (all || select || only_one == 1) {
@@ -424,7 +424,7 @@
     
     MAT_TEST_1("Test for linear non homogeneous elasticity stiffness matrix",
               ndofu, ndofu, "(Div_Test_u*(lambda2*Id(meshdim)) "
-              "+ mu2*(Grad_Test_u'+Grad_Test_u)):Grad_Test2_u",
+              "+ mu2*Sym(Grad_Test_u)):Grad_Test2_u",
               mim2, Iu, Iu,
               getfem::asm_stiffness_matrix_for_linear_elasticity
               (K, mim2, mf_u, mf_p, lambda2, mu2));
@@ -438,7 +438,7 @@
   GMM_SET_EXCEPTION_DEBUG; // Exceptions make a memory fault, to debug.
   FE_ENABLE_EXCEPT;        // Enable floating point exception for Nan.
   
-  bool all = true;
+  bool all = false;
   int only_one = 2;
 
   // Mesured times for
@@ -453,49 +453,49 @@
   //                        new  | old  | sto  | asse | exec | Ins  |
   if (all || only_one == 1) // ndofu = 321602 ndofp = 160801 ndofchi = 1201
     test_new_assembly(2, 400, 1);
-  // Vector source term   : 0.25 | 0.68 |
-  // Nonlinear residual   : 0.34 |      |
-  // Mass (scalar)        : 0.18 | 0.58 | 0.04 | 0.06 | 0.06 | 0.06 |
-  // Mass (vector)        : 0.30 | 0.82 | 0.09 | 0.15 | 0.06 | 0.09 |
+  // Vector source term   : 0.20 | 0.66 |
+  // Nonlinear residual   : 0.31 |      |
+  // Mass (scalar)        : 0.18 | 0.56 | 0.04 | 0.06 | 0.06 | 0.06 |
+  // Mass (vector)        : 0.30 | 0.80 | 0.09 | 0.15 | 0.06 | 0.09 |
   // Laplacian            : 0.16 | 0.80 | 0.04 | 0.05 | 0.06 | 0.05 |
-  // Homogeneous elas     : 0.31 | 1.88 | 0.08 | 0.13 | 0.06 | 0.10 |
-  // Non-homogeneous elast: 0.36 | 2.26 | 0.09 | 0.16 | 0.06 | 0.14 |
+  // Homogeneous elas     : 0.30 | 1.88 | 0.08 | 0.13 | 0.06 | 0.09 |
+  // Non-homogeneous elast: 0.35 | 2.26 | 0.09 | 0.16 | 0.06 | 0.13 |
   if (all || only_one == 2) // ndofu = 151959 ndofp =  50653 ndofchi = 6553
     test_new_assembly(3, 36, 1);
-  // Vector source term   : 0.31 | 0.82 |
-  // Nonlinear residual   : 0.59 |      |
+  // Vector source term   : 0.26 | 0.79 |
+  // Nonlinear residual   : 0.54 |      |
   // Mass (scalar)        : 0.21 | 0.58 | 0.05 | 0.08 | 0.08 | 0.06 |
-  // Mass (vector)        : 0.69 | 1.37 | 0.17 | 0.27 | 0.08 | 0.34 |
-  // Laplacian            : 0.18 | 1.15 | 0.03 | 0.07 | 0.08 | 0.03 |
-  // Homogeneous elas     : 0.79 | 4.29 | 0.26 | 0.33 | 0.08 | 0.38 |
-  // Non-homogeneous elast: 0.86 | 6.35 | 0.26 | 0.33 | 0.08 | 0.45 |
+  // Mass (vector)        : 0.68 | 1.37 | 0.17 | 0.27 | 0.08 | 0.33 |
+  // Laplacian            : 0.17 | 1.15 | 0.03 | 0.06 | 0.08 | 0.03 |
+  // Homogeneous elas     : 0.79 | 4.25 | 0.26 | 0.33 | 0.08 | 0.38 |
+  // Non-homogeneous elast: 0.83 | 6.29 | 0.26 | 0.33 | 0.08 | 0.42 |
   if (all || only_one == 3) // ndofu = 321602 ndofp = 160801 ndofchi = 1201
     test_new_assembly(2, 200, 2);
-  // Vector source term   : 0.11 | 0.24 |
-  // Nonlinear residual   : 0.17 |      |
+  // Vector source term   : 0.09 | 0.23 |
+  // Nonlinear residual   : 0.15 |      |
   // Mass (scalar)        : 0.09 | 0.25 | 0.02 | 0.03 | 0.03 | 0.03 |
   // Mass (vector)        : 0.26 | 0.44 | 0.05 | 0.09 | 0.03 | 0.14 |
   // Laplacian            : 0.09 | 0.37 | 0.02 | 0.03 | 0.03 | 0.03 |
   // Homogeneous elas     : 0.26 | 1.28 | 0.06 | 0.09 | 0.03 | 0.14 |
-  // Non-homogeneous elast: 0.30 | 2.38 | 0.07 | 0.10 | 0.03 | 0.17 |
+  // Non-homogeneous elast: 0.28 | 2.38 | 0.06 | 0.10 | 0.03 | 0.16 |
   if (all || only_one == 4) // ndofu = 151959 ndofp =  50653 ndofchi = 6553
     test_new_assembly(3, 18, 2);
-  // Vector source term   : 0.16 | 0.24 |
-  // Nonlinear residual   : 0.39 |      |
+  // Vector source term   : 0.13 | 0.23 |
+  // Nonlinear residual   : 0.37 |      |
   // Mass (scalar)        : 0.11 | 0.25 | 0.05 | 0.05 | 0.03 | 0.03 |
   // Mass (vector)        : 1.13 | 0.89 | 0.21 | 0.35 | 0.03 | 0.75 |
   // Laplacian            : 0.10 | 0.53 | 0.03 | 0.04 | 0.03 | 0.03 |
   // Homogeneous elas     : 1.66 | 3.35 | 0.59 | 0.73 | 0.03 | 0.90 |
-  // Non-homogeneous elast: 1.72 | 9.15 | 0.59 | 0.73 | 0.03 | 0.96 |
+  // Non-homogeneous elast: 1.70 | 9.08 | 0.59 | 0.73 | 0.03 | 0.94 |
   if (all || only_one == 5) // ndofu = 151959 ndofp =  50653 ndofchi = 6553
     test_new_assembly(3, 9, 4);
-  // Vector source term   : 0.13 | 0.20 |
-  // Nonlinear residual   : 0.38 |      |
+  // Vector source term   : 0.11 | 0.19 |
+  // Nonlinear residual   : 0.36 |      |
   // Mass (scalar)        : 0.51 | 0.34 | 0.09 | 0.16 | 0.01 | 0.33 |
   // Mass (vector)        : 4.37 | 1.31 | 0.41 | 1.27 | 0.01 | 3.10 |
-  // Laplacian            : 0.40 | 0.77 | 0.09 | 0.14 | 0.01 | 0.25 |
-  // Homogeneous elas     : 8.93 | 5.23 | 0.88 | 1.43 | 0.01 | 7.49 |
-  // Non-homogeneous elast: 9.01 | 47.4 | 0.76 | 1.35 | 0.01 | 7.65 |
+  // Laplacian            : 0.40 | 0.76 | 0.09 | 0.14 | 0.01 | 0.25 |
+  // Homogeneous elas     : 8.93 | 5.23 | 0.82 | 1.41 | 0.01 | 7.49 |
+  // Non-homogeneous elast: 8.94 | 47.4 | 0.82 | 1.41 | 0.01 | 7.50 |
 
   // Conclusions :
   // - Deactivation of debug test has no sensible effect.

Modified: trunk/getfem/src/getfem/bgeot_geometric_trans.h
URL: 
http://svn.gna.org/viewcvs/getfem/trunk/getfem/src/getfem/bgeot_geometric_trans.h?rev=5450&r1=5449&r2=5450&view=diff
==============================================================================
--- trunk/getfem/src/getfem/bgeot_geometric_trans.h     (original)
+++ trunk/getfem/src/getfem/bgeot_geometric_trans.h     Fri Oct 28 10:15:42 2016
@@ -511,6 +511,10 @@
   /* Optimized operation for small matrices                               */
   scalar_type lu_det(const scalar_type *A, size_type N);
   scalar_type lu_inverse(scalar_type *A, size_type N, bool doassert = true);
+  inline scalar_type lu_det(const base_matrix &A)
+  { return lu_det(&(*(A.begin())), A.nrows()); }
+  inline scalar_type lu_inverse(base_matrix &A, bool doassert = true)
+  { return lu_inverse(&(*(A.begin())), A.nrows(), doassert); }
 
 }  /* end of namespace bgeot.                                             */
 

Modified: trunk/getfem/src/getfem/getfem_mesh_fem.h
URL: 
http://svn.gna.org/viewcvs/getfem/trunk/getfem/src/getfem/getfem_mesh_fem.h?rev=5450&r1=5449&r2=5450&view=diff
==============================================================================
--- trunk/getfem/src/getfem/getfem_mesh_fem.h   (original)
+++ trunk/getfem/src/getfem/getfem_mesh_fem.h   Fri Oct 28 10:15:42 2016
@@ -637,47 +637,29 @@
   template <typename VEC1, typename VEC2>
   void slice_vector_on_basic_dof_of_element(const mesh_fem &mf,
                                             const VEC1 &vec,
-                                            size_type cv, VEC2 &coeff) {
-    size_type nbdof = mf.nb_basic_dof();
-    size_type qmult = gmm::vect_size(vec) / nbdof;
-    GMM_ASSERT1(gmm::vect_size(vec) == qmult * nbdof, "Bad dof vector size");
-
+                                            size_type cv, VEC2 &coeff,
+                                           size_type qmult1 = size_type(-1),
+                                           size_type qmult2 = size_type(-1)) {
+    if (qmult1 == size_type(-1)) {
+      size_type nbdof = mf.nb_basic_dof();
+      qmult1 = gmm::vect_size(vec) / nbdof;
+      GMM_ASSERT1(gmm::vect_size(vec) == qmult1 * nbdof, "Bad dof vector 
size");
+    }
+    if (qmult2 == size_type(-1)) {
+      qmult2 = mf.get_qdim();
+      if (qmult2 > 1) qmult2 /= mf.fem_of_element(cv)->target_dim();
+    }
+    size_type qmultot = qmult1*qmult2;
     auto &ct = mf.ind_scalar_basic_dof_of_element(cv);
-    size_type qmult2 = mf.get_qdim();
-    if (qmult2 > 1) qmult2 /= mf.fem_of_element(cv)->target_dim();
-    size_type qmultot = qmult*qmult2;
     gmm::resize(coeff, ct.size()*qmultot);
- 
+    
     auto it = ct.begin();
     auto itc = coeff.begin();
     if (qmultot == 1) {
       for (; it != ct.end(); ++it) *itc++ = vec[*it];
     } else {
       for (; it != ct.end(); ++it) {
-       auto itv = vec.begin()+(*it)*qmult;
-       for (size_type m = 0; m < qmultot; ++m) *itc++ = *itv++;
-      }
-    }
-  }
-
-  template <typename VEC1, typename VEC2>
-  void slice_vector_on_basic_dof_of_element(const mesh_fem &mf,
-                                            const VEC1 &vec,
-                                            size_type cv, VEC2 &coeff,
-                                           size_type qmult) {
-    auto &ct = mf.ind_scalar_basic_dof_of_element(cv);
-    size_type qmult2 = mf.get_qdim();
-    if (qmult2 > 1) qmult2 /= mf.fem_of_element(cv)->target_dim();
-    size_type qmultot = qmult*qmult2;
-    gmm::resize(coeff, ct.size()*qmultot);
- 
-    auto it = ct.begin();
-    auto itc = coeff.begin();
-    if (qmultot == 1) {
-      for (; it != ct.end(); ++it) *itc++ = vec[*it];
-    } else {
-      for (; it != ct.end(); ++it) {
-       auto itv = vec.begin()+(*it)*qmult;
+       auto itv = vec.begin()+(*it)*qmult1;
        for (size_type m = 0; m < qmultot; ++m) *itc++ = *itv++;
       }
     }

Modified: trunk/getfem/src/getfem_generic_assembly.cc
URL: 
http://svn.gna.org/viewcvs/getfem/trunk/getfem/src/getfem_generic_assembly.cc?rev=5450&r1=5449&r2=5450&view=diff
==============================================================================
--- trunk/getfem/src/getfem_generic_assembly.cc (original)
+++ trunk/getfem/src/getfem_generic_assembly.cc Fri Oct 28 10:15:42 2016
@@ -2340,41 +2340,48 @@
       size_type N = args[0]->sizes()[0];
       __mat_aux1().base_resize(N, N);
       gmm::copy(args[0]->as_vector(), __mat_aux1().as_vector());
-      scalar_type det = bgeot::lu_inverse(&(*(__mat_aux1().begin())), N);
+      scalar_type det = bgeot::lu_inverse(__mat_aux1());
       if (det == scalar_type(0))
         gmm::clear(result.as_vector());
       else {
-        base_tensor::iterator it = result.begin();
-        for (size_type j = 0; j < N; ++j)
-          for (size_type i = 0; i < N; ++i, ++it)
-            *it = __mat_aux1()(j, i) * det;
+        auto it = result.begin();
+       auto ita = __mat_aux1().begin();
+        for (size_type j = 0; j < N; ++j, ++ita) {
+         auto itaa = ita;
+          for (size_type i = 0; i < N; ++i, ++it, itaa += N)
+           *it = (*itaa) * det;
+       }
         GA_DEBUG_ASSERT(it == result.end(), "Internal error");
       }
     }
 
     // Second derivative : det(M)(address@hidden - M^{-T}_{jk}M^{-T}_{li})
     void second_derivative(const arg_list &args, size_type, size_type,
-                           base_tensor &result) const { // To be verified
+                           base_tensor &result) const { // to be verified
       size_type N = args[0]->sizes()[0];
       __mat_aux1().base_resize(N, N);
       gmm::copy(args[0]->as_vector(), __mat_aux1().as_vector());
-      scalar_type det = bgeot::lu_inverse(&(*(__mat_aux1().begin())), N);
+      scalar_type det = bgeot::lu_inverse(__mat_aux1());
       if (det == scalar_type(0))
         gmm::clear(result.as_vector());
       else {
-        base_tensor::iterator it = result.begin();
-        for (size_type l = 0; l < N; ++l)
-          for (size_type k = 0; k < N; ++k)
-            for (size_type j = 0; j < N; ++j)
-              for (size_type i = 0; i < N; ++i, ++it)
-                *it = (__mat_aux1()(j, i) * __mat_aux1()(l,k)
-                      - __mat_aux1()(j,k) * __mat_aux1()(l, i)) * det;
+        auto it = result.begin();
+       auto ita = __mat_aux1().begin(), ita_l = ita;
+        for (size_type l = 0; l < N; ++l, ++ita_l) {
+         auto ita_lk = ita_l, ita_jk = ita;
+         for (size_type k = 0; k < N; ++k, ita_lk += N, ita_jk += N) {
+           auto ita_j = ita;
+            for (size_type j = 0; j < N; ++j, ++ita_j, ++ita_jk) {
+             auto ita_ji = ita_j, ita_li = ita_l;
+              for (size_type i = 0; i < N; ++i, ++it, ita_ji += N, ita_li += N)
+                *it = ((*ita_ji) * (*ita_lk) - (*ita_jk) * (*ita_li)) * det;
+           }
+         }
+       }
         GA_DEBUG_ASSERT(it == result.end(), "Internal error");
       }
     }
   };
-
-
 
   // Inverse Operator (for square matrices)
   struct inverse_operator : public ga_nonlinear_operator {
@@ -2390,7 +2397,7 @@
       size_type N = args[0]->sizes()[0];
       __mat_aux1().base_resize(N, N);
       gmm::copy(args[0]->as_vector(), __mat_aux1().as_vector());
-      bgeot::lu_inverse(&(*(__mat_aux1().begin())), N);
+      bgeot::lu_inverse(__mat_aux1());
       gmm::copy(__mat_aux1().as_vector(), result.as_vector());
     }
 
@@ -2400,13 +2407,20 @@
       size_type N = args[0]->sizes()[0];
       __mat_aux1().base_resize(N, N);
       gmm::copy(args[0]->as_vector(), __mat_aux1().as_vector());
-      bgeot::lu_inverse(&(*(__mat_aux1().begin())), N);
-      base_tensor::iterator it = result.begin();
-      for (size_type l = 0; l < N; ++l)
-        for (size_type k = 0; k < N; ++k)
-          for (size_type j = 0; j < N; ++j)
-            for (size_type i = 0; i < N; ++i, ++it)
-              *it = -__mat_aux1()(i,k)*__mat_aux1()(l,j);
+      bgeot::lu_inverse(__mat_aux1());
+      auto it = result.begin();
+      auto ita = __mat_aux1().begin(), ita_l = ita;
+      for (size_type l = 0; l < N; ++l, ++ita_l) {
+       auto ita_k = ita;
+        for (size_type k = 0; k < N; ++k, ita_k += N) {
+         auto ita_lj = ita_l;
+          for (size_type j = 0; j < N; ++j, ++ita_lj) {
+           auto ita_ik = ita_k;
+            for (size_type i = 0; i < N; ++i, ++it, ++ita_ik)
+              *it = -(*ita_ik) * (*ita_lj);
+         }
+       }
+      }
       GA_DEBUG_ASSERT(it == result.end(), "Internal error");
     }
 
@@ -2418,7 +2432,7 @@
       size_type N = args[0]->sizes()[0];
       __mat_aux1().base_resize(N, N);
       gmm::copy(args[0]->as_vector(), __mat_aux1().as_vector());
-      bgeot::lu_inverse(&(*(__mat_aux1().begin())), N);
+      bgeot::lu_inverse(__mat_aux1());
       base_tensor::iterator it = result.begin();
       for (size_type n = 0; n < N; ++n)
         for (size_type m = 0; m < N; ++m)
@@ -2431,9 +2445,6 @@
       GA_DEBUG_ASSERT(it == result.end(), "Internal error");
     }
   };
-
-
-
 
   //=========================================================================
   // Initialization of predefined functions and operators.
@@ -2708,26 +2719,27 @@
         cv_old(-1) {}
   };
 
-
   struct ga_instruction_slice_local_dofs : public ga_instruction {
     const mesh_fem &mf;
     const base_vector &U;
     const fem_interpolation_context &ctx;
     base_vector &coeff;
     const size_type &ipt;
-    size_type qmult;
+    size_type qmult1, qmult2;
     virtual int exec() {
       if (ipt == 0) {
        GA_DEBUG_INFO("Instruction: Slice local dofs");
-       slice_vector_on_basic_dof_of_element(mf,U,ctx.convex_num(),coeff,qmult);
+       slice_vector_on_basic_dof_of_element(mf, U, ctx.convex_num(),
+                                            coeff, qmult1, qmult2);
       }
       return 0;
     }
     ga_instruction_slice_local_dofs(const mesh_fem &mf_, const base_vector &U_,
                                     const fem_interpolation_context &ctx_,
                                     base_vector &coeff_, const size_type &ipt_,
-                                   size_type qmult_)
-      : mf(mf_), U(U_), ctx(ctx_), coeff(coeff_), ipt(ipt_), qmult(qmult_) {}
+                                   size_type qmult1_, size_type qmult2_)
+      : mf(mf_), U(U_), ctx(ctx_), coeff(coeff_), ipt(ipt_),
+       qmult1(qmult1_), qmult2(qmult2_) {}
   };
 
   struct ga_instruction_update_pfp : public ga_instruction {
@@ -10598,10 +10610,14 @@
             rmi.local_dofs_hierarchy[pnode->name].push_back(if_hierarchy);
             extend_variable_in_gis(workspace, pnode->name, gis);
             // cout << "local dof of " << pnode->name << endl;
+           size_type qmult2 = mf->get_qdim();
+           if (qmult2 > 1 && !(mf->is_uniformly_vectorized()))
+             qmult2 = size_type(-1);
             pgai = std::make_shared<ga_instruction_slice_local_dofs>
               (*mf, *(gis.extended_vars[pnode->name]), gis.ctx,
                rmi.local_dofs[pnode->name], gis.ipt,
-              gis.extended_vars[pnode->name]->size() / mf->nb_basic_dof());
+              gis.extended_vars[pnode->name]->size() / mf->nb_basic_dof(),
+              qmult2);
             rmi.instructions.push_back(std::move(pgai));
           }
 




reply via email to

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