From 439355ce1c5932bbe2e77ae42e6c00f0c4cdae75 Mon Sep 17 00:00:00 2001
From: Martin Genet <martin.genet@polytechnique.edu>
Date: Tue, 13 Feb 2018 21:20:43 +0100
Subject: [PATCH] getting problem dimension from mesh instead of images

---
 fedic.py | 27 +++++++++++++++++----------
 1 file changed, 17 insertions(+), 10 deletions(-)

diff --git a/fedic.py b/fedic.py
index 95856c7..15c2238 100644
--- a/fedic.py
+++ b/fedic.py
@@ -112,6 +112,10 @@ def fedic(
         assert (os.path.exists(mesh_filename)),\
             "No mesh in "+mesh_filename+". Aborting."
         mesh = dolfin.Mesh(mesh_filename)
+    mesh_dimension = mesh.ufl_domain().geometric_dimension()
+    assert (mesh_dimension in (2,3)),\
+        "mesh_dimension ("+str(mesh_dimension)+") must be 2 or 3. Aborting."
+    mypy.print_var("mesh_dimension",mesh_dimension,tab+1)
     mypy.print_var("mesh_n_cells",len(mesh.cells()),tab+1)
     dV = dolfin.Measure(
         "dx",
@@ -124,6 +128,9 @@ def fedic(
         domain=mesh)
     mesh_V0 = dolfin.assemble(dolfin.Constant(1) * dV)
     mypy.print_sci("mesh_V0",mesh_V0,tab+1)
+    mesh_h0 = mesh_V0**(1./mesh_dimension)
+    mypy.print_sci("mesh_h0",mesh_h0,tab+1)
+    mesh_h0 = dolfin.Constant(mesh_h0)
 
     if (print_refined_mesh):
         mesh_for_plot = dolfin.refine(mesh)
@@ -157,9 +164,9 @@ def fedic(
     images_dimension = myvtk.getImageDimensionality(
         image=ref_image,
         verbose=0)
+    assert (images_dimension == mesh_dimension),\
+        "images_dimension ("+str(images_dimension)+") ≠ mesh_dimension ("+str(mesh_dimension)+"). Aborting."
     mypy.print_var("images_dimension",images_dimension,tab+1)
-    assert (images_dimension in (2,3)),\
-        "images_dimension must be 2 or 3. Aborting."
     fe = dolfin.FiniteElement(
         family="Quadrature",
         cell=mesh.ufl_cell(),
@@ -176,7 +183,7 @@ def fedic(
         degree=images_quadrature,
         quad_scheme="default")
     te._quad_scheme = "default"                       # should not be needed
-    for k in xrange(images_dimension**2):             # should not be needed
+    for k in xrange(mesh_dimension**2):             # should not be needed
         te.sub_elements()[k]._quad_scheme = "default" # should not be needed
     if (images_expressions_type == "cpp"):
         Iref = dolfin.Expression(
@@ -278,7 +285,7 @@ def fedic(
             os.remove(filename)
 
     mypy.print_str("Initializing volume file…",tab)
-    I = dolfin.Identity(images_dimension)
+    I = dolfin.Identity(mesh_dimension)
     F = I + dolfin.grad(U)
     J = dolfin.det(F)
 
@@ -294,12 +301,12 @@ def fedic(
         mypy.print_str("Defining regularization energy…",tab)
         E     = dolfin.Constant(1.0)
         nu    = dolfin.Constant(regul_poisson)
-        kappa = E/3/(1-2*nu)                            # = E/3 if nu = 0
-        lmbda = E*nu/(1+nu)/(1-(images_dimension-1)*nu) # = 0   if nu = 0
-        mu    = E/2/(1+nu)                              # = E/2 if nu = 0
-        C1    = mu/2                                    # = E/4 if nu = 0
-        C2    = mu/2                                    # = E/4 if nu = 0
-        D1    = kappa/2                                 # = E/6 if nu = 0
+        kappa = E/3/(1-2*nu)                          # = E/3 if nu = 0
+        lmbda = E*nu/(1+nu)/(1-(mesh_dimension-1)*nu) # = 0   if nu = 0
+        mu    = E/2/(1+nu)                            # = E/2 if nu = 0
+        C1    = mu/2                                  # = E/4 if nu = 0
+        C2    = mu/2                                  # = E/4 if nu = 0
+        D1    = kappa/2                               # = E/6 if nu = 0
 
         if (regul_model == "linear"): # <- super bad
             e = dolfin.sym(dolfin.grad(U))
-- 
GitLab