|
| 1 | +.. _ExampleThermoMech1DCooling: |
| 2 | + |
| 3 | + |
| 4 | +#################################################### |
| 5 | +Thermally Induced Failure under Confined Cooling |
| 6 | +#################################################### |
| 7 | + |
| 8 | +**Context** |
| 9 | + |
| 10 | + |
| 11 | +When a rock cools but cannot contract, it develops tensile stress. In a confined |
| 12 | +rock mass, this thermal stress combines with the existing in-situ stresses and |
| 13 | +may cause the rock to fail—even when pore pressure and external loading stay constant. |
| 14 | +This mechanism is responsible for thermal fracturing around cold-fluid injectors |
| 15 | +and caprock damage during CO\ :sub:`2` storage, among other phenomena. |
| 16 | + |
| 17 | +This example simulates thermal contraction stresses using a one-dimensional |
| 18 | +thermo-mechanical problem. We compare two constitutive models subjected to the same cooling history: |
| 19 | + |
| 20 | +- **Thermo-elastic rock** (``ElasticIsotropic``): The induced stress increases indefinitely as the rock continues cooling. |
| 21 | + |
| 22 | +- **Thermo-plastic rock** (``DruckerPrager``): The induced stress is limited by the yield surface. Beyond a critical temperature drop, the rock fails and deforms plastically. |
| 23 | + |
| 24 | +Both cases have closed-form solutions, making this example useful for verifying |
| 25 | +the thermo-mechanical coupling and the Drucker-Prager return mapping under thermal loading. |
| 26 | + |
| 27 | + |
| 28 | +**InputFile** |
| 29 | + |
| 30 | +This example uses no external input files. Everything required is contained within three GEOS |
| 31 | +input files located at: |
| 32 | + |
| 33 | +.. code-block:: console |
| 34 | +
|
| 35 | + inputFiles/thermoPoromechanics/ThermoMech_1DCooling_base.xml |
| 36 | +
|
| 37 | +.. code-block:: console |
| 38 | +
|
| 39 | + inputFiles/thermoPoromechanics/ThermoElastic_1DCooling_fim_smoke.xml |
| 40 | +
|
| 41 | +.. code-block:: console |
| 42 | +
|
| 43 | + inputFiles/thermoPoromechanics/ThermoDruckerPrager_1DCooling_fim_smoke.xml |
| 44 | +
|
| 45 | +--------------------------------------------------- |
| 46 | +Description of the case |
| 47 | +--------------------------------------------------- |
| 48 | + |
| 49 | +We consider a seven-meter column discretized with 14 elements along the ``y`` direction, and a |
| 50 | +single element in the two other directions. The column is initially at a uniform temperature |
| 51 | +of 100 K, and is cooled down to 20 K following a linear ramp imposed over the whole domain. |
| 52 | + |
| 53 | +The mechanical boundary conditions are the essential ingredient of the problem: the two ends |
| 54 | +of the column (``yneg`` and ``ypos``) are fixed along ``y``, so the axial strain is prevented |
| 55 | +(ε_yy = 0), while the `x` and `z` directions are only restrained on one face each and are |
| 56 | +therefore free to deform. The lateral faces being traction-free, σ_xx = σ_zz = 0, and the only |
| 57 | +non-zero stress component is σ_yy. |
| 58 | + |
| 59 | +.. math:: |
| 60 | +
|
| 61 | + \varepsilon_{yy} = 0, \qquad \sigma_{xx} = \sigma_{zz} = 0 |
| 62 | +
|
| 63 | +.. _thermoMech1DCoolingSketchFig: |
| 64 | +.. figure:: xz_cross_section_uniaxial_stress.png |
| 65 | + :align: center |
| 66 | + :width: 500 |
| 67 | + :figclass: align-center |
| 68 | + |
| 69 | + Sketch of the confined column: both ends are fixed along ``y``, while ``x`` and ``z`` are |
| 70 | + restrained on a single face each and remain free to deform. |
| 71 | + |
| 72 | +.. literalinclude:: ../../../../../../../inputFiles/thermoPoromechanics/ThermoMech_1DCooling_base.xml |
| 73 | + :language: xml |
| 74 | + :start-after: <!-- SPHINX_CONSTRAINTS --> |
| 75 | + :end-before: <!-- SPHINX_CONSTRAINTS_END --> |
| 76 | + |
| 77 | +The cooling history is prescribed by a ``TableFunction`` applied to the temperature field. |
| 78 | +A short initial temperature plateau lets the mechanical equilibrium settle before the thermal |
| 79 | +loading starts. |
| 80 | + |
| 81 | +.. literalinclude:: ../../../../../../../inputFiles/thermoPoromechanics/ThermoMech_1DCooling_base.xml |
| 82 | + :language: xml |
| 83 | + :start-after: <!-- SPHINX_COOLING_RAMP --> |
| 84 | + :end-before: <!-- SPHINX_COOLING_RAMP_END --> |
| 85 | + |
| 86 | +The pore pressure is fixed to zero and the permeability is set to a negligible value |
| 87 | +(:math:`10^{-100}` m\ :sup:`2`), so that no fluid flow takes place: the stress evolution is |
| 88 | +entirely thermo-mechanical, like in the analytical solution. |
| 89 | + |
| 90 | +------------------------------------------------------------------ |
| 91 | +Constitutive models |
| 92 | +------------------------------------------------------------------ |
| 93 | + |
| 94 | +The two cases differ **only** by the solid model. The thermo-elastic case uses an |
| 95 | +``ElasticIsotropic`` solid, with a drained linear thermal expansion coefficient |
| 96 | +:math:`\alpha = 3 \times 10^{-7}` K\ :sup:`-1`: |
| 97 | + |
| 98 | +.. literalinclude:: ../../../../../../../inputFiles/thermoPoromechanics/ThermoElastic_1DCooling_fim_smoke.xml |
| 99 | + :language: xml |
| 100 | + :start-after: <!-- SPHINX_ELASTIC_SOLID --> |
| 101 | + :end-before: <!-- SPHINX_ELASTIC_SOLID_END --> |
| 102 | + |
| 103 | +The thermo-plastic case uses the same elastic properties and thermal expansion |
| 104 | +coefficient, and adds a Drucker-Prager yield surface: |
| 105 | + |
| 106 | +.. literalinclude:: ../../../../../../../inputFiles/thermoPoromechanics/ThermoDruckerPrager_1DCooling_fim_smoke.xml |
| 107 | + :language: xml |
| 108 | + :start-after: <!-- SPHINX_DRUCKERPRAGER_SOLID --> |
| 109 | + :end-before: <!-- SPHINX_DRUCKERPRAGER_SOLID_END --> |
| 110 | + |
| 111 | +------------------------------------------------------------------ |
| 112 | +Analytical solution |
| 113 | +------------------------------------------------------------------ |
| 114 | + |
| 115 | +**Thermo-elastic response.** In this uniaxial stress state (σ_xx = σ_zz = 0), the axial strain is blocked (ε_yy = 0) and the thermo-elastic constitutive law reduces to |
| 116 | + |
| 117 | +.. math:: |
| 118 | +
|
| 119 | + \sigma_{yy} = -E \, \alpha \, \Delta T |
| 120 | +
|
| 121 | +with :math:`E = 9KG/(3K+G)` the Young modulus. A cooling :math:`\Delta T < 0` therefore |
| 122 | +produces a **tensile** stress that grows linearly with the temperature drop, without any |
| 123 | +bound. |
| 124 | + |
| 125 | +**Onset of failure.** The Drucker-Prager yield function implemented in GEOS reads |
| 126 | + |
| 127 | +.. math:: |
| 128 | +
|
| 129 | + F = Q + b \, P - c |
| 130 | +
|
| 131 | +where :math:`P = \mathrm{tr}(\sigma)/3` is the mean stress and :math:`Q` the von Mises stress. |
| 132 | +The two coefficients are obtained from the friction angle :math:`\varphi` and the cohesion so |
| 133 | +that the cone passes through the triaxial compression corners of the Mohr-Coulomb surface: |
| 134 | + |
| 135 | +.. math:: |
| 136 | +
|
| 137 | + b = \frac{6 \sin \varphi}{3 - \sin \varphi}, \qquad |
| 138 | + c = \frac{6\, \mathrm{cohesion} \cos \varphi}{3 - \sin \varphi} |
| 139 | +
|
| 140 | +For the uniaxial stress state of this problem, :math:`Q = \sigma_{yy}` and |
| 141 | +:math:`P = \sigma_{yy}/3`, so the yield condition :math:`F = 0` gives a closed-form cap on the |
| 142 | +thermally induced stress, and the corresponding critical cooling: |
| 143 | + |
| 144 | +.. math:: |
| 145 | +
|
| 146 | + \sigma_{f} = \frac{c}{1 + b/3}, \qquad |
| 147 | + \Delta T_{f} = -\frac{\sigma_{f}}{E \, \alpha} |
| 148 | +
|
| 149 | +With the properties of this example, :math:`\sigma_{f} = 8868` Pa is reached after a cooling |
| 150 | +of only :math:`\Delta T_{f} = -39.4` K, that is, less than half of the imposed temperature |
| 151 | +drop. Beyond that point the rock deforms plastically and the stress stays on the yield |
| 152 | +surface. |
| 153 | + |
| 154 | +**Lateral displacement.** Because the ``y`` direction is blocked while ``x`` and ``z`` are |
| 155 | +free, all the deformation shows up laterally, and this gives a second, kinematic check that is |
| 156 | +independent from the stress. In the elastic regime, |
| 157 | + |
| 158 | +.. math:: |
| 159 | +
|
| 160 | + \varepsilon_{xx} = \alpha \, \Delta T \left( 1 + \frac{\lambda}{2(\lambda + G)} \right) |
| 161 | +
|
| 162 | +Once the yield surface is reached, plastic flow adds lateral strain while the stress stays |
| 163 | +put: the elasto-plastic column keeps contracting **faster** than the elastic one. Both |
| 164 | +branches are implemented in ``AnalyticalSol.py``, which is the reference solution used below. |
| 165 | + |
| 166 | +------------------------------------------------------------------ |
| 167 | +Running the case and post-processing |
| 168 | +------------------------------------------------------------------ |
| 169 | + |
| 170 | +Both cases are run independently, each in its own directory: |
| 171 | + |
| 172 | +.. code-block:: console |
| 173 | +
|
| 174 | + geosx -i ThermoElastic_1DCooling_fim_smoke.xml |
| 175 | + geosx -i ThermoDruckerPrager_1DCooling_fim_smoke.xml |
| 176 | +
|
| 177 | +Each run writes ``stressHistory.hdf5`` and ``displacementHistory.hdf5`` through the |
| 178 | +``TimeHistory`` outputs. Those files are **not** stored in the repository; the curves shown |
| 179 | +below are extracted once, locally, into a small CSV file with: |
| 180 | + |
| 181 | +.. code-block:: console |
| 182 | +
|
| 183 | + python3 postprocess1DCooling.py -e <elastic_run_dir> -d <druckerPrager_run_dir> |
| 184 | +
|
| 185 | +The figure of this page is then generated at documentation build time from that CSV only. |
| 186 | + |
| 187 | +------------------------------------------------------------------ |
| 188 | +Results |
| 189 | +------------------------------------------------------------------ |
| 190 | + |
| 191 | +.. plot:: docs/sphinx/advancedExamples/validationStudies/thermoPoromechanics/1DCooling/plot1DCooling.py |
| 192 | + |
| 193 | +The figure on the left shows the stress induced by the confined cooling. Up to |
| 194 | +:math:`-\Delta T \approx 39` K the two models are indistinguishable and follow the elastic |
| 195 | +line :math:`-E \alpha \Delta T` exactly. Past that threshold, the elastic rock keeps |
| 196 | +accumulating tensile stress and reaches 17.8 kPa at the end of the cooling, whereas the |
| 197 | +Drucker-Prager rock **yields** and its stress saturates at the analytical cap |
| 198 | +:math:`\sigma_{f}`, matching to machine precision. |
| 199 | + |
| 200 | +The figure in the middle explains the mechanism in the invariant plane. Because |
| 201 | +:math:`\sigma_{xx} = \sigma_{zz} = 0`, the loading path is the straight line :math:`Q = 3P`, |
| 202 | +whatever the amount of cooling. The elastic path simply crosses the Drucker-Prager envelope |
| 203 | +and keeps going, which is physically inadmissible; the elasto-plastic path stops on the |
| 204 | +envelope and slides along it. |
| 205 | + |
| 206 | +The figure on the right shows the kinematic counterpart. Up to the failure threshold, the two columns |
| 207 | +contract identically. Beyond it, the roles reverse with respect to the stress plot: the |
| 208 | +elasto-plastic column, whose stress is now frozen, contracts **more** than the elastic one, |
| 209 | +reaching :math:`-32.7` against :math:`-29.7` µm. Plastic flow converts what would have been |
| 210 | +additional stress into additional strain. GEOS matches the analytical displacement of both |
| 211 | +branches to machine precision. |
| 212 | + |
| 213 | +The practical consequence is that **the safe amount of cooling is set by the strength of the |
| 214 | +rock, not by its stiffness alone**: an elastic-only analysis of a cold injection would |
| 215 | +over-predict the stress by a factor of two here, under-predict the deformation, and miss the |
| 216 | +failure entirely. |
| 217 | + |
| 218 | +------------------------------------------------------------------ |
| 219 | +To go further |
| 220 | +------------------------------------------------------------------ |
| 221 | + |
| 222 | +**Feedback on this example** |
| 223 | + |
| 224 | +For any feedback on this example, please submit a `GitHub issue on the project's GitHub page <https://github.com/GEOS-DEV/GEOS/issues>`_. |
0 commit comments