GEOS icon indicating copy to clipboard operation
GEOS copied to clipboard

MGR: Bad linear solver convergence for poromechanics case with fractures

Open paveltomin opened this issue 2 years ago • 5 comments

Example 1 (conforming): PoroElastic_conformingFracture_2d_faultSlip switch to MGR:

      <LinearSolverParameters
        solverType="fgmres"
        preconditionerType="mgr"
        logLevel="1"
      />

run and observe:

Time: 0.00e+00 s, dt: 100 s, Cycle: 0

  Number of element for each fracture state: stick:           80 | slip:             0 | open:             0
    Attempt:  0, ConfigurationIter:  0, NewtonIter:  0
        ( Rflow ) = ( 1.34e+02 )        ( Rsolid ) = ( 4.68e+08 )        ( Rdisplacement, Rtraction, Rtotal ) = (    1.000000e+00,    1.000000e+00,    1.000000e+00 )        ( R ) = ( 4.68e+08 )
        MGR preconditioner: numComponentsPerField = [3, 3, 1]
        Linear Solver | Success | Iterations: 80 | Final Rel Res: 8.91421e-07 | Make Restrictor Time: 0 | Compute Auu Time: 0 | SC Filter Time: 0 | Setup Time: 0.238624 s | Solve Time: 2.12301 s
        Last LinSolve(iter,res) = (  80, 8.91e-07 )
        flowSolver: Max pressure change: 14074.399 Pa (before scaling)
        poroSolver: Global solution scaling factor = 1
        flowSolver: Number of negative pressure values: 650, minimum value: -13586.745 Pa
    Attempt:  0, ConfigurationIter:  0, NewtonIter:  1
        ( Rflow ) = ( 1.48e-06 )        ( Rsolid ) = ( 4.17e+02 )        ( Rdisplacement, Rtraction, Rtotal ) = (    8.914212e-07,    4.069220e-07,    8.914212e-07 )        ( R ) = ( 4.17e+02 )
        MGR preconditioner: numComponentsPerField = [3, 3, 1]
        Linear Solver | NotConverged | Iterations: 200 | Final Rel Res: 0.000558784 | Make Restrictor Time: 0 | Compute Auu Time: 0 | SC Filter Time: 0 | Setup Time: 0.234295 s | Solve Time: 5.7737 s
        Last LinSolve(iter,res) = ( 200, 5.59e-04 )
        flowSolver: Max pressure change: 158.478 Pa (before scaling)
        poroSolver: Global solution scaling factor = 1
        flowSolver: Number of negative pressure values: 650, minimum value: -13581.952 Pa
    Attempt:  0, ConfigurationIter:  0, NewtonIter:  2
        ( Rflow ) = ( 5.72e-10 )        ( Rsolid ) = ( 2.33e-01 )        ( Rdisplacement, Rtraction, Rtotal ) = (    4.981216e-10,    1.023570e-10,    4.981216e-10 )        ( R ) = ( 2.33e-01 )
        MGR preconditioner: numComponentsPerField = [3, 3, 1]
        Linear Solver | NotConverged | Iterations: 200 | Final Rel Res: 0.0133972 | Make Restrictor Time: 0 | Compute Auu Time: 0 | SC Filter Time: 0 | Setup Time: 0.239527 s | Solve Time: 5.71636 s
        Last LinSolve(iter,res) = ( 200, 1.34e-02 )
        flowSolver: Max pressure change: 0.047 Pa (before scaling)
        poroSolver: Global solution scaling factor = 1
        flowSolver: Number of negative pressure values: 650, minimum value: -13581.951 Pa
    Attempt:  0, ConfigurationIter:  0, NewtonIter:  3
        ( Rflow ) = ( 1.01e-11 )        ( Rsolid ) = ( 3.13e-03 )        ( Rdisplacement, Rtraction, Rtotal ) = (    6.673488e-12,    1.574757e-12,    6.673488e-12 )        ( R ) = ( 3.13e-03 )
        MGR preconditioner: numComponentsPerField = [3, 3, 1]
        Linear Solver | NotConverged | Iterations: 200 | Final Rel Res: 0.00803326 | Make Restrictor Time: 0 | Compute Auu Time: 0 | SC Filter Time: 0 | Setup Time: 0.236079 s | Solve Time: 5.72704 s
        Last LinSolve(iter,res) = ( 200, 8.03e-03 )

Examples 2 (EDFM): https://github.com/GEOS-DEV/GEOS/blob/develop/inputFiles/poromechanicsFractures/SlipPermeability_embeddedFrac.xml and SlipPermeability_pEDFM_smoke.xml similar convergence issues observed.

paveltomin avatar Feb 27 '24 23:02 paveltomin

The issue can be related to the equation order change after https://github.com/GEOS-DEV/GEOS/pull/2967, see below

new order image

old order image

hopefully an easy fix

paveltomin avatar Mar 01 '24 15:03 paveltomin

The issue can be related to the equation order

Yes, we need to update the MGR strategies accordingly. I can take a look

victorapm avatar Mar 01 '24 16:03 victorapm

The issue can be related to the equation order

Yes, we need to update the MGR strategies accordingly. I can take a look

Thank you, @victorapm!

paveltomin avatar Mar 01 '24 16:03 paveltomin

The issue can be related to the equation order

Yes, we need to update the MGR strategies accordingly. I can take a look

I think we need to change the way these mgr strategies are defined so that we avoid this kind of issue. We fix the ordering statically in the mgr strategies but the actual ordering of the fields is defined at execution. It can get tricky now that we start combining a lot of solvers.

CusiniM avatar Mar 04 '24 18:03 CusiniM

The issue can be related to the equation order

Yes, we need to update the MGR strategies accordingly. I can take a look

I think we need to change the way these mgr strategies are defined so that we avoid this kind of issue. We fix the ordering statically in the mgr strategies but the actual ordering of the fields is defined at execution. It can get tricky now that we start combining a lot of solvers.

To be more precise, the ordering depends on the order in which the functions to add fields to the dofManager are called so technically we can know it before execution but I still think that it is tricky to keep track of this and, if it changes like in this case, we have no test to catch the issue.

CusiniM avatar Mar 04 '24 18:03 CusiniM

https://github.com/GEOS-DEV/GEOS/blob/develop/inputFiles/poromechanicsFractures/PoroElastic_conformingFracture_2d_faultSlip_benchmark.xml still does not converge after the order fix

Time: 0.00e+00 s, dt: 100 s, Cycle: 0

  Number of element for each fracture state: stick:           80 | new slip:            0 | slip:             0 | open:             0
    Attempt:  0, ConfigurationIter:  0, NewtonIter:  0
        ( Rflow ) = ( 1.34e+02 )        ( Rsolid ) = ( 4.68e+03 )        ( Rstick Rslip Ropen ) = (    0.000000e+00    0.000000e+00    0.000000e+00 )        ( R ) = ( 4.68e+03 )
        Last LinSolve(iter,res) = ( 200, 2.77e-04 )
        flowSolver: Max pressure change = 14105.061 Pa (before scaling)
        poroSolver: Global solution scaling factor = 1
        flowSolver: Number of negative pressure values: 650, minimum value: -13609.631 Pa
    Attempt:  0, ConfigurationIter:  0, NewtonIter:  1
        ( Rflow ) = ( 8.18e-06 )        ( Rsolid ) = ( 5.64e-01 )        ( Rstick Rslip Ropen ) = (    8.128545e-05    0.000000e+00    0.000000e+00 )        ( R ) = ( 5.64e-01 )
        Last LinSolve(iter,res) = ( 200, 7.32e-01 )
        flowSolver: Max pressure change = 191.322 Pa (before scaling)
        poroSolver: Global solution scaling factor = 1
        flowSolver: Number of negative pressure values: 650, minimum value: -13598.476 Pa
    Attempt:  0, ConfigurationIter:  0, NewtonIter:  2
        ( Rflow ) = ( 7.22e-06 )        ( Rsolid ) = ( 4.13e-01 )        ( Rstick Rslip Ropen ) = (    9.709800e-05    0.000000e+00    0.000000e+00 )        ( R ) = ( 4.13e-01 )
        Last LinSolve(iter,res) = ( 200, 7.37e-01 )
        flowSolver: Max pressure change = 131.324 Pa (before scaling)
        poroSolver: Global solution scaling factor = 1
        flowSolver: Number of negative pressure values: 650, minimum value: -13585.808 Pa
    Attempt:  0, ConfigurationIter:  0, NewtonIter:  3
        ( Rflow ) = ( 3.33e-06 )        ( Rsolid ) = ( 3.04e-01 )        ( Rstick Rslip Ropen ) = (    9.166976e-05    0.000000e+00    0.000000e+00 )        ( R ) = ( 3.04e-01 )
        Last LinSolve(iter,res) = ( 200, 8.87e-01 )
        flowSolver: Max pressure change = 62.976 Pa (before scaling)
        poroSolver: Global solution scaling factor = 1
        flowSolver: Number of negative pressure values: 650, minimum value: -13586.965 Pa

https://github.com/GEOS-DEV/GEOS/blob/develop/inputFiles/poromechanicsFractures/SlipPermeability_embeddedFrac.xml works ok

https://github.com/GEOS-DEV/GEOS/blob/develop/inputFiles/poromechanicsFractures/SlipPermeability_pEDFM_smoke.xml runs and can finish but convergence is not great

paveltomin avatar Dec 05 '24 18:12 paveltomin