Created
February 26, 2026 17:23
-
-
Save jsb2505/7251c94f8aa3ec670cb68c62eb6dc835 to your computer and use it in GitHub Desktop.
EC2 concrete shrinkage
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| /**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