Fiber-reinforced elastodynamics

This tutorial composes two independent, nonmatching elastodynamics Problems:

matrix: ElastodynamicsSolver<dim,dim>
fiber:  ElastodynamicsSolver<1,dim>

The canonical input is tutorials/fiber_reinforced_elastodynamics/parameters.prm.in:

# Matrix plus embedded additive/excess fiber tutorial.
set dimension       = 2
set space dimension = 2

subsection Fiber Reinforced Elastodynamics
  set Output directory  = @TEST_OUTPUT_DIR@/tutorial-output/fiber-reinforced-elastodynamics
  subsection Time interval
    set Initial time       = 0.0
    set Final time         = 0.05
    set Output time interval = 0.01
  end
  subsection Fixed step
    set Time step          = 0.01
    set Number of time steps = 5
    set Policy              = number_of_steps
  end

  subsection Coupling solver
    set Maximum steps                 = 200
    set Tolerance                     = 1.e-10
    set Block tolerance               = 1.e-12
    set Initial compatibility tolerance = 1.e-10
  end

  subsection Matrix Elastodynamics
    set FE degree          = 1
    set Dirichlet boundary ids = 0,1,2,3

    subsection Domain
      set Initial refinement = 2
      set Grid generator           = hyper_cube
      set Grid generator arguments = -1: 1: false
      set Triangulation type       = distributed
    end

    subsection Material properties
      set Material tags by material id =
      subsection default
        set Density       = 1.0
        set Lame mu       = 1.0
        set Lame lambda   = 1.0
        set Rayleigh alpha = 0
        set Rayleigh beta  = 0
        set Viscosity eta  = 0
      end
    end

    subsection Functions
      subsection Body force
        set Function expression = 0; 1
        set Variable names      = x,y,t
      end
      subsection Displacement boundary
        set Function expression = 0; 0
        set Variable names      = x,y,t
      end
      subsection Velocity boundary
        set Function expression = 0; 0
        set Variable names      = x,y,t
      end
      subsection Initial displacement
        set Function expression = 0; 0
        set Variable names      = x,y,t
      end
      subsection Initial velocity
        set Function expression = 0; 0
        set Variable names      = x,y,t
      end
    end
  end

  subsection Fiber Elastodynamics
    # These are additive/excess coefficients, not a second complete matrix
    # material. Keep density positive for the SPD effective fiber block.
    set FE degree          = 1
    set Dirichlet boundary ids =

    subsection Domain
      set Initial refinement = 1
      set Grid generator           = hyper_cube
      set Grid generator arguments = -0.65: 0.65: false
      set Triangulation type       = distributed
    end

    subsection Material properties
      set Material tags by material id =
      subsection default
        set Density       = 4.0
        set Lame mu       = 8.0
        set Lame lambda   = 8.0
        set Rayleigh alpha = 0
        set Rayleigh beta  = 0
        set Viscosity eta  = 0
      end
    end

    subsection Functions
      subsection Body force
        set Function expression = 0; 0
        set Variable names      = x,y,t
      end
      subsection Displacement boundary
        set Function expression = 0; 0
        set Variable names      = x,y,t
      end
      subsection Velocity boundary
        set Function expression = 0; 0
        set Variable names      = x,y,t
      end
      subsection Initial displacement
        set Function expression = 0; 0
        set Variable names      = x,y,t
      end
      subsection Initial velocity
        set Function expression = 0; 0
        set Variable names      = x,y,t
      end
    end
  end
end

Run the 2D input with:

./build/fiber_reinforced_elastodynamics_debug \
  build/tutorials/fiber_reinforced_elastodynamics/parameters.prm

The matrix occupies [-1,1]^2. The fiber is an independently meshed line inside it. Its ambient vector components still have dimension two, but its FE support is one-dimensional. The fiber coefficients are an additive excess contribution coupled to the matrix through a line multiplier. A vector Field on the line selects all ambient components (spacedim), not just the one-dimensional support component. Use field.component_mask() when passing that selection to a native assembler.

The validation tests compare fixed-step backward-Euler coupling with an uncoupled dense reference advanced from its own displacement and velocity history under the same forcing and time steps. The application advances only the coupled state.

The application exposes matrix and fiber velocity fields and creates an independent vector multiplier field. The constraint is assembled from weak_term(value(field), test(lambda)) terms. Its transpose reactions enforce velocity compatibility on the two spaces. The five semantic fields are

matrix.displacement  differential
matrix.velocity      differential
fiber.displacement   differential
fiber.velocity       differential
coupling.lambda      algebraic

The multiplier owns a FiniteElementSpace on the fiber Domain. By default, Multiplier FE degree = 0 follows the fiber degree; a positive value selects an independent continuous degree. To choose another element, set Fiber Reinforced Elastodynamics/Multiplier space/Finite element, for example FESystem<1>[FE_DGQ<1>(0)^2] for a cellwise constant 2D vector multiplier. An explicit element name overrides Multiplier FE degree and must have dim components. The default auto keeps the degree-based behavior. The choice must still yield a solvable constraint system; not every trial/multiplier pair is stable.

The IDA execution keeps the adapter, field handles, and solver vectors local to one solve. It registers the two Problems and their velocity-continuity constraint directly with IDAAdapter, accepts the displacement and velocity fields after accepted steps, and writes the two Problem outputs plus the multiplier on its own FE space. The application supports 2/2 and 3/3 matrix dimension selections; the fiber is one-dimensional in both cases.