fileio_xdmf.f90
Go to the documentation of this file.
1 !#############################################################################
2 !# #
3 !# fosite - 3D hydrodynamical simulation program #
4 !# module: fileio_xdmf.f90 #
5 !# #
6 !# Copyright (C) 2013-2015 #
7 !# Manuel Jung <mjung@astrophysik.uni-kiel.de> #
8 !# Jannes Klee <jklee@astrophysik.uni-kiel.de> #
9 !# #
10 !# This program is free software; you can redistribute it and/or modify #
11 !# it under the terms of the GNU General Public License as published by #
12 !# the Free Software Foundation; either version 2 of the License, or (at #
13 !# your option) any later version. #
14 !# #
15 !# This program is distributed in the hope that it will be useful, but #
16 !# WITHOUT ANY WARRANTY; without even the implied warranty of #
17 !# MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or #
18 !# NON INFRINGEMENT. See the GNU General Public License for more #
19 !# details. #
20 !# #
21 !# You should have received a copy of the GNU General Public License #
22 !# along with this program; if not, write to the Free Software #
23 !# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. #
24 !# #
25 !#############################################################################
26 !----------------------------------------------------------------------------!
40 !----------------------------------------------------------------------------!
42  USE fileio_base_mod
45  USE mesh_base_mod
48  USE fluxes_base_mod
50  USE common_dict
51  !--------------------------------------------------------------------------!
52  PRIVATE
53  CHARACTER, PARAMETER :: lf = achar(10)
54 
55  TYPE, EXTENDS(fileio_binary) :: fileio_xdmf
56  CHARACTER(LEN=14) :: endian_xdmf
57  INTEGER :: unit_xdmf
58  CONTAINS
59  PROCEDURE :: initfileio_xdmf
60  PROCEDURE :: iteratedict
61  PROCEDURE :: writexmf
62  PROCEDURE :: writenode_xdmf
63  PROCEDURE :: writekey_xdmf
64  PROCEDURE :: writeattribute
65  PROCEDURE :: writemeshxml
66  PROCEDURE :: writevector
67  PROCEDURE :: writedataitem
68  PROCEDURE :: finalize
69  END TYPE
70  !--------------------------------------------------------------------------!
71  PUBLIC :: &
72  ! types
74  ! constants
75  ! methods
76  !--------------------------------------------------------------------------!
77 
78 CONTAINS
83  SUBROUTINE initfileio_xdmf(this,Mesh,Physics,Timedisc,Sources,config,IO)
84  IMPLICIT NONE
85  !------------------------------------------------------------------------!
86  CLASS(fileio_xdmf), INTENT(INOUT) :: this
87  CLASS(mesh_base), INTENT(IN) :: Mesh
88  CLASS(physics_base), INTENT(IN) :: Physics
89  CLASS(timedisc_base), INTENT(IN) :: Timedisc
90  CLASS(sources_base), INTENT(IN), POINTER &
91  :: Sources
92  TYPE(Dict_TYP), INTENT(IN), POINTER &
93  :: config
94  TYPE(Dict_TYP), INTENT(IN), POINTER &
95  :: IO
96  !------------------------------------------------------------------------!
97  INTEGER :: err
98  !------------------------------------------------------------------------!
99  !\attention interface changed, however "xdmf" is not passed anymore
100  CALL this%InitFileIO_binary(mesh,physics,timedisc,sources,config,io)
101 
102  CALL this%GetEndianness(this%endian_xdmf, '"Little"', '"Big"')
103  IF(this%realsize.GT.8) &
104  CALL this%Error("WriteXMF","Only single and double precision are allowed")
105 
106  WRITE(this%realfmt,'(A,I1,A)',iostat=err) '"',this%realsize,'"'
107 
108  CALL this%WriteXMF(mesh,io)
109 
110  END SUBROUTINE initfileio_xdmf
111 
112 
114  RECURSIVE SUBROUTINE iteratedict(this,Mesh,config,offset,filename,path)
115  IMPLICIT NONE
116  !------------------------------------------------------------------------!
117  CLASS(fileio_xdmf), INTENT(INOUT) :: this
118  CLASS(mesh_base), INTENT(IN) :: mesh
119  TYPE(dict_typ), INTENT(IN), POINTER &
120  :: config
121  CHARACTER(LEN=*), INTENT(IN) :: filename
122  CHARACTER(LEN=*), INTENT(IN), OPTIONAL &
123  :: path
124  INTEGER, INTENT(INOUT) :: offset
125  !------------------------------------------------------------------------!
126  CHARACTER(LEN=MAX_CHAR_LEN) :: str, key
127  TYPE(dict_typ),POINTER :: node
128  !------------------------------------------------------------------------!
129  IF(PRESENT(path)) THEN
130  str = path
131  ELSE
132  str = ""
133  ENDIF
134  node => config
135  DO WHILE(ASSOCIATED(node))
136  key = trim(str)//"/"//trim(getkey(node))
137 
138  CALL this%WriteNode_xdmf(mesh,key,node,offset,filename)
139 
140  IF(haschild(node)) THEN
141  CALL this%IterateDict(mesh, getchild(node), offset, filename, key)
142  END IF
143  node=>getnext(node)
144  END DO
145  END SUBROUTINE iteratedict
146 
151  SUBROUTINE writekey_xdmf(this,offset,key,type,bytes,dims)
152  IMPLICIT NONE
153  !------------------------------------------------------------------------!
154  CLASS(fileio_xdmf), INTENT(INOUT) :: this
155  CHARACTER(LEN=*), INTENT(IN) :: key
156  INTEGER, INTENT(INOUT) :: offset
157  INTEGER, INTENT(IN) :: type
158  INTEGER, INTENT(IN) :: bytes
159  INTEGER,DIMENSION(5), OPTIONAL, INTENT(IN) &
160  :: dims
161  !------------------------------------------------------------------------!
162  INTEGER :: keylen,l
163  !------------------------------------------------------------------------!
164  keylen = len_trim(key)
165  IF(PRESENT(dims)) THEN
166  l = 3
167  IF(dims(4).GT.1) l = 4
168  IF(dims(5).GT.1) l = 5
169  ELSE
170  l = 0
171  END IF
172  offset = offset + (3+l) * this%intsize + keylen
173  END SUBROUTINE writekey_xdmf
174 
175 
180  SUBROUTINE writenode_xdmf(this,Mesh,key,node,offset,filename)
181  IMPLICIT NONE
182  !------------------------------------------------------------------------!
183  CLASS(fileio_xdmf), INTENT(INOUT) :: this
184  CLASS(mesh_base), INTENT(IN) :: Mesh
185  CHARACTER(LEN=MAX_CHAR_LEN), INTENT(IN) &
186  :: key
187  TYPE(Dict_TYP), INTENT(IN), POINTER &
188  :: node
189  INTEGER , INTENT(INOUT) :: offset
190  CHARACTER(LEN=*), INTENT(IN) :: filename
191  !------------------------------------------------------------------------!
192  REAL,DIMENSION(:,:,:), POINTER :: ptr3 => null()
193  REAL,DIMENSION(:,:,:,:), POINTER :: ptr4 => null()
194  REAL,DIMENSION(:,:,:,:,:),POINTER :: ptr5 => null()
195  INTEGER,DIMENSION(5) :: dims
196  INTEGER :: bytes
197  CHARACTER(LEN=1),DIMENSION(:),POINTER &
198  :: val
199  LOGICAL :: ref
200  INTEGER :: type
201  !------------------------------------------------------------------------!
202  ref = .false.
203  dims(:) = 1
204 
205  type = getdatatype(node)
206  SELECT CASE(type)
207  CASE(dict_real_p)
208  bytes = this%realsize
209  type = dict_real
210  CASE(dict_real_threed)
211  CALL getattr(node,key,ptr3)
212  dims(1:3) = shape(ptr3)
213  CASE(dict_real_fourd)
214  CALL getattr(node,key,ptr4)
215  dims(1:4) = shape(ptr4)
216  CASE(dict_real_fived)
217  CALL getattr(node,key,ptr5)
218  dims(1:5) = shape(ptr5)
219  CASE DEFAULT
220  val => getdata(node)
221  IF(ASSOCIATED(val)) THEN
222  bytes = SIZE(val)
223  ELSE
224  bytes = 0
225  END IF
226  END SELECT
227 
228  IF(product(dims).GT.1) THEN
229  CALL this%SetMeshDims(mesh,dims)
230  bytes = product(dims) * this%realsize
231  CALL this%WriteKey_xdmf(offset,key,type,bytes,dims)
232  ELSE
233  CALL this%WriteKey_xdmf(offset,key,type,bytes)
234  END IF
235 
236  SELECT CASE(getdatatype(node))
237  CASE(dict_real_threed)
238  CALL this%WriteAttribute(mesh,trim(key),dims(1:3),filename,offset,ref)
239 ! It is not clear, how other datatypes than DICT_REAL_TWOD should be mapped in
240 ! XDMF.
241 ! CASE(DICT_REAL_THREED)
242 ! CALL this%WriteAttribute(Mesh,TRIM(key),dims(1:3),filename,offset,ref)
243 ! CASE(DICT_REAL_FOURD)
244 ! CALL this%WriteAttribute(Mesh,TRIM(key),dims(1:4),filename,offset,ref)
245  END SELECT
246 
247  offset = offset + bytes
248 
249  END SUBROUTINE writenode_xdmf
250 
251 
254  SUBROUTINE writedataitem(this,dims,filename,offset)
255  IMPLICIT NONE
256  !------------------------------------------------------------------------!
257  CLASS(fileio_xdmf), INTENT(INOUT) :: this
258  CHARACTER(LEN=*), INTENT(IN) :: dims
259  CHARACTER(LEN=*), INTENT(IN) :: filename
260  INTEGER, INTENT(IN) :: offset
261  !------------------------------------------------------------------------!
262  CHARACTER(LEN=16) :: seek
263  INTEGER :: err
264  !------------------------------------------------------------------------!
265  WRITE(this%unit, iostat=err)&
266  '<DataItem Dimensions=' // trim(dims) // ' ' &
267  // 'NumberType="Float" Precision=' // trim(this%realfmt) // lf &
268  // 'Format="Binary" Endian=' // trim(this%endian_xdmf)
269  WRITE(seek,'(I16)',iostat=err) offset
270  WRITE(this%unit, iostat=err)&
271  lf // 'Seek="' // trim(adjustl(seek)) // '"'
272  WRITE(this%unit, iostat=err)&
273  '>' // lf &
274  // trim(filename) // lf &
275  // '</DataItem>' // lf
276 
277  END SUBROUTINE writedataitem
278 
281  SUBROUTINE writeattribute(this,Mesh,name,dims,filename,offset,ref)
282  IMPLICIT NONE
283  !------------------------------------------------------------------------!
284  CLASS(fileio_xdmf), INTENT(INOUT) :: this
285  CLASS(mesh_base), INTENT(IN) :: Mesh
286  CHARACTER(LEN=*), INTENT(IN) :: name
287  CHARACTER(LEN=*), INTENT(IN) :: filename
288  INTEGER, INTENT(IN), DIMENSION(:) &
289  :: dims
290  INTEGER, INTENT(IN) :: offset
291  LOGICAL, INTENT(IN) :: ref
292  !------------------------------------------------------------------------!
293  CHARACTER(LEN=32) :: type,center
294  INTEGER :: dsize, err
295  !------------------------------------------------------------------------!
296  !data size
297  dsize = SIZE(dims)
298 
299  ! TODO CHECK THIS - 3D HACK
300  ! If the data has mesh sizes, it is cell data
301  IF((dims(1).EQ.mesh%INUM).AND.&
302  (dims(2).EQ.mesh%JNUM).AND.&
303  (dims(3).EQ.mesh%KNUM)) THEN
304  center = "Cell"
305  dsize = dsize - 3
306  ELSE IF((dims(1).EQ.mesh%INUM+1).AND.&
307  (dims(2).EQ.mesh%JNUM+1).AND.&
308  (dims(3).EQ.mesh%KNUM+1)) THEN
309  center = "Node"
310  dsize = dsize - 3
311  ELSE ! otherwise data for the whole grid
312  center = "Grid"
313  END IF
314 
315  ! The remaining dimensions define the data type
316  SELECT CASE(dsize)
317  CASE(0)
318  type = "Scalar"
319  CASE(1)
320  type = "Vector"
321  CASE DEFAULT
322  type = "Matrix"
323  END SELECT
324 
325  WRITE(this%unit, iostat=err)&
326  '<Attribute Name="' // trim(name) // '" '&
327  // 'AttributeType="' // trim(type) // '" ' &
328  // 'Center="' // trim(center) // '">' // lf
329 
330  CALL this%WriteDataItem(getdimsstr(mesh,dims), trim(filename), offset)
331 
332  WRITE(this%unit, iostat=err)&
333  '</Attribute>' // lf
334  END SUBROUTINE writeattribute
335 
338  SUBROUTINE writevector(this,Mesh,name,dims,ref1,ref2,ref3,step)
339  IMPLICIT NONE
340  !------------------------------------------------------------------------!
341  CLASS(fileio_xdmf), INTENT(INOUT) :: this
342  CLASS(mesh_base), INTENT(IN) :: Mesh
343  CHARACTER(LEN=*), INTENT(IN) :: name
344  INTEGER, INTENT(IN), DIMENSION(3) &
345  :: dims
346  CHARACTER(LEN=*), INTENT(IN) :: ref1,ref2,ref3
347  CHARACTER(LEN=*), INTENT(IN) :: step
348  !------------------------------------------------------------------------!
349  CHARACTER(LEN=128) :: dstr
350  INTEGER :: err
351  !------------------------------------------------------------------------!
352  dstr = getdimsstr(mesh,dims)
353  WRITE(this%unit, iostat=err)&
354  '<Attribute Name="' // trim(name) // '" ' &
355  // 'AttributeType="Vector" Center="Cell">' // lf&
356  // '<DataItem ItemType="Function" Function="JOIN($0, $1, $2)" '&
357  // 'Dimensions=' // trim(dstr) // '>' // lf &
358  ! first component
359  // '<DataItem Reference="/Xdmf/Domain/Grid'&
360  // "/Grid[@Name='step" // step // "']" &
361  // '/Attribute[@Name=' &
362  // "'" // trim(ref1) // "'" // ']/DataItem[1]"/>' // lf &
363  ! second component
364  // '<DataItem Reference="/Xdmf/Domain/Grid'&
365  // "/Grid[@Name='step" // step // "']" &
366  // '/Attribute[@Name=' &
367  // "'" // trim(ref2) // "'" // ']/DataItem[1]"/>' // lf &
368  ! third component
369  // '<DataItem Reference="/Xdmf/Domain/Grid'&
370  // "/Grid[@Name='step" // step // "']" &
371  // '/Attribute[@Name=' &
372  // "'" // trim(ref3) // "'" // ']/DataItem[1]"/>' // lf &
373  ! end
374  // '</DataItem>' // lf &
375  // '</Attribute>' // lf
376  END SUBROUTINE writevector
377 
380  SUBROUTINE writemeshxml(this,Mesh,filename,offset)
381  IMPLICIT NONE
382  !------------------------------------------------------------------------!
383  CLASS(fileio_xdmf), INTENT(INOUT) :: this
384  CLASS(mesh_base), INTENT(IN) :: Mesh
385  CHARACTER(LEN=*), INTENT(IN) :: filename
386  INTEGER, INTENT(INOUT) :: offset
387  !------------------------------------------------------------------------!
388  CHARACTER(LEN=64) :: dims
389  CHARACTER(LEN=8) :: inum, jnum, knum
390  INTEGER :: err
391  !------------------------------------------------------------------------!
392  WRITE(inum,'(I8)') mesh%INUM+1
393  WRITE(jnum,'(I8)') mesh%JNUM+1
394  WRITE(knum,'(I8)') mesh%KNUM+1
395  WRITE(dims,'(A,A,A,A,A)') trim(adjustl(knum)), ' ',trim(adjustl(jnum)), &
396  ' ',trim(adjustl(inum))
397 
398 ! TODO 3D HACK should not be needed anymore, since now everything is 3D now
399 ! \attention here was a bianglespherical hack
400  WRITE(this%unit, iostat=err) &
401  '<Topology TopologyType="3DSMesh" ' &
402  // 'NumberOfElements="' // trim(dims) // '"/>' // lf &
403  // '<Geometry GeometryType="X_Y_Z">' // lf
404  WRITE(this%unit, iostat=err) &
405  '<DataItem Reference="/Xdmf/Domain/Grid/Grid/Attribute[@Name='//"'/mesh/grid_x'"//']/DataItem[1]"/>' // lf &
406  // '<DataItem Reference="/Xdmf/Domain/Grid/Grid/Attribute[@Name='//"'/mesh/grid_y'"//']/DataItem[1]"/>' // lf &
407  // '<DataItem Reference="/Xdmf/Domain/Grid/Grid/Attribute[@Name='//"'/mesh/grid_z'"//']/DataItem[1]"/>' // lf
408 
409  WRITE(this%unit, iostat=err) &
410  '</Geometry>' // lf
411 
412  END SUBROUTINE writemeshxml
413 
416  SUBROUTINE writexmf(this,Mesh,IO)
417  IMPLICIT NONE
418  !------------------------------------------------------------------------!
419  CLASS(fileio_xdmf), INTENT(INOUT) :: this
420  CLASS(mesh_base), INTENT(IN) :: Mesh
421  TYPE(Dict_TYP), INTENT(IN), POINTER &
422  :: IO
423  !------------------------------------------------------------------------!
424  INTEGER :: i, offset, err
425  REAL :: ftime
426  CHARACTER(LEN=4) :: step
427  CHARACTER(LEN=32) :: time
428  CHARACTER(LEN=256) :: filename
429  TYPE(Dict_TYP), POINTER :: meshIO => null()
430  !------------------------------------------------------------------------!
431 
432  IF (this%GetRank().EQ.0) THEN
433  ! write a xmf-file
434  OPEN(this%unit, file=trim(this%filename)//'.xmf', &
435  status = 'REPLACE', &
436  action = 'WRITE', &
437  access = 'STREAM', &
438  position = 'REWIND', &
439  iostat = err)
440  IF (err.NE. 0) CALL this%Error("WriteXMF","Can't open xmf-file")
441 
442  WRITE(this%unit, iostat=err)&
443  '<?xml version="1.0" ?>' // lf &
444  // '<!DOCTYPE Xdmf SYSTEM "Xdmf.dtd" []>' // lf &
445  // '<Xdmf Version="2.0">' // lf &
446  // '<Domain>' // lf &
447  // '<Grid Name="mesh" GridType="Collection" CollectionType="Temporal">' // lf
448 
449 ! this works in paraview, but not in visit :(. So we have to use the simpler method for now
450 ! // '<Time TimeType="List">' // LF &
451 ! // '<DataItem Format="XML" NumberType="Float" Dimensions="11">' // LF &
452 ! // '0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0' // LF &
453 ! // '</DataItem>' // LF &
454 ! // '</Time>' // LF
455 ! CALL WriteDataItem_xdmf(this, '"1"', TRIM(filename)//'_'//step//'.bin')
456 ! WRITE(this%unit, IOSTAT=err)&
457 
458  CALL getattr(io,"mesh",meshio)
459 
460  DO i=0,this%count
461  offset = 13
462  ftime = this%stoptime/(this%count)*i
463  WRITE(step,'(I4.4)') i
464  WRITE(time,'(ES16.9)') ftime
465  WRITE(filename, '(A)') trim(this%filename)//"_"//step//".bin"
466 
467  WRITE(this%unit, iostat=err)&
468  '<Grid Name="step' // step // '" GridType="Uniform">' // lf &
469  // '<Time Value="' // trim(time) // '" />' // lf
470 
471  CALL this%WriteMeshXML(mesh,filename,offset)
472  CALL this%WriteVector(mesh,"/timedisc/velocity", &
473  (/mesh%INUM,mesh%JNUM,mesh%KNUM/), &
474  "/timedisc/xvelocity","/timedisc/yvelocity", &
475  "/timedisc/zvelocity", step)
476  CALL this%IterateDict(mesh, io, offset, filename)
477 
478  WRITE(this%unit, iostat=err) &
479  '</Grid>' // lf
480  END DO
481 
482  WRITE(this%unit, iostat=err) &
483  '</Grid>' // lf
484 
485 
486  WRITE(this%unit, iostat=err) &
487  '</Domain>' // lf &
488  // '</Xdmf>' // lf
489 
490  IF(err.NE.0) CALL this%Error("WriteXMF", "Can't write xmf-file")
491  CLOSE(this%unit,iostat=err)
492  IF(err.NE.0) CALL this%Error("WriteXMF", "Can't close xmf-file")
493  END IF
494 
495  END SUBROUTINE writexmf
496 
497 
498  FUNCTION getdimsstr(Mesh,dims) RESULT(res)
499  IMPLICIT NONE
500  !------------------------------------------------------------------------!
501  CLASS(mesh_base), INTENT(IN) :: mesh
502  INTEGER,DIMENSION(:), INTENT(IN) :: dims
503  CHARACTER(LEN=128) :: res
504  !------------------------------------------------------------------------!
505  INTEGER :: i, l
506  CHARACTER(LEN=128), DIMENSION(:), ALLOCATABLE &
507  :: buf
508  !------------------------------------------------------------------------!
509  l = SIZE(dims)
510  ALLOCATE(buf(l))
511  IF(l.GE.3) THEN
512  WRITE(buf(1),'(I8)') dims(3)
513  WRITE(buf(2),'(I8)') dims(2)
514  WRITE(buf(3),'(I8)') dims(1)
515  DO i=4,l
516  WRITE(buf(i),'(I8)') dims(i)
517  END DO
518  SELECT CASE(l)
519  CASE(2)
520  WRITE(res,'(A,A,A,A,A)') '"',trim(adjustl(buf(1))),&
521  ' ',trim(adjustl(buf(2))),'"'
522  CASE(3)
523  WRITE(res,'(A,A,A,A,A,A,A)') '"',trim(adjustl(buf(1))),&
524  ' ',trim(adjustl(buf(2))),' ',trim(adjustl(buf(3))),'"'
525  CASE(4)
526  WRITE(res,'(A,A,A,A,A,A,A,A,A)') '"',trim(adjustl(buf(1))),&
527  ' ',trim(adjustl(buf(2))),' ',trim(adjustl(buf(3))), &
528  ' ',trim(adjustl(buf(4))),'"'
529  CASE(5)
530  WRITE(res,'(A,A,A,A,A,A,A,A,A,A,A)') '"',trim(adjustl(buf(1))),&
531  ' ',trim(adjustl(buf(2))),' ',trim(adjustl(buf(3))), &
532  ' ',trim(adjustl(buf(4))),' ',trim(adjustl(buf(5))),'"'
533  END SELECT
534  ELSE
535  WRITE(buf(1),'(I8)') dims(1)
536  WRITE(res,'(A,A,A)') '"',trim(adjustl(buf(1))),'"'
537  END IF
538  DEALLOCATE(buf)
539  END FUNCTION getdimsstr
540 
541  SUBROUTINE finalize(this)
542  IMPLICIT NONE
543  !-----------------------------------------------------------------------!
544  CLASS(fileio_xdmf), INTENT(INOUT) :: this
545  !-----------------------------------------------------------------------!
546  CALL this%fileio_binary%Finalize()
547  END SUBROUTINE
548 
549 END MODULE fileio_xdmf_mod
subroutine finalize(this)
Destructor of common class.
subroutine writevector(this, Mesh, name, dims, ref1, ref2, ref3, step)
Writes the mesh to file.
generic source terms module providing functionaly common to all source terms
subroutine writexmf(this, Mesh, IO)
Main routine to write all data to xmf file.
subroutine initfileio_xdmf(this, Mesh, Physics, Timedisc, Sources, config, IO)
Constructor for the xdmf file I/O.
Definition: fileio_xdmf.f90:84
Generic file I/O module.
Definition: fileio_base.f90:54
subroutine writenode_xdmf(this, Mesh, key, node, offset, filename)
Write the xdmf node.
type(logging_base), save this
subroutine writeattribute(this, Mesh, name, dims, filename, offset, ref)
Writes description of data item in xml syntax.
recursive subroutine iteratedict(this, Mesh, config, offset, filename, path)
Iterate the dictionary and run a Subroutine on every node.
type(dict_typ) function, pointer, public getchild(root)
Get the pointer to a direct child of the pointer &#39;root&#39;.
integer function, public getdatatype(root)
Return the datatype of node &#39;root&#39;.
integer, parameter, public dict_real_fourd
logical function, public haschild(root)
Check if the node &#39;root&#39; has one or more children.
integer, parameter, public dict_real_p
function, public getkey(root)
Get the key of pointer &#39;root&#39;.
base class for geometrical properties
integer, parameter, public dict_real_threed
module for binary file I/O
subroutine writedataitem(this, dims, filename, offset)
Writes description of data item in xml syntax.
character(len=128) function getdimsstr(Mesh, dims)
type(dict_typ) function, pointer, public getnext(root)
Get the pointer to the next child.
integer, parameter, public dict_real_fived
Basic physics module.
Dictionary for generic data types.
Definition: common_dict.f90:61
module for XDMF file I/O
Definition: fileio_xdmf.f90:41
integer, parameter, public dict_real
Definition: common_dict.f90:95
pointer, public getdata(root)
Return the datatype of node &#39;root&#39;.
subroutine writemeshxml(this, Mesh, filename, offset)
Writes the mesh to file.
base module for numerical flux functions
Definition: fluxes_base.f90:39
subroutine writekey_xdmf(this, offset, key, type, bytes, dims)
Write the xdmf key.
character, parameter lf
line feed