From ba858175fe02bb464346ff58aac350883ce417ec Mon Sep 17 00:00:00 2001 From: Uwe Date: Thu, 4 Aug 2022 03:22:07 +0200 Subject: [PATCH] [FEM] Elmer: use direct solving as default for stresses - direct solving is sometimes even 10 times faster (as fast as CCX) and as accurate as CCX --- src/Mod/Fem/femsolver/elmer/equations/elasticity.py | 4 ++++ src/Mod/Fem/femtest/data/elmer/box_static_0_mm.sif | 7 ++----- .../Fem/femtest/data/elmer/ccxcantilever_faceload_0_mm.sif | 7 ++----- .../Fem/femtest/data/elmer/ccxcantilever_faceload_1_si.sif | 7 ++----- .../Fem/femtest/data/elmer/ccxcantilever_nodeload_0_mm.sif | 7 ++----- .../elmer/ccxcantilever_prescribeddisplacement_0_mm.sif | 7 ++----- 6 files changed, 14 insertions(+), 25 deletions(-) diff --git a/src/Mod/Fem/femsolver/elmer/equations/elasticity.py b/src/Mod/Fem/femsolver/elmer/equations/elasticity.py index ea7ff39d9256..fc93fe34d231 100644 --- a/src/Mod/Fem/femsolver/elmer/equations/elasticity.py +++ b/src/Mod/Fem/femsolver/elmer/equations/elasticity.py @@ -83,6 +83,10 @@ def __init__(self, obj): obj.EigenmodesCount = 5 obj.Priority = 10 obj.CalculatePrincipal = True + # according to the Elmer tutorial and forum, for stresses direct solving + # is recommended -> test showed 10 times faster and even more accurate + obj.LinearSolverType = "Direct" + obj.LinearDirectMethod = "Umfpack" class ViewProxy(linear.ViewProxy, equationbase.ElasticityViewProxy): diff --git a/src/Mod/Fem/femtest/data/elmer/box_static_0_mm.sif b/src/Mod/Fem/femtest/data/elmer/box_static_0_mm.sif index 263c01bd8b4b..6ab8d4fda261 100644 --- a/src/Mod/Fem/femtest/data/elmer/box_static_0_mm.sif +++ b/src/Mod/Fem/femtest/data/elmer/box_static_0_mm.sif @@ -15,13 +15,10 @@ Solver 1 Equation = String "Stress Solver" Exec Solver = String "Always" Linear System Abort Not Converged = Logical False - Linear System Convergence Tolerance = Real 1e-08 - Linear System Iterative Method = String "BiCGStab" - Linear System Max Iterations = Integer 500 + Linear System Direct Method = String "Umfpack" Linear System Precondition Recompute = Integer 1 - Linear System Preconditioning = String "ILU0" Linear System Residual Output = Integer 1 - Linear System Solver = String "Iterative" + Linear System Solver = String "Direct" Optimize Bandwidth = Logical True Procedure = File "StressSolve" "StressSolver" Steady State Convergence Tolerance = Real 1e-05 diff --git a/src/Mod/Fem/femtest/data/elmer/ccxcantilever_faceload_0_mm.sif b/src/Mod/Fem/femtest/data/elmer/ccxcantilever_faceload_0_mm.sif index 0cc5cf0e3bbb..c32fd3bd62e5 100644 --- a/src/Mod/Fem/femtest/data/elmer/ccxcantilever_faceload_0_mm.sif +++ b/src/Mod/Fem/femtest/data/elmer/ccxcantilever_faceload_0_mm.sif @@ -15,13 +15,10 @@ Solver 1 Equation = String "Stress Solver" Exec Solver = String "Always" Linear System Abort Not Converged = Logical False - Linear System Convergence Tolerance = Real 1e-08 - Linear System Iterative Method = String "BiCGStab" - Linear System Max Iterations = Integer 500 + Linear System Direct Method = String "Umfpack" Linear System Precondition Recompute = Integer 1 - Linear System Preconditioning = String "ILU0" Linear System Residual Output = Integer 1 - Linear System Solver = String "Iterative" + Linear System Solver = String "Direct" Optimize Bandwidth = Logical True Procedure = File "StressSolve" "StressSolver" Steady State Convergence Tolerance = Real 1e-05 diff --git a/src/Mod/Fem/femtest/data/elmer/ccxcantilever_faceload_1_si.sif b/src/Mod/Fem/femtest/data/elmer/ccxcantilever_faceload_1_si.sif index c239c40ff327..ff45db965186 100644 --- a/src/Mod/Fem/femtest/data/elmer/ccxcantilever_faceload_1_si.sif +++ b/src/Mod/Fem/femtest/data/elmer/ccxcantilever_faceload_1_si.sif @@ -15,13 +15,10 @@ Solver 1 Equation = String "Stress Solver" Exec Solver = String "Always" Linear System Abort Not Converged = Logical False - Linear System Convergence Tolerance = Real 1e-08 - Linear System Iterative Method = String "BiCGStab" - Linear System Max Iterations = Integer 500 + Linear System Direct Method = String "Umfpack" Linear System Precondition Recompute = Integer 1 - Linear System Preconditioning = String "ILU0" Linear System Residual Output = Integer 1 - Linear System Solver = String "Iterative" + Linear System Solver = String "Direct" Optimize Bandwidth = Logical True Procedure = File "StressSolve" "StressSolver" Steady State Convergence Tolerance = Real 1e-05 diff --git a/src/Mod/Fem/femtest/data/elmer/ccxcantilever_nodeload_0_mm.sif b/src/Mod/Fem/femtest/data/elmer/ccxcantilever_nodeload_0_mm.sif index 97ae9b0793db..d512f60928bc 100644 --- a/src/Mod/Fem/femtest/data/elmer/ccxcantilever_nodeload_0_mm.sif +++ b/src/Mod/Fem/femtest/data/elmer/ccxcantilever_nodeload_0_mm.sif @@ -15,13 +15,10 @@ Solver 1 Equation = String "Stress Solver" Exec Solver = String "Always" Linear System Abort Not Converged = Logical False - Linear System Convergence Tolerance = Real 1e-08 - Linear System Iterative Method = String "BiCGStab" - Linear System Max Iterations = Integer 500 + Linear System Direct Method = String "Umfpack" Linear System Precondition Recompute = Integer 1 - Linear System Preconditioning = String "ILU0" Linear System Residual Output = Integer 1 - Linear System Solver = String "Iterative" + Linear System Solver = String "Direct" Optimize Bandwidth = Logical True Procedure = File "StressSolve" "StressSolver" Steady State Convergence Tolerance = Real 1e-05 diff --git a/src/Mod/Fem/femtest/data/elmer/ccxcantilever_prescribeddisplacement_0_mm.sif b/src/Mod/Fem/femtest/data/elmer/ccxcantilever_prescribeddisplacement_0_mm.sif index 89db7df193c0..53b21d2af29b 100644 --- a/src/Mod/Fem/femtest/data/elmer/ccxcantilever_prescribeddisplacement_0_mm.sif +++ b/src/Mod/Fem/femtest/data/elmer/ccxcantilever_prescribeddisplacement_0_mm.sif @@ -15,13 +15,10 @@ Solver 1 Equation = String "Stress Solver" Exec Solver = String "Always" Linear System Abort Not Converged = Logical False - Linear System Convergence Tolerance = Real 1e-08 - Linear System Iterative Method = String "BiCGStab" - Linear System Max Iterations = Integer 500 + Linear System Direct Method = String "Umfpack" Linear System Precondition Recompute = Integer 1 - Linear System Preconditioning = String "ILU0" Linear System Residual Output = Integer 1 - Linear System Solver = String "Iterative" + Linear System Solver = String "Direct" Optimize Bandwidth = Logical True Procedure = File "StressSolve" "StressSolver" Steady State Convergence Tolerance = Real 1e-05