Skip to content

Instantly share code, notes, and snippets.

@jsb2505
Created February 26, 2026 17:23
Show Gist options
  • Select an option

  • Save jsb2505/7251c94f8aa3ec670cb68c62eb6dc835 to your computer and use it in GitHub Desktop.

Select an option

Save jsb2505/7251c94f8aa3ec670cb68c62eb6dc835 to your computer and use it in GitHub Desktop.
EC2 concrete shrinkage
/**Target mean cylinder strength at 28 days, in MPa.
Ref: EC2 §Table 3.1
*/
get_f_cm = LAMBDA(f_ck_28days, f_ck_28days + 8);
/**Notional size of member. Used for determining creep factor.
Ref: EC2 §3.1.4(5)
*/
get_h_0 = LAMBDA(cross_sectional_area_mm2, perimeter_exposed_to_drying_mm,
LET(
A_c, cross_sectional_area_mm2,
u, perimeter_exposed_to_drying_mm,
2 * A_c / u
)
);
/**Autogenous shrinkage strain (at time t in days), in με.
Ref: EC2 §3.1.4(6)(3.11)
*/
get_autogenous_shrinkage_strain_time_ε_ca_t = LAMBDA(f_ck28days, time_in_days,
LET(
t, time_in_days,
ε_ca_∞, get_autogenous_shrinkage_strain_final_ε_ca_∞(f_ck28days),
β_as_t, 1 - EXP(-0.2 * SQRT(t)),
β_as_t * ε_ca_∞
)
);
/**Final autogenous shrinkage strain, in με.
Ref: EC2 §3.1.4(6)(3.12)
*/
get_autogenous_shrinkage_strain_final_ε_ca_∞ = LAMBDA(f_ck28days,
2.5 * (f_ck28days - 10)
);
/**Autogenous shrinkage strain at time t in days (με). Binder types = {"portland cement", "silica fume", "fly ash", "ggbs"}
percent_binder should be given if binder_type is given. percent binder is given as a percent of total binder weight.
Ref: CIRIA C766 A4.6.
Args:
binder_type: "portland cement", "ggbs", "silica fume, "pulverised fuel ash", "fly ash", "fuel ash", "fa", "pfa" (default: "portland cement").
percent_binder: (default: 0)
*/
get_autogenous_shrinkage_strain_CIRIA_C766 = LAMBDA(time_in_days, water_binder_ratio, [binder_type], [percent_binder],
LET(
t, time_in_days,
w_b, water_binder_ratio,
_binder, IF(ISOMITTED(binder_type), "portland cement", LOWER(binder_type)),
_percent_binder, IF(ISOMITTED(percent_binder), 0, percent_binder),
ε_ca_CEM_1, 240 * t^0.15 - 650 * (w_b),
// The mod_factor is a tuple of: {percent change to ε_ca_CEM_1, for every percent of binder}
mod_factor, IFS(
_binder = "portland cement", {1, 0},
_binder = "silica fume", {0.1, 1}, //i.e increase by 10% for every 1% of silica fume
OR(_binder = "pulverised fly ash", _binder = "pulverised fuel ash", _binder = "fly ash", _binder = "fuel ash", _binder = "fa", _binder = "pfa"),
{-0.01, 1}, //i.e reduce by 1% for every 1% of fly ash
_binder = "ggbs", {0.08, 0.1} //i.e increase by 8% for every 10% of ggbs
),
IFNA(ε_ca_CEM_1 + (ε_ca_CEM_1 * PRODUCT(mod_factor) * _percent_binder),"Invalid binder")
)
);
/**Basic drying shrinkage strain, in με.
Ref: EC2 §3.1.4(6)(3.9) & Annex B.2 (B.11)(B.12).
Args:
cement_class: "R", "N", "S" (default: "R").
*/
get_basic_drying_shrinkage_strain_ε_cd_0∞ = LAMBDA(f_ck28days, relative_humidity_percent, [cement_class],
LET(
f_ck, f_ck28days,
_cement_class, IF(ISOMITTED(cement_class), "R", UPPER(cement_class)),
f_cm, get_f_cm(f_ck),
f_cmo, 10,
α_ds1, IFS(
_cement_class = "S", 3,
_cement_class = "N", 4,
_cement_class = "R", 6
),
α_ds2, IFS(
_cement_class = "S", 0.13,
_cement_class = "N", 0.12,
_cement_class = "R", 0.11
),
RH, relative_humidity_percent,
RH_0, 100,
β_RH, 1.55 * (1 - (RH / RH_0)^3),
0.85 * β_RH * ((220 + 110 * α_ds1) * EXP(-α_ds2 * f_cm / f_cmo))
)
);
/**Basic drying shrinkage strain (at time t in days), in με.
Ref: EC2 §3.1.4(6)(3.9).
Args:
cement_class: "R", "N", "S" (default: "R").
*/
get_drying_shrinkage_strain_ε_cd_t = LAMBDA(
f_ck28days,
relative_humidity_percent,
cross_sectional_area_mm2,
perimeter_exposed_to_drying_mm,
time_in_days_at_consideration,
time_in_days_of_beginning_of_drying,
[cement_class],
LET(
A_c, cross_sectional_area_mm2,
u, perimeter_exposed_to_drying_mm,
RH, relative_humidity_percent,
h_0, get_h_0(A_c, u),
t, time_in_days_at_consideration,
t_s, time_in_days_of_beginning_of_drying,
_cement_class, IF(ISOMITTED(cement_class), "R", UPPER(cement_class)),
ε_cd_∞, get_final_drying_shrinkage_strain_ε_cd_∞(f_ck28days, RH, A_c, u, _cement_class),
β_ds_t, (t - t_s) / ((t - t_s) + 0.04 * SQRT(h_0^3)),
MAX(β_ds_t * ε_cd_∞,)
)
);
/**Final drying shrinkage strain, in με.
Ref: EC2 §3.1.4(6)(3.8)(3.9) & Table 3.3.
Args:
cement_class: "R", "N", "S" (default: "R").
*/
get_final_drying_shrinkage_strain_ε_cd_∞ = LAMBDA(
f_ck28days,
relative_humidity_percent,
cross_sectional_area_mm2,
perimeter_exposed_to_drying_mm,
[cement_class],
LET(
_cement_class, IF(ISOMITTED(cement_class), "R", UPPER(cement_class)),
ε_cd_0, get_basic_drying_shrinkage_strain_ε_cd_0∞(f_ck28days, relative_humidity_percent, _cement_class),
A_c, cross_sectional_area_mm2,
u, perimeter_exposed_to_drying_mm,
h_0, get_h_0(A_c, u),
// Linearly interpolating between values of h_0 for k_h from Table 3.3
k_h, IFS(
h_0 <= 100, 1,
h_0 >= 500, 0.7,
h_0 <= 200, FORECAST(h_0, {1, 0.85}, {100, 200}),
h_0 <= 300, FORECAST(h_0, {0.85, 0.75}, {200, 300}),
h_0 <= 500, FORECAST(h_0, {0.75, 0.7}, {300, 500})
),
k_h * ε_cd_0
)
);
/**Total free shrinkage strain, in με.
Ref: EC2 §3.1.4(3.8)
*/
get_total_shrinkage_strain_ε_cs = LAMBDA(drying_shrinkage_strain_ε_cd, autogenous_shrinkage_strain_ε_ca,
drying_shrinkage_strain_ε_cd + autogenous_shrinkage_strain_ε_ca
);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment