10. Physics Coupling

10.1. Loose Coupling

ARMI supports loose and tight coupling. Loose coupling is interpreted as one-way coupling between physics for a single time node. For example, a power distribution in cycle 0 node 0 is used to calculate a temperature distribution in cycle 0 node 0. This temperature is then used in cycle 0 node 1 to compute new cross sections and a new power distribution. This process repeats itself for the lifetime of the simulation.

digraph looseCoupling {
        label="Loose Coupling"
        layout="dot";
        rankdir=TB;
        a [label="Temp.", shape="Rec", style="rounded,filled", color="white"]
        a1 [label="Temp.", shape="Rec", style="rounded,filled", color="white"]
        a2 [label="Temp.", shape="Rec", style="rounded,filled", color="white"]
        b [label="Power", shape="Rec", style="rounded,filled", color="white"]
        b1 [label="Power", shape="Rec", style="rounded,filled", color="white"]
        b2 [label="Power", shape="Rec", style="rounded,filled", color="white"]
        c [label="Cross Sections", shape="Rec", style="rounded,filled", color="white"]
        c1 [label="Cross Sections", shape="Rec", style="rounded,filled", color="white"]
        c2 [label="Cross Sections", shape="Rec", style="rounded,filled", color="white"]
        d [label="...", shape="plaintext"]

        subgraph cluster_c00n00{
            label="Cycle 0, Node 0";
            style="rounded,filled";
            color=lightblue;
            c -> b
            b -> a [constraint=false]
        }
        a -> c1 //[constraint=false]
        subgraph cluster_c00n01{
            label="Cycle 0, Node 1"
            style="rounded,filled";
            color=lightblue;
            c1 -> b1
            b1 -> a1 [constraint=false]
        }
        a1 -> c2 //[constraint=false]
        subgraph cluster_c00n02{
            label="Cycle 0, Node 2"
            style="rounded,filled";
            color=lightblue;
            c2 -> b2
            b2 -> a2 [constraint=false]
        }
        a2 -> d //[constraint=false]
}

Loose coupling is enabled by default in ARMI simulations.

10.2. Tight Coupling

Tight coupling is interpreted as two-way communication between physics within a given time node. Revisiting our previous example, enabling tight coupling results in the temperature distribution being used to generate updated cross sections (new temperatures induce changes such as Doppler broadening feedback) and ultimately an updated power distribution. This process is repeated iteratively until a numerical convergence criteria is met.

digraph tightCoupling {
        label="Tight Coupling"
        layout="dot";
        rankdir=TB;
        e [label="Converged?", shape="diamond", style="filled", color="white"]
        e1 [label="Converged?", shape="diamond", style="filled", color="white"]
        e2 [label="Converged?", shape="diamond", style="filled", color="white"]
        a [label="Temp.", shape="Rectangle", style="rounded,filled", color="white"]
        a1 [label="Temp.", shape="Rectangle", style="rounded,filled", color="white"]
        a2 [label="Temp.", shape="Rectangle", style="rounded,filled", color="white"]
        b [label="Power", shape="Rectangle", style="rounded,filled", color="white"]
        b1 [label="Power", shape="Rectangle", style="rounded,filled", color="white"]
        b2 [label="Power", shape="Rectangle", style="rounded,filled", color="white"]
        c [label="Cross Sections", shape="Rectangle", style="rounded,filled", color="white"]
        c1 [label="Cross Sections", shape="Rectangle", style="rounded,filled", color="white"]
        c2 [label="Cross Sections", shape="Rectangle", style="rounded,filled", color="white"]
        d [label="...", shape="plaintext"]

        subgraph cluster_c00n00{
            label="Cycle 0, Node 0";
            style="rounded,filled";
            color=lightblue;
            c -> b 
            b -> a 
            a -> e [constraint=false]
            e -> c [constraint=false, label="no"]
        }
        e -> c1 [label="yes"]
        subgraph cluster_c00n01{
            label="Cycle 0, Node 1"
            style="rounded,filled";
            color=lightblue;
            c1 -> b1
            b1 -> a1
            a1 -> e1 [constraint=false]
            e1 -> c1 [constraint=false, label="no"]
        }
        e1 -> c2 [label="yes"]
        subgraph cluster_c00n02{
            label="Cycle 0, Node 2"
            style="rounded,filled";
            color=lightblue;
            c2 -> b2
            b2 -> a2
            a2 -> e2 [constraint=false]
            e2 -> c2 [constraint=false, label="no"]
        }
        e2 -> d [label="yes"]
}

The following settings are involved with enabling tight coupling in ARMI:

  1. tightCoupling: When True, tight coupling is enabled.

  2. tightCouplingSettings: Used to specify which parameters and convergence criteria will be used to measure the convergence of a given interface.

tightCoupling: true
tightCouplingSettings:
  globalFlux:
    parameter: power
    convergence: 1.0e-4
  thermalHydraulics:
    parameter: THaverageCladTemperature
    convergence: 1.0e-2

The tightCouplingSettings settings interact with the interfaces available in ARMI (or an ARMI app). The interface headers (i.e., “globalFlux” and “thermalHydraulics”) must match the value prescribed for Interface.function. The option, parameter, can be a registered parameter. The convergence option is expected to be any float value. In the current implementation, different interfaces may have different developer intended restrictions. For example, the global flux interface currently only allows the eigenvalue (i.e. \(k_{\text{eff}}\)) or block-wise power to be valid parameter values.

Warning

The inherent limitations of the above interface-based tight coupling settings have been documented and a new and improved user-interface is currently being developed.

In the global flux interface, the following norms are used to compute the convergence of \(k_{\text{eff}}\) and block-wise power.

10.2.1. Eigenvalue

The convergence of the eigenvalue is measured through an L2-norm.

\[\epsilon = \| k_\text{eff} \|_2 = \left( \left( k_\text{eff,old} - k_\text{eff,new} \right)^2 \right) ^ \frac{1}{2}\]

10.2.2. Block-wise Power

The block-wise power can be used as a convergence mechanism to avoid the integral effects of \(k_{\text{eff}}\) (i.e., over and under predictions cancelling each other out) and in turn, can have a different convergence rate. To measure the convergence of the power distribution with the prescribed tolerances (e.g., 1e-4), the power is scaled in the following manner (otherwise the calculation struggles to converge).

For an assembly, \(a\), we compute the total power of the assembly,

\[a_{\text{power},i} = \sum_{j}b_{\text{power},(i,j)},\]

where \(i\) is the \(i^{\text{th}}\) assembly and \(j\) is the \(j^{\text{th}}\) block within assembly, \(i\). With the assembly power, we scale the block power and obtain an array of scaled block powers for a given assembly, \(\mathbf{b}_{i}\),

\[\mathbf{b}_{i} = \left\lbrace \frac{b_{\text{power},(i,j)}}{a_{\text{power},i}} \right\rbrace, \quad \forall j \in a_i.\]

We can now calculate a convergence parameter for each assembly,

\[\begin{split}\epsilon_i &= \| \textbf{b}_{i,\text{old}} - \textbf{b}_{i,\text{new}} \|_2 \\ &=\sqrt{\sum_{i}\left( \textbf{b}_{i,\text{old}} - \textbf{b}_{i,\text{new}} \right)^2}.\end{split}\]

These assembly-wise convergence parameters are then stored in an array of convergence values,

\[\xi = \left\lbrace \epsilon_i \right\rbrace,\quad \forall i \in \text{Core}.\]

The total convergence of the power distribution is finally measured through the infinity norm (i.e, the max) of \(\xi\),

\[\epsilon = \| \xi \|_{\inf} = \max \xi.\]

10.2.3. The Global Flux Interface

The Global Flux Interface class will attempt to set its own TightCoupler based on keff. To see the specifics, see: _setTightCouplingDefaults. If you want to change the tight coupling performance of the GlobalFluxInterface, it would be easiest to just sublass the interface and over-write the _setTightCouplingDefaults method.