From 87e416b60b5fc206203e76c58833af4a1b0efca0 Mon Sep 17 00:00:00 2001
From: Romain Boman <romain.boman@gmail.com>
Date: Thu, 8 Aug 2024 11:45:14 +0200
Subject: [PATCH] add sigvm extractor to cxxfem models

---
 cxxfem/src/femPost.cpp                        | 15 +++++++++++++++
 models/Clidastes/Clidastes_propython_50k.py   |  2 +-
 models/bonemodel.py                           |  2 ++
 models/bonemodel2.py                          |  3 ++-
 models/dolicorhynchops/dolicorhynchops_10k.py | 12 ++++++++++++
 5 files changed, 32 insertions(+), 2 deletions(-)

diff --git a/cxxfem/src/femPost.cpp b/cxxfem/src/femPost.cpp
index 4b30ca3..395335a 100644
--- a/cxxfem/src/femPost.cpp
+++ b/cxxfem/src/femPost.cpp
@@ -399,6 +399,21 @@ Post::probe(std::string const &name, std::string const &grpname)
         // std::cout << "\tgot from gmsh: " << values << '\n';
         // std::cout << "\tdistance = " << distance << std::endl;
 
+        if(values.size() == 9) // tensor -> compute j2
+        {
+            // xx, xy, xz, yx, yy, yz, zx, zy, zz
+            //  0,  1,  2,  3,  4,  5,  6,  7,  8
+            double xx = values[0];
+            double yy = values[4];
+            double zz = values[8];
+            double xy = values[1];
+            double zx = values[6];
+            double yz = values[5];
+            double j2 = sqrt( ((xx-yy)*(xx-yy) + (yy-zz)*(yy-zz) + (zz-xx)*(zz-xx) )/2 + 3*(xy*xy+yz*yz+zx*zx) );
+            values.clear();
+            values.push_back(j2);
+        }
+
         all_values.insert(all_values.end(), values.begin(), values.end());
     }
 
diff --git a/models/Clidastes/Clidastes_propython_50k.py b/models/Clidastes/Clidastes_propython_50k.py
index bfe6ccb..15b001f 100644
--- a/models/Clidastes/Clidastes_propython_50k.py
+++ b/models/Clidastes/Clidastes_propython_50k.py
@@ -7,7 +7,7 @@ def parms(d={}):
     p = {}
     import os
     path = os.path.join(os.path.dirname(__file__),'50k')
-    p['bone'] = f'{path}\Clidastes_50k.ply'
+    p['bone'] = f'{path}/Clidastes_50k.ply'
     p['fixations'] = [
         {
             'name': 'contact_pts',
diff --git a/models/bonemodel.py b/models/bonemodel.py
index a973806..6193e0b 100644
--- a/models/bonemodel.py
+++ b/models/bonemodel.py
@@ -318,6 +318,8 @@ def getMetafor(p={}):
                 valuesmanager.add(idx, IFNodalValueExtractor(target, field), fname)
             else:
                 raise Exception(f'Unknown variable: {var}')
+            # if the target is a single node, display the extractor [TSC-EXT]
+            # otherwise, the user should read the ascii file in the workspace.
             if target.getNumberOfMeshPoints() == 1:
                 metafor.getTestSuiteChecker().checkExtractor(idx)
             idx+=1
diff --git a/models/bonemodel2.py b/models/bonemodel2.py
index 8f2defb..e7397ba 100644
--- a/models/bonemodel2.py
+++ b/models/bonemodel2.py
@@ -230,7 +230,8 @@ def solve(p={}):
         'epszz': ('smooth_strain_zz', ''), 
         'epsxy': ('smooth_strain_xy', ''), 
         'epsxz': ('smooth_strain_xz', ''), 
-        'epsyz': ('smooth_strain_yz', '')                          
+        'epsyz': ('smooth_strain_yz', ''),
+        'sigvm': ('smooth_stress_tensor', 'MPa')  # post.probe computes sigvm                  
     }
 
     for extr in p['extractors']:
diff --git a/models/dolicorhynchops/dolicorhynchops_10k.py b/models/dolicorhynchops/dolicorhynchops_10k.py
index 99e195c..ac51fdf 100644
--- a/models/dolicorhynchops/dolicorhynchops_10k.py
+++ b/models/dolicorhynchops/dolicorhynchops_10k.py
@@ -42,6 +42,18 @@ def parms(d={}):
             'direction': ['x', 'z']
         }
     ]
+    p['extractors'] = [
+        {
+            'name': 'tooth1',
+            'nodes': [-10.20362, -17.46838, -229.9061],
+            'variables': [ 'sigvm' ]
+        },
+        {
+            'name': 'tooth2',
+            'nodes': [-11.92466, 26.3042, -229.5354],
+            'variables': [ 'sigxx', 'sigyy', 'sigzz', 'sigvm' ]
+        }
+    ]
 
     # material properties
     p['density'] = 1.850e-9  # [T/mm³]
-- 
GitLab