From 30d765d1d4489a79796c7ebdf53aed0659277c08 Mon Sep 17 00:00:00 2001
From: Christophe Geuzaine <cgeuzaine@ulg.ac.be>
Date: Thu, 15 Mar 2018 21:55:27 +0100
Subject: [PATCH] up

---
 Elasticity/wrench2D.pro | 191 ++++++++++++++++++----------------------
 1 file changed, 88 insertions(+), 103 deletions(-)

diff --git a/Elasticity/wrench2D.pro b/Elasticity/wrench2D.pro
index ce97783..5751251 100644
--- a/Elasticity/wrench2D.pro
+++ b/Elasticity/wrench2D.pro
@@ -13,41 +13,34 @@
 
 /* Linear elasticity with GetDP:
 
-   GetDP has a peculiar way to deal with linear elasticity.
-   Instead of vector field "u = Vector[ ux, uy, uz ]",
-   the displacement field is regarded as two (2D case) or 3 (3D case) scalar fields.
-   Unlike conventional formulations, GetDP's formulation is written
-   in terms of the gradient "Grad u" of the displacement field,
-   which is a non-symmetric tensor, and the needed symmetrization
-   (to define the strain tensor and relate it to the stress tensor)
-   is done through the constitutive relationship (Hooke law).
-   The reason for this unusual formulation is to be able to use also for elastic problems
-   the powerful geometrical and homological kernel of GetDP,
-   which relies on the operators Grad, Curl and Div.
-
-   The "Grad u" formulation entails a small increase of assembly work
-   but makes in counterpart lots of geometrical features
-   implemented in GetDP (change of coordinates, function spaces, etc...)
-   applicable to elastic problems out-of-the-box,
-   since the scalar fields { ux, uy, uz } have exactly the same geometrical properties
-   as, e.g. a scalar electrip potential or a temperature field.
-*/
-
+   GetDP has a peculiar way to deal with linear elasticity.  Instead of a vector
+   field "u = Vector[ ux, uy, uz ]", the displacement field is regarded as two
+   (2D case) or 3 (3D case) scalar fields. Unlike conventional formulations
+   then, GetDP's formulation is written in terms of the gradient "Grad u" of the
+   displacement field, which is a non-symmetric tensor, and the needed
+   symmetrization (to define the strain tensor and relate it to the stress
+   tensor) is done through the constitutive relationship (Hooke law).  The
+   reason for this unusual formulation is to be able to use also for elastic
+   problems the powerful geometrical and homological kernel of GetDP, which
+   relies on the operators Grad, Curl and Div.
+
+   The "Grad u" formulation entails a small increase of assembly work but makes
+   in counterpart lots of geometrical features implemented in GetDP (change of
+   coordinates, function spaces, etc...)  applicable to elastic problems
+   out-of-the-box, since the scalar fields { ux, uy, uz } have exactly the same
+   geometrical properties as, e.g. a scalar electric potential or a temperature
+   field. */
 
 Include "wrench2D_common.pro";
 
-Young = 1e9 *
-  DefineNumber[ 200, Name "Material/Young modulus [GPa]"];
-Poisson =
-  DefineNumber[ 0.3, Name "Material/Poisson coefficient []"];
-AppliedForce =
-  DefineNumber[ 100, Name "Material/Applied force [N]"];
+Young = 1e9 * DefineNumber[ 200, Name "Material/Young modulus [GPa]"];
+Poisson = DefineNumber[ 0.3, Name "Material/Poisson coefficient []"];
+AppliedForce = DefineNumber[ 100, Name "Material/Applied force [N]"];
 
 // Approximation of the maximum deflection by an analytical model:
 // Deflection = PL^3/(3EI) with I = Width^3*Thickness/12
-Deflection =
-  DefineNumber[4*AppliedForce*((LLength-0.018)/Width)^3/(Young*Thickness)*1e3,
-	       Name "Solution/Deflection (analytical) [mm]", ReadOnly 1];
+Deflection = DefineNumber[4*AppliedForce*((LLength-0.018)/Width)^3/(Young*Thickness)*1e3,
+                          Name "Solution/Deflection (analytical) [mm]", ReadOnly 1];
 
 Group {
   // Physical regions: Give explicit labels to the regions defined in the .geo file
@@ -56,17 +49,16 @@ Group {
   Force = Region[ 3 ];
 
   // Abstract regions:
-  Vol_Elast_Mec = Region[ { Wrench } ];
-  Vol_Force_Mec = Region[ { Wrench } ];
-  Sur_Clamp_Mec = Region[ { Grip } ];
-  Sur_Force_Mec = Region[ { Force } ];
-/*
-  Signification of the abstract regions:
-  Vol_Elast_Mec       Elastic domain
-  Vol_Force_Mec       Region with imposed volumic force
-  Sur_Force_Mec       Surface with imposed surface traction
-  Sur_Clamp_Mec       Surface with imposed zero displacements (all components)
-*/
+  Vol_Mec = Region[ Wrench ];
+  Vol_Force_Mec = Region[ Wrench ];
+  Sur_Clamp_Mec = Region[ Grip ];
+  Sur_Force_Mec = Region[ Force ];
+
+  /* Signification of the abstract regions:
+     - Vol_Mec       : Elastic domain
+     - Vol_Force_Mec : Region with imposed volumic force
+     - Sur_Force_Mec : Surface with imposed surface traction
+     - Sur_Clamp_Mec : Surface with imposed zero displacements (all components) */
 }
 
 Function {
@@ -84,18 +76,17 @@ Function {
   pressure_y[] = -AppliedForce/(SurfaceArea[]*Thickness); // downward vertical force
 }
 
-
-/* Hooke law
+/* Hooke's law
 
    The material law
 
    sigma_ij = C_ijkl epsilon_ij
 
-   is represented in 2D by 4 2x2 tensors C_ij[], i,j=1,2
-   depending on the Lamé coefficients of the isotropic linear material,
+   is represented in 2D by 4 2x2 tensors C_ij[], i,j=1,2, depending on the Lamé
+   coefficients of the isotropic linear material,
 
-   lambda = E[]*nu[]/(1.+nu[])/(1.-2.*nu[]);
-   mu = E[]/2./(1.+nu[]);
+   lambda = E[]*nu[]/(1.+nu[])/(1.-2.*nu[])
+   mu = E[]/2./(1.+nu[])
 
    as follows
 
@@ -103,8 +94,7 @@ Function {
    EPD:  a[] = lambda + 2 mu     b[] = mu     c[] = lambda
     3D:  a[] = lambda + 2 mu     b[] = mu     c[] = lambda
 
-   respectively for the 2D plane strain (EPD), 2D plane stress (EPS) and 3D cases.
-*/
+   respectively for the 2D plane strain (EPD), 2D plane stress (EPS) and 3D cases. */
 
 Function {
   Flag_EPC = 1;
@@ -138,45 +128,40 @@ Constraint {
   }
 }
 
-/* As explained above, the displacement field is discretized
-   as two scalar fields "ux" and "uy", which are the spatial components
-   of the vector field "u" in a fixed Cartesian coordinate system.
+/* As explained above, the displacement field is discretized as two scalar
+   fields "ux" and "uy", which are the spatial components of the vector field
+   "u" in a fixed Cartesian coordinate system.
 
    Boundary conditions like
 
    ux = ... ;
    uy = ... ;
 
-   translate naturally into Dirichlet constraints
-   on the scalar "ux" and "uy" FunctionSpaces.
-   Conditions like, however,
+   translate naturally into Dirichlet constraints on the scalar "ux" and "uy"
+   FunctionSpaces. More exotic conditions like
 
    u . n = ux Cos [th] + uy Sin [th] = ... ;
 
-   are less naturally accounted for within the "Grad u" formulation.
-   Fortunately, they are rather uncommon.
+   are less naturally accounted for within the "Grad u" formulation; but they
+   could be easily implemented with a Lagrange multplier.
 
-   Finite element shape (triangles or quadrangles) makes no difference
-   in the definition of the FunctionSpaces. The appropriate shape functions to be used
+   Finite element shape (triangles or quadrangles) makes no difference in the
+   definition of the FunctionSpaces. The appropriate shape functions to be used
    are determined by GetDP at a much lower level on basis of the information
    contained in the *.msh file.
 
-   Second order elements, on the other hand, are implemented in the hierarchical fashion
-   by adding to the first order node-based shape functions
-   a set of second order edge-based functions
-   to complete a basis for 2d order polynomials on the reference element.
- */
-
+   Second order elements, on the other hand, are implemented in the hierarchical
+   fashion by adding to the first order node-based shape functions a set of
+   second order edge-based functions to complete a basis for 2d order
+   polynomials on the reference element. */
 
 // Domain of definition of the "ux" and "uy" FunctionSpaces
 Group {
-  Dom_H_u_Mec = Region[ { Vol_Elast_Mec,
-			  Sur_Force_Mec,
-			  Sur_Clamp_Mec} ];
+  Dom_H_u_Mec = Region[ { Vol_Mec, Sur_Force_Mec, Sur_Clamp_Mec} ];
 }
 
-Flag_Degree =
-  DefineNumber[ 0, Name "Geometry/Use degree 2 (hierarch.)", Choices{0,1}, Visible 1];
+Flag_Degree = DefineNumber[ 0, Name "Geometry/Use degree 2 (hierarch.)",
+                            Choices{0,1}, Visible 1];
 FE_Degree = ( Flag_Degree == 0 ) ? 1 : 2; // Convert flag value into polynomial degree
 
 FunctionSpace {
@@ -233,36 +218,30 @@ Jacobian {
 }
 
 /* Adapt the number of Gauss points to the polynomial degree of the finite elements
-is as simple as this: */
-If (FE_Degree == 1)
+   is as simple as this: */
 Integration {
   { Name Gauss_v;
     Case {
-      {Type Gauss;
+      If (FE_Degree == 1)
+      { Type Gauss;
         Case {
-	  { GeoElement Line       ; NumberOfPoints  3; }
+          { GeoElement Line       ; NumberOfPoints  3; }
           { GeoElement Triangle   ; NumberOfPoints  3; }
           { GeoElement Quadrangle ; NumberOfPoints  4; }
         }
       }
-    }
-  }
-}
-ElseIf (FE_Degree == 2)
-Integration {
-  { Name Gauss_v;
-    Case {
-      {Type Gauss;
+      Else
+      { Type Gauss;
         Case {
 	  { GeoElement Line       ; NumberOfPoints  5; }
           { GeoElement Triangle   ; NumberOfPoints  7; }
           { GeoElement Quadrangle ; NumberOfPoints  7; }
         }
       }
+      EndIf
     }
   }
 }
-EndIf
 
 Formulation {
   { Name Elast_u ; Type FemEquation ;
@@ -272,13 +251,13 @@ Formulation {
     }
     Equation {
       Integral { [ -C_xx[] * Dof{d ux}, {d ux} ] ;
-        In Vol_Elast_Mec ; Jacobian Vol ; Integration Gauss_v ; }
+        In Vol_Mec ; Jacobian Vol ; Integration Gauss_v ; }
       Integral { [ -C_xy[] * Dof{d uy}, {d ux} ] ;
-        In Vol_Elast_Mec ; Jacobian Vol ; Integration Gauss_v ; }
+        In Vol_Mec ; Jacobian Vol ; Integration Gauss_v ; }
       Integral { [ -C_yx[] * Dof{d ux}, {d uy} ] ;
-        In Vol_Elast_Mec ; Jacobian Vol ; Integration Gauss_v ; }
+        In Vol_Mec ; Jacobian Vol ; Integration Gauss_v ; }
       Integral { [ -C_yy[] * Dof{d uy}, {d uy} ] ;
-        In Vol_Elast_Mec ; Jacobian Vol ; Integration Gauss_v ; }
+        In Vol_Mec ; Jacobian Vol ; Integration Gauss_v ; }
 
       Integral { [ force_x[] , {ux} ];
         In Vol_Force_Mec ; Jacobian Vol ; Integration Gauss_v ; }
@@ -310,29 +289,36 @@ Resolution {
 PostProcessing {
   { Name Elast_u ; NameOfFormulation Elast_u ;
     PostQuantity {
-      { Name u ; Value { Term { [ Vector[ {ux}, {uy}, 0 ]];
-	      In Vol_Elast_Mec ; Jacobian Vol ; } } }
-      { Name uy ; Value { Term { [ 1e3*{uy} ];
-	      In Vol_Elast_Mec ; Jacobian Vol ; } } }
-      { Name sig_xx ; Value { Term {
-	    [ CompX[  C_xx[]*{d ux} + C_xy[]*{d uy} ] ];
-	    In Vol_Elast_Mec ; Jacobian Vol ; } } }
-      { Name sig_xy ; Value { Term {
-	    [ CompY[  C_xx[]*{d ux} + C_xy[]*{d uy} ] ];
-	    In Vol_Elast_Mec ; Jacobian Vol ; } } }
-      { Name sig_yy ; Value { Term {
-	    [  CompY [ C_yx[]*{d ux} + C_yy[]*{d uy} ] ];
-	    In Vol_Elast_Mec ; Jacobian Vol ; } } }
+      { Name u ; Value {
+          Term { [ Vector[ {ux}, {uy}, 0 ]]; In Vol_Mec ; Jacobian Vol ; }
+        }
+      }
+      { Name uy ; Value {
+          Term { [ 1e3*{uy} ]; In Vol_Mec ; Jacobian Vol ; }
+        }
+      }
+      { Name sig_xx ; Value {
+          Term { [ CompX[  C_xx[]*{d ux} + C_xy[]*{d uy} ] ];
+            In Vol_Mec ; Jacobian Vol ; }
+        }
+      }
+      { Name sig_xy ; Value {
+          Term { [ CompY[  C_xx[]*{d ux} + C_xy[]*{d uy} ] ];
+            In Vol_Mec ; Jacobian Vol ; }
+        }
+      }
+      { Name sig_yy ; Value {
+          Term { [  CompY [ C_yx[]*{d ux} + C_yy[]*{d uy} ] ];
+            In Vol_Mec ; Jacobian Vol ; }
+        }
+      }
     }
   }
 }
 
-
-
 PostOperation {
   { Name pos; NameOfPostProcessing Elast_u;
     Operation {
-
       If(FE_Degree == 1)
 	Print[ sig_xx, OnElementsOf Wrench, File "sigxx.pos" ];
         Print[ u, OnElementsOf Wrench, File "u.pos" ];
@@ -356,7 +342,6 @@ PostOperation {
   }
 }
 
-
 // Tell Gmsh which GetDP commands to execute when running the model.
 DefineConstant[
   R_ = {"Elast_u", Name "GetDP/1ResolutionChoices", Visible 0},
-- 
GitLab