Files
create/src/Mod/Fem/femsolver/elmer/equations/linear.py
2022-08-13 03:45:42 +02:00

143 lines
4.8 KiB
Python

# ***************************************************************************
# * Copyright (c) 2017 Markus Hovorka <m.hovorka@live.de> *
# * *
# * This file is part of the FreeCAD CAx development system. *
# * *
# * This program is free software; you can redistribute it and/or modify *
# * it under the terms of the GNU Lesser General Public License (LGPL) *
# * as published by the Free Software Foundation; either version 2 of *
# * the License, or (at your option) any later version. *
# * for detail see the LICENCE text file. *
# * *
# * This program is distributed in the hope that it will be useful, *
# * but WITHOUT ANY WARRANTY; without even the implied warranty of *
# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
# * GNU Library General Public License for more details. *
# * *
# * You should have received a copy of the GNU Library General Public *
# * License along with this program; if not, write to the Free Software *
# * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 *
# * USA *
# * *
# ***************************************************************************
__title__ = "FreeCAD FEM solver Elmer equation object _Linear"
__author__ = "Markus Hovorka"
__url__ = "https://www.freecadweb.org"
## \addtogroup FEM
# @{
from . import equation
# the linear equation object defines some attributes for some various elmer equations
# these various elmer equations are based on the linear equation object
# thus in ObjectsFem module is no method to add a linear equation object
LINEAR_SOLVER = ["Direct", "Iterative"]
LINEAR_DIRECT = ["Banded", "MUMPS", "Umfpack"]
LINEAR_ITERATIVE = [
"CG",
"CGS",
"BiCGStab",
"BiCGStabl",
"TFQMR",
"GMRES",
"GCR",
]
LINEAR_PRECONDITIONING = [
"None",
"Diagonal",
"ILU0",
"ILU1",
"ILU2",
"ILU3",
"ILU4",
]
class Proxy(equation.Proxy):
def __init__(self, obj):
super(Proxy, self).__init__(obj)
obj.addProperty(
"App::PropertyEnumeration",
"LinearSolverType",
"Linear System",
""
)
obj.LinearSolverType = LINEAR_SOLVER
obj.LinearSolverType = "Iterative"
obj.addProperty(
"App::PropertyEnumeration",
"LinearDirectMethod",
"Linear System",
""
)
obj.LinearDirectMethod = LINEAR_DIRECT
obj.addProperty(
"App::PropertyEnumeration",
"LinearIterativeMethod",
"Linear System",
""
)
obj.LinearIterativeMethod = LINEAR_ITERATIVE
obj.LinearIterativeMethod = "BiCGStab"
obj.addProperty(
"App::PropertyInteger",
"BiCGstablDegree",
"Linear System",
"Polynom degree for iterative method 'BiCGstabl'"
)
obj.BiCGstablDegree = 2
obj.addProperty(
"App::PropertyEnumeration",
"LinearPreconditioning",
"Linear System",
""
)
obj.LinearPreconditioning = LINEAR_PRECONDITIONING
obj.LinearPreconditioning = "ILU0"
obj.addProperty(
"App::PropertyFloat",
"LinearTolerance",
"Linear System",
"Linear preconditioning method"
)
# we must set an expression because we don't have a UI, the user has to
# view and edit the tolerance via the property editor and this does not
# yet allow to view and edit small numbers in scientific notation
# forum thread: https://forum.freecadweb.org/viewtopic.php?p=613897#p613897
obj.setExpression("LinearTolerance", "1e-10")
obj.addProperty(
"App::PropertyInteger",
"LinearIterations",
"Linear System",
""
)
obj.LinearIterations = 500
obj.addProperty(
"App::PropertyFloat",
"SteadyStateTolerance",
"Steady State",
""
)
# same as with LinearTolerance
obj.setExpression("SteadyStateTolerance", "1e-5")
obj.addProperty(
"App::PropertyBool",
"Stabilize",
"Base",
""
)
obj.Stabilize = True
class ViewProxy(equation.ViewProxy):
pass
## @}