PageRenderTime 69ms CodeModel.GetById 21ms RepoModel.GetById 0ms app.codeStats 1ms

/MultiPhysics/Poroelasticity/FiniteElasticityDarcy/QuadraticEllipsoidDrivenMultiCompDarcy/src/QuadraticEllipsoidDrivenMultiCompDarcyExample.f90

http://github.com/xyan075/examples
FORTRAN Modern | 1318 lines | 824 code | 154 blank | 340 comment | 0 complexity | 61ea8a05237d93b94245a785e439c9ef 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 QUADRATICELLIPSOIDDRIVENMULTICOMPDARCYEXAMPLE
  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=1 ! 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 :: FieldDependentSolidUserNumber=4
  113. INTEGER(CMISSIntg) :: FieldDependentSolidNumberOfVariables
  114. INTEGER(CMISSIntg), PARAMETER :: FieldDependentSolidNumberOfComponents=4
  115. INTEGER(CMISSIntg), PARAMETER :: FieldDependentFluidNumberOfComponents=4
  116. INTEGER(CMISSIntg), PARAMETER :: EquationSetSolidUserNumber=55
  117. INTEGER(CMISSIntg), PARAMETER :: EquationsSetFieldSolidUserNumber=25
  118. INTEGER(CMISSIntg), PARAMETER :: ProblemUserNumber=1
  119. INTEGER(CMISSIntg) :: EquationsSetFieldUserNumberDarcy
  120. INTEGER(CMISSIntg) :: icompartment,Ncompartments,num_var,componentnum,Nparams
  121. INTEGER(CMISSIntg) :: MaterialsFieldUserNumberDarcy
  122. INTEGER(CMISSIntg) :: EquationsSetUserNumberDarcy
  123. INTEGER(CMISSIntg), PARAMETER :: ControlLoopSolidNumber=1
  124. INTEGER(CMISSIntg), PARAMETER :: ControlLoopFluidNumber=2
  125. INTEGER(CMISSIntg), PARAMETER :: ControlLoopSubiterationNumber=1
  126. INTEGER(CMISSIntg), PARAMETER :: SolverSolidIndex=1
  127. INTEGER(CMISSIntg), PARAMETER :: SolverDarcyIndex=1
  128. INTEGER(CMISSIntg), PARAMETER :: MaterialsFieldUserNumberDarcyPorosity=1
  129. INTEGER(CMISSIntg), PARAMETER :: MaterialsFieldUserNumberDarcyPermOverVis=2
  130. INTEGER(CMISSIntg), PARAMETER :: SolidDisplMeshComponentNumber=1
  131. INTEGER(CMISSIntg), PARAMETER :: SolidLagrMultMeshComponentNumber=2
  132. INTEGER(CMISSIntg), PARAMETER :: SolidGeometryMeshComponentNumber=SolidDisplMeshComponentNumber
  133. !Program types
  134. !Program variables
  135. INTEGER(CMISSIntg) :: MPI_IERROR
  136. INTEGER(CMISSIntg) :: EquationsSetIndex
  137. INTEGER(CMISSIntg) :: NumberOfComputationalNodes,ComputationalNodeNumber
  138. REAL(CMISSDP) :: FibreFieldAngle(3)
  139. REAL(CMISSDP) :: nu,theta,omega,XI3,XI3delta,XI2delta, zero
  140. INTEGER(CMISSIntg) ::i,j,k,component_idx,node_idx,TOTAL_NUMBER_NODES_XI(3)
  141. !For grabbing surfaces
  142. INTEGER(CMISSIntg) :: InnerNormalXi,OuterNormalXi,TopNormalXi
  143. INTEGER(CMISSIntg), ALLOCATABLE :: InnerSurfaceNodes(:)
  144. INTEGER(CMISSIntg), ALLOCATABLE :: OuterSurfaceNodes(:)
  145. INTEGER(CMISSIntg), ALLOCATABLE :: TopSurfaceNodes(:)
  146. INTEGER(CMISSIntg), ALLOCATABLE :: TopSurfaceNodesDarcyVel(:)
  147. INTEGER(CMISSIntg), ALLOCATABLE :: InnerSurfaceNodesDarcyVel(:)
  148. INTEGER(CMISSIntg), ALLOCATABLE :: OuterSurfaceNodesDarcyVel(:)
  149. INTEGER(CMISSIntg) :: NN,NODE,NodeDomain
  150. REAL(CMISSDP) :: XCoord,YCoord,ZCoord
  151. LOGICAL :: X_FIXED,Y_FIXED,X_OKAY,Y_OKAY
  152. INTEGER(CMISSIntg) :: GeometricFieldDarcyMeshComponentNumber, DarcyVelMeshComponentNumber, DarcyMassIncreaseMeshComponentNumber
  153. INTEGER(CMISSIntg) :: MeshComponentNumber_dummy
  154. INTEGER(CMISSIntg) :: NUMBER_OF_DOMAINS
  155. INTEGER(CMISSIntg) :: NUMBER_OF_DIMENSIONS
  156. INTEGER(CMISSIntg) :: MAXIMUM_ITERATIONS
  157. INTEGER(CMISSIntg) :: RESTART_VALUE
  158. INTEGER(CMISSIntg) :: EQUATIONS_DARCY_OUTPUT
  159. INTEGER(CMISSIntg) :: COMPONENT_NUMBER
  160. INTEGER(CMISSIntg) :: CONDITION
  161. INTEGER(CMISSIntg) :: DYNAMIC_SOLVER_DARCY_OUTPUT_FREQUENCY
  162. INTEGER(CMISSIntg) :: DYNAMIC_SOLVER_DARCY_OUTPUT_TYPE
  163. INTEGER(CMISSIntg) :: LINEAR_SOLVER_DARCY_OUTPUT_TYPE
  164. REAL(CMISSDP) :: COORD_X, COORD_Y, COORD_Z
  165. REAL(CMISSDP) :: DOMAIN_X1, DOMAIN_X2, DOMAIN_Y1, DOMAIN_Y2, DOMAIN_Z1, DOMAIN_Z2
  166. REAL(CMISSDP) :: GEOMETRY_TOLERANCE
  167. INTEGER(CMISSIntg) :: EDGE_COUNT
  168. INTEGER(CMISSIntg) :: BASIS_XI_INTERPOLATION_SOLID
  169. REAL(CMISSDP) :: INITIAL_FIELD_DARCY(4)
  170. REAL(CMISSDP) :: DIVERGENCE_TOLERANCE
  171. REAL(CMISSDP) :: RELATIVE_TOLERANCE
  172. REAL(CMISSDP) :: ABSOLUTE_TOLERANCE
  173. REAL(CMISSDP) :: LINESEARCH_ALPHA
  174. REAL(CMISSDP) :: VALUE
  175. REAL(CMISSDP) :: POROSITY_PARAM_DARCY, PERM_OVER_VIS_PARAM_DARCY
  176. LOGICAL :: EXPORT_FIELD_IO
  177. LOGICAL :: LINEAR_SOLVER_DARCY_DIRECT_FLAG
  178. !CMISS variables
  179. TYPE(CMISSBasisType) :: QuadraticBasis,QuadraticCollapsedBasis,LinearBasis,LinearCollapsedBasis
  180. TYPE(CMISSBoundaryConditionsType) :: BoundaryConditions
  181. TYPE(CMISSCoordinateSystemType) :: CoordinateSystem, WorldCoordinateSystem
  182. TYPE(CMISSMeshType) :: Mesh
  183. TYPE(CMISSGeneratedMeshType) :: GeneratedMesh
  184. TYPE(CMISSDecompositionType) :: Decomposition
  185. TYPE(CMISSEquationsType) :: Equations
  186. TYPE(CMISSEquationsSetType) :: EquationsSetSolid
  187. TYPE(CMISSFieldType) :: GeometricFieldSolid,FibreFieldSolid,MaterialFieldSolid
  188. TYPE(CMISSFieldType) :: DependentFieldSolid,EquationsSetFieldSolid
  189. TYPE(CMISSFieldType) :: GeometricFieldDarcy
  190. TYPE(CMISSFieldType), ALLOCATABLE, DIMENSION(:) :: MaterialsFieldDarcy
  191. TYPE(CMISSFieldType), ALLOCATABLE, DIMENSION(:) :: EquationsSetFieldDarcy
  192. !Boundary conditions
  193. TYPE(CMISSBoundaryConditionsType) :: BoundaryConditionsDarcy
  194. !Equations sets
  195. TYPE(CMISSEquationsSetType), ALLOCATABLE, DIMENSION(:) :: EquationsSetDarcy
  196. !Equations
  197. TYPE(CMISSEquationsType), ALLOCATABLE, DIMENSION(:) :: EquationsDarcy
  198. TYPE(CMISSFieldsType) :: Fields
  199. TYPE(CMISSProblemType) :: Problem
  200. TYPE(CMISSRegionType) :: Region,WorldRegion
  201. TYPE(CMISSSolverType) :: SolverSolid,LinearSolverSolid
  202. TYPE(CMISSSolverEquationsType) :: SolverEquationsSolid
  203. TYPE(CMISSControlLoopType) :: ControlLoop
  204. !Solvers
  205. TYPE(CMISSSolverType) :: DynamicSolverDarcy
  206. TYPE(CMISSSolverType) :: LinearSolverDarcy
  207. !Solver equations
  208. TYPE(CMISSSolverEquationsType) :: SolverEquationsDarcy
  209. REAL(CMISSDP) :: DYNAMIC_SOLVER_DARCY_START_TIME
  210. REAL(CMISSDP) :: DYNAMIC_SOLVER_DARCY_STOP_TIME
  211. REAL(CMISSDP) :: DYNAMIC_SOLVER_DARCY_THETA
  212. REAL(CMISSDP) :: DYNAMIC_SOLVER_DARCY_TIME_INCREMENT
  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. INTEGER(CMISSIntg), ALLOCATABLE, DIMENSION(:) :: VariableTypes
  221. REAL(CMISSDP), ALLOCATABLE, DIMENSION(:,:) :: CouplingCoeffs,ConstitutiveParams
  222. #ifdef WIN32
  223. !Initialise QuickWin
  224. QUICKWIN_WINDOW_CONFIG%TITLE="General Output" !Window title
  225. QUICKWIN_WINDOW_CONFIG%NUMTEXTROWS=-1 !Max possible number of rows
  226. QUICKWIN_WINDOW_CONFIG%MODE=QWIN$SCROLLDOWN
  227. !Set the window parameters
  228. QUICKWIN_STATUS=SETWINDOWCONFIG(QUICKWIN_WINDOW_CONFIG)
  229. !If attempt fails set with system estimated values
  230. IF(.NOT.QUICKWIN_STATUS) QUICKWIN_STATUS=SETWINDOWCONFIG(QUICKWIN_WINDOW_CONFIG)
  231. #endif
  232. !Set initial values
  233. NUMBER_OF_DIMENSIONS=3_CMISSIntg
  234. INITIAL_FIELD_DARCY(1)=0.0_CMISSDP
  235. INITIAL_FIELD_DARCY(2)=0.0_CMISSDP
  236. INITIAL_FIELD_DARCY(3)=0.0_CMISSDP
  237. INITIAL_FIELD_DARCY(4)=0.0_CMISSDP
  238. !Set material parameters
  239. POROSITY_PARAM_DARCY=0.1_CMISSDP
  240. PERM_OVER_VIS_PARAM_DARCY=1.0_CMISSDP
  241. !Set output parameter
  242. !(NoOutput/ProgressOutput/TimingOutput/SolverOutput/SolverMatrixOutput)
  243. DYNAMIC_SOLVER_DARCY_OUTPUT_TYPE=CMISS_SOLVER_PROGRESS_OUTPUT
  244. LINEAR_SOLVER_DARCY_OUTPUT_TYPE=CMISS_SOLVER_SOLVER_OUTPUT
  245. !(NoOutput/TimingOutput/MatrixOutput/ElementOutput)
  246. EQUATIONS_DARCY_OUTPUT=CMISS_EQUATIONS_NO_OUTPUT
  247. !Set time parameter
  248. DYNAMIC_SOLVER_DARCY_START_TIME=0.0_CMISSDP
  249. DYNAMIC_SOLVER_DARCY_TIME_INCREMENT=1.0e-3_CMISSDP
  250. DYNAMIC_SOLVER_DARCY_STOP_TIME=5_CMISSIntg * DYNAMIC_SOLVER_DARCY_TIME_INCREMENT
  251. DYNAMIC_SOLVER_DARCY_THETA=1.0_CMISSDP !2.0_CMISSDP/3.0_CMISSDP
  252. !Set result output parameter
  253. DYNAMIC_SOLVER_DARCY_OUTPUT_FREQUENCY=1
  254. !Set solver parameters
  255. LINEAR_SOLVER_DARCY_DIRECT_FLAG=.TRUE.
  256. RELATIVE_TOLERANCE=1.0E-10_CMISSDP !default: 1.0E-05_CMISSDP
  257. ABSOLUTE_TOLERANCE=1.0E-10_CMISSDP !default: 1.0E-10_CMISSDP
  258. DIVERGENCE_TOLERANCE=1.0E5_CMISSDP !default: 1.0E5
  259. MAXIMUM_ITERATIONS=10000_CMISSIntg !default: 100000
  260. RESTART_VALUE=30_CMISSIntg !default: 30
  261. LINESEARCH_ALPHA=1.0_CMISSDP
  262. icompartment =1_CMISSIntg
  263. Ncompartments=4_CMISSIntg
  264. !LinearMeshComponentNumber/QuadraticMeshComponentNumber
  265. DarcyVelMeshComponentNumber = LinearMeshComponentNumber
  266. DarcyMassIncreaseMeshComponentNumber = LinearMeshComponentNumber
  267. ! GeometricFieldDarcyMeshComponentNumber = DarcyVelMeshComponentNumber
  268. GeometricFieldDarcyMeshComponentNumber = QuadraticMeshComponentNumber
  269. ALLOCATE (EquationsSetDarcy(Ncompartments))
  270. ALLOCATE (EquationsSetFieldDarcy(Ncompartments))
  271. ALLOCATE (MaterialsFieldDarcy(Ncompartments))
  272. ALLOCATE (EquationsDarcy(Ncompartments))
  273. !
  274. !================================================================================================================================
  275. !
  276. !Intialise cmiss
  277. CALL CMISSInitialise(WorldCoordinateSystem,WorldRegion,Err)
  278. CALL CMISSErrorHandlingModeSet(CMISS_ERRORS_TRAP_ERROR,Err)
  279. WRITE(*,'(A)') "Program starting."
  280. !Set all diganostic levels on for testing
  281. CALL CMISSDiagnosticsSetOn(CMISS_FROM_DIAG_TYPE,(/1,2,3,4,5/),"Diagnostics",(/"PROBLEM_FINITE_ELEMENT_CALCULATE"/),Err)
  282. !Get the number of computational nodes and this computational node number
  283. CALL CMISSComputationalNumberOfNodesGet(NumberOfComputationalNodes,Err)
  284. CALL CMISSComputationalNodeNumberGet(ComputationalNodeNumber,Err)
  285. !Broadcast the number of elements in the X,Y and Z directions and the number of partitions to the other computational nodes
  286. ! CALL MPI_BCAST(NumberGlobalXElements,1,MPI_INTEGER,0,MPI_COMM_WORLD,MPI_IERROR)
  287. ! CALL MPI_BCAST(NumberGlobalYElements,1,MPI_INTEGER,0,MPI_COMM_WORLD,MPI_IERROR)
  288. ! CALL MPI_BCAST(NumberGlobalZElements,1,MPI_INTEGER,0,MPI_COMM_WORLD,MPI_IERROR)
  289. ! CALL MPI_BCAST(NumberOfDomains,1,MPI_INTEGER,0,MPI_COMM_WORLD,MPI_IERROR)
  290. NumberOfDomains=NumberOfComputationalNodes
  291. !Create a CS - default is 3D rectangular cartesian CS with 0,0,0 as origin
  292. CALL CMISSCoordinateSystem_Initialise(CoordinateSystem,Err)
  293. CALL CMISSCoordinateSystem_CreateStart(CoordinateSystemUserNumber,CoordinateSystem,Err)
  294. CALL CMISSCoordinateSystem_TypeSet(CoordinateSystem,CMISS_COORDINATE_RECTANGULAR_CARTESIAN_TYPE,Err)
  295. CALL CMISSCoordinateSystem_DimensionSet(CoordinateSystem,NumberOfSpatialCoordinates,Err)
  296. CALL CMISSCoordinateSystem_OriginSet(CoordinateSystem,(/0.0_CMISSDP,0.0_CMISSDP,0.0_CMISSDP/),Err)
  297. CALL CMISSCoordinateSystem_CreateFinish(CoordinateSystem,Err)
  298. !
  299. !================================================================================================================================
  300. !
  301. !Create a region and assign the CS to the region
  302. CALL CMISSRegion_Initialise(Region,Err)
  303. CALL CMISSRegion_CreateStart(RegionUserNumber,WorldRegion,Region,Err)
  304. CALL CMISSRegion_CoordinateSystemSet(Region,CoordinateSystem,Err)
  305. CALL CMISSRegion_CreateFinish(Region,Err)
  306. !
  307. !================================================================================================================================
  308. !
  309. !Define basis functions - tri-linear Lagrange and tri-Quadratic Lagrange, each with collapsed variant
  310. !Quadratic Basis
  311. CALL CMISSBasis_Initialise(QuadraticBasis,Err)
  312. CALL CMISSBasis_CreateStart(QuadraticBasisUserNumber,QuadraticBasis,Err)
  313. CALL CMISSBasis_InterpolationXiSet(QuadraticBasis,(/CMISS_BASIS_QUADRATIC_LAGRANGE_INTERPOLATION, &
  314. & CMISS_BASIS_QUADRATIC_LAGRANGE_INTERPOLATION,CMISS_BASIS_QUADRATIC_LAGRANGE_INTERPOLATION/),Err)
  315. CALL CMISSBasis_QuadratureNumberOfGaussXiSet(QuadraticBasis, &
  316. & (/CMISS_BASIS_MID_QUADRATURE_SCHEME,CMISS_BASIS_MID_QUADRATURE_SCHEME,CMISS_BASIS_MID_QUADRATURE_SCHEME/),Err)
  317. ! & (/CMISS_BASIS_HIGH_QUADRATURE_SCHEME,CMISS_BASIS_HIGH_QUADRATURE_SCHEME,CMISS_BASIS_HIGH_QUADRATURE_SCHEME/),Err)
  318. CALL CMISSBasis_QuadratureLocalFaceGaussEvaluateSet(QuadraticBasis,.true.,Err) !Have to do this
  319. CALL CMISSBasis_CreateFinish(QuadraticBasis,Err)
  320. !Collapsed Quadratic Basis
  321. CALL CMISSBasis_Initialise(QuadraticCollapsedBasis,Err)
  322. CALL CMISSBasis_CreateStart(QuadraticCollapsedBasisUserNumber,QuadraticCollapsedBasis,Err)
  323. CALL CMISSBasis_TypeSet(QuadraticCollapsedBasis,CMISS_BASIS_LAGRANGE_HERMITE_TP_TYPE,Err)
  324. CALL CMISSBasis_NumberOfXiSet(QuadraticCollapsedBasis,NumberOfXiCoordinates,Err)
  325. CALL CMISSBasis_InterpolationXiSet(QuadraticCollapsedBasis,(/CMISS_BASIS_QUADRATIC_LAGRANGE_INTERPOLATION, &
  326. & CMISS_BASIS_QUADRATIC_LAGRANGE_INTERPOLATION,CMISS_BASIS_QUADRATIC_LAGRANGE_INTERPOLATION/),Err)
  327. CALL CMISSBasis_CollapsedXiSet(QuadraticCollapsedBasis,(/CMISS_BASIS_XI_COLLAPSED, &
  328. & CMISS_BASIS_COLLAPSED_AT_XI0,CMISS_BASIS_NOT_COLLAPSED/),Err)
  329. CALL CMISSBasis_QuadratureNumberOfGaussXiSet(QuadraticCollapsedBasis, &
  330. & (/CMISS_BASIS_MID_QUADRATURE_SCHEME,CMISS_BASIS_MID_QUADRATURE_SCHEME,CMISS_BASIS_MID_QUADRATURE_SCHEME/),Err)
  331. ! & (/CMISS_BASIS_HIGH_QUADRATURE_SCHEME,CMISS_BASIS_HIGH_QUADRATURE_SCHEME,CMISS_BASIS_HIGH_QUADRATURE_SCHEME/),Err)
  332. CALL CMISSBasis_QuadratureLocalFaceGaussEvaluateSet(QuadraticCollapsedBasis,.true.,Err) !Have to do this
  333. CALL CMISSBasis_CreateFinish(QuadraticCollapsedBasis,Err)
  334. !Linear Basis
  335. CALL CMISSBasis_Initialise(LinearBasis,Err)
  336. CALL CMISSBasis_CreateStart(LinearBasisUserNumber,LinearBasis,Err)
  337. CALL CMISSBasis_QuadratureNumberOfGaussXiSet(LinearBasis, &
  338. & (/CMISS_BASIS_MID_QUADRATURE_SCHEME,CMISS_BASIS_MID_QUADRATURE_SCHEME,CMISS_BASIS_MID_QUADRATURE_SCHEME/),Err)
  339. ! & (/CMISS_BASIS_HIGH_QUADRATURE_SCHEME,CMISS_BASIS_HIGH_QUADRATURE_SCHEME,CMISS_BASIS_HIGH_QUADRATURE_SCHEME/),Err)
  340. CALL CMISSBasis_QuadratureLocalFaceGaussEvaluateSet(LinearBasis,.true.,Err) !Have to do this (unused) due to field_interp setup
  341. CALL CMISSBasis_CreateFinish(LinearBasis,Err)
  342. !Collapsed Linear Basis
  343. CALL CMISSBasis_Initialise(LinearCollapsedBasis,Err)
  344. CALL CMISSBasis_CreateStart(LinearCollapsedBasisUserNumber,LinearCollapsedBasis,Err)
  345. CALL CMISSBasis_TypeSet(LinearCollapsedBasis,CMISS_BASIS_LAGRANGE_HERMITE_TP_TYPE,Err)
  346. CALL CMISSBasis_NumberOfXiSet(LinearCollapsedBasis,NumberOfXiCoordinates,Err)
  347. CALL CMISSBasis_InterpolationXiSet(LinearCollapsedBasis,(/CMISS_BASIS_LINEAR_LAGRANGE_INTERPOLATION, &
  348. & CMISS_BASIS_LINEAR_LAGRANGE_INTERPOLATION,CMISS_BASIS_LINEAR_LAGRANGE_INTERPOLATION/),Err)
  349. CALL CMISSBasis_CollapsedXiSet(LinearCollapsedBasis,(/CMISS_BASIS_XI_COLLAPSED,CMISS_BASIS_COLLAPSED_AT_XI0, &
  350. & CMISS_BASIS_NOT_COLLAPSED/),Err)
  351. CALL CMISSBasis_QuadratureNumberOfGaussXiSet(LinearCollapsedBasis, &
  352. & (/CMISS_BASIS_MID_QUADRATURE_SCHEME,CMISS_BASIS_MID_QUADRATURE_SCHEME,CMISS_BASIS_MID_QUADRATURE_SCHEME/),Err)
  353. ! & (/CMISS_BASIS_HIGH_QUADRATURE_SCHEME,CMISS_BASIS_HIGH_QUADRATURE_SCHEME,CMISS_BASIS_HIGH_QUADRATURE_SCHEME/),Err)
  354. CALL CMISSBasis_QuadratureLocalFaceGaussEvaluateSet(LinearCollapsedBasis,.true.,Err) !Have to do this (unused) due to field_interp setup
  355. CALL CMISSBasis_CreateFinish(LinearCollapsedBasis,Err)
  356. !
  357. !================================================================================================================================
  358. !
  359. !Start the creation of a generated ellipsoid mesh
  360. CALL CMISSGeneratedMesh_Initialise(GeneratedMesh,Err)
  361. CALL CMISSGeneratedMesh_CreateStart(GeneratedMeshUserNumber,Region,GeneratedMesh,Err)
  362. !Set up an ellipsoid mesh
  363. CALL CMISSGeneratedMesh_TypeSet(GeneratedMesh,CMISS_GENERATED_MESH_ELLIPSOID_MESH_TYPE,Err)
  364. !Set the quadratic and linear bases
  365. CALL CMISSGeneratedMesh_BasisSet(GeneratedMesh,[QuadraticBasis,QuadraticCollapsedBasis,LinearBasis,LinearCollapsedBasis],Err)
  366. !Define the mesh on the region
  367. CALL CMISSGeneratedMesh_ExtentSet(GeneratedMesh,(/LONG_AXIS,SHORT_AXIS,WALL_THICKNESS,CUTOFF_ANGLE/),Err)
  368. CALL CMISSGeneratedMesh_NumberOfElementsSet(GeneratedMesh,(/NumberGlobalXElements,NumberGlobalYElements, &
  369. & NumberGlobalZElements/),Err)
  370. !Finish the creation of a generated mesh in the region
  371. CALL CMISSMesh_Initialise(Mesh,Err)
  372. CALL CMISSGeneratedMesh_CreateFinish(GeneratedMesh,MeshUserNumber,Mesh,Err)
  373. !
  374. !================================================================================================================================
  375. !
  376. !Create a decomposition
  377. CALL CMISSDecomposition_Initialise(Decomposition,Err)
  378. CALL CMISSDecomposition_CreateStart(DecompositionUserNumber,Mesh,Decomposition,Err)
  379. CALL CMISSDecomposition_TypeSet(Decomposition,CMISS_DECOMPOSITION_CALCULATED_TYPE,Err)
  380. CALL CMISSDecomposition_NumberOfDomainsSet(Decomposition,NumberOfDomains,Err)
  381. CALL CMISSDecomposition_CalculateFacesSet(Decomposition,.TRUE.,Err)
  382. CALL CMISSDecomposition_CreateFinish(Decomposition,Err)
  383. !
  384. !================================================================================================================================
  385. !
  386. ! --- GeometricFieldSolid ---
  387. !Create a field to put the geometry (default is geometry)
  388. CALL CMISSField_Initialise(GeometricFieldSolid,Err)
  389. CALL CMISSField_CreateStart(FieldGeometryUserNumberSolid,Region,GeometricFieldSolid,Err)
  390. CALL CMISSField_MeshDecompositionSet(GeometricFieldSolid,Decomposition,Err)
  391. CALL CMISSField_TypeSet(GeometricFieldSolid,CMISS_FIELD_GEOMETRIC_TYPE,Err)
  392. CALL CMISSField_NumberOfVariablesSet(GeometricFieldSolid,FieldGeometryNumberOfVariables,Err)
  393. CALL CMISSField_NumberOfComponentsSet(GeometricFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,FieldGeometryNumberOfComponents,Err)
  394. CALL CMISSField_ComponentMeshComponentSet(GeometricFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,1,QuadraticMeshComponentNumber,Err)
  395. CALL CMISSField_ComponentMeshComponentSet(GeometricFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,2,QuadraticMeshComponentNumber,Err)
  396. CALL CMISSField_ComponentMeshComponentSet(GeometricFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,3,QuadraticMeshComponentNumber,Err)
  397. CALL CMISSField_CreateFinish(GeometricFieldSolid,Err)
  398. !Update the geometric field parameters
  399. CALL CMISSGeneratedMesh_GeometricParametersCalculate(GeneratedMesh,GeometricFieldSolid,Err)
  400. !
  401. !================================================================================================================================
  402. !
  403. ! --- GeometricFieldDarcy ---
  404. !Create a field to put the geometry (default is geometry)
  405. CALL CMISSField_Initialise(GeometricFieldDarcy,Err)
  406. CALL CMISSField_CreateStart(FieldGeometryUserNumberDarcy,Region,GeometricFieldDarcy,Err)
  407. CALL CMISSField_MeshDecompositionSet(GeometricFieldDarcy,Decomposition,Err)
  408. CALL CMISSField_TypeSet(GeometricFieldDarcy,CMISS_FIELD_GEOMETRIC_TYPE,Err)
  409. CALL CMISSField_NumberOfVariablesSet(GeometricFieldDarcy,FieldGeometryNumberOfVariables,Err)
  410. CALL CMISSField_NumberOfComponentsSet(GeometricFieldDarcy,CMISS_FIELD_U_VARIABLE_TYPE,FieldGeometryNumberOfComponents,Err)
  411. CALL CMISSField_ComponentMeshComponentSet(GeometricFieldDarcy,CMISS_FIELD_U_VARIABLE_TYPE,1, &
  412. & GeometricFieldDarcyMeshComponentNumber,Err)
  413. CALL CMISSField_ComponentMeshComponentSet(GeometricFieldDarcy,CMISS_FIELD_U_VARIABLE_TYPE,2, &
  414. & GeometricFieldDarcyMeshComponentNumber,Err)
  415. CALL CMISSField_ComponentMeshComponentSet(GeometricFieldDarcy,CMISS_FIELD_U_VARIABLE_TYPE,3, &
  416. & GeometricFieldDarcyMeshComponentNumber,Err)
  417. CALL CMISSField_CreateFinish(GeometricFieldDarcy,Err)
  418. !Update the geometric field parameters
  419. CALL CMISSGeneratedMesh_GeometricParametersCalculate(GeneratedMesh,GeometricFieldDarcy,Err)
  420. !
  421. !================================================================================================================================
  422. !
  423. !Create a fibre field and attach it to the geometric field
  424. CALL CMISSField_Initialise(FibreFieldSolid,Err)
  425. CALL CMISSField_CreateStart(FieldFibreUserNumber,Region,FibreFieldSolid,Err)
  426. CALL CMISSField_TypeSet(FibreFieldSolid,CMISS_FIELD_FIBRE_TYPE,Err)
  427. CALL CMISSField_MeshDecompositionSet(FibreFieldSolid,Decomposition,Err)
  428. CALL CMISSField_GeometricFieldSet(FibreFieldSolid,GeometricFieldSolid,Err)
  429. CALL CMISSField_NumberOfVariablesSet(FibreFieldSolid,FieldFibreNumberOfVariables,Err)
  430. CALL CMISSField_NumberOfComponentsSet(FibreFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,FieldFibreNumberOfComponents,Err)
  431. CALL CMISSField_ComponentMeshComponentSet(FibreFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,1,QuadraticMeshComponentNumber,Err)
  432. CALL CMISSField_ComponentMeshComponentSet(FibreFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,2,QuadraticMeshComponentNumber,Err)
  433. CALL CMISSField_ComponentMeshComponentSet(FibreFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,3,QuadraticMeshComponentNumber,Err)
  434. CALL CMISSField_CreateFinish(FibreFieldSolid,Err)
  435. !Set Fibre directions (this block is parallel-untested)
  436. node_idx=0
  437. !This is valid only for quadratic basis functions
  438. TOTAL_NUMBER_NODES_XI(1)=NumberGlobalXElements*2
  439. TOTAL_NUMBER_NODES_XI(2)=NumberGlobalYElements*2+1
  440. TOTAL_NUMBER_NODES_XI(3)=NumberGlobalZElements*2+1
  441. XI2delta=(PI-CUTOFF_ANGLE)/(TOTAL_NUMBER_NODES_XI(2)-1)
  442. XI3=0
  443. XI3delta=(1.0)/(TOTAL_NUMBER_NODES_XI(3)-1)
  444. zero=0
  445. DO k=1, TOTAL_NUMBER_NODES_XI(3)
  446. !Apex nodes
  447. j=1
  448. i=1
  449. node_idx=node_idx+1
  450. CALL CMISSDecomposition_NodeDomainGet(Decomposition,node_idx,1,NodeDomain,Err)
  451. IF(NodeDomain==ComputationalNodeNumber) THEN
  452. FibreFieldAngle=(/zero,zero,zero/)
  453. DO component_idx=1,FieldFibreNumberOfComponents
  454. CALL CMISSField_ParameterSetUpdateNode(FibreFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,CMISS_FIELD_VALUES_SET_TYPE,1, &
  455. & DerivativeUserNumber,node_idx,component_idx,FibreFieldAngle(component_idx),Err)
  456. ENDDO
  457. ENDIF
  458. theta=atan(FIBRE_SLOPE_CHANGE*XI3+FIBRE_SLOPE_INTERSECTION)
  459. DO j=2, TOTAL_NUMBER_NODES_XI(2)
  460. nu=PI-XI2delta*(j-1)
  461. omega=PI/2+cos(2*nu)*atan(SHEET_SLOPE_BASE_ENDO)*(-2*XI3+1)
  462. DO i=1, TOTAL_NUMBER_NODES_XI(1)
  463. node_idx=node_idx+1
  464. CALL CMISSDecomposition_NodeDomainGet(Decomposition,node_idx,1,NodeDomain,Err)
  465. IF(NodeDomain==ComputationalNodeNumber) THEN
  466. FibreFieldAngle=(/theta,zero,omega/)
  467. DO component_idx=1,FieldFibreNumberOfComponents
  468. CALL CMISSField_ParameterSetUpdateNode(FibreFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,CMISS_FIELD_VALUES_SET_TYPE,1, &
  469. & DerivativeUserNumber, node_idx,component_idx,FibreFieldAngle(component_idx),Err)
  470. ENDDO
  471. ENDIF
  472. ENDDO
  473. ENDDO
  474. XI3=XI3+XI3delta
  475. ENDDO
  476. !Create a material field and attach it to the geometric field
  477. CALL CMISSField_Initialise(MaterialFieldSolid,Err)
  478. CALL CMISSField_CreateStart(FieldMaterialUserNumber,Region,MaterialFieldSolid,Err)
  479. CALL CMISSField_TypeSet(MaterialFieldSolid,CMISS_FIELD_MATERIAL_TYPE,Err)
  480. CALL CMISSField_MeshDecompositionSet(MaterialFieldSolid,Decomposition,Err)
  481. CALL CMISSField_GeometricFieldSet(MaterialFieldSolid,GeometricFieldSolid,Err)
  482. CALL CMISSField_NumberOfVariablesSet(MaterialFieldSolid,FieldMaterialNumberOfVariables,Err)
  483. CALL CMISSField_NumberOfComponentsSet(MaterialFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,FieldMaterialNumberOfComponents,Err)
  484. CALL CMISSField_ComponentInterpolationSet(MaterialFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,1,CMISS_FIELD_CONSTANT_INTERPOLATION,Err)
  485. CALL CMISSField_ComponentInterpolationSet(MaterialFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,2,CMISS_FIELD_CONSTANT_INTERPOLATION,Err)
  486. CALL CMISSField_ComponentInterpolationSet(MaterialFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,3,CMISS_FIELD_CONSTANT_INTERPOLATION,Err)
  487. CALL CMISSField_CreateFinish(MaterialFieldSolid,Err)
  488. !Set Mooney-Rivlin constants
  489. CALL CMISSField_ComponentValuesInitialise(MaterialFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,CMISS_FIELD_VALUES_SET_TYPE,1,C1,Err)
  490. CALL CMISSField_ComponentValuesInitialise(MaterialFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,CMISS_FIELD_VALUES_SET_TYPE,2,C2,Err)
  491. CALL CMISSField_ComponentValuesInitialise(MaterialFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,CMISS_FIELD_VALUES_SET_TYPE,3,C3,Err)
  492. !
  493. !================================================================================================================================
  494. !
  495. !EQUATIONS SETS
  496. DO icompartment = 1,Ncompartments
  497. EquationsSetFieldUserNumberDarcy = 100_CMISSIntg+icompartment
  498. EquationsSetUserNumberDarcy = 200_CMISSIntg+icompartment
  499. !Create the equations set for ALE Darcy
  500. CALL CMISSField_Initialise(EquationsSetFieldDarcy(icompartment),Err)
  501. CALL CMISSEquationsSet_Initialise(EquationsSetDarcy(icompartment),Err)
  502. CALL CMISSEquationsSet_CreateStart(EquationsSetUserNumberDarcy,Region,GeometricFieldDarcy, &
  503. & CMISS_EQUATIONS_SET_FLUID_MECHANICS_CLASS, &
  504. & CMISS_EQUATIONS_SET_DARCY_EQUATION_TYPE,CMISS_EQUATIONS_SET_INCOMPRESS_ELAST_MULTI_COMP_DARCY_SUBTYPE,&
  505. & EquationsSetFieldUserNumberDarcy,EquationsSetFieldDarcy(icompartment),EquationsSetDarcy(icompartment),Err)
  506. !Finish creating the equations set
  507. CALL CMISSEquationsSet_CreateFinish(EquationsSetDarcy(icompartment),Err)
  508. !Set the values for the equations set field to be the current compartment number (1 - N), and the total number of compartments (N)
  509. CALL CMISSField_ParameterSetUpdateConstant(EquationsSetFieldDarcy(icompartment),CMISS_FIELD_U_VARIABLE_TYPE, &
  510. & CMISS_FIELD_VALUES_SET_TYPE,1,icompartment,Err)
  511. CALL CMISSField_ParameterSetUpdateConstant(EquationsSetFieldDarcy(icompartment),CMISS_FIELD_U_VARIABLE_TYPE, &
  512. & CMISS_FIELD_VALUES_SET_TYPE,2,Ncompartments,Err)
  513. ENDDO
  514. !--------------------------------------------------------------------------------------------------------------------------------
  515. ! Solid
  516. !Create the equations_set
  517. CALL CMISSField_Initialise(EquationsSetFieldSolid,Err)
  518. CALL CMISSEquationsSet_Initialise(EquationsSetSolid,Err)
  519. CALL CMISSEquationsSet_CreateStart(EquationSetSolidUserNumber,Region,FibreFieldSolid,CMISS_EQUATIONS_SET_ELASTICITY_CLASS, &
  520. & CMISS_EQUATIONS_SET_FINITE_ELASTICITY_TYPE,CMISS_EQUATIONS_SET_INCOMPRESS_ELAST_MULTI_COMP_DARCY_SUBTYPE,&
  521. & EquationsSetFieldSolidUserNumber,EquationsSetFieldSolid,EquationsSetSolid,Err)
  522. CALL CMISSEquationsSet_CreateFinish(EquationsSetSolid,Err)
  523. !Set the values for the equations set field to be the current compartment number (O for the finite elasticity equations_set), and the total number of compartments (N)
  524. !Need to store number of compartments, as finite elasticity uses this to calculate the total mass increase for the constiutive law
  525. CALL CMISSField_ParameterSetUpdateConstant(EquationsSetFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE, &
  526. & CMISS_FIELD_VALUES_SET_TYPE,1,0_CMISSIntg,Err)
  527. CALL CMISSField_ParameterSetUpdateConstant(EquationsSetFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE, &
  528. & CMISS_FIELD_VALUES_SET_TYPE,2,Ncompartments,Err)
  529. !
  530. !================================================================================================================================
  531. !
  532. ! Solid
  533. !Create a dependent field with two variables and four components
  534. CALL CMISSField_Initialise(DependentFieldSolid,Err)
  535. !
  536. CALL CMISSField_CreateStart(FieldDependentSolidUserNumber,Region,DependentFieldSolid,Err)
  537. !
  538. CALL CMISSField_TypeSet(DependentFieldSolid,CMISS_FIELD_GENERAL_TYPE,Err)
  539. CALL CMISSField_MeshDecompositionSet(DependentFieldSolid,Decomposition,Err)
  540. CALL CMISSField_GeometricFieldSet(DependentFieldSolid,GeometricFieldSolid,Err)
  541. CALL CMISSField_DependentTypeSet(DependentFieldSolid,CMISS_FIELD_DEPENDENT_TYPE,Err)
  542. !Create 2N+2 number of variables - 2 for solid, 2N for N Darcy compartments
  543. FieldDependentSolidNumberOfVariables=2*Ncompartments+2
  544. CALL CMISSField_NumberOfVariablesSet(DependentFieldSolid,FieldDependentSolidNumberOfVariables,Err)
  545. !create two variables for each compartment
  546. ALLOCATE(VariableTypes(2*Ncompartments+2))
  547. DO num_var=1,Ncompartments+1
  548. VariableTypes(2*num_var-1)=CMISS_FIELD_U_VARIABLE_TYPE+(CMISS_FIELD_NUMBER_OF_VARIABLE_SUBTYPES*(num_var-1))
  549. VariableTypes(2*num_var)=CMISS_FIELD_DELUDELN_VARIABLE_TYPE+(CMISS_FIELD_NUMBER_OF_VARIABLE_SUBTYPES*(num_var-1))
  550. ENDDO
  551. CALL CMISSField_VariableTypesSet(DependentFieldSolid,VariableTypes,Err)
  552. ! CALL CMISSField_VariableTypesSet(DependentFieldSolid,(/CMISS_FIELD_U_VARIABLE_TYPE, &
  553. ! & CMISS_FIELD_DELUDELN_VARIABLE_TYPE,CMISS_FIELD_V_VARIABLE_TYPE,CMISS_FIELD_DELVDELN_VARIABLE_TYPE/),Err)
  554. CALL CMISSField_DimensionSet(DependentFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE, &
  555. & CMISS_FIELD_VECTOR_DIMENSION_TYPE,Err)
  556. CALL CMISSField_DimensionSet(DependentFieldSolid,CMISS_FIELD_DELUDELN_VARIABLE_TYPE, &
  557. & CMISS_FIELD_VECTOR_DIMENSION_TYPE,Err)
  558. CALL CMISSField_NumberOfComponentsSet(DependentFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,FieldDependentSolidNumberOfComponents,Err)
  559. CALL CMISSField_NumberOfComponentsSet(DependentFieldSolid,CMISS_FIELD_DELUDELN_VARIABLE_TYPE, &
  560. & FieldDependentSolidNumberOfComponents,Err)
  561. DO icompartment=3,2*Ncompartments+2
  562. CALL CMISSField_NumberOfComponentsSet(DependentFieldSolid,VariableTypes(icompartment),FieldDependentFluidNumberOfComponents,Err)
  563. ENDDO
  564. ! CALL CMISSField_ComponentInterpolationSet(DependentFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,1,CMISS_FIELD_NODE_BASED_INTERPOLATION,Err)
  565. ! CALL CMISSField_ComponentInterpolationSet(DependentFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,2,CMISS_FIELD_NODE_BASED_INTERPOLATION,Err)
  566. ! CALL CMISSField_ComponentInterpolationSet(DependentFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,3,CMISS_FIELD_NODE_BASED_INTERPOLATION,Err)
  567. CALL CMISSField_ComponentMeshComponentSet(DependentFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,1,SolidDisplMeshComponentNumber,Err)
  568. CALL CMISSField_ComponentMeshComponentSet(DependentFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,2,SolidDisplMeshComponentNumber,Err)
  569. CALL CMISSField_ComponentMeshComponentSet(DependentFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,3,SolidDisplMeshComponentNumber,Err)
  570. CALL CMISSField_ComponentInterpolationSet(DependentFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,4, &
  571. & CMISS_FIELD_NODE_BASED_INTERPOLATION, &
  572. & Err)
  573. ! CALL CMISSField_ComponentInterpolationSet(DependentFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,4,CMISS_FIELD_ELEMENT_BASED_INTERPOLATION,Err)
  574. ! CALL CMISSField_ComponentMeshComponentSet(DependentFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,4,SolidMeshComponenetNumber,Err)
  575. CALL CMISSField_ComponentMeshComponentSet(DependentFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,4,SolidLagrMultMeshComponentNumber,Err)
  576. ! CALL CMISSField_ComponentInterpolationSet(DependentFieldSolid,CMISS_FIELD_DELUDELN_VARIABLE_TYPE,1, &
  577. ! & CMISS_FIELD_NODE_BASED_INTERPOLATION,Err)
  578. ! CALL CMISSField_ComponentInterpolationSet(DependentFieldSolid,CMISS_FIELD_DELUDELN_VARIABLE_TYPE,2, &
  579. ! & CMISS_FIELD_NODE_BASED_INTERPOLATION,Err)
  580. ! CALL CMISSField_ComponentInterpolationSet(DependentFieldSolid,CMISS_FIELD_DELUDELN_VARIABLE_TYPE,3, &
  581. ! & CMISS_FIELD_NODE_BASED_INTERPOLATION,Err)
  582. CALL CMISSField_ComponentMeshComponentSet(DependentFieldSolid,CMISS_FIELD_DELUDELN_VARIABLE_TYPE,1, &
  583. & SolidDisplMeshComponentNumber, &
  584. & Err)
  585. CALL CMISSField_ComponentMeshComponentSet(DependentFieldSolid,CMISS_FIELD_DELUDELN_VARIABLE_TYPE,2, &
  586. & SolidDisplMeshComponentNumber, &
  587. & Err)
  588. CALL CMISSField_ComponentMeshComponentSet(DependentFieldSolid,CMISS_FIELD_DELUDELN_VARIABLE_TYPE,3, &
  589. & SolidDisplMeshComponentNumber, &
  590. & Err)
  591. CALL CMISSField_ComponentInterpolationSet(DependentFieldSolid,CMISS_FIELD_DELUDELN_VARIABLE_TYPE,4, &
  592. & CMISS_FIELD_NODE_BASED_INTERPOLATION,Err)
  593. ! CALL CMISSField_ComponentInterpolationSet(DependentFieldSolid,CMISS_FIELD_DELUDELN_VARIABLE_TYPE,4, &
  594. ! & CMISS_FIELD_ELEMENT_BASED_INTERPOLATION,Err)
  595. ! CALL CMISSField_ComponentMeshComponentSet(DependentFieldSolid,CMISS_FIELD_DELUDELN_VARIABLE_TYPE,4,SolidMeshComponenetNumber,Err)
  596. CALL CMISSField_ComponentMeshComponentSet(DependentFieldSolid,CMISS_FIELD_DELUDELN_VARIABLE_TYPE,4, &
  597. & SolidLagrMultMeshComponentNumber, &
  598. & Err)
  599. !loop over the number of compartments
  600. DO icompartment=3,2*Ncompartments+2
  601. ! CALL CMISSField_DimensionSet(DependentFieldSolid,VariableTypes(icompartment), &
  602. ! & CMISS_FIELD_VECTOR_DIMENSION_TYPE,Err)
  603. !CALL CMISSField_NumberOfComponentsSet(DependentFieldSolid,VariableTypes(icompartment),FieldDependentFluidNumberOfComponents,Err)
  604. DO componentnum=1,FieldDependentFluidNumberOfComponents-1
  605. !set dimension type
  606. ! CALL CMISSField_DimensionSet(DependentField,VariableTypes(icompartment), &
  607. ! & CMISS_FIELD_SCALAR_DIMENSION_TYPE,Err)
  608. CALL CMISSField_ComponentInterpolationSet(DependentFieldSolid,VariableTypes(icompartment),componentnum, &
  609. & CMISS_FIELD_NODE_BASED_INTERPOLATION,Err)
  610. CALL CMISSField_ComponentMeshComponentSet(DependentFieldSolid,VariableTypes(icompartment),componentnum, &
  611. & DarcyVelMeshComponentNumber,Err)
  612. ENDDO
  613. CALL CMISSField_ComponentInterpolationSet(DependentFieldSolid,VariableTypes(icompartment), &
  614. & FieldDependentFluidNumberOfComponents, &
  615. & CMISS_FIELD_NODE_BASED_INTERPOLATION,Err)
  616. ! CALL CMISSField_ComponentMeshComponentSet(DependentFieldSolid,VariableTypes(icompartment), &
  617. ! & FieldDependentFluidNumberOfComponents,MESH_COMPONENT_NUMBER_PRESSURE,Err)
  618. CALL CMISSField_ComponentMeshComponentSet(DependentFieldSolid,VariableTypes(icompartment), &
  619. & FieldDependentFluidNumberOfComponents,DarcyMassIncreaseMeshComponentNumber,Err)
  620. ENDDO
  621. ! CALL CMISSField_NumberOfComponentsSet(DependentFieldSolid,CMISS_FIELD_V_VARIABLE_TYPE,FieldDependentFluidNumberOfComponents,Err)
  622. ! CALL CMISSField_NumberOfComponentsSet(DependentFieldSolid,CMISS_FIELD_DELVDELN_VARIABLE_TYPE,FieldDependentFluidNumberOfComponents,Err)
  623. ! !For this equation type, MESH_COMPONENT_NUMBER_PRESSURE is actually the mass increase component as the pressure is taken from the solid equations
  624. ! CALL CMISSField_ComponentMeshComponentSet(DependentFieldSolid,CMISS_FIELD_V_VARIABLE_TYPE,1,MESH_COMPONENT_NUMBER_VELOCITY,Err)
  625. ! CALL CMISSField_ComponentMeshComponentSet(DependentFieldSolid,CMISS_FIELD_V_VARIABLE_TYPE,2,MESH_COMPONENT_NUMBER_VELOCITY,Err)
  626. ! CALL CMISSField_ComponentMeshComponentSet(DependentFieldSolid,CMISS_FIELD_V_VARIABLE_TYPE,3,MESH_COMPONENT_NUMBER_VELOCITY,Err)
  627. ! CALL CMISSField_ComponentMeshComponentSet(DependentFieldSolid,CMISS_FIELD_V_VARIABLE_TYPE,4,MESH_COMPONENT_NUMBER_PRESSURE,Err)
  628. ! CALL CMISSField_ComponentMeshComponentSet(DependentFieldSolid,CMISS_FIELD_DELVDELN_VARIABLE_TYPE,1,MESH_COMPONENT_NUMBER_VELOCITY,Err)
  629. ! CALL CMISSField_ComponentMeshComponentSet(DependentFieldSolid,CMISS_FIELD_DELVDELN_VARIABLE_TYPE,2,MESH_COMPONENT_NUMBER_VELOCITY,Err)
  630. ! CALL CMISSField_ComponentMeshComponentSet(DependentFieldSolid,CMISS_FIELD_DELVDELN_VARIABLE_TYPE,3,MESH_COMPONENT_NUMBER_VELOCITY,Err)
  631. ! CALL CMISSField_ComponentMeshComponentSet(DependentFieldSolid,CMISS_FIELD_DELVDELN_VARIABLE_TYPE,4,MESH_COMPONENT_NUMBER_PRESSURE,Err)
  632. !
  633. CALL CMISSField_ScalingTypeSet(DependentFieldSolid,CMISS_FIELD_UNIT_SCALING,Err)
  634. CALL CMISSField_CreateFinish(DependentFieldSolid,Err)
  635. !
  636. !================================================================================================================================
  637. !
  638. CALL CMISSEquationsSet_DependentCreateStart(EquationsSetSolid,FieldDependentSolidUserNumber,DependentFieldSolid,Err)
  639. CALL CMISSEquationsSet_DependentCreateFinish(EquationsSetSolid,Err)
  640. CALL CMISSEquationsSet_MaterialsCreateStart(EquationsSetSolid,FieldMaterialUserNumber,MaterialFieldSolid,Err)
  641. CALL CMISSEquationsSet_MaterialsCreateFinish(EquationsSetSolid,Err)
  642. !
  643. !================================================================================================================================
  644. !
  645. DO icompartment = 1,Ncompartments
  646. CALL CMISSEquationsSet_DependentCreateStart(EquationsSetDarcy(icompartment),FieldDependentSolidUserNumber,&
  647. & DependentFieldSolid,Err)
  648. CALL CMISSEquationsSet_DependentCreateFinish(EquationsSetDarcy(icompartment),Err)
  649. ENDDO
  650. DO COMPONENT_NUMBER=1,NUMBER_OF_DIMENSIONS+1
  651. CALL CMISSField_ComponentValuesInitialise(DependentFieldSolid,CMISS_FIELD_V_VARIABLE_TYPE,CMISS_FIELD_VALUES_SET_TYPE, &
  652. & COMPONENT_NUMBER,INITIAL_FIELD_DARCY(COMPONENT_NUMBER),Err)
  653. CALL CMISSField_ComponentValuesInitialise(DependentFieldSolid,CMISS_FIELD_U1_VARIABLE_TYPE,CMISS_FIELD_VALUES_SET_TYPE, &
  654. & COMPONENT_NUMBER,INITIAL_FIELD_DARCY(COMPONENT_NUMBER),Err)
  655. CALL CMISSField_ComponentValuesInitialise(DependentFieldSolid,CMISS_FIELD_U2_VARIABLE_TYPE,CMISS_FIELD_VALUES_SET_TYPE, &
  656. & COMPONENT_NUMBER,INITIAL_FIELD_DARCY(COMPONENT_NUMBER),Err)
  657. CALL CMISSField_ComponentValuesInitialise(DependentFieldSolid,CMISS_FIELD_U3_VARIABLE_TYPE,CMISS_FIELD_VALUES_SET_TYPE, &
  658. & COMPONENT_NUMBER,INITIAL_FIELD_DARCY(COMPONENT_NUMBER),Err)
  659. ENDDO
  660. !
  661. !================================================================================================================================
  662. !
  663. ALLOCATE(CouplingCoeffs(Ncompartments,Ncompartments))
  664. IF(Ncompartments==2)THEN
  665. CouplingCoeffs(1,1)=0.0E-01_CMISSDP
  666. ! CouplingCoeffs(1,2)=-1.0E-04_CMISSDP
  667. ! CouplingCoeffs(2,1)=-1.0E-04_CMISSDP
  668. CouplingCoeffs(1,2)=0.0E-01_CMISSDP
  669. CouplingCoeffs(2,1)=0.0E-01_CMISSDP
  670. CouplingCoeffs(2,2)=0.0E-01_CMISSDP
  671. ELSE IF(Ncompartments==3)THEN
  672. CouplingCoeffs(1,1)=1.0E-02_CMISSDP
  673. CouplingCoeffs(1,2)=1.0E-02_CMISSDP
  674. CouplingCoeffs(1,3)=0.0E-02_CMISSDP
  675. CouplingCoeffs(2,1)=1.0E-02_CMISSDP
  676. CouplingCoeffs(2,2)=2.0E-02_CMISSDP
  677. CouplingCoeffs(2,3)=1.0E-02_CMISSDP
  678. CouplingCoeffs(3,1)=0.0E-02_CMISSDP
  679. CouplingCoeffs(3,2)=1.0E-02_CMISSDP
  680. CouplingCoeffs(3,3)=1.0E-02_CMISSDP
  681. ELSE IF(Ncompartments==4)THEN
  682. CouplingCoeffs(1,1)=0.0E-02_CMISSDP
  683. CouplingCoeffs(1,2)=0.0E-02_CMISSDP
  684. CouplingCoeffs(1,3)=0.0E-02_CMISSDP
  685. CouplingCoeffs(1,4)=0.0E-02_CMISSDP
  686. CouplingCoeffs(2,1)=0.0E-02_CMISSDP
  687. CouplingCoeffs(2,2)=0.0E-02_CMISSDP
  688. CouplingCoeffs(2,3)=0.0E-02_CMISSDP
  689. CouplingCoeffs(2,4)=0.0E-02_CMISSDP
  690. CouplingCoeffs(3,1)=0.0E-02_CMISSDP
  691. CouplingCoeffs(3,2)=0.0E-02_CMISSDP
  692. CouplingCoeffs(3,3)=0.0E-02_CMISSDP
  693. CouplingCoeffs(3,4)=0.0E-02_CMISSDP
  694. CouplingCoeffs(4,1)=0.0E-02_CMISSDP
  695. CouplingCoeffs(4,2)=0.0E-02_CMISSDP
  696. CouplingCoeffs(4,3)=0.0E-02_CMISSDP
  697. CouplingCoeffs(4,4)=0.0E-02_CMISSDP
  698. ELSE IF(Ncompartments==5)THEN
  699. CouplingCoeffs(1,1)=0.0E-02_CMISSDP
  700. CouplingCoeffs(1,2)=0.0E-02_CMISSDP
  701. CouplingCoeffs(1,3)=0.0E-02_CMISSDP
  702. CouplingCoeffs(1,4)=0.0E-02_CMISSDP
  703. CouplingCoeffs(1,5)=0.0E-02_CMISSDP
  704. CouplingCoeffs(2,1)=0.0E-02_CMISSDP
  705. CouplingCoeffs(2,2)=0.0E-02_CMISSDP
  706. CouplingCoeffs(2,3)=0.0E-02_CMISSDP
  707. CouplingCoeffs(2,4)=0.0E-02_CMISSDP
  708. CouplingCoeffs(2,5)=0.0E-02_CMISSDP
  709. CouplingCoeffs(3,1)=0.0E-02_CMISSDP
  710. CouplingCoeffs(3,2)=0.0E-02_CMISSDP
  711. CouplingCoeffs(3,3)=0.0E-02_CMISSDP
  712. CouplingCoeffs(3,4)=0.0E-02_CMISSDP
  713. CouplingCoeffs(3,5)=0.0E-02_CMISSDP
  714. CouplingCoeffs(4,1)=0.0E-02_CMISSDP
  715. CouplingCoeffs(4,2)=0.0E-02_CMISSDP
  716. CouplingCoeffs(4,3)=0.0E-02_CMISSDP
  717. CouplingCoeffs(4,4)=0.0E-02_CMISSDP
  718. CouplingCoeffs(4,5)=0.0E-02_CMISSDP
  719. CouplingCoeffs(5,1)=0.0E-02_CMISSDP
  720. CouplingCoeffs(5,2)=0.0E-02_CMISSDP
  721. CouplingCoeffs(5,3)=0.0E-02_CMISSDP
  722. CouplingCoeffs(5,4)=0.0E-02_CMISSDP
  723. CouplingCoeffs(5,5)=0.0E-02_CMISSDP
  724. ELSE
  725. write(*,*) "Can't initialise coupling coefficients array."
  726. ENDIF
  727. !Define the material parameters for each compartments' constitutive law (for determining pressure)
  728. Nparams=3
  729. ALLOCATE(ConstitutiveParams(Ncompartments,Nparams))
  730. IF(Ncompartments==2)THEN
  731. ConstitutiveParams(1,1)=10.0E-01_CMISSDP
  732. ConstitutiveParams(1,2)=10.0E-01_CMISSDP
  733. ConstitutiveParams(1,3)=10.0E-01_CMISSDP
  734. ConstitutiveParams(2,1)=10.0E-01_CMISSDP
  735. ConstitutiveParams(2,2)=10.0E-01_CMISSDP
  736. ConstitutiveParams(2,3)=10.0E-01_CMISSDP
  737. ELSE IF(Ncompartments==3)THEN
  738. ConstitutiveParams(1,1)=1.0E-02_CMISSDP
  739. ConstitutiveParams(1,2)=1.0E-02_CMISSDP
  740. ConstitutiveParams(1,3)=0.0E-02_CMISSDP
  741. ConstitutiveParams(2,1)=1.0E-02_CMISSDP
  742. ConstitutiveParams(2,2)=2.0E-02_CMISSDP
  743. ConstitutiveParams(2,3)=1.0E-02_CMISSDP
  744. ConstitutiveParams(3,1)=0.0E-02_CMISSDP
  745. ConstitutiveParams(3,2)=1.0E-02_CMISSDP
  746. ConstitutiveParams(3,3)=1.0E-02_CMISSDP
  747. ELSE IF(Ncompartments==4)THEN
  748. ConstitutiveParams(1,1)=0.0E-02_CMISSDP
  749. ConstitutiveParams(1,2)=0.0E-02_CMISSDP
  750. ConstitutiveParams(1,3)=0.0E-02_CMISSDP
  751. ConstitutiveParams(2,1)=0.0E-02_CMISSDP
  752. ConstitutiveParams(2,2)=0.0E-02_CMISSDP
  753. ConstitutiveParams(2,3)=0.0E-02_CMISSDP
  754. ConstitutiveParams(3,1)=0.0E-02_CMISSDP
  755. ConstitutiveParams(3,2)=0.0E-02_CMISSDP
  756. ConstitutiveParams(3,3)=0.0E-02_CMISSDP
  757. ConstitutiveParams(4,1)=0.0E-02_CMISSDP
  758. ConstitutiveParams(4,2)=0.0E-02_CMISSDP
  759. ConstitutiveParams(4,3)=0.0E-02_CMISSDP
  760. ELSE IF(Ncompartments==5)THEN
  761. ConstitutiveParams(1,1)=0.0E-02_CMISSDP
  762. ConstitutiveParams(1,2)=0.0E-02_CMISSDP
  763. ConstitutiveParams(1,3)=0.0E-02_CMISSDP
  764. ConstitutiveParams(2,1)=0.0E-02_CMISSDP
  765. ConstitutiveParams(2,2)=0.0E-02_CMISSDP
  766. ConstitutiveParams(2,3)=0.0E-02_CMISSDP
  767. ConstitutiveParams(3,1)=0.0E-02_CMISSDP
  768. ConstitutiveParams(3,2)=0.0E-02_CMISSDP
  769. ConstitutiveParams(3,3)=0.0E-02_CMISSDP
  770. ConstitutiveParams(4,1)=0.0E-02_CMISSDP
  771. ConstitutiveParams(4,2)=0.0E-02_CMISSDP
  772. ConstitutiveParams(4,3)=0.0E-02_CMISSDP
  773. ConstitutiveParams(5,1)=0.0E-02_CMISSDP
  774. ConstitutiveParams(5,2)=0.0E-02_CMISSDP
  775. ConstitutiveParams(5,3)=0.0E-02_CMISSDP
  776. ELSE
  777. write(*,*) "Can't initialise constitutive parameters array."
  778. ENDIF
  779. !MATERIALS FIELDS
  780. !Auto-created field contains a U variable type to store the diffusion coefficient(s)
  781. !It also contains a V variable type to store the coupling coefficients
  782. DO icompartment = 1,Ncompartments
  783. MaterialsFieldUserNumberDarcy = 400+icompartment
  784. CALL CMISSField_Initialise(MaterialsFieldDarcy(icompartment),Err)
  785. CALL CMISSEquationsSet_MaterialsCreateStart(EquationsSetDarcy(icompartment),MaterialsFieldUserNumberDarcy,&
  786. & MaterialsFieldDarcy(icompartment),Err)
  787. CALL CMISSEquationsSet_MaterialsCreateFinish(EquationsSetDarcy(icompartment),Err)
  788. END DO
  789. DO icompartment = 1,Ncompartments
  790. CALL CMISSField_ComponentValuesInitialise(MaterialsFieldDarcy(icompartment),CMISS_FIELD_U_VARIABLE_TYPE, &
  791. & CMISS_FIELD_VALUES_SET_TYPE, &
  792. & MaterialsFieldUserNumberDarcyPorosity,POROSITY_PARAM_DARCY,Err)
  793. CALL CMISSField_ComponentValuesInitialise(MaterialsFieldDarcy(icompartment),CMISS_FIELD_U_VARIABLE_TYPE, &
  794. & CMISS_FIELD_VALUES_SET_TYPE, &
  795. & MaterialsFieldUserNumberDarcyPermOverVis,PERM_OVER_VIS_PARAM_DARCY,Err)
  796. END DO
  797. DO icompartment = 1, Ncompartments
  798. DO COMPONENT_NUMBER=1, Ncompartments
  799. CALL CMISSField_ComponentValuesInitialise(MaterialsFieldDarcy(icompartment),CMISS_FIELD_V_VARIABLE_TYPE, &
  800. & CMISS_FIELD_VALUES_SET_TYPE,COMPONENT_NUMBER,CouplingCoeffs(icompartment,COMPONENT_NUMBER),Err)
  801. ! CALL CMISSField_ParameterSetUpdateConstant(MaterialsFieldDarcy(icompartment),CMISS_FIELD_V_VARIABLE_TYPE, &
  802. ! & CMISS_FIELD_VALUES_SET_TYPE,COMPONENT_NUMBER,CouplingCoeffs(icompartment,COMPONENT_NUMBER),Err)
  803. END DO
  804. END DO
  805. DO icompartment = 1, Ncompartments
  806. DO COMPONENT_NUMBER=1,Nparams
  807. CALL CMISSField_ComponentValuesInitialise(MaterialsFieldDarcy(icompartment),CMISS_FIELD_U1_VARIABLE_TYPE, &
  808. & CMISS_FIELD_VALUES_SET_TYPE,COMPONENT_NUMBER,ConstitutiveParams(icompartment,COMPONENT_NUMBER),Err)
  809. ! CALL CMISSField_ParameterSetUpdateConstant(MaterialsFieldDarcy(icompartment),CMISS_FIELD_V_VARIABLE_TYPE, &
  810. ! & CMISS_FIELD_VALUES_SET_TYPE,COMPONENT_NUMBER,CouplingCoeffs(icompartment,COMPONENT_NUMBER),Err)
  811. END DO
  812. END DO
  813. !
  814. !================================================================================================================================
  815. !
  816. !EQUATIONS SET EQUATIONS
  817. !Darcy
  818. DO icompartment=1,Ncompartments
  819. !Create the equations set equations
  820. CALL CMISSEquations_Initialise(EquationsDarcy(icompartment),Err)
  821. CALL CMISSEquationsSet_EquationsCreateStart(EquationsSetDarcy(icompartment),EquationsDarcy(icompartment),Err)
  822. !Set the equations matrices sparsity type
  823. CALL CMISSEquations_SparsityTypeSet(EquationsDarcy(icompartment),CMISS_EQUATIONS_SPARSE_MATRICES,Err)
  824. ! !Set the equations lumping type
  825. ! CALL CMISSEquations_LumpingTypeSet(EquationsDarcy,CMISS_EQUATIONS_UNLUMPED_MATRICES,Err)
  826. !Set the equations set output
  827. CALL CMISSEquations_OutputTypeSet(EquationsDarcy(icompartment),EQUATIONS_DARCY_OUTPUT,Err)
  828. !Finish the equations set equations
  829. CALL CMISSEquationsSet_EquationsCreateFinish(EquationsSetDarcy(icompartment),Err)
  830. ENDDO
  831. !Solid
  832. CALL CMISSEquations_Initialise(Equations,Err)
  833. CALL CMISSEquationsSet_EquationsCreateStart(EquationsSetSolid,Equations,Err)
  834. CALL CMISSEquations_SparsityTypeSet(Equations,CMISS_EQUATIONS_SPARSE_MATRICES,Err)
  835. CALL CMISSEquations_OutputTypeSet(Equations,CMISS_EQUATIONS_NO_OUTPUT,Err)
  836. CALL CMISSEquationsSet_EquationsCreateFinish(EquationsSetSolid,Err)
  837. !
  838. !================================================================================================================================
  839. !
  840. !Initialise dependent field from undeformed geometry and displacement bcs and set hydrostatic pressure
  841. CALL CMISSField_ParametersToFieldParametersComponentCopy(GeometricFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE, &
  842. & CMISS_FIELD_VALUES_SET_TYPE, &
  843. & 1,DependentFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,CMISS_FIELD_VALUES_SET_TYPE,1,Err)
  844. CALL CMISSField_ParametersToFieldParametersComponentCopy(GeometricFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE, &
  845. & CMISS_FIELD_VALUES_SET_TYPE, &
  846. & 2,DependentFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,CMISS_FIELD_VALUES_SET_TYPE,2,Err)
  847. CALL CMISSField_ParametersToFieldParametersComponentCopy(GeometricFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE, &
  848. & CMISS_FIELD_VALUES_SET_TYPE, &
  849. & 3,DependentFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,CMISS_FIELD_VALUES_SET_TYPE,3,Err)
  850. ! CALL CMISSField_ComponentValuesInitialise(DependentField,CMISS_FIELD_U_VARIABLE_TYPE,CMISS_FIELD_VALUES_SET_TYPE,4,-14.0_CMISSDP,Err)
  851. CALL CMISSField_ComponentValuesInitialise(DependentFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,CMISS_FIELD_VALUES_SET_TYPE,4, &
  852. & 0.0_CMISSDP,Err)
  853. !
  854. !================================================================================================================================
  855. !
  856. !PROBLEMS
  857. CALL CMISSProblem_Initialise(Problem,Err)
  858. CALL CMISSControlLoop_Initialise(ControlLoop,Err)
  859. CALL CMISSProblem_CreateStart(ProblemUserNumber,Problem,Err)
  860. CALL CMISSProblem_SpecificationSet(Problem,CMISS_PROBLEM_MULTI_PHYSICS_CLASS,CMISS_PROBLEM_FINITE_ELASTICITY_DARCY_TYPE, &
  861. & CMISS_PROBLEM_QUASISTATIC_ELASTICITY_TRANSIENT_DARCY_SUBTYPE,Err)
  862. CALL CMISSProblem_CreateFinish(Problem,Err)
  863. CALL CMISSProblem_ControlLoopCreateStart(Problem,Err)
  864. CALL CMISSProblem_ControlLoopGet(Problem,CMISS_CONTROL_LOOP_NODE,ControlLoop,Err)
  865. ! CALL CMISSControlLoop_MaximumIterationsSet(ControlLoop,2,Err)
  866. CALL CMISSControlLoop_TimesSet(ControlLoop,DYNAMIC_SOLVER_DARCY_START_TIME,DYNAMIC_SOLVER_DARCY_STOP_TIME, &
  867. & DYNAMIC_SOLVER_DARCY_TIME_INCREMENT,Err)
  868. CALL CMISSControlLoop_TimeOutputSet(ControlLoop,DYNAMIC_SOLVER_DARCY_OUTPUT_FREQUENCY,Err)
  869. ! CALL CMISSControlLoop_OutputTypeSet(ControlLoop,CMISS_CONTROL_LOOP_PROGRESS_OUTPUT,Err)
  870. CALL CMISSProblem_ControlLoopCreateFinish(Problem,Err)
  871. !
  872. !================================================================================================================================
  873. !
  874. !Create the problem solvers
  875. CALL CMISSSolver_Initialise(SolverSolid,Err)
  876. CALL CMISSSolver_Initialise(LinearSolverSolid,Err)
  877. CALL CMISSSolver_Initialise(DynamicSolverDarcy,Err)
  878. CALL CMISSSolver_Initialise(LinearSolverDarcy,Err)
  879. CALL CMISSProblem_SolversCreateStart(Problem,Err)
  880. ! Solid
  881. CALL CMISSProblem_SolverGet(Problem,(/ControlLoopSubiterationNumber,ControlLoopSolidNumber,CMISS_CONTROL_LOOP_NODE/), &
  882. & SolverSolidIndex,SolverSolid,Err)
  883. CALL CMISSSolver_OutputTypeSet(SolverSolid,CMISS_SOLVER_PROGRESS_OUTPUT,Err)
  884. ! CALL CMISSSolver_NewtonJacobianCalculationTypeSet(SolverSolid,CMISS_SOLVER_NEWTON_JACOBIAN_FD_CALCULATED,Err)
  885. CALL CMISSSolver_NewtonJacobianCalculationTypeSet(SolverSolid,CMISS_SOLVER_NEWTON_JACOBIAN_EQUATIONS_CALCULATED,Err)
  886. ! CALL CMISSSolverNonLinearTypeSet(SolverSolid,CMISS_SOLVER_NONLINEAR_NEWTON,Err)
  887. ! CALL CMISSSolver_LibraryTypeSet(SolverSolid,CMISS_SOLVER_PETSC_LIBRARY,Err)
  888. CALL CMISSSolver_NewtonAbsoluteToleranceSet(SolverSolid,ABSOLUTE_TOLERANCE,Err)
  889. CALL CMISSSolver_NewtonRelativeToleranceSet(SolverSolid,RELATIVE_TOLERANCE,Err)
  890. CALL CMISSSolver_NewtonMaximumIterationsSet(SolverSolid,MAXIMUM_ITERATIONS,Err)
  891. CALL CMISSSolver_NewtonLinearSolverGet(SolverSolid,LinearSolverSolid,Err)
  892. CALL CMISSSolver_LinearTypeSet(LinearSolverSolid,CMISS_SOLVER_LINEAR_DIRECT_SOLVE_TYPE,Err)
  893. !Get the Darcy solver
  894. CALL CMISSProblem_SolverGet(Problem,(/ControlLoopSubiterationNumber,ControlLoopFluidNumber,CMISS_CONTROL_LOOP_NODE/), &
  895. & SolverDarcyIndex,DynamicSolverDarcy,Err)
  896. !Set the output type
  897. CALL CMISSSolver_OutputTypeSet(DynamicSolverDarcy,DYNAMIC_SOLVER_DARCY_OUTPUT_TYPE,Err)
  898. !Set theta
  899. CALL CMISSSolver_DynamicThetaSet(DynamicSolverDarcy,DYNAMIC_SOLVER_DARCY_THETA,Err)
  900. !CALL CMISSSolverDynamicDynamicSet(DynamicSolverDarcy,.TRUE.,Err)
  901. !Get the dynamic linear solver
  902. CALL CMISSSolver_DynamicLinearSolverGet(DynamicSolverDarcy,LinearSolverDarcy,Err)
  903. !Set the solver settings
  904. IF(LINEAR_SOLVER_DARCY_DIRECT_FLAG) THEN
  905. CALL CMISSSolver_LinearTypeSet(LinearSolverDarcy,CMISS_SOLVER_LINEAR_DIRECT_SOLVE_TYPE,Err)
  906. CALL CMISSSolver_LibraryTypeSet(LinearSolverDarcy,CMISS_SOLVER_MUMPS_LIBRARY,Err)
  907. ELSE
  908. CALL CMISSSolver_LinearTypeSet(LinearSolverDarcy,CMISS_SOLVER_LINEAR_ITERATIVE_SOLVE_TYPE,Err)
  909. CALL CMISSSolver_LinearIterativeMaximumIterationsSet(LinearSolverDarcy,MAXIMUM_ITERATIONS,Err)
  910. CALL CMISSSolver_LinearIterativeDivergenceToleranceSet(LinearSolverDarcy,DIVERGENCE_TOLERANCE,Err)
  911. CALL CMISSSolver_LinearIterativeRelativeToleranceSet(LinearSolverDarcy,RELATIVE_TOLERANCE,Err)
  912. CALL CMISSSolver_LinearIterativeAbsoluteToleranceSet(LinearSolverDarcy,ABSOLUTE_TOLERANCE,Err)
  913. CALL CMISSSolver_LinearIterativeGMRESRestartSet(LinearSolverDarcy,RESTART_VALUE,Err)
  914. ENDIF
  915. !Finish the creation of the problem solver
  916. CALL CMISSProblem_SolversCreateFinish(Problem,Err)
  917. !
  918. !================================================================================================================================
  919. !
  920. !SOLVER EQUATIONS
  921. !Start the creation of the problem solver equations
  922. CALL CMISSSolver_Initialise(SolverSolid,Err)
  923. CALL CMISSSolver_Initialise(LinearSolverDarcy,Err)
  924. CALL CMISSSolverEquations_Initialise(SolverEquationsSolid,Err)
  925. CALL CMISSSolverEquations_Initialise(SolverEquationsDarcy,Err)
  926. CALL CMISSProblem_SolverEquationsCreateStart(Problem,Err)
  927. !
  928. !Get the finite elasticity solver equations
  929. CALL CMISSProblem_SolverGet(Problem,(/ControlLoopSubiterationNumber,ControlLoopSolidNumber,CMISS_CONTROL_LOOP_NODE/), &
  930. & SolverSolidIndex,SolverSolid,Err)
  931. CALL CMISSSolver_SolverEquationsGet(SolverSolid,SolverEquationsSolid,Err)
  932. CALL CMISSSolverEquations_SparsityTypeSet(SolverEquationsSolid,CMISS_SOLVER_SPARSE_MATRICES,Err)
  933. CALL CMISSSolverEquations_EquationsSetAdd(SolverEquationsSolid,EquationsSetSolid,EquationsSetIndex,Err)
  934. !
  935. !Get the Darcy solver equations
  936. CALL CMISSProblem_SolverGet(Problem,(/ControlLoopSubiterationNumber,ControlLoopFluidNumber,CMISS_CONTROL_LOOP_NODE/), &
  937. & SolverDarcyIndex,LinearSolverDarcy,Err)
  938. CALL CMISSSolver_SolverEquationsGet(LinearSolverDarcy,SolverEquationsDarcy,Err)
  939. CALL CMISSSolverEquations_SparsityTypeSet(SolverEquationsDarcy,CMISS_SOLVER_SPARSE_MATRICES,Err)
  940. DO icompartment=1,Ncompartments
  941. CALL CMISSSolverEquations_EquationsSetAdd(SolverEquationsDarcy,EquationsSetDarcy(icompartment),EquationsSetIndex,Err)
  942. ENDDO
  943. !
  944. !Finish the creation of the problem solver equations
  945. CALL CMISSProblem_SolverEquationsCreateFinish(Problem,Err)
  946. !Prescribe boundary conditions (absolute nodal parameters)
  947. CALL CMISSBoundaryConditions_Initialise(BoundaryConditions,Err)
  948. CALL CMISSSolverEquations_BoundaryConditionsCreateStart(SolverEquationsSolid,BoundaryConditions,Err)
  949. !Grab the list of nodes on inner, outer and top surfaces
  950. CALL CMISSGeneratedMesh_SurfaceGet(GeneratedMesh,CMISS_GENERATED_MESH_ELLIPSOID_TOP_SURFACE,TopSurfaceNodes,TopNormalXi,Err)
  951. CALL CMISSGeneratedMesh_SurfaceGet(GeneratedMesh,CMISS_GENERATED_MESH_ELLIPSOID_INNER_SURFACE,InnerSurfaceNodes,InnerNormalXi,Err)
  952. CALL CMISSGeneratedMesh_SurfaceGet(GeneratedMesh,CMISS_GENERATED_MESH_ELLIPSOID_OUTER_SURFACE,OuterSurfaceNodes,OuterNormalXi,Err)
  953. write(*,*)'TopSurfaceNodes = ',TopSurfaceNodes
  954. ! ASSIGN BOUNDARY CONDITIONS
  955. !Fix base of the ellipsoid in z direction
  956. DO NN=1,SIZE(TopSurfaceNodes,1)
  957. NODE=TopSurfaceNodes(NN)
  958. CALL CMISSDecomposition_NodeDomainGet(Decomposition,NODE,1,NodeDomain,Err)
  959. IF(NodeDomain==ComputationalNodeNumber) THEN
  960. CALL CMISSField_ParameterSetGetNode(GeometricFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,CMISS_FIELD_VALUES_SET_TYPE,1,1,NODE,3, &
  961. & ZCoord,Err)
  962. CALL CMISSBoundaryConditions_SetNode(BoundaryConditions,DependentFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,1,1,NODE,3, &
  963. & CMISS_BOUNDARY_CONDITION_FIXED,ZCoord,Err)
  964. ENDIF
  965. ENDDO
  966. !Apply inner surface pressure
  967. !NOTE: Surface pressure goes into pressure_values_set_type of the DELUDELN type
  968. DO NN=1,SIZE(InnerSurfaceNodes,1)
  969. NODE=InnerSurfaceNodes(NN)
  970. CALL CMISSDecomposition_NodeDomainGet(Decomposition,NODE,1,NodeDomain,Err)
  971. IF(NodeDomain==ComputationalNodeNumber) THEN
  972. CALL CMISSBoundaryConditions_SetNode(BoundaryConditions,DependentFieldSolid,CMISS_FIELD_DELUDELN_VARIABLE_TYPE,1,1,NODE, &
  973. & ABS(InnerNormalXi), &
  974. & CMISS_BOUNDARY_CONDITION_PRESSURE,INNER_PRESSURE,Err)
  975. ENDIF
  976. ENDDO
  977. !Apply outer surface pressure
  978. DO NN=1,SIZE(OuterSurfaceNodes,1)
  979. NODE=OuterSurfaceNodes(NN)
  980. CALL CMISSDecomposition_NodeDomainGet(Decomposition,NODE,1,NodeDomain,Err)
  981. IF(NodeDomain==ComputationalNodeNumber) THEN
  982. CALL CMISSBoundaryConditions_SetNode(BoundaryConditions,DependentFieldSolid,CMISS_FIELD_DELUDELN_VARIABLE_TYPE,1,1,NODE, &
  983. & ABS(OuterNormalXi), &
  984. & CMISS_BOUNDARY_CONDITION_PRESSURE,OUTER_PRESSURE,Err)
  985. ENDIF
  986. ENDDO
  987. !Fix more nodes at the base to stop free body motion
  988. X_FIXED=.FALSE.
  989. Y_FIXED=.FALSE.
  990. DO NN=1,SIZE(TopSurfaceNodes,1)
  991. NODE=TopSurfaceNodes(NN)
  992. CALL CMISSDecomposition_NodeDomainGet(Decomposition,NODE,1,NodeDomain,Err)
  993. IF(NodeDomain==ComputationalNodeNumber) THEN
  994. CALL CMISSField_ParameterSetGetNode(GeometricFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,CMISS_FIELD_VALUES_SET_TYPE,1,1,NODE,1, &
  995. & XCoord,Err)
  996. CALL CMISSField_ParameterSetGetNode(GeometricFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,CMISS_FIELD_VALUES_SET_TYPE,1,1,NODE,2, &
  997. & YCoord,Err)
  998. IF(ABS(XCoord)<1.0E-6_CMISSDP) THEN
  999. CALL CMISSBoundaryConditions_SetNode(BoundaryConditions,DependentFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,1,1,NODE,1, &
  1000. & CMISS_BOUNDARY_CONDITION_FIXED,XCoord,Err)
  1001. WRITE(*,*) "FIXING NODE",NODE,"IN X DIRECTION"
  1002. X_FIXED=.TRUE.
  1003. ENDIF
  1004. IF(ABS(YCoord)<1.0E-6_CMISSDP) THEN
  1005. CALL CMISSBoundaryConditions_SetNode(BoundaryConditions,DependentFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,1,1,NODE,2, &
  1006. & CMISS_BOUNDARY_CONDITION_FIXED,YCoord,Err)
  1007. WRITE(*,*) "FIXING NODE",NODE,"IN Y DIRECTION"
  1008. Y_FIXED=.TRUE.
  1009. ENDIF
  1010. ENDIF
  1011. ENDDO
  1012. CALL MPI_REDUCE(X_FIXED,X_OKAY,1,MPI_LOGICAL,MPI_LOR,0,MPI_COMM_WORLD,MPI_IERROR)
  1013. CALL MPI_REDUCE(Y_FIXED,Y_OKAY,1,MPI_LOGICAL,MPI_LOR,0,MPI_COMM_WORLD,MPI_IERROR)
  1014. IF(ComputationalNodeNumber==0) THEN
  1015. IF(.NOT.(X_OKAY.AND.Y_OKAY)) THEN
  1016. WRITE(*,*) "Free body motion could not be prevented!"
  1017. CALL CMISSFinalise(Err)
  1018. STOP
  1019. ENDIF
  1020. ENDIF
  1021. CALL CMISSSolverEquations_BoundaryConditionsCreateFinish(SolverEquationsSolid,Err)
  1022. !
  1023. !================================================================================================================================
  1024. !
  1025. !BCs Darcy
  1026. CALL CMISSBoundaryConditions_Initialise(BoundaryConditionsDarcy,Err)
  1027. CALL CMISSSolverEquations_BoundaryConditionsCreateStart(SolverEquationsDarcy,BoundaryConditionsDarcy,Err)
  1028. DO icompartment=1,Ncompartments
  1029. !In 'generated_mesh_routines.f90/GENERATED_MESH_ELLIPSOID_SURFACE_GET' there is a bug:
  1030. ! BASIS=>ELLIPSOID_MESH%BASES(MESH_COMPONENT)%PTR does not account for the fact that:
  1031. ! in 'generated_mesh_routines.f90/GENERATED_MESH_ELLIPSOID_CREATE_FINISH' the following is done:
  1032. ! CALL MESH_NUMBER_OF_COMPONENTS_SET(GENERATED_MESH%MESH,SIZE(ELLIPSOID_MESH%BASES)/2,ERR,ERROR,*999)
  1033. !Temporary work around, until bug fix:
  1034. !MeshComponentNumber_dummy = DarcyVelMeshComponentNumber
  1035. MeshComponentNumber_dummy = 3
  1036. ! !inner surface
  1037. ! CALL CMISSGeneratedMesh_SurfaceGet(GeneratedMesh,MeshComponentNumber_dummy,CMISS_GENERATED_MESH_ELLIPSOID_INNER_SURFACE, &
  1038. ! & InnerSurfaceNodesDarcyVel,InnerNormalXi,Err)
  1039. !
  1040. ! write(*,*)'InnerSurfaceNodesDarcyVel = ',InnerSurfaceNodesDarcyVel
  1041. !
  1042. ! !Set all inner surface nodes impermeable
  1043. ! DO NN=1,SIZE(InnerSurfaceNodesDarcyVel,1)
  1044. ! ! VALUE = 0.0_CMISSDP
  1045. ! ! COMPONENT_NUMBER = 1
  1046. ! ! CALL CMISSBoundaryConditions_SetNode(BoundaryConditionsDarcy,DependentFieldSolid,CMISS_FIELD_V_VARIABLE_TYPE,1,InnerSurfaceNodesDarcyVel(NN), &
  1047. ! ! & COMPONENT_NUMBER,CMISS_BOUNDARY_CONDITION_FIXED,VALUE,Err)
  1048. ! ! IF(Err/=0) WRITE(*,*) "ERROR WHILE ASSIGNING INNER DARCY BC TO NODE", InnerSurfaceNodesDarcyVel(NN)
  1049. ! !
  1050. ! ! VALUE = 0.0_CMISSDP
  1051. ! ! COMPONENT_NUMBER = 2
  1052. ! ! CALL CMISSBoundaryConditions_SetNode(BoundaryConditionsDarcy,DependentFieldSolid,CMISS_FIELD_V_VARIABLE_TYPE,1,InnerSurfaceNodesDarcyVel(NN), &
  1053. ! ! & COMPONENT_NUMBER,CMISS_BOUNDARY_CONDITION_FIXED,VALUE,Err)
  1054. ! ! IF(Err/=0) WRITE(*,*) "ERROR WHILE ASSIGNING INNER DARCY BC TO NODE", InnerSurfaceNodesDarcyVel(NN)
  1055. ! !
  1056. ! VALUE = 0.0_CMISSDP
  1057. ! COMPONENT_NUMBER = 3
  1058. ! ! CALL CMISSBoundaryConditions_SetNode(BoundaryConditionsDarcy,DependentFieldSolid,CMISS_FIELD_V_VARIABLE_TYPE,1,InnerSurfaceNodesDarcyVel(NN), &
  1059. ! ! & COMPONENT_NUMBER,CMISS_BOUNDARY_CONDITION_FIXED,VALUE,Err)
  1060. ! CALL CMISSBoundaryConditions_SetNode(BoundaryConditionsDarcy,DependentFieldSolid,CMISS_FIELD_V_VARIABLE_TYPE,1,InnerSurfaceNodesDarcyVel(NN), &
  1061. ! & COMPONENT_NUMBER,CMISS_BOUNDARY_CONDITION_IMPERMEABLE_WALL,VALUE,Err)
  1062. ! IF(Err/=0) WRITE(*,*) "ERROR WHILE ASSIGNING INNER DARCY BC TO NODE", InnerSurfaceNodesDarcyVel(NN)
  1063. ! ENDDO
  1064. ! !outer surface
  1065. ! CALL CMISSGeneratedMesh_SurfaceGet(GeneratedMesh,MeshComponentNumber_dummy,CMISS_GENERATED_MESH_ELLIPSOID_OUTER_SURFACE, &
  1066. ! & OuterSurfaceNodesDarcyVel,OuterNormalXi,Err)
  1067. !
  1068. ! write(*,*)'OuterSurfaceNodesDarcyVel = ',OuterSurfaceNodesDarcyVel
  1069. !
  1070. ! !Set all outer surface nodes impermeable
  1071. ! DO NN=1,SIZE(OuterSurfaceNodesDarcyVel,1)
  1072. ! VALUE = 0.0_CMISSDP
  1073. ! COMPONENT_NUMBER = 1
  1074. ! CALL CMISSBoundaryConditions_SetNode(BoundaryConditionsDarcy,DependentFieldSolid,CMISS_FIELD_V_VARIABLE_TYPE,1,OuterSurfaceNodesDarcyVel(NN), &
  1075. ! & COMPONENT_NUMBER,CMISS_BOUNDARY_CONDITION_FIXED,VALUE,Err)
  1076. ! IF(Err/=0) WRITE(*,*) "ERROR WHILE ASSIGNING OUTER DARCY BC TO NODE", OuterSurfaceNodesDarcyVel(NN)
  1077. !
  1078. ! VALUE = 0.0_CMISSDP
  1079. ! COMPONENT_NUMBER = 2
  1080. ! CALL CMISSBoundaryConditions_SetNode(BoundaryConditionsDarcy,DependentFieldSolid,CMISS_FIELD_V_VARIABLE_TYPE,1,OuterSurfaceNodesDarcyVel(NN), &
  1081. ! & COMPONENT_NUMBER,CMISS_BOUNDARY_CONDITION_FIXED,VALUE,Err)
  1082. ! IF(Err/=0) WRITE(*,*) "ERROR WHILE ASSIGNING OUTER DARCY BC TO NODE", OuterSurfaceNodesDarcyVel(NN)
  1083. !
  1084. ! VALUE = 0.0_CMISSDP
  1085. ! COMPONENT_NUMBER = 3
  1086. ! CALL CMISSBoundaryConditions_SetNode(BoundaryConditionsDarcy,DependentFieldSolid,CMISS_FIELD_V_VARIABLE_TYPE,1,OuterSurfaceNodesDarcyVel(NN), &
  1087. ! & COMPONENT_NUMBER,CMISS_BOUNDARY_CONDITION_FIXED,VALUE,Err)
  1088. ! IF(Err/=0) WRITE(*,*) "ERROR WHILE ASSIGNING OUTER DARCY BC TO NODE", OuterSurfaceNodesDarcyVel(NN)
  1089. ! ENDDO
  1090. !top surface
  1091. CALL CMISSGeneratedMesh_SurfaceGet(GeneratedMesh,MeshComponentNumber_dummy,CMISS_GENERATED_MESH_ELLIPSOID_TOP_SURFACE, &
  1092. & TopSurfaceNodesDarcyVel,TopNormalXi,Err)
  1093. IF(icompartment==1) THEN
  1094. write(*,*)'TopSurfaceNodesDarcyVel = ',TopSurfaceNodesDarcyVel
  1095. !Set all top surface nodes to Darcy inflow BC
  1096. DO NN=1,SIZE(TopSurfaceNodesDarcyVel,1)
  1097. VALUE = -0.25_CMISSDP
  1098. COMPONENT_NUMBER = 3
  1099. CALL CMISSBoundaryConditions_SetNode(BoundaryConditionsDarcy,DependentFieldSolid,CMISS_FIELD_V_VARIABLE_TYPE,1,1, &
  1100. & TopSurfaceNodesDarcyVel(NN), &
  1101. & COMPONENT_NUMBER,CMISS_BOUNDARY_CONDITION_FIXED,VALUE,Err)
  1102. IF(Err/=0) WRITE(*,*) "ERROR WHILE ASSIGNING TOP DARCY BC TO NODE", TopSurfaceNodesDarcyVel(NN)
  1103. ENDDO
  1104. ELSEIF(icompartment==2)THEN
  1105. !Set all top surface nodes to Darcy inflow BC
  1106. DO NN=1,SIZE(TopSurfaceNodesDarcyVel,1)
  1107. VALUE = -0.25_CMISSDP
  1108. COMPONENT_NUMBER = 3
  1109. CALL CMISSBoundaryConditions_SetNode(BoundaryConditionsDarcy,DependentFieldSolid,CMISS_FIELD_U1_VARIABLE_TYPE,1,1, &
  1110. & TopSurfaceNodesDarcyVel(NN), &
  1111. & COMPONENT_NUMBER,CMISS_BOUNDARY_CONDITION_FIXED,VALUE,Err)
  1112. IF(Err/=0) WRITE(*,*) "ERROR WHILE ASSIGNING TOP DARCY BC TO NODE", TopSurfaceNodesDarcyVel(NN)
  1113. ENDDO
  1114. ELSEIF(icompartment==3)THEN
  1115. !Set all top surface nodes to Darcy inflow BC
  1116. DO NN=1,SIZE(TopSurfaceNodesDarcyVel,1)
  1117. VALUE = -0.25_CMISSDP
  1118. COMPONENT_NUMBER = 3
  1119. CALL CMISSBoundaryConditions_SetNode(BoundaryConditionsDarcy,DependentFieldSolid,CMISS_FIELD_U2_VARIABLE_TYPE,1,1, &
  1120. & TopSurfaceNodesDarcyVel(NN), &
  1121. & COMPONENT_NUMBER,CMISS_BOUNDARY_CONDITION_FIXED,VALUE,Err)
  1122. IF(Err/=0) WRITE(*,*) "ERROR WHILE ASSIGNING TOP DARCY BC TO NODE", TopSurfaceNodesDarcyVel(NN)
  1123. ENDDO
  1124. ELSEIF(icompartment==4)THEN
  1125. !Set all top surface nodes to Darcy inflow BC
  1126. DO NN=1,SIZE(TopSurfaceNodesDarcyVel,1)
  1127. VALUE = -0.25_CMISSDP
  1128. COMPONENT_NUMBER = 3
  1129. CALL CMISSBoundaryConditions_SetNode(BoundaryConditionsDarcy,DependentFieldSolid,CMISS_FIELD_U3_VARIABLE_TYPE,1,1, &
  1130. & TopSurfaceNodesDarcyVel(NN), &
  1131. & COMPONENT_NUMBER,CMISS_BOUNDARY_CONDITION_FIXED,VALUE,Err)
  1132. IF(Err/=0) WRITE(*,*) "ERROR WHILE ASSIGNING TOP DARCY BC TO NODE", TopSurfaceNodesDarcyVel(NN)
  1133. ENDDO
  1134. ENDIF
  1135. ENDDO
  1136. CALL CMISSSolverEquations_BoundaryConditionsCreateFinish(SolverEquationsDarcy,Err)
  1137. !
  1138. !================================================================================================================================
  1139. !
  1140. !Solve problem
  1141. WRITE(*,'(A)') "Solving problem..."
  1142. CALL CMISSProblem_Solve(Problem,Err)
  1143. WRITE(*,'(A)') "Problem solved!"
  1144. !
  1145. !================================================================================================================================
  1146. !
  1147. !Output solution
  1148. ! CALL CMISSFields_Initialise(Fields,Err)
  1149. ! CALL CMISSFields_Create(Region,Fields,Err)
  1150. ! CALL CMISSFields_NodesExport(Fields,"QuadraticEllipsoidDrivenMultiCompDarcy","FORTRAN",Err)
  1151. ! CALL CMISSFields_ElementsExport(Fields,"QuadraticEllipsoidDrivenMultiCompDarcy","FORTRAN",Err)
  1152. ! CALL CMISSFields_Finalise(Fields,Err)
  1153. !
  1154. !================================================================================================================================
  1155. !
  1156. CALL CMISSFinalise(Err)
  1157. IF (ALLOCATED(EquationsSetFieldDarcy)) DEALLOCATE(EquationsSetFieldDarcy)
  1158. IF (ALLOCATED(EquationsSetDarcy)) DEALLOCATE(EquationsSetDarcy)
  1159. IF (ALLOCATED(MaterialsFieldDarcy)) DEALLOCATE(MaterialsFieldDarcy)
  1160. IF (ALLOCATED(BoundaryConditionsDarcy)) DEALLOCATE(BoundaryConditionsDarcy)
  1161. IF (ALLOCATED(EquationsDarcy)) DEALLOCATE(EquationsDarcy)
  1162. WRITE(*,'(A)') "Program successfully completed."
  1163. STOP
  1164. END PROGRAM QUADRATICELLIPSOIDDRIVENMULTICOMPDARCYEXAMPLE