IO: Rewrite read_restart_snapshot_xml().
This subroutine now used the new XML module to parge XML files. It also used new subroutine read_binary_xml() to read binary files. Signed-off-by: Grzegorz Kowal <grzegorz@amuncode.org>
This commit is contained in:
parent
64966c3eb3
commit
14fad08f47
519
sources/io.F90
519
sources/io.F90
@ -1103,7 +1103,6 @@ module io
|
||||
use evolution , only : step, time, dt, dth, dte
|
||||
use evolution , only : niterations, nrejections, errs
|
||||
use forcing , only : nmodes, fcoefs, einj
|
||||
use hash , only : hash_info, check_digest, digest_integer
|
||||
use helpers , only : print_message
|
||||
use iso_c_binding, only : c_loc
|
||||
#ifdef MPI
|
||||
@ -1111,33 +1110,30 @@ module io
|
||||
#endif /* MPI */
|
||||
use mpitools , only : nprocs, nproc
|
||||
use random , only : gentype, set_seeds
|
||||
use XML , only : XMLNode, XMLParseFile, XMLFreeTree, &
|
||||
XMLGetElementValue
|
||||
|
||||
implicit none
|
||||
|
||||
integer, intent(out) :: status
|
||||
|
||||
type(XMLNode), pointer :: xml_ptr
|
||||
|
||||
logical :: test
|
||||
character(len=255) :: dname, fname, line, sname, svalue
|
||||
character(len=256) :: snapshot_path, file_path
|
||||
character(len= 16) :: aname
|
||||
integer :: il, iu, nl, nx, nm, nd, nv, i, j, l, n, p, nu, nr
|
||||
#if NDIMS == 3
|
||||
integer :: k
|
||||
#endif /* NDIMS == 3 */
|
||||
integer(kind=4) :: lndims, lnprocs, lnproc, lmblocks, lnleafs, llast_id
|
||||
integer(kind=4) :: ldblocks, lncells, lnghosts, lnseeds, lnmodes
|
||||
integer(kind=4) :: lncells, lnghosts, lnseeds, lnmodes
|
||||
integer(kind=8) :: bytes
|
||||
real(kind=8) :: deinj
|
||||
|
||||
type(block_meta), pointer :: pmeta
|
||||
type(block_data), pointer :: pdata
|
||||
|
||||
integer :: dtype, dlen
|
||||
|
||||
integer(kind=4) :: lun = 104
|
||||
integer(kind=8) :: bytes, pbytes, ubytes
|
||||
|
||||
integer(kind=8) :: hfield, hchild, hface, hedge, hcorner, hbound
|
||||
integer(kind=8) :: hids, hseed, hforce
|
||||
|
||||
integer(kind=8), dimension(:) , allocatable :: hprim, hcons
|
||||
integer(kind=4), dimension(:) , allocatable, target :: ids
|
||||
integer(kind=4), dimension(:,:) , allocatable, target :: fields
|
||||
integer(kind=4), dimension(:,:) , allocatable, target :: children
|
||||
@ -1162,141 +1158,65 @@ module io
|
||||
!
|
||||
status = 0
|
||||
|
||||
write(dname, "(a,'restart-',i5.5)") trim(respath), nrest
|
||||
write(snapshot_path, "(a,'restart-',i5.5)") trim(respath), nrest
|
||||
|
||||
#ifdef __INTEL_COMPILER
|
||||
inquire(directory=dname, exist=test)
|
||||
inquire(directory=snapshot_path, exist=test)
|
||||
#else /* __INTEL_COMPILER */
|
||||
inquire(file=dname, exist=test)
|
||||
inquire(file=snapshot_path, exist=test)
|
||||
#endif /* __INTEL_COMPILER */
|
||||
if (.not. test) then
|
||||
call print_message(loc, trim(dname) // " does not exist!")
|
||||
call print_message(loc, trim(snapshot_path) // " does not exist!")
|
||||
status = 121
|
||||
return
|
||||
end if
|
||||
dname = trim(dname) // "/"
|
||||
snapshot_path = trim(snapshot_path) // "/"
|
||||
file_path = trim(snapshot_path) // "metadata.xml"
|
||||
|
||||
write(fname,"(a,'metadata.xml')") trim(dname)
|
||||
inquire(file=fname, exist=test)
|
||||
inquire(file=file_path, exist=test)
|
||||
if (.not. test) then
|
||||
call print_message(loc, trim(fname) // " does not exist!")
|
||||
call print_message(loc, "The file '" // trim(file_path) // &
|
||||
"' does not exist.")
|
||||
status = 121
|
||||
return
|
||||
end if
|
||||
|
||||
open(newunit=lun, file=fname, status='old')
|
||||
10 read(lun, fmt="(a)", end=20) line
|
||||
if (index(line, '<Attribute') > 0) then
|
||||
il = index(line, 'name="')
|
||||
if (il > 0) then
|
||||
il = il + 6
|
||||
iu = index(line(il:), '"') + il - 2
|
||||
write(sname,*) line(il:iu)
|
||||
il = index(line, '>') + 1
|
||||
iu = index(line, '<', back=.true.) - 1
|
||||
write(svalue,*) line(il:iu)
|
||||
call XMLParseFile(file_path, xml_ptr, status)
|
||||
|
||||
select case(trim(adjustl(sname)))
|
||||
case('ndims')
|
||||
read(svalue, fmt=*) lndims
|
||||
case('nprocs')
|
||||
read(svalue, fmt=*) lnprocs
|
||||
case('nproc')
|
||||
read(svalue, fmt=*) lnproc
|
||||
case('mblocks')
|
||||
read(svalue, fmt=*) lmblocks
|
||||
case('dblocks')
|
||||
read(svalue, fmt=*) ldblocks
|
||||
case('nleafs')
|
||||
read(svalue, fmt=*) lnleafs
|
||||
case('last_id')
|
||||
read(svalue, fmt=*) llast_id
|
||||
case('ncells')
|
||||
read(svalue, fmt=*) lncells
|
||||
case('nghosts')
|
||||
read(svalue, fmt=*) lnghosts
|
||||
case('nseeds')
|
||||
read(svalue, fmt=*) lnseeds
|
||||
case('step')
|
||||
read(svalue, fmt=*) step
|
||||
case('isnap')
|
||||
read(svalue, fmt=*) isnap
|
||||
case('nvars')
|
||||
read(svalue, fmt=*) nv
|
||||
case('nmodes')
|
||||
read(svalue, fmt=*) lnmodes
|
||||
case('xmin')
|
||||
read(svalue, fmt=*) xmin
|
||||
case('xmax')
|
||||
read(svalue, fmt=*) xmax
|
||||
case('ymin')
|
||||
read(svalue, fmt=*) ymin
|
||||
case('ymax')
|
||||
read(svalue, fmt=*) ymax
|
||||
case('zmin')
|
||||
read(svalue, fmt=*) zmin
|
||||
case('zmax')
|
||||
read(svalue, fmt=*) zmax
|
||||
case('time')
|
||||
read(svalue, fmt=*) time
|
||||
case('dt')
|
||||
read(svalue, fmt=*) dt
|
||||
case('dth')
|
||||
read(svalue, fmt=*) dth
|
||||
case('dte')
|
||||
read(svalue, fmt=*) dte
|
||||
case('cmax')
|
||||
read(svalue, fmt=*) cmax
|
||||
cmax2 = cmax * cmax
|
||||
case('cglm')
|
||||
read(svalue, fmt=*) cglm
|
||||
case('niterations')
|
||||
read(svalue, fmt=*) niterations
|
||||
case('nrejections')
|
||||
read(svalue, fmt=*) nrejections
|
||||
case('errs(1)')
|
||||
read(svalue, fmt=*) errs(1)
|
||||
case('errs(2)')
|
||||
read(svalue, fmt=*) errs(2)
|
||||
case('errs(3)')
|
||||
read(svalue, fmt=*) errs(3)
|
||||
case('fields')
|
||||
il = index(line, 'digest_type="') + 13
|
||||
iu = index(line(il:), '"') + il - 2
|
||||
call hash_info(line(il:iu), dtype, dlen)
|
||||
call XMLGetElementValue(xml_ptr, 'Parallelization', 'nprocs' , lnprocs)
|
||||
call XMLGetElementValue(xml_ptr, 'Parallelization', 'nproc' , lnproc)
|
||||
call XMLGetElementValue(xml_ptr, 'Physics' , 'nvars' , nv)
|
||||
call XMLGetElementValue(xml_ptr, 'Geometry' , 'ndims' , lndims)
|
||||
call XMLGetElementValue(xml_ptr, 'Geometry' , 'xmin' , xmin)
|
||||
call XMLGetElementValue(xml_ptr, 'Geometry' , 'xmax' , xmax)
|
||||
call XMLGetElementValue(xml_ptr, 'Geometry' , 'ymin' , ymin)
|
||||
call XMLGetElementValue(xml_ptr, 'Geometry' , 'ymax' , ymax)
|
||||
#if NDIMS == 3
|
||||
call XMLGetElementValue(xml_ptr, 'Geometry' , 'zmin' , zmin)
|
||||
call XMLGetElementValue(xml_ptr, 'Geometry' , 'zmax' , zmax)
|
||||
#endif /* NDIMS == 3 */
|
||||
call XMLGetElementValue(xml_ptr, 'Mesh' , 'ncells' , lncells)
|
||||
call XMLGetElementValue(xml_ptr, 'Mesh' , 'nghosts' , lnghosts)
|
||||
call XMLGetElementValue(xml_ptr, 'Mesh' , 'mblocks' , lmblocks)
|
||||
call XMLGetElementValue(xml_ptr, 'Mesh' , 'nleafs' , lnleafs)
|
||||
call XMLGetElementValue(xml_ptr, 'Mesh' , 'last_id' , llast_id)
|
||||
call XMLGetElementValue(xml_ptr, 'Evolution' , 'step' , step)
|
||||
call XMLGetElementValue(xml_ptr, 'Evolution' , 'time' , time)
|
||||
call XMLGetElementValue(xml_ptr, 'Evolution' , 'dt' , dt)
|
||||
call XMLGetElementValue(xml_ptr, 'Evolution' , 'dth' , dth)
|
||||
call XMLGetElementValue(xml_ptr, 'Evolution' , 'dte' , dte)
|
||||
call XMLGetElementValue(xml_ptr, 'Evolution' , 'cmax' , cmax)
|
||||
call XMLGetElementValue(xml_ptr, 'Evolution' , 'cglm' , cglm)
|
||||
call XMLGetElementValue(xml_ptr, 'Evolution' , 'niterations', niterations)
|
||||
call XMLGetElementValue(xml_ptr, 'Evolution' , 'nrejections', nrejections)
|
||||
call XMLGetElementValue(xml_ptr, 'Evolution' , 'errs(1)' , errs(1))
|
||||
call XMLGetElementValue(xml_ptr, 'Evolution' , 'errs(2)' , errs(2))
|
||||
call XMLGetElementValue(xml_ptr, 'Evolution' , 'errs(3)' , errs(3))
|
||||
call XMLGetElementValue(xml_ptr, 'Forcing' , 'nmodes' , lnmodes)
|
||||
call XMLGetElementValue(xml_ptr, 'Random' , 'nseeds' , lnseeds)
|
||||
call XMLGetElementValue(xml_ptr, 'Snapshots' , 'isnap' , isnap)
|
||||
|
||||
il = index(line, 'digest="') + 8
|
||||
iu = index(line(il:), '"') + il - 2
|
||||
call digest_integer(line(il:iu), hfield)
|
||||
case('children')
|
||||
il = index(line, 'digest="') + 8
|
||||
iu = index(line(il:), '"') + il - 2
|
||||
call digest_integer(line(il:iu), hchild)
|
||||
case('faces')
|
||||
il = index(line, 'digest="') + 8
|
||||
iu = index(line(il:), '"') + il - 2
|
||||
call digest_integer(line(il:iu), hface)
|
||||
case('edges')
|
||||
il = index(line, 'digest="') + 8
|
||||
iu = index(line(il:), '"') + il - 2
|
||||
call digest_integer(line(il:iu), hedge)
|
||||
case('corners')
|
||||
il = index(line, 'digest="') + 8
|
||||
iu = index(line(il:), '"') + il - 2
|
||||
call digest_integer(line(il:iu), hcorner)
|
||||
case('bounds')
|
||||
il = index(line, 'digest="') + 8
|
||||
iu = index(line(il:), '"') + il - 2
|
||||
call digest_integer(line(il:iu), hbound)
|
||||
case('forcing')
|
||||
il = index(line, 'digest="') + 8
|
||||
iu = index(line(il:), '"') + il - 2
|
||||
call digest_integer(line(il:iu), hforce)
|
||||
end select
|
||||
end if
|
||||
end if
|
||||
go to 10
|
||||
20 close(lun)
|
||||
cmax2 = cmax * cmax
|
||||
|
||||
if (lndims /= NDIMS) then
|
||||
call print_message(loc, "The number of dimensions does not match!")
|
||||
@ -1332,44 +1252,31 @@ module io
|
||||
|
||||
if (status == 0) then
|
||||
|
||||
write(fname,"(a,'metablock_fields.bin')") trim(dname)
|
||||
open(newunit=lun, file=fname, form='unformatted', access='stream')
|
||||
read(lun) fields
|
||||
close(lun)
|
||||
bytes = size(fields, kind=8) * kind(fields)
|
||||
call check_digest(loc, fname, c_loc(fields), bytes, hfield, dtype)
|
||||
write(fname,"(a,'metablock_children.bin')") trim(dname)
|
||||
open(newunit=lun, file=fname, form='unformatted', access='stream')
|
||||
read(lun) children
|
||||
close(lun)
|
||||
call read_binary_xml(snapshot_path, 'fields' , c_loc(fields), &
|
||||
bytes, xml_ptr, status)
|
||||
|
||||
bytes = size(children, kind=8) * kind(children)
|
||||
call check_digest(loc, fname, c_loc(children), bytes, hchild, dtype)
|
||||
call read_binary_xml(snapshot_path, 'children', c_loc(children), &
|
||||
bytes, xml_ptr, status)
|
||||
|
||||
#if NDIMS == 3
|
||||
write(fname,"(a,'metablock_faces.bin')") trim(dname)
|
||||
open(newunit=lun, file=fname, form='unformatted', access='stream')
|
||||
read(lun) faces
|
||||
close(lun)
|
||||
bytes = size(faces, kind=8) * kind(faces)
|
||||
call check_digest(loc, fname, c_loc(faces), bytes, hface, dtype)
|
||||
call read_binary_xml(snapshot_path, 'faces' , c_loc(faces), &
|
||||
bytes, xml_ptr, status)
|
||||
|
||||
#endif /* NDIMS == 3 */
|
||||
write(fname,"(a,'metablock_edges.bin')") trim(dname)
|
||||
open(newunit=lun, file=fname, form='unformatted', access='stream')
|
||||
read(lun) edges
|
||||
close(lun)
|
||||
bytes = size(edges, kind=8) * kind(edges)
|
||||
call check_digest(loc, fname, c_loc(edges), bytes, hedge, dtype)
|
||||
write(fname,"(a,'metablock_corners.bin')") trim(dname)
|
||||
open(newunit=lun, file=fname, form='unformatted', access='stream')
|
||||
read(lun) corners
|
||||
close(lun)
|
||||
call read_binary_xml(snapshot_path, 'edges' , c_loc(edges), &
|
||||
bytes, xml_ptr, status)
|
||||
|
||||
bytes = size(corners, kind=8) * kind(corners)
|
||||
call check_digest(loc, fname, c_loc(corners), bytes, hcorner, dtype)
|
||||
write(fname,"(a,'metablock_bounds.bin')") trim(dname)
|
||||
open(newunit=lun, file=fname, form='unformatted', access='stream')
|
||||
read(lun) bounds
|
||||
close(lun)
|
||||
call read_binary_xml(snapshot_path, 'corners' , c_loc(corners), &
|
||||
bytes, xml_ptr, status)
|
||||
|
||||
bytes = size(bounds, kind=8) * kind(bounds)
|
||||
call check_digest(loc, fname, c_loc(bounds), bytes, hbound, dtype)
|
||||
call read_binary_xml(snapshot_path, 'bounds' , c_loc(bounds), &
|
||||
bytes, xml_ptr, status)
|
||||
|
||||
l = 0
|
||||
pmeta => list_meta
|
||||
@ -1453,14 +1360,14 @@ module io
|
||||
|
||||
if (lnmodes == nmodes) then
|
||||
if (lnmodes > 0) then
|
||||
|
||||
allocate(lfcoefs(lnmodes,lndims), stat=status)
|
||||
if (status == 0) then
|
||||
write(fname,"(a,'forcing_coefficients.bin')") trim(dname)
|
||||
open(newunit=lun, file=fname, form='unformatted', access='stream')
|
||||
read(lun) lfcoefs
|
||||
close(lun)
|
||||
|
||||
bytes = size(lfcoefs, kind=8) * kind(lfcoefs) * 2
|
||||
call check_digest(loc, fname, c_loc(lfcoefs), bytes, hforce, dtype)
|
||||
call read_binary_xml(snapshot_path, 'forcing', c_loc(lfcoefs), &
|
||||
bytes, xml_ptr, status)
|
||||
|
||||
fcoefs = lfcoefs
|
||||
deallocate(lfcoefs, stat=status)
|
||||
if (status /= 0) &
|
||||
@ -1475,6 +1382,10 @@ module io
|
||||
call print_message(loc, "The number of forcing modes does not match!")
|
||||
end if
|
||||
|
||||
! release the XML tree for 'metadata.xml' file
|
||||
!
|
||||
call XMLFreeTree(xml_ptr)
|
||||
|
||||
if (nprocs >= lnprocs) then
|
||||
|
||||
! spread the restart snapshots reading across new processes so we do not
|
||||
@ -1496,64 +1407,20 @@ module io
|
||||
|
||||
if (nl >= 0) then
|
||||
|
||||
write(fname,sfmt) trim(dname), "datablocks", nl, "xml"
|
||||
inquire(file=fname, exist=test)
|
||||
write(file_path, sfmt) trim(snapshot_path), "datablocks", nl, "xml"
|
||||
inquire(file=file_path, exist=test)
|
||||
if (.not. test) then
|
||||
write(*,*) trim(fname) // " does not exist!"
|
||||
call print_message(loc, "The file '" // trim(file_path) // &
|
||||
"' does not exist.")
|
||||
status = 121
|
||||
return
|
||||
end if
|
||||
|
||||
open(newunit=lun, file=fname, status='old')
|
||||
30 read(lun, fmt="(a)", end=40) line
|
||||
if (index(line, '<Attribute') > 0) then
|
||||
il = index(line, 'name="')
|
||||
if (il > 0) then
|
||||
il = il + 6
|
||||
iu = index(line(il:), '"') + il - 2
|
||||
write(sname,*) line(il:iu)
|
||||
il = index(line, '>') + 1
|
||||
iu = index(line, '<', back=.true.) - 1
|
||||
write(svalue,*) line(il:iu)
|
||||
call XMLParseFile(file_path, xml_ptr, status)
|
||||
|
||||
select case(trim(adjustl(sname)))
|
||||
case('dblocks')
|
||||
read(svalue, fmt=*) nd
|
||||
if (nd > 0) then
|
||||
allocate(hprim(nd), hcons(nd), stat=status)
|
||||
if (status /= 0) &
|
||||
call print_message(loc, &
|
||||
"Could not allocate space for hashes!")
|
||||
end if
|
||||
case('nregs')
|
||||
read(svalue, fmt=*) nr
|
||||
case('einj')
|
||||
read(svalue, fmt=*) einj
|
||||
case('ids')
|
||||
il = index(line, 'digest="') + 8
|
||||
iu = index(line(il:), '"') + il - 2
|
||||
call digest_integer(line(il:iu), hids)
|
||||
case('seeds')
|
||||
il = index(line, 'digest="') + 8
|
||||
iu = index(line(il:), '"') + il - 2
|
||||
call digest_integer(line(il:iu), hseed)
|
||||
end select
|
||||
if (index(sname, 'prim') > 0) then
|
||||
read(sname(7:), fmt=*) l
|
||||
il = index(line, 'digest="') + 8
|
||||
iu = index(line(il:), '"') + il - 2
|
||||
call digest_integer(line(il:iu), hprim(l))
|
||||
end if
|
||||
if (index(sname, 'cons') > 0) then
|
||||
read(sname(7:), fmt=*) l
|
||||
il = index(line, 'digest="') + 8
|
||||
iu = index(line(il:), '"') + il - 2
|
||||
call digest_integer(line(il:iu), hcons(l))
|
||||
end if
|
||||
end if
|
||||
end if
|
||||
go to 30
|
||||
40 close(lun)
|
||||
call XMLGetElementValue(xml_ptr, 'DataBlocks', 'dblocks', nd)
|
||||
call XMLGetElementValue(xml_ptr, 'DataBlocks', 'nregs' , nr)
|
||||
call XMLGetElementValue(xml_ptr, 'Forcing' , 'einj' , einj)
|
||||
|
||||
nm = lncells + 2 * lnghosts
|
||||
if (lnghosts >= nghosts) then
|
||||
@ -1574,27 +1441,18 @@ module io
|
||||
|
||||
if (status == 0) then
|
||||
|
||||
write(fname,sfmt) trim(dname), "datablock_ids", nl, "bin"
|
||||
open(newunit=lun, file=fname, form='unformatted', access='stream')
|
||||
read(lun) ids
|
||||
close(lun)
|
||||
bytes = size(ids, kind=8) * kind(ids)
|
||||
call check_digest(loc, fname, c_loc(ids), bytes, hids, dtype)
|
||||
|
||||
ubytes = size(array, kind=8) * kind(array)
|
||||
pbytes = ubytes / nr
|
||||
call read_binary_xml(snapshot_path, 'ids', c_loc(ids), &
|
||||
bytes, xml_ptr, status)
|
||||
|
||||
bytes = size(array, kind=8) * kind(array) / nr
|
||||
do l = 1, nd
|
||||
call append_datablock(pdata, status)
|
||||
call link_blocks(block_array(ids(l))%ptr, pdata)
|
||||
|
||||
write(fname,"(a,'datablock_prim_',i6.6,'_',i6.6,'.bin')") &
|
||||
trim(dname), nl, l
|
||||
open(newunit=lun, file=fname, form='unformatted', access='stream')
|
||||
read(lun) array(:,:,:,:,1)
|
||||
close(lun)
|
||||
call check_digest(loc, fname, c_loc(array), &
|
||||
pbytes, hprim(l), dtype)
|
||||
write(aname, "('prim_',i6.6)") l
|
||||
call read_binary_xml(snapshot_path, aname, c_loc(array), &
|
||||
bytes, xml_ptr, status)
|
||||
|
||||
if (lnghosts >= nghosts) then
|
||||
#if NDIMS == 3
|
||||
@ -1610,13 +1468,9 @@ module io
|
||||
#endif /* NDIMS == 3 */
|
||||
end if
|
||||
|
||||
write(fname,"(a,'datablock_cons_',i6.6,'_',i6.6,'.bin')") &
|
||||
trim(dname), nl, l
|
||||
open(newunit=lun, file=fname, form='unformatted', access='stream')
|
||||
read(lun) array
|
||||
close(lun)
|
||||
call check_digest(loc, fname, c_loc(array), &
|
||||
ubytes, hcons(l), dtype)
|
||||
write(aname, "('cons_',i6.6)") l
|
||||
call read_binary_xml(snapshot_path, aname, c_loc(array), &
|
||||
bytes * nr, xml_ptr, status)
|
||||
|
||||
p = min(nregs, nr)
|
||||
if (lnghosts >= nghosts) then
|
||||
@ -1634,7 +1488,7 @@ module io
|
||||
end if
|
||||
end do
|
||||
|
||||
deallocate(ids, array, hprim, hcons, stat=status)
|
||||
deallocate(ids, array, stat=status)
|
||||
if (status /= 0) &
|
||||
call print_message(loc, "Could not release space of datablocks!")
|
||||
else
|
||||
@ -1646,12 +1500,9 @@ module io
|
||||
|
||||
if (status == 0) then
|
||||
|
||||
write(fname,sfmt) trim(dname), "random_seeds", nl, "bin"
|
||||
open(newunit=lun, file=fname, form='unformatted', access='stream')
|
||||
read(lun) seeds
|
||||
close(lun)
|
||||
bytes = size(seeds, kind=8) * kind(seeds)
|
||||
call check_digest(loc, fname, c_loc(seeds), bytes, hseed, dtype)
|
||||
call read_binary_xml(snapshot_path, 'seeds', c_loc(seeds), &
|
||||
bytes, xml_ptr, status)
|
||||
call set_seeds(lnseeds, seeds(:,:), .false.)
|
||||
|
||||
deallocate(seeds, stat=status)
|
||||
@ -1661,40 +1512,11 @@ module io
|
||||
call print_message(loc, "Could not allocate space for seeds!")
|
||||
end if
|
||||
|
||||
call XMLFreeTree(xml_ptr)
|
||||
|
||||
else ! nl < 0
|
||||
|
||||
write(fname,sfmt) trim(dname), "datablocks", 0, "xml"
|
||||
inquire(file=fname, exist=test)
|
||||
if (.not. test) then
|
||||
write(*,*) trim(fname) // " does not exist!"
|
||||
status = 121
|
||||
return
|
||||
end if
|
||||
|
||||
open(newunit=lun, file=fname, status='old')
|
||||
50 read(lun, fmt="(a)", end=60) line
|
||||
if (index(line, '<Attribute') > 0) then
|
||||
il = index(line, 'name="')
|
||||
if (il > 0) then
|
||||
il = il + 6
|
||||
iu = index(line(il:), '"') + il - 2
|
||||
write(sname,*) line(il:iu)
|
||||
il = index(line, '>') + 1
|
||||
iu = index(line, '<', back=.true.) - 1
|
||||
write(svalue,*) line(il:iu)
|
||||
|
||||
select case(trim(adjustl(sname)))
|
||||
case('seeds')
|
||||
il = index(line, 'digest="') + 8
|
||||
iu = index(line(il:), '"') + il - 2
|
||||
call digest_integer(line(il:iu), hseed)
|
||||
end select
|
||||
end if
|
||||
end if
|
||||
go to 50
|
||||
60 close(lun)
|
||||
|
||||
! restore PRNG seeds for remaining processes
|
||||
! restore PRNG seeds for the remaining processes
|
||||
!
|
||||
if (trim(gentype) == "same") then
|
||||
|
||||
@ -1702,14 +1524,24 @@ module io
|
||||
|
||||
if (status == 0) then
|
||||
|
||||
write(fname,sfmt) trim(dname), "random_seeds", 0, "bin"
|
||||
open(newunit=lun, file=fname, form='unformatted', access='stream')
|
||||
read(lun) seeds
|
||||
close(lun)
|
||||
write(file_path, sfmt) trim(snapshot_path), "datablocks", 0, "xml"
|
||||
inquire(file=file_path, exist=test)
|
||||
if (.not. test) then
|
||||
call print_message(loc, "The file '" // trim(file_path) // &
|
||||
"' does not exist.")
|
||||
status = 121
|
||||
return
|
||||
end if
|
||||
|
||||
call XMLParseFile(file_path, xml_ptr, status)
|
||||
|
||||
bytes = size(seeds, kind=8) * kind(seeds)
|
||||
call check_digest(loc, fname, c_loc(seeds), bytes, hseed, dtype)
|
||||
call read_binary_xml(snapshot_path, 'seeds', c_loc(seeds), &
|
||||
bytes, xml_ptr, status)
|
||||
call set_seeds(lnseeds, seeds(:,:), .false.)
|
||||
|
||||
call XMLFreeTree(xml_ptr)
|
||||
|
||||
deallocate(seeds, stat=status)
|
||||
if (status /= 0) &
|
||||
call print_message(loc, "Could not release space of seeds!")
|
||||
@ -1747,66 +1579,21 @@ module io
|
||||
|
||||
do n = nl, nu
|
||||
|
||||
write(fname,sfmt) trim(dname), "datablocks", n, "xml"
|
||||
inquire(file=fname, exist=test)
|
||||
write(file_path, sfmt) trim(snapshot_path), "datablocks", n, "xml"
|
||||
inquire(file=file_path, exist=test)
|
||||
if (.not. test) then
|
||||
write(*,*) trim(fname) // " does not exist!"
|
||||
call print_message(loc, "The file '" // trim(file_path) // &
|
||||
"' does not exist.")
|
||||
status = 121
|
||||
return
|
||||
end if
|
||||
|
||||
! read attributes from the metadata file
|
||||
!
|
||||
open(newunit=lun, file=fname, status='old')
|
||||
70 read(lun, fmt="(a)", end=80) line
|
||||
if (index(line, '<Attribute') > 0) then
|
||||
il = index(line, 'name="')
|
||||
if (il > 0) then
|
||||
il = il + 6
|
||||
iu = index(line(il:), '"') + il - 2
|
||||
write(sname,*) line(il:iu)
|
||||
il = index(line, '>') + 1
|
||||
iu = index(line, '<', back=.true.) - 1
|
||||
write(svalue,*) line(il:iu)
|
||||
call XMLParseFile(file_path, xml_ptr, status)
|
||||
|
||||
call XMLGetElementValue(xml_ptr, 'DataBlocks', 'dblocks', nd)
|
||||
call XMLGetElementValue(xml_ptr, 'DataBlocks', 'nregs' , nr)
|
||||
call XMLGetElementValue(xml_ptr, 'Forcing' , 'einj' , deinj)
|
||||
|
||||
select case(trim(adjustl(sname)))
|
||||
case('dblocks')
|
||||
read(svalue, fmt=*) nd
|
||||
if (nd > 0) then
|
||||
allocate(hprim(nd), hcons(nd), stat=status)
|
||||
if (status /= 0) &
|
||||
call print_message(loc, &
|
||||
"Could not allocate space for hashes!")
|
||||
end if
|
||||
case('nregs')
|
||||
read(svalue, fmt=*) nr
|
||||
case('einj')
|
||||
read(svalue, fmt=*) deinj
|
||||
case('ids')
|
||||
il = index(line, 'digest="') + 8
|
||||
iu = index(line(il:), '"') + il - 2
|
||||
call digest_integer(line(il:iu), hids)
|
||||
case('seeds')
|
||||
il = index(line, 'digest="') + 8
|
||||
iu = index(line(il:), '"') + il - 2
|
||||
call digest_integer(line(il:iu), hseed)
|
||||
end select
|
||||
if (index(sname, 'prim') > 0) then
|
||||
read(sname(7:), fmt=*) l
|
||||
il = index(line, 'digest="') + 8
|
||||
iu = index(line(il:), '"') + il - 2
|
||||
call digest_integer(line(il:iu), hprim(l))
|
||||
end if
|
||||
if (index(sname, 'cons') > 0) then
|
||||
read(sname(7:), fmt=*) l
|
||||
il = index(line, 'digest="') + 8
|
||||
iu = index(line(il:), '"') + il - 2
|
||||
call digest_integer(line(il:iu), hcons(l))
|
||||
end if
|
||||
end if
|
||||
end if
|
||||
go to 70
|
||||
80 close(lun)
|
||||
einj = einj + deinj
|
||||
|
||||
nm = lncells + 2 * lnghosts
|
||||
@ -1828,27 +1615,18 @@ module io
|
||||
|
||||
if (status == 0) then
|
||||
|
||||
write(fname,sfmt) trim(dname), "datablock_ids", n, "bin"
|
||||
open(newunit=lun, file=fname, form='unformatted', access='stream')
|
||||
read(lun) ids
|
||||
close(lun)
|
||||
bytes = size(ids, kind=8) * kind(ids)
|
||||
call check_digest(loc, fname, c_loc(ids), bytes, hids, dtype)
|
||||
|
||||
ubytes = size(array, kind=8) * kind(array)
|
||||
pbytes = ubytes / nr
|
||||
call read_binary_xml(snapshot_path, 'ids', c_loc(ids), &
|
||||
bytes, xml_ptr, status)
|
||||
|
||||
bytes = size(array, kind=8) * kind(array) / nr
|
||||
do l = 1, nd
|
||||
call append_datablock(pdata, status)
|
||||
call link_blocks(block_array(ids(l))%ptr, pdata)
|
||||
|
||||
write(fname,"(a,'datablock_prim_',i6.6,'_',i6.6,'.bin')") &
|
||||
trim(dname), n, l
|
||||
open(newunit=lun, file=fname, form='unformatted', access='stream')
|
||||
read(lun) array(:,:,:,:,1)
|
||||
close(lun)
|
||||
call check_digest(loc, fname, c_loc(array), &
|
||||
pbytes, hprim(l), dtype)
|
||||
write(aname, "('prim_',i6.6)") l
|
||||
call read_binary_xml(snapshot_path, aname, c_loc(array), &
|
||||
bytes, xml_ptr, status)
|
||||
|
||||
if (lnghosts >= nghosts) then
|
||||
#if NDIMS == 3
|
||||
@ -1864,13 +1642,9 @@ module io
|
||||
#endif /* NDIMS == 3 */
|
||||
end if
|
||||
|
||||
write(fname,"(a,'datablock_cons_',i6.6,'_',i6.6,'.bin')") &
|
||||
trim(dname), n, l
|
||||
open(newunit=lun, file=fname, form='unformatted', access='stream')
|
||||
read(lun) array
|
||||
close(lun)
|
||||
call check_digest(loc, fname, c_loc(array), &
|
||||
ubytes, hcons(l), dtype)
|
||||
write(aname, "('cons_',i6.6)") l
|
||||
call read_binary_xml(snapshot_path, aname, c_loc(array), &
|
||||
bytes * nr, xml_ptr, status)
|
||||
|
||||
p = min(nregs, nr)
|
||||
if (lnghosts >= nghosts) then
|
||||
@ -1888,28 +1662,41 @@ module io
|
||||
end if
|
||||
end do
|
||||
|
||||
deallocate(ids, array, hprim, hcons, stat=status)
|
||||
deallocate(ids, array, stat=status)
|
||||
if (status /= 0) &
|
||||
call print_message(loc, "Could not release space of datablocks!")
|
||||
else
|
||||
call print_message(loc, "Could not allocate space for datablocks!")
|
||||
end if
|
||||
|
||||
end if
|
||||
|
||||
call XMLFreeTree(xml_ptr)
|
||||
|
||||
end do ! n = nl, nu
|
||||
|
||||
allocate(seeds(4,lnseeds), stat=status)
|
||||
|
||||
if (status == 0) then
|
||||
|
||||
write(fname,sfmt) trim(dname), "random_seeds", nproc, "bin"
|
||||
open(newunit=lun, file=fname, form='unformatted', access='stream')
|
||||
read(lun) seeds
|
||||
close(lun)
|
||||
write(file_path, sfmt) trim(snapshot_path), "datablocks", nproc, "xml"
|
||||
inquire(file=file_path, exist=test)
|
||||
if (.not. test) then
|
||||
call print_message(loc, "The file '" // trim(file_path) // &
|
||||
"' does not exist.")
|
||||
status = 121
|
||||
return
|
||||
end if
|
||||
|
||||
call XMLParseFile(file_path, xml_ptr, status)
|
||||
|
||||
bytes = size(seeds, kind=8) * kind(seeds)
|
||||
call check_digest(loc, fname, c_loc(seeds), bytes, hseed, dtype)
|
||||
call read_binary_xml(snapshot_path, 'seeds', c_loc(seeds), &
|
||||
bytes, xml_ptr, status)
|
||||
call set_seeds(lnseeds, seeds(:,:), .false.)
|
||||
|
||||
call XMLFreeTree(xml_ptr)
|
||||
|
||||
deallocate(seeds, stat=status)
|
||||
if (status /= 0) &
|
||||
call print_message(loc, "Could not release space of seeds!")
|
||||
@ -2949,7 +2736,7 @@ module io
|
||||
integer :: io, item_size
|
||||
integer :: digest_type, digest_length
|
||||
integer :: compressor_id, encoder_id
|
||||
integer(kind=8) :: hash, usize, csize, dsize
|
||||
integer(kind=8) :: hash, usize, csize
|
||||
integer(kind=1), dimension(:), pointer :: array
|
||||
integer(kind=1), dimension(:), allocatable, target :: buffer
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user