File indexing completed on 2026-01-27 18:49:57 UTC
view on githubraw file Latest commit b4e9a6eb on 2026-01-16 16:45:30 UTC
ad59256d7d aver*0001 #include "OBSFIT_OPTIONS.h"
0002 #include "AD_CONFIG.h"
0003
0004
0005
0006
0007
0008 SUBROUTINE OBSFIT_INIT_FIXED( myThid )
0009
0010
0011
0012
0013
0014
0015
0016 IMPLICIT NONE
0017
0018 #include "SIZE.h"
0019 #include "EEPARAMS.h"
0020 #include "PARAMS.h"
0021 #include "GRID.h"
0022 #include "DYNVARS.h"
0023 #ifdef ALLOW_CAL
0024 #include "cal.h"
0025 #endif
0026 #ifdef ALLOW_OBSFIT
0027 # include "OBSFIT_SIZE.h"
0028 # include "OBSFIT.h"
0029 # include "netcdf.inc"
0030 #endif
0031
0032
0033
0034 INTEGER myThid
0035
0036
0037 #ifdef ALLOW_OBSFIT
0038
0039 INTEGER ILNBLNK
0040 EXTERNAL ILNBLNK
0041 INTEGER MDS_RECLEN
0042 EXTERNAL MDS_RECLEN
0043
0044
0045
0046
0047
0048 INTEGER i,j,k,l,bi,bj,iG,jG
0049 INTEGER obs_num, num_file, sampleNo_tile
0050 INTEGER ic, ip, iq, kLev, iINTERP
0051 INTEGER chunkObs, chunk
0052 INTEGER iUnit
0053 INTEGER stopObsfit, stopGenericGrid
0054 INTEGER loopThroughSamples, weighSamples, readDelT
0055 INTEGER obsIsInRunTime, sampleIsInTile, sampleIsValid
0056 INTEGER fid, dimid, varID(2)
0057 INTEGER varID0, varID1a, varID1b, varID1c
0058 INTEGER varID2, varID3a, varID3b, varID4, varID5
0059 INTEGER varID6, varID7
0060 INTEGER varID_intp1, varID_intp2, varID_intp11, varID_intp22
0061 INTEGER varID_intp3, varID_intp4, varID_intp5, varID_intp6
0062 INTEGER tmpdate(4), tmpdiff(4)
0063 INTEGER tmp_type2(1000), type_cur
0064 INTEGER sample_i, sample_j, sample_k1, sample_k2
0065 INTEGER np_cur
0066 INTEGER ObsNo_valid, ObsNo_div1000
0067 INTEGER sample_cnt
0068 INTEGER hh, obsNo_hh, obs_np_max
0069 INTEGER ntype_ssh,ntype_other, obs_is_ssh_loc
0070 INTEGER vec_start, vec_count
0071 INTEGER vec_start2(2), vec_count2(2)
0072 INTEGER IL, JL, err, nerr
0073 _RL tmpyymmdd(1000),tmphhmmss(1000),diffsecs
0074 _RL yymmddMin,yymmddMax
0075 _RL hhmmssMin,hhmmssMax
0076 _RL tmpnp(1000), tmpdelT(1000)
0077 _RL tmp_lon, tmp_lon2(1000), tmp_lat2(1000), lon_cur, lat_cur
0078 _RL tmp_depth2(1000), depth_cur, delT_cur
0079 _RL tmp_weight2(1000)
b4e9a6eb7c aver*0080 _RL tmp_sample_time(NSAMPLES_MAX_GLO)
0081 _RL tmp_sample_delT(NSAMPLES_MAX_GLO)
ad59256d7d aver*0082 _RL lon_1, lon_2, lat_1, lat_2
0083 _RL depth_1, depth_2
0084 _RL lon_tmp1, lon_tmp2, lat_tmp1, lat_tmp2
0085 _RL lat_fac, lon_fac, depth_fac
0086 _RL mask(NUM_INTERP_PTS_OBS)
0087 _RL w(NUM_INTERP_PTS_OBS), wtot
0088 _RL tmp_i(1000,NUM_INTERP_PTS_OBS)
0089 _RL tmp_j(1000,NUM_INTERP_PTS_OBS)
0090 _RL tmp_k(1000,NUM_INTERP_PTS_OBS)
0091 _RL tmp_frac(1000,NUM_INTERP_PTS_OBS),tmp_sum_fracs
0092 _RL tmp_xC11(1000),tmp_yC11(1000)
0093 _RL tmp_xCNINJ(1000),tmp_yCNINJ(1000)
0094
0095 CHARACTER*(MAX_LEN_FNAM) obsfitfile, fnamedatanc
0096 CHARACTER*(MAX_LEN_FNAM) obsfnameequinc, obsfnameequincglo
0097 CHARACTER*(MAX_LEN_FNAM) fnamemisfit
0098 # ifdef ALLOW_ADJOINT_RUN
0099 CHARACTER*(MAX_LEN_FNAM) adobsfnameequinc, adobsfnameequincglo
0100 # endif
0101 # ifdef ALLOW_TANGENTLINEAR_RUN
0102 CHARACTER*(MAX_LEN_FNAM) tlobsfnameequinc, tlobsfnameequincglo
0103 # endif
0104 CHARACTER*(MAX_LEN_MBUF) msgbuf
0105 LOGICAL exst
0106
0107 iUnit = standardMessageUnit
0108 WRITE( msgbuf,'(A)' ) ' '
0109 CALL PRINT_MESSAGE( msgbuf, iUnit, SQUEEZE_RIGHT, myThid )
0110 WRITE( msgbuf,'(A)' )
0111 & '// ======================================================='
0112 CALL PRINT_MESSAGE( msgbuf, iUnit, SQUEEZE_RIGHT, myThid )
0113 WRITE( msgbuf,'(A)' )
0114 & '// insitu obsfit model sampling >>> START <<<'
0115 CALL PRINT_MESSAGE( msgbuf, iUnit, SQUEEZE_RIGHT, myThid )
0116 WRITE( msgbuf,'(A)' )
0117 & '// ======================================================='
0118 CALL PRINT_MESSAGE( msgbuf, iUnit, SQUEEZE_RIGHT, myThid )
0119 WRITE(msgbuf,'(A)' ) ' '
0120 CALL PRINT_MESSAGE( msgbuf, iUnit, SQUEEZE_RIGHT, myThid )
0121
0122 stopObsfit=0
0123 stopGenericGrid=0
0124
0125 IF ( (.NOT.obsfitDoGenGrid) .AND.
0126 & (.NOT.usingSphericalPolarGrid .OR. rotateGrid) ) THEN
0127 WRITE( msgBuf,'(2A)' ) 'OBSFIT_INIT_FIXED: ',
0128 & 'obsfitDoGenGrid=.true. is required'
0129 CALL PRINT_ERROR( msgBuf, myThid )
0130 WRITE( msgBuf,'(2A)' ) 'OBSFIT_INIT_FIXED: ',
0131 & 'unless usingSphericalGrid=.TRUE. and rotateGrid=.FALSE.'
0132 CALL PRINT_ERROR( msgBuf, myThid )
0133 CALL ALL_PROC_DIE( myThid )
0134 STOP 'ABNORMAL END: S/R OBSFIT_INIT_FIXED'
0135 ENDIF
0136
0137
0138
0139
0140
0141
0142
0143
0144
0145 WRITE( msgbuf,'(A)' ) ' '
0146 CALL PRINT_MESSAGE( msgbuf, iUnit, SQUEEZE_RIGHT, myThid )
0147 WRITE( msgbuf,'(A)' ) 'general packages parameters :'
0148
0149 JL = ILNBLNK( obsfitDir )
0150 IF (JL.NE.0) THEN
0151 WRITE( msgbuf,'(2A)' ) ' obsfitDir ',obsfitDir(1:JL)
0152 ELSE
0153 WRITE( msgbuf,'(2A)' ) ' obsfitDir ','./'
0154 ENDIF
0155 CALL PRINT_MESSAGE( msgBuf, iUnit, SQUEEZE_RIGHT, myThid )
0156 WRITE( msgbuf,'(A,l5)' ) ' obsfitDoGenGrid ',obsfitDoGenGrid
0157 CALL PRINT_MESSAGE( msgBuf, iUnit, SQUEEZE_RIGHT, myThid )
0158 WRITE( msgbuf,'(A,l5)' ) ' obsfitDoNcOutput ',obsfitDoNcOutput
0159 CALL PRINT_MESSAGE( msgBuf, iUnit, SQUEEZE_RIGHT, myThid )
0160 WRITE( msgbuf,'(A)' ) ' '
0161 CALL PRINT_MESSAGE( msgbuf, iUnit, SQUEEZE_RIGHT, myThid )
0162
0163 _BEGIN_MASTER( myThid )
0164
0165
0166 obsfit_curfile_buff = 0
0167 DO l = 1, 1000
0168 obsfit_data_buff(l) = 0. _d 0
0169 obsfit_uncert_buff(l) = 0. _d 0
0170 ENDDO
0171
0172 yymmddMin=modelstartdate(1)
0173 yymmddMax=modelenddate(1)
0174 hhmmssMin=modelstartdate(2)
0175 hhmmssMax=modelenddate(2)
0176
0177 DO num_file = 1, NFILESMAX_OBS
0178
0179 ObsNo_hh=0
0180 obs_np_max=0
0181 obs_is_ssh_loc=0
0182 obs_is_ssh(num_file)=0
0183
0184 obsfitFile=' '
0185 IL = ILNBLNK( obsfitFiles(num_file) )
0186 IF (IL.NE.0) THEN
0187 WRITE( obsfitFile,'(1A)' ) obsfitFiles(num_file)(1:IL)
0188 WRITE( msgbuf,'(A)' ) ' '
0189 CALL PRINT_MESSAGE( msgbuf, iUnit, SQUEEZE_RIGHT, myThid )
0190 WRITE( msgbuf,'(A,I3,2A)' ) 'obsfit file #', num_file,
0191 & ' is ', obsfitFile(1:IL)
0192 CALL PRINT_MESSAGE( msgbuf, iUnit, SQUEEZE_RIGHT, myThid )
0193 ENDIF
0194
0195 IL = ILNBLNK( obsfitFile )
0196 IF (IL.NE.0) THEN
0197
0198
0199
0200
0201
0202 WRITE( fnamedatanc,'(2A)' ) obsfitFile(1:IL),'.nc'
0203 err = NF_OPEN( fnamedatanc, NF_NOWRITE, fiddata_obs(num_file) )
0204 CALL OBSFIT_NF_ERROR(
0205 & 'INIT_FIXED: NF_OPEN fiddata',err,0,0,myThid )
0206
0207
0208 fid = fiddata_obs(num_file)
0209
0210 err = NF_INQ_DIMID( fid,'iOBS', dimid )
0211 CALL OBSFIT_NF_ERROR(
0212 & 'INIT_FIXED: NF_INQ_DIMID iOBS',err,0,0,myThid )
0213 err = NF_INQ_DIMLEN( fid, dimid, obsNo(num_file) )
0214 CALL OBSFIT_NF_ERROR(
0215 & 'INIT_FIXED: NF_INQ_DIMLEN ObsNo',err,0,0,myThid )
0216
0217 WRITE(msgbuf,'(A,I9)')
0218 & ' # of observations in file =',
0219 & obsNo(num_file)
0220 CALL PRINT_MESSAGE( msgbuf, iUnit, SQUEEZE_RIGHT, myThid )
0221
0222
0223 err = NF_INQ_DIMID(fid,'iINTERP', dimid)
0224 IF (err.EQ.NF_NOERR) THEN
0225 err = NF_INQ_DIMLEN( fid, dimid, iINTERP )
0226 ELSE
0227
0228 IF ( debugLevel .GE. debLevA ) THEN
0229 WRITE( msgBuf,'(3A,I3)' )
0230 & 'S/R OBSFIT_INIT_FIXED: ',
0231 & 'no iINTERP dim in data file using iINTERP ',
0232 & '= NUM_INTERP_POINTS =', NUM_INTERP_PTS_OBS
0233 CALL PRINT_MESSAGE( msgBuf, iUnit, SQUEEZE_RIGHT, myThid )
0234 ENDIF
0235
0236 iINTERP = NUM_INTERP_PTS_OBS
0237
0238 ENDIF
0239
0240 WRITE( msgbuf,'(A,I9)' )
0241 & ' # of interpolation points =',
0242 & iINTERP
0243 CALL PRINT_MESSAGE( msgbuf, iUnit, SQUEEZE_RIGHT, myThid )
0244
0245
0246 loopThroughSamples = 1
0247 err = NF_INQ_VARID( fid, 'obs_np', varID0 )
0248 IF (err.NE.NF_NOERR) THEN
0249 loopThroughSamples = 0
0250
0251 WRITE( msgbuf,'(2A)' )
0252 & ' input obsfit file does not have NP ',
0253 & ' (num. samples); assume NP=1 for all obs '
0254 CALL PRINT_MESSAGE( msgbuf, iUnit, SQUEEZE_RIGHT, myThid )
0255
0256 ENDIF
0257
0258
0259 err = NF_INQ_VARID( fid, 'obs_YYYYMMDD', varID1a )
0260 nerr = err
0261 CALL OBSFIT_NF_ERROR(
0262 & 'INIT_FIXED: NF_INQ_DIMID obs_YYYYMMDD',err,0,0,myThid )
0263 err = NF_INQ_VARID( fid, 'obs_HHMMSS', varID1b )
0264 nerr = nerr + err
0265 CALL OBSFIT_NF_ERROR(
0266 & 'INIT_FIXED: NF_INQ_DIMID obs_HHMMSS',err,0,0,myThid )
0267 err = NF_INQ_VARID( fid, 'obs_val', varID6 )
0268 nerr = nerr + err
0269 CALL OBSFIT_NF_ERROR(
0270 & 'INIT_FIXED: NF_INQ_DIMID obs_val',err,0,0,myThid )
0271 err = NF_INQ_VARID( fid, 'obs_uncert', varID7 )
0272 nerr = nerr + err
0273 CALL OBSFIT_NF_ERROR(
0274 & 'INIT_FIXED: NF_INQ_DIMID obs_uncert',err,0,0,myThid )
0275
0276 IF (nerr.NE.NF_NOERR) THEN
0277 IL = ILNBLNK( obsfitFile )
0278 WRITE( msgBuf,'(3A)' )
0279 & 'OBSFIT_INIT_FIXED: file ', obsfitFile(1:IL),
0280 & '.nc is not in the pkg/obsfit format'
0281 CALL PRINT_ERROR( msgBuf, myThid )
0282 stopObsfit = 1
0283 ENDIF
0284
0285 readDelT = 1
0286 err = NF_INQ_VARID( fid,'obs_delT', varID1c )
b4e9a6eb7c aver*0287
ad59256d7d aver*0288 IF (err.NE.NF_NOERR) THEN
0289 readDelT = 0
0290 WRITE( msgbuf,'(2A)' )
0291 & ' input obsfit file does not have time interval;',
0292 & ' assume observations are instantaneous '
0293 CALL PRINT_MESSAGE( msgbuf, iUnit, SQUEEZE_RIGHT, myThid )
0294 ENDIF
0295
0296
0297 err = NF_INQ_VARID( fid,'sample_type',varID2 )
0298 nerr = err
0299 CALL OBSFIT_NF_ERROR(
0300 & 'INIT_FIXED: NF_INQ_DIMID sample_type',err,0,0,myThid )
0301 err = NF_INQ_VARID( fid,'sample_lon', varID3a )
0302 nerr = err
0303 CALL OBSFIT_NF_ERROR(
0304 & 'INIT_FIXED: NF_INQ_DIMID sample_lon',err,0,0,myThid )
0305 err = NF_INQ_VARID( fid,'sample_lat', varID3b )
0306 nerr = err
0307 CALL OBSFIT_NF_ERROR(
0308 & 'INIT_FIXED: NF_INQ_DIMID sample_lat',err,0,0,myThid )
0309 err = NF_INQ_VARID( fid,'sample_depth', varID4 )
0310 nerr = err
0311 CALL OBSFIT_NF_ERROR(
0312 & 'INIT_FIXED: NF_INQ_DIMID sample_depth',err,0,0,myThid )
0313
0314 IF (err.NE.NF_NOERR) THEN
0315 IL = ILNBLNK( obsfitFile )
0316 WRITE( msgBuf,'(3A)' )
0317 & 'OBSFIT_INIT_FIXED: file ', obsfitFile(1:IL),
0318 & '.nc is not in the pkg/obsfit format'
0319 CALL PRINT_ERROR( msgBuf, myThid )
0320 stopObsfit=1
0321 ENDIF
0322
0323 weighSamples = 1
0324 err = NF_INQ_VARID( fid,'sample_weight', varID5 )
0325
0326 IF (err.NE.NF_NOERR) THEN
0327 weighSamples = 0
0328 WRITE( msgbuf,'(2A)' )
0329 & ' input obsfit file does not have sample weight;',
0330 & ' assume all samples are weighed evenly '
0331 CALL PRINT_MESSAGE( msgbuf, iUnit, SQUEEZE_RIGHT, myThid )
0332 ENDIF
0333
0334 IF (obsfitDoGenGrid) THEN
0335
0336 err = NF_INQ_VARID(fid,'sample_interp_XC11',varID_intp1)
0337 err = NF_INQ_VARID(fid,'sample_interp_YC11',varID_intp2)
0338 err = NF_INQ_VARID(fid,'sample_interp_XCNINJ',varID_intp11)
0339 err = NF_INQ_VARID(fid,'sample_interp_YCNINJ',varID_intp22)
0340 err = NF_INQ_VARID(fid,'sample_interp_frac',varID_intp3)
0341 err = NF_INQ_VARID(fid,'sample_interp_i',varID_intp4)
0342 err = NF_INQ_VARID(fid,'sample_interp_j',varID_intp5)
0343 err = NF_INQ_VARID(fid,'sample_interp_k',varID_intp6)
0344 IF (err.NE.NF_NOERR) THEN
0345 IL = ILNBLNK( obsfitFile )
0346 WRITE( msgBuf,'(3A)' )
0347 & 'OBSFIT_INIT_FIXED: file ', obsfitFile(1:IL), '.nc is',
0348 & ' missing interpolation information (obsfitDoGenGrid)'
0349 CALL PRINT_ERROR( msgBuf, myThid )
0350 stopGenericGrid=2
0351 ENDIF
0352 ENDIF
0353
0354
0355 obsfit_nameequi = 'mod_val'
0356 obsfit_namemask = 'mod_mask'
0357 obsfit_nameval = 'obs_val'
0358 obsfit_nameuncert = 'obs_uncert'
0359
0360
0361 IF ( myProcId .EQ. 0 ) THEN
0362
0363 WRITE( obsfnameequincglo,'(3A)' )
0364 & obsfitDir(1:JL),obsfitFile(1:IL),'.equi.nc'
0365 # ifdef ALLOW_ADJOINT_RUN
0366 WRITE( adobsfnameequincglo,'(4A)' )
0367 & obsfitDir(1:JL),'ad',
0368 & obsfitFile(1:IL),'.equi.nc'
0369 # endif /* ALLOW_ADJOINT_RUN */
0370 # ifdef ALLOW_TANGENTLINEAR_RUN
0371 WRITE( tlobsfnameequincglo,'(4A)' )
0372 & obsfitDir(1:JL),'tl',
0373 & obsfitFile(1:IL),'.equi.nc'
0374 # endif /* ALLOW_TANGENTLINEAR_RUN */
0375
0376 JL = ILNBLNK( obsfitDir )
0377 INQUIRE( file=obsfnameequincglo, exist=exst )
0378 IF (.NOT.exst) THEN
0379 err = NF_CREATE( obsfnameequincglo, NF_CLOBBER,
0380 & fidglobal(num_file) )
0381 err = NF_DEF_DIM( fidglobal(num_file), 'iOBS',
0382 & ObsNo(num_file), dimid )
0383 err = NF_DEF_VAR( fidglobal(num_file),
0384 & obsfit_nameequi,NF_DOUBLE,1,dimid,varID(1) )
0385 err = NF_PUT_ATT_DOUBLE( fidglobal(num_file),
0386 & varID(1),'_FillValue',NF_DOUBLE,1, -9999. _d 0 )
0387 err = NF_DEF_VAR( fidglobal(num_file),
0388 & obsfit_namemask,NF_DOUBLE,1,dimid,varID(2) )
0389 err = NF_PUT_ATT_DOUBLE( fidglobal(num_file),
0390 & varID(2),'_FillValue',NF_DOUBLE,1, -9999. _d 0 )
0391 err = NF_ENDDEF( fidglobal(num_file) )
0392 err = NF_CLOSE( fidglobal(num_file) )
0393 err = NF_OPEN( obsfnameequincglo, NF_WRITE,
0394 & fidglobal(num_file) )
0395 ELSE
0396 err = NF_OPEN( obsfnameequincglo, NF_WRITE,
0397 & fidglobal(num_file) )
0398 err = NF_INQ_VARID( fidglobal(num_file), obsfit_namemask,
0399 & varID(2) )
0400
0401 ENDIF
b4e9a6eb7c aver*0402
ad59256d7d aver*0403 DO obs_num = 1, ObsNo(num_file)
0404 err = NF_PUT_VARA_DOUBLE( fidglobal(num_file), varID(2),
0405 & obs_num, 1, 0. _d 0 )
0406 CALL OBSFIT_NF_ERROR(
0407 & 'INIT_FIXED: NF_PUT_VARA_DOUBLE zero',err,0,0,myThid )
0408 ENDDO
0409
0410 #ifdef ALLOW_ADJOINT_RUN
0411 INQUIRE( file=adobsfnameequincglo, exist=exst )
0412 IF (.NOT.exst) THEN
0413 err = NF_CREATE( adobsfnameequincglo,NF_CLOBBER,
0414 & fidadglobal(num_file) )
0415 err = NF_DEF_DIM( fidadglobal(num_file),'iOBS',
0416 & ObsNo(num_file),dimid )
0417 err = NF_DEF_VAR( fidadglobal(num_file),
0418 & 'mod_val',NF_DOUBLE,1,dimid,varID(1) )
0419 err = NF_PUT_ATT_DOUBLE( fidadglobal(num_file),
0420 & varID(1),'_FillValue', NF_DOUBLE,1, 0. _d 0 )
0421 err = NF_DEF_VAR( fidadglobal(num_file),
0422 & 'mod_mask',NF_DOUBLE, 1,dimid,varID(2) )
0423 err = NF_PUT_ATT_DOUBLE( fidadglobal(num_file),
0424 & varID(2),'_FillValue',NF_DOUBLE,1, 0. _d 0 )
0425 err = NF_ENDDEF( fidadglobal(num_file) )
0426 err = NF_CLOSE( fidadglobal(num_file) )
0427 err = NF_OPEN( adobsfnameequincglo, NF_WRITE,
0428 & fidadglobal(num_file) )
0429 ELSE
0430 err = NF_OPEN( adobsfnameequincglo, NF_WRITE,
0431 & fidadglobal(num_file) )
0432 ENDIF
0433 #endif
0434 #ifdef ALLOW_TANGENTLINEAR_RUN
0435 INQUIRE( file=tlobsfnameequincglo, exist=exst )
0436 IF (.NOT.exst) THEN
0437 err = NF_CREATE( tlobsfnameequincglo,NF_CLOBBER,
0438 & fidtanglobal(num_file) )
0439 err = NF_DEF_DIM( fidtanglobal(num_file),'iOBS',
0440 & ObsNo(num_file),dimid )
0441 err = NF_DEF_VAR( fidtanglobal(num_file),
0442 & 'mod_val',NF_DOUBLE,1,dimid,varID(1) )
0443 err = NF_PUT_ATT_DOUBLE( fidtanglobal(num_file),
0444 & varID(1),'_FillValue',NF_DOUBLE,1, 0. _d 0 )
0445 err = NF_DEF_VAR( fidtanglobal(num_file),
0446 & 'mod_mask',NF_DOUBLE,1,dimid,varID(2))
0447 err = NF_PUT_ATT_DOUBLE( fidtanglobal(num_file),
0448 & varID(2),'_FillValue',NF_DOUBLE,1, 0. _d 0 )
0449 err = NF_ENDDEF( fidtanglobal(num_file) )
0450 err = NF_CLOSE( fidtanglobal(num_file) )
0451 err = NF_OPEN( tlobsfnameequincglo, NF_WRITE,
0452 & fidtanglobal(num_file) )
0453 ELSE
0454 err = NF_OPEN( tlobsfnameequincglo, NF_WRITE,
0455 & fidtanglobal(num_file) )
0456 ENDIF
0457 #endif
0458
0459
0460 WRITE( fnamemisfit,'(3A)' )
0461 & obsfitDir(1:JL),obsfitfile(1:IL),'.misfit.nc'
0462 INQUIRE( file=fnamemisfit, exist=exst )
0463 IF (.NOT.exst) THEN
0464 err = NF_CREATE( fnamemisfit,NF_CLOBBER,fidmisfit(num_file) )
0465 err = NF_DEF_DIM( fidmisfit(num_file),'iOBS',ObsNo(num_file),
0466 & dimid )
0467 err = NF_DEF_VAR( fidmisfit(num_file),'misfit',
0468 & NF_DOUBLE,1,dimid,varID(1) )
0469 err = NF_PUT_ATT_DOUBLE( fidmisfit(num_file),varID(1),
0470 & '_FillValue',NF_DOUBLE,1,-9999. _d 0 )
0471 err = NF_ENDDEF( fidmisfit(num_file) )
0472 err = NF_CLOSE( fidmisfit(num_file) )
0473 ELSE
0474 err = NF_OPEN( fnamemisfit, NF_WRITE,fidmisfit(num_file) )
0475 ENDIF
0476
0477 ENDIF
0478
0479
0480
0481
0482
0483 DO obs_num = 1, NOBSMAX_OBS
0484 obs_np(num_file,obs_num) = 1
0485 obs_ind_glob(num_file,obs_num) = 0
0486 ENDDO
0487
0488
0489 ObsNo_valid = 0
0490 Obsno_div1000 = max(0,int(ObsNo(num_file)/1000))
0491
0492
0493 sample_cnt = 1
0494
0495 DO chunkObs = 1, Obsno_div1000+1
0496 chunk = 1000*(chunkObs-1)
0497
0498 IF ( MIN(ObsNo(num_file), 1000*chunkObs ).GE.
0499 & 1+chunk ) THEN
0500
0501
0502 vec_start = 1+chunk
0503 vec_count = MIN(1000,ObsNo(num_file)-chunk)
0504
0505 IF ( (vec_count.LE.0) .OR.
0506 & (vec_count.GT.1000) .OR.
0507 & (vec_start.LE.0) .OR.
0508 & (vec_count+vec_start-1.GT.ObsNo(num_file)) )
0509 & THEN
0510 IL = ILNBLNK( obsfitFile )
0511 WRITE( msgBuf,'(3A)' )
0512 & 'OBSFIT_INIT_FIXED: file ', obsfitFile(1:IL),
0513 & '.nc was not read properly (case 1).'
0514 CALL PRINT_ERROR( msgBuf, myThid )
0515 stopObsfit = 1
0516 ENDIF
0517
0518
0519 err = NF_GET_VARA_DOUBLE( fid,varID1a,vec_start,
0520 & vec_count, tmpyymmdd )
0521 err = NF_GET_VARA_DOUBLE( fid,varID1b,vec_start,
0522 & vec_count, tmphhmmss )
0523
0524 IF ( readDelT.GT.0 ) THEN
0525 err = NF_GET_VARA_DOUBLE( fid,varID1c,vec_start,
0526 & vec_count, tmpdelT )
0527 ENDIF
0528
0529 IF ( loopThroughSamples.EQ.1 ) THEN
0530 err = NF_GET_VARA_DOUBLE( fid,varID0,vec_start,
0531 & vec_count, tmpnp )
0532 ENDIF
0533
0534 IF (err.NE.NF_NOERR) THEN
0535 WRITE( msgBuf,'(3A)' )
0536 & 'OBSFIT_INIT_FIXED: file ', obsfitFile(1:IL),
0537 & '.nc was not read properly (case 2).'
0538 CALL PRINT_ERROR( msgBuf, myThid )
0539 stopObsfit = 1
0540 ENDIF
0541
0542
0543 DO ic = 1, MIN(1000,ObsNo(num_file)-chunk)
0544
0545 IF ( stopObsfit .EQ. 0 ) THEN
0546 obsIsInRunTime = 1
0547
0548
0549
0550 IF (( ( tmpyymmdd(ic).GT.yymmddMin ) .OR.
0551 & (( tmpyymmdd(ic).EQ.yymmddMin ) .AND.
0552 & ( tmphhmmss(ic).GE.hhmmssMin )) ) .AND.
0553 & ( ( tmpyymmdd(ic).LT.yymmddMax ) .OR.
0554 & (( tmpyymmdd(ic).EQ.yymmddMax ) .AND.
0555 & ( tmphhmmss(ic).LE.hhmmssMax )) )) THEN
0556 hh = INT(tmphhmmss(ic))/10000
0557 IF ( hh.LT.hoursPerDay ) THEN
0558 obsIsInRunTime = 1
0559 CALL CAL_FULLDATE( INT(tmpyymmdd(ic)),
0560 & INT(tmphhmmss(ic)),tmpdate,myThid )
0561 CALL CAL_TIMEPASSED( modelstartdate,tmpdate,
0562 & tmpdiff,myThid )
0563 CALL CAL_TOSECONDS( tmpdiff,diffsecs,myThid )
0564 diffsecs = diffsecs+nIter0*deltaTClock
0565 ELSE
0566
0567 obsIsInRunTime = 0
0568 diffsecs = -deltaTClock
0569 ObsNo_hh = ObsNo_hh+1
0570 ENDIF
0571 ELSE
0572 obsIsInRunTime = 0
0573 diffsecs = -deltaTClock
0574 ENDIF
0575
0576 IF ( loopThroughSamples.EQ.1 ) THEN
0577 np_cur = tmpnp(ic)
0578 ELSE
0579 np_cur = 1
0580 ENDIF
0581
0582 IF ( readDelT.EQ.1 ) THEN
0583 IF ( tmpdelT(ic).GT.0. _d 0 ) THEN
0584
0585 delT_cur = tmpdelT(ic)
0586 obsfitOperation(num_file) = 1
0587 ELSEIF (tmpdelT(ic).LT.0. _d 0) THEN
0588
0589 delT_cur = -tmpdelT(ic)
0590 obsfitOperation(num_file) = 2
0591 ELSE
0592
0593 delT_cur = 0. _d 0
0594 obsfitOperation(num_file) = 0
0595 ENDIF
0596 ELSE
0597 delT_cur = 0. _d 0
0598 obsfitOperation(num_file) = 0
0599 ENDIF
0600
0601 IF ( obsIsInRunTime.EQ.1 ) THEN
0602
0603 ObsNo_valid = ObsNo_valid+1
0604 obs_ind_glob(num_file,ObsNo_valid) = ic+chunk
0605
0606 obs_np(num_file,ObsNo_valid) = np_cur
0607 IF ( np_cur.GT.obs_np_max ) obs_np_max = np_cur
0608
0609 obs_sample1_ind(num_file,ObsNo_valid) = sample_cnt
0610 obs_delT(num_file,ObsNo_valid) = delT_cur
0611 ENDIF
0612
0613
0614
0615
0616 DO k = 1, np_cur
0617 tmp_sample_time(sample_cnt) = diffsecs
0618 tmp_sample_delT(sample_cnt) = delT_cur
0619 sample_cnt = sample_cnt+1
0620 ENDDO
0621
0622
0623 IF ( ObsNo_valid.GT.NOBSMAX_OBS ) THEN
0624 WRITE( msgBuf,'(3A)' )
0625 & 'OBSFIT_INIT_FIXED: file ', obsfitFile(1:IL),
0626 & '.nc was not read properly (increase NOBSMAX_OBS).'
0627 CALL PRINT_ERROR( msgBuf, myThid )
0628 stopObsfit = 1
0629 ENDIF
0630
0631
0632 IF ( obs_np_max.GT.NSAMP_PER_OBS_MAX ) THEN
0633 WRITE( msgBuf,'(3A)' )
0634 & 'OBSFIT_INIT_FIXED: file ', obsfitFile(1:IL),
0635 & '.nc was not read properly ',
0636 & '(increase NSAMP_PER_OBS_MAX).'
0637 CALL PRINT_ERROR( msgBuf, myThid )
0638 stopObsfit = 1
0639 ENDIF
0640
0641 ENDIF
0642 ENDDO
0643 ENDIF
0644 ENDDO
0645
0646
0647 ObsNo(num_file) = ObsNo_valid
0648
0649 WRITE( msgbuf,'(A,I9)' )
0650 & ' # of obs with erroneous HHMMSS values =', ObsNo_hh
0651 CALL PRINT_MESSAGE( msgbuf, iUnit, SQUEEZE_RIGHT, myThid )
0652
0653 WRITE(msgbuf,'(A,I9)')
0654 & ' # of obs within time period =', ObsNo(num_file)
0655 CALL PRINT_MESSAGE( msgbuf, iUnit, SQUEEZE_RIGHT, myThid )
0656
0657
0658
0659
0660 DO bj = 1, nSy
0661 DO bi = 1, nSx
0662
0663
0664 err = NF_INQ_DIMID( fid,'iSAMPLE', dimid )
0665
0666 IF (err.NE.NF_NOERR) THEN
0667 sampleNo(num_file,bi,bj) = ObsNo(num_file)
0668 ELSE
0669 err = NF_INQ_DIMLEN( fid, dimid, sampleNo(num_file,bi,bj) )
0670 ENDIF
0671
0672 DO ip = 1, NSAMP_PER_TILE_MAX
0673 sample_timeS(num_file,ip,bi,bj) = -999. _d 0
0674 sample_timeE(num_file,ip,bi,bj) = -999. _d 0
0675 sample_lon(num_file,ip,bi,bj) = -999. _d 0
0676 sample_lat(num_file,ip,bi,bj) = -999. _d 0
0677 sample_depth(num_file,ip,bi,bj) = -999. _d 0
0678 sample_weight(num_file,ip,bi,bj) = 1. _d 0
0679 DO iq = 1, NUM_INTERP_PTS_OBS
0680 sample_interp_i(num_file,ip,iq,bi,bj) = 1
0681 sample_interp_j(num_file,ip,iq,bi,bj) = 1
0682 sample_interp_k(num_file,ip,iq,bi,bj) = 1
0683 sample_interp_frac(num_file,ip,iq,bi,bj) = 0. _d 0
0684 ENDDO
0685 sample_interp_xC11(num_file,ip,bi,bj) = -999. _d 0
0686 sample_interp_yC11(num_file,ip,bi,bj) = -999. _d 0
0687 sample_interp_xCNINJ(num_file,ip,bi,bj) = -999. _d 0
0688 sample_interp_yCNINJ(num_file,ip,bi,bj) = -999. _d 0
0689 ENDDO
0690
0691 sampleNo_tile = 0
0692 Obsno_div1000 = MAX(0,INT(sampleNo(num_file,bi,bj)/1000))
0693
0694 ntype_ssh = 0
0695 ntype_other = 0
0696
0697 DO chunkObs = 1, Obsno_div1000+1
0698 chunk = 1000*(chunkObs-1)
0699
0700 IF ( MIN(sampleNo(num_file,bi,bj), 1000*chunkObs).GE.
0701 & 1+chunk ) THEN
0702
0703
0704 vec_start = 1+chunk
0705 vec_count = MIN(1000,sampleNo(num_file,bi,bj)-chunk)
0706
0707 IF ( (vec_count.LE.0).OR.(vec_count.GT.1000).OR.
0708 & (vec_start.LE.0).OR.
0709 & (vec_count+vec_start-1.GT.
0710 & sampleNo(num_file,bi,bj)) ) THEN
0711 IL = ILNBLNK( obsfitFile )
0712 WRITE( msgBuf,'(3A)' )
0713 & 'OBSFIT_INIT_FIXED: file ', obsfitFile(1:IL),
0714 & '.nc was not read properly (case 3).'
0715 CALL PRINT_ERROR( msgBuf, myThid )
0716 stopObsfit = 1
0717 ENDIF
0718
0719 err = NF_GET_VARA_INT( fid,varID2,vec_start,
0720 & vec_count, tmp_type2 )
0721 err = NF_GET_VARA_DOUBLE( fid,varID3a,vec_start,
0722 & vec_count, tmp_lon2 )
0723 err = NF_GET_VARA_DOUBLE( fid,varID3b,vec_start,
0724 & vec_count, tmp_lat2 )
0725 err = NF_GET_VARA_DOUBLE( fid,varID4,vec_start,
0726 & vec_count, tmp_depth2 )
0727 IF ( weighSamples.EQ.1 ) THEN
0728 err = NF_GET_VARA_DOUBLE( fid,varID5,vec_start,
0729 & vec_count, tmp_weight2 )
0730 ENDIF
0731
0732
0733
0734 IF ( obsfitDoGenGrid ) THEN
0735 err = NF_GET_VARA_DOUBLE( fid,varID_intp1,vec_start,
0736 & vec_count, tmp_xC11 )
0737 err = NF_GET_VARA_DOUBLE( fid,varID_intp2,vec_start,
0738 & vec_count, tmp_yC11 )
0739 err = NF_GET_VARA_DOUBLE( fid,varID_intp11,vec_start,
0740 & vec_count, tmp_xCNINJ )
0741 err = NF_GET_VARA_DOUBLE( fid,varID_intp22,vec_start,
0742 & vec_count, tmp_yCNINJ )
0743 DO iq = 1, iINTERP
0744 vec_start2(1) = iq
0745 vec_start2(2) = 1+chunk
0746 vec_count2(1) = 1
0747 vec_count2(2) = min(1000,
0748 & sampleNo(num_file,bi,bj)-chunk)
0749 err = NF_GET_VARA_DOUBLE( fid,varID_intp3,vec_start2,
0750 & vec_count2, tmp_frac(1,iq) )
0751 err = NF_GET_VARA_DOUBLE( fid,varID_intp4,vec_start2,
0752 & vec_count2, tmp_i(1,iq) )
0753 err = NF_GET_VARA_DOUBLE( fid,varID_intp5,vec_start2,
0754 & vec_count2, tmp_j(1,iq) )
0755 err = NF_GET_VARA_DOUBLE( fid,varID_intp6,vec_start2,
0756 & vec_count2, tmp_k(1,iq) )
0757 ENDDO
0758 ENDIF
0759
0760 IF ( err.NE.NF_NOERR ) THEN
0761 WRITE( msgBuf,'(3A)' )
0762 & 'OBSFIT_INIT_FIXED: file ', obsfitFile(1:IL),
0763 & '.nc was not read properly (case 4).'
0764 CALL PRINT_ERROR( msgBuf, myThid )
0765 stopObsfit = 1
0766 ENDIF
0767
0768
0769 DO ic = 1, MIN(1000,sampleNo(num_file,bi,bj)-chunk)
0770
0771 IF ( stopObsfit .EQ. 0) THEN
0772
0773 sampleIsValid = 1
0774 sampleIsInTile = 1
0775
0776
0777 IF ( tmp_sample_time(ic+chunk).LT.0. _d 0 ) THEN
0778 sampleIsValid = 0
0779 ENDIF
0780 IF ( (tmp_sample_time(ic+chunk).GT.modelend) .OR.
0781 & (tmp_sample_time(ic+chunk).LT.modelstart) ) THEN
0782 sampleIsValid = 0
0783 ENDIF
0784
0785 type_cur = tmp_type2(ic)
0786 lon_cur = tmp_lon2(ic)
0787 lat_cur = tmp_lat2(ic)
0788 depth_cur = tmp_depth2(ic)
0789
0790
0791 IF ( type_cur.EQ.5 ) THEN
0792 ntype_ssh = ntype_ssh+1
0793 ELSE
0794 ntype_other = ntype_other+1
0795 ENDIF
0796
0797
0798
0799
0800
0801
0802
0803 IF ( (.NOT.obsfitDoGenGrid ).AND.
0804 & ( sampleIsValid.EQ.1 ) ) THEN
0805 IF ( xC(sNx+1,1,bi,bj).LT.xC(1,1,bi,bj) ) THEN
0806 tmp_lon = xC(sNx+1,1,bi,bj)+360. _d 0
0807 ELSE
0808 tmp_lon = xC(sNx+1,1,bi,bj)
0809 ENDIF
0810
0811 IF ( (xC(1,1,bi,bj).LE.lon_cur).AND.
0812 & (tmp_lon.GT.lon_cur).AND.
0813 & (yC(1,1,bi,bj).LE.lat_cur).AND.
0814 & (yC(1,sNy+1,bi,bj).GT.lat_cur) ) THEN
0815
0816 ELSEIF ( (xC(sNx+1,1,bi,bj).LT.xC(1,1,bi,bj)).AND.
0817 & (xC(1,1,bi,bj).LE.lon_cur+360. _d 0).AND.
0818 & (tmp_lon.GT.lon_cur+360. _d 0).AND.
0819 & (yC(1,1,bi,bj).LE.lat_cur).AND.
0820 & (yC(1,sNy+1,bi,bj).GT.lat_cur) ) THEN
0821 lon_cur=lon_cur+360. _d 0
0822 ELSE
0823
0824 sampleIsInTile = 0
0825 ENDIF
0826
0827
0828 sample_i = -10
0829 sample_j = -10
0830 sample_k1 = -10
0831 sample_k2 = -10
0832 lon_1 = -10
0833 lon_2 = -10
0834 lat_1 = -10
0835 lat_2 = -10
0836 depth_1 = -10
0837 depth_2 = -10
0838
0839 IF ( sampleIsInTile.EQ.1 ) THEN
0840
0841
0842
0843 IF ( -rC(1).GT.depth_cur ) THEN
0844 sample_k1 = 1
0845 sample_k2 = 1
0846 depth_fac = 1. _d 0
0847 ENDIF
0848
0849 IF ( -rC(Nr).LE.depth_cur ) THEN
0850 sample_k1 = Nr
0851 sample_k2 = Nr
0852 depth_fac = 1. _d 0
0853 ENDIF
0854
0855 DO kLev = 1, Nr-1
0856 IF ( (-rC(kLev).LE.depth_cur).AND.
0857 & (-rC(kLev+1).GT.depth_cur) ) THEN
0858 sample_k1 = kLev
0859 sample_k2 = kLev+1
0860 depth_1 = -rC(kLev)
0861 depth_2 = -rC(kLev+1)
0862 depth_fac = (depth_cur-depth_1)/(depth_2-depth_1)
0863 ENDIF
0864 ENDDO
0865
0866 DO j = 1, sNy+1
0867 DO i = 1, sNx+1
0868
0869 IF ( type_cur.EQ.3 ) THEN
0870
0871 lon_tmp1 = xG(i,j,bi,bj)
0872 lon_tmp2 = xG(i+1,j,bi,bj)
0873 lat_tmp1 = yC(i,j,bi,bj)
0874 lat_tmp2 = yC(i,j+1,bi,bj)
0875 ELSEIF ( type_cur.EQ.4 ) THEN
0876
0877 lon_tmp1 = xC(i,j,bi,bj)
0878 lon_tmp2 = xC(i+1,j,bi,bj)
0879 lat_tmp1 = yG(i,j,bi,bj)
0880 lat_tmp2 = yG(i,j+1,bi,bj)
0881 ELSE
0882 lon_tmp1 = xC(i,j,bi,bj)
0883 lon_tmp2 = xC(i+1,j,bi,bj)
0884 lat_tmp1 = yC(i,j,bi,bj)
0885 lat_tmp2 = yC(i,j+1,bi,bj)
0886 ENDIF
0887
0888
0889 IF ( (lat_tmp1.LE.lat_cur).AND.
0890 & (lat_tmp2.GT.lat_cur) ) THEN
0891 sample_j = j
0892 lat_1 = lat_tmp1
0893 lat_2 = lat_tmp2
0894 ENDIF
0895
0896
0897 IF ( xC(i+1,j,bi,bj).LT.xC(1,j,bi,bj) ) THEN
0898 lon_tmp2 = lon_tmp2+360
0899 ENDIF
0900 IF ( xC(i,j,bi,bj).LT.xC(1,j,bi,bj) ) THEN
0901 lon_tmp1 = lon_tmp1+360
0902 ENDIF
0903 IF ( (lon_tmp1.LE.lon_cur).AND.
0904 & (lon_tmp2.GT.lon_cur) ) THEN
0905 sample_i = i
0906 lon_1 = lon_tmp1
0907 lon_2 = lon_tmp2
0908 ENDIF
0909
0910 ENDDO
0911 ENDDO
0912 ENDIF
0913
0914 IF ( (sample_i.EQ.-10).OR.(sample_j.EQ.-10) ) THEN
0915 sampleIsInTile = 0
0916 ENDIF
0917 IF ( (sample_k1.EQ.-10).OR.(sample_k2.EQ.-10) ) THEN
0918 sampleIsInTile = 0
0919 ENDIF
0920
0921 IF ( sampleIsInTile.EQ.1 ) THEN
0922
0923 sampleNo_tile = sampleNo_tile+1
0924 sample_ind_glob(num_file,sampleNo_tile,bi,bj)
0925 & = ic+chunk
0926 sample_timeS(num_file,sampleNo_tile,bi,bj)=
0927 & tmp_sample_time(ic+chunk)
0928
0929
0930 IF ( obsfitOperation(num_file).eq.0 ) THEN
0931 sample_timeE(num_file,sampleNo_tile,bi,bj)=
0932 & sample_timeS(num_file,sampleNo_tile,bi,bj)
0933 & +tmp_sample_delT(ic+chunk)
0934 ELSE
0935 sample_timeE(num_file,sampleNo_tile,bi,bj)=
0936 & sample_timeS(num_file,sampleNo_tile,bi,bj)
0937 & +tmp_sample_delT(ic+chunk)-1
0938 ENDIF
0939 sample_lon(num_file,sampleNo_tile,bi,bj)=lon_cur
0940 sample_lat(num_file,sampleNo_tile,bi,bj)=lat_cur
0941 sample_depth(num_file,sampleNo_tile,bi,bj)=depth_cur
0942 IF ( weighSamples.EQ.1 ) THEN
0943 sample_weight(num_file,sampleNo_tile,bi,bj)=
0944 & tmp_weight2(ic)
0945 ENDIF
0946 sample_type(num_file,sampleNo_tile,bi,bj)=type_cur
0947
0948
0949 lon_fac = (lon_cur-lon_1)/(lon_2-lon_1)
0950 lat_fac = (lat_cur-lat_1)/(lat_2-lat_1)
0951
0952 w(1)=(1-lon_fac)*(1-lat_fac)*(1-depth_fac)
0953 sample_interp_i(num_file,sampleNo_tile,1,bi,bj)
0954 & =sample_i
0955 sample_interp_j(num_file,sampleNo_tile,1,bi,bj)
0956 & =sample_j
0957 sample_interp_k(num_file,sampleNo_tile,1,bi,bj)
0958 & =sample_k1
0959 w(2)=lon_fac*(1-lat_fac)*(1-depth_fac)
0960 sample_interp_i(num_file,sampleNo_tile,2,bi,bj)
0961 & =sample_i+1
0962 sample_interp_j(num_file,sampleNo_tile,2,bi,bj)
0963 & =sample_j
0964 sample_interp_k(num_file,sampleNo_tile,2,bi,bj)
0965 & =sample_k1
0966 w(3)=(1-lon_fac)*lat_fac*(1-depth_fac)
0967 sample_interp_i(num_file,sampleNo_tile,3,bi,bj)
0968 & =sample_i
0969 sample_interp_j(num_file,sampleNo_tile,3,bi,bj)
0970 & =sample_j+1
0971 sample_interp_k(num_file,sampleNo_tile,3,bi,bj)
0972 & =sample_k1
0973 w(4)=lon_fac*lat_fac*(1-depth_fac)
0974 sample_interp_i(num_file,sampleNo_tile,4,bi,bj)
0975 & =sample_i+1
0976 sample_interp_j(num_file,sampleNo_tile,4,bi,bj)
0977 & =sample_j+1
0978 sample_interp_k(num_file,sampleNo_tile,4,bi,bj)
0979 & =sample_k1
0980 w(5)=(1-lon_fac)*(1-lat_fac)*depth_fac
0981 sample_interp_i(num_file,sampleNo_tile,5,bi,bj)
0982 & =sample_i
0983 sample_interp_j(num_file,sampleNo_tile,5,bi,bj)
0984 & =sample_j
0985 sample_interp_k(num_file,sampleNo_tile,5,bi,bj)
0986 & =sample_k2
0987 w(6)=lon_fac*(1-lat_fac)*depth_fac
0988 sample_interp_i(num_file,sampleNo_tile,6,bi,bj)
0989 & =sample_i+1
0990 sample_interp_j(num_file,sampleNo_tile,6,bi,bj)
0991 & =sample_j
0992 sample_interp_k(num_file,sampleNo_tile,6,bi,bj)
0993 & =sample_k2
0994 w(7)=(1-lon_fac)*lat_fac*depth_fac
0995 sample_interp_i(num_file,sampleNo_tile,7,bi,bj)
0996 & =sample_i
0997 sample_interp_j(num_file,sampleNo_tile,7,bi,bj)
0998 & =sample_j+1
0999 sample_interp_k(num_file,sampleNo_tile,7,bi,bj)
1000 & =sample_k2
1001 w(8)=lon_fac*lat_fac*depth_fac
1002 sample_interp_i(num_file,sampleNo_tile,8,bi,bj)
1003 & =sample_i+1
1004 sample_interp_j(num_file,sampleNo_tile,8,bi,bj)
1005 & =sample_j+1
1006 sample_interp_k(num_file,sampleNo_tile,8,bi,bj)
1007 & =sample_k2
1008
1009
1010 IF ( type_cur.EQ.3 ) THEN
1011
1012 mask(1)=maskW(sample_i,sample_j,sample_k1,bi,bj)
1013 mask(2)=maskW(sample_i+1,sample_j,sample_k1,bi,bj)
1014 mask(3)=maskW(sample_i,sample_j+1,sample_k1,bi,bj)
1015 mask(4)=maskW(sample_i+1,sample_j+1,sample_k1,bi,bj)
1016 mask(5)=maskW(sample_i,sample_j,sample_k2,bi,bj)
1017 mask(6)=maskW(sample_i+1,sample_j,sample_k2,bi,bj)
1018 mask(7)=maskW(sample_i,sample_j+1,sample_k2,bi,bj)
1019 mask(8)=maskW(sample_i+1,sample_j+1,sample_k2,bi,bj)
1020 ELSEIF ( type_cur.EQ.4 ) THEN
1021
1022 mask(1)=maskS(sample_i,sample_j,sample_k1,bi,bj)
1023 mask(2)=maskS(sample_i+1,sample_j,sample_k1,bi,bj)
1024 mask(3)=maskS(sample_i,sample_j+1,sample_k1,bi,bj)
1025 mask(4)=maskS(sample_i+1,sample_j+1,sample_k1,bi,bj)
1026 mask(5)=maskS(sample_i,sample_j,sample_k2,bi,bj)
1027 mask(6)=maskS(sample_i+1,sample_j,sample_k2,bi,bj)
1028 mask(7)=maskS(sample_i,sample_j+1,sample_k2,bi,bj)
1029 mask(8)=maskS(sample_i+1,sample_j+1,sample_k2,bi,bj)
1030 ELSE
1031 mask(1)=maskC(sample_i,sample_j,sample_k1,bi,bj)
1032 mask(2)=maskC(sample_i+1,sample_j,sample_k1,bi,bj)
1033 mask(3)=maskC(sample_i,sample_j+1,sample_k1,bi,bj)
1034 mask(4)=maskC(sample_i+1,sample_j+1,sample_k1,bi,bj)
1035 mask(5)=maskC(sample_i,sample_j,sample_k2,bi,bj)
1036 mask(6)=maskC(sample_i+1,sample_j,sample_k2,bi,bj)
1037 mask(7)=maskC(sample_i,sample_j+1,sample_k2,bi,bj)
1038 mask(8)=maskC(sample_i+1,sample_j+1,sample_k2,bi,bj)
1039 ENDIF
1040
1041 wtot = 0
1042 DO iq = 1, NUM_INTERP_PTS_OBS
1043 IF (mask(iq).EQ.0) w(iq)=0
1044 wtot = wtot+w(iq)
1045 ENDDO
1046 DO iq = 1, NUM_INTERP_PTS_OBS
1047 sample_interp_frac(num_file,sampleNo_tile,iq,bi,bj) =
1048 & w(iq)/(wtot+1. _d -10)
1049 ENDDO
1050
1051 ENDIF
1052
1053
1054
1055
1056
1057 ELSEIF ( sampleIsValid.EQ.1 ) THEN
1058
1059 IF ( stopGenericGrid.EQ.0 ) THEN
1060
1061 IF ( (abs(tmp_xC11(ic) - xC(1,1,bi,bj))
1062 & .LT.0.0001 _d 0 ).AND.
1063 & (abs(tmp_yC11(ic) - yC(1,1,bi,bj))
1064 & .LT.0.0001 _d 0).AND.
1065 & (abs(tmp_xCNINJ(ic) - xC(sNx,sNy,bi,bj))
1066 & .LT.0.0001 _d 0).AND.
1067 & (abs(tmp_yCNINJ(ic) - yC(sNx,sNy,bi,bj))
1068 & .LT.0.0001 _d 0) ) THEN
1069
1070 ELSE
1071 sampleIsInTile = 0
1072 ENDIF
1073
1074 IF ( sampleIsInTile.EQ.1 ) THEN
1075
1076 sampleNo_tile = sampleNo_tile+1
1077 sample_type(num_file,sampleNo_tile,bi,bj)=type_cur
1078 sample_timeS(num_file,sampleNo_tile,bi,bj)=
1079 & tmp_sample_time(ic+chunk)
1080
1081
1082 IF ( obsfitOperation(num_file).EQ.0 ) THEN
1083 sample_timeE(num_file,sampleNo_tile,bi,bj)=
1084 & sample_timeS(num_file,sampleNo_tile,bi,bj)
1085 & +tmp_sample_delT(ic+chunk)
1086 ELSE
1087 sample_timeE(num_file,sampleNo_tile,bi,bj)=
1088 & sample_timeS(num_file,sampleNo_tile,bi,bj)
1089 & +tmp_sample_delT(ic+chunk)-1
1090 ENDIF
1091 IF ( weighSamples.EQ.1 ) THEN
1092 sample_weight(num_file,sampleNo_tile,bi,bj)=
1093 & tmp_weight2(ic)
1094 ENDIF
1095 sample_interp_xC11(num_file,sampleNo_tile,
1096 & bi,bj)=tmp_xC11(ic)
1097 sample_interp_yC11(num_file,sampleNo_tile,
1098 & bi,bj)=tmp_yC11(ic)
1099 sample_interp_xCNINJ(num_file,sampleNo_tile,
1100 & bi,bj)=tmp_xCNINJ(ic)
1101 sample_interp_yCNINJ(num_file,sampleNo_tile,
1102 & bi,bj)=tmp_yCNINJ(ic)
1103 tmp_sum_fracs = 0. _d 0
1104
1105
1106 DO iq = 1, iINTERP
1107 sample_interp_frac(num_file,sampleNo_tile,iq,
1108 & bi,bj)=tmp_frac(ic,iq)
1109 sample_interp_i(num_file,sampleNo_tile,iq,
1110 & bi,bj)=tmp_i(ic,iq)
1111 sample_interp_j(num_file,sampleNo_tile,iq,
1112 & bi,bj)=tmp_j(ic,iq)
1113 sample_interp_k(num_file,sampleNo_tile,iq,
1114 & bi,bj)=tmp_k(ic,iq)
1115 tmp_sum_fracs = tmp_sum_fracs+tmp_frac(ic,iq)
1116
1117
1118
1119 IF ( (tmp_i(ic,iq).LT.0).OR.
1120 & (tmp_j(ic,iq).LT.0).OR.
1121 & (tmp_i(ic,iq).GT.sNx+1).OR.
1122 & (tmp_j(ic,iq).GT.sNy+1) ) THEN
1123 WRITE( msgBuf,'(4A)' )
1124 & 'OBSFIT_INIT_FIXED: file ',
1125 & obsfitFile(1:IL),
1126 & '.nc includes inconsistent interpolation ',
1127 & ' points (obsfitDoGenGrid; out of tile)'
1128 CALL PRINT_ERROR( msgBuf, myThid )
1129 stopGenericGrid = 1
1130 ENDIF
1131 #ifdef ALLOW_OBSFIT_EXCLUDE_CORNERS
1132 IF ( tmp_frac(ic,iq) .NE. 0. _d 0) THEN
1133 IF ( ((tmp_i(ic,iq).EQ.0) .AND.
1134 & (tmp_j(ic,iq).EQ.0)) .OR.
1135 & ((tmp_i(ic,iq).EQ.sNx+1) .AND.
1136 & (tmp_j(ic,iq).EQ.sNy+1)) .OR.
1137 & ((tmp_i(ic,iq).EQ.0) .AND.
1138 & (tmp_j(ic,iq).EQ.sNy+1)) .OR.
1139 & ((tmp_i(ic,iq).EQ.sNx+1) .AND.
1140 & (tmp_j(ic,iq).EQ.0)) ) THEN
1141 WRITE( msgBuf,'(4A)' )
1142 & 'OBSFIT_INIT_FIXED: file ',
1143 & obsfitFile(1:IL),
1144 & '.nc includes inconsistent interpolation ',
1145 & ' points (obsfitDoGenGrid; overlap corners)'
1146 CALL PRINT_ERROR( msgBuf, myThid )
1147 stopGenericGrid = 1
1148 ENDIF
1149 ENDIF
1150 #endif /* ALLOW_OBSFIT_EXCLUDE_CORNERS */
1151 IF ( (tmp_frac(ic,iq).LT.0. _d 0).OR.
1152 & (tmp_frac(ic,iq).GT.1. _d 0) ) THEN
1153 WRITE( msgBuf,'(4A)' )
1154 & 'OBSFIT_INIT_FIXED: file ',
1155 & obsfitFile(1:IL),
1156 & '.nc includes inconsistent interpolation ',
1157 & ' points (obsfitDoGenGrid; sum not 0-1)'
1158 CALL PRINT_ERROR( msgBuf, myThid )
1159 stopGenericGrid = 1
1160 ENDIF
1161 ENDDO
1162
1163 IF ( abs(tmp_sum_fracs -1. _d 0 ) .GT.
1164 & 0.0001 _d 0) THEN
1165 WRITE( msgBuf,'(4A)' )
1166 & 'OBSFIT_INIT_FIXED: file ',
1167 & obsfitFile(1:IL),
1168 & '.nc includes inconsistent interpolation ',
1169 & ' weights (obsfitDoGenGrid; sum not 1)'
1170 CALL PRINT_ERROR( msgBuf, myThid )
1171 stopGenericGrid = 1
1172 ENDIF
1173
1174 sample_ind_glob(num_file,sampleNo_tile,bi,bj)
1175 & =ic+chunk
1176
1177 ENDIF
1178 ENDIF
1179 ENDIF
1180
1181
1182
1183
1184 IF ( sampleNo_tile.GT.NSAMP_PER_TILE_MAX ) THEN
1185 WRITE( msgBuf,'(3A)' )
1186 & 'OBSFIT_INIT_FIXED: file ', obsfitFile(1:IL),
1187 & '.nc was not read properly ',
1188 & '(increase NSAMP_PER_TILE_MAX).'
1189 CALL PRINT_ERROR( msgBuf, myThid )
1190 stopObsfit = 1
1191 ENDIF
1192
1193 ENDIF
1194 ENDDO
1195 ENDIF
1196 ENDDO
1197
1198
1199 sampleNo(num_file,bi,bj) = sampleNo_tile
1200
1201 WRITE( msgbuf,'(A,I4,A,I4)' )
1202 & ' current tile is bi,bj =',
1203 & bi,',',bj
1204 CALL PRINT_MESSAGE(
1205 & msgbuf, iUnit, SQUEEZE_RIGHT, myThid )
1206
1207 WRITE( msgbuf,'(A,I9)' )
1208 & ' # of samples within tile and time period =',
1209 & sampleNo(num_file,bi,bj)
1210 CALL PRINT_MESSAGE(
1211 & msgbuf, iUnit, SQUEEZE_RIGHT, myThid )
1212
1213 IF ( ntype_ssh.GT.0 ) THEN
1214 IF ( ntype_other.GT.0 ) THEN
1215 WRITE( msgBuf,'(4A)' )
1216 & 'OBSFIT_INIT_FIXED: file ', obsfitFile(1:IL),
1217 & 'includes both SSH and non-SSH observations; ',
1218 & 'this is not currently supported.'
1219 CALL PRINT_ERROR( msgBuf, myThid )
1220 stopObsfit = 1
1221 ELSE
1222 obs_is_ssh_loc = obs_is_ssh_loc+1
1223 ENDIF
1224 ENDIF
1225
1226
1227
1228
1229
1230 IF ( sampleNo(num_file,bi,bj).GT.0 ) THEN
1231 iG=bi+(myXGlobalLo-1)/sNx
1232 jG=bj+(myYGlobalLo-1)/sNy
1233
1234 JL = ILNBLNK( obsfitDir )
1235
1236 IF ( obsfitDoNcOutput ) THEN
1237
1238 WRITE( obsfnameequinc,'(3A,I3.3,A,I3.3,A)' )
1239 & obsfitDir(1:JL),obsfitFile(1:IL),
1240 & '.',iG,'.',jG,'.equi.nc'
1241 #ifdef ALLOW_ADJOINT_RUN
1242 WRITE( adobsfnameequinc,'(4A,I3.3,A,I3.3,A)' )
1243 & obsfitDir(1:JL),'ad',obsfitFile(1:IL),
1244 & '.',iG,'.',jG,'.equi.nc'
1245 #endif
1246 #ifdef ALLOW_TANGENTLINEAR_RUN
1247 WRITE( tlobsfnameequinc,'(4A,I3.3,A,I3.3,A)' )
1248 & obsfitDir(1:JL),'tl',obsfitFile(1:IL),
1249 & '.',iG,'.',jG,'.equi.nc'
1250 #endif
1251 INQUIRE( file=obsfnameequinc, exist=exst )
1252 IF (.NOT.exst) THEN
1253 CALL OBSFIT_INIT_EQUIFILES( num_file,
1254 & fiddata_obs(num_file),obsfnameequinc,
1255 & fidfwd_obs(num_file,bi,bj),
1256 & sampleNo(num_file,bi,bj),bi,bj,myThid )
1257 ELSE
1258 err = NF_OPEN( obsfnameequinc,NF_WRITE,
1259 & fidfwd_obs(num_file,bi,bj) )
1260 ENDIF
1261 #ifdef ALLOW_ADJOINT_RUN
1262 INQUIRE( file=adobsfnameequinc, exist=exst )
1263 IF (.NOT.exst) THEN
1264 CALL OBSFIT_INIT_EQUIFILES( num_file,
1265 & fiddata_obs(num_file),adobsfnameequinc,
1266 & fidadj_obs(num_file,bi,bj),
1267 & sampleNo(num_file,bi,bj),bi,bj,myThid )
1268 ELSE
1269 err = NF_OPEN( adobsfnameequinc,NF_WRITE,
1270 & fidadj_obs(num_file,bi,bj) )
1271 ENDIF
1272 #endif
1273 #ifdef ALLOW_TANGENTLINEAR_RUN
1274 INQUIRE( file=tlobsfnameequinc, exist=exst )
1275 IF (.NOT.exst) THEN
1276 CALL OBSFIT_INIT_EQUIFILES( num_file,
1277 & fiddata_obs(num_file),tlobsfnameequinc,
1278 & fidtan_obs(num_file,bi,bj),
1279 & sampleNo(num_file,bi,bj),bi,bj,myThid )
1280 ELSE
1281 err = NF_OPEN( tlobsfnameequinc,NF_WRITE,
1282 & fidtan_obs(num_file,bi,bj) )
1283 ENDIF
1284 #endif
1285 ELSE
1286
1287 WRITE( obsfnameequinc,'(3A,I3.3,A,I3.3,A)' )
1288 & obsfitDir(1:JL),obsfitFile(1:IL),'.',iG,'.',jG,
1289 & '.equi.data'
1290 #ifdef ALLOW_ADJOINT_RUN
1291 WRITE( adobsfnameequinc,'(4A,I3.3,A,I3.3,A)' )
1292 & obsfitDir(1:JL),'ad',
1293 & obsfitFile(1:IL),'.',iG,'.',jG,'.equi.data'
1294 #endif
1295 #ifdef ALLOW_TANGENTLINEAR_RUN
1296 WRITE( tlobsfnameequinc,'(4A,I3.3,A,I3.3,A)' )
1297 & obsfitDir(1:JL),'tl',
1298 & obsfitFile(1:IL),'.',iG,'.',jG,'.equi.data'
1299 #endif
1300
1301 INQUIRE( file=obsfnameequinc, exist=exst )
1302 #ifdef OBSFIT_USE_MDSFINDUNITS
1303 CALL MDSFINDUNIT( fidfwd_obs(num_file,bi,bj), myThid )
1304 #else
1305 CALL OBSFIT_FINDUNIT( fidfwd_obs(num_file,bi,bj),
1306 & myThid )
1307 #endif
1308 IF (.NOT.exst) THEN
1309 CALL OBSFIT_INIT_EQUIFILES( num_file,
1310 & fiddata_obs(num_file),obsfnameequinc,
1311 & fidfwd_obs(num_file,bi,bj),
1312 & sampleNo(num_file,bi,bj),bi,bj,myThid )
1313 ELSE
1314 OPEN( fidfwd_obs(num_file,bi,bj),
1315 & file=obsfnameequinc,form ='unformatted',
1316 & status='unknown',access='direct',
1317 & recl=2*WORDLENGTH*2 )
1318 ENDIF
1319 #ifdef ALLOW_ADJOINT_RUN
1320 INQUIRE( file=adobsfnameequinc, exist=exst )
1321 #ifdef OBSFIT_USE_MDSFINDUNITS
1322 CALL MDSFINDUNIT( fidadj_obs(num_file,bi,bj), myThid )
1323 #else
1324 CALL OBSFIT_FINDUNIT( fidadj_obs(num_file,bi,bj),
1325 & myThid )
1326 #endif
1327 IF (.NOT.exst) THEN
1328 CALL OBSFIT_INIT_EQUIFILES( num_file,
1329 & fiddata_obs(num_file),adobsfnameequinc,
1330 & fidadj_obs(num_file,bi,bj),
1331 & sampleNo(num_file,bi,bj),bi,bj,myThid )
1332 ELSE
1333 OPEN( fidadj_obs(num_file,bi,bj),
1334 & file=adobsfnameequinc,form ='unformatted',
1335 & status='unknown', access='direct',
1336 & recl=2*WORDLENGTH*2 )
1337 ENDIF
1338 #endif
1339 #ifdef ALLOW_TANGENTLINEAR_RUN
1340 INQUIRE( file=tlobsfnameequinc, exist=exst )
1341 #ifdef OBSFIT_USE_MDSFINDUNITS
1342 CALL MDSFINDUNIT( fidtan_obs(num_file,bi,bj), myThid )
1343 #else
1344 CALL OBSFIT_FINDUNIT( fidtan_obs(num_file,bi,bj),
1345 & myThid )
1346 #endif
1347 IF (.NOT.exst) THEN
1348 CALL OBSFIT_INIT_EQUIFILES( num_file,
1349 & fiddata_obs(num_file),tlobsfnameequinc,
1350 & fidtan_obs(num_file,bi,bj),
1351 & sampleNo(num_file,bi,bj),bi,bj,myThid )
1352 ELSE
1353 OPEN( fidtan_obs(num_file,bi,bj),file=
1354 & tlobsfnameequinc,form ='unformatted',
1355 & status='unknown', access='direct',
1356 & recl=2*WORDLENGTH*2 )
1357 ENDIF
1358 #endif
1359
1360 ENDIF
1361 ENDIF
1362 ENDDO
1363 ENDDO
1364
1365 CALL GLOBAL_SUM_INT(obs_is_ssh_loc, myThid)
1366 obs_is_ssh(num_file)=obs_is_ssh_loc
1367
1368
1369
1370 ELSE
1371
1372 DO bj = 1, nSy
1373 DO bi = 1, nSx
1374 ObsNo(num_file) = 0
1375 sampleNo(num_file,bi,bj) = 0
1376 DO ip = 1, NOBSMAX_OBS
1377 obs_np(num_file,ip) = -999. _d 0
1378 ENDDO
1379 DO ip = 1, NSAMP_PER_TILE_MAX
1380 sample_timeS(num_file,ip,bi,bj) = -999. _d 0
1381 sample_timeE(num_file,ip,bi,bj) = -999. _d 0
1382 sample_lon(num_file,ip,bi,bj) = -999. _d 0
1383 sample_lat(num_file,ip,bi,bj) = -999. _d 0
1384 sample_depth(num_file,ip,bi,bj) = -999. _d 0
1385 sample_ind_glob(num_file,ip,bi,bj) = 0
1386 DO iq = 1,NUM_INTERP_PTS_OBS
1387 sample_interp_i(num_file,ip,iq,bi,bj) = 1
1388 sample_interp_j(num_file,ip,iq,bi,bj) = 1
1389 sample_interp_k(num_file,ip,iq,bi,bj) = 1
1390 sample_interp_frac(num_file,ip,iq,bi,bj) = 0. _d 0
1391 ENDDO
1392 sample_interp_xC11(num_file,ip,bi,bj) = -999. _d 0
1393 sample_interp_yC11(num_file,ip,bi,bj) = -999. _d 0
1394 sample_interp_xCNINJ(num_file,ip,bi,bj) = -999. _d 0
1395 sample_interp_yCNINJ(num_file,ip,bi,bj) = -999. _d 0
1396 ENDDO
1397 ENDDO
1398 ENDDO
1399
1400 ENDIF
1401 ENDDO
1402
1403
1404
1405
1406
1407
1408
1409
1410 IF ( stopGenericGrid.EQ.2 ) THEN
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454 WRITE( msgBuf,'(3A)' )
1455 & 'OBSFIT_INIT_FIXED : ',
1456 & 'when using obsfitDoGenGrid ',
1457 & 'you have to provide interpolation fractions etc. '
1458 CALL PRINT_ERROR( msgBuf, myThid )
1459 WRITE( msgBuf,'(2A)' )
1460 & 'and some of your nc files dont have them. ',
1461 & 'You could use profiles_prep_mygrid.m and/or'
1462 CALL PRINT_ERROR( msgBuf, myThid )
1463 WRITE( msgBuf,'(A)' )
1464 & 'use the grid info in profiles*incl1PointOverlap*data'
1465 CALL PRINT_ERROR( msgBuf, myThid )
1466 stopObsfit=1
1467
1468 ENDIF
1469
1470 _END_MASTER( myThid )
1471 _BARRIER
1472
1473
1474 CALL GLOBAL_SUM_INT( stopObsfit , myThid )
1475 IF ( stopObsfit.GE.1) THEN
1476 CALL ALL_PROC_DIE( myThid )
1477 STOP 'ABNORMAL END: S/R OBSFIT_INIT_FIXED'
1478 ENDIF
1479
1480 CALL GLOBAL_SUM_INT( stopGenericGrid , myThid )
1481 IF ( stopGenericGrid.GE.1) THEN
1482 CALL ALL_PROC_DIE( myThid )
1483 STOP 'ABNORMAL END: S/R OBSFIT_INIT_FIXED'
1484 ENDIF
1485
1486 WRITE(msgbuf,'(A)') ' '
1487 CALL PRINT_MESSAGE( msgbuf, iUnit, SQUEEZE_RIGHT, myThid )
1488 WRITE( msgbuf,'(A)' )
1489 &'// ======================================================='
1490 CALL PRINT_MESSAGE( msgbuf, iUnit, SQUEEZE_RIGHT, myThid )
1491
1492 WRITE( msgbuf,'(A)' )
1493 &'// obsfit model sampling >>> END <<<'
1494 CALL PRINT_MESSAGE( msgbuf, iUnit, SQUEEZE_RIGHT, myThid )
1495
1496 WRITE( msgbuf,'(A)' )
1497 &'// ======================================================='
1498 CALL PRINT_MESSAGE( msgbuf, iUnit, SQUEEZE_RIGHT, myThid )
1499
1500 WRITE( msgbuf,'(A)' ) ' '
1501 CALL PRINT_MESSAGE( msgbuf, iUnit, SQUEEZE_RIGHT, myThid )
1502
1503 #endif
1504
1505 RETURN
1506 END
1507
1508