From 9355ae3cdc498b624e358790d7f9debae985709c Mon Sep 17 00:00:00 2001
From: rosmal <rosmal@ID5974>
Date: Tue, 18 Feb 2025 13:51:02 +0100
Subject: [PATCH] py3, circumvent if no webs present

---
 finstrip_wrapper/core/blade.py | 56 +++++++++++++++++++++-------------
 1 file changed, 34 insertions(+), 22 deletions(-)

diff --git a/finstrip_wrapper/core/blade.py b/finstrip_wrapper/core/blade.py
index 04e983f..f4c2ce3 100644
--- a/finstrip_wrapper/core/blade.py
+++ b/finstrip_wrapper/core/blade.py
@@ -42,7 +42,7 @@ class FINSTRIPWrapperBlade(FINSTRIPWrapper):
         # use BECAS cross section properties or not
         self.use_becas_stiffness = False
 
-        for k, w in kwargs.iteritems():
+        for k, w in kwargs.items():
             try:
                 setattr(self, k, w)
             except:
@@ -140,7 +140,7 @@ class FINSTRIPWrapperBlade(FINSTRIPWrapper):
             out_str.append('%s, %0.2f' % (var_name, var_value) + n)
 
         # write materials
-        mat_names = self.cs2d['materials'].keys()
+        mat_names = list(self.cs2d['materials'].keys())
         matprops = self.cs2d['matprops']
 
         def _write_iso(out_str, n, label, E1, nu12, rho):
@@ -372,21 +372,29 @@ class FINSTRIPWrapperBlade(FINSTRIPWrapper):
         # actual amount of webs in post processing files can differ from input
         # NOTE: if the flatback web is oriented such that it closes the cross section,
         # then it is identified as if the web was part of the surface
+        # If only a closed shape without real shear web is processed, the code
+        # herafter crashes, needs to be fixed to handle circular shape at root
         self.nweb = len(idxs[1:])
 
-        self.nnode_web = []
-        for w in range(self.nweb):
-            self.nnode_web.append(idxs[w + 1] - idxs[w] + 1)
+        if self.nweb > 0:  # circumvent if no webs are present
+            self.nnode_web = []
+            for w in range(self.nweb):
+                self.nnode_web.append(idxs[w + 1] - idxs[w] + 1)
 
-        self.nnode_web_max = np.max(np.array(self.nnode_web))
-        self.node_loc_web = np.zeros(
-            (self.nweb, self.nnode_web_max, 2))
-        for w in range(self.nweb):
-            self.node_loc_web[
-                w, :self.nnode_web[w] - 1, :] = self.mode_shape[0, 0, idxs[w] + 1:idxs[w + 1] + 1, :2]
-            # add second node of last element
-            self.node_loc_web[w, self.nnode_web[w] - 1, :] = self.mode_shape[
-                0, 0, idxs[w + 1], 2:4]
+            self.nnode_web_max = np.max(np.array(self.nnode_web))
+            self.node_loc_web = np.zeros(
+                (self.nweb, self.nnode_web_max, 2))
+            for w in range(self.nweb):
+                self.node_loc_web[
+                    w, :self.nnode_web[w] - 1, :] = self.mode_shape[0, 0, idxs[w] + 1:idxs[w + 1] + 1, :2]
+                # add second node of last element
+                self.node_loc_web[w, self.nnode_web[w] - 1, :] = self.mode_shape[
+                    0, 0, idxs[w + 1], 2:4]
+        else:
+            self.nnode_web = [0]
+            self.nnode_web_max = 0
+            self.node_loc_web = np.zeros(
+                (self.nweb, self.nnode_web_max, 2))
 
         # obtain surface displacements
         self.node_u_surf = np.zeros(
@@ -398,14 +406,18 @@ class FINSTRIPWrapperBlade(FINSTRIPWrapper):
             :, :, -1, :] = self.mode_shape[:, :, idxs[0], 6:]
 
         # obtain web displacements
-        self.node_u_web = np.zeros(
-            (self.ncase, self.nweb, self.nmode, self.nnode_web_max, 2))
-        for w in range(self.nweb):
-            self.node_u_web[
-                :, w, :, :self.nnode_web[w] - 1, :] = self.mode_shape[:, :, idxs[w] + 1:idxs[w + 1] + 1, 4:6]
-            # add second node of last element
-            self.node_u_web[:, w, :, self.nnode_web[w] - 1, :] = self.mode_shape[
-                :, :, idxs[w + 1], 6:]
+        if self.nweb > 0:  # circumvent if no webs are present
+            self.node_u_web = np.zeros(
+                (self.ncase, self.nweb, self.nmode, self.nnode_web_max, 2))
+            for w in range(self.nweb):
+                self.node_u_web[
+                    :, w, :, :self.nnode_web[w] - 1, :] = self.mode_shape[:, :, idxs[w] + 1:idxs[w + 1] + 1, 4:6]
+                # add second node of last element
+                self.node_u_web[:, w, :, self.nnode_web[w] - 1, :] = self.mode_shape[
+                    :, :, idxs[w + 1], 6:]
+        else:
+            self.node_u_web = np.zeros(
+                (self.ncase, self.nweb, self.nmode, self.nnode_web_max, 2))
 
         plot = False
         if plot:
-- 
GitLab