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
\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]
# mesh leg
import mesh
......@@ -536,9 +536,11 @@ myModel.RigidBody(name='rigidBone', refPointRegion=region5, tieRegion=region4)
\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=!]
# build cast
myPart = myModel.Part(name='cast', dimensionality=THREE_D, type=DEFORMABLE_BODY)
......@@ -547,7 +549,7 @@ execfile('basil140611_castContours.py')
# loft cast
e = myPart.edges
# 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
ledges=list()
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)
\end{lstlisting}
......@@ -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}
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.
......
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