Skip to content

Weighting of tests

When a calibration includes several tests and several quantities within each test, numgeo-ACT needs to know how to balance them. This is controlled by a weights structure: a nested dictionary that assigns a weight to each test type and to each compared quantity within it. Sensible defaults are used unless you pass your own via the Weights argument of globals.setup.

Two levels of weighting

  1. Global level: splits the total weight between monotonic and cyclic behaviour. By default each receives one half:

    Group Default weight
    monotonic 0.5
    cyclic 0.5
  2. Per-test level: within each test type, weights distribute the importance across the individual curves/quantities being compared (these must sum to 1).

Default per-test weights

The defaults below are what numgeo-ACT uses if you do not supply your own. They reflect typical good practice; adjust them to emphasize the behaviour most relevant to your application.

Key Default Meaning
eps1-q axial strain vs. deviatoric stress
eps1-epsV axial strain vs. volumetric strain
penalty-peak-q-eps1 0 penalty on the deviatoric-stress peak
cutoff-triaxCD-expdata-after-max-q True ignore experimental data after peak \(q\); the simulation must then reach the strain at the peak instead of the final strain
Key Default Meaning
eps1-q ½ axial strain vs. deviatoric stress
eps1-p ½ axial strain vs. mean stress
p-eta 0 stress ratio vs. mean stress
Key Default Meaning
p-q 0 stress path
eps1-q 0 stress–strain
N-pw ½ pore pressure vs. cycles
N-eps1 0 axial strain vs. cycles
pmin ½ minimum mean pressure
Nru 0 cycles to a pore-pressure ratio
penalty-hull 0 penalty for simulated \(p\)\(q\) states outside the convex hull of the measured stress path (sum of the scaled distances; 0 = off)
Nru_Factor 0.8 pore-pressure-ratio level (e.g. \(N_{80}\))
penalty-critical-state-line 0 penalty relative to the CSL
Key Default Meaning
N-eps1_acc 0 accumulated axial strain vs. cycles
N-eps_acc 1 accumulated total strain vs. cycles
N-epsv_acc 0 accumulated volumetric strain vs. cycles
N-epsq_acc 0 accumulated deviatoric strain vs. cycles
N-pw_acc 0 accumulated pore pressure vs. cycles
N-eps_ampl 0 strain amplitude vs. cycles
Key Default Meaning
N-eps1_acc 0 accumulated axial strain vs. cycles
N-eps_acc 0 accumulated total strain vs. cycles
N-epsv_acc 0 accumulated volumetric strain vs. cycles
N-epsq_acc 0 accumulated deviatoric strain vs. cycles
N-pw_acc 1 accumulated pore pressure vs. cycles
N-eps_ampl 0 strain amplitude vs. cycles
Key Default Meaning
gamma-tau ½ shear strain vs. shear stress
gamma-epsV ½ shear strain vs. volumetric strain
Key Default Meaning
N-ru 1 pore-pressure ratio vs. cycles
N-gamma, N-tau, N-stressN, N-strainDA, N-ru_acc, gamma-tau, stressN-tau, stressN 0 further optional planes
penalty-critical-state-line 0 penalty relative to the CSL

Scaling

A global switch scale_max_min (default True) scales the compared planes to a common range for the triaxial and cyclic test types, so quantities of different magnitude contribute comparably to the objective.

Validation

Before a calibration runs, the weights are validated: for each active test type the relevant per-quantity weights must sum to 1 (a small tolerance is allowed) and no weight may be negative, because a negative weight would reward a larger discrepancy. If a check fails, globals.setup(...) raises a ValueError identifying the inconsistent test and values. This catches a misconfiguration immediately without terminating a notebook or host process.

Customizing the weights

Start from the defaults and adjust only what you need:

from ACT.utilities import weights

w = weights.initialize()          # nested dict with the defaults above

# emphasize the volumetric response in drained triaxial tests
w["triaxCD"]["eps1-q"]    = 1./2.
w["triaxCD"]["eps1-epsV"] = 1./2.   # the two must still sum to 1

# shift the global balance towards cyclic behaviour
w["global"]["monotonic"] = 0.4
w["global"]["cyclic"]    = 0.6

globals.setup(..., Weights=w)

Turn quantities on and off

Setting a per-quantity weight to 0 removes that curve from the objective; giving it a larger share emphasizes it. This is how you tell the optimizer what matters for your material and application. For instance, weighting pore-pressure accumulation heavily when calibrating for liquefaction.