PageRenderTime 66ms CodeModel.GetById 21ms RepoModel.GetById 0ms app.codeStats 0ms

/MultiPhysics/Poroelasticity/FiniteElasticityDarcy/IncompressibleElasticityDrivenDarcyIO/src/IncompressibleElasticityDrivenDarcyIOExample.f90

http://github.com/xyan075/examples
FORTRAN Modern | 1137 lines | 571 code | 184 blank | 382 comment | 0 complexity | fa0189050314fecf43370947ff8449ab MD5 | raw file
  1. !> \file
  2. !> \author Christian Michler, Adam Reeve
  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 Darcy problem
  50. ! !
  51. !> Main program
  52. PROGRAM FINITEELASTICITYDARCYIOEXAMPLE
  53. !
  54. !================================================================================================================================
  55. !
  56. !PROGRAM LIBRARIES
  57. USE OPENCMISS
  58. ! USE FLUID_MECHANICS_IO_ROUTINES
  59. USE IOSTUFF
  60. USE MPI
  61. #ifdef WIN32
  62. USE IFQWINCMISS
  63. #endif
  64. !
  65. !================================================================================================================================
  66. !
  67. !PROGRAM VARIABLES AND TYPES
  68. IMPLICIT NONE
  69. !Test program parameters
  70. REAL(CMISSDP), PARAMETER :: Y_DIM=1.0_CMISSDP
  71. REAL(CMISSDP), PARAMETER :: X_DIM=1.0_CMISSDP
  72. REAL(CMISSDP), PARAMETER :: Z_DIM=1.0_CMISSDP
  73. INTEGER(CMISSIntg), PARAMETER :: LinearBasisUserNumber=1
  74. INTEGER(CMISSIntg), PARAMETER :: QuadraticBasisUserNumber=2
  75. INTEGER(CMISSIntg), PARAMETER :: CubicBasisUserNumber=3
  76. INTEGER(CMISSIntg), PARAMETER :: CoordinateSystemUserNumber=1
  77. INTEGER(CMISSIntg), PARAMETER :: RegionUserNumber=2
  78. INTEGER(CMISSIntg), PARAMETER :: MeshUserNumber=3
  79. INTEGER(CMISSIntg), PARAMETER :: DecompositionUserNumber=4
  80. INTEGER(CMISSIntg), PARAMETER :: GeometricFieldUserNumber=5
  81. INTEGER(CMISSIntg), PARAMETER :: MaterialsFieldUserNumberDarcy=8
  82. INTEGER(CMISSIntg), PARAMETER :: EquationsSetUserNumberDarcy=12
  83. INTEGER(CMISSIntg), PARAMETER :: ProblemUserNumber=14
  84. INTEGER(CMISSIntg), PARAMETER :: EquationsSetFieldUserNumberDarcy=22
  85. INTEGER(CMISSIntg), PARAMETER :: ControlLoopSolidNumber=1
  86. INTEGER(CMISSIntg), PARAMETER :: ControlLoopFluidNumber=2
  87. INTEGER(CMISSIntg), PARAMETER :: ControlLoopSubiterationNumber=1
  88. INTEGER(CMISSIntg), PARAMETER :: SolverSolidIndex=1
  89. INTEGER(CMISSIntg), PARAMETER :: SolverDarcyIndex=1
  90. INTEGER(CMISSIntg), PARAMETER :: MaterialsFieldUserNumberDarcyPorosity=1
  91. INTEGER(CMISSIntg), PARAMETER :: MaterialsFieldUserNumberDarcyPermOverVis=2
  92. INTEGER(CMISSIntg), PARAMETER :: FieldGeometryNumberOfVariables=1
  93. INTEGER(CMISSIntg), PARAMETER :: FieldGeometryNumberOfComponents=3
  94. !Program types
  95. !Program variables
  96. INTEGER(CMISSIntg) :: NUMBER_GLOBAL_X_ELEMENTS,NUMBER_GLOBAL_Y_ELEMENTS,NUMBER_GLOBAL_Z_ELEMENTS
  97. ! INTEGER(CMISSIntg) :: MPI_IERROR
  98. INTEGER(CMISSIntg) :: NumberOfComputationalNodes,NumberOfDomains,ComputationalNodeNumber
  99. INTEGER(CMISSIntg) :: NUMBER_OF_DIMENSIONS
  100. INTEGER(CMISSIntg) :: MAXIMUM_ITERATIONS
  101. INTEGER(CMISSIntg) :: RESTART_VALUE
  102. INTEGER(CMISSIntg) :: EQUATIONS_DARCY_OUTPUT
  103. INTEGER(CMISSIntg) :: COMPONENT_NUMBER
  104. INTEGER(CMISSIntg) :: DYNAMIC_SOLVER_DARCY_OUTPUT_FREQUENCY
  105. INTEGER(CMISSIntg) :: DYNAMIC_SOLVER_DARCY_OUTPUT_TYPE
  106. INTEGER(CMISSIntg) :: LINEAR_SOLVER_DARCY_OUTPUT_TYPE
  107. INTEGER(CMISSIntg) :: LINEAR_SOLVER_MAT_PROPERTIES_OUTPUT_TYPE
  108. REAL(CMISSDP) :: GEOMETRY_TOLERANCE
  109. INTEGER(CMISSIntg) :: BASIS_XI_INTERPOLATION_SOLID
  110. REAL(CMISSDP) :: INITIAL_FIELD_DARCY(4)
  111. REAL(CMISSDP) :: DIVERGENCE_TOLERANCE
  112. REAL(CMISSDP) :: RELATIVE_TOLERANCE
  113. REAL(CMISSDP) :: ABSOLUTE_TOLERANCE
  114. REAL(CMISSDP) :: LINESEARCH_ALPHA
  115. REAL(CMISSDP) :: VALUE
  116. REAL(CMISSDP) :: POROSITY_PARAM_DARCY, PERM_OVER_VIS_PARAM_DARCY
  117. LOGICAL :: EXPORT_FIELD_IO
  118. LOGICAL :: LINEAR_SOLVER_DARCY_DIRECT_FLAG
  119. !CMISS variables
  120. !Regions
  121. TYPE(CMISSRegionType) :: Region
  122. TYPE(CMISSRegionType) :: WorldRegion
  123. !Coordinate systems
  124. TYPE(CMISSCoordinateSystemType) :: CoordinateSystem
  125. TYPE(CMISSCoordinateSystemType) :: WorldCoordinateSystem
  126. !Basis
  127. ! TYPE(CMISSBasisType) :: CubicBasis, QuadraticBasis, LinearBasis, Bases(2)
  128. TYPE(CMISSBasisType),allocatable :: Bases(:)
  129. !Meshes
  130. TYPE(CMISSMeshType) :: Mesh
  131. TYPE(CMISSGeneratedMeshType) :: GeneratedMesh
  132. !Decompositions
  133. TYPE(CMISSDecompositionType) :: Decomposition
  134. !Fields
  135. TYPE(CMISSFieldsType) :: Fields
  136. !Field types
  137. TYPE(CMISSFieldType) :: GeometricField
  138. TYPE(CMISSFieldType) :: MaterialsFieldDarcy
  139. TYPE(CMISSFieldType) :: EquationsSetFieldDarcy
  140. !Boundary conditions
  141. TYPE(CMISSBoundaryConditionsType) :: BoundaryConditionsDarcy
  142. !Equations sets
  143. TYPE(CMISSEquationsSetType) :: EquationsSetDarcy
  144. !Equations
  145. TYPE(CMISSEquationsType) :: EquationsDarcy
  146. !Problems
  147. TYPE(CMISSProblemType) :: Problem
  148. !Control loops
  149. TYPE(CMISSControlLoopType) :: ControlLoop
  150. !Solvers
  151. TYPE(CMISSSolverType) :: DynamicSolverDarcy
  152. TYPE(CMISSSolverType) :: LinearSolverDarcy
  153. ! TYPE(CMISSSolverType) :: LinearSolverSolid
  154. !Solver equations
  155. TYPE(CMISSSolverEquationsType) :: SolverEquationsDarcy
  156. ! nodes and elements
  157. TYPE(CMISSNodesType) :: Nodes
  158. TYPE(CMISSMeshElementsType),allocatable :: Elements(:)
  159. !Other variables
  160. INTEGER(CMISSIntg),ALLOCATABLE,TARGET :: Face1Nodes(:),Face2Nodes(:)
  161. INTEGER(CMISSIntg),ALLOCATABLE,TARGET :: Face3Nodes(:),Face4Nodes(:)
  162. INTEGER(CMISSIntg),ALLOCATABLE,TARGET :: Face5Nodes(:),Face6Nodes(:)
  163. INTEGER(CMISSIntg),ALLOCATABLE,TARGET :: Face7Nodes(:),Face8Nodes(:)
  164. INTEGER(CMISSIntg),ALLOCATABLE,TARGET :: Face9Nodes(:),Face10Nodes(:)
  165. INTEGER(CMISSIntg),ALLOCATABLE,TARGET :: Face11Nodes(:),Face12Nodes(:)
  166. INTEGER(CMISSIntg) :: FaceXi(6)
  167. INTEGER(CMISSIntg) :: NN,NODE,NodeDomain
  168. REAL(CMISSDP) :: XCoord,YCoord,ZCoord
  169. LOGICAL :: X_FIXED,Y_FIXED !,X_OKAY,Y_OKAY
  170. #ifdef WIN32
  171. !Quickwin type
  172. LOGICAL :: QUICKWIN_STATUS=.FALSE.
  173. TYPE(WINDOWCONFIG) :: QUICKWIN_WINDOW_CONFIG
  174. #endif
  175. !Generic CMISS variables
  176. INTEGER(CMISSIntg) :: EquationsSetIndex
  177. INTEGER(CMISSIntg) :: Err
  178. INTEGER(CMISSIntg) :: DIAG_LEVEL_LIST(5)
  179. ! CHARACTER(LEN=255) :: DIAG_ROUTINE_LIST(8) !,TIMING_ROUTINE_LIST(1)
  180. CHARACTER(LEN=255) :: DIAG_ROUTINE_LIST(1) !,TIMING_ROUTINE_LIST(1)
  181. !
  182. !--------------------------------------------------------------------------------------------------------------------------------
  183. !
  184. !Program variables and types (finite elasticity part)
  185. !Test program parameters
  186. INTEGER(CMISSIntg) :: SolidMeshComponenetNumber
  187. INTEGER(CMISSIntg), PARAMETER :: FieldGeometrySolidUserNumber=1
  188. INTEGER(CMISSIntg), PARAMETER :: FieldGeometrySolidNumberOfVariables=1
  189. INTEGER(CMISSIntg), PARAMETER :: FieldGeometrySolidNumberOfComponents=3
  190. INTEGER(CMISSIntg), PARAMETER :: FieldFibreSolidUserNumber=2
  191. INTEGER(CMISSIntg), PARAMETER :: FieldFibreSolidNumberOfVariables=1
  192. INTEGER(CMISSIntg), PARAMETER :: FieldFibreSolidNumberOfComponents=3
  193. INTEGER(CMISSIntg), PARAMETER :: FieldMaterialSolidUserNumber=3
  194. INTEGER(CMISSIntg), PARAMETER :: FieldMaterialSolidNumberOfVariables=1
  195. INTEGER(CMISSIntg), PARAMETER :: FieldMaterialSolidNumberOfComponents=3
  196. INTEGER(CMISSIntg), PARAMETER :: FieldDependentSolidUserNumber=4
  197. INTEGER(CMISSIntg), PARAMETER :: FieldDependentSolidNumberOfVariables=4
  198. INTEGER(CMISSIntg), PARAMETER :: FieldDependentSolidNumberOfComponents=4
  199. INTEGER(CMISSIntg), PARAMETER :: FieldDependentFluidNumberOfComponents=4 !(u,v,w,m)
  200. INTEGER(CMISSIntg), PARAMETER :: EquationSetSolidUserNumber=1
  201. INTEGER(CMISSIntg), PARAMETER :: EquationsSetFieldSolidUserNumber=25
  202. INTEGER(CMISSIntg), PARAMETER :: SolidDisplMeshComponentNumber=1
  203. INTEGER(CMISSIntg), PARAMETER :: SolidLagrMultMeshComponentNumber=2
  204. INTEGER(CMISSIntg), PARAMETER :: SolidGeometryMeshComponentNumber=SolidDisplMeshComponentNumber
  205. INTEGER(CMISSIntg), PARAMETER :: DarcyVelMeshComponentNumber=SolidLagrMultMeshComponentNumber
  206. INTEGER(CMISSIntg), PARAMETER :: DarcyMassIncreaseMeshComponentNumber=SolidLagrMultMeshComponentNumber
  207. ! INTEGER(CMISSIntg), PARAMETER :: DarcyGeometryMeshComponentNumber=SolidDisplMeshComponentNumber
  208. INTEGER(CMISSIntg), PARAMETER :: GeneratedMeshUserNumber=32
  209. !Program types
  210. !Program variables
  211. REAL(CMISSDP) :: DYNAMIC_SOLVER_DARCY_START_TIME
  212. REAL(CMISSDP) :: DYNAMIC_SOLVER_DARCY_STOP_TIME
  213. REAL(CMISSDP) :: DYNAMIC_SOLVER_DARCY_THETA
  214. REAL(CMISSDP) :: DYNAMIC_SOLVER_DARCY_TIME_INCREMENT
  215. !CMISS variables
  216. TYPE(CMISSBoundaryConditionsType) :: BoundaryConditionsSolid
  217. TYPE(CMISSEquationsType) :: EquationsSolid
  218. TYPE(CMISSEquationsSetType) :: EquationsSetSolid
  219. TYPE(CMISSFieldType) :: GeometricFieldSolid,FibreFieldSolid,MaterialFieldSolid
  220. TYPE(CMISSFieldType) :: DependentFieldSolid,EquationsSetFieldSolid
  221. TYPE(CMISSSolverType) :: SolverSolid
  222. TYPE(CMISSSolverEquationsType) :: SolverEquationsSolid
  223. !End - Program variables and types (finite elasticity part)
  224. !
  225. !--------------------------------------------------------------------------------------------------------------------------------
  226. !
  227. #ifdef WIN32
  228. !Initialise QuickWin
  229. QUICKWIN_WINDOW_CONFIG%TITLE="General Output" !Window title
  230. QUICKWIN_WINDOW_CONFIG%NUMTEXTROWS=-1 !Max possible number of rows
  231. QUICKWIN_WINDOW_CONFIG%MODE=QWIN$SCROLLDOWN
  232. !Set the window parameters
  233. QUICKWIN_STATUS=SETWINDOWCONFIG(QUICKWIN_WINDOW_CONFIG)
  234. !If attempt fails set with system estimated values
  235. IF(.NOT.QUICKWIN_STATUS) QUICKWIN_STATUS=SETWINDOWCONFIG(QUICKWIN_WINDOW_CONFIG)
  236. #endif
  237. !
  238. !================================================================================================================================
  239. !
  240. NUMBER_GLOBAL_X_ELEMENTS=1
  241. NUMBER_GLOBAL_Y_ELEMENTS=1
  242. NUMBER_GLOBAL_Z_ELEMENTS=3
  243. IF(NUMBER_GLOBAL_Z_ELEMENTS==0)THEN
  244. NUMBER_OF_DIMENSIONS=2
  245. ELSE
  246. NUMBER_OF_DIMENSIONS=3
  247. ENDIF
  248. !PROBLEM CONTROL PANEL
  249. ! BASIS_XI_INTERPOLATION_SOLID=CMISS_BASIS_LINEAR_LAGRANGE_INTERPOLATION
  250. BASIS_XI_INTERPOLATION_SOLID=CMISS_BASIS_QUADRATIC_LAGRANGE_INTERPOLATION
  251. !Set geometric tolerance
  252. GEOMETRY_TOLERANCE = 1.0E-12_CMISSDP
  253. !Set initial values
  254. INITIAL_FIELD_DARCY(1)=0.0_CMISSDP
  255. INITIAL_FIELD_DARCY(2)=0.0_CMISSDP
  256. INITIAL_FIELD_DARCY(3)=0.0_CMISSDP
  257. INITIAL_FIELD_DARCY(4)=0.0_CMISSDP
  258. !Set material parameters
  259. POROSITY_PARAM_DARCY=0.1_CMISSDP
  260. PERM_OVER_VIS_PARAM_DARCY=1.0_CMISSDP
  261. !Set output parameter
  262. !(NoOutput/ProgressOutput/TimingOutput/SolverOutput/SolverMatrixOutput)
  263. DYNAMIC_SOLVER_DARCY_OUTPUT_TYPE=CMISS_SOLVER_PROGRESS_OUTPUT
  264. LINEAR_SOLVER_DARCY_OUTPUT_TYPE=CMISS_SOLVER_SOLVER_OUTPUT
  265. !(NoOutput/TimingOutput/MatrixOutput/ElementOutput)
  266. EQUATIONS_DARCY_OUTPUT=CMISS_EQUATIONS_NO_OUTPUT
  267. !Set time parameter
  268. DYNAMIC_SOLVER_DARCY_START_TIME=0.0_CMISSDP
  269. DYNAMIC_SOLVER_DARCY_TIME_INCREMENT=1.0e-3_CMISSDP
  270. DYNAMIC_SOLVER_DARCY_STOP_TIME=2_CMISSIntg * DYNAMIC_SOLVER_DARCY_TIME_INCREMENT
  271. DYNAMIC_SOLVER_DARCY_THETA=1.0_CMISSDP !2.0_CMISSDP/3.0_CMISSDP
  272. !Set result output parameter
  273. DYNAMIC_SOLVER_DARCY_OUTPUT_FREQUENCY=1
  274. !Set solver parameters
  275. LINEAR_SOLVER_DARCY_DIRECT_FLAG=.TRUE.
  276. RELATIVE_TOLERANCE=1.0E-10_CMISSDP !default: 1.0E-05_CMISSDP
  277. ABSOLUTE_TOLERANCE=1.0E-10_CMISSDP !default: 1.0E-10_CMISSDP
  278. DIVERGENCE_TOLERANCE=1.0E5_CMISSDP !default: 1.0E5
  279. MAXIMUM_ITERATIONS=10000_CMISSIntg !default: 100000
  280. RESTART_VALUE=30_CMISSIntg !default: 30
  281. LINESEARCH_ALPHA=1.0_CMISSDP
  282. !
  283. !================================================================================================================================
  284. !
  285. !INITIALISE OPENCMISS
  286. CALL CMISSInitialise(WorldCoordinateSystem,WorldRegion,Err)
  287. CALL CMISSErrorHandlingModeSet(CMISS_ERRORS_TRAP_ERROR,Err)
  288. !
  289. !================================================================================================================================
  290. !
  291. !Set diagnostics
  292. DIAG_LEVEL_LIST(1)=1
  293. DIAG_LEVEL_LIST(2)=2
  294. DIAG_LEVEL_LIST(3)=3
  295. DIAG_LEVEL_LIST(4)=4
  296. DIAG_LEVEL_LIST(5)=5
  297. DIAG_ROUTINE_LIST(1)="WRITE_IP_INFO"
  298. ! DIAG_ROUTINE_LIST(2)="FINITE_ELASTICITY_GAUSS_CAUCHY_TENSOR"
  299. !CMISS_ALL_DIAG_TYPE/CMISS_IN_DIAG_TYPE/CMISS_FROM_DIAG_TYPE
  300. CALL CMISSDiagnosticsSetOn(CMISS_IN_DIAG_TYPE,DIAG_LEVEL_LIST,"Diagnostics",DIAG_ROUTINE_LIST,Err)
  301. !CMISS_ALL_TIMING_TYPE/CMISS_IN_TIMING_TYPE/CMISS_FROM_TIMING_TYPE
  302. !TIMING_ROUTINE_LIST(1)="PROBLEM_FINITE_ELEMENT_CALCULATE"
  303. !CALL TIMING_SET_ON(IN_TIMING_TYPE,.TRUE.,"",TIMING_ROUTINE_LIST,ERR,ERROR,*999)
  304. !
  305. !================================================================================================================================
  306. !
  307. !Get the number of computational nodes and this computational node number
  308. CALL CMISSComputationalNumberOfNodesGet(NumberOfComputationalNodes,Err)
  309. CALL CMISSComputationalNodeNumberGet(ComputationalNodeNumber,Err)
  310. NumberOfDomains = NumberOfComputationalNodes
  311. write(*,*) "NumberOfDomains = ",NumberOfDomains
  312. !
  313. !================================================================================================================================
  314. !
  315. !COORDINATE SYSTEM
  316. CALL CMISSCoordinateSystem_Initialise(CoordinateSystem,Err)
  317. CALL CMISSCoordinateSystem_CreateStart(CoordinateSystemUserNumber,CoordinateSystem,Err)
  318. CALL CMISSCoordinateSystem_DimensionSet(CoordinateSystem,NUMBER_OF_DIMENSIONS,Err)
  319. CALL CMISSCoordinateSystem_CreateFinish(CoordinateSystem,Err)
  320. !
  321. !================================================================================================================================
  322. !
  323. !REGION
  324. !For a volume-coupled problem, solid and fluid are based in the same region
  325. CALL CMISSRegion_Initialise(Region,Err)
  326. CALL CMISSRegion_CreateStart(RegionUserNumber,WorldRegion,Region,Err)
  327. CALL CMISSRegion_CoordinateSystemSet(Region,CoordinateSystem,Err)
  328. CALL CMISSRegion_CreateFinish(Region,Err)
  329. !
  330. !================================================================================================================================
  331. !
  332. call READ_MESH('input/example-mesh-3els',MeshUserNumber,Region, Mesh,Bases,Nodes,Elements)
  333. ! !BASES
  334. ! !Define basis functions
  335. ! CALL CMISSBasis_Initialise(LinearBasis,Err)
  336. ! CALL CMISSBasis_CreateStart(LinearBasisUserNumber,LinearBasis,Err)
  337. ! CALL CMISSBasis_QuadratureNumberOfGaussXiSet(LinearBasis, &
  338. ! & (/CMISS_BASIS_HIGH_QUADRATURE_SCHEME,CMISS_BASIS_HIGH_QUADRATURE_SCHEME,CMISS_BASIS_HIGH_QUADRATURE_SCHEME/),Err)
  339. ! !CALL CMISSBasis_QuadratureLocalFaceGaussEvaluateSet(LinearBasis,.true.,Err)
  340. ! CALL CMISSBasis_CreateFinish(LinearBasis,Err)
  341. !
  342. ! CALL CMISSBasis_Initialise(QuadraticBasis,Err)
  343. ! CALL CMISSBasis_CreateStart(QuadraticBasisUserNumber,QuadraticBasis,Err)
  344. ! CALL CMISSBasis_InterpolationXiSet(QuadraticBasis,(/CMISS_BASIS_QUADRATIC_LAGRANGE_INTERPOLATION, &
  345. ! & CMISS_BASIS_QUADRATIC_LAGRANGE_INTERPOLATION,CMISS_BASIS_QUADRATIC_LAGRANGE_INTERPOLATION/),Err)
  346. ! CALL CMISSBasis_QuadratureNumberOfGaussXiSet(QuadraticBasis, &
  347. ! & (/CMISS_BASIS_HIGH_QUADRATURE_SCHEME,CMISS_BASIS_HIGH_QUADRATURE_SCHEME,CMISS_BASIS_HIGH_QUADRATURE_SCHEME/),Err)
  348. ! !CALL CMISSBasis_QuadratureLocalFaceGaussEvaluateSet(QuadraticBasis,.true.,Err)
  349. ! CALL CMISSBasis_CreateFinish(QuadraticBasis,Err)
  350. !
  351. ! CALL CMISSBasis_Initialise(CubicBasis,Err)
  352. ! CALL CMISSBasis_CreateStart(CubicBasisUserNumber,CubicBasis,Err)
  353. ! CALL CMISSBasis_InterpolationXiSet(CubicBasis,(/CMISS_BASIS_CUBIC_LAGRANGE_INTERPOLATION, &
  354. ! & CMISS_BASIS_CUBIC_LAGRANGE_INTERPOLATION,CMISS_BASIS_CUBIC_LAGRANGE_INTERPOLATION/),Err)
  355. ! CALL CMISSBasis_QuadratureNumberOfGaussXiSet(CubicBasis, &
  356. ! & (/CMISS_BASIS_HIGH_QUADRATURE_SCHEME,CMISS_BASIS_HIGH_QUADRATURE_SCHEME,CMISS_BASIS_HIGH_QUADRATURE_SCHEME/),Err)
  357. ! !CALL CMISSBasis_QuadratureLocalFaceGaussEvaluateSet(CubicBasis,.true.,Err) !Enable 3D interpolation on faces
  358. ! CALL CMISSBasis_CreateFinish(CubicBasis,Err)
  359. !
  360. ! !LinearBasis/QuadraticBasis/CubicBasis
  361. ! Bases(1)=QuadraticBasis
  362. ! Bases(2)=LinearBasis
  363. !
  364. ! !Start the creation of a generated mesh in the region
  365. ! CALL CMISSGeneratedMesh_Initialise(GeneratedMesh,Err)
  366. ! CALL CMISSGeneratedMesh_CreateStart(GeneratedMeshUserNumber,Region,GeneratedMesh,Err)
  367. ! CALL CMISSGeneratedMesh_TypeSet(GeneratedMesh,CMISS_GENERATED_MESH_REGULAR_MESH_TYPE,Err)
  368. ! CALL CMISSGeneratedMesh_BasisSet(GeneratedMesh,Bases,Err)
  369. ! IF(NUMBER_GLOBAL_Z_ELEMENTS==0) THEN
  370. ! CALL CMISSGeneratedMesh_ExtentSet(GeneratedMesh,(/X_DIM,Y_DIM/),Err)
  371. ! CALL CMISSGeneratedMesh_NumberOfElementsSet(GeneratedMesh,(/NUMBER_GLOBAL_X_ELEMENTS,NUMBER_GLOBAL_Y_ELEMENTS/),Err)
  372. ! ELSE
  373. ! CALL CMISSGeneratedMesh_ExtentSet(GeneratedMesh,(/X_DIM,Y_DIM,Z_DIM/),Err)
  374. ! CALL CMISSGeneratedMesh_NumberOfElementsSet(GeneratedMesh,(/NUMBER_GLOBAL_X_ELEMENTS,NUMBER_GLOBAL_Y_ELEMENTS, &
  375. ! & NUMBER_GLOBAL_Z_ELEMENTS/),Err)
  376. ! ENDIF
  377. ! CALL CMISSMesh_Initialise(Mesh,Err)
  378. ! CALL CMISSGeneratedMesh_CreateFinish(GeneratedMesh,MeshUserNumber,Mesh,Err)
  379. ! -------------------------------------------------------------------------------
  380. !GEOMETRIC FIELD
  381. !Create a decomposition:
  382. CALL CMISSDecomposition_Initialise(Decomposition,Err)
  383. CALL CMISSDecomposition_CreateStart(DecompositionUserNumber,Mesh,Decomposition,Err)
  384. !Set the decomposition to be a general decomposition with the specified number of domains
  385. CALL CMISSDecomposition_TypeSet(Decomposition,CMISS_DECOMPOSITION_CALCULATED_TYPE,Err)
  386. CALL CMISSDecomposition_NumberOfDomainsSet(Decomposition,NumberOfDomains,Err)
  387. CALL CMISSDecomposition_CreateFinish(Decomposition,Err)
  388. CALL CMISSField_Initialise(GeometricField,Err)
  389. CALL CMISSField_CreateStart(GeometricFieldUserNumber,Region,GeometricField,Err)
  390. CALL CMISSField_MeshDecompositionSet(GeometricField,Decomposition,Err)
  391. CALL CMISSField_TypeSet(GeometricField,CMISS_FIELD_GEOMETRIC_TYPE,Err)
  392. CALL CMISSField_NumberOfVariablesSet(GeometricField,FieldGeometryNumberOfVariables,Err)
  393. CALL CMISSField_NumberOfComponentsSet(GeometricField,CMISS_FIELD_U_VARIABLE_TYPE,3,Err)
  394. CALL CMISSField_ComponentMeshComponentSet(GeometricField,CMISS_FIELD_U_VARIABLE_TYPE,1,SolidGeometryMeshComponentNumber,Err)
  395. CALL CMISSField_ComponentMeshComponentSet(GeometricField,CMISS_FIELD_U_VARIABLE_TYPE,2,SolidGeometryMeshComponentNumber,Err)
  396. CALL CMISSField_ComponentMeshComponentSet(GeometricField,CMISS_FIELD_U_VARIABLE_TYPE,3,SolidGeometryMeshComponentNumber,Err)
  397. CALL CMISSField_CreateFinish(GeometricField,Err)
  398. CALL READ_NODES('input/example-nodes-3els',GeometricField)
  399. ! CALL CMISSGeneratedMesh_GeometricParametersCalculate(GeneratedMesh,GeometricField,Err)
  400. !--------------------------------------------------------------------------------------------------------------------------------
  401. ! Solid
  402. !Create a decomposition
  403. !Create a field to put the geometry (defualt is geometry)
  404. SolidMeshComponenetNumber = SolidGeometryMeshComponentNumber
  405. CALL CMISSField_Initialise(GeometricFieldSolid,Err)
  406. CALL CMISSField_CreateStart(FieldGeometrySolidUserNumber,Region,GeometricFieldSolid,Err)
  407. CALL CMISSField_MeshDecompositionSet(GeometricFieldSolid,Decomposition,Err)
  408. CALL CMISSField_TypeSet(GeometricFieldSolid,CMISS_FIELD_GEOMETRIC_TYPE,Err)
  409. CALL CMISSField_NumberOfVariablesSet(GeometricFieldSolid,FieldGeometrySolidNumberOfVariables,Err)
  410. CALL CMISSField_NumberOfComponentsSet(GeometricFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,FieldGeometrySolidNumberOfComponents,Err)
  411. CALL CMISSField_ComponentMeshComponentSet(GeometricFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,1,SolidMeshComponenetNumber,Err)
  412. CALL CMISSField_ComponentMeshComponentSet(GeometricFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,2,SolidMeshComponenetNumber,Err)
  413. CALL CMISSField_ComponentMeshComponentSet(GeometricFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,3,SolidMeshComponenetNumber,Err)
  414. CALL CMISSField_CreateFinish(GeometricFieldSolid,Err)
  415. !Set the mesh component to be used by the field components.
  416. CALL READ_NODES('input/example-nodes-3els',GeometricFieldSolid)
  417. ! CALL CMISSGeneratedMesh_GeometricParametersCalculate(GeneratedMesh,GeometricFieldSolid,Err)
  418. !Create a fibre field and attach it to the geometric field
  419. CALL CMISSField_Initialise(FibreFieldSolid,Err)
  420. CALL CMISSField_CreateStart(FieldFibreSolidUserNumber,Region,FibreFieldSolid,Err)
  421. CALL CMISSField_TypeSet(FibreFieldSolid,CMISS_FIELD_FIBRE_TYPE,Err)
  422. CALL CMISSField_MeshDecompositionSet(FibreFieldSolid,Decomposition,Err)
  423. CALL CMISSField_GeometricFieldSet(FibreFieldSolid,GeometricFieldSolid,Err)
  424. CALL CMISSField_NumberOfVariablesSet(FibreFieldSolid,FieldFibreSolidNumberOfVariables,Err)
  425. CALL CMISSField_NumberOfComponentsSet(FibreFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,FieldFibreSolidNumberOfComponents,Err)
  426. CALL CMISSField_ComponentMeshComponentSet(FibreFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,1,SolidGeometryMeshComponentNumber,Err)
  427. CALL CMISSField_ComponentMeshComponentSet(FibreFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,2,SolidGeometryMeshComponentNumber,Err)
  428. CALL CMISSField_ComponentMeshComponentSet(FibreFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,3,SolidGeometryMeshComponentNumber,Err)
  429. CALL CMISSField_CreateFinish(FibreFieldSolid,Err)
  430. ! end Solid
  431. !--------------------------------------------------------------------------------------------------------------------------------
  432. !
  433. !================================================================================================================================
  434. !
  435. !EQUATIONS SETS
  436. !Create the equations set for ALE Darcy
  437. CALL CMISSField_Initialise(EquationsSetFieldDarcy,Err)
  438. CALL CMISSEquationsSet_Initialise(EquationsSetDarcy,Err)
  439. CALL CMISSEquationsSet_CreateStart(EquationsSetUserNumberDarcy,Region,GeometricField,CMISS_EQUATIONS_SET_FLUID_MECHANICS_CLASS, &
  440. & CMISS_EQUATIONS_SET_DARCY_EQUATION_TYPE,CMISS_EQUATIONS_SET_INCOMPRESS_ELASTICITY_DRIVEN_DARCY_SUBTYPE,&
  441. & EquationsSetFieldUserNumberDarcy,EquationsSetFieldDarcy,EquationsSetDarcy,Err)
  442. CALL CMISSEquationsSet_CreateFinish(EquationsSetDarcy,Err)
  443. !Create the equations set for the solid
  444. CALL CMISSField_Initialise(EquationsSetFieldSolid,Err)
  445. CALL CMISSEquationsSet_Initialise(EquationsSetSolid,Err)
  446. CALL CMISSEquationsSet_CreateStart(EquationSetSolidUserNumber,Region,FibreFieldSolid,CMISS_EQUATIONS_SET_ELASTICITY_CLASS, &
  447. & CMISS_EQUATIONS_SET_FINITE_ELASTICITY_TYPE,CMISS_EQUATIONS_SET_INCOMPRESS_ELASTICITY_DRIVEN_DARCY_SUBTYPE,&
  448. & EquationsSetFieldSolidUserNumber,EquationsSetFieldSolid,EquationsSetSolid,Err)
  449. CALL CMISSEquationsSet_CreateFinish(EquationsSetSolid,Err)
  450. !--------------------------------------------------------------------------------------------------------------------------------
  451. ! Solid Materials Field
  452. !Create a material field and attach it to the geometric field
  453. CALL CMISSField_Initialise(MaterialFieldSolid,Err)
  454. !
  455. CALL CMISSField_CreateStart(FieldMaterialSolidUserNumber,Region,MaterialFieldSolid,Err)
  456. !
  457. CALL CMISSField_TypeSet(MaterialFieldSolid,CMISS_FIELD_MATERIAL_TYPE,Err)
  458. CALL CMISSField_MeshDecompositionSet(MaterialFieldSolid,Decomposition,Err)
  459. CALL CMISSField_GeometricFieldSet(MaterialFieldSolid,GeometricFieldSolid,Err)
  460. CALL CMISSField_NumberOfVariablesSet(MaterialFieldSolid,FieldMaterialSolidNumberOfVariables,Err)
  461. CALL CMISSField_NumberOfComponentsSet(MaterialFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,FieldMaterialSolidNumberOfComponents,Err)
  462. CALL CMISSField_ComponentMeshComponentSet(MaterialFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,1,SolidGeometryMeshComponentNumber,Err)
  463. CALL CMISSField_ComponentMeshComponentSet(MaterialFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,2,SolidGeometryMeshComponentNumber,Err)
  464. CALL CMISSField_ComponentMeshComponentSet(MaterialFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,3,SolidGeometryMeshComponentNumber,Err)
  465. !
  466. CALL CMISSField_CreateFinish(MaterialFieldSolid,Err)
  467. !Set material parameters
  468. CALL CMISSField_ComponentValuesInitialise(MaterialFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,CMISS_FIELD_VALUES_SET_TYPE,1, &
  469. & 2.0_CMISSDP,Err)
  470. ! CALL CMISSField_ComponentValuesInitialise(MaterialFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,CMISS_FIELD_VALUES_SET_TYPE,1,2.0e3_CMISSDP,Err)
  471. CALL CMISSField_ComponentValuesInitialise(MaterialFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,CMISS_FIELD_VALUES_SET_TYPE,2, &
  472. & 6.0_CMISSDP,Err)
  473. ! CALL CMISSField_ComponentValuesInitialise(MaterialFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,CMISS_FIELD_VALUES_SET_TYPE,2,33.0_CMISSDP,Err)
  474. CALL CMISSField_ComponentValuesInitialise(MaterialFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,CMISS_FIELD_VALUES_SET_TYPE,3, &
  475. & 10.0_CMISSDP,Err)
  476. CALL CMISSEquationsSet_MaterialsCreateStart(EquationsSetSolid,FieldMaterialSolidUserNumber,MaterialFieldSolid,Err)
  477. CALL CMISSEquationsSet_MaterialsCreateFinish(EquationsSetSolid,Err)
  478. ! end Solid
  479. !--------------------------------------------------------------------------------------------------------------------------------
  480. !
  481. !================================================================================================================================
  482. !
  483. !DEPENDENT FIELDS
  484. !--------------------------------------------------------------------------------------------------------------------------------
  485. ! Solid
  486. !Create a dependent field with four variables (U, DelUDelN = solid, V, DelVDelN = Darcy) and four components
  487. CALL CMISSField_Initialise(DependentFieldSolid,Err)
  488. !
  489. CALL CMISSField_CreateStart(FieldDependentSolidUserNumber,Region,DependentFieldSolid,Err)
  490. !
  491. CALL CMISSField_TypeSet(DependentFieldSolid,CMISS_FIELD_GENERAL_TYPE,Err)
  492. CALL CMISSField_MeshDecompositionSet(DependentFieldSolid,Decomposition,Err)
  493. CALL CMISSField_GeometricFieldSet(DependentFieldSolid,GeometricFieldSolid,Err)
  494. CALL CMISSField_DependentTypeSet(DependentFieldSolid,CMISS_FIELD_DEPENDENT_TYPE,Err)
  495. CALL CMISSField_NumberOfVariablesSet(DependentFieldSolid,FieldDependentSolidNumberOfVariables,Err)
  496. CALL CMISSField_VariableTypesSet(DependentFieldSolid,(/CMISS_FIELD_U_VARIABLE_TYPE, &
  497. & CMISS_FIELD_DELUDELN_VARIABLE_TYPE,CMISS_FIELD_V_VARIABLE_TYPE,CMISS_FIELD_DELVDELN_VARIABLE_TYPE/),Err)
  498. CALL CMISSField_NumberOfComponentsSet(DependentFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,FieldDependentSolidNumberOfComponents,Err)
  499. CALL CMISSField_NumberOfComponentsSet(DependentFieldSolid,CMISS_FIELD_DELUDELN_VARIABLE_TYPE, &
  500. & FieldDependentSolidNumberOfComponents,Err)
  501. CALL CMISSField_NumberOfComponentsSet(DependentFieldSolid,CMISS_FIELD_V_VARIABLE_TYPE,FieldDependentFluidNumberOfComponents,Err)
  502. CALL CMISSField_NumberOfComponentsSet(DependentFieldSolid,CMISS_FIELD_DELVDELN_VARIABLE_TYPE, &
  503. & FieldDependentFluidNumberOfComponents,Err)
  504. !
  505. CALL CMISSField_ComponentMeshComponentSet(DependentFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,1,SolidDisplMeshComponentNumber,Err)
  506. CALL CMISSField_ComponentMeshComponentSet(DependentFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,2,SolidDisplMeshComponentNumber,Err)
  507. CALL CMISSField_ComponentMeshComponentSet(DependentFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,3,SolidDisplMeshComponentNumber,Err)
  508. CALL CMISSField_ComponentInterpolationSet(DependentFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,4, &
  509. & CMISS_FIELD_NODE_BASED_INTERPOLATION, &
  510. & Err)
  511. ! CALL CMISSField_ComponentInterpolationSet(DependentFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,4,CMISS_FIELD_ELEMENT_BASED_INTERPOLATION,Err)
  512. ! CALL CMISSField_ComponentMeshComponentSet(DependentFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,4,SolidMeshComponenetNumber,Err)
  513. CALL CMISSField_ComponentMeshComponentSet(DependentFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,4,SolidLagrMultMeshComponentNumber,Err)
  514. !
  515. CALL CMISSField_ComponentMeshComponentSet(DependentFieldSolid,CMISS_FIELD_DELUDELN_VARIABLE_TYPE,1, &
  516. & SolidDisplMeshComponentNumber, &
  517. & Err)
  518. CALL CMISSField_ComponentMeshComponentSet(DependentFieldSolid,CMISS_FIELD_DELUDELN_VARIABLE_TYPE,2, &
  519. & SolidDisplMeshComponentNumber, &
  520. & Err)
  521. CALL CMISSField_ComponentMeshComponentSet(DependentFieldSolid,CMISS_FIELD_DELUDELN_VARIABLE_TYPE,3, &
  522. & SolidDisplMeshComponentNumber, &
  523. & Err)
  524. CALL CMISSField_ComponentInterpolationSet(DependentFieldSolid,CMISS_FIELD_DELUDELN_VARIABLE_TYPE,4, &
  525. & CMISS_FIELD_NODE_BASED_INTERPOLATION,Err)
  526. ! CALL CMISSField_ComponentInterpolationSet(DependentFieldSolid,CMISS_FIELD_DELUDELN_VARIABLE_TYPE,4, &
  527. ! & CMISS_FIELD_ELEMENT_BASED_INTERPOLATION,Err)
  528. ! CALL CMISSField_ComponentMeshComponentSet(DependentFieldSolid,CMISS_FIELD_DELUDELN_VARIABLE_TYPE,4,SolidMeshComponenetNumber,Err)
  529. CALL CMISSField_ComponentMeshComponentSet(DependentFieldSolid,CMISS_FIELD_DELUDELN_VARIABLE_TYPE,4, &
  530. & SolidLagrMultMeshComponentNumber, &
  531. & Err)
  532. !For this equation type, MESH_COMPONENT_NUMBER_PRESSURE is actually the mass increase component as the pressure is taken from the solid equations
  533. CALL CMISSField_ComponentMeshComponentSet(DependentFieldSolid,CMISS_FIELD_V_VARIABLE_TYPE,1,DarcyVelMeshComponentNumber,Err)
  534. CALL CMISSField_ComponentMeshComponentSet(DependentFieldSolid,CMISS_FIELD_V_VARIABLE_TYPE,2,DarcyVelMeshComponentNumber,Err)
  535. CALL CMISSField_ComponentMeshComponentSet(DependentFieldSolid,CMISS_FIELD_V_VARIABLE_TYPE,3,DarcyVelMeshComponentNumber,Err)
  536. ! CALL CMISSField_ComponentMeshComponentSet(DependentFieldSolid,CMISS_FIELD_V_VARIABLE_TYPE,4,MESH_COMPONENT_NUMBER_PRESSURE,Err)
  537. CALL CMISSField_ComponentMeshComponentSet(DependentFieldSolid,CMISS_FIELD_V_VARIABLE_TYPE,4, &
  538. & DarcyMassIncreaseMeshComponentNumber, &
  539. & Err)
  540. CALL CMISSField_ComponentMeshComponentSet(DependentFieldSolid,CMISS_FIELD_DELVDELN_VARIABLE_TYPE,1,DarcyVelMeshComponentNumber, &
  541. & Err)
  542. CALL CMISSField_ComponentMeshComponentSet(DependentFieldSolid,CMISS_FIELD_DELVDELN_VARIABLE_TYPE,2,DarcyVelMeshComponentNumber, &
  543. & Err)
  544. CALL CMISSField_ComponentMeshComponentSet(DependentFieldSolid,CMISS_FIELD_DELVDELN_VARIABLE_TYPE,3,DarcyVelMeshComponentNumber, &
  545. & Err)
  546. ! CALL CMISSField_ComponentMeshComponentSet(DependentFieldSolid,CMISS_FIELD_DELVDELN_VARIABLE_TYPE,4,MESH_COMPONENT_NUMBER_PRESSURE,Err)
  547. CALL CMISSField_ComponentMeshComponentSet(DependentFieldSolid,CMISS_FIELD_DELVDELN_VARIABLE_TYPE,4, &
  548. & DarcyMassIncreaseMeshComponentNumber,Err)
  549. CALL CMISSField_CreateFinish(DependentFieldSolid,Err)
  550. !
  551. CALL CMISSEquationsSet_DependentCreateStart(EquationsSetSolid,FieldDependentSolidUserNumber,DependentFieldSolid,Err)
  552. CALL CMISSEquationsSet_DependentCreateFinish(EquationsSetSolid,Err)
  553. ! end Solid
  554. !--------------------------------------------------------------------------------------------------------------------------------
  555. !Create the equations set dependent field variables for ALE Darcy
  556. CALL CMISSEquationsSet_DependentCreateStart(EquationsSetDarcy,FieldDependentSolidUserNumber, & ! ??? UserNumber ???
  557. & DependentFieldSolid,Err)
  558. CALL CMISSEquationsSet_DependentCreateFinish(EquationsSetDarcy,Err)
  559. !Initialise dependent field (velocity components,mass increase)
  560. DO COMPONENT_NUMBER=1,NUMBER_OF_DIMENSIONS+1
  561. CALL CMISSField_ComponentValuesInitialise(DependentFieldSolid,CMISS_FIELD_V_VARIABLE_TYPE,CMISS_FIELD_VALUES_SET_TYPE, &
  562. & COMPONENT_NUMBER,INITIAL_FIELD_DARCY(COMPONENT_NUMBER),Err)
  563. ENDDO
  564. !
  565. !================================================================================================================================
  566. !
  567. call READ_FIELD('input/example-field-darcy',MaterialsFieldUserNumberDarcy,Region,GeometricField,MaterialsFieldDarcy)
  568. CALL CMISSEquationsSet_MaterialsCreateStart(EquationsSetDarcy,MaterialsFieldUserNumberDarcy,MaterialsFieldDarcy,Err)
  569. CALL CMISSEquationsSet_MaterialsCreateFinish(EquationsSetDarcy,Err)
  570. ! !MATERIALS FIELDS
  571. !
  572. ! !Create the equations set materials field variables for ALE Darcy
  573. ! CALL CMISSField_Initialise(MaterialsFieldDarcy,Err)
  574. ! CALL CMISSEquationsSet_MaterialsCreateStart(EquationsSetDarcy,MaterialsFieldUserNumberDarcy, &
  575. ! & MaterialsFieldDarcy,Err)
  576. ! !Finish the equations set materials field variables
  577. ! CALL CMISSEquationsSet_MaterialsCreateFinish(EquationsSetDarcy,Err)
  578. ! CALL CMISSField_ComponentValuesInitialise(MaterialsFieldDarcy,CMISS_FIELD_U_VARIABLE_TYPE,CMISS_FIELD_VALUES_SET_TYPE, &
  579. ! & MaterialsFieldUserNumberDarcyPorosity,POROSITY_PARAM_DARCY,Err)
  580. ! CALL CMISSField_ComponentValuesInitialise(MaterialsFieldDarcy,CMISS_FIELD_U_VARIABLE_TYPE,CMISS_FIELD_VALUES_SET_TYPE, &
  581. ! & MaterialsFieldUserNumberDarcyPermOverVis,PERM_OVER_VIS_PARAM_DARCY,Err)
  582. !
  583. !================================================================================================================================
  584. !
  585. !EQUATIONS SET EQUATIONS
  586. !Darcy
  587. CALL CMISSEquations_Initialise(EquationsDarcy,Err)
  588. CALL CMISSEquationsSet_EquationsCreateStart(EquationsSetDarcy,EquationsDarcy,Err)
  589. CALL CMISSEquations_SparsityTypeSet(EquationsDarcy,CMISS_EQUATIONS_SPARSE_MATRICES,Err)
  590. CALL CMISSEquations_OutputTypeSet(EquationsDarcy,EQUATIONS_DARCY_OUTPUT,Err)
  591. CALL CMISSEquationsSet_EquationsCreateFinish(EquationsSetDarcy,Err)
  592. !Solid
  593. CALL CMISSEquations_Initialise(EquationsSolid,Err)
  594. CALL CMISSEquationsSet_EquationsCreateStart(EquationsSetSolid,EquationsSolid,Err)
  595. CALL CMISSEquations_SparsityTypeSet(EquationsSolid,CMISS_EQUATIONS_SPARSE_MATRICES,Err)
  596. CALL CMISSEquations_OutputTypeSet(EquationsSolid,CMISS_EQUATIONS_NO_OUTPUT,Err)
  597. CALL CMISSEquationsSet_EquationsCreateFinish(EquationsSetSolid,Err)
  598. !
  599. !================================================================================================================================
  600. !
  601. !--------------------------------------------------------------------------------------------------------------------------------
  602. ! Solid
  603. !Initialise dependent field from undeformed geometry and displacement bcs and set hydrostatic pressure
  604. CALL CMISSField_ParametersToFieldParametersComponentCopy(GeometricFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE, &
  605. & CMISS_FIELD_VALUES_SET_TYPE, &
  606. & 1,DependentFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,CMISS_FIELD_VALUES_SET_TYPE,1,Err)
  607. CALL CMISSField_ParametersToFieldParametersComponentCopy(GeometricFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE, &
  608. & CMISS_FIELD_VALUES_SET_TYPE, &
  609. & 2,DependentFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,CMISS_FIELD_VALUES_SET_TYPE,2,Err)
  610. CALL CMISSField_ParametersToFieldParametersComponentCopy(GeometricFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE, &
  611. & CMISS_FIELD_VALUES_SET_TYPE, &
  612. & 3,DependentFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,CMISS_FIELD_VALUES_SET_TYPE,3,Err)
  613. CALL CMISSField_ComponentValuesInitialise(DependentFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,CMISS_FIELD_VALUES_SET_TYPE,4, &
  614. & 0.0_CMISSDP, &
  615. & Err)
  616. !
  617. !================================================================================================================================
  618. !
  619. !PROBLEMS
  620. CALL CMISSProblem_Initialise(Problem,Err)
  621. CALL CMISSControlLoop_Initialise(ControlLoop,Err)
  622. CALL CMISSProblem_CreateStart(ProblemUserNumber,Problem,Err)
  623. CALL CMISSProblem_SpecificationSet(Problem,CMISS_PROBLEM_MULTI_PHYSICS_CLASS,CMISS_PROBLEM_FINITE_ELASTICITY_DARCY_TYPE, &
  624. & CMISS_PROBLEM_QUASISTATIC_ELASTICITY_TRANSIENT_DARCY_SUBTYPE,Err)
  625. CALL CMISSProblem_CreateFinish(Problem,Err)
  626. CALL CMISSProblem_ControlLoopCreateStart(Problem,Err)
  627. CALL CMISSProblem_ControlLoopGet(Problem,CMISS_CONTROL_LOOP_NODE,ControlLoop,Err)
  628. ! CALL CMISSControlLoop_MaximumIterationsSet(ControlLoop,2,Err)
  629. CALL CMISSControlLoop_TimesSet(ControlLoop,DYNAMIC_SOLVER_DARCY_START_TIME,DYNAMIC_SOLVER_DARCY_STOP_TIME, &
  630. & DYNAMIC_SOLVER_DARCY_TIME_INCREMENT,Err)
  631. CALL CMISSControlLoop_TimeOutputSet(ControlLoop,DYNAMIC_SOLVER_DARCY_OUTPUT_FREQUENCY,Err)
  632. ! CALL CMISSControlLoop_OutputTypeSet(ControlLoop,CMISS_CONTROL_LOOP_PROGRESS_OUTPUT,Err)
  633. CALL CMISSProblem_ControlLoopCreateFinish(Problem,Err)
  634. !
  635. !================================================================================================================================
  636. !
  637. !SOLVERS
  638. CALL CMISSSolver_Initialise(SolverSolid,Err)
  639. CALL CMISSSolver_Initialise(DynamicSolverDarcy,Err)
  640. CALL CMISSSolver_Initialise(LinearSolverDarcy,Err)
  641. CALL CMISSProblem_SolversCreateStart(Problem,Err)
  642. ! Solid
  643. CALL CMISSProblem_SolverGet(Problem,(/ControlLoopSubiterationNumber,ControlLoopSolidNumber,CMISS_CONTROL_LOOP_NODE/), &
  644. & SolverSolidIndex,SolverSolid,Err)
  645. CALL CMISSSolver_OutputTypeSet(SolverSolid,CMISS_SOLVER_PROGRESS_OUTPUT,Err)
  646. ! CALL CMISSSolver_NewtonJacobianCalculationTypeSet(SolverSolid,CMISS_SOLVER_NEWTON_JACOBIAN_FD_CALCULATED,Err)
  647. CALL CMISSSolver_NewtonJacobianCalculationTypeSet(SolverSolid,CMISS_SOLVER_NEWTON_JACOBIAN_EQUATIONS_CALCULATED,Err)
  648. CALL CMISSSolver_NewtonAbsoluteToleranceSet(SolverSolid,ABSOLUTE_TOLERANCE,Err)
  649. CALL CMISSSolver_NewtonRelativeToleranceSet(SolverSolid,RELATIVE_TOLERANCE,Err)
  650. CALL CMISSSolver_NewtonMaximumIterationsSet(SolverSolid,MAXIMUM_ITERATIONS,Err)
  651. ! CALL CMISSSolverNonLinearTypeSet(SolverSolid,CMISS_SOLVER_NONLINEAR_NEWTON,Err)
  652. ! CALL CMISSSolver_LibraryTypeSet(SolverSolid,CMISS_SOLVER_PETSC_LIBRARY,Err)
  653. ! CALL CMISSSolver_NewtonLinearSolverGet(SolverSolid,LinearSolverSolid,Err)
  654. ! CALL CMISSSolver_LinearTypeSet(LinearSolverSolid,CMISS_SOLVER_LINEAR_DIRECT_SOLVE_TYPE,Err)
  655. !Darcy
  656. CALL CMISSProblem_SolverGet(Problem,(/ControlLoopSubiterationNumber,ControlLoopFluidNumber,CMISS_CONTROL_LOOP_NODE/), &
  657. & SolverDarcyIndex,DynamicSolverDarcy,Err)
  658. CALL CMISSSolver_OutputTypeSet(DynamicSolverDarcy,DYNAMIC_SOLVER_DARCY_OUTPUT_TYPE,Err)
  659. CALL CMISSSolver_DynamicThetaSet(DynamicSolverDarcy,DYNAMIC_SOLVER_DARCY_THETA,Err)
  660. ! CALL CMISSSolverDynamicDynamicSet(DynamicSolverDarcy,.TRUE.,Err)
  661. CALL CMISSSolver_DynamicLinearSolverGet(DynamicSolverDarcy,LinearSolverDarcy,Err)
  662. IF(LINEAR_SOLVER_DARCY_DIRECT_FLAG) THEN
  663. CALL CMISSSolver_LinearTypeSet(LinearSolverDarcy,CMISS_SOLVER_LINEAR_DIRECT_SOLVE_TYPE,Err)
  664. CALL CMISSSolver_LibraryTypeSet(LinearSolverDarcy,CMISS_SOLVER_MUMPS_LIBRARY,Err)
  665. ELSE
  666. CALL CMISSSolver_LinearTypeSet(LinearSolverDarcy,CMISS_SOLVER_LINEAR_ITERATIVE_SOLVE_TYPE,Err)
  667. CALL CMISSSolver_LinearIterativeMaximumIterationsSet(LinearSolverDarcy,MAXIMUM_ITERATIONS,Err)
  668. CALL CMISSSolver_LinearIterativeDivergenceToleranceSet(LinearSolverDarcy,DIVERGENCE_TOLERANCE,Err)
  669. CALL CMISSSolver_LinearIterativeRelativeToleranceSet(LinearSolverDarcy,RELATIVE_TOLERANCE,Err)
  670. CALL CMISSSolver_LinearIterativeAbsoluteToleranceSet(LinearSolverDarcy,ABSOLUTE_TOLERANCE,Err)
  671. CALL CMISSSolver_LinearIterativeGMRESRestartSet(LinearSolverDarcy,RESTART_VALUE,Err)
  672. ENDIF
  673. CALL CMISSProblem_SolversCreateFinish(Problem,Err)
  674. !
  675. !================================================================================================================================
  676. !
  677. !SOLVER EQUATIONS
  678. CALL CMISSSolver_Initialise(SolverSolid,Err)
  679. CALL CMISSSolver_Initialise(LinearSolverDarcy,Err)
  680. CALL CMISSSolverEquations_Initialise(SolverEquationsSolid,Err)
  681. CALL CMISSSolverEquations_Initialise(SolverEquationsDarcy,Err)
  682. CALL CMISSProblem_SolverEquationsCreateStart(Problem,Err)
  683. !
  684. !Get the finite elasticity solver equations
  685. CALL CMISSProblem_SolverGet(Problem,(/ControlLoopSubiterationNumber,ControlLoopSolidNumber,CMISS_CONTROL_LOOP_NODE/), &
  686. & SolverSolidIndex,SolverSolid,Err)
  687. CALL CMISSSolver_SolverEquationsGet(SolverSolid,SolverEquationsSolid,Err)
  688. CALL CMISSSolverEquations_SparsityTypeSet(SolverEquationsSolid,CMISS_SOLVER_SPARSE_MATRICES,Err)
  689. CALL CMISSSolverEquations_EquationsSetAdd(SolverEquationsSolid,EquationsSetSolid,EquationsSetIndex,Err)
  690. !
  691. !Get the Darcy solver equations
  692. CALL CMISSProblem_SolverGet(Problem,(/ControlLoopSubiterationNumber,ControlLoopFluidNumber,CMISS_CONTROL_LOOP_NODE/), &
  693. & SolverDarcyIndex,LinearSolverDarcy,Err)
  694. CALL CMISSSolver_SolverEquationsGet(LinearSolverDarcy,SolverEquationsDarcy,Err)
  695. CALL CMISSSolverEquations_SparsityTypeSet(SolverEquationsDarcy,CMISS_SOLVER_SPARSE_MATRICES,Err)
  696. CALL CMISSSolverEquations_EquationsSetAdd(SolverEquationsDarcy,EquationsSetDarcy,EquationsSetIndex,Err)
  697. !
  698. CALL CMISSProblem_SolverEquationsCreateFinish(Problem,Err)
  699. !
  700. !================================================================================================================================
  701. !
  702. !------------------------------------
  703. ! ASSIGN BOUNDARY CONDITIONS - SOLID (absolute nodal parameters)
  704. !Solid is computed in absolute position, rather than displacement. Thus BCs for absolute position
  705. CALL CMISSBoundaryConditions_Initialise(BoundaryConditionsSolid,Err)
  706. CALL CMISSSolverEquations_BoundaryConditionsCreateStart(SolverEquationsSolid,BoundaryConditionsSolid,Err)
  707. ! !Get surfaces
  708. ! CALL CMISSGeneratedMesh_SurfaceGet(GeneratedMesh,SolidDisplMeshComponentNumber,CMISS_GENERATED_MESH_REGULAR_FRONT_SURFACE, &
  709. ! & Face1Nodes,FaceXi(1),Err)
  710. ! CALL CMISSGeneratedMesh_SurfaceGet(GeneratedMesh,SolidDisplMeshComponentNumber,CMISS_GENERATED_MESH_REGULAR_BACK_SURFACE, &
  711. ! & Face2Nodes,FaceXi(2),Err)
  712. ! CALL CMISSGeneratedMesh_SurfaceGet(GeneratedMesh,SolidDisplMeshComponentNumber,CMISS_GENERATED_MESH_REGULAR_RIGHT_SURFACE, &
  713. ! & Face3Nodes,FaceXi(3),Err)
  714. ! CALL CMISSGeneratedMesh_SurfaceGet(GeneratedMesh,SolidDisplMeshComponentNumber,CMISS_GENERATED_MESH_REGULAR_LEFT_SURFACE, &
  715. ! & Face4Nodes,FaceXi(4),Err)
  716. ! CALL CMISSGeneratedMesh_SurfaceGet(GeneratedMesh,SolidDisplMeshComponentNumber,CMISS_GENERATED_MESH_REGULAR_TOP_SURFACE, &
  717. ! & Face5Nodes,FaceXi(5),Err)
  718. ! CALL CMISSGeneratedMesh_SurfaceGet(GeneratedMesh,SolidDisplMeshComponentNumber,CMISS_GENERATED_MESH_REGULAR_BOTTOM_SURFACE, &
  719. ! & Face6Nodes,FaceXi(6),Err)
  720. ! ! write(*,'("Face1Nodes=[",100I3,"]")') Face1Nodes
  721. ! ! write(*,'("Face2Nodes=[",100I3,"]")') Face2Nodes
  722. ! ! write(*,'("Face3Nodes=[",100I3,"]")') Face3Nodes
  723. ! ! write(*,'("Face4Nodes=[",100I3,"]")') Face4Nodes
  724. ! ! write(*,'("Face5Nodes=[",100I3,"]")') Face5Nodes
  725. ! ! write(*,'("Face6Nodes=[",100I3,"]")') Face6Nodes
  726. ! ! write(*,'("FaceXi=[",100I3,"]")') FaceXi
  727. !
  728. allocate(Face1Nodes(21),Face2Nodes(21),Face3Nodes(21),Face4Nodes(21),Face5Nodes(9),Face6Nodes(9))
  729. Face1Nodes=[ 1, 17, 2, 22, 23, 24, 5, 31, 6, 36, 37, 38, 9, 45, 10, 50, 51, 52, 13, 59, 14]
  730. Face2Nodes=[ 3, 21, 4, 28, 29, 30, 7, 35, 8, 42, 43, 44, 11, 49, 12, 56, 57, 58, 15, 63, 16]
  731. Face3Nodes=[ 2, 20, 4, 24, 27, 30, 6, 34, 8, 38, 41, 44, 10, 48, 12, 52, 55, 58, 14, 62, 16]
  732. Face4Nodes=[ 1, 18, 3, 22, 25, 28, 5, 32, 7, 36, 39, 42, 9, 46, 11, 50, 53, 56, 13, 60, 15]
  733. Face5Nodes=[ 13, 59, 14, 60, 61, 62, 15, 63, 16]
  734. Face6Nodes=[ 1, 17, 2, 18, 19, 20, 3, 21, 4]
  735. FaceXi=[ -2, 2, 1, -1, 3, -3]
  736. ! Fix the bottom in z direction
  737. DO NN=1,SIZE(Face6Nodes,1)
  738. NODE=Face6Nodes(NN)
  739. CALL CMISSDecomposition_NodeDomainGet(Decomposition,NODE,1,NodeDomain,Err)
  740. IF(NodeDomain==ComputationalNodeNumber) THEN
  741. CALL CMISSField_ParameterSetGetNode(GeometricFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,CMISS_FIELD_VALUES_SET_TYPE,1,1,NODE,3, &
  742. & ZCoord,Err)
  743. CALL CMISSBoundaryConditions_SetNode(BoundaryConditionsSolid,DependentFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,1,1,NODE,3, &
  744. & CMISS_BOUNDARY_CONDITION_FIXED,ZCoord,Err)
  745. WRITE(*,*) "FIXING NODE",NODE,"AT BOTTOM IN Z DIRECTION"
  746. ENDIF
  747. ENDDO
  748. ! Fix the top in z direction
  749. DO NN=1,SIZE(Face5Nodes,1)
  750. NODE=Face5Nodes(NN)
  751. CALL CMISSDecomposition_NodeDomainGet(Decomposition,NODE,1,NodeDomain,Err)
  752. IF(NodeDomain==ComputationalNodeNumber) THEN
  753. CALL CMISSField_ParameterSetGetNode(GeometricFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,CMISS_FIELD_VALUES_SET_TYPE,1,1,NODE,3, &
  754. & ZCoord,Err)
  755. CALL CMISSBoundaryConditions_SetNode(BoundaryConditionsSolid,DependentFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,1,1,NODE,3, &
  756. & CMISS_BOUNDARY_CONDITION_FIXED,ZCoord,Err)
  757. WRITE(*,*) "FIXING NODE",NODE,"AT TOP IN Z DIRECTION"
  758. ENDIF
  759. ENDDO
  760. !Fix more nodes at the bottom to stop free body motion
  761. X_FIXED=.FALSE.
  762. Y_FIXED=.FALSE.
  763. DO NN=1,SIZE(Face6Nodes,1)
  764. NODE=Face6Nodes(NN)
  765. CALL CMISSDecomposition_NodeDomainGet(Decomposition,NODE,1,NodeDomain,Err)
  766. IF(NodeDomain==ComputationalNodeNumber) THEN
  767. CALL CMISSField_ParameterSetGetNode(GeometricFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,CMISS_FIELD_VALUES_SET_TYPE,1,1,NODE,1, &
  768. & XCoord,Err)
  769. CALL CMISSField_ParameterSetGetNode(GeometricFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,CMISS_FIELD_VALUES_SET_TYPE,1,1,NODE,2, &
  770. & YCoord,Err)
  771. !Fix Origin displacement in x and y (z already fixed)
  772. IF(ABS(XCoord)<1.0E-6_CMISSDP.AND.ABS(YCoord)<1.0E-6_CMISSDP) THEN
  773. CALL CMISSBoundaryConditions_SetNode(BoundaryConditionsSolid,DependentFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,1,1,NODE,1, &
  774. & CMISS_BOUNDARY_CONDITION_FIXED,XCoord,Err)
  775. CALL CMISSBoundaryConditions_SetNode(BoundaryConditionsSolid,DependentFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,1,1,NODE,2, &
  776. & CMISS_BOUNDARY_CONDITION_FIXED,YCoord,Err)
  777. WRITE(*,*) "FIXING ORIGIN NODE",NODE,"IN X AND Y DIRECTION"
  778. X_FIXED=.TRUE.
  779. Y_FIXED=.TRUE.
  780. ENDIF
  781. !Fix nodal displacements at (X_DIM,0) in y
  782. IF(ABS(XCoord - X_DIM)<1.0E-6_CMISSDP .AND. ABS(YCoord)<1.0E-6_CMISSDP) THEN
  783. CALL CMISSBoundaryConditions_SetNode(BoundaryConditionsSolid,DependentFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,1,1,NODE,2, &
  784. & CMISS_BOUNDARY_CONDITION_FIXED,YCoord,Err)
  785. WRITE(*,*) "FIXING NODES",NODE,"AT (X_DIM,0) IN Y DIRECTION"
  786. Y_FIXED=.TRUE.
  787. ENDIF
  788. !Fix nodal displacements at (0,Y_DIM) in x
  789. IF(ABS(XCoord)<1.0E-6_CMISSDP .AND. ABS(YCoord - Y_DIM)<1.0E-6_CMISSDP) THEN
  790. CALL CMISSBoundaryConditions_SetNode(BoundaryConditionsSolid,DependentFieldSolid,CMISS_FIELD_U_VARIABLE_TYPE,1,1,NODE,1, &
  791. & CMISS_BOUNDARY_CONDITION_FIXED,XCoord,Err)
  792. WRITE(*,*) "FIXING NODES",NODE,"AT (0,Y_DIM) IN X DIRECTION"
  793. X_FIXED=.TRUE.
  794. ENDIF
  795. ENDIF
  796. ENDDO
  797. ! CALL MPI_REDUCE(X_FIXED,X_OKAY,1,MPI_LOGICAL,MPI_LOR,0,MPI_COMM_WORLD,MPI_IERROR)
  798. ! CALL MPI_REDUCE(Y_FIXED,Y_OKAY,1,MPI_LOGICAL,MPI_LOR,0,MPI_COMM_WORLD,MPI_IERROR)
  799. ! IF(ComputationalNodeNumber==0) THEN
  800. ! IF(.NOT.(X_OKAY.AND.Y_OKAY)) THEN
  801. ! WRITE(*,*) "Free body motion could not be prevented!"
  802. ! CALL CMISSFinalise(Err)
  803. ! STOP
  804. ! ENDIF
  805. ! ENDIF
  806. CALL CMISSSolverEquations_BoundaryConditionsCreateFinish(SolverEquationsSolid,Err)
  807. !------------------------------------
  808. !------------------------------------
  809. ! ASSIGN BOUNDARY CONDITIONS - FLUID
  810. CALL CMISSBoundaryConditions_Initialise(BoundaryConditionsDarcy,Err)
  811. CALL CMISSSolverEquations_BoundaryConditionsCreateStart(SolverEquationsDarcy,BoundaryConditionsDarcy,Err)
  812. ! !Get surfaces
  813. ! CALL CMISSGeneratedMesh_SurfaceGet(GeneratedMesh,DarcyVelMeshComponentNumber,CMISS_GENERATED_MESH_REGULAR_FRONT_SURFACE, &
  814. ! & Face7Nodes,FaceXi(1),Err)
  815. ! CALL CMISSGeneratedMesh_SurfaceGet(GeneratedMesh,DarcyVelMeshComponentNumber,CMISS_GENERATED_MESH_REGULAR_BACK_SURFACE, &
  816. ! & Face8Nodes,FaceXi(2),Err)
  817. ! CALL CMISSGeneratedMesh_SurfaceGet(GeneratedMesh,DarcyVelMeshComponentNumber,CMISS_GENERATED_MESH_REGULAR_RIGHT_SURFACE, &
  818. ! & Face9Nodes,FaceXi(3),Err)
  819. ! CALL CMISSGeneratedMesh_SurfaceGet(GeneratedMesh,DarcyVelMeshComponentNumber,CMISS_GENERATED_MESH_REGULAR_LEFT_SURFACE, &
  820. ! & Face10Nodes,FaceXi(4),Err)
  821. ! CALL CMISSGeneratedMesh_SurfaceGet(GeneratedMesh,DarcyVelMeshComponentNumber,CMISS_GENERATED_MESH_REGULAR_TOP_SURFACE, &
  822. ! & Face11Nodes,FaceXi(5),Err)
  823. ! CALL CMISSGeneratedMesh_SurfaceGet(GeneratedMesh,DarcyVelMeshComponentNumber,CMISS_GENERATED_MESH_REGULAR_BOTTOM_SURFACE, &
  824. ! & Face12Nodes,FaceXi(6),Err)
  825. ! ! write(*,'("Face7Nodes=[",100I3,"]")') Face7Nodes
  826. ! ! write(*,'("Face8Nodes=[",100I3,"]")') Face8Nodes
  827. ! ! write(*,'("Face9Nodes=[",100I3,"]")') Face9Nodes
  828. ! ! write(*,'("Face10Nodes=[",100I3,"]")') Face10Nodes
  829. ! ! write(*,'("Face11Nodes=[",100I3,"]")') Face11Nodes
  830. ! ! write(*,'("Face12Nodes=[",100I3,"]")') Face12Nodes
  831. ! ! write(*,'("FaceXi=[",100I3,"]")') FaceXi
  832. allocate(Face7Nodes(8),Face8Nodes(8),Face9Nodes(8),Face10Nodes(8),Face11Nodes(4),Face12Nodes(4))
  833. Face7Nodes=[ 1, 2, 5, 6, 9, 10, 13, 14]
  834. Face8Nodes=[ 3, 4, 7, 8, 11, 12, 15, 16]
  835. Face9Nodes=[ 2, 4, 6, 8, 10, 12, 14, 16]
  836. Face10Nodes=[ 1, 3, 5, 7, 9, 11, 13, 15]
  837. Face11Nodes=[ 13, 14, 15, 16]
  838. Face12Nodes=[ 1, 2, 3, 4]
  839. FaceXi=[ -2, 2, 1, -1, 3, -3]
  840. ! At the top impose Darcy velocity in z direction
  841. DO NN=1,SIZE(Face11Nodes,1)
  842. NODE=Face11Nodes(NN)
  843. ! CALL CMISSDecomposition_NodeDomainGet(Decomposition,NODE,1,NodeDomain,Err)
  844. ! IF(NodeDomain==ComputationalNodeNumber) THEN
  845. VALUE = -2.0_CMISSDP
  846. COMPONENT_NUMBER = 3
  847. write(*,*)'Marker 0'
  848. CALL CMISSBoundaryConditions_SetNode(BoundaryConditionsDarcy,DependentFieldSolid,CMISS_FIELD_V_VARIABLE_TYPE,1,1,NODE, &
  849. & COMPONENT_NUMBER, &
  850. & CMISS_BOUNDARY_CONDITION_FIXED,VALUE,Err)
  851. WRITE(*,*) "SPECIFIED INFLOW AT NODE",NODE,"IN Z DIRECTION"
  852. ! CALL CMISSField_ParameterSetGetNode(GeometricField,CMISS_FIELD_U_VARIABLE_TYPE,CMISS_FIELD_VALUES_SET_TYPE,1,NODE,1,XCoord,Err)
  853. ! CALL CMISSField_ParameterSetGetNode(GeometricField,CMISS_FIELD_U_VARIABLE_TYPE,CMISS_FIELD_VALUES_SET_TYPE,1,NODE,2,YCoord,Err)
  854. ! CALL CMISSField_ParameterSetGetNode(GeometricField,CMISS_FIELD_U_VARIABLE_TYPE,CMISS_FIELD_VALUES_SET_TYPE,1,NODE,3,ZCoord,Err)
  855. ! WRITE(*,*) "XCoord, YCoord, ZCoord = ",XCoord, YCoord, ZCoord
  856. ! ENDIF
  857. ENDDO
  858. !All other faces are impermeable
  859. DO NN=1,SIZE(Face7Nodes,1)
  860. NODE=Face7Nodes(NN)
  861. ! CALL CMISSDecomposition_NodeDomainGet(Decomposition,NODE,1,NodeDomain,Err)
  862. ! IF(NodeDomain==ComputationalNodeNumber) THEN
  863. VALUE = 0.0_CMISSDP
  864. COMPONENT_NUMBER = 1
  865. write(*,*)'Marker 1'
  866. CALL CMISSBoundaryConditions_SetNode(BoundaryConditionsDarcy,DependentFieldSolid,CMISS_FIELD_V_VARIABLE_TYPE,1,1,NODE, &
  867. & COMPONENT_NUMBER, &
  868. & CMISS_BOUNDARY_CONDITION_FIXED,VALUE,Err)
  869. WRITE(*,*) "SPECIFIED IMPERMEABLE WALL AT NODE",NODE,"IN X DIRECTION"
  870. ! ENDIF
  871. ENDDO
  872. DO NN=1,SIZE(Face8Nodes,1)
  873. NODE=Face8Nodes(NN)
  874. ! CALL CMISSDecomposition_NodeDomainGet(Decomposition,NODE,1,NodeDomain,Err)
  875. ! IF(NodeDomain==ComputationalNodeNumber) THEN
  876. VALUE = 0.0_CMISSDP
  877. COMPONENT_NUMBER = 1
  878. write(*,*)'Marker 2'
  879. CALL CMISSBoundaryConditions_SetNode(BoundaryConditionsDarcy,DependentFieldSolid,CMISS_FIELD_V_VARIABLE_TYPE,1,1,NODE, &
  880. & COMPONENT_NUMBER, &
  881. & CMISS_BOUNDARY_CONDITION_FIXED,VALUE,Err)
  882. WRITE(*,*) "SPECIFIED IMPERMEABLE WALL AT NODE",NODE,"IN X DIRECTION"
  883. ! ENDIF
  884. ENDDO
  885. DO NN=1,SIZE(Face9Nodes,1)
  886. NODE=Face9Nodes(NN)
  887. ! CALL CMISSDecomposition_NodeDomainGet(Decomposition,NODE,1,NodeDomain,Err)
  888. ! IF(NodeDomain==ComputationalNodeNumber) THEN
  889. VALUE = 0.0_CMISSDP
  890. COMPONENT_NUMBER = 2
  891. write(*,*)'Marker 3'
  892. CALL CMISSBoundaryConditions_SetNode(BoundaryConditionsDarcy,DependentFieldSolid,CMISS_FIELD_V_VARIABLE_TYPE,1,1,NODE, &
  893. & COMPONENT_NUMBER, &
  894. & CMISS_BOUNDARY_CONDITION_FIXED,VALUE,Err)
  895. WRITE(*,*) "SPECIFIED IMPERMEABLE WALL AT NODE",NODE,"IN Y DIRECTION"
  896. ! ENDIF
  897. ENDDO
  898. DO NN=1,SIZE(Face10Nodes,1)
  899. NODE=Face10Nodes(NN)
  900. ! CALL CMISSDecomposition_NodeDomainGet(Decomposition,NODE,1,NodeDomain,Err)
  901. ! IF(NodeDomain==ComputationalNodeNumber) THEN
  902. VALUE = 0.0_CMISSDP
  903. COMPONENT_NUMBER = 2
  904. write(*,*)'Marker 4'
  905. CALL CMISSBoundaryConditions_SetNode(BoundaryConditionsDarcy,DependentFieldSolid,CMISS_FIELD_V_VARIABLE_TYPE,1,1,NODE, &
  906. & COMPONENT_NUMBER, &
  907. & CMISS_BOUNDARY_CONDITION_FIXED,VALUE,Err)
  908. WRITE(*,*) "SPECIFIED IMPERMEABLE WALL AT NODE",NODE,"IN Y DIRECTION"
  909. ! ENDIF
  910. ENDDO
  911. DO NN=1,SIZE(Face12Nodes,1)
  912. NODE=Face12Nodes(NN)
  913. ! CALL CMISSDecomposition_NodeDomainGet(Decomposition,NODE,1,NodeDomain,Err)
  914. ! IF(NodeDomain==ComputationalNodeNumber) THEN
  915. VALUE = 0.0_CMISSDP
  916. COMPONENT_NUMBER = 3
  917. write(*,*)'Marker 5'
  918. CALL CMISSBoundaryConditions_SetNode(BoundaryConditionsDarcy,DependentFieldSolid,CMISS_FIELD_V_VARIABLE_TYPE,1,1,NODE, &
  919. & COMPONENT_NUMBER, &
  920. & CMISS_BOUNDARY_CONDITION_FIXED,VALUE,Err)
  921. WRITE(*,*) "SPECIFIED IMPERMEABLE WALL AT NODE",NODE,"IN Z DIRECTION"
  922. ! ENDIF
  923. ENDDO
  924. CALL CMISSSolverEquations_BoundaryConditionsCreateFinish(SolverEquationsDarcy,Err)
  925. !
  926. !================================================================================================================================
  927. !
  928. !RUN SOLVERS
  929. !Turn of PETSc error handling
  930. !CALL PETSC_ERRORHANDLING_SET_ON(ERR,ERROR,*999)
  931. !Solve the problem
  932. WRITE(*,'(A)') "Solving problem..."
  933. CALL CMISSProblem_Solve(Problem,Err)
  934. WRITE(*,'(A)') "Problem solved!"
  935. !
  936. !================================================================================================================================
  937. !
  938. !OUTPUT
  939. EXPORT_FIELD_IO=.FALSE.
  940. IF(EXPORT_FIELD_IO) THEN
  941. WRITE(*,'(A)') "Exporting fields..."
  942. CALL CMISSFields_Initialise(Fields,Err)
  943. CALL CMISSFields_Create(Region,Fields,Err)
  944. CALL CMISSFields_NodesExport(Fields,"FiniteElasticityDarcy","FORTRAN",Err)
  945. CALL CMISSFields_ElementsExport(Fields,"FiniteElasticityDarcy","FORTRAN",Err)
  946. CALL CMISSFields_Finalise(Fields,Err)
  947. WRITE(*,'(A)') "Field exported!"
  948. ENDIF
  949. !Finialise CMISS
  950. ! CALL CMISSFinalise(Err)
  951. WRITE(*,'(A)') "Program successfully completed."
  952. STOP
  953. END PROGRAM FINITEELASTICITYDARCYIOEXAMPLE