C $Header: /u/gcmpack/MITgcm/pkg/aim_v23/aim_write_phys.F,v 1.2 2009/06/09 22:44:02 jmc Exp $
C $Name: $
#include "AIM_OPTIONS.h"
CBOP
C !ROUTINE: AIM_WRITE_PHYS
C !INTERFACE:
SUBROUTINE AIM_WRITE_PHYS(
I pref, suff, nNr, field,
I kLev, bi, bj, iRec, myIter, myThid )
C !DESCRIPTION: \bv
C *==========================================================*
C | SUBROUTINE AIM_WRITE_PHYS
C | o Write variable from AIM physics common block
C | (=> no overlap & nThreads) and reverse K index.
C *==========================================================*
C | Note: assume symetry in tiles per thread treatment
C *==========================================================*
C !USES
IMPLICIT NONE
C == Global variables ===
#include "AIM_SIZE.h"
#include "EEPARAMS.h"
c #include "PARAMS.h"
C !INPUT/OUTPUT PARAMETERS:
C == Routine arguments ==
C pref :: Prefix of the output file name
C suff :: Suffix of the output file name
C nNr :: 3rd dim. of the input field
C field :: Field (from aim-physics) to write
C kLev :: level index to write (0 = write all levels)
C bi,bj :: Tile index
C iRec :: reccord number in the output file
C myIter :: Current iteration number in simulation
C myThid :: my Thread Id number
CHARACTER*(*) pref, suff
INTEGER nNr
_RL field(sNx,sNy,nNr,MAX_NO_THREADS)
INTEGER kLev, bi, bj, iRec, myIter, myThid
#ifdef ALLOW_AIM
C Functions
INTEGER ILNBLNK
EXTERNAL
C !LOCAL VARIABLES:
CHARACTER*(MAX_LEN_MBUF) msgBuf
_RL tmpFld(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)
INTEGER iL
INTEGER i, j, k, Katm, nLoc
INTEGER ith, biLoc, bjLoc
CEOP
C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
#ifdef LOCBIN_IO_THREAD_SAFE
C- safe for any thread to do IO
ith = myThid
biLoc = bi
bjLoc = bj
#else /* LOCBIN_IO_THREAD_SAFE */
C- master-thread does IO for all threads
_BARRIER
_BEGIN_MASTER( myThid )
DO ith=1,nThreads
biLoc = bi + myBxLo(ith) - 1
bjLoc = bj + myByLo(ith) - 1
#endif /* LOCBIN_IO_THREAD_SAFE */
C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
C-- Check for argument list consistency
IF ( nNr.LT.1 .OR. nNr.GT.Nr ) THEN
iL = ILNBLNK( pref )
WRITE(msgBuf,'(A,I10,A,2I5,A,I4,2A)')
& 'AIM_WRITE_PHYS (it=', myIter, ' bi,bj=', bi,bj,
& ' iRec=', iRec, ' ): try to write: ', pref(1:iL)
CALL PRINT_ERROR( msgBuf, myThid )
WRITE(msgBuf,'(A,I4,A,I4)')
& 'AIM_WRITE_PHYS: 3rd dim.(field)=',nNr,' has to be <',Nr
CALL PRINT_ERROR( msgBuf , myThid)
STOP 'ABNORMAL END: S/R AIM_WRITE_PHYS'
ELSEIF ( kLev.NE.0 .AND. kLev.GT.nNr ) THEN
iL = ILNBLNK( pref )
WRITE(msgBuf,'(A,I10,A,2I5,A,I4,2A)')
& 'AIM_WRITE_PHYS (it=', myIter, ' bi,bj=', bi,bj,
& ' iRec=', iRec, ' ): try to write: ', pref(1:iL)
CALL PRINT_ERROR( msgBuf, myThid )
WRITE(msgBuf,'(A,I4,A,I4)')
& 'AIM_WRITE_PHYS: kLev=', kLev,
& ' out of bounds (dim=', nNr,' )'
CALL PRINT_ERROR( msgBuf , myThid)
STOP 'ABNORMAL END: S/R AIM_WRITE_PHYS'
ENDIF
C-- Copy the input field into tempo. array:
nLoc = nNr
IF ( kLev.GE.1 .AND. kLev.LE.nNr ) THEN
nLoc = 1
DO j=1,sNy
DO i=1,sNx
tmpFld(i,j,1) = field(i,j,kLev,ith)
ENDDO
ENDDO
ELSEIF (nNr.EQ.Nr) THEN
C- Reverse K index:
DO k=1,Nr
Katm = _KD2KA( k )
DO j=1,sNy
DO i=1,sNx
tmpFld(i,j,k) = field(i,j,Katm,ith)
ENDDO
ENDDO
ENDDO
ELSE
C- Do simple copy
DO k=1,nNr
DO j=1,sNy
DO i=1,sNx
tmpFld(i,j,k) = field(i,j,k,ith)
ENDDO
ENDDO
ENDDO
ENDIF
C-- Write to file: note: call with myThArg=0 => single thread job
CALL WRITE_LOCAL_RL( pref, suff, nLoc, tmpFld,
& biLoc, bjLoc, iRec, myIter, 0 )
C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
#ifndef LOCBIN_IO_THREAD_SAFE
ENDDO
_END_MASTER( myThid )
_BARRIER
#endif /* ndef LOCBIN_IO_THREAD_SAFE */
#endif /* ALLOW_AIM */
RETURN
END