getfem-commits
[Top][All Lists]
Advanced

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

[Getfem-commits] r4910 - /trunk/getfem/src/getfem_generic_assembly.cc


From: logari81
Subject: [Getfem-commits] r4910 - /trunk/getfem/src/getfem_generic_assembly.cc
Date: Thu, 26 Mar 2015 12:24:23 -0000

Author: logari81
Date: Thu Mar 26 13:24:22 2015
New Revision: 4910

URL: http://svn.gna.org/viewcvs/getfem?rev=4910&view=rev
Log:
reduce duplicate code and move some function definitions earlier in the source

Modified:
    trunk/getfem/src/getfem_generic_assembly.cc

Modified: trunk/getfem/src/getfem_generic_assembly.cc
URL: 
http://svn.gna.org/viewcvs/getfem/trunk/getfem/src/getfem_generic_assembly.cc?rev=4910&r1=4909&r2=4910&view=diff
==============================================================================
--- trunk/getfem/src/getfem_generic_assembly.cc (original)
+++ trunk/getfem/src/getfem_generic_assembly.cc Thu Mar 26 13:24:22 2015
@@ -2562,6 +2562,117 @@
     using ga_instruction_val::ga_instruction_val;
   };
 
+  struct ga_instruction_copy_val_base : public ga_instruction {
+    base_tensor &t;
+    base_tensor &Z;
+    size_type qdim;
+
+    virtual int exec(void) {
+      GA_DEBUG_INFO("Instruction: value of test functions");
+      size_type ndof = Z.sizes()[0];
+      size_type target_dim = Z.sizes()[1];
+      size_type Qmult = qdim / target_dim;
+      GA_DEBUG_ASSERT(t.size() == Z.size() * Qmult * Qmult,
+                      "Wrong size for base vector");
+      if (Qmult == 1) {
+        gmm::copy(Z.as_vector(), t.as_vector());
+      } else {
+        gmm::clear(t.as_vector());
+        base_tensor::iterator itZ = Z.begin();
+        size_type s = t.sizes()[0], ss = s * Qmult, sss = s+1;
+
+        // Performs t(i*Qmult+j, k*Qmult + j) = Z(i,k);
+        for (size_type k = 0; k < target_dim; ++k) {
+          base_tensor::iterator it = t.begin() + (ss * k);
+          for (size_type i = 0; i < ndof; ++i, ++itZ) {
+            if (i) it += Qmult;
+            base_tensor::iterator it2 = it;
+            *it2 = *itZ;
+            for (size_type j = 1; j < Qmult; ++j) { it2 += sss; *it2 = *itZ; }
+          }
+        }
+      }
+      return 0;
+    }
+
+    ga_instruction_copy_val_base(base_tensor &tt, base_tensor &Z_, size_type q)
+      : t(tt), Z(Z_), qdim(q) {}
+  };
+
+  struct ga_instruction_copy_grad_base : public ga_instruction_copy_val_base {
+
+    virtual int exec(void) {
+      GA_DEBUG_INFO("Instruction: gradient of test functions");
+      size_type ndof = Z.sizes()[0];
+      size_type target_dim = Z.sizes()[1];
+      size_type N = Z.sizes()[2];
+      size_type Qmult = qdim / target_dim;
+      GA_DEBUG_ASSERT(t.size() == Z.size() * Qmult * Qmult,
+                      "Wrong size for gradient vector");
+      if (Qmult == 1) {
+        gmm::copy(Z.as_vector(), t.as_vector());
+      } else {
+        gmm::clear(t.as_vector());
+        base_tensor::const_iterator itZ = Z.begin();
+        size_type s = t.sizes()[0], ss = s * Qmult, sss = s+1;
+        size_type ssss=ss*target_dim;
+
+        // Performs t(i*Qmult+j, k*Qmult + j, l) = Z(i,k,l);
+        for (size_type l = 0; l < N; ++l)
+          for (size_type k = 0; k < target_dim; ++k) {
+            base_tensor::iterator it = t.begin() + (ss * k + ssss*l);
+            for (size_type i = 0; i < ndof; ++i, ++itZ) {
+              if (i) it += Qmult;
+              base_tensor::iterator it2 = it;
+              *it2 = *itZ;
+              for (size_type j = 1; j < Qmult; ++j) { it2 += sss; *it2 = *itZ; 
}
+            }
+          }
+      }
+      return 0;
+    }
+
+    using ga_instruction_copy_val_base::ga_instruction_copy_val_base;
+  };
+
+  struct ga_instruction_copy_hess_base : public ga_instruction_copy_val_base {
+
+    virtual int exec(void) {
+      GA_DEBUG_INFO("Instruction: Hessian of test functions");
+      size_type ndof = Z.sizes()[0];
+      size_type target_dim = Z.sizes()[1];
+      size_type N2 = Z.sizes()[2];
+      size_type Qmult = qdim / target_dim;
+      GA_DEBUG_ASSERT(t.size() == Z.size() * Qmult * Qmult,
+                      "Wrong size for Hessian vector");
+      if (Qmult == 1) {
+        gmm::copy(Z.as_vector(), t.as_vector());
+      } else {
+        gmm::clear(t.as_vector());
+
+        base_tensor::const_iterator itZ = Z.begin();
+        size_type s = t.sizes()[0], ss = s * Qmult, sss = s+1;
+        size_type ssss=ss*target_dim;
+
+        // Performs t(i*Qmult+j, k*Qmult + j, l, m) = Z(i,k,l*N+m);
+        for (size_type l = 0; l < N2; ++l)
+          for (size_type k = 0; k < target_dim; ++k) {
+            base_tensor::iterator it = t.begin() + (ss * k + ssss*l);
+            for (size_type i = 0; i < ndof; ++i, ++itZ) {
+              if (i) it += Qmult;
+              base_tensor::iterator it2 = it;
+              *it2 = *itZ;
+              for (size_type j = 1; j < Qmult; ++j) { it2 += sss; *it2 = *itZ; 
}
+            }
+          }
+      }
+      return 0;
+    }
+
+    using ga_instruction_copy_val_base::ga_instruction_copy_val_base;
+  };
+
+
   struct ga_instruction_elementary_transformation_val : public ga_instruction {
     base_tensor &t;
     base_tensor &Z;
@@ -3008,119 +3119,6 @@
      const mesh_fem **mfg_,
      fem_interpolation_context &ctx_, size_type q)
       : t(tt), m(m_), mfn(mfn_), mfg(mfg_), ctx(ctx_), qdim(q) {}
-  };
-
-
-  struct ga_instruction_copy_val_base : public ga_instruction {
-    base_tensor &t;
-    base_tensor &Z;
-    size_type qdim;
-    virtual int exec(void) {
-      GA_DEBUG_INFO("Instruction: value of test functions");
-      size_type ndof = Z.sizes()[0];
-      size_type target_dim = Z.sizes()[1];
-      size_type Qmult = qdim / target_dim;
-      GA_DEBUG_ASSERT(t.size() == Z.size() * Qmult * Qmult,
-                      "Wrong size for base vector");
-      if (Qmult == 1) {
-        gmm::copy(Z.as_vector(), t.as_vector());
-      } else {
-        gmm::clear(t.as_vector());
-        base_tensor::iterator itZ = Z.begin();
-        size_type s = t.sizes()[0], ss = s * Qmult, sss = s+1;
-
-        // Performs t(i*Qmult+j, k*Qmult + j) = Z(i,k);
-        for (size_type k = 0; k < target_dim; ++k) {
-          base_tensor::iterator it = t.begin() + (ss * k);
-          for (size_type i = 0; i < ndof; ++i, ++itZ) {
-            if (i) it += Qmult;
-            base_tensor::iterator it2 = it;
-            *it2 = *itZ;
-            for (size_type j = 1; j < Qmult; ++j) { it2 += sss; *it2 = *itZ; }
-          }
-        }
-      }
-      return 0;
-    }
-    ga_instruction_copy_val_base(base_tensor &tt, base_tensor &Z_, size_type q)
-      : t(tt), Z(Z_), qdim(q) {}
-  };
-
-  struct ga_instruction_copy_grad_base : public ga_instruction {
-    base_tensor &t;
-    base_tensor &Z;
-    size_type qdim;
-    virtual int exec(void) {
-      GA_DEBUG_INFO("Instruction: gradient of test functions");
-      size_type ndof = Z.sizes()[0];
-      size_type target_dim = Z.sizes()[1];
-      size_type N = Z.sizes()[2];
-      size_type Qmult = qdim / target_dim;
-      GA_DEBUG_ASSERT(t.size() == Z.size() * Qmult * Qmult,
-                      "Wrong size for gradient vector");
-      if (Qmult == 1) {
-        gmm::copy(Z.as_vector(), t.as_vector());
-      } else {
-        gmm::clear(t.as_vector());
-        base_tensor::const_iterator itZ = Z.begin();
-        size_type s = t.sizes()[0], ss = s * Qmult, sss = s+1;
-        size_type ssss=ss*target_dim;
-
-        // Performs t(i*Qmult+j, k*Qmult + j, l) = Z(i,k,l);
-        for (size_type l = 0; l < N; ++l)
-          for (size_type k = 0; k < target_dim; ++k) {
-            base_tensor::iterator it = t.begin() + (ss * k + ssss*l);
-            for (size_type i = 0; i < ndof; ++i, ++itZ) {
-              if (i)  it += Qmult;
-              base_tensor::iterator it2 = it;
-              *it2 = *itZ;
-              for (size_type j = 1; j < Qmult; ++j) { it2 += sss; *it2 = *itZ; 
}
-            }
-          }
-      }
-      return 0;
-    }
-    ga_instruction_copy_grad_base(base_tensor &tt, base_tensor &Z_, size_type 
q)
-      : t(tt), Z(Z_), qdim(q) {}
-  };
-
-  struct ga_instruction_copy_hess_base : public ga_instruction {
-    base_tensor &t;
-    base_tensor &Z;
-    size_type qdim;
-    virtual int exec(void) {
-      GA_DEBUG_INFO("Instruction: Hessian of test functions");
-      size_type ndof = Z.sizes()[0];
-      size_type target_dim = Z.sizes()[1];
-      size_type N2 = Z.sizes()[2];
-      size_type Qmult = qdim / target_dim;
-      GA_DEBUG_ASSERT(t.size() == Z.size() * Qmult * Qmult,
-                      "Wrong size for Hessian vector");
-      if (Qmult == 1) {
-        gmm::copy(Z.as_vector(), t.as_vector());
-      } else {
-        gmm::clear(t.as_vector());
-
-        base_tensor::const_iterator itZ = Z.begin();
-        size_type s = t.sizes()[0], ss = s * Qmult, sss = s+1;
-        size_type ssss=ss*target_dim;
-
-        // Performs t(i*Qmult+j, k*Qmult + j, l, m) = Z(i,k,l*N+m);
-        for (size_type l = 0; l < N2; ++l)
-          for (size_type k = 0; k < target_dim; ++k) {
-            base_tensor::iterator it = t.begin() + (ss * k + ssss*l);
-            for (size_type i = 0; i < ndof; ++i, ++itZ) {
-              if (i) it += Qmult;
-              base_tensor::iterator it2 = it;
-              *it2 = *itZ;
-              for (size_type j = 1; j < Qmult; ++j) { it2 += sss; *it2 = *itZ; 
}
-            }
-          }
-      }
-      return 0;
-    }
-    ga_instruction_copy_hess_base(base_tensor &tt, base_tensor &Z_, size_type 
q)
-      : t(tt), Z(Z_), qdim(q) {}
   };
 
 




reply via email to

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