PageRenderTime 60ms CodeModel.GetById 16ms RepoModel.GetById 0ms app.codeStats 0ms

/MultiPhysics/Poroelasticity/FiniteElasticityDarcy/IncompressibleElasticityDrivenMultiCompDarcy/src/IncompressibleElasticityDrivenMultiCompDarcyExample.f90

http://github.com/xyan075/examples
FORTRAN Modern | 1658 lines | 896 code | 202 blank | 560 comment | 0 complexity | be21c1a47c3d354ec4cf4a3847da36e9 MD5 | raw file
  1. !> \file
  2. !> \author Christian Michler, Adam Reeve, Andrew Cookson
  3. !> \brief This is an example program to solve a coupled Finite Elastiticity Darcy equation 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):
  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/IncompressibleElasticityDrivenDarcy/src/IncompressibleElasticityDrivenDarcyExample.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/IncompressibleElasticityDrivenDarcy/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/IncompressibleElasticityDrivenDarcy/build-intel'>Linux GNU Build</a>
  46. !!
  47. !<
  48. ! !
  49. ! ! This example considers a coupled Finite Elasticity Multi-Compartment Darcy problem
  50. ! !
  51. !> Main program
  52. PROGRAM FINITEELASTICITYMULTICOMPDARCYEXAMPLE
  53. !
  54. !================================================================================================================================
  55. !
  56. !PROGRAM LIBRARIES
  57. USE OPENCMISS
  58. USE FLUID_MECHANICS_IO_ROUTINES
  59. USE MPI
  60. #ifdef WIN32
  61. USE IFQWINCMISS
  62. #endif
  63. !
  64. !================================================================================================================================
  65. !
  66. !PROGRAM VARIABLES AND TYPES
  67. IMPLICIT NONE
  68. !Test program parameters
  69. REAL(CMISSDP), PARAMETER :: Y_DIM=1.0_CMISSDP
  70. REAL(CMISSDP), PARAMETER :: X_DIM=1.0_CMISSDP
  71. REAL(CMISSDP), PARAMETER :: Z_DIM=3.0_CMISSDP
  72. INTEGER(CMISSIntg), PARAMETER :: LinearBasisUserNumber=1
  73. INTEGER(CMISSIntg), PARAMETER :: QuadraticBasisUserNumber=2
  74. INTEGER(CMISSIntg), PARAMETER :: CubicBasisUserNumber=3
  75. INTEGER(CMISSIntg), PARAMETER :: CoordinateSystemUserNumber=1
  76. INTEGER(CMISSIntg), PARAMETER :: RegionUserNumber=2
  77. INTEGER(CMISSIntg), PARAMETER :: MeshUserNumber=3
  78. INTEGER(CMISSIntg), PARAMETER :: DecompositionUserNumber=4
  79. INTEGER(CMISSIntg), PARAMETER :: GeometricFieldUserNumber=5
  80. INTEGER(CMISSIntg), PARAMETER :: DependentFieldUserNumberDarcy=6
  81. INTEGER(CMISSIntg) :: MaterialsFieldUserNumberDarcy
  82. INTEGER(CMISSIntg) :: EquationsSetUserNumberDarcy
  83. INTEGER(CMISSIntg), PARAMETER :: ProblemUserNumber=14
  84. INTEGER(CMISSIntg) :: EquationsSetFieldUserNumberDarcy
  85. INTEGER(CMISSIntg) :: icompartment,Ncompartments,num_var,componentnum,Nparams
  86. INTEGER(CMISSIntg), PARAMETER :: ControlLoopSolidNumber=1
  87. INTEGER(CMISSIntg), PARAMETER :: ControlLoopFluidNumber=2
  88. INTEGER(CMISSIntg), PARAMETER :: ControlLoopSubiterationNumber=1
  89. INTEGER(CMISSIntg), PARAMETER :: SolverSolidIndex=1
  90. INTEGER(CMISSIntg), PARAMETER :: SolverDarcyIndex=1
  91. INTEGER(CMISSIntg), PARAMETER :: MaterialsFieldUserNumberDarcyPorosity=1
  92. INTEGER(CMISSIntg), PARAMETER :: MaterialsFieldUserNumberDarcyPermOverVis=2
  93. INTEGER(CMISSIntg) :: SourceFieldDarcyUserNumber
  94. INTEGER(CMISSIntg), PARAMETER :: FieldGeometryNumberOfVariables=1
  95. INTEGER(CMISSIntg), PARAMETER :: FieldGeometryNumberOfComponents=3
  96. INTEGER(CMISSIntg) :: IndependentFieldDarcyUserNumber
  97. !Program types
  98. INTEGER(CMISSIntg) :: NUMBER_GLOBAL_X_ELEMENTS,NUMBER_GLOBAL_Y_ELEMENTS,NUMBER_GLOBAL_Z_ELEMENTS
  99. ! INTEGER(CMISSIntg) :: MPI_IERROR
  100. INTEGER(CMISSIntg) :: NumberOfComputationalNodes,NumberOfDomains,ComputationalNodeNumber
  101. TYPE(EXPORT_CONTAINER):: CM
  102. !Program variables
  103. INTEGER(CMISSIntg) :: NUMBER_OF_DIMENSIONS
  104. INTEGER(CMISSIntg) :: MAXIMUM_ITERATIONS
  105. INTEGER(CMISSIntg) :: RESTART_VALUE
  106. INTEGER(CMISSIntg) :: EQUATIONS_DARCY_OUTPUT
  107. INTEGER(CMISSIntg) :: COMPONENT_NUMBER
  108. INTEGER(CMISSIntg) :: NODE_NUMBER
  109. INTEGER(CMISSIntg) :: ELEMENT_NUMBER
  110. INTEGER(CMISSIntg) :: CONDITION
  111. INTEGER(CMISSIntg) :: DYNAMIC_SOLVER_DARCY_OUTPUT_FREQUENCY
  112. INTEGER(CMISSIntg) :: DYNAMIC_SOLVER_DARCY_OUTPUT_TYPE
  113. INTEGER(CMISSIntg) :: LINEAR_SOLVER_DARCY_OUTPUT_TYPE
  114. REAL(CMISSDP) :: COORD_X, COORD_Y, COORD_Z
  115. REAL(CMISSDP) :: DOMAIN_X1, DOMAIN_X2, DOMAIN_Y1, DOMAIN_Y2, DOMAIN_Z1, DOMAIN_Z2
  116. REAL(CMISSDP) :: GEOMETRY_TOLERANCE
  117. INTEGER(CMISSIntg) :: BASIS_XI_INTERPOLATION_SOLID
  118. REAL(CMISSDP) :: INITIAL_FIELD_DARCY(4)
  119. REAL(CMISSDP) :: INITIAL_FIELD_SOLID(4)
  120. REAL(CMISSDP) :: DIVERGENCE_TOLERANCE
  121. REAL(CMISSDP) :: RELATIVE_TOLERANCE
  122. REAL(CMISSDP) :: ABSOLUTE_TOLERANCE
  123. REAL(CMISSDP) :: LINESEARCH_ALPHA
  124. REAL(CMISSDP) :: VALUE
  125. REAL(CMISSDP) :: POROSITY_PARAM_DARCY, PERM_OVER_VIS_PARAM_DARCY
  126. LOGICAL :: EXPORT_FIELD_IO
  127. LOGICAL :: LINEAR_SOLVER_DARCY_DIRECT_FLAG
  128. !CMISS variables
  129. !Regions
  130. TYPE(CMISSRegionType) :: Region
  131. TYPE(CMISSRegionType) :: WorldRegion
  132. !Coordinate systems
  133. TYPE(CMISSCoordinateSystemType) :: CoordinateSystem
  134. TYPE(CMISSCoordinateSystemType) :: WorldCoordinateSystem
  135. !Basis
  136. TYPE(CMISSBasisType) :: CubicBasis, QuadraticBasis, LinearBasis, Bases(2)
  137. !Meshes
  138. TYPE(CMISSMeshType) :: Mesh
  139. TYPE(CMISSGeneratedMeshType) :: GeneratedMesh
  140. !Decompositions
  141. TYPE(CMISSDecompositionType) :: Decomposition
  142. !Fields
  143. TYPE(CMISSFieldsType) :: Fields
  144. !Field types
  145. TYPE(CMISSFieldType) :: GeometricField
  146. TYPE(CMISSFieldType), ALLOCATABLE, DIMENSION(:) :: MaterialsFieldDarcy
  147. TYPE(CMISSFieldType), ALLOCATABLE, DIMENSION(:) :: EquationsSetFieldDarcy
  148. TYPE(CMISSFieldType), ALLOCATABLE, DIMENSION(:) :: SourceFieldDarcy
  149. TYPE(CMISSFieldType), ALLOCATABLE, DIMENSION(:) :: IndependentFieldDarcy
  150. !Boundary conditions
  151. TYPE(CMISSBoundaryConditionsType) :: BoundaryConditionsDarcy
  152. !Equations sets
  153. TYPE(CMISSEquationsSetType), ALLOCATABLE, DIMENSION(:) :: EquationsSetDarcy
  154. !Equations
  155. TYPE(CMISSEquationsType), ALLOCATABLE, DIMENSION(:) :: EquationsDarcy
  156. !Problems
  157. TYPE(CMISSProblemType) :: Problem
  158. !Control loops
  159. TYPE(CMISSControlLoopType) :: ControlLoop
  160. !Solvers
  161. TYPE(CMISSSolverType) :: DynamicSolverDarcy
  162. TYPE(CMISSSolverType) :: LinearSolverDarcy
  163. ! TYPE(CMISSSolverType) :: LinearSolverSolid
  164. !Solver equations
  165. TYPE(CMISSSolverEquationsType) :: SolverEquationsDarcy
  166. !Other variables
  167. INTEGER(CMISSIntg),ALLOCATABLE,TARGET :: Face1Nodes(:),Face2Nodes(:)
  168. INTEGER(CMISSIntg),ALLOCATABLE,TARGET :: Face3Nodes(:),Face4Nodes(:)
  169. INTEGER(CMISSIntg),ALLOCATABLE,TARGET :: Face5Nodes(:),Face6Nodes(:)
  170. INTEGER(CMISSIntg),ALLOCATABLE,TARGET :: Face7Nodes(:),Face8Nodes(:)
  171. INTEGER(CMISSIntg),ALLOCATABLE,TARGET :: Face9Nodes(:),Face10Nodes(:)
  172. INTEGER(CMISSIntg),ALLOCATABLE,TARGET :: Face11Nodes(:),Face12Nodes(:)
  173. INTEGER(CMISSIntg) :: FaceXi(6)
  174. INTEGER(CMISSIntg) :: NN,NODE,NodeDomain
  175. REAL(CMISSDP) :: XCoord,YCoord,ZCoord
  176. LOGICAL :: X_FIXED,Y_FIXED !,X_OKAY,Y_OKAY
  177. #ifdef WIN32
  178. !Quickwin type
  179. LOGICAL :: QUICKWIN_STATUS=.FALSE.
  180. TYPE(WINDOWCONFIG) :: QUICKWIN_WINDOW_CONFIG
  181. #endif
  182. !Generic CMISS variables
  183. INTEGER(CMISSIntg) :: EquationsSetIndex
  184. INTEGER(CMISSIntg) :: Err
  185. !Array containing the field variable types that will be used (for ease of incorporating inside a loop)
  186. INTEGER(CMISSIntg), ALLOCATABLE, DIMENSION(:) :: VariableTypes
  187. REAL(CMISSDP), ALLOCATABLE, DIMENSION(:,:) :: CouplingCoeffs,ConstitutiveParams
  188. INTEGER(CMISSIntg) :: DIAG_LEVEL_LIST(5)
  189. ! CHARACTER(LEN=255) :: DIAG_ROUTINE_LIST(8) !,TIMING_ROUTINE_LIST(1)
  190. CHARACTER(LEN=255) :: DIAG_ROUTINE_LIST(1) !,TIMING_ROUTINE_LIST(1)
  191. !
  192. !--------------------------------------------------------------------------------------------------------------------------------
  193. !
  194. !Program variables and types (finite elasticity part)
  195. !Test program parameters
  196. INTEGER(CMISSIntg) :: SolidMeshComponenetNumber
  197. INTEGER(CMISSIntg), PARAMETER :: FieldGeometrySolidUserNumber=51
  198. INTEGER(CMISSIntg), PARAMETER :: FieldGeometrySolidNumberOfVariables=1
  199. INTEGER(CMISSIntg), PARAMETER :: FieldGeometrySolidNumberOfComponents=3
  200. INTEGER(CMISSIntg), PARAMETER :: FieldFibreSolidUserNumber=52
  201. INTEGER(CMISSIntg), PARAMETER :: FieldFibreSolidNumberOfVariables=1
  202. INTEGER(CMISSIntg), PARAMETER :: FieldFibreSolidNumberOfComponents=3
  203. INTEGER(CMISSIntg), PARAMETER :: FieldMaterialSolidUserNumber=53
  204. INTEGER(CMISSIntg), PARAMETER :: FieldMaterialSolidNumberOfVariables=1
  205. INTEGER(CMISSIntg), PARAMETER :: FieldMaterialSolidNumberOfComponents=3
  206. INTEGER(CMISSIntg), PARAMETER :: FieldDependentSolidUserNumber=54
  207. INTEGER(CMISSIntg) :: FieldDependentSolidNumberOfVariables
  208. INTEGER(CMISSIntg), PARAMETER :: FieldDependentSolidNumberOfComponents=4
  209. INTEGER(CMISSIntg), PARAMETER :: FieldDependentFluidNumberOfComponents=4 !(u,v,w,m)
  210. INTEGER(CMISSIntg), PARAMETER :: EquationSetSolidUserNumber=55
  211. INTEGER(CMISSIntg), PARAMETER :: EquationsSetFieldSolidUserNumber=25
  212. INTEGER(CMISSIntg), PARAMETER :: SolidDisplMeshComponentNumber=1
  213. INTEGER(CMISSIntg), PARAMETER :: SolidLagrMultMeshComponentNumber=2
  214. INTEGER(CMISSIntg), PARAMETER :: SolidGeometryMeshComponentNumber=SolidDisplMeshComponentNumber
  215. INTEGER(CMISSIntg), PARAMETER :: DarcyVelMeshComponentNumber=SolidLagrMultMeshComponentNumber
  216. INTEGER(CMISSIntg), PARAMETER :: DarcyMassIncreaseMeshComponentNumber=SolidLagrMultMeshComponentNumber
  217. ! INTEGER(CMISSIntg), PARAMETER :: DarcyGeometryMeshComponentNumber=SolidDisplMeshComponentNumber
  218. INTEGER(CMISSIntg), PARAMETER :: GeneratedMeshUserNumber=32
  219. !Program types
  220. !Program variables
  221. REAL(CMISSDP) :: DYNAMIC_SOLVER_DARCY_START_TIME
  222. REAL(CMISSDP) :: DYNAMIC_SOLVER_DARCY_STOP_TIME
  223. REAL(CMISSDP) :: DYNAMIC_SOLVER_DARCY_THETA
  224. REAL(CMISSDP) :: DYNAMIC_SOLVER_DARCY_TIME_INCREMENT
  225. !CMISS variables
  226. ! TYPE(CMISSBasisType) :: BasisSolid
  227. TYPE(CMISSBoundaryConditionsType) :: BoundaryConditionsSolid
  228. TYPE(CMISSEquationsType) :: EquationsSolid
  229. TYPE(CMISSEquationsSetType) :: EquationsSetSolid
  230. TYPE(CMISSFieldType) :: GeometricFieldSolid,FibreFieldSolid,MaterialFieldSolid,DependentFieldSolid,EquationsSetFieldSolid
  231. TYPE(CMISSSolverType) :: SolverSolid
  232. TYPE(CMISSSolverEquationsType) :: SolverEquationsSolid
  233. TYPE(CMISSMeshElementsType) :: MeshElementsSolid
  234. !End - Program variables and types (finite elasticity part)
  235. INTEGER(CMISSIntg) :: dummy_counter
  236. !
  237. !--------------------------------------------------------------------------------------------------------------------------------
  238. !
  239. #ifdef WIN32
  240. !Initialise QuickWin
  241. QUICKWIN_WINDOW_CONFIG%TITLE="General Output" !Window title
  242. QUICKWIN_WINDOW_CONFIG%NUMTEXTROWS=-1 !Max possible number of rows
  243. QUICKWIN_WINDOW_CONFIG%MODE=QWIN$SCROLLDOWN
  244. !Set the window parameters
  245. QUICKWIN_STATUS=SETWINDOWCONFIG(QUICKWIN_WINDOW_CONFIG)
  246. !If attempt fails set with system estimated values
  247. IF(.NOT.QUICKWIN_STATUS) QUICKWIN_STATUS=SETWINDOWCONFIG(QUICKWIN_WINDOW_CONFIG)
  248. #endif
  249. !
  250. !================================================================================================================================
  251. !
  252. !INITIALISE OPENCMISS
  253. CALL CMISSInitialise(WorldCoordinateSystem,WorldRegion,Err)
  254. !CALL CMISSErrorHandlingModeSet(CMISS_ERRORS_TRAP_ERROR,Err)
  255. !
  256. !================================================================================================================================
  257. !
  258. !PROBLEM CONTROL PANEL
  259. NUMBER_GLOBAL_X_ELEMENTS=1
  260. NUMBER_GLOBAL_Y_ELEMENTS=1
  261. NUMBER_GLOBAL_Z_ELEMENTS=3
  262. IF(NUMBER_GLOBAL_Z_ELEMENTS==0)THEN
  263. NUMBER_OF_DIMENSIONS=2
  264. ELSE
  265. NUMBER_OF_DIMENSIONS=3
  266. ENDIF
  267. !PROBLEM CONTROL PANEL
  268. ! BASIS_XI_INTERPOLATION_SOLID=CMISS_BASIS_LINEAR_LAGRANGE_INTERPOLATION
  269. BASIS_XI_INTERPOLATION_SOLID=CMISS_BASIS_QUADRATIC_LAGRANGE_INTERPOLATION
  270. !Set geometric tolerance
  271. GEOMETRY_TOLERANCE = 1.0E-12_CMISSDP
  272. !Set initial values
  273. INITIAL_FIELD_DARCY(1)=0.0_CMISSDP
  274. INITIAL_FIELD_DARCY(2)=0.0_CMISSDP
  275. INITIAL_FIELD_DARCY(3)=0.0_CMISSDP
  276. INITIAL_FIELD_DARCY(4)=0.0_CMISSDP
  277. !Set material parameters
  278. POROSITY_PARAM_DARCY=0.1_CMISSDP
  279. PERM_OVER_VIS_PARAM_DARCY=1.0_CMISSDP
  280. !Set output parameter
  281. !(NoOutput/ProgressOutput/TimingOutput/SolverOutput/SolverMatrixOutput)
  282. DYNAMIC_SOLVER_DARCY_OUTPUT_TYPE=CMISS_SOLVER_MATRIX_OUTPUT
  283. LINEAR_SOLVER_DARCY_OUTPUT_TYPE=CMISS_SOLVER_NO_OUTPUT
  284. !(NoOutput/TimingOutput/MatrixOutput/ElementOutput)
  285. EQUATIONS_DARCY_OUTPUT=CMISS_EQUATIONS_NO_OUTPUT
  286. !Set time parameter
  287. DYNAMIC_SOLVER_DARCY_START_TIME=1.0E-3_CMISSDP
  288. DYNAMIC_SOLVER_DARCY_TIME_INCREMENT=1.0e-3_CMISSDP
  289. DYNAMIC_SOLVER_DARCY_STOP_TIME=2_CMISSIntg * DYNAMIC_SOLVER_DARCY_TIME_INCREMENT
  290. DYNAMIC_SOLVER_DARCY_THETA=1.0_CMISSDP !2.0_CMISSDP/3.0_CMISSDP
  291. !Set result output parameter
  292. DYNAMIC_SOLVER_DARCY_OUTPUT_FREQUENCY=1
  293. !Set solver parameters
  294. LINEAR_SOLVER_DARCY_DIRECT_FLAG=.TRUE.
  295. RELATIVE_TOLERANCE=1.0E-10_CMISSDP !default: 1.0E-05_CMISSDP
  296. ABSOLUTE_TOLERANCE=1.0E-10_CMISSDP !default: 1.0E-10_CMISSDP
  297. DIVERGENCE_TOLERANCE=1.0E5_CMISSDP !default: 1.0E5
  298. MAXIMUM_ITERATIONS=10000_CMISSIntg !default: 100000
  299. RESTART_VALUE=30_CMISSIntg !default: 30
  300. LINESEARCH_ALPHA=1.0_CMISSDP
  301. ! !Import cmHeart mesh information
  302. ! CALL FLUID_MECHANICS_IO_READ_CMHEART(CM,Err)
  303. ! BASIS_NUMBER_GEOMETRY=CM%ID_M
  304. ! BASIS_NUMBER_VELOCITY=CM%ID_V
  305. ! BASIS_NUMBER_PRESSURE=CM%ID_P
  306. ! NUMBER_OF_DIMENSIONS=CM%D
  307. ! BASIS_TYPE=CM%IT_T
  308. ! BASIS_XI_INTERPOLATION_GEOMETRY=CM%IT_M
  309. ! BASIS_XI_INTERPOLATION_VELOCITY=CM%IT_V
  310. ! BASIS_XI_INTERPOLATION_PRESSURE=CM%IT_P
  311. ! BASIS_XI_INTERPOLATION_SOLID=CMISS_BASIS_LINEAR_LAGRANGE_INTERPOLATION
  312. ! NUMBER_OF_NODES_GEOMETRY=CM%N_M
  313. ! NUMBER_OF_NODES_VELOCITY=CM%N_V
  314. ! NUMBER_OF_NODES_PRESSURE=CM%N_P
  315. ! TOTAL_NUMBER_OF_NODES=CM%N_T
  316. ! TOTAL_NUMBER_OF_ELEMENTS=CM%E_T
  317. ! NUMBER_OF_ELEMENT_NODES_GEOMETRY=CM%EN_M
  318. ! NUMBER_OF_ELEMENT_NODES_VELOCITY=CM%EN_V
  319. ! NUMBER_OF_ELEMENT_NODES_PRESSURE=CM%EN_P
  320. ! !Set domain dimensions
  321. ! DOMAIN_X1 = -5.0_CMISSDP
  322. ! DOMAIN_X2 = 5.0_CMISSDP
  323. ! DOMAIN_Y1 = -5.0_CMISSDP
  324. ! DOMAIN_Y2 = 5.0_CMISSDP
  325. ! DOMAIN_Z1 = -5.0_CMISSDP
  326. ! DOMAIN_Z2 = 5.0_CMISSDP
  327. ! !Set geometric tolerance
  328. ! GEOMETRY_TOLERANCE = 1.0E-12_CMISSDP
  329. ! !Set initial values
  330. ! INITIAL_FIELD_DARCY(1)=0.0_CMISSDP
  331. ! INITIAL_FIELD_DARCY(2)=0.0_CMISSDP
  332. ! INITIAL_FIELD_DARCY(3)=0.0_CMISSDP
  333. ! INITIAL_FIELD_DARCY(4)=0.0_CMISSDP
  334. ! INITIAL_FIELD_MAT_PROPERTIES(1)=0.0_CMISSDP
  335. ! INITIAL_FIELD_MAT_PROPERTIES(2)=0.0_CMISSDP
  336. ! INITIAL_FIELD_MAT_PROPERTIES(3)=0.0_CMISSDP
  337. ! ! INITIAL_FIELD_SOLID(1)=1.0_CMISSDP
  338. ! ! INITIAL_FIELD_SOLID(2)=1.0_CMISSDP
  339. ! ! INITIAL_FIELD_SOLID(3)=1.0_CMISSDP
  340. ! ! INITIAL_FIELD_SOLID(4)=1.0_CMISSDP
  341. ! !Set material parameters
  342. ! POROSITY_PARAM_DARCY=0.1_CMISSDP
  343. ! PERM_OVER_VIS_PARAM_DARCY=1.0e-1_CMISSDP
  344. ! POROSITY_PARAM_MAT_PROPERTIES=POROSITY_PARAM_DARCY
  345. ! PERM_OVER_VIS_PARAM_MAT_PROPERTIES=PERM_OVER_VIS_PARAM_DARCY
  346. ! !Set number of Gauss points (Mind that also material field may be interpolated)
  347. ! BASIS_XI_GAUSS_GEOMETRY=3 !4
  348. ! BASIS_XI_GAUSS_VELOCITY=3 !4
  349. ! BASIS_XI_GAUSS_PRESSURE=3 !4
  350. ! !Set output parameter
  351. ! !(NoOutput/ProgressOutput/TimingOutput/SolverOutput/SolverMatrixOutput)
  352. ! LINEAR_SOLVER_MAT_PROPERTIES_OUTPUT_TYPE=CMISS_SOLVER_PROGRESS_OUTPUT
  353. ! DYNAMIC_SOLVER_DARCY_OUTPUT_TYPE=CMISS_SOLVER_PROGRESS_OUTPUT
  354. ! LINEAR_SOLVER_DARCY_OUTPUT_TYPE=CMISS_SOLVER_SOLVER_OUTPUT
  355. ! !(NoOutput/TimingOutput/MatrixOutput/ElementOutput)
  356. ! EQUATIONS_DARCY_OUTPUT=CMISS_EQUATIONS_NO_OUTPUT
  357. ! EQUATIONS_MAT_PROPERTIES_OUTPUT=CMISS_EQUATIONS_NO_OUTPUT
  358. !
  359. ! !Set time parameter
  360. ! DYNAMIC_SOLVER_DARCY_START_TIME=0.0_CMISSDP
  361. ! ! DYNAMIC_SOLVER_DARCY_STOP_TIME=0.03_CMISSDP
  362. ! DYNAMIC_SOLVER_DARCY_TIME_INCREMENT=1.0e-2_CMISSDP
  363. ! DYNAMIC_SOLVER_DARCY_STOP_TIME=1_CMISSIntg * DYNAMIC_SOLVER_DARCY_TIME_INCREMENT
  364. ! DYNAMIC_SOLVER_DARCY_THETA=1.0_CMISSDP !2.0_CMISSDP/3.0_CMISSDP
  365. ! !Set result output parameter
  366. ! DYNAMIC_SOLVER_DARCY_OUTPUT_FREQUENCY=1
  367. ! !Set solver parameters
  368. ! LINEAR_SOLVER_MAT_PROPERTIES_DIRECT_FLAG=.TRUE.
  369. ! LINEAR_SOLVER_DARCY_DIRECT_FLAG=.TRUE.
  370. ! RELATIVE_TOLERANCE=1.0E-10_CMISSDP !default: 1.0E-05_CMISSDP
  371. ! ABSOLUTE_TOLERANCE=1.0E-10_CMISSDP !default: 1.0E-10_CMISSDP
  372. ! DIVERGENCE_TOLERANCE=1.0E5_CMISSDP !default: 1.0E5
  373. ! MAXIMUM_ITERATIONS=10000_CMISSIntg !default: 100000
  374. ! RESTART_VALUE=30_CMISSIntg !default: 30
  375. ! LINESEARCH_ALPHA=1.0_CMISSDP
  376. icompartment =1_CMISSIntg
  377. Ncompartments=2_CMISSIntg
  378. !
  379. !================================================================================================================================
  380. !
  381. ! ! !Set diagnostics
  382. ! !
  383. ! ! DIAG_LEVEL_LIST(1)=1
  384. ! ! DIAG_LEVEL_LIST(2)=2
  385. ! ! DIAG_LEVEL_LIST(3)=3
  386. ! ! DIAG_LEVEL_LIST(4)=4
  387. ! ! DIAG_LEVEL_LIST(5)=5
  388. ! !
  389. ! ! ! DIAG_ROUTINE_LIST(1)="DARCY_EQUATION_FINITE_ELEMENT_CALCULATE"
  390. ! ! ! DIAG_ROUTINE_LIST(2)="DARCY_EQUATION_PRE_SOLVE_STORE_REFERENCE_DATA"
  391. ! ! ! DIAG_ROUTINE_LIST(1)="DARCY_EQUATION_PRE_SOLVE_GET_SOLID_DISPLACEMENT"
  392. ! ! ! DIAG_ROUTINE_LIST(2)="DARCY_EQUATION_PRE_SOLVE_ALE_UPDATE_MESH"
  393. ! ! ! DIAG_ROUTINE_LIST(1)="DARCY_EQUATION_PRE_SOLVE_GET_SOLID_DISPLACEMENT"
  394. ! ! ! DIAG_ROUTINE_LIST(1)="DARCY_EQUATION_PRE_SOLVE_UPDATE_BOUNDARY_CONDITIONS"
  395. ! ! DIAG_ROUTINE_LIST(1)="FINITE_ELASTICITY_FINITE_ELEMENT_RESIDUAL_EVALUATE"
  396. ! ! ! DIAG_ROUTINE_LIST(2)="FINITE_ELASTICITY_GAUSS_CAUCHY_TENSOR"
  397. ! ! ! DIAG_ROUTINE_LIST(3)="EVALUATE_CHAPELLE_PIOLA_TENSOR_ADDITION"
  398. ! ! ! DIAG_ROUTINE_LIST(5)="DARCY_EQUATION_PRE_SOLVE_MAT_PROPERTIES"
  399. ! ! ! DIAG_ROUTINE_LIST(6)="DATA_FITTING_FINITE_ELEMENT_CALCULATE"
  400. ! ! ! DIAG_ROUTINE_LIST(7)="FINITE_ELASTICITY_FINITE_ELEMENT_JACOBIAN_EVALUATE"
  401. ! ! ! DIAG_ROUTINE_LIST(8)="FINITE_ELASTICITY_FINITE_ELEMENT_RESIDUAL_EVALUATE"
  402. ! ! ! DIAG_ROUTINE_LIST(1)="PROBLEM_SOLVER_EQUATIONS_SOLVE"
  403. ! ! ! DIAG_ROUTINE_LIST(1)="SOLVER_NEWTON_SOLVE"
  404. ! ! ! DIAG_ROUTINE_LIST(2)="SOLVER_NEWTON_LINESEARCH_SOLVE"
  405. ! ! ! DIAG_ROUTINE_LIST(1)="SOLVER_SOLUTION_UPDATE"
  406. ! ! ! DIAG_ROUTINE_LIST(1)="FINITE_ELASTICITY_FINITE_ELEMENT_RESIDUAL_EVALUATE"
  407. !Set diagnostics
  408. DIAG_LEVEL_LIST(1)=1
  409. DIAG_LEVEL_LIST(2)=2
  410. DIAG_LEVEL_LIST(3)=3
  411. DIAG_LEVEL_LIST(4)=4
  412. DIAG_LEVEL_LIST(5)=5
  413. !DIAG_ROUTINE_LIST(1)="WRITE_IP_INFO"
  414. ! DIAG_ROUTINE_LIST(2)="FINITE_ELASTICITY_GAUSS_CAUCHY_TENSOR"
  415. DIAG_ROUTINE_LIST(1)="FINITE_ELASTICITY_FINITE_ELEMENT_RESIDUAL_EVALUATE"
  416. !CMISS_ALL_DIAG_TYPE/CMISS_IN_DIAG_TYPE/CMISS_FROM_DIAG_TYPE
  417. CALL CMISSDiagnosticsSetOn(CMISS_IN_DIAG_TYPE,DIAG_LEVEL_LIST,"Diagnostics",DIAG_ROUTINE_LIST,Err)
  418. !CMISS_ALL_TIMING_TYPE/CMISS_IN_TIMING_TYPE/CMISS_FROM_TIMING_TYPE
  419. !TIMING_ROUTINE_LIST(1)="PROBLEM_FINITE_ELEMENT_CALCULATE"
  420. !CALL TIMING_SET_ON(IN_TIMING_TYPE,.TRUE.,"",TIMING_ROUTINE_LIST,ERR,ERROR,*999)
  421. ! !CMISS_ALL_DIAG_TYPE/CMISS_IN_DIAG_TYPE/CMISS_FROM_DIAG_TYPE
  422. ! CALL CMISSDiagnosticsSetOn(CMISS_IN_DIAG_TYPE,DIAG_LEVEL_LIST,"Diagnostics",DIAG_ROUTINE_LIST,Err)
  423. !CMISS_ALL_TIMING_TYPE/CMISS_IN_TIMING_TYPE/CMISS_FROM_TIMING_TYPE
  424. !TIMING_ROUTINE_LIST(1)="PROBLEM_FINITE_ELEMENT_CALCULATE"
  425. !CALL TIMING_SET_ON(IN_TIMING_TYPE,.TRUE.,"",TIMING_ROUTINE_LIST,ERR,ERROR,*999)
  426. ALLOCATE (EquationsSetDarcy(Ncompartments))
  427. ALLOCATE (EquationsSetFieldDarcy(Ncompartments))
  428. ALLOCATE (MaterialsFieldDarcy(Ncompartments))
  429. ALLOCATE (EquationsDarcy(Ncompartments))
  430. ALLOCATE (SourceFieldDarcy(Ncompartments))
  431. ALLOCATE (IndependentFieldDarcy(Ncompartments))
  432. !
  433. !================================================================================================================================
  434. !
  435. !Get the number of computational nodes and this computational node number
  436. CALL CMISSComputationalNumberOfNodesGet(NumberOfComputationalNodes,Err)
  437. CALL CMISSComputationalNodeNumberGet(ComputationalNodeNumber,Err)
  438. NumberOfDomains = NumberOfComputationalNodes
  439. write(*,*) "NumberOfDomains = ",NumberOfDomains
  440. !
  441. !================================================================================================================================
  442. !
  443. !COORDINATE SYSTEM
  444. CALL CMISSCoordinateSystem_Initialise(CoordinateSystem,Err)
  445. CALL CMISSCoordinateSystem_CreateStart(CoordinateSystemUserNumber,CoordinateSystem,Err)
  446. CALL CMISSCoordinateSystem_DimensionSet(CoordinateSystem,NUMBER_OF_DIMENSIONS,Err)
  447. CALL CMISSCoordinateSystem_CreateFinish(CoordinateSystem,Err)
  448. !
  449. !================================================================================================================================
  450. !
  451. !REGION
  452. !For a volume-coupled problem, solid and fluid are based in the same region
  453. CALL CMISSRegion_Initialise(Region,Err)
  454. CALL CMISSRegion_CreateStart(RegionUserNumber,WorldRegion,Region,Err)
  455. CALL CMISSRegion_CoordinateSystemSet(Region,CoordinateSystem,Err)
  456. CALL CMISSRegion_CreateFinish(Region,Err)
  457. !
  458. !================================================================================================================================
  459. !
  460. !BASES
  461. !Define basis functions
  462. CALL CMISSBasis_Initialise(LinearBasis,Err)
  463. CALL CMISSBasis_CreateStart(LinearBasisUserNumber,LinearBasis,Err)
  464. CALL CMISSBasis_QuadratureNumberOfGaussXiSet(LinearBasis, &
  465. & (/CMISS_BASIS_HIGH_QUADRATURE_SCHEME,CMISS_BASIS_HIGH_QUADRATURE_SCHEME,CMISS_BASIS_HIGH_QUADRATURE_SCHEME/),Err)
  466. !CALL CMISSBasis_QuadratureLocalFaceGaussEvaluateSet(LinearBasis,.true.,Err)
  467. CALL CMISSBasis_CreateFinish(LinearBasis,Err)
  468. CALL CMISSBasis_Initialise(QuadraticBasis,Err)
  469. CALL CMISSBasis_CreateStart(QuadraticBasisUserNumber,QuadraticBasis,Err)
  470. CALL CMISSBasis_InterpolationXiSet(QuadraticBasis,(/CMISS_BASIS_QUADRATIC_LAGRANGE_INTERPOLATION, &
  471. & CMISS_BASIS_QUADRATIC_LAGRANGE_INTERPOLATION,CMISS_BASIS_QUADRATIC_LAGRANGE_INTERPOLATION/),Err)
  472. CALL CMISSBasis_QuadratureNumberOfGaussXiSet(QuadraticBasis, &
  473. & (/CMISS_BASIS_HIGH_QUADRATURE_SCHEME,CMISS_BASIS_HIGH_QUADRATURE_SCHEME,CMISS_BASIS_HIGH_QUADRATURE_SCHEME/),Err)
  474. !CALL CMISSBasis_QuadratureLocalFaceGaussEvaluateSet(QuadraticBasis,.true.,Err)
  475. CALL CMISSBasis_CreateFinish(QuadraticBasis,Err)
  476. CALL CMISSBasis_Initialise(CubicBasis,Err)
  477. CALL CMISSBasis_CreateStart(CubicBasisUserNumber,CubicBasis,Err)
  478. CALL CMISSBasis_InterpolationXiSet(CubicBasis,(/CMISS_BASIS_CUBIC_LAGRANGE_INTERPOLATION, &
  479. & CMISS_BASIS_CUBIC_LAGRANGE_INTERPOLATION,CMISS_BASIS_CUBIC_LAGRANGE_INTERPOLATION/),Err)
  480. CALL CMISSBasis_QuadratureNumberOfGaussXiSet(CubicBasis, &
  481. & (/CMISS_BASIS_HIGH_QUADRATURE_SCHEME,CMISS_BASIS_HIGH_QUADRATURE_SCHEME,CMISS_BASIS_HIGH_QUADRATURE_SCHEME/),Err)
  482. !CALL CMISSBasis_QuadratureLocalFaceGaussEvaluateSet(CubicBasis,.true.,Err) !Enable 3D interpolation on faces
  483. CALL CMISSBasis_CreateFinish(CubicBasis,Err)
  484. !LinearBasis/QuadraticBasis/CubicBasis
  485. Bases(1)=QuadraticBasis
  486. Bases(2)=LinearBasis
  487. ! Bases(1)=CubicBasis
  488. ! Bases(2)=QuadraticBasis
  489. !Start the creation of a generated mesh in the region
  490. CALL CMISSGeneratedMesh_Initialise(GeneratedMesh,Err)
  491. CALL CMISSGeneratedMesh_CreateStart(GeneratedMeshUserNumber,Region,GeneratedMesh,Err)
  492. CALL CMISSGeneratedMesh_TypeSet(GeneratedMesh,CMISS_GENERATED_MESH_REGULAR_MESH_TYPE,Err)
  493. CALL CMISSGeneratedMesh_BasisSet(GeneratedMesh,Bases,Err)
  494. IF(NUMBER_GLOBAL_Z_ELEMENTS==0) THEN
  495. CALL CMISSGeneratedMesh_ExtentSet(GeneratedMesh,(/X_DIM,Y_DIM/),Err)
  496. CALL CMISSGeneratedMesh_NumberOfElementsSet(GeneratedMesh,(/NUMBER_GLOBAL_X_ELEMENTS,NUMBER_GLOBAL_Y_ELEMENTS/),Err)
  497. ELSE
  498. CALL CMISSGeneratedMesh_ExtentSet(GeneratedMesh,(/X_DIM,Y_DIM,Z_DIM/),Err)
  499. CALL CMISSGeneratedMesh_NumberOfElementsSet(GeneratedMesh,(/NUMBER_GLOBAL_X_ELEMENTS,NUMBER_GLOBAL_Y_ELEMENTS, &
  500. & NUMBER_GLOBAL_Z_ELEMENTS/),Err)
  501. ENDIF
  502. CALL CMISSMesh_Initialise(Mesh,Err)
  503. CALL CMISSGeneratedMesh_CreateFinish(GeneratedMesh,MeshUserNumber,Mesh,Err)
  504. !
  505. !================================================================================================================================
  506. !
  507. !GEOMETRIC FIELD
  508. !Create a decomposition:
  509. !All mesh components (associated with G.Projection / Darcy / solid) share the same decomposition
  510. CALL CMISSDecomposition_Initialise(Decomposition,Err)
  511. CALL CMISSDecomposition_CreateStart(DecompositionUserNumber,Mesh,Decomposition,Err)
  512. !Set the decomposition to be a general decomposition with the specified number of domains
  513. CALL CMISSDecomposition_TypeSet(Decomposition,CMISS_DECOMPOSITION_CALCULATED_TYPE,Err)
  514. CALL CMISSDecomposition_NumberOfDomainsSet(Decomposition,NumberOfDomains,Err)
  515. CALL CMISSDecomposition_CalculateFacesSet(Decomposition,.true.,Err)
  516. !Finish the decomposition
  517. CALL CMISSDecomposition_CreateFinish(Decomposition,Err)
  518. CALL CMISSField_Initialise(GeometricField,Err)
  519. CALL CMISSField_CreateStart(GeometricFieldUserNumber,Region,GeometricField,Err)
  520. CALL CMISSField_MeshDecompositionSet(GeometricField,Decomposition,Err)
  521. CALL CMISSField_TypeSet(GeometricField,CMISS_FIELD_GEOMETRIC_TYPE,Err)
  522. CALL CMISSField_NumberOfVariablesSet(GeometricField,FieldGeometryNumberOfVariables,Err)
  523. CALL CMISSField_NumberOfComponentsSet(GeometricField,CMISS_FIELD_U_VARIABLE_TYPE,3,Err)
  524. CALL CMISSField_ComponentMeshComponentSet(GeometricField,CMISS_FIELD_U_VARIABLE_TYPE,1,SolidGeometryMeshComponentNumber,Err)
  525. CALL CMISSField_ComponentMeshComponentSet(GeometricField,CMISS_FIELD_U_VARIABLE_TYPE,2,SolidGeometryMeshComponentNumber,Err)
  526. CALL CMISSField_ComponentMeshComponentSet(GeometricField,CMISS_FIELD_U_VARIABLE_TYPE,3,SolidGeometryMeshComponentNumber,Err)
  527. CALL CMISSField_CreateFinish(GeometricField,Err)
  528. CALL CMISSGeneratedMesh_GeometricParametersCalculate(GeneratedMesh,GeometricField,Err)
  529. !--------------------------------------------------------------------------------------------------------------------------------
  530. ! Solid
  531. !Create a decomposition
  532. !Create a field to put the geometry (defualt is geometry)
  533. SolidMeshComponenetNumber = SolidGeometryMeshComponentNumber
  534. CALL CMISSField_Initialise(GeometricFieldSolid,Err)
  535. CALL CMISSField_CreateStart(FieldGeometrySolidUserNumber,Region,GeometricFieldSolid,Err)
  536. CALL CMISSField_MeshDecompositionSet(GeometricFieldSolid,Decomposition,Err)
  537. CALL CMISSField_TypeSet(GeometricFieldSolid,CMISS_FIELD_GEOMETRIC_TYPE,Err)
  538. CALL CMISSField_NumberOfVariablesSet(GeometricFieldSolid,FieldGeometrySolidNumberOfVariables,Err)
  539. CALL CMISSField_NumberOfComponentsSet(GeometricFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,FieldGeometrySolidNumberOfComponents,Err)
  540. CALL CMISSField_ComponentMeshComponentSet(GeometricFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,1,SolidMeshComponenetNumber,Err)
  541. CALL CMISSField_ComponentMeshComponentSet(GeometricFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,2,SolidMeshComponenetNumber,Err)
  542. CALL CMISSField_ComponentMeshComponentSet(GeometricFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,3,SolidMeshComponenetNumber,Err)
  543. CALL CMISSField_CreateFinish(GeometricFieldSolid,Err)
  544. !Set the mesh component to be used by the field components.
  545. CALL CMISSGeneratedMesh_GeometricParametersCalculate(GeneratedMesh,GeometricFieldSolid,Err)
  546. ! !Set the scaling to use
  547. ! CALL CMISSField_ScalingTypeSet(GeometricFieldSolid,CMISS_FIELD_NO_SCALING,Err)
  548. !Create a fibre field and attach it to the geometric field
  549. CALL CMISSField_Initialise(FibreFieldSolid,Err)
  550. CALL CMISSField_CreateStart(FieldFibreSolidUserNumber,Region,FibreFieldSolid,Err)
  551. CALL CMISSField_TypeSet(FibreFieldSolid,CMISS_FIELD_FIBRE_TYPE,Err)
  552. CALL CMISSField_MeshDecompositionSet(FibreFieldSolid,Decomposition,Err)
  553. CALL CMISSField_GeometricFieldSet(FibreFieldSolid,GeometricFieldSolid,Err)
  554. CALL CMISSField_NumberOfVariablesSet(FibreFieldSolid,FieldFibreSolidNumberOfVariables,Err)
  555. CALL CMISSField_NumberOfComponentsSet(FibreFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,FieldFibreSolidNumberOfComponents,Err)
  556. CALL CMISSField_ComponentMeshComponentSet(FibreFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,1,SolidGeometryMeshComponentNumber,Err)
  557. CALL CMISSField_ComponentMeshComponentSet(FibreFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,2,SolidGeometryMeshComponentNumber,Err)
  558. CALL CMISSField_ComponentMeshComponentSet(FibreFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,3,SolidGeometryMeshComponentNumber,Err)
  559. CALL CMISSField_CreateFinish(FibreFieldSolid,Err)
  560. ! end Solid
  561. !--------------------------------------------------------------------------------------------------------------------------------
  562. !
  563. !================================================================================================================================
  564. !
  565. !EQUATIONS SETS
  566. DO icompartment = 1,Ncompartments
  567. EquationsSetFieldUserNumberDarcy = 100_CMISSIntg+icompartment
  568. EquationsSetUserNumberDarcy = 200_CMISSIntg+icompartment
  569. !Create the equations set for ALE Darcy
  570. CALL CMISSField_Initialise(EquationsSetFieldDarcy(icompartment),Err)
  571. CALL CMISSEquationsSet_Initialise(EquationsSetDarcy(icompartment),Err)
  572. CALL CMISSEquationsSet_CreateStart(EquationsSetUserNumberDarcy,Region,GeometricField, &
  573. & CMISS_EQUATIONS_SET_FLUID_MECHANICS_CLASS, &
  574. & CMISS_EQUATIONS_SET_DARCY_EQUATION_TYPE,CMISS_EQUATIONS_SET_INCOMPRESS_ELAST_MULTI_COMP_DARCY_SUBTYPE,&
  575. & EquationsSetFieldUserNumberDarcy,EquationsSetFieldDarcy(icompartment),EquationsSetDarcy(icompartment),Err)
  576. !Finish creating the equations set
  577. CALL CMISSEquationsSet_CreateFinish(EquationsSetDarcy(icompartment),Err)
  578. !Set the values for the equations set field to be the current compartment number (1 - N), and the total number of compartments (N)
  579. CALL CMISSField_ParameterSetUpdateConstant(EquationsSetFieldDarcy(icompartment),CMISS_FIELD_U_VARIABLE_TYPE, &
  580. & CMISS_FIELD_VALUES_SET_TYPE,1,icompartment,Err)
  581. CALL CMISSField_ParameterSetUpdateConstant(EquationsSetFieldDarcy(icompartment),CMISS_FIELD_U_VARIABLE_TYPE, &
  582. & CMISS_FIELD_VALUES_SET_TYPE,2,Ncompartments,Err)
  583. ENDDO
  584. !--------------------------------------------------------------------------------------------------------------------------------
  585. ! Solid
  586. !Create the equations_set
  587. CALL CMISSField_Initialise(EquationsSetFieldSolid,Err)
  588. CALL CMISSEquationsSet_Initialise(EquationsSetSolid,Err)
  589. CALL CMISSEquationsSet_CreateStart(EquationSetSolidUserNumber,Region,FibreFieldSolid,CMISS_EQUATIONS_SET_ELASTICITY_CLASS, &
  590. & CMISS_EQUATIONS_SET_FINITE_ELASTICITY_TYPE,CMISS_EQUATIONS_SET_INCOMPRESS_ELAST_MULTI_COMP_DARCY_SUBTYPE,&
  591. & EquationsSetFieldSolidUserNumber,EquationsSetFieldSolid,EquationsSetSolid,Err)
  592. CALL CMISSEquationsSet_CreateFinish(EquationsSetSolid,Err)
  593. !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)
  594. !Need to store number of compartments, as finite elasticity uses this to calculate the total mass increase for the constiutive law
  595. CALL CMISSField_ParameterSetUpdateConstant(EquationsSetFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE, &
  596. & CMISS_FIELD_VALUES_SET_TYPE,1,0_CMISSIntg,Err)
  597. CALL CMISSField_ParameterSetUpdateConstant(EquationsSetFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE, &
  598. & CMISS_FIELD_VALUES_SET_TYPE,2,Ncompartments,Err)
  599. ! end Solid
  600. !--------------------------------------------------------------------------------------------------------------------------------
  601. !--------------------------------------------------------------------------------------------------------------------------------
  602. ! Solid Materials Field
  603. !Create a material field and attach it to the geometric field
  604. CALL CMISSField_Initialise(MaterialFieldSolid,Err)
  605. !
  606. CALL CMISSField_CreateStart(FieldMaterialSolidUserNumber,Region,MaterialFieldSolid,Err)
  607. !
  608. CALL CMISSField_TypeSet(MaterialFieldSolid,CMISS_FIELD_MATERIAL_TYPE,Err)
  609. CALL CMISSField_MeshDecompositionSet(MaterialFieldSolid,Decomposition,Err)
  610. CALL CMISSField_GeometricFieldSet(MaterialFieldSolid,GeometricFieldSolid,Err)
  611. CALL CMISSField_NumberOfVariablesSet(MaterialFieldSolid,FieldMaterialSolidNumberOfVariables,Err)
  612. CALL CMISSField_NumberOfComponentsSet(MaterialFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,FieldMaterialSolidNumberOfComponents,Err)
  613. CALL CMISSField_ComponentMeshComponentSet(MaterialFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,1,SolidGeometryMeshComponentNumber,Err)
  614. CALL CMISSField_ComponentMeshComponentSet(MaterialFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,2,SolidGeometryMeshComponentNumber,Err)
  615. CALL CMISSField_ComponentMeshComponentSet(MaterialFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,3,SolidGeometryMeshComponentNumber,Err)
  616. !
  617. CALL CMISSField_CreateFinish(MaterialFieldSolid,Err)
  618. !Set material parameters
  619. CALL CMISSField_ComponentValuesInitialise(MaterialFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,CMISS_FIELD_VALUES_SET_TYPE,1, &
  620. & 2.0_CMISSDP,Err)
  621. ! CALL CMISSField_ComponentValuesInitialise(MaterialFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,CMISS_FIELD_VALUES_SET_TYPE,1,2.0e3_CMISSDP,Err)
  622. CALL CMISSField_ComponentValuesInitialise(MaterialFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,CMISS_FIELD_VALUES_SET_TYPE,2, &
  623. & 6.0_CMISSDP,Err)
  624. ! CALL CMISSField_ComponentValuesInitialise(MaterialFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,CMISS_FIELD_VALUES_SET_TYPE,2,33.0_CMISSDP,Err)
  625. CALL CMISSField_ComponentValuesInitialise(MaterialFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,CMISS_FIELD_VALUES_SET_TYPE,3, &
  626. & 10.0_CMISSDP,Err)
  627. CALL CMISSEquationsSet_MaterialsCreateStart(EquationsSetSolid,FieldMaterialSolidUserNumber,MaterialFieldSolid,Err)
  628. CALL CMISSEquationsSet_MaterialsCreateFinish(EquationsSetSolid,Err)
  629. ! end Solid
  630. !--------------------------------------------------------------------------------------------------------------------------------
  631. !--------------------------------------------------------------------------------------------------------------------------------
  632. ! Solid
  633. !Create a dependent field with two variables and four components
  634. CALL CMISSField_Initialise(DependentFieldSolid,Err)
  635. !
  636. CALL CMISSField_CreateStart(FieldDependentSolidUserNumber,Region,DependentFieldSolid,Err)
  637. !
  638. CALL CMISSField_TypeSet(DependentFieldSolid,CMISS_FIELD_GENERAL_TYPE,Err)
  639. CALL CMISSField_MeshDecompositionSet(DependentFieldSolid,Decomposition,Err)
  640. CALL CMISSField_GeometricFieldSet(DependentFieldSolid,GeometricFieldSolid,Err)
  641. CALL CMISSField_DependentTypeSet(DependentFieldSolid,CMISS_FIELD_DEPENDENT_TYPE,Err)
  642. !Create 2N+2 number of variables - 2 for solid, 2N for N Darcy compartments
  643. FieldDependentSolidNumberOfVariables=2*Ncompartments+2
  644. CALL CMISSField_NumberOfVariablesSet(DependentFieldSolid,FieldDependentSolidNumberOfVariables,Err)
  645. !create two variables for each compartment
  646. ALLOCATE(VariableTypes(2*Ncompartments+2))
  647. DO num_var=1,Ncompartments+1
  648. VariableTypes(2*num_var-1)=CMISS_FIELD_U_VARIABLE_TYPE+(CMISS_FIELD_NUMBER_OF_VARIABLE_SUBTYPES*(num_var-1))
  649. VariableTypes(2*num_var)=CMISS_FIELD_DELUDELN_VARIABLE_TYPE+(CMISS_FIELD_NUMBER_OF_VARIABLE_SUBTYPES*(num_var-1))
  650. ENDDO
  651. CALL CMISSField_VariableTypesSet(DependentFieldSolid,VariableTypes,Err)
  652. ! CALL CMISSField_VariableTypesSet(DependentFieldSolid,(/CMISS_FIELD_U_VARIABLE_TYPE, &
  653. ! & CMISS_FIELD_DELUDELN_VARIABLE_TYPE,CMISS_FIELD_V_VARIABLE_TYPE,CMISS_FIELD_DELVDELN_VARIABLE_TYPE/),Err)
  654. CALL CMISSField_DimensionSet(DependentFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE, &
  655. & CMISS_FIELD_VECTOR_DIMENSION_TYPE,Err)
  656. CALL CMISSField_DimensionSet(DependentFieldSolid,CMISS_FIELD_DELUDELN_VARIABLE_TYPE, &
  657. & CMISS_FIELD_VECTOR_DIMENSION_TYPE,Err)
  658. CALL CMISSField_NumberOfComponentsSet(DependentFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,FieldDependentSolidNumberOfComponents,Err)
  659. CALL CMISSField_NumberOfComponentsSet(DependentFieldSolid,CMISS_FIELD_DELUDELN_VARIABLE_TYPE, &
  660. & FieldDependentSolidNumberOfComponents,Err)
  661. ! DO icompartment=3,2*Ncompartments+2
  662. ! CALL CMISSField_NumberOfComponentsSet(DependentFieldSolid,VariableTypes(icompartment),FieldDependentFluidNumberOfComponents,Err)
  663. ! ENDDO
  664. ! CALL CMISSField_ComponentInterpolationSet(DependentFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,1,CMISS_FIELD_NODE_BASED_INTERPOLATION,Err)
  665. ! CALL CMISSField_ComponentInterpolationSet(DependentFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,2,CMISS_FIELD_NODE_BASED_INTERPOLATION,Err)
  666. ! CALL CMISSField_ComponentInterpolationSet(DependentFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,3,CMISS_FIELD_NODE_BASED_INTERPOLATION,Err)
  667. CALL CMISSField_ComponentMeshComponentSet(DependentFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,1,SolidDisplMeshComponentNumber,Err)
  668. CALL CMISSField_ComponentMeshComponentSet(DependentFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,2,SolidDisplMeshComponentNumber,Err)
  669. CALL CMISSField_ComponentMeshComponentSet(DependentFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,3,SolidDisplMeshComponentNumber,Err)
  670. CALL CMISSField_ComponentInterpolationSet(DependentFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,4, &
  671. & CMISS_FIELD_NODE_BASED_INTERPOLATION, &
  672. & Err)
  673. ! CALL CMISSField_ComponentInterpolationSet(DependentFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,4,CMISS_FIELD_ELEMENT_BASED_INTERPOLATION,Err)
  674. ! CALL CMISSField_ComponentMeshComponentSet(DependentFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,4,SolidMeshComponenetNumber,Err)
  675. CALL CMISSField_ComponentMeshComponentSet(DependentFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,4,SolidLagrMultMeshComponentNumber,Err)
  676. ! CALL CMISSField_ComponentInterpolationSet(DependentFieldSolid,CMISS_FIELD_DELUDELN_VARIABLE_TYPE,1, &
  677. ! & CMISS_FIELD_NODE_BASED_INTERPOLATION,Err)
  678. ! CALL CMISSField_ComponentInterpolationSet(DependentFieldSolid,CMISS_FIELD_DELUDELN_VARIABLE_TYPE,2, &
  679. ! & CMISS_FIELD_NODE_BASED_INTERPOLATION,Err)
  680. ! CALL CMISSField_ComponentInterpolationSet(DependentFieldSolid,CMISS_FIELD_DELUDELN_VARIABLE_TYPE,3, &
  681. ! & CMISS_FIELD_NODE_BASED_INTERPOLATION,Err)
  682. CALL CMISSField_ComponentMeshComponentSet(DependentFieldSolid,CMISS_FIELD_DELUDELN_VARIABLE_TYPE,1, &
  683. & SolidDisplMeshComponentNumber, &
  684. & Err)
  685. CALL CMISSField_ComponentMeshComponentSet(DependentFieldSolid,CMISS_FIELD_DELUDELN_VARIABLE_TYPE,2, &
  686. & SolidDisplMeshComponentNumber, &
  687. & Err)
  688. CALL CMISSField_ComponentMeshComponentSet(DependentFieldSolid,CMISS_FIELD_DELUDELN_VARIABLE_TYPE,3, &
  689. & SolidDisplMeshComponentNumber, &
  690. & Err)
  691. CALL CMISSField_ComponentInterpolationSet(DependentFieldSolid,CMISS_FIELD_DELUDELN_VARIABLE_TYPE,4, &
  692. & CMISS_FIELD_NODE_BASED_INTERPOLATION,Err)
  693. ! CALL CMISSField_ComponentInterpolationSet(DependentFieldSolid,CMISS_FIELD_DELUDELN_VARIABLE_TYPE,4, &
  694. ! & CMISS_FIELD_ELEMENT_BASED_INTERPOLATION,Err)
  695. ! CALL CMISSField_ComponentMeshComponentSet(DependentFieldSolid,CMISS_FIELD_DELUDELN_VARIABLE_TYPE,4,SolidMeshComponenetNumber,Err)
  696. CALL CMISSField_ComponentMeshComponentSet(DependentFieldSolid,CMISS_FIELD_DELUDELN_VARIABLE_TYPE,4, &
  697. & SolidLagrMultMeshComponentNumber, &
  698. & Err)
  699. !loop over the number of compartments
  700. DO icompartment=3,2*Ncompartments+2
  701. ! CALL CMISSField_DimensionSet(DependentFieldSolid,VariableTypes(icompartment), &
  702. ! & CMISS_FIELD_VECTOR_DIMENSION_TYPE,Err)
  703. CALL CMISSField_NumberOfComponentsSet(DependentFieldSolid,VariableTypes(icompartment),FieldDependentFluidNumberOfComponents,Err)
  704. DO componentnum=1,FieldDependentFluidNumberOfComponents-1
  705. !set dimension type
  706. ! CALL CMISSField_DimensionSet(DependentField,VariableTypes(icompartment), &
  707. ! & CMISS_FIELD_SCALAR_DIMENSION_TYPE,Err)
  708. CALL CMISSField_ComponentInterpolationSet(DependentFieldSolid,VariableTypes(icompartment),componentnum, &
  709. & CMISS_FIELD_NODE_BASED_INTERPOLATION,Err)
  710. CALL CMISSField_ComponentMeshComponentSet(DependentFieldSolid,VariableTypes(icompartment),componentnum, &
  711. & DarcyVelMeshComponentNumber,Err)
  712. ENDDO
  713. CALL CMISSField_ComponentInterpolationSet(DependentFieldSolid,VariableTypes(icompartment), &
  714. & FieldDependentFluidNumberOfComponents, &
  715. & CMISS_FIELD_NODE_BASED_INTERPOLATION,Err)
  716. ! CALL CMISSField_ComponentMeshComponentSet(DependentFieldSolid,VariableTypes(icompartment), &
  717. ! & FieldDependentFluidNumberOfComponents,MESH_COMPONENT_NUMBER_PRESSURE,Err)
  718. CALL CMISSField_ComponentMeshComponentSet(DependentFieldSolid,VariableTypes(icompartment), &
  719. & FieldDependentFluidNumberOfComponents,DarcyMassIncreaseMeshComponentNumber,Err)
  720. ENDDO
  721. ! CALL CMISSField_NumberOfComponentsSet(DependentFieldSolid,CMISS_FIELD_V_VARIABLE_TYPE,FieldDependentFluidNumberOfComponents,Err)
  722. ! CALL CMISSField_NumberOfComponentsSet(DependentFieldSolid,CMISS_FIELD_DELVDELN_VARIABLE_TYPE,FieldDependentFluidNumberOfComponents,Err)
  723. ! !For this equation type, MESH_COMPONENT_NUMBER_PRESSURE is actually the mass increase component as the pressure is taken from the solid equations
  724. ! CALL CMISSField_ComponentMeshComponentSet(DependentFieldSolid,CMISS_FIELD_V_VARIABLE_TYPE,1,MESH_COMPONENT_NUMBER_VELOCITY,Err)
  725. ! CALL CMISSField_ComponentMeshComponentSet(DependentFieldSolid,CMISS_FIELD_V_VARIABLE_TYPE,2,MESH_COMPONENT_NUMBER_VELOCITY,Err)
  726. ! CALL CMISSField_ComponentMeshComponentSet(DependentFieldSolid,CMISS_FIELD_V_VARIABLE_TYPE,3,MESH_COMPONENT_NUMBER_VELOCITY,Err)
  727. ! CALL CMISSField_ComponentMeshComponentSet(DependentFieldSolid,CMISS_FIELD_V_VARIABLE_TYPE,4,MESH_COMPONENT_NUMBER_PRESSURE,Err)
  728. ! CALL CMISSField_ComponentMeshComponentSet(DependentFieldSolid,CMISS_FIELD_DELVDELN_VARIABLE_TYPE,1,MESH_COMPONENT_NUMBER_VELOCITY,Err)
  729. ! CALL CMISSField_ComponentMeshComponentSet(DependentFieldSolid,CMISS_FIELD_DELVDELN_VARIABLE_TYPE,2,MESH_COMPONENT_NUMBER_VELOCITY,Err)
  730. ! CALL CMISSField_ComponentMeshComponentSet(DependentFieldSolid,CMISS_FIELD_DELVDELN_VARIABLE_TYPE,3,MESH_COMPONENT_NUMBER_VELOCITY,Err)
  731. ! CALL CMISSField_ComponentMeshComponentSet(DependentFieldSolid,CMISS_FIELD_DELVDELN_VARIABLE_TYPE,4,MESH_COMPONENT_NUMBER_PRESSURE,Err)
  732. !
  733. CALL CMISSField_CreateFinish(DependentFieldSolid,Err)
  734. !
  735. CALL CMISSEquationsSet_DependentCreateStart(EquationsSetSolid,FieldDependentSolidUserNumber,DependentFieldSolid,Err)
  736. CALL CMISSEquationsSet_DependentCreateFinish(EquationsSetSolid,Err)
  737. ! !Initialise dependent field (solid displacement and pressure)
  738. ! DO COMPONENT_NUMBER=1,NUMBER_OF_DIMENSIONS !+1
  739. ! CALL CMISSField_ComponentValuesInitialise(DependentFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,CMISS_FIELD_VALUES_SET_TYPE, &
  740. ! & COMPONENT_NUMBER,INITIAL_FIELD_SOLID(COMPONENT_NUMBER),Err)
  741. ! ENDDO
  742. ! end Solid
  743. !--------------------------------------------------------------------------------------------------------------------------------
  744. DO icompartment = 1,Ncompartments
  745. CALL CMISSEquationsSet_DependentCreateStart(EquationsSetDarcy(icompartment),FieldDependentSolidUserNumber,&
  746. & DependentFieldSolid,Err)
  747. CALL CMISSEquationsSet_DependentCreateFinish(EquationsSetDarcy(icompartment),Err)
  748. ENDDO
  749. !Create the equations set dependent field variables for ALE Darcy
  750. ! CALL CMISSField_Initialise(DependentFieldDarcy,Err)
  751. ! CALL CMISSEquationsSet_DependentCreateStart(EquationsSetDarcy,DependentFieldUserNumberDarcy, & ! ??? UserNumber ???
  752. ! CALL CMISSEquationsSet_DependentCreateStart(EquationsSetDarcy,FieldDependentSolidUserNumber, & ! ??? UserNumber ???
  753. ! & DependentFieldSolid,Err)
  754. ! ! !Set the mesh component to be used by the field components.
  755. ! ! DO COMPONENT_NUMBER=1,NUMBER_OF_DIMENSIONS
  756. ! ! CALL CMISSField_ComponentMeshComponentSet(DependentFieldDarcy,CMISS_FIELD_U_VARIABLE_TYPE,COMPONENT_NUMBER, &
  757. ! ! & MESH_COMPONENT_NUMBER_VELOCITY,Err)
  758. ! ! CALL CMISSField_ComponentMeshComponentSet(DependentFieldDarcy,CMISS_FIELD_DELUDELN_VARIABLE_TYPE,COMPONENT_NUMBER, &
  759. ! ! & MESH_COMPONENT_NUMBER_VELOCITY,Err)
  760. ! ! ENDDO
  761. ! ! COMPONENT_NUMBER=NUMBER_OF_DIMENSIONS+1
  762. ! ! CALL CMISSField_ComponentMeshComponentSet(DependentFieldDarcy,CMISS_FIELD_U_VARIABLE_TYPE,COMPONENT_NUMBER, &
  763. ! ! & MESH_COMPONENT_NUMBER_PRESSURE,Err)
  764. ! ! CALL CMISSField_ComponentMeshComponentSet(DependentFieldDarcy,CMISS_FIELD_DELUDELN_VARIABLE_TYPE,COMPONENT_NUMBER, &
  765. ! ! & MESH_COMPONENT_NUMBER_PRESSURE,Err)
  766. ! !Finish the equations set dependent field variables
  767. ! CALL CMISSEquationsSet_DependentCreateFinish(EquationsSetDarcy,Err)
  768. !Initialise dependent field (velocity components,pressure,mass increase)
  769. DO COMPONENT_NUMBER=1,NUMBER_OF_DIMENSIONS+1
  770. CALL CMISSField_ComponentValuesInitialise(DependentFieldSolid,CMISS_FIELD_V_VARIABLE_TYPE,CMISS_FIELD_VALUES_SET_TYPE, &
  771. & COMPONENT_NUMBER,INITIAL_FIELD_DARCY(COMPONENT_NUMBER),Err)
  772. CALL CMISSField_ComponentValuesInitialise(DependentFieldSolid,CMISS_FIELD_U1_VARIABLE_TYPE,CMISS_FIELD_VALUES_SET_TYPE, &
  773. & COMPONENT_NUMBER,INITIAL_FIELD_DARCY(COMPONENT_NUMBER),Err)
  774. ENDDO
  775. !
  776. !================================================================================================================================
  777. !
  778. ALLOCATE(CouplingCoeffs(Ncompartments,Ncompartments))
  779. IF(Ncompartments==2)THEN
  780. CouplingCoeffs(1,1)=0.0E-01_CMISSDP
  781. ! CouplingCoeffs(1,2)=-1.0E-04_CMISSDP
  782. ! CouplingCoeffs(2,1)=-1.0E-04_CMISSDP
  783. CouplingCoeffs(1,2)=0.0E-01_CMISSDP
  784. CouplingCoeffs(2,1)=0.0E-01_CMISSDP
  785. CouplingCoeffs(2,2)=0.0E-01_CMISSDP
  786. ELSE IF(Ncompartments==3)THEN
  787. CouplingCoeffs(1,1)=1.0E-02_CMISSDP
  788. CouplingCoeffs(1,2)=1.0E-02_CMISSDP
  789. CouplingCoeffs(1,3)=0.0E-02_CMISSDP
  790. CouplingCoeffs(2,1)=1.0E-02_CMISSDP
  791. CouplingCoeffs(2,2)=2.0E-02_CMISSDP
  792. CouplingCoeffs(2,3)=1.0E-02_CMISSDP
  793. CouplingCoeffs(3,1)=0.0E-02_CMISSDP
  794. CouplingCoeffs(3,2)=1.0E-02_CMISSDP
  795. CouplingCoeffs(3,3)=1.0E-02_CMISSDP
  796. ELSE IF(Ncompartments==4)THEN
  797. CouplingCoeffs(1,1)=0.0E-02_CMISSDP
  798. CouplingCoeffs(1,2)=0.0E-02_CMISSDP
  799. CouplingCoeffs(1,3)=0.0E-02_CMISSDP
  800. CouplingCoeffs(1,4)=0.0E-02_CMISSDP
  801. CouplingCoeffs(2,1)=0.0E-02_CMISSDP
  802. CouplingCoeffs(2,2)=0.0E-02_CMISSDP
  803. CouplingCoeffs(2,3)=0.0E-02_CMISSDP
  804. CouplingCoeffs(2,4)=0.0E-02_CMISSDP
  805. CouplingCoeffs(3,1)=0.0E-02_CMISSDP
  806. CouplingCoeffs(3,2)=0.0E-02_CMISSDP
  807. CouplingCoeffs(3,3)=0.0E-02_CMISSDP
  808. CouplingCoeffs(3,4)=0.0E-02_CMISSDP
  809. CouplingCoeffs(4,1)=0.0E-02_CMISSDP
  810. CouplingCoeffs(4,2)=0.0E-02_CMISSDP
  811. CouplingCoeffs(4,3)=0.0E-02_CMISSDP
  812. CouplingCoeffs(4,4)=0.0E-02_CMISSDP
  813. ELSE IF(Ncompartments==5)THEN
  814. CouplingCoeffs(1,1)=0.0E-02_CMISSDP
  815. CouplingCoeffs(1,2)=0.0E-02_CMISSDP
  816. CouplingCoeffs(1,3)=0.0E-02_CMISSDP
  817. CouplingCoeffs(1,4)=0.0E-02_CMISSDP
  818. CouplingCoeffs(1,5)=0.0E-02_CMISSDP
  819. CouplingCoeffs(2,1)=0.0E-02_CMISSDP
  820. CouplingCoeffs(2,2)=0.0E-02_CMISSDP
  821. CouplingCoeffs(2,3)=0.0E-02_CMISSDP
  822. CouplingCoeffs(2,4)=0.0E-02_CMISSDP
  823. CouplingCoeffs(2,5)=0.0E-02_CMISSDP
  824. CouplingCoeffs(3,1)=0.0E-02_CMISSDP
  825. CouplingCoeffs(3,2)=0.0E-02_CMISSDP
  826. CouplingCoeffs(3,3)=0.0E-02_CMISSDP
  827. CouplingCoeffs(3,4)=0.0E-02_CMISSDP
  828. CouplingCoeffs(3,5)=0.0E-02_CMISSDP
  829. CouplingCoeffs(4,1)=0.0E-02_CMISSDP
  830. CouplingCoeffs(4,2)=0.0E-02_CMISSDP
  831. CouplingCoeffs(4,3)=0.0E-02_CMISSDP
  832. CouplingCoeffs(4,4)=0.0E-02_CMISSDP
  833. CouplingCoeffs(4,5)=0.0E-02_CMISSDP
  834. CouplingCoeffs(5,1)=0.0E-02_CMISSDP
  835. CouplingCoeffs(5,2)=0.0E-02_CMISSDP
  836. CouplingCoeffs(5,3)=0.0E-02_CMISSDP
  837. CouplingCoeffs(5,4)=0.0E-02_CMISSDP
  838. CouplingCoeffs(5,5)=0.0E-02_CMISSDP
  839. ELSE
  840. write(*,*) "Can't initialise coupling coefficients array."
  841. ENDIF
  842. !Define the material parameters for each compartments' constitutive law (for determining pressure)
  843. Nparams=3
  844. ALLOCATE(ConstitutiveParams(Ncompartments,Nparams))
  845. IF(Ncompartments==2)THEN
  846. ConstitutiveParams(1,1)=10.0E-01_CMISSDP
  847. ConstitutiveParams(1,2)=10.0E-01_CMISSDP
  848. ConstitutiveParams(1,3)=10.0E-01_CMISSDP
  849. ConstitutiveParams(2,1)=10.0E-01_CMISSDP
  850. ConstitutiveParams(2,2)=10.0E-01_CMISSDP
  851. ConstitutiveParams(2,3)=10.0E-01_CMISSDP
  852. ELSE IF(Ncompartments==3)THEN
  853. ConstitutiveParams(1,1)=1.0E-02_CMISSDP
  854. ConstitutiveParams(1,2)=1.0E-02_CMISSDP
  855. ConstitutiveParams(1,3)=0.0E-02_CMISSDP
  856. ConstitutiveParams(2,1)=1.0E-02_CMISSDP
  857. ConstitutiveParams(2,2)=2.0E-02_CMISSDP
  858. ConstitutiveParams(2,3)=1.0E-02_CMISSDP
  859. ConstitutiveParams(3,1)=0.0E-02_CMISSDP
  860. ConstitutiveParams(3,2)=1.0E-02_CMISSDP
  861. ConstitutiveParams(3,3)=1.0E-02_CMISSDP
  862. ELSE IF(Ncompartments==4)THEN
  863. ConstitutiveParams(1,1)=0.0E-02_CMISSDP
  864. ConstitutiveParams(1,2)=0.0E-02_CMISSDP
  865. ConstitutiveParams(1,3)=0.0E-02_CMISSDP
  866. ConstitutiveParams(2,1)=0.0E-02_CMISSDP
  867. ConstitutiveParams(2,2)=0.0E-02_CMISSDP
  868. ConstitutiveParams(2,3)=0.0E-02_CMISSDP
  869. ConstitutiveParams(3,1)=0.0E-02_CMISSDP
  870. ConstitutiveParams(3,2)=0.0E-02_CMISSDP
  871. ConstitutiveParams(3,3)=0.0E-02_CMISSDP
  872. ConstitutiveParams(4,1)=0.0E-02_CMISSDP
  873. ConstitutiveParams(4,2)=0.0E-02_CMISSDP
  874. ConstitutiveParams(4,3)=0.0E-02_CMISSDP
  875. ELSE IF(Ncompartments==5)THEN
  876. ConstitutiveParams(1,1)=0.0E-02_CMISSDP
  877. ConstitutiveParams(1,2)=0.0E-02_CMISSDP
  878. ConstitutiveParams(1,3)=0.0E-02_CMISSDP
  879. ConstitutiveParams(2,1)=0.0E-02_CMISSDP
  880. ConstitutiveParams(2,2)=0.0E-02_CMISSDP
  881. ConstitutiveParams(2,3)=0.0E-02_CMISSDP
  882. ConstitutiveParams(3,1)=0.0E-02_CMISSDP
  883. ConstitutiveParams(3,2)=0.0E-02_CMISSDP
  884. ConstitutiveParams(3,3)=0.0E-02_CMISSDP
  885. ConstitutiveParams(4,1)=0.0E-02_CMISSDP
  886. ConstitutiveParams(4,2)=0.0E-02_CMISSDP
  887. ConstitutiveParams(4,3)=0.0E-02_CMISSDP
  888. ConstitutiveParams(5,1)=0.0E-02_CMISSDP
  889. ConstitutiveParams(5,2)=0.0E-02_CMISSDP
  890. ConstitutiveParams(5,3)=0.0E-02_CMISSDP
  891. ELSE
  892. write(*,*) "Can't initialise constitutive parameters array."
  893. ENDIF
  894. !
  895. !================================================================================================================================
  896. !
  897. !MATERIALS FIELDS
  898. !Auto-created field contains a U variable type to store the diffusion coefficient(s)
  899. !It also contains a V variable type to store the coupling coefficients
  900. DO icompartment = 1,Ncompartments
  901. MaterialsFieldUserNumberDarcy = 400+icompartment
  902. CALL CMISSField_Initialise(MaterialsFieldDarcy(icompartment),Err)
  903. CALL CMISSField_CreateStart(MaterialsFieldUserNumberDarcy,Region,MaterialsFieldDarcy(icompartment),Err)
  904. CALL CMISSField_TypeSet(MaterialsFieldDarcy(icompartment),CMISS_FIELD_MATERIAL_TYPE,Err)
  905. CALL CMISSField_MeshDecompositionSet(MaterialsFieldDarcy(icompartment),Decomposition,Err)
  906. CALL CMISSField_GeometricFieldSet(MaterialsFieldDarcy(icompartment),GeometricField,Err)
  907. CALL CMISSField_DependentTypeSet(MaterialsFieldDarcy(icompartment),CMISS_FIELD_INDEPENDENT_TYPE,Err)
  908. CALL CMISSField_NumberOfVariablesSet(MaterialsFieldDarcy(icompartment),3,Err)
  909. CALL CMISSField_VariableTypesSet(MaterialsFieldDarcy(icompartment),[CMISS_FIELD_U_VARIABLE_TYPE,CMISS_FIELD_V_VARIABLE_TYPE,&
  910. & CMISS_FIELD_U1_VARIABLE_TYPE],Err)
  911. CALL CMISSField_NumberOfComponentsSet(MaterialsFieldDarcy(icompartment),CMISS_FIELD_U_VARIABLE_TYPE,7,Err)
  912. CALL CMISSField_NumberOfComponentsSet(MaterialsFieldDarcy(icompartment),CMISS_FIELD_V_VARIABLE_TYPE,Ncompartments,Err)
  913. CALL CMISSField_NumberOfComponentsSet(MaterialsFieldDarcy(icompartment),CMISS_FIELD_U1_VARIABLE_TYPE,Nparams,Err)
  914. CALL CMISSField_CreateFinish(MaterialsFieldDarcy(icompartment),Err)
  915. CALL CMISSEquationsSet_MaterialsCreateStart(EquationsSetDarcy(icompartment),MaterialsFieldUserNumberDarcy,&
  916. & MaterialsFieldDarcy(icompartment),Err)
  917. CALL CMISSEquationsSet_MaterialsCreateFinish(EquationsSetDarcy(icompartment),Err)
  918. END DO
  919. DO icompartment = 1,Ncompartments
  920. CALL CMISSField_ComponentValuesInitialise(MaterialsFieldDarcy(icompartment),CMISS_FIELD_U_VARIABLE_TYPE, &
  921. & CMISS_FIELD_VALUES_SET_TYPE, &
  922. & MaterialsFieldUserNumberDarcyPorosity,POROSITY_PARAM_DARCY,Err)
  923. CALL CMISSField_ComponentValuesInitialise(MaterialsFieldDarcy(icompartment),CMISS_FIELD_U_VARIABLE_TYPE, &
  924. & CMISS_FIELD_VALUES_SET_TYPE, &
  925. & MaterialsFieldUserNumberDarcyPermOverVis,PERM_OVER_VIS_PARAM_DARCY,Err)
  926. END DO
  927. DO icompartment = 1, Ncompartments
  928. DO COMPONENT_NUMBER=1, Ncompartments
  929. CALL CMISSField_ComponentValuesInitialise(MaterialsFieldDarcy(icompartment),CMISS_FIELD_V_VARIABLE_TYPE, &
  930. & CMISS_FIELD_VALUES_SET_TYPE,COMPONENT_NUMBER,CouplingCoeffs(icompartment,COMPONENT_NUMBER),Err)
  931. ! CALL CMISSField_ParameterSetUpdateConstant(MaterialsFieldDarcy(icompartment),CMISS_FIELD_V_VARIABLE_TYPE, &
  932. ! & CMISS_FIELD_VALUES_SET_TYPE,COMPONENT_NUMBER,CouplingCoeffs(icompartment,COMPONENT_NUMBER),Err)
  933. END DO
  934. END DO
  935. DO icompartment = 1, Ncompartments
  936. DO COMPONENT_NUMBER=1,Nparams
  937. CALL CMISSField_ComponentValuesInitialise(MaterialsFieldDarcy(icompartment),CMISS_FIELD_U1_VARIABLE_TYPE, &
  938. & CMISS_FIELD_VALUES_SET_TYPE,COMPONENT_NUMBER,ConstitutiveParams(icompartment,COMPONENT_NUMBER),Err)
  939. ! CALL CMISSField_ParameterSetUpdateConstant(MaterialsFieldDarcy(icompartment),CMISS_FIELD_V_VARIABLE_TYPE, &
  940. ! & CMISS_FIELD_VALUES_SET_TYPE,COMPONENT_NUMBER,CouplingCoeffs(icompartment,COMPONENT_NUMBER),Err)
  941. END DO
  942. END DO
  943. !Create the equations set materials field variables for ALE Darcy
  944. ! CALL CMISSField_Initialise(MaterialsFieldDarcy,Err)
  945. ! CALL CMISSEquationsSet_MaterialsCreateStart(EquationsSetDarcy,MaterialsFieldUserNumberDarcy, &
  946. ! & MaterialsFieldDarcy,Err)
  947. ! !Finish the equations set materials field variables
  948. ! CALL CMISSEquationsSet_MaterialsCreateFinish(EquationsSetDarcy,Err)
  949. ! CALL CMISSField_ComponentValuesInitialise(MaterialsFieldDarcy,CMISS_FIELD_U_VARIABLE_TYPE,CMISS_FIELD_VALUES_SET_TYPE, &
  950. ! & MaterialsFieldUserNumberDarcyPorosity,POROSITY_PARAM_DARCY,Err)
  951. ! CALL CMISSField_ComponentValuesInitialise(MaterialsFieldDarcy,CMISS_FIELD_U_VARIABLE_TYPE,CMISS_FIELD_VALUES_SET_TYPE, &
  952. ! & MaterialsFieldUserNumberDarcyPermOverVis,PERM_OVER_VIS_PARAM_DARCY,Err)
  953. !Create the equations set materials field variables for deformation-dependent material properties
  954. !
  955. !================================================================================================================================
  956. !
  957. DO icompartment=1,Ncompartments
  958. SourceFieldDarcyUserNumber = 450+icompartment
  959. CALL CMISSField_Initialise(SourceFieldDarcy(icompartment),Err)
  960. CALL CMISSEquationsSet_SourceCreateStart(EquationsSetDarcy(icompartment),SourceFieldDarcyUserNumber,&
  961. & SourceFieldDarcy(icompartment),Err)
  962. CALL CMISSEquationsSet_SourceCreateFinish(EquationsSetDarcy(icompartment),Err)
  963. ENDDO
  964. !EQUATIONS
  965. !INDEPENDENT FIELD Darcy for storing BC flags
  966. DO icompartment=1,Ncompartments
  967. IndependentFieldDarcyUserNumber = 470+icompartment
  968. CALL CMISSField_Initialise(IndependentFieldDarcy(icompartment),Err)
  969. CALL CMISSEquationsSet_IndependentCreateStart(EquationsSetDarcy(icompartment),IndependentFieldDarcyUserNumber, &
  970. & IndependentFieldDarcy(icompartment),Err)
  971. CALL CMISSField_ComponentMeshComponentSet(IndependentFieldDarcy(icompartment),CMISS_FIELD_U_VARIABLE_TYPE,1, &
  972. & DarcyVelMeshComponentNumber,Err)
  973. CALL CMISSField_ComponentMeshComponentSet(IndependentFieldDarcy(icompartment),CMISS_FIELD_U_VARIABLE_TYPE,2, &
  974. & DarcyVelMeshComponentNumber,Err)
  975. CALL CMISSField_ComponentMeshComponentSet(IndependentFieldDarcy(icompartment),CMISS_FIELD_U_VARIABLE_TYPE,3, &
  976. & DarcyVelMeshComponentNumber,Err)
  977. ! ! CALL CMISSField_ComponentMeshComponentSet(IndependentFieldDarcy,CMISS_FIELD_U_VARIABLE_TYPE,4,DarcyMassIncreaseMeshComponentNumber,Err)
  978. CALL CMISSEquationsSet_IndependentCreateFinish(EquationsSetDarcy(icompartment),Err)
  979. CALL CMISSField_ComponentValuesInitialise(IndependentFieldDarcy(icompartment),CMISS_FIELD_U_VARIABLE_TYPE, &
  980. & CMISS_FIELD_VALUES_SET_TYPE,1,0.0_CMISSDP,Err)
  981. CALL CMISSField_ComponentValuesInitialise(IndependentFieldDarcy(icompartment),CMISS_FIELD_U_VARIABLE_TYPE, &
  982. & CMISS_FIELD_VALUES_SET_TYPE,2,0.0_CMISSDP,Err)
  983. CALL CMISSField_ComponentValuesInitialise(IndependentFieldDarcy(icompartment),CMISS_FIELD_U_VARIABLE_TYPE, &
  984. & CMISS_FIELD_VALUES_SET_TYPE,3,0.0_CMISSDP,Err)
  985. ENDDO
  986. DO icompartment=1,Ncompartments
  987. !Create the equations set equations
  988. CALL CMISSEquations_Initialise(EquationsDarcy(icompartment),Err)
  989. CALL CMISSEquationsSet_EquationsCreateStart(EquationsSetDarcy(icompartment),EquationsDarcy(icompartment),Err)
  990. !Set the equations matrices sparsity type
  991. CALL CMISSEquations_SparsityTypeSet(EquationsDarcy(icompartment),CMISS_EQUATIONS_SPARSE_MATRICES,Err)
  992. ! !Set the equations lumping type
  993. ! CALL CMISSEquations_LumpingTypeSet(EquationsDarcy,CMISS_EQUATIONS_UNLUMPED_MATRICES,Err)
  994. !Set the equations set output
  995. CALL CMISSEquations_OutputTypeSet(EquationsDarcy(icompartment),EQUATIONS_DARCY_OUTPUT,Err)
  996. !Finish the equations set equations
  997. CALL CMISSEquationsSet_EquationsCreateFinish(EquationsSetDarcy(icompartment),Err)
  998. ENDDO
  999. !--------------------------------------------------------------------------------------------------------------------------------
  1000. ! Solid
  1001. !Create the equations set equations
  1002. CALL CMISSEquations_Initialise(EquationsSolid,Err)
  1003. CALL CMISSEquationsSet_EquationsCreateStart(EquationsSetSolid,EquationsSolid,Err)
  1004. CALL CMISSEquations_SparsityTypeSet(EquationsSolid,CMISS_EQUATIONS_SPARSE_MATRICES,Err)
  1005. CALL CMISSEquations_OutputTypeSet(EquationsSolid,CMISS_EQUATIONS_NO_OUTPUT,Err)
  1006. CALL CMISSEquationsSet_EquationsCreateFinish(EquationsSetSolid,Err)
  1007. ! end Solid
  1008. !--------------------------------------------------------------------------------------------------------------------------------
  1009. !
  1010. !================================================================================================================================
  1011. !
  1012. !--------------------------------------------------------------------------------------------------------------------------------
  1013. ! Solid
  1014. !Initialise dependent field from undeformed geometry and displacement bcs and set hydrostatic pressure
  1015. CALL CMISSField_ParametersToFieldParametersComponentCopy(GeometricFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE, &
  1016. & CMISS_FIELD_VALUES_SET_TYPE, &
  1017. & 1,DependentFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,CMISS_FIELD_VALUES_SET_TYPE,1,Err)
  1018. CALL CMISSField_ParametersToFieldParametersComponentCopy(GeometricFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE, &
  1019. & CMISS_FIELD_VALUES_SET_TYPE, &
  1020. & 2,DependentFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,CMISS_FIELD_VALUES_SET_TYPE,2,Err)
  1021. CALL CMISSField_ParametersToFieldParametersComponentCopy(GeometricFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE, &
  1022. & CMISS_FIELD_VALUES_SET_TYPE, &
  1023. & 3,DependentFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,CMISS_FIELD_VALUES_SET_TYPE,3,Err)
  1024. CALL CMISSField_ComponentValuesInitialise(DependentFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,CMISS_FIELD_VALUES_SET_TYPE,4, &
  1025. & 0.0_CMISSDP, &
  1026. & Err)
  1027. ! end Solid
  1028. !--------------------------------------------------------------------------------------------------------------------------------
  1029. !
  1030. !================================================================================================================================
  1031. !
  1032. !PROBLEMS
  1033. CALL CMISSProblem_Initialise(Problem,Err)
  1034. CALL CMISSControlLoop_Initialise(ControlLoop,Err)
  1035. CALL CMISSProblem_CreateStart(ProblemUserNumber,Problem,Err)
  1036. CALL CMISSProblem_SpecificationSet(Problem,CMISS_PROBLEM_MULTI_PHYSICS_CLASS,CMISS_PROBLEM_FINITE_ELASTICITY_DARCY_TYPE, &
  1037. & CMISS_PROBLEM_QUASISTATIC_ELASTICITY_TRANSIENT_DARCY_SUBTYPE,Err)
  1038. CALL CMISSProblem_CreateFinish(Problem,Err)
  1039. CALL CMISSProblem_ControlLoopCreateStart(Problem,Err)
  1040. CALL CMISSProblem_ControlLoopGet(Problem,CMISS_CONTROL_LOOP_NODE,ControlLoop,Err)
  1041. ! CALL CMISSControlLoop_MaximumIterationsSet(ControlLoop,2,Err)
  1042. CALL CMISSControlLoop_TimesSet(ControlLoop,DYNAMIC_SOLVER_DARCY_START_TIME,DYNAMIC_SOLVER_DARCY_STOP_TIME, &
  1043. & DYNAMIC_SOLVER_DARCY_TIME_INCREMENT,Err)
  1044. CALL CMISSControlLoop_TimeOutputSet(ControlLoop,DYNAMIC_SOLVER_DARCY_OUTPUT_FREQUENCY,Err)
  1045. ! CALL CMISSControlLoop_OutputTypeSet(ControlLoop,CMISS_CONTROL_LOOP_PROGRESS_OUTPUT,Err)
  1046. CALL CMISSProblem_ControlLoopCreateFinish(Problem,Err)
  1047. !
  1048. !================================================================================================================================
  1049. !
  1050. !SOLVERS
  1051. !Start the creation of the problem solvers
  1052. CALL CMISSSolver_Initialise(SolverSolid,Err)
  1053. CALL CMISSSolver_Initialise(DynamicSolverDarcy,Err)
  1054. CALL CMISSSolver_Initialise(LinearSolverDarcy,Err)
  1055. CALL CMISSProblem_SolversCreateStart(Problem,Err)
  1056. !--------------------------------------------------------------------------------------------------------------------------------
  1057. ! Solid
  1058. !Get the finite elasticity solver
  1059. CALL CMISSProblem_SolverGet(Problem,(/ControlLoopSubiterationNumber,ControlLoopSolidNumber,CMISS_CONTROL_LOOP_NODE/), &
  1060. & SolverSolidIndex,SolverSolid,Err)
  1061. CALL CMISSSolver_OutputTypeSet(SolverSolid,CMISS_SOLVER_PROGRESS_OUTPUT,Err)
  1062. ! CALL CMISSSolver_NewtonJacobianCalculationTypeSet(SolverSolid,CMISS_SOLVER_NEWTON_JACOBIAN_FD_CALCULATED,Err)
  1063. CALL CMISSSolver_NewtonJacobianCalculationTypeSet(SolverSolid,CMISS_SOLVER_NEWTON_JACOBIAN_EQUATIONS_CALCULATED,Err)
  1064. CALL CMISSSolver_NewtonAbsoluteToleranceSet(SolverSolid,ABSOLUTE_TOLERANCE,Err)
  1065. CALL CMISSSolver_NewtonRelativeToleranceSet(SolverSolid,RELATIVE_TOLERANCE,Err)
  1066. CALL CMISSSolver_NewtonMaximumIterationsSet(SolverSolid,MAXIMUM_ITERATIONS,Err)
  1067. ! CALL CMISSSolverNonLinearTypeSet(SolverSolid,CMISS_SOLVER_NONLINEAR_NEWTON,Err)
  1068. ! CALL CMISSSolver_LibraryTypeSet(SolverSolid,CMISS_SOLVER_PETSC_LIBRARY,Err)
  1069. ! CALL CMISSSolver_NewtonLinearSolverGet(SolverSolid,LinearSolverSolid,Err)
  1070. ! CALL CMISSSolver_LinearTypeSet(LinearSolverSolid,CMISS_SOLVER_LINEAR_DIRECT_SOLVE_TYPE,Err)
  1071. ! end Solid
  1072. !--------------------------------------------------------------------------------------------------------------------------------
  1073. !Get the Darcy solver
  1074. CALL CMISSProblem_SolverGet(Problem,(/ControlLoopSubiterationNumber,ControlLoopFluidNumber,CMISS_CONTROL_LOOP_NODE/), &
  1075. & SolverDarcyIndex,DynamicSolverDarcy,Err)
  1076. !Set the output type
  1077. CALL CMISSSolver_OutputTypeSet(DynamicSolverDarcy,DYNAMIC_SOLVER_DARCY_OUTPUT_TYPE,Err)
  1078. !Set theta
  1079. CALL CMISSSolver_DynamicThetaSet(DynamicSolverDarcy,DYNAMIC_SOLVER_DARCY_THETA,Err)
  1080. !CALL CMISSSolverDynamicDynamicSet(DynamicSolverDarcy,.TRUE.,Err)
  1081. !Get the dynamic linear solver
  1082. CALL CMISSSolver_DynamicLinearSolverGet(DynamicSolverDarcy,LinearSolverDarcy,Err)
  1083. !Set the solver settings
  1084. IF(LINEAR_SOLVER_DARCY_DIRECT_FLAG) THEN
  1085. CALL CMISSSolver_LinearTypeSet(LinearSolverDarcy,CMISS_SOLVER_LINEAR_DIRECT_SOLVE_TYPE,Err)
  1086. CALL CMISSSolver_LibraryTypeSet(LinearSolverDarcy,CMISS_SOLVER_MUMPS_LIBRARY,Err)
  1087. ELSE
  1088. CALL CMISSSolver_LinearTypeSet(LinearSolverDarcy,CMISS_SOLVER_LINEAR_ITERATIVE_SOLVE_TYPE,Err)
  1089. CALL CMISSSolver_LinearIterativeMaximumIterationsSet(LinearSolverDarcy,MAXIMUM_ITERATIONS,Err)
  1090. CALL CMISSSolver_LinearIterativeDivergenceToleranceSet(LinearSolverDarcy,DIVERGENCE_TOLERANCE,Err)
  1091. CALL CMISSSolver_LinearIterativeRelativeToleranceSet(LinearSolverDarcy,RELATIVE_TOLERANCE,Err)
  1092. CALL CMISSSolver_LinearIterativeAbsoluteToleranceSet(LinearSolverDarcy,ABSOLUTE_TOLERANCE,Err)
  1093. CALL CMISSSolver_LinearIterativeGMRESRestartSet(LinearSolverDarcy,RESTART_VALUE,Err)
  1094. ENDIF
  1095. !Finish the creation of the problem solver
  1096. CALL CMISSProblem_SolversCreateFinish(Problem,Err)
  1097. !
  1098. !================================================================================================================================
  1099. !
  1100. !SOLVER EQUATIONS
  1101. !Start the creation of the problem solver equations
  1102. CALL CMISSSolver_Initialise(SolverSolid,Err)
  1103. CALL CMISSSolver_Initialise(LinearSolverDarcy,Err)
  1104. CALL CMISSSolverEquations_Initialise(SolverEquationsSolid,Err)
  1105. CALL CMISSSolverEquations_Initialise(SolverEquationsDarcy,Err)
  1106. CALL CMISSProblem_SolverEquationsCreateStart(Problem,Err)
  1107. !
  1108. !Get the finite elasticity solver equations
  1109. CALL CMISSProblem_SolverGet(Problem,(/ControlLoopSubiterationNumber,ControlLoopSolidNumber,CMISS_CONTROL_LOOP_NODE/), &
  1110. & SolverSolidIndex,SolverSolid,Err)
  1111. CALL CMISSSolver_SolverEquationsGet(SolverSolid,SolverEquationsSolid,Err)
  1112. CALL CMISSSolverEquations_SparsityTypeSet(SolverEquationsSolid,CMISS_SOLVER_SPARSE_MATRICES,Err)
  1113. CALL CMISSSolverEquations_EquationsSetAdd(SolverEquationsSolid,EquationsSetSolid,EquationsSetIndex,Err)
  1114. !
  1115. !Get the Darcy solver equations
  1116. CALL CMISSProblem_SolverGet(Problem,(/ControlLoopSubiterationNumber,ControlLoopFluidNumber,CMISS_CONTROL_LOOP_NODE/), &
  1117. & SolverDarcyIndex,LinearSolverDarcy,Err)
  1118. CALL CMISSSolver_SolverEquationsGet(LinearSolverDarcy,SolverEquationsDarcy,Err)
  1119. CALL CMISSSolverEquations_SparsityTypeSet(SolverEquationsDarcy,CMISS_SOLVER_SPARSE_MATRICES,Err)
  1120. DO icompartment=1,Ncompartments
  1121. CALL CMISSSolverEquations_EquationsSetAdd(SolverEquationsDarcy,EquationsSetDarcy(icompartment),EquationsSetIndex,Err)
  1122. ENDDO
  1123. !
  1124. !Finish the creation of the problem solver equations
  1125. CALL CMISSProblem_SolverEquationsCreateFinish(Problem,Err)
  1126. ! ENDDO
  1127. !Prescribe boundary conditions (absolute nodal parameters)
  1128. !Solid is computed in absolute position, rather than displacement. Thus BCs for absolute position
  1129. ! ASSIGN BOUNDARY CONDITIONS - SOLID (absolute nodal parameters)
  1130. !Solid is computed in absolute position, rather than displacement. Thus BCs for absolute position
  1131. CALL CMISSBoundaryConditions_Initialise(BoundaryConditionsSolid,Err)
  1132. CALL CMISSSolverEquations_BoundaryConditionsCreateStart(SolverEquationsSolid,BoundaryConditionsSolid,Err)
  1133. !Get surfaces
  1134. CALL CMISSGeneratedMesh_SurfaceGet(GeneratedMesh,SolidDisplMeshComponentNumber,CMISS_GENERATED_MESH_REGULAR_FRONT_SURFACE, &
  1135. & Face1Nodes,FaceXi(1),Err)
  1136. CALL CMISSGeneratedMesh_SurfaceGet(GeneratedMesh,SolidDisplMeshComponentNumber,CMISS_GENERATED_MESH_REGULAR_BACK_SURFACE, &
  1137. & Face2Nodes,FaceXi(2),Err)
  1138. CALL CMISSGeneratedMesh_SurfaceGet(GeneratedMesh,SolidDisplMeshComponentNumber,CMISS_GENERATED_MESH_REGULAR_RIGHT_SURFACE, &
  1139. & Face3Nodes,FaceXi(3),Err)
  1140. CALL CMISSGeneratedMesh_SurfaceGet(GeneratedMesh,SolidDisplMeshComponentNumber,CMISS_GENERATED_MESH_REGULAR_LEFT_SURFACE, &
  1141. & Face4Nodes,FaceXi(4),Err)
  1142. CALL CMISSGeneratedMesh_SurfaceGet(GeneratedMesh,SolidDisplMeshComponentNumber,CMISS_GENERATED_MESH_REGULAR_TOP_SURFACE, &
  1143. & Face5Nodes,FaceXi(5),Err)
  1144. CALL CMISSGeneratedMesh_SurfaceGet(GeneratedMesh,SolidDisplMeshComponentNumber,CMISS_GENERATED_MESH_REGULAR_BOTTOM_SURFACE, &
  1145. & Face6Nodes,FaceXi(6),Err)
  1146. ! Fix the bottom in z direction
  1147. DO NN=1,SIZE(Face6Nodes,1)
  1148. NODE=Face6Nodes(NN)
  1149. CALL CMISSDecomposition_NodeDomainGet(Decomposition,NODE,1,NodeDomain,Err)
  1150. IF(NodeDomain==ComputationalNodeNumber) THEN
  1151. CALL CMISSField_ParameterSetGetNode(GeometricFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,CMISS_FIELD_VALUES_SET_TYPE,1,1,NODE,3, &
  1152. & ZCoord,Err)
  1153. CALL CMISSBoundaryConditions_SetNode(BoundaryConditionsSolid,DependentFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,1,1,NODE,3, &
  1154. & CMISS_BOUNDARY_CONDITION_FIXED,ZCoord,Err)
  1155. WRITE(*,*) "FIXING NODE",NODE,"AT BOTTOM IN Z DIRECTION"
  1156. ENDIF
  1157. ENDDO
  1158. ! Fix the top in z direction
  1159. DO NN=1,SIZE(Face5Nodes,1)
  1160. NODE=Face5Nodes(NN)
  1161. CALL CMISSDecomposition_NodeDomainGet(Decomposition,NODE,1,NodeDomain,Err)
  1162. IF(NodeDomain==ComputationalNodeNumber) THEN
  1163. CALL CMISSField_ParameterSetGetNode(GeometricFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,CMISS_FIELD_VALUES_SET_TYPE,1,1,NODE,3, &
  1164. & ZCoord,Err)
  1165. CALL CMISSBoundaryConditions_SetNode(BoundaryConditionsSolid,DependentFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,1,1,NODE,3, &
  1166. & CMISS_BOUNDARY_CONDITION_FIXED,ZCoord,Err)
  1167. WRITE(*,*) "FIXING NODE",NODE,"AT TOP IN Z DIRECTION"
  1168. ENDIF
  1169. ENDDO
  1170. !Fix more nodes at the bottom to stop free body motion
  1171. X_FIXED=.FALSE.
  1172. Y_FIXED=.FALSE.
  1173. DO NN=1,SIZE(Face6Nodes,1)
  1174. NODE=Face6Nodes(NN)
  1175. CALL CMISSDecomposition_NodeDomainGet(Decomposition,NODE,1,NodeDomain,Err)
  1176. IF(NodeDomain==ComputationalNodeNumber) THEN
  1177. CALL CMISSField_ParameterSetGetNode(GeometricFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,CMISS_FIELD_VALUES_SET_TYPE,1,1,NODE,1, &
  1178. & XCoord,Err)
  1179. CALL CMISSField_ParameterSetGetNode(GeometricFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,CMISS_FIELD_VALUES_SET_TYPE,1,1,NODE,2, &
  1180. & YCoord,Err)
  1181. !Fix Origin displacement in x and y (z already fixed)
  1182. IF(ABS(XCoord)<1.0E-6_CMISSDP.AND.ABS(YCoord)<1.0E-6_CMISSDP) THEN
  1183. CALL CMISSBoundaryConditions_SetNode(BoundaryConditionsSolid,DependentFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,1,1,NODE,1, &
  1184. & CMISS_BOUNDARY_CONDITION_FIXED,XCoord,Err)
  1185. CALL CMISSBoundaryConditions_SetNode(BoundaryConditionsSolid,DependentFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,1,1,NODE,2, &
  1186. & CMISS_BOUNDARY_CONDITION_FIXED,YCoord,Err)
  1187. WRITE(*,*) "FIXING ORIGIN NODE",NODE,"IN X AND Y DIRECTION"
  1188. X_FIXED=.TRUE.
  1189. Y_FIXED=.TRUE.
  1190. ENDIF
  1191. !Fix nodal displacements at (X_DIM,0) in y
  1192. IF(ABS(XCoord - X_DIM)<1.0E-6_CMISSDP .AND. ABS(YCoord)<1.0E-6_CMISSDP) THEN
  1193. CALL CMISSBoundaryConditions_SetNode(BoundaryConditionsSolid,DependentFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,1,1,NODE,2, &
  1194. & CMISS_BOUNDARY_CONDITION_FIXED,YCoord,Err)
  1195. WRITE(*,*) "FIXING NODES",NODE,"AT (X_DIM,0) IN Y DIRECTION"
  1196. Y_FIXED=.TRUE.
  1197. ENDIF
  1198. !Fix nodal displacements at (0,Y_DIM) in x
  1199. IF(ABS(XCoord)<1.0E-6_CMISSDP .AND. ABS(YCoord - Y_DIM)<1.0E-6_CMISSDP) THEN
  1200. CALL CMISSBoundaryConditions_SetNode(BoundaryConditionsSolid,DependentFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,1,1,NODE,1, &
  1201. & CMISS_BOUNDARY_CONDITION_FIXED,XCoord,Err)
  1202. WRITE(*,*) "FIXING NODES",NODE,"AT (0,Y_DIM) IN X DIRECTION"
  1203. X_FIXED=.TRUE.
  1204. ENDIF
  1205. ENDIF
  1206. ENDDO
  1207. ! CALL MPI_REDUCE(X_FIXED,X_OKAY,1,MPI_LOGICAL,MPI_LOR,0,MPI_COMM_WORLD,MPI_IERROR)
  1208. ! CALL MPI_REDUCE(Y_FIXED,Y_OKAY,1,MPI_LOGICAL,MPI_LOR,0,MPI_COMM_WORLD,MPI_IERROR)
  1209. ! IF(ComputationalNodeNumber==0) THEN
  1210. ! IF(.NOT.(X_OKAY.AND.Y_OKAY)) THEN
  1211. ! WRITE(*,*) "Free body motion could not be prevented!"
  1212. ! CALL CMISSFinalise(Err)
  1213. ! STOP
  1214. ! ENDIF
  1215. ! ENDIF
  1216. CALL CMISSSolverEquations_BoundaryConditionsCreateFinish(SolverEquationsSolid,Err)
  1217. !
  1218. !------------------------------------
  1219. ! ASSIGN BOUNDARY CONDITIONS - FLUID
  1220. !Get surfaces
  1221. CALL CMISSGeneratedMesh_SurfaceGet(GeneratedMesh,DarcyVelMeshComponentNumber,CMISS_GENERATED_MESH_REGULAR_FRONT_SURFACE, &
  1222. & Face7Nodes,FaceXi(1),Err)
  1223. CALL CMISSGeneratedMesh_SurfaceGet(GeneratedMesh,DarcyVelMeshComponentNumber,CMISS_GENERATED_MESH_REGULAR_BACK_SURFACE, &
  1224. & Face8Nodes,FaceXi(2),Err)
  1225. CALL CMISSGeneratedMesh_SurfaceGet(GeneratedMesh,DarcyVelMeshComponentNumber,CMISS_GENERATED_MESH_REGULAR_RIGHT_SURFACE, &
  1226. & Face9Nodes,FaceXi(3),Err)
  1227. CALL CMISSGeneratedMesh_SurfaceGet(GeneratedMesh,DarcyVelMeshComponentNumber,CMISS_GENERATED_MESH_REGULAR_LEFT_SURFACE, &
  1228. & Face10Nodes,FaceXi(4),Err)
  1229. CALL CMISSGeneratedMesh_SurfaceGet(GeneratedMesh,DarcyVelMeshComponentNumber,CMISS_GENERATED_MESH_REGULAR_TOP_SURFACE, &
  1230. & Face11Nodes,FaceXi(5),Err)
  1231. CALL CMISSGeneratedMesh_SurfaceGet(GeneratedMesh,DarcyVelMeshComponentNumber,CMISS_GENERATED_MESH_REGULAR_BOTTOM_SURFACE, &
  1232. & Face12Nodes,FaceXi(6),Err)
  1233. CALL CMISSBoundaryConditions_Initialise(BoundaryConditionsDarcy,Err)
  1234. CALL CMISSSolverEquations_BoundaryConditionsCreateStart(SolverEquationsDarcy,BoundaryConditionsDarcy,Err)
  1235. DO icompartment=1,Ncompartments
  1236. IF(icompartment==1) THEN
  1237. ! At the top impose Darcy velocity in z direction
  1238. DO NN=1,SIZE(Face11Nodes,1)
  1239. NODE=Face11Nodes(NN)
  1240. ! ! CALL CMISSDecomposition_NodeDomainGet(Decomposition,NODE,1,NodeDomain,Err)
  1241. ! ! IF(NodeDomain==ComputationalNodeNumber) THEN
  1242. VALUE = -1.0_CMISSDP
  1243. COMPONENT_NUMBER = 3
  1244. write(*,*)'Marker 0'
  1245. CALL CMISSBoundaryConditions_SetNode(BoundaryConditionsDarcy,DependentFieldSolid,CMISS_FIELD_V_VARIABLE_TYPE,1,1,NODE, &
  1246. & COMPONENT_NUMBER, CMISS_BOUNDARY_CONDITION_FIXED,VALUE,Err)
  1247. WRITE(*,*) "SPECIFIED INFLOW AT NODE",NODE,"IN Z DIRECTION"
  1248. ! ! CALL CMISSField_ParameterSetGetNode(GeometricField,CMISS_FIELD_U_VARIABLE_TYPE,CMISS_FIELD_VALUES_SET_TYPE,1,NODE,1,XCoord,Err)
  1249. ! ! CALL CMISSField_ParameterSetGetNode(GeometricField,CMISS_FIELD_U_VARIABLE_TYPE,CMISS_FIELD_VALUES_SET_TYPE,1,NODE,2,YCoord,Err)
  1250. ! ! CALL CMISSField_ParameterSetGetNode(GeometricField,CMISS_FIELD_U_VARIABLE_TYPE,CMISS_FIELD_VALUES_SET_TYPE,1,NODE,3,ZCoord,Err)
  1251. ! ! WRITE(*,*) "XCoord, YCoord, ZCoord = ",XCoord, YCoord, ZCoord
  1252. ! ! ENDIF
  1253. ENDDO
  1254. !All other faces are impermeable
  1255. DO NN=1,SIZE(Face7Nodes,1)
  1256. NODE=Face7Nodes(NN)
  1257. ! ! CALL CMISSDecomposition_NodeDomainGet(Decomposition,NODE,1,NodeDomain,Err)
  1258. ! ! IF(NodeDomain==ComputationalNodeNumber) THEN
  1259. VALUE = 0.0_CMISSDP
  1260. COMPONENT_NUMBER = 1
  1261. write(*,*)'Marker 1'
  1262. CALL CMISSBoundaryConditions_SetNode(BoundaryConditionsDarcy,DependentFieldSolid,CMISS_FIELD_V_VARIABLE_TYPE,1,1,NODE, &
  1263. & COMPONENT_NUMBER, CMISS_BOUNDARY_CONDITION_FIXED,VALUE,Err)
  1264. WRITE(*,*) "SPECIFIED IMPERMEABLE WALL AT NODE",NODE,"IN X DIRECTION"
  1265. ! ! ENDIF
  1266. ENDDO
  1267. DO NN=1,SIZE(Face8Nodes,1)
  1268. NODE=Face8Nodes(NN)
  1269. ! ! CALL CMISSDecomposition_NodeDomainGet(Decomposition,NODE,1,NodeDomain,Err)
  1270. ! ! IF(NodeDomain==ComputationalNodeNumber) THEN
  1271. VALUE = 0.0_CMISSDP
  1272. COMPONENT_NUMBER = 1
  1273. write(*,*)'Marker 2'
  1274. CALL CMISSBoundaryConditions_SetNode(BoundaryConditionsDarcy,DependentFieldSolid,CMISS_FIELD_V_VARIABLE_TYPE,1,1,NODE, &
  1275. & COMPONENT_NUMBER, CMISS_BOUNDARY_CONDITION_FIXED,VALUE,Err)
  1276. WRITE(*,*) "SPECIFIED IMPERMEABLE WALL AT NODE",NODE,"IN X DIRECTION"
  1277. ! ! ENDIF
  1278. ENDDO
  1279. DO NN=1,SIZE(Face9Nodes,1)
  1280. NODE=Face9Nodes(NN)
  1281. ! ! CALL CMISSDecomposition_NodeDomainGet(Decomposition,NODE,1,NodeDomain,Err)
  1282. ! ! IF(NodeDomain==ComputationalNodeNumber) THEN
  1283. VALUE = 0.0_CMISSDP
  1284. COMPONENT_NUMBER = 2
  1285. write(*,*)'Marker 3'
  1286. CALL CMISSBoundaryConditions_SetNode(BoundaryConditionsDarcy,DependentFieldSolid,CMISS_FIELD_V_VARIABLE_TYPE,1,1,NODE, &
  1287. & COMPONENT_NUMBER, CMISS_BOUNDARY_CONDITION_FIXED,VALUE,Err)
  1288. WRITE(*,*) "SPECIFIED IMPERMEABLE WALL AT NODE",NODE,"IN Y DIRECTION"
  1289. ! ! ENDIF
  1290. ENDDO
  1291. DO NN=1,SIZE(Face10Nodes,1)
  1292. NODE=Face10Nodes(NN)
  1293. ! ! CALL CMISSDecomposition_NodeDomainGet(Decomposition,NODE,1,NodeDomain,Err)
  1294. ! ! IF(NodeDomain==ComputationalNodeNumber) THEN
  1295. VALUE = 0.0_CMISSDP
  1296. COMPONENT_NUMBER = 2
  1297. write(*,*)'Marker 4'
  1298. CALL CMISSBoundaryConditions_SetNode(BoundaryConditionsDarcy,DependentFieldSolid,CMISS_FIELD_V_VARIABLE_TYPE,1,1,NODE, &
  1299. & COMPONENT_NUMBER, CMISS_BOUNDARY_CONDITION_FIXED,VALUE,Err)
  1300. WRITE(*,*) "SPECIFIED IMPERMEABLE WALL AT NODE",NODE,"IN Y DIRECTION"
  1301. ! ! ENDIF
  1302. ENDDO
  1303. DO NN=1,SIZE(Face12Nodes,1)
  1304. NODE=Face12Nodes(NN)
  1305. ! ! CALL CMISSDecomposition_NodeDomainGet(Decomposition,NODE,1,NodeDomain,Err)
  1306. ! ! IF(NodeDomain==ComputationalNodeNumber) THEN
  1307. VALUE = 0.0_CMISSDP
  1308. COMPONENT_NUMBER = 3
  1309. write(*,*)'Marker 5'
  1310. CALL CMISSBoundaryConditions_SetNode(BoundaryConditionsDarcy,DependentFieldSolid,CMISS_FIELD_V_VARIABLE_TYPE,1,1,NODE, &
  1311. & COMPONENT_NUMBER, CMISS_BOUNDARY_CONDITION_FIXED,VALUE,Err)
  1312. WRITE(*,*) "SPECIFIED IMPERMEABLE WALL AT NODE",NODE,"IN Z DIRECTION"
  1313. ! ! ENDIF
  1314. ENDDO
  1315. ENDIF
  1316. !Compartment TWO boundary conditions!
  1317. ! At the top impose Darcy velocity in z direction
  1318. IF(icompartment==2) THEN
  1319. DO NN=1,SIZE(Face11Nodes,1)
  1320. NODE=Face11Nodes(NN)
  1321. ! ! CALL CMISSDecomposition_NodeDomainGet(Decomposition,NODE,1,NodeDomain,Err)
  1322. ! ! IF(NodeDomain==ComputationalNodeNumber) THEN
  1323. VALUE = -1.0_CMISSDP
  1324. COMPONENT_NUMBER = 3
  1325. write(*,*)'Marker 0'
  1326. CALL CMISSBoundaryConditions_SetNode(BoundaryConditionsDarcy,DependentFieldSolid,CMISS_FIELD_U1_VARIABLE_TYPE,1,1,NODE, &
  1327. & COMPONENT_NUMBER, CMISS_BOUNDARY_CONDITION_FIXED,VALUE,Err)
  1328. WRITE(*,*) "SPECIFIED INFLOW AT NODE",NODE,"IN Z DIRECTION"
  1329. ! ! CALL CMISSField_ParameterSetGetNode(GeometricField,CMISS_FIELD_U_VARIABLE_TYPE,CMISS_FIELD_VALUES_SET_TYPE,1,NODE,1,XCoord,Err)
  1330. ! ! CALL CMISSField_ParameterSetGetNode(GeometricField,CMISS_FIELD_U_VARIABLE_TYPE,CMISS_FIELD_VALUES_SET_TYPE,1,NODE,2,YCoord,Err)
  1331. ! ! CALL CMISSField_ParameterSetGetNode(GeometricField,CMISS_FIELD_U_VARIABLE_TYPE,CMISS_FIELD_VALUES_SET_TYPE,1,NODE,3,ZCoord,Err)
  1332. ! ! WRITE(*,*) "XCoord, YCoord, ZCoord = ",XCoord, YCoord, ZCoord
  1333. ! ! ENDIF
  1334. ENDDO
  1335. ! DO NN=1,SIZE(Face11Nodes,1)
  1336. ! NODE=Face11Nodes(NN)
  1337. ! ! ! CALL CMISSDecomposition_NodeDomainGet(Decomposition,NODE,1,NodeDomain,Err)
  1338. ! ! ! IF(NodeDomain==ComputationalNodeNumber) THEN
  1339. ! VALUE = 0.0_CMISSDP
  1340. ! COMPONENT_NUMBER = 3
  1341. ! write(*,*)'Marker 0'
  1342. ! CALL CMISSBoundaryConditions_SetNode(BoundaryConditionsDarcy,DependentFieldSolid,CMISS_FIELD_U1_VARIABLE_TYPE,1,1,NODE,COMPONENT_NUMBER,&
  1343. ! & CMISS_BOUNDARY_CONDITION_FIXED,VALUE,Err)
  1344. ! WRITE(*,*) "SPECIFIED IMPERMEABLE WALL AT NODE",NODE,"IN Z DIRECTION"
  1345. !
  1346. ! ! ! CALL CMISSField_ParameterSetGetNode(GeometricField,CMISS_FIELD_U_VARIABLE_TYPE,CMISS_FIELD_VALUES_SET_TYPE,1,NODE,1,XCoord,Err)
  1347. ! ! ! CALL CMISSField_ParameterSetGetNode(GeometricField,CMISS_FIELD_U_VARIABLE_TYPE,CMISS_FIELD_VALUES_SET_TYPE,1,NODE,2,YCoord,Err)
  1348. ! ! ! CALL CMISSField_ParameterSetGetNode(GeometricField,CMISS_FIELD_U_VARIABLE_TYPE,CMISS_FIELD_VALUES_SET_TYPE,1,NODE,3,ZCoord,Err)
  1349. ! ! ! WRITE(*,*) "XCoord, YCoord, ZCoord = ",XCoord, YCoord, ZCoord
  1350. ! ! ! ENDIF
  1351. ! ENDDO
  1352. !All other faces are impermeable
  1353. DO NN=1,SIZE(Face7Nodes,1)
  1354. NODE=Face7Nodes(NN)
  1355. ! ! CALL CMISSDecomposition_NodeDomainGet(Decomposition,NODE,1,NodeDomain,Err)
  1356. ! ! IF(NodeDomain==ComputationalNodeNumber) THEN
  1357. VALUE = 0.0_CMISSDP
  1358. COMPONENT_NUMBER = 1
  1359. write(*,*)'Marker 1'
  1360. CALL CMISSBoundaryConditions_SetNode(BoundaryConditionsDarcy,DependentFieldSolid,CMISS_FIELD_U1_VARIABLE_TYPE,1,1,NODE, &
  1361. & COMPONENT_NUMBER, CMISS_BOUNDARY_CONDITION_FIXED,VALUE,Err)
  1362. WRITE(*,*) "SPECIFIED IMPERMEABLE WALL AT NODE",NODE,"IN X DIRECTION"
  1363. ! ! ENDIF
  1364. ENDDO
  1365. DO NN=1,SIZE(Face8Nodes,1)
  1366. NODE=Face8Nodes(NN)
  1367. ! ! CALL CMISSDecomposition_NodeDomainGet(Decomposition,NODE,1,NodeDomain,Err)
  1368. ! ! IF(NodeDomain==ComputationalNodeNumber) THEN
  1369. VALUE = 0.0_CMISSDP
  1370. COMPONENT_NUMBER = 1
  1371. write(*,*)'Marker 2'
  1372. CALL CMISSBoundaryConditions_SetNode(BoundaryConditionsDarcy,DependentFieldSolid,CMISS_FIELD_U1_VARIABLE_TYPE,1,1,NODE, &
  1373. & COMPONENT_NUMBER, CMISS_BOUNDARY_CONDITION_FIXED,VALUE,Err)
  1374. WRITE(*,*) "SPECIFIED IMPERMEABLE WALL AT NODE",NODE,"IN X DIRECTION"
  1375. ! ! ENDIF
  1376. ENDDO
  1377. DO NN=1,SIZE(Face9Nodes,1)
  1378. NODE=Face9Nodes(NN)
  1379. ! ! CALL CMISSDecomposition_NodeDomainGet(Decomposition,NODE,1,NodeDomain,Err)
  1380. ! ! IF(NodeDomain==ComputationalNodeNumber) THEN
  1381. VALUE = 0.0_CMISSDP
  1382. COMPONENT_NUMBER = 2
  1383. write(*,*)'Marker 3'
  1384. CALL CMISSBoundaryConditions_SetNode(BoundaryConditionsDarcy,DependentFieldSolid,CMISS_FIELD_U1_VARIABLE_TYPE,1,1,NODE, &
  1385. & COMPONENT_NUMBER, CMISS_BOUNDARY_CONDITION_FIXED,VALUE,Err)
  1386. WRITE(*,*) "SPECIFIED IMPERMEABLE WALL AT NODE",NODE,"IN Y DIRECTION"
  1387. ! ! ENDIF
  1388. ENDDO
  1389. DO NN=1,SIZE(Face10Nodes,1)
  1390. NODE=Face10Nodes(NN)
  1391. ! ! CALL CMISSDecomposition_NodeDomainGet(Decomposition,NODE,1,NodeDomain,Err)
  1392. ! ! IF(NodeDomain==ComputationalNodeNumber) THEN
  1393. VALUE = 0.0_CMISSDP
  1394. COMPONENT_NUMBER = 2
  1395. write(*,*)'Marker 4'
  1396. CALL CMISSBoundaryConditions_SetNode(BoundaryConditionsDarcy,DependentFieldSolid,CMISS_FIELD_U1_VARIABLE_TYPE,1,1,NODE, &
  1397. & COMPONENT_NUMBER,CMISS_BOUNDARY_CONDITION_FIXED,VALUE,Err)
  1398. WRITE(*,*) "SPECIFIED IMPERMEABLE WALL AT NODE",NODE,"IN Y DIRECTION"
  1399. ! ! ENDIF
  1400. ENDDO
  1401. DO NN=1,SIZE(Face12Nodes,1)
  1402. NODE=Face12Nodes(NN)
  1403. ! ! CALL CMISSDecomposition_NodeDomainGet(Decomposition,NODE,1,NodeDomain,Err)
  1404. ! ! IF(NodeDomain==ComputationalNodeNumber) THEN
  1405. VALUE = 0.0_CMISSDP
  1406. COMPONENT_NUMBER = 3
  1407. write(*,*)'Marker 5'
  1408. CALL CMISSBoundaryConditions_SetNode(BoundaryConditionsDarcy,DependentFieldSolid,CMISS_FIELD_U1_VARIABLE_TYPE,1,1,NODE, &
  1409. & COMPONENT_NUMBER,CMISS_BOUNDARY_CONDITION_FIXED,VALUE,Err)
  1410. WRITE(*,*) "SPECIFIED IMPERMEABLE WALL AT NODE",NODE,"IN Z DIRECTION"
  1411. ! ! ENDIF
  1412. ENDDO
  1413. ENDIF
  1414. !BOUNDARY CONDITIONS
  1415. !Start the creation of the equations set boundary conditions for Darcy
  1416. ! DO icompartment=1,Ncompartments
  1417. ! CALL CMISSBoundaryConditions_Initialise(BoundaryConditionsDarcy,DependentFieldSolid,Err)
  1418. ! CALL CMISSEquationsSetBoundaryConditionsCreateStart(EquationsSetDarcy(icompartment),BoundaryConditionsDarcy,DependentFieldSolid,Err)
  1419. ! CALL CMISSEquationsSetBoundaryConditionsCreateFinish(EquationsSetDarcy(icompartment),Err)
  1420. ENDDO
  1421. CALL CMISSSolverEquations_BoundaryConditionsCreateFinish(SolverEquationsDarcy,Err)
  1422. !
  1423. !================================================================================================================================
  1424. !
  1425. !RUN SOLVERS
  1426. !Turn of PETSc error handling
  1427. !CALL PETSC_ERRORHANDLING_SET_ON(ERR,ERROR,*999)
  1428. !Solve the problem
  1429. WRITE(*,'(A)') "Solving problem..."
  1430. CALL CMISSProblem_Solve(Problem,Err)
  1431. WRITE(*,'(A)') "Problem solved!"
  1432. !
  1433. !================================================================================================================================
  1434. !
  1435. !OUTPUT
  1436. WRITE(*,*)'dummy_counter = ',dummy_counter
  1437. EXPORT_FIELD_IO=.FALSE.
  1438. IF(EXPORT_FIELD_IO) THEN
  1439. WRITE(*,'(A)') "Exporting fields..."
  1440. CALL CMISSFields_Initialise(Fields,Err)
  1441. CALL CMISSFields_Create(Region,Fields,Err)
  1442. CALL CMISSFields_NodesExport(Fields,"FiniteElasticityMultiCompDarcy","FORTRAN",Err)
  1443. CALL CMISSFields_ElementsExport(Fields,"FiniteElasticityMultiCompDarcy","FORTRAN",Err)
  1444. CALL CMISSFields_Finalise(Fields,Err)
  1445. WRITE(*,'(A)') "Field exported!"
  1446. ENDIF
  1447. !Finialise CMISS
  1448. ! CALL CMISSFinalise(Err)
  1449. IF (ALLOCATED(EquationsSetFieldDarcy)) DEALLOCATE(EquationsSetFieldDarcy)
  1450. IF (ALLOCATED(EquationsSetDarcy)) DEALLOCATE(EquationsSetDarcy)
  1451. IF (ALLOCATED(MaterialsFieldDarcy)) DEALLOCATE(MaterialsFieldDarcy)
  1452. IF (ALLOCATED(BoundaryConditionsDarcy)) DEALLOCATE(BoundaryConditionsDarcy)
  1453. IF (ALLOCATED(EquationsDarcy)) DEALLOCATE(EquationsDarcy)
  1454. WRITE(*,'(A)') "Program successfully completed."
  1455. STOP
  1456. END PROGRAM FINITEELASTICITYMULTICOMPDARCYEXAMPLE