getfem-commits
[Top][All Lists]
Advanced

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

[Getfem-commits] (no subject)


From: Yves Renard
Subject: [Getfem-commits] (no subject)
Date: Sun, 6 May 2018 14:55:20 -0400 (EDT)

branch: devel-yves-generic-assembly-modifs
commit 1258d6219fa49c2e3afed8583e6a072fa30d8062
Author: Yves Renard <address@hidden>
Date:   Sun May 6 14:55:42 2018 +0200

    Minor fixes
---
 interface/tests/python/check_asm.py             | 42 ++++++++++++++++++++++---
 src/getfem_generic_assembly_compile_and_exec.cc | 15 ++++++---
 src/getfem_generic_assembly_semantic.cc         |  5 +--
 3 files changed, 51 insertions(+), 11 deletions(-)

diff --git a/interface/tests/python/check_asm.py 
b/interface/tests/python/check_asm.py
index ad8bf86..a3359d3 100644
--- a/interface/tests/python/check_asm.py
+++ b/interface/tests/python/check_asm.py
@@ -35,7 +35,7 @@ import os
 NX = 4
 m = gf.Mesh('triangles grid', np.arange(0,1+1./NX,1./NX),
             np.arange(0,1+1./NX,1./NX))     # Structured mesh
-fem =  gf.Fem('FEM_PK(2,1)')
+fem = gf.Fem('FEM_PK(2,1)')
 mfu = gf.MeshFem(m, 1); mfu.set_fem(fem)    # Lagrange P1 scalar fem
 mim = gf.MeshIm(m, gf.Integ('IM_TRIANGLE(4)'))
 mfv = gf.MeshFem(m, 3); mfv.set_fem(fem)    # Lagrange P1 vector fem
@@ -52,10 +52,44 @@ md.set_variable('u', U)
 md.add_fem_variable('v', mfv)
 md.set_variable('v', V)
 
+# Simple test on the integral of u
+result = gf.asm('generic', mim, 0, "u", -1, md)
+if (abs(result-1) > 1e-8) : print "Bad value"; exit(1)
 
-print gf.asm('generic', mim, 0, "Def P(a):=a*(a'); Print(P(Grad_v))", -1, md)
-print gf.asm('generic', mim, 1, "Print(Grad_Test_u)", -1, md)
-print gf.asm('generic', mim, 0, "Def P(a):=a*(a'); Contract(P(Grad_v), 1, 2)", 
-1, md)
+# Single contraction and comparison with Trace
+result1 = gf.asm('generic', mim, 0,
+                 "Def P(a):=a*(a'); Contract(P(Grad_v), 1, 2)", -1, md)
+result2 = gf.asm('generic', mim, 0,
+                 "Def P(a):=a*(a'); Trace(P(Grad_v))", -1, md)
+if (abs(result1-result2) > 1e-8) : print "Bad value"; exit(1)
+
+# Constant order 3 tensor contraction test
+result1 = gf.asm('generic', mim, 0,
+                 "Contract([[[1,1],[2,2]],[[1,1],[2,2]]], 1, 2)", -1, md)
+result2 = np.array([3., 3.]);
+if (np.linalg.norm(result1-result2) > 1e-8) : print "Bad value"; exit(1)
+
+# Single contraction, comparison with "*"
+result1 = gf.asm('generic', mim, 0, "Contract(Grad_v, 2, Grad_u, 1)", -1, md)
+result2 = gf.asm('generic', mim, 0, "Grad_v * Grad_u", -1, md)
+if (np.linalg.norm(result1-result2) > 1e-8) : print "Bad value"; exit(1)
+
+# Double contraction order one expression, comparison with ":"
+result1 = gf.asm('generic', mim, 1,
+                 "Contract(Grad_v, 1, 2, Grad_Test_v, 1, 2)", -1, md)
+result2 = gf.asm('generic', mim, 1, "Grad_v : Grad_Test_v", -1, md)
+if (np.linalg.norm(result1-result2) > 1e-8) : print "Bad value"; exit(1)
+
+# Double contraction order two expression, comparison with ":"
+result1 = gf.asm('generic', mim, 2,
+                 "Contract(Grad_Test2_v, 1, 2, Grad_Test_v, 1, 2)", -1, md)
+result2 = gf.asm('generic', mim, 2, "Grad_Test2_v : Grad_Test_v", -1, md)
+if (np.linalg.norm(result1.full()-result2.full()) > 1e-8) :
+  print "Bad value"; exit(1)
+result1 = gf.asm('generic', mim, 2,
+                 "Contract(Grad_Test_v, 2, 1, Grad_Test2_v, 2, 1)", -1, md)
+if (np.linalg.norm(result1.full()-result2.full()) > 1e-8) :
+  print "Bad value"; exit(1)
 
 
 
diff --git a/src/getfem_generic_assembly_compile_and_exec.cc 
b/src/getfem_generic_assembly_compile_and_exec.cc
index a341d6d..af7d52a 100644
--- a/src/getfem_generic_assembly_compile_and_exec.cc
+++ b/src/getfem_generic_assembly_compile_and_exec.cc
@@ -1969,7 +1969,7 @@ namespace getfem {
     virtual int exec() {
       GA_DEBUG_INFO("Instruction: single contraction on a single tensor");
 
-      size_type ii1 = tc1.size() / (nn*ii2*ii3);
+      size_type ii1 = tc1.size() / (nn*nn*ii2*ii3);
       
       base_tensor::iterator it = t.begin();
       for (size_type i = 0; i < ii3; ++i)
@@ -5923,7 +5923,7 @@ namespace getfem {
        size_type kk = 0, ll = 1;
        for (size_type i = 1; i < pnode->children.size(); ++i) {
          if (i == ind[kk]) {
-           ind[kk] = size_type(round(pnode->children[i]->tensor()[0]));
+           ind[kk] = size_type(round(pnode->children[i]->tensor()[0])-1);
            indsize[kk] =  pnode->children[ll]->tensor_proper_size(ind[kk]);
            ++kk;
          } else ll = i;
@@ -5963,10 +5963,11 @@ namespace getfem {
        } 
        else if (pnode->children.size() == 7) {
          // Particular cases should be detected (ii2=ii3=1 in particular).
-         GMM_ASSERT1(false, "to be done !");
          size_type i1 = ind[0], i2 = ind[1], i3 = ind[2], i4 = ind[3];
          size_type nn1 = indsize[0], nn2 = indsize[1];
          size_type ii1 = 1, ii2 = 1, ii3 = 1, ii4 = 1, ii5 = 1, ii6 = 1;
+         if (i1 > i2)
+           { std::swap(i1, i2); std::swap(i3, i4); std::swap(nn1, nn2); }
          for (size_type i = 0; i < child1->tensor_order(); ++i) {
            if (i < i1) ii1 *= child1->tensor_proper_size(i);
            if (i > i1 && i < i2) ii2 *= child1->tensor_proper_size(i);
@@ -5978,8 +5979,6 @@ namespace getfem {
              ii5 *= child2->tensor_proper_size(i);
            if (i > i3 && i > i4) ii6 *= child2->tensor_proper_size(i);
          }
-         if (i1 > i2)
-           { std::swap(i1, i2); std::swap(i3, i4); std::swap(nn1, nn2); }
          if (child1->test_function_type==1 && child2->test_function_type==2)
            pgai = std::make_shared<ga_instruction_contract_2_2_rev>
              (pnode->tensor(), child1->tensor(), child2->tensor(),
@@ -6331,6 +6330,9 @@ namespace getfem {
                 break;
               case 1:
                 {
+                 GMM_ASSERT1(root->tensor_proper_size() == 1,
+                             "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);
@@ -6370,6 +6372,9 @@ namespace getfem {
                 break;
               case 2:
                 {
+                 GMM_ASSERT1(root->tensor_proper_size() == 1,
+                             "Invalid vector or tensor quantity. An order 2 "
+                             "weak form has to be a scalar quantity");
                   const mesh_fem 
*mf1=workspace.associated_mf(root->name_test1);
                   const mesh_fem 
*mf2=workspace.associated_mf(root->name_test2);
                   const mesh_fem **mfg1 = 0, **mfg2 = 0;
diff --git a/src/getfem_generic_assembly_semantic.cc 
b/src/getfem_generic_assembly_semantic.cc
index 6bd1c8d..07340cb 100644
--- a/src/getfem_generic_assembly_semantic.cc
+++ b/src/getfem_generic_assembly_semantic.cc
@@ -1800,12 +1800,13 @@ namespace getfem {
                             "Invalid parameter for Contract. "
                             "Should be an index number.");
            ind[kk] = size_type(round(pnode->children[i]->tensor()[0]));
-           indsize[kk] =  pnode->children[ll]->tensor_proper_size(ind[kk]);
            order = pnode->children[ll]->tensor_order();
            if (ind[kk] < 1 || ind[kk] > order)
              ga_throw_error(pnode->children[i]->expr, pnode->children[i]->pos,
                             "Parameter out of range for Contract (should be "
                             "between 1 and " << order << ")");
+           ind[kk]--;
+           indsize[kk] =  pnode->children[ll]->tensor_proper_size(ind[kk]);
            if (kk >= ind.size()/2 && indsize[kk] != indsize[kk-ind.size()/2])
                ga_throw_error(child0->expr, child0->pos,
                               "Invalid parameters for Contract. Cannot "
@@ -1827,7 +1828,7 @@ namespace getfem {
          size_type i1 = ind[0], i2 = ind[1];
          if (i1 == i2)
            ga_throw_error(child0->expr, child0->pos,
-                          "Invalid parameters for Contract. Repeated index");
+                          "Invalid parameters for Contract. Repeated index.");
          
          mi.resize(0);
          for (size_type i = 0; i < pnode->nb_test_functions(); ++i)



reply via email to

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