/ClassicalField/AdvectionDiffusion/AdvectionDiffusionIO/src/AdvectionDiffusionIOExample.f90

http://github.com/xyan075/examples · Fortran Modern · 710 lines · 362 code · 102 blank · 246 comment · 0 complexity · 33dc66122b9250cc8b8e49e949acb94e MD5 · raw file

  1. !> \file
  2. !> \author Chris Bradley
  3. !> \brief This is an example program to solve an advection-diffusion 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 ClassicalField/AdvectionDiffusion/AdvectionDiffusionIO/src/AdvectionDiffusionIOExample.f90
  42. !! Example program to solve a diffusion equation using openCMISS calls.
  43. !!
  44. !! \htmlinclude ClassicalField/AdvectionDiffusion/AdvectionDiffusionIO/history.html
  45. !<
  46. !> Main program
  47. PROGRAM ADVECTIONDIFFUSIONIOEXAMPLE
  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 :: BasisUserNumber=3
  69. INTEGER(CMISSIntg), PARAMETER :: GeneratedMeshUserNumber=4
  70. INTEGER(CMISSIntg), PARAMETER :: MeshUserNumber=5
  71. INTEGER(CMISSIntg), PARAMETER :: DecompositionUserNumber=6
  72. INTEGER(CMISSIntg), PARAMETER :: GeometricFieldUserNumber=7
  73. INTEGER(CMISSIntg), PARAMETER :: DependentFieldUserNumberAdvecDiff=8
  74. INTEGER(CMISSIntg), PARAMETER :: MaterialsFieldUserNumberAdvecDiff=9
  75. INTEGER(CMISSIntg), PARAMETER :: EquationsSetUserNumberAdvecDiff=10
  76. INTEGER(CMISSIntg), PARAMETER :: ProblemUserNumber=11
  77. INTEGER(CMISSIntg), PARAMETER :: ControlLoopNode=0
  78. INTEGER(CMISSIntg), PARAMETER :: IndependentFieldUserNumberAdvecDiff=12
  79. !INTEGER(CMISSIntg), PARAMETER :: AnalyticFieldUserNumber=13
  80. INTEGER(CMISSIntg), PARAMETER :: SourceFieldUserNumberAdvecDiff=14
  81. INTEGER(CMISSIntg), PARAMETER :: DomainUserNumber=1
  82. !Program types
  83. TYPE(EXPORT_CONTAINER):: CM
  84. !Program variables
  85. INTEGER(CMISSIntg) :: NUMBER_OF_DIMENSIONS
  86. INTEGER(CMISSIntg) :: BASIS_TYPE
  87. INTEGER(CMISSIntg) :: BASIS_NUMBER_SPACE
  88. INTEGER(CMISSIntg) :: BASIS_NUMBER_CONCENTRATION
  89. INTEGER(CMISSIntg) :: BASIS_XI_GAUSS_SPACE
  90. INTEGER(CMISSIntg) :: BASIS_XI_GAUSS_CONCENTRATION
  91. INTEGER(CMISSIntg) :: BASIS_XI_INTERPOLATION_SPACE
  92. INTEGER(CMISSIntg) :: BASIS_XI_INTERPOLATION_CONCENTRATION
  93. INTEGER(CMISSIntg) :: MESH_NUMBER_OF_COMPONENTS
  94. INTEGER(CMISSIntg) :: MESH_COMPONENT_NUMBER_SPACE
  95. INTEGER(CMISSIntg) :: MESH_COMPONENT_NUMBER_CONCENTRATION
  96. INTEGER(CMISSIntg) :: NUMBER_OF_NODES_SPACE
  97. INTEGER(CMISSIntg) :: NUMBER_OF_NODES_CONCENTRATION
  98. INTEGER(CMISSIntg) :: NUMBER_OF_ELEMENT_NODES_SPACE
  99. INTEGER(CMISSIntg) :: NUMBER_OF_ELEMENT_NODES_CONCENTRATION
  100. INTEGER(CMISSIntg) :: TOTAL_NUMBER_OF_NODES
  101. INTEGER(CMISSIntg) :: TOTAL_NUMBER_OF_ELEMENTS
  102. INTEGER(CMISSIntg) :: MAXIMUM_ITERATIONS
  103. INTEGER(CMISSIntg) :: RESTART_VALUE
  104. ! INTEGER(CMISSIntg) :: MPI_IERROR
  105. INTEGER(CMISSIntg) :: NUMBER_OF_FIXED_WALL_NODES_ADVECTION_DIFFUSION
  106. INTEGER(CMISSIntg) :: NUMBER_OF_INLET_WALL_NODES_ADVECTION_DIFFUSION
  107. INTEGER(CMISSIntg) :: EQUATIONS_ADVECTION_DIFFUSION_OUTPUT
  108. INTEGER(CMISSIntg) :: COMPONENT_NUMBER
  109. INTEGER(CMISSIntg) :: NODE_NUMBER
  110. INTEGER(CMISSIntg) :: ELEMENT_NUMBER
  111. INTEGER(CMISSIntg) :: NODE_COUNTER
  112. INTEGER(CMISSIntg) :: CONDITION
  113. INTEGER(CMISSIntg) :: LINEAR_SOLVER_ADVECTION_DIFFUSION_OUTPUT_TYPE
  114. INTEGER, ALLOCATABLE, DIMENSION(:):: FIXED_WALL_NODES_ADVECTION_DIFFUSION
  115. INTEGER, ALLOCATABLE, DIMENSION(:):: INLET_WALL_NODES_ADVECTION_DIFFUSION
  116. REAL(CMISSDP) :: INITIAL_FIELD_ADVECTION_DIFFUSION(3)
  117. REAL(CMISSDP) :: BOUNDARY_CONDITIONS_ADVECTION_DIFFUSION(3)
  118. REAL(CMISSDP) :: DIVERGENCE_TOLERANCE
  119. REAL(CMISSDP) :: RELATIVE_TOLERANCE
  120. REAL(CMISSDP) :: ABSOLUTE_TOLERANCE
  121. REAL(CMISSDP) :: LINESEARCH_ALPHA
  122. REAL(CMISSDP) :: VALUE
  123. REAL(CMISSDP) :: DIFF_COEFF_PARAM_ADVECTION_DIFFUSION(3)
  124. LOGICAL :: EXPORT_FIELD_IO
  125. LOGICAL :: LINEAR_SOLVER_ADVECTION_DIFFUSION_DIRECT_FLAG
  126. LOGICAL :: FIXED_WALL_NODES_ADVECTION_DIFFUSION_FLAG
  127. LOGICAL :: INLET_WALL_NODES_ADVECTION_DIFFUSION_FLAG
  128. !CMISS variables
  129. !Regions
  130. TYPE(CMISSRegionType) :: Region
  131. TYPE(CMISSRegionType) :: WorldRegion
  132. !Coordinate systems
  133. TYPE(CMISSCoordinateSystemType) :: CoordinateSystem
  134. TYPE(CMISSCoordinateSystemType) :: WorldCoordinateSystem
  135. !Basis
  136. TYPE(CMISSBasisType) :: BasisSpace
  137. TYPE(CMISSBasisType) :: BasisConcentration
  138. !Nodes
  139. TYPE(CMISSNodesType) :: Nodes
  140. !Elements
  141. TYPE(CMISSMeshElementsType) :: MeshElementsSpace
  142. TYPE(CMISSMeshElementsType) :: MeshElementsConcentration
  143. !Meshes
  144. TYPE(CMISSMeshType) :: Mesh
  145. !Decompositions
  146. TYPE(CMISSDecompositionType) :: Decomposition
  147. !Fields
  148. TYPE(CMISSFieldsType) :: Fields
  149. !Field types
  150. TYPE(CMISSFieldType) :: GeometricField
  151. TYPE(CMISSFieldType) :: DependentFieldAdvecDiff
  152. TYPE(CMISSFieldType) :: MaterialsFieldAdvecDiff
  153. TYPE(CMISSFieldType) :: IndependentFieldAdvecDiff
  154. TYPE(CMISSFieldType) :: SourceFieldAdvecDiff
  155. !Boundary conditions
  156. TYPE(CMISSBoundaryConditionsType) :: BoundaryConditionsAdvecDiff
  157. !Equations sets
  158. TYPE(CMISSEquationsSetType) :: EquationsSetAdvecDiff
  159. !Equations
  160. TYPE(CMISSEquationsType) :: EquationsAdvecDiff
  161. !Problems
  162. TYPE(CMISSProblemType) :: Problem
  163. !Control loops
  164. TYPE(CMISSControlLoopType) :: ControlLoop
  165. !Solvers
  166. TYPE(CMISSSolverType) :: SolverAdvecDiff, LinearSolverAdvecDiff
  167. !Solver equations
  168. TYPE(CMISSSolverEquationsType) :: SolverEquationsAdvecDiff
  169. #ifdef WIN32
  170. !Quickwin type
  171. LOGICAL :: QUICKWIN_STATUS=.FALSE.
  172. TYPE(WINDOWCONFIG) :: QUICKWIN_WINDOW_CONFIG
  173. #endif
  174. !Generic CMISS variables
  175. INTEGER(CMISSIntg) :: EquationsSetIndex
  176. INTEGER(CMISSIntg) :: Err
  177. #ifdef WIN32
  178. !Initialise QuickWin
  179. QUICKWIN_WINDOW_CONFIG%TITLE="General Output" !Window title
  180. QUICKWIN_WINDOW_CONFIG%NUMTEXTROWS=-1 !Max possible number of rows
  181. QUICKWIN_WINDOW_CONFIG%MODE=QWIN$SCROLLDOWN
  182. !Set the window parameters
  183. QUICKWIN_STATUS=SETWINDOWCONFIG(QUICKWIN_WINDOW_CONFIG)
  184. !If attempt fails set with system estimated values
  185. IF(.NOT.QUICKWIN_STATUS) QUICKWIN_STATUS=SETWINDOWCONFIG(QUICKWIN_WINDOW_CONFIG)
  186. #endif
  187. !
  188. !================================================================================================================================
  189. !
  190. !INITIALISE OPENCMISS
  191. CALL CMISSInitialise(WorldCoordinateSystem,WorldRegion,Err)
  192. CALL CMISSErrorHandlingModeSet(CMISS_ERRORS_TRAP_ERROR,Err)
  193. !
  194. !================================================================================================================================
  195. !
  196. !PROBLEM CONTROL PANEL
  197. !Import cmHeart mesh information
  198. CALL FLUID_MECHANICS_IO_READ_CMHEART(CM,Err)
  199. BASIS_NUMBER_SPACE=CM%ID_M
  200. BASIS_NUMBER_CONCENTRATION=CM%ID_V
  201. NUMBER_OF_DIMENSIONS=CM%D
  202. BASIS_TYPE=CM%IT_T
  203. BASIS_XI_INTERPOLATION_SPACE=CM%IT_M
  204. BASIS_XI_INTERPOLATION_CONCENTRATION=CM%IT_V
  205. NUMBER_OF_NODES_SPACE=CM%N_M
  206. NUMBER_OF_NODES_CONCENTRATION=CM%N_V
  207. TOTAL_NUMBER_OF_NODES=CM%N_T
  208. TOTAL_NUMBER_OF_ELEMENTS=CM%E_T
  209. NUMBER_OF_ELEMENT_NODES_SPACE=CM%EN_M
  210. NUMBER_OF_ELEMENT_NODES_CONCENTRATION=CM%EN_V
  211. !Set initial values
  212. INITIAL_FIELD_ADVECTION_DIFFUSION(1)=0.0_CMISSDP
  213. INITIAL_FIELD_ADVECTION_DIFFUSION(2)=0.0_CMISSDP
  214. INITIAL_FIELD_ADVECTION_DIFFUSION(3)=0.0_CMISSDP
  215. !Set boundary conditions - what condition should be applied?
  216. !Set boundary conditions
  217. FIXED_WALL_NODES_ADVECTION_DIFFUSION_FLAG=.FALSE.
  218. INLET_WALL_NODES_ADVECTION_DIFFUSION_FLAG=.TRUE.
  219. IF(FIXED_WALL_NODES_ADVECTION_DIFFUSION_FLAG) THEN
  220. NUMBER_OF_FIXED_WALL_NODES_ADVECTION_DIFFUSION=1
  221. ALLOCATE(FIXED_WALL_NODES_ADVECTION_DIFFUSION(NUMBER_OF_FIXED_WALL_NODES_ADVECTION_DIFFUSION))
  222. FIXED_WALL_NODES_ADVECTION_DIFFUSION=(/42/)
  223. ENDIF
  224. IF(INLET_WALL_NODES_ADVECTION_DIFFUSION_FLAG) THEN
  225. NUMBER_OF_INLET_WALL_NODES_ADVECTION_DIFFUSION=105
  226. ALLOCATE(INLET_WALL_NODES_ADVECTION_DIFFUSION(NUMBER_OF_INLET_WALL_NODES_ADVECTION_DIFFUSION))
  227. INLET_WALL_NODES_ADVECTION_DIFFUSION=(/4,11,12,13,29,33,34,35,47,51,52,53,69,71,83,87,88,89,100,102,103,104,112,114,115, &
  228. & 116,126,128,137,141,142,143,154,156,157,158,166,168,169,170,180,182,191,195,196,197,208,210,211, &
  229. & 212,220,222,223,224,234,236,245,249,250,251,262,264,265,266,274,276,277,278,288,290,299,303,304, &
  230. & 305,316,318,319,320,328,330,331,332,342,344,353,357,358,359,370,372,373,374,382,384,385,386,396, &
  231. & 398,411,412,426,427,438,439,450/)
  232. !Set initial boundary conditions
  233. BOUNDARY_CONDITIONS_ADVECTION_DIFFUSION(1)=42.0_CMISSDP
  234. BOUNDARY_CONDITIONS_ADVECTION_DIFFUSION(2)=0.0_CMISSDP
  235. BOUNDARY_CONDITIONS_ADVECTION_DIFFUSION(3)=0.0_CMISSDP
  236. ENDIF !Set material parameters
  237. DIFF_COEFF_PARAM_ADVECTION_DIFFUSION(1)=1.0_CMISSDP
  238. DIFF_COEFF_PARAM_ADVECTION_DIFFUSION(2)=1.0_CMISSDP
  239. DIFF_COEFF_PARAM_ADVECTION_DIFFUSION(3)=1.0_CMISSDP
  240. !Set interpolation parameters
  241. BASIS_XI_GAUSS_SPACE=3
  242. BASIS_XI_GAUSS_CONCENTRATION=3
  243. !Set output parameter
  244. !(NoOutput/ProgressOutput/TimingOutput/SolverOutput/SolverMatrixOutput)
  245. LINEAR_SOLVER_ADVECTION_DIFFUSION_OUTPUT_TYPE=CMISS_SOLVER_NO_OUTPUT
  246. !(NoOutput/TimingOutput/MatrixOutput/ElementOutput)
  247. EQUATIONS_ADVECTION_DIFFUSION_OUTPUT=CMISS_EQUATIONS_NO_OUTPUT
  248. !Set solver parameters
  249. LINEAR_SOLVER_ADVECTION_DIFFUSION_DIRECT_FLAG=.FALSE.
  250. RELATIVE_TOLERANCE=1.0E-10_CMISSDP !default: 1.0E-05_CMISSDP
  251. ABSOLUTE_TOLERANCE=1.0E-10_CMISSDP !default: 1.0E-10_CMISSDP
  252. DIVERGENCE_TOLERANCE=1.0E20 !default: 1.0E5
  253. MAXIMUM_ITERATIONS=100000 !default: 100000
  254. RESTART_VALUE=3000 !default: 30
  255. LINESEARCH_ALPHA=1.0
  256. !
  257. !================================================================================================================================
  258. !
  259. !COORDINATE SYSTEM
  260. !Start the creation of a new RC coordinate system
  261. CALL CMISSCoordinateSystem_Initialise(CoordinateSystem,Err)
  262. CALL CMISSCoordinateSystem_CreateStart(CoordinateSystemUserNumber,CoordinateSystem,Err)
  263. !Set the coordinate system dimension
  264. CALL CMISSCoordinateSystem_DimensionSet(CoordinateSystem,NUMBER_OF_DIMENSIONS,Err)
  265. !Finish the creation of the coordinate system
  266. CALL CMISSCoordinateSystem_CreateFinish(CoordinateSystem,Err)
  267. !
  268. !================================================================================================================================
  269. !
  270. !REGION
  271. !Start the creation of a new region
  272. CALL CMISSRegion_Initialise(Region,Err)
  273. CALL CMISSRegion_CreateStart(RegionUserNumber,WorldRegion,Region,Err)
  274. !Set the regions coordinate system as defined above
  275. CALL CMISSRegion_CoordinateSystemSet(Region,CoordinateSystem,Err)
  276. !Finish the creation of the region
  277. CALL CMISSRegion_CreateFinish(Region,Err)
  278. !
  279. !================================================================================================================================
  280. !
  281. !BASES
  282. !Start the creation of new bases
  283. MESH_NUMBER_OF_COMPONENTS=1
  284. CALL CMISSBasis_Initialise(BasisSpace,Err)
  285. CALL CMISSBasis_CreateStart(BASIS_NUMBER_SPACE,BasisSpace,Err)
  286. !Set the basis type (Lagrange/Simplex)
  287. CALL CMISSBasis_TypeSet(BasisSpace,BASIS_TYPE,Err)
  288. !Set the basis xi number
  289. CALL CMISSBasis_NumberOfXiSet(BasisSpace,NUMBER_OF_DIMENSIONS,Err)
  290. !Set the basis xi interpolation and number of Gauss points
  291. IF(NUMBER_OF_DIMENSIONS==2) THEN
  292. CALL CMISSBasis_InterpolationXiSet(BasisSpace,(/BASIS_XI_INTERPOLATION_SPACE,BASIS_XI_INTERPOLATION_SPACE/),Err)
  293. CALL CMISSBasis_QuadratureNumberOfGaussXiSet(BasisSpace,(/BASIS_XI_GAUSS_SPACE,BASIS_XI_GAUSS_SPACE/),Err)
  294. ELSE IF(NUMBER_OF_DIMENSIONS==3) THEN
  295. CALL CMISSBasis_InterpolationXiSet(BasisSpace,(/BASIS_XI_INTERPOLATION_SPACE,BASIS_XI_INTERPOLATION_SPACE, &
  296. & BASIS_XI_INTERPOLATION_SPACE/),Err)
  297. CALL CMISSBasis_QuadratureNumberOfGaussXiSet(BasisSpace,(/BASIS_XI_GAUSS_SPACE,BASIS_XI_GAUSS_SPACE,BASIS_XI_GAUSS_SPACE/),Err)
  298. ENDIF
  299. !Finish the creation of the basis
  300. CALL CMISSBasis_CreateFinish(BasisSpace,Err)
  301. !Start the creation of another basis
  302. IF(BASIS_XI_INTERPOLATION_CONCENTRATION==BASIS_XI_INTERPOLATION_SPACE) THEN
  303. BasisConcentration=BasisSpace
  304. ELSE
  305. MESH_NUMBER_OF_COMPONENTS=MESH_NUMBER_OF_COMPONENTS+1
  306. !Initialise a new pressure basis
  307. CALL CMISSBasis_Initialise(BasisConcentration,Err)
  308. !Start the creation of a basis
  309. CALL CMISSBasis_CreateStart(BASIS_NUMBER_CONCENTRATION,BasisConcentration,Err)
  310. !Set the basis type (Lagrange/Simplex)
  311. CALL CMISSBasis_TypeSet(BasisConcentration,BASIS_TYPE,Err)
  312. !Set the basis xi number
  313. CALL CMISSBasis_NumberOfXiSet(BasisConcentration,NUMBER_OF_DIMENSIONS,Err)
  314. !Set the basis xi interpolation and number of Gauss points
  315. IF(NUMBER_OF_DIMENSIONS==2) THEN
  316. CALL CMISSBasis_InterpolationXiSet(BasisConcentration,(/BASIS_XI_INTERPOLATION_CONCENTRATION, &
  317. & BASIS_XI_INTERPOLATION_CONCENTRATION/),Err)
  318. CALL CMISSBasis_QuadratureNumberOfGaussXiSet(BasisConcentration,(/BASIS_XI_GAUSS_CONCENTRATION, &
  319. & BASIS_XI_GAUSS_CONCENTRATION/),Err)
  320. ELSE IF(NUMBER_OF_DIMENSIONS==3) THEN
  321. CALL CMISSBasis_InterpolationXiSet(BasisConcentration,(/BASIS_XI_INTERPOLATION_CONCENTRATION, &
  322. & BASIS_XI_INTERPOLATION_CONCENTRATION, BASIS_XI_INTERPOLATION_CONCENTRATION/),Err)
  323. CALL CMISSBasis_QuadratureNumberOfGaussXiSet(BasisConcentration,(/BASIS_XI_GAUSS_CONCENTRATION, &
  324. & BASIS_XI_GAUSS_CONCENTRATION, BASIS_XI_GAUSS_CONCENTRATION/),Err)
  325. ENDIF
  326. !Finish the creation of the basis
  327. CALL CMISSBasis_CreateFinish(BasisConcentration,Err)
  328. ENDIF
  329. !
  330. !================================================================================================================================
  331. !
  332. !MESH
  333. !Start the creation of mesh nodes
  334. CALL CMISSNodes_Initialise(Nodes,Err)
  335. CALL CMISSMesh_Initialise(Mesh,Err)
  336. CALL CMISSNodes_CreateStart(Region,TOTAL_NUMBER_OF_NODES,Nodes,Err)
  337. CALL CMISSNodes_CreateFinish(Nodes,Err)
  338. !Start the creation of the mesh
  339. CALL CMISSMesh_CreateStart(MeshUserNumber,Region,NUMBER_OF_DIMENSIONS,Mesh,Err)
  340. !Set number of mesh elements
  341. CALL CMISSMesh_NumberOfElementsSet(Mesh,TOTAL_NUMBER_OF_ELEMENTS,Err)
  342. !Set number of mesh components
  343. CALL CMISSMesh_NumberOfComponentsSet(Mesh,MESH_NUMBER_OF_COMPONENTS,Err)
  344. !Specify spatial mesh component
  345. CALL CMISSMeshElements_Initialise(MeshElementsSpace,Err)
  346. CALL CMISSMeshElements_Initialise(MeshElementsConcentration,Err)
  347. MESH_COMPONENT_NUMBER_SPACE=1
  348. MESH_COMPONENT_NUMBER_CONCENTRATION=1
  349. CALL CMISSMeshElements_CreateStart(Mesh,MESH_COMPONENT_NUMBER_SPACE,BasisSpace,MeshElementsSpace,Err)
  350. DO ELEMENT_NUMBER=1,TOTAL_NUMBER_OF_ELEMENTS
  351. CALL CMISSMeshElements_NodesSet(MeshElementsSpace,ELEMENT_NUMBER,CM%M(ELEMENT_NUMBER,1:NUMBER_OF_ELEMENT_NODES_SPACE),Err)
  352. ENDDO
  353. CALL CMISSMeshElements_CreateFinish(MeshElementsSpace,Err)
  354. !Specify pressure mesh component
  355. IF(BASIS_XI_INTERPOLATION_CONCENTRATION==BASIS_XI_INTERPOLATION_SPACE) THEN
  356. MeshElementsConcentration=MeshElementsSpace
  357. MESH_COMPONENT_NUMBER_CONCENTRATION=MESH_COMPONENT_NUMBER_SPACE
  358. ELSE
  359. MESH_COMPONENT_NUMBER_CONCENTRATION=MESH_COMPONENT_NUMBER_SPACE+1
  360. CALL CMISSMeshElements_CreateStart(Mesh,MESH_COMPONENT_NUMBER_CONCENTRATION,BasisConcentration,MeshElementsConcentration,Err)
  361. DO ELEMENT_NUMBER=1,TOTAL_NUMBER_OF_ELEMENTS
  362. CALL CMISSMeshElements_NodesSet(MeshElementsConcentration,ELEMENT_NUMBER,CM%V(ELEMENT_NUMBER, &
  363. & 1:NUMBER_OF_ELEMENT_NODES_CONCENTRATION),Err)
  364. ENDDO
  365. CALL CMISSMeshElements_CreateFinish(MeshElementsConcentration,Err)
  366. ENDIF
  367. !Finish the creation of the mesh
  368. CALL CMISSMesh_CreateFinish(Mesh,Err)
  369. !
  370. !================================================================================================================================
  371. !
  372. !GEOMETRIC FIELD
  373. !Create a decomposition
  374. CALL CMISSDecomposition_Initialise(Decomposition,Err)
  375. CALL CMISSDecomposition_CreateStart(DecompositionUserNumber,Mesh,Decomposition,Err)
  376. !Set the decomposition to be a general decomposition with the specified number of domains
  377. CALL CMISSDecomposition_TypeSet(Decomposition,CMISS_DECOMPOSITION_CALCULATED_TYPE,Err)
  378. CALL CMISSDecomposition_NumberOfDomainsSet(Decomposition,DomainUserNumber,Err)
  379. !Finish the decomposition
  380. CALL CMISSDecomposition_CreateFinish(Decomposition,Err)
  381. !Start to create a default (geometric) field on the region
  382. CALL CMISSField_Initialise(GeometricField,Err)
  383. CALL CMISSField_CreateStart(GeometricFieldUserNumber,Region,GeometricField,Err)
  384. !Set the field type
  385. CALL CMISSField_TypeSet(GeometricField,CMISS_FIELD_GEOMETRIC_TYPE,Err)
  386. !Set the decomposition to use
  387. CALL CMISSField_MeshDecompositionSet(GeometricField,Decomposition,Err)
  388. !Set the scaling to use
  389. CALL CMISSField_ScalingTypeSet(GeometricField,CMISS_FIELD_NO_SCALING,Err)
  390. !Set the mesh component to be used by the field components.
  391. DO COMPONENT_NUMBER=1,NUMBER_OF_DIMENSIONS
  392. CALL CMISSField_ComponentMeshComponentSet(GeometricField,CMISS_FIELD_U_VARIABLE_TYPE,COMPONENT_NUMBER, &
  393. & MESH_COMPONENT_NUMBER_SPACE,Err)
  394. ENDDO
  395. !Finish creating the field
  396. CALL CMISSField_CreateFinish(GeometricField,Err)
  397. !Update the geometric field parameters
  398. DO NODE_NUMBER=1,NUMBER_OF_NODES_SPACE
  399. DO COMPONENT_NUMBER=1,NUMBER_OF_DIMENSIONS
  400. VALUE=CM%N(NODE_NUMBER,COMPONENT_NUMBER)
  401. CALL CMISSField_ParameterSetUpdateNode(GeometricField,CMISS_FIELD_U_VARIABLE_TYPE,CMISS_FIELD_VALUES_SET_TYPE, &
  402. & 1,CMISS_NO_GLOBAL_DERIV,NODE_NUMBER,COMPONENT_NUMBER,VALUE,Err)
  403. ENDDO
  404. ENDDO
  405. CALL CMISSField_ParameterSetUpdateStart(GeometricField,CMISS_FIELD_U_VARIABLE_TYPE,CMISS_FIELD_VALUES_SET_TYPE,Err)
  406. CALL CMISSField_ParameterSetUpdateFinish(GeometricField,CMISS_FIELD_U_VARIABLE_TYPE,CMISS_FIELD_VALUES_SET_TYPE,Err)
  407. !
  408. !================================================================================================================================
  409. !
  410. !EQUATIONS SETS
  411. !Create the equations_set
  412. CALL CMISSEquationsSet_Initialise(EquationsSetAdvecDiff,Err)
  413. CALL CMISSField_Initialise(EquationsSetField,Err)
  414. CALL CMISSEquationsSet_CreateStart(EquationsSetUserNumberAdvecDiff,Region,GeometricField, &
  415. & CMISS_EQUATIONS_SET_CLASSICAL_FIELD_CLASS,&
  416. & CMISS_EQUATIONS_SET_ADVECTION_DIFFUSION_EQUATION_TYPE,CMISS_EQUATIONS_SET_NO_SOURCE_ADVECTION_DIFFUSION_SUBTYPE,&
  417. & EquationsSetFieldUserNumber,EquationsSetField,EquationsSetAdvecDiff,Err)
  418. !Set the equations set to be a standard Laplace problem
  419. !Finish creating the equations set
  420. CALL CMISSEquationsSet_CreateFinish(EquationsSetAdvecDiff,Err)
  421. !
  422. !================================================================================================================================
  423. !
  424. !DEPENDENT FIELDS
  425. !Create the equations set dependent field variables
  426. CALL CMISSField_Initialise(DependentFieldAdvecDiff,Err)
  427. CALL CMISSEquationsSet_DependentCreateStart(EquationsSetAdvecDiff,DependentFieldUserNumberAdvecDiff,DependentFieldAdvecDiff,Err)
  428. !Finish the equations set dependent field variables
  429. CALL CMISSEquationsSet_DependentCreateFinish(EquationsSetAdvecDiff,Err)
  430. !
  431. !================================================================================================================================
  432. !
  433. !MATERIALS FIELDS
  434. !Create the equations set material field variables
  435. CALL CMISSField_Initialise(MaterialsFieldAdvecDiff,Err)
  436. CALL CMISSEquationsSet_MaterialsCreateStart(EquationsSetAdvecDiff,MaterialsFieldUserNumberAdvecDiff,MaterialsFieldAdvecDiff,Err)
  437. !Finish the equations set dependent field variables
  438. CALL CMISSEquationsSet_MaterialsCreateFinish(EquationsSetAdvecDiff,Err)
  439. !
  440. !================================================================================================================================
  441. !
  442. !SOURCE FIELDS
  443. !Create the equations set source field variables
  444. ! CALL CMISSField_Initialise(SourceFieldAdvecDiff,Err)
  445. ! CALL CMISSEquationsSet_SourceCreateStart(EquationsSetAdvecDiff,SourceFieldUserNumberAdvecDiff,SourceFieldAdvecDiff,Err)
  446. ! CALL CMISSField_ComponentInterpolationSet(SourceFieldAdvecDiff,CMISS_FIELD_U_VARIABLE_TYPE,1,CMISS_FIELD_NODE_BASED_INTERPOLATION,Err)
  447. ! !Finish the equations set dependent field variables
  448. ! CALL CMISSEquationsSet_SourceCreateFinish(EquationsSetAdvecDiff,Err)
  449. !
  450. !================================================================================================================================
  451. !
  452. !INDEPENDENT FIELDS
  453. ! CALL CMISSField_ParameterSetDataGet(GeometricField,CMISS_FIELD_U_VARIABLE_TYPE,CMISS_FIELD_VALUES_SET_TYPE,GEOMETRIC_PARAMETERS,Err)
  454. !Create the equations set independent field variables
  455. CALL CMISSField_Initialise(IndependentFieldAdvecDiff,Err)
  456. CALL CMISSEquationsSet_IndependentCreateStart(EquationsSetAdvecDiff,IndependentFieldUserNumberAdvecDiff, &
  457. & IndependentFieldAdvecDiff,Err)
  458. ! IF(NUMBER_GLOBAL_Z_ELEMENTS==0) THEN
  459. ! CALL CMISSField_ComponentInterpolationSet(IndependentField,CMISS_FIELD_U_VARIABLE_TYPE,1,CMISS_FIELD_NODE_BASED_INTERPOLATION,Err)
  460. ! CALL CMISSField_ComponentInterpolationSet(IndependentField,CMISS_FIELD_U_VARIABLE_TYPE,2,CMISS_FIELD_NODE_BASED_INTERPOLATION,Err)
  461. ! ENDIF
  462. !Set the mesh component to be used by the field components.
  463. CALL CMISSField_ComponentMeshComponentSet(IndependentFieldAdvecDiff,CMISS_FIELD_U_VARIABLE_TYPE,MESH_COMPONENT_NUMBER_SPACE, &
  464. & MESH_COMPONENT_NUMBER_CONCENTRATION,Err)
  465. !Finish the equations set dependent field variables
  466. CALL CMISSEquationsSet_IndependentCreateFinish(EquationsSetAdvecDiff,Err)
  467. !
  468. !================================================================================================================================
  469. !
  470. !EQUATIONS
  471. !Create the equations set equations
  472. CALL CMISSEquations_Initialise(EquationsAdvecDiff,Err)
  473. CALL CMISSEquationsSet_EquationsCreateStart(EquationsSetAdvecDiff,EquationsAdvecDiff,Err)
  474. !Set the equations matrices sparsity type
  475. CALL CMISSEquations_SparsityTypeSet(EquationsAdvecDiff,CMISS_EQUATIONS_SPARSE_MATRICES,Err)
  476. !Set the equations set output
  477. CALL CMISSEquations_OutputTypeSet(EquationsAdvecDiff,EQUATIONS_ADVECTION_DIFFUSION_OUTPUT,Err)
  478. !CALL CMISSEquations_OutputTypeSet(Equations,CMISS_EQUATIONS_NO_OUTPUT,Err)
  479. !CALL CMISSEquations_OutputTypeSet(Equations,CMISS_EQUATIONS_TIMING_OUTPUT,Err)
  480. !CALL CMISSEquations_OutputTypeSet(Equations,CMISS_EQUATIONS_MATRIX_OUTPUT,Err)
  481. !CALL CMISSEquations_OutputTypeSet(Equations,CMISS_EQUATIONS_ELEMENT_MATRIX_OUTPUT,Err)
  482. !Finish the equations set equations
  483. CALL CMISSEquationsSet_EquationsCreateFinish(EquationsSetAdvecDiff,Err)
  484. !
  485. !================================================================================================================================
  486. !
  487. !Start the creation of a problem.
  488. CALL CMISSProblem_Initialise(Problem,Err)
  489. CALL CMISSControlLoop_Initialise(ControlLoop,Err)
  490. CALL CMISSProblem_CreateStart(ProblemUserNumber,Problem,Err)
  491. !Set the problem to be a No Source Diffusion problem
  492. CALL CMISSProblem_SpecificationSet(Problem,CMISS_PROBLEM_CLASSICAL_FIELD_CLASS,CMISS_PROBLEM_ADVECTION_DIFFUSION_EQUATION_TYPE, &
  493. & CMISS_PROBLEM_NO_SOURCE_ADVECTION_DIFFUSION_SUBTYPE,Err)
  494. !Finish the creation of a problem.
  495. CALL CMISSProblem_CreateFinish(Problem,Err)
  496. !Start the creation of the problem control loop
  497. CALL CMISSProblem_ControlLoopCreateStart(Problem,Err)
  498. !Get the control loop
  499. CALL CMISSProblem_ControlLoopGet(Problem,ControlLoopNode,ControlLoop,Err)
  500. !Set the times
  501. CALL CMISSControlLoop_TimesSet(ControlLoop,0.0_CMISSDP,0.03_CMISSDP,0.01_CMISSDP,Err)
  502. !Finish creating the problem control loop
  503. CALL CMISSProblem_ControlLoopCreateFinish(Problem,Err)
  504. !
  505. !================================================================================================================================
  506. !
  507. !SOLVERS
  508. !Start the creation of the problem solvers
  509. !
  510. ! ! !For the Direct Solver MUMPS, uncomment the below two lines and comment out the above five
  511. ! ! CALL SOLVER_LINEAR_TYPE_SET(LINEAR_SOLVER,SOLVER_LINEAR_DIRECT_SOLVE_TYPE,ERR,ERROR,*999)
  512. ! ! CALL SOLVER_LINEAR_DIRECT_TYPE_SET(LINEAR_SOLVER,SOLVER_DIRECT_MUMPS,ERR,ERROR,*999)
  513. !
  514. CALL CMISSSolver_Initialise(SolverAdvecDiff,Err)
  515. CALL CMISSSolver_Initialise(LinearSolverAdvecDiff,Err)
  516. CALL CMISSProblem_SolversCreateStart(Problem,Err)
  517. CALL CMISSProblem_SolverGet(Problem,CMISS_CONTROL_LOOP_NODE,1,SolverAdvecDiff,Err)
  518. !CALL CMISSSolver_OutputTypeSet(Solver,CMISS_SOLVER_NO_OUTPUT,Err)
  519. !CALL CMISSSolver_OutputTypeSet(Solver,CMISS_SOLVER_PROGRESS_OUTPUT,Err)
  520. !CALL CMISSSolver_OutputTypeSet(Solver,CMISS_SOLVER_TIMING_OUTPUT,Err)
  521. !CALL CMISSSolver_OutputTypeSet(Solver,CMISS_SOLVER_SOLVER_OUTPUT,Err)
  522. CALL CMISSSolver_OutputTypeSet(SolverAdvecDiff,CMISS_SOLVER_PROGRESS_OUTPUT,Err)
  523. CALL CMISSSolver_DynamicLinearSolverGet(SolverAdvecDiff,LinearSolverAdvecDiff,Err)
  524. CALL CMISSSolver_LinearIterativeMaximumIterationsSet(LinearSolverAdvecDiff,300,Err)
  525. !Finish the creation of the problem solver
  526. CALL CMISSProblem_SolversCreateFinish(Problem,Err)
  527. !
  528. !================================================================================================================================
  529. !
  530. !SOLVER EQUATIONS
  531. !Create the problem solver equations
  532. CALL CMISSSolver_Initialise(SolverAdvecDiff,Err)
  533. CALL CMISSSolverEquations_Initialise(SolverEquationsAdvecDiff,Err)
  534. CALL CMISSProblem_SolverEquationsCreateStart(Problem,Err)
  535. !Get the solve equations
  536. CALL CMISSProblem_SolverGet(Problem,CMISS_CONTROL_LOOP_NODE,1,SolverAdvecDiff,Err)
  537. CALL CMISSSolver_SolverEquationsGet(SolverAdvecDiff,SolverEquationsAdvecDiff,Err)
  538. !Set the solver equations sparsity
  539. CALL CMISSSolverEquations_SparsityTypeSet(SolverEquationsAdvecDiff,CMISS_SOLVER_SPARSE_MATRICES,Err)
  540. !CALL CMISSSolverEquations_SparsityTypeSet(SolverEquations,CMISS_SOLVER_FULL_MATRICES,Err)
  541. !Add in the equations set
  542. CALL CMISSSolverEquations_EquationsSetAdd(SolverEquationsAdvecDiff,EquationsSetAdvecDiff,EquationsSetIndex,Err)
  543. !Finish the creation of the problem solver equations
  544. CALL CMISSProblem_SolverEquationsCreateFinish(Problem,Err)
  545. !
  546. !================================================================================================================================
  547. !
  548. !BOUNDARY CONDITIONS
  549. !Start the creation of the equations set boundary conditions for Poisson
  550. CALL CMISSBoundaryConditions_Initialise(BoundaryConditionsAdvecDiff,Err)
  551. CALL CMISSSolverEquations_BoundaryConditionsCreateStart(SolverEquationsAdvecDiff,BoundaryConditionsAdvecDiff,Err)
  552. !Set fixed wall nodes
  553. IF(FIXED_WALL_NODES_ADVECTION_DIFFUSION_FLAG) THEN
  554. DO NODE_COUNTER=1,NUMBER_OF_FIXED_WALL_NODES_ADVECTION_DIFFUSION
  555. NODE_NUMBER=FIXED_WALL_NODES_ADVECTION_DIFFUSION(NODE_COUNTER)
  556. CONDITION=CMISS_BOUNDARY_CONDITION_FIXED
  557. ! DO COMPONENT_NUMBER=1,NUMBER_OF_DIMENSIONS
  558. VALUE=0.0_CMISSDP
  559. CALL CMISSBoundaryConditions_SetNode(BoundaryConditionsAdvecDiff,DependentFieldAdvecDiff,CMISS_FIELD_U_VARIABLE_TYPE, &
  560. & CMISS_NO_GLOBAL_DERIV, &
  561. & 1,NODE_NUMBER,MESH_COMPONENT_NUMBER_CONCENTRATION,CONDITION,VALUE,Err)
  562. ! ENDDO
  563. ENDDO
  564. ENDIF
  565. !Set velocity boundary conditions
  566. IF(INLET_WALL_NODES_ADVECTION_DIFFUSION_FLAG) THEN
  567. DO NODE_COUNTER=1,NUMBER_OF_INLET_WALL_NODES_ADVECTION_DIFFUSION
  568. NODE_NUMBER=INLET_WALL_NODES_ADVECTION_DIFFUSION(NODE_COUNTER)
  569. CONDITION=CMISS_BOUNDARY_CONDITION_FIXED
  570. ! DO COMPONENT_NUMBER=1,NUMBER_OF_DIMENSIONS
  571. VALUE=0.1_CMISSDP
  572. CALL CMISSBoundaryConditions_SetNode(BoundaryConditionsAdvecDiff,DependentFieldAdvecDiff,CMISS_FIELD_U_VARIABLE_TYPE, &
  573. & CMISS_NO_GLOBAL_DERIV, &
  574. & 1,NODE_NUMBER,MESH_COMPONENT_NUMBER_CONCENTRATION,CONDITION,VALUE,Err)
  575. ! ENDDO
  576. ENDDO
  577. ENDIF
  578. !Finish the creation of the equations set boundary conditions
  579. CALL CMISSSolverEquations_BoundaryConditionsCreateFinish(SolverEquationsAdvecDiff,Err)
  580. !
  581. !================================================================================================================================
  582. !
  583. !RUN SOLVERS
  584. !Turn of PETSc error handling
  585. !CALL PETSC_ERRORHANDLING_SET_ON(ERR,ERROR,*999)
  586. !Solve the problem
  587. WRITE(*,'(A)') "Solving problem..."
  588. CALL CMISSProblem_Solve(Problem,Err)
  589. WRITE(*,'(A)') "Problem solved!"
  590. !
  591. !================================================================================================================================
  592. !
  593. !OUTPUT
  594. EXPORT_FIELD_IO=.TRUE.
  595. IF(EXPORT_FIELD_IO) THEN
  596. WRITE(*,'(A)') "Exporting fields..."
  597. CALL CMISSFields_Initialise(Fields,Err)
  598. CALL CMISSFields_Create(Region,Fields,Err)
  599. CALL CMISSFields_NodesExport(Fields,"AdvectionDiffusionIO","FORTRAN",Err)
  600. CALL CMISSFields_ElementsExport(Fields,"AdvectionDiffusionIO","FORTRAN",Err)
  601. CALL CMISSFields_Finalise(Fields,Err)
  602. WRITE(*,'(A)') "Field exported!"
  603. ENDIF
  604. !Finialise CMISS
  605. !CALL CMISSFinalise(Err)
  606. WRITE(*,'(A)') "Program successfully completed."
  607. STOP
  608. END PROGRAM ADVECTIONDIFFUSIONIOEXAMPLE