Skip to content

Sanisand

The sanisand class represents the SANISAND critical-state, bounding-surface model for drained simulations. Use sanisand2 when the calibration requires the undrained model path implemented by numgeo-ACT.

At a glance

  • Class: ACT.models.sanisand
  • numgeo name: Sanisand
  • Material parameters: 16 (15 optimisable; p_atm is fixed)
  • Import: from ACT.models import sanisand
  • Bound overrides: no public set_bounds(...) method

Units and angles

Enter p_atm in kPa. The other 15 material parameters, including G0, are dimensionless coefficients or ratios. The optional convenience input phic is in radians; it derives M_c and M_e and is not itself a material or free parameter.

Parameters and built-in bounds

The class computes bounds when parameter_bounds(free_parameter) is called. They are not stored in self.bounds and cannot be changed with set_bounds(...). Keep p_atm fixed: its lower and upper bounds are identical, so it is not a valid search dimension for any optimiser.

Parameter Built-in bound Note
p_atm [100, 100] atmospheric reference pressure; fixed by the built-in bound
e0 [0.9 e0, 1.1 e0] interval is based on the value assigned with set(e0=...)
lambda_c [0.01, 0.5] critical-state-line parameter
xi [0.1, 0.9] critical-state-line exponent
G0 [50, 500] elastic shear-modulus factor
nue [0.0, 0.4] elastic Poisson ratio
m [0.001, 0.1] yield-surface parameter
M_c [0.9 M_c, 1.1 M_c] interval is based on the value assigned with set(...)
M_e [0.9 M_e, 1.1 M_e] interval is based on the value assigned with set(...)
n_b [0.01, 2.5] bounding-surface parameter
h0 [0.01, 10.0] hardening parameter
c_h [0.0, 1.1] hardening parameter
n_d [0.1, 3.5] dilatancy parameter
A0 [0.2, 1.0] dilatancy parameter
z_max [1, 30] fabric limit
c_z [1000, 10000] fabric evolution parameter

The implementation enforces \(M_e/M_c\leq1\) when both quantities are free. Set physically credible non-zero starting values before requesting the bounds; otherwise the data-dependent intervals for e0, M_c or M_e collapse.

Setting parameters

from ACT.models import sanisand

model = sanisand()
model.set(
    p_atm=100.0,
    e0=0.80,
    lambda_c=0.02,
    xi=0.7,
    G0=125.0,
    nue=0.2,
    m=0.05,
    M_c=1.25,
    M_e=0.95,
    n_b=1.0,
    h0=5.0,
    c_h=0.5,
    n_d=1.0,
    A0=0.5,
    z_max=4.0,
    c_z=2000.0,
)

Full signature:

set(
    p_atm=None, e0=None, lambda_c=None, xi=None, G0=None, nue=None,
    m=None, M_c=None, M_e=None, n_b=None, h0=None, c_h=None,
    n_d=None, A0=None, z_max=None, c_z=None, phic=None,
)

phic is an input convenience, not a seventeenth material parameter or a free parameter. When supplied in radians, it overwrites M_c and M_e using the triaxial compression and extension stress ratios. Do not supply phic together with independent M_c/M_e values unless that overwrite is intentional.

Choosing free parameters

List only adjustable names from the 16-parameter table; omit p_atm:

from ACT import globals

globals.setup(
    Model=model,
    Free_parameter=["lambda_c", "xi", "G0", "M_c", "M_e", "h0", "n_b"],
    triaxCD=database.triax_CD,
    path="./sanisand-calibration/",
)

Do not call model.set_bounds(...); that method is not implemented by this class. If adjustable bounds are required, use a SANISAND variant that documents the method or extend the base class explicitly and test the resulting material mapping.

Reading and updating values

model.update("G0", 140.0)
value = model.get_parameter("G0")

Parameter names are case-sensitive. See Optimisation for search strategies and the models overview for the shared runtime contract.