/DataProjection/1DRectangularCartesian/src/1DRectangularCartesianExample.f90

http://github.com/xyan075/examples · Fortran Modern · 306 lines · 182 code · 55 blank · 69 comment · 0 complexity · 41f5f9a18a4ed665832274fef9a29a24 MD5 · raw file

  1. !> \file
  2. !> \author Tim Wu
  3. !> \brief This is an example program to solve 3D data points projecting onto 1D cartesian elements 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): Code based on the examples by Kumar Mithraratne and Prasad Babarenda Gamage
  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. !> Main program
  41. PROGRAM DataProjection1DRectangularCartesian
  42. USE MPI
  43. USE OPENCMISS
  44. #ifdef WIN32
  45. USE IFQWIN
  46. #endif
  47. IMPLICIT NONE
  48. !Program parameters
  49. INTEGER(CMISSIntg),PARAMETER :: BasisUserNumber=1
  50. INTEGER(CMISSIntg),PARAMETER :: CoordinateSystemDimension=3
  51. INTEGER(CMISSIntg),PARAMETER :: CoordinateSystemUserNumber=1
  52. INTEGER(CMISSIntg),PARAMETER :: DecompositionUserNumber=1
  53. INTEGER(CMISSIntg),PARAMETER :: FieldUserNumber=1
  54. INTEGER(CMISSIntg),PARAMETER :: MeshUserNumber=1
  55. INTEGER(CMISSIntg),PARAMETER :: RegionUserNumber=1
  56. REAL(CMISSDP), PARAMETER :: CoordinateSystemOrigin(3)=(/0.0_CMISSDP,0.0_CMISSDP,0.0_CMISSDP/)
  57. !Program types
  58. !Program variables
  59. INTEGER(CMISSIntg) :: MeshComponentNumber=1
  60. INTEGER(CMISSIntg) :: MeshDimensions=1
  61. INTEGER(CMISSIntg) :: MeshNumberOfElements
  62. INTEGER(CMISSIntg) :: MeshNumberOfComponents=1
  63. INTEGER(CMISSIntg) :: NumberOfDomains=2
  64. INTEGER(CMISSIntg) :: NumberOfNodes
  65. INTEGER(CMISSIntg) :: NumberOfXi=1
  66. INTEGER(CMISSIntg) :: BasisInterpolation(1)=(/CMISS_BASIS_CUBIC_HERMITE_INTERPOLATION/)
  67. INTEGER(CMISSIntg) :: WorldCoordinateSystemUserNumber
  68. INTEGER(CMISSIntg) :: WorldRegionUserNumber
  69. INTEGER(CMISSIntg) :: FieldNumberOfVariables=1
  70. INTEGER(CMISSIntg) :: FieldNumberOfComponents=3
  71. INTEGER(CMISSIntg) :: np,el,xi,ver_idx,der_idx,node_idx,comp_idx
  72. REAL(CMISSDP), DIMENSION(5,3) :: DataPointValues !(number_of_data_points,dimension)
  73. INTEGER(CMISSIntg), DIMENSION(5,2) :: ElementUserNodes
  74. REAL(CMISSDP), DIMENSION(2,6,3) :: FieldValues
  75. !Test variables
  76. REAL(CMISSDP) :: AbsoluteToleranceSet=1.0E-10_CMISSDP !default is 1.0E-8
  77. REAL(CMISSDP) :: RelativeToleranceSet=1.0E-6_CMISSDP !default is 1.0E-8
  78. INTEGER(CMISSIntg) :: MaximumNumberOfIterationsSet=30 !default is 25
  79. REAL(CMISSDP) :: MaximumIterationUpdateSet=0.4_CMISSDP !default is 0.5
  80. INTEGER(CMISSIntg) :: NumberOfClosestElementsSet=3 !default is 2/4/8 for 1/2/3 dimensional projection
  81. INTEGER(CMISSIntg) :: ProjectionTypeSet=CMISS_DATA_PROJECTION_ALL_ELEMENTS_PROJECTION_TYPE !same as default
  82. REAL(CMISSDP) :: StartingXiSet(1)=[0.4_CMISSDP] !default is 0.5
  83. REAL(CMISSDP) :: AbsoluteToleranceGet
  84. REAL(CMISSDP) :: RelativeToleranceGet
  85. INTEGER(CMISSIntg) :: MaximumNumberOfIterationsGet
  86. REAL(CMISSDP) :: MaximumIterationUpdateGet
  87. INTEGER(CMISSIntg) :: NumberOfClosestElementsGet
  88. INTEGER(CMISSIntg) :: ProjectionTypeGet
  89. REAL(CMISSDP), ALLOCATABLE :: StartingXiGet(:)
  90. #ifdef WIN32
  91. !Quickwin type
  92. LOGICAL :: QUICKWIN_STATUS=.FALSE.
  93. TYPE(WINDOWCONFIG) :: QUICKWIN_WINDOW_CONFIG
  94. #endif
  95. !Generic CMISS and MPI variables
  96. INTEGER(CMISSIntg) :: Err
  97. INTEGER(CMISSIntg) :: NUMBER_GLOBAL_X_ELEMENTS=1 !<number of elements on x axis
  98. INTEGER(CMISSIntg) :: NUMBER_GLOBAL_Y_ELEMENTS=1 !<number of elements on y axis
  99. INTEGER(CMISSIntg) :: NUMBER_GLOBAL_Z_ELEMENTS=1 !<number of elements on z axis
  100. INTEGER(CMISSIntg) :: NUMBER_OF_DOMAINS=1
  101. INTEGER(CMISSIntg) :: MPI_IERROR
  102. #ifdef WIN32
  103. !Initialise QuickWin
  104. QUICKWIN_WINDOW_CONFIG%TITLE="General Output" !Window title
  105. QUICKWIN_WINDOW_CONFIG%NUMTEXTROWS=-1 !Max possible number of rows
  106. QUICKWIN_WINDOW_CONFIG%MODE=QWIN$SCROLLDOWN
  107. !Set the window parameters
  108. QUICKWIN_STATUS=SETWINDOWCONFIG(QUICKWIN_WINDOW_CONFIG)
  109. !If attempt fails set with system estimated values
  110. IF(.NOT.QUICKWIN_STATUS) QUICKWIN_STATUS=SETWINDOWCONFIG(QUICKWIN_WINDOW_CONFIG)
  111. #endif
  112. !Intialise data points
  113. DataPointValues(1,:)=[20.5_CMISSDP,1.8_CMISSDP,0.0_CMISSDP]
  114. DataPointValues(2,:)=[33.2_CMISSDP,-4.8_CMISSDP,0.0_CMISSDP]
  115. DataPointValues(3,:)=[9.6_CMISSDP,10.0_CMISSDP,0.0_CMISSDP]
  116. DataPointValues(4,:)=[50.0_CMISSDP,-3.0_CMISSDP,6.0_CMISSDP]
  117. DataPointValues(5,:)=[44.0_CMISSDP,10.0_CMISSDP,18.6_CMISSDP]
  118. ElementUserNodes(1,:)=[1,2]
  119. ElementUserNodes(2,:)=[2,3]
  120. ElementUserNodes(3,:)=[3,4]
  121. ElementUserNodes(4,:)=[4,5]
  122. ElementUserNodes(5,:)=[5,6]
  123. FieldValues(1,1,:)=[0.0_CMISSDP,0.0_CMISSDP,0.0_CMISSDP] !no der, node 1
  124. FieldValues(2,1,:)=[10.0_CMISSDP,0.0_CMISSDP,0.0_CMISSDP] !first der, node 1
  125. FieldValues(1,2,:)=[10.0_CMISSDP,0.0_CMISSDP,0.0_CMISSDP] !no der, node 2
  126. FieldValues(2,2,:)=[10.0_CMISSDP,-10.0_CMISSDP,0.0_CMISSDP] !first der, node 2
  127. FieldValues(1,3,:)=[20.0_CMISSDP,0.0_CMISSDP,0.0_CMISSDP] !no der, node 3
  128. FieldValues(2,3,:)=[10.0_CMISSDP,20.0_CMISSDP,0.0_CMISSDP] !first der, node 3
  129. FieldValues(1,4,:)=[30.0_CMISSDP,0.0_CMISSDP,0.0_CMISSDP] !no der, node 4
  130. FieldValues(2,4,:)=[10.0_CMISSDP,10.0_CMISSDP,0.0_CMISSDP] !first der, node 4
  131. FieldValues(1,5,:)=[40.0_CMISSDP,0.0_CMISSDP,0.0_CMISSDP] !no der, node 5
  132. FieldValues(2,5,:)=[10.0_CMISSDP,-15.0_CMISSDP,0.0_CMISSDP] !first der, node 5
  133. FieldValues(1,6,:)=[50.0_CMISSDP,0.0_CMISSDP,0.0_CMISSDP] !no der, node 6
  134. FieldValues(2,6,:)=[10.0_CMISSDP,-5.0_CMISSDP,0.0_CMISSDP] !first der, node 6
  135. !Intialise cmiss
  136. CALL CMISSInitialise(WorldCoordinateSystemUserNumber,WorldRegionUserNumber,Err)
  137. !Broadcast the number of Elements in the X & Y directions and the number of partitions to the other computational nodes
  138. CALL MPI_BCAST(NUMBER_GLOBAL_X_ELEMENTS,1,MPI_INTEGER,0,MPI_COMM_WORLD,MPI_IERROR)
  139. CALL MPI_BCAST(NUMBER_GLOBAL_Y_ELEMENTS,1,MPI_INTEGER,0,MPI_COMM_WORLD,MPI_IERROR)
  140. CALL MPI_BCAST(NUMBER_GLOBAL_Z_ELEMENTS,1,MPI_INTEGER,0,MPI_COMM_WORLD,MPI_IERROR)
  141. CALL MPI_BCAST(NUMBER_OF_DOMAINS,1,MPI_INTEGER,0,MPI_COMM_WORLD,MPI_IERROR)
  142. !=========================================================================================================================
  143. !Create RC coordinate system
  144. CALL CMISSCoordinateSystem_CreateStart(CoordinateSystemUserNumber,Err)
  145. CALL CMISSCoordinateSystem_TypeSet(CoordinateSystemUserNumber,CMISS_COORDINATE_RECTANGULAR_CARTESIAN_TYPE,Err)
  146. CALL CMISSCoordinateSystem_DimensionSet(CoordinateSystemUserNumber,CoordinateSystemDimension,Err)
  147. CALL CMISSCoordinateSystem_OriginSet(CoordinateSystemUserNumber,CoordinateSystemOrigin,Err)
  148. CALL CMISSCoordinateSystem_CreateFinish(CoordinateSystemUserNumber,Err)
  149. !=========================================================================================================================
  150. !Create Region and set CS to newly created 3D RC CS
  151. CALL CMISSRegion_CreateStart(RegionUserNumber,WorldRegionUserNumber,Err)
  152. CALL CMISSRegion_CoordinateSystemSet(RegionUserNumber,CoordinateSystemUserNumber,Err)
  153. CALL CMISSRegion_CreateFinish(RegionUserNumber,Err)
  154. !=========================================================================================================================
  155. !Create Data Points and set the values
  156. CALL CMISSDataPoints_CreateStart(RegionUserNumber,SIZE(DataPointValues,1),Err)
  157. DO np=1,SIZE(DataPointValues,1)
  158. CALL CMISSDataPoints_ValuesSet(RegionUserNumber,np,DataPointValues(np,:),Err)
  159. ENDDO
  160. CALL CMISSDataPoints_CreateFinish(RegionUserNumber,Err)
  161. !=========================================================================================================================
  162. !Define basis function - 1D cubic hermite
  163. CALL CMISSBasis_CreateStart(BasisUserNumber,Err)
  164. CALL CMISSBasis_TypeSet(BasisUserNumber,CMISS_BASIS_LAGRANGE_HERMITE_TP_TYPE,Err)
  165. CALL CMISSBasis_NumberOfXiSet(BasisUserNumber,NumberOfXi,Err)
  166. CALL CMISSBasis_InterpolationXiSet(BasisUserNumber,BasisInterpolation,Err)
  167. CALL CMISSBasis_CreateFinish(BasisUserNumber,Err)
  168. !=========================================================================================================================
  169. !Create a mesh
  170. MeshNumberOfElements=SIZE(ElementUserNodes,1)
  171. CALL CMISSMesh_CreateStart(MeshUserNumber,RegionUserNumber,MeshDimensions,Err)
  172. CALL CMISSMesh_NumberOfComponentsSet(RegionUserNumber,MeshUserNumber,MeshNumberOfComponents,Err)
  173. CALL CMISSMesh_NumberOfElementsSet(RegionUserNumber,MeshUserNumber,MeshNumberOfElements,Err)
  174. !define nodes for the mesh
  175. NumberOfNodes=SIZE(FieldValues,2)
  176. CALL CMISSNodes_CreateStart(RegionUserNumber,NumberOfNodes,Err)
  177. CALL CMISSNodes_CreateFinish(RegionUserNumber,Err)
  178. !define elements for the mesh
  179. CALL CMISSMeshElements_CreateStart(RegionUserNumber,MeshUserNumber,MeshComponentNumber,BasisUserNumber,Err)
  180. Do el=1,MeshNumberOfElements
  181. CALL CMISSMeshElements_NodesSet(RegionUserNumber,MeshUserNumber,MeshComponentNumber,el,ElementUserNodes(el,:),Err)
  182. ENDDO
  183. CALL CMISSMeshElements_CreateFinish(RegionUserNumber,MeshUserNumber,MeshComponentNumber,Err)
  184. CALL CMISSMesh_CreateFinish(RegionUserNumber,MeshUserNumber,Err)
  185. !=========================================================================================================================
  186. !Create a mesh decomposition
  187. CALL CMISSDecomposition_CreateStart(DecompositionUserNumber,RegionUserNumber,MeshUserNumber,Err)
  188. CALL CMISSDecomposition_TypeSet(RegionUserNumber,MeshUserNumber,DecompositionUserNumber,CMISS_DECOMPOSITION_CALCULATED_TYPE,Err)
  189. CALL CMISSDecomposition_NumberOfDomainsSet(RegionUserNumber,MeshUserNumber,DecompositionUserNumber,NumberOfDomains,Err)
  190. CALL CMISSDecomposition_CreateFinish(RegionUserNumber,MeshUserNumber,DecompositionUserNumber,Err)
  191. !=========================================================================================================================
  192. !Create a field to put the geometry
  193. CALL CMISSField_CreateStart(FieldUserNumber,RegionUserNumber,Err)
  194. CALL CMISSField_MeshDecompositionSet(RegionUserNumber,FieldUserNumber,MeshUserNumber,DecompositionUserNumber,Err)
  195. CALL CMISSField_TypeSet(RegionUserNumber,FieldUserNumber,CMISS_FIELD_GEOMETRIC_TYPE,Err)
  196. CALL CMISSField_NumberOfVariablesSet(RegionUserNumber,FieldUserNumber,FieldNumberOfVariables,Err)
  197. CALL CMISSField_NumberOfComponentsSet(RegionUserNumber,FieldUserNumber,CMISS_FIELD_U_VARIABLE_TYPE,FieldNumberOfComponents,Err)
  198. DO xi=1,NumberOfXi
  199. CALL CMISSField_ComponentMeshComponentSet(RegionUserNumber,FieldUserNumber,CMISS_FIELD_U_VARIABLE_TYPE,xi,xi,Err)
  200. ENDDO !xi
  201. CALL CMISSField_CreateFinish(RegionUserNumber,FieldUserNumber,Err)
  202. !node 1
  203. ver_idx=1 ! version number
  204. DO der_idx=1,SIZE(FieldValues,1)
  205. DO node_idx=1,SIZE(FieldValues,2)
  206. DO comp_idx=1,SIZE(FieldValues,3)
  207. CALL CMISSField_ParameterSetUpdateNode(RegionUserNumber,FieldUserNumber,CMISS_FIELD_U_VARIABLE_TYPE, &
  208. & CMISS_FIELD_VALUES_SET_TYPE, &
  209. & ver_idx,der_idx,node_idx,comp_idx,FieldValues(der_idx,node_idx,comp_idx),Err)
  210. ENDDO
  211. ENDDO
  212. ENDDO
  213. !=========================================================================================================================
  214. !Create a data projection
  215. CALL CMISSDataProjection_CreateStart(RegionUserNumber,FieldUserNumber,RegionUserNumber,Err)
  216. !=========================================================================================================================
  217. !Test parameter set functions
  218. CALL CMISSDataProjection_AbsoluteToleranceSet(RegionUserNumber,AbsoluteToleranceSet,Err) !test
  219. CALL CMISSDataProjection_MaximumIterationUpdateSet(RegionUserNumber,MaximumIterationUpdateSet,Err) !test
  220. CALL CMISSDataProjection_MaximumNumberOfIterationsSet(RegionUserNumber,MaximumNumberOfIterationsSet,Err) !test
  221. CALL CMISSDataProjection_NumberOfClosestElementsSet(RegionUserNumber,NumberOfClosestElementsSet,Err) !test
  222. CALL CMISSDataProjection_ProjectionTypeSet(RegionUserNumber,ProjectionTypeSet,Err)
  223. CALL CMISSDataProjection_RelativeToleranceSet(RegionUserNumber,RelativeToleranceSet,Err) !test
  224. CALL CMISSDataProjection_StartingXiSet(RegionUserNumber,StartingXiSet,Err) !test
  225. !=========================================================================================================================
  226. !Finish data projection
  227. CALL CMISSDataProjection_CreateFinish(RegionUserNumber,Err)
  228. !=========================================================================================================================
  229. !Test parameter get functions
  230. CALL CMISSDataProjection_AbsoluteToleranceGet(RegionUserNumber,AbsoluteToleranceGet,Err) !test
  231. CALL CMISSDataProjection_MaximumIterationUpdateGet(RegionUserNumber,MaximumIterationUpdateGet,Err) !test
  232. CALL CMISSDataProjection_MaximumNumberOfIterationsGet(RegionUserNumber,MaximumNumberOfIterationsGet,Err) !test
  233. CALL CMISSDataProjection_NumberOfClosestElementsGet(RegionUserNumber,NumberOfClosestElementsGet,Err) !test
  234. CALL CMISSDataProjection_ProjectionTypeGet(RegionUserNumber,ProjectionTypeGet,Err) !test
  235. CALL CMISSDataProjection_RelativeToleranceGet(RegionUserNumber,RelativeToleranceGet,Err) !test
  236. CALL CMISSDataProjection_StartingXiGet(RegionUserNumber,StartingXiGet,Err) !test
  237. !=========================================================================================================================
  238. !Start data projection
  239. CALL CMISSDataProjection_Evaluate(RegionUserNumber,Err)
  240. !=========================================================================================================================
  241. !Destroy used types
  242. CALL CMISSDataProjection_Destroy(RegionUserNumber,Err)
  243. CALL CMISSDataPoints_Destroy(RegionUserNumber,Err)
  244. CALL CMISSRegion_Destroy(RegionUserNumber,Err)
  245. CALL CMISSCoordinateSystem_Destroy(CoordinateSystemUserNumber,Err)
  246. !=========================================================================================================================
  247. !Finishing program
  248. CALL CMISSFinalise(Err)
  249. WRITE(*,'(A)') "Program successfully completed."
  250. STOP
  251. END PROGRAM DataProjection1DRectangularCartesian