/MultiPhysics/Poroelasticity/FiniteElasticityDarcy/IncompressibleElasticityDrivenMultiCompDarcyIO/input/iostuff.f90

http://github.com/xyan075/examples · Fortran Modern · 489 lines · 363 code · 42 blank · 84 comment · 17 complexity · 3d3d15062a5177cd3bf65aa5d0cc056d MD5 · raw file

  1. MODULE IOSTUFF
  2. USE OPENCMISS
  3. IMPLICIT NONE
  4. CONTAINS
  5. ! --------------------------------------------------------------------------------------------------------------
  6. !>Reads in a mesh and returns a mesh object. Basically handles all Basis and Mesh creation calls (comment them out entirely)
  7. SUBROUTINE READ_MESH(Filename,MeshUserNumber,Region, Mesh,Bases,Nodes,Elements)
  8. character(len=*), intent(in) :: Filename
  9. INTEGER(CMISSIntg), intent(in) :: MeshUserNumber
  10. type(CMISSRegionType), intent(in) :: Region
  11. type(CMISSMeshType), intent(inout) :: Mesh
  12. type(CMISSBasisType), allocatable, intent(out) :: Bases(:)
  13. TYPE(CMISSMeshElementsType), allocatable, intent(out) :: Elements(:)
  14. TYPE(CMISSNodesType), intent(out) :: Nodes
  15. !Local variables
  16. INTEGER(CMISSIntg),parameter :: fid=77
  17. character*6, parameter :: MAXFMT='(A255)'
  18. character(len=255) :: word
  19. INTEGER(CMISSIntg) :: NumberOfMeshDimensions,NumberOfMeshComponents
  20. INTEGER(CMISSIntg) :: NumberOfNodes,NumberOfElements,NumberOfBases
  21. INTEGER(CMISSIntg) :: MeshComponentNumber,MyComputationalNode,i,Err
  22. INTEGER(CMISSIntg) :: InterpolationType
  23. INTEGER(CMISSIntg) :: compn,basisn,gaussn, basis_order,el(64),lnn
  24. CALL CMISSComputationalNodeNumberGet(MyComputationalNode,Err)
  25. ! only if root process
  26. if (MyComputationalNode==0) then
  27. ! open file
  28. open(unit=fid, file=Filename, status='old', action='read', err=998)
  29. CALL CMISSMesh_Initialise(Mesh,Err)
  30. compn=0; basisn=0
  31. ! read header info
  32. do
  33. read(fid,FMT=MAXFMT,end=776) word
  34. ! skip blanks/comments
  35. if (len_trim(word)==0 .or. index(adjustl(word),"!")==1) cycle
  36. ! proper keywords start with a #
  37. if (trim(adjustl(word))=="#number_of_mesh_dimensions") then
  38. read(fid,*,end=777,err=999) NumberOfMeshDimensions
  39. CALL CMISSMesh_CreateStart(MeshUserNumber,Region,NumberOfMeshDimensions,Mesh,Err)
  40. elseif (trim(adjustl(word))=="#number_of_mesh_components") then
  41. read(fid,*,end=777,err=999) NumberOfMeshComponents
  42. CALL CMISSMesh_NumberOfComponentsSet(Mesh,NumberOfMeshComponents,Err)
  43. allocate(Elements(NumberOfMeshComponents))
  44. elseif (trim(adjustl(word))=="#number_of_nodes") then
  45. read(fid,*,end=777,err=999) NumberOfNodes
  46. !Define nodes for the mesh
  47. CALL CMISSNodes_Initialise(Nodes,Err)
  48. CALL CMISSNodes_CreateStart(Region,NumberOfNodes,Nodes,Err)
  49. CALL CMISSNodes_CreateFinish(Nodes,Err)
  50. elseif (trim(adjustl(word))=="#number_of_elements") then
  51. read(fid,*,end=777,err=999) NumberOfElements
  52. CALL CMISSMesh_NumberOfElementsSet(Mesh,NumberOfElements,Err)
  53. elseif (trim(adjustl(word))=="#number_of_bases") then
  54. read(fid,*,end=777,err=999) NumberOfBases
  55. allocate(Bases(NumberOfBases))
  56. elseif (trim(adjustl(word))=="#mesh_component") then
  57. ! start of a mesh component block
  58. compn=compn+1
  59. if (compn>NumberOfMeshComponents) then
  60. write(*,*) "READ_MESH: incorrect number of mesh components are defined"
  61. close(fid)
  62. return
  63. endif
  64. read(fid,*,end=777,err=999) MeshComponentNumber
  65. do
  66. read(fid,FMT=MAXFMT,end=777,err=999) word
  67. if (len_trim(word)==0 .or. index(adjustl(word),"!")==1) cycle
  68. if (trim(adjustl(word))/="#basis_order") then
  69. write(*,*) "READ_MESH: #basis_order must follow the mesh_component definition"
  70. close(fid)
  71. return
  72. endif
  73. exit
  74. enddo
  75. read(fid,*,end=777,err=999) basis_order
  76. ! set up basis: hardcoded for lagrange basis type
  77. basisn=basisn+1
  78. CALL CMISSBasis_Initialise(Bases(basisn),Err)
  79. CALL CMISSBasis_CreateStart(basisn,Bases(basisn),Err)
  80. CALL CMISSBasis_TypeSet(Bases(basisn),CMISS_BASIS_LAGRANGE_HERMITE_TP_TYPE,Err)
  81. CALL CMISSBasis_NumberOfXiSet(Bases(basisn),NumberOfMeshDimensions,Err)
  82. select case (basis_order)
  83. case (1)
  84. InterpolationType=CMISS_BASIS_LINEAR_LAGRANGE_INTERPOLATION
  85. gaussn=3; lnn=8
  86. case (2)
  87. InterpolationType=CMISS_BASIS_QUADRATIC_LAGRANGE_INTERPOLATION
  88. gaussn=3; lnn=27
  89. case (3)
  90. InterpolationType=CMISS_BASIS_CUBIC_LAGRANGE_INTERPOLATION
  91. gaussn=3; lnn=64
  92. end select
  93. CALL CMISSBasis_InterpolationXiSet(Bases(basisn),[InterpolationType,InterpolationType,InterpolationType],Err)
  94. CALL CMISSBasis_QuadratureNumberOfGaussXiSet(Bases(basisn),[gaussn,gaussn,gaussn],Err)
  95. CALL CMISSBasis_QuadratureLocalFaceGaussEvaluateSet(Bases(basisn),.true.,Err)
  96. CALL CMISSBasis_CreateFinish(Bases(basisn),Err)
  97. ! element definition now
  98. do
  99. read(fid,FMT=MAXFMT,end=777,err=999) word
  100. if (len_trim(word)==0 .or. index(adjustl(word),"!")==1) cycle
  101. if (trim(adjustl(word))/="#elements") then
  102. write(*,*) "READ_MESH: #elements must follow the basis definition"
  103. close(fid)
  104. return
  105. endif
  106. exit
  107. enddo
  108. CALL CMISSMeshElements_Initialise(Elements(compn),Err)
  109. CALL CMISSMeshElements_CreateStart(Mesh,compn,Bases(basisn),Elements(compn),Err)
  110. do i=1,NumberOfElements
  111. read(fid,*,end=777,err=999) el(1:lnn)
  112. CALL CMISSMeshElements_NodesSet(Elements(compn),i,el(1:lnn),Err)
  113. enddo
  114. CALL CMISSMeshElements_CreateFinish(Elements(compn),Err)
  115. elseif (trim(adjustl(word))=="#number_of_surfaces") then
  116. write(*,*) "READ_MESH: not implemented yet"
  117. close(fid)
  118. return
  119. endif
  120. enddo
  121. endif
  122. 776 CALL CMISSMesh_CreateFinish(Mesh,Err)
  123. close(fid)
  124. return ! happy return
  125. 777 write(*,*) "READ_MESH: unexpected end of file encountered"
  126. close(fid)
  127. return
  128. 998 write(*,*) "READ_MESH: could not open file "//Filename
  129. close(fid)
  130. return
  131. 999 write(*,*) "READ_MESH: error reading line"
  132. close(fid)
  133. return
  134. END SUBROUTINE READ_MESH
  135. ! --------------------------------------------------------------------------------------------------------------
  136. SUBROUTINE READ_NODES(Filename,GeometricField)
  137. character(len=*), intent(in) :: Filename
  138. type(CMISSFieldType), intent(inout) :: GeometricField
  139. !Local variables
  140. INTEGER(CMISSIntg),parameter :: fid=79
  141. character*6, parameter :: MAXFMT='(A255)'
  142. character(len=255) :: word
  143. INTEGER(CMISSIntg) :: NumberOfNodes,NumberOfCoordinateDimensions
  144. INTEGER(CMISSIntg) :: MyComputationalNode,i,j,Err
  145. REAL(CMISSDP) :: coord(3)
  146. ! skipping all dimension, size or otherwise error checks
  147. CALL CMISSComputationalNodeNumberGet(MyComputationalNode,Err)
  148. if (MyComputationalNode==0) then
  149. ! open the file
  150. open(unit=fid,file=Filename,status='old',action='read',err=998)
  151. ! read some header info
  152. do
  153. read(fid,FMT=MAXFMT,end=776,err=999) word
  154. ! skip blanks/comments
  155. if (len_trim(word)==0 .or. index(adjustl(word),"!")==1) cycle
  156. if (trim(adjustl(word))=="#number_of_nodes") then
  157. read(fid,*,end=777,err=999) NumberOfNodes
  158. elseif (trim(adjustl(word))=="#number_of_coordinate_dimensions") then
  159. read(fid,*,end=777,err=999) NumberOfCoordinateDimensions
  160. elseif (trim(adjustl(word))=="#nodes") then
  161. do i=1,NumberOfNodes
  162. read(fid,*,err=999) coord(1:NumberOfCoordinateDimensions)
  163. do j=1,NumberOfCoordinateDimensions
  164. CALL CMISSField_ParameterSetUpdateNode(GeometricField,CMISS_FIELD_U_VARIABLE_TYPE,CMISS_FIELD_VALUES_SET_TYPE,1,1,i,j, &
  165. & coord(j),Err)
  166. enddo
  167. enddo
  168. exit
  169. endif
  170. enddo
  171. endif
  172. 776 close(fid)
  173. return ! happy return
  174. 777 write(*,*) "READ_NODES: unexpected end of file encountered"
  175. close(fid)
  176. return
  177. 998 write(*,*) "READ_NODES: could not open file "//Filename
  178. close(fid)
  179. return
  180. 999 write(*,*) "READ_NODES: error reading line"
  181. close(fid)
  182. return
  183. END SUBROUTINE READ_NODES
  184. ! --------------------------------------------------------------------------------------------------------------
  185. !>Reads in a field. Only works for a material field currently, all components using same interpolation. handles full field definition code block.
  186. SUBROUTINE READ_FIELD(Filename,FieldUserNumber,Region,GeometricField, Field)
  187. character(len=*), intent(in) :: Filename
  188. INTEGER(CMISSIntg), intent(in) :: FieldUserNumber
  189. type(CMISSRegionType), intent(in) :: Region
  190. type(CMISSFieldType), intent(in) :: GeometricField
  191. type(CMISSFieldType), intent(out) :: Field
  192. !Local variables
  193. TYPE(CMISSDecompositionType) :: Decomposition
  194. INTEGER(CMISSIntg), parameter :: fid=78
  195. character*6, parameter :: MAXFMT='(A255)'
  196. character(len=255) :: word,field_type,interpolation_type,data_type
  197. INTEGER(CMISSIntg) :: NumberOfVariables,NumberOfComponents,num_var,var_idx,var_count
  198. INTEGER(CMISSIntg) :: varn,mcompn,VariableType,InterpolationType,DataType
  199. INTEGER(CMISSIntg) :: MyComputationalNode,i,ind,Err
  200. INTEGER(CMISSIntg) :: data_int(100)
  201. REAL(CMISSDP) :: data_dp(100)
  202. INTEGER(CMISSIntg), ALLOCATABLE :: VariableTypes(:),DataTypes(:),MeshComponents(:),InterpolationTypes(:), &
  203. & VariableNumComponents(:)
  204. LOGICAL :: field_set
  205. CALL CMISSComputationalNodeNumberGet(MyComputationalNode,Err)
  206. if (MyComputationalNode==0) then
  207. ! Open the file see if everything is fine
  208. open(unit=fid,file=Filename,status='old',action='read',err=998)
  209. ! initial field setup
  210. ! CALL CMISSField_Initialise(Field,Err)
  211. ! CALL CMISSField_CreateStart(FieldUserNumber,Region,Field,Err)
  212. ! ! --- set material type here then do the below ---
  213. ! CALL CMISSDecomposition_Initialise(Decomposition,Err)
  214. ! CALL CMISSField_MeshDecompositionGet(GeometricField,Decomposition,Err)
  215. ! CALL CMISSField_MeshDecompositionSet(Field,Decomposition,Err)
  216. ! CALL CMISSField_GeometricFieldSet(Field,GeometricField,Err)
  217. data_int = 0.0_CMISSIntg
  218. data_dp = 0.0_CMISSDP
  219. num_var=0_CMISSIntg
  220. var_idx=0_CMISSIntg
  221. var_count=0_CMISSIntg
  222. field_set=.false.
  223. do
  224. read(fid,FMT=MAXFMT,end=776) word
  225. write(*,*) word
  226. ! skip blanks/comments
  227. if (len_trim(word)==0 .or. index(adjustl(word),"!")==1) cycle
  228. ! proper keywords start with a #
  229. if (trim(adjustl(word))=="#field_type") then
  230. read(fid,FMT=MAXFMT,end=777) field_type
  231. select case (trim(field_type))
  232. case ("material")
  233. CALL CMISSField_Initialise(Field,Err)
  234. CALL CMISSField_CreateStart(FieldUserNumber,Region,Field,Err)
  235. CALL CMISSField_TypeSet(Field,CMISS_FIELD_MATERIAL_TYPE,Err)
  236. CALL CMISSDecomposition_Initialise(Decomposition,Err)
  237. CALL CMISSField_MeshDecompositionGet(GeometricField,Decomposition,Err)
  238. CALL CMISSField_MeshDecompositionSet(Field,Decomposition,Err)
  239. CALL CMISSField_GeometricFieldSet(Field,GeometricField,Err)
  240. case default
  241. write(*,*) "READ_FIELD: field types other than material has not been implemented"
  242. close(fid)
  243. return
  244. end select
  245. elseif (trim(adjustl(word))=="#number_of_variables") then
  246. read(fid,*,end=777) NumberOfVariables
  247. CALL CMISSField_NumberOfVariablesSet(Field,NumberOfVariables,Err)
  248. write(*,*) NumberOfVariables
  249. ALLOCATE(VariableTypes(NumberOfVariables))
  250. ALLOCATE(DataTypes(NumberOfVariables))
  251. ALLOCATE(MeshComponents(NumberOfVariables))
  252. ALLOCATE(InterpolationTypes(NumberOfVariables))
  253. ALLOCATE(VariableNumComponents(NumberOfVariables))
  254. do
  255. read(fid,FMT=MAXFMT,end=776) word
  256. write(*,*) word
  257. ! skip blanks/comments
  258. if (len_trim(word)==0 .or. index(adjustl(word),"!")==1) cycle
  259. if (trim(adjustl(word))=="#variable") then
  260. read(fid,*,end=777) varn
  261. num_var=num_var+1
  262. select case (varn)
  263. case (1)
  264. VariableTypes(num_var)=CMISS_FIELD_U_VARIABLE_TYPE
  265. case (2)
  266. VariableTypes(num_var)=CMISS_FIELD_V_VARIABLE_TYPE
  267. case (3)
  268. VariableTypes(num_var)=CMISS_FIELD_U1_VARIABLE_TYPE
  269. case (4)
  270. VariableTypes(num_var)=CMISS_FIELD_U2_VARIABLE_TYPE
  271. case default
  272. write(*,*) "READ_FIELD: more than 4 variables, take care of it"
  273. end select
  274. elseif (trim(adjustl(word))=="#number_of_components") then
  275. read(fid,*,end=777,err=999) NumberOfComponents
  276. VariableNumComponents(num_var) = NumberOfComponents
  277. elseif (trim(adjustl(word))=="#interpolation_type") then
  278. read(fid,FMT=MAXFMT,end=777,err=999) interpolation_type
  279. select case (trim(adjustl(interpolation_type)))
  280. case ("constant")
  281. InterpolationTypes(num_var)=CMISS_FIELD_CONSTANT_INTERPOLATION
  282. case ("elemental")
  283. InterpolationTypes(num_var)=CMISS_FIELD_ELEMENT_BASED_INTERPOLATION
  284. case ("nodal")
  285. InterpolationTypes(num_var)=CMISS_FIELD_NODE_BASED_INTERPOLATION
  286. case default
  287. write(*,*) "READ_FIELD: unsupported interpolation type encountered"
  288. close(fid)
  289. return
  290. end select
  291. elseif (trim(adjustl(word))=="#mesh_component") then
  292. read(fid,*,end=777,err=999) mcompn
  293. MeshComponents(num_var) = mcompn
  294. elseif (trim(adjustl(word))=="#data_type") then
  295. read(fid,*,end=777,err=999) data_type
  296. select case (trim(data_type))
  297. case ("dp")
  298. DataTypes(num_var)=CMISS_FIELD_DP_TYPE
  299. case ("intg")
  300. DataTypes(num_var)=CMISS_FIELD_INTG_TYPE
  301. case default
  302. write(*,*) "READ_FIELD: unsupported data type encountered"
  303. close(fid)
  304. return
  305. end select
  306. ! start a variable block
  307. ! ! do
  308. ! ! read(fid,FMT=MAXFMT,end=777) word
  309. ! ! ! skip blanks/comments
  310. ! ! if (len_trim(word)==0 .or. index(adjustl(word),"!")==1) cycle
  311. ! ! if (trim(adjustl(word))=="#number_of_components") then
  312. ! ! read(fid,*,end=777,err=999) NumberOfComponents
  313. ! ! CALL CMISSField_NumberOfComponentsSet(Field,VariableType,NumberOfComponents,Err)
  314. ! ! elseif (trim(adjustl(word))=="#interpolation_type") then
  315. ! ! read(fid,FMT=MAXFMT,end=777,err=999) interpolation_type
  316. ! ! select case (trim(adjustl(interpolation_type)))
  317. ! ! case ("constant")
  318. ! ! InterpolationType=CMISS_FIELD_CONSTANT_INTERPOLATION
  319. ! ! case ("elemental")
  320. ! ! InterpolationType=CMISS_FIELD_ELEMENT_BASED_INTERPOLATION
  321. ! ! case ("nodal")
  322. ! ! InterpolationType=CMISS_FIELD_NODE_BASED_INTERPOLATION
  323. ! ! case default
  324. ! ! write(*,*) "READ_FIELD: unsupported interpolation type encountered"
  325. ! ! close(fid)
  326. ! ! return
  327. ! ! end select
  328. ! ! ! hardcoded: assume all components are interpolated the same way
  329. ! ! do i=1,NumberOfComponents
  330. ! ! CALL CMISSField_ComponentInterpolationSet(Field,VariableType,i,InterpolationType,Err)
  331. ! ! enddo
  332. ! ! elseif (trim(adjustl(word))=="#mesh_component") then
  333. ! ! read(fid,*,end=777,err=999) mcompn
  334. ! ! ! if (InterpolationType==CMISS_FIELD_NODE_BASED_INTERPOLATION) then
  335. ! ! do i=1,NumberOfComponents
  336. ! ! write(*,*) mcompn
  337. ! ! CALL CMISSField_ComponentMeshComponentSet(Field,VariableType,i,mcompn,Err)
  338. ! ! enddo
  339. ! ! ! endif
  340. ! ! elseif (trim(adjustl(word))=="#data_type") then
  341. ! ! read(fid,*,end=777,err=999) data_type
  342. ! ! select case (trim(data_type))
  343. ! ! case ("dp")
  344. ! ! DataType=CMISS_FIELD_DP_TYPE
  345. ! ! case ("intg")
  346. ! ! DataType=CMISS_FIELD_INTG_TYPE
  347. ! ! case default
  348. ! ! write(*,*) "READ_FIELD: unsupported data type encountered"
  349. ! ! close(fid)
  350. ! ! return
  351. ! ! end select
  352. ! do
  353. ! read(fid,FMT=MAXFMT,end=777) word
  354. ! skip blanks/comments
  355. ! if (len_trim(word)==0 .or. index(adjustl(word),"!")==1) cycle
  356. elseif (trim(adjustl(word))=="#data_variable_type") then
  357. IF(field_set.eqv..false.)THEN
  358. CALL CMISSField_VariableTypesSet(Field,VariableTypes,Err)
  359. DO var_idx=1,NumberOfVariables
  360. VariableType=VariableTypes(var_idx)
  361. CALL CMISSField_NumberOfComponentsSet(Field,VariableType,NumberOfComponents,Err)
  362. do i=1,NumberOfComponents
  363. CALL CMISSField_ComponentInterpolationSet(Field,VariableType,i,InterpolationType,Err)
  364. CALL CMISSField_ComponentMeshComponentSet(Field,VariableType,i,mcompn,Err)
  365. enddo
  366. CALL CMISSField_DataTypeSet(Field,VariableType,DataType,Err)
  367. ENDDO
  368. CALL CMISSField_CreateFinish(Field,Err)
  369. field_set=.true.
  370. ENDIF
  371. read(fid,*,end=777) varn
  372. VariableType=VariableTypes(varn)
  373. var_count=var_count+1
  374. elseif (trim(adjustl(word))=="#data") then
  375. ! don't know how many lines there will be - just go until blank line
  376. do
  377. read(fid,FMT=MAXFMT,end=777,err=999) word
  378. if (len_trim(word)==0) exit ! exit if blank line
  379. select case (DataTypes(var_count))
  380. case (CMISS_FIELD_DP_TYPE)
  381. read(word,*,end=777,err=999) ind,data_dp(1:NumberOfComponents)
  382. do i=1,NumberOfComponents
  383. select case (InterpolationType)
  384. case (CMISS_FIELD_CONSTANT_INTERPOLATION)
  385. CALL CMISSField_ParameterSetUpdateConstant(Field,VariableType,CMISS_FIELD_VALUES_SET_TYPE,i,data_dp(i),Err)
  386. case (CMISS_FIELD_ELEMENT_BASED_INTERPOLATION)
  387. CALL CMISSField_ParameterSetUpdateElement(Field,VariableType,CMISS_FIELD_VALUES_SET_TYPE,ind,i,data_dp(i), &
  388. & Err)
  389. case (CMISS_FIELD_NODE_BASED_INTERPOLATION)
  390. CALL CMISSField_ParameterSetUpdateNode(Field,VariableType,CMISS_FIELD_VALUES_SET_TYPE,1,1,ind,i, &
  391. & data_dp(i), &
  392. & Err)
  393. end select
  394. enddo
  395. case (CMISS_FIELD_INTG_TYPE)
  396. read(word,*,end=777,err=999) ind,data_int(1:NumberOfComponents)
  397. do i=1,NumberOfComponents
  398. select case (InterpolationType)
  399. case (CMISS_FIELD_CONSTANT_INTERPOLATION)
  400. CALL CMISSField_ParameterSetUpdateConstant(Field,VariableType,CMISS_FIELD_VALUES_SET_TYPE,i,data_int(i),Err)
  401. case (CMISS_FIELD_ELEMENT_BASED_INTERPOLATION)
  402. CALL CMISSField_ParameterSetUpdateElement(Field,VariableType,CMISS_FIELD_VALUES_SET_TYPE,ind,i, &
  403. & data_int(i), &
  404. & Err)
  405. case (CMISS_FIELD_NODE_BASED_INTERPOLATION)
  406. CALL CMISSField_ParameterSetUpdateNode(Field,VariableType,CMISS_FIELD_VALUES_SET_TYPE,1,1,ind,i, &
  407. & data_int(i),Err)
  408. end select
  409. enddo
  410. end select
  411. enddo
  412. elseif (trim(adjustl(word))=="#data_all") then ! debug-option to initialise all field values in one go, NO INDEX
  413. read(fid,FMT=MAXFMT,end=777,err=999) word
  414. select case (DataTypes(var_count))
  415. case (CMISS_FIELD_DP_TYPE)
  416. read(word,*,end=777,err=999) data_dp(1:NumberOfComponents)
  417. do i=1,NumberOfComponents
  418. CALL CMISSField_ComponentValuesInitialise(Field,VariableType,CMISS_FIELD_VALUES_SET_TYPE, &
  419. & i,data_dp(i),Err)
  420. enddo
  421. case (CMISS_FIELD_INTG_TYPE)
  422. read(word,*,end=777,err=999) data_int(1:NumberOfComponents)
  423. do i=1,NumberOfComponents
  424. CALL CMISSField_ComponentValuesInitialise(Field,VariableType,CMISS_FIELD_VALUES_SET_TYPE, &
  425. & i,data_int(i),Err)
  426. enddo
  427. end select
  428. endif
  429. enddo
  430. endif
  431. enddo
  432. endif
  433. enddo
  434. endif
  435. 776 close(fid)
  436. return ! happy return
  437. 777 write(*,*) "READ_FIELD: unexpected end of file encountered"
  438. close(fid)
  439. return
  440. 998 write(*,*) "READ_FIELD: could not open file "//Filename
  441. close(fid)
  442. return
  443. 999 write(*,*) "READ_FIELD: error reading line"
  444. close(fid)
  445. return
  446. END SUBROUTINE READ_FIELD
  447. END MODULE IOSTUFF