File indexing completed on 2021-11-10 06:15:39 UTC
view on githubraw file Latest commit deacece5 on 2021-11-09 17:35:09 UTC
8ac0e9b3ce Dimi*0001 #include "EXF_OPTIONS.h"
0002
8a0f942cd7 Jean*0003
0004
30fcb891cf Jean*0005
8a0f942cd7 Jean*0006
4aa4270510 Jean*0007 SUBROUTINE EXF_SET_UV(
8a0f942cd7 Jean*0008 I uVecName, uVecFile, uVecMask,
0009 I uVecStartTime, uVecPeriod, uVecRepeatCycle,
0010 I uVec_inScale, uVec_remove_intercept, uVec_remove_slope,
0011 U uVec, uVec0, uVec1,
0012 I vVecName, vVecFile, vVecMask,
0013 I vVecStartTime, vVecPeriod, vVecRepeatCycle,
0014 I vVec_inScale, vVec_remove_intercept, vVec_remove_slope,
0015 U vVec, vVec0, vVec1,
4aa4270510 Jean*0016 #ifdef USE_EXF_INTERPOLATION
8a0f942cd7 Jean*0017 I uVec_lon0, uVec_lon_inc, uVec_lat0, uVec_lat_inc,
0018 I uVec_nlon, uVec_nlat, u_interp_method,
0019 I vVec_lon0, vVec_lon_inc, vVec_lat0, vVec_lat_inc,
0020 I vVec_nlon, vVec_nlat, v_interp_method, uvInterp,
4aa4270510 Jean*0021 #endif /* USE_EXF_INTERPOLATION */
0022 I myTime, myIter, myThid )
8ac0e9b3ce Dimi*0023
8a0f942cd7 Jean*0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
4aa4270510 Jean*0035 IMPLICIT NONE
0036
8ac0e9b3ce Dimi*0037 #include "EEPARAMS.h"
0038 #include "SIZE.h"
0039 #include "PARAMS.h"
0040 #include "GRID.h"
082e18c36c Jean*0041 #include "EXF_PARAM.h"
0042 #include "EXF_CONSTANTS.h"
30fcb891cf Jean*0043 #include "EXF_INTERP_SIZE.h"
0044 #include "EXF_INTERP_PARAM.h"
a9085e980c Jean*0045 #include "EXF_FIELDS.h"
8ac0e9b3ce Dimi*0046
8a0f942cd7 Jean*0047
0048
0049
0050
0051
0052
0053
0054
0055
0056
0057
0058
0059 #ifdef USE_EXF_INTERPOLATION
0060
0061
4aa4270510 Jean*0062
a9085e980c Jean*0063
4aa4270510 Jean*0064
0065
8a0f942cd7 Jean*0066 #endif /* USE_EXF_INTERPOLATION */
0067
0068
0069
0070 CHARACTER*(*) uVecName
0071 CHARACTER*(128) uVecFile
0072 CHARACTER*1 uVecMask
0073 _RL uVecStartTime, uVecPeriod, uVecRepeatCycle
0074 _RL uVec_inScale
0075 _RL uVec_remove_intercept, uVec_remove_slope
0076 _RL uVec (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
0077 _RL uVec0 (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
0078 _RL uVec1 (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
0079 CHARACTER*(*) vVecName
0080 CHARACTER*(128) vVecFile
0081 CHARACTER*1 vVecMask
0082 _RL vVecStartTime, vVecPeriod, vVecRepeatCycle
0083 _RL vVec_inScale
0084 _RL vVec_remove_intercept, vVec_remove_slope
0085 _RL vVec (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
0086 _RL vVec0 (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
0087 _RL vVec1 (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
4aa4270510 Jean*0088 #ifdef USE_EXF_INTERPOLATION
8a0f942cd7 Jean*0089 _RL uVec_lon0, uVec_lon_inc
0090 _RL uVec_lat0, uVec_lat_inc(MAX_LAT_INC)
0091 INTEGER uVec_nlon, uVec_nlat, u_interp_method
0092 _RL vVec_lon0, vVec_lon_inc
0093 _RL vVec_lat0, vVec_lat_inc(MAX_LAT_INC)
0094 INTEGER vVec_nlon, vVec_nlat, v_interp_method
78c96ec6a7 Jean*0095 LOGICAL uvInterp
4aa4270510 Jean*0096 #endif /* USE_EXF_INTERPOLATION */
0097 _RL myTime
0098 INTEGER myIter
0099 INTEGER myThid
8ac0e9b3ce Dimi*0100
8a0f942cd7 Jean*0101
1fc1e2c3e5 Jean*0102 INTEGER ILNBLNK
0103 EXTERNAL ILNBLNK
0104
8a0f942cd7 Jean*0105
353c624de2 Jean*0106 INTEGER i, j, bi, bj
0107 _RL tmp_u (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
0108 _RL tmp_v (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
4aa4270510 Jean*0109 #ifdef USE_EXF_INTERPOLATION
1fc1e2c3e5 Jean*0110
0111 CHARACTER*(MAX_LEN_MBUF) msgBuf
8a0f942cd7 Jean*0112 CHARACTER*(128) uVecFile0, uVecFile1
0113 CHARACTER*(128) vVecFile0, vVecFile1
0114 CHARACTER*(MAX_LEN_FNAM) out_uVecFile, out_vVecFile
4aa4270510 Jean*0115 LOGICAL first, changed
95aadf3c69 Jean*0116 _RL fac
0117 #ifdef EXF_USE_OLD_VEC_ROTATION
0118 _RL x1, x2, x3, x4, y1, y2, y3, y4, dx, dy
0119 #endif
4aa4270510 Jean*0120 INTEGER count0, count1
0121 INTEGER year0, year1
a9085e980c Jean*0122 # ifndef EXF_INTERP_USE_DYNALLOC
0123 _RL bufArr1( exf_interp_bufferSize )
0124 _RL bufArr2( exf_interp_bufferSize )
0125 # endif
4aa4270510 Jean*0126 #endif /* USE_EXF_INTERPOLATION */
8a0f942cd7 Jean*0127
8ac0e9b3ce Dimi*0128
4aa4270510 Jean*0129 #ifdef USE_EXF_INTERPOLATION
78c96ec6a7 Jean*0130 IF ( u_interp_method.GE.1 .AND. v_interp_method.GE.1 .AND.
8a0f942cd7 Jean*0131 & uVecFile.NE.' ' .AND. vVecFile.NE.' ' .AND.
78c96ec6a7 Jean*0132 & (usingCurvilinearGrid .OR. rotateGrid .OR. uvInterp) ) THEN
8ac0e9b3ce Dimi*0133
454eebbe98 Jean*0134 IF ( exf_debugLev.GE.debLevD ) THEN
0135 _BEGIN_MASTER( myThid )
8a0f942cd7 Jean*0136 i = ILNBLNK(uVecFile)
0137 j = ILNBLNK(vVecFile)
0138 WRITE(msgBuf,'(6A)') 'EXF_SET_UV: ',
0139 & 'processing fields "', uVecName, '" & "', vVecName, '"'
0140 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
0141 & SQUEEZE_RIGHT, myThid )
0142 WRITE(msgBuf,'(6A)') 'EXF_SET_UV: ',
0143 & ' files: ', uVecFile(1:i), ' & ', vVecFile(1:j)
454eebbe98 Jean*0144 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
0145 & SQUEEZE_RIGHT, myThid )
0146 _END_MASTER( myThid )
0147 ENDIF
8a0f942cd7 Jean*0148 IF ( useCAL .AND. uVecPeriod .EQ. -12. ) THEN
bd3e337e2f Jean*0149 #ifdef ALLOW_CAL
d0e15cd3ab Jean*0150
0151
0152 CALL cal_GetMonthsRec(
0153 O fac, first, changed,
deacece587 Oliv*0154 O count0, count1, year0, year1,
0155 I myTime, myIter, myThid )
0156 #endif /* ALLOW_CAL */
0157 ELSEIF ( useCAL .AND. uVecPeriod .EQ. -1.) THEN
0158 #ifdef ALLOW_CAL
0159
0160
0161
0162
0163 CALL EXF_GetMonthsRec(
0164 I uVecStartTime, useExfYearlyFields,
0165 O fac, first, changed,
0166 O count0, count1, year0, year1,
d0e15cd3ab Jean*0167 I myTime, myIter, myThid )
bd3e337e2f Jean*0168 #endif /* ALLOW_CAL */
8a0f942cd7 Jean*0169 ELSEIF ( uVecPeriod .LT. 0. ) THEN
0170 j = ILNBLNK(uVecFile)
0171 WRITE(msgBuf,'(4A,1PE16.8,2A)') 'EXF_SET_UV: ',
0172 & '"', uVecName, '", Invalid uVecPeriod=', uVecPeriod,
0173 & ' for file: ', uVecFile(1:j)
d0e15cd3ab Jean*0174 CALL PRINT_ERROR( msgBuf, myThid )
0175 STOP 'ABNORMAL END: S/R EXF_SET_UV'
0176 ELSE
78c96ec6a7 Jean*0177
8a0f942cd7 Jean*0178 CALL EXF_GetFFieldRec(
0179 I uVecStartTime, uVecPeriod, uVecRepeatCycle,
0180 I uVecName, useExfYearlyFields,
d0e15cd3ab Jean*0181 O fac, first, changed,
0182 O count0, count1, year0, year1,
0183 I myTime, myIter, myThid )
0184 ENDIF
0185 IF ( exf_debugLev.GE.debLevD ) THEN
0186 _BEGIN_MASTER( myThid )
8a0f942cd7 Jean*0187 WRITE(msgBuf,'(2A,I10,2I7)') 'EXF_SET_UV: ',
d0e15cd3ab Jean*0188 & ' myIter, count0, count1:', myIter, count0, count1
0189 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
0190 & SQUEEZE_RIGHT, myThid )
deacece587 Oliv*0191 WRITE(msgBuf,'(2A,2(L2,2X),F21.17)') 'EXF_SET_UV: ',
d0e15cd3ab Jean*0192 & ' first, changed, fac: ', first, changed, fac
0193 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
0194 & SQUEEZE_RIGHT, myThid )
0195 _END_MASTER( myThid )
0196 ENDIF
8ac0e9b3ce Dimi*0197
4aa4270510 Jean*0198 IF ( first ) THEN
78c96ec6a7 Jean*0199
510778fc01 Mart*0200
4aa4270510 Jean*0201 CALL exf_GetYearlyFieldName(
8a0f942cd7 Jean*0202 I useExfYearlyFields, twoDigitYear, uVecPeriod, year0,
0203 I uVecFile,
0204 O uVecFile0,
4aa4270510 Jean*0205 I myTime, myIter, myThid )
0206 CALL exf_GetYearlyFieldName(
8a0f942cd7 Jean*0207 I useExfYearlyFields, twoDigitYear, vVecPeriod, year0,
0208 I vVecFile,
0209 O vVecFile0,
4aa4270510 Jean*0210 I myTime, myIter, myThid )
1fc1e2c3e5 Jean*0211 IF ( exf_debugLev.GE.debLevC ) THEN
0212 _BEGIN_MASTER(myThid)
8a0f942cd7 Jean*0213 WRITE(msgBuf,'(6A,I10)') 'EXF_SET_UV: ',
0214 & 'fields "', uVecName, '" & "', vVecName, '", it=', myIter
1fc1e2c3e5 Jean*0215 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
0216 & SQUEEZE_RIGHT, myThid )
8a0f942cd7 Jean*0217 j = ILNBLNK(uVecFile0)
0218 WRITE(msgBuf,'(2A,I6,3A)') 'EXF_SET_UV: ',
0219 & 'loading rec=', count0, ' from file: "', uVecFile0(1:j), '"'
1fc1e2c3e5 Jean*0220 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
8a0f942cd7 Jean*0221 & SQUEEZE_RIGHT, myThid )
0222 j = ILNBLNK(vVecFile0)
0223 WRITE(msgBuf,'(2A,I6,3A)') 'EXF_SET_UV: ',
0224 & 'loading rec=', count0, ' from file: "', vVecFile0(1:j), '"'
0225 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
0226 & SQUEEZE_RIGHT, myThid )
1fc1e2c3e5 Jean*0227 _END_MASTER(myThid)
0228 ENDIF
4aa4270510 Jean*0229
78c96ec6a7 Jean*0230 IF ( uvInterp ) THEN
0231
0232 CALL EXF_INTERP_UV(
8a0f942cd7 Jean*0233 I uVecFile0, vVecFile0, exf_iprec, count0,
0234 I uVec_nlon, uVec_nlat,
0235 I uVec_lon0, uVec_lon_inc, uVec_lat0, uVec_lat_inc,
a9085e980c Jean*0236 #ifdef EXF_INTERP_USE_DYNALLOC
78c96ec6a7 Jean*0237 O tmp_u, tmp_v,
a9085e980c Jean*0238 #else
0239 O tmp_u, tmp_v, bufArr1, bufArr2,
0240 #endif
78c96ec6a7 Jean*0241 I xC, yC,
0242 I u_interp_method, v_interp_method, myIter, myThid )
0243 ELSE
0244
0245 CALL EXF_INTERP(
8a0f942cd7 Jean*0246 I uVecFile0, exf_iprec,
a9085e980c Jean*0247 #ifdef EXF_INTERP_USE_DYNALLOC
4aa4270510 Jean*0248 O tmp_u,
a9085e980c Jean*0249 #else
0250 O tmp_u, bufArr1,
0251 #endif
4aa4270510 Jean*0252 I count0, xC, yC,
8a0f942cd7 Jean*0253 I uVec_lon0, uVec_lon_inc, uVec_lat0, uVec_lat_inc,
0254 I uVec_nlon, uVec_nlat, u_interp_method,
78c96ec6a7 Jean*0255 I myIter, myThid )
0256 CALL EXF_INTERP(
8a0f942cd7 Jean*0257 I vVecFile0, exf_iprec,
a9085e980c Jean*0258 #ifdef EXF_INTERP_USE_DYNALLOC
4aa4270510 Jean*0259 O tmp_v,
a9085e980c Jean*0260 #else
0261 O tmp_v, bufArr2,
0262 #endif
4aa4270510 Jean*0263 I count0, xC, yC,
8a0f942cd7 Jean*0264 I vVec_lon0, vVec_lon_inc, vVec_lat0, vVec_lat_inc,
0265 I vVec_nlon, vVec_nlat, v_interp_method,
78c96ec6a7 Jean*0266 I myIter, myThid )
0267 ENDIF
0268
353c624de2 Jean*0269
8a0f942cd7 Jean*0270
0271
353c624de2 Jean*0272
0273 IF ( exf_output_interp ) THEN
8a0f942cd7 Jean*0274 j = ILNBLNK(uVecFile0)
0275 WRITE(out_uVecFile,'(2A)') uVecFile0(1:j), '_out'
353c624de2 Jean*0276 IF ( count0.NE.1 )
8a0f942cd7 Jean*0277 & CALL WRITE_REC_XY_RL(out_uVecFile,tmp_u,1,myIter,myThid)
0278 CALL WRITE_REC_XY_RL(out_uVecFile,tmp_u,count0,myIter,myThid)
0279 j = ILNBLNK(vVecFile0)
0280 WRITE(out_vVecFile,'(2A)') vVecFile0(1:j), '_out'
353c624de2 Jean*0281 IF ( count0.NE.1 )
8a0f942cd7 Jean*0282 & CALL WRITE_REC_XY_RL(out_vVecFile,tmp_v,1,myIter,myThid)
0283 CALL WRITE_REC_XY_RL(out_vVecFile,tmp_v,count0,myIter,myThid)
353c624de2 Jean*0284 ENDIF
63930fb278 Gael*0285
353c624de2 Jean*0286
78c96ec6a7 Jean*0287 IF ( usingCurvilinearGrid .OR. rotateGrid ) THEN
0288 DO bj = myByLo(myThid),myByHi(myThid)
0289 DO bi = myBxLo(myThid),myBxHi(myThid)
4aa4270510 Jean*0290 DO j = 1,sNy
78c96ec6a7 Jean*0291 DO i = 1,sNx
8a0f942cd7 Jean*0292 tmp_u(i,j,bi,bj) = uVec_inScale*tmp_u(i,j,bi,bj)
0293 tmp_v(i,j,bi,bj) = vVec_inScale*tmp_v(i,j,bi,bj)
353c624de2 Jean*0294 ENDDO
0295 ENDDO
0296 DO j = 1,sNy
0297 DO i = 1,sNx
95aadf3c69 Jean*0298 #ifdef EXF_USE_OLD_VEC_ROTATION
1e18bd6176 Dimi*0299 x1=xG(i,j,bi,bj)
0300 x2=xG(i+1,j,bi,bj)
0301 x3=xG(i,j+1,bi,bj)
0302 x4=xG(i+1,j+1,bi,bj)
4aa4270510 Jean*0303 IF ((x2-x1).GT.180) x2=x2-360
0304 IF ((x1-x2).GT.180) x2=x2+360
0305 IF ((x3-x1).GT.180) x3=x3-360
0306 IF ((x1-x3).GT.180) x3=x3+360
0307 IF ((x4-x1).GT.180) x4=x4-360
0308 IF ((x1-x4).GT.180) x4=x4+360
1e18bd6176 Dimi*0309 y1=yG(i,j,bi,bj)
0310 y2=yG(i+1,j,bi,bj)
0311 y3=yG(i,j+1,bi,bj)
0312 y4=yG(i+1,j+1,bi,bj)
a7ceeb6957 Patr*0313 dx=0.5*(x3+x4-x1-x2)
0314 dx=dx*
1e18bd6176 Dimi*0315 & cos(deg2rad*yC(i,j,bi,bj))
a7ceeb6957 Patr*0316 dy=0.5*(y3+y4-y1-y2)
8a0f942cd7 Jean*0317 vVec1(i,j,bi,bj)=
1e18bd6176 Dimi*0318 & (tmp_u(i,j,bi,bj)*dx+
0319 & tmp_v(i,j,bi,bj)*dy)/
4aa4270510 Jean*0320 & SQRT(dx*dx+dy*dy)
a7ceeb6957 Patr*0321 dx=0.5*(x2+x4-x1-x3)
0322 dx=dx*
1e18bd6176 Dimi*0323 & cos(deg2rad*yC(i,j,bi,bj))
a7ceeb6957 Patr*0324 dy=0.5*(y2+y4-y1-y3)
8a0f942cd7 Jean*0325 uVec1(i,j,bi,bj)=
1e18bd6176 Dimi*0326 & (tmp_u(i,j,bi,bj)*dx+
0327 & tmp_v(i,j,bi,bj)*dy)/
4aa4270510 Jean*0328 & SQRT(dx*dx+dy*dy)
95aadf3c69 Jean*0329 #else /* EXF_USE_OLD_VEC_ROTATION */
8a0f942cd7 Jean*0330 uVec1(i,j,bi,bj) =
95aadf3c69 Jean*0331 & angleCosC(i,j,bi,bj)*tmp_u(i,j,bi,bj)
0332 & +angleSinC(i,j,bi,bj)*tmp_v(i,j,bi,bj)
8a0f942cd7 Jean*0333 vVec1(i,j,bi,bj) =
95aadf3c69 Jean*0334 & -angleSinC(i,j,bi,bj)*tmp_u(i,j,bi,bj)
0335 & +angleCosC(i,j,bi,bj)*tmp_v(i,j,bi,bj)
0336 #endif /* EXF_USE_OLD_VEC_ROTATION */
78c96ec6a7 Jean*0337 ENDDO
4aa4270510 Jean*0338 ENDDO
78c96ec6a7 Jean*0339 ENDDO
4aa4270510 Jean*0340 ENDDO
78c96ec6a7 Jean*0341 ELSE
0342 DO bj = myByLo(myThid),myByHi(myThid)
0343 DO bi = myBxLo(myThid),myBxHi(myThid)
0344 DO j = 1,sNy
0345 DO i = 1,sNx
8a0f942cd7 Jean*0346 uVec1(i,j,bi,bj) = uVec_inScale*tmp_u(i,j,bi,bj)
0347 vVec1(i,j,bi,bj) = vVec_inScale*tmp_v(i,j,bi,bj)
78c96ec6a7 Jean*0348 ENDDO
0349 ENDDO
0350 ENDDO
0351 ENDDO
0352 ENDIF
353c624de2 Jean*0353
8a0f942cd7 Jean*0354 CALL EXF_FILTER_RL( uVec1, uVecMask, myThid )
0355 CALL EXF_FILTER_RL( vVec1, vVecMask, myThid )
353c624de2 Jean*0356
0357
4aa4270510 Jean*0358 ENDIF
0359
0360 IF ( first .OR. changed ) THEN
78c96ec6a7 Jean*0361
0362
8a0f942cd7 Jean*0363 CALL exf_SwapFFields( uVec0, uVec1, myThid )
0364 CALL exf_SwapFFields( vVec0, vVec1, myThid )
4aa4270510 Jean*0365
0366 CALL exf_GetYearlyFieldName(
8a0f942cd7 Jean*0367 I useExfYearlyFields, twoDigitYear, uVecPeriod, year1,
0368 I uVecFile,
0369 O uVecFile1,
4aa4270510 Jean*0370 I myTime, myIter, myThid )
0371 CALL exf_GetYearlyFieldName(
8a0f942cd7 Jean*0372 I useExfYearlyFields, twoDigitYear, vVecPeriod, year1,
0373 I vVecFile,
0374 O vVecFile1,
4aa4270510 Jean*0375 I myTime, myIter, myThid )
1fc1e2c3e5 Jean*0376 IF ( exf_debugLev.GE.debLevC ) THEN
0377 _BEGIN_MASTER(myThid)
8a0f942cd7 Jean*0378 WRITE(msgBuf,'(6A,I10)') 'EXF_SET_UV: ',
0379 & 'fields "', uVecName, '" & "', vVecName, '", it=', myIter
1fc1e2c3e5 Jean*0380 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
8a0f942cd7 Jean*0381 & SQUEEZE_RIGHT, myThid )
0382 j = ILNBLNK(uVecFile1)
0383 WRITE(msgBuf,'(2A,I6,3A)') 'EXF_SET_UV: ',
0384 & 'loading rec=', count1, ' from file: "', uVecFile1(1:j), '"'
1fc1e2c3e5 Jean*0385 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
8a0f942cd7 Jean*0386 & SQUEEZE_RIGHT, myThid )
0387 j = ILNBLNK(vVecFile1)
0388 WRITE(msgBuf,'(2A,I6,3A)') 'EXF_SET_UV: ',
0389 & 'loading rec=', count1, ' from file: "', vVecFile1(1:j), '"'
0390 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
0391 & SQUEEZE_RIGHT, myThid )
1fc1e2c3e5 Jean*0392 _END_MASTER(myThid)
0393 ENDIF
4aa4270510 Jean*0394
78c96ec6a7 Jean*0395 IF ( uvInterp ) THEN
0396
0397 CALL EXF_INTERP_UV(
8a0f942cd7 Jean*0398 I uVecFile1, vVecFile1, exf_iprec, count1,
0399 I uVec_nlon, uVec_nlat,
0400 I uVec_lon0, uVec_lon_inc, uVec_lat0, uVec_lat_inc,
a9085e980c Jean*0401 #ifdef EXF_INTERP_USE_DYNALLOC
78c96ec6a7 Jean*0402 O tmp_u, tmp_v,
a9085e980c Jean*0403 #else
0404 O tmp_u, tmp_v, bufArr1, bufArr2,
0405 #endif
78c96ec6a7 Jean*0406 I xC, yC,
0407 I u_interp_method, v_interp_method, myIter, myThid )
0408 ELSE
0409
4aa4270510 Jean*0410 CALL EXF_INTERP(
8a0f942cd7 Jean*0411 I uVecFile1, exf_iprec,
a9085e980c Jean*0412 #ifdef EXF_INTERP_USE_DYNALLOC
4aa4270510 Jean*0413 O tmp_u,
a9085e980c Jean*0414 #else
0415 O tmp_u, bufArr1,
0416 #endif
4aa4270510 Jean*0417 I count1, xC, yC,
8a0f942cd7 Jean*0418 I uVec_lon0, uVec_lon_inc, uVec_lat0, uVec_lat_inc,
0419 I uVec_nlon, uVec_nlat, u_interp_method,
78c96ec6a7 Jean*0420 I myIter, myThid )
4aa4270510 Jean*0421 CALL EXF_INTERP(
8a0f942cd7 Jean*0422 I vVecFile1, exf_iprec,
a9085e980c Jean*0423 #ifdef EXF_INTERP_USE_DYNALLOC
4aa4270510 Jean*0424 O tmp_v,
a9085e980c Jean*0425 #else
0426 O tmp_v, bufArr2,
0427 #endif
4aa4270510 Jean*0428 I count1, xC, yC,
8a0f942cd7 Jean*0429 I vVec_lon0, vVec_lon_inc, vVec_lat0, vVec_lat_inc,
0430 I vVec_nlon, vVec_nlat, v_interp_method,
78c96ec6a7 Jean*0431 I myIter, myThid )
0432 ENDIF
0433
353c624de2 Jean*0434
8a0f942cd7 Jean*0435
0436
353c624de2 Jean*0437
0438 IF ( exf_output_interp ) THEN
8a0f942cd7 Jean*0439 j = ILNBLNK(uVecFile1)
0440 WRITE(out_uVecFile,'(2A)') uVecFile1(1:j), '_out'
0441 CALL WRITE_REC_XY_RL(out_uVecFile,tmp_u,count1,myIter,myThid)
0442 j = ILNBLNK(vVecFile1)
0443 WRITE(out_vVecFile,'(2A)') vVecFile1(1:j), '_out'
0444 CALL WRITE_REC_XY_RL(out_vVecFile,tmp_v,count1,myIter,myThid)
353c624de2 Jean*0445 ENDIF
63930fb278 Gael*0446
353c624de2 Jean*0447
78c96ec6a7 Jean*0448 IF ( usingCurvilinearGrid .OR. rotateGrid ) THEN
0449 DO bj = myByLo(myThid),myByHi(myThid)
0450 DO bi = myBxLo(myThid),myBxHi(myThid)
4aa4270510 Jean*0451 DO j = 1,sNy
78c96ec6a7 Jean*0452 DO i = 1,sNx
8a0f942cd7 Jean*0453 tmp_u(i,j,bi,bj) = uVec_inScale*tmp_u(i,j,bi,bj)
0454 tmp_v(i,j,bi,bj) = vVec_inScale*tmp_v(i,j,bi,bj)
353c624de2 Jean*0455 ENDDO
0456 ENDDO
0457 DO j = 1,sNy
0458 DO i = 1,sNx
95aadf3c69 Jean*0459 #ifdef EXF_USE_OLD_VEC_ROTATION
1e18bd6176 Dimi*0460 x1=xG(i,j,bi,bj)
0461 x2=xG(i+1,j,bi,bj)
0462 x3=xG(i,j+1,bi,bj)
0463 x4=xG(i+1,j+1,bi,bj)
4aa4270510 Jean*0464 IF ((x2-x1).GT.180) x2=x2-360
0465 IF ((x1-x2).GT.180) x2=x2+360
0466 IF ((x3-x1).GT.180) x3=x3-360
0467 IF ((x1-x3).GT.180) x3=x3+360
0468 IF ((x4-x1).GT.180) x4=x4-360
0469 IF ((x1-x4).GT.180) x4=x4+360
1e18bd6176 Dimi*0470 y1=yG(i,j,bi,bj)
0471 y2=yG(i+1,j,bi,bj)
0472 y3=yG(i,j+1,bi,bj)
0473 y4=yG(i+1,j+1,bi,bj)
a7ceeb6957 Patr*0474 dx=0.5*(x3+x4-x1-x2)
0475 dx=dx*
1e18bd6176 Dimi*0476 & cos(deg2rad*yC(i,j,bi,bj))
a7ceeb6957 Patr*0477 dy=0.5*(y3+y4-y1-y2)
8a0f942cd7 Jean*0478 vVec1(i,j,bi,bj)=
1e18bd6176 Dimi*0479 & (tmp_u(i,j,bi,bj)*dx+
0480 & tmp_v(i,j,bi,bj)*dy)/
4aa4270510 Jean*0481 & SQRT(dx*dx+dy*dy)
a7ceeb6957 Patr*0482 dx=0.5*(x2+x4-x1-x3)
0483 dx=dx*
1e18bd6176 Dimi*0484 & cos(deg2rad*yC(i,j,bi,bj))
a7ceeb6957 Patr*0485 dy=0.5*(y2+y4-y1-y3)
8a0f942cd7 Jean*0486 uVec1(i,j,bi,bj)=
1e18bd6176 Dimi*0487 & (tmp_u(i,j,bi,bj)*dx+
0488 & tmp_v(i,j,bi,bj)*dy)/
4aa4270510 Jean*0489 & SQRT(dx*dx+dy*dy)
95aadf3c69 Jean*0490 #else /* EXF_USE_OLD_VEC_ROTATION */
8a0f942cd7 Jean*0491 uVec1(i,j,bi,bj) =
95aadf3c69 Jean*0492 & angleCosC(i,j,bi,bj)*tmp_u(i,j,bi,bj)
0493 & +angleSinC(i,j,bi,bj)*tmp_v(i,j,bi,bj)
8a0f942cd7 Jean*0494 vVec1(i,j,bi,bj) =
95aadf3c69 Jean*0495 & -angleSinC(i,j,bi,bj)*tmp_u(i,j,bi,bj)
0496 & +angleCosC(i,j,bi,bj)*tmp_v(i,j,bi,bj)
0497 #endif /* EXF_USE_OLD_VEC_ROTATION */
78c96ec6a7 Jean*0498 ENDDO
4aa4270510 Jean*0499 ENDDO
78c96ec6a7 Jean*0500 ENDDO
4aa4270510 Jean*0501 ENDDO
78c96ec6a7 Jean*0502 ELSE
0503 DO bj = myByLo(myThid),myByHi(myThid)
0504 DO bi = myBxLo(myThid),myBxHi(myThid)
0505 DO j = 1,sNy
0506 DO i = 1,sNx
8a0f942cd7 Jean*0507 uVec1(i,j,bi,bj) = uVec_inScale*tmp_u(i,j,bi,bj)
0508 vVec1(i,j,bi,bj) = vVec_inScale*tmp_v(i,j,bi,bj)
78c96ec6a7 Jean*0509 ENDDO
0510 ENDDO
0511 ENDDO
0512 ENDDO
0513 ENDIF
353c624de2 Jean*0514
8a0f942cd7 Jean*0515 CALL EXF_FILTER_RL( uVec1, uVecMask, myThid )
0516 CALL EXF_FILTER_RL( vVec1, vVecMask, myThid )
353c624de2 Jean*0517
0518
4aa4270510 Jean*0519 ENDIF
0520
78c96ec6a7 Jean*0521
4aa4270510 Jean*0522 DO bj = myByLo(myThid),myByHi(myThid)
0523 DO bi = myBxLo(myThid),myBxHi(myThid)
0524 DO j = 1,sNy
0525 DO i = 1,sNx
8a0f942cd7 Jean*0526 uVec(i,j,bi,bj) = fac * uVec0(i,j,bi,bj)
0527 & + (exf_one - fac)* uVec1(i,j,bi,bj)
0528 vVec(i,j,bi,bj) = fac * vVec0(i,j,bi,bj)
0529 & + (exf_one - fac)* vVec1(i,j,bi,bj)
4aa4270510 Jean*0530 ENDDO
0531 ENDDO
0532 ENDDO
0533 ENDDO
8ac0e9b3ce Dimi*0534
0535 ELSE
78c96ec6a7 Jean*0536
0537
4aa4270510 Jean*0538 #else /* USE_EXF_INTERPOLATION */
0539 IF ( .TRUE. ) THEN
0540 #endif /* USE_EXF_INTERPOLATION */
8ac0e9b3ce Dimi*0541
8a0f942cd7 Jean*0542 CALL EXF_SET_FLD(
0543 I uVecName, uVecFile, uVecMask,
0544 I uVecStartTime, uVecPeriod, uVecRepeatCycle,
0545 I uVec_inScale, uVec_remove_intercept, uVec_remove_slope,
0546 U uVec, uVec0, uVec1,
4aa4270510 Jean*0547 #ifdef USE_EXF_INTERPOLATION
8a0f942cd7 Jean*0548 I uVec_lon0, uVec_lon_inc, uVec_lat0, uVec_lat_inc,
0549 I uVec_nlon, uVec_nlat, xC, yC, u_interp_method,
4aa4270510 Jean*0550 #endif /* USE_EXF_INTERPOLATION */
8a0f942cd7 Jean*0551 I myTime, myIter, myThid )
4aa4270510 Jean*0552
8a0f942cd7 Jean*0553 CALL EXF_SET_FLD(
0554 I vVecName, vVecFile, vVecMask,
0555 I vVecStartTime, vVecPeriod, vVecRepeatCycle,
0556 I vVec_inScale, vVec_remove_intercept, vVec_remove_slope,
0557 U vVec, vVec0, vVec1,
4aa4270510 Jean*0558 #ifdef USE_EXF_INTERPOLATION
8a0f942cd7 Jean*0559 I vVec_lon0, vVec_lon_inc, vVec_lat0, vVec_lat_inc,
0560 I vVec_nlon, vVec_nlat, xC, yC, v_interp_method,
4aa4270510 Jean*0561 #endif /* USE_EXF_INTERPOLATION */
8a0f942cd7 Jean*0562 I myTime, myIter, myThid )
b04d738fef Jean*0563
63930fb278 Gael*0564
0565 IF ( rotateStressOnAgrid ) THEN
0566 DO bj = myByLo(myThid),myByHi(myThid)
0567 DO bi = myBxLo(myThid),myBxHi(myThid)
0568 DO j = 1,sNy
0569 DO i = 1,sNx
8a0f942cd7 Jean*0570 tmp_u(i,j,bi,bj) = uVec(i,j,bi,bj)
0571 tmp_v(i,j,bi,bj) = vVec(i,j,bi,bj)
63930fb278 Gael*0572 ENDDO
0573 ENDDO
0574 ENDDO
0575 ENDDO
0576 DO bj = myByLo(myThid),myByHi(myThid)
0577 DO bi = myBxLo(myThid),myBxHi(myThid)
0578 DO j = 1,sNy
0579 DO i = 1,sNx
8a0f942cd7 Jean*0580 uVec(i,j,bi,bj) =
63930fb278 Gael*0581 & angleCosC(i,j,bi,bj)*tmp_u(i,j,bi,bj)
0582 & +angleSinC(i,j,bi,bj)*tmp_v(i,j,bi,bj)
8a0f942cd7 Jean*0583 vVec(i,j,bi,bj) =
63930fb278 Gael*0584 & -angleSinC(i,j,bi,bj)*tmp_u(i,j,bi,bj)
0585 & +angleCosC(i,j,bi,bj)*tmp_v(i,j,bi,bj)
0586 ENDDO
0587 ENDDO
0588 ENDDO
0589 ENDDO
0590 ENDIF
0591
8ac0e9b3ce Dimi*0592 ENDIF
0593
4aa4270510 Jean*0594 RETURN
0595 END