C $Header: /u/gcmpack/MITgcm/pkg/diagnostics/diagnostics_write_pickup.F,v 1.7 2005/05/25 04:03:09 edhill Exp $
C $Name: $
#include "DIAG_OPTIONS.h"
C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
CBOP
C !ROUTINE: DIAGNOSTICS_WRITE_PICKUP
C !INTERFACE:
SUBROUTINE DIAGNOSTICS_WRITE_PICKUP(
I suff,
I myTime,
I myIter,
I myThid )
C !DESCRIPTION:
C Writes current state of the diagnostics package.
C !USES:
IMPLICIT NONE
C == Global variables ===
#include "SIZE.h"
#include "EEPARAMS.h"
#include "PARAMS.h"
#include "DIAGNOSTICS_SIZE.h"
#include "DIAGNOSTICS.h"
C !INPUT/OUTPUT PARAMETERS:
C suff :: suffix for pickup file (eg. ckptA or 0000000010)
C myTime :: current time
C myIter :: time-step number
C myThid :: Number of this instance
CHARACTER*(*) suff
_RL myTime
INTEGER myIter
INTEGER myThid
#ifdef ALLOW_DIAGNOSTICS
#ifdef DIAGNOSTICS_HAS_PICKUP
C !LOCAL VARIABLES:
C fn :: character buffer for creating filename
C prec :: precision of pickup files
c INTEGER prec, iChar, lChar, k
INTEGER prec, lChar, i, sn
CHARACTER*(MAX_LEN_FNAM) fn
INTEGER ILNBLNK
EXTERNAL
#ifdef ALLOW_MDSIO
LOGICAL lgf
INTEGER dUnit, n, m
#endif /* ALLOW_MDSIO */
#ifdef ALLOW_MNC
INTEGER ii
CHARACTER*(MAX_LEN_FNAM) diag_mnc_bn
INTEGER CW_DIMS, NLEN
PARAMETER ( CW_DIMS = 10 )
PARAMETER ( NLEN = 80 )
INTEGER dim(CW_DIMS), ib(CW_DIMS), ie(CW_DIMS)
CHARACTER*(NLEN) dn(CW_DIMS)
CHARACTER*(NLEN) d_cw_name
CHARACTER*(NLEN) dn_blnk
#endif /* ALLOW_MNC */
CEOP
C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
IF (diag_pickup_write) THEN
#ifdef ALLOW_MNC
IF (diag_pickup_write_mnc) THEN
DO i = 1,NLEN
dn_blnk(i:i) = ' '
ENDDO
DO i = 1,MAX_LEN_FNAM
diag_mnc_bn(i:i) = ' '
ENDDO
WRITE(diag_mnc_bn,'(A)') 'pickup_diagnostics'
C Update the record dimension by writing the iteration number
CALL MNC_CW_SET_UDIM(diag_mnc_bn, -1, myThid)
CALL MNC_CW_RL_W_S('D',diag_mnc_bn,0,0,'T',myTime,myThid)
CALL MNC_CW_SET_UDIM(diag_mnc_bn, 0, myThid)
CALL MNC_CW_I_W_S('I',diag_mnc_bn,0,0,'iter',myIter,myThid)
C Write the qdiag() array
d_cw_name(1:NLEN) = dn_blnk(1:NLEN)
DO ii = 1,CW_DIMS
dn(ii)(1:NLEN) = dn_blnk(1:NLEN)
ENDDO
d_cw_name(1:10) = 'diag_state'
dn(1)(1:3) = 'Xp1'
dim(1) = sNx + 2*OLx
ib(1) = OLx + 1
ie(1) = OLx + sNx + 1
dn(2)(1:3) = 'Yp1'
dim(2) = sNy + 2*OLy
ib(2) = OLy + 1
ie(2) = OLy + sNy + 1
dn(3)(1:2) = 'Nd'
dim(3) = numdiags
ib(3) = 1
ie(3) = numdiags
dn(4)(1:1) = 'T'
dim(4) = -1
ib(4) = 1
ie(4) = 1
CALL MNC_CW_ADD_GNAME(d_cw_name, 4,
& dim, dn, ib, ie, myThid)
CALL MNC_CW_ADD_VNAME(d_cw_name, d_cw_name,
& 4,5, myThid)
CALL MNC_CW_ADD_VATTR_TEXT(d_cw_name,'description',
& 'diagnostics state',myThid)
CALL MNC_CW_RL_W('D',diag_mnc_bn,0,0,
& d_cw_name, qdiag, myThid)
CALL MNC_CW_DEL_VNAME(d_cw_name, myThid)
CALL MNC_CW_DEL_GNAME(d_cw_name, myThid)
C Write the ndiag() array
d_cw_name(1:NLEN) = dn_blnk(1:NLEN)
DO ii = 1,CW_DIMS
dn(ii)(1:NLEN) = dn_blnk(1:NLEN)
ENDDO
d_cw_name(1:10) = 'diag_count'
dn(1)(1:2) = 'Nd'
dim(1) = numdiags
ib(1) = 1
ie(1) = numdiags
dn(2)(1:1) = 'T'
dim(2) = -1
ib(2) = 1
ie(2) = 1
CALL MNC_CW_ADD_GNAME(d_cw_name, 2,
& dim, dn, ib, ie, myThid)
CALL MNC_CW_ADD_VNAME(d_cw_name, d_cw_name,
& 4,5, myThid)
CALL MNC_CW_ADD_VATTR_TEXT(d_cw_name,'description',
& 'diagnostics state',myThid)
CALL MNC_CW_I_W('I',diag_mnc_bn,0,0,
& d_cw_name, ndiag, myThid)
CALL MNC_CW_DEL_VNAME(d_cw_name, myThid)
CALL MNC_CW_DEL_GNAME(d_cw_name, myThid)
ENDIF
#endif
#ifdef ALLOW_MDSIO
IF (diag_pickup_write_mdsio) THEN
_BEGIN_MASTER( myThid )
sn = ILNBLNK(suff)
C Write qdiag()
DO i = 1,80
fn(i:i) = ' '
ENDDO
write(fn,'(a,a)') 'pickup_qdiag.', suff(1:sn)
prec = precFloat64
lgf = globalFiles
CALL MDSWRITEFIELD(fn,prec,lgf,'RL',numdiags,qdiag,
& 1,myIter,myThid)
C Write ndiag()
DO i = 1,80
fn(i:i) = ' '
ENDDO
WRITE(fn,'(a,a)') 'pickup_ndiag.', suff(1:sn)
CALL MDSFINDUNIT( dUnit, mythid )
OPEN( dUnit, file=fn )
DO n = 1,nlists
DO m = 1,nfields(n)
WRITE(dUnit,'(I10)') ndiag(jdiag(m,n))
ENDDO
ENDDO
CLOSE( dUnit )
_END_MASTER( myThid )
ENDIF
#endif /* ALLOW_MDSIO */
ENDIF
#endif /* ALLOW_DIAGNOSTICS */
#endif /* DIAGNOSTICS_HAS_PICKUP */
RETURN
END