The Higher Education and Research forge

Home My Page Projects Code Snippets Project Openings MMD
Summary Activity Forums Tracker Lists Tasks Docs Surveys News SCM Files

SCM Repository

authorAlain <alain.bastide@univ-reunion.fr>
Sun, 21 Jun 2020 16:02:54 +0000 (20:02 +0400)
committerAlain <alain.bastide@univ-reunion.fr>
Sun, 28 Jun 2020 02:58:45 +0000 (06:58 +0400)
Set theme jekyll-theme-cayman
Set theme jekyll-theme-minimal
Auto stash before merge of "master" and "origin/master"
tiny changes

Small changes

Small changes

Small Changes

dual mesh is emerged

.gitignore
CMakeLists.txt.user [deleted file]
README.md
TODO.md [new file with mode: 0644]
_config.yml [new file with mode: 0644]
docs/Doxyfile.in
python/vtk_00.py [new file with mode: 0644]
python/vtk_01.py [new file with mode: 0644]
src/main.c
src/mmd.h

index 1947bc4..53a766c 100644 (file)
@@ -34,3 +34,6 @@
 
 # 
 build/
+
+CMakeLists.txt.user
+*.odt
diff --git a/CMakeLists.txt.user b/CMakeLists.txt.user
deleted file mode 100644 (file)
index 0bbe873..0000000
+++ /dev/null
@@ -1,363 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE QtCreatorProject>
-<!-- Written by QtCreator 4.11.0, 2020-06-18T05:36:48. -->
-<qtcreator>
- <data>
-  <variable>EnvironmentId</variable>
-  <value type="QByteArray">{395ce414-a566-4fd2-9598-6589213a961b}</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">true</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">false</value>
-   <value type="bool" key="EditorConfiguration.inEntireDocument">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.GTest">true</value>
-    <value type="bool" key="AutoTest.Framework.QtQuickTest">true</value>
-    <value type="bool" key="AutoTest.Framework.QtTest">true</value>
-   </valuemap>
-   <value type="int" key="AutoTest.RunAfterBuild">0</value>
-   <value type="bool" key="AutoTest.UseGlobal">true</value>
-   <valuelist type="QVariantList" key="ClangCodeModel.CustomCommandLineKey"/>
-   <value type="bool" key="ClangCodeModel.UseGlobalConfig">true</value>
-   <valuemap type="QVariantMap" key="ClangTools">
-    <value type="bool" key="ClangTools.BuildBeforeAnalysis">true</value>
-    <value type="QString" key="ClangTools.DiagnosticConfig">Builtin.TidyAndClazy</value>
-    <value type="int" key="ClangTools.ParallelJobs">4</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="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Desktop</value>
-   <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Desktop</value>
-   <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">{9979dab9-b434-44d0-aee4-235fd661f79d}</value>
-   <value type="int" key="ProjectExplorer.Target.ActiveBuildConfiguration">2</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">
-    <valuelist type="QVariantList" key="CMake.Configuration">
-     <value type="QString">CMAKE_BUILD_TYPE:STRING=Debug</value>
-     <value type="QString">CMAKE_CXX_COMPILER:STRING=%{Compiler:Executable:Cxx}</value>
-     <value type="QString">CMAKE_C_COMPILER:STRING=%{Compiler:Executable:C}</value>
-     <value type="QString">CMAKE_PREFIX_PATH:STRING=%{Qt:QT_INSTALL_PREFIX}</value>
-     <value type="QString">QT_QMAKE_EXECUTABLE:STRING=%{Qt:qmakeExecutable}</value>
-    </valuelist>
-    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/home/alain/CloudStation/MMD_QM/MMD/MMD_github/build-MMD-Desktop-Debug</value>
-    <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
-     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
-      <value type="QString" key="CMakeProjectManager.MakeStep.AdditionalArguments"></value>
-      <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">
-      <value type="QString" key="CMakeProjectManager.MakeStep.AdditionalArguments"></value>
-      <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.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">
-    <valuelist type="QVariantList" key="CMake.Configuration">
-     <value type="QString">CMAKE_BUILD_TYPE:STRING=Release</value>
-     <value type="QString">CMAKE_CXX_COMPILER:STRING=%{Compiler:Executable:Cxx}</value>
-     <value type="QString">CMAKE_C_COMPILER:STRING=%{Compiler:Executable:C}</value>
-     <value type="QString">CMAKE_PREFIX_PATH:STRING=%{Qt:QT_INSTALL_PREFIX}</value>
-     <value type="QString">QT_QMAKE_EXECUTABLE:STRING=%{Qt:qmakeExecutable}</value>
-    </valuelist>
-    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/home/alain/CloudStation/MMD_QM/MMD/MMD_github/build-MMD-Desktop-Release</value>
-    <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
-     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
-      <value type="QString" key="CMakeProjectManager.MakeStep.AdditionalArguments"></value>
-      <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">
-      <value type="QString" key="CMakeProjectManager.MakeStep.AdditionalArguments"></value>
-      <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.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">
-    <valuelist type="QVariantList" key="CMake.Configuration">
-     <value type="QString">CMAKE_BUILD_TYPE:STRING=RelWithDebInfo</value>
-     <value type="QString">CMAKE_CXX_COMPILER:STRING=%{Compiler:Executable:Cxx}</value>
-     <value type="QString">CMAKE_C_COMPILER:STRING=%{Compiler:Executable:C}</value>
-     <value type="QString">CMAKE_PREFIX_PATH:STRING=%{Qt:QT_INSTALL_PREFIX}</value>
-     <value type="QString">QT_QMAKE_EXECUTABLE:STRING=%{Qt:qmakeExecutable}</value>
-    </valuelist>
-    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/home/alain/CloudStation/MMD_QM/MMD/MMD_github/build-MMD-Desktop-RelWithDebInfo</value>
-    <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
-     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
-      <value type="QString" key="CMakeProjectManager.MakeStep.AdditionalArguments"></value>
-      <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">
-      <value type="QString" key="CMakeProjectManager.MakeStep.AdditionalArguments"></value>
-      <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.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">
-    <valuelist type="QVariantList" key="CMake.Configuration">
-     <value type="QString">CMAKE_BUILD_TYPE:STRING=MinSizeRel</value>
-     <value type="QString">CMAKE_CXX_COMPILER:STRING=%{Compiler:Executable:Cxx}</value>
-     <value type="QString">CMAKE_C_COMPILER:STRING=%{Compiler:Executable:C}</value>
-     <value type="QString">CMAKE_PREFIX_PATH:STRING=%{Qt:QT_INSTALL_PREFIX}</value>
-     <value type="QString">QT_QMAKE_EXECUTABLE:STRING=%{Qt:qmakeExecutable}</value>
-    </valuelist>
-    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/home/alain/CloudStation/MMD_QM/MMD/MMD_github/build-MMD-Desktop-MinSizeRel</value>
-    <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
-     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
-      <value type="QString" key="CMakeProjectManager.MakeStep.AdditionalArguments"></value>
-      <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">
-      <value type="QString" key="CMakeProjectManager.MakeStep.AdditionalArguments"></value>
-      <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.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>
-    <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.PluginSettings"/>
-   <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>
-    <value type="int" key="PE.EnvironmentAspect.Base">2</value>
-    <valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
-    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">MMD</value>
-    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.CMakeRunConfiguration.MMD</value>
-    <value type="QString" key="ProjectExplorer.RunConfiguration.BuildKey">MMD</value>
-    <value type="QString" key="RunConfiguration.Arguments"></value>
-    <value type="bool" key="RunConfiguration.Arguments.multi">false</value>
-    <value type="QString" key="RunConfiguration.OverrideDebuggerStartup"></value>
-    <value type="bool" key="RunConfiguration.UseCppDebugger">false</value>
-    <value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</value>
-    <value type="bool" key="RunConfiguration.UseLibrarySearchPath">true</value>
-    <value type="bool" key="RunConfiguration.UseMultiProcess">false</value>
-    <value type="bool" key="RunConfiguration.UseQmlDebugger">false</value>
-    <value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value>
-    <value type="QString" key="RunConfiguration.WorkingDirectory"></value>
-    <value type="QString" key="RunConfiguration.WorkingDirectory.default">/home/alain/CloudStation/MMD_QM/MMD/MMD_github/build-MMD-Desktop-RelWithDebInfo</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>
index a50a829..c802ebb 100644 (file)
--- a/README.md
+++ b/README.md
@@ -1 +1,3 @@
 MMD
+
+v0.0.1 Geometry for primal mesh on hexahedral elements
diff --git a/TODO.md b/TODO.md
new file mode 100644 (file)
index 0000000..b51c321
--- /dev/null
+++ b/TODO.md
@@ -0,0 +1,10 @@
+TODO :
+
+Reduce the execution time of the functions : 
+1. void setHexahedreSegmentToFaces(struct primalMesh * myPrimalMesh)
+2. void setHexahedreSegments(struct primalMesh * myPrimalMesh)
+
+By introducing new vectors such as faceToCells and cellToSegments
+
+
+
diff --git a/_config.yml b/_config.yml
new file mode 100644 (file)
index 0000000..2f7efbe
--- /dev/null
@@ -0,0 +1 @@
+theme: jekyll-theme-minimal
\ No newline at end of file
index 6102d49..c05633d 100644 (file)
@@ -1,4 +1,4 @@
-# Doxyfile 1.8.7
+# Doxyfile 1.8.17
 
 # This file describes the settings to be used by the documentation system
 # doxygen (www.doxygen.org) for a project.
 # Project related configuration options
 #---------------------------------------------------------------------------
 
-# This tag specifies the encoding used for all characters in the config file
-# that follow. The default is UTF-8 which is also the encoding used for all text
-# before the first occurrence of this tag. Doxygen uses libiconv (or the iconv
-# built into libc) for the transcoding. See http://www.gnu.org/software/libiconv
-# for the list of possible encodings.
+# This tag specifies the encoding used for all characters in the configuration
+# file that follow. The default is UTF-8 which is also the encoding used for all
+# text before the first occurrence of this tag. Doxygen uses libiconv (or the
+# iconv built into libc) for the transcoding. See
+# https://www.gnu.org/software/libiconv/ for the list of possible encodings.
 # The default value is: UTF-8.
 
 DOXYFILE_ENCODING      = UTF-8
@@ -32,7 +32,7 @@ DOXYFILE_ENCODING      = UTF-8
 # title of most generated pages and in a few other places.
 # The default value is: My Project.
 
-PROJECT_NAME           = "MMD"
+PROJECT_NAME           = MMD
 
 # The PROJECT_NUMBER tag can be used to enter a project or revision number. This
 # could be handy for archiving the generated documentation or if some version
@@ -46,10 +46,10 @@ PROJECT_NUMBER         = 0.0.1
 
 PROJECT_BRIEF          =
 
-# With the PROJECT_LOGO tag one can specify an logo or icon that is included in
-# the documentation. The maximum height of the logo should not exceed 55 pixels
-# and the maximum width should not exceed 200 pixels. Doxygen will copy the logo
-# to the output directory.
+# With the PROJECT_LOGO tag one can specify a logo or an icon that is included
+# in the documentation. The maximum height of the logo should not exceed 55
+# pixels and the maximum width should not exceed 200 pixels. Doxygen will copy
+# the logo to the output directory.
 
 PROJECT_LOGO           =
 
@@ -60,7 +60,7 @@ PROJECT_LOGO           =
 
 OUTPUT_DIRECTORY       = @CMAKE_CURRENT_BINARY_DIR@/doc_doxygen/
 
-# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create 4096 sub-
+# If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub-
 # directories (in 2 levels) under the output directory of each output format and
 # will distribute the generated files over these directories. Enabling this
 # option can be useful when feeding doxygen a huge amount of source files, where
@@ -91,16 +91,24 @@ ALLOW_UNICODE_NAMES    = NO
 # Ukrainian and Vietnamese.
 # The default value is: English.
 
-OUTPUT_LANGUAGE        = English
+OUTPUT_LANGUAGE        = French
 
-# If the BRIEF_MEMBER_DESC tag is set to YES doxygen will include brief member
+# The OUTPUT_TEXT_DIRECTION tag is used to specify the direction in which all
+# documentation generated by doxygen is written. Doxygen will use this
+# information to generate all generated output in the proper direction.
+# Possible values are: None, LTR, RTL and Context.
+# The default value is: None.
+
+OUTPUT_TEXT_DIRECTION  = None
+
+# If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member
 # descriptions after the members that are listed in the file and class
 # documentation (similar to Javadoc). Set to NO to disable this.
 # The default value is: YES.
 
 BRIEF_MEMBER_DESC      = YES
 
-# If the REPEAT_BRIEF tag is set to YES doxygen will prepend the brief
+# If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief
 # description of a member or function before the detailed description
 #
 # Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
@@ -135,7 +143,7 @@ ALWAYS_DETAILED_SEC    = NO
 
 INLINE_INHERITED_MEMB  = NO
 
-# If the FULL_PATH_NAMES tag is set to YES doxygen will prepend the full path
+# If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path
 # before files name in the file list and in the header files. If set to NO the
 # shortest path that makes the file name unique will be used
 # The default value is: YES.
@@ -179,6 +187,16 @@ SHORT_NAMES            = NO
 
 JAVADOC_AUTOBRIEF      = NO
 
+# If the JAVADOC_BANNER tag is set to YES then doxygen will interpret a line
+# such as
+# /***************
+# as being the beginning of a Javadoc-style comment "banner". If set to NO, the
+# Javadoc-style will behave just like regular comments and it will not be
+# interpreted by doxygen.
+# The default value is: NO.
+
+JAVADOC_BANNER         = NO
+
 # If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first
 # line (until the first dot) of a Qt-style comment as the brief description. If
 # set to NO, the Qt-style will behave just like regular Qt-style comments (thus
@@ -205,9 +223,9 @@ MULTILINE_CPP_IS_BRIEF = NO
 
 INHERIT_DOCS           = YES
 
-# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce a
-# new page for each member. If set to NO, the documentation of a member will be
-# part of the file/class/namespace that contains it.
+# If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new
+# page for each member. If set to NO, the documentation of a member will be part
+# of the file/class/namespace that contains it.
 # The default value is: NO.
 
 SEPARATE_MEMBER_PAGES  = NO
@@ -226,7 +244,12 @@ TAB_SIZE               = 4
 # will allow you to put the command \sideeffect (or @sideeffect) in the
 # documentation, which will result in a user-defined paragraph with heading
 # "Side Effects:". You can put \n's in the value part of an alias to insert
-# newlines.
+# newlines (in the resulting output). You can put ^^ in the value part of an
+# alias to insert a newline as if a physical newline was in the original file.
+# When you need a literal { or } or , in the value part of an alias you have to
+# escape them by means of a backslash (\), this can lead to conflicts with the
+# commands \{ and \} for these it is advised to use the version @{ and @} or use
+# a double escape (\\{ and \\})
 
 ALIASES                =
 
@@ -264,19 +287,28 @@ OPTIMIZE_FOR_FORTRAN   = NO
 
 OPTIMIZE_OUTPUT_VHDL   = NO
 
+# Set the OPTIMIZE_OUTPUT_SLICE tag to YES if your project consists of Slice
+# sources only. Doxygen will then generate output that is more tailored for that
+# language. For instance, namespaces will be presented as modules, types will be
+# separated into more groups, etc.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_SLICE  = NO
+
 # Doxygen selects the parser to use depending on the extension of the files it
 # parses. With this tag you can assign which parser to use for a given
 # extension. Doxygen has a built-in mapping, but you can override or extend it
 # using this tag. The format is ext=language, where ext is a file extension, and
-# language is one of the parsers supported by doxygen: IDL, Java, Javascript,
-# C#, C, C++, D, PHP, Objective-C, Python, Fortran (fixed format Fortran:
-# FortranFixed, free formatted Fortran: FortranFree, unknown formatted Fortran:
-# Fortran. In the later case the parser tries to guess whether the code is fixed
-# or free formatted code, this is the default for Fortran type files), VHDL. For
-# instance to make doxygen treat .inc files as Fortran files (default is PHP),
-# and .f files as C (default is Fortran), use: inc=Fortran f=C.
+# language is one of the parsers supported by doxygen: IDL, Java, JavaScript,
+# Csharp (C#), C, C++, D, PHP, md (Markdown), Objective-C, Python, Slice,
+# Fortran (fixed format Fortran: FortranFixed, free formatted Fortran:
+# FortranFree, unknown formatted Fortran: Fortran. In the later case the parser
+# tries to guess whether the code is fixed or free formatted code, this is the
+# default for Fortran type files), VHDL, tcl. For instance to make doxygen treat
+# .inc files as Fortran files (default is PHP), and .f files as C (default is
+# Fortran), use: inc=Fortran f=C.
 #
-# Note For files without extension you can use no_extension as a placeholder.
+# Note: For files without extension you can use no_extension as a placeholder.
 #
 # Note that for custom extensions you also need to set FILE_PATTERNS otherwise
 # the files are not read by doxygen.
@@ -285,7 +317,7 @@ EXTENSION_MAPPING      =
 
 # If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments
 # according to the Markdown format, which allows for more readable
-# documentation. See http://daringfireball.net/projects/markdown/ for details.
+# documentation. See https://daringfireball.net/projects/markdown/ for details.
 # The output of markdown processing is further processed by doxygen, so you can
 # mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in
 # case of backward compatibilities issues.
@@ -293,10 +325,19 @@ EXTENSION_MAPPING      =
 
 MARKDOWN_SUPPORT       = YES
 
+# When the TOC_INCLUDE_HEADINGS tag is set to a non-zero value, all headings up
+# to that level are automatically included in the table of contents, even if
+# they do not have an id attribute.
+# Note: This feature currently applies only to Markdown headings.
+# Minimum value: 0, maximum value: 99, default value: 5.
+# This tag requires that the tag MARKDOWN_SUPPORT is set to YES.
+
+TOC_INCLUDE_HEADINGS   = 5
+
 # When enabled doxygen tries to link words that correspond to documented
 # classes, or namespaces to their corresponding documentation. Such a link can
-# be prevented in individual cases by by putting a % sign in front of the word
-# or globally by setting AUTOLINK_SUPPORT to NO.
+# be prevented in individual cases by putting a % sign in front of the word or
+# globally by setting AUTOLINK_SUPPORT to NO.
 # The default value is: YES.
 
 AUTOLINK_SUPPORT       = YES
@@ -318,7 +359,7 @@ BUILTIN_STL_SUPPORT    = YES
 CPP_CLI_SUPPORT        = NO
 
 # Set the SIP_SUPPORT tag to YES if your project consists of sip (see:
-# http://www.riverbankcomputing.co.uk/software/sip/intro) sources only. Doxygen
+# https://www.riverbankcomputing.com/software/sip/intro) sources only. Doxygen
 # will parse them like normal C++ but will assume all classes use public instead
 # of private inheritance when no explicit protection keyword is present.
 # The default value is: NO.
@@ -336,13 +377,20 @@ SIP_SUPPORT            = NO
 IDL_PROPERTY_SUPPORT   = YES
 
 # If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
-# tag is set to YES, then doxygen will reuse the documentation of the first
+# tag is set to YES then doxygen will reuse the documentation of the first
 # member in the group (if any) for the other members of the group. By default
 # all members of a group must be documented explicitly.
 # The default value is: NO.
 
 DISTRIBUTE_GROUP_DOC   = NO
 
+# If one adds a struct or class to a group and this option is enabled, then also
+# any nested class or struct is added to the same group. By default this option
+# is disabled and one has to add nested compounds explicitly via \ingroup.
+# The default value is: NO.
+
+GROUP_NESTED_COMPOUNDS = NO
+
 # Set the SUBGROUPING tag to YES to allow class member groups of the same type
 # (for instance a group of public functions) to be put as a subgroup of that
 # type (e.g. under the Public Functions section). Set it to NO to prevent
@@ -401,7 +449,7 @@ LOOKUP_CACHE_SIZE      = 0
 # Build related configuration options
 #---------------------------------------------------------------------------
 
-# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in
+# If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in
 # documentation are documented, even if no documentation was available. Private
 # class members and static file members will be hidden unless the
 # EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES.
@@ -411,35 +459,41 @@ LOOKUP_CACHE_SIZE      = 0
 
 EXTRACT_ALL            = YES
 
-# If the EXTRACT_PRIVATE tag is set to YES all private members of a class will
+# If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will
 # be included in the documentation.
 # The default value is: NO.
 
 EXTRACT_PRIVATE        = YES
 
-# If the EXTRACT_PACKAGE tag is set to YES all members with package or internal
+# If the EXTRACT_PRIV_VIRTUAL tag is set to YES, documented private virtual
+# methods of a class will be included in the documentation.
+# The default value is: NO.
+
+EXTRACT_PRIV_VIRTUAL   = NO
+
+# If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal
 # scope will be included in the documentation.
 # The default value is: NO.
 
 EXTRACT_PACKAGE        = NO
 
-# If the EXTRACT_STATIC tag is set to YES all static members of a file will be
+# If the EXTRACT_STATIC tag is set to YES, all static members of a file will be
 # included in the documentation.
 # The default value is: NO.
 
 EXTRACT_STATIC         = YES
 
-# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) defined
-# locally in source files will be included in the documentation. If set to NO
+# If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined
+# locally in source files will be included in the documentation. If set to NO,
 # only classes defined in header files are included. Does not have any effect
 # for Java sources.
 # The default value is: YES.
 
 EXTRACT_LOCAL_CLASSES  = YES
 
-# This flag is only useful for Objective-C code. When set to YES local methods,
+# This flag is only useful for Objective-C code. If set to YES, local methods,
 # which are defined in the implementation section but not in the interface are
-# included in the documentation. If set to NO only methods in the interface are
+# included in the documentation. If set to NO, only methods in the interface are
 # included.
 # The default value is: NO.
 
@@ -464,21 +518,21 @@ HIDE_UNDOC_MEMBERS     = NO
 
 # If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all
 # undocumented classes that are normally visible in the class hierarchy. If set
-# to NO these classes will be included in the various overviews. This option has
-# no effect if EXTRACT_ALL is enabled.
+# to NO, these classes will be included in the various overviews. This option
+# has no effect if EXTRACT_ALL is enabled.
 # The default value is: NO.
 
 HIDE_UNDOC_CLASSES     = NO
 
 # If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend
-# (class|struct|union) declarations. If set to NO these declarations will be
-# included in the documentation.
+# declarations. If set to NO, these declarations will be included in the
+# documentation.
 # The default value is: NO.
 
 HIDE_FRIEND_COMPOUNDS  = NO
 
 # If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any
-# documentation blocks found inside the body of a function. If set to NO these
+# documentation blocks found inside the body of a function. If set to NO, these
 # blocks will be appended to the function's detailed documentation block.
 # The default value is: NO.
 
@@ -492,21 +546,28 @@ HIDE_IN_BODY_DOCS      = NO
 INTERNAL_DOCS          = NO
 
 # If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file
-# names in lower-case letters. If set to YES upper-case letters are also
+# names in lower-case letters. If set to YES, upper-case letters are also
 # allowed. This is useful if you have classes or files whose names only differ
 # in case and if your file system supports case sensitive file names. Windows
-# and Mac users are advised to set this option to NO.
+# (including Cygwin) ands Mac users are advised to set this option to NO.
 # The default value is: system dependent.
 
 CASE_SENSE_NAMES       = NO
 
 # If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with
-# their full class and namespace scopes in the documentation. If set to YES the
+# their full class and namespace scopes in the documentation. If set to YES, the
 # scope will be hidden.
 # The default value is: NO.
 
 HIDE_SCOPE_NAMES       = NO
 
+# If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will
+# append additional text to a page's title, such as Class Reference. If set to
+# YES the compound reference will be hidden.
+# The default value is: NO.
+
+HIDE_COMPOUND_REFERENCE= NO
+
 # If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of
 # the files that are included by a file in the documentation of that file.
 # The default value is: YES.
@@ -534,14 +595,14 @@ INLINE_INFO            = YES
 
 # If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the
 # (detailed) documentation of file and class members alphabetically by member
-# name. If set to NO the members will appear in declaration order.
+# name. If set to NO, the members will appear in declaration order.
 # The default value is: YES.
 
 SORT_MEMBER_DOCS       = YES
 
 # If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief
 # descriptions of file, namespace and class members alphabetically by member
-# name. If set to NO the members will appear in declaration order. Note that
+# name. If set to NO, the members will appear in declaration order. Note that
 # this will also influence the order of the classes in the class list.
 # The default value is: NO.
 
@@ -586,27 +647,25 @@ SORT_BY_SCOPE_NAME     = NO
 
 STRICT_PROTO_MATCHING  = NO
 
-# The GENERATE_TODOLIST tag can be used to enable ( YES) or disable ( NO) the
-# todo list. This list is created by putting \todo commands in the
-# documentation.
+# The GENERATE_TODOLIST tag can be used to enable (YES) or disable (NO) the todo
+# list. This list is created by putting \todo commands in the documentation.
 # The default value is: YES.
 
 GENERATE_TODOLIST      = YES
 
-# The GENERATE_TESTLIST tag can be used to enable ( YES) or disable ( NO) the
-# test list. This list is created by putting \test commands in the
-# documentation.
+# The GENERATE_TESTLIST tag can be used to enable (YES) or disable (NO) the test
+# list. This list is created by putting \test commands in the documentation.
 # The default value is: YES.
 
 GENERATE_TESTLIST      = YES
 
-# The GENERATE_BUGLIST tag can be used to enable ( YES) or disable ( NO) the bug
+# The GENERATE_BUGLIST tag can be used to enable (YES) or disable (NO) the bug
 # list. This list is created by putting \bug commands in the documentation.
 # The default value is: YES.
 
 GENERATE_BUGLIST       = YES
 
-# The GENERATE_DEPRECATEDLIST tag can be used to enable ( YES) or disable ( NO)
+# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or disable (NO)
 # the deprecated list. This list is created by putting \deprecated commands in
 # the documentation.
 # The default value is: YES.
@@ -631,8 +690,8 @@ ENABLED_SECTIONS       =
 MAX_INITIALIZER_LINES  = 30
 
 # Set the SHOW_USED_FILES tag to NO to disable the list of files generated at
-# the bottom of the documentation of classes and structs. If set to YES the list
-# will mention the files that were used to generate the documentation.
+# the bottom of the documentation of classes and structs. If set to YES, the
+# list will mention the files that were used to generate the documentation.
 # The default value is: YES.
 
 SHOW_USED_FILES        = YES
@@ -677,11 +736,10 @@ LAYOUT_FILE            =
 # The CITE_BIB_FILES tag can be used to specify one or more bib files containing
 # the reference definitions. This must be a list of .bib files. The .bib
 # extension is automatically appended if omitted. This requires the bibtex tool
-# to be installed. See also http://en.wikipedia.org/wiki/BibTeX for more info.
+# to be installed. See also https://en.wikipedia.org/wiki/BibTeX for more info.
 # For LaTeX the style of the bibliography can be controlled using
 # LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the
-# search path. Do not use file names with spaces, bibtex cannot handle them. See
-# also \cite for info how to create references.
+# search path. See also \cite for info how to create references.
 
 CITE_BIB_FILES         =
 
@@ -697,7 +755,7 @@ CITE_BIB_FILES         =
 QUIET                  = NO
 
 # The WARNINGS tag can be used to turn on/off the warning messages that are
-# generated to standard error ( stderr) by doxygen. If WARNINGS is set to YES
+# generated to standard error (stderr) by doxygen. If WARNINGS is set to YES
 # this implies that the warnings are on.
 #
 # Tip: Turn warnings on while writing the documentation.
@@ -705,7 +763,7 @@ QUIET                  = NO
 
 WARNINGS               = YES
 
-# If the WARN_IF_UNDOCUMENTED tag is set to YES, then doxygen will generate
+# If the WARN_IF_UNDOCUMENTED tag is set to YES then doxygen will generate
 # warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag
 # will automatically be disabled.
 # The default value is: YES.
@@ -722,12 +780,19 @@ WARN_IF_DOC_ERROR      = YES
 
 # This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that
 # are documented, but have no documentation for their parameters or return
-# value. If set to NO doxygen will only warn about wrong or incomplete parameter
-# documentation, but not about the absence of documentation.
+# value. If set to NO, doxygen will only warn about wrong or incomplete
+# parameter documentation, but not about the absence of documentation. If
+# EXTRACT_ALL is set to YES then this flag will automatically be disabled.
 # The default value is: NO.
 
 WARN_NO_PARAMDOC       = NO
 
+# If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when
+# a warning is encountered.
+# The default value is: NO.
+
+WARN_AS_ERROR          = NO
+
 # The WARN_FORMAT tag determines the format of the warning messages that doxygen
 # can produce. The string should contain the $file, $line, and $text tags, which
 # will be replaced by the file and line number from which the warning originated
@@ -751,15 +816,16 @@ WARN_LOGFILE           =
 # The INPUT tag is used to specify the files and/or directories that contain
 # documented source files. You may enter file names like myfile.cpp or
 # directories like /usr/src/myproject. Separate the files or directories with
-# spaces.
+# spaces. See also FILE_PATTERNS and EXTENSION_MAPPING
 # Note: If this tag is empty the current directory is searched.
 
-INPUT                  = @CMAKE_CURRENT_SOURCE_DIR@/src/ @CMAKE_CURRENT_SOURCE_DIR@/docs
+INPUT                  = @CMAKE_CURRENT_SOURCE_DIR@/src/ \
+                         @CMAKE_CURRENT_SOURCE_DIR@/docs
 
 # This tag can be used to specify the character encoding of the source files
 # that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses
 # libiconv (or the iconv built into libc) for the transcoding. See the libiconv
-# documentation (see: http://www.gnu.org/software/libiconv) for the list of
+# documentation (see: https://www.gnu.org/software/libiconv/) for the list of
 # possible encodings.
 # The default value is: UTF-8.
 
@@ -767,12 +833,19 @@ INPUT_ENCODING         = UTF-8
 
 # If the value of the INPUT tag contains directories, you can use the
 # FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and
-# *.h) to filter out the source-files in the directories. If left blank the
-# following patterns are tested:*.c, *.cc, *.cxx, *.cpp, *.c++, *.java, *.ii,
-# *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, *.hh, *.hxx, *.hpp,
-# *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc, *.m, *.markdown,
-# *.md, *.mm, *.dox, *.py, *.f90, *.f, *.for, *.tcl, *.vhd, *.vhdl, *.ucf,
-# *.qsf, *.as and *.js.
+# *.h) to filter out the source-files in the directories.
+#
+# Note that for custom extensions or not directly supported extensions you also
+# need to set EXTENSION_MAPPING for the extension otherwise the files are not
+# read by doxygen.
+#
+# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp,
+# *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h,
+# *.hh, *.hxx, *.hpp, *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc,
+# *.m, *.markdown, *.md, *.mm, *.dox (to be provided as doxygen C comment),
+# *.doc (to be provided as doxygen C comment), *.txt (to be provided as doxygen
+# C comment), *.py, *.pyw, *.f90, *.f95, *.f03, *.f08, *.f, *.for, *.tcl, *.vhd,
+# *.vhdl, *.ucf, *.qsf and *.ice.
 
 FILE_PATTERNS          =
 
@@ -858,6 +931,10 @@ IMAGE_PATH             =
 # Note that the filter must not add or remove lines; it is applied before the
 # code is scanned, but not when the output code is generated. If lines are added
 # or removed, the anchors will not be placed correctly.
+#
+# Note that for custom extensions or not directly supported extensions you also
+# need to set EXTENSION_MAPPING for the extension otherwise the files are not
+# properly processed by doxygen.
 
 INPUT_FILTER           =
 
@@ -867,11 +944,15 @@ INPUT_FILTER           =
 # (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how
 # filters are used. If the FILTER_PATTERNS tag is empty or if none of the
 # patterns match the file name, INPUT_FILTER is applied.
+#
+# Note that for custom extensions or not directly supported extensions you also
+# need to set EXTENSION_MAPPING for the extension otherwise the files are not
+# properly processed by doxygen.
 
 FILTER_PATTERNS        =
 
 # If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
-# INPUT_FILTER ) will also be used to filter the input files that are used for
+# INPUT_FILTER) will also be used to filter the input files that are used for
 # producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES).
 # The default value is: NO.
 
@@ -919,7 +1000,7 @@ INLINE_SOURCES         = YES
 STRIP_CODE_COMMENTS    = YES
 
 # If the REFERENCED_BY_RELATION tag is set to YES then for each documented
-# function all documented functions referencing it will be listed.
+# entity all documented functions referencing it will be listed.
 # The default value is: NO.
 
 REFERENCED_BY_RELATION = YES
@@ -931,7 +1012,7 @@ REFERENCED_BY_RELATION = YES
 REFERENCES_RELATION    = YES
 
 # If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set
-# to YES, then the hyperlinks from functions in REFERENCES_RELATION and
+# to YES then the hyperlinks from functions in REFERENCES_RELATION and
 # REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will
 # link to the documentation.
 # The default value is: YES.
@@ -951,12 +1032,12 @@ SOURCE_TOOLTIPS        = YES
 # If the USE_HTAGS tag is set to YES then the references to source code will
 # point to the HTML generated by the htags(1) tool instead of doxygen built-in
 # source browser. The htags tool is part of GNU's global source tagging system
-# (see http://www.gnu.org/software/global/global.html). You will need version
+# (see https://www.gnu.org/software/global/global.html). You will need version
 # 4.8.6 or higher.
 #
 # To use it do the following:
 # - Install the latest version of global
-# - Enable SOURCE_BROWSER and USE_HTAGS in the config file
+# - Enable SOURCE_BROWSER and USE_HTAGS in the configuration file
 # - Make sure the INPUT points to the root of the source tree
 # - Run doxygen as normal
 #
@@ -978,6 +1059,35 @@ USE_HTAGS              = NO
 
 VERBATIM_HEADERS       = YES
 
+# If the CLANG_ASSISTED_PARSING tag is set to YES then doxygen will use the
+# clang parser (see: http://clang.llvm.org/) for more accurate parsing at the
+# cost of reduced performance. This can be particularly helpful with template
+# rich C++ code for which doxygen's built-in parser lacks the necessary type
+# information.
+# Note: The availability of this option depends on whether or not doxygen was
+# generated with the -Duse_libclang=ON option for CMake.
+# The default value is: NO.
+
+CLANG_ASSISTED_PARSING = NO
+
+# If clang assisted parsing is enabled you can provide the compiler with command
+# line options that you would normally use when invoking the compiler. Note that
+# the include paths will already be set by doxygen for the files and directories
+# specified with INPUT and INCLUDE_PATH.
+# This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES.
+
+CLANG_OPTIONS          =
+
+# If clang assisted parsing is enabled you can provide the clang parser with the
+# path to the compilation database (see:
+# http://clang.llvm.org/docs/HowToSetupToolingForLLVM.html) used when the files
+# were built. This is equivalent to specifying the "-p" option to a clang tool,
+# such as clang-check. These options will then be passed to the parser.
+# Note: The availability of this option depends on whether or not doxygen was
+# generated with the -Duse_libclang=ON option for CMake.
+
+CLANG_DATABASE_PATH    =
+
 #---------------------------------------------------------------------------
 # Configuration options related to the alphabetical class index
 #---------------------------------------------------------------------------
@@ -1008,7 +1118,7 @@ IGNORE_PREFIX          =
 # Configuration options related to the HTML output
 #---------------------------------------------------------------------------
 
-# If the GENERATE_HTML tag is set to YES doxygen will generate HTML output
+# If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output
 # The default value is: YES.
 
 GENERATE_HTML          = YES
@@ -1070,13 +1180,15 @@ HTML_FOOTER            =
 
 HTML_STYLESHEET        =
 
-# The HTML_EXTRA_STYLESHEET tag can be used to specify an additional user-
-# defined cascading style sheet that is included after the standard style sheets
+# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined
+# cascading style sheets that are included after the standard style sheets
 # created by doxygen. Using this option one can overrule certain style aspects.
 # This is preferred over using HTML_STYLESHEET since it does not replace the
-# standard style sheet and is therefor more robust against future updates.
-# Doxygen will copy the style sheet file to the output directory. For an example
-# see the documentation.
+# standard style sheet and is therefore more robust against future updates.
+# Doxygen will copy the style sheet files to the output directory.
+# Note: The order of the extra style sheet files is of importance (e.g. the last
+# style sheet in the list overrules the setting of the previous ones in the
+# list). For an example see the documentation.
 # This tag requires that the tag GENERATE_HTML is set to YES.
 
 HTML_EXTRA_STYLESHEET  =
@@ -1092,9 +1204,9 @@ HTML_EXTRA_STYLESHEET  =
 HTML_EXTRA_FILES       =
 
 # The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen
-# will adjust the colors in the stylesheet and background images according to
+# will adjust the colors in the style sheet and background images according to
 # this color. Hue is specified as an angle on a colorwheel, see
-# http://en.wikipedia.org/wiki/Hue for more information. For instance the value
+# https://en.wikipedia.org/wiki/Hue for more information. For instance the value
 # 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300
 # purple, and 360 is red again.
 # Minimum value: 0, maximum value: 359, default value: 220.
@@ -1123,12 +1235,24 @@ HTML_COLORSTYLE_GAMMA  = 80
 
 # If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML
 # page will contain the date and time when the page was generated. Setting this
-# to NO can help when comparing the output of multiple runs.
-# The default value is: YES.
+# to YES can help to show when doxygen was last run and thus if the
+# documentation is up to date.
+# The default value is: NO.
 # This tag requires that the tag GENERATE_HTML is set to YES.
 
 HTML_TIMESTAMP         = YES
 
+# If the HTML_DYNAMIC_MENUS tag is set to YES then the generated HTML
+# documentation will contain a main index with vertical navigation menus that
+# are dynamically created via JavaScript. If disabled, the navigation index will
+# consists of multiple levels of tabs that are statically embedded in every HTML
+# page. Disable this option to support browsers that do not have JavaScript,
+# like the Qt help browser.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_DYNAMIC_MENUS     = YES
+
 # If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML
 # documentation will contain sections that can be hidden and shown after the
 # page has loaded.
@@ -1152,13 +1276,13 @@ HTML_INDEX_NUM_ENTRIES = 100
 
 # If the GENERATE_DOCSET tag is set to YES, additional index files will be
 # generated that can be used as input for Apple's Xcode 3 integrated development
-# environment (see: http://developer.apple.com/tools/xcode/), introduced with
-# OSX 10.5 (Leopard). To create a documentation set, doxygen will generate a
+# environment (see: https://developer.apple.com/xcode/), introduced with OSX
+# 10.5 (Leopard). To create a documentation set, doxygen will generate a
 # Makefile in the HTML output directory. Running make will produce the docset in
 # that directory and running make install will install the docset in
 # ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at
-# startup. See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html
-# for more information.
+# startup. See https://developer.apple.com/library/archive/featuredarticles/Doxy
+# genXcode/_index.html for more information.
 # The default value is: NO.
 # This tag requires that the tag GENERATE_HTML is set to YES.
 
@@ -1197,7 +1321,7 @@ DOCSET_PUBLISHER_NAME  = Publisher
 # If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three
 # additional HTML index files: index.hhp, index.hhc, and index.hhk. The
 # index.hhp is a project file that can be read by Microsoft's HTML Help Workshop
-# (see: http://www.microsoft.com/en-us/download/details.aspx?id=21138) on
+# (see: https://www.microsoft.com/en-us/download/details.aspx?id=21138) on
 # Windows.
 #
 # The HTML Help Workshop contains a compiler that can convert all HTML output
@@ -1220,28 +1344,28 @@ GENERATE_HTMLHELP      = NO
 CHM_FILE               =
 
 # The HHC_LOCATION tag can be used to specify the location (absolute path
-# including file name) of the HTML help compiler ( hhc.exe). If non-empty
+# including file name) of the HTML help compiler (hhc.exe). If non-empty,
 # doxygen will try to run the HTML help compiler on the generated index.hhp.
 # The file has to be specified with full path.
 # This tag requires that the tag GENERATE_HTMLHELP is set to YES.
 
 HHC_LOCATION           =
 
-# The GENERATE_CHI flag controls if a separate .chi index file is generated (
-# YES) or that it should be included in the master .chm file ( NO).
+# The GENERATE_CHI flag controls if a separate .chi index file is generated
+# (YES) or that it should be included in the master .chm file (NO).
 # The default value is: NO.
 # This tag requires that the tag GENERATE_HTMLHELP is set to YES.
 
 GENERATE_CHI           = NO
 
-# The CHM_INDEX_ENCODING is used to encode HtmlHelp index ( hhk), content ( hhc)
+# The CHM_INDEX_ENCODING is used to encode HtmlHelp index (hhk), content (hhc)
 # and project file content.
 # This tag requires that the tag GENERATE_HTMLHELP is set to YES.
 
 CHM_INDEX_ENCODING     =
 
-# The BINARY_TOC flag controls whether a binary table of contents is generated (
-# YES) or a normal table of contents ( NO) in the .chm file. Furthermore it
+# The BINARY_TOC flag controls whether a binary table of contents is generated
+# (YES) or a normal table of contents (NO) in the .chm file. Furthermore it
 # enables the Previous and Next buttons.
 # The default value is: NO.
 # This tag requires that the tag GENERATE_HTMLHELP is set to YES.
@@ -1273,7 +1397,7 @@ QCH_FILE               =
 
 # The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help
 # Project output. For more information please see Qt Help Project / Namespace
-# (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#namespace).
+# (see: https://doc.qt.io/archives/qt-4.8/qthelpproject.html#namespace).
 # The default value is: org.doxygen.Project.
 # This tag requires that the tag GENERATE_QHP is set to YES.
 
@@ -1281,7 +1405,7 @@ QHP_NAMESPACE          = org.doxygen.Project
 
 # The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt
 # Help Project output. For more information please see Qt Help Project / Virtual
-# Folders (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#virtual-
+# Folders (see: https://doc.qt.io/archives/qt-4.8/qthelpproject.html#virtual-
 # folders).
 # The default value is: doc.
 # This tag requires that the tag GENERATE_QHP is set to YES.
@@ -1290,7 +1414,7 @@ QHP_VIRTUAL_FOLDER     = doc
 
 # If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom
 # filter to add. For more information please see Qt Help Project / Custom
-# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom-
+# Filters (see: https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-
 # filters).
 # This tag requires that the tag GENERATE_QHP is set to YES.
 
@@ -1298,7 +1422,7 @@ QHP_CUST_FILTER_NAME   =
 
 # The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the
 # custom filter to add. For more information please see Qt Help Project / Custom
-# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom-
+# Filters (see: https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-
 # filters).
 # This tag requires that the tag GENERATE_QHP is set to YES.
 
@@ -1306,7 +1430,7 @@ QHP_CUST_FILTER_ATTRS  =
 
 # The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this
 # project's filter section matches. Qt Help Project / Filter Attributes (see:
-# http://qt-project.org/doc/qt-4.8/qthelpproject.html#filter-attributes).
+# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#filter-attributes).
 # This tag requires that the tag GENERATE_QHP is set to YES.
 
 QHP_SECT_FILTER_ATTRS  =
@@ -1355,7 +1479,7 @@ DISABLE_INDEX          = NO
 # index structure (just like the one that is generated for HTML Help). For this
 # to work a browser that supports JavaScript, DHTML, CSS and frames is required
 # (i.e. any modern browser). Windows users are probably better off using the
-# HTML help feature. Via custom stylesheets (see HTML_EXTRA_STYLESHEET) one can
+# HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can
 # further fine-tune the look of the index. As an example, the default style
 # sheet generated by doxygen has an example that shows how to put an image at
 # the root of the tree instead of the PROJECT_NAME. Since the tree basically has
@@ -1364,7 +1488,7 @@ DISABLE_INDEX          = NO
 # The default value is: NO.
 # This tag requires that the tag GENERATE_HTML is set to YES.
 
-GENERATE_TREEVIEW      = NO
+GENERATE_TREEVIEW      = YES
 
 # The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that
 # doxygen will group on one line in the generated HTML documentation.
@@ -1383,7 +1507,7 @@ ENUM_VALUES_PER_LINE   = 4
 
 TREEVIEW_WIDTH         = 250
 
-# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open links to
+# If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to
 # external symbols imported via tag files in a separate window.
 # The default value is: NO.
 # This tag requires that the tag GENERATE_HTML is set to YES.
@@ -1399,7 +1523,7 @@ EXT_LINKS_IN_WINDOW    = NO
 
 FORMULA_FONTSIZE       = 10
 
-# Use the FORMULA_TRANPARENT tag to determine whether or not the images
+# Use the FORMULA_TRANSPARENT tag to determine whether or not the images
 # generated for formulas are transparent PNGs. Transparent PNGs are not
 # supported properly for IE 6.0, but are supported on all modern browsers.
 #
@@ -1410,9 +1534,15 @@ FORMULA_FONTSIZE       = 10
 
 FORMULA_TRANSPARENT    = YES
 
+# The FORMULA_MACROFILE can contain LaTeX \newcommand and \renewcommand commands
+# to create new LaTeX commands to be used in formulas as building blocks. See
+# the section "Including formulas" for details.
+
+FORMULA_MACROFILE      =
+
 # Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see
-# http://www.mathjax.org) which uses client side Javascript for the rendering
-# instead of using prerendered bitmaps. Use this if you do not have LaTeX
+# https://www.mathjax.org) which uses client side JavaScript for the rendering
+# instead of using pre-rendered bitmaps. Use this if you do not have LaTeX
 # installed or if you want to formulas look prettier in the HTML output. When
 # enabled you may also need to install MathJax separately and configure the path
 # to it using the MATHJAX_RELPATH option.
@@ -1438,8 +1568,8 @@ MATHJAX_FORMAT         = HTML-CSS
 # MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax
 # Content Delivery Network so you can quickly see the result without installing
 # MathJax. However, it is strongly recommended to install a local copy of
-# MathJax from http://www.mathjax.org before deployment.
-# The default value is: http://cdn.mathjax.org/mathjax/latest.
+# MathJax from https://www.mathjax.org before deployment.
+# The default value is: https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/.
 # This tag requires that the tag USE_MATHJAX is set to YES.
 
 MATHJAX_RELPATH        = http://cdn.mathjax.org/mathjax/latest
@@ -1481,7 +1611,7 @@ MATHJAX_CODEFILE       =
 SEARCHENGINE           = YES
 
 # When the SERVER_BASED_SEARCH tag is enabled the search engine will be
-# implemented using a web server instead of a web client using Javascript. There
+# implemented using a web server instead of a web client using JavaScript. There
 # are two flavors of web server based searching depending on the EXTERNAL_SEARCH
 # setting. When disabled, doxygen will generate a PHP script for searching and
 # an index file used by the script. When EXTERNAL_SEARCH is enabled the indexing
@@ -1498,9 +1628,9 @@ SERVER_BASED_SEARCH    = NO
 # external search engine pointed to by the SEARCHENGINE_URL option to obtain the
 # search results.
 #
-# Doxygen ships with an example indexer ( doxyindexer) and search engine
+# Doxygen ships with an example indexer (doxyindexer) and search engine
 # (doxysearch.cgi) which are based on the open source search engine library
-# Xapian (see: http://xapian.org/).
+# Xapian (see: https://xapian.org/).
 #
 # See the section "External Indexing and Searching" for details.
 # The default value is: NO.
@@ -1511,9 +1641,9 @@ EXTERNAL_SEARCH        = NO
 # The SEARCHENGINE_URL should point to a search engine hosted by a web server
 # which will return the search results when EXTERNAL_SEARCH is enabled.
 #
-# Doxygen ships with an example indexer ( doxyindexer) and search engine
+# Doxygen ships with an example indexer (doxyindexer) and search engine
 # (doxysearch.cgi) which are based on the open source search engine library
-# Xapian (see: http://xapian.org/). See the section "External Indexing and
+# Xapian (see: https://xapian.org/). See the section "External Indexing and
 # Searching" for details.
 # This tag requires that the tag SEARCHENGINE is set to YES.
 
@@ -1549,7 +1679,7 @@ EXTRA_SEARCH_MAPPINGS  =
 # Configuration options related to the LaTeX output
 #---------------------------------------------------------------------------
 
-# If the GENERATE_LATEX tag is set to YES doxygen will generate LaTeX output.
+# If the GENERATE_LATEX tag is set to YES, doxygen will generate LaTeX output.
 # The default value is: YES.
 
 GENERATE_LATEX         = NO
@@ -1565,22 +1695,36 @@ LATEX_OUTPUT           = latex
 # The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
 # invoked.
 #
-# Note that when enabling USE_PDFLATEX this option is only used for generating
-# bitmaps for formulas in the HTML output, but not in the Makefile that is
-# written to the output directory.
-# The default file is: latex.
+# Note that when not enabling USE_PDFLATEX the default is latex when enabling
+# USE_PDFLATEX the default is pdflatex and when in the later case latex is
+# chosen this is overwritten by pdflatex. For specific output languages the
+# default can have been set differently, this depends on the implementation of
+# the output language.
 # This tag requires that the tag GENERATE_LATEX is set to YES.
 
 LATEX_CMD_NAME         = latex
 
 # The MAKEINDEX_CMD_NAME tag can be used to specify the command name to generate
 # index for LaTeX.
+# Note: This tag is used in the Makefile / make.bat.
+# See also: LATEX_MAKEINDEX_CMD for the part in the generated output file
+# (.tex).
 # The default file is: makeindex.
 # This tag requires that the tag GENERATE_LATEX is set to YES.
 
 MAKEINDEX_CMD_NAME     = makeindex
 
-# If the COMPACT_LATEX tag is set to YES doxygen generates more compact LaTeX
+# The LATEX_MAKEINDEX_CMD tag can be used to specify the command name to
+# generate index for LaTeX. In case there is no backslash (\) as first character
+# it will be automatically added in the LaTeX code.
+# Note: This tag is used in the generated output file (.tex).
+# See also: MAKEINDEX_CMD_NAME for the part in the Makefile / make.bat.
+# The default value is: makeindex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_MAKEINDEX_CMD    = makeindex
+
+# If the COMPACT_LATEX tag is set to YES, doxygen generates more compact LaTeX
 # documents. This may be useful for small projects and may help to save some
 # trees in general.
 # The default value is: NO.
@@ -1598,9 +1742,12 @@ COMPACT_LATEX          = NO
 PAPER_TYPE             = a4
 
 # The EXTRA_PACKAGES tag can be used to specify one or more LaTeX package names
-# that should be included in the LaTeX output. To get the times font for
-# instance you can specify
-# EXTRA_PACKAGES=times
+# that should be included in the LaTeX output. The package can be specified just
+# by its name or with the correct syntax as to be used with the LaTeX
+# \usepackage command. To get the times font for instance you can specify :
+# EXTRA_PACKAGES=times or EXTRA_PACKAGES={times}
+# To use the option intlimits with the amsmath package you can specify:
+# EXTRA_PACKAGES=[intlimits]{amsmath}
 # If left blank no extra packages will be included.
 # This tag requires that the tag GENERATE_LATEX is set to YES.
 
@@ -1614,23 +1761,36 @@ EXTRA_PACKAGES         =
 #
 # Note: Only use a user-defined header if you know what you are doing! The
 # following commands have a special meaning inside the header: $title,
-# $datetime, $date, $doxygenversion, $projectname, $projectnumber. Doxygen will
-# replace them by respectively the title of the page, the current date and time,
-# only the current date, the version number of doxygen, the project name (see
-# PROJECT_NAME), or the project number (see PROJECT_NUMBER).
+# $datetime, $date, $doxygenversion, $projectname, $projectnumber,
+# $projectbrief, $projectlogo. Doxygen will replace $title with the empty
+# string, for the replacement values of the other commands the user is referred
+# to HTML_HEADER.
 # This tag requires that the tag GENERATE_LATEX is set to YES.
 
 LATEX_HEADER           =
 
 # The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for the
 # generated LaTeX document. The footer should contain everything after the last
-# chapter. If it is left blank doxygen will generate a standard footer.
+# chapter. If it is left blank doxygen will generate a standard footer. See
+# LATEX_HEADER for more information on how to generate a default footer and what
+# special commands can be used inside the footer.
 #
 # Note: Only use a user-defined footer if you know what you are doing!
 # This tag requires that the tag GENERATE_LATEX is set to YES.
 
 LATEX_FOOTER           =
 
+# The LATEX_EXTRA_STYLESHEET tag can be used to specify additional user-defined
+# LaTeX style sheets that are included after the standard style sheets created
+# by doxygen. Using this option one can overrule certain style aspects. Doxygen
+# will copy the style sheet files to the output directory.
+# Note: The order of the extra style sheet files is of importance (e.g. the last
+# style sheet in the list overrules the setting of the previous ones in the
+# list).
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_EXTRA_STYLESHEET =
+
 # The LATEX_EXTRA_FILES tag can be used to specify one or more extra images or
 # other source files which should be copied to the LATEX_OUTPUT output
 # directory. Note that the files will be copied as-is; there are no commands or
@@ -1648,8 +1808,8 @@ LATEX_EXTRA_FILES      =
 
 PDF_HYPERLINKS         = YES
 
-# If the LATEX_PDFLATEX tag is set to YES, doxygen will use pdflatex to generate
-# the PDF file directly from the LaTeX files. Set this option to YES to get a
+# If the USE_PDFLATEX tag is set to YES, doxygen will use pdflatex to generate
+# the PDF file directly from the LaTeX files. Set this option to YES, to get a
 # higher quality PDF documentation.
 # The default value is: YES.
 # This tag requires that the tag GENERATE_LATEX is set to YES.
@@ -1684,17 +1844,33 @@ LATEX_SOURCE_CODE      = NO
 
 # The LATEX_BIB_STYLE tag can be used to specify the style to use for the
 # bibliography, e.g. plainnat, or ieeetr. See
-# http://en.wikipedia.org/wiki/BibTeX and \cite for more info.
+# https://en.wikipedia.org/wiki/BibTeX and \cite for more info.
 # The default value is: plain.
 # This tag requires that the tag GENERATE_LATEX is set to YES.
 
 LATEX_BIB_STYLE        = plain
 
+# If the LATEX_TIMESTAMP tag is set to YES then the footer of each generated
+# page will contain the date and time when the page was generated. Setting this
+# to NO can help when comparing the output of multiple runs.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_TIMESTAMP        = NO
+
+# The LATEX_EMOJI_DIRECTORY tag is used to specify the (relative or absolute)
+# path from which the emoji images will be read. If a relative path is entered,
+# it will be relative to the LATEX_OUTPUT directory. If left blank the
+# LATEX_OUTPUT directory will be used.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_EMOJI_DIRECTORY  =
+
 #---------------------------------------------------------------------------
 # Configuration options related to the RTF output
 #---------------------------------------------------------------------------
 
-# If the GENERATE_RTF tag is set to YES doxygen will generate RTF output. The
+# If the GENERATE_RTF tag is set to YES, doxygen will generate RTF output. The
 # RTF output is optimized for Word 97 and may not look too pretty with other RTF
 # readers/editors.
 # The default value is: NO.
@@ -1709,7 +1885,7 @@ GENERATE_RTF           = NO
 
 RTF_OUTPUT             = rtf
 
-# If the COMPACT_RTF tag is set to YES doxygen generates more compact RTF
+# If the COMPACT_RTF tag is set to YES, doxygen generates more compact RTF
 # documents. This may be useful for small projects and may help to save some
 # trees in general.
 # The default value is: NO.
@@ -1729,9 +1905,9 @@ COMPACT_RTF            = NO
 
 RTF_HYPERLINKS         = NO
 
-# Load stylesheet definitions from file. Syntax is similar to doxygen's config
-# file, i.e. a series of assignments. You only have to provide replacements,
-# missing definitions are set to their default value.
+# Load stylesheet definitions from file. Syntax is similar to doxygen's
+# configuration file, i.e. a series of assignments. You only have to provide
+# replacements, missing definitions are set to their default value.
 #
 # See also section "Doxygen usage" for information on how to generate the
 # default style sheet that doxygen normally uses.
@@ -1740,17 +1916,27 @@ RTF_HYPERLINKS         = NO
 RTF_STYLESHEET_FILE    =
 
 # Set optional variables used in the generation of an RTF document. Syntax is
-# similar to doxygen's config file. A template extensions file can be generated
-# using doxygen -e rtf extensionFile.
+# similar to doxygen's configuration file. A template extensions file can be
+# generated using doxygen -e rtf extensionFile.
 # This tag requires that the tag GENERATE_RTF is set to YES.
 
 RTF_EXTENSIONS_FILE    =
 
+# If the RTF_SOURCE_CODE tag is set to YES then doxygen will include source code
+# with syntax highlighting in the RTF output.
+#
+# Note that which sources are shown also depends on other settings such as
+# SOURCE_BROWSER.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_SOURCE_CODE        = NO
+
 #---------------------------------------------------------------------------
 # Configuration options related to the man page output
 #---------------------------------------------------------------------------
 
-# If the GENERATE_MAN tag is set to YES doxygen will generate man pages for
+# If the GENERATE_MAN tag is set to YES, doxygen will generate man pages for
 # classes and files.
 # The default value is: NO.
 
@@ -1794,7 +1980,7 @@ MAN_LINKS              = NO
 # Configuration options related to the XML output
 #---------------------------------------------------------------------------
 
-# If the GENERATE_XML tag is set to YES doxygen will generate an XML file that
+# If the GENERATE_XML tag is set to YES, doxygen will generate an XML file that
 # captures the structure of the code including all documentation.
 # The default value is: NO.
 
@@ -1808,7 +1994,7 @@ GENERATE_XML           = NO
 
 XML_OUTPUT             = xml
 
-# If the XML_PROGRAMLISTING tag is set to YES doxygen will dump the program
+# If the XML_PROGRAMLISTING tag is set to YES, doxygen will dump the program
 # listings (including syntax highlighting and cross-referencing information) to
 # the XML output. Note that enabling this will significantly increase the size
 # of the XML output.
@@ -1817,11 +2003,18 @@ XML_OUTPUT             = xml
 
 XML_PROGRAMLISTING     = YES
 
+# If the XML_NS_MEMB_FILE_SCOPE tag is set to YES, doxygen will include
+# namespace members in file scope as well, matching the HTML output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_XML is set to YES.
+
+XML_NS_MEMB_FILE_SCOPE = NO
+
 #---------------------------------------------------------------------------
 # Configuration options related to the DOCBOOK output
 #---------------------------------------------------------------------------
 
-# If the GENERATE_DOCBOOK tag is set to YES doxygen will generate Docbook files
+# If the GENERATE_DOCBOOK tag is set to YES, doxygen will generate Docbook files
 # that can be used to generate PDF.
 # The default value is: NO.
 
@@ -1835,14 +2028,23 @@ GENERATE_DOCBOOK       = NO
 
 DOCBOOK_OUTPUT         = docbook
 
+# If the DOCBOOK_PROGRAMLISTING tag is set to YES, doxygen will include the
+# program listings (including syntax highlighting and cross-referencing
+# information) to the DOCBOOK output. Note that enabling this will significantly
+# increase the size of the DOCBOOK output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_DOCBOOK is set to YES.
+
+DOCBOOK_PROGRAMLISTING = NO
+
 #---------------------------------------------------------------------------
 # Configuration options for the AutoGen Definitions output
 #---------------------------------------------------------------------------
 
-# If the GENERATE_AUTOGEN_DEF tag is set to YES doxygen will generate an AutoGen
-# Definitions (see http://autogen.sf.net) file that captures the structure of
-# the code including all documentation. Note that this feature is still
-# experimental and incomplete at the moment.
+# If the GENERATE_AUTOGEN_DEF tag is set to YES, doxygen will generate an
+# AutoGen Definitions (see http://autogen.sourceforge.net/) file that captures
+# the structure of the code including all documentation. Note that this feature
+# is still experimental and incomplete at the moment.
 # The default value is: NO.
 
 GENERATE_AUTOGEN_DEF   = NO
@@ -1851,7 +2053,7 @@ GENERATE_AUTOGEN_DEF   = NO
 # Configuration options related to the Perl module output
 #---------------------------------------------------------------------------
 
-# If the GENERATE_PERLMOD tag is set to YES doxygen will generate a Perl module
+# If the GENERATE_PERLMOD tag is set to YES, doxygen will generate a Perl module
 # file that captures the structure of the code including all documentation.
 #
 # Note that this feature is still experimental and incomplete at the moment.
@@ -1859,7 +2061,7 @@ GENERATE_AUTOGEN_DEF   = NO
 
 GENERATE_PERLMOD       = NO
 
-# If the PERLMOD_LATEX tag is set to YES doxygen will generate the necessary
+# If the PERLMOD_LATEX tag is set to YES, doxygen will generate the necessary
 # Makefile rules, Perl scripts and LaTeX code to be able to generate PDF and DVI
 # output from the Perl module output.
 # The default value is: NO.
@@ -1867,9 +2069,9 @@ GENERATE_PERLMOD       = NO
 
 PERLMOD_LATEX          = NO
 
-# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be nicely
+# If the PERLMOD_PRETTY tag is set to YES, the Perl module output will be nicely
 # formatted so it can be parsed by a human reader. This is useful if you want to
-# understand what is going on. On the other hand, if this tag is set to NO the
+# understand what is going on. On the other hand, if this tag is set to NO, the
 # size of the Perl module output will be much smaller and Perl will parse it
 # just the same.
 # The default value is: YES.
@@ -1889,14 +2091,14 @@ PERLMOD_MAKEVAR_PREFIX =
 # Configuration options related to the preprocessor
 #---------------------------------------------------------------------------
 
-# If the ENABLE_PREPROCESSING tag is set to YES doxygen will evaluate all
+# If the ENABLE_PREPROCESSING tag is set to YES, doxygen will evaluate all
 # C-preprocessor directives found in the sources and include files.
 # The default value is: YES.
 
 ENABLE_PREPROCESSING   = YES
 
-# If the MACRO_EXPANSION tag is set to YES doxygen will expand all macro names
-# in the source code. If set to NO only conditional compilation will be
+# If the MACRO_EXPANSION tag is set to YES, doxygen will expand all macro names
+# in the source code. If set to NO, only conditional compilation will be
 # performed. Macro expansion can be done in a controlled way by setting
 # EXPAND_ONLY_PREDEF to YES.
 # The default value is: NO.
@@ -1912,7 +2114,7 @@ MACRO_EXPANSION        = YES
 
 EXPAND_ONLY_PREDEF     = NO
 
-# If the SEARCH_INCLUDES tag is set to YES the includes files in the
+# If the SEARCH_INCLUDES tag is set to YES, the include files in the
 # INCLUDE_PATH will be searched if a #include is found.
 # The default value is: YES.
 # This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
@@ -1988,37 +2190,32 @@ TAGFILES               =
 
 GENERATE_TAGFILE       =
 
-# If the ALLEXTERNALS tag is set to YES all external class will be listed in the
-# class index. If set to NO only the inherited external classes will be listed.
+# If the ALLEXTERNALS tag is set to YES, all external class will be listed in
+# the class index. If set to NO, only the inherited external classes will be
+# listed.
 # The default value is: NO.
 
 ALLEXTERNALS           = NO
 
-# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed in
-# the modules index. If set to NO, only the current project's groups will be
+# If the EXTERNAL_GROUPS tag is set to YES, all external groups will be listed
+# in the modules index. If set to NO, only the current project's groups will be
 # listed.
 # The default value is: YES.
 
 EXTERNAL_GROUPS        = YES
 
-# If the EXTERNAL_PAGES tag is set to YES all external pages will be listed in
+# If the EXTERNAL_PAGES tag is set to YES, all external pages will be listed in
 # the related pages index. If set to NO, only the current project's pages will
 # be listed.
 # The default value is: YES.
 
 EXTERNAL_PAGES         = YES
 
-# The PERL_PATH should be the absolute path and name of the perl script
-# interpreter (i.e. the result of 'which perl').
-# The default file (with absolute path) is: /usr/bin/perl.
-
-PERL_PATH              = /usr/bin/perl
-
 #---------------------------------------------------------------------------
 # Configuration options related to the dot tool
 #---------------------------------------------------------------------------
 
-# If the CLASS_DIAGRAMS tag is set to YES doxygen will generate a class diagram
+# If the CLASS_DIAGRAMS tag is set to YES, doxygen will generate a class diagram
 # (in HTML and LaTeX) for classes with base or super classes. Setting the tag to
 # NO turns the diagrams off. Note that this option also works with HAVE_DOT
 # disabled, but it is recommended to install and use dot, since it yields more
@@ -2027,15 +2224,6 @@ PERL_PATH              = /usr/bin/perl
 
 CLASS_DIAGRAMS         = YES
 
-# You can define message sequence charts within doxygen comments using the \msc
-# command. Doxygen will then run the mscgen tool (see:
-# http://www.mcternan.me.uk/mscgen/)) to produce the chart and insert it in the
-# documentation. The MSCGEN_PATH tag allows you to specify the directory where
-# the mscgen tool resides. If left empty the tool is assumed to be found in the
-# default search path.
-
-MSCGEN_PATH            =
-
 # You can include diagrams made with dia in doxygen documentation. Doxygen will
 # then run dia to produce the diagram and insert it in the documentation. The
 # DIA_PATH tag allows you to specify the directory where the dia binary resides.
@@ -2043,7 +2231,7 @@ MSCGEN_PATH            =
 
 DIA_PATH               =
 
-# If set to YES, the inheritance and collaboration graphs will hide inheritance
+# If set to YES the inheritance and collaboration graphs will hide inheritance
 # and usage relations if the target is undocumented or is not a class.
 # The default value is: YES.
 
@@ -2054,7 +2242,7 @@ HIDE_UNDOC_RELATIONS   = NO
 # http://www.graphviz.org/), a graph visualization toolkit from AT&T and Lucent
 # Bell Labs. The other options in this section have no effect if this option is
 # set to NO
-# The default value is: NO.
+# The default value is: YES.
 
 HAVE_DOT               = YES
 
@@ -2068,7 +2256,7 @@ HAVE_DOT               = YES
 
 DOT_NUM_THREADS        = 0
 
-# When you want a differently looking font n the dot files that doxygen
+# When you want a differently looking font in the dot files that doxygen
 # generates you can specify the font name using DOT_FONTNAME. You need to make
 # sure dot is able to find the font, which can be done by putting it in a
 # standard location or by setting the DOTFONTPATH environment variable or by
@@ -2116,7 +2304,7 @@ COLLABORATION_GRAPH    = YES
 
 GROUP_GRAPHS           = YES
 
-# If the UML_LOOK tag is set to YES doxygen will generate inheritance and
+# If the UML_LOOK tag is set to YES, doxygen will generate inheritance and
 # collaboration diagrams in a style similar to the OMG's Unified Modeling
 # Language.
 # The default value is: NO.
@@ -2168,7 +2356,8 @@ INCLUDED_BY_GRAPH      = YES
 #
 # Note that enabling this option will significantly increase the time of a run.
 # So in most cases it will be better to enable call graphs for selected
-# functions only using the \callgraph command.
+# functions only using the \callgraph command. Disabling a call graph can be
+# accomplished by means of the command \hidecallgraph.
 # The default value is: NO.
 # This tag requires that the tag HAVE_DOT is set to YES.
 
@@ -2179,7 +2368,8 @@ CALL_GRAPH             = YES
 #
 # Note that enabling this option will significantly increase the time of a run.
 # So in most cases it will be better to enable caller graphs for selected
-# functions only using the \callergraph command.
+# functions only using the \callergraph command. Disabling a caller graph can be
+# accomplished by means of the command \hidecallergraph.
 # The default value is: NO.
 # This tag requires that the tag HAVE_DOT is set to YES.
 
@@ -2202,11 +2392,17 @@ GRAPHICAL_HIERARCHY    = YES
 DIRECTORY_GRAPH        = YES
 
 # The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
-# generated by dot.
+# generated by dot. For an explanation of the image formats see the section
+# output formats in the documentation of the dot tool (Graphviz (see:
+# http://www.graphviz.org/)).
 # Note: If you choose svg you need to set HTML_FILE_EXTENSION to xhtml in order
 # to make the SVG files visible in IE 9+ (other browsers do not have this
 # requirement).
-# Possible values are: png, jpg, gif and svg.
+# Possible values are: png, png:cairo, png:cairo:cairo, png:cairo:gd, png:gd,
+# png:gd:gd, jpg, jpg:cairo, jpg:cairo:gd, jpg:gd, jpg:gd:gd, gif, gif:cairo,
+# gif:cairo:gd, gif:gd, gif:gd:gd, svg, png:gd, png:gd:gd, png:cairo,
+# png:cairo:gd, png:cairo:cairo, png:cairo:gdiplus, png:gdiplus and
+# png:gdiplus:gdiplus.
 # The default value is: png.
 # This tag requires that the tag HAVE_DOT is set to YES.
 
@@ -2249,6 +2445,24 @@ MSCFILE_DIRS           =
 
 DIAFILE_DIRS           =
 
+# When using plantuml, the PLANTUML_JAR_PATH tag should be used to specify the
+# path where java can find the plantuml.jar file. If left blank, it is assumed
+# PlantUML is not used or called during a preprocessing step. Doxygen will
+# generate a warning when it encounters a \startuml command in this case and
+# will not generate output for the diagram.
+
+PLANTUML_JAR_PATH      =
+
+# When using plantuml, the PLANTUML_CFG_FILE tag can be used to specify a
+# configuration file for plantuml.
+
+PLANTUML_CFG_FILE      =
+
+# When using plantuml, the specified paths are searched for files specified by
+# the !include statement in a plantuml block.
+
+PLANTUML_INCLUDE_PATH  =
+
 # The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of nodes
 # that will be shown in the graph. If the number of nodes in a graph becomes
 # larger than this value, doxygen will truncate the graph, which is visualized
@@ -2285,7 +2499,7 @@ MAX_DOT_GRAPH_DEPTH    = 0
 
 DOT_TRANSPARENT        = NO
 
-# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output
+# Set the DOT_MULTI_TARGETS tag to YES to allow dot to generate multiple output
 # files in one run (i.e. multiple -o and -T options on the command line). This
 # makes dot run faster, but since only newer versions of dot (>1.8.10) support
 # this, this feature is disabled by default.
@@ -2302,7 +2516,7 @@ DOT_MULTI_TARGETS      = NO
 
 GENERATE_LEGEND        = YES
 
-# If the DOT_CLEANUP tag is set to YES doxygen will remove the intermediate dot
+# If the DOT_CLEANUP tag is set to YES, doxygen will remove the intermediate dot
 # files that are used to generate the various graphs.
 # The default value is: YES.
 # This tag requires that the tag HAVE_DOT is set to YES.
diff --git a/python/vtk_00.py b/python/vtk_00.py
new file mode 100644 (file)
index 0000000..d7e8923
--- /dev/null
@@ -0,0 +1,37 @@
+#!/usr/bin/env python
+
+import vtk
+
+
+# arrow.py adapted from the C++ vtk examples and translated to python.
+
+def main():
+    colors = vtk.vtkNamedColors()
+
+    arrowSource = vtk.vtkArrowSource()
+    # arrowSource.SetShaftRadius(0.01)
+    # arrowSource.SetTipLength(.9)
+
+    # Create a mapper and actor
+    mapper = vtk.vtkPolyDataMapper()
+    mapper.SetInputConnection(arrowSource.GetOutputPort())
+    actor = vtk.vtkActor()
+    actor.SetMapper(mapper)
+
+    # Visualize
+    renderer = vtk.vtkRenderer()
+    renderWindow = vtk.vtkRenderWindow()
+    renderWindow.SetWindowName("MMD")
+    renderWindow.AddRenderer(renderer)
+    renderWindowInteractor = vtk.vtkRenderWindowInteractor()
+    renderWindowInteractor.SetRenderWindow(renderWindow)
+
+    renderer.AddActor(actor)
+    renderer.SetBackground(colors.GetColor3d("MidnightBlue"))
+
+    renderWindow.Render()
+    renderWindowInteractor.Start()
+
+
+if __name__ == "__main__":
+    main()
diff --git a/python/vtk_01.py b/python/vtk_01.py
new file mode 100644 (file)
index 0000000..a19ea14
--- /dev/null
@@ -0,0 +1,130 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+import vtk
+
+'''
+There are two alternative ways to apply the transform.
+ 1) Use vtkTransformPolyDataFilter to create a new transformed polydata.
+    This method is useful if the transformed polydata is needed
+      later in the pipeline
+    To do this, set USER_MATRIX = True
+ 2) Apply the transform directly to the actor using vtkProp3D's SetUserMatrix.
+    No new data is produced.
+    To do this, set USER_MATRIX = False
+'''
+USER_MATRIX = True
+
+
+def main():
+    colors = vtk.vtkNamedColors()
+
+    # Set the background color.
+    colors.SetColor("BkgColor", [26, 51, 77, 255])
+
+
+    # Create an arrow.
+    arrowSource = vtk.vtkArrowSource()
+
+    # Generate a random start and end point
+    startPoint = [0] * 3
+    endPoint = [0] * 3
+    rng = vtk.vtkMinimalStandardRandomSequence()
+    rng.SetSeed(8775070)  # For testing.
+    for i in range(0, 3):
+        rng.Next()
+        startPoint[i] = rng.GetRangeValue(-10, 10)
+        rng.Next()
+        endPoint[i] = rng.GetRangeValue(-10, 10)
+
+    # Compute a basis
+    normalizedX = [0] * 3
+    normalizedY = [0] * 3
+    normalizedZ = [0] * 3
+
+    # The X axis is a vector from start to end
+    vtk.vtkMath.Subtract(endPoint, startPoint, normalizedX)
+    length = vtk.vtkMath.Norm(normalizedX)
+    vtk.vtkMath.Normalize(normalizedX)
+
+    # The Z axis is an arbitrary vector cross X
+    arbitrary = [0] * 3
+    for i in range(0, 3):
+        rng.Next()
+        arbitrary[i] = rng.GetRangeValue(-10, 10)
+    vtk.vtkMath.Cross(normalizedX, arbitrary, normalizedZ)
+    vtk.vtkMath.Normalize(normalizedZ)
+
+    # The Y axis is Z cross X
+    vtk.vtkMath.Cross(normalizedZ, normalizedX, normalizedY)
+    matrix = vtk.vtkMatrix4x4()
+
+    # Create the direction cosine matrix
+    matrix.Identity()
+    for i in range(0, 3):
+        matrix.SetElement(i, 0, normalizedX[i])
+        matrix.SetElement(i, 1, normalizedY[i])
+        matrix.SetElement(i, 2, normalizedZ[i])
+
+    # Apply the transforms
+    transform = vtk.vtkTransform()
+    transform.Translate(startPoint)
+    transform.Concatenate(matrix)
+    transform.Scale(length, length, length)
+
+    # Transform the polydata
+    transformPD = vtk.vtkTransformPolyDataFilter()
+    transformPD.SetTransform(transform)
+    transformPD.SetInputConnection(arrowSource.GetOutputPort())
+
+    # Create a mapper and actor for the arrow
+    mapper = vtk.vtkPolyDataMapper()
+    actor = vtk.vtkActor()
+    if USER_MATRIX:
+        mapper.SetInputConnection(arrowSource.GetOutputPort())
+        actor.SetUserMatrix(transform.GetMatrix())
+    else:
+        mapper.SetInputConnection(transformPD.GetOutputPort())
+    actor.SetMapper(mapper)
+    actor.GetProperty().SetColor(colors.GetColor3d("Cyan"))
+
+    # Create spheres for start and end point
+    sphereStartSource = vtk.vtkSphereSource()
+    sphereStartSource.SetCenter(startPoint)
+    sphereStartSource.SetRadius(0.8)
+    sphereStartMapper = vtk.vtkPolyDataMapper()
+    sphereStartMapper.SetInputConnection(sphereStartSource.GetOutputPort())
+    sphereStart = vtk.vtkActor()
+    sphereStart.SetMapper(sphereStartMapper)
+    sphereStart.GetProperty().SetColor(colors.GetColor3d("Yellow"))
+
+    sphereEndSource = vtk.vtkSphereSource()
+    sphereEndSource.SetCenter(endPoint)
+    sphereEndSource.SetRadius(0.8)
+    sphereEndMapper = vtk.vtkPolyDataMapper()
+    sphereEndMapper.SetInputConnection(sphereEndSource.GetOutputPort())
+    sphereEnd = vtk.vtkActor()
+    sphereEnd.SetMapper(sphereEndMapper)
+    sphereEnd.GetProperty().SetColor(colors.GetColor3d("Magenta"))
+
+    # Create a renderer, render window, and interactor
+    renderer = vtk.vtkRenderer()
+    renderWindow = vtk.vtkRenderWindow()
+    renderWindow.SetWindowName("Oriented Arrow")
+    renderWindow.AddRenderer(renderer)
+    renderWindowInteractor = vtk.vtkRenderWindowInteractor()
+    renderWindowInteractor.SetRenderWindow(renderWindow)
+
+    # Add the actor to the scene
+    renderer.AddActor(actor)
+    renderer.AddActor(sphereStart)
+    renderer.AddActor(sphereEnd)
+    renderer.SetBackground(colors.GetColor3d("BkgColor"))
+
+    # Render and interact
+    renderWindow.Render()
+    renderWindowInteractor.Start()
+
+
+if __name__ == '__main__':
+    main()
index 1e868ba..8a52fd6 100644 (file)
@@ -54,6 +54,16 @@ connectivity_int  hexaedron_localSegmentsListNumbers[HEXAHEDRON_SEGMENTS]={ \
   SEGMENTVERTEX \
 };
 
+
+/*!
+ * \fn void rotate(connectivity_int arr[], connectivity_int n)
+ * \brief Circular displacement 
+ * \param arr { vector  }
+ * \param n { Offset number }
+ * \return arr {vector with inverted values}
+ * 
+ * Circular displacement of the elements of a vector arr of n elements
+ */
 void rotate(connectivity_int arr[], connectivity_int n)
 {
   connectivity_int x = arr[0], i;
@@ -64,8 +74,8 @@ void rotate(connectivity_int arr[], connectivity_int n)
 
 clock_t startFunction(const char * functionName)
 {
-  affiche("%-40s :", functionName);
-
+  affiche("%-40s : Start\n", functionName);
+  
   return clock();
 }
 
@@ -73,9 +83,9 @@ void endFunction(const char * functionName, clock_t t)
 {
   t = clock() - t;
   double time_taken = ((double)t) / CLOCKS_PER_SEC; // in seconds
-
-  affiche(" %f seconds to execute \n", time_taken);
-
+  
+  affiche("%-40s : %f seconds to execute\n", functionName, time_taken);
+  
 }
 
 void removeDuplicates(connectivity_int arr[], connectivity_int * size)
@@ -92,10 +102,10 @@ void removeDuplicates(connectivity_int arr[], connectivity_int * size)
                 {
                   arr[k] = arr[k + 1];
                 }
-
+              
               /* Decrement size after removing duplicate element */
               (*size)--;
-
+              
               /* If shifting of elements occur then don't increment j */
               j--;
             }
@@ -106,7 +116,7 @@ void removeDuplicates(connectivity_int arr[], connectivity_int * size)
 void sortListConnectivity(connectivity_int a[], connectivity_int  n)
 {
   connectivity_int tmp = 0;
-
+  
   for (connectivity_int i = 0; i < n; i++)                     //Loop for ascending ordering
     {
       for (connectivity_int j = 0; j < n; j++)             //Loop for comparing other values
@@ -119,21 +129,21 @@ void sortListConnectivity(connectivity_int a[], connectivity_int  n)
             }
         }
     }
-
+  
 }
 
 
 void sortList(connectivity_int ** vector,connectivity_int vectorSize, connectivity_int position)
 {
-
+  
   for(connectivity_int ii=0;ii<position;ii++)
     rotate(*vector, vectorSize);
-
+  
 }
 
 long findInList(connectivity_int * vector,connectivity_int vectorSize, connectivity_int value)
 {
-
+  
   for(connectivity_int ii=0;ii<vectorSize;ii++)
     {
       if(vector[ii]==value)
@@ -141,15 +151,15 @@ long findInList(connectivity_int * vector,connectivity_int vectorSize, connectiv
           return (long)(ii);
         }
     }
-
+  
   return -1;
-
+  
 }
 connectivity_int findMinInList(connectivity_int * vector,connectivity_int vectorSize)
 {
-
+  
   connectivity_int              position=0;
-
+  
   for(connectivity_int ii=1;ii<vectorSize;ii++)
     {
       if(vector[position]>vector[ii])
@@ -157,7 +167,7 @@ connectivity_int findMinInList(connectivity_int * vector,connectivity_int vector
           position=ii;
         }
     }
-
+  
   return(position);
 }
 
@@ -165,35 +175,35 @@ connectivity_int findMinInList(connectivity_int * vector,connectivity_int vector
 void invertListSort(connectivity_int ** result,connectivity_int * vector,connectivity_int vectorSize)
 {
   connectivity_int position = 0;
-
+  
   for(connectivity_int ii=0;ii<vectorSize;ii++)
     (*result)[ii] = vector[vectorSize -1 - ii];
   position = findMinInList((*result),vectorSize);
   sortList(result, vectorSize, position);
-
+  
 }
 
 void findListFromList(connectivity_int ** matrix, connectivity_int * matrixRowNumbers, connectivity_int size, connectivity_int * whatToFind, connectivity_int sizewhatToFind )
 {
-
+  
   //connectivity_int tmp = 0;
-
+  
   for (connectivity_int i = 0; i < size; i++)
     {
       if(findInList(matrix[i],matrixRowNumbers[i], whatToFind[0])!=-1)
         {
           for (connectivity_int j = 0; j < matrixRowNumbers[i]; j++)
             {
-
+              
               for (connectivity_int k=1;k<sizewhatToFind;k++)
                 {
-
+                  
                 }
-
+              
             }
         }
     }
-
+  
 }
 
 
@@ -202,10 +212,10 @@ void findListFromList(connectivity_int ** matrix, connectivity_int * matrixRowNu
 //#define allocMemoryForMatrix(x,y,z) _Generic((x), dataType: allocMemoryForMatrixDataType, char: allocMemoryForMatrixDataType)(x,y,z);
 void allocMemoryForMatrixDataType(dataType *** result, connectivity_int N, connectivity_int M )
 {
-
+  
   //    affiche("\n");
   connectivity_int sum=0;
-
+  
   (*result) = (dataType **) malloc(N * sizeof(dataType *));
   if((*result)==NULL)
     {
@@ -223,68 +233,68 @@ void allocMemoryForMatrixDataType(dataType *** result, connectivity_int N, conne
           exit(1);
         }
     }
-
+  
   sum = sizeof(dataType *)*N + M * sizeof(dataType) ;
-
+  
   affiche("%-40s : (%10ld bytes) : (%8.2f Mo)\n","Allocated Memory",sum, sum/1024000.0);
-
-
-
+  
+  
+  
 }
 
 //#define allocMemoryForMatrix(x,y,z) _Generic((x), dataType: allocMemoryForMatrixDataType, char: allocMemoryForMatrixDataType)(x,y,z);
 void allocMemoryForVectorDataType(dataType ** result, connectivity_int N )
 {
-
+  
   //    affiche("\n");
   connectivity_int sum=0;
-
+  
   (*result) = (dataType *) malloc(N * sizeof(dataType ));
   if((*result)==NULL)
     {
       debug_print("ERROR : %s %d %s\n",__FUNCTION__, __LINE__, __FILE__);
       exit(1);
     }
-
+  
   sum = sizeof(dataType )*N ;
-
+  
   affiche("%-40s : (%10ld bytes) : (%8.2f Mo)\n","Allocated Memory",sum, sum/1024000.0);
-
-
-
+  
+  
+  
 }
 
 
 //#define allocMemoryForMatrix(x,y,z) _Generic((x), dataType: allocMemoryForMatrixDataType, char: allocMemoryForMatrixDataType)(x,y,z);
 void allocMemoryForVectorConnectivity(connectivity_int ** result, connectivity_int N )
 {
-
+  
   //    affiche("\n");
   connectivity_int sum=0;
-
+  
   (*result) = (connectivity_int *) malloc(N * sizeof(connectivity_int ));
   if((*result)==NULL)
     {
       debug_print("ERROR : %s %d %s\n",__FUNCTION__, __LINE__, __FILE__);
       exit(1);
     }
-
+  
   sum = sizeof(connectivity_int )*N ;
-
+  
   affiche("%-40s : (%10ld bytes) : (%8.2f Mo)\n","Allocated Memory",sum, sum/1024000.0);
-
-
-
+  
+  
+  
 }
 
 
 //#define allocMemoryForMatrix(x,y,z) _Generic((x), dataType: allocMemoryForMatrixDataType, char: allocMemoryForMatrixDataType)(x,y,z);
 void allocMemoryForMatrixConnectivity(connectivity_int *** result, connectivity_int N, connectivity_int M )
 {
-
+  
   //    affiche("\n");
   connectivity_int sum=0;
-
+  
   (*result) = (connectivity_int **) malloc(N * sizeof(connectivity_int *));
   if((*result)==NULL)
     {
@@ -302,21 +312,21 @@ void allocMemoryForMatrixConnectivity(connectivity_int *** result, connectivity_
           exit(1);
         }
     }
-
+  
   sum = sizeof(connectivity_int *)*N + M * sizeof(connectivity_int) ;
-
+  
   affiche("%-40s : (%10ld bytes) : (%8.2f Mo)\n","Allocated Memory",sum, sum/1024000.0);
-
+  
 }
 
 
 void allocMemoryForSpecialMatrixConnectivity(connectivity_int *** result, connectivity_int N, connectivity_short *M )
 {
-
+  
   connectivity_int sum=0;
-
+  
   //    affiche("\n");
-
+  
   (*result) = (connectivity_int **) malloc(N * sizeof(connectivity_int *));
   if((*result)==NULL)
     {
@@ -328,7 +338,7 @@ void allocMemoryForSpecialMatrixConnectivity(connectivity_int *** result, connec
       (*result)[i] = (connectivity_int *) malloc(M[i] * sizeof(connectivity_int));
       memset((*result)[i], 0.0, M[i]*sizeof(connectivity_int));
       sum+=M[i] * sizeof(connectivity_int);
-
+      
       if((*result)[i]==NULL) {
           debug_print("ERROR : %s %d %s\n",__FUNCTION__, __LINE__, __FILE__);
           debug_print("i=%ld M=%d N=%ld  \n",i, M[i], N);
@@ -336,125 +346,125 @@ void allocMemoryForSpecialMatrixConnectivity(connectivity_int *** result, connec
         }
     }
   sum = sizeof(connectivity_int *)*N + sum ;
-
+  
   affiche("%-40s : (%10ld bytes) : (%8.2f Mo)\n","Allocated Memory",sum, sum/1024000.0);
-
+  
 }
 
 
-void allocMemory(struct primalMesh * myPrimalMesh)
-{
-  clock_t t=startFunction(__FUNCTION__);
+//void allocMemory(struct primalMesh * myPrimalMesh)
+//{
+//  clock_t t=startFunction(__FUNCTION__);
 
 
 
-  //    myPrimalMesh->vertex = (dataType **) malloc(myPrimalMesh->vertexNumber * sizeof(dataType *));
-  //    //ERROR_TEST( (myPrimalMesh->vertex) );
-  //    for(connectivity_int i=0; i<myPrimalMesh->vertexNumber; i++)
-  //    {
-  //        myPrimalMesh->vertex[i] = (dataType *) malloc(DIM3D * sizeof(dataType));
-  //        memset(myPrimalMesh->vertex[i], 0.0, DIM3D*sizeof(dataType));
-  //    }
+//    myPrimalMesh->vertex = (dataType **) malloc(myPrimalMesh->vertexNumber * sizeof(dataType *));
+//    //ERROR_TEST( (myPrimalMesh->vertex) );
+//    for(connectivity_int i=0; i<myPrimalMesh->vertexNumber; i++)
+//    {
+//        myPrimalMesh->vertex[i] = (dataType *) malloc(DIM3D * sizeof(dataType));
+//        memset(myPrimalMesh->vertex[i], 0.0, DIM3D*sizeof(dataType));
+//    }
 
-  //    myPrimalMesh->cellToVertexNumber = (connectivity_short *) malloc(myPrimalMesh->cellNumber * sizeof(connectivity_short));
+//    myPrimalMesh->cellToVertexNumber = (connectivity_short *) malloc(myPrimalMesh->cellNumber * sizeof(connectivity_short));
 
 
 
-  //    myPrimalMesh->faceToVertexNumber = (connectivity_short *) malloc(myPrimalMesh->faceNumber * sizeof(connectivity_short));
+//    myPrimalMesh->faceToVertexNumber = (connectivity_short *) malloc(myPrimalMesh->faceNumber * sizeof(connectivity_short));
 
 
-  //    myPrimalMesh->faceCentres = (dataType **) malloc(myPrimalMesh->faceNumber * sizeof(dataType *));
-  //    for(connectivity_int i=0; i<myPrimalMesh->faceNumber; i++)
-  //    {
-  //        myPrimalMesh->faceCentres[i] = (dataType *) malloc(DIM3D * sizeof(dataType));
-  //        memset(myPrimalMesh->faceCentres[i], 0.0, DIM3D*sizeof(dataType));
-  //    }
+//    myPrimalMesh->faceCentres = (dataType **) malloc(myPrimalMesh->faceNumber * sizeof(dataType *));
+//    for(connectivity_int i=0; i<myPrimalMesh->faceNumber; i++)
+//    {
+//        myPrimalMesh->faceCentres[i] = (dataType *) malloc(DIM3D * sizeof(dataType));
+//        memset(myPrimalMesh->faceCentres[i], 0.0, DIM3D*sizeof(dataType));
+//    }
 
-  //    myPrimalMesh->faceAreas = (dataType **) malloc(myPrimalMesh->faceNumber * sizeof(dataType*));
-  //    for(connectivity_int i=0; i<myPrimalMesh->faceNumber; i++)
-  //    {
-  //        myPrimalMesh->faceAreas[i] = (dataType *) malloc(DIM3D * sizeof(dataType));
-  //        memset(myPrimalMesh->faceAreas[i], 0.0, DIM3D*sizeof(dataType));
-  //    }
+//    myPrimalMesh->faceAreas = (dataType **) malloc(myPrimalMesh->faceNumber * sizeof(dataType*));
+//    for(connectivity_int i=0; i<myPrimalMesh->faceNumber; i++)
+//    {
+//        myPrimalMesh->faceAreas[i] = (dataType *) malloc(DIM3D * sizeof(dataType));
+//        memset(myPrimalMesh->faceAreas[i], 0.0, DIM3D*sizeof(dataType));
+//    }
 
-  //    myPrimalMesh->volumeCentroid = (dataType **) malloc(myPrimalMesh->cellNumber * sizeof(dataType*));
-  //    for(connectivity_int i=0; i<myPrimalMesh->cellNumber; i++)
-  //    {
-  //        myPrimalMesh->volumeCentroid[i] = (dataType *) malloc(DIM3D * sizeof(dataType));
-  //        memset(myPrimalMesh->volumeCentroid[i], 0.0, DIM3D*sizeof(dataType));
-  //    }
+//    myPrimalMesh->volumeCentroid = (dataType **) malloc(myPrimalMesh->cellNumber * sizeof(dataType*));
+//    for(connectivity_int i=0; i<myPrimalMesh->cellNumber; i++)
+//    {
+//        myPrimalMesh->volumeCentroid[i] = (dataType *) malloc(DIM3D * sizeof(dataType));
+//        memset(myPrimalMesh->volumeCentroid[i], 0.0, DIM3D*sizeof(dataType));
+//    }
 
-  //    //    myPrimalMesh->cellToFacesNumber = (connectivity_short*) malloc(myPrimalMesh->cellNumber * sizeof(connectivity_short));
+//    //    myPrimalMesh->cellToFacesNumber = (connectivity_short*) malloc(myPrimalMesh->cellNumber * sizeof(connectivity_short));
 
 
-  //    myPrimalMesh->volume  = (dataType *) malloc(myPrimalMesh->cellNumber * sizeof(dataType));
-  //    memset(myPrimalMesh->volume, 0.0, myPrimalMesh->cellNumber*sizeof(dataType));
+//    myPrimalMesh->volume  = (dataType *) malloc(myPrimalMesh->cellNumber * sizeof(dataType));
+//    memset(myPrimalMesh->volume, 0.0, myPrimalMesh->cellNumber*sizeof(dataType));
 
 
 
-  //    myPrimalMesh->segmentToVertex = (connectivity_int **) malloc(myPrimalMesh->segmentNumber * sizeof(connectivity_int*));
-  //    for(connectivity_int i=0; i<myPrimalMesh->segmentNumber; i++)
-  //    {
-  //        myPrimalMesh->segmentToVertex[i] = (connectivity_int *) malloc( SEGMENTVERTEX * sizeof(connectivity_int));
-  //        memset(myPrimalMesh->segmentToVertex[i], 0.0, SEGMENTVERTEX*sizeof(connectivity_int));
-  //    }
+//    myPrimalMesh->segmentToVertex = (connectivity_int **) malloc(myPrimalMesh->segmentNumber * sizeof(connectivity_int*));
+//    for(connectivity_int i=0; i<myPrimalMesh->segmentNumber; i++)
+//    {
+//        myPrimalMesh->segmentToVertex[i] = (connectivity_int *) malloc( SEGMENTVERTEX * sizeof(connectivity_int));
+//        memset(myPrimalMesh->segmentToVertex[i], 0.0, SEGMENTVERTEX*sizeof(connectivity_int));
+//    }
 
 
 
-  //    myPrimalMesh->faceToSegments = (connectivity_int **) malloc(myPrimalMesh->faceNumber * sizeof(connectivity_int*));
-  //    for(connectivity_int i=0; i<myPrimalMesh->faceNumber; i++)
-  //    {
-  //        myPrimalMesh->faceToSegments[i] = (connectivity_int *) malloc( QUAD * sizeof(connectivity_int));
-  //        memset(myPrimalMesh->faceToSegments[i], 0.0, QUAD*sizeof(connectivity_int));
-  //    }
+//    myPrimalMesh->faceToSegments = (connectivity_int **) malloc(myPrimalMesh->faceNumber * sizeof(connectivity_int*));
+//    for(connectivity_int i=0; i<myPrimalMesh->faceNumber; i++)
+//    {
+//        myPrimalMesh->faceToSegments[i] = (connectivity_int *) malloc( QUAD * sizeof(connectivity_int));
+//        memset(myPrimalMesh->faceToSegments[i], 0.0, QUAD*sizeof(connectivity_int));
+//    }
 
-  //    myPrimalMesh->vertexToSegmentNumber  = (connectivity_short *) malloc(myPrimalMesh->vertexNumber * sizeof(connectivity_short));
-  //    memset(myPrimalMesh->vertexToSegmentNumber, 0.0, myPrimalMesh->vertexNumber*sizeof(connectivity_short));
+//    myPrimalMesh->vertexToSegmentNumber  = (connectivity_short *) malloc(myPrimalMesh->vertexNumber * sizeof(connectivity_short));
+//    memset(myPrimalMesh->vertexToSegmentNumber, 0.0, myPrimalMesh->vertexNumber*sizeof(connectivity_short));
 
 
-  endFunction(__FUNCTION__, t);
+//  endFunction(__FUNCTION__, t);
 
-}
+//}
 
 
 
-void allocMemory2(struct primalMesh * myPrimalMesh)
-{
-  clock_t t=startFunction(__FUNCTION__);
+//void allocMemory2(struct primalMesh * myPrimalMesh)
+//{
+//  clock_t t=startFunction(__FUNCTION__);
 
 
-  //    myPrimalMesh->cellToVertex = (connectivity_int **) malloc(myPrimalMesh->cellNumber * sizeof(connectivity_int *));
-  //    for(connectivity_int i=0; i<myPrimalMesh->cellNumber; i++)
-  //    {
-  //        myPrimalMesh->cellToVertex[i] = (connectivity_int *) malloc(myPrimalMesh->cellToVertexNumber[i] * sizeof(connectivity_int));
-  //        memset(myPrimalMesh->cellToVertex[i], 0, myPrimalMesh->cellToVertexNumber[i]*sizeof(connectivity_int));
-  //    }
+//    myPrimalMesh->cellToVertex = (connectivity_int **) malloc(myPrimalMesh->cellNumber * sizeof(connectivity_int *));
+//    for(connectivity_int i=0; i<myPrimalMesh->cellNumber; i++)
+//    {
+//        myPrimalMesh->cellToVertex[i] = (connectivity_int *) malloc(myPrimalMesh->cellToVertexNumber[i] * sizeof(connectivity_int));
+//        memset(myPrimalMesh->cellToVertex[i], 0, myPrimalMesh->cellToVertexNumber[i]*sizeof(connectivity_int));
+//    }
 
-  //    myPrimalMesh->faceToVertex = (connectivity_int **) malloc(myPrimalMesh->faceNumber * sizeof(connectivity_int *));
-  //    for(connectivity_int i=0; i<myPrimalMesh->faceNumber; i++)
-  //    {
-  //        myPrimalMesh->faceToVertex[i] = (connectivity_int *) malloc(myPrimalMesh->faceToVertexNumber[i] * sizeof(connectivity_int));
-  //        memset(myPrimalMesh->faceToVertex[i], 0, myPrimalMesh->faceToVertexNumber[i]*sizeof(connectivity_int));
-  //    }
+//    myPrimalMesh->faceToVertex = (connectivity_int **) malloc(myPrimalMesh->faceNumber * sizeof(connectivity_int *));
+//    for(connectivity_int i=0; i<myPrimalMesh->faceNumber; i++)
+//    {
+//        myPrimalMesh->faceToVertex[i] = (connectivity_int *) malloc(myPrimalMesh->faceToVertexNumber[i] * sizeof(connectivity_int));
+//        memset(myPrimalMesh->faceToVertex[i], 0, myPrimalMesh->faceToVertexNumber[i]*sizeof(connectivity_int));
+//    }
 
-  //    myPrimalMesh->cellToFaces = (connectivity_int **) malloc(myPrimalMesh->cellNumber * sizeof(connectivity_int *));
-  //    for(connectivity_int i=0; i<myPrimalMesh->cellNumber; i++)
-  //    {
-  //        myPrimalMesh->cellToFaces[i] = (connectivity_int *) malloc(myPrimalMesh->cellToFacesNumber[i] * sizeof(connectivity_int));
-  //        memset(myPrimalMesh->cellToFaces[i], 0, myPrimalMesh->cellToFacesNumber[i]*sizeof(connectivity_int));
-  //    }
+//    myPrimalMesh->cellToFaces = (connectivity_int **) malloc(myPrimalMesh->cellNumber * sizeof(connectivity_int *));
+//    for(connectivity_int i=0; i<myPrimalMesh->cellNumber; i++)
+//    {
+//        myPrimalMesh->cellToFaces[i] = (connectivity_int *) malloc(myPrimalMesh->cellToFacesNumber[i] * sizeof(connectivity_int));
+//        memset(myPrimalMesh->cellToFaces[i], 0, myPrimalMesh->cellToFacesNumber[i]*sizeof(connectivity_int));
+//    }
 
 
 
-  endFunction(__FUNCTION__, t);
+//  endFunction(__FUNCTION__, t);
 
-}
+//}
 
 void freeMemory(struct primalMesh * myPrimalMesh)
 {
   clock_t t=startFunction(__FUNCTION__);
-
-
+  
+  
   if(myPrimalMesh->vertex!=NULL){
       for(connectivity_int i=0; i<myPrimalMesh->vertexNumber; i++)
         {
@@ -463,11 +473,11 @@ void freeMemory(struct primalMesh * myPrimalMesh)
         }
       free(myPrimalMesh->vertex);
     }
-
+  
   if(myPrimalMesh->cellToVertexNumber!=NULL){
       free(myPrimalMesh->cellToVertexNumber);
     }
-
+  
   if(myPrimalMesh->cellToVertex!=NULL){
       for(connectivity_int i=0; i<myPrimalMesh->cellNumber; i++)
         {
@@ -476,7 +486,7 @@ void freeMemory(struct primalMesh * myPrimalMesh)
         }
       free(myPrimalMesh->cellToVertex);
     }
-
+  
   if(myPrimalMesh->faceToVertex!=NULL){
       for(connectivity_int i=0; i<myPrimalMesh->faceNumber; i++)
         {
@@ -485,11 +495,11 @@ void freeMemory(struct primalMesh * myPrimalMesh)
         }
       free(myPrimalMesh->faceToVertex);
     }
-
+  
   if(myPrimalMesh->faceToVertexNumber!=NULL){
       free(myPrimalMesh->faceToVertexNumber);
     }
-
+  
   if(myPrimalMesh->faceCentres!=NULL){
       for(connectivity_int i=0; i<myPrimalMesh->faceNumber; i++)
         {
@@ -498,8 +508,8 @@ void freeMemory(struct primalMesh * myPrimalMesh)
         }
       free(myPrimalMesh->faceCentres);
     }
-
-
+  
+  
   if(myPrimalMesh->faceAreas!=NULL){
       for(connectivity_int i=0; i<myPrimalMesh->faceNumber; i++)
         {
@@ -508,7 +518,7 @@ void freeMemory(struct primalMesh * myPrimalMesh)
         }
       free(myPrimalMesh->faceAreas);
     }
-
+  
   if(myPrimalMesh->cellToFaces!=NULL){
       for(connectivity_int i=0; i<myPrimalMesh->cellNumber; i++)
         {
@@ -517,7 +527,7 @@ void freeMemory(struct primalMesh * myPrimalMesh)
         }
       free(myPrimalMesh->cellToFaces);
     }
-
+  
   if(myPrimalMesh->volumeCentroid!=NULL){
       for(connectivity_int i=0; i<myPrimalMesh->cellNumber; i++)
         {
@@ -526,16 +536,16 @@ void freeMemory(struct primalMesh * myPrimalMesh)
         }
       free(myPrimalMesh->volumeCentroid);
     }
-
+  
   if(myPrimalMesh->cellToFacesNumber!=NULL){
       free(myPrimalMesh->cellToFacesNumber);
     }
-
+  
   if(myPrimalMesh->volume!=NULL){
       free(myPrimalMesh->volume);
     }
-
-
+  
+  
   //  if(myPrimalMesh->segmentToVertex!=NULL){
   //      for(connectivity_int i=0; i<myPrimalMesh->segmentNumber; i++)
   //        {
@@ -544,7 +554,7 @@ void freeMemory(struct primalMesh * myPrimalMesh)
   //        }
   //      free(myPrimalMesh->segmentToVertex);
   //    }
-
+  
   if(myPrimalMesh->faceToSegments!=NULL){
       for(connectivity_int i=0; i<myPrimalMesh->faceNumber; i++)
         {
@@ -553,13 +563,13 @@ void freeMemory(struct primalMesh * myPrimalMesh)
         }
       free(myPrimalMesh->faceToSegments);
     }
-
-
+  
+  
   if(myPrimalMesh->vertexToSegmentNumber!=NULL){
       free(myPrimalMesh->vertexToSegmentNumber);
     }
-
-
+  
+  
   if(myPrimalMesh->vertexToSegments!=NULL){
       for(connectivity_int i=0; i<myPrimalMesh->vertexNumber; i++)
         {
@@ -568,9 +578,9 @@ void freeMemory(struct primalMesh * myPrimalMesh)
         }
       free(myPrimalMesh->vertexToSegments);
     }
-
-
-
+  
+  
+  
   if(myPrimalMesh->vertexToCells!=NULL){
       for(connectivity_int i=0; i<myPrimalMesh->vertexNumber; i++)
         {
@@ -579,21 +589,21 @@ void freeMemory(struct primalMesh * myPrimalMesh)
         }
       free(myPrimalMesh->vertexToCells);
     }
-
-
-
+  
+  
+  
   if(myPrimalMesh->vertexToCells!=NULL){
-
+      
       free(myPrimalMesh->vertexToCellNumbers);
     }
-
-
+  
+  
   if(myPrimalMesh->cellToCellsNumbers!=NULL){
-
+      
       free(myPrimalMesh->cellToCellsNumbers);
     }
-
-
+  
+  
   if(myPrimalMesh->cellToCells!=NULL){
       for(connectivity_int i=0; i<myPrimalMesh->cellNumber; i++)
         {
@@ -602,9 +612,9 @@ void freeMemory(struct primalMesh * myPrimalMesh)
         }
       free(myPrimalMesh->cellToCells);
     }
-
-
-
+  
+  
+  
   if(myPrimalMesh->faces!=NULL){
       for(connectivity_int i=0; i<myPrimalMesh->faceNumber; i++)
         {
@@ -613,14 +623,14 @@ void freeMemory(struct primalMesh * myPrimalMesh)
         }
       free(myPrimalMesh->faces);
     }
-
-
+  
+  
   if(myPrimalMesh->cellToFacesOwnerNumber!=NULL)
     free(myPrimalMesh->cellToFacesOwnerNumber);
   if(myPrimalMesh->cellToFacesNeighbourNumber!=NULL)
     free(myPrimalMesh->cellToFacesNeighbourNumber);
-
-
+  
+  
   if(myPrimalMesh->cellToFacesNeighbour!=NULL){
       for(connectivity_int i=0; i<myPrimalMesh->cellNumber; i++)
         {
@@ -629,8 +639,8 @@ void freeMemory(struct primalMesh * myPrimalMesh)
         }
       free(myPrimalMesh->cellToFacesNeighbour);
     }
-
-
+  
+  
   if(myPrimalMesh->cellToFacesOwner!=NULL){
       for(connectivity_int i=0; i<myPrimalMesh->cellNumber; i++)
         {
@@ -639,8 +649,8 @@ void freeMemory(struct primalMesh * myPrimalMesh)
         }
       free(myPrimalMesh->cellToFacesOwner);
     }
-
-
+  
+  
   if(myPrimalMesh->segments!=NULL){
       for(connectivity_int i=0; i<myPrimalMesh->segmentNumber; i++)
         {
@@ -649,9 +659,9 @@ void freeMemory(struct primalMesh * myPrimalMesh)
         }
       free(myPrimalMesh->segments);
     }
-
-
-
+  
+  
+  
   if(myPrimalMesh->vertexToSegmentOwner!=NULL){
       for(connectivity_int i=0; i<myPrimalMesh->vertexNumber; i++)
         {
@@ -660,9 +670,9 @@ void freeMemory(struct primalMesh * myPrimalMesh)
         }
       free(myPrimalMesh->vertexToSegmentOwner);
     }
-
-
-
+  
+  
+  
   if(myPrimalMesh->vertexToSegmentNeighbour!=NULL){
       for(connectivity_int i=0; i<myPrimalMesh->vertexNumber; i++)
         {
@@ -671,20 +681,20 @@ void freeMemory(struct primalMesh * myPrimalMesh)
         }
       free(myPrimalMesh->vertexToSegmentNeighbour);
     }
-
-
+  
+  
   if(myPrimalMesh->vertexToSegmentOwnerNumber!=NULL)
     free(myPrimalMesh->vertexToSegmentOwnerNumber);
   if(myPrimalMesh->vertexToSegmentNeighbourNumber!=NULL)
     free(myPrimalMesh->vertexToSegmentNeighbourNumber);
-
-
-
-
+  
+  
+  
+  
   if(myPrimalMesh->segmentToFaceOwnerNumber!=NULL)
     free(myPrimalMesh->segmentToFaceOwnerNumber);
-
-
+  
+  
   if(myPrimalMesh->segmentToFaceOwner!=NULL){
       for(connectivity_int i=0; i<myPrimalMesh->segmentNumber; i++)
         {
@@ -693,10 +703,10 @@ void freeMemory(struct primalMesh * myPrimalMesh)
         }
       free(myPrimalMesh->segmentToFaceOwner);
     }
-
+  
   if(myPrimalMesh->segmentToFaceNeighbourNumber!=NULL)
     free(myPrimalMesh->segmentToFaceNeighbourNumber);
-
+  
   if(myPrimalMesh->segmentToFaceNeighbour!=NULL){
       for(connectivity_int i=0; i<myPrimalMesh->segmentNumber; i++)
         {
@@ -705,32 +715,45 @@ void freeMemory(struct primalMesh * myPrimalMesh)
         }
       free(myPrimalMesh->segmentToFaceNeighbour);
     }
-
+  
+  
+  if(myPrimalMesh->faceToCellsNumber!=NULL)
+    free(myPrimalMesh->faceToCellsNumber);
+  
+  if(myPrimalMesh->faceToCells!=NULL){
+      for(connectivity_int i=0; i<myPrimalMesh->faceNumber; i++)
+        {
+          if(myPrimalMesh->faceToCells[i]!=NULL)
+            free(myPrimalMesh->faceToCells[i]);
+        }
+      free(myPrimalMesh->faceToCells);
+    }
+  
   endFunction(__FUNCTION__, t);
-
+  
 }
 
 
 
 void setHexahedreVertex(struct primalMesh * myPrimalMesh)
 {
-
+  
   //    clock_t t;
   //    t = clock();
-
+  
   clock_t t=startFunction(__FUNCTION__);
   affiche("\n");
-
+  
   // definition des vertex
   connectivity_int it_vertex=0;
   //    connectivity_int it_cell=0;
-
+  
   dataType L=myPrimalMesh->L/myPrimalMesh->M;
   dataType l=myPrimalMesh->l/myPrimalMesh->N;
   dataType H=myPrimalMesh->H/myPrimalMesh->P;
-
+  
   allocMemoryForMatrixDataType(&(myPrimalMesh->vertex) , myPrimalMesh->vertexNumber,DIM3D);
-
+  
   //    myPrimalMesh->vertex = (dataType **) malloc(myPrimalMesh->vertexNumber * sizeof(dataType *));
   //    //ERROR_TEST( (myPrimalMesh->vertex) );
   //    for(connectivity_int i=0; i<myPrimalMesh->vertexNumber; i++)
@@ -738,7 +761,7 @@ void setHexahedreVertex(struct primalMesh * myPrimalMesh)
   //        myPrimalMesh->vertex[i] = (dataType *) malloc(DIM3D * sizeof(dataType));
   //        memset(myPrimalMesh->vertex[i], 0.0, DIM3D*sizeof(dataType));
   //    }
-
+  
   for(connectivity_int i=0;i<myPrimalMesh->M+1;i++)
     for(connectivity_int j=0;j<myPrimalMesh->N+1;j++)
       for(connectivity_int k=0;k<myPrimalMesh->P+1;k++)
@@ -749,23 +772,23 @@ void setHexahedreVertex(struct primalMesh * myPrimalMesh)
           myPrimalMesh->vertex[it_vertex][2] = k * H;
           debug_print("%-40s : %ld (%f,%f,%f)\n","myPrimalMesh->vertex", it_vertex, myPrimalMesh->vertex[it_vertex][0], myPrimalMesh->vertex[it_vertex][1], myPrimalMesh->vertex[it_vertex][2]);
         }
-
+  
   endFunction(__FUNCTION__, t);
-
-
+  
+  
 }
 
 void setHexahedreCellToVertexNumber(struct primalMesh * myPrimalMesh)
 {
   clock_t t=startFunction(__FUNCTION__);
-
+  
   // definition des vertex
   //    connectivity_int it_vertex=0;
   connectivity_int it_cell=0;
-
-
+  
+  
   myPrimalMesh->cellToVertexNumber = (connectivity_int *) malloc(myPrimalMesh->cellNumber * sizeof(connectivity_int));
-
+  
   // hexaedron number of vertex on hexaedron
   for(connectivity_int i=0;i<myPrimalMesh->M;i++)
     for(connectivity_int j=0;j<myPrimalMesh->N;j++)
@@ -776,7 +799,7 @@ void setHexahedreCellToVertexNumber(struct primalMesh * myPrimalMesh)
           debug_print("%-40s : %ld (%ld)\n","myPrimalMesh->cellToVertexNumber", it_cell, myPrimalMesh->cellToVertexNumber[it_cell] );
         }
   endFunction(__FUNCTION__, t);
-
+  
 }
 
 
@@ -829,9 +852,9 @@ void setHexahedreCellToVertexNumber(struct primalMesh * myPrimalMesh)
 
 void setHexahedreCellToVertex(struct primalMesh * myPrimalMesh)
 {
-
+  
   clock_t t=startFunction(__FUNCTION__);
-
+  
   connectivity_int it_vertex=0;
   connectivity_int it_vertex2=0;
   connectivity_int it_vertex3=0;
@@ -843,27 +866,27 @@ void setHexahedreCellToVertex(struct primalMesh * myPrimalMesh)
   connectivity_int it_cell=0;
   // cell 0 : 0 1 9 8 / 2 3 11 10
   // hexaedron vertex number to define hexaedron
-
+  
   connectivity_int vN1 = (myPrimalMesh->P+1) ;
   connectivity_int vN2 = (myPrimalMesh->P+1)*(myPrimalMesh->N+1) ;
   connectivity_int cN1 = myPrimalMesh->P*myPrimalMesh->N;
-
-
-
+  
+  
+  
   myPrimalMesh->cellToVertex = (connectivity_int **) malloc(myPrimalMesh->cellNumber * sizeof(connectivity_int *));
   for(connectivity_int i=0; i<myPrimalMesh->cellNumber; i++)
     {
       myPrimalMesh->cellToVertex[i] = (connectivity_int *) malloc(myPrimalMesh->cellToVertexNumber[i] * sizeof(connectivity_int));
       memset(myPrimalMesh->cellToVertex[i], 0, myPrimalMesh->cellToVertexNumber[i]*sizeof(connectivity_int));
     }
-
-
+  
+  
   for(connectivity_int i=0;i<myPrimalMesh->M;i++)
     for(connectivity_int j=0;j<myPrimalMesh->N;j++)
       for(connectivity_int k=0;k<myPrimalMesh->P;k++)
         {
           it_cell     = k + j*myPrimalMesh->P + i*cN1; //cN1 = myPrimalMesh->P*myPrimalMesh->N;
-
+          
           /*
 *                 it_vertex =   k      + j*(myPrimalMesh->P+1) +i*(myPrimalMesh->P+1)*(myPrimalMesh->N+1);
             it_vertex2 = (k + 1) + j*(myPrimalMesh->P+1) +i*(myPrimalMesh->P+1)*(myPrimalMesh->N+1);
@@ -874,26 +897,26 @@ void setHexahedreCellToVertex(struct primalMesh * myPrimalMesh)
           it_vertex2 = it_vertex  + 1;
           it_vertex3 = it_vertex2 + vN2; // vN2 = (myPrimalMesh->P+1)*(myPrimalMesh->N+1);
           it_vertex4 = it_vertex3 - 1;
-
+          
           myPrimalMesh->cellToVertex[it_cell][0]=it_vertex;
           myPrimalMesh->cellToVertex[it_cell][1]=it_vertex2;
           myPrimalMesh->cellToVertex[it_cell][2]=it_vertex3;
           myPrimalMesh->cellToVertex[it_cell][3]=it_vertex4;
-
-
-
+          
+          
+          
           it_vertex5 =  k      + (j+1)*vN1 +i*vN2;
           it_vertex6 = (k + 1) + (j+1)*vN1 +i*vN2;
           it_vertex7 = (k + 1) + (j+1)*vN1 +(i+1)*vN2;
           it_vertex8 =  k      + (j+1)*vN1 +(i+1)*vN2;
-
+          
           myPrimalMesh->cellToVertex[it_cell][4]=it_vertex5;
           myPrimalMesh->cellToVertex[it_cell][5]=it_vertex6;
           myPrimalMesh->cellToVertex[it_cell][6]=it_vertex7;
           myPrimalMesh->cellToVertex[it_cell][7]=it_vertex8;
-
-
-
+          
+          
+          
           debug_print("%-40s : %ld (%ld %ld %ld %ld %ld %ld %ld %ld)\n",
                       "myPrimalMesh->cellToVertex",
                       it_cell,
@@ -1027,13 +1050,13 @@ void setHexahedreCellToVertex(struct primalMesh * myPrimalMesh)
 
 void setHexahedreVertexToCellNumbers(struct primalMesh * myPrimalMesh)
 {
-
+  
   clock_t t=startFunction(__FUNCTION__);
   affiche("\n");
-
+  
   myPrimalMesh->vertexToCellNumbers = (connectivity_int *) malloc(myPrimalMesh->vertexNumber * sizeof(connectivity_int));
   memset(myPrimalMesh->vertexToCellNumbers, 0, myPrimalMesh->vertexNumber*sizeof(connectivity_int));
-
+  
   for(connectivity_int k=0;k<myPrimalMesh->cellNumber;k++)
     {
       for(connectivity_int i=0;i<myPrimalMesh->cellToVertexNumber[k];i++)
@@ -1041,20 +1064,20 @@ void setHexahedreVertexToCellNumbers(struct primalMesh * myPrimalMesh)
           myPrimalMesh->vertexToCellNumbers[myPrimalMesh->cellToVertex[k][i]]++;
         }
     }
-
-
+  
+  
   for(connectivity_int k=0;k<myPrimalMesh->cellNumber;k++)
     {
       debug_print( "%-40s : %ld ( ","myPrimalMesh->vertexToCellNumbers", k);
-
+      
       {
         debug_print( "%ld " , myPrimalMesh->vertexToCellNumbers[k]);
       }
       debug_print(")\n");
     }
-
+  
   endFunction(__FUNCTION__, t);
-
+  
 }
 
 
@@ -1062,23 +1085,23 @@ void setHexahedreVertexToCellNumbers(struct primalMesh * myPrimalMesh)
 
 void setHexahedreVertexToCells(struct primalMesh * myPrimalMesh)
 {
-
+  
   clock_t t=startFunction(__FUNCTION__);
   affiche("\n");
-
+  
   connectivity_int * tmp ;
-
+  
   myPrimalMesh->vertexToCells = (connectivity_int **) malloc(myPrimalMesh->vertexNumber * sizeof(connectivity_int *));
-
+  
   for(connectivity_int i=0; i<myPrimalMesh->vertexNumber; i++)
     {
       myPrimalMesh->vertexToCells[i] = (connectivity_int *) malloc(myPrimalMesh->vertexToCellNumbers[i] * sizeof(connectivity_int));
       memset(myPrimalMesh->vertexToCells[i], 0, myPrimalMesh->vertexToCellNumbers[i]*sizeof(connectivity_int));
     }
-
+  
   tmp = (connectivity_int *) malloc(myPrimalMesh->vertexNumber * sizeof(connectivity_int));
   memset(tmp,0, myPrimalMesh->vertexNumber * sizeof(connectivity_int));
-
+  
   for(connectivity_int k=0;k<myPrimalMesh->cellNumber;k++)
     {
       for(connectivity_int i=0;i<myPrimalMesh->cellToVertexNumber[k];i++)
@@ -1087,27 +1110,27 @@ void setHexahedreVertexToCells(struct primalMesh * myPrimalMesh)
           tmp[myPrimalMesh->cellToVertex[k][i]]++;
         }
     }
-
-
-
-
-
+  
+  
+  
+  
+  
   for(connectivity_int k=0;k<myPrimalMesh->vertexNumber;k++)
     {
       debug_print( "%-40s : %ld ( ","myPrimalMesh->vertexToCells", k);
-
+      
       for(connectivity_int ii=0;ii<myPrimalMesh->vertexToCellNumbers[k];ii++)
         {
           debug_print( "%ld " , myPrimalMesh->vertexToCells[k][ii]);
         }
       debug_print(")\n");
     }
-
+  
   free(tmp);
-
+  
   endFunction(__FUNCTION__, t);
-
-
+  
+  
 }
 
 
@@ -1118,25 +1141,25 @@ void setHexahedreSegmentToVertex(struct primalMesh * myPrimalMesh)
 
     clock_t t=startFunction(__FUNCTION__);
     affiche("\n");
-
+    
     connectivity_int it_cell=0;
-
+    
     // vertex number on faces
     connectivity_int cN1 =  myPrimalMesh->P*myPrimalMesh->N;
-
+    
     connectivity_int it_face=0;
     connectivity_int it_segment=0;
-
+    
     allocMemoryForMatrixConnectivity(&(myPrimalMesh->segmentToVertex),myPrimalMesh->segmentNumber,SEGMENTVERTEX);
     connectivity_int * vertexList= (connectivity_int *) malloc(SEGMENTVERTEX * sizeof(connectivity_int));
     connectivity_int position=0;
-
+    
     myPrimalMesh->cellToCells = (connectivity_int **) malloc((myPrimalMesh->cellNumber+1) * sizeof(connectivity_int *));
     //    myPrimalMesh->cellToCellsNumbers = (connectivity_int *) malloc( (myPrimalMesh->cellNumber+1) * sizeof(connectivity_int));
     connectivity_int * toto=(connectivity_int * ) malloc(sizeof (connectivity_int)*SEGMENTVERTEX);
     //    connectivity_int * cellList  = (connectivity_int * ) malloc(sizeof (connectivity_int)*cellNumbers);
     connectivity_int * cellList  = (connectivity_int * ) malloc(sizeof (connectivity_int)*1024);
-
+    
     for(connectivity_int i=0;i<myPrimalMesh->M;i++)
         for(connectivity_int j=0;j<myPrimalMesh->N;j++)
             for(connectivity_int k=0;k<myPrimalMesh->P;k++)
@@ -1144,33 +1167,33 @@ void setHexahedreSegmentToVertex(struct primalMesh * myPrimalMesh)
                 //it_surface = k + j*(myPrimalMesh->P+1) + i*(myPrimalMesh->P+1)*(myPrimalMesh->N+1);
                 it_cell     = k + j*myPrimalMesh->P + i*cN1; //cN1 = myPrimalMesh->P*myPrimalMesh->N;
                 it_face     = 0;
-
+                
                 if(myPrimalMesh->cellToVertexNumber[it_cell] == HEXAHEDRON)
                 {
-
-
-
+                
+                
+                
                     connectivity_int cellNumbers = 0 ;
-
+                    
                     for (connectivity_short facei=0;facei<HEXAHEDRON_FACES;facei++)
                     {
                         for (connectivity_short vertexi=0;vertexi<QUAD;vertexi++)
                         {
                             connectivity_int position;
-
+                            
                             //                            myPrimalMesh->segmentToVertex[it_segment][0] =myPrimalMesh->cellToVertex[it_cell][hexaedron_localNodeList[facei][vertexi]];
                             //                            myPrimalMesh->segmentToVertex[it_segment][1] =myPrimalMesh->cellToVertex[it_cell][hexaedron_localNodeList[facei][(vertexi+1) % QUAD]];
                             //                            it_segment++;
                             toto[0] =myPrimalMesh->cellToVertex[it_cell][hexaedron_localNodeList[facei][vertexi]];
                             toto[1] =myPrimalMesh->cellToVertex[it_cell][hexaedron_localNodeList[facei][(vertexi+1) % QUAD]];
-
+                            
                             // select cells
-
+                            
                             //cellNumbers += myPrimalMesh->vertexToCellNumbers[toto[0]] + myPrimalMesh->vertexToCellNumbers[toto[1]] ;
-
-
+                            
+                            
                             connectivity_int jj=0;
-
+                            
                             for(connectivity_int kk=0;kk<SEGMENTVERTEX;kk++)
                             {
                                 for(connectivity_int ii=0;ii<myPrimalMesh->vertexToCellNumbers[toto[kk]];ii++)
@@ -1178,317 +1201,317 @@ void setHexahedreSegmentToVertex(struct primalMesh * myPrimalMesh)
                                     if(findInList(cellList,cellNumbers, myPrimalMesh->vertexToCells[toto[kk]][ii])==-1)
                                     {
                                         cellList[cellNumbers + jj]=myPrimalMesh->vertexToCells[toto[kk]][ii];
-
+                                        
                                         jj++;
-
+                                        
                                         //cellNumbers++;
                                     }
                                 }
                             }
                             cellNumbers+=jj;
-
+                            
                             //                            removeDuplicates(cellList, &cellNumbers);
                             //                            sortListConnectivity(cellList, cellNumbers);
-
+                            
                             jj=0;
-
+                            
                             debug_print( "%-40s : Celli (%ld) Facei (%d) Vertexi (%d) -> VERTEX (%7ld %7ld) -> CELL LIST ( ","cellList", it_cell, facei, vertexi,toto[0],toto[1]);
-
+                            
                             for(connectivity_int ii=0;ii<cellNumbers;ii++)
                             {
-
+                            
                                 debug_print("%ld ",cellList[jj]);
                                 jj++;
-
+                                
                             }
-
+                            
                             debug_print(")\n");
-
-
+                            
+                            
                         }
                     }
-
-
+                    
+                    
                     //                    removeDuplicates(cellList, &cellNumbers);
                     //                    sortListConnectivity(cellList, cellNumbers);
-
+                    
                     myPrimalMesh->cellToCells[it_cell]=(connectivity_int *) malloc(sizeof (connectivity_int)*cellNumbers);
-
+                    
                     for(connectivity_int kk=0;kk<cellNumbers;kk++)
                     {
                         myPrimalMesh->cellToCells[it_cell][kk] = cellList[kk];
                     }
-
+                    
                     myPrimalMesh->cellToCellsNumbers[it_cell] = cellNumbers;
-
+                    
                 }
-
+                
             }
-
+            
     for(connectivity_int k=0;k<myPrimalMesh->cellNumber;k++)
     {
         debug_print( "%-40s : %ld (%ld) ( ","myPrimalMesh->cellToCells", k, myPrimalMesh->cellToCellsNumbers[k]);
-
+        
         for(connectivity_int ii=0;ii<myPrimalMesh->cellToCellsNumbers[k];ii++)
         {
             debug_print( "%ld " , myPrimalMesh->cellToCells[k][ii]);
         }
         debug_print(")\n");
     }
-
-
+    
+    
     for(connectivity_int k=0;k<myPrimalMesh->segmentNumber;k++)
     {
         debug_print( "%-40s : %ld ( ","myPrimalMesh->segmentToVertex", k);
-
+        
         for(connectivity_int ii=0;ii<SEGMENTVERTEX;ii++)
         {
             debug_print( "%ld " , myPrimalMesh->segmentToVertex[k][ii]);
         }
-
+        
         debug_print(")\n");
     }
-
-
+    
+    
     free(toto);
     free(cellList);
     free(vertexList);
-
+    
     endFunction(__FUNCTION__, t);
-
+    
 }
 
 */
 
 void setHexahedreCellToCells(struct primalMesh * myPrimalMesh)
 {
-
+  
   clock_t t=startFunction(__FUNCTION__);
   affiche("\n");
-
+  
   connectivity_int it_cell=0;
-
+  
   // vertex number on faces
   connectivity_int cN1 =  myPrimalMesh->P*myPrimalMesh->N;
-
-//  connectivity_int it_face=0;
+  
+  //  connectivity_int it_face=0;
   //    connectivity_int it_segment=0;
-
+  
   //  allocMemoryForMatrixConnectivity(&(myPrimalMesh->segmentToVertex),myPrimalMesh->segmentNumber,SEGMENTVERTEX);
   connectivity_int * vertexList= (connectivity_int *) malloc(SEGMENTVERTEX * sizeof(connectivity_int));
-
+  
   myPrimalMesh->cellToCells = (connectivity_int **) malloc( (myPrimalMesh->cellNumber) * sizeof(connectivity_int *));
   myPrimalMesh->cellToCellsNumbers = (connectivity_int *) malloc( (myPrimalMesh->cellNumber) * sizeof(connectivity_int));
-
+  
   connectivity_int * cellList  = (connectivity_int * ) malloc(sizeof (connectivity_int)*1024*10);
-
+  
   for(connectivity_int i=0;i<myPrimalMesh->M;i++)
     for(connectivity_int j=0;j<myPrimalMesh->N;j++)
       for(connectivity_int k=0;k<myPrimalMesh->P;k++)
         {
           //it_surface = k + j*(myPrimalMesh->P+1) + i*(myPrimalMesh->P+1)*(myPrimalMesh->N+1);
           it_cell     = k + j*myPrimalMesh->P + i*cN1; //cN1 = myPrimalMesh->P*myPrimalMesh->N;
-//          it_face     = 0;
-
+          //          it_face     = 0;
+          
           if(myPrimalMesh->cellToVertexNumber[it_cell] == HEXAHEDRON)
             {
-
+              
               connectivity_int cellNumbers    = 0 ;
               connectivity_int vertexSelect   = 0 ;
-
+              
               for (connectivity_short vertexi=0;vertexi<HEXAHEDRON;vertexi++)
                 {
-
+                  
                   vertexSelect = myPrimalMesh->cellToVertex[it_cell][vertexi];
-
+                  
                   for (connectivity_short celli=0;celli<myPrimalMesh->vertexToCellNumbers[vertexSelect];celli++)
                     {
-
+                      
                       if(
                          findInList(cellList,cellNumbers, myPrimalMesh->vertexToCells[vertexSelect][celli])<0
                          )
                         {
-
+                          
                           cellList[cellNumbers]=myPrimalMesh->vertexToCells[vertexSelect][celli];
-
+                          
                           cellNumbers++;
-
+                          
                         }
                     }
-
-
+                  
+                  
                   /*
                         debug_print( "%-40s : Celli (%ld)   -> VERTEX (%7ld) -> CELL LIST ( ","cellList", it_cell, vertexSelect);
-
+                        
                         for(connectivity_int ii=0;ii<cellNumbers;ii++)
                         {
                             debug_print("%ld ",cellList[ii]);
                         }
-
+                        
                         debug_print(")\n");
 */
-
+                  
                 }                        //                        cellNumbers+=jj;
-
+              
               sortListConnectivity(cellList, cellNumbers);
-
+              
               myPrimalMesh->cellToCells[it_cell]=(connectivity_int *) malloc(sizeof (connectivity_int)*cellNumbers);
-
+              
               for(connectivity_int kk=0;kk<cellNumbers;kk++)
                 {
                   myPrimalMesh->cellToCells[it_cell][kk] = cellList[kk];
                 }
-
+              
               myPrimalMesh->cellToCellsNumbers[it_cell] = cellNumbers;
-
+              
             }
         }
-
+  
   for(connectivity_int k=0;k<myPrimalMesh->cellNumber;k++)
     {
       debug_print( "%-40s : %ld (%ld) ( ","myPrimalMesh->cellToCells", k, myPrimalMesh->cellToCellsNumbers[k]);
-
+      
       for(connectivity_int ii=0;ii<myPrimalMesh->cellToCellsNumbers[k];ii++)
         {
           debug_print( "%ld " , myPrimalMesh->cellToCells[k][ii]);
         }
       debug_print(")\n");
     }
-
-
+  
+  
   //  for(connectivity_int k=0;k<myPrimalMesh->segmentNumber;k++)
   //    {
   //      debug_print( "%-40s : %ld ( ","myPrimalMesh->segmentToVertex", k);
-
+  
   //      for(connectivity_int ii=0;ii<SEGMENTVERTEX;ii++)
   //        {
   //          debug_print( "%ld " , myPrimalMesh->segmentToVertex[k][ii]);
   //        }
-
+  
   //      debug_print(")\n");
   //    }
-
+  
   free(cellList);
   free(vertexList);
-
+  
   endFunction(__FUNCTION__, t);
-
+  
 }
 
 
 
 
-void setHexahedrecellToFacesOwnerNeighbour(struct primalMesh * myPrimalMesh)
+void setHexahedreCellToFacesOwnerNeighbour(struct primalMesh * myPrimalMesh)
 {
-
+  
   clock_t t=startFunction(__FUNCTION__);
   affiche("\n");
-
+  
   connectivity_int position;
   connectivity_int selectedCell;
   connectivity_int numberOfVertex;
-
+  
   connectivity_int * vertexList  = (connectivity_int * ) malloc(sizeof (connectivity_int)*1024*10);
   connectivity_int * vertexListBase  = (connectivity_int * ) malloc(sizeof (connectivity_int)*1024);
   connectivity_int * vertexListInverted  = (connectivity_int * ) malloc(sizeof (connectivity_int)*1024);
   connectivity_int * vertexListInvertedTwo  = (connectivity_int * ) malloc(sizeof (connectivity_int)*1024);
-
+  
   connectivity_int * cellTest  = (connectivity_int * ) malloc(sizeof (connectivity_int)*myPrimalMesh->cellNumber);
   memset(cellTest,0,sizeof (connectivity_int)*myPrimalMesh->cellNumber);
-
+  
   char ** cellFaceTest  = (char ** ) malloc(sizeof (char*)*myPrimalMesh->cellNumber);
   for(connectivity_int celli=0;celli<myPrimalMesh->cellNumber;celli++)
     {
       cellFaceTest[celli]  = (char * ) malloc(sizeof (char)*HEXAHEDRON_FACES);
       memset(cellFaceTest[celli],0,sizeof (char)*HEXAHEDRON_FACES);
     }
-
+  
   myPrimalMesh->cellToFacesOwner  = (connectivity_int ** ) malloc(sizeof (connectivity_int*)*myPrimalMesh->cellNumber);
   for (connectivity_int ii=0;ii<myPrimalMesh->cellNumber;ii++) {
       myPrimalMesh->cellToFacesOwner[ii]  =  NULL;//(connectivity_int * ) malloc(sizeof (connectivity_int*)*0);
     }
-
+  
   myPrimalMesh->cellToFacesNeighbour  = (connectivity_int ** ) malloc(sizeof (connectivity_int*)*myPrimalMesh->cellNumber);
   for (connectivity_int ii=0;ii<myPrimalMesh->cellNumber;ii++) {
       myPrimalMesh->cellToFacesNeighbour[ii]  = NULL;//(connectivity_int * ) malloc(sizeof (connectivity_int*)*0);
     }
-
+  
   myPrimalMesh->cellToFacesOwnerNumber  = (connectivity_int * ) malloc(sizeof (connectivity_int)*myPrimalMesh->cellNumber);
   memset(myPrimalMesh->cellToFacesOwnerNumber,0,myPrimalMesh->cellNumber*sizeof (connectivity_int) );
-
+  
   myPrimalMesh->cellToFacesNeighbourNumber  = (connectivity_int * ) malloc(sizeof (connectivity_int)*myPrimalMesh->cellNumber);
   memset(myPrimalMesh->cellToFacesNeighbourNumber,0,myPrimalMesh->cellNumber*sizeof (connectivity_int) );
-
-
+  
+  
   //    myPrimalMesh->cellToFacesNeighbour = realloc(myPrimalMesh->cellToFacesNeighbour,sizeof (connectivity_int*)*(myPrimalMesh->cellNumber));
   //    myPrimalMesh->cellToFacesOwner = realloc(myPrimalMesh->cellToFacesOwner,sizeof (connectivity_int*)*(myPrimalMesh->cellNumber));
-
+  
   connectivity_int facesNeighbourCount = 0;
   connectivity_int facesOwnerCount = 0;
-
-
+  
+  
   for(connectivity_int cellAi=0;cellAi<myPrimalMesh->cellNumber;cellAi++)
     {
       if(cellAi % 1000 == 0 && cellAi != 0)
         release_print( "%-40s :  (%ld)\n ","CELLS", cellAi);
-
+      
       for (connectivity_int faceAi=0;faceAi<HEXAHEDRON_FACES;faceAi++)
         {
-
+          
           for (connectivity_int vertexAi=0;vertexAi<hexaedron_localNodeListNumbers[faceAi];vertexAi++)
             {
               vertexListInverted[vertexAi] = myPrimalMesh->cellToVertex[cellAi][ hexaedron_localNodeList[faceAi][hexaedron_localNodeListNumbers[faceAi] -1 - vertexAi] ];
               vertexListBase[vertexAi] = myPrimalMesh->cellToVertex[cellAi][ hexaedron_localNodeList[faceAi][vertexAi] ];
             }
-
+          
           position = findMinInList(vertexListInverted,hexaedron_localNodeListNumbers[faceAi]);
           sortList(&vertexListInverted, hexaedron_localNodeListNumbers[faceAi], position);
-
+          
           position = findMinInList(vertexListBase,hexaedron_localNodeListNumbers[faceAi]);
           sortList(&vertexListBase, hexaedron_localNodeListNumbers[faceAi], position);
-
+          
           //            if( cellTest[celli]==0)
           {
-
+            
             for(connectivity_int cellBi=0;cellBi<myPrimalMesh->cellToCellsNumbers[cellAi];cellBi++)
               {
-
+                
                 selectedCell    = myPrimalMesh->cellToCells[cellAi][cellBi];
                 numberOfVertex  = myPrimalMesh->cellToVertexNumber[selectedCell];
-
-
+                
+                
                 for (connectivity_int faceBi=0;faceBi<HEXAHEDRON_FACES;faceBi++)
                   {
-
+                    
                     for (connectivity_int vertexBi=0;vertexBi<hexaedron_localNodeListNumbers[faceBi];vertexBi++)
                       {
                         vertexList[vertexBi] = myPrimalMesh->cellToVertex[selectedCell][ hexaedron_localNodeList[faceBi][vertexBi] ];
                       }
-
+                    
                     position = findMinInList(vertexList,hexaedron_localNodeListNumbers[faceBi]);
                     sortList(&vertexList, hexaedron_localNodeListNumbers[faceBi], position);
-
+                    
                     if(memcmp(vertexListBase,vertexList,hexaedron_localNodeListNumbers[faceBi]*sizeof (connectivity_int)) == 0)
                       {
-
+                        
                         if(cellFaceTest[selectedCell][faceBi]==0)
                           {
                             cellFaceTest[selectedCell][faceBi]=1;
-
+                            
                             facesOwnerCount = (connectivity_int) myPrimalMesh->cellToFacesOwnerNumber[selectedCell];
-
+                            
                             myPrimalMesh->faces = (connectivity_int**) realloc(myPrimalMesh->faces,sizeof (connectivity_int*)*(myPrimalMesh->faceNumber+1));
                             myPrimalMesh->faces[myPrimalMesh->faceNumber] =(connectivity_int*)  malloc(hexaedron_localNodeListNumbers[faceBi]*sizeof (connectivity_int) );
-
+                            
                             memcpy( myPrimalMesh->faces[myPrimalMesh->faceNumber], vertexList,hexaedron_localNodeListNumbers[faceBi]*sizeof (connectivity_int) );
-
+                            
                             myPrimalMesh->cellToFacesOwner[selectedCell] = (connectivity_int *) realloc(myPrimalMesh->cellToFacesOwner[selectedCell], (facesOwnerCount+1)*sizeof (connectivity_int) );
-
+                            
                             myPrimalMesh->cellToFacesOwner[selectedCell][facesOwnerCount] = myPrimalMesh->faceNumber;
                             myPrimalMesh->cellToFacesOwnerNumber[selectedCell]++;
-
+                            
                             myPrimalMesh->faceNumber++;
-
+                            
                           }
                       }
                     else
@@ -1498,22 +1521,22 @@ void setHexahedrecellToFacesOwnerNeighbour(struct primalMesh * myPrimalMesh)
                             if(cellFaceTest[selectedCell][faceBi]==0)
                               {
                                 cellFaceTest[selectedCell][faceBi]=-1;
-
+                                
                                 facesNeighbourCount = (connectivity_int) myPrimalMesh->cellToFacesNeighbourNumber[selectedCell];
-
+                                
                                 //                                    debug_print("%ld\n",facesNeighbourCount);
-
+                                
                                 if(myPrimalMesh->cellToFacesNeighbour[selectedCell]==NULL)
                                   myPrimalMesh->cellToFacesNeighbour[selectedCell] = (connectivity_int*) malloc((facesNeighbourCount+1)*sizeof (connectivity_int) );
                                 else
                                   myPrimalMesh->cellToFacesNeighbour[selectedCell] = (connectivity_int*) realloc(myPrimalMesh->cellToFacesNeighbour[selectedCell], ((facesNeighbourCount+1)) *sizeof (connectivity_int) );
-
+                                
                                 connectivity_short testFaceCi = 0;
-
+                                
                                 //                                for( connectivity_int faceCi= 0; (faceCi<myPrimalMesh->faceNumber) && (testFaceCi == 0) ; faceCi++ )
-                                for( long faceCi= (long) myPrimalMesh->faceNumber-1; (faceCi>=0) && (testFaceCi == 0) ; faceCi-- )
+                                for( connectivity_int faceCi= (connectivity_int) myPrimalMesh->faceNumber-1; (faceCi>0) && (testFaceCi == 0) ; faceCi-- )
                                   {
-
+                                    
                                     if(memcmp(vertexListBase,myPrimalMesh->faces[faceCi],QUAD*sizeof (connectivity_int))==0)
                                       {
                                         testFaceCi = 1;
@@ -1521,185 +1544,255 @@ void setHexahedrecellToFacesOwnerNeighbour(struct primalMesh * myPrimalMesh)
                                         myPrimalMesh->cellToFacesNeighbourNumber[selectedCell]++;
                                       }
                                   }
-
+                                
                               }
                           }
                       }
                   }
-
+                
               }
           }
-
-
-
-
-
-
+          
+          
+          
+          
+          
+          
         }
     }
-
+  
   free(vertexList);
   free(vertexListBase);
   free(vertexListInverted);
   free(cellTest);
   free(vertexListInvertedTwo);
-
+  
   for(connectivity_int celli=0;celli<myPrimalMesh->cellNumber;celli++)
     free(cellFaceTest[celli]);
   free(cellFaceTest);
-
-
+  
+  
   for(connectivity_int k=0;k<myPrimalMesh->faceNumber;k++)
     {
       debug_print( "%-40s : %ld ( ","myPrimalMesh->faces", k);
-
+      
       for(connectivity_int ii=0;ii<QUAD;ii++)
         {
           debug_print( "%ld " , myPrimalMesh->faces[k][ii]);
         }
       debug_print(")\n");
     }
-
-
+  
+  
   for(connectivity_int celli=0;celli<myPrimalMesh->cellNumber;celli++)
     {
       debug_print( "%-40s : %ld ( ","myPrimalMesh->cellToFacesOwner", celli);
-
+      
       for(connectivity_int faceAi=0;faceAi<myPrimalMesh->cellToFacesOwnerNumber[celli];faceAi++)
         {
           debug_print( "%ld " , myPrimalMesh->cellToFacesOwner[celli][faceAi]);
         }
       debug_print(")\n");
     }
-
-
+  
+  
   for(connectivity_int k=0;k<myPrimalMesh->cellNumber;k++)
     {
       debug_print( "%-40s : %ld ( ","myPrimalMesh->cellToFacesNeighbour", k);
-
+      
       for(connectivity_int ii=0;ii<myPrimalMesh->cellToFacesNeighbourNumber[k];ii++)
         {
           debug_print( "%ld " , myPrimalMesh->cellToFacesNeighbour[k][ii] );
         }
       debug_print(")\n");
     }
-
-
+  
+  
   endFunction(__FUNCTION__, t);
+  
+}
 
+void setHexahedreFaceToCells(struct primalMesh * myPrimalMesh)
+{
+  
+  clock_t t=startFunction(__FUNCTION__);
+  affiche("\n");
+  
+  connectivity_int selectedFace = 0;
+  
+  
+  myPrimalMesh->faceToCells  = (connectivity_int ** ) malloc(sizeof (connectivity_int*)*myPrimalMesh->faceNumber);
+  for (connectivity_int ii=0;ii<myPrimalMesh->faceNumber;ii++) {
+      myPrimalMesh->faceToCells[ii]  =  NULL;//(connectivity_int * ) malloc(sizeof (connectivity_int*)*0);
+    }
+  
+  myPrimalMesh->faceToCellsNumber  = (connectivity_int * ) malloc(sizeof (connectivity_int)*myPrimalMesh->faceNumber);
+  memset(myPrimalMesh->faceToCellsNumber,0,myPrimalMesh->faceNumber*sizeof (connectivity_int) );
+  
+  
+  
+  for(connectivity_int celli=0;celli<myPrimalMesh->cellNumber;celli++)
+    {
+      
+      for(connectivity_int faceAi=0;faceAi<myPrimalMesh->cellToFacesOwnerNumber[celli];faceAi++)
+        {
+          //          myPrimalMesh->cellToFacesOwner[celli][faceAi];
+          //          debug_print("O: %ld %ld\n",celli, myPrimalMesh->cellToFacesOwner[celli][faceAi]);
+          
+          selectedFace = myPrimalMesh->cellToFacesOwner[celli][faceAi];
+          
+          myPrimalMesh->faceToCells[selectedFace] = (connectivity_int*) realloc(myPrimalMesh->faceToCells[selectedFace],sizeof (connectivity_int)*(myPrimalMesh->faceToCellsNumber[selectedFace]+1));
+          
+          myPrimalMesh->faceToCells[selectedFace][myPrimalMesh->faceToCellsNumber[selectedFace]] = celli;
+          myPrimalMesh->faceToCellsNumber[selectedFace]++;
+          
+        }
+      
+      for(connectivity_int faceAi=0;faceAi<myPrimalMesh->cellToFacesNeighbourNumber[celli];faceAi++)
+        {
+          //          myPrimalMesh->cellToFacesOwner[celli][faceAi];
+          //          debug_print("O: %ld %ld\n",celli, myPrimalMesh->cellToFacesNeighbour[celli][faceAi]);
+          
+          selectedFace = myPrimalMesh->cellToFacesNeighbour[celli][faceAi];
+          
+          myPrimalMesh->faceToCells[selectedFace] = (connectivity_int*) realloc(myPrimalMesh->faceToCells[selectedFace],sizeof (connectivity_int)*(myPrimalMesh->faceToCellsNumber[selectedFace]+1));
+          
+          myPrimalMesh->faceToCells[selectedFace][myPrimalMesh->faceToCellsNumber[selectedFace]] = celli;
+          myPrimalMesh->faceToCellsNumber[selectedFace]++;
+          
+          
+        }
+      
+      
+    }
+  
+  
+#ifdef DEBUG
+  for(connectivity_int faceAi=0;faceAi<myPrimalMesh->faceNumber;faceAi++)
+    {
+      debug_print( "%-40s : %ld ( ","myPrimalMesh->faceToCells", faceAi);
+      
+      for(connectivity_int celli=0;celli<myPrimalMesh->faceToCellsNumber[faceAi];celli++)
+        {
+          debug_print( "%ld " , myPrimalMesh->faceToCells[faceAi][celli] );
+        }
+      debug_print(")\n");
+    }
+  
+#endif
+  
+  //  free(copyFace);
+  //  free(vertexList);
+  //  free(vertexListInverted);
+  
+  
+  endFunction(__FUNCTION__, t);
+  
 }
 
 
+
 void setHexahedreSegments(struct primalMesh * myPrimalMesh)
 {
-
+  
   clock_t t=startFunction(__FUNCTION__);
   affiche("\n");
-  affiche("REFAIRE CETTE FONCTION EN UTILISANT CELLTOFACE PUIS REDUIRE LA RECHERCHE DANS SEGMENTS EN INTRODUISANT PAR EXEMPLE CELLTOSEGMENTS\n");
-
+  affiche("%s : REFAIRE CETTE FONCTION EN UTILISANT CELLTOFACE PUIS REDUIRE LA RECHERCHE DANS SEGMENTS EN INTRODUISANT PAR EXEMPLE CELLTOSEGMENTS\n",__FUNCTION__);
+  
   connectivity_int * vertexList         = (connectivity_int * ) malloc(sizeof (connectivity_int)*SEGMENTVERTEX);
   connectivity_int * vertexListInverted = (connectivity_int * ) malloc(sizeof (connectivity_int)*SEGMENTVERTEX);
   connectivity_int * copyFace           = (connectivity_int * ) malloc(sizeof (connectivity_int)*(QUAD+1));
-
+  
   connectivity_int testSegment = 0;
-
+  
   myPrimalMesh->segments  = (connectivity_int ** ) realloc(myPrimalMesh->segments, sizeof (connectivity_int*)*(myPrimalMesh->cellNumber*6));
   for (connectivity_int segmentAi=0;segmentAi<(myPrimalMesh->cellNumber*6);segmentAi++)
     myPrimalMesh->segments[segmentAi]  = (connectivity_int * ) malloc(sizeof (connectivity_int)*SEGMENTVERTEX);
-
+  
   for (connectivity_int faceAi=0;faceAi<myPrimalMesh->faceNumber;faceAi++)
     //  for (long faceAi=(long)(myPrimalMesh->faceNumber-1);faceAi>=0;faceAi--)
     {
-
+      
       if(faceAi % 1000 == 0 && faceAi != 0)
         release_print( "%-40s :  (%ld)\n ","FACE", faceAi);
-
-
+      
+      
       memcpy(copyFace,myPrimalMesh->faces[faceAi],sizeof (connectivity_int)*(QUAD));
       copyFace[QUAD] = copyFace[0];
-
+      
       for (connectivity_int vertexAi=0;vertexAi<QUAD;vertexAi++)
         {
-
+          
           vertexList[0] = copyFace[vertexAi];
           vertexList[1] = copyFace[(vertexAi+1) % QUAD];
-
+          
           vertexListInverted[0] = vertexList[1];
           vertexListInverted[1] = vertexList[0];
-
+          
           testSegment = 0;
-
+          
+          /*
+           * AMELIORATION du temps de calcul :
+           * Augmenter la vitesse de recherche
+           * en incluant une fonction faceToCells puis cellToSegments pour réduire l'impact de la recherche
+           */
           for (connectivity_int segmentAi=0;segmentAi<myPrimalMesh->segmentNumber  && testSegment == 0;segmentAi++)
-            //          for ( long segmentAi=(long)(myPrimalMesh->segmentNumber-1);(segmentAi>=0)  && (testSegment == 0);segmentAi--)
             {
-
-              //char * toto = (char*) vertexList;
-              //char * titi = (char*) (myPrimalMesh->segments[segmentAi]);
-              //char * tata = (char*) vertexListInverted;
-              //int count = (int) sizeof(connectivity_int)*(SEGMENTVERTEX)-1;
-
-              //              if( memcmp(vertexList,(myPrimalMesh->segments[segmentAi]), sizeof(char)) == 0 )
-              //              if( memcmp( &(toto[count]), &(titi[count]), sizeof(char)) == 0 )
-              //              if( memcmp( &(vertexList[0]), &((myPrimalMesh->segments[segmentAi][0])), sizeof(connectivity_int)) == 0 )
+              
               if( vertexList[0] == myPrimalMesh->segments[segmentAi][0])
                 {
                   if( vertexList[1] == myPrimalMesh->segments[segmentAi][1])
-                    //                  if( memcmp(vertexList,(myPrimalMesh->segments[segmentAi]), sizeof(connectivity_int)*SEGMENTVERTEX) == 0 )
                     {
                       testSegment = 1;
                     }
                 }
               else
-                //                  if( memcmp(vertexListInverted,(myPrimalMesh->segments[segmentAi]), sizeof(char)) == 0 )
-                //                if( memcmp( &(tata[count]), &(titi[count]), sizeof(char)) == 0 )
-                //                if( memcmp( &(vertexListInverted[0]), &((myPrimalMesh->segments[segmentAi][0])), sizeof(connectivity_int)) == 0 )
                 if( vertexListInverted[0] == myPrimalMesh->segments[segmentAi][0])
                   {
                     if( vertexListInverted[1] == myPrimalMesh->segments[segmentAi][1])
-
-                      //                    if( memcmp(vertexListInverted,(myPrimalMesh->segments[segmentAi]), sizeof(connectivity_int)*SEGMENTVERTEX) == 0 )
+                      
                       {
                         testSegment = 2;
                       }
                   }
             }
-
+          
           if(testSegment == 0)
             {
-              if(myPrimalMesh->cellNumber*6<=myPrimalMesh->segmentNumber)
+              if(myPrimalMesh->cellNumber*HEXAHEDRON_FACES<=myPrimalMesh->segmentNumber)
                 {
                   myPrimalMesh->segments  = (connectivity_int ** ) realloc(myPrimalMesh->segments, sizeof (connectivity_int*)*(myPrimalMesh->segmentNumber+1));
                   myPrimalMesh->segments[myPrimalMesh->segmentNumber]  = (connectivity_int * ) malloc(sizeof (connectivity_int)*SEGMENTVERTEX);
                 }
               memcpy(myPrimalMesh->segments[myPrimalMesh->segmentNumber], vertexList, sizeof(connectivity_int)*SEGMENTVERTEX);
-
+              
               myPrimalMesh->segmentNumber++;
             }
-
-
-
-
+          
         }
     }
-
+  
+#ifdef DEBUG
   for(connectivity_int segmentAi=0;segmentAi<myPrimalMesh->segmentNumber;segmentAi++)
     {
       debug_print( "%-40s : %ld ( ","myPrimalMesh->segments", segmentAi);
-
+      
       for(connectivity_int vertexAi=0;vertexAi<SEGMENTVERTEX;vertexAi++)
         {
           debug_print( "%ld " , myPrimalMesh->segments[segmentAi][vertexAi] );
         }
       debug_print(")\n");
     }
-
+  
+#endif
+  
   free(copyFace);
   free(vertexList);
   free(vertexListInverted);
-
-
+  
+  
   endFunction(__FUNCTION__, t);
-
+  
 }
 
 
@@ -1707,147 +1800,154 @@ void setHexahedreSegments(struct primalMesh * myPrimalMesh)
 
 void setHexahedreVertexToSegments(struct primalMesh * myPrimalMesh)
 {
-
+  
   clock_t t=startFunction(__FUNCTION__);
   affiche("\n");
-
+  
   connectivity_int * vertexList         = (connectivity_int * ) malloc(sizeof (connectivity_int)*SEGMENTVERTEX);
   connectivity_int * vertexListInverted = (connectivity_int * ) malloc(sizeof (connectivity_int)*SEGMENTVERTEX);
   connectivity_int * copyFace           = (connectivity_int * ) malloc(sizeof (connectivity_int)*(QUAD+1));
-
+  
   //connectivity_int testSegment = 0;
-
+  
   myPrimalMesh->vertexToSegmentOwner  = (connectivity_int ** ) malloc(sizeof (connectivity_int*)*myPrimalMesh->vertexNumber);
   for (connectivity_int ii=0;ii<myPrimalMesh->vertexNumber;ii++) {
       myPrimalMesh->vertexToSegmentOwner[ii]  =  NULL;//(connectivity_int * ) malloc(sizeof (connectivity_int*)*0);
     }
-
+  
   myPrimalMesh->vertexToSegmentOwnerNumber  = (connectivity_int * ) malloc(sizeof (connectivity_int)*myPrimalMesh->vertexNumber);
   memset(myPrimalMesh->vertexToSegmentOwnerNumber, 0, myPrimalMesh->vertexNumber*sizeof(connectivity_int));
-
+  
   myPrimalMesh->vertexToSegmentNeighbour  = (connectivity_int ** ) malloc(sizeof (connectivity_int*)*myPrimalMesh->vertexNumber);
   for (connectivity_int ii=0;ii<myPrimalMesh->vertexNumber;ii++) {
       myPrimalMesh->vertexToSegmentNeighbour[ii]  =  NULL;//(connectivity_int * ) malloc(sizeof (connectivity_int*)*0);
     }
-
+  
   myPrimalMesh->vertexToSegmentNeighbourNumber  = (connectivity_int * ) malloc(sizeof (connectivity_int)*myPrimalMesh->vertexNumber);
   memset(myPrimalMesh->vertexToSegmentNeighbourNumber, 0, myPrimalMesh->vertexNumber*sizeof(connectivity_int));
-
-
+  
+  
   connectivity_int pointOwner = 0;
   connectivity_int pointNeighbour = 0;
-
+  
   for (connectivity_int segmentAi=0;segmentAi<myPrimalMesh->segmentNumber;segmentAi++)
     {
       if(segmentAi % 1000 == 0 && segmentAi!=0)
         release_print( "%-40s :  (%ld)\n ","SEGMENTS", segmentAi);
-
+      
       pointOwner = myPrimalMesh->segments[segmentAi][1];
-
+      
       myPrimalMesh->vertexToSegmentOwner[pointOwner] = (connectivity_int *) realloc(myPrimalMesh->vertexToSegmentOwner[pointOwner],(myPrimalMesh->vertexToSegmentOwnerNumber[pointOwner]+1)*sizeof (connectivity_int));
       myPrimalMesh->vertexToSegmentOwner[pointOwner][myPrimalMesh->vertexToSegmentOwnerNumber[pointOwner]] = segmentAi;
       myPrimalMesh->vertexToSegmentOwnerNumber[pointOwner]++;
-
+      
       pointNeighbour = myPrimalMesh->segments[segmentAi][0];
-
+      
       myPrimalMesh->vertexToSegmentNeighbour[pointNeighbour] = (connectivity_int *) realloc(myPrimalMesh->vertexToSegmentNeighbour[pointNeighbour],(myPrimalMesh->vertexToSegmentNeighbourNumber[pointNeighbour]+1)*sizeof (connectivity_int));
       myPrimalMesh->vertexToSegmentNeighbour[pointNeighbour][myPrimalMesh->vertexToSegmentNeighbourNumber[pointNeighbour]] = segmentAi;
       myPrimalMesh->vertexToSegmentNeighbourNumber[pointNeighbour]++;
-
+      
     }
-
+  
+#ifdef DEBUG
   for(connectivity_int vertexAi=0;vertexAi<myPrimalMesh->vertexNumber;vertexAi++)
     {
-
+      
       debug_print( "%-40s : %ld ( ","myPrimalMesh->vertexToSegmentOwner", vertexAi);
-
+      
       for(connectivity_int segmentAi=0;segmentAi<myPrimalMesh->vertexToSegmentOwnerNumber[vertexAi];segmentAi++)
         {
           debug_print( "%ld " , myPrimalMesh->vertexToSegmentOwner[vertexAi][segmentAi] );
         }
-
+      
       debug_print(")\n");
-
+      
     }
-
+  
   for(connectivity_int vertexAi=0;vertexAi<myPrimalMesh->vertexNumber;vertexAi++)
     {
-
+      
       debug_print( "%-40s : %ld ( ","myPrimalMesh->vertexToSegmentNeighbour", vertexAi);
-
+      
       for(connectivity_int segmentAi=0;segmentAi<myPrimalMesh->vertexToSegmentNeighbourNumber[vertexAi];segmentAi++)
         {
           debug_print( "%ld " , myPrimalMesh->vertexToSegmentNeighbour[vertexAi][segmentAi] );
         }
-
+      
       debug_print(")\n");
-
+      
     }
-
-
+#endif
+  
   free(copyFace);
   free(vertexList);
   free(vertexListInverted);
-
-
+  
+  
   endFunction(__FUNCTION__, t);
-
+  
 }
 
 
 void setHexahedreSegmentToFaces(struct primalMesh * myPrimalMesh)
 {
-
+  
   clock_t t=startFunction(__FUNCTION__);
   affiche("\n");
-
+  
   connectivity_int * vertexList         = (connectivity_int * ) malloc(sizeof (connectivity_int)*SEGMENTVERTEX);
   connectivity_int * vertexListInverted = (connectivity_int * ) malloc(sizeof (connectivity_int)*SEGMENTVERTEX);
   connectivity_int * copyFace           = (connectivity_int * ) malloc(sizeof (connectivity_int)*(QUAD+1));
-
+  
   //connectivity_int testSegment = 0;
-
-
+  
+  affiche("%s : REDUIRE LE TEMPS DE CETTE FONCTION EN DEFINISSANT DE NOUVELLES MATRICES avec FACETOCELL puis CELLTOSEGMENTS \n",__FUNCTION__);
+  
   myPrimalMesh->segmentToFaceOwner  = (connectivity_int ** ) malloc(sizeof (connectivity_int*)*myPrimalMesh->segmentNumber);
   for (connectivity_int ii=0;ii<myPrimalMesh->segmentNumber;ii++) {
       myPrimalMesh->segmentToFaceOwner[ii]  =  NULL;//(connectivity_int * ) malloc(sizeof (connectivity_int*)*0);
     }
-
+  
   myPrimalMesh->segmentToFaceOwnerNumber  = (connectivity_int * ) malloc(sizeof (connectivity_int)*myPrimalMesh->segmentNumber);
   memset(myPrimalMesh->segmentToFaceOwnerNumber, 0, myPrimalMesh->segmentNumber*sizeof(connectivity_int));
-
-
+  
+  
   myPrimalMesh->segmentToFaceNeighbour  = (connectivity_int ** ) malloc(sizeof (connectivity_int*)*myPrimalMesh->segmentNumber);
   for (connectivity_int ii=0;ii<myPrimalMesh->segmentNumber;ii++) {
       myPrimalMesh->segmentToFaceNeighbour[ii]  =  NULL;//(connectivity_int * ) malloc(sizeof (connectivity_int*)*0);
     }
-
+  
   myPrimalMesh->segmentToFaceNeighbourNumber  = (connectivity_int * ) malloc(sizeof (connectivity_int)*myPrimalMesh->segmentNumber);
   memset(myPrimalMesh->segmentToFaceNeighbourNumber, 0, myPrimalMesh->segmentNumber*sizeof(connectivity_int));
-
-
+  
+  
   for (connectivity_int faceAi=0;faceAi<myPrimalMesh->faceNumber;faceAi++)
     {
       if(faceAi % 1000 == 0 && faceAi!=0)
         release_print( "%-40s :  (%ld)\n ","FACES", faceAi);
-
+      
       memcpy(copyFace,myPrimalMesh->faces[faceAi],sizeof (connectivity_int)*(QUAD));
       copyFace[QUAD] = copyFace[0];
-
+      
       for (connectivity_int vertexAi=0;vertexAi<QUAD;vertexAi++)
         {
           connectivity_int testSegment=0;
+          /*
+           * AMELIORATION du temps de calcul :
+           * Augmenter la vitesse de recherche
+           * en incluant une fonction faceToCells puis cellToSegments pour réduire l'impact de la recherche
+           * de segmentToFaceOwner et segmentToFaceNeighbour
+           */
           for (connectivity_int segmentAi=0 ; segmentAi<myPrimalMesh->segmentNumber && testSegment==0 ;segmentAi++)
-            //            for (long segmentAi=(long) (myPrimalMesh->segmentNumber-1);segmentAi>=0 && testSegment==0;segmentAi--)
             {
-
+              
               vertexListInverted[0]=myPrimalMesh->segments[segmentAi][1];
               vertexListInverted[1]=myPrimalMesh->segments[segmentAi][0];
-
+              
               if(memcmp(&(copyFace[vertexAi]),(myPrimalMesh->segments[segmentAi]),sizeof (connectivity_int)*SEGMENTVERTEX)==0)
                 {
-
-                  myPrimalMesh->segmentToFaceOwner[segmentAi] = (connectivity_int *) realloc(myPrimalMesh->segmentToFaceOwner[segmentAi], (myPrimalMesh->segmentToFaceOwnerNumber[segmentAi]+1)*sizeof (connectivity_int));
+                  
+                  myPrimalMesh->segmentToFaceOwner[segmentAi] = (connectivity_int *) realloc(myPrimalMesh->segmentToFaceOwner[segmentAi], (myPrimalMesh->segmentToFaceOwnerNumber[segmentAi]+1) * sizeof (connectivity_int));
                   myPrimalMesh->segmentToFaceOwner[segmentAi][myPrimalMesh->segmentToFaceOwnerNumber[segmentAi]] = faceAi;
                   myPrimalMesh->segmentToFaceOwnerNumber[segmentAi]++;
                   testSegment=1;
@@ -1855,7 +1955,7 @@ void setHexahedreSegmentToFaces(struct primalMesh * myPrimalMesh)
               else
                 if(memcmp(&(copyFace[vertexAi]),(vertexListInverted),sizeof (connectivity_int)*SEGMENTVERTEX)==0)
                   {
-
+                    
                     myPrimalMesh->segmentToFaceNeighbour[segmentAi] = (connectivity_int *) realloc(myPrimalMesh->segmentToFaceNeighbour[segmentAi], (myPrimalMesh->segmentToFaceNeighbourNumber[segmentAi]+1)*sizeof (connectivity_int));
                     myPrimalMesh->segmentToFaceNeighbour[segmentAi][myPrimalMesh->segmentToFaceNeighbourNumber[segmentAi]] = faceAi;
                     myPrimalMesh->segmentToFaceNeighbourNumber[segmentAi]++;
@@ -1864,71 +1964,166 @@ void setHexahedreSegmentToFaces(struct primalMesh * myPrimalMesh)
             }
         }
     }
-
-
-
-
-
-
+  
+  
+  
+#ifdef DEBUG
+  
+  
+  
   for(connectivity_int segmentAi=0;segmentAi<myPrimalMesh->segmentNumber;segmentAi++)
     {
-
+      
       debug_print( "%-40s : %ld ( ","myPrimalMesh->segmentToFaceOwner", segmentAi);
-
+      
       for(connectivity_int faceAi=0;faceAi<myPrimalMesh->segmentToFaceOwnerNumber[segmentAi];faceAi++)
         {
           debug_print( "%ld " , myPrimalMesh->segmentToFaceOwner[segmentAi][faceAi] );
         }
-
+      
       debug_print(")\n");
-
-    }
-
-
-
-
-
-
+      
+    }
+  
+  
+  
+  
+  
+  
   for(connectivity_int segmentAi=0;segmentAi<myPrimalMesh->segmentNumber;segmentAi++)
     {
-
+      
       debug_print( "%-40s : %ld ( ","myPrimalMesh->segmentToFaceNeighbour", segmentAi);
-
+      
       for(connectivity_int faceAi=0;faceAi<myPrimalMesh->segmentToFaceNeighbourNumber[segmentAi];faceAi++)
         {
           debug_print( "%ld " , myPrimalMesh->segmentToFaceNeighbour[segmentAi][faceAi] );
         }
-
+      
       debug_print(")\n");
-
+      
     }
-
-
+  
+#endif
+  
   free(copyFace);
   free(vertexList);
   free(vertexListInverted);
+  
+  
+  endFunction(__FUNCTION__, t);
+  
+}
 
 
-  endFunction(__FUNCTION__, t);
 
+
+
+void setHexahedreDualFaces(struct primalMesh * myPrimalMesh)
+{
+  
+  clock_t t=startFunction(__FUNCTION__);
+  affiche("\n");
+  
+  connectivity_int selectedCell = 0;
+  connectivity_int selectedVertex = 0;
+  connectivity_int selectedSegment = 0;
+  connectivity_int selectedFace =0;
+  
+  
+  for(connectivity_int celli=0;celli<myPrimalMesh->cellNumber;celli++)
+    {
+      
+      selectedCell = celli;
+      
+      for(connectivity_int vertexi=0;vertexi<myPrimalMesh->cellToVertexNumber[selectedCell];vertexi++)
+        {
+          
+          selectedVertex = myPrimalMesh->cellToVertex[selectedCell][vertexi] ;
+          
+          for(connectivity_int segmenti=0;segmenti<myPrimalMesh->vertexToSegmentNumber[selectedVertex];segmenti++)
+            {
+              
+              selectedSegment = myPrimalMesh->vertexToSegments[selectedVertex][segmenti];
+              
+              // Est-ce que les segments sont bien attachés à la cellule selectedCell
+
+              for(connectivity_int facei=0;facei<myPrimalMesh->segmentToFaceOwnerNumber[selectedSegment];facei++)
+                {
+                  
+                  selectedFace = myPrimalMesh->segmentToFaceOwner[selectedSegment][facei];
+                  
+                  // Est-ce que les faces sont bien attachés à la cellule selectedCell
+                }              
+              
+              for(connectivity_int facei=0;facei<myPrimalMesh->segmentToFaceNeighbourNumber[selectedSegment];facei++)
+                {
+                  
+                  selectedFace = myPrimalMesh->segmentToFaceNeighbour[selectedSegment][facei];
+                  
+                  // Est-ce que les faces sont bien attachés à la cellule selectedCell
+                }       
+              
+              /*
+               * Créer une matrice Dual Faces attachés à selectedVertex
+               * Séparer les faces internes à la cellule et les faces duales sur les faces primales
+               * Faire des faces externes pour les bords du domaine
+               * Détecter les bords du domaine?
+               */
+              
+            } 
+        }
+    }
+  
+#ifdef DEBUG
+  
+  
+  
+  //  for(connectivity_int segmentAi=0;segmentAi<myPrimalMesh->segmentNumber;segmentAi++)
+  //    {
+  
+  //      debug_print( "%-40s : %ld ( ","myPrimalMesh->segmentToFaceOwner", segmentAi);
+  
+  //      for(connectivity_int faceAi=0;faceAi<myPrimalMesh->segmentToFaceOwnerNumber[segmentAi];faceAi++)
+  //        {
+  //          debug_print( "%ld " , myPrimalMesh->segmentToFaceOwner[segmentAi][faceAi] );
+  //        }
+  
+  //      debug_print(")\n");
+  
+  //    }
+  
+  
+  
+  
+  
+  
+#endif
+  
+  
+  
+  
+  endFunction(__FUNCTION__, t);
+  
 }
 
 
+
 void setHexahedreSortFaceToVertex(struct primalMesh * myPrimalMesh)
 {
   //////////////////// TRIE LES NOEUDS
-
+  
   clock_t t=startFunction(__FUNCTION__);
-
+  
   //    connectivity_int actualPoint;
   //    connectivity_int nextPoint;
-
+  
   // on trie les noeund dans les faces
   for(connectivity_int k=0;k<myPrimalMesh->faceNumber;k++)
     {
       connectivity_int              position=0;
-
-
+      
+      
       for(connectivity_int ii=1;ii<myPrimalMesh->faceToVertexNumber[k];ii++)
         {
           if(myPrimalMesh->faceToVertex[k][position]>myPrimalMesh->faceToVertex[k][ii])
@@ -1936,26 +2131,16 @@ void setHexahedreSortFaceToVertex(struct primalMesh * myPrimalMesh)
               position=ii;
             }
         }
-      //            debug_print("TROUVE     : %ld %ld \n",k,position);
-
+      
       for(connectivity_int ii=0;ii<position;ii++)
         rotate(myPrimalMesh->faceToVertex[k], myPrimalMesh->faceToVertexNumber[k]);
-
-      //            position=0;
-      //            for(connectivity_int ii=1;ii<myPrimalMesh->faceToVertexNumber[k];ii++)
-      //            {
-      //                if(myPrimalMesh->faceToVertex[k][position]>myPrimalMesh->faceToVertex[k][ii])
-      //                {
-      //                    position=ii;
-      //                }
-      //            }
-      //            debug_print("TROUVE BIS : %ld %ld \n",k,position);
-
+      
+      
     }
-
-
-
-
+  
+  
+  
+  
   //        for(conctivity_int k=0;k<myPrimalMesh->faceNumber;k++)
   //        {
   //            conctivity_int it_surface=0;
@@ -1965,7 +2150,7 @@ void setHexahedreSortFaceToVertex(struct primalMesh * myPrimalMesh)
   //                for(conctivity_int ii=0;ii<myPrimalMesh->faceToVertexNumber[k];ii++)
   //                {
   //                    //     ((ii + 1) % myPrimalMesh->faceToVertexNumber[k]) ;
-
+  
   //                    if(myPrimalMesh->faceToVertex[k][ii] == myPrimalMesh->faceToVertex[it_surface][0])
   //                    {
   //                        bool = 1;
@@ -1977,144 +2162,142 @@ void setHexahedreSortFaceToVertex(struct primalMesh * myPrimalMesh)
   //            while( (it_surface<myPrimalMesh->faceNumber) && (bool == 0) );
   //        }
   endFunction(__FUNCTION__, t);
-
+  
 }
 
 
 void setHexahedreAllocVertexToSegment(struct primalMesh * myPrimalMesh)
 {
-
-
+  
+  
   clock_t t=startFunction(__FUNCTION__);
-
-
-
+  
+  
+  
   myPrimalMesh->vertexToSegments = (connectivity_int **) malloc(myPrimalMesh->vertexNumber * sizeof(connectivity_int*));
   for(connectivity_int i=0; i<myPrimalMesh->vertexNumber; i++)
     {
       myPrimalMesh->vertexToSegments[i] = (connectivity_int *) malloc( myPrimalMesh->vertexToSegmentNumber[i] * sizeof(connectivity_int));
       memset(myPrimalMesh->vertexToSegments[i], 0.0, QUAD*sizeof(connectivity_int));
     }
-
-
-
+  
+  
+  
   for(connectivity_int i=0;i<myPrimalMesh->vertexNumber;i++)
     {
-
+      
       debug_print("%-40s : %ld (%ld)\n",
                   "myPrimalMesh->vertexToSegmentNumber",
                   i,
                   myPrimalMesh->vertexToSegmentNumber[i]
                   );
     }
-
+  
   endFunction(__FUNCTION__, t);
 }
 
-
-
 void setHexahedreFaceCentersAreas(struct primalMesh * myPrimalMesh)
 {
-
+  
   clock_t t=startFunction(__FUNCTION__);
-
+  
   connectivity_int actualPoint;
   connectivity_int nextPoint;
-
+  
   dataType *fC;
-
-
+  
+  
   fC =(dataType *) calloc(DIM3D, sizeof(dataType));
-
+  
   myPrimalMesh->faceCentres = (dataType **) malloc(myPrimalMesh->faceNumber * sizeof(dataType *));
   for(connectivity_int i=0; i<myPrimalMesh->faceNumber; i++)
     {
       myPrimalMesh->faceCentres[i] = (dataType *) malloc(DIM3D * sizeof(dataType));
       memset(myPrimalMesh->faceCentres[i], 0.0, DIM3D*sizeof(dataType));
     }
-
+  
   myPrimalMesh->faceAreas = (dataType **) malloc(myPrimalMesh->faceNumber * sizeof(dataType*));
   for(connectivity_int i=0; i<myPrimalMesh->faceNumber; i++)
     {
       myPrimalMesh->faceAreas[i] = (dataType *) malloc(DIM3D * sizeof(dataType));
       memset(myPrimalMesh->faceAreas[i], 0.0, DIM3D*sizeof(dataType));
     }
-
-
+  
+  
   for(connectivity_int faceAi=0;faceAi<myPrimalMesh->faceNumber;faceAi++)
     {
-
+      
       zeroVector(&fC);
-
+      
       for(connectivity_int vertexAi=0;vertexAi<QUAD;vertexAi++)
         {
           actualPoint = myPrimalMesh->faces[faceAi][vertexAi];
-
+          
           sumTwoVectors(&fC,fC,myPrimalMesh->vertex[actualPoint]);
-
+          
         }
-
-
+      
+      
       scalarDivVector(&(myPrimalMesh->faceCentres[faceAi]), QUAD,fC);
-
+      
       debug_print( "%-40s : %ld %d ( ","myPrimalMesh->faceCentres Estimated", faceAi, QUAD);
-
+      
       for(connectivity_int ii=0;ii<DIM3D;ii++)
         {
           debug_print( "%lf " , myPrimalMesh->faceCentres[faceAi][ii]);
         }
-
+      
       debug_print(")\n");
       if(QUAD==3) {
-
+          
           // Triangle
           affiche("NON IMPLEMENTED ...");
           exit(1);
-
+          
         }
       else
         { //https://github.com/OpenFOAM/OpenFOAM-dev/blob/master/src/OpenFOAM/meshes/primitiveMesh/primitiveMeshFaceCentresAndAreas.C
           dataType *sumN;
           dataType sumA       = ZEROSCALAR;
           dataType *sumAc;
-
+          
           dataType *c;
           dataType a          = ZEROSCALAR;
           dataType * n       ;
-
+          
           dataType *result1;
           dataType *result2;
-
-
+          
+          
           result1 =(dataType *) calloc(DIM3D, sizeof(dataType));
           sumN =(dataType *) calloc(DIM3D, sizeof(dataType));
           sumAc =(dataType *) calloc(DIM3D, sizeof(dataType));
           c =(dataType *) calloc(DIM3D, sizeof(dataType));
           n =(dataType *) calloc(DIM3D, sizeof(dataType));
           result2 =(dataType *) calloc(DIM3D, sizeof(dataType));
-
-
-
+          
+          
+          
           for(connectivity_int vertexAi=0;vertexAi<QUAD;vertexAi++) {
-
+              
               actualPoint = myPrimalMesh->faces[faceAi][vertexAi];
               nextPoint = myPrimalMesh->faces[faceAi][(vertexAi + 1) % QUAD];
-
+              
               sumThreeVectors(&c, (myPrimalMesh->vertex[actualPoint]), (myPrimalMesh->vertex[nextPoint]), (myPrimalMesh->faceCentres[faceAi]) );
-
+              
               subTwoVectors(&result1, (myPrimalMesh->vertex[nextPoint]), (myPrimalMesh->vertex[actualPoint]));
               subTwoVectors(&result2, (myPrimalMesh->faceCentres[faceAi]), (myPrimalMesh->vertex[actualPoint]));
-
+              
               crossProduct(&n, result1, result2);
               mag(&(a), n);
-
+              
               sumTwoVectors(&sumN, sumN, n);
-
+              
               sumA+=a;
               scalarDotVector(&result1, a, c);
               sumTwoVectors(&sumAc, sumAc, result1);
             }
-
+          
           if (sumA < SMALL)
             {
               zeroVector( &(myPrimalMesh->faceAreas[faceAi]) );
@@ -2125,97 +2308,97 @@ void setHexahedreFaceCentersAreas(struct primalMesh * myPrimalMesh)
               scalarDotVector(&(myPrimalMesh->faceAreas[faceAi]), 0.5, sumN);
             }
           debug_print( "%-40s : %ld %d ( ","myPrimalMesh->faceCentres", faceAi, QUAD);
-
+          
           for(connectivity_int ii=0;ii<DIM3D;ii++)
             {
               debug_print( "%lf " , myPrimalMesh->faceCentres[faceAi][ii]);
             }
-
+          
           debug_print(")\n");
-
+          
           debug_print( "%-40s : %ld ( ","myPrimalMesh->faceAreas", faceAi);
-
+          
           for(connectivity_int ii=0;ii<DIM3D;ii++)
             {
               debug_print( "%lf " , myPrimalMesh->faceAreas[faceAi][ii]);
             }
-
+          
           debug_print(")\n");
-
+          
           free(sumN);
           free(sumAc);
           free(c);
           free(n)       ;
           free(result1);
           free(result2);
-
+          
         }
-
+      
     }
-
+  
   free(fC);
   endFunction(__FUNCTION__, t);
-
+  
 }
 
 
 void setHexahedreEstimateVolumeCentroid(struct primalMesh * myPrimalMesh)
 {
-
+  
   clock_t t=startFunction(__FUNCTION__);
-
-
+  
+  
   dataType *result;
-
+  
   // vertex number on faces
-
+  
   connectivity_int it_faceOwner,it_faceNeighbour;
-
+  
   result =(dataType *) calloc(DIM3D, sizeof(dataType));
-
+  
   myPrimalMesh->volumeCentroid = (dataType **) malloc(myPrimalMesh->cellNumber * sizeof(dataType*));
   for(connectivity_int i=0; i<myPrimalMesh->cellNumber; i++)
     {
       myPrimalMesh->volumeCentroid[i] = (dataType *) malloc(DIM3D * sizeof(dataType));
       memset(myPrimalMesh->volumeCentroid[i], 0.0, DIM3D*sizeof(dataType));
     }
-
+  
   //    myPrimalMesh->cellToFacesNumber = (connectivity_short*) malloc(myPrimalMesh->cellNumber * sizeof(connectivity_short));
-
-
+  
+  
   myPrimalMesh->volume  = (dataType *) malloc(myPrimalMesh->cellNumber * sizeof(dataType));
   memset(myPrimalMesh->volume, 0.0, myPrimalMesh->cellNumber*sizeof(dataType));
-
-
+  
+  
   for(connectivity_int celli=0;celli<myPrimalMesh->cellNumber;celli++)
     {
-
+      
       zeroVector(&result);
-
+      
       for (connectivity_int ii=0;ii<myPrimalMesh->cellToFacesOwnerNumber[celli];ii++)
         {
           it_faceOwner = myPrimalMesh->cellToFacesOwner[celli][ii];
-
-
+          
+          
           sumTwoVectors(&result, result, (myPrimalMesh->faceCentres[it_faceOwner]) );
-
+          
         }
-
+      
       for (connectivity_int ii=0;ii<myPrimalMesh->cellToFacesNeighbourNumber[celli];ii++)
         {
           it_faceNeighbour = myPrimalMesh->cellToFacesNeighbour[celli][ii];
-
+          
           sumTwoVectors(&result, result, (myPrimalMesh->faceCentres[it_faceNeighbour]) );
-
+          
         }
       scalarDivVector(&(myPrimalMesh->volumeCentroid[celli]) , myPrimalMesh->cellToFacesNeighbourNumber[celli]+myPrimalMesh->cellToFacesOwnerNumber[celli], result);
-
+      
     }
-
+  
   for(connectivity_int celli=0;celli<myPrimalMesh->cellNumber;celli++)
     {
-
-
+      
+      
       debug_print("%-40s : %ld (%lf %lf %lf)\n",
                   "myPrimalMesh->volumeCentroid Estimated",
                   celli,
@@ -2224,85 +2407,85 @@ void setHexahedreEstimateVolumeCentroid(struct primalMesh * myPrimalMesh)
           myPrimalMesh->volumeCentroid[celli][2]
           );
     }
-
-
+  
+  
   free(result);
   endFunction(__FUNCTION__, t);
-
+  
 }
 
 
 void setHexahedreVolumeCentroid(struct primalMesh * myPrimalMesh)
 {
   clock_t t=startFunction(__FUNCTION__);
-
-  connectivity_int  it_cell=0;
+  
+  //  connectivity_int  it_cell=0;
   dataType        *cellCentroid;
   dataType        pyr3Vol=0.0;
   dataType        *result1;
   dataType        *result2;
   dataType        *result3;
-
+  
   result1 =(dataType *) calloc(DIM3D, sizeof(dataType));
   result2 =(dataType *) calloc(DIM3D, sizeof(dataType));
   result3 =(dataType *) calloc(DIM3D, sizeof(dataType));
   cellCentroid  =(dataType *) calloc(DIM3D, sizeof(dataType));
-
+  
   // vertex number on faces
   connectivity_int it_face;
-
-
+  
+  
   for(connectivity_int celli=0;celli<myPrimalMesh->cellNumber;celli++)
     {
-
+      
       equalVector(&cellCentroid, myPrimalMesh->volumeCentroid[celli]);
-
+      
       zeroVector(&(myPrimalMesh->volumeCentroid[celli]));
-
+      
       for (connectivity_int faceAi=0;faceAi<myPrimalMesh->cellToFacesOwnerNumber[celli];faceAi++)
         {
           it_face = myPrimalMesh->cellToFacesOwner[celli][faceAi];
-
+          
           subTwoVectors( &result1, myPrimalMesh->faceCentres[it_face], cellCentroid );
-
+          
           dotProduct(&pyr3Vol,myPrimalMesh->faceAreas[it_face], result1);
-
+          
           scalarDotVector(&result1, 3.0/4.0, myPrimalMesh->faceCentres[it_face]); //
           scalarDotVector(&result2, 1.0/4.0, cellCentroid); //
-
+          
           sumTwoVectors(&result3,result1,result2);
-
+          
           scalarDotVector(&result1,pyr3Vol,result3);
-
+          
           sumTwoVectors(&(myPrimalMesh->volumeCentroid[celli]),myPrimalMesh->volumeCentroid[celli],result1);
-
+          
           (myPrimalMesh->volume[celli])+=pyr3Vol;
-
+          
         }
-
+      
       for (connectivity_int faceAi=0;faceAi<myPrimalMesh->cellToFacesNeighbourNumber[celli];faceAi++)
         {
           it_face = myPrimalMesh->cellToFacesNeighbour[celli][faceAi];
-
+          
           subTwoVectors( &result1, cellCentroid , myPrimalMesh->faceCentres[it_face]);
-
+          
           dotProduct(&pyr3Vol,myPrimalMesh->faceAreas[it_face], result1);
-
+          
           scalarDotVector(&result1, 3.0/4.0, myPrimalMesh->faceCentres[it_face]); //
           scalarDotVector(&result2, 1.0/4.0, cellCentroid); //
-
+          
           sumTwoVectors(&result3,result1,result2);
-
+          
           scalarDotVector(&result1,pyr3Vol,result3);
-
+          
           sumTwoVectors(&(myPrimalMesh->volumeCentroid[celli]),myPrimalMesh->volumeCentroid[celli],result1);
-
+          
           (myPrimalMesh->volume[celli])+=pyr3Vol;
-
+          
         }
-
-
-
+      
+      
+      
       dataType fVol = fabs(myPrimalMesh->volume[celli]);
       if (fVol > VSMALL)
         {
@@ -2312,28 +2495,29 @@ void setHexahedreVolumeCentroid(struct primalMesh * myPrimalMesh)
         {
           equalVector(&(myPrimalMesh->volumeCentroid[celli]), cellCentroid);
         }
-
-
+      
+      
       myPrimalMesh->volume[celli] *= (1.0/3.0);
-
+      
       debug_print("%-40s : %ld (%lf) (%lf %lf %lf)\n",
                   "myPrimalMesh->volumeCentroid",
-                  it_cell,
+                  celli,
                   myPrimalMesh->volume[celli],
                   myPrimalMesh->volumeCentroid[celli][0],
           myPrimalMesh->volumeCentroid[celli][1],
           myPrimalMesh->volumeCentroid[celli][2]
           );
-
+      
     }
-
+  
   free(result1);
   free(result2);
   free(result3);
+  
   free(cellCentroid);
-
+  
   endFunction(__FUNCTION__, t);
-
+  
 }
 
 void writeVTK(struct primalMesh * myPrimalMesh, struct readWriteVTK * myReadWriteVTK)
@@ -2341,22 +2525,22 @@ void writeVTK(struct primalMesh * myPrimalMesh, struct readWriteVTK * myReadWrit
 // Ecriture dans un fichier VTK du PRIMAL
 ////////////////////////////////////////////////////////////////////////////////////////////////////////
 {
-
+  
   clock_t t=startFunction(__FUNCTION__);
-
+  
   myReadWriteVTK->dataName = "Ma Simulation TEST";
-
+  
   myReadWriteVTK->handle = fopen("test.vtk", "wt");
-
+  
   fprintf(myReadWriteVTK->handle, "# vtk DataFile Version 2.0\n");
   fprintf(myReadWriteVTK->handle, "%s\n\n", myReadWriteVTK->dataName);
-
+  
   fprintf(myReadWriteVTK->handle, "ASCII\n");
-
+  
   fprintf(myReadWriteVTK->handle, "DATASET UNSTRUCTURED_GRID\n");
-
+  
   fprintf(myReadWriteVTK->handle, "POINTS %ld FLOAT\n",myPrimalMesh->vertexNumber);
-
+  
   for (connectivity_int i=0;i<myPrimalMesh->vertexNumber;i++)
     {
       fprintf(myReadWriteVTK->handle,"%f %f %f\n"
@@ -2365,74 +2549,73 @@ void writeVTK(struct primalMesh * myPrimalMesh, struct readWriteVTK * myReadWrit
           ,myPrimalMesh->vertex[i][2]
           );
     }
-
+  
   fprintf(myReadWriteVTK->handle, "\n");
-
+  
   connectivity_int count = 0;
   for (connectivity_int i=0;i<myPrimalMesh->cellNumber;i++)
     count +=(myPrimalMesh->cellToVertexNumber[i]+1); // +1 = column of line count
-
+  
   fprintf(myReadWriteVTK->handle, "CELLS %ld %ld\n",myPrimalMesh->cellNumber, count);
-
+  
   for (connectivity_int i=0;i<myPrimalMesh->cellNumber;i++)
     {
-
+      
       fprintf(myReadWriteVTK->handle,"%ld ",myPrimalMesh->cellToVertexNumber[i]);
       for (connectivity_int j=0;j<myPrimalMesh->cellToVertexNumber[i];j++)
         fprintf(myReadWriteVTK->handle,"%ld ",myPrimalMesh->cellToVertex[i][j]);
       fprintf(myReadWriteVTK->handle,"\n");
-
+      
     }
-
+  
   fprintf(myReadWriteVTK->handle, "CELL_TYPES %ld\n",myPrimalMesh->cellNumber);
   for (connectivity_int i=0;i<myPrimalMesh->cellNumber;i++)
     {
-
+      
       if(myPrimalMesh->cellToVertexNumber[i]==HEXAHEDRON)
         fprintf(myReadWriteVTK->handle,"%d\n",VTK_HEXAHEDRON);
       else
         fprintf(myReadWriteVTK->handle,"???\n");
-
-
+      
+      
     }
-
-
+  
   fclose(myReadWriteVTK->handle);
-
+  
   endFunction(__FUNCTION__, t);
-
+  
 }
 
 
 int main (void)
 {
-
+  
   // Primal Mesh
   struct simulationData mySimulationData;
-
+  
   struct primalMesh myPrimalMesh;
   struct readWriteVTK myReadWriteVTK;
-
+  
   myReadWriteVTK.mySimulationData = &mySimulationData;
-
+  
   mySimulationData.simulationName = "Ma simulation";
-
+  
   myPrimalMesh.L = 2; // cell number on X
   myPrimalMesh.l = 2; // cell number on Y
   myPrimalMesh.H = 2; // cell number on Z
-
+  
 #ifdef DEBUG
-
+  
   myPrimalMesh.M = 2; // cell number on X
   myPrimalMesh.N = 1; // cell number on Y
   myPrimalMesh.P = 1; // cell number on Z
-
+  
 #else
-
-  myPrimalMesh.M = 2; // cell number on X
-  myPrimalMesh.N = 2; // cell number on Y
-  myPrimalMesh.P = 20; // cell number on Z
-
+  
+  myPrimalMesh.M = 20; // cell number on X
+  myPrimalMesh.N = 20; // cell number on Y
+  myPrimalMesh.P = 2; // cell number on Z
+  
 #endif
   myPrimalMesh.vertex                 = NULL;
   myPrimalMesh.cellToVertexNumber     = NULL;
@@ -2451,73 +2634,75 @@ int main (void)
   myPrimalMesh.vertexToSegments       = NULL;
   myPrimalMesh.cellToCells            = NULL;
   myPrimalMesh.cellToCellsNumbers     = NULL;
-
+  
   // FACES
   myPrimalMesh.faces                  = NULL;
   myPrimalMesh.cellToFacesOwner       = NULL;
   myPrimalMesh.cellToFacesNeighbour   = NULL;
-
+  
   //  SEGMENTS
   myPrimalMesh.segments                       = NULL;
   myPrimalMesh.vertexToSegmentOwner           = NULL;
   myPrimalMesh.vertexToSegmentOwnerNumber     = NULL;
   myPrimalMesh.vertexToSegmentNeighbour       = NULL;
   myPrimalMesh.vertexToSegmentNeighbourNumber = NULL;
-
+  
   myPrimalMesh.segmentToFaceOwner            = NULL;
   myPrimalMesh.segmentToFaceOwnerNumber      = NULL;
   myPrimalMesh.segmentToFaceNeighbour        = NULL;
   myPrimalMesh.segmentToFaceNeighbourNumber  = NULL;
-
+  
   // Rectangular mesh with an ...
   myPrimalMesh.cellNumber   = myPrimalMesh.M * myPrimalMesh.N * myPrimalMesh.P;
   myPrimalMesh.vertexNumber = (myPrimalMesh.M+1) * (myPrimalMesh.N+1) * (myPrimalMesh.P+1);
   myPrimalMesh.faceNumber = 0;//HEXAHEDRON_FACES*myPrimalMesh.cellNumber;//(myPrimalMesh.M+1) * (myPrimalMesh.N+1) * (myPrimalMesh.P+1);
   myPrimalMesh.segmentNumber = 0;//QUAD*myPrimalMesh.faceNumber;//HEXAHEDRON_SEGMENTS * myPrimalMesh.cellNumber;; //2*(myPrimalMesh.M+1) * (myPrimalMesh.N+1) * (myPrimalMesh.P+1);
-
-
+  
   // création de **vertex
   setHexahedreVertex(&myPrimalMesh);
-
+  
   // nombre de vertex par cellules **cellToVertexNumber
   setHexahedreCellToVertexNumber(&myPrimalMesh);
-
+  
   // création du lien cellules vers vertex **cellToVertex
   setHexahedreCellToVertex(&myPrimalMesh);
-
+  
   // lien vertex vers cellules
   setHexahedreVertexToCellNumbers(&myPrimalMesh);
-
+  
   setHexahedreVertexToCells(&myPrimalMesh);
-
-
+  
   // cell to cells
   setHexahedreCellToCells(&myPrimalMesh);
-
-  setHexahedrecellToFacesOwnerNeighbour(&myPrimalMesh);
-
+  
+  setHexahedreCellToFacesOwnerNeighbour(&myPrimalMesh);
+  
+  setHexahedreFaceToCells(&myPrimalMesh);
+  
   setHexahedreSegments(&myPrimalMesh);
-
+  
   setHexahedreVertexToSegments(&myPrimalMesh);
-
+  
   setHexahedreSegmentToFaces(&myPrimalMesh);
-
+  
   // centres
   setHexahedreFaceCentersAreas(&myPrimalMesh);
-
+  
   setHexahedreEstimateVolumeCentroid(&myPrimalMesh);
-
+  
   setHexahedreVolumeCentroid(&myPrimalMesh);
-
+  
   fflush(stderr);
   fflush(stdout);
-
+  
   affiche("%-40s : %ld\n","Cell number",myPrimalMesh.cellNumber);
   affiche("%-40s : %ld\n","Vertex number",myPrimalMesh.vertexNumber);
   affiche("%-40s : %ld\n","Surface number",myPrimalMesh.faceNumber);
   affiche("%-40s : %ld\n","Segment number",myPrimalMesh.segmentNumber);
-
+  
   freeMemory(&myPrimalMesh);
-
+  
 }
 
+
+
index 1be8e79..c12650d 100644 (file)
--- a/src/mmd.h
+++ b/src/mmd.h
@@ -73,8 +73,8 @@ struct primalMesh {
     connectivity_int            *          vertexToCellNumbers;
 
     connectivity_int            **         vertexToSegments; // done
-    connectivity_int          *          vertexToSegmentNumber; // done
-    connectivity_int          *          cellToVertexNumber; // done
+    connectivity_int            *          vertexToSegmentNumber; // done
+    connectivity_int            *          cellToVertexNumber; // done
 
 
 
@@ -107,8 +107,10 @@ struct primalMesh {
 
     connectivity_int    *      cellToFacesNumber;
     connectivity_int    *      faceToVertexNumber; // done
+    connectivity_int    *      faceToCellsNumber; // done
     connectivity_int **     faceToVertex; // vertexToFaces -> facesTo
     connectivity_int **     faceToSegments;
+    connectivity_int **     faceToCells;
     dataType       **       faceCentres;
     dataType       **       faceAreas;
 
@@ -148,10 +150,10 @@ struct readWriteVTK {
 
 
 #define debug_print(...) \
-    do { if (DEBUG_TEST) fprintf(stderr, __VA_ARGS__); } while (0)
+    do { if (DEBUG_TEST) fprintf(stderr, __VA_ARGS__); fflush(stderr);fflush(stdout);} while (0)
 
 #define release_print(...) \
-    do {  printf( __VA_ARGS__); } while (0)
+    do {  printf( __VA_ARGS__); fflush(stderr);fflush(stdout);} while (0)
 
 /*
 #define debug_print(...) \