/FiniteElasticity/SCRATCH/QuadraticEllipsoidCosta/src/QuadraticEllipsoidCostaExample.f90

http://github.com/xyan075/examples · Fortran Modern · 629 lines · 430 code · 76 blank · 123 comment · 0 complexity · 7bbbfcf1652c989237790595f2ec4938 MD5 · raw file

  1. !> \file
  2. !> $Id: QuadraticEllipsoidExample.f90 1714 2010-11-10 15:43:15Z jackisawesome $
  3. !> \author Chris Bradley
  4. !> \brief This is an example program to solve a finite elasticity equation using openCMISS calls.
  5. !>
  6. !> \section LICENSE
  7. !>
  8. !> Version: MPL 1.1/GPL 2.0/LGPL 2.1
  9. !>
  10. !> The contents of this file are subject to the Mozilla Public License
  11. !> Version 1.1 (the "License"); you may not use this file except in
  12. !> compliance with the License. You may obtain a copy of the License at
  13. !> http://www.mozilla.org/MPL/
  14. !>
  15. !> Software distributed under the License is distributed on an "AS IS"
  16. !> basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
  17. !> License for the specific language governing rights and limitations
  18. !> under the License.
  19. !>
  20. !> The Original Code is openCMISS
  21. !>
  22. !> The Initial Developer of the Original Code is University of Auckland,
  23. !> Auckland, New Zealand and University of Oxford, Oxford, United
  24. !> Kingdom. Portions created by the University of Auckland and University
  25. !> of Oxford are Copyright (C) 2007 by the University of Auckland and
  26. !> the University of Oxford. All Rights Reserved.
  27. !>
  28. !> Contributor(s): Jack Lee
  29. !>
  30. !> Alternatively, the contents of this file may be used under the terms of
  31. !> either the GNU General Public License Version 2 or later (the "GPL"), or
  32. !> the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
  33. !> in which case the provisions of the GPL or the LGPL are applicable instead
  34. !> of those above. If you wish to allow use of your version of this file only
  35. !> under the terms of either the GPL or the LGPL, and not to allow others to
  36. !> use your version of this file under the terms of the MPL, indicate your
  37. !> decision by deleting the provisions above and replace them with the notice
  38. !> and other provisions required by the GPL or the LGPL. If you do not delete
  39. !> the provisions above, a recipient may use your version of this file under
  40. !> the terms of any one of the MPL, the GPL or the LGPL.
  41. !>
  42. !> \example FiniteElasticity/UniAxialExtension/src/UniAxialExtensionExample.f90
  43. !! Example program to solve a finite elasticity equation using openCMISS calls.
  44. !! \par Latest Builds:
  45. !! \li <a href='http://autotest.bioeng.auckland.ac.nz/opencmiss-build/logs_x86_64-linux/FiniteElasticity/UniAxialExtension/build-intel'>Linux Intel Build</a>
  46. !! \li <a href='http://autotest.bioeng.auckland.ac.nz/opencmiss-build/logs_x86_64-linux/FiniteElasticity/UniAxialExtension/build-gnu'>Linux GNU Build</a>
  47. !<
  48. !> Main program
  49. PROGRAM QUADRATICELLIPSOIDCOSTAEXAMPLE
  50. USE OPENCMISS
  51. USE MPI
  52. #ifdef WIN32
  53. USE IFQWIN
  54. #endif
  55. IMPLICIT NONE
  56. !Test program parameters
  57. REAL(CMISSDP), PARAMETER :: PI=3.14159_CMISSDP
  58. REAL(CMISSDP), PARAMETER :: LONG_AXIS=2.0_CMISSDP
  59. REAL(CMISSDP), PARAMETER :: SHORT_AXIS=1.0_CMISSDP
  60. REAL(CMISSDP), PARAMETER :: WALL_THICKNESS=0.5_CMISSDP
  61. REAL(CMISSDP), PARAMETER :: CUTOFF_ANGLE=1.5708_CMISSDP
  62. REAL(CMISSDP), PARAMETER :: FIBRE_SLOPE_ENDO=1.73205_CMISSDP !Slope of fibres in base endocardium = 60 degrees
  63. REAL(CMISSDP), PARAMETER :: FIBRE_SLOPE_EPI=-1.73205_CMISSDP !Slope change of fibres from 60 to -60 degrees in transmural direction
  64. REAL(CMISSDP), PARAMETER :: SHEET_SLOPE_BASE_ENDO=1.0_CMISSDP !Slope of sheet at base endocardium
  65. REAL(CMISSDP), DIMENSION(1:7) :: COSTA_PARAMS = (/ 0.2, 30.0, 12.0, 14.0, 14.0, 10.0, 18.0 /) ! a bff bfs bfn bss bsn bnn
  66. REAL(CMISSDP), PARAMETER :: INNER_PRESSURE=1.0_CMISSDP !Positive is compressive
  67. REAL(CMISSDP), PARAMETER :: OUTER_PRESSURE=0.0_CMISSDP !Positive is compressive
  68. INTEGER(CMISSIntg), PARAMETER :: NumberGlobalXElements=4 ! X ==NUMBER_GLOBAL_CIRCUMFERENTIAL_ELEMENTS
  69. INTEGER(CMISSIntg), PARAMETER :: NumberGlobalYElements=4 ! Y ==NUMBER_GLOBAL_LONGITUDINAL_ELEMENTS
  70. INTEGER(CMISSIntg), PARAMETER :: NumberGlobalZElements=1 ! Z ==NUMBER_GLOBAL_TRANSMURAL_ELEMENTS
  71. INTEGER(CMISSIntg) :: NumberOfDomains
  72. INTEGER(CMISSIntg), PARAMETER :: CoordinateSystemUserNumber=1
  73. INTEGER(CMISSIntg), PARAMETER :: NumberOfSpatialCoordinates=3
  74. INTEGER(CMISSIntg), PARAMETER :: RegionUserNumber=1
  75. INTEGER(CMISSIntg), PARAMETER :: QuadraticBasisUserNumber=1
  76. INTEGER(CMISSIntg), PARAMETER :: QuadraticCollapsedBasisUserNumber=2
  77. INTEGER(CMISSIntg), PARAMETER :: LinearBasisUserNumber=3
  78. INTEGER(CMISSIntg), PARAMETER :: LinearCollapsedBasisUserNumber=4
  79. INTEGER(CMISSIntg), PARAMETER :: MeshUserNumber=1
  80. INTEGER(CMISSIntg), PARAMETER :: GeneratedMeshUserNumber=2
  81. INTEGER(CMISSIntg), PARAMETER :: DecompositionUserNumber=1
  82. INTEGER(CMISSIntg), PARAMETER :: DerivativeUserNumber=1
  83. INTEGER(CMISSIntg), PARAMETER :: NumberOfMeshDimensions=3
  84. INTEGER(CMISSIntg), PARAMETER :: NumberOfXiCoordinates=3
  85. INTEGER(CMISSIntg), PARAMETER :: NumberOfMeshComponents=2
  86. INTEGER(CMISSIntg), PARAMETER :: QuadraticMeshComponentNumber=1
  87. INTEGER(CMISSIntg), PARAMETER :: LinearMeshComponentNumber=2
  88. INTEGER(CMISSIntg), PARAMETER :: TotalNumberOfElements=1
  89. INTEGER(CMISSIntg), PARAMETER :: FieldGeometryUserNumber=1
  90. INTEGER(CMISSIntg), PARAMETER :: FieldGeometryNumberOfVariables=1
  91. INTEGER(CMISSIntg), PARAMETER :: FieldGeometryNumberOfComponents=3
  92. INTEGER(CMISSIntg), PARAMETER :: FieldFibreUserNumber=2
  93. INTEGER(CMISSIntg), PARAMETER :: FieldFibreNumberOfVariables=1
  94. INTEGER(CMISSIntg), PARAMETER :: FieldFibreNumberOfComponents=3
  95. INTEGER(CMISSIntg), PARAMETER :: FieldMaterialUserNumber=3
  96. INTEGER(CMISSIntg), PARAMETER :: FieldMaterialNumberOfVariables=1
  97. INTEGER(CMISSIntg), PARAMETER :: FieldMaterialNumberOfComponents=7
  98. INTEGER(CMISSIntg), PARAMETER :: FieldDependentUserNumber=4
  99. INTEGER(CMISSIntg), PARAMETER :: FieldDependentNumberOfVariables=2
  100. INTEGER(CMISSIntg), PARAMETER :: FieldDependentNumberOfComponents=4
  101. INTEGER(CMISSIntg), PARAMETER :: EquationSetUserNumber=1
  102. INTEGER(CMISSIntg), PARAMETER :: EquationsSetFieldUserNumber=13
  103. INTEGER(CMISSIntg), PARAMETER :: ProblemUserNumber=1
  104. !Program types
  105. !Program variables
  106. INTEGER(CMISSIntg) :: MPI_IERROR
  107. INTEGER(CMISSIntg) :: EquationsSetIndex
  108. INTEGER(CMISSIntg) :: NumberOfComputationalNodes,ComputationalNodeNumber
  109. REAL(CMISSDP) :: FibreFieldAngle(3)
  110. REAL(CMISSDP) :: nu,theta,omega,XI3,XI3delta,XI2delta, zero
  111. INTEGER(CMISSIntg) ::i,j,k,time_step,component_idx,node_idx,TOTAL_NUMBER_NODES_XI(3)
  112. CHARACTER(LEN=50) :: fileName,fileNumber
  113. !For grabbing surfaces
  114. INTEGER(CMISSIntg) :: InnerNormalXi,OuterNormalXi,TopNormalXi
  115. INTEGER(CMISSIntg), ALLOCATABLE :: InnerSurfaceNodes(:)
  116. INTEGER(CMISSIntg), ALLOCATABLE :: OuterSurfaceNodes(:)
  117. INTEGER(CMISSIntg), ALLOCATABLE :: TopSurfaceNodes(:)
  118. INTEGER(CMISSIntg), ALLOCATABLE :: G(:)
  119. INTEGER(CMISSIntg) :: NotCornerNode, CornerNode, NumberOfCornerNodes, gn, CorrectNodeNumber,TotalNumberOfNodes
  120. INTEGER(CMISSIntg) :: NN,NODE,NodeDomain
  121. REAL(CMISSDP) :: XCoord,YCoord,ZCoord
  122. LOGICAL :: X_FIXED,Y_FIXED,X_OKAY,Y_OKAY
  123. !CMISS variables
  124. TYPE(CMISSBasisType) :: QuadraticBasis,QuadraticCollapsedBasis,LinearBasis,LinearCollapsedBasis
  125. TYPE(CMISSBoundaryConditionsType) :: BoundaryConditions
  126. TYPE(CMISSCoordinateSystemType) :: CoordinateSystem, WorldCoordinateSystem
  127. TYPE(CMISSMeshType) :: Mesh
  128. TYPE(CMISSGeneratedMeshType) :: GeneratedMesh
  129. TYPE(CMISSDecompositionType) :: Decomposition
  130. TYPE(CMISSEquationsType) :: Equations
  131. TYPE(CMISSEquationsSetType) :: EquationsSet
  132. TYPE(CMISSFieldType) :: GeometricField,FibreField,MaterialField,DependentField,EquationsSetField
  133. TYPE(CMISSFieldsType) :: Fields
  134. TYPE(CMISSProblemType) :: Problem
  135. TYPE(CMISSRegionType) :: Region,WorldRegion
  136. TYPE(CMISSSolverType) :: Solver,LinearSolver
  137. TYPE(CMISSSolverEquationsType) :: SolverEquations
  138. #ifdef WIN32
  139. !Quickwin type
  140. LOGICAL :: QUICKWIN_STATUS=.FALSE.
  141. TYPE(WINDOWCONFIG) :: QUICKWIN_WINDOW_CONFIG
  142. #endif
  143. !Generic CMISS variables
  144. INTEGER(CMISSIntg) :: Err
  145. #ifdef WIN32
  146. !Initialise QuickWin
  147. QUICKWIN_WINDOW_CONFIG%TITLE="General Output" !Window title
  148. QUICKWIN_WINDOW_CONFIG%NUMTEXTROWS=-1 !Max possible number of rows
  149. QUICKWIN_WINDOW_CONFIG%MODE=QWIN$SCROLLDOWN
  150. !Set the window parameters
  151. QUICKWIN_STATUS=SETWINDOWCONFIG(QUICKWIN_WINDOW_CONFIG)
  152. !If attempt fails set with system estimated values
  153. IF(.NOT.QUICKWIN_STATUS) QUICKWIN_STATUS=SETWINDOWCONFIG(QUICKWIN_WINDOW_CONFIG)
  154. #endif
  155. !Intialise cmiss
  156. CALL CMISSInitialise(WorldCoordinateSystem,WorldRegion,Err)
  157. CALL CMISSErrorHandlingModeSet(CMISS_ERRORS_TRAP_ERROR,Err)
  158. WRITE(*,'(A)') "Program starting."
  159. !Set all diganostic levels on for testing
  160. CALL CMISSDiagnosticsSetOn(CMISS_FROM_DIAG_TYPE,(/1,2,3,4,5/),"Diagnostics",(/"PROBLEM_FINITE_ELEMENT_CALCULATE"/),Err)
  161. !Get the number of computational nodes and this computational node number
  162. CALL CMISSComputationalNumberOfNodesGet(NumberOfComputationalNodes,Err)
  163. CALL CMISSComputationalNodeNumberGet(ComputationalNodeNumber,Err)
  164. !Broadcast the number of elements in the X,Y and Z directions and the number of partitions to the other computational nodes
  165. ! CALL MPI_BCAST(NumberGlobalXElements,1,MPI_INTEGER,0,MPI_COMM_WORLD,MPI_IERROR)
  166. ! CALL MPI_BCAST(NumberGlobalYElements,1,MPI_INTEGER,0,MPI_COMM_WORLD,MPI_IERROR)
  167. ! CALL MPI_BCAST(NumberGlobalZElements,1,MPI_INTEGER,0,MPI_COMM_WORLD,MPI_IERROR)
  168. ! CALL MPI_BCAST(NumberOfDomains,1,MPI_INTEGER,0,MPI_COMM_WORLD,MPI_IERROR)
  169. NumberOfDomains=NumberOfComputationalNodes
  170. !Create a CS - default is 3D rectangular cartesian CS with 0,0,0 as origin
  171. CALL CMISSCoordinateSystem_Initialise(CoordinateSystem,Err)
  172. CALL CMISSCoordinateSystem_CreateStart(CoordinateSystemUserNumber,CoordinateSystem,Err)
  173. CALL CMISSCoordinateSystem_TypeSet(CoordinateSystem,CMISS_COORDINATE_RECTANGULAR_CARTESIAN_TYPE,Err)
  174. CALL CMISSCoordinateSystem_DimensionSet(CoordinateSystem,NumberOfSpatialCoordinates,Err)
  175. CALL CMISSCoordinateSystem_OriginSet(CoordinateSystem,(/0.0_CMISSDP,0.0_CMISSDP,0.0_CMISSDP/),Err)
  176. CALL CMISSCoordinateSystem_CreateFinish(CoordinateSystem,Err)
  177. !Create a region and assign the CS to the region
  178. CALL CMISSRegion_Initialise(Region,Err)
  179. CALL CMISSRegion_CreateStart(RegionUserNumber,WorldRegion,Region,Err)
  180. CALL CMISSRegion_CoordinateSystemSet(Region,CoordinateSystem,Err)
  181. CALL CMISSRegion_CreateFinish(Region,Err)
  182. !Define basis functions - tri-linear Lagrange and tri-Quadratic Lagrange, each with collapsed variant
  183. !Quadratic Basis
  184. CALL CMISSBasis_Initialise(QuadraticBasis,Err)
  185. CALL CMISSBasis_CreateStart(QuadraticBasisUserNumber,QuadraticBasis,Err)
  186. CALL CMISSBasis_InterpolationXiSet(QuadraticBasis,(/CMISS_BASIS_QUADRATIC_LAGRANGE_INTERPOLATION, &
  187. & CMISS_BASIS_QUADRATIC_LAGRANGE_INTERPOLATION,CMISS_BASIS_QUADRATIC_LAGRANGE_INTERPOLATION/),Err)
  188. CALL CMISSBasis_QuadratureNumberOfGaussXiSet(QuadraticBasis, &
  189. & (/CMISS_BASIS_MID_QUADRATURE_SCHEME,CMISS_BASIS_MID_QUADRATURE_SCHEME,CMISS_BASIS_MID_QUADRATURE_SCHEME/),Err)
  190. CALL CMISSBasis_QuadratureLocalFaceGaussEvaluateSet(QuadraticBasis,.true.,Err) !Have to do this
  191. CALL CMISSBasis_CreateFinish(QuadraticBasis,Err)
  192. !Collapsed Quadratic Basis
  193. CALL CMISSBasis_Initialise(QuadraticCollapsedBasis,Err)
  194. CALL CMISSBasis_CreateStart(QuadraticCollapsedBasisUserNumber,QuadraticCollapsedBasis,Err)
  195. CALL CMISSBasis_TypeSet(QuadraticCollapsedBasis,CMISS_BASIS_LAGRANGE_HERMITE_TP_TYPE,Err)
  196. CALL CMISSBasis_NumberOfXiSet(QuadraticCollapsedBasis,NumberOfXiCoordinates,Err)
  197. CALL CMISSBasis_InterpolationXiSet(QuadraticCollapsedBasis,(/CMISS_BASIS_QUADRATIC_LAGRANGE_INTERPOLATION, &
  198. & CMISS_BASIS_QUADRATIC_LAGRANGE_INTERPOLATION,CMISS_BASIS_QUADRATIC_LAGRANGE_INTERPOLATION/),Err)
  199. CALL CMISSBasis_CollapsedXiSet(QuadraticCollapsedBasis,(/CMISS_BASIS_XI_COLLAPSED, &
  200. & CMISS_BASIS_COLLAPSED_AT_XI0,CMISS_BASIS_NOT_COLLAPSED/),Err)
  201. CALL CMISSBasis_QuadratureNumberOfGaussXiSet(QuadraticCollapsedBasis, &
  202. & (/CMISS_BASIS_MID_QUADRATURE_SCHEME,CMISS_BASIS_MID_QUADRATURE_SCHEME,CMISS_BASIS_MID_QUADRATURE_SCHEME/),Err)
  203. CALL CMISSBasis_QuadratureLocalFaceGaussEvaluateSet(QuadraticCollapsedBasis,.true.,Err) !Have to do this
  204. CALL CMISSBasis_CreateFinish(QuadraticCollapsedBasis,Err)
  205. !Linear Basis
  206. CALL CMISSBasis_Initialise(LinearBasis,Err)
  207. CALL CMISSBasis_CreateStart(LinearBasisUserNumber,LinearBasis,Err)
  208. CALL CMISSBasis_QuadratureNumberOfGaussXiSet(LinearBasis, &
  209. & (/CMISS_BASIS_MID_QUADRATURE_SCHEME,CMISS_BASIS_MID_QUADRATURE_SCHEME,CMISS_BASIS_MID_QUADRATURE_SCHEME/),Err)
  210. CALL CMISSBasis_QuadratureLocalFaceGaussEvaluateSet(LinearBasis,.true.,Err) !Have to do this (unused) due to field_interp setup
  211. CALL CMISSBasis_CreateFinish(LinearBasis,Err)
  212. !Collapsed Linear Basis
  213. CALL CMISSBasis_Initialise(LinearCollapsedBasis,Err)
  214. CALL CMISSBasis_CreateStart(LinearCollapsedBasisUserNumber,LinearCollapsedBasis,Err)
  215. CALL CMISSBasis_TypeSet(LinearCollapsedBasis,CMISS_BASIS_LAGRANGE_HERMITE_TP_TYPE,Err)
  216. CALL CMISSBasis_NumberOfXiSet(LinearCollapsedBasis,NumberOfXiCoordinates,Err)
  217. CALL CMISSBasis_InterpolationXiSet(LinearCollapsedBasis,(/CMISS_BASIS_LINEAR_LAGRANGE_INTERPOLATION, &
  218. & CMISS_BASIS_LINEAR_LAGRANGE_INTERPOLATION,CMISS_BASIS_LINEAR_LAGRANGE_INTERPOLATION/),Err)
  219. CALL CMISSBasis_CollapsedXiSet(LinearCollapsedBasis,(/CMISS_BASIS_XI_COLLAPSED,CMISS_BASIS_COLLAPSED_AT_XI0, &
  220. & CMISS_BASIS_NOT_COLLAPSED/),Err)
  221. CALL CMISSBasis_QuadratureNumberOfGaussXiSet(LinearCollapsedBasis, &
  222. & (/CMISS_BASIS_MID_QUADRATURE_SCHEME,CMISS_BASIS_MID_QUADRATURE_SCHEME,CMISS_BASIS_MID_QUADRATURE_SCHEME/),Err)
  223. CALL CMISSBasis_QuadratureLocalFaceGaussEvaluateSet(LinearCollapsedBasis,.true.,Err) !Have to do this (unused) due to field_interp setup
  224. CALL CMISSBasis_CreateFinish(LinearCollapsedBasis,Err)
  225. !Start the creation of a generated ellipsoid mesh
  226. CALL CMISSGeneratedMesh_Initialise(GeneratedMesh,Err)
  227. CALL CMISSGeneratedMesh_CreateStart(GeneratedMeshUserNumber,Region,GeneratedMesh,Err)
  228. !Set up an ellipsoid mesh
  229. CALL CMISSGeneratedMesh_TypeSet(GeneratedMesh,CMISS_GENERATED_MESH_ELLIPSOID_MESH_TYPE,Err)
  230. !Set the quadratic and linear bases
  231. CALL CMISSGeneratedMesh_BasisSet(GeneratedMesh,[QuadraticBasis,QuadraticCollapsedBasis,LinearBasis,LinearCollapsedBasis],Err)
  232. !Define the mesh on the region
  233. CALL CMISSGeneratedMesh_ExtentSet(GeneratedMesh,(/LONG_AXIS,SHORT_AXIS,WALL_THICKNESS,CUTOFF_ANGLE/),Err)
  234. CALL CMISSGeneratedMesh_NumberOfElementsSet(GeneratedMesh,(/NumberGlobalXElements,NumberGlobalYElements, &
  235. & NumberGlobalZElements/),Err)
  236. !Finish the creation of a generated mesh in the region
  237. CALL CMISSMesh_Initialise(Mesh,Err)
  238. CALL CMISSGeneratedMesh_CreateFinish(GeneratedMesh,MeshUserNumber,Mesh,Err)
  239. !Create a decomposition
  240. CALL CMISSDecomposition_Initialise(Decomposition,Err)
  241. CALL CMISSDecomposition_CreateStart(DecompositionUserNumber,Mesh,Decomposition,Err)
  242. CALL CMISSDecomposition_TypeSet(Decomposition,CMISS_DECOMPOSITION_CALCULATED_TYPE,Err)
  243. CALL CMISSDecomposition_NumberOfDomainsSet(Decomposition,NumberOfDomains,Err)
  244. CALL CMISSDecomposition_CalculateFacesSet(Decomposition,.TRUE.,Err)
  245. CALL CMISSDecomposition_CreateFinish(Decomposition,Err)
  246. !Create a field to put the geometry (default is geometry)
  247. CALL CMISSField_Initialise(GeometricField,Err)
  248. CALL CMISSField_CreateStart(FieldGeometryUserNumber,Region,GeometricField,Err)
  249. CALL CMISSField_MeshDecompositionSet(GeometricField,Decomposition,Err)
  250. CALL CMISSField_TypeSet(GeometricField,CMISS_FIELD_GEOMETRIC_TYPE,Err)
  251. CALL CMISSField_NumberOfVariablesSet(GeometricField,FieldGeometryNumberOfVariables,Err)
  252. CALL CMISSField_NumberOfComponentsSet(GeometricField,CMISS_FIELD_U_VARIABLE_TYPE,FieldGeometryNumberOfComponents,Err)
  253. CALL CMISSField_ComponentMeshComponentSet(GeometricField,CMISS_FIELD_U_VARIABLE_TYPE,1,QuadraticMeshComponentNumber,Err)
  254. CALL CMISSField_ComponentMeshComponentSet(GeometricField,CMISS_FIELD_U_VARIABLE_TYPE,2,QuadraticMeshComponentNumber,Err)
  255. CALL CMISSField_ComponentMeshComponentSet(GeometricField,CMISS_FIELD_U_VARIABLE_TYPE,3,QuadraticMeshComponentNumber,Err)
  256. CALL CMISSField_CreateFinish(GeometricField,Err)
  257. !Update the geometric field parameters
  258. CALL CMISSGeneratedMesh_GeometricParametersCalculate(GeneratedMesh,GeometricField,Err)
  259. !Create a fibre field and attach it to the geometric field
  260. CALL CMISSField_Initialise(FibreField,Err)
  261. CALL CMISSField_CreateStart(FieldFibreUserNumber,Region,FibreField,Err)
  262. CALL CMISSField_TypeSet(FibreField,CMISS_FIELD_FIBRE_TYPE,Err)
  263. CALL CMISSField_MeshDecompositionSet(FibreField,Decomposition,Err)
  264. CALL CMISSField_GeometricFieldSet(FibreField,GeometricField,Err)
  265. CALL CMISSField_NumberOfVariablesSet(FibreField,FieldFibreNumberOfVariables,Err)
  266. CALL CMISSField_NumberOfComponentsSet(FibreField,CMISS_FIELD_U_VARIABLE_TYPE,FieldFibreNumberOfComponents,Err)
  267. CALL CMISSField_ComponentMeshComponentSet(FibreField,CMISS_FIELD_U_VARIABLE_TYPE,1,QuadraticMeshComponentNumber,Err)
  268. CALL CMISSField_ComponentMeshComponentSet(FibreField,CMISS_FIELD_U_VARIABLE_TYPE,2,QuadraticMeshComponentNumber,Err)
  269. CALL CMISSField_ComponentMeshComponentSet(FibreField,CMISS_FIELD_U_VARIABLE_TYPE,3,QuadraticMeshComponentNumber,Err)
  270. CALL CMISSField_CreateFinish(FibreField,Err)
  271. !Set Fibre directions (this block is parallel-untested)
  272. node_idx=0
  273. !This is valid only for quadratic basis functions
  274. TOTAL_NUMBER_NODES_XI(1)=NumberGlobalXElements*2
  275. TOTAL_NUMBER_NODES_XI(2)=NumberGlobalYElements*2+1
  276. TOTAL_NUMBER_NODES_XI(3)=NumberGlobalZElements*2+1
  277. !Map the correct node number (cn) to geometric node number (gn) G(gn)=cn
  278. NumberOfCornerNodes=(NumberGlobalZElements+1)*(NumberGlobalYElements*NumberGlobalXElements+1)
  279. TotalNumberOfNodes=(TOTAL_NUMBER_NODES_XI(3))*((TOTAL_NUMBER_NODES_XI(2)-1)*TOTAL_NUMBER_NODES_XI(1)+1)
  280. ALLOCATE(G(TotalNumberOfNodes),STAT=Err)
  281. CornerNode=0
  282. !Numbering of not corner nodes starts where Corner nodes end
  283. NotCornerNode=NumberOfCornerNodes
  284. gn=0
  285. DO k=1,TOTAL_NUMBER_NODES_XI(3)
  286. gn=gn+1
  287. IF (mod(k,2)==0) THEN
  288. !Not corner node
  289. NotCornerNode=NotCornerNode+1
  290. G(gn)=NotCornerNode
  291. ELSE
  292. !Corner node
  293. CornerNode=CornerNode+1
  294. G(gn)=CornerNode
  295. ENDIF
  296. DO j=2,TOTAL_NUMBER_NODES_XI(2)
  297. DO i=1,TOTAL_NUMBER_NODES_XI(1)
  298. gn=gn+1
  299. IF ((mod(i,2)==0).OR.(mod(j,2)==0).OR.(mod(k,2)==0)) THEN
  300. !Not corner node
  301. NotCornerNode=NotCornerNode+1
  302. G(gn)=NotCornerNode
  303. ELSE
  304. !Corner node
  305. CornerNode=CornerNode+1
  306. G(gn)=CornerNode
  307. ENDIF
  308. ENDDO
  309. ENDDO
  310. ENDDO
  311. XI2delta=(PI-CUTOFF_ANGLE)/(TOTAL_NUMBER_NODES_XI(2)-1)
  312. XI3=0
  313. XI3delta=(1.0)/(TOTAL_NUMBER_NODES_XI(3)-1)
  314. zero=0
  315. DO k=1, TOTAL_NUMBER_NODES_XI(3)
  316. !Apex nodes
  317. j=1
  318. i=1
  319. node_idx=node_idx+1
  320. CorrectNodeNumber=G(node_idx)
  321. CALL CMISSDecomposition_NodeDomainGet(Decomposition,CorrectNodeNumber,1,NodeDomain,Err)
  322. IF(NodeDomain==ComputationalNodeNumber) THEN
  323. FibreFieldAngle=(/zero,zero,zero/)
  324. DO component_idx=1,FieldFibreNumberOfComponents
  325. CALL CMISSField_ParameterSetUpdateNode(FibreField,CMISS_FIELD_U_VARIABLE_TYPE,CMISS_FIELD_VALUES_SET_TYPE,1, &
  326. & DerivativeUserNumber, &
  327. & CorrectNodeNumber,component_idx,FibreFieldAngle(component_idx),Err)
  328. ENDDO
  329. ENDIF
  330. theta=atan((FIBRE_SLOPE_EPI-FIBRE_SLOPE_ENDO)*XI3+FIBRE_SLOPE_ENDO)
  331. DO j=2, TOTAL_NUMBER_NODES_XI(2)
  332. nu=PI-XI2delta*(j-1)
  333. omega=PI/2+cos(2*nu)*atan(SHEET_SLOPE_BASE_ENDO)*(-2*XI3+1)
  334. DO i=1, TOTAL_NUMBER_NODES_XI(1)
  335. node_idx=node_idx+1
  336. CorrectNodeNumber=G(node_idx)
  337. CALL CMISSDecomposition_NodeDomainGet(Decomposition,CorrectNodeNumber,1,NodeDomain,Err)
  338. IF(NodeDomain==ComputationalNodeNumber) THEN
  339. FibreFieldAngle=(/theta,zero,omega/)
  340. DO component_idx=1,FieldFibreNumberOfComponents
  341. CALL CMISSField_ParameterSetUpdateNode(FibreField,CMISS_FIELD_U_VARIABLE_TYPE,CMISS_FIELD_VALUES_SET_TYPE,1, &
  342. & DerivativeUserNumber,CorrectNodeNumber,component_idx,FibreFieldAngle(component_idx),Err)
  343. ENDDO
  344. ENDIF
  345. ENDDO
  346. ENDDO
  347. XI3=XI3+XI3delta
  348. ENDDO
  349. !Create a material field and attach it to the geometric field
  350. CALL CMISSField_Initialise(MaterialField,Err)
  351. CALL CMISSField_CreateStart(FieldMaterialUserNumber,Region,MaterialField,Err)
  352. CALL CMISSField_TypeSet(MaterialField,CMISS_FIELD_MATERIAL_TYPE,Err)
  353. CALL CMISSField_MeshDecompositionSet(MaterialField,Decomposition,Err)
  354. CALL CMISSField_GeometricFieldSet(MaterialField,GeometricField,Err)
  355. CALL CMISSField_NumberOfVariablesSet(MaterialField,FieldMaterialNumberOfVariables,Err)
  356. CALL CMISSField_NumberOfComponentsSet(MaterialField,CMISS_FIELD_U_VARIABLE_TYPE,FieldMaterialNumberOfComponents,Err)
  357. ! CALL CMISSField_ComponentInterpolationSet(MaterialField,CMISS_FIELD_U_VARIABLE_TYPE,1,CMISS_FIELD_CONSTANT_INTERPOLATION,Err)
  358. ! CALL CMISSField_ComponentInterpolationSet(MaterialField,CMISS_FIELD_U_VARIABLE_TYPE,2,CMISS_FIELD_CONSTANT_INTERPOLATION,Err)
  359. CALL CMISSField_CreateFinish(MaterialField,Err)
  360. !Set Mooney-Rivlin constants c10 and c01 to 2.0 and 6.0 respectively.
  361. !CALL CMISSField_ComponentValuesInitialise(MaterialField,CMISS_FIELD_U_VARIABLE_TYPE,CMISS_FIELD_VALUES_SET_TYPE,1,2.0_CMISSDP,Err)
  362. !CALL CMISSField_ComponentValuesInitialise(MaterialField,CMISS_FIELD_U_VARIABLE_TYPE,CMISS_FIELD_VALUES_SET_TYPE,2,6.0_CMISSDP,Err)
  363. !Set Costa material parameters
  364. DO I=1,7
  365. CALL CMISSField_ComponentValuesInitialise(MaterialField,CMISS_FIELD_U_VARIABLE_TYPE,CMISS_FIELD_VALUES_SET_TYPE,I, &
  366. & COSTA_PARAMS(I),Err)
  367. ENDDO
  368. !Create the equations_set
  369. CALL CMISSField_Initialise(EquationsSetField,Err)
  370. CALL CMISSEquationsSet_Initialise(EquationsSet,Err)
  371. CALL CMISSEquationsSet_CreateStart(EquationSetUserNumber,Region,FibreField,CMISS_EQUATIONS_SET_ELASTICITY_CLASS, &
  372. & CMISS_EQUATIONS_SET_FINITE_ELASTICITY_TYPE,CMISS_EQUATIONS_SET_ORTHOTROPIC_MATERIAL_COSTA_SUBTYPE, &
  373. & EquationsSetFieldUserNumber,&
  374. & EquationsSetField,EquationsSet,Err)
  375. ! CMISS_EQUATIONS_SET_ORTHOTROPIC_MATERIAL_COSTA_SUBTYPE
  376. CALL CMISSEquationsSet_CreateFinish(EquationsSet,Err)
  377. !Create the dependent field with 2 variables and 4 components (3 displacement, 1 pressure)
  378. CALL CMISSField_Initialise(DependentField,Err)
  379. CALL CMISSField_CreateStart(FieldDependentUserNumber,Region,DependentField,Err)
  380. CALL CMISSField_TypeSet(DependentField,CMISS_FIELD_GENERAL_TYPE,Err)
  381. CALL CMISSField_MeshDecompositionSet(DependentField,Decomposition,Err)
  382. CALL CMISSField_GeometricFieldSet(DependentField,GeometricField,Err)
  383. CALL CMISSField_DependentTypeSet(DependentField,CMISS_FIELD_DEPENDENT_TYPE,Err)
  384. CALL CMISSField_NumberOfVariablesSet(DependentField,FieldDependentNumberOfVariables,Err)
  385. CALL CMISSField_NumberOfComponentsSet(DependentField,CMISS_FIELD_U_VARIABLE_TYPE,FieldDependentNumberOfComponents,Err)
  386. CALL CMISSField_NumberOfComponentsSet(DependentField,CMISS_FIELD_DELUDELN_VARIABLE_TYPE,FieldDependentNumberOfComponents,Err)
  387. CALL CMISSField_ComponentMeshComponentSet(DependentField,CMISS_FIELD_U_VARIABLE_TYPE,1,QuadraticMeshComponentNumber,Err)
  388. CALL CMISSField_ComponentMeshComponentSet(DependentField,CMISS_FIELD_U_VARIABLE_TYPE,2,QuadraticMeshComponentNumber,Err)
  389. CALL CMISSField_ComponentMeshComponentSet(DependentField,CMISS_FIELD_U_VARIABLE_TYPE,3,QuadraticMeshComponentNumber,Err)
  390. CALL CMISSField_ComponentMeshComponentSet(DependentField,CMISS_FIELD_U_VARIABLE_TYPE,4,LinearMeshComponentNumber,Err)
  391. CALL CMISSField_ComponentMeshComponentSet(DependentField,CMISS_FIELD_DELUDELN_VARIABLE_TYPE,1,QuadraticMeshComponentNumber,Err)
  392. CALL CMISSField_ComponentMeshComponentSet(DependentField,CMISS_FIELD_DELUDELN_VARIABLE_TYPE,2,QuadraticMeshComponentNumber,Err)
  393. CALL CMISSField_ComponentMeshComponentSet(DependentField,CMISS_FIELD_DELUDELN_VARIABLE_TYPE,3,QuadraticMeshComponentNumber,Err)
  394. CALL CMISSField_ComponentMeshComponentSet(DependentField,CMISS_FIELD_DELUDELN_VARIABLE_TYPE,4,LinearMeshComponentNumber,Err)
  395. CALL CMISSField_ScalingTypeSet(DependentField,CMISS_FIELD_UNIT_SCALING,Err)
  396. CALL CMISSField_CreateFinish(DependentField,Err)
  397. CALL CMISSEquationsSet_DependentCreateStart(EquationsSet,FieldDependentUserNumber,DependentField,Err)
  398. CALL CMISSEquationsSet_DependentCreateFinish(EquationsSet,Err)
  399. CALL CMISSEquationsSet_MaterialsCreateStart(EquationsSet,FieldMaterialUserNumber,MaterialField,Err)
  400. CALL CMISSEquationsSet_MaterialsCreateFinish(EquationsSet,Err)
  401. !Create the equations set equations
  402. CALL CMISSEquations_Initialise(Equations,Err)
  403. CALL CMISSEquationsSet_EquationsCreateStart(EquationsSet,Equations,Err)
  404. CALL CMISSEquations_SparsityTypeSet(Equations,CMISS_EQUATIONS_SPARSE_MATRICES,Err)
  405. CALL CMISSEquations_OutputTypeSet(Equations,CMISS_EQUATIONS_NO_OUTPUT,Err)
  406. CALL CMISSEquationsSet_EquationsCreateFinish(EquationsSet,Err)
  407. !Initialise dependent field from undeformed geometry and displacement bcs and set hydrostatic pressure
  408. CALL CMISSField_ParametersToFieldParametersComponentCopy(GeometricField,CMISS_FIELD_U_VARIABLE_TYPE,CMISS_FIELD_VALUES_SET_TYPE, &
  409. & 1,DependentField,CMISS_FIELD_U_VARIABLE_TYPE,CMISS_FIELD_VALUES_SET_TYPE,1,Err)
  410. CALL CMISSField_ParametersToFieldParametersComponentCopy(GeometricField,CMISS_FIELD_U_VARIABLE_TYPE,CMISS_FIELD_VALUES_SET_TYPE, &
  411. & 2,DependentField,CMISS_FIELD_U_VARIABLE_TYPE,CMISS_FIELD_VALUES_SET_TYPE,2,Err)
  412. CALL CMISSField_ParametersToFieldParametersComponentCopy(GeometricField,CMISS_FIELD_U_VARIABLE_TYPE,CMISS_FIELD_VALUES_SET_TYPE, &
  413. & 3,DependentField,CMISS_FIELD_U_VARIABLE_TYPE,CMISS_FIELD_VALUES_SET_TYPE,3,Err)
  414. CALL CMISSField_ComponentValuesInitialise(DependentField,CMISS_FIELD_U_VARIABLE_TYPE,CMISS_FIELD_VALUES_SET_TYPE,4, &
  415. & -14.0_CMISSDP, &
  416. & Err)
  417. !Define the problem
  418. CALL CMISSProblem_Initialise(Problem,Err)
  419. CALL CMISSProblem_CreateStart(ProblemUserNumber,Problem,Err)
  420. CALL CMISSProblem_SpecificationSet(Problem,CMISS_PROBLEM_ELASTICITY_CLASS,CMISS_PROBLEM_FINITE_ELASTICITY_TYPE, &
  421. & CMISS_PROBLEM_NO_SUBTYPE,Err)
  422. CALL CMISSProblem_CreateFinish(Problem,Err)
  423. !Create the problem control loop
  424. CALL CMISSProblem_ControlLoopCreateStart(Problem,Err)
  425. CALL CMISSProblem_ControlLoopCreateFinish(Problem,Err)
  426. !Create the problem solvers
  427. CALL CMISSSolver_Initialise(Solver,Err)
  428. CALL CMISSSolver_Initialise(LinearSolver,Err)
  429. CALL CMISSProblem_SolversCreateStart(Problem,Err)
  430. CALL CMISSProblem_SolverGet(Problem,CMISS_CONTROL_LOOP_NODE,1,Solver,Err)
  431. CALL CMISSSolver_OutputTypeSet(Solver,CMISS_SOLVER_PROGRESS_OUTPUT,Err)
  432. !CALL CMISSSolver_NewtonJacobianCalculationTypeSet(Solver,CMISS_SOLVER_NEWTON_JACOBIAN_FD_CALCULATED,Err)
  433. CALL CMISSSolver_NewtonJacobianCalculationTypeSet(Solver,CMISS_SOLVER_NEWTON_JACOBIAN_EQUATIONS_CALCULATED,Err)
  434. CALL CMISSSolver_NewtonLinearSolverGet(Solver,LinearSolver,Err)
  435. CALL CMISSSolver_LinearTypeSet(LinearSolver,CMISS_SOLVER_LINEAR_DIRECT_SOLVE_TYPE,Err)
  436. CALL CMISSProblem_SolversCreateFinish(Problem,Err)
  437. !Create the problem solver equations
  438. CALL CMISSSolver_Initialise(Solver,Err)
  439. CALL CMISSSolverEquations_Initialise(SolverEquations,Err)
  440. CALL CMISSProblem_SolverEquationsCreateStart(Problem,Err)
  441. CALL CMISSProblem_SolverGet(Problem,CMISS_CONTROL_LOOP_NODE,1,Solver,Err)
  442. CALL CMISSSolver_SolverEquationsGet(Solver,SolverEquations,Err)
  443. CALL CMISSSolverEquations_SparsityTypeSet(SolverEquations,CMISS_SOLVER_SPARSE_MATRICES,Err)
  444. CALL CMISSSolverEquations_EquationsSetAdd(SolverEquations,EquationsSet,EquationsSetIndex,Err)
  445. CALL CMISSProblem_SolverEquationsCreateFinish(Problem,Err)
  446. !Prescribe boundary conditions (absolute nodal parameters)
  447. CALL CMISSBoundaryConditions_Initialise(BoundaryConditions,Err)
  448. CALL CMISSSolverEquations_BoundaryConditionsCreateStart(SolverEquations,BoundaryConditions,Err)
  449. !Grab the list of nodes on inner, outer and top surfaces
  450. CALL CMISSGeneratedMesh_SurfaceGet(GeneratedMesh,CMISS_GENERATED_MESH_ELLIPSOID_TOP_SURFACE,TopSurfaceNodes,TopNormalXi,Err)
  451. CALL CMISSGeneratedMesh_SurfaceGet(GeneratedMesh,CMISS_GENERATED_MESH_ELLIPSOID_INNER_SURFACE,InnerSurfaceNodes,InnerNormalXi,Err)
  452. CALL CMISSGeneratedMesh_SurfaceGet(GeneratedMesh,CMISS_GENERATED_MESH_ELLIPSOID_OUTER_SURFACE,OuterSurfaceNodes,OuterNormalXi,Err)
  453. ! ASSIGN BOUNDARY CONDITIONS ===============
  454. !Fix base of the ellipsoid in z direction
  455. DO NN=1,SIZE(TopSurfaceNodes,1)
  456. NODE=TopSurfaceNodes(NN)
  457. CALL CMISSDecomposition_NodeDomainGet(Decomposition,NODE,1,NodeDomain,Err)
  458. IF(NodeDomain==ComputationalNodeNumber) THEN
  459. CALL CMISSField_ParameterSetGetNode(GeometricField,CMISS_FIELD_U_VARIABLE_TYPE,CMISS_FIELD_VALUES_SET_TYPE,1,1,NODE,3, &
  460. & ZCoord, &
  461. & Err)
  462. CALL CMISSBoundaryConditions_SetNode(BoundaryConditions,DependentField,CMISS_FIELD_U_VARIABLE_TYPE,1,1,NODE,3, &
  463. & CMISS_BOUNDARY_CONDITION_FIXED,ZCoord,Err)
  464. ENDIF
  465. ENDDO
  466. !Apply inner surface pressure
  467. !NOTE: Surface pressure goes into pressure_values_set_type of the DELUDELN type
  468. DO NN=1,SIZE(InnerSurfaceNodes,1)
  469. NODE=InnerSurfaceNodes(NN)
  470. CALL CMISSDecomposition_NodeDomainGet(Decomposition,NODE,1,NodeDomain,Err)
  471. IF(NodeDomain==ComputationalNodeNumber) THEN
  472. CALL CMISSBoundaryConditions_SetNode(BoundaryConditions,DependentField,CMISS_FIELD_DELUDELN_VARIABLE_TYPE,1,1,NODE, &
  473. & ABS(InnerNormalXi), &
  474. & CMISS_BOUNDARY_CONDITION_PRESSURE,INNER_PRESSURE,Err)
  475. ENDIF
  476. ENDDO
  477. !Apply outer surface pressure
  478. DO NN=1,SIZE(OuterSurfaceNodes,1)
  479. NODE=OuterSurfaceNodes(NN)
  480. CALL CMISSDecomposition_NodeDomainGet(Decomposition,NODE,1,NodeDomain,Err)
  481. IF(NodeDomain==ComputationalNodeNumber) THEN
  482. CALL CMISSBoundaryConditions_SetNode(BoundaryConditions,DependentField,CMISS_FIELD_DELUDELN_VARIABLE_TYPE,1,1,NODE, &
  483. & ABS(OuterNormalXi), &
  484. & CMISS_BOUNDARY_CONDITION_PRESSURE,OUTER_PRESSURE,Err)
  485. ENDIF
  486. ENDDO
  487. !Fix more nodes at the base to stop free body motion
  488. X_FIXED=.FALSE.
  489. Y_FIXED=.FALSE.
  490. DO NN=1,SIZE(TopSurfaceNodes,1)
  491. NODE=TopSurfaceNodes(NN)
  492. CALL CMISSDecomposition_NodeDomainGet(Decomposition,NODE,1,NodeDomain,Err)
  493. IF(NodeDomain==ComputationalNodeNumber) THEN
  494. CALL CMISSField_ParameterSetGetNode(GeometricField,CMISS_FIELD_U_VARIABLE_TYPE,CMISS_FIELD_VALUES_SET_TYPE,1,1,NODE,1, &
  495. & XCoord, &
  496. & Err)
  497. CALL CMISSField_ParameterSetGetNode(GeometricField,CMISS_FIELD_U_VARIABLE_TYPE,CMISS_FIELD_VALUES_SET_TYPE,1,1,NODE,2, &
  498. & YCoord, &
  499. & Err)
  500. IF(ABS(XCoord)<1.0E-6_CMISSDP) THEN
  501. CALL CMISSBoundaryConditions_SetNode(BoundaryConditions,DependentField,CMISS_FIELD_U_VARIABLE_TYPE,1,1,NODE,1, &
  502. & CMISS_BOUNDARY_CONDITION_FIXED,XCoord,Err)
  503. WRITE(*,*) "FIXING NODE",NODE,"IN X DIRECTION"
  504. X_FIXED=.TRUE.
  505. ENDIF
  506. IF(ABS(YCoord)<1.0E-6_CMISSDP) THEN
  507. CALL CMISSBoundaryConditions_SetNode(BoundaryConditions,DependentField,CMISS_FIELD_U_VARIABLE_TYPE,1,1,NODE,2, &
  508. & CMISS_BOUNDARY_CONDITION_FIXED,YCoord,Err)
  509. WRITE(*,*) "FIXING NODE",NODE,"IN Y DIRECTION"
  510. Y_FIXED=.TRUE.
  511. ENDIF
  512. ENDIF
  513. ENDDO
  514. CALL MPI_REDUCE(X_FIXED,X_OKAY,1,MPI_LOGICAL,MPI_LOR,0,MPI_COMM_WORLD,MPI_IERROR)
  515. CALL MPI_REDUCE(Y_FIXED,Y_OKAY,1,MPI_LOGICAL,MPI_LOR,0,MPI_COMM_WORLD,MPI_IERROR)
  516. IF(ComputationalNodeNumber==0) THEN
  517. IF(.NOT.(X_OKAY.AND.Y_OKAY)) THEN
  518. WRITE(*,*) "Free body motion could not be prevented!"
  519. CALL CMISSFinalise(Err)
  520. STOP
  521. ENDIF
  522. ENDIF
  523. ! END ASSIGN BOUNDARY CONDITIONS ===============
  524. CALL CMISSSolverEquations_BoundaryConditionsCreateFinish(SolverEquations,Err)
  525. !Solve for many timesteps while incrementing inner pressure
  526. DO time_step=1,3
  527. !Solve problem
  528. CALL CMISSProblem_Solve(Problem,Err)
  529. !Output solution
  530. CALL CMISSFields_Initialise(Fields,Err)
  531. CALL CMISSFields_Create(Region,Fields,Err)
  532. WRITE(fileNumber,'(I3.3)') time_step
  533. fileName='./outputs/QuadraticEllipsoid'//trim(fileNumber)
  534. CALL CMISSFields_NodesExport(Fields,trim(fileName),"FORTRAN",Err)
  535. CALL CMISSFields_ElementsExport(Fields,trim(fileName),"FORTRAN",Err)
  536. CALL CMISSFields_Finalise(Fields,Err)
  537. !Apply inner surface pressure
  538. !NOTE: Surface pressure goes into pressure_values_set_type of the DELUDELN type
  539. DO NN=1,SIZE(InnerSurfaceNodes,1)
  540. NODE=InnerSurfaceNodes(NN)
  541. CALL CMISSDecomposition_NodeDomainGet(Decomposition,NODE,1,NodeDomain,Err)
  542. IF(NodeDomain==ComputationalNodeNumber) THEN
  543. !Set the field directly
  544. CALL CMISSField_ParameterSetUpdateNode(DependentField,CMISS_FIELD_DELUDELN_VARIABLE_TYPE, &
  545. & CMISS_FIELD_PRESSURE_VALUES_SET_TYPE,1,1,&
  546. & NODE, ABS(InnerNormalXi),INNER_PRESSURE*REAL(time_step+1,CMISSDP),Err)
  547. ENDIF
  548. ENDDO
  549. ENDDO
  550. CALL CMISSFinalise(Err)
  551. WRITE(*,'(A)') "Program successfully completed."
  552. STOP
  553. END PROGRAM QUADRATICELLIPSOIDCOSTAEXAMPLE