docs: Tutorial examples of a vertical fault using the ALM solver#4082
docs: Tutorial examples of a vertical fault using the ALM solver#4082jhuang2601 wants to merge 9 commits into
Conversation
dkachuma
left a comment
There was a problem hiding this comment.
The two examples look quite similar. Can we possibly discuss them in the same context as a comparison?
|
|
||
| inputFiles/poromechanicsFractures/Contact/AugmentedLagrangianMultipliers/ALM_verticalFault_base.xml | ||
| inputFiles/poromechanicsFractures/Contact/AugmentedLagrangianMultipliers/verticalFault_unstable_ISG_benchmark.xml | ||
|
|
There was a problem hiding this comment.
Can you please say a few words what the difference between internal and external workflow is in this instance.
| ------------------------------------------------------------------ | ||
|
|
||
| We simulate induced stresses and shear slip along a vertical fault in a depleted reservoir and compare our results against an analytical solution. | ||
| In conformity to the analytical set-up, the reservoir is divided into two parts by a vertical fault. The fault crosses and offsets the entire reservoir layer and well contained with the domain. The domain is infinite, homogeneous, isotropic, and elastic. The reservoir is depressurized uniformely upon depletion, and we neglect the transient effect of fluid flow. A pressure drop is applied to the reservoir layer located in the center of the domain. The overburden and underburden are impermeable, and no pressure changes occur in these layers. Due to poromechanical effects, pore pressure changes in the reservoir cause a mechanical deformation of the entire domain. This deformation leads to a stress (normal and shear) perturbation on the fault plane, potentially leading to fault reactivation. For verification, the numerical model considers plane strain deformation and the Coulomb failure criterion. |
There was a problem hiding this comment.
| In conformity to the analytical set-up, the reservoir is divided into two parts by a vertical fault. The fault crosses and offsets the entire reservoir layer and well contained with the domain. The domain is infinite, homogeneous, isotropic, and elastic. The reservoir is depressurized uniformely upon depletion, and we neglect the transient effect of fluid flow. A pressure drop is applied to the reservoir layer located in the center of the domain. The overburden and underburden are impermeable, and no pressure changes occur in these layers. Due to poromechanical effects, pore pressure changes in the reservoir cause a mechanical deformation of the entire domain. This deformation leads to a stress (normal and shear) perturbation on the fault plane, potentially leading to fault reactivation. For verification, the numerical model considers plane strain deformation and the Coulomb failure criterion. | |
| In conformity to the analytical set-up, the reservoir is divided into two parts by a vertical fault. The fault crosses and offsets the entire reservoir layer and is well contained with the domain. The domain is infinite, homogeneous, isotropic, and elastic. The reservoir is depressurized uniformly upon depletion, and we neglect the transient effect of fluid flow. A pressure drop is applied to the reservoir layer located in the center of the domain. The overburden and underburden are impermeable, and no pressure changes occur in these layers. Due to poromechanical effects, pore pressure changes in the reservoir cause a mechanical deformation of the entire domain. This deformation leads to a stress (normal and shear) perturbation on the fault plane, potentially leading to fault reactivation. For verification, the numerical model considers plane strain deformation and the Coulomb failure criterion. |
| <File name="ALM_verticalFault_base.xml"/> | ||
| </Included> | ||
|
|
||
| <Constitutive> |
There was a problem hiding this comment.
I would expect constitutive relations to be in the base file and shared between the smoke/bench and internal/external cases. Are they actually different across these models?
| name="mesh1" | ||
| useGlobalIds="0" | ||
| nodesetNames="{ faultNodes }" | ||
| file="../../MESH/verticalFault_ISG_benchmark.vtu"/> |
There was a problem hiding this comment.
In these cases I have expected the internal workflow to be able to use the "domain" mesh from the external workflow. Are there differences between verticalFault_ISG_benchmark.vtu and Domain_verticalFault_benchmark.vtu?
|
|
||
| As demonstrated in this example, to setup a poromechanical coupling, we need to define three different solvers in the XML file: | ||
|
|
||
| - the mechanics solver, a solver of type ``SolidMechanicsAugmentedLagrangianContact`` called here ``fractureMechSolver``, is applied to solve the frictional contact and rock deformations. In this solver, we specify ``targetRegions`` that include both the continuum region ``Region`` and the discontinuum region ``Fault`` where the solver is applied to couple rock and fracture deformations. The contact constitutive law used for the fault elements is named ``fractureContact``, and is defined later in the ``Constitutive`` section. |
There was a problem hiding this comment.
| - the mechanics solver, a solver of type ``SolidMechanicsAugmentedLagrangianContact`` called here ``fractureMechSolver``, is applied to solve the frictional contact and rock deformations. In this solver, we specify ``targetRegions`` that include both the continuum region ``Region`` and the discontinuum region ``Fault`` where the solver is applied to couple rock and fracture deformations. The contact constitutive law used for the fault elements is named ``fractureContact``, and is defined later in the ``Constitutive`` section. | |
| - the mechanics solver, a solver of type ``SolidMechanicsAugmentedLagrangianContact`` called here ``fractureMechSolver``, is applied to solve the frictional contact and rock deformations. In this solver, we specify ``targetRegions`` that include both the continuum region ``Region`` and the fracture region ``Fault`` where the solver is applied to couple rock and fracture deformations. The contact constitutive law used for the fault elements is named ``fractureContact``, and is defined later in the ``Constitutive`` section. |
| For more information on defining finite elements numerical schemes, | ||
| please see the dedicated :ref:`FiniteElement` section. | ||
|
|
||
| The finite volume method requires the specification of a discretization scheme. |
There was a problem hiding this comment.
| The finite volume method requires the specification of a discretization scheme. | |
| The finite volume method, for the flow solver, requires the specification of a discretization scheme. |
bd713
left a comment
There was a problem hiding this comment.
Thanks, @jhuang2601.
Along the same lines as @dkachuma, we could probably also share the scripts (especially for the analytical solution).
|
|
||
| **Context** | ||
|
|
||
| In this example, the Augmented Lagrangian Method (ALM) `(Frigo et al., 2026) <https://www.sciencedirect.com/science/article/abs/pii/S0021999126003414>`__ is applied to solve a frictional fault contact problem in a depleted reservoir. This approach employs conformal discretization where discontinuities are explicitly represented by 2D interface elements placed between 3D continuum elements. The formulation overcomes the inf-sup instability of low-order discretizations by satisfying the Babuška–Brezzi condition via displacement enrichment with bubble functions and is coupled with a Coulomb friction law. Implemented in GEOS, the model computes displacement discontinuities (fault slip unpon reactivation) along the frictionless fault, which are subsequently verified against the corresponding analytical solution `(Jansen and Meulenbroek, 2022) <https://njgjournal.nl/index.php/njg/article/view/11453/17972>`__. This comparison confirms the accuracy of our fault contact model and coupled poroelastic formulation. |
There was a problem hiding this comment.
| In this example, the Augmented Lagrangian Method (ALM) `(Frigo et al., 2026) <https://www.sciencedirect.com/science/article/abs/pii/S0021999126003414>`__ is applied to solve a frictional fault contact problem in a depleted reservoir. This approach employs conformal discretization where discontinuities are explicitly represented by 2D interface elements placed between 3D continuum elements. The formulation overcomes the inf-sup instability of low-order discretizations by satisfying the Babuška–Brezzi condition via displacement enrichment with bubble functions and is coupled with a Coulomb friction law. Implemented in GEOS, the model computes displacement discontinuities (fault slip unpon reactivation) along the frictionless fault, which are subsequently verified against the corresponding analytical solution `(Jansen and Meulenbroek, 2022) <https://njgjournal.nl/index.php/njg/article/view/11453/17972>`__. This comparison confirms the accuracy of our fault contact model and coupled poroelastic formulation. | |
| In this example, the Augmented Lagrangian Method (ALM) `(Frigo et al., 2026) <https://www.sciencedirect.com/science/article/abs/pii/S0021999126003414>`__ is applied to solve a frictional fault contact problem in a depleted reservoir. This approach employs conformal discretization where discontinuities are explicitly represented by 2D interface elements placed between 3D continuum elements. The formulation overcomes the inf-sup instability of low-order discretizations by satisfying the Babuška–Brezzi condition via displacement enrichment with bubble functions and is coupled with a Coulomb friction law. Implemented in GEOS, the model computes displacement discontinuities (fault slip upon reactivation) along the frictionless fault, which are subsequently verified against the corresponding analytical solution `(Jansen and Meulenbroek, 2022) <https://njgjournal.nl/index.php/njg/article/view/11453/17972>`__. This comparison confirms the accuracy of our fault contact model and coupled poroelastic formulation. |
| :start-after: <!-- SPHINX_MESH --> | ||
| :end-before: <!-- SPHINX_MESH_END --> | ||
|
|
||
| The vtm file ``verticalFault_ESG_benchmark.vtm`` references two separate mesh files: the damain mesh ``Domain_verticalFault_benchmark.vtu`` and the fault mesh ``Fault_verticalFault_benchmark.vtu``, which are generated prior to running the GEOS simulation. The ``mesh doctor`` module provides a convenient way to prepare these meshes. For this case, functions ``generateFractures`` and ``generateGlobalIds`` are used (more information here: `mesh doctor <https://geosx-geosx.readthedocs-hosted.com/projects/geosx-geospythonpackages/en/latest/mesh-doctor.html#>`__). |
There was a problem hiding this comment.
| The vtm file ``verticalFault_ESG_benchmark.vtm`` references two separate mesh files: the damain mesh ``Domain_verticalFault_benchmark.vtu`` and the fault mesh ``Fault_verticalFault_benchmark.vtu``, which are generated prior to running the GEOS simulation. The ``mesh doctor`` module provides a convenient way to prepare these meshes. For this case, functions ``generateFractures`` and ``generateGlobalIds`` are used (more information here: `mesh doctor <https://geosx-geosx.readthedocs-hosted.com/projects/geosx-geospythonpackages/en/latest/mesh-doctor.html#>`__). | |
| The vtm file ``verticalFault_ESG_benchmark.vtm`` references two separate mesh files: the domain mesh ``Domain_verticalFault_benchmark.vtu`` and the fault mesh ``Fault_verticalFault_benchmark.vtu``, which are generated prior to running the GEOS simulation. The ``mesh doctor`` module provides a convenient way to prepare these meshes. For this case, functions ``generateFractures`` and ``generateGlobalIds`` are used (more information here: `mesh doctor <https://geosx-geosx.readthedocs-hosted.com/projects/geosx-geospythonpackages/en/latest/mesh-doctor.html#>`__). |
| In this example, let us focus on the coupling solver. | ||
| This solver (``poroFractureSolver``) uses a set of attributes that specifically describe the coupling process within a poromechanical framework. | ||
| For instance, we must point this solver to the designated fluid solver (here: ``singlePhaseFlowSolver``) and solid solver (here: ``fractureMechSolver``). | ||
| These solvers are forced to interact with all the constitutive models in the target regions (here, we only two, ``Region`` and ``Fault``). |
There was a problem hiding this comment.
| These solvers are forced to interact with all the constitutive models in the target regions (here, we only two, ``Region`` and ``Fault``). | |
| These solvers are forced to interact with all the constitutive models in the target regions (here, we only have two, ``Region`` and ``Fault``). |
| :start-after: <!-- SPHINX_MESH --> | ||
| :end-before: <!-- SPHINX_MESH_END --> | ||
|
|
||
| The vtm file ``verticalFault_ESG_benchmark.vtm`` references two separate mesh files: the damain mesh ``Domain_verticalFault_benchmark.vtu`` and the fault mesh ``Fault_verticalFault_benchmark.vtu``, which are generated prior to running the GEOS simulation. The ``mesh doctor`` module provides a convenient way to prepare these meshes. For this case, functions ``generateFractures`` and ``generateGlobalIds`` are used (more information here: `mesh doctor <https://geosx-geosx.readthedocs-hosted.com/projects/geosx-geospythonpackages/en/latest/mesh-doctor.html#>`__). |
There was a problem hiding this comment.
| The vtm file ``verticalFault_ESG_benchmark.vtm`` references two separate mesh files: the damain mesh ``Domain_verticalFault_benchmark.vtu`` and the fault mesh ``Fault_verticalFault_benchmark.vtu``, which are generated prior to running the GEOS simulation. The ``mesh doctor`` module provides a convenient way to prepare these meshes. For this case, functions ``generateFractures`` and ``generateGlobalIds`` are used (more information here: `mesh doctor <https://geosx-geosx.readthedocs-hosted.com/projects/geosx-geospythonpackages/en/latest/mesh-doctor.html#>`__). | |
| The vtm file ``verticalFault_ESG_benchmark.vtm`` references two separate mesh files: the domain mesh ``Domain_verticalFault_benchmark.vtu`` and the fault mesh ``Fault_verticalFault_benchmark.vtu``, which are generated prior to running the GEOS simulation. The ``mesh doctor`` module provides a convenient way to prepare these meshes. For this case, functions ``generateFractures`` and ``generateGlobalIds`` are used (more information here: `mesh doctor <https://geosx-geosx.readthedocs-hosted.com/projects/geosx-geospythonpackages/en/latest/mesh-doctor.html#>`__). |
| In this example, let us focus on the coupling solver. | ||
| This solver (``poroFractureSolver``) uses a set of attributes that specifically describe the coupling process within a poromechanical framework. | ||
| For instance, we must point this solver to the designated fluid solver (here: ``singlePhaseFlowSolver``) and solid solver (here: ``fractureMechSolver``). | ||
| These solvers are forced to interact with all the constitutive models in the target regions (here, we only two, ``Region`` and ``Fault``). |
There was a problem hiding this comment.
| These solvers are forced to interact with all the constitutive models in the target regions (here, we only two, ``Region`` and ``Fault``). | |
| These solvers are forced to interact with all the constitutive models in the target regions (here, we only have two, ``Region`` and ``Fault``). |
This PR