Merge pull request #12662 from FEA-eng/fem_ccx_incrementation

New FEM CalculiX incrementation settings
This commit is contained in:
sliptonic
2024-03-25 12:16:36 -05:00
committed by GitHub
32 changed files with 227 additions and 83 deletions

View File

@@ -393,14 +393,14 @@
</property>
</widget>
</item>
<item row="4" column="0">
<item row="3" column="0">
<widget class="QLabel" name="l_use_iterations_param">
<property name="text">
<string>Time incrementation control parameter</string>
</property>
</widget>
</item>
<item row="4" column="2">
<item row="3" column="2">
<widget class="Gui::PrefCheckBox" name="cb_use_iterations_param">
<property name="text">
<string>Use non ccx defaults</string>
@@ -416,6 +416,38 @@
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QLabel" name="l_ccx_max_iterations">
<property name="text">
<string>Maximum number of iterations</string>
</property>
</widget>
</item>
<item row="4" column="2">
<widget class="Gui::PrefSpinBox" name="sb_ccx_max_iterations">
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="minimum">
<number>1</number>
</property>
<property name="maximum">
<number>10000000</number>
</property>
<property name="singleStep">
<number>10</number>
</property>
<property name="value">
<number>2000</number>
</property>
<property name="prefEntry" stdset="0">
<cstring>AnalysisMaxIterations</cstring>
</property>
<property name="prefPath" stdset="0">
<cstring>Mod/Fem/Ccx</cstring>
</property>
</widget>
</item>
<item row="5" column="0">
<widget class="QLabel" name="l_ccx_initial_time_step">
<property name="text">
@@ -445,10 +477,10 @@
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="decimals">
<number>3</number>
<number>9</number>
</property>
<property name="minimum">
<double>0.010000000000000</double>
<double>0.000000001000000</double>
</property>
<property name="singleStep">
<double>0.010000000000000</double>
@@ -465,7 +497,7 @@
</widget>
</item>
<item row="5" column="3">
<widget class="QLabel" name="l_hz_3">
<widget class="QLabel" name="l_hz_1">
<property name="text">
<string>s</string>
</property>
@@ -484,10 +516,10 @@
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="decimals">
<number>3</number>
<number>9</number>
</property>
<property name="minimum">
<double>0.010000000000000</double>
<double>0.000000001000000</double>
</property>
<property name="singleStep">
<double>0.010000000000000</double>
@@ -504,20 +536,130 @@
</widget>
</item>
<item row="6" column="3">
<widget class="QLabel" name="l_hz_2">
<property name="text">
<string>s</string>
</property>
</widget>
</item>
<item row="7" column="0">
<widget class="QLabel" name="l_ccx_minimum_time_step">
<property name="text">
<string>Time Minimum Step</string>
</property>
</widget>
</item>
<item row="7" column="1">
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="7" column="2">
<widget class="Gui::PrefDoubleSpinBox" name="dsb_ccx_minimum_time_step">
<property name="contextMenuPolicy">
<enum>Qt::DefaultContextMenu</enum>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="decimals">
<number>9</number>
</property>
<property name="minimum">
<double>0.000000001000000</double>
</property>
<property name="singleStep">
<double>0.010000000000000</double>
</property>
<property name="value">
<double>0.000010000000000</double>
</property>
<property name="prefEntry" stdset="0">
<cstring>AnalysisTimeMinimumStep</cstring>
</property>
<property name="prefPath" stdset="0">
<cstring>Mod/Fem/Ccx</cstring>
</property>
</widget>
</item>
<item row="7" column="3">
<widget class="QLabel" name="l_hz_3">
<property name="text">
<string>s</string>
</property>
</widget>
</item>
<item row="8" column="0">
<widget class="QLabel" name="l_ccx_maximum_time_step">
<property name="text">
<string>Time Maximum Step</string>
</property>
</widget>
</item>
<item row="8" column="1">
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="8" column="2">
<widget class="Gui::PrefDoubleSpinBox" name="dsb_ccx_maximum_time_step">
<property name="contextMenuPolicy">
<enum>Qt::DefaultContextMenu</enum>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="decimals">
<number>9</number>
</property>
<property name="minimum">
<double>0.000000001000000</double>
</property>
<property name="singleStep">
<double>1.000000000000000</double>
</property>
<property name="value">
<double>1.000000000000000</double>
</property>
<property name="prefEntry" stdset="0">
<cstring>AnalysisTimeMaximumStep</cstring>
</property>
<property name="prefPath" stdset="0">
<cstring>Mod/Fem/Ccx</cstring>
</property>
</widget>
</item>
<item row="8" column="3">
<widget class="QLabel" name="l_hz_4">
<property name="text">
<string>s</string>
</property>
</widget>
</item>
<item row="7" column="0">
<item row="9" column="0">
<widget class="QLabel" name="l_BeamShellOutput">
<property name="text">
<string>Beam, shell element 3D output format</string>
</property>
</widget>
</item>
<item row="7" column="2">
<item row="9" column="2">
<widget class="Gui::PrefCheckBox" name="cb_BeamShellOutput">
<property name="text">
<string>3D Output, unchecked for 2D</string>
@@ -569,35 +711,6 @@
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="l_ccx_max_iterations">
<property name="text">
<string>Maximum number of iterations</string>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="Gui::PrefSpinBox" name="sb_ccx_max_iterations">
<property name="minimum">
<number>1</number>
</property>
<property name="maximum">
<number>10000000</number>
</property>
<property name="singleStep">
<number>10</number>
</property>
<property name="value">
<number>2000</number>
</property>
<property name="prefEntry" stdset="0">
<cstring>AnalysisMaxIterations</cstring>
</property>
<property name="prefPath" stdset="0">
<cstring>Mod/Fem/Ccx</cstring>
</property>
</widget>
</item>
</layout>
</item>
</layout>
@@ -695,7 +808,7 @@
</widget>
</item>
<item row="2" column="3">
<widget class="QLabel" name="l_hz_2">
<widget class="QLabel" name="l_hz_5">
<property name="text">
<string>Hz</string>
</property>

View File

@@ -73,6 +73,8 @@ void DlgSettingsFemCcxImp::saveSettings()
ui->sb_ccx_max_iterations->onSave(); // Max number of iterations
ui->dsb_ccx_initial_time_step->onSave(); // Initial time step
ui->dsb_ccx_analysis_time->onSave(); // Analysis time
ui->dsb_ccx_minimum_time_step->onSave(); // Minimum time step
ui->dsb_ccx_maximum_time_step->onSave(); // Maximum time step
ui->cb_analysis_type->onSave();
ui->cb_BeamShellOutput->onSave(); // Beam shell output 3d or 2d
@@ -98,6 +100,8 @@ void DlgSettingsFemCcxImp::loadSettings()
ui->sb_ccx_max_iterations->onRestore(); // Max number of iterations
ui->dsb_ccx_initial_time_step->onRestore(); // Initial time step
ui->dsb_ccx_analysis_time->onRestore(); // Analysis time
ui->dsb_ccx_minimum_time_step->onRestore(); // Minimum time step
ui->dsb_ccx_maximum_time_step->onRestore(); // Maximum time step
ui->cb_analysis_type->onRestore();
ui->cb_BeamShellOutput->onRestore(); // Beam shell output 3d or 2d

View File

@@ -145,7 +145,7 @@ def setup(doc=None, solvertype="ccxtools"):
# solver_obj.MatrixSolverType = "default"
solver_obj.MatrixSolverType = "spooles" # thomas
solver_obj.SplitInputWriter = False
solver_obj.IterationsThermoMechMaximum = 2000
solver_obj.IterationsMaximum = 2000
# solver_obj.IterationsControlParameterTimeUse = True # thermomech spine
analysis.addObject(solver_obj)

View File

@@ -198,19 +198,23 @@ def add_attributes(obj, ccx_prefs):
ehl = ccx_prefs.GetFloat("EigenmodeHighLimit", 1000000.0)
obj.EigenmodeHighLimit = (ehl, 0.0, 1000000.0, 10000.0)
if not hasattr(obj, "IterationsThermoMechMaximum"):
help_string_IterationsThermoMechMaximum = (
"Maximum Number of thermo mechanical iterations "
if not hasattr(obj, "IterationsMaximum"):
help_string_IterationsMaximum = (
"Maximum Number of iterations "
"in each time step before stopping jobs"
)
obj.addProperty(
"App::PropertyIntegerConstraint",
"IterationsThermoMechMaximum",
"IterationsMaximum",
"Fem",
help_string_IterationsThermoMechMaximum
help_string_IterationsMaximum
)
niter = ccx_prefs.GetInt("AnalysisMaxIterations", 200)
obj.IterationsThermoMechMaximum = niter
obj.IterationsMaximum = niter
if hasattr(obj, "IterationsThermoMechMaximum"):
obj.IterationsMaximum = obj.IterationsThermoMechMaximum
obj.removeProperty("IterationsThermoMechMaximum")
if not hasattr(obj, "BucklingFactors"):
obj.addProperty(
@@ -242,6 +246,26 @@ def add_attributes(obj, ccx_prefs):
eni = ccx_prefs.GetFloat("AnalysisTime", 1.0)
obj.TimeEnd = eni
if not hasattr(obj, "TimeMinimumStep"):
obj.addProperty(
"App::PropertyFloatConstraint",
"TimeMinimumStep",
"Fem",
"Minimum time step"
)
mini = ccx_prefs.GetFloat("AnalysisTimeMinimumStep", 0.00001)
obj.TimeMinimumStep = mini
if not hasattr(obj, "TimeMaximumStep"):
obj.addProperty(
"App::PropertyFloatConstraint",
"TimeMaximumStep",
"Fem",
"Maximum time step"
)
maxi = ccx_prefs.GetFloat("AnalysisTimeMaximumStep", 1.0)
obj.TimeMaximumStep = maxi
if not hasattr(obj, "ThermoMechSteadyState"):
obj.addProperty(
"App::PropertyBool",
@@ -332,7 +356,7 @@ def add_attributes(obj, ccx_prefs):
if not hasattr(obj, "IterationsUserDefinedTimeStepLength"):
help_string_IterationsUserDefinedTimeStepLength = (
"Set to True to use the user defined time steps. "
"The time steps are set with TimeInitialStep and TimeEnd"
"They are set with TimeInitialStep, TimeEnd, TimeMinimum and TimeMaximum"
)
obj.addProperty(
"App::PropertyBool",

View File

@@ -45,12 +45,11 @@ def write_step_equation(f, ccxwriter):
"Analysis type frequency and geometrical nonlinear "
"analysis are not allowed together, linear is used instead!\n"
)
if ccxwriter.solver_obj.IterationsThermoMechMaximum:
if ccxwriter.analysis_type == "thermomech":
step += ", INC={}".format(ccxwriter.solver_obj.IterationsThermoMechMaximum)
if ccxwriter.solver_obj.IterationsMaximum:
if ccxwriter.analysis_type == "thermomech" or ccxwriter.analysis_type == "static":
step += ", INC={}".format(ccxwriter.solver_obj.IterationsMaximum)
elif (
ccxwriter.analysis_type == "static"
or ccxwriter.analysis_type == "frequency"
ccxwriter.analysis_type == "frequency"
or ccxwriter.analysis_type == "buckling"
):
# parameter is for thermomechanical analysis only, see ccx manual *STEP
@@ -124,9 +123,11 @@ def write_step_equation(f, ccxwriter):
if ccxwriter.analysis_type == "static" or ccxwriter.analysis_type == "check":
if ccxwriter.solver_obj.IterationsUserDefinedIncrementations is True \
or ccxwriter.solver_obj.IterationsUserDefinedTimeStepLength is True:
analysis_parameter = "{},{}".format(
analysis_parameter = "{},{},{},{}".format(
ccxwriter.solver_obj.TimeInitialStep,
ccxwriter.solver_obj.TimeEnd
ccxwriter.solver_obj.TimeEnd,
ccxwriter.solver_obj.TimeMinimumStep,
ccxwriter.solver_obj.TimeMaximumStep
)
elif ccxwriter.analysis_type == "frequency":
if ccxwriter.solver_obj.EigenmodeLowLimit == 0.0 \
@@ -140,9 +141,11 @@ def write_step_equation(f, ccxwriter):
)
elif ccxwriter.analysis_type == "thermomech":
# OvG: 1.0 increment, total time 1 for steady state will cut back automatically
analysis_parameter = "{},{}".format(
analysis_parameter = "{},{},{},{}".format(
ccxwriter.solver_obj.TimeInitialStep,
ccxwriter.solver_obj.TimeEnd
ccxwriter.solver_obj.TimeEnd,
ccxwriter.solver_obj.TimeMinimumStep,
ccxwriter.solver_obj.TimeMaximumStep
)
elif ccxwriter.analysis_type == "buckling":
analysis_parameter = "{}\n".format(ccxwriter.solver_obj.BucklingFactors)

View File

@@ -489,7 +489,7 @@ Evolumes
***********************************************************
** At least one step is needed to run an CalculiX analysis of FreeCAD
*STEP
*STEP, INC=200
*STATIC

View File

@@ -62,7 +62,7 @@ Eedges
***********************************************************
** At least one step is needed to run an CalculiX analysis of FreeCAD
*STEP
*STEP, INC=200
*STATIC

View File

@@ -62,7 +62,7 @@ Eedges
***********************************************************
** At least one step is needed to run an CalculiX analysis of FreeCAD
*STEP
*STEP, INC=200
*STATIC

View File

@@ -62,7 +62,7 @@ Eedges
***********************************************************
** At least one step is needed to run an CalculiX analysis of FreeCAD
*STEP
*STEP, INC=200
*STATIC

View File

@@ -385,7 +385,7 @@ Evolumes
***********************************************************
** At least one step is needed to run an CalculiX analysis of FreeCAD
*STEP
*STEP, INC=200
*STATIC

View File

@@ -86,7 +86,7 @@ Efaces
***********************************************************
** At least one step is needed to run an CalculiX analysis of FreeCAD
*STEP
*STEP, INC=200
*STATIC

View File

@@ -74,7 +74,7 @@ Efaces
***********************************************************
** At least one step is needed to run an CalculiX analysis of FreeCAD
*STEP
*STEP, INC=200
*STATIC

View File

@@ -204,7 +204,7 @@ Eedges
***********************************************************
** At least one step is needed to run an CalculiX analysis of FreeCAD
*STEP
*STEP, INC=200
*STATIC

View File

@@ -62,7 +62,7 @@ Eedges
***********************************************************
** At least one step is needed to run an CalculiX analysis of FreeCAD
*STEP
*STEP, INC=200
*STATIC

View File

@@ -1562,7 +1562,7 @@ Efaces
***********************************************************
** At least one step is needed to run an CalculiX analysis of FreeCAD
*STEP
*STEP, INC=200
*STATIC

View File

@@ -292,7 +292,7 @@ Efaces
***********************************************************
** At least one step is needed to run an CalculiX analysis of FreeCAD
*STEP
*STEP, INC=200
*STATIC

View File

@@ -359,7 +359,7 @@ Evolumes
***********************************************************
** At least one step is needed to run an CalculiX analysis of FreeCAD
*STEP
*STEP, INC=200
*STATIC

View File

@@ -359,7 +359,7 @@ Evolumes
***********************************************************
** At least one step is needed to run an CalculiX analysis of FreeCAD
*STEP
*STEP, INC=200
*STATIC

View File

@@ -377,7 +377,7 @@ Evolumes
***********************************************************
** At least one step is needed to run an CalculiX analysis of FreeCAD
*STEP
*STEP, INC=200
*STATIC

View File

@@ -38373,7 +38373,7 @@ DEPConstraintContact, INDConstraintContact
***********************************************************
** At least one step is needed to run an CalculiX analysis of FreeCAD
*STEP
*STEP, INC=200
*STATIC

View File

@@ -3401,7 +3401,7 @@ Evolumes
***********************************************************
** At least one step is needed to run an CalculiX analysis of FreeCAD
*STEP
*STEP, INC=200
*STATIC

View File

@@ -2153,7 +2153,7 @@ Evolumes
***********************************************************
** At least one step is needed to run an CalculiX analysis of FreeCAD
*STEP
*STEP, INC=200
*STATIC

View File

@@ -18612,7 +18612,7 @@ TIE_DEPConstraintTie, TIE_INDConstraintTie
***********************************************************
** At least one step is needed to run an CalculiX analysis of FreeCAD
*STEP
*STEP, INC=200
*STATIC

View File

@@ -3639,7 +3639,7 @@ Evolumes
***********************************************************
** At least one step is needed to run an CalculiX analysis of FreeCAD
*STEP
*STEP, INC=200
*STATIC

View File

@@ -10980,7 +10980,7 @@ Evolumes
***********************************************************
** At least one step is needed to run an CalculiX analysis of FreeCAD
*STEP
*STEP, INC=200
*STATIC

View File

@@ -27634,7 +27634,7 @@ Evolumes
***********************************************************
** At least one step is needed to run an CalculiX analysis of FreeCAD
*STEP
*STEP, INC=200
*STATIC

View File

@@ -2548,7 +2548,7 @@ Efaces
***********************************************************
** At least one step is needed to run an CalculiX analysis of FreeCAD
*STEP
*STEP, INC=200
*STATIC

View File

@@ -1231,7 +1231,7 @@ Evolumes
***********************************************************
** At least one step is needed to run an CalculiX analysis of FreeCAD
*STEP
*STEP, INC=200
*STATIC

View File

@@ -20004,7 +20004,7 @@ Evolumes
***********************************************************
** At least one step is needed to run an CalculiX analysis of FreeCAD
*STEP, NLGEOM
*STEP, NLGEOM, INC=200
*STATIC

View File

@@ -2560,7 +2560,7 @@ Efaces
***********************************************************
** At least one step is needed to run an CalculiX analysis of FreeCAD
*STEP
*STEP, INC=200
*STATIC

View File

@@ -2560,7 +2560,7 @@ Efaces
***********************************************************
** At least one step is needed to run an CalculiX analysis of FreeCAD
*STEP
*STEP, INC=200
*STATIC

View File

@@ -7081,7 +7081,7 @@ Nall,273.0
** At least one step is needed to run an CalculiX analysis of FreeCAD
*STEP, INC=2000
*COUPLED TEMPERATURE-DISPLACEMENT, SOLVER=SPOOLES, STEADY STATE
1.0,1.0
1.0,1.0,1e-05,1.0
***********************************************************
** Fixed Constraints