C $Header: /u/gcmpack/MITgcm/pkg/cfc/cfc_fields_load.F,v 1.5 2005/05/04 19:57:16 stephd Exp $
C $Name: $
#include "CPP_OPTIONS.h"
#include "GCHEM_OPTIONS.h"
CStartOfInterFace
SUBROUTINE CFC_FIELDS_LOAD (
I myIter,myTime,myThid)
C /==========================================================\
C | SUBROUTINE CFC_FIELDS_LOAD i |
C |==========================================================|
IMPLICIT NONE
C == GLobal variables ==
#include "SIZE.h"
#include "DYNVARS.h"
#include "EEPARAMS.h"
#include "PARAMS.h"
#include "GRID.h"
#include "PTRACERS_SIZE.h"
#include "PTRACERS.h"
#include "GCHEM.h"
#include "CFC.h"
C == Routine arguments ==
INTEGER myIter
_RL myTime
INTEGER myThid
#ifdef ALLOW_PTRACERS
C == Local variables ==
COMMON /cfc_load/
& wspeed0, wspeed1, ice0, ice1, atmosp0,
& atmosp1
_RS wspeed0 (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
_RS wspeed1 (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
_RS wind (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
_RS ice0 (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
_RS ice1 (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
_RS atmosp0 (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
_RS atmosp1 (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
INTEGER bi,bj,i,j,intime0,intime1
_RL aWght,bWght,rdt
INTEGER nForcingPeriods,Imytm,Ifprd,Ifcyc,Iftm
c
c
IF ( periodicExternalForcing ) THEN
C First call requires that we initialize everything to zero for safety
cQQQ need to check timing
IF ( myIter .EQ. nIter0 ) THEN
CALL LEF_ZERO( wspeed0,myThid )
CALL LEF_ZERO( wspeed1,myThid )
CALL LEF_ZERO( atmosp0,myThid )
CALL LEF_ZERO( atmosp1,myThid )
CALL LEF_ZERO( ice0,myThid )
CALL LEF_ZERO( ice1,myThid )
ENDIF
C Now calculate whether it is time to update the forcing arrays
rdt=1. _d 0 / deltaTclock
nForcingPeriods=
& int(externForcingCycle/externForcingPeriod+0.5)
cswd QQ change for placement of chem forcing (ie. after timestep)
Imytm=int(myTime*rdt+0.5)
Ifprd=int(externForcingPeriod*rdt+0.5)
Ifcyc=int(externForcingCycle*rdt+0.5)
Iftm=mod( Imytm+Ifcyc-Ifprd/2 ,Ifcyc)
intime0=int(Iftm/Ifprd)
intime1=mod(intime0+1,nForcingPeriods)
aWght=float( Iftm-Ifprd*intime0 )/float( Ifprd )
bWght=1.-aWght
intime0=intime0+1
intime1=intime1+1
cswd QQ need nIter0+1 since chem forcing after time step
IF (
& Iftm-Ifprd*(intime0-1).EQ. 0
& .OR. myIter .EQ. nIter0
& ) THEN
_BEGIN_MASTER(myThid)
C If the above condition is met then we need to read in
C data for the period ahead and the period behind myTime.
WRITE(*,*)
& 'S/R EXTERNAL_FIELDS_LOAD: Reading new cfc data',
& myTime,myIter
IF ( WindFile .NE. ' ' ) THEN
CALL READ_REC_XY_RS( WindFile,wspeed0,intime0,
& myIter,myThid )
CALL READ_REC_XY_RS( WindFile,wspeed1,intime1,
& myIter,myThid )
ENDIF
IF ( AtmospFile .NE. ' ' ) THEN
CALL READ_REC_XY_RS( AtmospFile,atmosp0,intime0,
& myIter,myThid )
CALL READ_REC_XY_RS( AtmospFile,atmosp1,intime1,
& myIter,myThid )
ENDIF
IF ( IceFile .NE. ' ' ) THEN
CALL READ_REC_XY_RS( IceFile,ice0,intime0,
& myIter,myThid )
CALL READ_REC_XY_RS( IceFile,ice1,intime1,
& myIter,myThid )
ENDIF
_END_MASTER(myThid)
C
_EXCH_XY_R4(wspeed0, myThid )
_EXCH_XY_R4(wspeed1, myThid )
_EXCH_XY_R4(atmosp0, myThid )
_EXCH_XY_R4(atmosp1, myThid )
_EXCH_XY_R4(ice0, myThid )
_EXCH_XY_R4(ice1, myThid )
C
ENDIF
DO bj = myByLo(myThid), myByHi(myThid)
DO bi = myBxLo(myThid), myBxHi(myThid)
DO j=1-Oly,sNy+Oly
DO i=1-Olx,sNx+Olx
IF ( WindFile .NE. ' ' ) THEN
WIND(i,j,bi,bj) = bWght*wspeed0(i,j,bi,bj)
& +aWght*wspeed1(i,j,bi,bj)
ELSE
WIND(i,j,bi,bj) = 5.d0*maskC(i,j,1,bi,bj)
ENDIF
c calculate piston velocity
c QQ: note - we should have wind speed variance in here
c following Wannikof (1992)
pisvel(i,j,bi,bj) =(0.31*wind(i,j,bi,bj)**2)/3.6e5
IF ( AtmospFile .NE. ' ' ) THEN
ATMOSP(i,j,bi,bj) = bWght*atmosp0(i,j,bi,bj)
& +aWght*atmosp1(i,j,bi,bj)
ELSE
ATMOSP(i,j,bi,bj) =1.d0*maskC(i,j,1,bi,bj)
ENDIF
IF ( IceFile .NE. ' ' ) THEN
FIce(i,j,bi,bj) = bWght*ice0(i,j,bi,bj)
& +aWght*ice1(i,j,bi,bj)
ELSE
FIce(i,j,bi,bj) =0.d0
ENDIF
ENDDO
ENDDO
ENDDO
ENDDO
C endif for periodicForcing
ENDIF
#endif
RETURN
END