C $Header: /u/gcmpack/MITgcm/pkg/ptracers/ptracers_read_checkpoint.F,v 1.8 2004/09/03 20:10:47 edhill Exp $
C $Name:  $

#include "PTRACERS_OPTIONS.h"

C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
CBOP
C     !ROUTINE: PTRACERS_READ_CHECKPOINT

C     !INTERFACE:
      SUBROUTINE PTRACERS_READ_CHECKPOINT( myIter, myThid )

C     !DESCRIPTION:
C     Reads current state of passive tracers from a pickup file

C     !USES:
      IMPLICIT NONE
#include "SIZE.h"
#include "EEPARAMS.h"
#include "PARAMS.h"
#include "PTRACERS_SIZE.h"
#include "PTRACERS.h"

C     !INPUT PARAMETERS:
C     myIter            :: time-step number
C     myThid            :: thread number
      INTEGER myIter
      INTEGER myThid

#ifdef ALLOW_PTRACERS

C     !LOCAL VARIABLES:
C     iTracer		:: loop indices
C     iRec    		:: record number
C     fn   		:: character buffer for creating filename
C     prec 		:: precision of pickup files
C     fn                :: suffix for pickup file (eg. 0000000010)
      INTEGER iTracer,prec,iRec
      CHARACTER*(MAX_LEN_MBUF) fn
CEOP

      WRITE(fn,'(A,I10.10)') 'pickup_ptracers.',myIter
      prec = precFloat64
      
#ifdef ALLOW_MNC
C       IF (useMNC .AND. PTRACERS_mnc_read) THEN
C C       Read variables from the pickup file
C         CALL MNC_FILE_CLOSE_ALL_MATCHING(fn, myThid)
C         CALL MNC_CW_SET_UDIM(fn, 1, myThid)
C         CALL MNC_CW_RL_R('D',fn,0,0,'uVelD',uVelD, myThid)
C         CALL MNC_CW_RL_R('D',fn,0,0,'vVelD',vVelD, myThid)
C         CALL MNC_CW_RL_R('D',fn,0,0,'Unm1',Unm1, myThid)
C         CALL MNC_CW_RL_R('D',fn,0,0,'Vnm1',Vnm1, myThid)
C         CALL MNC_CW_RL_R('D',fn,0,0,'etaNm1', etaNm1, myThid)
C       ELSE
#endif /*  ALLOW_MNC  */

      IF ( usePickupBeforeC54 ) THEN
C       Read fields as consecutive records
        DO iTracer=1,PTRACERS_num
          iRec = iTracer
          CALL MDSREADFIELD(fn,prec,'RL',Nr,
     &         pTracer(1-Olx,1-Oly,1,1,1,iTracer),iRec,myThid)
      _EXCH_XYZ_R8(pTracer(1-Olx,1-Oly,1,1,1,iTracer),myThid)
        ENDDO

C       Read historical tendancies as consecutive records
        DO iTracer=1,PTRACERS_num
          iRec = iTracer + PTRACERS_num
          CALL MDSREADFIELD(fn,prec,'RL',Nr,
     &         gPtr(1-Olx,1-Oly,1,1,1,iTracer),iRec,myThid)
      _EXCH_XYZ_R8(gPtr(1-Olx,1-Oly,1,1,1,iTracer),myThid)
        ENDDO
        DO iTracer=1,PTRACERS_num
          iRec = iTracer + PTRACERS_num*2
          CALL MDSREADFIELD(fn,prec,'RL',Nr,
     &         gPtrNm1(1-Olx,1-Oly,1,1,1,iTracer),iRec,myThid)
      _EXCH_XYZ_R8(gPtrNm1(1-Olx,1-Oly,1,1,1,iTracer),myThid)
        ENDDO

      ELSE
C       Read fields & tendancies (needed for AB) as consecutive records,
C       one tracer after the other, only for tracers "InUse".  Note:
C       this allow to restart from a pickup with a different number of
C       tracers, with write_pickup dumping all of them (PTRACERS_num).
        DO iTracer=1,PTRACERS_numInUse
          iRec = 2*iTracer -1 
          CALL MDSREADFIELD(fn,prec,'RL',Nr,
     &         pTracer(1-Olx,1-Oly,1,1,1,iTracer),iRec,myThid)
          iRec = 2*iTracer
          CALL MDSREADFIELD(fn,prec,'RL',Nr,
     &         gPtrNm1(1-Olx,1-Oly,1,1,1,iTracer),iRec,myThid)
      _EXCH_XYZ_R8(pTracer(1-Olx,1-Oly,1,1,1,iTracer),myThid)
      _EXCH_XYZ_R8(gPtrNm1(1-Olx,1-Oly,1,1,1,iTracer),myThid)
        ENDDO
        
      ENDIF

#ifdef ALLOW_MNC
C     ENDIF
#endif /*  ALLOW_MNC  */

#endif /* ALLOW_PTRACERS */

      RETURN
      END