C $Header: /u/gcmpack/MITgcm/pkg/exf/exf_set_uv.F,v 1.37 2017/03/10 00:16:11 jmc Exp $
C $Name: $
#include "EXF_OPTIONS.h"
C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
C !ROUTINE: EXF_INIT_FLD
C !INTERFACE:
SUBROUTINE EXF_SET_UV(
I uVecName, uVecFile, uVecMask,
I uVecStartTime, uVecPeriod, uVecRepeatCycle,
I uVec_inScale, uVec_remove_intercept, uVec_remove_slope,
U uVec, uVec0, uVec1,
I vVecName, vVecFile, vVecMask,
I vVecStartTime, vVecPeriod, vVecRepeatCycle,
I vVec_inScale, vVec_remove_intercept, vVec_remove_slope,
U vVec, vVec0, vVec1,
#ifdef USE_EXF_INTERPOLATION
I uVec_lon0, uVec_lon_inc, uVec_lat0, uVec_lat_inc,
I uVec_nlon, uVec_nlat, u_interp_method,
I vVec_lon0, vVec_lon_inc, vVec_lat0, vVec_lat_inc,
I vVec_nlon, vVec_nlat, v_interp_method, uvInterp,
#endif /* USE_EXF_INTERPOLATION */
I myTime, myIter, myThid )
C !DESCRIPTION: \bv
C *=================================================================*
C | SUBROUTINE EXF_SET_UV
C | o Read-in, interpolate, and rotate wind or wind stress vectors
C | from a spherical-polar input grid to an arbitrary output grid.
C *=================================================================*
C | menemenlis@jpl.nasa.gov, 8-Dec-2003
C *=================================================================*
C \ev
C !USES:
IMPLICIT NONE
C == global variables ==
#include "EEPARAMS.h"
#include "SIZE.h"
#include "PARAMS.h"
#include "GRID.h"
#include "EXF_INTERP_SIZE.h"
#include "EXF_PARAM.h"
#include "EXF_CONSTANTS.h"
#include "EXF_FIELDS.h"
C !INPUT/OUTPUT PARAMETERS:
C *VecName :: vector compon. short name (to print mesg)
C *VecFile :: file-name for this vector compon. field
C *VecStartTime :: corresponding starting time (in sec) for this vec
C *VecPeriod :: time period (in sec) between 2 reccords
C *VecRepeatCycle :: time duration of a repeating cycle
C *Vec_inScale :: input field scaling factor
C *VecRemove_intercept ::
C *VecRemove_slope ::
C *Vec :: field array containing current time values
C *Vec0 :: field array holding previous reccord
C *Vec1 :: field array holding next reccord
#ifdef USE_EXF_INTERPOLATION
C *vec_lon0, *vec_lat0 :: longitude and latitude of SouthWest
C :: corner of global input grid for *vec
C *vec_nlon, *vec_nlat :: input x-grid and y-grid size for *vec
C *_interp_method :: select interpolation method for *vec
C *vec_lon_inc :: scalar x-grid increment for *vec
C *vec_lat_inc :: vector y-grid increments for *vec
#endif /* USE_EXF_INTERPOLATION */
C myTime :: Current time (in sec) in simulation
C myIter :: Current iteration number
C myThid :: My Thread Id number
CHARACTER*(*) uVecName
CHARACTER*(128) uVecFile
CHARACTER*1 uVecMask
_RL uVecStartTime, uVecPeriod, uVecRepeatCycle
_RL uVec_inScale
_RL uVec_remove_intercept, uVec_remove_slope
_RL uVec (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
_RL uVec0 (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
_RL uVec1 (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
CHARACTER*(*) vVecName
CHARACTER*(128) vVecFile
CHARACTER*1 vVecMask
_RL vVecStartTime, vVecPeriod, vVecRepeatCycle
_RL vVec_inScale
_RL vVec_remove_intercept, vVec_remove_slope
_RL vVec (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
_RL vVec0 (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
_RL vVec1 (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
#ifdef USE_EXF_INTERPOLATION
_RL uVec_lon0, uVec_lon_inc
_RL uVec_lat0, uVec_lat_inc(MAX_LAT_INC)
INTEGER uVec_nlon, uVec_nlat, u_interp_method
_RL vVec_lon0, vVec_lon_inc
_RL vVec_lat0, vVec_lat_inc(MAX_LAT_INC)
INTEGER vVec_nlon, vVec_nlat, v_interp_method
LOGICAL uvInterp
#endif /* USE_EXF_INTERPOLATION */
_RL myTime
INTEGER myIter
INTEGER myThid
C !FUNCTIONS:
INTEGER ILNBLNK
EXTERNAL
C !LOCAL VARIABLES:
INTEGER i, j, bi, bj
_RL tmp_u (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
_RL tmp_v (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
#ifdef USE_EXF_INTERPOLATION
C msgBuf :: Informational/error message buffer
CHARACTER*(MAX_LEN_MBUF) msgBuf
CHARACTER*(128) uVecFile0, uVecFile1
CHARACTER*(128) vVecFile0, vVecFile1
CHARACTER*(MAX_LEN_FNAM) out_uVecFile, out_vVecFile
LOGICAL first, changed
_RL fac
#ifdef EXF_USE_OLD_VEC_ROTATION
_RL x1, x2, x3, x4, y1, y2, y3, y4, dx, dy
#endif
INTEGER count0, count1
INTEGER year0, year1
# ifndef EXF_INTERP_USE_DYNALLOC
_RL bufArr1( exf_interp_bufferSize )
_RL bufArr2( exf_interp_bufferSize )
# endif
#endif /* USE_EXF_INTERPOLATION */
CEOP
#ifdef USE_EXF_INTERPOLATION
IF ( u_interp_method.GE.1 .AND. v_interp_method.GE.1 .AND.
& uVecFile.NE.' ' .AND. vVecFile.NE.' ' .AND.
& (usingCurvilinearGrid .OR. rotateGrid .OR. uvInterp) ) THEN
IF ( exf_debugLev.GE.debLevD ) THEN
_BEGIN_MASTER( myThid )
i = ILNBLNK(uVecFile)
j = ILNBLNK(vVecFile)
WRITE(msgBuf,'(6A)') 'EXF_SET_UV: ',
& 'processing fields "', uVecName, '" & "', vVecName, '"'
CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
& SQUEEZE_RIGHT, myThid )
WRITE(msgBuf,'(6A)') 'EXF_SET_UV: ',
& ' files: ', uVecFile(1:i), ' & ', vVecFile(1:j)
CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
& SQUEEZE_RIGHT, myThid )
_END_MASTER( myThid )
ENDIF
IF ( useCAL .AND. uVecPeriod .EQ. -12. ) THEN
#ifdef ALLOW_CAL
C- genperiod=-12 means input file contains 12 monthly means
C records, corresponding to Jan. (rec=1) through Dec. (rec=12)
CALL CAL_GETMONTHSREC(
O fac, first, changed,
O count0, count1,
I myTime, myIter, myThid )
#endif /* ALLOW_CAL */
ELSEIF ( uVecPeriod .LT. 0. ) THEN
j = ILNBLNK(uVecFile)
WRITE(msgBuf,'(4A,1PE16.8,2A)') 'EXF_SET_UV: ',
& '"', uVecName, '", Invalid uVecPeriod=', uVecPeriod,
& ' for file: ', uVecFile(1:j)
CALL PRINT_ERROR( msgBuf, myThid )
STOP 'ABNORMAL END: S/R EXF_SET_UV'
ELSE
C- get record numbers and interpolation factor
CALL EXF_GETFFIELDREC(
I uVecStartTime, uVecPeriod, uVecRepeatCycle,
I uVecName, useExfYearlyFields,
O fac, first, changed,
O count0, count1, year0, year1,
I myTime, myIter, myThid )
ENDIF
IF ( exf_debugLev.GE.debLevD ) THEN
_BEGIN_MASTER( myThid )
WRITE(msgBuf,'(2A,I10,2I7)') 'EXF_SET_UV: ',
& ' myIter, count0, count1:', myIter, count0, count1
CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
& SQUEEZE_RIGHT, myThid )
WRITE(msgBuf,'(2A,2(L2,2X),E16.9)') 'EXF_SET_UV: ',
& ' first, changed, fac: ', first, changed, fac
CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
& SQUEEZE_RIGHT, myThid )
_END_MASTER( myThid )
ENDIF
IF ( first ) THEN
C-- Load and interpolate a new reccord (= 1rst one of this run)
CALL EXF_GETYEARLYFIELDNAME(
I useExfYearlyFields, twoDigitYear, uVecPeriod, year0,
I uVecFile,
O uVecFile0,
I myTime, myIter, myThid )
CALL EXF_GETYEARLYFIELDNAME(
I useExfYearlyFields, twoDigitYear, vVecPeriod, year0,
I vVecFile,
O vVecFile0,
I myTime, myIter, myThid )
IF ( exf_debugLev.GE.debLevC ) THEN
_BEGIN_MASTER(myThid)
WRITE(msgBuf,'(6A,I10)') 'EXF_SET_UV: ',
& 'fields "', uVecName, '" & "', vVecName, '", it=', myIter
CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
& SQUEEZE_RIGHT, myThid )
j = ILNBLNK(uVecFile0)
WRITE(msgBuf,'(2A,I6,3A)') 'EXF_SET_UV: ',
& 'loading rec=', count0, ' from file: "', uVecFile0(1:j), '"'
CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
& SQUEEZE_RIGHT, myThid )
j = ILNBLNK(vVecFile0)
WRITE(msgBuf,'(2A,I6,3A)') 'EXF_SET_UV: ',
& 'loading rec=', count0, ' from file: "', vVecFile0(1:j), '"'
CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
& SQUEEZE_RIGHT, myThid )
_END_MASTER(myThid)
ENDIF
IF ( uvInterp ) THEN
C- vector interpolation to (xC,yC) locations
CALL EXF_INTERP_UV(
I uVecFile0, vVecFile0, exf_iprec, count0,
I uVec_nlon, uVec_nlat,
I uVec_lon0, uVec_lon_inc, uVec_lat0, uVec_lat_inc,
#ifdef EXF_INTERP_USE_DYNALLOC
O tmp_u, tmp_v,
#else
O tmp_u, tmp_v, bufArr1, bufArr2,
#endif
I xC, yC,
I u_interp_method, v_interp_method, myIter, myThid )
ELSE
C- scalar interpolation to (xC,yC) locations
CALL EXF_INTERP(
I uVecFile0, exf_iprec,
#ifdef EXF_INTERP_USE_DYNALLOC
O tmp_u,
#else
O tmp_u, bufArr1,
#endif
I count0, xC, yC,
I uVec_lon0, uVec_lon_inc, uVec_lat0, uVec_lat_inc,
I uVec_nlon, uVec_nlat, u_interp_method,
I myIter, myThid )
CALL EXF_INTERP(
I vVecFile0, exf_iprec,
#ifdef EXF_INTERP_USE_DYNALLOC
O tmp_v,
#else
O tmp_v, bufArr2,
#endif
I count0, xC, yC,
I vVec_lon0, vVec_lon_inc, vVec_lat0, vVec_lat_inc,
I vVec_nlon, vVec_nlat, v_interp_method,
I myIter, myThid )
ENDIF
C- apply mask: Note: done after applying scaling factor and rotation
c CALL EXF_FILTER_RL( tmp_u, uVecMask, myThid )
c CALL EXF_FILTER_RL( tmp_v, vVecMask, myThid )
IF ( exf_output_interp ) THEN
j = ILNBLNK(uVecFile0)
WRITE(out_uVecFile,'(2A)') uVecFile0(1:j), '_out'
IF ( count0.NE.1 )
& CALL WRITE_REC_XY_RL(out_uVecFile,tmp_u,1,myIter,myThid)
CALL WRITE_REC_XY_RL(out_uVecFile,tmp_u,count0,myIter,myThid)
j = ILNBLNK(vVecFile0)
WRITE(out_vVecFile,'(2A)') vVecFile0(1:j), '_out'
IF ( count0.NE.1 )
& CALL WRITE_REC_XY_RL(out_vVecFile,tmp_v,1,myIter,myThid)
CALL WRITE_REC_XY_RL(out_vVecFile,tmp_v,count0,myIter,myThid)
ENDIF
C- scaling factor and vector rotation
IF ( usingCurvilinearGrid .OR. rotateGrid ) THEN
DO bj = myByLo(myThid),myByHi(myThid)
DO bi = myBxLo(myThid),myBxHi(myThid)
DO j = 1,sNy
DO i = 1,sNx
tmp_u(i,j,bi,bj) = uVec_inScale*tmp_u(i,j,bi,bj)
tmp_v(i,j,bi,bj) = vVec_inScale*tmp_v(i,j,bi,bj)
ENDDO
ENDDO
DO j = 1,sNy
DO i = 1,sNx
#ifdef EXF_USE_OLD_VEC_ROTATION
x1=xG(i,j,bi,bj)
x2=xG(i+1,j,bi,bj)
x3=xG(i,j+1,bi,bj)
x4=xG(i+1,j+1,bi,bj)
IF ((x2-x1).GT.180) x2=x2-360
IF ((x1-x2).GT.180) x2=x2+360
IF ((x3-x1).GT.180) x3=x3-360
IF ((x1-x3).GT.180) x3=x3+360
IF ((x4-x1).GT.180) x4=x4-360
IF ((x1-x4).GT.180) x4=x4+360
y1=yG(i,j,bi,bj)
y2=yG(i+1,j,bi,bj)
y3=yG(i,j+1,bi,bj)
y4=yG(i+1,j+1,bi,bj)
dx=0.5*(x3+x4-x1-x2)
dx=dx*
& cos(deg2rad*yC(i,j,bi,bj))
dy=0.5*(y3+y4-y1-y2)
vVec1(i,j,bi,bj)=
& (tmp_u(i,j,bi,bj)*dx+
& tmp_v(i,j,bi,bj)*dy)/
& SQRT(dx*dx+dy*dy)
dx=0.5*(x2+x4-x1-x3)
dx=dx*
& cos(deg2rad*yC(i,j,bi,bj))
dy=0.5*(y2+y4-y1-y3)
uVec1(i,j,bi,bj)=
& (tmp_u(i,j,bi,bj)*dx+
& tmp_v(i,j,bi,bj)*dy)/
& SQRT(dx*dx+dy*dy)
#else /* EXF_USE_OLD_VEC_ROTATION */
uVec1(i,j,bi,bj) =
& angleCosC(i,j,bi,bj)*tmp_u(i,j,bi,bj)
& +angleSinC(i,j,bi,bj)*tmp_v(i,j,bi,bj)
vVec1(i,j,bi,bj) =
& -angleSinC(i,j,bi,bj)*tmp_u(i,j,bi,bj)
& +angleCosC(i,j,bi,bj)*tmp_v(i,j,bi,bj)
#endif /* EXF_USE_OLD_VEC_ROTATION */
ENDDO
ENDDO
ENDDO
ENDDO
ELSE
DO bj = myByLo(myThid),myByHi(myThid)
DO bi = myBxLo(myThid),myBxHi(myThid)
DO j = 1,sNy
DO i = 1,sNx
uVec1(i,j,bi,bj) = uVec_inScale*tmp_u(i,j,bi,bj)
vVec1(i,j,bi,bj) = vVec_inScale*tmp_v(i,j,bi,bj)
ENDDO
ENDDO
ENDDO
ENDDO
ENDIF
C- apply mask (after scaling factor and rotation)
CALL EXF_FILTER_RL( uVec1, uVecMask, myThid )
CALL EXF_FILTER_RL( vVec1, vVecMask, myThid )
C- end if ( first ) block
ENDIF
IF ( first .OR. changed ) THEN
C-- Load and interpolate a new reccord
CALL EXF_SWAPFFIELDS( uVec0, uVec1, myThid )
CALL EXF_SWAPFFIELDS( vVec0, vVec1, myThid )
CALL EXF_GETYEARLYFIELDNAME(
I useExfYearlyFields, twoDigitYear, uVecPeriod, year1,
I uVecFile,
O uVecFile1,
I myTime, myIter, myThid )
CALL EXF_GETYEARLYFIELDNAME(
I useExfYearlyFields, twoDigitYear, vVecPeriod, year1,
I vVecFile,
O vVecFile1,
I myTime, myIter, myThid )
IF ( exf_debugLev.GE.debLevC ) THEN
_BEGIN_MASTER(myThid)
WRITE(msgBuf,'(6A,I10)') 'EXF_SET_UV: ',
& 'fields "', uVecName, '" & "', vVecName, '", it=', myIter
CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
& SQUEEZE_RIGHT, myThid )
j = ILNBLNK(uVecFile1)
WRITE(msgBuf,'(2A,I6,3A)') 'EXF_SET_UV: ',
& 'loading rec=', count1, ' from file: "', uVecFile1(1:j), '"'
CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
& SQUEEZE_RIGHT, myThid )
j = ILNBLNK(vVecFile1)
WRITE(msgBuf,'(2A,I6,3A)') 'EXF_SET_UV: ',
& 'loading rec=', count1, ' from file: "', vVecFile1(1:j), '"'
CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
& SQUEEZE_RIGHT, myThid )
_END_MASTER(myThid)
ENDIF
IF ( uvInterp ) THEN
C- vector interpolation to (xC,yC) locations
CALL EXF_INTERP_UV(
I uVecFile1, vVecFile1, exf_iprec, count1,
I uVec_nlon, uVec_nlat,
I uVec_lon0, uVec_lon_inc, uVec_lat0, uVec_lat_inc,
#ifdef EXF_INTERP_USE_DYNALLOC
O tmp_u, tmp_v,
#else
O tmp_u, tmp_v, bufArr1, bufArr2,
#endif
I xC, yC,
I u_interp_method, v_interp_method, myIter, myThid )
ELSE
C- scalar interpolation to (xC,yC) locations
CALL EXF_INTERP(
I uVecFile1, exf_iprec,
#ifdef EXF_INTERP_USE_DYNALLOC
O tmp_u,
#else
O tmp_u, bufArr1,
#endif
I count1, xC, yC,
I uVec_lon0, uVec_lon_inc, uVec_lat0, uVec_lat_inc,
I uVec_nlon, uVec_nlat, u_interp_method,
I myIter, myThid )
CALL EXF_INTERP(
I vVecFile1, exf_iprec,
#ifdef EXF_INTERP_USE_DYNALLOC
O tmp_v,
#else
O tmp_v, bufArr2,
#endif
I count1, xC, yC,
I vVec_lon0, vVec_lon_inc, vVec_lat0, vVec_lat_inc,
I vVec_nlon, vVec_nlat, v_interp_method,
I myIter, myThid )
ENDIF
C- apply mask: Note: done after applying scaling factor and rotation
c CALL EXF_FILTER_RL( tmp_u, uVecMask, myThid )
c CALL EXF_FILTER_RL( tmp_v, vVecMask, myThid )
IF ( exf_output_interp ) THEN
j = ILNBLNK(uVecFile1)
WRITE(out_uVecFile,'(2A)') uVecFile1(1:j), '_out'
CALL WRITE_REC_XY_RL(out_uVecFile,tmp_u,count1,myIter,myThid)
j = ILNBLNK(vVecFile1)
WRITE(out_vVecFile,'(2A)') vVecFile1(1:j), '_out'
CALL WRITE_REC_XY_RL(out_vVecFile,tmp_v,count1,myIter,myThid)
ENDIF
C- scaling factor and vector rotation
IF ( usingCurvilinearGrid .OR. rotateGrid ) THEN
DO bj = myByLo(myThid),myByHi(myThid)
DO bi = myBxLo(myThid),myBxHi(myThid)
DO j = 1,sNy
DO i = 1,sNx
tmp_u(i,j,bi,bj) = uVec_inScale*tmp_u(i,j,bi,bj)
tmp_v(i,j,bi,bj) = vVec_inScale*tmp_v(i,j,bi,bj)
ENDDO
ENDDO
DO j = 1,sNy
DO i = 1,sNx
#ifdef EXF_USE_OLD_VEC_ROTATION
x1=xG(i,j,bi,bj)
x2=xG(i+1,j,bi,bj)
x3=xG(i,j+1,bi,bj)
x4=xG(i+1,j+1,bi,bj)
IF ((x2-x1).GT.180) x2=x2-360
IF ((x1-x2).GT.180) x2=x2+360
IF ((x3-x1).GT.180) x3=x3-360
IF ((x1-x3).GT.180) x3=x3+360
IF ((x4-x1).GT.180) x4=x4-360
IF ((x1-x4).GT.180) x4=x4+360
y1=yG(i,j,bi,bj)
y2=yG(i+1,j,bi,bj)
y3=yG(i,j+1,bi,bj)
y4=yG(i+1,j+1,bi,bj)
dx=0.5*(x3+x4-x1-x2)
dx=dx*
& cos(deg2rad*yC(i,j,bi,bj))
dy=0.5*(y3+y4-y1-y2)
vVec1(i,j,bi,bj)=
& (tmp_u(i,j,bi,bj)*dx+
& tmp_v(i,j,bi,bj)*dy)/
& SQRT(dx*dx+dy*dy)
dx=0.5*(x2+x4-x1-x3)
dx=dx*
& cos(deg2rad*yC(i,j,bi,bj))
dy=0.5*(y2+y4-y1-y3)
uVec1(i,j,bi,bj)=
& (tmp_u(i,j,bi,bj)*dx+
& tmp_v(i,j,bi,bj)*dy)/
& SQRT(dx*dx+dy*dy)
#else /* EXF_USE_OLD_VEC_ROTATION */
uVec1(i,j,bi,bj) =
& angleCosC(i,j,bi,bj)*tmp_u(i,j,bi,bj)
& +angleSinC(i,j,bi,bj)*tmp_v(i,j,bi,bj)
vVec1(i,j,bi,bj) =
& -angleSinC(i,j,bi,bj)*tmp_u(i,j,bi,bj)
& +angleCosC(i,j,bi,bj)*tmp_v(i,j,bi,bj)
#endif /* EXF_USE_OLD_VEC_ROTATION */
ENDDO
ENDDO
ENDDO
ENDDO
ELSE
DO bj = myByLo(myThid),myByHi(myThid)
DO bi = myBxLo(myThid),myBxHi(myThid)
DO j = 1,sNy
DO i = 1,sNx
uVec1(i,j,bi,bj) = uVec_inScale*tmp_u(i,j,bi,bj)
vVec1(i,j,bi,bj) = vVec_inScale*tmp_v(i,j,bi,bj)
ENDDO
ENDDO
ENDDO
ENDDO
ENDIF
C- apply mask (after scaling factor and rotation)
CALL EXF_FILTER_RL( uVec1, uVecMask, myThid )
CALL EXF_FILTER_RL( vVec1, vVecMask, myThid )
C- end if ( first or changed ) block
ENDIF
C-- Interpolate linearly onto the current time.
DO bj = myByLo(myThid),myByHi(myThid)
DO bi = myBxLo(myThid),myBxHi(myThid)
DO j = 1,sNy
DO i = 1,sNx
uVec(i,j,bi,bj) = fac * uVec0(i,j,bi,bj)
& + (exf_one - fac)* uVec1(i,j,bi,bj)
vVec(i,j,bi,bj) = fac * vVec0(i,j,bi,bj)
& + (exf_one - fac)* vVec1(i,j,bi,bj)
ENDDO
ENDDO
ENDDO
ENDDO
ELSE
C case no-interpolation
C or ( .NOT.usingCurvilinearGrid & .NOT.rotateGrid & .NOT.uvInterp )
#else /* USE_EXF_INTERPOLATION */
IF ( .TRUE. ) THEN
#endif /* USE_EXF_INTERPOLATION */
CALL EXF_SET_FLD(
I uVecName, uVecFile, uVecMask,
I uVecStartTime, uVecPeriod, uVecRepeatCycle,
I uVec_inScale, uVec_remove_intercept, uVec_remove_slope,
U uVec, uVec0, uVec1,
#ifdef USE_EXF_INTERPOLATION
I uVec_lon0, uVec_lon_inc, uVec_lat0, uVec_lat_inc,
I uVec_nlon, uVec_nlat, xC, yC, u_interp_method,
#endif /* USE_EXF_INTERPOLATION */
I myTime, myIter, myThid )
CALL EXF_SET_FLD(
I vVecName, vVecFile, vVecMask,
I vVecStartTime, vVecPeriod, vVecRepeatCycle,
I vVec_inScale, vVec_remove_intercept, vVec_remove_slope,
U vVec, vVec0, vVec1,
#ifdef USE_EXF_INTERPOLATION
I vVec_lon0, vVec_lon_inc, vVec_lat0, vVec_lat_inc,
I vVec_nlon, vVec_nlat, xC, yC, v_interp_method,
#endif /* USE_EXF_INTERPOLATION */
I myTime, myIter, myThid )
C- vector rotation
IF ( rotateStressOnAgrid ) THEN
DO bj = myByLo(myThid),myByHi(myThid)
DO bi = myBxLo(myThid),myBxHi(myThid)
DO j = 1,sNy
DO i = 1,sNx
tmp_u(i,j,bi,bj) = uVec(i,j,bi,bj)
tmp_v(i,j,bi,bj) = vVec(i,j,bi,bj)
ENDDO
ENDDO
ENDDO
ENDDO
DO bj = myByLo(myThid),myByHi(myThid)
DO bi = myBxLo(myThid),myBxHi(myThid)
DO j = 1,sNy
DO i = 1,sNx
uVec(i,j,bi,bj) =
& angleCosC(i,j,bi,bj)*tmp_u(i,j,bi,bj)
& +angleSinC(i,j,bi,bj)*tmp_v(i,j,bi,bj)
vVec(i,j,bi,bj) =
& -angleSinC(i,j,bi,bj)*tmp_u(i,j,bi,bj)
& +angleCosC(i,j,bi,bj)*tmp_v(i,j,bi,bj)
ENDDO
ENDDO
ENDDO
ENDDO
ENDIF
ENDIF
RETURN
END