Multiphysics Coupling

Nonlinear Transient Heat Conduction

Strong form: $$$$\rho C_p \frac{\partial T}{\partial t} - \nabla\cdot k\nabla T - q = 0$$$$

Weak form: $$$$\left(\rho C_p \frac{\partial T}{\partial t}, \psi_i \right) + \left(k \nabla T, \nabla\psi_i\right) - \left(q, \psi_i\right) % Note: we don't give BCs in the strong form, and don't talk about them after this slide so % make things simpler by getting rid of them. % - \langle g, \psi\rangle = 0$$$$

Nonlinear Transient Oxygen Non-Stoichiometry

Strong form: $$$$\frac{\partial s}{\partial t} - \nabla\cdot\left(D\left(\nabla s + \frac{sQ^*}{FRT^2}\nabla T\right)\right) = 0$$$$

Weak form: $$$$\left(\frac{\partial s}{\partial t}, \psi_i\right) + \left(D \left(\nabla s + \frac{sQ^*}{FRT^2}\nabla T\right), \nabla\psi_i\right) % Note: we don't give BCs in the strong form, and don't talk about them after this slide so % make things simpler by getting rid of them. % - \langle g, \psi\rangle = 0$$$$

Multiphysics Coupling (Steady form)

  • Coupled steady heat conductions and steady oxygen diffusion
  • Fully coupled nonlinear residual $$$$r_i(T,s) = \begin{bmatrix} \left(k(T,s)\nabla T,\nabla\psi_i\right) - \left(q,\psi_i\right) \\ \quad \\ \left(D(T,s)\left(\nabla s + f(T,s)\nabla T\right), \nabla\psi_i\right) \end{bmatrix} = 0$$$$
  • Apply JFNK to this residual

Simplified Coupling Example

  • Weak forms: $$$$\begin{aligned} \left(\nabla u, \nabla \psi_i\right) + \left(\nabla v\cdot\nabla u, \psi_i\right) &= 0 \\ \left(\nabla v, \nabla \psi_i\right) &= 0 \end{aligned}$$$$
  • Each "physics" sums into residual
  • One-way coupling: $$$u$$$-equation depends on $$$v$$$

Coupling Parameters

  • To couple a Kernel (or any other object) to other variables, you must declare the coupling using the addCoupledVar() method in the validParams() function:
params.addCoupledVar("temperature", "doc_string");
  • You may then specify your coupling in the input file:
[./temp]
  order = FIRST
  family = LAGRANGE
[../]

...

[./coupled_diffusion]
  type = ExampleDiffusion
  variable = u
  temperature = temp
[../]
  • Important!
    • "temp" is the (arbitrary) name of the variable in the input file
    • "temperature" is the name used by the kernel (always the same)

Coupling in Kernels

  • The coupling of values and gradients into Kernels is done by calling the following functions in the initialization list of the constructor:
    • coupledValue()
    • coupledValueOld()
    • coupledValueOlder()
    • coupledGradient()
    • coupledGradientOld()
    • coupledGradientOlder()
    • coupledDot()
    • ...
  • These functions return const references that you hold onto in the class.
  • The const references are then used in the computeQpResidual() and computeQpJacobian() methods as needed.

Default Coupling Parameters

  • To enable rapid development and make debugging more flexible, MOOSE allows you to supply default scalar values where a coupled value would otherwise be required.
params.addCoupledVar("temperature", 300, "doc_string");
  • If a variable is not supplied through the input file, a properly-sized variable containing the default value will be made available to you at each integration point in your domain.
  • Additionally, you may also supply a Real value in the input file in lieu of a coupled variable name.
  • Consider using this feature to decouple your non-linear problems for troubleshooting.

Example 3

Look at Example 3