6235
6236
6237
6238
6239
6240
6241
6242
6243
6244
6245
6246
6247
6248
6249
6250
6251
6252
6253
6254
6255
6256
6257
6258
6259
6260
6261
6262
6263
6264
6265
6266
6267
6268
6269
6270
6271
6272
6273
6274
6275
6276
6277
6278 integer, intent(in) :: ng, model
6279
6280 integer, intent(in), optional :: start(:)
6281 integer, intent(in), optional :: total(:)
6282
6283 character (len=*), intent(in) :: ncname
6284 character (len=*), intent(in) :: myVarName
6285
6286 real(dp), intent(in) :: Rdate(2)
6287
6288 real(dp), intent(out), optional :: min_val
6289 real(dp), intent(out), optional :: max_val
6290
6291 real(dp), intent(out) :: A(:)
6292
6293 TYPE (File_desc_t), intent(in), optional :: pioFile
6294
6295
6296
6297 logical :: JulianOffset = .false.
6298 logical :: Ldebug = .false.
6299
6300 logical, dimension(1) :: got_units
6301 logical, dimension(2) :: foundit
6302
6303 integer :: i, ind, lstr, status
6304 integer :: year, month, day, hour, minutes
6305
6306 integer, dimension(1) :: Asize
6307
6308 real(dp) :: Afactor, Aoffset, my_Rdate(2), seconds
6309 real(dp) :: dnum_old, dnum_new, scale
6310
6311 real(r8), dimension(2) :: AttValue
6312
6313 character (len=12) :: AttName(2)
6314 character (len=22) :: dstr_old, dstr_new
6315 character (len=40) :: UnitsAtt(1), UnitsValue(1)
6316 character (len=40) :: Units, Ustring
6317
6318 character (len=*), parameter :: MyFile = &
6319 & __FILE__//", pio_netcdf_get_time_1d"
6320
6321 TYPE (File_desc_t) :: my_pioFile
6322 TYPE (Var_desc_t) :: my_pioVar
6323
6324
6325
6326
6327
6328 IF (PRESENT(start).and.PRESENT(total)) THEN
6329 asize(1)=1
6330 DO i=1,SIZE(total)
6331 asize(1)=asize(1)*total(i)
6332 END DO
6333 ELSE
6334 asize(1)=ubound(a, dim=1)
6335 END IF
6336
6337
6338
6339 IF (.not.PRESENT(piofile)) THEN
6340 CALL pio_netcdf_open (ng, model, trim(ncname), 0, my_piofile)
6341 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
6342 ELSE
6343 my_piofile=piofile
6344 END IF
6345
6346
6347
6348 status=pio_inq_varid(my_piofile, trim(myvarname), my_piovar)
6349 IF (status.eq.pio_noerr) THEN
6350 IF (PRESENT(start).and.PRESENT(total)) THEN
6351 status=pio_get_var(my_piofile, my_piovar, start, total, a)
6352 ELSE
6353 status=pio_get_var(my_piofile, my_piovar, a)
6354 END IF
6355 IF (founderror(status, pio_noerr, __line__, myfile)) THEN
6356 WRITE (stdout,10) trim(myvarname), trim(ncname), &
6357 & trim(sourcefile)
6358 exit_flag=2
6359 ioerror=status
6360 END IF
6361 ELSE
6362 WRITE (stdout,20) trim(myvarname), trim(ncname), &
6363 & trim(sourcefile)
6364 exit_flag=2
6365 ioerror=status
6366 END IF
6367
6368
6369
6370
6371
6372
6373
6374
6375
6376
6377
6378
6379
6380
6381 attname(1)='scale_factor'
6382 attname(2)='add_offset '
6383
6384 CALL pio_netcdf_get_fatt (ng, model, ncname, my_piovar, attname, &
6385 & attvalue, foundit, &
6386 & piofile = my_piofile)
6387
6388 IF (exit_flag.eq.noerror) THEN
6389 IF (.not.foundit(1)) THEN
6390 afactor=1.0_r8
6391 ELSE
6392 afactor=real(attvalue(1),dp)
6393 END IF
6394
6395 IF (.not.foundit(2)) THEN
6396 aoffset=0.0_r8
6397 ELSE
6398 aoffset=real(attvalue(2),dp)
6399 END IF
6400
6401 IF (foundit(1)) THEN
6402 DO i=1,asize(1)
6403 a(i)=afactor*a(i)
6404 END DO
6405 END IF
6406
6407 IF (foundit(2)) THEN
6408 DO i=1,asize(1)
6409 a(i)=a(i)+aoffset
6410 END DO
6411 IF (time_ref.eq.-2) julianoffset=.true.
6412 END IF
6413 END IF
6414
6415
6416
6417
6418 unitsatt(1)='units'
6419
6420 CALL pio_netcdf_get_satt (ng, model, ncname, my_piovar, unitsatt, &
6421 & unitsvalue, got_units, &
6422 & piofile = my_piofile)
6423
6424 IF (exit_flag.eq.noerror) THEN
6425 IF (got_units(1)) THEN
6426 units=trim(lowercase(unitsvalue(1)))
6427 lstr=len_trim(units)
6428 ind=index(units,'since')
6429 IF (ind.gt.0) THEN
6430 CALL time_units (trim(units), year, month, day, hour, &
6431 & minutes, seconds)
6432 CALL datenum (my_rdate, year, month, day, hour, minutes, &
6433 & seconds)
6434 IF (rdate(1).ne.my_rdate(1)) THEN
6435 ustring=units(1:ind-2)
6436 SELECT CASE (trim(ustring))
6437 CASE ('second', 'seconds')
6438 IF (ldebug) THEN
6439 IF (julianoffset) THEN
6440 dnum_old=a(1)
6441 ELSE
6442 dnum_old=my_rdate(2)+a(1)
6443 END IF
6444 CALL datestr (dnum_old, .false., dstr_old)
6445 END IF
6446 IF (julianoffset) THEN
6447 DO i=1,asize(1)
6448 a(i)=a(i)-rdate(2)
6449 END DO
6450 ELSE
6451 DO i=1,asize(1)
6452 a(i)=(my_rdate(2)+a(i))-rdate(2)
6453 END DO
6454 END IF
6455 IF (ldebug) THEN
6456 dnum_new=rdate(2)+a(1)
6457 CALL datestr (dnum_new, .false., dstr_new)
6458 END IF
6459 CASE ('hour', 'hours')
6460 scale=3600.0_dp
6461 IF (ldebug) THEN
6462 IF (julianoffset) THEN
6463 dnum_old=a(1)*scale
6464 ELSE
6465 dnum_old=my_rdate(2)+a(1)*scale
6466 END IF
6467 CALL datestr (dnum_old, .false., dstr_old)
6468 END IF
6469 scale=24.0_dp
6470 IF (julianoffset) THEN
6471 DO i=1,asize(1)
6472 a(i)=a(i)-rdate(1)*scale
6473 END DO
6474 ELSE
6475 DO i=1,asize(1)
6476 a(i)=(my_rdate(1)*scale+a(i))-rdate(1)*scale
6477 END DO
6478 END IF
6479 IF (ldebug) THEN
6480 scale=3600.0_dp
6481 dnum_new=rdate(2)+a(1)*scale
6482 CALL datestr (dnum_new, .false., dstr_new)
6483 END IF
6484 CASE ('day', 'days')
6485 IF (ldebug) THEN
6486 IF (julianoffset) THEN
6487 dnum_old=a(1)
6488 ELSE
6489 dnum_old=my_rdate(1)+a(1)
6490 END IF
6491 CALL datestr (dnum_old, .true., dstr_old)
6492 END IF
6493 IF (julianoffset) THEN
6494 DO i=1,asize(1)
6495 a(i)=a(i)-rdate(1)
6496 END DO
6497 ELSE
6498 DO i=1,asize(1)
6499 a(i)=(my_rdate(1)+a(i))-rdate(1)
6500 END DO
6501 END IF
6502 IF (ldebug) THEN
6503 dnum_new=rdate(1)+a(1)
6504 CALL datestr (dnum_new, .true., dstr_new)
6505 END IF
6506 END SELECT
6507 END IF
6508 END IF
6509 END IF
6510 END IF
6511
6512
6513
6514 IF (PRESENT(min_val)) THEN
6515 min_val=minval(a)
6516 END IF
6517 IF (PRESENT(max_val)) THEN
6518 max_val=maxval(a)
6519 END IF
6520
6521
6522
6523 IF (.not.PRESENT(piofile)) THEN
6524 CALL pio_netcdf_close (ng, model, my_piofile, ncname, .false.)
6525 END IF
6526
6527 10 FORMAT (/,' PIO_NETCDF_GET_TIME_1D - error while reading', &
6528 & ' variable:',2x,a,/,26x,'in input file:',2x,a, &
6529 & /,26x,'call from:',2x,a)
6530 20 FORMAT (/,' PIO_NETCDF_GET_TIME_1D - error while inquiring ID', &
6531 & ' for variable:',2x,a,/,26x,'in input file:',2x,a, &
6532 & /,22x,'call from:',2x,a)
6533
6534 RETURN