- Timestamp:
- 2018-12-14T17:27:24+01:00 (5 years ago)
- Location:
- NEMO/branches/2018/dev_r10164_HPC09_ESIWACE_PREP_MERGE/src/OCE/IOM
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
NEMO/branches/2018/dev_r10164_HPC09_ESIWACE_PREP_MERGE/src/OCE/IOM/iom.F90
r10380 r10397 58 58 #endif 59 59 PUBLIC iom_init, iom_swap, iom_open, iom_close, iom_setkt, iom_varid, iom_get 60 PUBLIC iom_ getatt, iom_putatt, iom_gettime, iom_rstput, iom_put60 PUBLIC iom_chkatt, iom_getatt, iom_putatt, iom_gettime, iom_rstput, iom_delay_rst, iom_put 61 61 PUBLIC iom_use, iom_context_finalize 62 62 … … 1401 1401 END SUBROUTINE iom_gettime 1402 1402 1403 !!---------------------------------------------------------------------- 1404 !! INTERFACE iom_chkatt 1405 !!---------------------------------------------------------------------- 1406 SUBROUTINE iom_chkatt( kiomid, cdatt, llok, ksize, cdvar ) 1407 INTEGER , INTENT(in ) :: kiomid ! Identifier of the file 1408 CHARACTER(len=*), INTENT(in ) :: cdatt ! Name of the attribute 1409 LOGICAL , INTENT( out) :: llok ! Error code 1410 INTEGER , INTENT( out), OPTIONAL :: ksize ! Size of the attribute array 1411 CHARACTER(len=*), INTENT(in ), OPTIONAL :: cdvar ! Name of the variable 1412 ! 1413 IF( kiomid > 0 ) THEN 1414 IF( iom_file(kiomid)%nfid > 0 ) CALL iom_nf90_chkatt( kiomid, cdatt, llok, ksize=ksize, cdvar=cdvar ) 1415 ENDIF 1416 ! 1417 END SUBROUTINE iom_chkatt 1403 1418 1404 1419 !!---------------------------------------------------------------------- … … 1643 1658 END SUBROUTINE iom_rp3d 1644 1659 1660 1661 SUBROUTINE iom_delay_rst( cdaction, cdcpnt, kncid ) 1662 !!--------------------------------------------------------------------- 1663 !! Routine iom_delay_rst: used read/write restart related to mpp_delay 1664 !! 1665 !!--------------------------------------------------------------------- 1666 CHARACTER(len=*), INTENT(in ) :: cdaction ! 1667 CHARACTER(len=*), INTENT(in ) :: cdcpnt 1668 INTEGER , INTENT(in ) :: kncid 1669 ! 1670 INTEGER :: ji 1671 INTEGER :: indim 1672 LOGICAL :: llattexist 1673 REAL(wp), ALLOCATABLE, DIMENSION(:) :: zreal1d 1674 !!--------------------------------------------------------------------- 1675 ! 1676 ! =================================== 1677 IF( TRIM(cdaction) == 'READ' ) THEN ! read restart related to mpp_delay ! 1678 ! =================================== 1679 DO ji = 1, nbdelay 1680 IF ( c_delaycpnt(ji) == cdcpnt ) THEN 1681 CALL iom_chkatt( kncid, 'DELAY_'//c_delaylist(ji), llattexist, indim ) 1682 IF( llattexist ) THEN 1683 ALLOCATE( todelay(ji)%z1d(indim) ) 1684 CALL iom_getatt( kncid, 'DELAY_'//c_delaylist(ji), todelay(ji)%z1d(:) ) 1685 ndelayid(ji) = 0 ! set to 0 to specify that the value was read in the restart 1686 ENDIF 1687 ENDIF 1688 END DO 1689 ! ==================================== 1690 ELSE ! write restart related to mpp_delay ! 1691 ! ==================================== 1692 DO ji = 1, nbdelay ! save only ocean delayed global communication variables 1693 IF ( c_delaycpnt(ji) == cdcpnt ) THEN 1694 IF( ASSOCIATED(todelay(ji)%z1d) ) THEN 1695 CALL mpp_delay_rcv(ji) ! make sure %z1d is received 1696 CALL iom_putatt( kncid, 'DELAY_'//c_delaylist(ji), todelay(ji)%z1d(:) ) 1697 ENDIF 1698 ENDIF 1699 END DO 1700 ! 1701 ENDIF 1702 1703 END SUBROUTINE iom_delay_rst 1704 1705 1645 1706 1646 1707 !!---------------------------------------------------------------------- -
NEMO/branches/2018/dev_r10164_HPC09_ESIWACE_PREP_MERGE/src/OCE/IOM/iom_nf90.F90
r10380 r10397 30 30 31 31 PUBLIC iom_nf90_open , iom_nf90_close, iom_nf90_varid, iom_nf90_get, iom_nf90_gettime, iom_nf90_rstput 32 PUBLIC iom_nf90_ getatt, iom_nf90_putatt32 PUBLIC iom_nf90_chkatt, iom_nf90_getatt, iom_nf90_putatt 33 33 34 34 INTERFACE iom_nf90_get … … 321 321 322 322 323 SUBROUTINE iom_nf90_chkatt( kiomid, cdatt, llok, ksize, cdvar ) 324 !!----------------------------------------------------------------------- 325 !! *** ROUTINE iom_nf90_chkatt *** 326 !! 327 !! ** Purpose : check existence of attribute with NF90 328 !! (either a global attribute (default) or a variable 329 !! attribute if optional variable name is supplied (cdvar)) 330 !!----------------------------------------------------------------------- 331 INTEGER , INTENT(in ) :: kiomid ! Identifier of the file 332 CHARACTER(len=*), INTENT(in ) :: cdatt ! attribute name 333 LOGICAL , INTENT( out) :: llok ! error code 334 INTEGER , INTENT( out), OPTIONAL & 335 & :: ksize ! attribute size 336 CHARACTER(len=*), INTENT(in ), OPTIONAL & 337 & :: cdvar ! name of the variable 338 ! 339 INTEGER :: if90id ! temporary integer 340 INTEGER :: isize ! temporary integer 341 INTEGER :: ivarid ! NetCDF variable Id 342 !--------------------------------------------------------------------- 343 ! 344 if90id = iom_file(kiomid)%nfid 345 IF( PRESENT(cdvar) ) THEN 346 ! check the variable exists in the file 347 llok = NF90_INQ_VARID( if90id, TRIM(cdvar), ivarid ) == nf90_noerr 348 IF( llok ) & 349 ! check the variable has the attribute required 350 llok = NF90_Inquire_attribute(if90id, ivarid, cdatt, len=isize ) == nf90_noerr 351 ELSE 352 llok = NF90_Inquire_attribute(if90id, NF90_GLOBAL, cdatt, len=isize ) == nf90_noerr 353 ENDIF 354 ! 355 IF( PRESENT(ksize) ) ksize = isize 356 ! 357 IF( .not. llok) & 358 CALL ctl_warn('iom_nf90_chkatt: no attribute '//cdatt//' found') 359 ! 360 END SUBROUTINE iom_nf90_chkatt 361 362 363 !!---------------------------------------------------------------------- 364 !! INTERFACE iom_nf90_getatt 365 !!---------------------------------------------------------------------- 366 323 367 SUBROUTINE iom_nf90_getatt( kiomid, cdatt, katt0d, katt1d, patt0d, patt1d, cdatt0d, cdvar) 324 368 !!----------------------------------------------------------------------- … … 397 441 INTEGER :: if90id ! temporary integer 398 442 INTEGER :: ivarid ! NetCDF variable Id 443 INTEGER :: isize ! Attribute size 444 INTEGER :: itype ! Attribute type 399 445 LOGICAL :: llok ! temporary logical 400 LOGICAL :: lenddef ! temporary logical 446 LOGICAL :: llatt ! temporary logical 447 LOGICAL :: lldata ! temporary logical 401 448 CHARACTER(LEN=100) :: clinfo ! info character 402 449 !--------------------------------------------------------------------- 403 450 ! 404 451 if90id = iom_file(kiomid)%nfid 405 lenddef = .false.406 452 IF( PRESENT(cdvar) ) THEN 407 ! check the variable exists in the file 408 llok = NF90_INQ_VARID( if90id, TRIM(cdvar), ivarid ) == nf90_noerr 453 llok = NF90_INQ_VARID( if90id, TRIM(cdvar), ivarid ) == nf90_noerr ! is the variable in the file? 409 454 IF( .NOT. llok ) THEN 410 CALL ctl_warn('iom_nf90_putatt: no variable '//TRIM(cdvar)//' found') 455 CALL ctl_warn('iom_nf90_putatt: no variable '//TRIM(cdvar)//' found' & 456 & , ' no attribute '//cdatt//' written' ) 457 RETURN 411 458 ENDIF 412 459 ELSE 413 llok = .true.414 460 ivarid = NF90_GLOBAL 415 461 ENDIF 416 ! 417 IF( llok) THEN 418 clinfo = 'iom_nf90_putatt, file: '//TRIM(iom_file(kiomid)%name)//', att: '//TRIM(cdatt) 419 IF( iom_file(kiomid)%irec /= -1 ) THEN 420 ! trick: irec used to know if the file is in define mode or not 421 ! if it is not then temporarily put it into define mode 422 CALL iom_nf90_check(NF90_REDEF( if90id ), clinfo) 423 lenddef = .true. 424 ENDIF 462 llatt = NF90_Inquire_attribute(if90id, ivarid, cdatt, len = isize, xtype = itype ) == nf90_noerr 463 ! 464 ! trick: irec used to know if the file is in define mode or not 465 lldata = iom_file(kiomid)%irec /= -1 ! default: go back in define mode if in data mode 466 IF( lldata .AND. llatt ) THEN ! attribute already there. Do we really need to go back in define mode? 467 ! do we have the appropriate type? 468 IF(PRESENT( katt0d) .OR. PRESENT( katt1d)) llok = itype == NF90_INT 469 IF(PRESENT( patt0d) .OR. PRESENT( patt1d)) llok = itype == NF90_DOUBLE 470 IF(PRESENT(cdatt0d) ) llok = itype == NF90_CHAR 471 ! and do we have the appropriate size? 472 IF(PRESENT( katt0d)) llok = llok .AND. isize == 1 473 IF(PRESENT( katt1d)) llok = llok .AND. isize == SIZE(katt1d) 474 IF(PRESENT( patt0d)) llok = llok .AND. isize == 1 475 IF(PRESENT( patt1d)) llok = llok .AND. isize == SIZE(patt1d) 476 IF(PRESENT(cdatt0d)) llok = llok .AND. isize == LEN_TRIM(cdatt0d) 425 477 ! 426 IF(PRESENT( katt0d)) CALL iom_nf90_check(NF90_PUT_ATT(if90id, ivarid, cdatt, values = katt0d), clinfo) 427 IF(PRESENT( katt1d)) CALL iom_nf90_check(NF90_PUT_ATT(if90id, ivarid, cdatt, values = katt1d), clinfo) 428 IF(PRESENT( patt0d)) CALL iom_nf90_check(NF90_PUT_ATT(if90id, ivarid, cdatt, values = patt0d), clinfo) 429 IF(PRESENT( patt1d)) CALL iom_nf90_check(NF90_PUT_ATT(if90id, ivarid, cdatt, values = patt1d), clinfo) 430 IF(PRESENT(cdatt0d)) CALL iom_nf90_check(NF90_PUT_ATT(if90id, ivarid, cdatt, values = cdatt0d), clinfo) 431 ! 432 IF( lenddef ) THEN ! file was in data mode on entry; put it back in that mode 433 CALL iom_nf90_check(NF90_ENDDEF( if90id ), clinfo) 434 ENDIF 435 ELSE 436 CALL ctl_warn('iom_nf90_putatt: no attribute '//TRIM(cdatt)//' written') 437 ENDIF 478 lldata = .NOT. llok 479 ENDIF 480 ! 481 clinfo = 'iom_nf90_putatt, file: '//TRIM(iom_file(kiomid)%name)//', att: '//TRIM(cdatt) 482 IF(lldata) CALL iom_nf90_check(NF90_REDEF( if90id ), clinfo) ! leave data mode to define mode 483 ! 484 IF(PRESENT( katt0d)) CALL iom_nf90_check(NF90_PUT_ATT(if90id, ivarid, cdatt, values = katt0d) , clinfo) 485 IF(PRESENT( katt1d)) CALL iom_nf90_check(NF90_PUT_ATT(if90id, ivarid, cdatt, values = katt1d) , clinfo) 486 IF(PRESENT( patt0d)) CALL iom_nf90_check(NF90_PUT_ATT(if90id, ivarid, cdatt, values = patt0d) , clinfo) 487 IF(PRESENT( patt1d)) CALL iom_nf90_check(NF90_PUT_ATT(if90id, ivarid, cdatt, values = patt1d) , clinfo) 488 IF(PRESENT(cdatt0d)) CALL iom_nf90_check(NF90_PUT_ATT(if90id, ivarid, cdatt, values = trim(cdatt0d)), clinfo) 489 ! 490 IF(lldata) CALL iom_nf90_check(NF90_ENDDEF( if90id ), clinfo) ! leave define mode to data mode 438 491 ! 439 492 END SUBROUTINE iom_nf90_putatt -
NEMO/branches/2018/dev_r10164_HPC09_ESIWACE_PREP_MERGE/src/OCE/IOM/restart.F90
r10380 r10397 28 28 USE iom ! I/O module 29 29 USE diurnal_bulk 30 USE lib_mpp ! distribued memory computing library 30 31 31 32 IMPLICIT NONE … … 140 141 !!---------------------------------------------------------------------- 141 142 INTEGER, INTENT(in) :: kt ! ocean time-step 142 INTEGER :: ji143 143 !!---------------------------------------------------------------------- 144 144 IF(lwxios) CALL iom_swap( cwxios_context ) 145 145 CALL iom_rstput( kt, nitrst, numrow, 'rdt' , rdt , ldxios = lwxios) ! dynamics time step 146 DO ji = 1, nbdelay 147 CALL iom_rstput( kt, nitrst, numrow, c_delaylist(ji), todelay(ji), ldxios = lwxios) 148 END DO 146 CALL iom_delay_rst( 'WRITE', 'OCE', numrow ) ! save only ocean delayed global communication variables 149 147 150 148 IF ( .NOT. ln_diurnal_only ) THEN … … 249 247 !!---------------------------------------------------------------------- 250 248 REAL(wp) :: zrdt 251 INTEGER :: j i, jk249 INTEGER :: jk 252 250 REAL(wp), DIMENSION(jpi, jpj, jpk) :: w3d 253 251 !!---------------------------------------------------------------------- … … 261 259 ENDIF 262 260 263 DO ji = 1, nbdelay 264 IF( iom_varid( numror, c_delaylist(ji), ldstop = .FALSE. ) > 0 ) THEN 265 CALL iom_get( numror, c_delaylist(ji), todelay(ji), ldxios = lrxios ) 266 ndelayid(ji) = 0 ! set to 0 to speficy that the value was read in the restart 267 ENDIF 268 END DO 261 CALL iom_delay_rst( 'READ', 'OCE', numror ) ! read only ocean delayed global communication variables 269 262 270 263 ! Diurnal DSST
Note: See TracChangeset
for help on using the changeset viewer.