/FiniteElasticity/Cantilever/src/CantileverExample.py

http://github.com/PrasadBabarendaGamage/examples · Python · 346 lines · 221 code · 41 blank · 84 comment · 20 complexity · ce79b12173645ceea556e8f413d47c5e MD5 · raw file

  1. #> \file
  2. #> \author Chris Bradley
  3. #> \brief This is an example script to solve a finite elasticity equation using openCMISS calls in python.
  4. #>
  5. #> \section LICENSE
  6. #>
  7. #> Version: MPL 1.1/GPL 2.0/LGPL 2.1
  8. #>
  9. #> The contents of this file are subject to the Mozilla Public License
  10. #> Version 1.1 (the "License"); you may not use this file except in
  11. #> compliance with the License. You may obtain a copy of the License at
  12. #> http://www.mozilla.org/MPL/
  13. #>
  14. #> Software distributed under the License is distributed on an "AS IS"
  15. #> basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
  16. #> License for the specific language governing rights and limitations
  17. #> under the License.
  18. #>
  19. #> The Original Code is openCMISS
  20. #>
  21. #> The Initial Developer of the Original Code is University of Auckland,
  22. #> Auckland, New Zealand and University of Oxford, Oxford, United
  23. #> Kingdom. Portions created by the University of Auckland and University
  24. #> of Oxford are Copyright (C) 2007 by the University of Auckland and
  25. #> the University of Oxford. All Rights Reserved.
  26. #>
  27. #> Contributor(s):
  28. #>
  29. #> Alternatively, the contents of this file may be used under the terms of
  30. #> either the GNU General Public License Version 2 or later (the "GPL"), or
  31. #> the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
  32. #> in which case the provisions of the GPL or the LGPL are applicable instead
  33. #> of those above. if you wish to allow use of your version of this file only
  34. #> under the terms of either the GPL or the LGPL, and not to allow others to
  35. #> use your version of this file under the terms of the MPL, indicate your
  36. #> decision by deleting the provisions above and replace them with the notice
  37. #> and other provisions required by the GPL or the LGPL. if you do not delete
  38. #> the provisions above, a recipient may use your version of this file under
  39. #> the terms of any one of the MPL, the GPL or the LGPL.
  40. #>
  41. #> \example FiniteElasticity/Cantilever/src/CantileverExample.py
  42. ## Example script to solve a finite elasticity equation using openCMISS calls in python.
  43. ## \par Latest Builds:
  44. ## \li <a href='http://autotest.bioeng.auckland.ac.nz/opencmiss-build/logs_x86_64-linux/FiniteElasticity/Cantilever/build-intel'>Linux Intel Build</a>
  45. ## \li <a href='http://autotest.bioeng.auckland.ac.nz/opencmiss-build/logs_x86_64-linux/FiniteElasticity/Cantilever/build-gnu'>Linux GNU Build</a>
  46. #<
  47. #> Main script
  48. # Add Python bindings directory to PATH
  49. import sys, os
  50. sys.path.append(os.sep.join((os.environ['OPENCMISS_ROOT'],'cm','bindings','python')))
  51. # Intialise OpenCMISS
  52. from opencmiss import CMISS
  53. # Set problem parameters
  54. width = 60.0
  55. length = 40.0
  56. height = 40.0
  57. density=9.0E-4 #in g mm^-3
  58. gravity=[0.0,0.0,-9.81] #in m s^-2
  59. UsePressureBasis = False
  60. NumberOfGaussXi = 2
  61. coordinateSystemUserNumber = 1
  62. regionUserNumber = 1
  63. basisUserNumber = 1
  64. pressureBasisUserNumber = 2
  65. generatedMeshUserNumber = 1
  66. meshUserNumber = 1
  67. decompositionUserNumber = 1
  68. geometricFieldUserNumber = 1
  69. fibreFieldUserNumber = 2
  70. materialFieldUserNumber = 3
  71. dependentFieldUserNumber = 4
  72. sourceFieldUserNumber = 5
  73. equationsSetFieldUserNumber = 6
  74. equationsSetUserNumber = 1
  75. problemUserNumber = 1
  76. CMISS.ErrorHandlingModeSet(CMISS.ErrorHandlingModes.TrapError)
  77. # Set all diganostic levels on for testing
  78. #CMISS.DiagnosticsSetOn(CMISS.DiagnosticTypes.All,[1,2,3,4,5],"Diagnostics",["DOMAIN_MAPPINGS_LOCAL_FROM_GLOBAL_CALCULATE"])
  79. numberOfLoadIncrements = 2
  80. numberGlobalXElements = 1
  81. numberGlobalYElements = 1
  82. numberGlobalZElements = 1
  83. InterpolationType = 1
  84. if(numberGlobalZElements==0):
  85. numberOfXi = 2
  86. else:
  87. numberOfXi = 3
  88. # Get the number of computational nodes and this computational node number
  89. numberOfComputationalNodes = CMISS.ComputationalNumberOfNodesGet()
  90. computationalNodeNumber = CMISS.ComputationalNodeNumberGet()
  91. # Create a 3D rectangular cartesian coordinate system
  92. coordinateSystem = CMISS.CoordinateSystem()
  93. coordinateSystem.CreateStart(coordinateSystemUserNumber)
  94. coordinateSystem.DimensionSet(3)
  95. coordinateSystem.CreateFinish()
  96. # Create a region and assign the coordinate system to the region
  97. region = CMISS.Region()
  98. region.CreateStart(regionUserNumber,CMISS.WorldRegion)
  99. #region.LabelSet("Region")
  100. region.coordinateSystem = coordinateSystem
  101. region.CreateFinish()
  102. # Define basis
  103. basis = CMISS.Basis()
  104. basis.CreateStart(basisUserNumber)
  105. if InterpolationType == (1,2,3,4):
  106. basis.type = CMISS.BasisTypes.LagrangeHermiteTP
  107. elif InterpolationType == (7,8,9):
  108. basis.type = CMISS.BasisTypes.BasisSimplexType
  109. basis.numberOfXi = numberOfXi
  110. basis.interpolationXi = [CMISS.BasisInterpolationSpecifications.LinearLagrange]*numberOfXi
  111. if(NumberOfGaussXi>0):
  112. basis.quadratureNumberOfGaussXi = [NumberOfGaussXi]*numberOfXi
  113. basis.CreateFinish()
  114. if(UsePressureBasis):
  115. # Define pressure basis
  116. pressureBasis = CMISS.Basis()
  117. pressureBasis.CreateStart(pressureBasisUserNumber)
  118. if InterpolationType == (1,2,3,4):
  119. pressureBasis.type = CMISS.BasisTypes.LagrangeHermiteTP
  120. elif InterpolationType == (7,8,9):
  121. pressureBasis.type = CMISS.BasisTypes.BasisSimplexType
  122. pressureBasis.numberOfXi = numberOfXi
  123. pressureBasis.interpolationXi = [CMISS.BasisInterpolationSpecifications.LinearLagrange]*numberOfXi
  124. if(NumberOfGaussXi>0):
  125. pressureBasis.quadratureNumberOfGaussXi = [NumberOfGaussXi]*numberOfXi
  126. pressureBasis.CreateFinish()
  127. # Start the creation of a generated mesh in the region
  128. generatedMesh = CMISS.GeneratedMesh()
  129. generatedMesh.CreateStart(generatedMeshUserNumber,region)
  130. generatedMesh.type = CMISS.GeneratedMeshTypes.Regular
  131. if(UsePressureBasis):
  132. generatedMesh.basis = [basis,pressureBasis]
  133. else:
  134. generatedMesh.basis = [basis]
  135. if(numberGlobalZElements==0):
  136. generatedMesh.extent = [width,height]
  137. generatedMesh.numberOfElements = [numberGlobalXElements,numberGlobalYElements]
  138. else:
  139. generatedMesh.extent = [width,length,height]
  140. generatedMesh.numberOfElements = [numberGlobalXElements,numberGlobalYElements,numberGlobalZElements]
  141. # Finish the creation of a generated mesh in the region
  142. mesh = CMISS.Mesh()
  143. generatedMesh.CreateFinish(meshUserNumber,mesh)
  144. # Create a decomposition for the mesh
  145. decomposition = CMISS.Decomposition()
  146. decomposition.CreateStart(decompositionUserNumber,mesh)
  147. decomposition.type = CMISS.DecompositionTypes.Calculated
  148. decomposition.numberOfDomains = numberOfComputationalNodes
  149. decomposition.CreateFinish()
  150. # Create a field for the geometry
  151. geometricField = CMISS.Field()
  152. geometricField.CreateStart(geometricFieldUserNumber,region)
  153. geometricField.MeshDecompositionSet(decomposition)
  154. geometricField.TypeSet(CMISS.FieldTypes.Geometric)
  155. geometricField.VariableLabelSet(CMISS.FieldVariableTypes.U,"Geometry")
  156. geometricField.ComponentMeshComponentSet(CMISS.FieldVariableTypes.U,1,1)
  157. geometricField.ComponentMeshComponentSet(CMISS.FieldVariableTypes.U,2,1)
  158. geometricField.ComponentMeshComponentSet(CMISS.FieldVariableTypes.U,3,1)
  159. if InterpolationType == 4:
  160. geometricField.fieldScalingType = CMISS.FieldScalingTypes.ArithmeticMean
  161. geometricField.CreateFinish()
  162. # Update the geometric field parameters from generated mesh
  163. CMISS.GeneratedMeshGeometricParametersCalculate(geometricField,generatedMesh)
  164. # Create a fibre field and attach it to the geometric field
  165. fibreField = CMISS.Field()
  166. fibreField.CreateStart(fibreFieldUserNumber,region)
  167. fibreField.TypeSet(CMISS.FieldTypes.Fibre)
  168. fibreField.MeshDecompositionSet(decomposition)
  169. fibreField.GeometricFieldSet(geometricField)
  170. fibreField.VariableLabelSet(CMISS.FieldVariableTypes.U,"Fibre")
  171. if InterpolationType == 4:
  172. fibreField.fieldScalingType = CMISS.FieldScalingTypes.ArithmeticMean
  173. fibreField.CreateFinish()
  174. # Create the equations_set
  175. equationsSetField = CMISS.Field()
  176. equationsSet = CMISS.EquationsSet()
  177. equationsSet.CreateStart(equationsSetUserNumber,region,fibreField, \
  178. CMISS.EquationsSetClasses.Elasticity,
  179. CMISS.EquationsSetTypes.FiniteElasticity, \
  180. CMISS.EquationsSetSubtypes.MooneyRivlin, \
  181. equationsSetFieldUserNumber, equationsSetField)
  182. equationsSet.CreateFinish()
  183. # Create the dependent field
  184. dependentField = CMISS.Field()
  185. equationsSet.DependentCreateStart(dependentFieldUserNumber,dependentField)
  186. dependentField.VariableLabelSet(CMISS.FieldVariableTypes.U,"Dependent")
  187. dependentField.ComponentInterpolationSet(CMISS.FieldVariableTypes.U,4,CMISS.FieldInterpolationTypes.ElementBased)
  188. dependentField.ComponentInterpolationSet(CMISS.FieldVariableTypes.DelUDelN,4,CMISS.FieldInterpolationTypes.ElementBased)
  189. if(UsePressureBasis):
  190. # Set the pressure to be nodally based and use the second mesh component
  191. if InterpolationType == 4:
  192. dependentField.ComponentInterpolationSet(CMISS.FieldVariableTypes.U,4,CMISS.FieldInterpolationTypes.NodeBased)
  193. dependentField.ComponentInterpolationSet(CMISS.FieldVariableTypes.DelUDelN,4,CMISS.FieldInterpolationTypes.NodeBased)
  194. dependentField.ComponentMeshComponentSet(CMISS.FieldVariableTypes.U,4,2)
  195. dependentField.ComponentMeshComponentSet(CMISS.FieldVariableTypes.DelUDelN,4,2)
  196. if InterpolationType == 4:
  197. dependentField.fieldScalingType = CMISS.FieldScalingTypes.ArithmeticMean
  198. equationsSet.DependentCreateFinish()
  199. # Initialise dependent field from undeformed geometry and displacement bcs and set hydrostatic pressure
  200. CMISS.Field.ParametersToFieldParametersComponentCopy( \
  201. geometricField,CMISS.FieldVariableTypes.U,CMISS.FieldParameterSetTypes.FieldValues,1, \
  202. dependentField,CMISS.FieldVariableTypes.U,CMISS.FieldParameterSetTypes.FieldValues,1)
  203. CMISS.Field.ParametersToFieldParametersComponentCopy( \
  204. geometricField,CMISS.FieldVariableTypes.U,CMISS.FieldParameterSetTypes.FieldValues,2, \
  205. dependentField,CMISS.FieldVariableTypes.U,CMISS.FieldParameterSetTypes.FieldValues,2)
  206. CMISS.Field.ParametersToFieldParametersComponentCopy( \
  207. geometricField,CMISS.FieldVariableTypes.U,CMISS.FieldParameterSetTypes.FieldValues,3, \
  208. dependentField,CMISS.FieldVariableTypes.U,CMISS.FieldParameterSetTypes.FieldValues,3)
  209. CMISS.Field.ComponentValuesInitialiseDP( \
  210. dependentField,CMISS.FieldVariableTypes.U,CMISS.FieldParameterSetTypes.FieldValues,4,-8.0)
  211. # Create the material field
  212. materialField = CMISS.Field()
  213. equationsSet.MaterialsCreateStart(materialFieldUserNumber,materialField)
  214. materialField.VariableLabelSet(CMISS.FieldVariableTypes.U,"Material")
  215. materialField.VariableLabelSet(CMISS.FieldVariableTypes.V,"Density")
  216. equationsSet.MaterialsCreateFinish()
  217. # Set Mooney-Rivlin constants c10 and c01 respectively.
  218. materialField.ComponentValuesInitialiseDP( \
  219. CMISS.FieldVariableTypes.U,CMISS.FieldParameterSetTypes.FieldValues,1,2.0)
  220. materialField.ComponentValuesInitialiseDP( \
  221. CMISS.FieldVariableTypes.U,CMISS.FieldParameterSetTypes.FieldValues,2,-14.0)
  222. materialField.ComponentValuesInitialiseDP( \
  223. CMISS.FieldVariableTypes.V,CMISS.FieldParameterSetTypes.FieldValues,1,density)
  224. #Create the source field with the gravity vector
  225. sourceField = CMISS.Field()
  226. equationsSet.SourceCreateStart(sourceFieldUserNumber,sourceField)
  227. sourceField.fieldScalingType = CMISS.FieldScalingTypes.ArithmeticMean
  228. if InterpolationType == 4:
  229. sourceField.fieldScalingType = CMISS.FieldScalingTypes.ArithmeticMean
  230. else:
  231. sourceField.fieldScalingType = CMISS.FieldScalingTypes.Unit
  232. equationsSet.SourceCreateFinish()
  233. #Set the gravity vector component values
  234. sourceField.ComponentValuesInitialiseDP( \
  235. CMISS.FieldVariableTypes.U,CMISS.FieldParameterSetTypes.FieldValues,1,gravity[0])
  236. sourceField.ComponentValuesInitialiseDP( \
  237. CMISS.FieldVariableTypes.U,CMISS.FieldParameterSetTypes.FieldValues,2,gravity[1])
  238. sourceField.ComponentValuesInitialiseDP( \
  239. CMISS.FieldVariableTypes.U,CMISS.FieldParameterSetTypes.FieldValues,3,gravity[2])
  240. # Create equations
  241. equations = CMISS.Equations()
  242. equationsSet.EquationsCreateStart(equations)
  243. equations.sparsityType = CMISS.EquationsSparsityTypes.Sparse
  244. equations.outputType = CMISS.EquationsOutputTypes.NONE
  245. equationsSet.EquationsCreateFinish()
  246. # Define the problem
  247. problem = CMISS.Problem()
  248. problem.CreateStart(problemUserNumber)
  249. problem.SpecificationSet(CMISS.ProblemClasses.Elasticity, \
  250. CMISS.ProblemTypes.FiniteElasticity, \
  251. CMISS.ProblemSubTypes.NONE)
  252. problem.CreateFinish()
  253. # Create the problem control loop
  254. problem.ControlLoopCreateStart()
  255. controlLoop = CMISS.ControlLoop()
  256. problem.ControlLoopGet([CMISS.ControlLoopIdentifiers.Node],controlLoop)
  257. controlLoop.MaximumIterationsSet(numberOfLoadIncrements)
  258. problem.ControlLoopCreateFinish()
  259. # Create problem solver
  260. nonLinearSolver = CMISS.Solver()
  261. linearSolver = CMISS.Solver()
  262. problem.SolversCreateStart()
  263. problem.SolverGet([CMISS.ControlLoopIdentifiers.Node],1,nonLinearSolver)
  264. nonLinearSolver.outputType = CMISS.SolverOutputTypes.Progress
  265. nonLinearSolver.NewtonJacobianCalculationTypeSet(CMISS.JacobianCalculationTypes.AnalyticCalculated)
  266. nonLinearSolver.NewtonLinearSolverGet(linearSolver)
  267. linearSolver.linearType = CMISS.LinearSolverTypes.Direct
  268. #linearSolver.libraryType = CMISS.SolverLibraries.LAPACK
  269. problem.SolversCreateFinish()
  270. # Create solver equations and add equations set to solver equations
  271. solver = CMISS.Solver()
  272. solverEquations = CMISS.SolverEquations()
  273. problem.SolverEquationsCreateStart()
  274. problem.SolverGet([CMISS.ControlLoopIdentifiers.Node],1,solver)
  275. solver.SolverEquationsGet(solverEquations)
  276. solverEquations.sparsityType = CMISS.SolverEquationsSparsityTypes.Sparse
  277. equationsSetIndex = solverEquations.EquationsSetAdd(equationsSet)
  278. problem.SolverEquationsCreateFinish()
  279. # Prescribe boundary conditions (absolute nodal parameters)
  280. boundaryConditions = CMISS.BoundaryConditions()
  281. solverEquations.BoundaryConditionsCreateStart(boundaryConditions)
  282. # Set x=0 nodes to no x displacment
  283. boundaryConditions.AddNode(dependentField,CMISS.FieldVariableTypes.U,1,1,1,1,CMISS.BoundaryConditionsTypes.Fixed,0.0)
  284. boundaryConditions.AddNode(dependentField,CMISS.FieldVariableTypes.U,1,1,3,1,CMISS.BoundaryConditionsTypes.Fixed,0.0)
  285. boundaryConditions.AddNode(dependentField,CMISS.FieldVariableTypes.U,1,1,5,1,CMISS.BoundaryConditionsTypes.Fixed,0.0)
  286. boundaryConditions.AddNode(dependentField,CMISS.FieldVariableTypes.U,1,1,7,1,CMISS.BoundaryConditionsTypes.Fixed,0.0)
  287. # Set y=0 nodes to no y displacement
  288. boundaryConditions.AddNode(dependentField,CMISS.FieldVariableTypes.U,1,1,1,2,CMISS.BoundaryConditionsTypes.Fixed,0.0)
  289. boundaryConditions.AddNode(dependentField,CMISS.FieldVariableTypes.U,1,1,3,2,CMISS.BoundaryConditionsTypes.Fixed,0.0)
  290. boundaryConditions.AddNode(dependentField,CMISS.FieldVariableTypes.U,1,1,5,2,CMISS.BoundaryConditionsTypes.Fixed,0.0)
  291. boundaryConditions.AddNode(dependentField,CMISS.FieldVariableTypes.U,1,1,7,2,CMISS.BoundaryConditionsTypes.Fixed,0.0)
  292. # Set z=0 nodes to no y displacement
  293. boundaryConditions.AddNode(dependentField,CMISS.FieldVariableTypes.U,1,1,1,3,CMISS.BoundaryConditionsTypes.Fixed,0.0)
  294. boundaryConditions.AddNode(dependentField,CMISS.FieldVariableTypes.U,1,1,3,3,CMISS.BoundaryConditionsTypes.Fixed,0.0)
  295. boundaryConditions.AddNode(dependentField,CMISS.FieldVariableTypes.U,1,1,5,3,CMISS.BoundaryConditionsTypes.Fixed,0.0)
  296. boundaryConditions.AddNode(dependentField,CMISS.FieldVariableTypes.U,1,1,7,3,CMISS.BoundaryConditionsTypes.Fixed,0.0)
  297. solverEquations.BoundaryConditionsCreateFinish()
  298. # Solve the problem
  299. problem.Solve()
  300. # Export results
  301. fields = CMISS.Fields()
  302. CMISS.FieldsTypeCreateRegion(region,fields)
  303. CMISS.FieldIONodesExport(fields,"../Cantilever","FORTRAN")
  304. CMISS.FieldIOElementsExport(fields,"../Cantilever","FORTRAN")
  305. fields.Finalise()