[Dart-dev] [3255] DART/trunk/models/MITgcm_ocean/model_mod.f90:
file to read the MITgcm '.meta' files works and fills a derived type.
thoar at subversion.ucar.edu
thoar at subversion.ucar.edu
Thu Mar 13 16:18:37 MDT 2008
An HTML attachment was scrubbed...
URL: http://mailman.ucar.edu/pipermail/dart-dev/attachments/20080313/1dade0cb/attachment.html
-------------- next part --------------
Modified: DART/trunk/models/MITgcm_ocean/model_mod.f90
===================================================================
--- DART/trunk/models/MITgcm_ocean/model_mod.f90 2008-03-13 21:01:38 UTC (rev 3254)
+++ DART/trunk/models/MITgcm_ocean/model_mod.f90 2008-03-13 22:18:36 UTC (rev 3255)
@@ -19,8 +19,8 @@
use location_mod, only : location_type, get_close_maxdist_init, &
get_close_obs_init, get_close_obs, set_location, &
VERTISHEIGHT
-use utilities_mod, only : register_module, error_handler, E_ERR, E_MSG, &
- logfileunit, &
+use utilities_mod, only : register_module, error_handler, E_ERR, E_WARN, E_MSG, &
+ logfileunit, get_unit, &
find_namelist_in_file, check_namelist_read
use obs_kind_mod, only : KIND_TEMPERATURE
@@ -49,7 +49,8 @@
get_close_maxdist_init, &
get_close_obs_init, &
get_close_obs, &
- ens_mean_for_model
+ ens_mean_for_model, &
+ MIT_meta_type, read_meta
! version controlled file description for error handling, do not edit
@@ -58,6 +59,7 @@
revision = "$Revision$", &
revdate = "$Date: 2007-04-03 16:44:36 -0600 (Tue, 03 Apr 2007) $"
+character(len=128) :: msgstring
!------------------------------------------------------------------
!
@@ -229,6 +231,16 @@
logical :: output_state_vector = .true.
namelist /model_nml/ output_state_vector
+! /pkg/mdsio/mdsio_write_meta.F writes the .meta files
+type MIT_meta_type
+! private
+ integer :: nDims
+ integer :: dimList(3)
+ character(len=32) :: dataprec
+ integer :: reclen
+ integer :: nrecords
+ integer :: timeStepNumber ! optional
+end type MIT_meta_type
contains
@@ -866,6 +878,216 @@
+
+ function read_meta(fbase, vartype)
+!------------------------------------------------------------------
+! function read_meta(fbase,vartype)
+!
+! Reads the meta files associated with each 'snapshot'
+! and fills the appropriate parts of the output structure.
+!
+! I believe pkg/mdsio/mdsio_write_meta.F writes the .meta files
+!
+! The files look something like:
+!
+! nDims = [ 2 ];
+! dimList = [
+! 256, 1, 256,
+! 225, 1, 225
+! ];
+! dataprec = [ 'float32' ];
+! nrecords = [ 1 ];
+! timeStepNumber = [ 0 ];
+!
+! USAGE:
+! metadata = read_meta('U.0000000024')
+! ... or ...
+! metadata = read_meta('0000000024','U')
+
+character(len=*), intent(in) :: fbase
+character(len=*), OPTIONAL, intent(in) :: vartype
+type(MIT_meta_type) :: read_meta
+
+character(len=128) :: filename, charstring
+integer :: iunit, io
+integer :: i, j, indx, nlines, dim1, dimN
+
+if (present(vartype)) then
+ filename = vartype//'.'//trim(fbase)//'.meta'
+else
+ filename = trim(fbase)//'.meta'
+endif
+
+! Initialize to bogus values
+
+read_meta%nDims = 0
+read_meta%dimList = (/ 0, 0, 0 /)
+read_meta%dataprec = 'null'
+read_meta%reclen = 0
+read_meta%nrecords = 0
+read_meta%timeStepNumber = 0
+
+! Get next available unit number and open the file
+
+iunit = get_unit()
+open(unit=iunit, file=filename, action='read', form='formatted', iostat = io)
+if (io /= 0) then
+ write(msgstring,*) 'unable to open file ', trim(filename), ' for reading'
+ call error_handler(E_ERR,'model_mod:read_meta',msgstring,source,revision,revdate)
+endif
+
+! Read every line looking for the nDims entry
+! Count the lines just to make future loops more sensible.
+! nDims = [ 2 ];
+
+nlines = 0
+ReadnDims: do i = 1,1000
+ read(iunit,'(a)', iostat = io)charstring
+ if (io /= 0) exit ReadnDims
+ nlines = nlines + 1
+
+ indx = index(charstring,'nDims = [')
+ if (indx > 0) then
+ read(charstring(indx+9:),*,iostat=io)read_meta%nDims
+ if (io /= 0 )then
+ write(msgstring,*)'unable to parse line ',nlines,' from ', trim(filename)
+ call error_handler(E_ERR,'model_mod:read_meta:nDims',msgstring,source,revision,revdate)
+ endif
+ endif
+enddo ReadnDims
+
+if (read_meta%nDims < 1) then
+ write(msgstring,*) 'unable to determine nDims from ', trim(filename)
+ call error_handler(E_ERR,'model_mod:read_meta',msgstring,source,revision,revdate)
+endif
+
+! Read every line looking for the dimList entry
+! dimList = [
+! 256, 1, 256,
+! 225, 1, 225
+! ];
+
+rewind(iunit)
+ReaddimList: do i = 1,nlines
+
+ read(iunit,'(a)', iostat = io)charstring
+ if (io /= 0) then
+ write(msgstring,*) 'unable to read line ',i,' of ', trim(filename)
+ call error_handler(E_ERR,'model_mod:read_meta:dimList',msgstring,source,revision,revdate)
+ endif
+
+ indx = index(charstring,'dimList = [')
+
+ if (indx > 0) then
+ do j = 1,read_meta%nDims
+ read(iunit,*,iostat=io)read_meta%dimList(j),dim1,dimN
+ if (io /= 0) then
+ write(msgstring,*)'unable to parse dimList(',j, ') from ', trim(filename)
+ call error_handler(E_ERR,'model_mod:read_meta',msgstring,source,revision,revdate)
+ endif
+ enddo
+ exit ReaddimList
+ endif
+enddo ReaddimList
+
+if (all(read_meta%dimList < 1)) then
+ write(msgstring,*) 'unable to determine dimList from ', trim(filename)
+ call error_handler(E_ERR,'model_mod:read_meta',msgstring,source,revision,revdate)
+endif
+
+
+! Read every line looking for the dataprec entry
+! dataprec = [ 'float32' ];
+
+rewind(iunit)
+Readdataprec: do i = 1,nlines
+
+ read(iunit,'(a)', iostat = io)charstring
+ if (io /= 0) then
+ write(msgstring,*) 'unable to read line ',i,' of ', trim(filename)
+ call error_handler(E_ERR,'model_mod:read_meta:dataprec',msgstring,source,revision,revdate)
+ endif
+
+ indx = index(charstring,'dataprec = [')
+
+ if (indx > 0) then
+ read(charstring(indx+12:),*,iostat=io)read_meta%dataprec
+ if (io /= 0) then
+ write(msgstring,*)'unable to parse dataprec from ', trim(filename)
+ call error_handler(E_ERR,'model_mod:read_meta',msgstring,source,revision,revdate)
+ endif
+ exit Readdataprec
+ endif
+enddo Readdataprec
+
+if (index(read_meta%dataprec,'null') > 0) then
+ write(msgstring,*) 'unable to determine dataprec from ', trim(filename)
+ call error_handler(E_ERR,'model_mod:read_meta',msgstring,source,revision,revdate)
+endif
+
+
+! Read every line looking for the nrecords entry
+! nrecords = [ 1 ];
+
+rewind(iunit)
+Readnrecords: do i = 1,nlines
+ read(iunit,'(a)', iostat = io)charstring
+ if (io /= 0) then
+ call error_handler(E_ERR,'model_mod:read_meta','message',source,revision,revdate)
+ endif
+
+ indx = index(charstring,'nrecords = [')
+
+ if (indx > 0) then
+ read(charstring(indx+12:),*,iostat=io)read_meta%nrecords
+ if (io /= 0) then
+ write(msgstring,*)'unable to parse nrecords from ', trim(filename)
+ call error_handler(E_ERR,'model_mod:read_meta',msgstring,source,revision,revdate)
+ endif
+ exit Readnrecords
+ endif
+enddo Readnrecords
+
+if (read_meta%nrecords < 1) then
+ write(msgstring,*) 'unable to determine nrecords from ', trim(filename)
+ call error_handler(E_ERR,'model_mod:read_meta',msgstring,source,revision,revdate)
+endif
+
+
+! Read every line looking for the timeStepNumber entry
+! timeStepNumber = [ 0 ];
+
+rewind(iunit)
+ReadtimeStepNumber: do i = 1,nlines
+ read(iunit,'(a)', iostat = io)charstring
+ if (io /= 0) then
+ call error_handler(E_ERR,'model_mod:read_meta','message',source,revision,revdate)
+ endif
+
+ indx = index(charstring,'timeStepNumber = [')
+ if (indx > 0) then
+ read(charstring(indx+18:),*,iostat=io)read_meta%timeStepNumber
+ if (io /= 0) then
+ write(msgstring,*)'unable to parse timeStepNumber from ', trim(filename)
+ call error_handler(E_ERR,'model_mod:read_meta',msgstring,source,revision,revdate)
+ endif
+ exit ReadtimeStepNumber
+
+ endif
+enddo ReadtimeStepNumber
+
+if (read_meta%nrecords < 1) then
+ write(msgstring,*) 'unable to determine timeStepNumber from ', trim(filename)
+ call error_handler(E_WARN,'model_mod:read_meta',msgstring,source,revision,revdate)
+endif
+
+end function read_meta
+
+
+
+
+
+
!===================================================================
! End of model_mod
!===================================================================
More information about the Dart-dev
mailing list