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¶
-
Global level: splits the total weight between monotonic and cyclic behaviour. By default each receives one half:
Group Default weight monotonic0.5 cyclic0.5 -
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.