/TwoRegions/src/TwoRegionsExample.f90

http://github.com/xyan075/examples · Fortran Modern · 653 lines · 381 code · 73 blank · 199 comment · 52 complexity · 87e102af144003d52e3411b1d058acde MD5 · raw file

  1. !> \file
  2. !> \author Chris Bradley
  3. !> \brief This is an example program which sets up a field in two regions 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 TwoRegions/src/TwoRegionsExample.f90
  42. !! Example program which sets up a field in two regions using OpenCMISS calls.
  43. !! \par Latest Builds:
  44. !! \li <a href='http://autotest.bioeng.auckland.ac.nz/opencmiss-build/logs_x86_64-linux/TwoRegions/build-intel'>Linux Intel Build</a>
  45. !! \li <a href='http://autotest.bioeng.auckland.ac.nz/opencmiss-build/logs_x86_64-linux/TwoRegions/build-gnu'>Linux GNU Build</a>
  46. !<
  47. !> Main program
  48. PROGRAM TWOREGIONSEXAMPLE
  49. USE OPENCMISS
  50. USE MPI
  51. #ifdef WIN32
  52. USE IFQWIN
  53. #endif
  54. IMPLICIT NONE
  55. !Test program parameters
  56. REAL(CMISSDP), PARAMETER :: HEIGHT=1.0_CMISSDP
  57. REAL(CMISSDP), PARAMETER :: WIDTH=2.0_CMISSDP
  58. REAL(CMISSDP), PARAMETER :: LENGTH=3.0_CMISSDP
  59. INTEGER(CMISSIntg), PARAMETER :: CoordinateSystem1UserNumber=1
  60. INTEGER(CMISSIntg), PARAMETER :: CoordinateSystem2UserNumber=2
  61. INTEGER(CMISSIntg), PARAMETER :: Region1UserNumber=3
  62. INTEGER(CMISSIntg), PARAMETER :: Region2UserNumber=4
  63. INTEGER(CMISSIntg), PARAMETER :: Basis1UserNumber=5
  64. INTEGER(CMISSIntg), PARAMETER :: Basis2UserNumber=6
  65. INTEGER(CMISSIntg), PARAMETER :: InterfaceBasisUserNumber=7
  66. INTEGER(CMISSIntg), PARAMETER :: GeneratedMesh1UserNumber=8
  67. INTEGER(CMISSIntg), PARAMETER :: GeneratedMesh2UserNumber=9
  68. INTEGER(CMISSIntg), PARAMETER :: InterfaceGeneratedMeshUserNumber=10
  69. INTEGER(CMISSIntg), PARAMETER :: Mesh1UserNumber=11
  70. INTEGER(CMISSIntg), PARAMETER :: Mesh2UserNumber=12
  71. INTEGER(CMISSIntg), PARAMETER :: InterfaceMeshUserNumber=13
  72. INTEGER(CMISSIntg), PARAMETER :: Decomposition1UserNumber=14
  73. INTEGER(CMISSIntg), PARAMETER :: Decomposition2UserNumber=15
  74. INTEGER(CMISSIntg), PARAMETER :: InterfaceDecompositionUserNumber=16
  75. INTEGER(CMISSIntg), PARAMETER :: GeometricField1UserNumber=17
  76. INTEGER(CMISSIntg), PARAMETER :: GeometricField2UserNumber=18
  77. INTEGER(CMISSIntg), PARAMETER :: InterfaceGeometricFieldUserNumber=19
  78. INTEGER(CMISSIntg), PARAMETER :: EquationsSet1UserNumber=20
  79. INTEGER(CMISSIntg), PARAMETER :: EquationsSet2UserNumber=21
  80. INTEGER(CMISSIntg), PARAMETER :: DependentField1UserNumber=22
  81. INTEGER(CMISSIntg), PARAMETER :: DependentField2UserNumber=23
  82. INTEGER(CMISSIntg), PARAMETER :: InterfaceUserNumber=24
  83. INTEGER(CMISSIntg), PARAMETER :: InterfaceConditionUserNumber=25
  84. INTEGER(CMISSIntg), PARAMETER :: LagrangeFieldUserNumber=26
  85. INTEGER(CMISSIntg), PARAMETER :: CoupledProblemUserNumber=27
  86. INTEGER(CMISSIntg), PARAMETER :: EquationsSetField1UserNumber=40
  87. INTEGER(CMISSIntg), PARAMETER :: EquationsSetField2UserNumber=41
  88. !Program types
  89. !Program variables
  90. INTEGER(CMISSIntg) :: NUMBER_GLOBAL_X_ELEMENTS,NUMBER_GLOBAL_Y_ELEMENTS,NUMBER_GLOBAL_Z_ELEMENTS
  91. INTEGER(CMISSIntg) :: NUMBER_OF_DOMAINS
  92. INTEGER(CMISSIntg) :: MPI_IERROR
  93. LOGICAL :: EXPORT_FIELD
  94. INTEGER(CMISSIntg) :: EquationsSet1Index,EquationsSet2Index
  95. INTEGER(CMISSIntg) :: FirstNodeNumber,LastNodeNumber
  96. INTEGER(CMISSIntg) :: FirstNodeDomain,LastNodeDomain
  97. INTEGER(CMISSIntg) :: InterfaceConditionIndex
  98. INTEGER(CMISSIntg) :: Mesh1Index,Mesh2Index
  99. INTEGER(CMISSIntg) :: NumberOfComputationalNodes,ComputationalNodeNumber
  100. !CMISS variables
  101. TYPE(CMISSBasisType) :: Basis1,Basis2,InterfaceBasis
  102. TYPE(CMISSBoundaryConditionsType) :: BoundaryConditions
  103. TYPE(CMISSCoordinateSystemType) :: CoordinateSystem1,CoordinateSystem2,WorldCoordinateSystem
  104. TYPE(CMISSDecompositionType) :: Decomposition1,Decomposition2,InterfaceDecomposition
  105. TYPE(CMISSEquationsType) :: Equations1,Equations2
  106. TYPE(CMISSEquationsSetType) :: EquationsSet1,EquationsSet2
  107. TYPE(CMISSFieldType) :: GeometricField1,GeometricField2,InterfaceGeometricField,DependentField1, &
  108. & DependentField2,LagrangeField,EquationsSetField1,EquationsSetField2
  109. TYPE(CMISSFieldsType) :: Fields1,Fields2,InterfaceFields
  110. TYPE(CMISSGeneratedMeshType) :: GeneratedMesh1,GeneratedMesh2,InterfaceGeneratedMesh
  111. TYPE(CMISSInterfaceType) :: Interface
  112. TYPE(CMISSInterfaceConditionType) :: InterfaceCondition
  113. TYPE(CMISSInterfaceEquationsType) :: InterfaceEquations
  114. TYPE(CMISSInterfaceMeshConnectivityType) :: InterfaceMeshConnectivity
  115. TYPE(CMISSMeshType) :: Mesh1,Mesh2,InterfaceMesh
  116. TYPE(CMISSProblemType) :: CoupledProblem
  117. TYPE(CMISSRegionType) :: Region1,Region2,WorldRegion
  118. TYPE(CMISSSolverType) :: CoupledSolver
  119. TYPE(CMISSSolverEquationsType) :: CoupledSolverEquations
  120. #ifdef WIN32
  121. !Quickwin type
  122. LOGICAL :: QUICKWIN_STATUS=.FALSE.
  123. TYPE(WINDOWCONFIG) :: QUICKWIN_WINDOW_CONFIG
  124. #endif
  125. !Generic CMISS variables
  126. INTEGER(CMISSIntg) :: Err
  127. #ifdef WIN32
  128. !Initialise QuickWin
  129. QUICKWIN_WINDOW_CONFIG%TITLE="General Output" !Window title
  130. QUICKWIN_WINDOW_CONFIG%NUMTEXTROWS=-1 !Max possible number of rows
  131. QUICKWIN_WINDOW_CONFIG%MODE=QWIN$SCROLLDOWN
  132. !Set the window parameters
  133. QUICKWIN_STATUS=SETWINDOWCONFIG(QUICKWIN_WINDOW_CONFIG)
  134. !If attempt fails set with system estimated values
  135. IF(.NOT.QUICKWIN_STATUS) QUICKWIN_STATUS=SETWINDOWCONFIG(QUICKWIN_WINDOW_CONFIG)
  136. #endif
  137. !Intialise OpenCMISS
  138. CALL CMISSInitialise(WorldCoordinateSystem,WorldRegion,Err)
  139. !Set error handling mode
  140. CALL CMISSErrorHandlingModeSet(CMISS_ERRORS_TRAP_ERROR,Err)
  141. !Set diganostics for testing
  142. !CALL CMISSDiagnosticsSetOn(CMISS_FROM_DIAG_TYPE,(/1,2,3,4,5/),"Diagnostics",(/"FIELD_MAPPINGS_CALCULATE", &
  143. ! & "SOLVER_MAPPING_CALCULATE"/),Err)
  144. !Get the computational nodes information
  145. CALL CMISSComputationalNumberOfNodesGet(NumberOfComputationalNodes,Err)
  146. CALL CMISSComputationalNodeNumberGet(ComputationalNodeNumber,Err)
  147. NUMBER_GLOBAL_X_ELEMENTS=2
  148. NUMBER_GLOBAL_Y_ELEMENTS=2
  149. NUMBER_GLOBAL_Z_ELEMENTS=0
  150. NUMBER_OF_DOMAINS=NumberOfComputationalNodes
  151. !Broadcast the number of elements in the X & Y directions and the number of partitions to the other computational nodes
  152. CALL MPI_BCAST(NUMBER_GLOBAL_X_ELEMENTS,1,MPI_INTEGER,0,MPI_COMM_WORLD,MPI_IERROR)
  153. CALL MPI_BCAST(NUMBER_GLOBAL_Y_ELEMENTS,1,MPI_INTEGER,0,MPI_COMM_WORLD,MPI_IERROR)
  154. CALL MPI_BCAST(NUMBER_GLOBAL_Z_ELEMENTS,1,MPI_INTEGER,0,MPI_COMM_WORLD,MPI_IERROR)
  155. CALL MPI_BCAST(NUMBER_OF_DOMAINS,1,MPI_INTEGER,0,MPI_COMM_WORLD,MPI_IERROR)
  156. !Start the creation of a new RC coordinate system for the first region
  157. PRINT *, ' == >> CREATING COORDINATE SYSTEM(1) << == '
  158. CALL CMISSCoordinateSystem_Initialise(CoordinateSystem1,Err)
  159. CALL CMISSCoordinateSystem_CreateStart(CoordinateSystem1UserNumber,CoordinateSystem1,Err)
  160. IF(NUMBER_GLOBAL_Z_ELEMENTS==0) THEN
  161. !Set the coordinate system to be 2D
  162. CALL CMISSCoordinateSystem_DimensionSet(CoordinateSystem1,2,Err)
  163. ELSE
  164. !Set the coordinate system to be 3D
  165. CALL CMISSCoordinateSystem_DimensionSet(CoordinateSystem1,3,Err)
  166. ENDIF
  167. !Finish the creation of the coordinate system
  168. CALL CMISSCoordinateSystem_CreateFinish(CoordinateSystem1,Err)
  169. !Start the creation of a new RC coordinate system for the second region
  170. PRINT *, ' == >> CREATING COORDINATE SYSTEM(2) << == '
  171. CALL CMISSCoordinateSystem_Initialise(CoordinateSystem2,Err)
  172. CALL CMISSCoordinateSystem_CreateStart(CoordinateSystem2UserNumber,CoordinateSystem2,Err)
  173. IF(NUMBER_GLOBAL_Z_ELEMENTS==0) THEN
  174. !Set the coordinate system to be 2D
  175. CALL CMISSCoordinateSystem_DimensionSet(CoordinateSystem2,2,Err)
  176. ELSE
  177. !Set the coordinate system to be 3D
  178. CALL CMISSCoordinateSystem_DimensionSet(CoordinateSystem2,3,Err)
  179. ENDIF
  180. !Finish the creation of the coordinate system
  181. CALL CMISSCoordinateSystem_CreateFinish(CoordinateSystem2,Err)
  182. !Start the creation of the first region
  183. PRINT *, ' == >> CREATING REGION(1) << == '
  184. CALL CMISSRegion_Initialise(Region1,Err)
  185. CALL CMISSRegion_CreateStart(Region1UserNumber,WorldRegion,Region1,Err)
  186. !Set the regions coordinate system to the RC coordinate system that we have created
  187. CALL CMISSRegion_CoordinateSystemSet(Region1,CoordinateSystem1,Err)
  188. !Finish the creation of the first region
  189. CALL CMISSRegion_CreateFinish(Region1,Err)
  190. !Start the creation of the second region
  191. PRINT *, ' == >> CREATING REGION(2) << == '
  192. CALL CMISSRegion_Initialise(Region2,Err)
  193. CALL CMISSRegion_CreateStart(Region2UserNumber,WorldRegion,Region2,Err)
  194. !Set the regions coordinate system to the RC coordinate system that we have created
  195. CALL CMISSRegion_CoordinateSystemSet(Region2,CoordinateSystem2,Err)
  196. !Finish the creation of the second region
  197. CALL CMISSRegion_CreateFinish(Region2,Err)
  198. !Start the creation of a bI/tri-linear-Lagrange basis
  199. PRINT *, ' == >> CREATING BASIS(1) << == '
  200. CALL CMISSBasis_Initialise(Basis1,Err)
  201. CALL CMISSBasis_CreateStart(Basis1UserNumber,Basis1,Err)
  202. IF(NUMBER_GLOBAL_Z_ELEMENTS==0) THEN
  203. !Set the basis to be a bilinear Lagrange basis
  204. CALL CMISSBasis_NumberOfXiSet(Basis1,2,Err)
  205. ELSE
  206. !Set the basis to be a trilinear Lagrange basis
  207. CALL CMISSBasis_NumberOfXiSet(Basis1,3,Err)
  208. ENDIF
  209. !Finish the creation of the basis
  210. CALL CMISSBasis_CreateFinish(Basis1,Err)
  211. !Start the creation of a bI/tri-quadratic-Lagrange basis
  212. PRINT *, ' == >> CREATING BASIS(2) << == '
  213. CALL CMISSBasis_Initialise(Basis2,Err)
  214. CALL CMISSBasis_CreateStart(Basis2UserNumber,Basis2,Err)
  215. IF(NUMBER_GLOBAL_Z_ELEMENTS==0) THEN
  216. !Set the basis to be a bilinear Lagrange basis
  217. CALL CMISSBasis_NumberOfXiSet(Basis2,2,Err)
  218. CALL CMISSBasis_InterpolationXiSet(Basis2,(/CMISS_BASIS_QUADRATIC_LAGRANGE_INTERPOLATION, &
  219. & CMISS_BASIS_QUADRATIC_LAGRANGE_INTERPOLATION/),Err)
  220. ELSE
  221. !Set the basis to be a trilinear Lagrange basis
  222. CALL CMISSBasis_NumberOfXiSet(Basis2,3,Err)
  223. CALL CMISSBasis_InterpolationXiSet(Basis2,(/CMISS_BASIS_QUADRATIC_LAGRANGE_INTERPOLATION, &
  224. & CMISS_BASIS_QUADRATIC_LAGRANGE_INTERPOLATION,CMISS_BASIS_QUADRATIC_LAGRANGE_INTERPOLATION/),Err)
  225. ENDIF
  226. !Finish the creation of the basis
  227. CALL CMISSBasis_CreateFinish(Basis2,Err)
  228. !Start the creation of a generated mesh in the first region
  229. PRINT *, ' == >> CREATING GENERATED MESH(1) << == '
  230. CALL CMISSGeneratedMesh_Initialise(GeneratedMesh1,Err)
  231. CALL CMISSGeneratedMesh_CreateStart(GeneratedMesh1UserNumber,Region1,GeneratedMesh1,Err)
  232. !Set up a regular x*y*z mesh
  233. CALL CMISSGeneratedMesh_TypeSet(GeneratedMesh1,CMISS_GENERATED_MESH_REGULAR_MESH_TYPE,Err)
  234. !Set the default basis
  235. CALL CMISSGeneratedMesh_BasisSet(GeneratedMesh1,Basis1,Err)
  236. !Define the mesh on the first region
  237. IF(NUMBER_GLOBAL_Z_ELEMENTS==0) THEN
  238. CALL CMISSGeneratedMesh_ExtentSet(GeneratedMesh1,(/WIDTH,HEIGHT/),Err)
  239. CALL CMISSGeneratedMesh_NumberOfElementsSet(GeneratedMesh1,(/NUMBER_GLOBAL_X_ELEMENTS, &
  240. & NUMBER_GLOBAL_Y_ELEMENTS/),Err)
  241. ELSE
  242. CALL CMISSGeneratedMesh_ExtentSet(GeneratedMesh1,(/WIDTH,HEIGHT,LENGTH/),Err)
  243. CALL CMISSGeneratedMesh_NumberOfElementsSet(GeneratedMesh1,(/NUMBER_GLOBAL_X_ELEMENTS, &
  244. & NUMBER_GLOBAL_Y_ELEMENTS,NUMBER_GLOBAL_Z_ELEMENTS/),Err)
  245. ENDIF
  246. !Finish the creation of a generated mesh in the first region
  247. CALL CMISSMesh_Initialise(Mesh1,Err)
  248. CALL CMISSGeneratedMesh_CreateFinish(GeneratedMesh1,Mesh1UserNumber,Mesh1,Err)
  249. !Start the creation of a generated mesh in the second region
  250. PRINT *, ' == >> CREATING GENERATED MESH(2) << == '
  251. CALL CMISSGeneratedMesh_Initialise(GeneratedMesh2,Err)
  252. CALL CMISSGeneratedMesh_CreateStart(GeneratedMesh2UserNumber,Region2,GeneratedMesh2,Err)
  253. !Set up a regular x*y*z mesh
  254. CALL CMISSGeneratedMesh_TypeSet(GeneratedMesh2,CMISS_GENERATED_MESH_REGULAR_MESH_TYPE,Err)
  255. !Set the default basis
  256. CALL CMISSGeneratedMesh_BasisSet(GeneratedMesh2,Basis2,Err)
  257. !Define the mesh on the second region
  258. IF(NUMBER_GLOBAL_Z_ELEMENTS==0) THEN
  259. CALL CMISSGeneratedMesh_OriginSet(GeneratedMesh2,(/WIDTH,0.0_CMISSDP/),Err)
  260. CALL CMISSGeneratedMesh_ExtentSet(GeneratedMesh2,(/WIDTH,HEIGHT/),Err)
  261. CALL CMISSGeneratedMesh_NumberOfElementsSet(GeneratedMesh2,(/NUMBER_GLOBAL_X_ELEMENTS, &
  262. & NUMBER_GLOBAL_Y_ELEMENTS/),Err)
  263. ELSE
  264. CALL CMISSGeneratedMesh_OriginSet(GeneratedMesh2,(/WIDTH,0.0_CMISSDP,0.0_CMISSDP/),Err)
  265. CALL CMISSGeneratedMesh_ExtentSet(GeneratedMesh2,(/WIDTH,HEIGHT,LENGTH/),Err)
  266. CALL CMISSGeneratedMesh_NumberOfElementsSet(GeneratedMesh2,(/NUMBER_GLOBAL_X_ELEMENTS, &
  267. & NUMBER_GLOBAL_Y_ELEMENTS,NUMBER_GLOBAL_Z_ELEMENTS/),Err)
  268. ENDIF
  269. !Finish the creation of a generated mesh in the second region
  270. CALL CMISSMesh_Initialise(Mesh2,Err)
  271. CALL CMISSGeneratedMesh_CreateFinish(GeneratedMesh2,Mesh2UserNumber,Mesh2,Err)
  272. !Create an interface between the two meshes
  273. PRINT *, ' == >> CREATING INTERFACE << == '
  274. CALL CMISSInterface_Initialise(Interface,Err)
  275. CALL CMISSInterface_CreateStart(InterfaceUserNumber,WorldRegion,Interface,Err)
  276. !Add in the two meshes
  277. CALL CMISSInterface_MeshAdd(Interface,Mesh1,Mesh1Index,Err)
  278. CALL CMISSInterface_MeshAdd(Interface,Mesh2,Mesh2Index,Err)
  279. !Finish creating the interface
  280. CALL CMISSInterface_CreateFinish(INTERFACE,Err)
  281. !Start the creation of a (bi)-linear-Lagrange basis
  282. PRINT *, ' == >> CREATING INTERFACE BASIS << == '
  283. CALL CMISSBasis_Initialise(InterfaceBasis,Err)
  284. CALL CMISSBasis_CreateStart(InterfaceBasisUserNumber,InterfaceBasis,Err)
  285. IF(NUMBER_GLOBAL_Z_ELEMENTS==0) THEN
  286. !Set the basis to be a linear Lagrange basis
  287. CALL CMISSBasis_NumberOfXiSet(InterfaceBasis,1,Err)
  288. CALL CMISSBasis_InterpolationXiSet(InterfaceBasis,(/CMISS_BASIS_LINEAR_LAGRANGE_INTERPOLATION/),Err)
  289. ELSE
  290. !Set the basis to be a bilinear Lagrange basis
  291. CALL CMISSBasis_NumberOfXiSet(InterfaceBasis,2,Err)
  292. CALL CMISSBasis_InterpolationXiSet(InterfaceBasis,(/CMISS_BASIS_QUADRATIC_LAGRANGE_INTERPOLATION, &
  293. & CMISS_BASIS_QUADRATIC_LAGRANGE_INTERPOLATION/),Err)
  294. ENDIF
  295. !Finish the creation of the basis
  296. CALL CMISSBasis_CreateFinish(InterfaceBasis,Err)
  297. !Start the creation of a generated mesh for the interface
  298. PRINT *, ' == >> CREATING INTERFACE GENERATED MESH << == '
  299. CALL CMISSGeneratedMesh_Initialise(InterfaceGeneratedMesh,Err)
  300. CALL CMISSGeneratedMesh_CreateStart(InterfaceGeneratedMeshUserNumber,Interface,InterfaceGeneratedMesh,Err)
  301. !Set up a regular x*y*z mesh
  302. CALL CMISSGeneratedMesh_TypeSet(InterfaceGeneratedMesh,CMISS_GENERATED_MESH_REGULAR_MESH_TYPE,Err)
  303. !Set the default basis
  304. CALL CMISSGeneratedMesh_BasisSet(InterfaceGeneratedMesh,InterfaceBasis,Err)
  305. !Define the mesh on the interface
  306. CALL CMISSGeneratedMesh_OriginSet(InterfaceGeneratedMesh,(/WIDTH,0.0_CMISSDP,0.0_CMISSDP/),Err)
  307. IF(NUMBER_GLOBAL_Z_ELEMENTS==0) THEN
  308. CALL CMISSGeneratedMesh_ExtentSet(InterfaceGeneratedMesh,(/WIDTH,HEIGHT,0.0_CMISSDP/),Err)
  309. CALL CMISSGeneratedMesh_NumberOfElementsSet(InterfaceGeneratedMesh,(/NUMBER_GLOBAL_Y_ELEMENTS/),Err)
  310. ELSE
  311. CALL CMISSGeneratedMesh_ExtentSet(InterfaceGeneratedMesh,(/WIDTH,HEIGHT,LENGTH/),Err)
  312. CALL CMISSGeneratedMesh_NumberOfElementsSet(InterfaceGeneratedMesh,(/NUMBER_GLOBAL_Y_ELEMENTS, &
  313. & NUMBER_GLOBAL_Z_ELEMENTS/),Err)
  314. ENDIF
  315. !Finish the creation of a generated mesh in interface
  316. CALL CMISSMesh_Initialise(InterfaceMesh,Err)
  317. CALL CMISSGeneratedMesh_CreateFinish(InterfaceGeneratedMesh,InterfaceMeshUserNumber,InterfaceMesh,Err)
  318. !Couple the interface meshes
  319. ! CALL CMISSInterfaceMeshConnectivity_CreateStart(Interface,InterfaceMeshConnectivity,Err)
  320. ! <<>> CALL COMMAND TO ADD MESHES CONNECTIVITY INFORMATION <<>> Dave + Sebo april 7.
  321. ! CMISSInterfaceMeshConnectivityMeshAdd()
  322. ! CMISSInterfaceMeshConnectivityElementsAdd()
  323. ! CMISSInterfaceMeshConnectivityXiPoint()
  324. ! CALL CMISSInterfaceMeshConnectivity_CreateFinish(InterfaceMeshConnectivity,Err)
  325. !Create a decomposition for mesh1
  326. PRINT *, ' == >> CREATING MESH(1) DECOMPOSITION << == '
  327. CALL CMISSDecomposition_Initialise(Decomposition1,Err)
  328. CALL CMISSDecomposition_CreateStart(Decomposition1UserNumber,Mesh1,Decomposition1,Err)
  329. !Set the decomposition to be a general decomposition with the specified number of domains
  330. CALL CMISSDecomposition_TypeSet(Decomposition1,CMISS_DECOMPOSITION_CALCULATED_TYPE,Err)
  331. CALL CMISSDecomposition_NumberOfDomainsSet(Decomposition1,NUMBER_OF_DOMAINS,Err)
  332. !Finish the decomposition
  333. CALL CMISSDecomposition_CreateFinish(Decomposition1,Err)
  334. !Create a decomposition for mesh2
  335. PRINT *, ' == >> CREATING MESH(2) DECOMPOSITION << == '
  336. CALL CMISSDecomposition_Initialise(Decomposition2,Err)
  337. CALL CMISSDecomposition_CreateStart(Decomposition2UserNumber,Mesh2,Decomposition2,Err)
  338. !Set the decomposition to be a general decomposition with the specified number of domains
  339. CALL CMISSDecomposition_TypeSet(Decomposition2,CMISS_DECOMPOSITION_CALCULATED_TYPE,Err)
  340. CALL CMISSDecomposition_NumberOfDomainsSet(Decomposition2,NUMBER_OF_DOMAINS,Err)
  341. !Finish the decomposition
  342. CALL CMISSDecomposition_CreateFinish(Decomposition2,Err)
  343. !Create a decomposition for the interface mesh
  344. PRINT *, ' == >> CREATING INTERFACE DECOMPOSITION << == '
  345. CALL CMISSDecomposition_Initialise(InterfaceDecomposition,Err)
  346. CALL CMISSDecomposition_CreateStart(InterfaceDecompositionUserNumber,InterfaceMesh,InterfaceDecomposition,Err)
  347. !Set the decomposition to be a general decomposition with the specified number of domains
  348. CALL CMISSDecomposition_TypeSet(InterfaceDecomposition,CMISS_DECOMPOSITION_CALCULATED_TYPE,Err)
  349. CALL CMISSDecomposition_NumberOfDomainsSet(InterfaceDecomposition,NUMBER_OF_DOMAINS,Err)
  350. !Finish the decomposition
  351. CALL CMISSDecomposition_CreateFinish(InterfaceDecomposition,Err)
  352. !Start to create a default (geometric) field on the first region
  353. PRINT *, ' == >> CREATING MESH(1) GEOMETRIC FIELD << == '
  354. CALL CMISSField_Initialise(GeometricField1,Err)
  355. CALL CMISSField_CreateStart(GeometricField1UserNumber,Region1,GeometricField1,Err)
  356. !Set the decomposition to use
  357. CALL CMISSField_MeshDecompositionSet(GeometricField1,Decomposition1,Err)
  358. !Set the domain to be used by the field components.
  359. CALL CMISSField_ComponentMeshComponentSet(GeometricField1,CMISS_FIELD_U_VARIABLE_TYPE,1,1,Err)
  360. CALL CMISSField_ComponentMeshComponentSet(GeometricField1,CMISS_FIELD_U_VARIABLE_TYPE,2,1,Err)
  361. IF(NUMBER_GLOBAL_Z_ELEMENTS/=0) THEN
  362. CALL CMISSField_ComponentMeshComponentSet(GeometricField1,CMISS_FIELD_U_VARIABLE_TYPE,3,1,Err)
  363. ENDIF
  364. !Finish creating the first field
  365. CALL CMISSField_CreateFinish(GeometricField1,Err)
  366. !Start to create a default (geometric) field on the second region
  367. PRINT *, ' == >> CREATING MESH(2) GEOMETRIC FIELD << == '
  368. CALL CMISSField_Initialise(GeometricField2,Err)
  369. CALL CMISSField_CreateStart(GeometricField2UserNumber,Region2,GeometricField2,Err)
  370. !Set the decomposition to use
  371. CALL CMISSField_MeshDecompositionSet(GeometricField2,Decomposition2,Err)
  372. !Set the domain to be used by the field components.
  373. CALL CMISSField_ComponentMeshComponentSet(GeometricField2,CMISS_FIELD_U_VARIABLE_TYPE,1,1,Err)
  374. CALL CMISSField_ComponentMeshComponentSet(GeometricField2,CMISS_FIELD_U_VARIABLE_TYPE,2,1,Err)
  375. IF(NUMBER_GLOBAL_Z_ELEMENTS/=0) THEN
  376. CALL CMISSField_ComponentMeshComponentSet(GeometricField2,CMISS_FIELD_U_VARIABLE_TYPE,3,1,Err)
  377. ENDIF
  378. !Finish creating the second field
  379. CALL CMISSField_CreateFinish(GeometricField2,Err)
  380. !Update the geometric field parameters for the first field
  381. CALL CMISSGeneratedMesh_GeometricParametersCalculate(GeneratedMesh1,GeometricField1,Err)
  382. !Update the geometric field parameters for the second field
  383. CALL CMISSGeneratedMesh_GeometricParametersCalculate(GeneratedMesh2,GeometricField2,Err)
  384. !Create the equations set for the first region
  385. PRINT *, ' == >> CREATING EQUATION SET(1) << == '
  386. CALL CMISSField_Initialise(EquationsSetField1,Err)
  387. CALL CMISSEquationsSet_Initialise(EquationsSet1,Err)
  388. CALL CMISSEquationsSet_CreateStart(EquationsSet1UserNumber,Region1,GeometricField1,CMISS_EQUATIONS_SET_CLASSICAL_FIELD_CLASS, &
  389. & CMISS_EQUATIONS_SET_LAPLACE_EQUATION_TYPE,CMISS_EQUATIONS_SET_STANDARD_LAPLACE_SUBTYPE,EquationsSetField1UserNumber,&
  390. & EquationsSetField1,EquationsSet1,Err)
  391. !Set the equations set to be a standard Laplace problem
  392. !Finish creating the equations set
  393. CALL CMISSEquationsSet_CreateFinish(EquationsSet1,Err)
  394. !Create the equations set for the second region
  395. PRINT *, ' == >> CREATING EQUATION SET(2) << == '
  396. CALL CMISSField_Initialise(EquationsSetField2,Err)
  397. CALL CMISSEquationsSet_Initialise(EquationsSet2,Err)
  398. CALL CMISSEquationsSet_CreateStart(EquationsSet2UserNumber,Region2,GeometricField2,CMISS_EQUATIONS_SET_CLASSICAL_FIELD_CLASS, &
  399. & CMISS_EQUATIONS_SET_LAPLACE_EQUATION_TYPE,CMISS_EQUATIONS_SET_STANDARD_LAPLACE_SUBTYPE,EquationsSetField2UserNumber,&
  400. & EquationsSetField2,EquationsSet2,Err)
  401. !Finish creating the equations set
  402. CALL CMISSEquationsSet_CreateFinish(EquationsSet2,Err)
  403. !Create the equations set dependent field variables for the first equations set
  404. PRINT *, ' == >> CREATING DEPENDENT FIELD(1) << == '
  405. CALL CMISSField_Initialise(DependentField1,Err)
  406. CALL CMISSEquationsSet_DependentCreateStart(EquationsSet1,DependentField1UserNumber,DependentField1,Err)
  407. !Finish the equations set dependent field variables
  408. CALL CMISSEquationsSet_DependentCreateFinish(EquationsSet1,Err)
  409. !Create the equations set dependent field variables for the second equations set
  410. PRINT *, ' == >> CREATING DEPENDENT FIELD(2) << == '
  411. CALL CMISSField_Initialise(DependentField2,Err)
  412. CALL CMISSEquationsSet_DependentCreateStart(EquationsSet2,DependentField2UserNumber,DependentField2,Err)
  413. !Finish the equations set dependent field variables
  414. CALL CMISSEquationsSet_DependentCreateFinish(EquationsSet2,Err)
  415. !Create the equations set equations for the first equations set
  416. PRINT *, ' == >> CREATING EQUATIONS(1) << == '
  417. CALL CMISSEquations_Initialise(Equations1,Err)
  418. CALL CMISSEquationsSet_EquationsCreateStart(EquationsSet1,Equations1,Err)
  419. !Set the equations matrices sparsity type
  420. CALL CMISSEquations_SparsityTypeSet(Equations1,CMISS_EQUATIONS_SPARSE_MATRICES,Err)
  421. !Set the equations set output
  422. !CALL CMISSEquations_OutputTypeSet(Equations1,CMISS_EQUATIONS_NO_OUTPUT,Err)
  423. CALL CMISSEquations_OutputTypeSet(Equations1,CMISS_EQUATIONS_TIMING_OUTPUT,Err)
  424. !CALL CMISSEquations_OutputTypeSet(Equations1,CMISS_EQUATIONS_MATRIX_OUTPUT,Err)
  425. !CALL CMISSEquations_OutputTypeSet(Equations1,CMISS_EQUATIONS_ELEMENT_MATRIX_OUTPUT,Err)
  426. !Finish the equations set equations
  427. CALL CMISSEquationsSet_EquationsCreateFinish(EquationsSet1,Err)
  428. !Create the equations set equations for the second equations set
  429. PRINT *, ' == >> CREATING EQUATIONS(2) << == '
  430. CALL CMISSEquations_Initialise(Equations2,Err)
  431. CALL CMISSEquationsSet_EquationsCreateStart(EquationsSet2,Equations2,Err)
  432. !Set the equations matrices sparsity type
  433. CALL CMISSEquations_SparsityTypeSet(Equations2,CMISS_EQUATIONS_SPARSE_MATRICES,Err)
  434. !Set the equations set output
  435. !CALL CMISSEquations_OutputTypeSet(Equations2,CMISS_EQUATIONS_NO_OUTPUT,Err)
  436. CALL CMISSEquations_OutputTypeSet(Equations2,CMISS_EQUATIONS_TIMING_OUTPUT,Err)
  437. !CALL CMISSEquations_OutputTypeSet(Equations2,CMISS_EQUATIONS_MATRIX_OUTPUT,Err)
  438. !CALL CMISSEquations_OutputTypeSet(Equations2,CMISS_EQUATIONS_ELEMENT_MATRIX_OUTPUT,Err)
  439. !Finish the equations set equations
  440. CALL CMISSEquationsSet_EquationsCreateFinish(EquationsSet2,Err)
  441. !Start to create a default (geometric) field on the Interface
  442. PRINT *, ' == >> CREATING INTERFACE GEOMETRIC FIELD << == '
  443. CALL CMISSField_Initialise(InterfaceGeometricField,Err)
  444. CALL CMISSField_CreateStart(InterfaceGeometricFieldUserNumber,Interface,InterfaceGeometricField,Err)
  445. !Set the decomposition to use
  446. CALL CMISSField_MeshDecompositionSet(InterfaceGeometricField,InterfaceDecomposition,Err)
  447. !Set the domain to be used by the field components.
  448. CALL CMISSField_ComponentMeshComponentSet(InterfaceGeometricField,CMISS_FIELD_U_VARIABLE_TYPE,1,1,Err)
  449. CALL CMISSField_ComponentMeshComponentSet(InterfaceGeometricField,CMISS_FIELD_U_VARIABLE_TYPE,2,1,Err)
  450. IF(NUMBER_GLOBAL_Z_ELEMENTS/=0) THEN
  451. CALL CMISSField_ComponentMeshComponentSet(InterfaceGeometricField,CMISS_FIELD_U_VARIABLE_TYPE,3,1,Err)
  452. ENDIF
  453. !Finish creating the first field
  454. CALL CMISSField_CreateFinish(InterfaceGeometricField,Err)
  455. !Update the geometric field parameters for the interface field
  456. CALL CMISSGeneratedMesh_GeometricParametersCalculate(InterfaceGeneratedMesh,InterfaceGeometricField,Err)
  457. ! << ACCESS LATER >>>
  458. !Create an interface condition between the two meshes
  459. CALL CMISSInterfaceCondition_Initialise(InterfaceCondition,Err)
  460. CALL CMISSInterfaceCondition_CreateStart(InterfaceConditionUserNumber,Interface,InterfaceGeometricField, &
  461. & InterfaceCondition,Err)
  462. !Specify the method for the interface condition
  463. CALL CMISSInterfaceCondition_MethodSet(InterfaceCondition,CMISS_INTERFACE_CONDITION_LAGRANGE_MULTIPLIERS_METHOD,Err)
  464. !Specify the type of interface condition operator
  465. CALL CMISSInterfaceCondition_OperatorSet(InterfaceCondition,CMISS_INTERFACE_CONDITION_FIELD_CONTINUITY_OPERATOR,Err)
  466. !Add in the dependent variables
  467. CALL CMISSInterfaceCondition_DependentVariableAdd(InterfaceCondition,Mesh1Index,DependentField1, &
  468. & CMISS_FIELD_U_VARIABLE_TYPE,Err)
  469. CALL CMISSInterfaceCondition_DependentVariableAdd(InterfaceCondition,Mesh2Index,DependentField2, &
  470. & CMISS_FIELD_U_VARIABLE_TYPE,Err)
  471. !Finish creating the interface condition
  472. CALL CMISSInterfaceCondition_CreateFinish(InterfaceCondition,Err)
  473. !Create the Lagrange multipliers field
  474. PRINT *, ' == >> CREATING INTERFACE LAGRANGE FIELD << == '
  475. CALL CMISSField_Initialise(LagrangeField,Err)
  476. CALL CMISSInterfaceCondition_LagrangeFieldCreateStart(InterfaceCondition,LagrangeFieldUserNumber, &
  477. & LagrangeField,Err)
  478. !Finish the Lagrange multipliers field
  479. CALL CMISSInterfaceCondition_LagrangeFieldCreateFinish(InterfaceCondition,Err)
  480. !Create the interface condition equations
  481. PRINT *, ' == >> CREATING INTERFACE EQUATIONS << == '
  482. CALL CMISSInterfaceEquations_Initialise(InterfaceEquations,Err)
  483. CALL CMISSInterfaceCondition_EquationsCreateStart(InterfaceCondition,InterfaceEquations,Err)
  484. !Set the interface equations sparsity
  485. CALL CMISSInterfaceEquations_SparsitySet(InterfaceEquations,CMISS_EQUATIONS_SPARSE_MATRICES,Err)
  486. !Set the interface equations output
  487. CALL CMISSInterfaceEquations_OutputTypeSet(InterfaceEquations,CMISS_EQUATIONS_TIMING_OUTPUT,Err)
  488. !Finish creating the interface equations
  489. CALL CMISSInterfaceCondition_EquationsCreateFinish(InterfaceCondition,Err)
  490. !Start the creation of a coupled problem.
  491. CALL CMISSProblem_Initialise(CoupledProblem,Err)
  492. CALL CMISSProblem_CreateStart(CoupledProblemUserNumber,CoupledProblem,Err)
  493. !Set the problem to be a standard Laplace problem
  494. CALL CMISSProblem_SpecificationSet(CoupledProblem,CMISS_PROBLEM_CLASSICAL_FIELD_CLASS, &
  495. & CMISS_PROBLEM_LAPLACE_EQUATION_TYPE,CMISS_PROBLEM_STANDARD_LAPLACE_SUBTYPE,Err)
  496. !Finish the creation of a problem.
  497. CALL CMISSProblem_CreateFinish(CoupledProblem,Err)
  498. !Start the creation of the problem control loop for the coupled problem
  499. CALL CMISSProblem_ControlLoopCreateStart(CoupledProblem,Err)
  500. !Finish creating the problem control loop
  501. CALL CMISSProblem_ControlLoopCreateFinish(CoupledProblem,Err)
  502. !Start the creation of the problem solver for the coupled problem
  503. CALL CMISSSolver_Initialise(CoupledSolver,Err)
  504. CALL CMISSProblem_SolversCreateStart(CoupledProblem,Err)
  505. CALL CMISSProblem_SolverGet(CoupledProblem,CMISS_CONTROL_LOOP_NODE,1,CoupledSolver,Err)
  506. !CALL CMISSSolver_OutputTypeSet(CoupledSolver,CMISS_SOLVER_NO_OUTPUT,Err)
  507. !CALL CMISSSolver_OutputTypeSet(CoupledSolver,CMISS_SOLVER_PROGRESS_OUTPUT,Err)
  508. !CALL CMISSSolver_OutputTypeSet(CoupledSolver,CMISS_SOLVER_TIMING_OUTPUT,Err)
  509. !CALL CMISSSolver_OutputTypeSet(CoupledSolver,CMISS_SOLVER_SOLVER_OUTPUT,Err)
  510. CALL CMISSSolver_OutputTypeSet(CoupledSolver,CMISS_SOLVER_MATRIX_OUTPUT,Err)
  511. !Finish the creation of the problem solver
  512. CALL CMISSProblem_SolversCreateFinish(CoupledProblem,Err)
  513. !Start the creation of the problem solver equations for the coupled problem
  514. CALL CMISSSolver_Initialise(CoupledSolver,Err)
  515. CALL CMISSSolverEquations_Initialise(CoupledSolverEquations,Err)
  516. CALL CMISSProblem_SolverEquationsCreateStart(CoupledProblem,Err)
  517. !Get the solve equations
  518. CALL CMISSProblem_SolverGet(CoupledProblem,CMISS_CONTROL_LOOP_NODE,1,CoupledSolver,Err)
  519. CALL CMISSSolver_SolverEquationsGet(CoupledSolver,CoupledSolverEquations,Err)
  520. !Set the solver equations sparsity
  521. CALL CMISSSolverEquations_SparsityTypeSet(CoupledSolverEquations,CMISS_SOLVER_SPARSE_MATRICES,Err)
  522. !CALL CMISSSolverEquations_SparsityTypeSet(CoupledSolverEquations,CMISS_SOLVER_FULL_MATRICES,Err)
  523. !Add in the first equations set
  524. CALL CMISSSolverEquations_EquationsSetAdd(CoupledSolverEquations,EquationsSet1,EquationsSet1Index,Err)
  525. !Add in the second equations set
  526. CALL CMISSSolverEquations_EquationsSetAdd(CoupledSolverEquations,EquationsSet2,EquationsSet2Index,Err)
  527. !Add in the interface condition
  528. CALL CMISSSolverEquations_InterfaceConditionAdd(CoupledSolverEquations,InterfaceCondition, &
  529. & InterfaceConditionIndex,Err)
  530. !Finish the creation of the problem solver equations
  531. CALL CMISSProblem_SolverEquationsCreateFinish(CoupledProblem,Err)
  532. !Start the creation of the equations set boundary conditions for both equations sets
  533. PRINT *, ' == >> CREATING BOUNDARY CONDITIONS << == '
  534. CALL CMISSBoundaryConditions_Initialise(BoundaryConditions,Err)
  535. CALL CMISSSolverEquations_BoundaryConditionsCreateStart(CoupledSolverEquations,BoundaryConditions,Err)
  536. !Set the first node to 0.0
  537. FirstNodeNumber=1
  538. CALL CMISSDecomposition_NodeDomainGet(Decomposition1,FirstNodeNumber,1,FirstNodeDomain,Err)
  539. IF(FirstNodeDomain==ComputationalNodeNumber) THEN
  540. CALL CMISSBoundaryConditions_SetNode(BoundaryConditions,DependentField1,CMISS_FIELD_U_VARIABLE_TYPE,1,1,FirstNodeNumber,1, &
  541. & CMISS_BOUNDARY_CONDITION_FIXED,0.0_CMISSDP,Err)
  542. ENDIF
  543. !Set the last node to 1.0
  544. IF(NUMBER_GLOBAL_Z_ELEMENTS==0) THEN
  545. LastNodeNumber=(NUMBER_GLOBAL_X_ELEMENTS+1)*(NUMBER_GLOBAL_Y_ELEMENTS+1)
  546. ELSE
  547. LastNodeNumber=(NUMBER_GLOBAL_X_ELEMENTS+1)*(NUMBER_GLOBAL_Y_ELEMENTS+1)*(NUMBER_GLOBAL_Z_ELEMENTS+1)
  548. ENDIF
  549. CALL CMISSDecomposition_NodeDomainGet(Decomposition2,LastNodeNumber,1,LastNodeDomain,Err)
  550. IF(LastNodeDomain==ComputationalNodeNumber) THEN
  551. CALL CMISSBoundaryConditions_SetNode(BoundaryConditions,DependentField2,CMISS_FIELD_U_VARIABLE_TYPE,1,1,LastNodeNumber,1, &
  552. & CMISS_BOUNDARY_CONDITION_FIXED,1.0_CMISSDP,Err)
  553. ENDIF
  554. !Finish the creation of the equations set boundary conditions
  555. CALL CMISSSolverEquations_BoundaryConditionsCreateFinish(CoupledSolverEquations,Err)
  556. !Solve the problem
  557. CALL CMISSProblem_Solve(CoupledProblem,Err)
  558. EXPORT_FIELD=.TRUE.
  559. IF(EXPORT_FIELD) THEN
  560. CALL CMISSFields_Initialise(Fields1,Err)
  561. CALL CMISSFields_Create(Region1,Fields1,Err)
  562. CALL CMISSFields_NodesExport(Fields1,"TwoRegion_1","FORTRAN",Err)
  563. CALL CMISSFields_ElementsExport(Fields1,"TwoRegion_1","FORTRAN",Err)
  564. CALL CMISSFields_Finalise(Fields1,Err)
  565. CALL CMISSFields_Initialise(Fields2,Err)
  566. CALL CMISSFields_Create(Region2,Fields2,Err)
  567. CALL CMISSFields_NodesExport(Fields2,"TwoRegion_2","FORTRAN",Err)
  568. CALL CMISSFields_ElementsExport(Fields2,"TwoRegion_2","FORTRAN",Err)
  569. CALL CMISSFields_Finalise(Fields2,Err)
  570. CALL CMISSFields_Initialise(InterfaceFields,Err)
  571. CALL CMISSFields_Create(Interface,InterfaceFields,Err)
  572. CALL CMISSFields_NodesExport(InterfaceFields,"TwoRegion_Interface","FORTRAN",Err)
  573. CALL CMISSFields_ElementsExport(InterfaceFields,"TwoRegion_Interface","FORTRAN",Err)
  574. CALL CMISSFields_Finalise(InterfaceFields,Err)
  575. ENDIF
  576. !Finialise CMISS
  577. !CALL CMISSFinalise(Err)
  578. WRITE(*,'(A)') "Program successfully completed."
  579. STOP
  580. END PROGRAM TWOREGIONSEXAMPLE