Shape Derivatives

Learning targets (advanced)

  • Parameterize extrusion geometry for shape derivatives

Often it is of major importance to study the dependency of simulation results for a changing geometry (shape). JCMsuite allows to efficiently compute derivatives of simulation results with respect to geometrical shape parameters. This yields a linear approximation of the output results with respect to shape parameters.

This example parameterize the shape of the cylinder from the previous section. The structure of layout.jcm file is as follows:

Layout3D {
  Extrusion {
    Objects {
      Circle {
        Name = "Circle"
        Radius = 1
        ...
      }
    }
    MultiLayer {
      LayerInterface {
        BoundaryClass = Transparent
      }
      Layer {
        Thickness = 1.0
        DomainId = 1
      }
      LayerInterface {
        Name = "InterfaceBottom"
        GeometryValues = [
          Circle/Radius = 1.0
        ]
        GlobalZ = 0.0
      }
      Layer {
        Name = "CylinderLayer"
        Thickness = 1.5
        ...
      }
      LayerInterface {
        Name = "InterfaceTop"
        GeometryValues = [
          Circle/Radius = 1.0
        ]
      }
      Layer {
        Name = "TopLayer"
        Thickness = 2.0
        DomainIdMapping = [1 2]
      }
      LayerInterface {
        BoundaryClass = Transparent
      }
    }
  }
}

Now, if you want to make the bottom radius, the top radius and the height to become differential shape parameters, declare three derivative parameters at the beginning of the layout.jcm file:

DerivativeParameter {
  Name = "RadiusBottom"
  TreeEntry = Layout3D/Extrusion/MultiLayer/InterfaceBottom/GeometryValues/Circle/Radius
}

DerivativeParameter {
  Name = "RadiusTop"
  TreeEntry = Layout3D/Extrusion/MultiLayer/InterfaceTop/GeometryValues/Circle/Radius
}

DerivativeParameter {
  Name = "Height"
  TreeEntry = Layout3D/Extrusion/MultiLayer/CylinderLayer/Thickness
  TreeEntry {
    Path = Layout3D/Extrusion/MultiLayer/TopLayer/Thickness
    Scaling = -1.0
  }
}

The entries TreeEntry refers to the actual value in the .jcm input tree. TreeEntry has the form of a path name in the .jcm input tree which is just the concatenation of the section tag followed by the final entry tag. For example, when you look at the structure of the layout.jcm file above, the tree path to the thickness parameter of the second layer is Layout3D/Extrusion/MultiLayer/Layer{2}/Thickness. For named sections (e.g. Name="CylinderLayer) you can use the section name instead of its original section tag which makes it more comfortable when adding further layers. Here, we therefore can use the Layout3D/Extrusion/MultiLayer/CylinderLayer/Thickness.

In the last DerivativeParameter section we used two TreeEntry definitions. The first one is the natural variation of the layer thickness of the cylinder. The second one affects the top layer in such a way that the upper z-position of the computational domain is not changed.

Note

As an alternative you may skip the TreePath declaration in the DerivativeParameter section above and define the derivative directly after the value in <> brackets, see DerivativeParameter and the modified layout_alternative.jcm below.

With shape derivative parameter defined, JCMsolve will also compute the derivatives of the fields and their post process values with respect to the geometrical parameters.

JCMview allows to display the deformed meshes

_images/shape_derivative01.png

Undisplaced mesh ( \mathrm{RadiusBottom} = 0, \mathrm{RadiusTop} = 0, \mathrm{Thickness} = 0 )

_images/shape_derivative11.png

Displaced mesh ( \mathrm{RadiusBottom} = 1, \mathrm{RadiusTop} = 0, \mathrm{Thickness} = 0 )

_images/shape_derivative21.png

Displaced mesh ( \mathrm{RadiusBottom} = 0, \mathrm{RadiusTop} = 1, \mathrm{Thickness} = 0 )

_images/shape_derivative3.png

Displaced mesh ( \mathrm{RadiusBottom} = 0, \mathrm{RadiusTop} = 0, \mathrm{Thickness} = 1 )

.jcm Input File

  • layout.jcm [ASCII]

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    DerivativeParameter {
      Name = "RadiusBottom"
      TreeEntry = Layout3D/Extrusion/MultiLayer/InterfaceBottom/GeometryValues/Circle/Radius
    }
    
    DerivativeParameter {
      Name = "RadiusTop"
      TreeEntry = Layout3D/Extrusion/MultiLayer/InterfaceTop/GeometryValues/Circle/Radius
    }
    
    DerivativeParameter {
      Name = "Height"
      TreeEntry = Layout3D/Extrusion/MultiLayer/CylinderLayer/Thickness
      TreeEntry {
        Path = Layout3D/Extrusion/MultiLayer/TopLayer/Thickness
        Scaling = -1.0
      }
    }
    
    Layout3D {
      UnitOfLength = 1e-06
      MeshOptions {
        MaximumSideLength = 1.3
      }
      Extrusion {
        Objects {
          Polygon { 
            Name = "ComputationalDomain/Background" 
            DomainId = 1
            Priority = -1 
            Points = [-2 -2, 2 -2, 2 2, -2 2] 
            Boundary {
              Class = Periodic
            }
          } 
          
          Circle {
            Name = "Circle" 
            DomainId = 2
            Radius = 1
            RefineAll = 2
          }
        }
        MultiLayer {
          
          LayerInterface {
            BoundaryClass = Transparent
          }
          Layer {
            Thickness = 1.0
            DomainId = 1
          }
          LayerInterface {
            Name = "InterfaceBottom"
            GeometryValues = [
            Circle/Radius = 1.0
            ]
            GlobalZ = 0.0
          }
          Layer {
            Name = "CylinderLayer"
            Thickness = 1.5
            DomainIdMapping = [1 2 
            2 3]
          }
          LayerInterface {
            Name = "InterfaceTop"
            GeometryValues = [
            Circle/Radius = 1.0
            ]
          }
          Layer {
            Name = "TopLayer"
            Thickness = 2.0
            DomainIdMapping = [1 2]
          }
          LayerInterface {
            BoundaryClass = Transparent
          }
        }  
        
      } 
    }
    
  • layout_alternative.jcm [ASCII]

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    
    DerivativeParameter {
      Name = "RadiusBottom"
    }
    
    DerivativeParameter {
      Name = "RadiusTop"
    }
    
    DerivativeParameter {
      Name = "Height"
    }
    
    
    Layout3D {
      UnitOfLength = 1e-06
      MeshOptions {
        MaximumSideLength = 1.3
      }
    
      Polygon { 
        Name = "ComputationalDomain/Background" 
        DomainId = 1
        Priority = -1 
        Points = [-2 -2, 2 -2, 2 2, -2 2] 
        Boundary {
          Class = Periodic
        }
      } 
    
      Circle {
        Name = "Circle" 
        DomainId = 2
        Radius = 1
        RefineAll = 2
      }
    
      MultiLayer {
        OffsetZ = -1.1
        
        LayerInterface {
          Class = Transparent
        }
        Layer {
          Thickness = 1.0
          DomainId = 1
        }
        LayerInterface {
          Name = "InterfaceBottom"
          GeometryValues = [
            Circle/Radius = 1.0<1.0, 0.0, 0.0>
          ]
        }
        Layer {
          Name = "CylinderLayer"
          Thickness = 1.5<0.0, 0.0, 1.0>
          DomainIdMapping = [1 2 
                             2 3]
        }
        LayerInterface {
          Name = "InterfaceTop"
          GeometryValues = [
            Circle/Radius = 1.0<0.0, 1.0, 0.0>
          ]
        }
        Layer {
          Name = "TopLayer"
          Thickness = 2.0<0.0, 0.0, -1.0>
          DomainIdMapping = [1 2]
        }
        LayerInterface {
          Class = Transparent
        }
      }  
    
    }