Viscous damping. 6d vector masses
This commit is contained in:
parent
5ebf354dcf
commit
b764d7db2c
|
|
@ -0,0 +1,355 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE QtCreatorProject>
|
||||||
|
<!-- Written by QtCreator 4.14.2, 2021-07-15T10:27:01. -->
|
||||||
|
<qtcreator>
|
||||||
|
<data>
|
||||||
|
<variable>EnvironmentId</variable>
|
||||||
|
<value type="QByteArray">{4ab9621f-3cb4-4d5c-a5a5-8f7ea53a6f0f}</value>
|
||||||
|
</data>
|
||||||
|
<data>
|
||||||
|
<variable>ProjectExplorer.Project.ActiveTarget</variable>
|
||||||
|
<value type="int">0</value>
|
||||||
|
</data>
|
||||||
|
<data>
|
||||||
|
<variable>ProjectExplorer.Project.EditorSettings</variable>
|
||||||
|
<valuemap type="QVariantMap">
|
||||||
|
<value type="bool" key="EditorConfiguration.AutoIndent">false</value>
|
||||||
|
<value type="bool" key="EditorConfiguration.AutoSpacesForTabs">false</value>
|
||||||
|
<value type="bool" key="EditorConfiguration.CamelCaseNavigation">true</value>
|
||||||
|
<valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.0">
|
||||||
|
<value type="QString" key="language">Cpp</value>
|
||||||
|
<valuemap type="QVariantMap" key="value">
|
||||||
|
<value type="QByteArray" key="CurrentPreferences">CppGlobal</value>
|
||||||
|
</valuemap>
|
||||||
|
</valuemap>
|
||||||
|
<valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.1">
|
||||||
|
<value type="QString" key="language">QmlJS</value>
|
||||||
|
<valuemap type="QVariantMap" key="value">
|
||||||
|
<value type="QByteArray" key="CurrentPreferences">QmlJSGlobal</value>
|
||||||
|
</valuemap>
|
||||||
|
</valuemap>
|
||||||
|
<value type="int" key="EditorConfiguration.CodeStyle.Count">2</value>
|
||||||
|
<value type="QByteArray" key="EditorConfiguration.Codec">UTF-8</value>
|
||||||
|
<value type="bool" key="EditorConfiguration.ConstrainTooltips">false</value>
|
||||||
|
<value type="int" key="EditorConfiguration.IndentSize">4</value>
|
||||||
|
<value type="bool" key="EditorConfiguration.KeyboardTooltips">false</value>
|
||||||
|
<value type="int" key="EditorConfiguration.MarginColumn">80</value>
|
||||||
|
<value type="bool" key="EditorConfiguration.MouseHiding">true</value>
|
||||||
|
<value type="bool" key="EditorConfiguration.MouseNavigation">true</value>
|
||||||
|
<value type="int" key="EditorConfiguration.PaddingMode">1</value>
|
||||||
|
<value type="bool" key="EditorConfiguration.ScrollWheelZooming">true</value>
|
||||||
|
<value type="bool" key="EditorConfiguration.ShowMargin">false</value>
|
||||||
|
<value type="int" key="EditorConfiguration.SmartBackspaceBehavior">0</value>
|
||||||
|
<value type="bool" key="EditorConfiguration.SmartSelectionChanging">true</value>
|
||||||
|
<value type="bool" key="EditorConfiguration.SpacesForTabs">true</value>
|
||||||
|
<value type="int" key="EditorConfiguration.TabKeyBehavior">0</value>
|
||||||
|
<value type="int" key="EditorConfiguration.TabSize">8</value>
|
||||||
|
<value type="bool" key="EditorConfiguration.UseGlobal">true</value>
|
||||||
|
<value type="int" key="EditorConfiguration.Utf8BomBehavior">1</value>
|
||||||
|
<value type="bool" key="EditorConfiguration.addFinalNewLine">true</value>
|
||||||
|
<value type="bool" key="EditorConfiguration.cleanIndentation">true</value>
|
||||||
|
<value type="bool" key="EditorConfiguration.cleanWhitespace">true</value>
|
||||||
|
<value type="QString" key="EditorConfiguration.ignoreFileTypes">*.md, *.MD, Makefile</value>
|
||||||
|
<value type="bool" key="EditorConfiguration.inEntireDocument">false</value>
|
||||||
|
<value type="bool" key="EditorConfiguration.skipTrailingWhitespace">true</value>
|
||||||
|
</valuemap>
|
||||||
|
</data>
|
||||||
|
<data>
|
||||||
|
<variable>ProjectExplorer.Project.PluginSettings</variable>
|
||||||
|
<valuemap type="QVariantMap">
|
||||||
|
<valuemap type="QVariantMap" key="AutoTest.ActiveFrameworks">
|
||||||
|
<value type="bool" key="AutoTest.Framework.Boost">true</value>
|
||||||
|
<value type="bool" key="AutoTest.Framework.Catch">true</value>
|
||||||
|
<value type="bool" key="AutoTest.Framework.GTest">true</value>
|
||||||
|
<value type="bool" key="AutoTest.Framework.QtQuickTest">true</value>
|
||||||
|
<value type="bool" key="AutoTest.Framework.QtTest">true</value>
|
||||||
|
</valuemap>
|
||||||
|
<valuemap type="QVariantMap" key="AutoTest.CheckStates"/>
|
||||||
|
<value type="int" key="AutoTest.RunAfterBuild">0</value>
|
||||||
|
<value type="bool" key="AutoTest.UseGlobal">true</value>
|
||||||
|
<valuemap type="QVariantMap" key="ClangTools">
|
||||||
|
<value type="bool" key="ClangTools.AnalyzeOpenFiles">true</value>
|
||||||
|
<value type="bool" key="ClangTools.BuildBeforeAnalysis">true</value>
|
||||||
|
<value type="QString" key="ClangTools.DiagnosticConfig">Builtin.DefaultTidyAndClazy</value>
|
||||||
|
<value type="int" key="ClangTools.ParallelJobs">6</value>
|
||||||
|
<valuelist type="QVariantList" key="ClangTools.SelectedDirs"/>
|
||||||
|
<valuelist type="QVariantList" key="ClangTools.SelectedFiles"/>
|
||||||
|
<valuelist type="QVariantList" key="ClangTools.SuppressedDiagnostics"/>
|
||||||
|
<value type="bool" key="ClangTools.UseGlobalSettings">true</value>
|
||||||
|
</valuemap>
|
||||||
|
</valuemap>
|
||||||
|
</data>
|
||||||
|
<data>
|
||||||
|
<variable>ProjectExplorer.Project.Target.0</variable>
|
||||||
|
<valuemap type="QVariantMap">
|
||||||
|
<value type="QString" key="DeviceType">Desktop</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clang</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Clang</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">{08d5b07f-8010-48d8-a202-51411d8039c8}</value>
|
||||||
|
<value type="int" key="ProjectExplorer.Target.ActiveBuildConfiguration">0</value>
|
||||||
|
<value type="int" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value>
|
||||||
|
<value type="int" key="ProjectExplorer.Target.ActiveRunConfiguration">0</value>
|
||||||
|
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.0">
|
||||||
|
<value type="QString" key="CMake.Initial.Parameters">-GUnix Makefiles
|
||||||
|
-DCMAKE_BUILD_TYPE:String=Debug
|
||||||
|
-DQT_QMAKE_EXECUTABLE:STRING=%{Qt:qmakeExecutable}
|
||||||
|
-DCMAKE_PREFIX_PATH:STRING=%{Qt:QT_INSTALL_PREFIX}
|
||||||
|
-DCMAKE_C_COMPILER:STRING=%{Compiler:Executable:C}
|
||||||
|
-DCMAKE_CXX_COMPILER:STRING=%{Compiler:Executable:Cxx}</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/home/iason/Coding/Libraries/MySources_viscousDampingBranch/../build-MySources_viscousDampingBranch-Clang-Debug</value>
|
||||||
|
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
|
||||||
|
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
|
||||||
|
<valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.BuildTargets">
|
||||||
|
<value type="QString">all</value>
|
||||||
|
</valuelist>
|
||||||
|
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Build</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.MakeStep</value>
|
||||||
|
</valuemap>
|
||||||
|
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Build</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
|
||||||
|
</valuemap>
|
||||||
|
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
|
||||||
|
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
|
||||||
|
<valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.BuildTargets">
|
||||||
|
<value type="QString">clean</value>
|
||||||
|
</valuelist>
|
||||||
|
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Build</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.MakeStep</value>
|
||||||
|
</valuemap>
|
||||||
|
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Clean</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
|
||||||
|
</valuemap>
|
||||||
|
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
|
||||||
|
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
|
||||||
|
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.CustomParsers"/>
|
||||||
|
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Debug</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.CMakeBuildConfiguration</value>
|
||||||
|
</valuemap>
|
||||||
|
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.1">
|
||||||
|
<value type="QString" key="CMake.Initial.Parameters">-GUnix Makefiles
|
||||||
|
-DCMAKE_BUILD_TYPE:String=Release
|
||||||
|
-DQT_QMAKE_EXECUTABLE:STRING=%{Qt:qmakeExecutable}
|
||||||
|
-DCMAKE_PREFIX_PATH:STRING=%{Qt:QT_INSTALL_PREFIX}
|
||||||
|
-DCMAKE_C_COMPILER:STRING=%{Compiler:Executable:C}
|
||||||
|
-DCMAKE_CXX_COMPILER:STRING=%{Compiler:Executable:Cxx}</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/home/iason/Coding/Libraries/MySources_viscousDampingBranch/../build-MySources_viscousDampingBranch-Clang-Release</value>
|
||||||
|
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
|
||||||
|
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
|
||||||
|
<valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.BuildTargets">
|
||||||
|
<value type="QString">all</value>
|
||||||
|
</valuelist>
|
||||||
|
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.MakeStep</value>
|
||||||
|
</valuemap>
|
||||||
|
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Build</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
|
||||||
|
</valuemap>
|
||||||
|
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
|
||||||
|
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
|
||||||
|
<valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.BuildTargets">
|
||||||
|
<value type="QString">clean</value>
|
||||||
|
</valuelist>
|
||||||
|
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.MakeStep</value>
|
||||||
|
</valuemap>
|
||||||
|
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Clean</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
|
||||||
|
</valuemap>
|
||||||
|
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
|
||||||
|
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
|
||||||
|
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.CustomParsers"/>
|
||||||
|
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Release</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.CMakeBuildConfiguration</value>
|
||||||
|
</valuemap>
|
||||||
|
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.2">
|
||||||
|
<value type="QString" key="CMake.Initial.Parameters">-GUnix Makefiles
|
||||||
|
-DCMAKE_BUILD_TYPE:String=RelWithDebInfo
|
||||||
|
-DQT_QMAKE_EXECUTABLE:STRING=%{Qt:qmakeExecutable}
|
||||||
|
-DCMAKE_PREFIX_PATH:STRING=%{Qt:QT_INSTALL_PREFIX}
|
||||||
|
-DCMAKE_C_COMPILER:STRING=%{Compiler:Executable:C}
|
||||||
|
-DCMAKE_CXX_COMPILER:STRING=%{Compiler:Executable:Cxx}</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/home/iason/Coding/Libraries/MySources_viscousDampingBranch/../build-MySources_viscousDampingBranch-Clang-RelWithDebInfo</value>
|
||||||
|
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
|
||||||
|
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
|
||||||
|
<valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.BuildTargets">
|
||||||
|
<value type="QString">all</value>
|
||||||
|
</valuelist>
|
||||||
|
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.MakeStep</value>
|
||||||
|
</valuemap>
|
||||||
|
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Build</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
|
||||||
|
</valuemap>
|
||||||
|
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
|
||||||
|
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
|
||||||
|
<valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.BuildTargets">
|
||||||
|
<value type="QString">clean</value>
|
||||||
|
</valuelist>
|
||||||
|
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.MakeStep</value>
|
||||||
|
</valuemap>
|
||||||
|
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Clean</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
|
||||||
|
</valuemap>
|
||||||
|
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
|
||||||
|
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
|
||||||
|
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.CustomParsers"/>
|
||||||
|
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Release with Debug Information</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.CMakeBuildConfiguration</value>
|
||||||
|
</valuemap>
|
||||||
|
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.3">
|
||||||
|
<value type="QString" key="CMake.Initial.Parameters">-GUnix Makefiles
|
||||||
|
-DCMAKE_BUILD_TYPE:String=MinSizeRel
|
||||||
|
-DQT_QMAKE_EXECUTABLE:STRING=%{Qt:qmakeExecutable}
|
||||||
|
-DCMAKE_PREFIX_PATH:STRING=%{Qt:QT_INSTALL_PREFIX}
|
||||||
|
-DCMAKE_C_COMPILER:STRING=%{Compiler:Executable:C}
|
||||||
|
-DCMAKE_CXX_COMPILER:STRING=%{Compiler:Executable:Cxx}</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/home/iason/Coding/Libraries/MySources_viscousDampingBranch/../build-MySources_viscousDampingBranch-Clang-MinSizeRel</value>
|
||||||
|
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
|
||||||
|
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
|
||||||
|
<valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.BuildTargets">
|
||||||
|
<value type="QString">all</value>
|
||||||
|
</valuelist>
|
||||||
|
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.MakeStep</value>
|
||||||
|
</valuemap>
|
||||||
|
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Build</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
|
||||||
|
</valuemap>
|
||||||
|
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
|
||||||
|
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
|
||||||
|
<valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.BuildTargets">
|
||||||
|
<value type="QString">clean</value>
|
||||||
|
</valuelist>
|
||||||
|
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.MakeStep</value>
|
||||||
|
</valuemap>
|
||||||
|
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Clean</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
|
||||||
|
</valuemap>
|
||||||
|
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
|
||||||
|
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
|
||||||
|
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.CustomParsers"/>
|
||||||
|
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Minimum Size Release</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.CMakeBuildConfiguration</value>
|
||||||
|
</valuemap>
|
||||||
|
<value type="int" key="ProjectExplorer.Target.BuildConfigurationCount">4</value>
|
||||||
|
<valuemap type="QVariantMap" key="ProjectExplorer.Target.DeployConfiguration.0">
|
||||||
|
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
|
||||||
|
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">0</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Deploy</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Deploy</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Deploy</value>
|
||||||
|
</valuemap>
|
||||||
|
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">1</value>
|
||||||
|
<valuemap type="QVariantMap" key="ProjectExplorer.DeployConfiguration.CustomData"/>
|
||||||
|
<value type="bool" key="ProjectExplorer.DeployConfiguration.CustomDataEnabled">false</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.DefaultDeployConfiguration</value>
|
||||||
|
</valuemap>
|
||||||
|
<value type="int" key="ProjectExplorer.Target.DeployConfigurationCount">1</value>
|
||||||
|
<valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.0">
|
||||||
|
<value type="QString" key="Analyzer.Perf.CallgraphMode">dwarf</value>
|
||||||
|
<valuelist type="QVariantList" key="Analyzer.Perf.Events">
|
||||||
|
<value type="QString">cpu-cycles</value>
|
||||||
|
</valuelist>
|
||||||
|
<valuelist type="QVariantList" key="Analyzer.Perf.ExtraArguments"/>
|
||||||
|
<value type="int" key="Analyzer.Perf.Frequency">250</value>
|
||||||
|
<valuelist type="QVariantList" key="Analyzer.Perf.RecordArguments">
|
||||||
|
<value type="QString">-e</value>
|
||||||
|
<value type="QString">cpu-cycles</value>
|
||||||
|
<value type="QString">--call-graph</value>
|
||||||
|
<value type="QString">dwarf,4096</value>
|
||||||
|
<value type="QString">-F</value>
|
||||||
|
<value type="QString">250</value>
|
||||||
|
</valuelist>
|
||||||
|
<value type="QString" key="Analyzer.Perf.SampleMode">-F</value>
|
||||||
|
<value type="bool" key="Analyzer.Perf.Settings.UseGlobalSettings">true</value>
|
||||||
|
<value type="int" key="Analyzer.Perf.StackSize">4096</value>
|
||||||
|
<value type="bool" key="Analyzer.QmlProfiler.AggregateTraces">false</value>
|
||||||
|
<value type="bool" key="Analyzer.QmlProfiler.FlushEnabled">false</value>
|
||||||
|
<value type="uint" key="Analyzer.QmlProfiler.FlushInterval">1000</value>
|
||||||
|
<value type="QString" key="Analyzer.QmlProfiler.LastTraceFile"></value>
|
||||||
|
<value type="bool" key="Analyzer.QmlProfiler.Settings.UseGlobalSettings">true</value>
|
||||||
|
<valuelist type="QVariantList" key="Analyzer.Valgrind.AddedSuppressionFiles"/>
|
||||||
|
<value type="bool" key="Analyzer.Valgrind.Callgrind.CollectBusEvents">false</value>
|
||||||
|
<value type="bool" key="Analyzer.Valgrind.Callgrind.CollectSystime">false</value>
|
||||||
|
<value type="bool" key="Analyzer.Valgrind.Callgrind.EnableBranchSim">false</value>
|
||||||
|
<value type="bool" key="Analyzer.Valgrind.Callgrind.EnableCacheSim">false</value>
|
||||||
|
<value type="bool" key="Analyzer.Valgrind.Callgrind.EnableEventToolTips">true</value>
|
||||||
|
<value type="double" key="Analyzer.Valgrind.Callgrind.MinimumCostRatio">0.01</value>
|
||||||
|
<value type="double" key="Analyzer.Valgrind.Callgrind.VisualisationMinimumCostRatio">10</value>
|
||||||
|
<value type="bool" key="Analyzer.Valgrind.FilterExternalIssues">true</value>
|
||||||
|
<value type="QString" key="Analyzer.Valgrind.KCachegrindExecutable">kcachegrind</value>
|
||||||
|
<value type="int" key="Analyzer.Valgrind.LeakCheckOnFinish">1</value>
|
||||||
|
<value type="int" key="Analyzer.Valgrind.NumCallers">25</value>
|
||||||
|
<valuelist type="QVariantList" key="Analyzer.Valgrind.RemovedSuppressionFiles"/>
|
||||||
|
<value type="int" key="Analyzer.Valgrind.SelfModifyingCodeDetection">1</value>
|
||||||
|
<value type="bool" key="Analyzer.Valgrind.Settings.UseGlobalSettings">true</value>
|
||||||
|
<value type="bool" key="Analyzer.Valgrind.ShowReachable">false</value>
|
||||||
|
<value type="bool" key="Analyzer.Valgrind.TrackOrigins">true</value>
|
||||||
|
<value type="QString" key="Analyzer.Valgrind.ValgrindExecutable">valgrind</value>
|
||||||
|
<valuelist type="QVariantList" key="Analyzer.Valgrind.VisibleErrorKinds">
|
||||||
|
<value type="int">0</value>
|
||||||
|
<value type="int">1</value>
|
||||||
|
<value type="int">2</value>
|
||||||
|
<value type="int">3</value>
|
||||||
|
<value type="int">4</value>
|
||||||
|
<value type="int">5</value>
|
||||||
|
<value type="int">6</value>
|
||||||
|
<value type="int">7</value>
|
||||||
|
<value type="int">8</value>
|
||||||
|
<value type="int">9</value>
|
||||||
|
<value type="int">10</value>
|
||||||
|
<value type="int">11</value>
|
||||||
|
<value type="int">12</value>
|
||||||
|
<value type="int">13</value>
|
||||||
|
<value type="int">14</value>
|
||||||
|
</valuelist>
|
||||||
|
<valuelist type="QVariantList" key="CustomOutputParsers"/>
|
||||||
|
<value type="int" key="PE.EnvironmentAspect.Base">2</value>
|
||||||
|
<valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
|
||||||
|
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.CustomExecutableRunConfiguration</value>
|
||||||
|
<value type="QString" key="ProjectExplorer.RunConfiguration.BuildKey"></value>
|
||||||
|
<value type="bool" key="RunConfiguration.UseCppDebugger">false</value>
|
||||||
|
<value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</value>
|
||||||
|
<value type="bool" key="RunConfiguration.UseQmlDebugger">false</value>
|
||||||
|
<value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value>
|
||||||
|
</valuemap>
|
||||||
|
<value type="int" key="ProjectExplorer.Target.RunConfigurationCount">1</value>
|
||||||
|
</valuemap>
|
||||||
|
</data>
|
||||||
|
<data>
|
||||||
|
<variable>ProjectExplorer.Project.TargetCount</variable>
|
||||||
|
<value type="int">1</value>
|
||||||
|
</data>
|
||||||
|
<data>
|
||||||
|
<variable>ProjectExplorer.Project.Updater.FileVersion</variable>
|
||||||
|
<value type="int">22</value>
|
||||||
|
</data>
|
||||||
|
<data>
|
||||||
|
<variable>Version</variable>
|
||||||
|
<value type="int">22</value>
|
||||||
|
</data>
|
||||||
|
</qtcreator>
|
||||||
|
|
@ -222,7 +222,6 @@ void DRMSimulationModel::reset()
|
||||||
mCurrentSimulationStep = 0;
|
mCurrentSimulationStep = 0;
|
||||||
history.clear();
|
history.clear();
|
||||||
constrainedVertices.clear();
|
constrainedVertices.clear();
|
||||||
rigidSupports.clear();
|
|
||||||
pMesh.reset();
|
pMesh.reset();
|
||||||
plotYValues.clear();
|
plotYValues.clear();
|
||||||
plotHandle.reset();
|
plotHandle.reset();
|
||||||
|
|
@ -232,6 +231,8 @@ void DRMSimulationModel::reset()
|
||||||
numOfDampings = 0;
|
numOfDampings = 0;
|
||||||
shouldTemporarilyDampForces = false;
|
shouldTemporarilyDampForces = false;
|
||||||
externalLoadStep = 1;
|
externalLoadStep = 1;
|
||||||
|
isVertexConstrained.clear();
|
||||||
|
minTotalResidualForcesNorm = std::numeric_limits<double>::max();
|
||||||
}
|
}
|
||||||
|
|
||||||
VectorType DRMSimulationModel::computeDisplacementDifferenceDerivative(
|
VectorType DRMSimulationModel::computeDisplacementDifferenceDerivative(
|
||||||
|
|
@ -544,13 +545,18 @@ double DRMSimulationModel::computeTheta3(const EdgeType &e, const VertexType &v)
|
||||||
// Use nR as theta3 only for the first star edge
|
// Use nR as theta3 only for the first star edge
|
||||||
return nR;
|
return nR;
|
||||||
}
|
}
|
||||||
std::vector<int> incidentElementsIndices(node.incidentElements.size());
|
// std::vector<int> incidentElementsIndices(node.incidentElements.size());
|
||||||
for (int iei = 0; iei < incidentElementsIndices.size(); iei++) {
|
// for (int iei = 0; iei < incidentElementsIndices.size(); iei++) {
|
||||||
incidentElementsIndices[iei] = pMesh->getIndex(node.incidentElements[iei]);
|
// incidentElementsIndices[iei] = pMesh->getIndex(node.incidentElements[iei]);
|
||||||
}
|
// }
|
||||||
assert(pMesh->getIndex(e) == ei);
|
assert(pMesh->getIndex(e) == ei);
|
||||||
assert(node.alphaAngles.contains(ei));
|
// assert(node.alphaAngles.contains(ei));
|
||||||
const double alphaAngle = node.alphaAngles.at(elem.ei);
|
const double alphaAngle = std::find_if(node.alphaAngles.begin(),
|
||||||
|
node.alphaAngles.end(),
|
||||||
|
[&](const std::pair<EdgeIndex, double> &p) {
|
||||||
|
return elem.ei == p.first;
|
||||||
|
})
|
||||||
|
->second;
|
||||||
const EdgeType &refElem = *node.referenceElement;
|
const EdgeType &refElem = *node.referenceElement;
|
||||||
const double rotationAngle = nR + alphaAngle;
|
const double rotationAngle = nR + alphaAngle;
|
||||||
|
|
||||||
|
|
@ -591,8 +597,7 @@ double DRMSimulationModel::computeDerivativeTheta3(const EdgeType &e,
|
||||||
{
|
{
|
||||||
const Node &node = pMesh->nodes[v];
|
const Node &node = pMesh->nodes[v];
|
||||||
const VertexIndex &vi = pMesh->nodes[v].vi;
|
const VertexIndex &vi = pMesh->nodes[v].vi;
|
||||||
const bool isRigidSupport = rigidSupports.contains(vi);
|
if (&e == node.referenceElement && !isRigidSupport[vi]) {
|
||||||
if (&e == node.referenceElement && !isRigidSupport) {
|
|
||||||
if (dui.dofi == DoF::Nr && &dui.v == &v) {
|
if (dui.dofi == DoF::Nr && &dui.v == &v) {
|
||||||
return 1;
|
return 1;
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -610,7 +615,7 @@ double DRMSimulationModel::computeDerivativeTheta3(const EdgeType &e,
|
||||||
const VertexPointer &vp_jplus1 = e.cV(1);
|
const VertexPointer &vp_jplus1 = e.cV(1);
|
||||||
|
|
||||||
double derivativeTheta3_dofi = 0;
|
double derivativeTheta3_dofi = 0;
|
||||||
if (isRigidSupport) {
|
if (isRigidSupport[vi]) {
|
||||||
const VectorType &t1Initial = computeT1Vector(pMesh->nodes[vp_j].initialLocation,
|
const VectorType &t1Initial = computeT1Vector(pMesh->nodes[vp_j].initialLocation,
|
||||||
pMesh->nodes[vp_jplus1].initialLocation);
|
pMesh->nodes[vp_jplus1].initialLocation);
|
||||||
VectorType g1 = Cross(t1, t1Initial);
|
VectorType g1 = Cross(t1, t1Initial);
|
||||||
|
|
@ -800,9 +805,9 @@ void DRMSimulationModel::updateResidualForcesOnTheFly(
|
||||||
pMesh->EN(), std::vector<std::pair<int, Vector6d>>(4, {-1, Vector6d()}));
|
pMesh->EN(), std::vector<std::pair<int, Vector6d>>(4, {-1, Vector6d()}));
|
||||||
// omp_lock_t writelock;
|
// omp_lock_t writelock;
|
||||||
// omp_init_lock(&writelock);
|
// omp_init_lock(&writelock);
|
||||||
//#ifdef ENABLE_OPENMP
|
#ifdef ENABLE_OPENMP
|
||||||
//#pragma omp parallel for schedule(static) num_threads(8)
|
#pragma omp parallel for schedule(static) num_threads(5)
|
||||||
//#endif
|
#endif
|
||||||
for (int ei = 0; ei < pMesh->EN(); ei++) {
|
for (int ei = 0; ei < pMesh->EN(); ei++) {
|
||||||
const EdgeType &e = pMesh->edge[ei];
|
const EdgeType &e = pMesh->edge[ei];
|
||||||
const SimulationMesh::VertexType &ev_j = *e.cV(0);
|
const SimulationMesh::VertexType &ev_j = *e.cV(0);
|
||||||
|
|
@ -843,7 +848,7 @@ void DRMSimulationModel::updateResidualForcesOnTheFly(
|
||||||
const size_t vi = edgeNode.vi;
|
const size_t vi = edgeNode.vi;
|
||||||
// #pragma omp parallel for schedule(static) num_threads(6)
|
// #pragma omp parallel for schedule(static) num_threads(6)
|
||||||
for (DoFType dofi = DoF::Ux; dofi < DoF::NumDoF; dofi++) {
|
for (DoFType dofi = DoF::Ux; dofi < DoF::NumDoF; dofi++) {
|
||||||
const bool isDofConstrainedFor_ev = fixedVertices.contains(edgeNode.vi)
|
const bool isDofConstrainedFor_ev = isVertexConstrained[edgeNode.vi]
|
||||||
&& fixedVertices.at(edgeNode.vi).contains(dofi);
|
&& fixedVertices.at(edgeNode.vi).contains(dofi);
|
||||||
if (!isDofConstrainedFor_ev) {
|
if (!isDofConstrainedFor_ev) {
|
||||||
DifferentiateWithRespectTo dui{ev, dofi};
|
DifferentiateWithRespectTo dui{ev, dofi};
|
||||||
|
|
@ -924,7 +929,7 @@ void DRMSimulationModel::updateResidualForcesOnTheFly(
|
||||||
}
|
}
|
||||||
if (edgeNode.referenceElement != &e) {
|
if (edgeNode.referenceElement != &e) {
|
||||||
const bool isDofConstrainedFor_refElemOtherVertex
|
const bool isDofConstrainedFor_refElemOtherVertex
|
||||||
= fixedVertices.contains(refElemOtherVertexNode.vi)
|
= isVertexConstrained[refElemOtherVertexNode.vi]
|
||||||
&& fixedVertices.at(refElemOtherVertexNode.vi).contains(dofi);
|
&& fixedVertices.at(refElemOtherVertexNode.vi).contains(dofi);
|
||||||
if (!isDofConstrainedFor_refElemOtherVertex) {
|
if (!isDofConstrainedFor_refElemOtherVertex) {
|
||||||
DifferentiateWithRespectTo dui{*refElemOtherVertex, dofi};
|
DifferentiateWithRespectTo dui{*refElemOtherVertex, dofi};
|
||||||
|
|
@ -1012,6 +1017,11 @@ void DRMSimulationModel::updateResidualForcesOnTheFly(
|
||||||
}
|
}
|
||||||
pMesh->previousTotalResidualForcesNorm = pMesh->totalResidualForcesNorm;
|
pMesh->previousTotalResidualForcesNorm = pMesh->totalResidualForcesNorm;
|
||||||
pMesh->totalResidualForcesNorm = totalResidualForcesNorm;
|
pMesh->totalResidualForcesNorm = totalResidualForcesNorm;
|
||||||
|
if (mSettings.beVerbose) {
|
||||||
|
if (minTotalResidualForcesNorm > pMesh->totalResidualForcesNorm) {
|
||||||
|
minTotalResidualForcesNorm = pMesh->totalResidualForcesNorm;
|
||||||
|
}
|
||||||
|
}
|
||||||
pMesh->averageResidualForcesNorm = totalResidualForcesNorm / pMesh->VN();
|
pMesh->averageResidualForcesNorm = totalResidualForcesNorm / pMesh->VN();
|
||||||
// pMesh->averageResidualForcesNorm = sumOfResidualForces.norm() / pMesh->VN();
|
// pMesh->averageResidualForcesNorm = sumOfResidualForces.norm() / pMesh->VN();
|
||||||
|
|
||||||
|
|
@ -1078,6 +1088,8 @@ void DRMSimulationModel::updateResidualForces()
|
||||||
|
|
||||||
void DRMSimulationModel::computeRigidSupports()
|
void DRMSimulationModel::computeRigidSupports()
|
||||||
{
|
{
|
||||||
|
isRigidSupport.clear();
|
||||||
|
isRigidSupport.resize(pMesh->VN(), false);
|
||||||
for (const VertexType &v : pMesh->vert) {
|
for (const VertexType &v : pMesh->vert) {
|
||||||
const VertexIndex vi = pMesh->nodes[v].vi;
|
const VertexIndex vi = pMesh->nodes[v].vi;
|
||||||
const bool isVertexConstrained = constrainedVertices.contains(vi);
|
const bool isVertexConstrained = constrainedVertices.contains(vi);
|
||||||
|
|
@ -1090,7 +1102,7 @@ void DRMSimulationModel::computeRigidSupports()
|
||||||
&& constrainedDoFType.contains(DoF::Ny)
|
&& constrainedDoFType.contains(DoF::Ny)
|
||||||
&& constrainedDoFType.contains(DoF::Nr);
|
&& constrainedDoFType.contains(DoF::Nr);
|
||||||
if (hasAllDoFTypeConstrained) {
|
if (hasAllDoFTypeConstrained) {
|
||||||
rigidSupports.insert(vi);
|
isRigidSupport[vi] = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -1180,8 +1192,9 @@ void DRMSimulationModel::updateNodalMasses()
|
||||||
if (shouldTemporarilyDampForces && mCurrentSimulationStep < untilStep) {
|
if (shouldTemporarilyDampForces && mCurrentSimulationStep < untilStep) {
|
||||||
gamma *= 1e6 * (1 - static_cast<double>(mCurrentSimulationStep) / untilStep);
|
gamma *= 1e6 * (1 - static_cast<double>(mCurrentSimulationStep) / untilStep);
|
||||||
}
|
}
|
||||||
if (mCurrentSimulationStep == untilStep && shouldTemporarilyDampForces) {
|
if (mCurrentSimulationStep == static_cast<size_t>(1.2 * untilStep)
|
||||||
Dt = mSettings.Dtini * 0.95;
|
&& shouldTemporarilyDampForces) {
|
||||||
|
Dt = mSettings.Dtini;
|
||||||
}
|
}
|
||||||
for (VertexType &v : pMesh->vert) {
|
for (VertexType &v : pMesh->vert) {
|
||||||
const size_t vi = pMesh->getIndex(v);
|
const size_t vi = pMesh->getIndex(v);
|
||||||
|
|
@ -1215,6 +1228,14 @@ void DRMSimulationModel::updateNodalMasses()
|
||||||
* rotationalSumSk_I3;
|
* rotationalSumSk_I3;
|
||||||
pMesh->nodes[v].mass.rotationalJ = gamma * pow(mSettings.Dtini, 2) * 8 * rotationalSumSk_J;
|
pMesh->nodes[v].mass.rotationalJ = gamma * pow(mSettings.Dtini, 2) * 8 * rotationalSumSk_J;
|
||||||
|
|
||||||
|
//fill 6d mass vector
|
||||||
|
pMesh->nodes[v].mass_6d[DoF::Ux] = pMesh->nodes[v].mass.translational;
|
||||||
|
pMesh->nodes[v].mass_6d[DoF::Uy] = pMesh->nodes[v].mass.translational;
|
||||||
|
pMesh->nodes[v].mass_6d[DoF::Uz] = pMesh->nodes[v].mass.translational;
|
||||||
|
pMesh->nodes[v].mass_6d[DoF::Nx] = pMesh->nodes[v].mass.rotationalJ;
|
||||||
|
pMesh->nodes[v].mass_6d[DoF::Ny] = pMesh->nodes[v].mass.rotationalI3;
|
||||||
|
pMesh->nodes[v].mass_6d[DoF::Nr] = pMesh->nodes[v].mass.rotationalI2;
|
||||||
|
|
||||||
assert(std::pow(mSettings.Dtini, 2.0) * translationalSumSk
|
assert(std::pow(mSettings.Dtini, 2.0) * translationalSumSk
|
||||||
/ pMesh->nodes[v].mass.translational
|
/ pMesh->nodes[v].mass.translational
|
||||||
< 2);
|
< 2);
|
||||||
|
|
@ -1234,17 +1255,7 @@ void DRMSimulationModel::updateNodalAccelerations()
|
||||||
for (VertexType &v : pMesh->vert) {
|
for (VertexType &v : pMesh->vert) {
|
||||||
Node &node = pMesh->nodes[v];
|
Node &node = pMesh->nodes[v];
|
||||||
const VertexIndex vi = pMesh->getIndex(v);
|
const VertexIndex vi = pMesh->getIndex(v);
|
||||||
for (DoFType dofi = DoF::Ux; dofi < DoF::NumDoF; dofi++) {
|
node.acceleration = node.force.residual / node.mass_6d;
|
||||||
if (dofi == DoF::Ux || dofi == DoF::Uy || dofi == DoF::Uz) {
|
|
||||||
node.acceleration[dofi] = node.force.residual[dofi] / node.mass.translational;
|
|
||||||
} else if (dofi == DoF::Nx) {
|
|
||||||
node.acceleration[dofi] = node.force.residual[dofi] / node.mass.rotationalJ;
|
|
||||||
} else if (dofi == DoF::Ny) {
|
|
||||||
node.acceleration[dofi] = node.force.residual[dofi] / node.mass.rotationalI3;
|
|
||||||
} else if (dofi == DoF::Nr) {
|
|
||||||
node.acceleration[dofi] = node.force.residual[dofi] / node.mass.rotationalI2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#ifdef POLYSCOPE_DEFINED
|
#ifdef POLYSCOPE_DEFINED
|
||||||
if (std::isnan(node.acceleration.norm())) {
|
if (std::isnan(node.acceleration.norm())) {
|
||||||
std::cout << "acceleration " << vi << ":" << node.acceleration.toString() << std::endl;
|
std::cout << "acceleration " << vi << ":" << node.acceleration.toString() << std::endl;
|
||||||
|
|
@ -1271,7 +1282,16 @@ void DRMSimulationModel::updateNodalVelocities()
|
||||||
std::cout << "Velocity " << vi << ":" << node.velocity.toString() << std::endl;
|
std::cout << "Velocity " << vi << ":" << node.velocity.toString() << std::endl;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
node.velocity = node.velocity + node.acceleration * Dt;
|
if (mSettings.useViscousDamping) {
|
||||||
|
const Vector6d massOverDt = node.mass_6d / Dt;
|
||||||
|
const Vector6d denominator = massOverDt + Vector6d(viscuousDampingConstant / 2);
|
||||||
|
const Vector6d firstTermNominator = massOverDt - Vector6d(viscuousDampingConstant / 2);
|
||||||
|
const Vector6d firstTerm = node.velocity * firstTermNominator / denominator;
|
||||||
|
const Vector6d secondTerm = node.force.residual / denominator;
|
||||||
|
node.velocity = firstTerm + secondTerm;
|
||||||
|
} else {
|
||||||
|
node.velocity = node.velocity + node.acceleration * Dt;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
updateKineticEnergy();
|
updateKineticEnergy();
|
||||||
}
|
}
|
||||||
|
|
@ -1328,7 +1348,7 @@ void DRMSimulationModel::updateNodeNr(VertexType &v)
|
||||||
{
|
{
|
||||||
const VertexIndex &vi = pMesh->nodes[v].vi;
|
const VertexIndex &vi = pMesh->nodes[v].vi;
|
||||||
Node &node = pMesh->nodes[v];
|
Node &node = pMesh->nodes[v];
|
||||||
if (!rigidSupports.contains(vi)) {
|
if (!isRigidSupport[vi]) {
|
||||||
node.nR = node.displacements[5];
|
node.nR = node.displacements[5];
|
||||||
} else {
|
} else {
|
||||||
const EdgePointer &refElem = node.referenceElement;
|
const EdgePointer &refElem = node.referenceElement;
|
||||||
|
|
@ -1509,11 +1529,11 @@ void DRMSimulationModel::resetVelocities()
|
||||||
{
|
{
|
||||||
for (const VertexType &v : pMesh->vert) {
|
for (const VertexType &v : pMesh->vert) {
|
||||||
pMesh->nodes[v].velocity =
|
pMesh->nodes[v].velocity =
|
||||||
// pMesh->nodes[v].acceleration
|
// pMesh->nodes[v].acceleration * Dt
|
||||||
// * Dt; // NOTE: Do I reset the previous
|
// * 0.5; // NOTE: Do I reset the previous
|
||||||
// velocity?
|
// // velocity?
|
||||||
// reset
|
// // reset
|
||||||
// current to 0 or this?
|
// // current to 0 or this?
|
||||||
0;
|
0;
|
||||||
}
|
}
|
||||||
updateKineticEnergy();
|
updateKineticEnergy();
|
||||||
|
|
@ -1616,7 +1636,7 @@ void DRMSimulationModel::updatePositionsOnTheFly(
|
||||||
VectorType newNormal(nx, ny, nz);
|
VectorType newNormal(nx, ny, nz);
|
||||||
v.N() = newNormal;
|
v.N() = newNormal;
|
||||||
}
|
}
|
||||||
if (!rigidSupports.contains(vi)) {
|
if (!isRigidSupport[vi]) {
|
||||||
node.nR = node.displacements[5];
|
node.nR = node.displacements[5];
|
||||||
} else {
|
} else {
|
||||||
}
|
}
|
||||||
|
|
@ -1650,15 +1670,18 @@ void DRMSimulationModel::printCurrentState() const
|
||||||
<< std::endl;
|
<< std::endl;
|
||||||
std::cout << "Kinetic energy:" << pMesh->currentTotalKineticEnergy << std::endl;
|
std::cout << "Kinetic energy:" << pMesh->currentTotalKineticEnergy << std::endl;
|
||||||
static std::chrono::steady_clock::time_point begin = std::chrono::steady_clock::now();
|
static std::chrono::steady_clock::time_point begin = std::chrono::steady_clock::now();
|
||||||
const auto timePerNodePerIteration = std::chrono::duration_cast<std::chrono::microseconds>(
|
const double timePerNodePerIteration = std::chrono::duration_cast<std::chrono::microseconds>(
|
||||||
std::chrono::steady_clock::now() - begin)
|
std::chrono::steady_clock::now() - begin)
|
||||||
.count()
|
.count()
|
||||||
* 1e-6 / (mCurrentSimulationStep * pMesh->VN());
|
* 1e-6
|
||||||
|
/ (static_cast<double>(mCurrentSimulationStep)
|
||||||
|
* pMesh->VN());
|
||||||
std::cout << "Total potential:" << pMesh->currentTotalPotentialEnergykN << " kNm" << std::endl;
|
std::cout << "Total potential:" << pMesh->currentTotalPotentialEnergykN << " kNm" << std::endl;
|
||||||
std::cout << "time(s)/(iterations*node) = " << timePerNodePerIteration << std::endl;
|
std::cout << "time(s)/(iterations*node) = " << timePerNodePerIteration << std::endl;
|
||||||
std::cout << "Mov aver deriv norm:" << pMesh->residualForcesMovingAverageDerivativeNorm
|
std::cout << "Mov aver deriv norm:" << pMesh->residualForcesMovingAverageDerivativeNorm
|
||||||
<< std::endl;
|
<< std::endl;
|
||||||
std::cout << "xi:" << mSettings.xi << std::endl;
|
std::cout << "xi:" << mSettings.xi << std::endl;
|
||||||
|
std::cout << "Dt:" << Dt << std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
void DRMSimulationModel::printDebugInfo() const
|
void DRMSimulationModel::printDebugInfo() const
|
||||||
|
|
@ -1936,7 +1959,7 @@ void DRMSimulationModel::applySolutionGuess(const SimulationResults &solutionGue
|
||||||
node.displacements[5] = nr;
|
node.displacements[5] = nr;
|
||||||
}
|
}
|
||||||
// const double nr_asin = q_nr.x()
|
// const double nr_asin = q_nr.x()
|
||||||
if (rigidSupports.contains(vi)) {
|
if (isRigidSupport[vi]) {
|
||||||
const EdgePointer &refElem = node.referenceElement;
|
const EdgePointer &refElem = node.referenceElement;
|
||||||
const VectorType &refT1 = computeT1Vector(refElem->cP(0), refElem->cP(1));
|
const VectorType &refT1 = computeT1Vector(refElem->cP(0), refElem->cP(1));
|
||||||
|
|
||||||
|
|
@ -2046,8 +2069,9 @@ SimulationResults DRMSimulationModel::executeSimulation(const std::shared_ptr<Si
|
||||||
}
|
}
|
||||||
vcg::tri::UpdateBounding<SimulationMesh>::Box(*pMesh);
|
vcg::tri::UpdateBounding<SimulationMesh>::Box(*pMesh);
|
||||||
computeRigidSupports();
|
computeRigidSupports();
|
||||||
|
isVertexConstrained.resize(pMesh->VN(), false);
|
||||||
for (auto fixedVertex : pJob->constrainedVertices) {
|
for (auto fixedVertex : pJob->constrainedVertices) {
|
||||||
assert(fixedVertex.first < pMesh->VN());
|
isVertexConstrained[fixedVertex.first] = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef POLYSCOPE_DEFINED
|
#ifdef POLYSCOPE_DEFINED
|
||||||
|
|
@ -2058,7 +2082,8 @@ SimulationResults DRMSimulationModel::executeSimulation(const std::shared_ptr<Si
|
||||||
pMesh->getEigenEdges());
|
pMesh->getEigenEdges());
|
||||||
polyscope::registerCurveNetwork("Initial_" + meshPolyscopeLabel,
|
polyscope::registerCurveNetwork("Initial_" + meshPolyscopeLabel,
|
||||||
pMesh->getEigenVertices(),
|
pMesh->getEigenVertices(),
|
||||||
pMesh->getEigenEdges());
|
pMesh->getEigenEdges())
|
||||||
|
->setRadius(0.002);
|
||||||
// registerWorldAxes();
|
// registerWorldAxes();
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
@ -2120,9 +2145,9 @@ SimulationResults DRMSimulationModel::executeSimulation(const std::shared_ptr<Si
|
||||||
// pJob->save("./PatternOptimizationNonConv");
|
// pJob->save("./PatternOptimizationNonConv");
|
||||||
// Dt = mSettings.Dtini;
|
// Dt = mSettings.Dtini;
|
||||||
}
|
}
|
||||||
if (mCurrentSimulationStep == 500 && shouldTemporarilyDampForces) {
|
// if (mCurrentSimulationStep == 500 && shouldTemporarilyDampForces) {
|
||||||
Dt = mSettings.Dtini;
|
// Dt = mSettings.Dtini;
|
||||||
}
|
// }
|
||||||
// while (true) {
|
// while (true) {
|
||||||
updateNormalDerivatives();
|
updateNormalDerivatives();
|
||||||
updateT1Derivatives();
|
updateT1Derivatives();
|
||||||
|
|
@ -2208,19 +2233,19 @@ SimulationResults DRMSimulationModel::executeSimulation(const std::shared_ptr<Si
|
||||||
// = std::chrono::duration_cast<std::chrono::minutes>(t2 - beginTime).count();
|
// = std::chrono::duration_cast<std::chrono::minutes>(t2 - beginTime).count();
|
||||||
// std::cout << "Execution time(min):" << executionTime_min << std::endl;
|
// std::cout << "Execution time(min):" << executionTime_min << std::endl;
|
||||||
if (mSettings.useAverage) {
|
if (mSettings.useAverage) {
|
||||||
std::cout << "Percentage of target (average):"
|
std::cout << "Best percentage of target (average):"
|
||||||
<< 100 * mSettings.averageResidualForcesCriterionThreshold
|
<< 100 * mSettings.averageResidualForcesCriterionThreshold
|
||||||
* totalExternalForcesNorm
|
* totalExternalForcesNorm
|
||||||
/ (pMesh->totalResidualForcesNorm / pMesh->VN())
|
/ (minTotalResidualForcesNorm / pMesh->VN())
|
||||||
<< "%" << std::endl;
|
<< "%" << std::endl;
|
||||||
}
|
}
|
||||||
std::cout << "Percentage of target:"
|
std::cout << "Best percentage of target:"
|
||||||
<< 100 * mSettings.totalExternalForcesNormPercentageTermination
|
<< 100 * mSettings.totalExternalForcesNormPercentageTermination
|
||||||
* totalExternalForcesNorm / pMesh->totalResidualForcesNorm
|
* totalExternalForcesNorm / minTotalResidualForcesNorm
|
||||||
<< "%" << std::endl;
|
<< "%" << std::endl;
|
||||||
SimulationResultsReporter::createPlot("Number of Steps",
|
// SimulationResultsReporter::createPlot("Number of Steps",
|
||||||
"Residual Forces mov aver",
|
// "Residual Forces mov aver",
|
||||||
history.residualForcesMovingAverage);
|
// history.residualForcesMovingAverage);
|
||||||
// SimulationResultsReporter::createPlot("Number of Steps",
|
// SimulationResultsReporter::createPlot("Number of Steps",
|
||||||
// "Residual Forces mov aver deriv",
|
// "Residual Forces mov aver deriv",
|
||||||
// movingAveragesDerivatives);
|
// movingAveragesDerivatives);
|
||||||
|
|
@ -2297,8 +2322,18 @@ currentSimulationStep > maxDRMIterations*/
|
||||||
// << std::endl;
|
// << std::endl;
|
||||||
// std::cout << "Residual forces norm:" << mesh.totalResidualForcesNorm
|
// std::cout << "Residual forces norm:" << mesh.totalResidualForcesNorm
|
||||||
// << std::endl;
|
// << std::endl;
|
||||||
|
const bool fullfillsResidualForcesNormTerminationCriterion
|
||||||
|
= !mSettings.useAverage
|
||||||
|
&& pMesh->totalResidualForcesNorm / totalExternalForcesNorm
|
||||||
|
< mSettings.totalExternalForcesNormPercentageTermination;
|
||||||
|
const bool fullfillsAverageResidualForcesNormTerminationCriterion
|
||||||
|
= mSettings.useAverage
|
||||||
|
&& (pMesh->totalResidualForcesNorm / pMesh->VN()) / totalExternalForcesNorm
|
||||||
|
< mSettings.averageResidualForcesCriterionThreshold;
|
||||||
// Residual forces norm convergence
|
// Residual forces norm convergence
|
||||||
if ((pMesh->previousTotalKineticEnergy > pMesh->currentTotalKineticEnergy
|
if (((pMesh->previousTotalKineticEnergy > pMesh->currentTotalKineticEnergy
|
||||||
|
|| fullfillsAverageResidualForcesNormTerminationCriterion
|
||||||
|
|| fullfillsResidualForcesNormTerminationCriterion)
|
||||||
// && mCurrentSimulationStep > movingAverageSampleSize
|
// && mCurrentSimulationStep > movingAverageSampleSize
|
||||||
&& (pJob->nodalForcedDisplacements.empty()
|
&& (pJob->nodalForcedDisplacements.empty()
|
||||||
|| mCurrentSimulationStep > mSettings.gradualForcedDisplacementSteps))
|
|| mCurrentSimulationStep > mSettings.gradualForcedDisplacementSteps))
|
||||||
|
|
@ -2314,13 +2349,6 @@ mesh->currentTotalPotentialEnergykN*/
|
||||||
&& pMesh->currentTotalTranslationalKineticEnergy
|
&& pMesh->currentTotalTranslationalKineticEnergy
|
||||||
< mSettings.totalTranslationalKineticEnergyThreshold
|
< mSettings.totalTranslationalKineticEnergyThreshold
|
||||||
&& mCurrentSimulationStep > 20 && numOfDampings > 0;
|
&& mCurrentSimulationStep > 20 && numOfDampings > 0;
|
||||||
const bool fullfillsResidualForcesNormTerminationCriterion
|
|
||||||
= pMesh->totalResidualForcesNorm / totalExternalForcesNorm
|
|
||||||
< mSettings.totalExternalForcesNormPercentageTermination;
|
|
||||||
const bool fullfillsAverageResidualForcesNormTerminationCriterion
|
|
||||||
= mSettings.useAverage
|
|
||||||
&& (pMesh->totalResidualForcesNorm / pMesh->VN()) / totalExternalForcesNorm
|
|
||||||
< mSettings.averageResidualForcesCriterionThreshold;
|
|
||||||
const bool fullfillsMovingAverageNormTerminationCriterion
|
const bool fullfillsMovingAverageNormTerminationCriterion
|
||||||
= pMesh->residualForcesMovingAverage
|
= pMesh->residualForcesMovingAverage
|
||||||
< mSettings.residualForcesMovingAverageNormThreshold;
|
< mSettings.residualForcesMovingAverageNormThreshold;
|
||||||
|
|
@ -2341,7 +2369,7 @@ mesh->currentTotalPotentialEnergykN*/
|
||||||
std::cout << "Converged using residual forces norm threshold criterion"
|
std::cout << "Converged using residual forces norm threshold criterion"
|
||||||
<< std::endl;
|
<< std::endl;
|
||||||
} else if (fullfillsKineticEnergyTerminationCriterion) {
|
} else if (fullfillsKineticEnergyTerminationCriterion) {
|
||||||
std::cout << "Warning: The kinetic energy of the system was "
|
std::cout << "The kinetic energy of the system was "
|
||||||
" used as a convergence criterion"
|
" used as a convergence criterion"
|
||||||
<< std::endl;
|
<< std::endl;
|
||||||
} else if (fullfillsMovingAverageNormTerminationCriterion) {
|
} else if (fullfillsMovingAverageNormTerminationCriterion) {
|
||||||
|
|
@ -2377,25 +2405,25 @@ mesh->currentTotalPotentialEnergykN*/
|
||||||
// }
|
// }
|
||||||
}
|
}
|
||||||
|
|
||||||
// const bool shouldCapDisplacements = mSettings.displacementCap.has_value();
|
const bool shouldCapDisplacements = mSettings.displacementCap.has_value();
|
||||||
// for (VertexType &v : pMesh->vert) {
|
for (VertexType &v : pMesh->vert) {
|
||||||
// Node &node = pMesh->nodes[v];
|
Node &node = pMesh->nodes[v];
|
||||||
// Vector6d stepDisplacement = node.velocity * Dt;
|
Vector6d stepDisplacement = node.velocity * 0.5 * Dt;
|
||||||
// if (shouldCapDisplacements
|
if (shouldCapDisplacements
|
||||||
// && stepDisplacement.getTranslation().norm() > mSettings.displacementCap) {
|
&& stepDisplacement.getTranslation().norm() > mSettings.displacementCap) {
|
||||||
// stepDisplacement = stepDisplacement
|
stepDisplacement = stepDisplacement
|
||||||
// * (*mSettings.displacementCap
|
* (*mSettings.displacementCap
|
||||||
// / stepDisplacement.getTranslation().norm());
|
/ stepDisplacement.getTranslation().norm());
|
||||||
// }
|
}
|
||||||
// node.displacements = node.displacements - stepDisplacement;
|
node.displacements = node.displacements - stepDisplacement;
|
||||||
// }
|
}
|
||||||
// applyDisplacements(constrainedVertices);
|
applyDisplacements(constrainedVertices);
|
||||||
// if (!pJob->nodalForcedDisplacements.empty()) {
|
if (!pJob->nodalForcedDisplacements.empty()) {
|
||||||
// applyForcedDisplacements(
|
applyForcedDisplacements(
|
||||||
|
|
||||||
// pJob->nodalForcedDisplacements);
|
pJob->nodalForcedDisplacements);
|
||||||
// }
|
}
|
||||||
// updateElementalLengths();
|
updateElementalLengths();
|
||||||
|
|
||||||
// const double triggerPercentage = 0.01;
|
// const double triggerPercentage = 0.01;
|
||||||
// const double xi_min = 0.55;
|
// const double xi_min = 0.55;
|
||||||
|
|
@ -2408,11 +2436,11 @@ mesh->currentTotalPotentialEnergykN*/
|
||||||
// + xi_init - triggerPercentage * xi_min)
|
// + xi_init - triggerPercentage * xi_min)
|
||||||
// / (1 - triggerPercentage);
|
// / (1 - triggerPercentage);
|
||||||
// }
|
// }
|
||||||
|
resetVelocities();
|
||||||
Dt *= mSettings.xi;
|
Dt *= mSettings.xi;
|
||||||
// if (mSettings.isDebugMode) {
|
// if (mSettings.isDebugMode) {
|
||||||
// std::cout << Dt << std::endl;
|
// std::cout << Dt << std::endl;
|
||||||
// }
|
// }
|
||||||
resetVelocities();
|
|
||||||
++numOfDampings;
|
++numOfDampings;
|
||||||
if (mSettings.shouldCreatePlots) {
|
if (mSettings.shouldCreatePlots) {
|
||||||
history.redMarks.push_back(mCurrentSimulationStep);
|
history.redMarks.push_back(mCurrentSimulationStep);
|
||||||
|
|
|
||||||
|
|
@ -45,8 +45,9 @@ public:
|
||||||
double totalResidualForcesNormThreshold{1e-3};
|
double totalResidualForcesNormThreshold{1e-3};
|
||||||
double totalExternalForcesNormPercentageTermination{1e-3};
|
double totalExternalForcesNormPercentageTermination{1e-3};
|
||||||
bool useAverage{false};
|
bool useAverage{false};
|
||||||
double averageResidualForcesCriterionThreshold{1e-3};
|
double averageResidualForcesCriterionThreshold{1e-5};
|
||||||
Settings() {}
|
Settings() {}
|
||||||
|
bool useViscousDamping{false};
|
||||||
};
|
};
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
@ -61,6 +62,10 @@ private:
|
||||||
std::vector<double> plotYValues;
|
std::vector<double> plotYValues;
|
||||||
size_t numOfDampings{0};
|
size_t numOfDampings{0};
|
||||||
int externalLoadStep{1};
|
int externalLoadStep{1};
|
||||||
|
const double viscuousDampingConstant{0.01};
|
||||||
|
std::vector<bool> isVertexConstrained;
|
||||||
|
std::vector<bool> isRigidSupport;
|
||||||
|
double minTotalResidualForcesNorm{std::numeric_limits<double>::max()};
|
||||||
|
|
||||||
const std::string meshPolyscopeLabel{"Simulation mesh"};
|
const std::string meshPolyscopeLabel{"Simulation mesh"};
|
||||||
std::unique_ptr<SimulationMesh> pMesh;
|
std::unique_ptr<SimulationMesh> pMesh;
|
||||||
|
|
@ -69,7 +74,6 @@ private:
|
||||||
// Eigen::Tensor<double, 4> theta3Derivatives;
|
// Eigen::Tensor<double, 4> theta3Derivatives;
|
||||||
// std::unordered_map<MyKeyType, double, key_hash> theta3Derivatives;
|
// std::unordered_map<MyKeyType, double, key_hash> theta3Derivatives;
|
||||||
bool shouldApplyInitialDistortion = false;
|
bool shouldApplyInitialDistortion = false;
|
||||||
std::unordered_set<VertexIndex> rigidSupports;
|
|
||||||
|
|
||||||
void reset();
|
void reset();
|
||||||
void updateNodalInternalForces(
|
void updateNodalInternalForces(
|
||||||
|
|
@ -156,10 +160,9 @@ private:
|
||||||
|
|
||||||
void updateElementalFrames();
|
void updateElementalFrames();
|
||||||
|
|
||||||
VectorType computeDerivativeOfR(const EdgeType &e,
|
VectorType computeDerivativeOfR(const EdgeType &e, const DifferentiateWithRespectTo &dui) const;
|
||||||
const DifferentiateWithRespectTo &dui) const;
|
|
||||||
|
|
||||||
bool isRigidSupport(const VertexType &v) const;
|
// bool isRigidSupport(const VertexType &v) const;
|
||||||
|
|
||||||
static double computeDerivativeOfNorm(const VectorType &x,
|
static double computeDerivativeOfNorm(const VectorType &x,
|
||||||
const VectorType &derivativeOfX);
|
const VectorType &derivativeOfX);
|
||||||
|
|
|
||||||
|
|
@ -140,6 +140,7 @@ void SimulationMesh::initializeNodes() {
|
||||||
const EdgeType &referenceElement = *node.referenceElement;
|
const EdgeType &referenceElement = *node.referenceElement;
|
||||||
const VectorType t01 = computeT1Vector(referenceElement.cP(0), referenceElement.cP(1));
|
const VectorType t01 = computeT1Vector(referenceElement.cP(0), referenceElement.cP(1));
|
||||||
const VectorType f01 = (t01 - (v.cN() * (t01.dot(v.cN())))).Normalize();
|
const VectorType f01 = (t01 - (v.cN() * (t01.dot(v.cN())))).Normalize();
|
||||||
|
node.alphaAngles.reserve(incidentElements.size());
|
||||||
|
|
||||||
for (const VCGEdgeMesh::EdgePointer &ep : nodes[v].incidentElements) {
|
for (const VCGEdgeMesh::EdgePointer &ep : nodes[v].incidentElements) {
|
||||||
assert(referenceElement.cV(0) == ep->cV(0) || referenceElement.cV(0) == ep->cV(1)
|
assert(referenceElement.cV(0) == ep->cV(0) || referenceElement.cV(0) == ep->cV(1)
|
||||||
|
|
@ -148,7 +149,7 @@ void SimulationMesh::initializeNodes() {
|
||||||
const VectorType f1 = t1 - (v.cN() * (t1.dot(v.cN()))).Normalize();
|
const VectorType f1 = t1 - (v.cN() * (t1.dot(v.cN()))).Normalize();
|
||||||
const EdgeIndex ei = getIndex(ep);
|
const EdgeIndex ei = getIndex(ep);
|
||||||
const double alphaAngle = computeAngle(f01, f1, v.cN());
|
const double alphaAngle = computeAngle(f01, f1, v.cN());
|
||||||
node.alphaAngles[ei] = alphaAngle;
|
node.alphaAngles.emplace_back(std::make_pair(ei, alphaAngle));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -182,7 +183,8 @@ void SimulationMesh::reset() {
|
||||||
const EdgeType &referenceElement = *getReferenceElement(v);
|
const EdgeType &referenceElement = *getReferenceElement(v);
|
||||||
const VectorType t01 = computeT1Vector(referenceElement.cP(0), referenceElement.cP(1));
|
const VectorType t01 = computeT1Vector(referenceElement.cP(0), referenceElement.cP(1));
|
||||||
const VectorType f01 = (t01 - (v.cN() * (t01.dot(v.cN())))).Normalize();
|
const VectorType f01 = (t01 - (v.cN() * (t01.dot(v.cN())))).Normalize();
|
||||||
|
node.alphaAngles.clear();
|
||||||
|
node.alphaAngles.reserve(node.incidentElements.size());
|
||||||
for (const VCGEdgeMesh::EdgePointer &ep : nodes[v].incidentElements) {
|
for (const VCGEdgeMesh::EdgePointer &ep : nodes[v].incidentElements) {
|
||||||
assert(referenceElement.cV(0) == ep->cV(0) || referenceElement.cV(0) == ep->cV(1)
|
assert(referenceElement.cV(0) == ep->cV(0) || referenceElement.cV(0) == ep->cV(1)
|
||||||
|| referenceElement.cV(1) == ep->cV(0) || referenceElement.cV(1) == ep->cV(1));
|
|| referenceElement.cV(1) == ep->cV(0) || referenceElement.cV(1) == ep->cV(1));
|
||||||
|
|
@ -190,7 +192,7 @@ void SimulationMesh::reset() {
|
||||||
const VectorType f1 = t1 - (v.cN() * (t1.dot(v.cN()))).Normalize();
|
const VectorType f1 = t1 - (v.cN() * (t1.dot(v.cN()))).Normalize();
|
||||||
const EdgeIndex ei = getIndex(ep);
|
const EdgeIndex ei = getIndex(ep);
|
||||||
const double alphaAngle = computeAngle(f01, f1, v.cN());
|
const double alphaAngle = computeAngle(f01, f1, v.cN());
|
||||||
node.alphaAngles[ei] = alphaAngle;
|
node.alphaAngles.emplace_back(std::make_pair(ei, alphaAngle));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -148,6 +148,7 @@ struct Node {
|
||||||
};
|
};
|
||||||
|
|
||||||
Mass mass;
|
Mass mass;
|
||||||
|
Vector6d mass_6d;
|
||||||
VertexIndex vi;
|
VertexIndex vi;
|
||||||
CoordType initialLocation;
|
CoordType initialLocation;
|
||||||
CoordType initialNormal;
|
CoordType initialNormal;
|
||||||
|
|
@ -157,10 +158,11 @@ struct Node {
|
||||||
double kineticEnergy{0};
|
double kineticEnergy{0};
|
||||||
Vector6d displacements{0};
|
Vector6d displacements{0};
|
||||||
double nR{0};
|
double nR{0};
|
||||||
std::unordered_map<EdgeIndex, double>
|
// std::unordered_map<EdgeIndex, double>
|
||||||
alphaAngles; // contains the initial angles between the first star element
|
// alphaAngles; // contains the initial angles between the first star element
|
||||||
// incident to this node and the other elements of the star
|
// // incident to this node and the other elements of the star
|
||||||
// has size equal to the valence of the vertex
|
// // has size equal to the valence of the vertex
|
||||||
|
std::vector<std::pair<EdgeIndex, double>> alphaAngles;
|
||||||
|
|
||||||
std::vector<VCGEdgeMesh::EdgePointer> incidentElements;
|
std::vector<VCGEdgeMesh::EdgePointer> incidentElements;
|
||||||
std::vector<VectorType> derivativeOfNormal;
|
std::vector<VectorType> derivativeOfNormal;
|
||||||
|
|
|
||||||
|
|
@ -57,6 +57,15 @@ struct Vector6d : public std::array<double, 6> {
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Vector6d operator/(const Vector6d &v) const
|
||||||
|
{
|
||||||
|
Vector6d result;
|
||||||
|
for (size_t i = 0; i < 6; i++) {
|
||||||
|
result[i] = this->operator[](i) / v[i];
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
Vector6d operator+(const Vector6d &v) const {
|
Vector6d operator+(const Vector6d &v) const {
|
||||||
Vector6d result;
|
Vector6d result;
|
||||||
for (size_t i = 0; i < 6; i++) {
|
for (size_t i = 0; i < 6; i++) {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue