From b979bb3ba686270a95d79ffe41862fe2c1d2d140 Mon Sep 17 00:00:00 2001
From: Romain Boman <r.boman@uliege.be>
Date: Wed, 22 May 2024 16:13:10 +0200
Subject: [PATCH] add basic extractors to cxxfem (to be continued)

---
 models/bonemodel2.py | 47 ++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 47 insertions(+)

diff --git a/models/bonemodel2.py b/models/bonemodel2.py
index 417ae52..47af45d 100644
--- a/models/bonemodel2.py
+++ b/models/bonemodel2.py
@@ -64,6 +64,7 @@ def parms(d={}):
     ]
 
     p['loads'] = [] # additional loads
+    p['extractors'] = [] # additional extractors
 
     # material properties
     p['Young'] = 17000.      # [MPa] elastic modulus - bone: 17-20 GPa
@@ -135,6 +136,10 @@ def solve(p={}):
     for fix in p['fixations']:
         create_group(fix['nodes'], nods_no, nods_pos, groups, fix['name'])
 
+    # create groups of additional extractors
+    for extr in p['extractors']:
+        create_group(extr['nodes'], nods_no, nods_pos, groups, extr['name'])
+
     # --------------------------------------------------------------------------
     # print('== ADDING MEDIUM...')
     print('')
@@ -189,6 +194,7 @@ def solve(p={}):
 
     print('extracting results...')
     print(f'\tinternal energy = {solver.int_energy:.3f} N.mm')
+    # fixations (reaction forces)
     for fix in p['fixations']:
         grpname = fix['name']
         v = np.array(post.probe('force_vector', grpname))
@@ -198,6 +204,7 @@ def solve(p={}):
         print(f'\t{grpname}_Fy = {v[1]:.3f} N')
         print(f'\t{grpname}_Fz = {v[2]:.3f} N')
 
+    # muscle groups
     for name, group in mgroups.items():
         v=np.array( [0.0, 0.0, 0.0] )
         for tag in group.ntags:
@@ -206,6 +213,46 @@ def solve(p={}):
         print(f'\t{name}_Fy = {v[1]:.3f} N')
         print(f'\t{name}_Fz = {v[2]:.3f} N')
 
+    # additional extractors
+
+    var2field = { 
+        'dx': ('X', 'mm'), 
+        'dy': ('Y', 'mm'), 
+        'dz': ('Z', 'mm'),  
+        'sigxx': ('smooth_stress_xx', 'MPa'),  
+        'sigyy': ('smooth_stress_yy', 'MPa'), 
+        'sigzz': ('smooth_stress_zz', 'MPa'), 
+        'sigxy': ('smooth_stress_xy', 'MPa'), 
+        'sigxz': ('smooth_stress_xz', 'MPa'), 
+        'sigyz': ('smooth_stress_yz', 'MPa'), 
+        'epsxx': ('strain_xx', ''), 
+        'epsyy': ('strain_yy', ''), 
+        'epszz': ('strain_zz', ''), 
+        'epsxy': ('strain_xy', ''), 
+        'epsxz': ('strain_xz', ''), 
+        'epsyz': ('strain_yz', '')                          
+    }
+
+    for extr in p['extractors']:
+        # if only one variable is given, convert it to a list
+        if isinstance(extr['variables'], str):
+            extr['variables'] = [extr['variables']]
+
+        for var in extr['variables']:
+            fname = f'{extr["name"]}_{var}.tsv'
+            grpname = extr['name']
+            if var.lower() in var2field:
+                field = var2field[var.lower()][0]
+                units = var2field[var.lower()][1]
+                v = np.array(post.probe(field, grpname))
+                np.savetxt(fname, v, delimiter='\t', header='value')
+                if len(v) == 1:
+                    print(f'\t{grpname}_{var} = {v[0]:.3f} {units}')
+                else:
+                    print(f'\t{grpname}_{var} = ({len(v)} values in "{fname}")')
+            else:
+                print(f'unknown variable: "{var}"')
+
     end_time = time.perf_counter()
     elapsed_time = end_time - start_time
     print(f'Total Execution time: {elapsed_time:.1f}s')
-- 
GitLab