2D MBB Beam with a PDE Filter

In this example we will go over using a PDE filter instead of a convolution type filter (see Wallin et al. (2020)). For larger problems this method may scale better depending on processor counts and filter radius size. Only new material not covered in the previous example will be covered here 2D Topology Optimization with a Convolution Filter.

First there is a new variable Dc that will be the filtered sensitivity.

Listing 1: MBB Variables block

[Variables]
  [Dc]
    initial_condition = -1.0
  []
[]
(modules/combined/examples/optimization/2d_mbb_pde.i)

The AuxVariables block sensitivity is now used as a source term for the PDE filter. There is also now a Dc_elem variable that will be used for the density update.

Listing 2: MBB AuxVariables block

[AuxVariables]
  [Emin]
    family = MONOMIAL
    order = CONSTANT
    initial_condition = ${Emin}
  []
  [power]
    family = MONOMIAL
    order = CONSTANT
    initial_condition = ${power}
  []
  [E0]
    family = MONOMIAL
    order = CONSTANT
    initial_condition = ${E0}
  []
  [sensitivity]
    family = MONOMIAL
    order = FIRST
    initial_condition = -1.0
    [AuxKernel]
      type = MaterialRealAux
      variable = sensitivity
      property = sensitivity
      execute_on = LINEAR
    []
  []
  [mat_den]
    family = MONOMIAL
    order = CONSTANT
    initial_condition = ${vol_frac}
  []
  [Dc_elem]
    family = MONOMIAL
    order = CONSTANT
    initial_condition = -1.0
    [AuxKernel]
      type = SelfAux
      variable = Dc_elem
      v = Dc
      execute_on = 'TIMESTEP_END'
    []
  []
[]
(modules/combined/examples/optimization/2d_mbb_pde.i)

In the Kernel block the filtering is done using a FunctionDiffusion kernel, Reaction Kernel, and a CoupledForce kernel. The function coefficient () in the FunctionDiffusion kernel is related to the radius () of the RadialAverage filter by the equation .

Listing 3: MBB Kernels block

[Kernels]
  [diffusion]
    type = FunctionDiffusion
    variable = Dc
    function = 0.15 # radius coeff
  []
  [potential]
    type = Reaction
    variable = Dc
  []
  [source]
    type = CoupledForce
    variable = Dc
    v = sensitivity
  []
[]
(modules/combined/examples/optimization/2d_mbb_pde.i)

One advantage of using a PDE filter is that by applying boundary conditions on the sensitivity variable on the boundary of the domain the filter will prevent "sticking" of the material commonly seen in topology optimization. That penalty condition is applied using the ADRobinBC where the coef controls how much the sensitivity is penalized on the boundary.

Listing 4: MBB BCs block

[BCs]
  [no_x]
    type = DirichletBC
    variable = disp_y
    boundary = hold_y
    value = 0.0
  []
  [no_y]
    type = DirichletBC
    variable = disp_x
    boundary = right
    value = 0.0
  []
  [boundary_penalty]
    type = ADRobinBC
    variable = Dc
    boundary = 'left top'
    coefficient = 10
  []
  [boundary_penalty_right]
    type = ADRobinBC
    variable = Dc
    boundary = 'right'
    coefficient = 10
  []
[]
(modules/combined/examples/optimization/2d_mbb_pde.i)

The UserObjects block now only contains the DensityUpdate object.

Listing 5: MBB UserObjects block

[UserObjects]
  [update]
    type = DensityUpdate
    density_sensitivity = Dc_elem
    design_density = mat_den
    volume_fraction = ${vol_frac}
    execute_on = TIMESTEP_BEGIN
    force_postaux = true
  []
[]
(modules/combined/examples/optimization/2d_mbb_pde.i)

References

  1. Mathias Wallin, Niklas Ivarsson, Oded Amir, and Daniel Tortorelli. Consistent boundary conditions for pde filter regularization in topology optimization. Struct. Multidiscip. Optim., 62(3):1299–1311, sep 2020. URL: https://doi.org/10.1007/s00158-020-02556-w, doi:10.1007/s00158-020-02556-w.[BibTeX]