Changeset 9808


Ignore:
Timestamp:
2018-06-18T11:28:23+02:00 (2 years ago)
Author:
clem
Message:

stop the code for weird values of salinity (not necessarily <0). It happens when the code crashes because of sea-ice issues.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • NEMO/trunk/src/OCE/stpctl.F90

    r9671 r9808  
    3232   PUBLIC stp_ctl           ! routine called by step.F90 
    3333 
    34    INTEGER  ::   idrun, idtime, idssh, idu, ids, istatus 
     34   INTEGER  ::   idrun, idtime, idssh, idu, ids1, ids2, istatus 
    3535   !!---------------------------------------------------------------------- 
    3636   !! NEMO/OCE 4.0 , NEMO Consortium (2018) 
     
    6363      INTEGER  ::   iih, ijh               ! local integers 
    6464      INTEGER  ::   iiu, iju, iku          !   -       - 
    65       INTEGER  ::   iis, ijs, iks          !   -       - 
     65      INTEGER  ::   iis1, ijs1, iks1       !   -       - 
     66      INTEGER  ::   iis2, ijs2, iks2       !   -       - 
    6667      REAL(wp) ::   zzz                    ! local real  
    67       INTEGER , DIMENSION(3) ::   ilocu, ilocs 
     68      INTEGER , DIMENSION(3) ::   ilocu, ilocs1, ilocs2 
    6869      INTEGER , DIMENSION(2) ::   iloch 
    69       REAL(wp), DIMENSION(4) ::   zmax 
     70      REAL(wp), DIMENSION(5) ::   zmax 
    7071      CHARACTER(len=20) :: clname 
    7172      !!---------------------------------------------------------------------- 
     
    8687            istatus = NF90_DEF_DIM( idrun, 'time', NF90_UNLIMITED, idtime ) 
    8788            istatus = NF90_DEF_VAR( idrun, 'abs_ssh_max', NF90_DOUBLE, (/ idtime /), idssh ) 
    88             istatus = NF90_DEF_VAR( idrun,   'abs_u_max', NF90_DOUBLE, (/ idtime /), idu ) 
    89             istatus = NF90_DEF_VAR( idrun,       's_min', NF90_DOUBLE, (/ idtime /), ids ) 
     89            istatus = NF90_DEF_VAR( idrun,   'abs_u_max', NF90_DOUBLE, (/ idtime /), idu   ) 
     90            istatus = NF90_DEF_VAR( idrun,       's_min', NF90_DOUBLE, (/ idtime /), ids1  ) 
     91            istatus = NF90_DEF_VAR( idrun,       's_max', NF90_DOUBLE, (/ idtime /), ids2  ) 
    9092            istatus = NF90_ENDDEF(idrun) 
    9193         ENDIF 
     
    106108      zmax(2) = MAXVAL(  ABS( un(:,:,:) )  )                                  ! velocity max (zonal only) 
    107109      zmax(3) = MAXVAL( -tsn(:,:,:,jp_sal) , mask = tmask(:,:,:) == 1._wp )   ! minus salinity max 
    108       zmax(4) = REAL( nstop , wp )                                            ! stop indicator 
     110      zmax(4) = MAXVAL(  tsn(:,:,:,jp_sal) , mask = tmask(:,:,:) == 1._wp )   !       salinity max 
     111      zmax(5) = REAL( nstop , wp )                                            ! stop indicator 
    109112      ! 
    110113      IF( lk_mpp ) THEN 
    111          CALL mpp_max_multiple( zmax(:), 4 )    ! max over the global domain 
     114         CALL mpp_max_multiple( zmax(:), 5 )    ! max over the global domain 
    112115         ! 
    113          nstop = INT( zmax(4) )                 ! nstop indicator sheared among all local domains 
     116         nstop = INT( zmax(5) )                 ! nstop indicator sheared among all local domains 
    114117      ENDIF 
    115118      ! 
    116119      IF( MOD( kt, nwrite ) == 1 .AND. lwp ) THEN 
    117120         WRITE(numout,*) ' ==>> time-step= ', kt, ' |ssh| max: ',   zmax(1), ' |U| max: ', zmax(2),   & 
    118             &                                     ' S min: '    , - zmax(3) 
     121            &                                     ' S min: '    , - zmax(3), ' S max: ', zmax(4) 
    119122      ENDIF 
    120123      ! 
    121       IF (  zmax(1) >  15._wp .OR.   &                     ! too large sea surface height ( > 10 m) 
    122          &  zmax(2) >  10._wp .OR.   &                     ! too large velocity ( > 10 m/s) 
    123          &  zmax(3) >=  0._wp .OR.   &                     ! negative or zero sea surface salinity 
     124      IF (  zmax(1) >   15._wp .OR.   &                    ! too large sea surface height ( > 15 m ) 
     125         &  zmax(2) >   10._wp .OR.   &                    ! too large velocity ( > 10 m/s) 
     126         &  zmax(3) >=   0._wp .OR.   &                    ! negative or zero sea surface salinity 
     127         &  zmax(4) >= 100._wp .OR.   &                    ! too large sea surface salinity ( > 100 ) 
     128         &  zmax(4) <    0._wp .OR.   &                    ! too large sea surface salinity (keep this line for sea-ice) 
    124129         &  ISNAN( zmax(1) + zmax(2) + zmax(3) )  ) THEN   ! NaN encounter in the tests 
    125130         IF( lk_mpp ) THEN 
    126             CALL mpp_maxloc( ABS(sshn)        , ssmask(:,:)  , zzz, iih, ijh ) 
    127             CALL mpp_maxloc( ABS(un)          , umask (:,:,:), zzz, iiu, iju, iku ) 
    128             CALL mpp_minloc( tsn(:,:,:,jp_sal), tmask (:,:,:), zzz, iis, ijs, iks ) 
     131            CALL mpp_maxloc( ABS(sshn)        , ssmask(:,:)  , zzz, iih , ijh        ) 
     132            CALL mpp_maxloc( ABS(un)          , umask (:,:,:), zzz, iiu , iju , iku  ) 
     133            CALL mpp_minloc( tsn(:,:,:,jp_sal), tmask (:,:,:), zzz, iis1, ijs1, iks1 ) 
     134            CALL mpp_maxloc( tsn(:,:,:,jp_sal), tmask (:,:,:), zzz, iis2, ijs2, iks2 ) 
    129135         ELSE 
    130             iloch = MINLOC( ABS( sshn(:,:)   )                               ) 
    131             ilocu = MAXLOC( ABS( un  (:,:,:) )                               ) 
    132             ilocs = MINLOC( tsn(:,:,:,jp_sal) , mask = tmask(:,:,:) == 1._wp ) 
    133             iih = iloch(1) + nimpp - 1   ;   ijh = iloch(2) + njmpp - 1 
    134             iiu = ilocu(1) + nimpp - 1   ;   iju = ilocu(2) + njmpp - 1   ;   iku = ilocu(3) 
    135             iis = ilocs(1) + nimpp - 1   ;   ijs = ilocs(2) + njmpp - 1   ;   iks = ilocu(3) 
     136            iloch  = MINLOC( ABS( sshn(:,:)   )                               ) 
     137            ilocu  = MAXLOC( ABS( un  (:,:,:) )                               ) 
     138            ilocs1 = MINLOC( tsn(:,:,:,jp_sal) , mask = tmask(:,:,:) == 1._wp ) 
     139            ilocs2 = MAXLOC( tsn(:,:,:,jp_sal) , mask = tmask(:,:,:) == 1._wp ) 
     140            iih  = iloch (1) + nimpp - 1   ;   ijh  = iloch (2) + njmpp - 1 
     141            iiu  = ilocu (1) + nimpp - 1   ;   iju  = ilocu (2) + njmpp - 1   ;   iku  = ilocu (3) 
     142            iis1 = ilocs1(1) + nimpp - 1   ;   ijs1 = ilocs1(2) + njmpp - 1   ;   iks1 = ilocs1(3) 
     143            iis2 = ilocs2(1) + nimpp - 1   ;   ijs2 = ilocs2(2) + njmpp - 1   ;   iks2 = ilocs2(3) 
    136144         ENDIF 
    137145         IF(lwp) THEN 
    138146            WRITE(numout,cform_err) 
    139             WRITE(numout,*) ' stp_ctl: |ssh| > 10 m   or   |U| > 10 m/s   or   S <= 0   or   NaN encounter in the tests' 
     147            WRITE(numout,*) ' stp_ctl: |ssh| > 10 m  or  |U| > 10 m/s  or  S <= 0  or  S >= 100  or  NaN encounter in the tests' 
    140148            WRITE(numout,*) ' ======= ' 
    141             WRITE(numout,9100) kt,   zmax(1), iih, ijh 
    142             WRITE(numout,9200) kt,   zmax(2), iiu, iju, iku 
    143             WRITE(numout,9300) kt, - zmax(3), iis, ijs, iks 
     149            WRITE(numout,9100) kt,   zmax(1), iih , ijh 
     150            WRITE(numout,9200) kt,   zmax(2), iiu , iju , iku 
     151            WRITE(numout,9300) kt, - zmax(3), iis1, ijs1, iks1 
     152            WRITE(numout,9400) kt,   zmax(4), iis2, ijs2, iks2 
    144153            WRITE(numout,*) 
    145154            WRITE(numout,*) '          output of last computed fields in output.abort.nc file' 
     
    1531629100  FORMAT (' kt=',i8,'   |ssh| max: ',1pg11.4,', at  i j  : ',2i5) 
    1541639200  FORMAT (' kt=',i8,'   |U|   max: ',1pg11.4,', at  i j k: ',3i5) 
    155 9300  FORMAT (' kt=',i8,'   S     min: ',1pg11.4,', at  i j  : ',3i5) 
     1649300  FORMAT (' kt=',i8,'   S     min: ',1pg11.4,', at  i j k: ',3i5) 
     1659400  FORMAT (' kt=',i8,'   S     max: ',1pg11.4,', at  i j k: ',3i5) 
    156166      ! 
    157167      !                                            !==  run statistics  ==!   ("run.stat" file) 
    158       IF(lwp) WRITE(numrun,9400) kt, zmax(1), zmax(2), - zmax(3) 
     168      IF(lwp) WRITE(numrun,9500) kt, zmax(1), zmax(2), -zmax(3), zmax(4) 
    159169      IF( lwm ) THEN 
    160170         istatus = NF90_PUT_VAR( idrun, idssh, (/ zmax(1)/), (/kt/), (/1/) ) 
    161171         istatus = NF90_PUT_VAR( idrun,   idu, (/ zmax(2)/), (/kt/), (/1/) ) 
    162          istatus = NF90_PUT_VAR( idrun,   ids, (/-zmax(3)/), (/kt/), (/1/) ) 
     172         istatus = NF90_PUT_VAR( idrun,  ids1, (/-zmax(3)/), (/kt/), (/1/) ) 
     173         istatus = NF90_PUT_VAR( idrun,  ids2, (/ zmax(4)/), (/kt/), (/1/) ) 
    163174         IF( MOD( kt , 100 ) == 0 ) istatus = NF90_SYNC(idrun) 
    164175         IF( kt == nitend         ) istatus = NF90_CLOSE(idrun) 
    165176      END IF 
    166177      ! 
    167 9400  FORMAT(' it :', i8, '    |ssh|_max: ', D23.16, ' |U|_max: ', D23.16,' S_min: ', D23.16) 
     1789500  FORMAT(' it :', i8, '    |ssh|_max: ', D23.16, ' |U|_max: ', D23.16,' S_min: ', D23.16,' S_max: ', D23.16) 
    168179      ! 
    169180   END SUBROUTINE stp_ctl 
Note: See TracChangeset for help on using the changeset viewer.