Commit 7bbce2ee authored by Mark van Turnhout's avatar Mark van Turnhout
Browse files

minor documentation tweaking

parent 15c12ba4
...@@ -475,7 +475,7 @@ We select the inner radius of the assist-disc (lines \texttt{2--4}) and project ...@@ -475,7 +475,7 @@ We select the inner radius of the assist-disc (lines \texttt{2--4}) and project
\subsection{Meshing the leg} \subsection{Meshing the leg}
After partitioning of the skin surface, we can have Abaqus mesh the leg \texttt{instance}. First, we need to `seed' the leg: seeds will be placed at the edges in the model with a density determined by \texttt{param.seed}. These seeds will serve as the corner points of the elements that form a part of the edge: for linear elements nodes will coincide with the seeds; for quadratic elements there will also be nodes between the seeds. After partitioning of the skin surface, we can have Abaqus mesh the leg \texttt{instance}\footnote{In Abaqus you can mesh on the \texttt{part} \textsl{before} it is instanced in the model assembly, or on the \texttt{instance} \textsl{after} the part has been imported into the model assembly. We use the latter method because the assist-disc for partitioning the skin surface is not available in the \texttt{part} but only in the assembly (\texttt{instance}).}. First, we need to `seed' the leg: seeds will be placed at the edges in the model with a density determined by \texttt{param.seed}. These seeds will serve as the corner points of the elements that form a part of the edge: for linear elements nodes will coincide with the seeds; for quadratic elements there will also be nodes between the seeds.
\begin{lstlisting}[language=apython] \begin{lstlisting}[language=apython]
# mesh leg # mesh leg
import mesh import mesh
...@@ -536,9 +536,11 @@ myModel.RigidBody(name='rigidBone', refPointRegion=region5, tieRegion=region4) ...@@ -536,9 +536,11 @@ myModel.RigidBody(name='rigidBone', refPointRegion=region5, tieRegion=region4)
\subsection{The cast} \subsection{The cast}
When \texttt{param.cast = 1}, we also model the alginate cast around the leg. The modelling procedure that we follow is similar to that of the leg: create part, import geometry, create a hole for the indenter, instance part into the model assembly, mesh the cast, convert the cast to a rigid surface, and define contact between cast and skin. When \texttt{param.cast = 1}, we also model the alginate cast around the leg. The modelling procedure that we follow is similar to that of the leg: create part, import geometry, create a hole for the indenter, instance part into the model assembly, mesh the cast, convert the cast to a rigid surface, and define contact between cast and skin.\\
First, we create a \texttt{part} for the cast, import the geometry contours and loft the cast: \noindent The first task for \bas{buildFEM} when the cast is included in the model is to calculate the contours for the cast. For every (regularised) contour in the skin set, \bas{buildFEM} calculates the centre, and with this centre each of the 100 points in the skin contour are moved 0.1\,mm in the radial direction. Thus, on average there will be a 0.1\,mm gap between leg and cast at the start of the simulation.
These cast contours are written to a file \texttt{basil<basilid>\_castContours.py\index{basil<basilid>\_castContours.py@\texttt{basil<basilid>\_castContours.py}}} that is imported and lofted similar to the leg contours in a new \texttt{part}:
\begin{lstlisting}[language=apython,escapechar=!] \begin{lstlisting}[language=apython,escapechar=!]
# build cast # build cast
myPart = myModel.Part(name='cast', dimensionality=THREE_D, type=DEFORMABLE_BODY) myPart = myModel.Part(name='cast', dimensionality=THREE_D, type=DEFORMABLE_BODY)
...@@ -547,7 +549,7 @@ execfile('basil140611_castContours.py') ...@@ -547,7 +549,7 @@ execfile('basil140611_castContours.py')
# loft cast # loft cast
e = myPart.edges e = myPart.edges
# get ordered list of egdes (because: not the same as wire-numbers, and prone to change when the part changes) # get ordered list of egdes (because: not the same as wire-numbers, and prone to change when the part changes)
ed = e.getClosest(coordinates=((-8.230588, 2.481426, -9.000000), (-8.738121, 2.341253, -8.000000), (-8.872285, 2.523443, -7.000000), (-9.310450, 2.158532, -6.000000), (-9.679797, 2.190323, -5.000000), (-9.724094, 2.282848, -4.000000), (-9.870556, 2.097831, -3.000000), (-9.926339, 2.193581, -2.000000), (-9.938902, 1.832282, -1.000000), (-9.967482, 2.154195, 0.000000), (-9.881632, 2.032669, 1.000000), (-9.640275, 1.877945, 2.000000), (-9.408549, 1.820624, 3.000000), (-9.286976, 2.289981, 4.000000), (-9.132973, 2.417475, 5.000000), (-9.015611, 2.588699, 6.000000), (-8.827642, 2.824779, 7.000000), (-8.656432, 3.013280, 8.000000), (-8.475119, 3.391914, 9.000000), )) ed = e.getClosest(coordinates=((-8.230588, 2.481426, -9.000000), (-8.738121, 2.341253, -8.000000), !\textnormal{(up to 20 triplets of 3D coordinates)}!, ))
# create ordered edge list # create ordered edge list
ledges=list() ledges=list()
for i in range(0, 19): for i in range(0, 19):
...@@ -557,3 +559,4 @@ for i in range(0, 19): ...@@ -557,3 +559,4 @@ for i in range(0, 19):
myPart.ShellLoft(loftsections=((ledges[0], ), (ledges[1], ), (ledges[2], ), (ledges[3], ), (ledges[4], ), (ledges[5], ), (ledges[6], ), (ledges[7], ), (ledges[8], ), (ledges[9], ), (ledges[10], ), (ledges[11], ), (ledges[12], ), (ledges[13], ), (ledges[14], ), (ledges[15], ), (ledges[16], ), (ledges[17], ), (ledges[18], ), ), startCondition=NONE,endCondition=NONE) myPart.ShellLoft(loftsections=((ledges[0], ), (ledges[1], ), (ledges[2], ), (ledges[3], ), (ledges[4], ), (ledges[5], ), (ledges[6], ), (ledges[7], ), (ledges[8], ), (ledges[9], ), (ledges[10], ), (ledges[11], ), (ledges[12], ), (ledges[13], ), (ledges[14], ), (ledges[15], ), (ledges[16], ), (ledges[17], ), (ledges[18], ), ), startCondition=NONE,endCondition=NONE)
\end{lstlisting} \end{lstlisting}
...@@ -178,7 +178,7 @@ The $3\times 3$ matrix (centres of mass, Euler angles) is written to \texttt{Bon ...@@ -178,7 +178,7 @@ The $3\times 3$ matrix (centres of mass, Euler angles) is written to \texttt{Bon
\subsection{Map indenter movement}\label{mapind} \subsection{Map indenter movement}\label{mapind}
The indenter movement is of course needed as boundary condition in the FEM. Mapping of the indenter comprises of three steps: (1) The function \bas{estCylPos} finds the 3D orientation and the centre of mass of the indenter with the help from \texttt{MRI\_slices\_loading.mat\index{MRI\_slices\_loading.mat@\texttt{MRI\_slices\_loading.mat}}} and \texttt{contour\_skin\_loading-ncc.mat\index{contour\_skin\_loading-ncc.mat@\texttt{contour\_skin\_loading-ncc.mat}}}; next (2) \bas{estIndDisp}{} uses \texttt{contour\_skin\_preload-ncc.mat\index{contour\_skin\_preload-ncc.mat@\texttt{contour\_skin\_preload-ncc.mat}}} to find the start position of the indenter (for the FEM); and finally (3) \bas{estIndDisp}{} uses \texttt{contour\_skin\_loading-ncc.mat\index{contour\_skin\_loading-ncc.mat@\texttt{contour\_skin\_loading.mat-ncc}}} to find the end position of the indenter.\\ The indenter movement is of course needed as boundary condition in the FEM. Mapping of the indenter comprises of three steps: (1) The function \bas{estCylPos} finds the 3D orientation and the centre of mass of the indenter with the help from \texttt{MRI\_slices\_loading.mat\index{MRI\_slices\_loading.mat@\texttt{MRI\_slices\_loading.mat}}} and \texttt{contour\_skin\_loading-ncc.mat\index{contour\_skin\_loading-ncc.mat@\texttt{contour\_skin\_loading-ncc.mat}}}; next (2) \bas{estIndDisp}{} uses \texttt{contour\_skin\_preload-ncc.mat\index{contour\_skin\_preload-ncc.mat@\texttt{contour\_skin\_preload-ncc.mat}}} to find the start position of the indenter (for the FEM); and finally (3) \bas{estIndDisp}{} uses \texttt{contour\_skin\_loading-ncc.mat\index{contour\_skin\_loading-ncc.mat@\texttt{contour\_skin\_loading-ncc.mat}}} to find the end position of the indenter.\\
\noindent First, we find the orientation of the indenter in the MRI-data during indentation. The skin contours during indentation are loaded from \texttt{contour\_skin\_loading-ncc.mat\index{contour\_skin\_loading-ncc.mat@\texttt{contour\_skin\_loading-ncc.mat}}} and used to dismiss voxel data that belongs to the soft tissue in the \texttt{MRI\_slices\_loading.mat\index{MRI\_slices\_loading.mat@\texttt{MRI\_slices\_loading.mat}}}-MR-data. We are left with the very bright indenter and some noise in these images and from these we can threshold the voxels that belong to the indenter. A call to \bas{getIndDir} gives us the eigenvectors of the mass moment of inertia of the indenter voxels, and the centre of mass of these voxels. \noindent First, we find the orientation of the indenter in the MRI-data during indentation. The skin contours during indentation are loaded from \texttt{contour\_skin\_loading-ncc.mat\index{contour\_skin\_loading-ncc.mat@\texttt{contour\_skin\_loading-ncc.mat}}} and used to dismiss voxel data that belongs to the soft tissue in the \texttt{MRI\_slices\_loading.mat\index{MRI\_slices\_loading.mat@\texttt{MRI\_slices\_loading.mat}}}-MR-data. We are left with the very bright indenter and some noise in these images and from these we can threshold the voxels that belong to the indenter. A call to \bas{getIndDir} gives us the eigenvectors of the mass moment of inertia of the indenter voxels, and the centre of mass of these voxels.
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment