File indexing completed on 2024-12-17 18:37:26 UTC
view on githubraw file Latest commit 01ed6603 on 2024-02-09 18:54:26 UTC
87dd4f7d5f Oliv*0001 #include "OASIM_OPTIONS.h"
0002 #ifdef ALLOW_EXF
0003 #include "EXF_OPTIONS.h"
0004 #endif
0005
0006
0007
0008
0009
0010 SUBROUTINE OASIM_SET_FLD(
0011 I fldName, fldFile, fldMask,
0012 I fldStartTime, fldPeriod, fldRepeatCycle, fldTimeOrder,
0013 I fld_inScale, fldRemove_intercept, fldRemove_slope,
0014 U fldArr, fld0, fld1,
0015 #ifdef USE_EXF_INTERPOLATION
0016 I fld_lon0, fld_lon_inc, fld_lat0, fld_lat_inc,
0017 I fld_nlon, fld_nlat, fld_xout, fld_yout, interp_method,
0018 #endif
0019 I myTime, myIter, myThid )
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040 IMPLICIT NONE
0041
0042 #include "EEPARAMS.h"
0043 #include "SIZE.h"
0044 #include "PARAMS.h"
0045 #ifdef ALLOW_EXF
0046 #include "EXF_PARAM.h"
0047 #include "EXF_CONSTANTS.h"
0048 #include "EXF_INTERP_SIZE.h"
0049 #include "EXF_INTERP_PARAM.h"
0050 #endif
01ed660396 Oliv*0051 #include "OASIM_SIZE.h"
0052 #include "OASIM_EXF_PARAMS.h"
87dd4f7d5f Oliv*0053
0054
0055
0056
0057
0058
0059
0060
0061
0062
0063
0064
0065
0066
0067 #ifdef USE_EXF_INTERPOLATION
0068
0069
0070
0071
0072
0073
0074
0075
0076 #endif /* USE_EXF_INTERPOLATION */
0077
0078
0079
0080 CHARACTER*(*) fldName
0081 CHARACTER*(128) fldFile
0082 CHARACTER*1 fldMask
0083 INTEGER fldTimeOrder
0084 _RL fldStartTime, fldPeriod, fldRepeatCycle
0085 _RL fld_inScale
0086 _RL fldRemove_intercept, fldRemove_slope
0087 _RL fldArr(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
0088 _RL fld0 (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
0089 _RL fld1 (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
0090 #ifdef USE_EXF_INTERPOLATION
0091 _RL fld_lon0, fld_lon_inc
0092 _RL fld_lat0, fld_lat_inc(MAX_LAT_INC)
0093 INTEGER fld_nlon, fld_nlat
0094 _RS fld_xout (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
0095 _RS fld_yout (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
0096 INTEGER interp_method
0097 #endif /* USE_EXF_INTERPOLATION */
0098 _RL myTime
0099 INTEGER myIter
0100 INTEGER myThid
0101
0102 #ifdef ALLOW_OASIM
0103 #ifdef ALLOW_EXF
0104
0105
0106 INTEGER ILNBLNK
0107 EXTERNAL ILNBLNK
0108
0109
0110
0111 CHARACTER*(MAX_LEN_MBUF) msgBuf
0112 LOGICAL first, changed
0113 INTEGER count0, count1
0114 INTEGER year0, year1
0115 INTEGER bi, bj, i, j
0116 _RL fac
0117 CHARACTER*(128) locFile0, locFile1
0118 #ifdef USE_EXF_INTERPOLATION
0119 CHARACTER*(MAX_LEN_FNAM) out_file
0120 # ifndef EXF_INTERP_USE_DYNALLOC
0121 _RL bufArr( exf_interp_bufferSize )
0122 # endif
0123 #endif /* USE_EXF_INTERPOLATION */
0124
0125
0126 IF ( fldFile .NE. ' ' .AND. fldPeriod .NE. 0. ) THEN
0127
0128 IF ( exf_debugLev.GE.debLevD ) THEN
0129 _BEGIN_MASTER( myThid )
0130 j = ILNBLNK(fldFile)
0131 WRITE(msgBuf,'(5A)') 'OASIM_SET_FLD: ',
0132 & 'processing field "', fldName, '", file: ', fldFile(1:j)
0133 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
0134 & SQUEEZE_RIGHT, myThid )
0135 _END_MASTER( myThid )
0136 ENDIF
0137
0138 IF ( useCAL .AND. fldPeriod .EQ. -12. ) THEN
0139 #ifdef ALLOW_CAL
0140
0141
0142 CALL cal_GetMonthsRec(
0143 O fac, first, changed,
0144 O count0, count1, year0, year1,
0145 I myTime, myIter, myThid )
0146 #endif /* ALLOW_CAL */
0147 ELSEIF ( useCal .AND. fldperiod .EQ. -1.) THEN
0148
01ed660396 Oliv*0149
87dd4f7d5f Oliv*0150
0151
0152 #ifdef ALLOW_CAL
0153 CALL OASIM_GetMonthsRec(
01ed660396 Oliv*0154 I fldStartTime, useOasimYearlyFields, fldTimeOrder,
87dd4f7d5f Oliv*0155 O fac, first, changed,
0156 O count0, count1, year0, year1,
0157 I myTime, myIter, myThid )
0158 #endif /* ALLOW_CAL */
0159 ELSEIF ( fldPeriod .LT. 0. ) THEN
0160 j = ILNBLNK(fldFile)
0161 WRITE(msgBuf,'(4A,1PE16.8,2A)') 'OASIM_SET_FLD: ',
0162 & '"', fldName, '", Invalid fldPeriod=', fldPeriod,
0163 & ' for file: ', fldFile(1:j)
0164 CALL PRINT_ERROR( msgBuf, myThid )
0165 STOP 'ABNORMAL END: S/R OASIM_SET_FLD'
0166 ELSE
0167
0168 CALL EXF_GetFFieldRec(
0169 I fldStartTime, fldPeriod, fldRepeatCycle,
01ed660396 Oliv*0170 I fldName, useOasimYearlyFields,
87dd4f7d5f Oliv*0171 O fac, first, changed,
0172 O count0, count1, year0, year1,
0173 I myTime, myIter, myThid )
0174
0175 ENDIF
0176 IF ( exf_debugLev.GE.debLevD ) THEN
0177 _BEGIN_MASTER( myThid )
0178 WRITE(msgBuf,'(2A,I10,2I7)') 'OASIM_SET_FLD: ',
0179 & ' myIter, count0, count1:', myIter, count0, count1
0180 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
0181 & SQUEEZE_RIGHT, myThid )
0182 WRITE(msgBuf,'(2A,2(L2,2X),F21.17)') 'OASIM_SET_FLD: ',
0183 & ' first, changed, fac: ', first, changed, fac
0184 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
0185 & SQUEEZE_RIGHT, myThid )
0186 _END_MASTER( myThid )
0187 ENDIF
0188
0189 IF ( first ) THEN
0190 CALL exf_GetYearlyFieldName(
01ed660396 Oliv*0191 I useOasimYearlyFields, twoDigitYear, fldPeriod, year0,
87dd4f7d5f Oliv*0192 I fldFile,
0193 O locFile0,
0194 I myTime, myIter, myThid )
0195 IF ( exf_debugLev.GE.debLevC ) THEN
0196 _BEGIN_MASTER(myThid)
0197 j = ILNBLNK(locFile0)
0198 WRITE(msgBuf,'(4A,I10,A,I6)') 'OASIM_SET_FLD: ',
0199 & 'field "', fldName, '", it=', myIter,
0200 & ', loading rec=', count0
0201 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
0202 & SQUEEZE_RIGHT, myThid )
0203 WRITE(msgBuf,'(4A)') 'OASIM_SET_FLD: ',
0204 & ' from file: "', locFile0(1:j), '"'
0205 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
0206 & SQUEEZE_RIGHT, myThid )
0207 _END_MASTER(myThid)
0208 ENDIF
0209
0210 #ifdef USE_EXF_INTERPOLATION
0211 IF ( interp_method.GE.1 ) THEN
0212 CALL EXF_INTERP(
0213 I locFile0, exf_iprec,
0214 #ifdef EXF_INTERP_USE_DYNALLOC
0215 O fld1,
0216 #else
0217 O fld1, bufArr,
0218 #endif
0219 I count0, fld_xout, fld_yout,
0220 I fld_lon0, fld_lon_inc, fld_lat0, fld_lat_inc,
0221 I fld_nlon, fld_nlat, interp_method, myIter, myThid )
0222
0223 IF ( exf_output_interp ) THEN
0224 j = ILNBLNK(locFile0)
0225 WRITE(out_file,'(2A)') locFile0(1:j), '_out'
0226 IF ( count0.NE.1 )
0227 & CALL WRITE_REC_XY_RL( out_file, fld1, 1,
0228 & myIter, myThid )
0229 CALL WRITE_REC_XY_RL( out_file, fld1, count0,
0230 & myIter, myThid )
0231 ENDIF
0232
0233 ELSE
0234 #endif /* USE_EXF_INTERPOLATION */
0235 CALL READ_REC_3D_RL( locFile0, exf_iprec, 1,
0236 & fld1, count0, myIter, myThid )
0237 #ifdef USE_EXF_INTERPOLATION
0238 ENDIF
0239 #endif /* USE_EXF_INTERPOLATION */
0240
0241
0242 CALL EXF_FILTER_RL( fld1, fldMask, myThid )
0243
0244
0245 ENDIF
0246
0247 IF ( first .OR. changed ) THEN
0248 CALL exf_SwapFFields( fld0, fld1, myThid )
0249
0250 CALL exf_GetYearlyFieldName(
01ed660396 Oliv*0251 I useOasimYearlyFields, twoDigitYear, fldPeriod, year1,
87dd4f7d5f Oliv*0252 I fldFile,
0253 O locFile1,
0254 I myTime, myIter, myThid )
0255 IF ( exf_debugLev.GE.debLevC ) THEN
0256 _BEGIN_MASTER(myThid)
0257 j = ILNBLNK(locFile1)
0258 WRITE(msgBuf,'(4A,I10,A,I6)') 'OASIM_SET_FLD: ',
0259 & 'field "', fldName, '", it=', myIter,
0260 & ', loading rec=', count1
0261 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
0262 & SQUEEZE_RIGHT, myThid )
0263 WRITE(msgBuf,'(4A)') 'OASIM_SET_FLD: ',
0264 & ' from file: "', locFile1(1:j), '"'
0265 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
0266 & SQUEEZE_RIGHT, myThid )
0267 _END_MASTER(myThid)
0268 ENDIF
0269
0270 #ifdef USE_EXF_INTERPOLATION
0271 IF ( interp_method.GE.1 ) THEN
0272 CALL EXF_INTERP(
0273 I locFile1, exf_iprec,
0274 #ifdef EXF_INTERP_USE_DYNALLOC
0275 O fld1,
0276 #else
0277 O fld1, bufArr,
0278 #endif
0279 I count1, fld_xout, fld_yout,
0280 I fld_lon0, fld_lon_inc, fld_lat0, fld_lat_inc,
0281 I fld_nlon, fld_nlat, interp_method, myIter, myThid )
0282
0283 IF ( exf_output_interp ) THEN
0284 j = ILNBLNK(locFile1)
0285 WRITE(out_file,'(2A)') locFile1(1:j), '_out'
0286 CALL WRITE_REC_XY_RL( out_file, fld1, count1,
0287 & myIter, myThid )
0288 ENDIF
0289
0290 ELSE
0291 #endif /* USE_EXF_INTERPOLATION */
0292 CALL READ_REC_3D_RL( locFile1, exf_iprec, 1,
0293 & fld1, count1, myIter, myThid )
0294 #ifdef USE_EXF_INTERPOLATION
0295 ENDIF
0296 #endif /* USE_EXF_INTERPOLATION */
0297
0298
0299 CALL EXF_FILTER_RL( fld1, fldMask, myThid )
0300
0301
0302 ENDIF
0303
0304
0305 DO bj = myByLo(myThid),myByHi(myThid)
0306 DO bi = myBxLo(myThid),myBxHi(myThid)
0307 DO j = 1,sNy
0308 DO i = 1,sNx
0309
0310 fldArr(i,j,bi,bj) = fld_inScale * (
0311 & fac * fld0(i,j,bi,bj)
0312 & + (exf_one - fac)* fld1(i,j,bi,bj) )
0313 fldArr(i,j,bi,bj) = fldArr(i,j,bi,bj)
0314 & - fld_inScale*( fldRemove_intercept
0315 & + fldRemove_slope*(myTime-startTime) )
0316 ENDDO
0317 ENDDO
0318 ENDDO
0319 ENDDO
0320
0321 ENDIF
0322
0323 #endif /* ALLOW_EXF */
0324 #endif /* ALLOW_OASIM */
0325
0326 RETURN
0327 END