/FluidMechanics/NavierStokes/Static_FieldML/src/Static_FieldMLExample.f90

http://github.com/xyan075/examples · Fortran Modern · 647 lines · 340 code · 117 blank · 190 comment · 0 complexity · 141f45defc168f696733f69af6fa8189 MD5 · raw file

  1. !> \file
  2. !> \author Sebastian Krittian
  3. !> \brief This is an example program to solve a static Navier-Stokes 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 FluidMechanics/NavierStokes/Static_FieldML/src/Static_FieldMLExample.f90
  42. !! Example program to solve a static Navier-Stokes equation using OpenCMISS calls.
  43. !! \htmlinclude FluidMechanics/NavierStokes/Static_FieldML/history.html
  44. !!
  45. !<
  46. !> Main program
  47. PROGRAM NAVIERSTOKESSTATICEXAMPLE
  48. !
  49. !================================================================================================================================
  50. !
  51. !PROGRAM LIBRARIES
  52. USE OPENCMISS
  53. USE MPI
  54. USE FIELDML_API
  55. #ifdef WIN32
  56. USE IFQWINCMISS
  57. #endif
  58. !
  59. !================================================================================================================================
  60. !
  61. !PROGRAM VARIABLES AND TYPES
  62. IMPLICIT NONE
  63. !Test program parameters
  64. INTEGER(CMISSIntg), PARAMETER :: CoordinateSystemUserNumber=1
  65. INTEGER(CMISSIntg), PARAMETER :: RegionUserNumber=2
  66. INTEGER(CMISSIntg), PARAMETER :: MeshUserNumber=3
  67. INTEGER(CMISSIntg), PARAMETER :: DecompositionUserNumber=4
  68. INTEGER(CMISSIntg), PARAMETER :: GeometricFieldUserNumber=5
  69. INTEGER(CMISSIntg), PARAMETER :: EquationsSetFieldUserNumber=6
  70. INTEGER(CMISSIntg), PARAMETER :: DependentFieldUserNumberNavierStokes=7
  71. INTEGER(CMISSIntg), PARAMETER :: MaterialsFieldUserNumberNavierStokes=8
  72. INTEGER(CMISSIntg), PARAMETER :: IndependentFieldUserNumberNavierStokes=9
  73. INTEGER(CMISSIntg), PARAMETER :: EquationsSetUserNumberNavierStokes=10
  74. INTEGER(CMISSIntg), PARAMETER :: ProblemUserNumber=11
  75. INTEGER(CMISSIntg), PARAMETER :: DomainUserNumber=1
  76. INTEGER(CMISSIntg), PARAMETER :: SolverNavierStokesUserNumber=1
  77. INTEGER(CMISSIntg), PARAMETER :: MaterialsFieldUserNumberNavierStokesMu=1
  78. INTEGER(CMISSIntg), PARAMETER :: MaterialsFieldUserNumberNavierStokesRho=2
  79. INTEGER(CMISSIntg), PARAMETER :: basisNumberTrilinear=1
  80. INTEGER(CMISSIntg), PARAMETER :: basisNumberTriquadratic=2
  81. INTEGER(CMISSIntg), PARAMETER :: gaussQuadrature(3) = [3,3,3]
  82. CHARACTER(KIND=C_CHAR,LEN=*), PARAMETER :: inputFilename = "../../TOOLS/NavierStokesMeshes/HEX-M2-V2-P1_FE.xml"
  83. CHARACTER(KIND=C_CHAR,LEN=*), PARAMETER :: outputDirectory = "output"
  84. CHARACTER(KIND=C_CHAR,LEN=*), PARAMETER :: outputFilename = outputDirectory//"/HEX-M2-V2-P1_FE_out.xml"
  85. CHARACTER(KIND=C_CHAR,LEN=*), PARAMETER :: basename = "static_navier_stokes"
  86. CHARACTER(KIND=C_CHAR,LEN=*), PARAMETER :: dataFormat = "PLAIN_TEXT"
  87. !Program types
  88. !Program variables
  89. INTEGER(CMISSIntg) :: BASIS_XI_GAUSS_SPACE
  90. INTEGER(CMISSIntg) :: BASIS_XI_GAUSS_VELOCITY
  91. INTEGER(CMISSIntg) :: BASIS_XI_GAUSS_PRESSURE
  92. INTEGER(CMISSIntg) :: MESH_COMPONENT_NUMBER_SPACE
  93. INTEGER(CMISSIntg) :: MESH_COMPONENT_NUMBER_VELOCITY
  94. INTEGER(CMISSIntg) :: MESH_COMPONENT_NUMBER_PRESSURE
  95. INTEGER(CMISSIntg) :: MAXIMUM_ITERATIONS
  96. INTEGER(CMISSIntg) :: RESTART_VALUE
  97. ! INTEGER(CMISSIntg) :: MPI_IERROR
  98. INTEGER(CMISSIntg) :: NUMBER_OF_FIXED_WALL_NODES_NAVIER_STOKES
  99. INTEGER(CMISSIntg) :: NUMBER_OF_INLET_WALL_NODES_NAVIER_STOKES
  100. INTEGER(CMISSIntg) :: EQUATIONS_NAVIER_STOKES_OUTPUT
  101. INTEGER(CMISSIntg) :: COMPONENT_NUMBER
  102. INTEGER(CMISSIntg) :: NODE_NUMBER
  103. INTEGER(CMISSIntg) :: NODE_COUNTER
  104. INTEGER(CMISSIntg) :: CONDITION
  105. INTEGER(CMISSIntg) :: LINEAR_SOLVER_NAVIER_STOKES_OUTPUT_TYPE
  106. INTEGER(CMISSIntg) :: NONLINEAR_SOLVER_NAVIER_STOKES_OUTPUT_TYPE
  107. INTEGER, ALLOCATABLE, DIMENSION(:):: FIXED_WALL_NODES_NAVIER_STOKES
  108. INTEGER, ALLOCATABLE, DIMENSION(:):: INLET_WALL_NODES_NAVIER_STOKES
  109. REAL(CMISSDP) :: INITIAL_FIELD_NAVIER_STOKES(3)
  110. REAL(CMISSDP) :: BOUNDARY_CONDITIONS_NAVIER_STOKES(3)
  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) :: MU_PARAM_NAVIER_STOKES
  117. REAL(CMISSDP) :: RHO_PARAM_NAVIER_STOKES
  118. LOGICAL :: EXPORT_FIELD_IO
  119. LOGICAL :: LINEAR_SOLVER_NAVIER_STOKES_DIRECT_FLAG
  120. LOGICAL :: FIXED_WALL_NODES_NAVIER_STOKES_FLAG
  121. LOGICAL :: INLET_WALL_NODES_NAVIER_STOKES_FLAG
  122. !CMISS variables
  123. !Regions
  124. TYPE(CMISSRegionType) :: Region
  125. TYPE(CMISSRegionType) :: WorldRegion
  126. !Coordinate systems
  127. TYPE(CMISSCoordinateSystemType) :: CoordinateSystem
  128. TYPE(CMISSCoordinateSystemType) :: WorldCoordinateSystem
  129. !Nodes
  130. TYPE(CMISSNodesType) :: Nodes
  131. !Meshes
  132. TYPE(CMISSMeshType) :: Mesh
  133. !Decompositions
  134. TYPE(CMISSDecompositionType) :: Decomposition
  135. !Fields
  136. TYPE(CMISSFieldsType) :: Fields
  137. !Field types
  138. TYPE(CMISSFieldType) :: GeometricField
  139. TYPE(CMISSFieldType) :: EquationsSetField
  140. TYPE(CMISSFieldType) :: DependentFieldNavierStokes
  141. TYPE(CMISSFieldType) :: MaterialsFieldNavierStokes
  142. !Boundary conditions
  143. TYPE(CMISSBoundaryConditionsType) :: BoundaryConditionsNavierStokes
  144. !Equations sets
  145. TYPE(CMISSEquationsSetType) :: EquationsSetNavierStokes
  146. !Equations
  147. TYPE(CMISSEquationsType) :: EquationsNavierStokes
  148. !Problems
  149. TYPE(CMISSProblemType) :: Problem
  150. !Control loops
  151. TYPE(CMISSControlLoopType) :: ControlLoop
  152. !Solvers
  153. TYPE(CMISSSolverType) :: NonlinearSolverNavierStokes
  154. TYPE(CMISSSolverType) :: LinearSolverNavierStokes
  155. !Solver equations
  156. TYPE(CMISSSolverEquationsType) :: SolverEquationsNavierStokes
  157. !FieldML parsing variables
  158. TYPE(CMISSFieldMLIOType) :: fieldmlInfo, outputInfo
  159. INTEGER(CMISSIntg) :: meshComponentCount
  160. INTEGER(CMISSIntg) :: typeHandle
  161. INTEGER(CMISSIntg) :: coordinateCount
  162. #ifdef WIN32
  163. !Quickwin type
  164. LOGICAL :: QUICKWIN_STATUS=.FALSE.
  165. TYPE(WINDOWCONFIG) :: QUICKWIN_WINDOW_CONFIG
  166. #endif
  167. !Generic CMISS variables
  168. INTEGER(CMISSIntg) :: EquationsSetIndex
  169. INTEGER(CMISSIntg) :: err
  170. #ifdef WIN32
  171. !Initialise QuickWin
  172. QUICKWIN_WINDOW_CONFIG%TITLE="General Output" !Window title
  173. QUICKWIN_WINDOW_CONFIG%NUMTEXTROWS=-1 !Max possible number of rows
  174. QUICKWIN_WINDOW_CONFIG%MODE=QWIN$SCROLLDOWN
  175. !Set the window parameters
  176. QUICKWIN_STATUS=SETWINDOWCONFIG(QUICKWIN_WINDOW_CONFIG)
  177. !If attempt fails set with system estimated values
  178. IF(.NOT.QUICKWIN_STATUS) QUICKWIN_STATUS=SETWINDOWCONFIG(QUICKWIN_WINDOW_CONFIG)
  179. #endif
  180. !
  181. !================================================================================================================================
  182. !
  183. !PROBLEM CONTROL PANEL
  184. !Set initial values
  185. INITIAL_FIELD_NAVIER_STOKES(1)=0.0_CMISSDP
  186. INITIAL_FIELD_NAVIER_STOKES(2)=0.0_CMISSDP
  187. INITIAL_FIELD_NAVIER_STOKES(3)=0.0_CMISSDP
  188. !Set boundary conditions
  189. FIXED_WALL_NODES_NAVIER_STOKES_FLAG=.TRUE.
  190. INLET_WALL_NODES_NAVIER_STOKES_FLAG=.TRUE.
  191. IF(FIXED_WALL_NODES_NAVIER_STOKES_FLAG) THEN
  192. NUMBER_OF_FIXED_WALL_NODES_NAVIER_STOKES=80
  193. ALLOCATE(FIXED_WALL_NODES_NAVIER_STOKES(NUMBER_OF_FIXED_WALL_NODES_NAVIER_STOKES))
  194. FIXED_WALL_NODES_NAVIER_STOKES=[1,2,3,4,5,7,9,10,11,12,13,14,17,20,24,28,29,30,31,32,33,34,35,37,39, &
  195. & 41,44,46,47,48,50,51,52,53,54,57,60,64,65,66,67,68,70,72,74,76,77,78,79,80,83,86, &
  196. & 89,90,91,92,93,94,95,97,99,101,102,103,104,105,106,107,108,111,114,115,116,117,118, &
  197. & 120,122,123,124,125]
  198. ENDIF
  199. IF(INLET_WALL_NODES_NAVIER_STOKES_FLAG) THEN
  200. NUMBER_OF_INLET_WALL_NODES_NAVIER_STOKES=9
  201. ALLOCATE(INLET_WALL_NODES_NAVIER_STOKES(NUMBER_OF_INLET_WALL_NODES_NAVIER_STOKES))
  202. INLET_WALL_NODES_NAVIER_STOKES=[6,15,16,23,36,42,81,82,96]
  203. !Set initial boundary conditions
  204. BOUNDARY_CONDITIONS_NAVIER_STOKES(1)=0.0_CMISSDP
  205. BOUNDARY_CONDITIONS_NAVIER_STOKES(2)=1.0_CMISSDP
  206. BOUNDARY_CONDITIONS_NAVIER_STOKES(3)=0.0_CMISSDP
  207. ENDIF
  208. !Set material parameters
  209. MU_PARAM_NAVIER_STOKES=1.0_CMISSDP
  210. RHO_PARAM_NAVIER_STOKES=1.0_CMISSDP
  211. !Set interpolation parameters
  212. BASIS_XI_GAUSS_SPACE=3
  213. BASIS_XI_GAUSS_VELOCITY=3
  214. BASIS_XI_GAUSS_PRESSURE=3
  215. !Set output parameter
  216. !(NoOutput/ProgressOutput/TimingOutput/SolverOutput/SolverMatrixOutput)
  217. LINEAR_SOLVER_NAVIER_STOKES_OUTPUT_TYPE=CMISS_SOLVER_NO_OUTPUT
  218. NONLINEAR_SOLVER_NAVIER_STOKES_OUTPUT_TYPE=CMISS_SOLVER_NO_OUTPUT
  219. !(NoOutput/TimingOutput/MatrixOutput/ElementOutput)
  220. EQUATIONS_NAVIER_STOKES_OUTPUT=CMISS_EQUATIONS_NO_OUTPUT
  221. !Set solver parameters
  222. LINEAR_SOLVER_NAVIER_STOKES_DIRECT_FLAG=.FALSE.
  223. RELATIVE_TOLERANCE=1.0E-10_CMISSDP !default: 1.0E-05_CMISSDP
  224. ABSOLUTE_TOLERANCE=1.0E-10_CMISSDP !default: 1.0E-10_CMISSDP
  225. DIVERGENCE_TOLERANCE=1.0E20 !default: 1.0E5
  226. MAXIMUM_ITERATIONS=100000 !default: 100000
  227. RESTART_VALUE=3000 !default: 30
  228. LINESEARCH_ALPHA=1.0
  229. !
  230. !================================================================================================================================
  231. !
  232. !INITIALISE OPENCMISS
  233. CALL CMISSInitialise(WorldCoordinateSystem,WorldRegion, err )
  234. CALL CMISSErrorHandlingModeSet(CMISS_ERRORS_TRAP_ERROR,Err)
  235. !
  236. !================================================================================================================================
  237. !
  238. CALL CMISSFieldMLIO_Initialise( fieldmlInfo, err )
  239. CALL CMISSFieldML_InputCreateFromFile( inputFilename, fieldmlInfo, err )
  240. !COORDINATE SYSTEM
  241. !Start the creation of a new RC coordinate system
  242. CALL CMISSCoordinateSystem_Initialise( CoordinateSystem, err )
  243. CALL CMISSFieldML_InputCoordinateSystemCreateStart( fieldmlInfo, "test_mesh.coordinates", CoordinateSystem, &
  244. & CoordinateSystemUserNumber, err )
  245. CALL CMISSCoordinateSystem_CreateFinish( CoordinateSystem, err )
  246. CALL CMISSCoordinateSystem_DimensionGet( CoordinateSystem, coordinateCount, err )
  247. !
  248. !================================================================================================================================
  249. !
  250. !REGION
  251. !Start the creation of a new region
  252. CALL CMISSRegion_Initialise( Region, err )
  253. CALL CMISSRegion_CreateStart( RegionUserNumber, WorldRegion, Region, err )
  254. !Set the regions coordinate system as defined above
  255. CALL CMISSRegion_CoordinateSystemSet( Region, CoordinateSystem, err )
  256. !Finish the creation of the region
  257. CALL CMISSRegion_CreateFinish( Region, err )
  258. !
  259. !================================================================================================================================
  260. !
  261. !NODES
  262. CALL CMISSFieldML_InputNodesCreateStart( fieldmlInfo, "test_mesh.nodes.argument", Region, nodes, err )
  263. CALL CMISSNodes_CreateFinish( Nodes, err )
  264. !
  265. !================================================================================================================================
  266. !
  267. !BASES
  268. CALL CMISSFieldML_InputBasisCreateStart( fieldmlInfo, "test_mesh.trilinear_lagrange", basisNumberTrilinear, err )
  269. CALL CMISSBasis_QuadratureNumberOfGaussXiSet( basisNumberTrilinear, gaussQuadrature, err )
  270. CALL CMISSBasis_CreateFinish( basisNumberTrilinear, err )
  271. CALL CMISSFieldML_InputBasisCreateStart( fieldmlInfo, "test_mesh.triquadratic_lagrange", basisNumberTriquadratic, err )
  272. CALL CMISSBasis_QuadratureNumberOfGaussXiSet( basisNumberTriquadratic, gaussQuadrature, err )
  273. CALL CMISSBasis_CreateFinish( basisNumberTriquadratic, err )
  274. !
  275. !================================================================================================================================
  276. !
  277. !MESH
  278. meshComponentCount = 2
  279. CALL CMISSFieldML_InputMeshCreateStart( fieldmlInfo, "test_mesh.mesh.argument", Mesh, MeshUserNumber, Region, err )
  280. CALL CMISSMesh_NumberOfComponentsSet( Mesh, meshComponentCount, err )
  281. CALL CMISSFieldML_InputCreateMeshComponent( fieldmlInfo, RegionUserNumber, MeshUserNumber, 1, &
  282. & "test_mesh.template.triquadratic", err )
  283. CALL CMISSFieldML_InputCreateMeshComponent( fieldmlInfo, RegionUserNumber, MeshUserNumber, 2, &
  284. & "test_mesh.template.trilinear", err )
  285. MESH_COMPONENT_NUMBER_SPACE = 1
  286. MESH_COMPONENT_NUMBER_VELOCITY = 1
  287. MESH_COMPONENT_NUMBER_PRESSURE = 2
  288. !Finish the creation of the mesh
  289. CALL CMISSMesh_CreateFinish(Mesh, err )
  290. !
  291. !================================================================================================================================
  292. !
  293. !GEOMETRIC FIELD
  294. !Create a decomposition
  295. CALL CMISSDecomposition_Initialise(Decomposition, err )
  296. CALL CMISSDecomposition_CreateStart(DecompositionUserNumber,Mesh,Decomposition, err )
  297. !Set the decomposition to be a general decomposition with the specified number of domains
  298. CALL CMISSDecomposition_TypeSet(Decomposition,CMISS_DECOMPOSITION_CALCULATED_TYPE, err )
  299. CALL CMISSDecomposition_NumberOfDomainsSet(Decomposition,DomainUserNumber, err )
  300. !Finish the decomposition
  301. CALL CMISSDecomposition_CreateFinish(Decomposition, err )
  302. CALL CMISSFieldML_InputFieldCreateStart( fieldmlInfo, Region, Decomposition, GeometricFieldUserNumber, GeometricField, &
  303. & CMISS_FIELD_U_VARIABLE_TYPE, "test_mesh.coordinates", err )
  304. CALL CMISSField_CreateFinish( RegionUserNumber, GeometricFieldUserNumber, err )
  305. CALL CMISSFieldML_InputFieldParametersUpdate( fieldmlInfo, GeometricField, "test_mesh.node.coordinates", &
  306. & CMISS_FIELD_U_VARIABLE_TYPE, CMISS_FIELD_VALUES_SET_TYPE, err )
  307. CALL CMISSField_ParameterSetUpdateStart( GeometricField, CMISS_FIELD_U_VARIABLE_TYPE, CMISS_FIELD_VALUES_SET_TYPE, err )
  308. CALL CMISSField_ParameterSetUpdateFinish( GeometricField, CMISS_FIELD_U_VARIABLE_TYPE, CMISS_FIELD_VALUES_SET_TYPE, err )
  309. !
  310. !================================================================================================================================
  311. !
  312. CALL CMISSFieldMLIO_Finalise( fieldmlInfo, err )
  313. !
  314. !================================================================================================================================
  315. !
  316. !EQUATIONS SETS
  317. !Create the equations set for static Navier-Stokes
  318. CALL CMISSEquationsSet_Initialise(EquationsSetNavierStokes, err )
  319. CALL CMISSField_Initialise(EquationsSetField,Err)
  320. CALL CMISSEquationsSet_CreateStart(EquationsSetUserNumberNavierStokes,Region,GeometricField, &
  321. & CMISS_EQUATIONS_SET_FLUID_MECHANICS_CLASS,CMISS_EQUATIONS_SET_NAVIER_STOKES_EQUATION_TYPE, &
  322. & CMISS_EQUATIONS_SET_STATIC_NAVIER_STOKES_SUBTYPE, &
  323. & EquationsSetFieldUserNumber,EquationsSetField,EquationsSetNavierStokes,err)
  324. !Set the equations set to be a static Navier-Stokes problem
  325. !Finish creating the equations set
  326. CALL CMISSEquationsSet_CreateFinish(EquationsSetNavierStokes, err )
  327. !
  328. !================================================================================================================================
  329. !
  330. !DEPENDENT FIELDS
  331. !Create the equations set dependent field variables for static Navier-Stokes
  332. CALL CMISSField_Initialise(DependentFieldNavierStokes, err )
  333. CALL CMISSEquationsSet_DependentCreateStart(EquationsSetNavierStokes,DependentFieldUserNumberNavierStokes, &
  334. & DependentFieldNavierStokes, err )
  335. !Set the mesh component to be used by the field components.
  336. DO COMPONENT_NUMBER=1,coordinateCount
  337. CALL CMISSField_ComponentMeshComponentSet(DependentFieldNavierStokes,CMISS_FIELD_U_VARIABLE_TYPE,COMPONENT_NUMBER, &
  338. & MESH_COMPONENT_NUMBER_VELOCITY, err )
  339. CALL CMISSField_ComponentMeshComponentSet(DependentFieldNavierStokes,CMISS_FIELD_DELUDELN_VARIABLE_TYPE,COMPONENT_NUMBER, &
  340. & MESH_COMPONENT_NUMBER_VELOCITY, err )
  341. ENDDO
  342. COMPONENT_NUMBER=coordinateCount+1
  343. CALL CMISSField_ComponentMeshComponentSet(DependentFieldNavierStokes,CMISS_FIELD_U_VARIABLE_TYPE,COMPONENT_NUMBER, &
  344. & MESH_COMPONENT_NUMBER_PRESSURE, err )
  345. CALL CMISSField_ComponentMeshComponentSet(DependentFieldNavierStokes,CMISS_FIELD_DELUDELN_VARIABLE_TYPE,COMPONENT_NUMBER, &
  346. & MESH_COMPONENT_NUMBER_PRESSURE, err )
  347. !Finish the equations set dependent field variables
  348. CALL CMISSEquationsSet_DependentCreateFinish(EquationsSetNavierStokes, err )
  349. !Initialise dependent field
  350. DO COMPONENT_NUMBER=1,coordinateCount
  351. CALL CMISSField_ComponentValuesInitialise(DependentFieldNavierStokes,CMISS_FIELD_U_VARIABLE_TYPE,CMISS_FIELD_VALUES_SET_TYPE, &
  352. & COMPONENT_NUMBER,INITIAL_FIELD_NAVIER_STOKES(COMPONENT_NUMBER), err )
  353. ENDDO
  354. !
  355. !================================================================================================================================
  356. !
  357. !MATERIALS FIELDS
  358. !Create the equations set materials field variables for static Navier-Stokes
  359. CALL CMISSField_Initialise(MaterialsFieldNavierStokes, err )
  360. CALL CMISSEquationsSet_MaterialsCreateStart(EquationsSetNavierStokes,MaterialsFieldUserNumberNavierStokes, &
  361. & MaterialsFieldNavierStokes, err )
  362. !Finish the equations set materials field variables
  363. CALL CMISSEquationsSet_MaterialsCreateFinish(EquationsSetNavierStokes, err )
  364. CALL CMISSField_ComponentValuesInitialise(MaterialsFieldNavierStokes,CMISS_FIELD_U_VARIABLE_TYPE,CMISS_FIELD_VALUES_SET_TYPE, &
  365. & MaterialsFieldUserNumberNavierStokesMu,MU_PARAM_NAVIER_STOKES, err )
  366. CALL CMISSField_ComponentValuesInitialise(MaterialsFieldNavierStokes,CMISS_FIELD_U_VARIABLE_TYPE,CMISS_FIELD_VALUES_SET_TYPE, &
  367. & MaterialsFieldUserNumberNavierStokesRho,RHO_PARAM_NAVIER_STOKES, err )
  368. !
  369. !================================================================================================================================
  370. !
  371. !EQUATIONS
  372. !Create the equations set equations
  373. CALL CMISSEquations_Initialise(EquationsNavierStokes, err )
  374. CALL CMISSEquationsSet_EquationsCreateStart(EquationsSetNavierStokes,EquationsNavierStokes, err )
  375. !Set the equations matrices sparsity type
  376. CALL CMISSEquations_SparsityTypeSet(EquationsNavierStokes,CMISS_EQUATIONS_SPARSE_MATRICES, err )
  377. !Set the equations set output
  378. CALL CMISSEquations_OutputTypeSet(EquationsNavierStokes,EQUATIONS_NAVIER_STOKES_OUTPUT, err )
  379. !Finish the equations set equations
  380. CALL CMISSEquationsSet_EquationsCreateFinish(EquationsSetNavierStokes, err )
  381. !
  382. !================================================================================================================================
  383. !
  384. !PROBLEMS
  385. !Start the creation of a problem.
  386. CALL CMISSProblem_Initialise(Problem, err )
  387. CALL CMISSControlLoop_Initialise(ControlLoop, err )
  388. CALL CMISSProblem_CreateStart(ProblemUserNumber,Problem, err )
  389. !Set the problem to be a static Navier-Stokes problem
  390. CALL CMISSProblem_SpecificationSet(Problem,CMISS_PROBLEM_FLUID_MECHANICS_CLASS,CMISS_PROBLEM_NAVIER_STOKES_EQUATION_TYPE, &
  391. & CMISS_PROBLEM_STATIC_NAVIER_STOKES_SUBTYPE, err )
  392. !Finish the creation of a problem.
  393. CALL CMISSProblem_CreateFinish(Problem, err )
  394. !Start the creation of the problem control loop
  395. CALL CMISSProblem_ControlLoopCreateStart(Problem, err )
  396. !Finish creating the problem control loop
  397. CALL CMISSProblem_ControlLoopCreateFinish(Problem, err )
  398. !
  399. !================================================================================================================================
  400. !
  401. !SOLVERS
  402. !Start the creation of the problem solvers
  403. CALL CMISSSolver_Initialise(NonlinearSolverNavierStokes, err )
  404. CALL CMISSSolver_Initialise(LinearSolverNavierStokes, err )
  405. CALL CMISSProblem_SolversCreateStart(Problem, err )
  406. !Get the nonlinear static solver
  407. CALL CMISSProblem_SolverGet(Problem,CMISS_CONTROL_LOOP_NODE,SolverNavierStokesUserNumber,NonlinearSolverNavierStokes, err )
  408. !Set the nonlinear Jacobian type
  409. CALL CMISSSolver_NewtonJacobianCalculationTypeSet(NonlinearSolverNavierStokes,CMISS_SOLVER_NEWTON_JACOBIAN_EQUATIONS_CALCULATED, &
  410. & err )
  411. !Set the output type
  412. CALL CMISSSolver_OutputTypeSet(NonlinearSolverNavierStokes,NONLINEAR_SOLVER_NAVIER_STOKES_OUTPUT_TYPE, err )
  413. !Set the solver settings
  414. CALL CMISSSolver_NewtonAbsoluteToleranceSet(NonlinearSolverNavierStokes,ABSOLUTE_TOLERANCE, err )
  415. CALL CMISSSolver_NewtonRelativeToleranceSet(NonlinearSolverNavierStokes,RELATIVE_TOLERANCE, err )
  416. !Get the nonlinear linear solver
  417. CALL CMISSSolver_NewtonLinearSolverGet(NonlinearSolverNavierStokes,LinearSolverNavierStokes, err )
  418. !Set the output type
  419. CALL CMISSSolver_OutputTypeSet(LinearSolverNavierStokes,LINEAR_SOLVER_NAVIER_STOKES_OUTPUT_TYPE, err )
  420. !Set the solver settings
  421. IF(LINEAR_SOLVER_NAVIER_STOKES_DIRECT_FLAG) THEN
  422. CALL CMISSSolver_LinearTypeSet(LinearSolverNavierStokes,CMISS_SOLVER_LINEAR_DIRECT_SOLVE_TYPE, err )
  423. CALL CMISSSolver_LibraryTypeSet(LinearSolverNavierStokes,CMISS_SOLVER_MUMPS_LIBRARY, err )
  424. ELSE
  425. CALL CMISSSolver_LinearTypeSet(LinearSolverNavierStokes,CMISS_SOLVER_LINEAR_ITERATIVE_SOLVE_TYPE, err )
  426. CALL CMISSSolver_LinearIterativeMaximumIterationsSet(LinearSolverNavierStokes,MAXIMUM_ITERATIONS, err )
  427. CALL CMISSSolver_LinearIterativeDivergenceToleranceSet(LinearSolverNavierStokes,DIVERGENCE_TOLERANCE, err )
  428. CALL CMISSSolver_LinearIterativeRelativeToleranceSet(LinearSolverNavierStokes,RELATIVE_TOLERANCE, err )
  429. CALL CMISSSolver_LinearIterativeAbsoluteToleranceSet(LinearSolverNavierStokes,ABSOLUTE_TOLERANCE, err )
  430. CALL CMISSSolver_LinearIterativeGMRESRestartSet(LinearSolverNavierStokes,RESTART_VALUE, err )
  431. ENDIF
  432. !Finish the creation of the problem solver
  433. CALL CMISSProblem_SolversCreateFinish(Problem, err )
  434. !
  435. !================================================================================================================================
  436. !
  437. !SOLVER EQUATIONS
  438. !Start the creation of the problem solver equations
  439. CALL CMISSSolver_Initialise(LinearSolverNavierStokes, err )
  440. CALL CMISSSolverEquations_Initialise(SolverEquationsNavierStokes, err )
  441. CALL CMISSProblem_SolverEquationsCreateStart(Problem, err )
  442. !Get the linear solver equations
  443. CALL CMISSProblem_SolverGet(Problem,CMISS_CONTROL_LOOP_NODE,SolverNavierStokesUserNumber,LinearSolverNavierStokes, err )
  444. CALL CMISSSolver_SolverEquationsGet(LinearSolverNavierStokes,SolverEquationsNavierStokes, err )
  445. !Set the solver equations sparsity
  446. CALL CMISSSolverEquations_SparsityTypeSet(SolverEquationsNavierStokes,CMISS_SOLVER_SPARSE_MATRICES, err )
  447. !Add in the equations set
  448. CALL CMISSSolverEquations_EquationsSetAdd(SolverEquationsNavierStokes,EquationsSetNavierStokes,EquationsSetIndex, err )
  449. !Finish the creation of the problem solver equations
  450. CALL CMISSProblem_SolverEquationsCreateFinish(Problem, err )
  451. !
  452. !================================================================================================================================
  453. !
  454. !BOUNDARY CONDITIONS
  455. !Start the creation of the equations set boundary conditions for Navier-Stokes
  456. CALL CMISSBoundaryConditions_Initialise(BoundaryConditionsNavierStokes, err )
  457. CALL CMISSSolverEquations_BoundaryConditionsCreateStart(SolverEquationsNavierStokes,BoundaryConditionsNavierStokes, err )
  458. !Set fixed wall nodes
  459. IF(FIXED_WALL_NODES_NAVIER_STOKES_FLAG) THEN
  460. DO NODE_COUNTER=1,NUMBER_OF_FIXED_WALL_NODES_NAVIER_STOKES
  461. NODE_NUMBER=FIXED_WALL_NODES_NAVIER_STOKES(NODE_COUNTER)
  462. CONDITION=CMISS_BOUNDARY_CONDITION_FIXED_WALL
  463. DO COMPONENT_NUMBER=1,coordinateCount
  464. VALUE=0.0_CMISSDP
  465. CALL CMISSBoundaryConditions_SetNode(BoundaryConditionsNavierStokes,DependentFieldNavierStokes, &
  466. & CMISS_FIELD_U_VARIABLE_TYPE, &
  467. & 1, &
  468. & CMISS_NO_GLOBAL_DERIV, &
  469. & NODE_NUMBER,COMPONENT_NUMBER,CONDITION,VALUE, err )
  470. ENDDO
  471. ENDDO
  472. ENDIF
  473. !Set velocity boundary conditions
  474. IF(INLET_WALL_NODES_NAVIER_STOKES_FLAG) THEN
  475. DO NODE_COUNTER=1,NUMBER_OF_INLET_WALL_NODES_NAVIER_STOKES
  476. NODE_NUMBER=INLET_WALL_NODES_NAVIER_STOKES(NODE_COUNTER)
  477. CONDITION=CMISS_BOUNDARY_CONDITION_FIXED_INLET
  478. DO COMPONENT_NUMBER=1,coordinateCount
  479. VALUE=BOUNDARY_CONDITIONS_NAVIER_STOKES(COMPONENT_NUMBER)
  480. CALL CMISSBoundaryConditions_SetNode(BoundaryConditionsNavierStokes,DependentFieldNavierStokes, &
  481. & CMISS_FIELD_U_VARIABLE_TYPE, &
  482. & 1, &
  483. & CMISS_NO_GLOBAL_DERIV, &
  484. & NODE_NUMBER,COMPONENT_NUMBER,CONDITION,VALUE, err )
  485. ENDDO
  486. ENDDO
  487. ENDIF
  488. !Finish the creation of the equations set boundary conditions
  489. CALL CMISSSolverEquations_BoundaryConditionsCreateFinish(SolverEquationsNavierStokes, err )
  490. !
  491. !================================================================================================================================
  492. !
  493. !RUN SOLVERS
  494. !Turn of PETSc error handling
  495. !CALL PETSC_ERRORHANDLING_SET_ON(ERR,ERROR,*999)
  496. !Solve the problem
  497. WRITE(*,'(A)') "Solving problem..."
  498. CALL CMISSProblem_Solve(Problem, err )
  499. WRITE(*,'(A)') "Problem solved!"
  500. !
  501. !================================================================================================================================
  502. !
  503. !OUTPUT
  504. CALL CMISSFieldMLIO_Initialise( outputInfo, err )
  505. CALL CMISSFieldML_OutputCreate( Mesh, outputDirectory, basename, dataFormat, outputInfo, err )
  506. CALL CMISSFieldML_OutputAddImport( outputInfo, "coordinates.rc.3d", typeHandle, err )
  507. CALL CMISSFieldML_OutputAddField( outputInfo, baseName//".geometric", dataFormat, GeometricField, &
  508. & CMISS_FIELD_U_VARIABLE_TYPE, CMISS_FIELD_VALUES_SET_TYPE, err )
  509. CALL CMISSFieldML_OutputAddFieldComponents( outputInfo, typeHandle, baseName//".velocity", dataFormat, &
  510. & DependentFieldNavierStokes, [1,2,3], CMISS_FIELD_U_VARIABLE_TYPE, CMISS_FIELD_VALUES_SET_TYPE, err )
  511. CALL CMISSFieldML_OutputAddImport( outputInfo, "real.1d", typeHandle, err )
  512. CALL CMISSFieldML_OutputAddFieldComponents( outputInfo, typeHandle, baseName//".pressure", dataFormat, &
  513. & DependentFieldNavierStokes, [4], CMISS_FIELD_U_VARIABLE_TYPE, CMISS_FIELD_VALUES_SET_TYPE, err )
  514. CALL CMISSFieldML_OutputWrite( outputInfo, outputFilename, err )
  515. CALL CMISSFieldMLIO_Finalise( outputInfo, err )
  516. EXPORT_FIELD_IO=.TRUE.
  517. IF(EXPORT_FIELD_IO) THEN
  518. WRITE(*,'(A)') "Exporting fields..."
  519. CALL CMISSFields_Initialise(Fields, err )
  520. CALL CMISSFields_Create(Region,Fields, err )
  521. CALL CMISSFields_NodesExport(Fields,"StaticNavierStokes","FORTRAN", err )
  522. CALL CMISSFields_ElementsExport(Fields,"StaticNavierStokes","FORTRAN", err )
  523. CALL CMISSFields_Finalise(Fields, err )
  524. WRITE(*,'(A)') "Field exported!"
  525. ENDIF
  526. !Finialise CMISS
  527. CALL CMISSFinalise(Err)
  528. WRITE(*,'(A)') "Program successfully completed."
  529. STOP
  530. END PROGRAM NAVIERSTOKESSTATICEXAMPLE