Ignore:
Timestamp:
2020-06-19T17:37:47+02:00 (3 months ago)
Author:
orioltp
Message:

dev_r12512_HPC-04_mcastril_Mixed_Precision_implementation: merge with trunk@13134, see #2364

Location:
NEMO/branches/2020/dev_r12512_HPC-04_mcastril_Mixed_Precision_implementation
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • NEMO/branches/2020/dev_r12512_HPC-04_mcastril_Mixed_Precision_implementation

    • Property svn:externals
      •  

        old new  
        88 
        99# SETTE 
        10 ^/utils/CI/sette@HEAD         sette 
         10^/utils/CI/sette@12931        sette 
  • NEMO/branches/2020/dev_r12512_HPC-04_mcastril_Mixed_Precision_implementation/src/OCE/IOM/iom_nf90.F90

    r12603 r13135  
    1919   !!---------------------------------------------------------------------- 
    2020   USE dom_oce         ! ocean space and time domain 
    21    USE sbc_oce, ONLY: jpka, ght_abl ! abl vertical level number and height 
     21   USE sbc_oce, ONLY: ght_abl ! abl vertical level number and height 
    2222   USE lbclnk          ! lateal boundary condition / mpp exchanges 
    2323   USE iom_def         ! iom variables definitions 
     
    4747CONTAINS 
    4848 
    49    SUBROUTINE iom_nf90_open( cdname, kiomid, ldwrt, ldok, kdompar, kdlev ) 
     49   SUBROUTINE iom_nf90_open( cdname, kiomid, ldwrt, ldok, kdompar, kdlev, cdcomp ) 
    5050      !!--------------------------------------------------------------------- 
    5151      !!                   ***  SUBROUTINE  iom_open  *** 
     
    5959      INTEGER, DIMENSION(2,5), INTENT(in   ), OPTIONAL ::   kdompar     ! domain parameters:  
    6060      INTEGER                , INTENT(in   ), OPTIONAL ::   kdlev       ! size of the ice/abl third dimension 
     61      CHARACTER(len=3)       , INTENT(in   ), OPTIONAL ::   cdcomp      ! name of component calling iom_nf90_open 
    6162 
    6263      CHARACTER(LEN=256) ::   clinfo           ! info character 
    6364      CHARACTER(LEN=256) ::   cltmp            ! temporary character 
     65      CHARACTER(LEN=12 ) ::   clfmt            ! writing format 
     66      CHARACTER(LEN=3  ) ::   clcomp           ! name of component calling iom_nf90_open 
     67      INTEGER            ::   idg              ! number of digits 
    6468      INTEGER            ::   iln              ! lengths of character 
    6569      INTEGER            ::   istop            ! temporary storage of nstop 
     
    7175      INTEGER            ::   ihdf5            ! local variable for retrieval of value for NF90_HDF5 
    7276      LOGICAL            ::   llclobber        ! local definition of ln_clobber 
    73       INTEGER            ::   ilevels          ! vertical levels 
    7477      !--------------------------------------------------------------------- 
    7578      ! 
     
    7881      ! 
    7982      !                 !number of vertical levels 
    80       IF( PRESENT(kdlev) )   THEN   ;   ilevels = kdlev    ! use input value (useful for sea-ice and abl) 
    81       ELSE                          ;   ilevels = jpk      ! by default jpk 
     83      IF( PRESENT(cdcomp) )   THEN 
     84         IF( .NOT. PRESENT(kdlev) ) CALL ctl_stop( 'iom_nf90_open: cdcomp and kdlev must both be present' ) 
     85         clcomp = cdcomp    ! use input value 
     86      ELSE 
     87         clcomp = 'OCE'     ! by default  
    8288      ENDIF 
    8389      ! 
     
    106112         IF( ldwrt ) THEN              !* the file should be open in write mode so we create it... 
    107113            IF( jpnij > 1 ) THEN 
    108                WRITE(cltmp,'(a,a,i4.4,a)') cdname(1:iln-1), '_', narea-1, '.nc' 
     114               idg = MAX( INT(LOG10(REAL(MAX(1,jpnij-1),wp))) + 1, 4 )          ! how many digits to we need to write? min=4, max=9 
     115               WRITE(clfmt, "('(a,a,i', i1, '.', i1, ',a)')") idg, idg          ! '(a,a,ix.x,a)' 
     116               WRITE(cltmp,clfmt) cdname(1:iln-1), '_', narea-1, '.nc' 
    109117               cdname = TRIM(cltmp) 
    110118            ENDIF 
     
    126134            CALL iom_nf90_check(NF90_SET_FILL( if90id, NF90_NOFILL,                   idmy ), clinfo) 
    127135            ! define dimensions 
    128             CALL iom_nf90_check(NF90_DEF_DIM( if90id,            'x',   kdompar(1,1), idmy ), clinfo) 
    129             CALL iom_nf90_check(NF90_DEF_DIM( if90id,            'y',   kdompar(2,1), idmy ), clinfo) 
    130             IF( PRESENT(kdlev) ) THEN 
    131               IF( kdlev == jpka ) THEN 
    132                  CALL iom_nf90_check(NF90_DEF_DIM( if90id, 'nav_lev',          kdlev, idmy ), clinfo) 
    133                  CALL iom_nf90_check(NF90_DEF_DIM( if90id, 'time_counter', NF90_UNLIMITED, idmy ), clinfo) 
    134               ELSE 
    135                  CALL iom_nf90_check(NF90_DEF_DIM( if90id, 'nav_lev',            jpk, idmy ), clinfo) 
    136                  CALL iom_nf90_check(NF90_DEF_DIM( if90id, 'time_counter', NF90_UNLIMITED, idmy ), clinfo) 
    137                  CALL iom_nf90_check(NF90_DEF_DIM( if90id,  'numcat',          kdlev, idmy ), clinfo) 
    138               ENDIF 
    139             ELSE 
    140                CALL iom_nf90_check(NF90_DEF_DIM( if90id, 'nav_lev',            jpk, idmy ), clinfo) 
    141                CALL iom_nf90_check(NF90_DEF_DIM( if90id, 'time_counter', NF90_UNLIMITED, idmy ), clinfo) 
    142             ENDIF 
     136                               CALL iom_nf90_check(NF90_DEF_DIM( if90id,            'x',   kdompar(1,1), idmy ), clinfo) 
     137                               CALL iom_nf90_check(NF90_DEF_DIM( if90id,            'y',   kdompar(2,1), idmy ), clinfo) 
     138            SELECT CASE (clcomp) 
     139            CASE ('OCE')   ;   CALL iom_nf90_check(NF90_DEF_DIM( if90id,      'nav_lev',            jpk, idmy ), clinfo) 
     140            CASE ('ICE')   ;   CALL iom_nf90_check(NF90_DEF_DIM( if90id,       'numcat',          kdlev, idmy ), clinfo) 
     141            CASE ('ABL')   ;   CALL iom_nf90_check(NF90_DEF_DIM( if90id,      'nav_lev',          kdlev, idmy ), clinfo) 
     142            CASE ('SED')   ;   CALL iom_nf90_check(NF90_DEF_DIM( if90id,       'numsed',          kdlev, idmy ), clinfo) 
     143            CASE DEFAULT   ;   CALL ctl_stop( 'iom_nf90_open unknown component type' ) 
     144            END SELECT 
     145                               CALL iom_nf90_check(NF90_DEF_DIM( if90id, 'time_counter', NF90_UNLIMITED, idmy ), clinfo) 
    143146            ! global attributes 
    144147            CALL iom_nf90_check(NF90_PUT_ATT( if90id, NF90_GLOBAL, 'DOMAIN_number_total'   , jpnij              ), clinfo) 
     
    166169         ENDDO 
    167170         iom_file(kiomid)%name   = TRIM(cdname) 
     171         iom_file(kiomid)%comp   = clcomp 
    168172         iom_file(kiomid)%nfid   = if90id 
    169173         iom_file(kiomid)%nvars  = 0 
    170174         iom_file(kiomid)%irec   = -1   ! useless for NetCDF files, used to know if the file is in define mode  
    171          iom_file(kiomid)%nlev   = ilevels 
    172175         CALL iom_nf90_check(NF90_Inquire(if90id, unlimitedDimId = iom_file(kiomid)%iduld), clinfo) 
    173176         IF( iom_file(kiomid)%iduld .GE. 0 ) THEN 
     
    546549      INTEGER, DIMENSION(4) :: idimid               ! dimensions id 
    547550      CHARACTER(LEN=256)    :: clinfo               ! info character 
    548       CHARACTER(LEN= 12), DIMENSION(5) :: cltmp     ! temporary character 
    549551      INTEGER               :: if90id               ! nf90 file identifier 
    550       INTEGER               :: idmy                 ! dummy variable 
    551552      INTEGER               :: itype                ! variable type 
    552553      INTEGER, DIMENSION(4) :: ichunksz             ! NetCDF4 chunk sizes. Will be computed using 
     
    557558      !                                             ! when appropriate (currently chunking is applied to 4d fields only) 
    558559      INTEGER               :: idlv                 ! local variable 
    559       INTEGER               :: idim3                ! id of the third dimension 
    560560      !--------------------------------------------------------------------- 
    561561      ! 
     
    571571         ENDIF 
    572572         ! define the dimension variables if it is not already done 
    573          ! Warning: we must use the same character length in an array constructor (at least for gcc compiler) 
    574          cltmp = (/ 'nav_lon     ', 'nav_lat     ', 'nav_lev     ', 'time_counter', 'numcat      ' /)    
    575          CALL iom_nf90_check(NF90_DEF_VAR( if90id, TRIM(cltmp(1)), NF90_FLOAT , (/ 1, 2 /), iom_file(kiomid)%nvid(1) ), clinfo) 
    576          CALL iom_nf90_check(NF90_DEF_VAR( if90id, TRIM(cltmp(2)), NF90_FLOAT , (/ 1, 2 /), iom_file(kiomid)%nvid(2) ), clinfo) 
    577          CALL iom_nf90_check(NF90_DEF_VAR( if90id, TRIM(cltmp(3)), NF90_FLOAT , (/ 3    /), iom_file(kiomid)%nvid(3) ), clinfo) 
    578          CALL iom_nf90_check(NF90_DEF_VAR( if90id, TRIM(cltmp(4)), NF90_DOUBLE, (/ 4    /), iom_file(kiomid)%nvid(4) ), clinfo) 
     573         DO jd = 1, 2 
     574            CALL iom_nf90_check(NF90_INQUIRE_DIMENSION(if90id,jd,iom_file(kiomid)%cn_var(jd),iom_file(kiomid)%dimsz(jd,jd)),clinfo) 
     575            CALL iom_nf90_check(NF90_DEF_VAR( if90id, TRIM(iom_file(kiomid)%cn_var(jd)), NF90_FLOAT , (/ 1, 2 /),   & 
     576               &                              iom_file(kiomid)%nvid(jd) ), clinfo) 
     577         END DO 
     578         iom_file(kiomid)%dimsz(2,1) = iom_file(kiomid)%dimsz(2,2)   ! second dim of first  variable 
     579         iom_file(kiomid)%dimsz(1,2) = iom_file(kiomid)%dimsz(1,1)   ! first  dim of second variable 
     580         DO jd = 3, 4 
     581            CALL iom_nf90_check(NF90_INQUIRE_DIMENSION(if90id,jd,iom_file(kiomid)%cn_var(jd),iom_file(kiomid)%dimsz(1,jd)), clinfo) 
     582            CALL iom_nf90_check(NF90_DEF_VAR( if90id, TRIM(iom_file(kiomid)%cn_var(jd)), NF90_FLOAT , (/ jd   /),   & 
     583               &                              iom_file(kiomid)%nvid(jd) ), clinfo) 
     584         END DO 
    579585         ! update informations structure related the dimension variable we just added... 
    580586         iom_file(kiomid)%nvars       = 4 
    581587         iom_file(kiomid)%luld(1:4)   = (/ .FALSE., .FALSE., .FALSE., .TRUE. /) 
    582          iom_file(kiomid)%cn_var(1:4) = cltmp(1:4) 
    583588         iom_file(kiomid)%ndims(1:4)  = (/ 2, 2, 1, 1 /) 
    584          IF( NF90_INQ_DIMID( if90id, 'numcat', idmy ) == nf90_noerr ) THEN   ! add a 5th variable corresponding to the 5th dimension 
    585             CALL iom_nf90_check(NF90_DEF_VAR( if90id, TRIM(cltmp(5)), NF90_FLOAT , (/ 5 /), iom_file(kiomid)%nvid(5) ), clinfo) 
    586             iom_file(kiomid)%nvars     = 5 
    587             iom_file(kiomid)%luld(5)   = .FALSE. 
    588             iom_file(kiomid)%cn_var(5) = cltmp(5) 
    589             iom_file(kiomid)%ndims(5)  = 1 
    590          ENDIF 
    591          ! trick: defined to 0 to say that dimension variables are defined but not yet written 
    592          iom_file(kiomid)%dimsz(1, 1)  = 0    
    593589         IF(lwp) WRITE(numout,*) TRIM(clinfo)//' define dimension variables done' 
    594590      ENDIF 
     
    611607         IF(     PRESENT(pv_r0d) ) THEN   ;   idims = 0 
    612608         ELSEIF( PRESENT(pv_r1d) ) THEN 
    613             IF(( SIZE(pv_r1d,1) == jpk ).OR.( SIZE(pv_r1d,1) == jpka )) THEN   ;   idim3 = 3 
    614             ELSE                                                               ;   idim3 = 5 
    615             ENDIF 
    616                                               idims = 2   ;   idimid(1:idims) = (/idim3,4/) 
    617          ELSEIF( PRESENT(pv_r2d) ) THEN   ;   idims = 3   ;   idimid(1:idims) = (/1,2  ,4/) 
     609                                              idims = 2   ;   idimid(1:idims) = (/3,4/) 
     610         ELSEIF( PRESENT(pv_r2d) ) THEN   ;   idims = 3   ;   idimid(1:idims) = (/1,2,4/) 
    618611         ELSEIF( PRESENT(pv_r3d) ) THEN 
    619             IF(( SIZE(pv_r3d,3) == jpk ).OR.( SIZE(pv_r3d,3) == jpka )) THEN   ;   idim3 = 3 
    620             ELSE                                                               ;   idim3 = 5 
    621             ENDIF 
    622                                               idims = 4   ;   idimid(1:idims) = (/1,2,idim3,4/) 
     612                                              idims = 4   ;   idimid(1:idims) = (/1,2,3,4/) 
    623613         ENDIF 
    624614         IF( PRESENT(ktype) ) THEN   ! variable external type 
     
    695685            ! ============= 
    696686            ! trick: is defined to 0 => dimension variable are defined but not yet written 
    697             IF( iom_file(kiomid)%dimsz(1, 1) == 0 ) THEN 
    698                CALL iom_nf90_check( NF90_INQ_VARID( if90id, 'nav_lon'     , idmy )         , clinfo ) 
    699                CALL iom_nf90_check( NF90_PUT_VAR  ( if90id, idmy, glamt(ix1:ix2, iy1:iy2) ), clinfo ) 
    700                CALL iom_nf90_check( NF90_INQ_VARID( if90id, 'nav_lat'     , idmy )         , clinfo ) 
    701                CALL iom_nf90_check( NF90_PUT_VAR  ( if90id, idmy, gphit(ix1:ix2, iy1:iy2) ), clinfo ) 
    702                CALL iom_nf90_check( NF90_INQ_VARID( if90id, 'nav_lev'     , idmy ), clinfo ) 
    703                IF (iom_file(kiomid)%nlev == jpka) THEN   ;   CALL iom_nf90_check( NF90_PUT_VAR  ( if90id, idmy,  ght_abl), clinfo ) 
    704                ELSE                                      ;   CALL iom_nf90_check( NF90_PUT_VAR  ( if90id, idmy, gdept_1d), clinfo ) 
    705                ENDIF 
    706                IF( NF90_INQ_VARID( if90id, 'numcat', idmy ) == nf90_noerr ) THEN 
    707                   CALL iom_nf90_check( NF90_PUT_VAR  ( if90id, idmy, (/ (idlv, idlv = 1,iom_file(kiomid)%nlev) /)), clinfo ) 
    708                ENDIF 
    709                ! +++ WRONG VALUE: to be improved but not really useful... 
    710                CALL iom_nf90_check( NF90_INQ_VARID( if90id, 'time_counter', idmy ), clinfo ) 
    711                CALL iom_nf90_check( NF90_PUT_VAR( if90id, idmy, kt                      ), clinfo )    
    712                ! update the values of the variables dimensions size 
    713                CALL iom_nf90_check( NF90_INQUIRE_DIMENSION( if90id, 1, len = iom_file(kiomid)%dimsz(1,1) ), clinfo ) 
    714                CALL iom_nf90_check( NF90_INQUIRE_DIMENSION( if90id, 2, len = iom_file(kiomid)%dimsz(2,1) ), clinfo ) 
    715                iom_file(kiomid)%dimsz(1:2, 2) = iom_file(kiomid)%dimsz(1:2, 1) 
    716                CALL iom_nf90_check( NF90_INQUIRE_DIMENSION( if90id, 3, len = iom_file(kiomid)%dimsz(1,3) ), clinfo ) 
    717                iom_file(kiomid)%dimsz(1  , 4) = 1   ! unlimited dimension 
     687            IF( iom_file(kiomid)%dimsz(1, 4) == 0 ) THEN   ! time_counter = 0 
     688               CALL iom_nf90_check(    NF90_PUT_VAR( if90id, 1,                            glamt(ix1:ix2, iy1:iy2) ), clinfo ) 
     689               CALL iom_nf90_check(    NF90_PUT_VAR( if90id, 2,                            gphit(ix1:ix2, iy1:iy2) ), clinfo ) 
     690               SELECT CASE (iom_file(kiomid)%comp) 
     691               CASE ('OCE')   
     692                  CALL iom_nf90_check( NF90_PUT_VAR( if90id, 3,                                           gdept_1d ), clinfo ) 
     693               CASE ('ABL') 
     694                  CALL iom_nf90_check( NF90_PUT_VAR( if90id, 3,                                            ght_abl ), clinfo ) 
     695               CASE DEFAULT 
     696                  CALL iom_nf90_check( NF90_PUT_VAR( if90id, 3, (/ (idlv, idlv = 1,iom_file(kiomid)%dimsz(1,3)) /) ), clinfo ) 
     697               END SELECT 
     698               ! "wrong" value: to be improved but not really useful... 
     699               CALL iom_nf90_check(   NF90_PUT_VAR( if90id, 4,                                                  kt ), clinfo )    
     700               ! update the size of the variable corresponding to the unlimited dimension 
     701               iom_file(kiomid)%dimsz(1, 4) = 1   ! so we don't enter this IF case any more... 
    718702               IF(lwp) WRITE(numout,*) TRIM(clinfo)//' write dimension variables done' 
    719703            ENDIF 
Note: See TracChangeset for help on using the changeset viewer.