PageRenderTime 61ms CodeModel.GetById 25ms RepoModel.GetById 0ms app.codeStats 0ms

/MultiPhysics/Poroelasticity/FiniteElasticityDarcy/QuadraticEllipsoidDrivenDarcy/src/QuadraticEllipsoidDrivenDarcyExample.f90

http://github.com/xyan075/examples
FORTRAN Modern | 1124 lines | 649 code | 181 blank | 294 comment | 0 complexity | 065c8a8617ed85fdc58477d6f0c89bff MD5 | raw file
  1. !> \file
  2. !> \author Christian Michler
  3. !> \brief This is an example program to solve a coupled Finite Elastiticity Darcy equation on a cylindrical geometry using openCMISS calls.
  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): Christian Michler, Jack Lee
  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 MultiPhysics/Poroelasticity/FiniteElasticityDarcy/QuadraticEllipsoidDrivenDarcy/src/QuadraticEllipsoidDrivenDarcyExample.f90
  42. !! Example program to solve coupled FiniteElasticityDarcy equations using OpenCMISS calls.
  43. !! \par Latest Builds:
  44. !! \li <a href='http://autotest.bioeng.auckland.ac.nz/opencmiss-build/logs_x86_64-linux/MultiPhysics/Poroelasticity/FiniteElasticityDarcy/QuadraticEllipsoidDrivenDarcy/build-intel'>Linux Intel Build</a>
  45. !! \li <a href='http://autotest.bioeng.auckland.ac.nz/opencmiss-build/logs_x86_64-linux/MultiPhysics/Poroelasticity/FiniteElasticityDarcy/QuadraticEllipsoidDrivenDarcy/build-intel'>Linux GNU Build</a>
  46. !!
  47. !<
  48. ! !
  49. ! ! This example considers a coupled Finite Elasticity Darcy problem on a cylindrical geometry
  50. ! !
  51. !> Main program
  52. PROGRAM QUADRATICELLIPSOIDDRIVENDARCYEXAMPLE
  53. !
  54. !================================================================================================================================
  55. !
  56. !PROGRAM LIBRARIES
  57. USE OPENCMISS
  58. USE MPI
  59. #ifdef WIN32
  60. USE IFQWINCMISS
  61. #endif
  62. !
  63. !================================================================================================================================
  64. !
  65. !PROGRAM VARIABLES AND TYPES
  66. IMPLICIT NONE
  67. !Test program parameters
  68. REAL(CMISSDP), PARAMETER :: PI=3.14159_CMISSDP
  69. REAL(CMISSDP), PARAMETER :: LONG_AXIS=2.0_CMISSDP
  70. REAL(CMISSDP), PARAMETER :: SHORT_AXIS=1.0_CMISSDP
  71. REAL(CMISSDP), PARAMETER :: WALL_THICKNESS=0.5_CMISSDP
  72. REAL(CMISSDP), PARAMETER :: CUTOFF_ANGLE=1.5708_CMISSDP
  73. REAL(CMISSDP), PARAMETER :: FIBRE_SLOPE_INTERSECTION=1.73205_CMISSDP !Slope of fibres in base endocardium = 60 degrees
  74. REAL(CMISSDP), PARAMETER :: FIBRE_SLOPE_CHANGE=-3.4641_CMISSDP !Slope change of fibres from 60 to -60 degrees in transmural direction
  75. REAL(CMISSDP), PARAMETER :: SHEET_SLOPE_BASE_ENDO=1.0_CMISSDP !Slope of sheet at base endocardium
  76. REAL(CMISSDP), PARAMETER :: INNER_PRESSURE=2.0_CMISSDP !Positive is compressive
  77. REAL(CMISSDP), PARAMETER :: OUTER_PRESSURE=0.0_CMISSDP !Positive is compressive
  78. REAL(CMISSDP), PARAMETER :: C1= 2.0_CMISSDP
  79. REAL(CMISSDP), PARAMETER :: C2= 6.0_CMISSDP
  80. REAL(CMISSDP), PARAMETER :: C3=10.0_CMISSDP
  81. INTEGER(CMISSIntg), PARAMETER :: NumberGlobalXElements=4 ! X ==NUMBER_GLOBAL_CIRCUMFERENTIAL_ELEMENTS
  82. INTEGER(CMISSIntg), PARAMETER :: NumberGlobalYElements=4 ! Y ==NUMBER_GLOBAL_LONGITUDINAL_ELEMENTS
  83. INTEGER(CMISSIntg), PARAMETER :: NumberGlobalZElements=2 ! Z ==NUMBER_GLOBAL_TRANSMURAL_ELEMENTS
  84. INTEGER(CMISSIntg) :: NumberOfDomains
  85. INTEGER(CMISSIntg), PARAMETER :: CoordinateSystemUserNumber=1
  86. INTEGER(CMISSIntg), PARAMETER :: NumberOfSpatialCoordinates=3
  87. INTEGER(CMISSIntg), PARAMETER :: RegionUserNumber=1
  88. INTEGER(CMISSIntg), PARAMETER :: QuadraticBasisUserNumber=1
  89. INTEGER(CMISSIntg), PARAMETER :: QuadraticCollapsedBasisUserNumber=2
  90. INTEGER(CMISSIntg), PARAMETER :: LinearBasisUserNumber=3
  91. INTEGER(CMISSIntg), PARAMETER :: LinearCollapsedBasisUserNumber=4
  92. INTEGER(CMISSIntg), PARAMETER :: MeshUserNumber=1
  93. INTEGER(CMISSIntg), PARAMETER :: GeneratedMeshUserNumber=2
  94. INTEGER(CMISSIntg), PARAMETER :: DecompositionUserNumber=1
  95. INTEGER(CMISSIntg), PARAMETER :: DerivativeUserNumber=1
  96. INTEGER(CMISSIntg), PARAMETER :: NumberOfMeshDimensions=3
  97. INTEGER(CMISSIntg), PARAMETER :: NumberOfXiCoordinates=3
  98. INTEGER(CMISSIntg), PARAMETER :: NumberOfMeshComponents=2
  99. INTEGER(CMISSIntg), PARAMETER :: QuadraticMeshComponentNumber=1
  100. INTEGER(CMISSIntg), PARAMETER :: LinearMeshComponentNumber=2
  101. INTEGER(CMISSIntg), PARAMETER :: TotalNumberOfElements=1
  102. INTEGER(CMISSIntg), PARAMETER :: FieldGeometryUserNumberSolid=1
  103. INTEGER(CMISSIntg), PARAMETER :: FieldGeometryUserNumberDarcy=11
  104. INTEGER(CMISSIntg), PARAMETER :: FieldGeometryNumberOfVariables=1
  105. INTEGER(CMISSIntg), PARAMETER :: FieldGeometryNumberOfComponents=3
  106. INTEGER(CMISSIntg), PARAMETER :: FieldFibreUserNumber=2
  107. INTEGER(CMISSIntg), PARAMETER :: FieldFibreNumberOfVariables=1
  108. INTEGER(CMISSIntg), PARAMETER :: FieldFibreNumberOfComponents=3
  109. INTEGER(CMISSIntg), PARAMETER :: FieldMaterialUserNumber=3
  110. INTEGER(CMISSIntg), PARAMETER :: FieldMaterialNumberOfVariables=1
  111. INTEGER(CMISSIntg), PARAMETER :: FieldMaterialNumberOfComponents=3 !2
  112. INTEGER(CMISSIntg), PARAMETER :: FieldDependentUserNumber=4
  113. INTEGER(CMISSIntg), PARAMETER :: FieldDependentNumberOfVariables=4 !2
  114. INTEGER(CMISSIntg), PARAMETER :: FieldDependentSolidNumberOfComponents=4
  115. INTEGER(CMISSIntg), PARAMETER :: FieldDependentFluidNumberOfComponents=4
  116. INTEGER(CMISSIntg), PARAMETER :: IndependentFieldDarcyUserNumber=15
  117. INTEGER(CMISSIntg), PARAMETER :: EquationSetUserNumberSolid=1
  118. INTEGER(CMISSIntg), PARAMETER :: EquationsSetFieldUserNumberSolid=13
  119. INTEGER(CMISSIntg), PARAMETER :: ProblemUserNumber=1
  120. INTEGER(CMISSIntg), PARAMETER :: MaterialsFieldUserNumberDarcy=8
  121. INTEGER(CMISSIntg), PARAMETER :: EquationsSetUserNumberDarcy=12
  122. INTEGER(CMISSIntg), PARAMETER :: EquationsSetFieldUserNumberDarcy=22
  123. INTEGER(CMISSIntg), PARAMETER :: SourceFieldDarcyUserNumber=42
  124. INTEGER(CMISSIntg), PARAMETER :: ControlLoopSolidNumber=1
  125. INTEGER(CMISSIntg), PARAMETER :: ControlLoopFluidNumber=2
  126. INTEGER(CMISSIntg), PARAMETER :: ControlLoopSubiterationNumber=1
  127. INTEGER(CMISSIntg), PARAMETER :: SolverSolidIndex=1
  128. INTEGER(CMISSIntg), PARAMETER :: SolverDarcyIndex=1
  129. !Program types
  130. !Program variables
  131. INTEGER(CMISSIntg) :: MPI_IERROR
  132. INTEGER(CMISSIntg) :: EquationsSetIndex
  133. INTEGER(CMISSIntg) :: NumberOfComputationalNodes,ComputationalNodeNumber
  134. REAL(CMISSDP) :: FibreFieldAngle(3)
  135. REAL(CMISSDP) :: nu,theta,omega,XI3,XI3delta,XI2delta, zero
  136. INTEGER(CMISSIntg) ::i,j,k,component_idx,node_idx,TOTAL_NUMBER_NODES_XI(3)
  137. !For grabbing surfaces
  138. INTEGER(CMISSIntg) :: InnerNormalXi,OuterNormalXi,TopNormalXi
  139. INTEGER(CMISSIntg), ALLOCATABLE :: InnerSurfaceNodes(:)
  140. INTEGER(CMISSIntg), ALLOCATABLE :: OuterSurfaceNodes(:)
  141. INTEGER(CMISSIntg), ALLOCATABLE :: TopSurfaceNodes(:)
  142. INTEGER(CMISSIntg), ALLOCATABLE :: TopSurfaceNodesDarcyVel(:)
  143. INTEGER(CMISSIntg), ALLOCATABLE :: InnerSurfaceNodesDarcyVel(:)
  144. INTEGER(CMISSIntg), ALLOCATABLE :: OuterSurfaceNodesDarcyVel(:)
  145. INTEGER(CMISSIntg) :: NN,NODE,NodeDomain
  146. REAL(CMISSDP) :: XCoord,YCoord,ZCoord
  147. LOGICAL :: X_FIXED,Y_FIXED,X_OKAY,Y_OKAY
  148. INTEGER(CMISSIntg) :: GeometricFieldDarcyMeshComponentNumber, DarcyVelMeshComponentNumber, DarcyMassIncreaseMeshComponentNumber
  149. INTEGER(CMISSIntg) :: MeshComponentNumber_dummy
  150. INTEGER(CMISSIntg) :: NUMBER_OF_DOMAINS
  151. INTEGER(CMISSIntg) :: NUMBER_OF_DIMENSIONS
  152. INTEGER(CMISSIntg) :: MAXIMUM_ITERATIONS
  153. INTEGER(CMISSIntg) :: RESTART_VALUE
  154. INTEGER(CMISSIntg) :: EQUATIONS_DARCY_OUTPUT
  155. INTEGER(CMISSIntg) :: COMPONENT_NUMBER, NODE_NUMBER
  156. INTEGER(CMISSIntg) :: CONDITION
  157. INTEGER(CMISSIntg) :: DYNAMIC_SOLVER_DARCY_OUTPUT_FREQUENCY
  158. INTEGER(CMISSIntg) :: DYNAMIC_SOLVER_DARCY_OUTPUT_TYPE
  159. INTEGER(CMISSIntg) :: LINEAR_SOLVER_DARCY_OUTPUT_TYPE
  160. REAL(CMISSDP) :: COORD_X, COORD_Y, COORD_Z
  161. REAL(CMISSDP) :: DOMAIN_X1, DOMAIN_X2, DOMAIN_Y1, DOMAIN_Y2, DOMAIN_Z1, DOMAIN_Z2
  162. REAL(CMISSDP) :: GEOMETRY_TOLERANCE
  163. INTEGER(CMISSIntg) :: EDGE_COUNT
  164. INTEGER(CMISSIntg) :: BASIS_XI_INTERPOLATION_SOLID
  165. REAL(CMISSDP) :: INITIAL_FIELD_DARCY(4)
  166. REAL(CMISSDP) :: DIVERGENCE_TOLERANCE
  167. REAL(CMISSDP) :: RELATIVE_TOLERANCE
  168. REAL(CMISSDP) :: ABSOLUTE_TOLERANCE
  169. REAL(CMISSDP) :: LINESEARCH_ALPHA
  170. REAL(CMISSDP) :: VALUE
  171. REAL(CMISSDP) :: POROSITY_PARAM_DARCY, PERM_OVER_VIS_PARAM_DARCY
  172. LOGICAL :: EXPORT_FIELD_IO
  173. LOGICAL :: LINEAR_SOLVER_DARCY_DIRECT_FLAG
  174. !CMISS variables
  175. TYPE(CMISSBasisType) :: QuadraticBasis,QuadraticCollapsedBasis,LinearBasis,LinearCollapsedBasis
  176. TYPE(CMISSBoundaryConditionsType) :: BoundaryConditions
  177. TYPE(CMISSCoordinateSystemType) :: CoordinateSystem, WorldCoordinateSystem
  178. TYPE(CMISSMeshType) :: Mesh
  179. TYPE(CMISSGeneratedMeshType) :: GeneratedMesh
  180. TYPE(CMISSDecompositionType) :: Decomposition
  181. TYPE(CMISSEquationsType) :: Equations
  182. TYPE(CMISSEquationsSetType) :: EquationsSetSolid
  183. TYPE(CMISSFieldType) :: GeometricFieldSolid,FibreFieldSolid,MaterialFieldSolid
  184. TYPE(CMISSFieldType) :: DependentField,EquationsSetFieldSolid
  185. TYPE(CMISSFieldType) :: IndependentFieldDarcy
  186. TYPE(CMISSFieldType) :: GeometricFieldDarcy
  187. TYPE(CMISSFieldType) :: MaterialsFieldDarcy
  188. TYPE(CMISSFieldType) :: EquationsSetFieldDarcy
  189. TYPE(CMISSFieldType) :: SourceFieldDarcy
  190. !Boundary conditions
  191. TYPE(CMISSBoundaryConditionsType) :: BoundaryConditionsDarcy
  192. !Equations sets
  193. TYPE(CMISSEquationsSetType) :: EquationsSetDarcy
  194. !Equations
  195. TYPE(CMISSEquationsType) :: EquationsDarcy
  196. TYPE(CMISSFieldsType) :: Fields
  197. TYPE(CMISSProblemType) :: Problem
  198. TYPE(CMISSRegionType) :: Region,WorldRegion
  199. TYPE(CMISSSolverType) :: SolverSolid,LinearSolverSolid
  200. TYPE(CMISSSolverEquationsType) :: SolverEquationsSolid
  201. TYPE(CMISSControlLoopType) :: ControlLoop
  202. !Solvers
  203. TYPE(CMISSSolverType) :: DynamicSolverDarcy
  204. TYPE(CMISSSolverType) :: LinearSolverDarcy
  205. !Solver equations
  206. TYPE(CMISSSolverEquationsType) :: SolverEquationsDarcy
  207. REAL(CMISSDP) :: DYNAMIC_SOLVER_DARCY_START_TIME
  208. REAL(CMISSDP) :: DYNAMIC_SOLVER_DARCY_STOP_TIME
  209. REAL(CMISSDP) :: DYNAMIC_SOLVER_DARCY_THETA
  210. REAL(CMISSDP) :: DYNAMIC_SOLVER_DARCY_TIME_INCREMENT
  211. INTEGER(CMISSIntg),allocatable :: ElementUserNodes(:)
  212. INTEGER(CMISSIntg) :: NUMBER_USER_ELEMENT_NODES, ELEMENT_NUMBER
  213. #ifdef WIN32
  214. !Quickwin type
  215. LOGICAL :: QUICKWIN_STATUS=.FALSE.
  216. TYPE(WINDOWCONFIG) :: QUICKWIN_WINDOW_CONFIG
  217. #endif
  218. !Generic CMISS variables
  219. INTEGER(CMISSIntg) :: Err
  220. #ifdef WIN32
  221. !Initialise QuickWin
  222. QUICKWIN_WINDOW_CONFIG%TITLE="General Output" !Window title
  223. QUICKWIN_WINDOW_CONFIG%NUMTEXTROWS=-1 !Max possible number of rows
  224. QUICKWIN_WINDOW_CONFIG%MODE=QWIN$SCROLLDOWN
  225. !Set the window parameters
  226. QUICKWIN_STATUS=SETWINDOWCONFIG(QUICKWIN_WINDOW_CONFIG)
  227. !If attempt fails set with system estimated values
  228. IF(.NOT.QUICKWIN_STATUS) QUICKWIN_STATUS=SETWINDOWCONFIG(QUICKWIN_WINDOW_CONFIG)
  229. #endif
  230. !Set initial values
  231. INITIAL_FIELD_DARCY(1)=0.0_CMISSDP
  232. INITIAL_FIELD_DARCY(2)=0.0_CMISSDP
  233. INITIAL_FIELD_DARCY(3)=0.0_CMISSDP
  234. INITIAL_FIELD_DARCY(4)=0.0_CMISSDP
  235. !Set material parameters
  236. POROSITY_PARAM_DARCY=0.1_CMISSDP
  237. PERM_OVER_VIS_PARAM_DARCY=1.0_CMISSDP
  238. !Set output parameter
  239. !(NoOutput/ProgressOutput/TimingOutput/SolverOutput/SolverMatrixOutput)
  240. DYNAMIC_SOLVER_DARCY_OUTPUT_TYPE=CMISS_SOLVER_PROGRESS_OUTPUT
  241. LINEAR_SOLVER_DARCY_OUTPUT_TYPE=CMISS_SOLVER_SOLVER_OUTPUT
  242. !(NoOutput/TimingOutput/MatrixOutput/ElementOutput)
  243. EQUATIONS_DARCY_OUTPUT=CMISS_EQUATIONS_NO_OUTPUT
  244. !Set time parameter
  245. DYNAMIC_SOLVER_DARCY_START_TIME=1.0E-3_CMISSDP
  246. DYNAMIC_SOLVER_DARCY_TIME_INCREMENT=1.0e-3_CMISSDP
  247. DYNAMIC_SOLVER_DARCY_STOP_TIME=2_CMISSIntg * DYNAMIC_SOLVER_DARCY_TIME_INCREMENT
  248. DYNAMIC_SOLVER_DARCY_THETA=1.0_CMISSDP !2.0_CMISSDP/3.0_CMISSDP
  249. !Set result output parameter
  250. DYNAMIC_SOLVER_DARCY_OUTPUT_FREQUENCY=1
  251. !Set solver parameters
  252. LINEAR_SOLVER_DARCY_DIRECT_FLAG=.TRUE.
  253. RELATIVE_TOLERANCE=1.0E-10_CMISSDP !default: 1.0E-05_CMISSDP
  254. ABSOLUTE_TOLERANCE=1.0E-10_CMISSDP !default: 1.0E-10_CMISSDP
  255. DIVERGENCE_TOLERANCE=1.0E5_CMISSDP !default: 1.0E5
  256. MAXIMUM_ITERATIONS=10000_CMISSIntg !default: 100000
  257. RESTART_VALUE=30_CMISSIntg !default: 30
  258. LINESEARCH_ALPHA=1.0_CMISSDP
  259. !LinearMeshComponentNumber/QuadraticMeshComponentNumber
  260. DarcyVelMeshComponentNumber = LinearMeshComponentNumber
  261. DarcyMassIncreaseMeshComponentNumber = LinearMeshComponentNumber
  262. ! GeometricFieldDarcyMeshComponentNumber = DarcyVelMeshComponentNumber
  263. GeometricFieldDarcyMeshComponentNumber = QuadraticMeshComponentNumber
  264. !
  265. !================================================================================================================================
  266. !
  267. !Intialise cmiss
  268. CALL CMISSInitialise(WorldCoordinateSystem,WorldRegion,Err)
  269. CALL CMISSErrorHandlingModeSet(CMISS_ERRORS_TRAP_ERROR,Err)
  270. WRITE(*,'(A)') "Program starting."
  271. !Set all diganostic levels on for testing
  272. CALL CMISSDiagnosticsSetOn(CMISS_FROM_DIAG_TYPE,(/1,2,3,4,5/),"Diagnostics",(/"PROBLEM_FINITE_ELEMENT_CALCULATE"/),Err)
  273. !Get the number of computational nodes and this computational node number
  274. CALL CMISSComputationalNumberOfNodesGet(NumberOfComputationalNodes,Err)
  275. CALL CMISSComputationalNodeNumberGet(ComputationalNodeNumber,Err)
  276. !Broadcast the number of elements in the X,Y and Z directions and the number of partitions to the other computational nodes
  277. ! CALL MPI_BCAST(NumberGlobalXElements,1,MPI_INTEGER,0,MPI_COMM_WORLD,MPI_IERROR)
  278. ! CALL MPI_BCAST(NumberGlobalYElements,1,MPI_INTEGER,0,MPI_COMM_WORLD,MPI_IERROR)
  279. ! CALL MPI_BCAST(NumberGlobalZElements,1,MPI_INTEGER,0,MPI_COMM_WORLD,MPI_IERROR)
  280. ! CALL MPI_BCAST(NumberOfDomains,1,MPI_INTEGER,0,MPI_COMM_WORLD,MPI_IERROR)
  281. NumberOfDomains=NumberOfComputationalNodes
  282. !Create a CS - default is 3D rectangular cartesian CS with 0,0,0 as origin
  283. CALL CMISSCoordinateSystem_Initialise(CoordinateSystem,Err)
  284. CALL CMISSCoordinateSystem_CreateStart(CoordinateSystemUserNumber,CoordinateSystem,Err)
  285. CALL CMISSCoordinateSystem_TypeSet(CoordinateSystem,CMISS_COORDINATE_RECTANGULAR_CARTESIAN_TYPE,Err)
  286. CALL CMISSCoordinateSystem_DimensionSet(CoordinateSystem,NumberOfSpatialCoordinates,Err)
  287. CALL CMISSCoordinateSystem_OriginSet(CoordinateSystem,(/0.0_CMISSDP,0.0_CMISSDP,0.0_CMISSDP/),Err)
  288. CALL CMISSCoordinateSystem_CreateFinish(CoordinateSystem,Err)
  289. !
  290. !================================================================================================================================
  291. !
  292. !Create a region and assign the CS to the region
  293. CALL CMISSRegion_Initialise(Region,Err)
  294. CALL CMISSRegion_CreateStart(RegionUserNumber,WorldRegion,Region,Err)
  295. CALL CMISSRegion_CoordinateSystemSet(Region,CoordinateSystem,Err)
  296. CALL CMISSRegion_CreateFinish(Region,Err)
  297. !
  298. !================================================================================================================================
  299. !
  300. !Define basis functions - tri-linear Lagrange and tri-Quadratic Lagrange, each with collapsed variant
  301. !Quadratic Basis
  302. CALL CMISSBasis_Initialise(QuadraticBasis,Err)
  303. CALL CMISSBasis_CreateStart(QuadraticBasisUserNumber,QuadraticBasis,Err)
  304. CALL CMISSBasis_InterpolationXiSet(QuadraticBasis,(/CMISS_BASIS_QUADRATIC_LAGRANGE_INTERPOLATION, &
  305. & CMISS_BASIS_QUADRATIC_LAGRANGE_INTERPOLATION,CMISS_BASIS_QUADRATIC_LAGRANGE_INTERPOLATION/),Err)
  306. CALL CMISSBasis_QuadratureNumberOfGaussXiSet(QuadraticBasis, &
  307. & (/CMISS_BASIS_MID_QUADRATURE_SCHEME,CMISS_BASIS_MID_QUADRATURE_SCHEME,CMISS_BASIS_MID_QUADRATURE_SCHEME/),Err)
  308. ! & (/CMISS_BASIS_HIGH_QUADRATURE_SCHEME,CMISS_BASIS_HIGH_QUADRATURE_SCHEME,CMISS_BASIS_HIGH_QUADRATURE_SCHEME/),Err)
  309. CALL CMISSBasis_QuadratureLocalFaceGaussEvaluateSet(QuadraticBasis,.true.,Err) !Have to do this
  310. CALL CMISSBasis_CreateFinish(QuadraticBasis,Err)
  311. !Collapsed Quadratic Basis
  312. CALL CMISSBasis_Initialise(QuadraticCollapsedBasis,Err)
  313. CALL CMISSBasis_CreateStart(QuadraticCollapsedBasisUserNumber,QuadraticCollapsedBasis,Err)
  314. CALL CMISSBasis_TypeSet(QuadraticCollapsedBasis,CMISS_BASIS_LAGRANGE_HERMITE_TP_TYPE,Err)
  315. CALL CMISSBasis_NumberOfXiSet(QuadraticCollapsedBasis,NumberOfXiCoordinates,Err)
  316. CALL CMISSBasis_InterpolationXiSet(QuadraticCollapsedBasis,(/CMISS_BASIS_QUADRATIC_LAGRANGE_INTERPOLATION, &
  317. & CMISS_BASIS_QUADRATIC_LAGRANGE_INTERPOLATION,CMISS_BASIS_QUADRATIC_LAGRANGE_INTERPOLATION/),Err)
  318. CALL CMISSBasis_CollapsedXiSet(QuadraticCollapsedBasis,(/CMISS_BASIS_XI_COLLAPSED, &
  319. & CMISS_BASIS_COLLAPSED_AT_XI0,CMISS_BASIS_NOT_COLLAPSED/),Err)
  320. CALL CMISSBasis_QuadratureNumberOfGaussXiSet(QuadraticCollapsedBasis, &
  321. & (/CMISS_BASIS_MID_QUADRATURE_SCHEME,CMISS_BASIS_MID_QUADRATURE_SCHEME,CMISS_BASIS_MID_QUADRATURE_SCHEME/),Err)
  322. ! & (/CMISS_BASIS_HIGH_QUADRATURE_SCHEME,CMISS_BASIS_HIGH_QUADRATURE_SCHEME,CMISS_BASIS_HIGH_QUADRATURE_SCHEME/),Err)
  323. CALL CMISSBasis_QuadratureLocalFaceGaussEvaluateSet(QuadraticCollapsedBasis,.true.,Err) !Have to do this
  324. CALL CMISSBasis_CreateFinish(QuadraticCollapsedBasis,Err)
  325. !Linear Basis
  326. CALL CMISSBasis_Initialise(LinearBasis,Err)
  327. CALL CMISSBasis_CreateStart(LinearBasisUserNumber,LinearBasis,Err)
  328. CALL CMISSBasis_QuadratureNumberOfGaussXiSet(LinearBasis, &
  329. & (/CMISS_BASIS_MID_QUADRATURE_SCHEME,CMISS_BASIS_MID_QUADRATURE_SCHEME,CMISS_BASIS_MID_QUADRATURE_SCHEME/),Err)
  330. ! & (/CMISS_BASIS_HIGH_QUADRATURE_SCHEME,CMISS_BASIS_HIGH_QUADRATURE_SCHEME,CMISS_BASIS_HIGH_QUADRATURE_SCHEME/),Err)
  331. CALL CMISSBasis_QuadratureLocalFaceGaussEvaluateSet(LinearBasis,.true.,Err) !Have to do this (unused) due to field_interp setup
  332. CALL CMISSBasis_CreateFinish(LinearBasis,Err)
  333. !Collapsed Linear Basis
  334. CALL CMISSBasis_Initialise(LinearCollapsedBasis,Err)
  335. CALL CMISSBasis_CreateStart(LinearCollapsedBasisUserNumber,LinearCollapsedBasis,Err)
  336. CALL CMISSBasis_TypeSet(LinearCollapsedBasis,CMISS_BASIS_LAGRANGE_HERMITE_TP_TYPE,Err)
  337. CALL CMISSBasis_NumberOfXiSet(LinearCollapsedBasis,NumberOfXiCoordinates,Err)
  338. CALL CMISSBasis_InterpolationXiSet(LinearCollapsedBasis,(/CMISS_BASIS_LINEAR_LAGRANGE_INTERPOLATION, &
  339. & CMISS_BASIS_LINEAR_LAGRANGE_INTERPOLATION,CMISS_BASIS_LINEAR_LAGRANGE_INTERPOLATION/),Err)
  340. CALL CMISSBasis_CollapsedXiSet(LinearCollapsedBasis,(/CMISS_BASIS_XI_COLLAPSED,CMISS_BASIS_COLLAPSED_AT_XI0, &
  341. & CMISS_BASIS_NOT_COLLAPSED/),Err)
  342. CALL CMISSBasis_QuadratureNumberOfGaussXiSet(LinearCollapsedBasis, &
  343. & (/CMISS_BASIS_MID_QUADRATURE_SCHEME,CMISS_BASIS_MID_QUADRATURE_SCHEME,CMISS_BASIS_MID_QUADRATURE_SCHEME/),Err)
  344. ! & (/CMISS_BASIS_HIGH_QUADRATURE_SCHEME,CMISS_BASIS_HIGH_QUADRATURE_SCHEME,CMISS_BASIS_HIGH_QUADRATURE_SCHEME/),Err)
  345. CALL CMISSBasis_QuadratureLocalFaceGaussEvaluateSet(LinearCollapsedBasis,.true.,Err) !Have to do this (unused) due to field_interp setup
  346. CALL CMISSBasis_CreateFinish(LinearCollapsedBasis,Err)
  347. !
  348. !================================================================================================================================
  349. !
  350. !Start the creation of a generated ellipsoid mesh
  351. CALL CMISSGeneratedMesh_Initialise(GeneratedMesh,Err)
  352. CALL CMISSGeneratedMesh_CreateStart(GeneratedMeshUserNumber,Region,GeneratedMesh,Err)
  353. !Set up an ellipsoid mesh
  354. CALL CMISSGeneratedMesh_TypeSet(GeneratedMesh,CMISS_GENERATED_MESH_ELLIPSOID_MESH_TYPE,Err)
  355. !Set the quadratic and linear bases
  356. CALL CMISSGeneratedMesh_BasisSet(GeneratedMesh,[QuadraticBasis,QuadraticCollapsedBasis,LinearBasis,LinearCollapsedBasis],Err)
  357. !Define the mesh on the region
  358. CALL CMISSGeneratedMesh_ExtentSet(GeneratedMesh,(/LONG_AXIS,SHORT_AXIS,WALL_THICKNESS,CUTOFF_ANGLE/),Err)
  359. CALL CMISSGeneratedMesh_NumberOfElementsSet(GeneratedMesh,(/NumberGlobalXElements,NumberGlobalYElements, &
  360. & NumberGlobalZElements/),Err)
  361. !Finish the creation of a generated mesh in the region
  362. CALL CMISSMesh_Initialise(Mesh,Err)
  363. CALL CMISSGeneratedMesh_CreateFinish(GeneratedMesh,MeshUserNumber,Mesh,Err)
  364. !
  365. !================================================================================================================================
  366. !
  367. !Create a decomposition
  368. CALL CMISSDecomposition_Initialise(Decomposition,Err)
  369. CALL CMISSDecomposition_CreateStart(DecompositionUserNumber,Mesh,Decomposition,Err)
  370. CALL CMISSDecomposition_TypeSet(Decomposition,CMISS_DECOMPOSITION_CALCULATED_TYPE,Err)
  371. CALL CMISSDecomposition_NumberOfDomainsSet(Decomposition,NumberOfDomains,Err)
  372. CALL CMISSDecomposition_CalculateFacesSet(Decomposition,.TRUE.,Err)
  373. CALL CMISSDecomposition_CreateFinish(Decomposition,Err)
  374. !
  375. !================================================================================================================================
  376. !
  377. ! --- GeometricFieldSolid ---
  378. !Create a field to put the geometry (default is geometry)
  379. CALL CMISSField_Initialise(GeometricFieldSolid,Err)
  380. CALL CMISSField_CreateStart(FieldGeometryUserNumberSolid,Region,GeometricFieldSolid,Err)
  381. CALL CMISSField_MeshDecompositionSet(GeometricFieldSolid,Decomposition,Err)
  382. CALL CMISSField_TypeSet(GeometricFieldSolid,CMISS_FIELD_GEOMETRIC_TYPE,Err)
  383. CALL CMISSField_NumberOfVariablesSet(GeometricFieldSolid,FieldGeometryNumberOfVariables,Err)
  384. CALL CMISSField_NumberOfComponentsSet(GeometricFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,FieldGeometryNumberOfComponents,Err)
  385. CALL CMISSField_ComponentMeshComponentSet(GeometricFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,1,QuadraticMeshComponentNumber,Err)
  386. CALL CMISSField_ComponentMeshComponentSet(GeometricFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,2,QuadraticMeshComponentNumber,Err)
  387. CALL CMISSField_ComponentMeshComponentSet(GeometricFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,3,QuadraticMeshComponentNumber,Err)
  388. CALL CMISSField_CreateFinish(GeometricFieldSolid,Err)
  389. !Update the geometric field parameters
  390. CALL CMISSGeneratedMesh_GeometricParametersCalculate(GeneratedMesh,GeometricFieldSolid,Err)
  391. !
  392. !================================================================================================================================
  393. !
  394. ! --- GeometricFieldDarcy ---
  395. !Create a field to put the geometry (default is geometry)
  396. CALL CMISSField_Initialise(GeometricFieldDarcy,Err)
  397. CALL CMISSField_CreateStart(FieldGeometryUserNumberDarcy,Region,GeometricFieldDarcy,Err)
  398. CALL CMISSField_MeshDecompositionSet(GeometricFieldDarcy,Decomposition,Err)
  399. CALL CMISSField_TypeSet(GeometricFieldDarcy,CMISS_FIELD_GEOMETRIC_TYPE,Err)
  400. CALL CMISSField_NumberOfVariablesSet(GeometricFieldDarcy,FieldGeometryNumberOfVariables,Err)
  401. CALL CMISSField_NumberOfComponentsSet(GeometricFieldDarcy,CMISS_FIELD_U_VARIABLE_TYPE,FieldGeometryNumberOfComponents,Err)
  402. CALL CMISSField_ComponentMeshComponentSet(GeometricFieldDarcy,CMISS_FIELD_U_VARIABLE_TYPE,1, &
  403. & GeometricFieldDarcyMeshComponentNumber,Err)
  404. CALL CMISSField_ComponentMeshComponentSet(GeometricFieldDarcy,CMISS_FIELD_U_VARIABLE_TYPE,2, &
  405. & GeometricFieldDarcyMeshComponentNumber,Err)
  406. CALL CMISSField_ComponentMeshComponentSet(GeometricFieldDarcy,CMISS_FIELD_U_VARIABLE_TYPE,3, &
  407. & GeometricFieldDarcyMeshComponentNumber,Err)
  408. CALL CMISSField_CreateFinish(GeometricFieldDarcy,Err)
  409. !Update the geometric field parameters
  410. CALL CMISSGeneratedMesh_GeometricParametersCalculate(GeneratedMesh,GeometricFieldDarcy,Err)
  411. !
  412. !================================================================================================================================
  413. !
  414. !Create a fibre field and attach it to the geometric field
  415. CALL CMISSField_Initialise(FibreFieldSolid,Err)
  416. CALL CMISSField_CreateStart(FieldFibreUserNumber,Region,FibreFieldSolid,Err)
  417. CALL CMISSField_TypeSet(FibreFieldSolid,CMISS_FIELD_FIBRE_TYPE,Err)
  418. CALL CMISSField_MeshDecompositionSet(FibreFieldSolid,Decomposition,Err)
  419. CALL CMISSField_GeometricFieldSet(FibreFieldSolid,GeometricFieldSolid,Err)
  420. CALL CMISSField_NumberOfVariablesSet(FibreFieldSolid,FieldFibreNumberOfVariables,Err)
  421. CALL CMISSField_NumberOfComponentsSet(FibreFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,FieldFibreNumberOfComponents,Err)
  422. CALL CMISSField_ComponentMeshComponentSet(FibreFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,1,QuadraticMeshComponentNumber,Err)
  423. CALL CMISSField_ComponentMeshComponentSet(FibreFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,2,QuadraticMeshComponentNumber,Err)
  424. CALL CMISSField_ComponentMeshComponentSet(FibreFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,3,QuadraticMeshComponentNumber,Err)
  425. CALL CMISSField_CreateFinish(FibreFieldSolid,Err)
  426. !Set Fibre directions (this block is parallel-untested)
  427. node_idx=0
  428. !This is valid only for quadratic basis functions
  429. TOTAL_NUMBER_NODES_XI(1)=NumberGlobalXElements*2
  430. TOTAL_NUMBER_NODES_XI(2)=NumberGlobalYElements*2+1
  431. TOTAL_NUMBER_NODES_XI(3)=NumberGlobalZElements*2+1
  432. XI2delta=(PI-CUTOFF_ANGLE)/(TOTAL_NUMBER_NODES_XI(2)-1)
  433. XI3=0
  434. XI3delta=(1.0)/(TOTAL_NUMBER_NODES_XI(3)-1)
  435. zero=0
  436. DO k=1, TOTAL_NUMBER_NODES_XI(3)
  437. !Apex nodes
  438. j=1
  439. i=1
  440. node_idx=node_idx+1
  441. CALL CMISSDecomposition_NodeDomainGet(Decomposition,node_idx,1,NodeDomain,Err)
  442. IF(NodeDomain==ComputationalNodeNumber) THEN
  443. FibreFieldAngle=(/zero,zero,zero/)
  444. DO component_idx=1,FieldFibreNumberOfComponents
  445. CALL CMISSField_ParameterSetUpdateNode(FibreFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,CMISS_FIELD_VALUES_SET_TYPE,1, &
  446. & DerivativeUserNumber,node_idx,component_idx,FibreFieldAngle(component_idx),Err)
  447. ENDDO
  448. ENDIF
  449. theta=atan(FIBRE_SLOPE_CHANGE*XI3+FIBRE_SLOPE_INTERSECTION)
  450. DO j=2, TOTAL_NUMBER_NODES_XI(2)
  451. nu=PI-XI2delta*(j-1)
  452. omega=PI/2+cos(2*nu)*atan(SHEET_SLOPE_BASE_ENDO)*(-2*XI3+1)
  453. DO i=1, TOTAL_NUMBER_NODES_XI(1)
  454. node_idx=node_idx+1
  455. CALL CMISSDecomposition_NodeDomainGet(Decomposition,node_idx,1,NodeDomain,Err)
  456. IF(NodeDomain==ComputationalNodeNumber) THEN
  457. FibreFieldAngle=(/theta,zero,omega/)
  458. DO component_idx=1,FieldFibreNumberOfComponents
  459. CALL CMISSField_ParameterSetUpdateNode(FibreFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,CMISS_FIELD_VALUES_SET_TYPE,1, &
  460. & DerivativeUserNumber, node_idx,component_idx,FibreFieldAngle(component_idx),Err)
  461. ENDDO
  462. ENDIF
  463. ENDDO
  464. ENDDO
  465. XI3=XI3+XI3delta
  466. ENDDO
  467. !Create a material field and attach it to the geometric field
  468. CALL CMISSField_Initialise(MaterialFieldSolid,Err)
  469. CALL CMISSField_CreateStart(FieldMaterialUserNumber,Region,MaterialFieldSolid,Err)
  470. CALL CMISSField_TypeSet(MaterialFieldSolid,CMISS_FIELD_MATERIAL_TYPE,Err)
  471. CALL CMISSField_MeshDecompositionSet(MaterialFieldSolid,Decomposition,Err)
  472. CALL CMISSField_GeometricFieldSet(MaterialFieldSolid,GeometricFieldSolid,Err)
  473. CALL CMISSField_NumberOfVariablesSet(MaterialFieldSolid,FieldMaterialNumberOfVariables,Err)
  474. CALL CMISSField_NumberOfComponentsSet(MaterialFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,FieldMaterialNumberOfComponents,Err)
  475. CALL CMISSField_ComponentInterpolationSet(MaterialFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,1,CMISS_FIELD_CONSTANT_INTERPOLATION,Err)
  476. CALL CMISSField_ComponentInterpolationSet(MaterialFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,2,CMISS_FIELD_CONSTANT_INTERPOLATION,Err)
  477. CALL CMISSField_ComponentInterpolationSet(MaterialFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,3,CMISS_FIELD_CONSTANT_INTERPOLATION,Err)
  478. CALL CMISSField_CreateFinish(MaterialFieldSolid,Err)
  479. !Set Mooney-Rivlin constants
  480. CALL CMISSField_ComponentValuesInitialise(MaterialFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,CMISS_FIELD_VALUES_SET_TYPE,1,C1,Err)
  481. CALL CMISSField_ComponentValuesInitialise(MaterialFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,CMISS_FIELD_VALUES_SET_TYPE,2,C2,Err)
  482. CALL CMISSField_ComponentValuesInitialise(MaterialFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,CMISS_FIELD_VALUES_SET_TYPE,3,C3,Err)
  483. !
  484. !================================================================================================================================
  485. !
  486. !EQUATIONS SETS
  487. !Create the equations set for ALE Darcy
  488. CALL CMISSField_Initialise(EquationsSetFieldDarcy,Err)
  489. CALL CMISSEquationsSet_Initialise(EquationsSetDarcy,Err)
  490. CALL CMISSEquationsSet_CreateStart(EquationsSetUserNumberDarcy,Region,GeometricFieldDarcy, &
  491. & CMISS_EQUATIONS_SET_FLUID_MECHANICS_CLASS, &
  492. & CMISS_EQUATIONS_SET_DARCY_EQUATION_TYPE,CMISS_EQUATIONS_SET_INCOMPRESS_ELASTICITY_DRIVEN_DARCY_SUBTYPE,&
  493. & EquationsSetFieldUserNumberDarcy,EquationsSetFieldDarcy,EquationsSetDarcy,Err)
  494. CALL CMISSEquationsSet_CreateFinish(EquationsSetDarcy,Err)
  495. !Create the equations set for the solid
  496. CALL CMISSField_Initialise(EquationsSetFieldSolid,Err)
  497. CALL CMISSEquationsSet_Initialise(EquationsSetSolid,Err)
  498. CALL CMISSEquationsSet_CreateStart(EquationSetUserNumberSolid,Region,FibreFieldSolid,CMISS_EQUATIONS_SET_ELASTICITY_CLASS, &
  499. & CMISS_EQUATIONS_SET_FINITE_ELASTICITY_TYPE,CMISS_EQUATIONS_SET_INCOMPRESS_ELASTICITY_DRIVEN_DARCY_SUBTYPE, &
  500. & EquationsSetFieldUserNumberSolid,EquationsSetFieldSolid,EquationsSetSolid,Err)
  501. CALL CMISSEquationsSet_CreateFinish(EquationsSetSolid,Err)
  502. !
  503. !================================================================================================================================
  504. !
  505. !DEPENDENT FIELDS
  506. !Create a dependent field with four variables (U, DelUDelN = solid, V, DelVDelN = Darcy) and four components
  507. !Solid: The U, DelUDelN variables have 4 components (3 displacement, 1 pressure)
  508. CALL CMISSField_Initialise(DependentField,Err)
  509. CALL CMISSField_CreateStart(FieldDependentUserNumber,Region,DependentField,Err)
  510. CALL CMISSField_TypeSet(DependentField,CMISS_FIELD_GENERAL_TYPE,Err)
  511. CALL CMISSField_MeshDecompositionSet(DependentField,Decomposition,Err)
  512. CALL CMISSField_GeometricFieldSet(DependentField,GeometricFieldSolid,Err)
  513. CALL CMISSField_DependentTypeSet(DependentField,CMISS_FIELD_DEPENDENT_TYPE,Err)
  514. CALL CMISSField_NumberOfVariablesSet(DependentField,FieldDependentNumberOfVariables,Err)
  515. CALL CMISSField_VariableTypesSet(DependentField,(/CMISS_FIELD_U_VARIABLE_TYPE, &
  516. & CMISS_FIELD_DELUDELN_VARIABLE_TYPE,CMISS_FIELD_V_VARIABLE_TYPE,CMISS_FIELD_DELVDELN_VARIABLE_TYPE/),Err)
  517. CALL CMISSField_NumberOfComponentsSet(DependentField,CMISS_FIELD_U_VARIABLE_TYPE,FieldDependentSolidNumberOfComponents,Err)
  518. CALL CMISSField_NumberOfComponentsSet(DependentField,CMISS_FIELD_DELUDELN_VARIABLE_TYPE,FieldDependentSolidNumberOfComponents,Err)
  519. CALL CMISSField_NumberOfComponentsSet(DependentField,CMISS_FIELD_V_VARIABLE_TYPE,FieldDependentFluidNumberOfComponents,Err)
  520. CALL CMISSField_NumberOfComponentsSet(DependentField,CMISS_FIELD_DELVDELN_VARIABLE_TYPE,FieldDependentFluidNumberOfComponents,Err)
  521. CALL CMISSField_ComponentMeshComponentSet(DependentField,CMISS_FIELD_U_VARIABLE_TYPE,1,QuadraticMeshComponentNumber,Err)
  522. CALL CMISSField_ComponentMeshComponentSet(DependentField,CMISS_FIELD_U_VARIABLE_TYPE,2,QuadraticMeshComponentNumber,Err)
  523. CALL CMISSField_ComponentMeshComponentSet(DependentField,CMISS_FIELD_U_VARIABLE_TYPE,3,QuadraticMeshComponentNumber,Err)
  524. CALL CMISSField_ComponentMeshComponentSet(DependentField,CMISS_FIELD_U_VARIABLE_TYPE,4,LinearMeshComponentNumber,Err)
  525. CALL CMISSField_ComponentMeshComponentSet(DependentField,CMISS_FIELD_DELUDELN_VARIABLE_TYPE,1,QuadraticMeshComponentNumber,Err)
  526. CALL CMISSField_ComponentMeshComponentSet(DependentField,CMISS_FIELD_DELUDELN_VARIABLE_TYPE,2,QuadraticMeshComponentNumber,Err)
  527. CALL CMISSField_ComponentMeshComponentSet(DependentField,CMISS_FIELD_DELUDELN_VARIABLE_TYPE,3,QuadraticMeshComponentNumber,Err)
  528. CALL CMISSField_ComponentMeshComponentSet(DependentField,CMISS_FIELD_DELUDELN_VARIABLE_TYPE,4,LinearMeshComponentNumber,Err)
  529. !Darcy: The V, DelVDelN variables have 4 components (3 velocities, 1 mass increase)
  530. CALL CMISSField_ComponentMeshComponentSet(DependentField,CMISS_FIELD_V_VARIABLE_TYPE,1,DarcyVelMeshComponentNumber,Err)
  531. CALL CMISSField_ComponentMeshComponentSet(DependentField,CMISS_FIELD_V_VARIABLE_TYPE,2,DarcyVelMeshComponentNumber,Err)
  532. CALL CMISSField_ComponentMeshComponentSet(DependentField,CMISS_FIELD_V_VARIABLE_TYPE,3,DarcyVelMeshComponentNumber,Err)
  533. CALL CMISSField_ComponentMeshComponentSet(DependentField,CMISS_FIELD_V_VARIABLE_TYPE,4,DarcyMassIncreaseMeshComponentNumber,Err)
  534. CALL CMISSField_ComponentMeshComponentSet(DependentField,CMISS_FIELD_DELVDELN_VARIABLE_TYPE,1,DarcyVelMeshComponentNumber,Err)
  535. CALL CMISSField_ComponentMeshComponentSet(DependentField,CMISS_FIELD_DELVDELN_VARIABLE_TYPE,2,DarcyVelMeshComponentNumber,Err)
  536. CALL CMISSField_ComponentMeshComponentSet(DependentField,CMISS_FIELD_DELVDELN_VARIABLE_TYPE,3,DarcyVelMeshComponentNumber,Err)
  537. CALL CMISSField_ComponentMeshComponentSet(DependentField,CMISS_FIELD_DELVDELN_VARIABLE_TYPE,4, &
  538. & DarcyMassIncreaseMeshComponentNumber,Err)
  539. CALL CMISSField_ScalingTypeSet(DependentField,CMISS_FIELD_UNIT_SCALING,Err)
  540. CALL CMISSField_CreateFinish(DependentField,Err)
  541. !
  542. !================================================================================================================================
  543. !
  544. CALL CMISSEquationsSet_DependentCreateStart(EquationsSetSolid,FieldDependentUserNumber,DependentField,Err)
  545. CALL CMISSEquationsSet_DependentCreateFinish(EquationsSetSolid,Err)
  546. CALL CMISSEquationsSet_MaterialsCreateStart(EquationsSetSolid,FieldMaterialUserNumber,MaterialFieldSolid,Err)
  547. CALL CMISSEquationsSet_MaterialsCreateFinish(EquationsSetSolid,Err)
  548. !
  549. !================================================================================================================================
  550. !
  551. CALL CMISSEquationsSet_DependentCreateStart(EquationsSetDarcy,FieldDependentUserNumber,DependentField,Err)
  552. CALL CMISSEquationsSet_DependentCreateFinish(EquationsSetDarcy,Err)
  553. DO COMPONENT_NUMBER=1,FieldDependentFluidNumberOfComponents
  554. CALL CMISSField_ComponentValuesInitialise(DependentField,CMISS_FIELD_V_VARIABLE_TYPE,CMISS_FIELD_VALUES_SET_TYPE, &
  555. & COMPONENT_NUMBER,INITIAL_FIELD_DARCY(COMPONENT_NUMBER),Err)
  556. ENDDO
  557. !
  558. !================================================================================================================================
  559. !
  560. !INDEPENDENT FIELD Darcy for storing BC flags
  561. CALL CMISSField_Initialise(IndependentFieldDarcy,Err)
  562. CALL CMISSEquationsSet_IndependentCreateStart(EquationsSetDarcy,IndependentFieldDarcyUserNumber, &
  563. & IndependentFieldDarcy,Err)
  564. CALL CMISSField_ComponentMeshComponentSet(IndependentFieldDarcy,CMISS_FIELD_U_VARIABLE_TYPE,1,DarcyVelMeshComponentNumber,Err)
  565. CALL CMISSField_ComponentMeshComponentSet(IndependentFieldDarcy,CMISS_FIELD_U_VARIABLE_TYPE,2,DarcyVelMeshComponentNumber,Err)
  566. CALL CMISSField_ComponentMeshComponentSet(IndependentFieldDarcy,CMISS_FIELD_U_VARIABLE_TYPE,3,DarcyVelMeshComponentNumber,Err)
  567. ! CALL CMISSField_ComponentMeshComponentSet(IndependentFieldDarcy,CMISS_FIELD_U_VARIABLE_TYPE,4,DarcyMassIncreaseMeshComponentNumber,Err)
  568. CALL CMISSEquationsSet_IndependentCreateFinish(EquationsSetDarcy,Err)
  569. CALL CMISSField_ComponentValuesInitialise(IndependentFieldDarcy,CMISS_FIELD_U_VARIABLE_TYPE,CMISS_FIELD_VALUES_SET_TYPE,1, &
  570. & 0.0_CMISSDP,Err)
  571. CALL CMISSField_ComponentValuesInitialise(IndependentFieldDarcy,CMISS_FIELD_U_VARIABLE_TYPE,CMISS_FIELD_VALUES_SET_TYPE,2, &
  572. & 0.0_CMISSDP,Err)
  573. CALL CMISSField_ComponentValuesInitialise(IndependentFieldDarcy,CMISS_FIELD_U_VARIABLE_TYPE,CMISS_FIELD_VALUES_SET_TYPE,3, &
  574. & 0.0_CMISSDP,Err)
  575. !
  576. !================================================================================================================================
  577. !
  578. !Create the equations set materials field variables for ALE Darcy
  579. CALL CMISSField_Initialise(MaterialsFieldDarcy,Err)
  580. CALL CMISSEquationsSet_MaterialsCreateStart(EquationsSetDarcy,MaterialsFieldUserNumberDarcy, &
  581. & MaterialsFieldDarcy,Err)
  582. CALL CMISSEquationsSet_MaterialsCreateFinish(EquationsSetDarcy,Err)
  583. CALL CMISSField_ComponentValuesInitialise(MaterialsFieldDarcy,CMISS_FIELD_U_VARIABLE_TYPE,CMISS_FIELD_VALUES_SET_TYPE, &
  584. & 1,POROSITY_PARAM_DARCY,Err)
  585. CALL CMISSField_ComponentValuesInitialise(MaterialsFieldDarcy,CMISS_FIELD_U_VARIABLE_TYPE,CMISS_FIELD_VALUES_SET_TYPE, &
  586. & 2,PERM_OVER_VIS_PARAM_DARCY,Err)
  587. CALL CMISSField_ComponentValuesInitialise(MaterialsFieldDarcy,CMISS_FIELD_U_VARIABLE_TYPE,CMISS_FIELD_VALUES_SET_TYPE, &
  588. & 3,0.0_CMISSDP,Err)
  589. CALL CMISSField_ComponentValuesInitialise(MaterialsFieldDarcy,CMISS_FIELD_U_VARIABLE_TYPE,CMISS_FIELD_VALUES_SET_TYPE, &
  590. & 4,0.0_CMISSDP,Err)
  591. CALL CMISSField_ComponentValuesInitialise(MaterialsFieldDarcy,CMISS_FIELD_U_VARIABLE_TYPE,CMISS_FIELD_VALUES_SET_TYPE, &
  592. & 5,PERM_OVER_VIS_PARAM_DARCY,Err)
  593. CALL CMISSField_ComponentValuesInitialise(MaterialsFieldDarcy,CMISS_FIELD_U_VARIABLE_TYPE,CMISS_FIELD_VALUES_SET_TYPE, &
  594. & 6,0.0_CMISSDP,Err)
  595. CALL CMISSField_ComponentValuesInitialise(MaterialsFieldDarcy,CMISS_FIELD_U_VARIABLE_TYPE,CMISS_FIELD_VALUES_SET_TYPE, &
  596. & 7,PERM_OVER_VIS_PARAM_DARCY,Err)
  597. !
  598. !================================================================================================================================
  599. !
  600. !Source field
  601. CALL CMISSField_Initialise(SourceFieldDarcy,Err)
  602. CALL CMISSEquationsSet_SourceCreateStart(EquationsSetDarcy,SourceFieldDarcyUserNumber,SourceFieldDarcy,Err)
  603. CALL CMISSEquationsSet_SourceCreateFinish(EquationsSetDarcy,Err)
  604. ! ELEMENT_NUMBER = 5
  605. ! COMPONENT_NUMBER = 4
  606. ! VALUE = 4.2_CMISSDP
  607. ! ! CALL CMISSField_ParameterSetUpdateElement(RegionUserNumber,SourceFieldDarcyUserNumber,CMISS_FIELD_U_VARIABLE_TYPE,CMISS_FIELD_VALUES_SET_TYPE, &
  608. ! ! & ELEMENT_NUMBER,COMPONENT_NUMBER,VALUE,Err)
  609. !
  610. ! NUMBER_USER_ELEMENT_NODES = 27 !hardcoding is bad - but how to access the number of element nodes ?
  611. ! !- there is no CMISS library call available for this
  612. ! !- traversing the structure of 'CMISSMeshElementsType' does not work either,
  613. ! ! since certain members are private
  614. !
  615. ! allocate( ElementUserNodes(NUMBER_USER_ELEMENT_NODES) )
  616. !
  617. ! CALL CMISSMeshElements_NodesGet(RegionUserNumber,MeshUserNumber,QuadraticMeshComponentNumber,ELEMENT_NUMBER, &
  618. ! & ElementUserNodes,Err)
  619. !
  620. ! DO NN=1,NUMBER_USER_ELEMENT_NODES
  621. ! NODE_NUMBER = ElementUserNodes(NN)
  622. ! CALL CMISSField_ParameterSetUpdateNode(SourceFieldDarcy,CMISS_FIELD_U_VARIABLE_TYPE,CMISS_FIELD_VALUES_SET_TYPE, &
  623. ! & 1,NODE_NUMBER,COMPONENT_NUMBER,VALUE,Err)
  624. ! ENDDO
  625. !
  626. !================================================================================================================================
  627. !
  628. !EQUATIONS SET EQUATIONS
  629. !Darcy
  630. CALL CMISSEquations_Initialise(EquationsDarcy,Err)
  631. CALL CMISSEquationsSet_EquationsCreateStart(EquationsSetDarcy,EquationsDarcy,Err)
  632. CALL CMISSEquations_SparsityTypeSet(EquationsDarcy,CMISS_EQUATIONS_SPARSE_MATRICES,Err)
  633. CALL CMISSEquations_OutputTypeSet(EquationsDarcy,EQUATIONS_DARCY_OUTPUT,Err)
  634. CALL CMISSEquationsSet_EquationsCreateFinish(EquationsSetDarcy,Err)
  635. !Solid
  636. CALL CMISSEquations_Initialise(Equations,Err)
  637. CALL CMISSEquationsSet_EquationsCreateStart(EquationsSetSolid,Equations,Err)
  638. CALL CMISSEquations_SparsityTypeSet(Equations,CMISS_EQUATIONS_SPARSE_MATRICES,Err)
  639. CALL CMISSEquations_OutputTypeSet(Equations,CMISS_EQUATIONS_NO_OUTPUT,Err)
  640. CALL CMISSEquationsSet_EquationsCreateFinish(EquationsSetSolid,Err)
  641. !
  642. !================================================================================================================================
  643. !
  644. !Initialise dependent field from undeformed geometry and displacement bcs and set hydrostatic pressure
  645. CALL CMISSField_ParametersToFieldParametersComponentCopy(GeometricFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE, &
  646. & CMISS_FIELD_VALUES_SET_TYPE, &
  647. & 1,DependentField,CMISS_FIELD_U_VARIABLE_TYPE,CMISS_FIELD_VALUES_SET_TYPE,1,Err)
  648. CALL CMISSField_ParametersToFieldParametersComponentCopy(GeometricFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE, &
  649. & CMISS_FIELD_VALUES_SET_TYPE, &
  650. & 2,DependentField,CMISS_FIELD_U_VARIABLE_TYPE,CMISS_FIELD_VALUES_SET_TYPE,2,Err)
  651. CALL CMISSField_ParametersToFieldParametersComponentCopy(GeometricFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE, &
  652. & CMISS_FIELD_VALUES_SET_TYPE, &
  653. & 3,DependentField,CMISS_FIELD_U_VARIABLE_TYPE,CMISS_FIELD_VALUES_SET_TYPE,3,Err)
  654. ! CALL CMISSField_ComponentValuesInitialise(DependentField,CMISS_FIELD_U_VARIABLE_TYPE,CMISS_FIELD_VALUES_SET_TYPE,4,-14.0_CMISSDP,Err)
  655. CALL CMISSField_ComponentValuesInitialise(DependentField,CMISS_FIELD_U_VARIABLE_TYPE,CMISS_FIELD_VALUES_SET_TYPE,4,0.0_CMISSDP, &
  656. & Err)
  657. !
  658. !================================================================================================================================
  659. !
  660. !Define the problem
  661. CALL CMISSProblem_Initialise(Problem,Err)
  662. CALL CMISSProblem_CreateStart(ProblemUserNumber,Problem,Err)
  663. CALL CMISSProblem_SpecificationSet(Problem,CMISS_PROBLEM_MULTI_PHYSICS_CLASS,CMISS_PROBLEM_FINITE_ELASTICITY_DARCY_TYPE, &
  664. & CMISS_PROBLEM_QUASISTATIC_ELASTICITY_TRANSIENT_DARCY_SUBTYPE,Err)
  665. CALL CMISSProblem_CreateFinish(Problem,Err)
  666. !
  667. !================================================================================================================================
  668. !
  669. !Create the problem control loop
  670. CALL CMISSProblem_ControlLoopCreateStart(Problem,Err)
  671. CALL CMISSControlLoop_Initialise(ControlLoop,Err)
  672. CALL CMISSProblem_ControlLoopGet(Problem,CMISS_CONTROL_LOOP_NODE,ControlLoop,Err)
  673. ! CALL CMISSControlLoop_MaximumIterationsSet(ControlLoop,1,Err) ! this one sets the increment loop counter
  674. CALL CMISSControlLoop_TimesSet(ControlLoop,DYNAMIC_SOLVER_DARCY_START_TIME,DYNAMIC_SOLVER_DARCY_STOP_TIME, &
  675. & DYNAMIC_SOLVER_DARCY_TIME_INCREMENT,Err)
  676. CALL CMISSControlLoop_TimeOutputSet(ControlLoop,DYNAMIC_SOLVER_DARCY_OUTPUT_FREQUENCY,Err)
  677. ! CALL CMISSControlLoop_OutputTypeSet(ControlLoop,CMISS_CONTROL_LOOP_PROGRESS_OUTPUT,Err)
  678. CALL CMISSProblem_ControlLoopCreateFinish(Problem,Err)
  679. !
  680. !================================================================================================================================
  681. !
  682. !Create the problem solvers
  683. CALL CMISSSolver_Initialise(SolverSolid,Err)
  684. CALL CMISSSolver_Initialise(LinearSolverSolid,Err)
  685. CALL CMISSSolver_Initialise(DynamicSolverDarcy,Err)
  686. CALL CMISSSolver_Initialise(LinearSolverDarcy,Err)
  687. CALL CMISSProblem_SolversCreateStart(Problem,Err)
  688. ! Solid
  689. CALL CMISSProblem_SolverGet(Problem,(/ControlLoopSubiterationNumber,ControlLoopSolidNumber,CMISS_CONTROL_LOOP_NODE/), &
  690. & SolverSolidIndex,SolverSolid,Err)
  691. CALL CMISSSolver_OutputTypeSet(SolverSolid,CMISS_SOLVER_PROGRESS_OUTPUT,Err)
  692. ! CALL CMISSSolver_NewtonJacobianCalculationTypeSet(SolverSolid,CMISS_SOLVER_NEWTON_JACOBIAN_FD_CALCULATED,Err)
  693. CALL CMISSSolver_NewtonJacobianCalculationTypeSet(SolverSolid,CMISS_SOLVER_NEWTON_JACOBIAN_EQUATIONS_CALCULATED,Err)
  694. ! CALL CMISSSolverNonLinearTypeSet(SolverSolid,CMISS_SOLVER_NONLINEAR_NEWTON,Err)
  695. ! CALL CMISSSolver_LibraryTypeSet(SolverSolid,CMISS_SOLVER_PETSC_LIBRARY,Err)
  696. CALL CMISSSolver_NewtonAbsoluteToleranceSet(SolverSolid,ABSOLUTE_TOLERANCE,Err)
  697. CALL CMISSSolver_NewtonRelativeToleranceSet(SolverSolid,RELATIVE_TOLERANCE,Err)
  698. CALL CMISSSolver_NewtonMaximumIterationsSet(SolverSolid,MAXIMUM_ITERATIONS,Err)
  699. CALL CMISSSolver_NewtonLinearSolverGet(SolverSolid,LinearSolverSolid,Err)
  700. CALL CMISSSolver_LinearTypeSet(LinearSolverSolid,CMISS_SOLVER_LINEAR_DIRECT_SOLVE_TYPE,Err)
  701. !Darcy
  702. CALL CMISSProblem_SolverGet(Problem,(/ControlLoopSubiterationNumber,ControlLoopFluidNumber,CMISS_CONTROL_LOOP_NODE/), &
  703. & SolverDarcyIndex,DynamicSolverDarcy,Err)
  704. CALL CMISSSolver_OutputTypeSet(DynamicSolverDarcy,DYNAMIC_SOLVER_DARCY_OUTPUT_TYPE,Err)
  705. CALL CMISSSolver_DynamicThetaSet(DynamicSolverDarcy,DYNAMIC_SOLVER_DARCY_THETA,Err)
  706. ! CALL CMISSSolverDynamicDynamicSet(DynamicSolverDarcy,.TRUE.,Err)
  707. CALL CMISSSolver_DynamicLinearSolverGet(DynamicSolverDarcy,LinearSolverDarcy,Err)
  708. IF(LINEAR_SOLVER_DARCY_DIRECT_FLAG) THEN
  709. CALL CMISSSolver_LinearTypeSet(LinearSolverDarcy,CMISS_SOLVER_LINEAR_DIRECT_SOLVE_TYPE,Err)
  710. CALL CMISSSolver_LibraryTypeSet(LinearSolverDarcy,CMISS_SOLVER_MUMPS_LIBRARY,Err)
  711. ELSE
  712. CALL CMISSSolver_LinearTypeSet(LinearSolverDarcy,CMISS_SOLVER_LINEAR_ITERATIVE_SOLVE_TYPE,Err)
  713. CALL CMISSSolver_LinearIterativeMaximumIterationsSet(LinearSolverDarcy,MAXIMUM_ITERATIONS,Err)
  714. CALL CMISSSolver_LinearIterativeDivergenceToleranceSet(LinearSolverDarcy,DIVERGENCE_TOLERANCE,Err)
  715. CALL CMISSSolver_LinearIterativeRelativeToleranceSet(LinearSolverDarcy,RELATIVE_TOLERANCE,Err)
  716. CALL CMISSSolver_LinearIterativeAbsoluteToleranceSet(LinearSolverDarcy,ABSOLUTE_TOLERANCE,Err)
  717. CALL CMISSSolver_LinearIterativeGMRESRestartSet(LinearSolverDarcy,RESTART_VALUE,Err)
  718. ENDIF
  719. CALL CMISSProblem_SolversCreateFinish(Problem,Err)
  720. !
  721. !================================================================================================================================
  722. !
  723. !Create the problem solver equations
  724. CALL CMISSSolver_Initialise(SolverSolid,Err)
  725. CALL CMISSSolver_Initialise(LinearSolverDarcy,Err)
  726. CALL CMISSSolverEquations_Initialise(SolverEquationsSolid,Err)
  727. CALL CMISSSolverEquations_Initialise(SolverEquationsDarcy,Err)
  728. CALL CMISSProblem_SolverEquationsCreateStart(Problem,Err)
  729. !
  730. !Get the finite elasticity solver equations
  731. CALL CMISSProblem_SolverGet(Problem,(/ControlLoopSubiterationNumber,ControlLoopSolidNumber,CMISS_CONTROL_LOOP_NODE/), &
  732. & SolverSolidIndex,SolverSolid,Err)
  733. CALL CMISSSolver_SolverEquationsGet(SolverSolid,SolverEquationsSolid,Err)
  734. CALL CMISSSolverEquations_SparsityTypeSet(SolverEquationsSolid,CMISS_SOLVER_SPARSE_MATRICES,Err)
  735. CALL CMISSSolverEquations_EquationsSetAdd(SolverEquationsSolid,EquationsSetSolid,EquationsSetIndex,Err)
  736. !
  737. !Get the Darcy solver equations
  738. CALL CMISSProblem_SolverGet(Problem,(/ControlLoopSubiterationNumber,ControlLoopFluidNumber,CMISS_CONTROL_LOOP_NODE/), &
  739. & SolverDarcyIndex,LinearSolverDarcy,Err)
  740. CALL CMISSSolver_SolverEquationsGet(LinearSolverDarcy,SolverEquationsDarcy,Err)
  741. CALL CMISSSolverEquations_SparsityTypeSet(SolverEquationsDarcy,CMISS_SOLVER_SPARSE_MATRICES,Err)
  742. CALL CMISSSolverEquations_EquationsSetAdd(SolverEquationsDarcy,EquationsSetDarcy,EquationsSetIndex,Err)
  743. !
  744. CALL CMISSProblem_SolverEquationsCreateFinish(Problem,Err)
  745. !
  746. !================================================================================================================================
  747. !
  748. !Prescribe boundary conditions (absolute nodal parameters)
  749. CALL CMISSBoundaryConditions_Initialise(BoundaryConditions,Err)
  750. CALL CMISSSolverEquations_BoundaryConditionsCreateStart(SolverEquationsSolid,BoundaryConditions,Err)
  751. !Grab the list of nodes on inner, outer and top surfaces
  752. CALL CMISSGeneratedMesh_SurfaceGet(GeneratedMesh,CMISS_GENERATED_MESH_ELLIPSOID_TOP_SURFACE,TopSurfaceNodes,TopNormalXi,Err)
  753. CALL CMISSGeneratedMesh_SurfaceGet(GeneratedMesh,CMISS_GENERATED_MESH_ELLIPSOID_INNER_SURFACE,InnerSurfaceNodes,InnerNormalXi,Err)
  754. CALL CMISSGeneratedMesh_SurfaceGet(GeneratedMesh,CMISS_GENERATED_MESH_ELLIPSOID_OUTER_SURFACE,OuterSurfaceNodes,OuterNormalXi,Err)
  755. write(*,*)'TopSurfaceNodes = ',TopSurfaceNodes
  756. ! ASSIGN BOUNDARY CONDITIONS
  757. !Fix base of the ellipsoid in z direction
  758. DO NN=1,SIZE(TopSurfaceNodes,1)
  759. NODE=TopSurfaceNodes(NN)
  760. CALL CMISSDecomposition_NodeDomainGet(Decomposition,NODE,1,NodeDomain,Err)
  761. IF(NodeDomain==ComputationalNodeNumber) THEN
  762. CALL CMISSField_ParameterSetGetNode(GeometricFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,CMISS_FIELD_VALUES_SET_TYPE,1,1,NODE,3, &
  763. & ZCoord,Err)
  764. CALL CMISSBoundaryConditions_SetNode(BoundaryConditions,DependentField,CMISS_FIELD_U_VARIABLE_TYPE,1,1,NODE,3, &
  765. & CMISS_BOUNDARY_CONDITION_FIXED,ZCoord,Err)
  766. ENDIF
  767. ENDDO
  768. !Apply inner surface pressure
  769. !NOTE: Surface pressure goes into pressure_values_set_type of the DELUDELN type
  770. DO NN=1,SIZE(InnerSurfaceNodes,1)
  771. NODE=InnerSurfaceNodes(NN)
  772. CALL CMISSDecomposition_NodeDomainGet(Decomposition,NODE,1,NodeDomain,Err)
  773. IF(NodeDomain==ComputationalNodeNumber) THEN
  774. CALL CMISSBoundaryConditions_SetNode(BoundaryConditions,DependentField,CMISS_FIELD_DELUDELN_VARIABLE_TYPE,1,1,NODE, &
  775. & ABS(InnerNormalXi),CMISS_BOUNDARY_CONDITION_PRESSURE,INNER_PRESSURE,Err)
  776. ENDIF
  777. ENDDO
  778. !Apply outer surface pressure
  779. DO NN=1,SIZE(OuterSurfaceNodes,1)
  780. NODE=OuterSurfaceNodes(NN)
  781. CALL CMISSDecomposition_NodeDomainGet(Decomposition,NODE,1,NodeDomain,Err)
  782. IF(NodeDomain==ComputationalNodeNumber) THEN
  783. CALL CMISSBoundaryConditions_SetNode(BoundaryConditions,DependentField,CMISS_FIELD_DELUDELN_VARIABLE_TYPE,1,1,NODE, &
  784. & ABS(OuterNormalXi),CMISS_BOUNDARY_CONDITION_PRESSURE,OUTER_PRESSURE,Err)
  785. ENDIF
  786. ENDDO
  787. !Fix more nodes at the base to stop free body motion
  788. X_FIXED=.FALSE.
  789. Y_FIXED=.FALSE.
  790. DO NN=1,SIZE(TopSurfaceNodes,1)
  791. NODE=TopSurfaceNodes(NN)
  792. CALL CMISSDecomposition_NodeDomainGet(Decomposition,NODE,1,NodeDomain,Err)
  793. IF(NodeDomain==ComputationalNodeNumber) THEN
  794. CALL CMISSField_ParameterSetGetNode(GeometricFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,CMISS_FIELD_VALUES_SET_TYPE,1,1,NODE,1, &
  795. & XCoord,Err)
  796. CALL CMISSField_ParameterSetGetNode(GeometricFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,CMISS_FIELD_VALUES_SET_TYPE,1,1,NODE,2, &
  797. & YCoord,Err)
  798. IF(ABS(XCoord)<1.0E-6_CMISSDP) THEN
  799. CALL CMISSBoundaryConditions_SetNode(BoundaryConditions,DependentField,CMISS_FIELD_U_VARIABLE_TYPE,1,1,NODE,1, &
  800. & CMISS_BOUNDARY_CONDITION_FIXED,XCoord,Err)
  801. WRITE(*,*) "FIXING NODE",NODE,"IN X DIRECTION"
  802. X_FIXED=.TRUE.
  803. ENDIF
  804. IF(ABS(YCoord)<1.0E-6_CMISSDP) THEN
  805. CALL CMISSBoundaryConditions_SetNode(BoundaryConditions,DependentField,CMISS_FIELD_U_VARIABLE_TYPE,1,1,NODE,2, &
  806. & CMISS_BOUNDARY_CONDITION_FIXED,YCoord,Err)
  807. WRITE(*,*) "FIXING NODE",NODE,"IN Y DIRECTION"
  808. Y_FIXED=.TRUE.
  809. ENDIF
  810. ENDIF
  811. ENDDO
  812. CALL MPI_REDUCE(X_FIXED,X_OKAY,1,MPI_LOGICAL,MPI_LOR,0,MPI_COMM_WORLD,MPI_IERROR)
  813. CALL MPI_REDUCE(Y_FIXED,Y_OKAY,1,MPI_LOGICAL,MPI_LOR,0,MPI_COMM_WORLD,MPI_IERROR)
  814. IF(ComputationalNodeNumber==0) THEN
  815. IF(.NOT.(X_OKAY.AND.Y_OKAY)) THEN
  816. WRITE(*,*) "Free body motion could not be prevented!"
  817. CALL CMISSFinalise(Err)
  818. STOP
  819. ENDIF
  820. ENDIF
  821. CALL CMISSSolverEquations_BoundaryConditionsCreateFinish(SolverEquationsSolid,Err)
  822. !
  823. !================================================================================================================================
  824. !
  825. !BCs Darcy
  826. CALL CMISSBoundaryConditions_Initialise(BoundaryConditionsDarcy,Err)
  827. CALL CMISSSolverEquations_BoundaryConditionsCreateStart(SolverEquationsDarcy,BoundaryConditionsDarcy,Err)
  828. !In 'generated_mesh_routines.f90/GENERATED_MESH_ELLIPSOID_SURFACE_GET' there is a bug:
  829. ! BASIS=>ELLIPSOID_MESH%BASES(MESH_COMPONENT)%PTR does not account for the fact that:
  830. ! in 'generated_mesh_routines.f90/GENERATED_MESH_ELLIPSOID_CREATE_FINISH' the following is done:
  831. ! CALL MESH_NUMBER_OF_COMPONENTS_SET(GENERATED_MESH%MESH,SIZE(ELLIPSOID_MESH%BASES)/2,ERR,ERROR,*999)
  832. !Temporary work around, until bug fix:
  833. !MeshComponentNumber_dummy = DarcyVelMeshComponentNumber
  834. MeshComponentNumber_dummy = 3
  835. ! I N N E R S U R F A C E
  836. CALL CMISSGeneratedMesh_SurfaceGet(GeneratedMesh,MeshComponentNumber_dummy,CMISS_GENERATED_MESH_ELLIPSOID_INNER_SURFACE, &
  837. & InnerSurfaceNodesDarcyVel,InnerNormalXi,Err)
  838. write(*,*)'InnerSurfaceNodesDarcyVel = ',InnerSurfaceNodesDarcyVel
  839. write(*,*)'InnerNormalXi = ',InnerNormalXi
  840. !Set all inner surface nodes impermeable
  841. !MIND: CMISS_FIELD_DELVDELN_VARIABLE_TYPE -> RHS invoked in DARCY_EQUATION_FINITE_ELEMENT_CALCULATE
  842. ! CMISS_BOUNDARY_CONDITION_IMPERMEABLE_WALL
  843. DO NN=1,SIZE(InnerSurfaceNodesDarcyVel,1)
  844. ! VALUE = 0.0_CMISSDP
  845. ! COMPONENT_NUMBER = 1
  846. ! CALL CMISSBoundaryConditions_SetNode(BoundaryConditionsDarcy,DependentField,CMISS_FIELD_DELVDELN_VARIABLE_TYPE,1,InnerSurfaceNodesDarcyVel(NN), &
  847. ! & COMPONENT_NUMBER,CMISS_BOUNDARY_CONDITION_IMPERMEABLE_WALL,VALUE,Err)
  848. ! IF(Err/=0) WRITE(*,*) "ERROR WHILE ASSIGNING INNER DARCY BC TO NODE", InnerSurfaceNodesDarcyVel(NN)
  849. !
  850. ! VALUE = 0.0_CMISSDP
  851. ! COMPONENT_NUMBER = 2PLACE_EQUATION_EQUATIONS_SET_FLUID_PRESSURE_SETUP
  852. ! CALL CMISSBoundaryConditions_SetNode(BoundaryConditionsDarcy,DependentField,CMISS_FIELD_DELVDELN_VARIABLE_TYPE,1,InnerSurfaceNodesDarcyVel(NN), &
  853. ! & COMPONENT_NUMBER,CMISS_BOUNDARY_CONDITION_IMPERMEABLE_WALL,VALUE,Err)
  854. ! IF(Err/=0) WRITE(*,*) "ERROR WHILE ASSIGNING INNER DARCY BC TO NODE", InnerSurfaceNodesDarcyVel(NN)
  855. !
  856. ! VALUE = 0.0_CMISSDP
  857. ! COMPONENT_NUMBER = 3
  858. ! CALL CMISSBoundaryConditions_SetNode(BoundaryConditionsDarcy,DependentField,CMISS_FIELD_DELVDELN_VARIABLE_TYPE,1,InnerSurfaceNodesDarcyVel(NN), &
  859. ! & COMPONENT_NUMBER,CMISS_BOUNDARY_CONDITION_IMPERMEABLE_WALL,VALUE,Err)
  860. ! IF(Err/=0) WRITE(*,*) "ERROR WHILE ASSIGNING INNER DARCY BC TO NODE", InnerSurfaceNodesDarcyVel(NN)
  861. ! VALUE = 1.0_CMISSDP
  862. ! COMPONENT_NUMBER = ABS(InnerNormalXi)
  863. ! CALL CMISSBoundaryConditions_SetNode(BoundaryConditionsDarcy,DependentField,CMISS_FIELD_DELVDELN_VARIABLE_TYPE,1,InnerSurfaceNodesDarcyVel(NN), &
  864. ! & COMPONENT_NUMBER,CMISS_BOUNDARY_CONDITION_IMPERMEABLE_WALL,VALUE,Err)
  865. ! IF(Err/=0) WRITE(*,*) "ERROR WHILE ASSIGNING INNER DARCY BC TO NODE", InnerSurfaceNodesDarcyVel(NN)
  866. NODE_NUMBER = InnerSurfaceNodesDarcyVel(NN)
  867. COMPONENT_NUMBER = ABS(InnerNormalXi)
  868. VALUE = 1.0_CMISSDP
  869. CALL CMISSField_ParameterSetUpdateNode(IndependentFieldDarcy,CMISS_FIELD_U_VARIABLE_TYPE,CMISS_FIELD_VALUES_SET_TYPE,1, &
  870. & CMISS_NO_GLOBAL_DERIV,NODE_NUMBER,COMPONENT_NUMBER,VALUE,Err)
  871. ENDDO
  872. ! O U T E R S U R F A C E
  873. CALL CMISSGeneratedMesh_SurfaceGet(GeneratedMesh,MeshComponentNumber_dummy,CMISS_GENERATED_MESH_ELLIPSOID_OUTER_SURFACE, &
  874. & OuterSurfaceNodesDarcyVel,OuterNormalXi,Err)
  875. write(*,*)'OuterSurfaceNodesDarcyVel = ',OuterSurfaceNodesDarcyVel
  876. write(*,*)'OuterNormalXi = ',OuterNormalXi
  877. !Set all outer surface nodes impermeable
  878. DO NN=1,SIZE(OuterSurfaceNodesDarcyVel,1)
  879. ! VALUE = 0.0_CMISSDP
  880. ! COMPONENT_NUMBER = 1
  881. ! CALL CMISSBoundaryConditions_SetNode(BoundaryConditionsDarcy,DependentField,CMISS_FIELD_DELVDELN_VARIABLE_TYPE,1,OuterSurfaceNodesDarcyVel(NN), &
  882. ! & COMPONENT_NUMBER,CMISS_BOUNDARY_CONDITION_IMPERMEABLE_WALL,VALUE,Err)
  883. ! IF(Err/=0) WRITE(*,*) "ERROR WHILE ASSIGNING OUTER DARCY BC TO NODE", OuterSurfaceNodesDarcyVel(NN)
  884. !
  885. ! VALUE = 0.0_CMISSDP
  886. ! COMPONENT_NUMBER = 2
  887. ! CALL CMISSBoundaryConditions_SetNode(BoundaryConditionsDarcy,DependentField,CMISS_FIELD_DELVDELN_VARIABLE_TYPE,1,OuterSurfaceNodesDarcyVel(NN), &
  888. ! & COMPONENT_NUMBER,CMISS_BOUNDARY_CONDITION_IMPERMEABLE_WALL,VALUE,Err)
  889. ! IF(Err/=0) WRITE(*,*) "ERROR WHILE ASSIGNING OUTER DARCY BC TO NODE", OuterSurfaceNodesDarcyVel(NN)
  890. !
  891. ! VALUE = 0.0_CMISSDP
  892. ! COMPONENT_NUMBER = 3
  893. ! CALL CMISSBoundaryConditions_SetNode(BoundaryConditionsDarcy,DependentField,CMISS_FIELD_DELVDELN_VARIABLE_TYPE,1,OuterSurfaceNodesDarcyVel(NN), &
  894. ! & COMPONENT_NUMBER,CMISS_BOUNDARY_CONDITION_IMPERMEABLE_WALL,VALUE,Err)
  895. ! IF(Err/=0) WRITE(*,*) "ERROR WHILE ASSIGNING OUTER DARCY BC TO NODE", OuterSurfaceNodesDarcyVel(NN)
  896. ! VALUE = 1.0_CMISSDP
  897. ! COMPONENT_NUMBER = ABS(OuterNormalXi)
  898. ! CALL CMISSBoundaryConditions_SetNode(BoundaryConditionsDarcy,DependentField,CMISS_FIELD_DELVDELN_VARIABLE_TYPE,1,OuterSurfaceNodesDarcyVel(NN), &
  899. ! & COMPONENT_NUMBER,CMISS_BOUNDARY_CONDITION_IMPERMEABLE_WALL,VALUE,Err)
  900. ! IF(Err/=0) WRITE(*,*) "ERROR WHILE ASSIGNING OUTER DARCY BC TO NODE", OuterSurfaceNodesDarcyVel(NN)
  901. NODE_NUMBER = OuterSurfaceNodesDarcyVel(NN)
  902. COMPONENT_NUMBER = ABS(OuterNormalXi)
  903. VALUE = 1.0_CMISSDP
  904. CALL CMISSField_ParameterSetUpdateNode(IndependentFieldDarcy,CMISS_FIELD_U_VARIABLE_TYPE,CMISS_FIELD_VALUES_SET_TYPE,1, &
  905. & CMISS_NO_GLOBAL_DERIV,NODE_NUMBER,COMPONENT_NUMBER,VALUE,Err)
  906. ENDDO
  907. ! T O P S U R F A C E
  908. CALL CMISSGeneratedMesh_SurfaceGet(GeneratedMesh,MeshComponentNumber_dummy,CMISS_GENERATED_MESH_ELLIPSOID_TOP_SURFACE, &
  909. & TopSurfaceNodesDarcyVel,TopNormalXi,Err)
  910. write(*,*)'TopSurfaceNodesDarcyVel = ',TopSurfaceNodesDarcyVel
  911. write(*,*)'TopNormalXi = ',TopNormalXi
  912. !Set all top surface nodes to Darcy inflow BC
  913. DO NN=1,SIZE(TopSurfaceNodesDarcyVel,1)
  914. VALUE = -1.0_CMISSDP
  915. COMPONENT_NUMBER = 3
  916. CALL CMISSBoundaryConditions_SetNode(BoundaryConditionsDarcy,DependentField,CMISS_FIELD_V_VARIABLE_TYPE,1,1, &
  917. & TopSurfaceNodesDarcyVel(NN),COMPONENT_NUMBER,CMISS_BOUNDARY_CONDITION_FIXED,VALUE,Err)
  918. IF(Err/=0) WRITE(*,*) "ERROR WHILE ASSIGNING TOP DARCY BC TO NODE", TopSurfaceNodesDarcyVel(NN)
  919. ENDDO
  920. CALL CMISSSolverEquations_BoundaryConditionsCreateFinish(SolverEquationsDarcy,Err)
  921. !
  922. !================================================================================================================================
  923. !
  924. !Solve problem
  925. WRITE(*,'(A)') "Solving problem..."
  926. CALL CMISSProblem_Solve(Problem,Err)
  927. WRITE(*,'(A)') "Problem solved!"
  928. !
  929. !================================================================================================================================
  930. !
  931. !Output solution
  932. CALL CMISSFields_Initialise(Fields,Err)
  933. CALL CMISSFields_Create(Region,Fields,Err)
  934. CALL CMISSFields_NodesExport(Fields,"QuadraticEllipsoidDrivenDarcy","FORTRAN",Err)
  935. CALL CMISSFields_ElementsExport(Fields,"QuadraticEllipsoidDrivenDarcy","FORTRAN",Err)
  936. CALL CMISSFields_Finalise(Fields,Err)
  937. !
  938. !================================================================================================================================
  939. !
  940. CALL CMISSFinalise(Err)
  941. WRITE(*,'(A)') "Program successfully completed."
  942. STOP
  943. END PROGRAM QUADRATICELLIPSOIDDRIVENDARCYEXAMPLE