PageRenderTime 57ms CodeModel.GetById 22ms RepoModel.GetById 0ms app.codeStats 1ms

/FluidMechanics/NavierStokes/42Master/src/42MasterExample.f90

http://github.com/xyan075/examples
FORTRAN Modern | 1303 lines | 898 code | 112 blank | 293 comment | 0 complexity | aeefce594ff45bcd22ca93026e1e6393 MD5 | raw file
  1. !> \file
  2. !> \author Sebastian Krittian
  3. !> \brief This is a master example program to solve static, dynamic and ALE Navier-Stokes equations 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 FluidMechanics/NavierStokes/RoutineCheck/Static/src/StaticExample.f90
  42. !! Example program to solve a static NavierStokes equation using OpenCMISS calls.
  43. !! \htmlinclude FluidMechanics/NavierStokes/RoutineCheck/Static/history.html
  44. !!
  45. !<
  46. !> Main program
  47. PROGRAM NAVIERSTOKESMASTEREXAMPLE
  48. !
  49. !================================================================================================================================
  50. !
  51. !PROGRAM LIBRARIES
  52. USE OPENCMISS
  53. USE FLUID_MECHANICS_IO_ROUTINES
  54. USE MPI
  55. #ifdef WIN32
  56. USE IFQWINCMISS
  57. #endif
  58. !
  59. !================================================================================================================================
  60. !
  61. !PROGRAM VARIABLES AND TYPES
  62. IMPLICIT NONE
  63. INTEGER(CMISSIntg), PARAMETER :: EquationsSetFieldUserNumber=1337
  64. ! TYPE(CMISSFieldType) :: EquationsSetField
  65. !Test program parameters
  66. INTEGER(CMISSIntg), PARAMETER :: CoordinateSystemUserNumber=1
  67. INTEGER(CMISSIntg), PARAMETER :: RegionUserNumber=2
  68. INTEGER(CMISSIntg), PARAMETER :: MeshUserNumber=3
  69. INTEGER(CMISSIntg), PARAMETER :: DecompositionUserNumber=4
  70. INTEGER(CMISSIntg), PARAMETER :: GeometricFieldUserNumber=5
  71. INTEGER(CMISSIntg), PARAMETER :: DependentFieldUserNumberNavierStokes=6
  72. INTEGER(CMISSIntg), PARAMETER :: DependentFieldUserNumberMovingMesh=42
  73. INTEGER(CMISSIntg), PARAMETER :: MaterialsFieldUserNumberNavierStokes=8
  74. INTEGER(CMISSIntg), PARAMETER :: MaterialsFieldUserNumberMovingMesh=9
  75. INTEGER(CMISSIntg), PARAMETER :: IndependentFieldUserNumberNavierStokes=10
  76. INTEGER(CMISSIntg), PARAMETER :: IndependentFieldUserNumberMovingMesh=11
  77. INTEGER(CMISSIntg), PARAMETER :: EquationsSetUserNumberNavierStokes=12
  78. INTEGER(CMISSIntg), PARAMETER :: EquationsSetUserNumberMovingMesh=13
  79. INTEGER(CMISSIntg), PARAMETER :: EquationsSetFieldUserNumberNavierStokes=22
  80. INTEGER(CMISSIntg), PARAMETER :: EquationsSetFieldUserNumberMovingMesh=23
  81. INTEGER(CMISSIntg), PARAMETER :: ProblemUserNumber=14
  82. INTEGER(CMISSIntg), PARAMETER :: AnalyticFieldUserNumberNavierStokes=42
  83. INTEGER(CMISSIntg), PARAMETER :: DomainUserNumber=1
  84. INTEGER(CMISSIntg), PARAMETER :: SolverNavierStokesUserNumber=1
  85. !should be 1 and the Navier-Stokes solver 2
  86. INTEGER(CMISSIntg), PARAMETER :: SolverMovingMeshUserNumber=1
  87. INTEGER(CMISSIntg), PARAMETER :: MaterialsFieldUserNumberNavierStokesMu=1
  88. INTEGER(CMISSIntg), PARAMETER :: MaterialsFieldUserNumberNavierStokesRho=2
  89. INTEGER(CMISSIntg), PARAMETER :: MaterialsFieldUserNumberMovingMeshK=1
  90. !Program types
  91. TYPE(EXPORT_CONTAINER):: CM
  92. !Program variables
  93. INTEGER(CMISSIntg) :: NUMBER_OF_DIMENSIONS
  94. INTEGER(CMISSIntg) :: BASIS_TYPE
  95. INTEGER(CMISSIntg) :: BASIS_NUMBER_SPACE
  96. INTEGER(CMISSIntg) :: BASIS_NUMBER_VELOCITY
  97. INTEGER(CMISSIntg) :: BASIS_NUMBER_PRESSURE
  98. INTEGER(CMISSIntg) :: BASIS_GAUSS_SPACE
  99. INTEGER(CMISSIntg) :: BASIS_GAUSS_VELOCITY
  100. INTEGER(CMISSIntg) :: BASIS_GAUSS_PRESSURE
  101. INTEGER(CMISSIntg) :: BASIS_XI_INTERPOLATION_SPACE
  102. INTEGER(CMISSIntg) :: BASIS_XI_INTERPOLATION_VELOCITY
  103. INTEGER(CMISSIntg) :: BASIS_XI_INTERPOLATION_PRESSURE
  104. INTEGER(CMISSIntg) :: MESH_NUMBER_OF_COMPONENTS
  105. INTEGER(CMISSIntg) :: MESH_COMPONENT_NUMBER_SPACE
  106. INTEGER(CMISSIntg) :: MESH_COMPONENT_NUMBER_VELOCITY
  107. INTEGER(CMISSIntg) :: MESH_COMPONENT_NUMBER_PRESSURE
  108. INTEGER(CMISSIntg) :: NUMBER_OF_NODES_SPACE
  109. INTEGER(CMISSIntg) :: NUMBER_OF_NODES_VELOCITY
  110. INTEGER(CMISSIntg) :: NUMBER_OF_NODES_PRESSURE
  111. INTEGER(CMISSIntg) :: NUMBER_OF_ELEMENT_NODES_SPACE
  112. INTEGER(CMISSIntg) :: NUMBER_OF_ELEMENT_NODES_VELOCITY
  113. INTEGER(CMISSIntg) :: NUMBER_OF_ELEMENT_NODES_PRESSURE
  114. INTEGER(CMISSIntg) :: TOTAL_NUMBER_OF_NODES
  115. INTEGER(CMISSIntg) :: TOTAL_NUMBER_OF_ELEMENTS
  116. INTEGER(CMISSIntg) :: MAXIMUM_ITERATIONS
  117. INTEGER(CMISSIntg) :: RESTART_VALUE
  118. ! INTEGER(CMISSIntg) :: MPI_IERROR
  119. INTEGER(CMISSIntg) :: NUMBER_OF_FIXED_WALL_NODES_NAVIER_STOKES
  120. INTEGER(CMISSIntg) :: NUMBER_OF_MOVED_WALL_NODES_NAVIER_STOKES
  121. INTEGER(CMISSIntg) :: NUMBER_OF_INLET_WALL_NODES_NAVIER_STOKES
  122. INTEGER(CMISSIntg) :: NUMBER_OF_FIXED_WALL_NODES_MOVING_MESH
  123. INTEGER(CMISSIntg) :: NUMBER_OF_MOVED_WALL_NODES_MOVING_MESH
  124. INTEGER(CMISSIntg) :: EQUATIONS_NAVIER_STOKES_OUTPUT
  125. INTEGER(CMISSIntg) :: EQUATIONS_MOVING_MESH_OUTPUT
  126. INTEGER(CMISSIntg) :: COMPONENT_NUMBER
  127. INTEGER(CMISSIntg) :: NODE_NUMBER
  128. INTEGER(CMISSIntg) :: ELEMENT_NUMBER
  129. INTEGER(CMISSIntg) :: NODE_COUNTER
  130. INTEGER(CMISSIntg) :: CONDITION
  131. INTEGER(CMISSIntg) :: I
  132. INTEGER(CMISSIntg) :: ANALYTIC_TYPE
  133. INTEGER(CMISSIntg) :: DYNAMIC_SOLVER_NAVIER_STOKES_INPUT_OPTION=2
  134. INTEGER(CMISSIntg) :: DYNAMIC_SOLVER_NAVIER_STOKES_OUTPUT_FREQUENCY
  135. INTEGER(CMISSIntg) :: DYNAMIC_SOLVER_NAVIER_STOKES_OUTPUT_TYPE
  136. INTEGER(CMISSIntg) :: NONLINEAR_SOLVER_NAVIER_STOKES_OUTPUT_TYPE
  137. INTEGER(CMISSIntg) :: LINEAR_SOLVER_NAVIER_STOKES_OUTPUT_TYPE
  138. INTEGER(CMISSIntg) :: LINEAR_SOLVER_MOVING_MESH_OUTPUT_TYPE
  139. INTEGER, ALLOCATABLE, DIMENSION(:):: FIXED_WALL_NODES_NAVIER_STOKES
  140. INTEGER, ALLOCATABLE, DIMENSION(:):: MOVED_WALL_NODES_NAVIER_STOKES
  141. INTEGER, ALLOCATABLE, DIMENSION(:):: INLET_WALL_NODES_NAVIER_STOKES
  142. INTEGER, ALLOCATABLE, DIMENSION(:):: FIXED_WALL_NODES_MOVING_MESH
  143. INTEGER, ALLOCATABLE, DIMENSION(:):: MOVED_WALL_NODES_MOVING_MESH
  144. REAL(CMISSDP) :: INITIAL_FIELD_NAVIER_STOKES(3)
  145. REAL(CMISSDP) :: INITIAL_FIELD_MOVING_MESH(3)
  146. REAL(CMISSDP) :: BOUNDARY_CONDITIONS_NAVIER_STOKES(3)
  147. REAL(CMISSDP) :: BOUNDARY_CONDITIONS_MOVING_MESH(3)
  148. REAL(CMISSDP) :: DIVERGENCE_TOLERANCE
  149. REAL(CMISSDP) :: RELATIVE_TOLERANCE
  150. REAL(CMISSDP) :: ABSOLUTE_TOLERANCE
  151. REAL(CMISSDP) :: LINESEARCH_ALPHA
  152. REAL(CMISSDP) :: VALUE
  153. REAL(CMISSDP) :: K_PARAM_MOVING_MESH=1.0_CMISSDP
  154. REAL(CMISSDP) :: MU_PARAM_NAVIER_STOKES
  155. REAL(CMISSDP) :: RHO_PARAM_NAVIER_STOKES
  156. REAL(CMISSDP) :: DYNAMIC_SOLVER_NAVIER_STOKES_START_TIME
  157. REAL(CMISSDP) :: DYNAMIC_SOLVER_NAVIER_STOKES_STOP_TIME
  158. REAL(CMISSDP) :: DYNAMIC_SOLVER_NAVIER_STOKES_THETA
  159. REAL(CMISSDP) :: DYNAMIC_SOLVER_NAVIER_STOKES_TIME_INCREMENT
  160. LOGICAL :: EXPORT_FIELD_IO
  161. LOGICAL :: LINEAR_SOLVER_NAVIER_STOKES_DIRECT_FLAG
  162. LOGICAL :: LINEAR_SOLVER_MOVING_MESH_DIRECT_FLAG
  163. LOGICAL :: FIXED_WALL_NODES_NAVIER_STOKES_FLAG
  164. LOGICAL :: MOVED_WALL_NODES_NAVIER_STOKES_FLAG
  165. LOGICAL :: INLET_WALL_NODES_NAVIER_STOKES_FLAG
  166. LOGICAL :: ALE_SOLVER_NAVIER_STOKES_FLAG
  167. LOGICAL :: ANALYTIC_FLAG
  168. LOGICAL :: DYNAMIC_SOLVER_NAVIER_STOKES_FLAG
  169. LOGICAL :: FIXED_WALL_NODES_MOVING_MESH_FLAG
  170. LOGICAL :: MOVED_WALL_NODES_MOVING_MESH_FLAG
  171. CHARACTER *15 BUFFER
  172. CHARACTER *15 ARG
  173. CHARACTER *15 OUTPUT_STRING
  174. !CMISS variables
  175. !Regions
  176. TYPE(CMISSRegionType) :: Region
  177. TYPE(CMISSRegionType) :: WorldRegion
  178. !Coordinate systems
  179. TYPE(CMISSCoordinateSystemType) :: CoordinateSystem
  180. TYPE(CMISSCoordinateSystemType) :: WorldCoordinateSystem
  181. !Basis
  182. TYPE(CMISSBasisType) :: BasisSpace
  183. TYPE(CMISSBasisType) :: BasisVelocity
  184. TYPE(CMISSBasisType) :: BasisPressure
  185. !Nodes
  186. TYPE(CMISSNodesType) :: Nodes
  187. !Elements
  188. TYPE(CMISSMeshElementsType) :: MeshElementsSpace
  189. TYPE(CMISSMeshElementsType) :: MeshElementsVelocity
  190. TYPE(CMISSMeshElementsType) :: MeshElementsPressure
  191. !Meshes
  192. TYPE(CMISSMeshType) :: Mesh
  193. !Decompositions
  194. TYPE(CMISSDecompositionType) :: Decomposition
  195. !Fields
  196. TYPE(CMISSFieldsType) :: Fields
  197. !Field types
  198. TYPE(CMISSFieldType) :: GeometricField
  199. TYPE(CMISSFieldType) :: AnalyticFieldNavierStokes
  200. TYPE(CMISSFieldType) :: DependentFieldNavierStokes
  201. TYPE(CMISSFieldType) :: DependentFieldMovingMesh
  202. TYPE(CMISSFieldType) :: MaterialsFieldNavierStokes
  203. TYPE(CMISSFieldType) :: MaterialsFieldMovingMesh
  204. TYPE(CMISSFieldType) :: IndependentFieldNavierStokes
  205. TYPE(CMISSFieldType) :: IndependentFieldMovingMesh
  206. TYPE(CMISSFieldType) :: EquationsSetFieldNavierStokes
  207. TYPE(CMISSFieldType) :: EquationsSetFieldMovingMesh
  208. !Boundary conditions
  209. TYPE(CMISSBoundaryConditionsType) :: BoundaryConditionsNavierStokes
  210. TYPE(CMISSBoundaryConditionsType) :: BoundaryConditionsMovingMesh
  211. !Equations sets
  212. TYPE(CMISSEquationsSetType) :: EquationsSetNavierStokes
  213. TYPE(CMISSEquationsSetType) :: EquationsSetMovingMesh
  214. !Equations
  215. TYPE(CMISSEquationsType) :: EquationsNavierStokes
  216. TYPE(CMISSEquationsType) :: EquationsMovingMesh
  217. !Problems
  218. TYPE(CMISSProblemType) :: Problem
  219. !Control loops
  220. TYPE(CMISSControlLoopType) :: ControlLoop
  221. !Solvers
  222. TYPE(CMISSSolverType) :: DynamicSolverNavierStokes
  223. TYPE(CMISSSolverType) :: NonlinearSolverNavierStokes
  224. TYPE(CMISSSolverType) :: LinearSolverNavierStokes
  225. TYPE(CMISSSolverType) :: LinearSolverMovingMesh
  226. !Solver equations
  227. TYPE(CMISSSolverEquationsType) :: SolverEquationsNavierStokes
  228. TYPE(CMISSSolverEquationsType) :: SolverEquationsMovingMesh
  229. #ifdef WIN32
  230. !Quickwin type
  231. LOGICAL :: QUICKWIN_STATUS=.FALSE.
  232. TYPE(WINDOWCONFIG) :: QUICKWIN_WINDOW_CONFIG
  233. #endif
  234. !Generic CMISS variables
  235. INTEGER(CMISSIntg) :: NumberOfComputationalNodes,ComputationalNodeNumber,BoundaryNodeDomain
  236. INTEGER(CMISSIntg) :: EquationsSetIndex
  237. INTEGER(CMISSIntg) :: Err
  238. #ifdef WIN32
  239. !Initialise QuickWin
  240. QUICKWIN_WINDOW_CONFIG%TITLE="General Output" !Window title
  241. QUICKWIN_WINDOW_CONFIG%NUMTEXTROWS=-1 !Max possible number of rows
  242. QUICKWIN_WINDOW_CONFIG%MODE=QWIN$SCROLLDOWN
  243. !Set the window parameters
  244. QUICKWIN_STATUS=SETWINDOWCONFIG(QUICKWIN_WINDOW_CONFIG)
  245. !If attempt fails set with system estimated values
  246. IF(.NOT.QUICKWIN_STATUS) QUICKWIN_STATUS=SETWINDOWCONFIG(QUICKWIN_WINDOW_CONFIG)
  247. #endif
  248. !
  249. !================================================================================================================================
  250. !
  251. !PROBLEM CONTROL PANEL
  252. !Import cmHeart mesh information
  253. CALL FLUID_MECHANICS_IO_READ_CMHEART(CM,Err)
  254. BASIS_NUMBER_SPACE=CM%ID_M
  255. BASIS_NUMBER_VELOCITY=CM%ID_V
  256. BASIS_NUMBER_PRESSURE=CM%ID_P
  257. NUMBER_OF_DIMENSIONS=CM%D
  258. BASIS_TYPE=CM%IT_T
  259. BASIS_XI_INTERPOLATION_SPACE=CM%IT_M
  260. BASIS_XI_INTERPOLATION_VELOCITY=CM%IT_V
  261. BASIS_XI_INTERPOLATION_PRESSURE=CM%IT_P
  262. NUMBER_OF_NODES_SPACE=CM%N_M
  263. NUMBER_OF_NODES_VELOCITY=CM%N_V
  264. NUMBER_OF_NODES_PRESSURE=CM%N_P
  265. TOTAL_NUMBER_OF_NODES=CM%N_T
  266. TOTAL_NUMBER_OF_ELEMENTS=CM%E_T
  267. NUMBER_OF_ELEMENT_NODES_SPACE=CM%EN_M
  268. NUMBER_OF_ELEMENT_NODES_VELOCITY=CM%EN_V
  269. NUMBER_OF_ELEMENT_NODES_PRESSURE=CM%EN_P
  270. !Set initial values
  271. INITIAL_FIELD_NAVIER_STOKES(1)=0.0_CMISSDP
  272. INITIAL_FIELD_NAVIER_STOKES(2)=0.0_CMISSDP
  273. INITIAL_FIELD_NAVIER_STOKES(3)=0.0_CMISSDP
  274. INITIAL_FIELD_MOVING_MESH(1)=0.0_CMISSDP
  275. INITIAL_FIELD_MOVING_MESH(2)=0.0_CMISSDP
  276. INITIAL_FIELD_MOVING_MESH(3)=0.0_CMISSDP
  277. !Set defaults
  278. !Set material parameters
  279. MU_PARAM_NAVIER_STOKES=1.0_CMISSDP
  280. RHO_PARAM_NAVIER_STOKES=1.0_CMISSDP
  281. LINEAR_SOLVER_NAVIER_STOKES_DIRECT_FLAG=.FALSE.
  282. LINEAR_SOLVER_MOVING_MESH_DIRECT_FLAG=.FALSE.
  283. DYNAMIC_SOLVER_NAVIER_STOKES_FLAG=.FALSE.
  284. ALE_SOLVER_NAVIER_STOKES_FLAG=.FALSE.
  285. ANALYTIC_FLAG=.FALSE.
  286. IF(NUMBER_OF_DIMENSIONS==2) THEN
  287. ANALYTIC_TYPE=CMISS_EQUATIONS_SET_NAVIER_STOKES_EQUATION_TWO_DIM_1
  288. ELSE
  289. ANALYTIC_TYPE=CMISS_EQUATIONS_SET_NAVIER_STOKES_EQUATION_THREE_DIM_1
  290. ENDIF
  291. OUTPUT_STRING='DEFAULT'
  292. DYNAMIC_SOLVER_NAVIER_STOKES_START_TIME=0.0_CMISSDP
  293. DYNAMIC_SOLVER_NAVIER_STOKES_STOP_TIME=3.0_CMISSDP
  294. DYNAMIC_SOLVER_NAVIER_STOKES_TIME_INCREMENT=1.0_CMISSDP
  295. !Set initial boundary conditions
  296. BOUNDARY_CONDITIONS_NAVIER_STOKES=0.0_CMISSDP
  297. !Get command line arguments
  298. DO I=1,COMMAND_ARGUMENT_COUNT()
  299. CALL GET_COMMAND_ARGUMENT(I,ARG)
  300. SELECT CASE(ARG)
  301. CASE('-density')
  302. CALL GET_COMMAND_ARGUMENT(I+1,BUFFER)
  303. READ(BUFFER,*) RHO_PARAM_NAVIER_STOKES
  304. CASE('-viscosity')
  305. CALL GET_COMMAND_ARGUMENT(I+1,BUFFER)
  306. READ(BUFFER,*) MU_PARAM_NAVIER_STOKES
  307. CASE('-directsolver')
  308. CALL GET_COMMAND_ARGUMENT(I+1,BUFFER)
  309. READ(BUFFER,*) LINEAR_SOLVER_NAVIER_STOKES_DIRECT_FLAG
  310. CASE('-dynamic')
  311. CALL GET_COMMAND_ARGUMENT(I+1,BUFFER)
  312. READ(BUFFER,*) DYNAMIC_SOLVER_NAVIER_STOKES_FLAG
  313. CASE('-ALE')
  314. CALL GET_COMMAND_ARGUMENT(I+1,BUFFER)
  315. READ(BUFFER,*) ALE_SOLVER_NAVIER_STOKES_FLAG
  316. CASE('-analytic')
  317. CALL GET_COMMAND_ARGUMENT(I+1,BUFFER)
  318. READ(BUFFER,*) ANALYTIC_FLAG
  319. CASE('-analytictype')
  320. CALL GET_COMMAND_ARGUMENT(I+1,BUFFER)
  321. READ(BUFFER,*) ANALYTIC_TYPE
  322. CASE('-analyticoutput')
  323. CALL GET_COMMAND_ARGUMENT(I+1,BUFFER)
  324. READ(BUFFER,*) OUTPUT_STRING
  325. CASE('-starttime')
  326. CALL GET_COMMAND_ARGUMENT(I+1,BUFFER)
  327. READ(BUFFER,*) DYNAMIC_SOLVER_NAVIER_STOKES_START_TIME
  328. CASE('-stoptime')
  329. CALL GET_COMMAND_ARGUMENT(I+1,BUFFER)
  330. READ(BUFFER,*) DYNAMIC_SOLVER_NAVIER_STOKES_STOP_TIME
  331. CASE('-timeincrement')
  332. CALL GET_COMMAND_ARGUMENT(I+1,BUFFER)
  333. READ(BUFFER,*) DYNAMIC_SOLVER_NAVIER_STOKES_TIME_INCREMENT
  334. CASE('-velocity')
  335. CALL GET_COMMAND_ARGUMENT(I+1,BUFFER)
  336. READ(BUFFER,*) BOUNDARY_CONDITIONS_NAVIER_STOKES(1)
  337. CALL GET_COMMAND_ARGUMENT(I+2,BUFFER)
  338. READ(BUFFER,*) BOUNDARY_CONDITIONS_NAVIER_STOKES(2)
  339. CALL GET_COMMAND_ARGUMENT(I+3,BUFFER)
  340. READ(BUFFER,*) BOUNDARY_CONDITIONS_NAVIER_STOKES(3)
  341. CASE DEFAULT
  342. !do nothing
  343. END SELECT
  344. ENDDO
  345. IF(NUMBER_OF_DIMENSIONS==2) THEN
  346. IF(DYNAMIC_SOLVER_NAVIER_STOKES_FLAG) THEN
  347. ANALYTIC_TYPE=CMISS_EQUATIONS_SET_NAVIER_STOKES_EQUATION_TWO_DIM_5
  348. ELSE
  349. ANALYTIC_TYPE=CMISS_EQUATIONS_SET_NAVIER_STOKES_EQUATION_TWO_DIM_1
  350. ENDIF
  351. ELSE
  352. IF(DYNAMIC_SOLVER_NAVIER_STOKES_FLAG) THEN
  353. ANALYTIC_TYPE=CMISS_EQUATIONS_SET_NAVIER_STOKES_EQUATION_THREE_DIM_5
  354. ELSE
  355. ANALYTIC_TYPE=CMISS_EQUATIONS_SET_NAVIER_STOKES_EQUATION_THREE_DIM_1
  356. ENDIF
  357. ENDIF
  358. WRITE(*,*)' '
  359. WRITE(*,*)' ************************************* '
  360. WRITE(*,*)' '
  361. WRITE(*,*)'-density........', RHO_PARAM_NAVIER_STOKES
  362. WRITE(*,*)'-viscosity......', MU_PARAM_NAVIER_STOKES
  363. WRITE(*,*)'-analytic....... ', ANALYTIC_FLAG
  364. IF(.NOT.ANALYTIC_FLAG) THEN
  365. WRITE(*,*)'-velocity.......', BOUNDARY_CONDITIONS_NAVIER_STOKES
  366. ELSE
  367. IF(ANALYTIC_TYPE==CMISS_EQUATIONS_SET_NAVIER_STOKES_EQUATION_TWO_DIM_1.AND.NUMBER_OF_DIMENSIONS==2) THEN
  368. WRITE(*,*)' -analytictype...', 'CMISS_EQUATIONS_SET_NAVIER_STOKES_EQUATION_TWO_DIM_1'
  369. ELSE IF(ANALYTIC_TYPE==CMISS_EQUATIONS_SET_NAVIER_STOKES_EQUATION_TWO_DIM_2.AND.NUMBER_OF_DIMENSIONS==2) THEN
  370. WRITE(*,*)' -analytictype...', 'CMISS_EQUATIONS_SET_NAVIER_STOKES_EQUATION_TWO_DIM_2'
  371. ELSE IF(ANALYTIC_TYPE==CMISS_EQUATIONS_SET_NAVIER_STOKES_EQUATION_TWO_DIM_3.AND.NUMBER_OF_DIMENSIONS==2) THEN
  372. WRITE(*,*)' -analytictype...', 'CMISS_EQUATIONS_SET_NAVIER_STOKES_EQUATION_TWO_DIM_3'
  373. ELSE IF(ANALYTIC_TYPE==CMISS_EQUATIONS_SET_NAVIER_STOKES_EQUATION_TWO_DIM_4.AND.NUMBER_OF_DIMENSIONS==2) THEN
  374. WRITE(*,*)' -analytictype...', 'CMISS_EQUATIONS_SET_NAVIER_STOKES_EQUATION_TWO_DIM_4'
  375. ELSE IF(ANALYTIC_TYPE==CMISS_EQUATIONS_SET_NAVIER_STOKES_EQUATION_TWO_DIM_5.AND.NUMBER_OF_DIMENSIONS==2) THEN
  376. WRITE(*,*)' -analytictype...', 'CMISS_EQUATIONS_SET_NAVIER_STOKES_EQUATION_TWO_DIM_5'
  377. ELSE IF(ANALYTIC_TYPE==CMISS_EQUATIONS_SET_NAVIER_STOKES_EQUATION_THREE_DIM_1.AND.NUMBER_OF_DIMENSIONS==3) THEN
  378. WRITE(*,*)' -analytictype...', 'CMISS_EQUATIONS_SET_NAVIER_STOKES_EQUATION_THREE_DIM_1'
  379. ELSE IF(ANALYTIC_TYPE==CMISS_EQUATIONS_SET_NAVIER_STOKES_EQUATION_THREE_DIM_2.AND.NUMBER_OF_DIMENSIONS==3) THEN
  380. WRITE(*,*)' -analytictype...', 'CMISS_EQUATIONS_SET_NAVIER_STOKES_EQUATION_THREE_DIM_2'
  381. ELSE IF(ANALYTIC_TYPE==CMISS_EQUATIONS_SET_NAVIER_STOKES_EQUATION_THREE_DIM_3.AND.NUMBER_OF_DIMENSIONS==3) THEN
  382. WRITE(*,*)' -analytictype...', 'CMISS_EQUATIONS_SET_NAVIER_STOKES_EQUATION_THREE_DIM_3'
  383. ELSE IF(ANALYTIC_TYPE==CMISS_EQUATIONS_SET_NAVIER_STOKES_EQUATION_THREE_DIM_4.AND.NUMBER_OF_DIMENSIONS==3) THEN
  384. WRITE(*,*)' -analytictype...', 'CMISS_EQUATIONS_SET_NAVIER_STOKES_EQUATION_THREE_DIM_4'
  385. ELSE IF(ANALYTIC_TYPE==CMISS_EQUATIONS_SET_NAVIER_STOKES_EQUATION_THREE_DIM_5.AND.NUMBER_OF_DIMENSIONS==3) THEN
  386. WRITE(*,*)' -analytictype...', 'CMISS_EQUATIONS_SET_NAVIER_STOKES_EQUATION_THREE_DIM_5'
  387. ENDIF
  388. ENDIF
  389. WRITE(*,*) ' '
  390. WRITE(*,*)'-dynamic........ ', DYNAMIC_SOLVER_NAVIER_STOKES_FLAG
  391. IF(DYNAMIC_SOLVER_NAVIER_STOKES_FLAG) THEN
  392. WRITE(*,*)' -starttime...... ', DYNAMIC_SOLVER_NAVIER_STOKES_START_TIME
  393. WRITE(*,*)' -stoptime....... ', DYNAMIC_SOLVER_NAVIER_STOKES_STOP_TIME
  394. WRITE(*,*)' -timeincrement.. ', DYNAMIC_SOLVER_NAVIER_STOKES_TIME_INCREMENT
  395. WRITE(*,*)' -ALE............ ', ALE_SOLVER_NAVIER_STOKES_FLAG
  396. WRITE(*,*) ' '
  397. ENDIF
  398. WRITE(*,*)'-directsolver... ', LINEAR_SOLVER_NAVIER_STOKES_DIRECT_FLAG
  399. WRITE(*,*)' '
  400. WRITE(*,*)' ************************************* '
  401. WRITE(*,*)' '
  402. WRITE(*,*) ' '
  403. !Set boundary conditions
  404. INQUIRE(FILE="./input/bc/FIXED_WALL", EXIST=FIXED_WALL_NODES_NAVIER_STOKES_FLAG)
  405. INQUIRE(FILE="./input/bc/FREE_INLET", EXIST=INLET_WALL_NODES_NAVIER_STOKES_FLAG)
  406. INQUIRE(FILE="./input/bc/MOVED_WALL", EXIST=MOVED_WALL_NODES_NAVIER_STOKES_FLAG)
  407. INQUIRE(FILE="./input/bc/FIXED_MESH", EXIST=FIXED_WALL_NODES_MOVING_MESH_FLAG)
  408. INQUIRE(FILE="./input/bc/MOVED_MESH", EXIST=MOVED_WALL_NODES_MOVING_MESH_FLAG)
  409. INITIAL_FIELD_NAVIER_STOKES(1)=BOUNDARY_CONDITIONS_NAVIER_STOKES(1)
  410. INITIAL_FIELD_NAVIER_STOKES(2)=BOUNDARY_CONDITIONS_NAVIER_STOKES(2)
  411. INITIAL_FIELD_NAVIER_STOKES(3)=BOUNDARY_CONDITIONS_NAVIER_STOKES(3)
  412. IF(FIXED_WALL_NODES_NAVIER_STOKES_FLAG) THEN
  413. OPEN(UNIT=1, FILE="./input/bc/FIXED_WALL",STATUS='unknown')
  414. READ(1,*) NUMBER_OF_FIXED_WALL_NODES_NAVIER_STOKES
  415. ALLOCATE(FIXED_WALL_NODES_NAVIER_STOKES(NUMBER_OF_FIXED_WALL_NODES_NAVIER_STOKES))
  416. READ(1,*) FIXED_WALL_NODES_NAVIER_STOKES(1:NUMBER_OF_FIXED_WALL_NODES_NAVIER_STOKES)
  417. CLOSE(1)
  418. ENDIF
  419. IF(MOVED_WALL_NODES_NAVIER_STOKES_FLAG) THEN
  420. OPEN(UNIT=1, FILE="./input/bc/MOVED_WALL",STATUS='unknown')
  421. READ(1,*) NUMBER_OF_MOVED_WALL_NODES_NAVIER_STOKES
  422. ALLOCATE(MOVED_WALL_NODES_NAVIER_STOKES(NUMBER_OF_MOVED_WALL_NODES_NAVIER_STOKES))
  423. READ(1,*) MOVED_WALL_NODES_NAVIER_STOKES(1:NUMBER_OF_MOVED_WALL_NODES_NAVIER_STOKES)
  424. CLOSE(1)
  425. ENDIF
  426. IF(INLET_WALL_NODES_NAVIER_STOKES_FLAG) THEN
  427. OPEN(UNIT=1, FILE="./input/bc/FREE_INLET",STATUS='unknown')
  428. READ(1,*) NUMBER_OF_INLET_WALL_NODES_NAVIER_STOKES
  429. ALLOCATE(INLET_WALL_NODES_NAVIER_STOKES(NUMBER_OF_INLET_WALL_NODES_NAVIER_STOKES))
  430. READ(1,*) INLET_WALL_NODES_NAVIER_STOKES(1:NUMBER_OF_INLET_WALL_NODES_NAVIER_STOKES)
  431. CLOSE(1)
  432. ENDIF
  433. IF(FIXED_WALL_NODES_MOVING_MESH_FLAG) THEN
  434. OPEN(UNIT=1, FILE="./input/bc/FIXED_MESH",STATUS='unknown')
  435. READ(1,*) NUMBER_OF_FIXED_WALL_NODES_MOVING_MESH
  436. ALLOCATE(FIXED_WALL_NODES_MOVING_MESH(NUMBER_OF_FIXED_WALL_NODES_MOVING_MESH))
  437. READ(1,*) FIXED_WALL_NODES_MOVING_MESH(1:NUMBER_OF_FIXED_WALL_NODES_MOVING_MESH)
  438. CLOSE(1)
  439. ENDIF
  440. IF(MOVED_WALL_NODES_MOVING_MESH_FLAG) THEN
  441. OPEN(UNIT=1, FILE="./input/bc/MOVED_MESH",STATUS='unknown')
  442. READ(1,*) NUMBER_OF_MOVED_WALL_NODES_MOVING_MESH
  443. ALLOCATE(MOVED_WALL_NODES_MOVING_MESH(NUMBER_OF_MOVED_WALL_NODES_MOVING_MESH))
  444. READ(1,*) MOVED_WALL_NODES_MOVING_MESH(1:NUMBER_OF_MOVED_WALL_NODES_MOVING_MESH)
  445. CLOSE(1)
  446. BOUNDARY_CONDITIONS_MOVING_MESH(1)=0.0_CMISSDP
  447. BOUNDARY_CONDITIONS_MOVING_MESH(2)=0.0_CMISSDP
  448. BOUNDARY_CONDITIONS_MOVING_MESH(3)=0.0_CMISSDP
  449. ENDIF
  450. !Set interpolation parameters
  451. BASIS_GAUSS_SPACE=4
  452. BASIS_GAUSS_VELOCITY=4
  453. BASIS_GAUSS_PRESSURE=4
  454. !Set output parameter
  455. !(NoOutput/ProgressOutput/TimingOutput/SolverOutput/SolverMatrixOutput)
  456. DYNAMIC_SOLVER_NAVIER_STOKES_OUTPUT_TYPE=CMISS_SOLVER_NO_OUTPUT
  457. LINEAR_SOLVER_MOVING_MESH_OUTPUT_TYPE=CMISS_SOLVER_NO_OUTPUT
  458. NONLINEAR_SOLVER_NAVIER_STOKES_OUTPUT_TYPE=CMISS_SOLVER_PROGRESS_OUTPUT
  459. LINEAR_SOLVER_NAVIER_STOKES_OUTPUT_TYPE=CMISS_SOLVER_NO_OUTPUT
  460. !(NoOutput/TimingOutput/MatrixOutput/ElementOutput)
  461. EQUATIONS_NAVIER_STOKES_OUTPUT=CMISS_EQUATIONS_NO_OUTPUT
  462. !Set time parameter
  463. DYNAMIC_SOLVER_NAVIER_STOKES_THETA=1.0_CMISSDP
  464. !Set result output parameter
  465. DYNAMIC_SOLVER_NAVIER_STOKES_OUTPUT_FREQUENCY=1
  466. !Set solver parameters
  467. RELATIVE_TOLERANCE=1.0E-10_CMISSDP !default: 1.0E-05_CMISSDP
  468. ABSOLUTE_TOLERANCE=1.0E-10_CMISSDP !default: 1.0E-10_CMISSDP
  469. DIVERGENCE_TOLERANCE=1.0E20 !default: 1.0E5
  470. MAXIMUM_ITERATIONS=100000 !default: 100000
  471. RESTART_VALUE=3000 !default: 30
  472. LINESEARCH_ALPHA=1.0
  473. !
  474. !================================================================================================================================
  475. !
  476. !INITIALISE OPENCMISS
  477. CALL CMISSInitialise(WorldCoordinateSystem,WorldRegion,Err)
  478. CALL CMISSErrorHandlingModeSet(CMISS_ERRORS_TRAP_ERROR,Err)
  479. !
  480. !================================================================================================================================
  481. !
  482. !CHECK COMPUTATIONAL NODE
  483. !Get the computational nodes information
  484. CALL CMISSComputationalNumberOfNodesGet(NumberOfComputationalNodes,Err)
  485. CALL CMISSComputationalNodeNumberGet(ComputationalNodeNumber,Err)
  486. !
  487. !================================================================================================================================
  488. !
  489. !COORDINATE SYSTEM
  490. !Start the creation of a new RC coordinate system
  491. CALL CMISSCoordinateSystem_Initialise(CoordinateSystem,Err)
  492. CALL CMISSCoordinateSystem_CreateStart(CoordinateSystemUserNumber,CoordinateSystem,Err)
  493. !Set the coordinate system dimension
  494. CALL CMISSCoordinateSystem_DimensionSet(CoordinateSystem,NUMBER_OF_DIMENSIONS,Err)
  495. !Finish the creation of the coordinate system
  496. CALL CMISSCoordinateSystem_CreateFinish(CoordinateSystem,Err)
  497. !
  498. !================================================================================================================================
  499. !
  500. !REGION
  501. !Start the creation of a new region
  502. CALL CMISSRegion_Initialise(Region,Err)
  503. CALL CMISSRegion_CreateStart(RegionUserNumber,WorldRegion,Region,Err)
  504. !Set the regions coordinate system as defined above
  505. CALL CMISSRegion_CoordinateSystemSet(Region,CoordinateSystem,Err)
  506. !Finish the creation of the region
  507. CALL CMISSRegion_CreateFinish(Region,Err)
  508. !
  509. !================================================================================================================================
  510. !
  511. !BASES
  512. !Start the creation of new bases
  513. MESH_NUMBER_OF_COMPONENTS=1
  514. CALL CMISSBasis_Initialise(BasisSpace,Err)
  515. CALL CMISSBasis_CreateStart(BASIS_NUMBER_SPACE,BasisSpace,Err)
  516. !Set the basis type (Lagrange/Simplex)
  517. CALL CMISSBasis_TypeSet(BasisSpace,BASIS_TYPE,Err)
  518. !Set the basis xi number
  519. CALL CMISSBasis_NumberOfXiSet(BasisSpace,NUMBER_OF_DIMENSIONS,Err)
  520. !Set the basis xi interpolation and number of Gauss points
  521. IF(NUMBER_OF_DIMENSIONS==2) THEN
  522. CALL CMISSBasis_InterpolationXiSet(BasisSpace,(/BASIS_XI_INTERPOLATION_SPACE,BASIS_XI_INTERPOLATION_SPACE/),Err)
  523. IF(BASIS_TYPE/=CMISS_BASIS_SIMPLEX_TYPE) THEN
  524. CALL CMISSBasis_QuadratureNumberOfGaussXiSet(BasisSpace,(/BASIS_GAUSS_SPACE,BASIS_GAUSS_SPACE/),Err)
  525. ELSE
  526. CALL CMISSBasis_QuadratureOrderSet(BasisSpace,BASIS_GAUSS_SPACE+1,Err)
  527. ENDIF
  528. ELSE IF(NUMBER_OF_DIMENSIONS==3) THEN
  529. CALL CMISSBasis_InterpolationXiSet(BasisSpace,(/BASIS_XI_INTERPOLATION_SPACE,BASIS_XI_INTERPOLATION_SPACE, &
  530. & BASIS_XI_INTERPOLATION_SPACE/),Err)
  531. IF(BASIS_TYPE/=CMISS_BASIS_SIMPLEX_TYPE) THEN
  532. CALL CMISSBasis_QuadratureNumberOfGaussXiSet(BasisSpace,(/BASIS_GAUSS_SPACE,BASIS_GAUSS_SPACE,BASIS_GAUSS_SPACE/), &
  533. & Err)
  534. ELSE
  535. CALL CMISSBasis_QuadratureOrderSet(BasisSpace,BASIS_GAUSS_SPACE+1,Err)
  536. ENDIF
  537. ENDIF
  538. !Finish the creation of the basis
  539. CALL CMISSBasis_CreateFinish(BasisSpace,Err)
  540. !Start the creation of another basis
  541. IF(BASIS_XI_INTERPOLATION_VELOCITY==BASIS_XI_INTERPOLATION_SPACE) THEN
  542. BasisVelocity=BasisSpace
  543. ELSE
  544. MESH_NUMBER_OF_COMPONENTS=MESH_NUMBER_OF_COMPONENTS+1
  545. !Initialise a new velocity basis
  546. CALL CMISSBasis_Initialise(BasisVelocity,Err)
  547. !Start the creation of a basis
  548. CALL CMISSBasis_CreateStart(BASIS_NUMBER_VELOCITY,BasisVelocity,Err)
  549. !Set the basis type (Lagrange/Simplex)
  550. CALL CMISSBasis_TypeSet(BasisVelocity,BASIS_TYPE,Err)
  551. !Set the basis xi number
  552. CALL CMISSBasis_NumberOfXiSet(BasisVelocity,NUMBER_OF_DIMENSIONS,Err)
  553. !Set the basis xi interpolation and number of Gauss points
  554. IF(NUMBER_OF_DIMENSIONS==2) THEN
  555. CALL CMISSBasis_InterpolationXiSet(BasisVelocity,(/BASIS_XI_INTERPOLATION_VELOCITY,BASIS_XI_INTERPOLATION_VELOCITY/),Err)
  556. IF(BASIS_TYPE/=CMISS_BASIS_SIMPLEX_TYPE) THEN
  557. CALL CMISSBasis_QuadratureNumberOfGaussXiSet(BasisVelocity,(/BASIS_GAUSS_VELOCITY,BASIS_GAUSS_VELOCITY/),Err)
  558. ELSE
  559. CALL CMISSBasis_QuadratureOrderSet(BasisVelocity,BASIS_GAUSS_VELOCITY+1,Err)
  560. ENDIF
  561. ELSE IF(NUMBER_OF_DIMENSIONS==3) THEN
  562. CALL CMISSBasis_InterpolationXiSet(BasisVelocity,(/BASIS_XI_INTERPOLATION_VELOCITY,BASIS_XI_INTERPOLATION_VELOCITY, &
  563. & BASIS_XI_INTERPOLATION_VELOCITY/),Err)
  564. IF(BASIS_TYPE/=CMISS_BASIS_SIMPLEX_TYPE) THEN
  565. CALL CMISSBasis_QuadratureNumberOfGaussXiSet(BasisVelocity,(/BASIS_GAUSS_VELOCITY,BASIS_GAUSS_VELOCITY, &
  566. & BASIS_GAUSS_VELOCITY/),Err)
  567. ELSE
  568. CALL CMISSBasis_QuadratureOrderSet(BasisVelocity,BASIS_GAUSS_VELOCITY+1,Err)
  569. ENDIF
  570. ENDIF
  571. !Finish the creation of the basis
  572. CALL CMISSBasis_CreateFinish(BasisVelocity,Err)
  573. ENDIF
  574. !Start the creation of another basis
  575. IF(BASIS_XI_INTERPOLATION_PRESSURE==BASIS_XI_INTERPOLATION_SPACE) THEN
  576. BasisPressure=BasisSpace
  577. ELSE IF(BASIS_XI_INTERPOLATION_PRESSURE==BASIS_XI_INTERPOLATION_VELOCITY) THEN
  578. BasisPressure=BasisVelocity
  579. ELSE
  580. MESH_NUMBER_OF_COMPONENTS=MESH_NUMBER_OF_COMPONENTS+1
  581. !Initialise a new pressure basis
  582. CALL CMISSBasis_Initialise(BasisPressure,Err)
  583. !Start the creation of a basis
  584. CALL CMISSBasis_CreateStart(BASIS_NUMBER_PRESSURE,BasisPressure,Err)
  585. !Set the basis type (Lagrange/Simplex)
  586. CALL CMISSBasis_TypeSet(BasisPressure,BASIS_TYPE,Err)
  587. !Set the basis xi number
  588. CALL CMISSBasis_NumberOfXiSet(BasisPressure,NUMBER_OF_DIMENSIONS,Err)
  589. !Set the basis xi interpolation and number of Gauss points
  590. IF(NUMBER_OF_DIMENSIONS==2) THEN
  591. CALL CMISSBasis_InterpolationXiSet(BasisPressure,(/BASIS_XI_INTERPOLATION_PRESSURE,BASIS_XI_INTERPOLATION_PRESSURE/),Err)
  592. IF(BASIS_TYPE/=CMISS_BASIS_SIMPLEX_TYPE) THEN
  593. CALL CMISSBasis_QuadratureNumberOfGaussXiSet(BasisPressure,(/BASIS_GAUSS_PRESSURE,BASIS_GAUSS_PRESSURE/),Err)
  594. ELSE
  595. CALL CMISSBasis_QuadratureOrderSet(BasisPressure,BASIS_GAUSS_PRESSURE+1,Err)
  596. ENDIF
  597. ELSE IF(NUMBER_OF_DIMENSIONS==3) THEN
  598. CALL CMISSBasis_InterpolationXiSet(BasisPressure,(/BASIS_XI_INTERPOLATION_PRESSURE,BASIS_XI_INTERPOLATION_PRESSURE, &
  599. & BASIS_XI_INTERPOLATION_PRESSURE/),Err)
  600. IF(BASIS_TYPE/=CMISS_BASIS_SIMPLEX_TYPE) THEN
  601. CALL CMISSBasis_QuadratureNumberOfGaussXiSet(BasisPressure,(/BASIS_GAUSS_PRESSURE,BASIS_GAUSS_PRESSURE, &
  602. & BASIS_GAUSS_PRESSURE/),Err)
  603. ELSE
  604. CALL CMISSBasis_QuadratureOrderSet(BasisPressure,BASIS_GAUSS_PRESSURE+1,Err)
  605. ENDIF
  606. ENDIF
  607. !Finish the creation of the basis
  608. CALL CMISSBasis_CreateFinish(BasisPressure,Err)
  609. ENDIF
  610. !
  611. !================================================================================================================================
  612. !
  613. !MESH
  614. !Start the creation of mesh nodes
  615. CALL CMISSNodes_Initialise(Nodes,Err)
  616. CALL CMISSMesh_Initialise(Mesh,Err)
  617. CALL CMISSNodes_CreateStart(Region,TOTAL_NUMBER_OF_NODES,Nodes,Err)
  618. CALL CMISSNodes_CreateFinish(Nodes,Err)
  619. !Start the creation of the mesh
  620. CALL CMISSMesh_CreateStart(MeshUserNumber,Region,NUMBER_OF_DIMENSIONS,Mesh,Err)
  621. !Set number of mesh elements
  622. CALL CMISSMesh_NumberOfElementsSet(Mesh,TOTAL_NUMBER_OF_ELEMENTS,Err)
  623. !Set number of mesh components
  624. CALL CMISSMesh_NumberOfComponentsSet(Mesh,MESH_NUMBER_OF_COMPONENTS,Err)
  625. !Specify spatial mesh component
  626. CALL CMISSMeshElements_Initialise(MeshElementsSpace,Err)
  627. CALL CMISSMeshElements_Initialise(MeshElementsVelocity,Err)
  628. CALL CMISSMeshElements_Initialise(MeshElementsPressure,Err)
  629. MESH_COMPONENT_NUMBER_SPACE=1
  630. MESH_COMPONENT_NUMBER_VELOCITY=1
  631. MESH_COMPONENT_NUMBER_PRESSURE=1
  632. CALL CMISSMeshElements_CreateStart(Mesh,MESH_COMPONENT_NUMBER_SPACE,BasisSpace,MeshElementsSpace,Err)
  633. DO ELEMENT_NUMBER=1,TOTAL_NUMBER_OF_ELEMENTS
  634. CALL CMISSMeshElements_NodesSet(MeshElementsSpace,ELEMENT_NUMBER,CM%M(ELEMENT_NUMBER,1:NUMBER_OF_ELEMENT_NODES_SPACE),Err)
  635. ENDDO
  636. CALL CMISSMeshElements_CreateFinish(MeshElementsSpace,Err)
  637. !Specify velocity mesh component
  638. IF(BASIS_XI_INTERPOLATION_VELOCITY==BASIS_XI_INTERPOLATION_SPACE) THEN
  639. MeshElementsVelocity=MeshElementsSpace
  640. ELSE
  641. MESH_COMPONENT_NUMBER_VELOCITY=MESH_COMPONENT_NUMBER_SPACE+1
  642. CALL CMISSMeshElements_CreateStart(Mesh,MESH_COMPONENT_NUMBER_VELOCITY,BasisVelocity,MeshElementsVelocity,Err)
  643. DO ELEMENT_NUMBER=1,TOTAL_NUMBER_OF_ELEMENTS
  644. CALL CMISSMeshElements_NodesSet(MeshElementsVelocity,ELEMENT_NUMBER,CM%V(ELEMENT_NUMBER, &
  645. & 1:NUMBER_OF_ELEMENT_NODES_VELOCITY),Err)
  646. ENDDO
  647. CALL CMISSMeshElements_CreateFinish(MeshElementsVelocity,Err)
  648. ENDIF
  649. !Specify pressure mesh component
  650. IF(BASIS_XI_INTERPOLATION_PRESSURE==BASIS_XI_INTERPOLATION_SPACE) THEN
  651. MeshElementsPressure=MeshElementsSpace
  652. MESH_COMPONENT_NUMBER_PRESSURE=MESH_COMPONENT_NUMBER_SPACE
  653. ELSE IF(BASIS_XI_INTERPOLATION_PRESSURE==BASIS_XI_INTERPOLATION_VELOCITY) THEN
  654. MeshElementsPressure=MeshElementsVelocity
  655. MESH_COMPONENT_NUMBER_PRESSURE=MESH_COMPONENT_NUMBER_VELOCITY
  656. ELSE
  657. MESH_COMPONENT_NUMBER_PRESSURE=MESH_COMPONENT_NUMBER_VELOCITY+1
  658. CALL CMISSMeshElements_CreateStart(Mesh,MESH_COMPONENT_NUMBER_PRESSURE,BasisPressure,MeshElementsPressure,Err)
  659. DO ELEMENT_NUMBER=1,TOTAL_NUMBER_OF_ELEMENTS
  660. CALL CMISSMeshElements_NodesSet(MeshElementsPressure,ELEMENT_NUMBER,CM%P(ELEMENT_NUMBER, &
  661. & 1:NUMBER_OF_ELEMENT_NODES_PRESSURE),Err)
  662. ENDDO
  663. CALL CMISSMeshElements_CreateFinish(MeshElementsPressure,Err)
  664. ENDIF
  665. !Finish the creation of the mesh
  666. CALL CMISSMesh_CreateFinish(Mesh,Err)
  667. !
  668. !================================================================================================================================
  669. !
  670. !GEOMETRIC FIELD
  671. !Create a decomposition
  672. CALL CMISSDecomposition_Initialise(Decomposition,Err)
  673. CALL CMISSDecomposition_CreateStart(DecompositionUserNumber,Mesh,Decomposition,Err)
  674. !Set the decomposition to be a general decomposition with the specified number of domains
  675. CALL CMISSDecomposition_TypeSet(Decomposition,CMISS_DECOMPOSITION_CALCULATED_TYPE,Err)
  676. CALL CMISSDecomposition_NumberOfDomainsSet(Decomposition,NumberOfComputationalNodes,Err)
  677. !Finish the decomposition
  678. CALL CMISSDecomposition_CreateFinish(Decomposition,Err)
  679. !Start to create a default (geometric) field on the region
  680. CALL CMISSField_Initialise(GeometricField,Err)
  681. CALL CMISSField_CreateStart(GeometricFieldUserNumber,Region,GeometricField,Err)
  682. !Set the field type
  683. CALL CMISSField_TypeSet(GeometricField,CMISS_FIELD_GEOMETRIC_TYPE,Err)
  684. !Set the decomposition to use
  685. CALL CMISSField_MeshDecompositionSet(GeometricField,Decomposition,Err)
  686. !Set the scaling to use
  687. CALL CMISSField_ScalingTypeSet(GeometricField,CMISS_FIELD_NO_SCALING,Err)
  688. !Set the mesh component to be used by the field components.
  689. DO COMPONENT_NUMBER=1,NUMBER_OF_DIMENSIONS
  690. CALL CMISSField_ComponentMeshComponentSet(GeometricField,CMISS_FIELD_U_VARIABLE_TYPE,COMPONENT_NUMBER, &
  691. & MESH_COMPONENT_NUMBER_SPACE,Err)
  692. ENDDO
  693. !Finish creating the field
  694. CALL CMISSField_CreateFinish(GeometricField,Err)
  695. !Update the geometric field parameters
  696. DO NODE_NUMBER=1,NUMBER_OF_NODES_SPACE
  697. DO COMPONENT_NUMBER=1,NUMBER_OF_DIMENSIONS
  698. VALUE=CM%N(NODE_NUMBER,COMPONENT_NUMBER)
  699. CALL CMISSDecomposition_NodeDomainGet(Decomposition,NODE_NUMBER,1,BoundaryNodeDomain,Err)
  700. IF(BoundaryNodeDomain==ComputationalNodeNumber) THEN
  701. CALL CMISSField_ParameterSetUpdateNode(GeometricField,CMISS_FIELD_U_VARIABLE_TYPE,CMISS_FIELD_VALUES_SET_TYPE, &
  702. & 1,CMISS_NO_GLOBAL_DERIV,NODE_NUMBER,COMPONENT_NUMBER,VALUE,Err)
  703. ENDIF
  704. ENDDO
  705. ENDDO
  706. CALL CMISSField_ParameterSetUpdateStart(GeometricField,CMISS_FIELD_U_VARIABLE_TYPE,CMISS_FIELD_VALUES_SET_TYPE,Err)
  707. CALL CMISSField_ParameterSetUpdateFinish(GeometricField,CMISS_FIELD_U_VARIABLE_TYPE,CMISS_FIELD_VALUES_SET_TYPE,Err)
  708. !
  709. !================================================================================================================================
  710. !
  711. !EQUATIONS SETS
  712. !Create the equations set for static/dynamic Navier-Stokes
  713. CALL CMISSEquationsSet_Initialise(EquationsSetNavierStokes,Err)
  714. CALL CMISSField_Initialise(EquationsSetFieldNavierStokes,Err)
  715. !Set the equations set to be a static/dynamic Navier-Stokes problem
  716. IF(DYNAMIC_SOLVER_NAVIER_STOKES_FLAG) THEN
  717. IF(ALE_SOLVER_NAVIER_STOKES_FLAG) THEN
  718. CALL CMISSEquationsSet_CreateStart(EquationsSetUserNumberNavierStokes,Region,GeometricField, &
  719. & CMISS_EQUATIONS_SET_FLUID_MECHANICS_CLASS, &
  720. & CMISS_EQUATIONS_SET_NAVIER_STOKES_EQUATION_TYPE,CMISS_EQUATIONS_SET_ALE_NAVIER_STOKES_SUBTYPE, &
  721. & EquationsSetFieldUserNumber, &
  722. & EquationsSetFieldNavierStokes,EquationsSetNavierStokes,Err)
  723. ELSE
  724. CALL CMISSEquationsSet_CreateStart(EquationsSetUserNumberNavierStokes,Region,GeometricField, &
  725. & CMISS_EQUATIONS_SET_FLUID_MECHANICS_CLASS, &
  726. & CMISS_EQUATIONS_SET_NAVIER_STOKES_EQUATION_TYPE,CMISS_EQUATIONS_SET_TRANSIENT_NAVIER_STOKES_SUBTYPE, &
  727. & EquationsSetFieldUserNumber, &
  728. & EquationsSetFieldNavierStokes,EquationsSetNavierStokes,Err)
  729. ENDIF
  730. ELSE
  731. CALL CMISSEquationsSet_CreateStart(EquationsSetUserNumberNavierStokes,Region,GeometricField, &
  732. & CMISS_EQUATIONS_SET_FLUID_MECHANICS_CLASS, &
  733. & CMISS_EQUATIONS_SET_NAVIER_STOKES_EQUATION_TYPE,CMISS_EQUATIONS_SET_STATIC_NAVIER_STOKES_SUBTYPE, &
  734. & EquationsSetFieldUserNumber, &
  735. & EquationsSetFieldNavierStokes,EquationsSetNavierStokes,Err)
  736. ENDIF
  737. !Finish creating the equations set
  738. CALL CMISSEquationsSet_CreateFinish(EquationsSetNavierStokes,Err)
  739. IF(ALE_SOLVER_NAVIER_STOKES_FLAG) THEN
  740. !Create the equations set for moving mesh
  741. CALL CMISSField_Initialise(EquationsSetFieldMovingMesh,Err)
  742. CALL CMISSEquationsSet_Initialise(EquationsSetMovingMesh,Err)
  743. CALL CMISSEquationsSet_CreateStart(EquationsSetUserNumberMovingMesh,Region,GeometricField, &
  744. & CMISS_EQUATIONS_SET_CLASSICAL_FIELD_CLASS, &
  745. & CMISS_EQUATIONS_SET_LAPLACE_EQUATION_TYPE,CMISS_EQUATIONS_SET_MOVING_MESH_LAPLACE_SUBTYPE,&
  746. & EquationsSetFieldUserNumberMovingMesh,EquationsSetFieldMovingMesh,EquationsSetMovingMesh,Err)
  747. !Set the equations set to be a moving mesh problem
  748. ! CALL CMISSEquationsSet_SpecificationSet(EquationsSetMovingMesh,CMISS_EQUATIONS_SET_CLASSICAL_FIELD_CLASS, &
  749. ! & CMISS_EQUATIONS_SET_LAPLACE_EQUATION_TYPE,CMISS_EQUATIONS_SET_MOVING_MESH_LAPLACE_SUBTYPE,Err)
  750. !Finish creating the equations set
  751. CALL CMISSEquationsSet_CreateFinish(EquationsSetMovingMesh,Err)
  752. ENDIF
  753. !
  754. !================================================================================================================================
  755. !
  756. !DEPENDENT FIELDS
  757. !Create the equations set dependent field variables for static/dynamic Navier-Stokes
  758. CALL CMISSField_Initialise(DependentFieldNavierStokes,Err)
  759. CALL CMISSEquationsSet_DependentCreateStart(EquationsSetNavierStokes,DependentFieldUserNumberNavierStokes, &
  760. & DependentFieldNavierStokes,Err)
  761. !Set the mesh component to be used by the field components.
  762. DO COMPONENT_NUMBER=1,NUMBER_OF_DIMENSIONS
  763. CALL CMISSField_ComponentMeshComponentSet(DependentFieldNavierStokes,CMISS_FIELD_U_VARIABLE_TYPE,COMPONENT_NUMBER, &
  764. & MESH_COMPONENT_NUMBER_VELOCITY,Err)
  765. CALL CMISSField_ComponentMeshComponentSet(DependentFieldNavierStokes,CMISS_FIELD_DELUDELN_VARIABLE_TYPE,COMPONENT_NUMBER, &
  766. & MESH_COMPONENT_NUMBER_VELOCITY,Err)
  767. ENDDO
  768. COMPONENT_NUMBER=NUMBER_OF_DIMENSIONS+1
  769. CALL CMISSField_ComponentMeshComponentSet(DependentFieldNavierStokes,CMISS_FIELD_U_VARIABLE_TYPE,COMPONENT_NUMBER, &
  770. & MESH_COMPONENT_NUMBER_PRESSURE,Err)
  771. CALL CMISSField_ComponentMeshComponentSet(DependentFieldNavierStokes,CMISS_FIELD_DELUDELN_VARIABLE_TYPE,COMPONENT_NUMBER, &
  772. & MESH_COMPONENT_NUMBER_PRESSURE,Err)
  773. !Finish the equations set dependent field variables
  774. CALL CMISSEquationsSet_DependentCreateFinish(EquationsSetNavierStokes,Err)
  775. !Initialise dependent field
  776. DO COMPONENT_NUMBER=1,NUMBER_OF_DIMENSIONS
  777. CALL CMISSField_ComponentValuesInitialise(DependentFieldNavierStokes,CMISS_FIELD_U_VARIABLE_TYPE,CMISS_FIELD_VALUES_SET_TYPE, &
  778. & COMPONENT_NUMBER,INITIAL_FIELD_NAVIER_STOKES(COMPONENT_NUMBER),Err)
  779. ENDDO
  780. IF(ALE_SOLVER_NAVIER_STOKES_FLAG) THEN
  781. !Create the equations set dependent field variables for moving mesh
  782. CALL CMISSField_Initialise(DependentFieldMovingMesh,Err)
  783. CALL CMISSEquationsSet_DependentCreateStart(EquationsSetMovingMesh,DependentFieldUserNumberMovingMesh, &
  784. & DependentFieldMovingMesh,Err)
  785. !Set the mesh component to be used by the field components.
  786. DO COMPONENT_NUMBER=1,NUMBER_OF_DIMENSIONS
  787. CALL CMISSField_ComponentMeshComponentSet(DependentFieldMovingMesh,CMISS_FIELD_U_VARIABLE_TYPE,COMPONENT_NUMBER, &
  788. & MESH_COMPONENT_NUMBER_SPACE,Err)
  789. CALL CMISSField_ComponentMeshComponentSet(DependentFieldMovingMesh,CMISS_FIELD_DELUDELN_VARIABLE_TYPE,COMPONENT_NUMBER, &
  790. & MESH_COMPONENT_NUMBER_SPACE,Err)
  791. ENDDO
  792. !Finish the equations set dependent field variables
  793. CALL CMISSEquationsSet_DependentCreateFinish(EquationsSetMovingMesh,Err)
  794. !Initialise dependent field
  795. DO COMPONENT_NUMBER=1,NUMBER_OF_DIMENSIONS
  796. CALL CMISSField_ComponentValuesInitialise(DependentFieldMovingMesh,CMISS_FIELD_U_VARIABLE_TYPE,CMISS_FIELD_VALUES_SET_TYPE, &
  797. & COMPONENT_NUMBER,INITIAL_FIELD_MOVING_MESH(COMPONENT_NUMBER),Err)
  798. ENDDO
  799. ENDIF
  800. !
  801. !================================================================================================================================
  802. !
  803. !MATERIALS FIELDS
  804. !Create the equations set materials field variables for static/dynamic Navier-Stokes
  805. CALL CMISSField_Initialise(MaterialsFieldNavierStokes,Err)
  806. CALL CMISSEquationsSet_MaterialsCreateStart(EquationsSetNavierStokes,MaterialsFieldUserNumberNavierStokes, &
  807. & MaterialsFieldNavierStokes,Err)
  808. !Finish the equations set materials field variables
  809. CALL CMISSEquationsSet_MaterialsCreateFinish(EquationsSetNavierStokes,Err)
  810. CALL CMISSField_ComponentValuesInitialise(MaterialsFieldNavierStokes,CMISS_FIELD_U_VARIABLE_TYPE,CMISS_FIELD_VALUES_SET_TYPE, &
  811. & MaterialsFieldUserNumberNavierStokesMu,MU_PARAM_NAVIER_STOKES,Err)
  812. CALL CMISSField_ComponentValuesInitialise(MaterialsFieldNavierStokes,CMISS_FIELD_U_VARIABLE_TYPE,CMISS_FIELD_VALUES_SET_TYPE, &
  813. & MaterialsFieldUserNumberNavierStokesRho,RHO_PARAM_NAVIER_STOKES,Err)
  814. IF(ALE_SOLVER_NAVIER_STOKES_FLAG) THEN
  815. !Create the equations set materials field variables for moving mesh
  816. CALL CMISSField_Initialise(MaterialsFieldMovingMesh,Err)
  817. CALL CMISSEquationsSet_MaterialsCreateStart(EquationsSetMovingMesh,MaterialsFieldUserNumberMovingMesh, &
  818. & MaterialsFieldMovingMesh,Err)
  819. !Finish the equations set materials field variables
  820. CALL CMISSEquationsSet_MaterialsCreateFinish(EquationsSetMovingMesh,Err)
  821. CALL CMISSField_ComponentValuesInitialise(MaterialsFieldMovingMesh,CMISS_FIELD_U_VARIABLE_TYPE,CMISS_FIELD_VALUES_SET_TYPE, &
  822. & MaterialsFieldUserNumberMovingMeshK,K_PARAM_MOVING_MESH,Err)
  823. ENDIF
  824. !
  825. !================================================================================================================================
  826. !
  827. !INDEPENDENT FIELDS
  828. IF(ALE_SOLVER_NAVIER_STOKES_FLAG) THEN
  829. !Create the equations set independent field variables for ALE Navier-Stokes
  830. CALL CMISSField_Initialise(IndependentFieldNavierStokes,Err)
  831. CALL CMISSEquationsSet_IndependentCreateStart(EquationsSetNavierStokes,IndependentFieldUserNumberNavierStokes, &
  832. & IndependentFieldNavierStokes,Err)
  833. !Set the mesh component to be used by the field components.
  834. DO COMPONENT_NUMBER=1,NUMBER_OF_DIMENSIONS
  835. CALL CMISSField_ComponentMeshComponentSet(InDependentFieldNavierStokes,CMISS_FIELD_U_VARIABLE_TYPE,COMPONENT_NUMBER, &
  836. & MESH_COMPONENT_NUMBER_SPACE,Err)
  837. ENDDO
  838. !Finish the equations set independent field variables
  839. CALL CMISSEquationsSet_IndependentCreateFinish(EquationsSetNavierStokes,Err)
  840. !Create the equations set independent field variables for moving mesh
  841. CALL CMISSField_Initialise(IndependentFieldMovingMesh,Err)
  842. CALL CMISSEquationsSet_IndependentCreateStart(EquationsSetMovingMesh,IndependentFieldUserNumberMovingMesh, &
  843. & IndependentFieldMovingMesh,Err)
  844. !Set the mesh component to be used by the field components.
  845. DO COMPONENT_NUMBER=1,NUMBER_OF_DIMENSIONS
  846. CALL CMISSField_ComponentMeshComponentSet(InDependentFieldMovingMesh,CMISS_FIELD_U_VARIABLE_TYPE,COMPONENT_NUMBER, &
  847. & MESH_COMPONENT_NUMBER_SPACE,Err)
  848. ENDDO
  849. !Finish the equations set independent field variables
  850. CALL CMISSEquationsSet_IndependentCreateFinish(EquationsSetMovingMesh,Err)
  851. ENDIF
  852. !
  853. !================================================================================================================================
  854. !
  855. IF(ANALYTIC_FLAG) THEN
  856. !ANALYTIC FIELDS
  857. !Create the equations set analytic field variables for static/dynamic Navier-Stokes
  858. CALL CMISSField_Initialise(AnalyticFieldNavierStokes,Err)
  859. IF(NUMBER_OF_DIMENSIONS==2) THEN
  860. CALL CMISSEquationsSet_AnalyticCreateStart(EquationsSetNavierStokes,ANALYTIC_TYPE,AnalyticFieldUserNumberNavierStokes, &
  861. & AnalyticFieldNavierStokes,Err)
  862. ELSE
  863. CALL CMISSEquationsSet_AnalyticCreateStart(EquationsSetNavierStokes,ANALYTIC_TYPE,AnalyticFieldUserNumberNavierStokes, &
  864. & AnalyticFieldNavierStokes,Err)
  865. ENDIF
  866. !Finish the equations set analytic field variables
  867. CALL CMISSEquationsSet_AnalyticCreateFinish(EquationsSetNavierStokes,Err)
  868. ENDIF
  869. !
  870. !================================================================================================================================
  871. !
  872. !EQUATIONS
  873. !Create the equations set equations
  874. CALL CMISSEquations_Initialise(EquationsNavierStokes,Err)
  875. CALL CMISSEquationsSet_EquationsCreateStart(EquationsSetNavierStokes,EquationsNavierStokes,Err)
  876. !Set the equations matrices sparsity type
  877. CALL CMISSEquations_SparsityTypeSet(EquationsNavierStokes,CMISS_EQUATIONS_SPARSE_MATRICES,Err)
  878. IF(DYNAMIC_SOLVER_NAVIER_STOKES_FLAG) THEN
  879. !Set the equations lumping type
  880. CALL CMISSEquations_LumpingTypeSet(EquationsNavierStokes,CMISS_EQUATIONS_UNLUMPED_MATRICES,Err)
  881. ENDIF
  882. !Set the equations set output
  883. CALL CMISSEquations_OutputTypeSet(EquationsNavierStokes,EQUATIONS_NAVIER_STOKES_OUTPUT,Err)
  884. !Finish the equations set equations
  885. CALL CMISSEquationsSet_EquationsCreateFinish(EquationsSetNavierStokes,Err)
  886. IF(ALE_SOLVER_NAVIER_STOKES_FLAG) THEN
  887. !Create the equations set equations
  888. CALL CMISSEquations_Initialise(EquationsMovingMesh,Err)
  889. CALL CMISSEquationsSet_EquationsCreateStart(EquationsSetMovingMesh,EquationsMovingMesh,Err)
  890. !Set the equations matrices sparsity type
  891. CALL CMISSEquations_SparsityTypeSet(EquationsMovingMesh,CMISS_EQUATIONS_SPARSE_MATRICES,Err)
  892. !Set the equations set output
  893. CALL CMISSEquations_OutputTypeSet(EquationsMovingMesh,EQUATIONS_MOVING_MESH_OUTPUT,Err)
  894. !Finish the equations set equations
  895. CALL CMISSEquationsSet_EquationsCreateFinish(EquationsSetMovingMesh,Err)
  896. ENDIF
  897. !
  898. !================================================================================================================================
  899. !
  900. !PROBLEMS
  901. !Start the creation of a problem.
  902. CALL CMISSProblem_Initialise(Problem,Err)
  903. CALL CMISSControlLoop_Initialise(ControlLoop,Err)
  904. CALL CMISSProblem_CreateStart(ProblemUserNumber,Problem,Err)
  905. !Set the problem to be a static/dynamic Navier-Stokes problem
  906. IF(DYNAMIC_SOLVER_NAVIER_STOKES_FLAG) THEN
  907. IF(ALE_SOLVER_NAVIER_STOKES_FLAG) THEN
  908. CALL CMISSProblem_SpecificationSet(Problem,CMISS_PROBLEM_FLUID_MECHANICS_CLASS,CMISS_PROBLEM_NAVIER_STOKES_EQUATION_TYPE, &
  909. & CMISS_PROBLEM_ALE_NAVIER_STOKES_SUBTYPE,Err)
  910. ELSE
  911. CALL CMISSProblem_SpecificationSet(Problem,CMISS_PROBLEM_FLUID_MECHANICS_CLASS,CMISS_PROBLEM_NAVIER_STOKES_EQUATION_TYPE, &
  912. & CMISS_PROBLEM_TRANSIENT_NAVIER_STOKES_SUBTYPE,Err)
  913. ENDIF
  914. ELSE
  915. CALL CMISSProblem_SpecificationSet(Problem,CMISS_PROBLEM_FLUID_MECHANICS_CLASS,CMISS_PROBLEM_NAVIER_STOKES_EQUATION_TYPE, &
  916. & CMISS_PROBLEM_STATIC_NAVIER_STOKES_SUBTYPE,Err)
  917. ENDIF
  918. !Finish the creation of a problem.
  919. CALL CMISSProblem_CreateFinish(Problem,Err)
  920. !Start the creation of the problem control loop
  921. CALL CMISSProblem_ControlLoopCreateStart(Problem,Err)
  922. IF(DYNAMIC_SOLVER_NAVIER_STOKES_FLAG) THEN
  923. !Get the control loop
  924. CALL CMISSProblem_ControlLoopGet(Problem,CMISS_CONTROL_LOOP_NODE,ControlLoop,Err)
  925. !Set the times
  926. CALL CMISSControlLoop_TimesSet(ControlLoop,DYNAMIC_SOLVER_NAVIER_STOKES_START_TIME,DYNAMIC_SOLVER_NAVIER_STOKES_STOP_TIME, &
  927. & DYNAMIC_SOLVER_NAVIER_STOKES_TIME_INCREMENT,Err)
  928. !Set the output timing
  929. CALL CMISSControlLoop_TimeOutputSet(ControlLoop,DYNAMIC_SOLVER_NAVIER_STOKES_OUTPUT_FREQUENCY,Err)
  930. IF(ALE_SOLVER_NAVIER_STOKES_FLAG) THEN
  931. CALL CMISSControlLoop_TimeInputSet(ControlLoop,DYNAMIC_SOLVER_NAVIER_STOKES_INPUT_OPTION,Err)
  932. ENDIF
  933. ENDIF
  934. !Finish creating the problem control loop
  935. CALL CMISSProblem_ControlLoopCreateFinish(Problem,Err)
  936. !
  937. !================================================================================================================================
  938. !
  939. !SOLVERS
  940. !Start the creation of the problem solvers
  941. CALL CMISSSolver_Initialise(LinearSolverMovingMesh,Err)
  942. CALL CMISSSolver_Initialise(DynamicSolverNavierStokes,Err)
  943. CALL CMISSSolver_Initialise(NonlinearSolverNavierStokes,Err)
  944. CALL CMISSSolver_Initialise(LinearSolverNavierStokes,Err)
  945. CALL CMISSProblem_SolversCreateStart(Problem,Err)
  946. IF(ALE_SOLVER_NAVIER_STOKES_FLAG) THEN
  947. !Get the moving mesh solver
  948. CALL CMISSProblem_SolverGet(Problem,CMISS_CONTROL_LOOP_NODE,SolverMovingMeshUserNumber,LinearSolverMovingMesh,Err)
  949. !Set the output type
  950. !CALL CMISSSolver_OutputTypeSet(LinearSolverMovingMesh,LINEAR_SOLVER_MOVING_MESH_OUTPUT_TYPE,Err)
  951. CALL CMISSSolver_OutputTypeSet(LinearSolverMovingMesh,4,Err)
  952. !Set the solver settings
  953. IF(LINEAR_SOLVER_MOVING_MESH_DIRECT_FLAG) THEN
  954. CALL CMISSSolver_LinearTypeSet(LinearSolverMovingMesh,CMISS_SOLVER_LINEAR_DIRECT_SOLVE_TYPE,Err)
  955. CALL CMISSSolver_LibraryTypeSet(LinearSolverMovingMesh,CMISS_SOLVER_MUMPS_LIBRARY,Err)
  956. ELSE
  957. CALL CMISSSolver_LinearTypeSet(LinearSolverMovingMesh,CMISS_SOLVER_LINEAR_ITERATIVE_SOLVE_TYPE,Err)
  958. CALL CMISSSolver_LinearIterativeMaximumIterationsSet(LinearSolverMovingMesh,MAXIMUM_ITERATIONS,Err)
  959. CALL CMISSSolver_LinearIterativeDivergenceToleranceSet(LinearSolverMovingMesh,DIVERGENCE_TOLERANCE,Err)
  960. CALL CMISSSolver_LinearIterativeRelativeToleranceSet(LinearSolverMovingMesh,RELATIVE_TOLERANCE,Err)
  961. CALL CMISSSolver_LinearIterativeAbsoluteToleranceSet(LinearSolverMovingMesh,ABSOLUTE_TOLERANCE,Err)
  962. CALL CMISSSolver_LinearIterativeGMRESRestartSet(LinearSolverMovingMesh,RESTART_VALUE,Err)
  963. ENDIF
  964. ENDIF
  965. IF(DYNAMIC_SOLVER_NAVIER_STOKES_FLAG) THEN
  966. !Get the dynamic dymamic solver
  967. CALL CMISSProblem_SolverGet(Problem,CMISS_CONTROL_LOOP_NODE,SolverNavierStokesUserNumber,DynamicSolverNavierStokes,Err)
  968. !Set the output type
  969. CALL CMISSSolver_OutputTypeSet(DynamicSolverNavierStokes,DYNAMIC_SOLVER_NAVIER_STOKES_OUTPUT_TYPE,Err)
  970. !Set theta
  971. CALL CMISSSolver_DynamicThetaSet(DynamicSolverNavierStokes,DYNAMIC_SOLVER_NAVIER_STOKES_THETA,Err)
  972. ! CALL CMISSSolverDynamicDynamicSet(DynamicSolverNavierStokes,.TRUE.,Err)
  973. !Get the dynamic nonlinear solver
  974. CALL CMISSSolver_DynamicNonlinearSolverGet(DynamicSolverNavierStokes,NonlinearSolverNavierStokes,Err)
  975. !Set the nonlinear Jacobian type
  976. CALL CMISSSolver_NewtonJacobianCalculationTypeSet(NonlinearSolverNavierStokes, &
  977. & CMISS_SOLVER_NEWTON_JACOBIAN_EQUATIONS_CALCULATED, &
  978. & Err)
  979. !Set the output type
  980. CALL CMISSSolver_OutputTypeSet(NonlinearSolverNavierStokes,NONLINEAR_SOLVER_NAVIER_STOKES_OUTPUT_TYPE,Err)
  981. !Set the solver settings
  982. CALL CMISSSolver_NewtonAbsoluteToleranceSet(NonlinearSolverNavierStokes,ABSOLUTE_TOLERANCE,Err)
  983. CALL CMISSSolver_NewtonRelativeToleranceSet(NonlinearSolverNavierStokes,RELATIVE_TOLERANCE,Err)
  984. !Get the dynamic nonlinear linear solver
  985. CALL CMISSSolver_NewtonLinearSolverGet(NonlinearSolverNavierStokes,LinearSolverNavierStokes,Err)
  986. ELSE
  987. !Get the nonlinear static solver
  988. CALL CMISSProblem_SolverGet(Problem,CMISS_CONTROL_LOOP_NODE,SolverNavierStokesUserNumber,NonlinearSolverNavierStokes,Err)
  989. !Set the nonlinear Jacobian type
  990. CALL CMISSSolver_NewtonJacobianCalculationTypeSet(NonlinearSolverNavierStokes, &
  991. & CMISS_SOLVER_NEWTON_JACOBIAN_EQUATIONS_CALCULATED, &
  992. & Err)
  993. !Set the output type
  994. CALL CMISSSolver_OutputTypeSet(NonlinearSolverNavierStokes,NONLINEAR_SOLVER_NAVIER_STOKES_OUTPUT_TYPE,Err)
  995. !Set the solver settings
  996. CALL CMISSSolver_NewtonAbsoluteToleranceSet(NonlinearSolverNavierStokes,ABSOLUTE_TOLERANCE,Err)
  997. CALL CMISSSolver_NewtonRelativeToleranceSet(NonlinearSolverNavierStokes,RELATIVE_TOLERANCE,Err)
  998. !Get the nonlinear linear solver
  999. CALL CMISSSolver_NewtonLinearSolverGet(NonlinearSolverNavierStokes,LinearSolverNavierStokes,Err)
  1000. !Set the output type
  1001. CALL CMISSSolver_OutputTypeSet(LinearSolverNavierStokes,LINEAR_SOLVER_NAVIER_STOKES_OUTPUT_TYPE,Err)
  1002. ENDIF
  1003. !Set the solver settings
  1004. IF(LINEAR_SOLVER_NAVIER_STOKES_DIRECT_FLAG) THEN
  1005. CALL CMISSSolver_LinearTypeSet(LinearSolverNavierStokes,CMISS_SOLVER_LINEAR_DIRECT_SOLVE_TYPE,Err)
  1006. CALL CMISSSolver_LibraryTypeSet(LinearSolverNavierStokes,CMISS_SOLVER_MUMPS_LIBRARY,Err)
  1007. ELSE
  1008. CALL CMISSSolver_LinearTypeSet(LinearSolverNavierStokes,CMISS_SOLVER_LINEAR_ITERATIVE_SOLVE_TYPE,Err)
  1009. CALL CMISSSolver_LinearIterativeMaximumIterationsSet(LinearSolverNavierStokes,MAXIMUM_ITERATIONS,Err)
  1010. CALL CMISSSolver_LinearIterativeDivergenceToleranceSet(LinearSolverNavierStokes,DIVERGENCE_TOLERANCE,Err)
  1011. CALL CMISSSolver_LinearIterativeRelativeToleranceSet(LinearSolverNavierStokes,RELATIVE_TOLERANCE,Err)
  1012. CALL CMISSSolver_LinearIterativeAbsoluteToleranceSet(LinearSolverNavierStokes,ABSOLUTE_TOLERANCE,Err)
  1013. CALL CMISSSolver_LinearIterativeGMRESRestartSet(LinearSolverNavierStokes,RESTART_VALUE,Err)
  1014. ENDIF
  1015. !Finish the creation of the problem solver
  1016. CALL CMISSProblem_SolversCreateFinish(Problem,Err)
  1017. !
  1018. !================================================================================================================================
  1019. !
  1020. !SOLVER EQUATIONS
  1021. CALL CMISSSolver_Initialise(DynamicSolverNavierStokes,Err)
  1022. CALL CMISSSolverEquations_Initialise(SolverEquationsNavierStokes,Err)
  1023. CALL CMISSSolver_Initialise(LinearSolverMovingMesh,Err)
  1024. CALL CMISSSolverEquations_Initialise(SolverEquationsMovingMesh,Err)
  1025. CALL CMISSSolver_Initialise(LinearSolverNavierStokes,Err)
  1026. CALL CMISSSolverEquations_Initialise(SolverEquationsNavierStokes,Err)
  1027. CALL CMISSProblem_SolverEquationsCreateStart(Problem,Err)
  1028. IF(DYNAMIC_SOLVER_NAVIER_STOKES_FLAG) THEN
  1029. !Start the creation of the problem solver equations
  1030. IF(ALE_SOLVER_NAVIER_STOKES_FLAG) THEN
  1031. !Get the linear solver equations
  1032. CALL CMISSProblem_SolverGet(Problem,CMISS_CONTROL_LOOP_NODE,SolverMovingMeshUserNumber,LinearSolverMovingMesh,Err)
  1033. CALL CMISSSolver_SolverEquationsGet(LinearSolverMovingMesh,SolverEquationsMovingMesh,Err)
  1034. !Set the solver equations sparsity
  1035. CALL CMISSSolverEquations_SparsityTypeSet(SolverEquationsMovingMesh,CMISS_SOLVER_SPARSE_MATRICES,Err)
  1036. !Add in the equations set
  1037. CALL CMISSSolverEquations_EquationsSetAdd(SolverEquationsMovingMesh,EquationsSetMovingMesh,EquationsSetIndex,Err)
  1038. !Finish the creation of the problem solver equations
  1039. !Get the dynamic solver equations
  1040. CALL CMISSProblem_SolverGet(Problem,CMISS_CONTROL_LOOP_NODE,SolverNavierStokesUserNumber,DynamicSolverNavierStokes,Err)
  1041. CALL CMISSSolver_SolverEquationsGet(DynamicSolverNavierStokes,SolverEquationsNavierStokes,Err)
  1042. ELSE
  1043. !Get the dynamic solver equations
  1044. CALL CMISSProblem_SolverGet(Problem,CMISS_CONTROL_LOOP_NODE,SolverNavierStokesUserNumber,DynamicSolverNavierStokes,Err)
  1045. CALL CMISSSolver_SolverEquationsGet(DynamicSolverNavierStokes,SolverEquationsNavierStokes,Err)
  1046. ENDIF
  1047. ELSE
  1048. !Start the creation of the problem solver equations
  1049. !Get the linear solver equations
  1050. CALL CMISSProblem_SolverGet(Problem,CMISS_CONTROL_LOOP_NODE,SolverNavierStokesUserNumber,LinearSolverNavierStokes,Err)
  1051. CALL CMISSSolver_SolverEquationsGet(LinearSolverNavierStokes,SolverEquationsNavierStokes,Err)
  1052. ENDIF
  1053. !Set the solver equations sparsity
  1054. CALL CMISSSolverEquations_SparsityTypeSet(SolverEquationsNavierStokes,CMISS_SOLVER_SPARSE_MATRICES,Err)
  1055. !Add in the equations set
  1056. CALL CMISSSolverEquations_EquationsSetAdd(SolverEquationsNavierStokes,EquationsSetNavierStokes,EquationsSetIndex,Err)
  1057. !Finish the creation of the problem solver equations
  1058. CALL CMISSProblem_SolverEquationsCreateFinish(Problem,Err)
  1059. !
  1060. !================================================================================================================================
  1061. !
  1062. !BOUNDARY CONDITIONS
  1063. CALL CMISSBoundaryConditions_Initialise(BoundaryConditionsNavierStokes,Err)
  1064. IF(.NOT.ANALYTIC_FLAG) THEN
  1065. !Start the creation of the equations set boundary conditions for Navier-Stokes
  1066. CALL CMISSSolverEquations_BoundaryConditionsCreateStart(SolverEquationsNavierStokes,BoundaryConditionsNavierStokes,Err)
  1067. !Set fixed wall nodes
  1068. IF(FIXED_WALL_NODES_NAVIER_STOKES_FLAG) THEN
  1069. DO NODE_COUNTER=1,NUMBER_OF_FIXED_WALL_NODES_NAVIER_STOKES
  1070. NODE_NUMBER=FIXED_WALL_NODES_NAVIER_STOKES(NODE_COUNTER)
  1071. CONDITION=CMISS_BOUNDARY_CONDITION_FIXED_WALL
  1072. CALL CMISSDecomposition_NodeDomainGet(Decomposition,NODE_NUMBER,1,BoundaryNodeDomain,Err)
  1073. IF(BoundaryNodeDomain==ComputationalNodeNumber) THEN
  1074. DO COMPONENT_NUMBER=1,NUMBER_OF_DIMENSIONS
  1075. VALUE=0.0_CMISSDP
  1076. CALL CMISSBoundaryConditions_SetNode(BoundaryConditionsNavierStokes,DependentFieldNavierStokes, &
  1077. & CMISS_FIELD_U_VARIABLE_TYPE,1,CMISS_NO_GLOBAL_DERIV,NODE_NUMBER,COMPONENT_NUMBER,CONDITION,VALUE,Err)
  1078. ENDDO
  1079. ENDIF
  1080. ENDDO
  1081. ENDIF
  1082. !Set moved wall nodes
  1083. IF(MOVED_WALL_NODES_NAVIER_STOKES_FLAG) THEN
  1084. DO NODE_COUNTER=1,NUMBER_OF_MOVED_WALL_NODES_NAVIER_STOKES
  1085. NODE_NUMBER=MOVED_WALL_NODES_NAVIER_STOKES(NODE_COUNTER)
  1086. CONDITION=CMISS_BOUNDARY_CONDITION_MOVED_WALL
  1087. CALL CMISSDecomposition_NodeDomainGet(Decomposition,NODE_NUMBER,1,BoundaryNodeDomain,Err)
  1088. IF(BoundaryNodeDomain==ComputationalNodeNumber) THEN
  1089. DO COMPONENT_NUMBER=1,NUMBER_OF_DIMENSIONS
  1090. VALUE=0.0_CMISSDP
  1091. CALL CMISSBoundaryConditions_SetNode(BoundaryConditionsNavierStokes,DependentFieldNavierStokes, &
  1092. & CMISS_FIELD_U_VARIABLE_TYPE,1,CMISS_NO_GLOBAL_DERIV,NODE_NUMBER,COMPONENT_NUMBER,CONDITION,VALUE,Err)
  1093. ENDDO
  1094. ENDIF
  1095. ENDDO
  1096. ENDIF
  1097. !Set velocity boundary conditions
  1098. IF(INLET_WALL_NODES_NAVIER_STOKES_FLAG) THEN
  1099. DO NODE_COUNTER=1,NUMBER_OF_INLET_WALL_NODES_NAVIER_STOKES
  1100. NODE_NUMBER=INLET_WALL_NODES_NAVIER_STOKES(NODE_COUNTER)
  1101. CONDITION=CMISS_BOUNDARY_CONDITION_FIXED_INLET
  1102. CALL CMISSDecomposition_NodeDomainGet(Decomposition,NODE_NUMBER,1,BoundaryNodeDomain,Err)
  1103. IF(BoundaryNodeDomain==ComputationalNodeNumber) THEN
  1104. DO COMPONENT_NUMBER=1,NUMBER_OF_DIMENSIONS
  1105. VALUE=BOUNDARY_CONDITIONS_NAVIER_STOKES(COMPONENT_NUMBER)
  1106. CALL CMISSBoundaryConditions_SetNode(BoundaryConditionsNavierStokes,DependentFieldNavierStokes, &
  1107. & CMISS_FIELD_U_VARIABLE_TYPE,1,CMISS_NO_GLOBAL_DERIV,NODE_NUMBER,COMPONENT_NUMBER,CONDITION,VALUE,Err)
  1108. ENDDO
  1109. ENDIF
  1110. ENDDO
  1111. ENDIF
  1112. !Finish the creation of the equations set boundary conditions
  1113. CALL CMISSSolverEquations_BoundaryConditionsCreateFinish(SolverEquationsNavierStokes,Err)
  1114. IF(ALE_SOLVER_NAVIER_STOKES_FLAG) THEN
  1115. !Start the creation of the equations set boundary conditions for moving mesh
  1116. CALL CMISSBoundaryConditions_Initialise(BoundaryConditionsMovingMesh,Err)
  1117. CALL CMISSSolverEquations_BoundaryConditionsCreateStart(SolverEquationsMovingMesh,BoundaryConditionsMovingMesh,Err)
  1118. !Set fixed wall nodes
  1119. IF(FIXED_WALL_NODES_MOVING_MESH_FLAG) THEN
  1120. DO NODE_COUNTER=1,NUMBER_OF_FIXED_WALL_NODES_MOVING_MESH
  1121. NODE_NUMBER=FIXED_WALL_NODES_MOVING_MESH(NODE_COUNTER)
  1122. CONDITION=CMISS_BOUNDARY_CONDITION_FIXED_WALL
  1123. CALL CMISSDecomposition_NodeDomainGet(Decomposition,NODE_NUMBER,1,BoundaryNodeDomain,Err)
  1124. IF(BoundaryNodeDomain==ComputationalNodeNumber) THEN
  1125. DO COMPONENT_NUMBER=1,NUMBER_OF_DIMENSIONS
  1126. VALUE=0.0_CMISSDP
  1127. CALL CMISSBoundaryConditions_SetNode(BoundaryConditionsMovingMesh,DependentFieldMovingMesh, &
  1128. & CMISS_FIELD_U_VARIABLE_TYPE,1, &
  1129. & CMISS_NO_GLOBAL_DERIV,NODE_NUMBER,COMPONENT_NUMBER,CONDITION,VALUE,Err)
  1130. ENDDO
  1131. ENDIF
  1132. ENDDO
  1133. ENDIF
  1134. !Set moved wall nodes
  1135. IF(MOVED_WALL_NODES_MOVING_MESH_FLAG) THEN
  1136. DO NODE_COUNTER=1,NUMBER_OF_MOVED_WALL_NODES_MOVING_MESH
  1137. NODE_NUMBER=MOVED_WALL_NODES_MOVING_MESH(NODE_COUNTER)
  1138. CONDITION=CMISS_BOUNDARY_CONDITION_MOVED_WALL
  1139. CALL CMISSDecomposition_NodeDomainGet(Decomposition,NODE_NUMBER,1,BoundaryNodeDomain,Err)
  1140. IF(BoundaryNodeDomain==ComputationalNodeNumber) THEN
  1141. DO COMPONENT_NUMBER=1,NUMBER_OF_DIMENSIONS
  1142. VALUE=BOUNDARY_CONDITIONS_MOVING_MESH(COMPONENT_NUMBER)
  1143. CALL CMISSBoundaryConditions_SetNode(BoundaryConditionsMovingMesh,DependentFieldMovingMesh, &
  1144. & CMISS_FIELD_U_VARIABLE_TYPE,1, &
  1145. & CMISS_NO_GLOBAL_DERIV,NODE_NUMBER,COMPONENT_NUMBER,CONDITION,VALUE,Err)
  1146. ENDDO
  1147. ENDIF
  1148. ENDDO
  1149. ENDIF
  1150. !Finish the creation of the equations set boundary conditions
  1151. CALL CMISSSolverEquations_BoundaryConditionsCreateFinish(SolverEquationsMovingMesh,Err)
  1152. ENDIF
  1153. ELSE
  1154. !Set up the boundary conditions as per the analytic solution
  1155. CALL CMISSSolverEquations_BoundaryConditionsCreateStart(SolverEquationsNavierStokes,BoundaryConditionsNavierStokes,Err)
  1156. CALL CMISSSolverEquations_BoundaryConditionsAnalytic(SolverEquationsNavierStokes,Err)
  1157. CALL CMISSSolverEquations_BoundaryConditionsCreateFinish(SolverEquationsNavierStokes,Err)
  1158. ENDIF
  1159. !
  1160. !================================================================================================================================
  1161. !
  1162. !RUN SOLVERS
  1163. !Turn of PETSc error handling
  1164. !CALL PETSC_ERRORHANDLING_SET_ON(ERR,ERROR,*999)
  1165. !Solve the problem
  1166. WRITE(*,'(A)') "Solving problem..."
  1167. CALL CMISSProblem_Solve(Problem,Err)
  1168. WRITE(*,'(A)') "Problem solved!"
  1169. !
  1170. !================================================================================================================================
  1171. !
  1172. !OUTPUT
  1173. IF(ANALYTIC_FLAG) THEN
  1174. !Output Analytic analysis
  1175. CALL CMISSAnalyticAnalysisOutput(DependentFieldNavierStokes,OUTPUT_STRING,Err)
  1176. ENDIF
  1177. EXPORT_FIELD_IO=.FALSE.
  1178. IF(EXPORT_FIELD_IO) THEN
  1179. WRITE(*,'(A)') "Exporting fields..."
  1180. CALL CMISSFields_Initialise(Fields,Err)
  1181. CALL CMISSFields_Create(Region,Fields,Err)
  1182. CALL CMISSFields_NodesExport(Fields,"MasterNavierStokes","FORTRAN",Err)
  1183. CALL CMISSFields_ElementsExport(Fields,"MasterNavierStokes","FORTRAN",Err)
  1184. CALL CMISSFields_Finalise(Fields,Err)
  1185. WRITE(*,'(A)') "Field exported!"
  1186. ENDIF
  1187. !Finialise CMISS
  1188. CALL CMISSFinalise(Err)
  1189. WRITE(*,'(A)') "Program successfully completed."
  1190. STOP
  1191. END PROGRAM NAVIERSTOKESMASTEREXAMPLE