New URL for NEMO forge!   http://forge.nemo-ocean.eu

Since March 2022 along with NEMO 4.2 release, the code development moved to a self-hosted GitLab.
This present forge is now archived and remained online for history.
Changeset 5098 for branches/2015/dev_r5094_UKMO_ISFCLEAN/NEMOGCM/NEMO/OPA_SRC/DOM/domzgr.F90 – NEMO

Ignore:
Timestamp:
2015-02-20T20:11:47+01:00 (9 years ago)
Author:
mathiot
Message:

add wmask, wumask, wvmask and restore loop order and add flag to ignore specific isf code if no isf

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/2015/dev_r5094_UKMO_ISFCLEAN/NEMOGCM/NEMO/OPA_SRC/DOM/domzgr.F90

    r5040 r5098  
    1717   !!            3.4  ! 2012-08  (J. Siddorn) added Siddorn and Furner stretching function 
    1818   !!            3.4  ! 2012-12  (R. Bourdalle-Badie and G. Reffray)  modify C1D case   
     19   !!            3.6  ! 2014-11  (P. Mathiot and C. Harris) add ice shelf capabilitye   
    1920   !!---------------------------------------------------------------------- 
    2021 
     
    3536   USE oce               ! ocean variables 
    3637   USE dom_oce           ! ocean domain 
    37    USE sbc_oce           ! surface variable (isf) 
    3838   USE closea            ! closed seas 
    3939   USE c1d               ! 1D vertical configuration 
     
    472472         ! 
    473473         ! (ISF) TODO build ice draft netcdf file for isomip and build the corresponding part of code 
    474          IF( cp_cfg == "isomip" ) THEN  
     474         IF( cp_cfg == "isomip" .AND. ln_isfcav ) THEN  
    475475           !  
    476476           risfdep(:,:)=200.e0  
     
    482482            WHERE( bathy(:,:) <= 0._wp )  risfdep(:,:) = 0._wp  
    483483           !  
    484          ELSEIF ( cp_cfg == "isomip2" ) THEN 
     484         ELSEIF ( cp_cfg == "isomip2" .AND. ln_isfcav ) THEN 
    485485         !  
    486486            risfdep(:,:)=0.e0 
     
    584584      IF ( .not. ln_sco ) THEN                                !==  set a minimum depth  ==! 
    585585         ! patch to avoid case bathy = ice shelf draft and bathy between 0 and zhmin 
    586          WHERE (bathy == risfdep) 
    587             bathy   = 0.0_wp ; risfdep = 0.0_wp 
    588          END WHERE 
     586         IF ( ln_isfcav ) THEN 
     587            WHERE (bathy == risfdep) 
     588               bathy   = 0.0_wp ; risfdep = 0.0_wp 
     589            END WHERE 
     590         END IF 
    589591         ! end patch 
    590592         IF( rn_hmin < 0._wp ) THEN    ;   ik = - INT( rn_hmin )                                      ! from a nb of level 
     
    964966      INTEGER  ::   ik, it           ! temporary integers 
    965967      INTEGER  ::   id, jd, nprocd 
     968      LOGICAL  ::   ll_print         ! Allow  control print for debugging 
     969      REAL(wp) ::   ze3tp , ze3wp    ! Last ocean level thickness at T- and W-points 
     970      REAL(wp) ::   zdepwp, zdepth   ! Ajusted ocean depth to avoid too small e3t 
     971      REAL(wp) ::   zmax, zmin       ! Maximum and minimum depth 
     972      REAL(wp) ::   zdiff            ! temporary scalar 
     973      REAL(wp) ::   zrefdep          ! temporary scalar 
     974      REAL(wp), POINTER, DIMENSION(:,:,:) ::  zprt 
     975      !!--------------------------------------------------------------------- 
     976      ! 
     977      IF( nn_timing == 1 )  CALL timing_start('zgr_zps') 
     978      ! 
     979      CALL wrk_alloc( jpi, jpj, jpk, zprt ) 
     980      ! 
     981      IF(lwp) WRITE(numout,*) 
     982      IF(lwp) WRITE(numout,*) '    zgr_zps : z-coordinate with partial steps' 
     983      IF(lwp) WRITE(numout,*) '    ~~~~~~~ ' 
     984      IF(lwp) WRITE(numout,*) '              mbathy is recomputed : bathy_level file is NOT used' 
     985 
     986      ll_print = .FALSE.                   ! Local variable for debugging 
     987       
     988      IF(lwp .AND. ll_print) THEN          ! control print of the ocean depth 
     989         WRITE(numout,*) 
     990         WRITE(numout,*) 'dom_zgr_zps:  bathy (in hundred of meters)' 
     991         CALL prihre( bathy, jpi, jpj, 1,jpi, 1, 1, jpj, 1, 1.e-2, numout ) 
     992      ENDIF 
     993 
     994 
     995      ! bathymetry in level (from bathy_meter) 
     996      ! =================== 
     997      zmax = gdepw_1d(jpk) + e3t_1d(jpk)        ! maximum depth (i.e. the last ocean level thickness <= 2*e3t_1d(jpkm1) ) 
     998      bathy(:,:) = MIN( zmax ,  bathy(:,:) )    ! bounded value of bathy (min already set at the end of zgr_bat) 
     999      WHERE( bathy(:,:) == 0._wp )   ;   mbathy(:,:) = 0       ! land  : set mbathy to 0 
     1000      ELSE WHERE                     ;   mbathy(:,:) = jpkm1   ! ocean : initialize mbathy to the max ocean level 
     1001      END WHERE 
     1002 
     1003      ! Compute mbathy for ocean points (i.e. the number of ocean levels) 
     1004      ! find the number of ocean levels such that the last level thickness 
     1005      ! is larger than the minimum of e3zps_min and e3zps_rat * e3t_1d (where 
     1006      ! e3t_1d is the reference level thickness 
     1007      DO jk = jpkm1, 1, -1 
     1008         zdepth = gdepw_1d(jk) + MIN( e3zps_min, e3t_1d(jk)*e3zps_rat ) 
     1009         WHERE( 0._wp < bathy(:,:) .AND. bathy(:,:) <= zdepth )   mbathy(:,:) = jk-1 
     1010      END DO 
     1011 
     1012      IF ( ln_isfcav ) CALL zgr_isf 
     1013 
     1014      ! Scale factors and depth at T- and W-points 
     1015      DO jk = 1, jpk                        ! intitialization to the reference z-coordinate 
     1016         gdept_0(:,:,jk) = gdept_1d(jk) 
     1017         gdepw_0(:,:,jk) = gdepw_1d(jk) 
     1018         e3t_0  (:,:,jk) = e3t_1d  (jk) 
     1019         e3w_0  (:,:,jk) = e3w_1d  (jk) 
     1020      END DO 
     1021      !  
     1022      DO jj = 1, jpj 
     1023         DO ji = 1, jpi 
     1024            ik = mbathy(ji,jj) 
     1025            IF( ik > 0 ) THEN               ! ocean point only 
     1026               ! max ocean level case 
     1027               IF( ik == jpkm1 ) THEN 
     1028                  zdepwp = bathy(ji,jj) 
     1029                  ze3tp  = bathy(ji,jj) - gdepw_1d(ik) 
     1030                  ze3wp = 0.5_wp * e3w_1d(ik) * ( 1._wp + ( ze3tp/e3t_1d(ik) ) ) 
     1031                  e3t_0(ji,jj,ik  ) = ze3tp 
     1032                  e3t_0(ji,jj,ik+1) = ze3tp 
     1033                  e3w_0(ji,jj,ik  ) = ze3wp 
     1034                  e3w_0(ji,jj,ik+1) = ze3tp 
     1035                  gdepw_0(ji,jj,ik+1) = zdepwp 
     1036                  gdept_0(ji,jj,ik  ) = gdept_1d(ik-1) + ze3wp 
     1037                  gdept_0(ji,jj,ik+1) = gdept_0(ji,jj,ik) + ze3tp 
     1038                  ! 
     1039               ELSE                         ! standard case 
     1040                  IF( bathy(ji,jj) <= gdepw_1d(ik+1) ) THEN  ;   gdepw_0(ji,jj,ik+1) = bathy(ji,jj) 
     1041                  ELSE                                       ;   gdepw_0(ji,jj,ik+1) = gdepw_1d(ik+1) 
     1042                  ENDIF 
     1043!gm Bug?  check the gdepw_1d 
     1044                  !       ... on ik 
     1045                  gdept_0(ji,jj,ik) = gdepw_1d(ik) + ( gdepw_0(ji,jj,ik+1) - gdepw_1d(ik) )   & 
     1046                     &                             * ((gdept_1d(     ik  ) - gdepw_1d(ik) )   & 
     1047                     &                             / ( gdepw_1d(     ik+1) - gdepw_1d(ik) )) 
     1048                  e3t_0(ji,jj,ik) = e3t_1d (ik) * ( gdepw_0 (ji,jj,ik+1) - gdepw_1d(ik) )   &  
     1049                     &                          / ( gdepw_1d(      ik+1) - gdepw_1d(ik) )  
     1050                  e3w_0(ji,jj,ik) = 0.5_wp * ( gdepw_0(ji,jj,ik+1) + gdepw_1d(ik+1) - 2._wp * gdepw_1d(ik) )   & 
     1051                     &                     * ( e3w_1d(ik) / ( gdepw_1d(ik+1) - gdepw_1d(ik) ) ) 
     1052                  !       ... on ik+1 
     1053                  e3w_0  (ji,jj,ik+1) = e3t_0  (ji,jj,ik) 
     1054                  e3t_0  (ji,jj,ik+1) = e3t_0  (ji,jj,ik) 
     1055                  gdept_0(ji,jj,ik+1) = gdept_0(ji,jj,ik) + e3t_0(ji,jj,ik) 
     1056               ENDIF 
     1057            ENDIF 
     1058         END DO 
     1059      END DO 
     1060      ! 
     1061      it = 0 
     1062      DO jj = 1, jpj 
     1063         DO ji = 1, jpi 
     1064            ik = mbathy(ji,jj) 
     1065            IF( ik > 0 ) THEN               ! ocean point only 
     1066               e3tp (ji,jj) = e3t_0(ji,jj,ik) 
     1067               e3wp (ji,jj) = e3w_0(ji,jj,ik) 
     1068               ! test 
     1069               zdiff= gdepw_0(ji,jj,ik+1) - gdept_0(ji,jj,ik  ) 
     1070               IF( zdiff <= 0._wp .AND. lwp ) THEN  
     1071                  it = it + 1 
     1072                  WRITE(numout,*) ' it      = ', it, ' ik      = ', ik, ' (i,j) = ', ji, jj 
     1073                  WRITE(numout,*) ' bathy = ', bathy(ji,jj) 
     1074                  WRITE(numout,*) ' gdept_0 = ', gdept_0(ji,jj,ik), ' gdepw_0 = ', gdepw_0(ji,jj,ik+1), ' zdiff = ', zdiff 
     1075                  WRITE(numout,*) ' e3tp    = ', e3t_0  (ji,jj,ik), ' e3wp    = ', e3w_0  (ji,jj,ik  ) 
     1076               ENDIF 
     1077            ENDIF 
     1078         END DO 
     1079      END DO 
     1080      ! 
     1081      IF ( ln_isfcav ) THEN 
     1082      ! (ISF) Definition of e3t, u, v, w for ISF case 
     1083         DO jj = 1, jpj  
     1084            DO ji = 1, jpi  
     1085               ik = misfdep(ji,jj)  
     1086               IF( ik > 1 ) THEN               ! ice shelf point only  
     1087                  IF( risfdep(ji,jj) < gdepw_1d(ik) )  risfdep(ji,jj)= gdepw_1d(ik)  
     1088                  gdepw_0(ji,jj,ik) = risfdep(ji,jj)  
     1089!gm Bug?  check the gdepw_0  
     1090               !       ... on ik  
     1091                  gdept_0(ji,jj,ik) = gdepw_1d(ik+1) - ( gdepw_1d(ik+1) - gdepw_0(ji,jj,ik) )   &  
     1092                     &                               * ( gdepw_1d(ik+1) - gdept_1d(ik)      )   &  
     1093                     &                               / ( gdepw_1d(ik+1) - gdepw_1d(ik)      )  
     1094                  e3t_0  (ji,jj,ik  ) = gdepw_1d(ik+1) - gdepw_0(ji,jj,ik)  
     1095                  e3w_0  (ji,jj,ik+1) = gdept_1d(ik+1) - gdept_0(ji,jj,ik) 
     1096 
     1097                  IF( ik + 1 == mbathy(ji,jj) ) THEN               ! ice shelf point only (2 cell water column)  
     1098                     e3w_0  (ji,jj,ik+1) = gdept_0(ji,jj,ik+1) - gdept_0(ji,jj,ik)  
     1099                  ENDIF  
     1100               !       ... on ik / ik-1  
     1101                  e3w_0  (ji,jj,ik  ) = 2._wp * (gdept_0(ji,jj,ik) - gdepw_0(ji,jj,ik))  
     1102                  e3t_0  (ji,jj,ik-1) = gdepw_0(ji,jj,ik) - gdepw_1d(ik-1) 
     1103! The next line isn't required and doesn't affect results - included for consistency with bathymetry code  
     1104                  gdept_0(ji,jj,ik-1) = gdept_1d(ik-1) 
     1105               ENDIF  
     1106            END DO  
     1107         END DO  
     1108      !  
     1109         it = 0  
     1110         DO jj = 1, jpj  
     1111            DO ji = 1, jpi  
     1112               ik = misfdep(ji,jj)  
     1113               IF( ik > 1 ) THEN               ! ice shelf point only  
     1114                  e3tp (ji,jj) = e3t_0(ji,jj,ik  )  
     1115                  e3wp (ji,jj) = e3w_0(ji,jj,ik+1 )  
     1116               ! test  
     1117                  zdiff= gdept_0(ji,jj,ik) - gdepw_0(ji,jj,ik  )  
     1118                  IF( zdiff <= 0. .AND. lwp ) THEN   
     1119                     it = it + 1  
     1120                     WRITE(numout,*) ' it      = ', it, ' ik      = ', ik, ' (i,j) = ', ji, jj  
     1121                     WRITE(numout,*) ' risfdep = ', risfdep(ji,jj)  
     1122                     WRITE(numout,*) ' gdept = ', gdept_0(ji,jj,ik), ' gdepw = ', gdepw_0(ji,jj,ik+1), ' zdiff = ', zdiff  
     1123                     WRITE(numout,*) ' e3tp  = ', e3tp(ji,jj), ' e3wp  = ', e3wp(ji,jj)  
     1124                  ENDIF  
     1125               ENDIF  
     1126            END DO  
     1127         END DO  
     1128      END IF 
     1129      ! END (ISF) 
     1130 
     1131      ! Scale factors and depth at U-, V-, UW and VW-points 
     1132      DO jk = 1, jpk                        ! initialisation to z-scale factors 
     1133         e3u_0 (:,:,jk) = e3t_1d(jk) 
     1134         e3v_0 (:,:,jk) = e3t_1d(jk) 
     1135         e3uw_0(:,:,jk) = e3w_1d(jk) 
     1136         e3vw_0(:,:,jk) = e3w_1d(jk) 
     1137      END DO 
     1138      DO jk = 1,jpk                         ! Computed as the minimum of neighbooring scale factors 
     1139         DO jj = 1, jpjm1 
     1140            DO ji = 1, fs_jpim1   ! vector opt. 
     1141               e3u_0 (ji,jj,jk) = MIN( e3t_0(ji,jj,jk), e3t_0(ji+1,jj,jk) ) 
     1142               e3v_0 (ji,jj,jk) = MIN( e3t_0(ji,jj,jk), e3t_0(ji,jj+1,jk) ) 
     1143               e3uw_0(ji,jj,jk) = MIN( e3w_0(ji,jj,jk), e3w_0(ji+1,jj,jk) ) 
     1144               e3vw_0(ji,jj,jk) = MIN( e3w_0(ji,jj,jk), e3w_0(ji,jj+1,jk) ) 
     1145            END DO 
     1146         END DO 
     1147      END DO 
     1148      !IF ( ln_isfcav ) THEN 
     1149      ! (ISF) define e3uw (adapted for 2 cells in the water column) 
     1150         DO jk = 2,jpk                           
     1151            DO jj = 1, jpjm1  
     1152               DO ji = 1, fs_jpim1   ! vector opt.  
     1153                  e3uw_0(ji,jj,jk) = MIN( gdept_0(ji,jj,jk), gdept_0(ji+1,jj  ,jk) ) & 
     1154                    &   - MAX( gdept_0(ji,jj,jk-1), gdept_0(ji+1,jj  ,jk-1) ) 
     1155                  e3vw_0(ji,jj,jk) = MIN( gdept_0(ji,jj,jk), gdept_0(ji  ,jj+1,jk) ) & 
     1156                    &   - MAX( gdept_0(ji,jj,jk-1), gdept_0(ji  ,jj+1,jk-1) ) 
     1157               END DO  
     1158            END DO  
     1159         END DO 
     1160      !END IF 
     1161      !End (ISF) 
     1162       
     1163      CALL lbc_lnk( e3u_0 , 'U', 1._wp )   ;   CALL lbc_lnk( e3uw_0, 'U', 1._wp )   ! lateral boundary conditions 
     1164      CALL lbc_lnk( e3v_0 , 'V', 1._wp )   ;   CALL lbc_lnk( e3vw_0, 'V', 1._wp ) 
     1165      ! 
     1166      DO jk = 1, jpk                        ! set to z-scale factor if zero (i.e. along closed boundaries) 
     1167         WHERE( e3u_0 (:,:,jk) == 0._wp )   e3u_0 (:,:,jk) = e3t_1d(jk) 
     1168         WHERE( e3v_0 (:,:,jk) == 0._wp )   e3v_0 (:,:,jk) = e3t_1d(jk) 
     1169         WHERE( e3uw_0(:,:,jk) == 0._wp )   e3uw_0(:,:,jk) = e3w_1d(jk) 
     1170         WHERE( e3vw_0(:,:,jk) == 0._wp )   e3vw_0(:,:,jk) = e3w_1d(jk) 
     1171      END DO 
     1172       
     1173      ! Scale factor at F-point 
     1174      DO jk = 1, jpk                        ! initialisation to z-scale factors 
     1175         e3f_0(:,:,jk) = e3t_1d(jk) 
     1176      END DO 
     1177      DO jk = 1, jpk                        ! Computed as the minimum of neighbooring V-scale factors 
     1178         DO jj = 1, jpjm1 
     1179            DO ji = 1, fs_jpim1   ! vector opt. 
     1180               e3f_0(ji,jj,jk) = MIN( e3v_0(ji,jj,jk), e3v_0(ji+1,jj,jk) ) 
     1181            END DO 
     1182         END DO 
     1183      END DO 
     1184      CALL lbc_lnk( e3f_0, 'F', 1._wp )       ! Lateral boundary conditions 
     1185      ! 
     1186      DO jk = 1, jpk                        ! set to z-scale factor if zero (i.e. along closed boundaries) 
     1187         WHERE( e3f_0(:,:,jk) == 0._wp )   e3f_0(:,:,jk) = e3t_1d(jk) 
     1188      END DO 
     1189!!gm  bug ? :  must be a do loop with mj0,mj1 
     1190      !  
     1191      e3t_0(:,mj0(1),:) = e3t_0(:,mj0(2),:)     ! we duplicate factor scales for jj = 1 and jj = 2 
     1192      e3w_0(:,mj0(1),:) = e3w_0(:,mj0(2),:)  
     1193      e3u_0(:,mj0(1),:) = e3u_0(:,mj0(2),:)  
     1194      e3v_0(:,mj0(1),:) = e3v_0(:,mj0(2),:)  
     1195      e3f_0(:,mj0(1),:) = e3f_0(:,mj0(2),:)  
     1196 
     1197      ! Control of the sign 
     1198      IF( MINVAL( e3t_0  (:,:,:) ) <= 0._wp )   CALL ctl_stop( '    zgr_zps :   e r r o r   e3t_0 <= 0' ) 
     1199      IF( MINVAL( e3w_0  (:,:,:) ) <= 0._wp )   CALL ctl_stop( '    zgr_zps :   e r r o r   e3w_0 <= 0' ) 
     1200      IF( MINVAL( gdept_0(:,:,:) ) <  0._wp )   CALL ctl_stop( '    zgr_zps :   e r r o r   gdept_0 <  0' ) 
     1201      IF( MINVAL( gdepw_0(:,:,:) ) <  0._wp )   CALL ctl_stop( '    zgr_zps :   e r r o r   gdepw_0 <  0' ) 
     1202      
     1203      ! Compute gdep3w_0 (vertical sum of e3w) 
     1204      IF ( ln_isfcav ) THEN 
     1205         WHERE (misfdep == 0) misfdep = 1 
     1206         DO jj = 1,jpj 
     1207            DO ji = 1,jpi 
     1208               gdep3w_0(ji,jj,1) = 0.5_wp * e3w_0(ji,jj,1) 
     1209               DO jk = 2, misfdep(ji,jj) 
     1210                  gdep3w_0(ji,jj,jk) = gdep3w_0(ji,jj,jk-1) + e3w_0(ji,jj,jk)  
     1211               END DO 
     1212               IF (misfdep(ji,jj) .GE. 2) gdep3w_0(ji,jj,misfdep(ji,jj)) = risfdep(ji,jj) + 0.5_wp * e3w_0(ji,jj,misfdep(ji,jj)) 
     1213               DO jk = misfdep(ji,jj) + 1, jpk 
     1214                  gdep3w_0(ji,jj,jk) = gdep3w_0(ji,jj,jk-1) + e3w_0(ji,jj,jk)  
     1215               END DO 
     1216            END DO 
     1217         END DO 
     1218      ELSE ! no cavity 
     1219         gdep3w_0(:,:,1) = 0.5_wp * e3w_0(:,:,1) 
     1220         DO jk = 2, jpk 
     1221            gdep3w_0(:,:,jk) = gdep3w_0(:,:,jk-1) + e3w_0(:,:,jk) 
     1222         END DO 
     1223      END IF 
     1224      !                                               ! ================= ! 
     1225      IF(lwp .AND. ll_print) THEN                     !   Control print   ! 
     1226         !                                            ! ================= ! 
     1227         DO jj = 1,jpj 
     1228            DO ji = 1, jpi 
     1229               ik = MAX( mbathy(ji,jj), 1 ) 
     1230               zprt(ji,jj,1) = e3t_0   (ji,jj,ik) 
     1231               zprt(ji,jj,2) = e3w_0   (ji,jj,ik) 
     1232               zprt(ji,jj,3) = e3u_0   (ji,jj,ik) 
     1233               zprt(ji,jj,4) = e3v_0   (ji,jj,ik) 
     1234               zprt(ji,jj,5) = e3f_0   (ji,jj,ik) 
     1235               zprt(ji,jj,6) = gdep3w_0(ji,jj,ik) 
     1236            END DO 
     1237         END DO 
     1238         WRITE(numout,*) 
     1239         WRITE(numout,*) 'domzgr e3t(mbathy)'      ;   CALL prihre(zprt(:,:,1),jpi,jpj,1,jpi,1,1,jpj,1,1.e-3,numout) 
     1240         WRITE(numout,*) 
     1241         WRITE(numout,*) 'domzgr e3w(mbathy)'      ;   CALL prihre(zprt(:,:,2),jpi,jpj,1,jpi,1,1,jpj,1,1.e-3,numout) 
     1242         WRITE(numout,*) 
     1243         WRITE(numout,*) 'domzgr e3u(mbathy)'      ;   CALL prihre(zprt(:,:,3),jpi,jpj,1,jpi,1,1,jpj,1,1.e-3,numout) 
     1244         WRITE(numout,*) 
     1245         WRITE(numout,*) 'domzgr e3v(mbathy)'      ;   CALL prihre(zprt(:,:,4),jpi,jpj,1,jpi,1,1,jpj,1,1.e-3,numout) 
     1246         WRITE(numout,*) 
     1247         WRITE(numout,*) 'domzgr e3f(mbathy)'      ;   CALL prihre(zprt(:,:,5),jpi,jpj,1,jpi,1,1,jpj,1,1.e-3,numout) 
     1248         WRITE(numout,*) 
     1249         WRITE(numout,*) 'domzgr gdep3w(mbathy)'   ;   CALL prihre(zprt(:,:,6),jpi,jpj,1,jpi,1,1,jpj,1,1.e-3,numout) 
     1250      ENDIF   
     1251      ! 
     1252      CALL wrk_dealloc( jpi, jpj, jpk, zprt ) 
     1253      ! 
     1254      IF( nn_timing == 1 )  CALL timing_stop('zgr_zps') 
     1255      ! 
     1256   END SUBROUTINE zgr_zps 
     1257 
     1258   SUBROUTINE zgr_isf 
     1259      !!---------------------------------------------------------------------- 
     1260      !!                    ***  ROUTINE zgr_bat_ctl  *** 
     1261      !!    
     1262      !! ** Purpose :   check the bathymetry in levels 
     1263      !!    
     1264      !! ** Method  :   THe water column have to contained at least 2 cells 
     1265      !!                Bathymetry and isfdraft are modified (dig/close) to respect 
     1266      !!                this criterion. 
     1267      !!                  
     1268      !!    
     1269      !! ** Action  : - test compatibility between isfdraft and bathy  
     1270      !!              - bathy and isfdraft are modified 
     1271      !!---------------------------------------------------------------------- 
     1272      !!    
     1273      INTEGER  ::   ji, jj, jk, jl   ! dummy loop indices 
     1274      INTEGER  ::   ik, it           ! temporary integers 
     1275      INTEGER  ::   id, jd, nprocd 
    9661276      INTEGER  ::   icompt, ibtest, ibtestim1, ibtestip1, ibtestjm1, ibtestjp1   ! (ISF) 
    9671277      LOGICAL  ::   ll_print         ! Allow  control print for debugging 
     
    9711281      REAL(wp) ::   zdiff            ! temporary scalar 
    9721282      REAL(wp) ::   zrefdep          ! temporary scalar 
    973       REAL(wp) ::   zbathydiff, zrisfdepdiff  
    974       REAL(wp), POINTER, DIMENSION(:,:)   ::   zrisfdep, zbathy, zmask   ! 3D workspace (ISH) 
    975       INTEGER , POINTER, DIMENSION(:,:)   ::   zmbathy, zmisfdep   ! 3D workspace (ISH) 
    976       REAL(wp), POINTER, DIMENSION(:,:,:) ::  zprt 
     1283      REAL(wp) ::   zbathydiff, zrisfdepdiff  ! isf temporary scalar 
     1284      REAL(wp), POINTER, DIMENSION(:,:)   ::   zrisfdep, zbathy, zmask   ! 2D workspace (ISH) 
     1285      INTEGER , POINTER, DIMENSION(:,:)   ::   zmbathy, zmisfdep         ! 2D workspace (ISH) 
    9771286      !!--------------------------------------------------------------------- 
    9781287      ! 
    979       IF( nn_timing == 1 )  CALL timing_start('zgr_zps') 
    980       ! 
    981       CALL wrk_alloc( jpi, jpj, jpk, zprt ) 
     1288      IF( nn_timing == 1 )  CALL timing_start('zgr_isf') 
     1289      ! 
    9821290      CALL wrk_alloc( jpi, jpj, zbathy, zmask, zrisfdep) 
    983       CALL wrk_alloc( jpi, jpj, zmbathy, zmisfdep) 
    984       ! 
    985       IF(lwp) WRITE(numout,*) 
    986       IF(lwp) WRITE(numout,*) '    zgr_zps : z-coordinate with partial steps' 
    987       IF(lwp) WRITE(numout,*) '    ~~~~~~~ ' 
    988       IF(lwp) WRITE(numout,*) '              mbathy is recomputed : bathy_level file is NOT used' 
    989  
    990       ll_print = .FALSE.                   ! Local variable for debugging 
    991        
    992       IF(lwp .AND. ll_print) THEN          ! control print of the ocean depth 
    993          WRITE(numout,*) 
    994          WRITE(numout,*) 'dom_zgr_zps:  bathy (in hundred of meters)' 
    995          CALL prihre( bathy, jpi, jpj, 1,jpi, 1, 1, jpj, 1, 1.e-2, numout ) 
    996       ENDIF 
    997  
    998       ! bathymetry in level (from bathy_meter) 
    999       ! =================== 
    1000       zmax = gdepw_1d(jpk) + e3t_1d(jpk)        ! maximum depth (i.e. the last ocean level thickness <= 2*e3t_1d(jpkm1) ) 
    1001       bathy(:,:) = MIN( zmax ,  bathy(:,:) )    ! bounded value of bathy (min already set at the end of zgr_bat) 
    1002       WHERE( bathy(:,:) == 0._wp )   ;   mbathy(:,:) = 0       ! land  : set mbathy to 0 
    1003       ELSE WHERE                     ;   mbathy(:,:) = jpkm1   ! ocean : initialize mbathy to the max ocean level 
    1004       END WHERE 
    1005  
    1006       ! Compute mbathy for ocean points (i.e. the number of ocean levels) 
    1007       ! find the number of ocean levels such that the last level thickness 
    1008       ! is larger than the minimum of e3zps_min and e3zps_rat * e3t_1d (where 
    1009       ! e3t_1d is the reference level thickness 
    1010       DO jk = jpkm1, 1, -1 
    1011          zdepth = gdepw_1d(jk) + MIN( e3zps_min, e3t_1d(jk)*e3zps_rat ) 
    1012          WHERE( 0._wp < bathy(:,:) .AND. bathy(:,:) <= zdepth )   mbathy(:,:) = jk-1 
    1013       END DO 
     1291      CALL wrk_alloc( jpi, jpj, zmisfdep, zmbathy ) 
     1292 
     1293 
    10141294      ! (ISF) compute misfdep 
    10151295      WHERE( risfdep(:,:) == 0._wp .AND. bathy(:,:) .NE. 0) ;   misfdep(:,:) = 1   ! open water : set misfdep to 1   
     
    14751755      ENDIF  
    14761756 
    1477       ! Scale factors and depth at T- and W-points 
    1478       DO jk = 1, jpk                        ! intitialization to the reference z-coordinate 
    1479          gdept_0(:,:,jk) = gdept_1d(jk) 
    1480          gdepw_0(:,:,jk) = gdepw_1d(jk) 
    1481          e3t_0  (:,:,jk) = e3t_1d  (jk) 
    1482          e3w_0  (:,:,jk) = e3w_1d  (jk) 
    1483       END DO 
    1484       !  
    1485       DO jj = 1, jpj 
    1486          DO ji = 1, jpi 
    1487             ik = mbathy(ji,jj) 
    1488             IF( ik > 0 ) THEN               ! ocean point only 
    1489                ! max ocean level case 
    1490                IF( ik == jpkm1 ) THEN 
    1491                   zdepwp = bathy(ji,jj) 
    1492                   ze3tp  = bathy(ji,jj) - gdepw_1d(ik) 
    1493                   ze3wp = 0.5_wp * e3w_1d(ik) * ( 1._wp + ( ze3tp/e3t_1d(ik) ) ) 
    1494                   e3t_0(ji,jj,ik  ) = ze3tp 
    1495                   e3t_0(ji,jj,ik+1) = ze3tp 
    1496                   e3w_0(ji,jj,ik  ) = ze3wp 
    1497                   e3w_0(ji,jj,ik+1) = ze3tp 
    1498                   gdepw_0(ji,jj,ik+1) = zdepwp 
    1499                   gdept_0(ji,jj,ik  ) = gdept_1d(ik-1) + ze3wp 
    1500                   gdept_0(ji,jj,ik+1) = gdept_0(ji,jj,ik) + ze3tp 
    1501                   ! 
    1502                ELSE                         ! standard case 
    1503                   IF( bathy(ji,jj) <= gdepw_1d(ik+1) ) THEN  ;   gdepw_0(ji,jj,ik+1) = bathy(ji,jj) 
    1504                   ELSE                                       ;   gdepw_0(ji,jj,ik+1) = gdepw_1d(ik+1) 
    1505                   ENDIF 
    1506 !gm Bug?  check the gdepw_1d 
    1507                   !       ... on ik 
    1508                   gdept_0(ji,jj,ik) = gdepw_1d(ik) + ( gdepw_0(ji,jj,ik+1) - gdepw_1d(ik) )   & 
    1509                      &                             * ((gdept_1d(     ik  ) - gdepw_1d(ik) )   & 
    1510                      &                             / ( gdepw_1d(     ik+1) - gdepw_1d(ik) )) 
    1511                   e3t_0(ji,jj,ik) = e3t_1d (ik) * ( gdepw_0 (ji,jj,ik+1) - gdepw_1d(ik) )   &  
    1512                      &                          / ( gdepw_1d(      ik+1) - gdepw_1d(ik) )  
    1513                   e3w_0(ji,jj,ik) = 0.5_wp * ( gdepw_0(ji,jj,ik+1) + gdepw_1d(ik+1) - 2._wp * gdepw_1d(ik) )   & 
    1514                      &                     * ( e3w_1d(ik) / ( gdepw_1d(ik+1) - gdepw_1d(ik) ) ) 
    1515                   !       ... on ik+1 
    1516                   e3w_0  (ji,jj,ik+1) = e3t_0  (ji,jj,ik) 
    1517                   e3t_0  (ji,jj,ik+1) = e3t_0  (ji,jj,ik) 
    1518                   gdept_0(ji,jj,ik+1) = gdept_0(ji,jj,ik) + e3t_0(ji,jj,ik) 
    1519                ENDIF 
    1520             ENDIF 
    1521          END DO 
    1522       END DO 
    1523       ! 
    1524       it = 0 
    1525       DO jj = 1, jpj 
    1526          DO ji = 1, jpi 
    1527             ik = mbathy(ji,jj) 
    1528             IF( ik > 0 ) THEN               ! ocean point only 
    1529                e3tp (ji,jj) = e3t_0(ji,jj,ik) 
    1530                e3wp (ji,jj) = e3w_0(ji,jj,ik) 
    1531                ! test 
    1532                zdiff= gdepw_0(ji,jj,ik+1) - gdept_0(ji,jj,ik  ) 
    1533                IF( zdiff <= 0._wp .AND. lwp ) THEN  
    1534                   it = it + 1 
    1535                   WRITE(numout,*) ' it      = ', it, ' ik      = ', ik, ' (i,j) = ', ji, jj 
    1536                   WRITE(numout,*) ' bathy = ', bathy(ji,jj) 
    1537                   WRITE(numout,*) ' gdept_0 = ', gdept_0(ji,jj,ik), ' gdepw_0 = ', gdepw_0(ji,jj,ik+1), ' zdiff = ', zdiff 
    1538                   WRITE(numout,*) ' e3tp    = ', e3t_0  (ji,jj,ik), ' e3wp    = ', e3w_0  (ji,jj,ik  ) 
    1539                ENDIF 
    1540             ENDIF 
    1541          END DO 
    1542       END DO 
    1543       ! 
    1544       ! (ISF) Definition of e3t, u, v, w for ISF case 
    1545       DO jj = 1, jpj  
    1546          DO ji = 1, jpi  
    1547             ik = misfdep(ji,jj)  
    1548             IF( ik > 1 ) THEN               ! ice shelf point only  
    1549                IF( risfdep(ji,jj) < gdepw_1d(ik) )  risfdep(ji,jj)= gdepw_1d(ik)  
    1550                gdepw_0(ji,jj,ik) = risfdep(ji,jj)  
    1551 !gm Bug?  check the gdepw_0  
    1552                !       ... on ik  
    1553                gdept_0(ji,jj,ik) = gdepw_1d(ik+1) - ( gdepw_1d(ik+1) - gdepw_0(ji,jj,ik) )   &  
    1554                   &                               * ( gdepw_1d(ik+1) - gdept_1d(ik)      )   &  
    1555                   &                               / ( gdepw_1d(ik+1) - gdepw_1d(ik)      )  
    1556                e3t_0  (ji,jj,ik  ) = gdepw_1d(ik+1) - gdepw_0(ji,jj,ik)  
    1557                e3w_0  (ji,jj,ik+1) = gdept_1d(ik+1) - gdept_0(ji,jj,ik) 
    1558  
    1559                IF( ik + 1 == mbathy(ji,jj) ) THEN               ! ice shelf point only (2 cell water column)  
    1560                   e3w_0  (ji,jj,ik+1) = gdept_0(ji,jj,ik+1) - gdept_0(ji,jj,ik)  
    1561                 ENDIF  
    1562                !       ... on ik / ik-1  
    1563                e3w_0  (ji,jj,ik  ) = 2._wp * (gdept_0(ji,jj,ik) - gdepw_0(ji,jj,ik))  
    1564                e3t_0  (ji,jj,ik-1) = gdepw_0(ji,jj,ik) - gdepw_1d(ik-1) 
    1565 ! The next line isn't required and doesn't affect results - included for consistency with bathymetry code  
    1566                gdept_0(ji,jj,ik-1) = gdept_1d(ik-1) 
    1567             ENDIF  
    1568          END DO  
    1569       END DO  
    1570       !  
    1571       it = 0  
    1572       DO jj = 1, jpj  
    1573          DO ji = 1, jpi  
    1574             ik = misfdep(ji,jj)  
    1575             IF( ik > 1 ) THEN               ! ice shelf point only  
    1576                e3tp (ji,jj) = e3t_0(ji,jj,ik  )  
    1577                e3wp (ji,jj) = e3w_0(ji,jj,ik+1 )  
    1578                ! test  
    1579                zdiff= gdept_0(ji,jj,ik) - gdepw_0(ji,jj,ik  )  
    1580                IF( zdiff <= 0. .AND. lwp ) THEN   
    1581                   it = it + 1  
    1582                   WRITE(numout,*) ' it      = ', it, ' ik      = ', ik, ' (i,j) = ', ji, jj  
    1583                   WRITE(numout,*) ' risfdep = ', risfdep(ji,jj)  
    1584                   WRITE(numout,*) ' gdept = ', gdept_0(ji,jj,ik), ' gdepw = ', gdepw_0(ji,jj,ik+1), ' zdiff = ', zdiff  
    1585                   WRITE(numout,*) ' e3tp  = ', e3tp(ji,jj), ' e3wp  = ', e3wp(ji,jj)  
    1586                ENDIF  
    1587             ENDIF  
    1588          END DO  
    1589       END DO  
    1590       ! END (ISF) 
    1591  
    1592       ! Scale factors and depth at U-, V-, UW and VW-points 
    1593       DO jk = 1, jpk                        ! initialisation to z-scale factors 
    1594          e3u_0 (:,:,jk) = e3t_1d(jk) 
    1595          e3v_0 (:,:,jk) = e3t_1d(jk) 
    1596          e3uw_0(:,:,jk) = e3w_1d(jk) 
    1597          e3vw_0(:,:,jk) = e3w_1d(jk) 
    1598       END DO 
    1599       DO jk = 1,jpk                         ! Computed as the minimum of neighbooring scale factors 
    1600          DO jj = 1, jpjm1 
    1601             DO ji = 1, fs_jpim1   ! vector opt. 
    1602                e3u_0 (ji,jj,jk) = MIN( e3t_0(ji,jj,jk), e3t_0(ji+1,jj,jk) ) 
    1603                e3v_0 (ji,jj,jk) = MIN( e3t_0(ji,jj,jk), e3t_0(ji,jj+1,jk) ) 
    1604                e3uw_0(ji,jj,jk) = MIN( e3w_0(ji,jj,jk), e3w_0(ji+1,jj,jk) ) 
    1605                e3vw_0(ji,jj,jk) = MIN( e3w_0(ji,jj,jk), e3w_0(ji,jj+1,jk) ) 
    1606             END DO 
    1607          END DO 
    1608       END DO 
    1609       ! (ISF) define e3uw 
    1610       DO jk = 2,jpk                           
    1611          DO jj = 1, jpjm1  
    1612             DO ji = 1, fs_jpim1   ! vector opt.  
    1613                e3uw_0(ji,jj,jk) = MIN( gdept_0(ji,jj,jk), gdept_0(ji+1,jj  ,jk) ) & 
    1614                  &   - MAX( gdept_0(ji,jj,jk-1), gdept_0(ji+1,jj  ,jk-1) ) 
    1615                e3vw_0(ji,jj,jk) = MIN( gdept_0(ji,jj,jk), gdept_0(ji  ,jj+1,jk) ) & 
    1616                  &   - MAX( gdept_0(ji,jj,jk-1), gdept_0(ji  ,jj+1,jk-1) ) 
    1617             END DO  
    1618          END DO  
    1619       END DO 
    1620       !End (ISF) 
    1621        
    1622       CALL lbc_lnk( e3u_0 , 'U', 1._wp )   ;   CALL lbc_lnk( e3uw_0, 'U', 1._wp )   ! lateral boundary conditions 
    1623       CALL lbc_lnk( e3v_0 , 'V', 1._wp )   ;   CALL lbc_lnk( e3vw_0, 'V', 1._wp ) 
    1624       ! 
    1625       DO jk = 1, jpk                        ! set to z-scale factor if zero (i.e. along closed boundaries) 
    1626          WHERE( e3u_0 (:,:,jk) == 0._wp )   e3u_0 (:,:,jk) = e3t_1d(jk) 
    1627          WHERE( e3v_0 (:,:,jk) == 0._wp )   e3v_0 (:,:,jk) = e3t_1d(jk) 
    1628          WHERE( e3uw_0(:,:,jk) == 0._wp )   e3uw_0(:,:,jk) = e3w_1d(jk) 
    1629          WHERE( e3vw_0(:,:,jk) == 0._wp )   e3vw_0(:,:,jk) = e3w_1d(jk) 
    1630       END DO 
    1631        
    1632       ! Scale factor at F-point 
    1633       DO jk = 1, jpk                        ! initialisation to z-scale factors 
    1634          e3f_0(:,:,jk) = e3t_1d(jk) 
    1635       END DO 
    1636       DO jk = 1, jpk                        ! Computed as the minimum of neighbooring V-scale factors 
    1637          DO jj = 1, jpjm1 
    1638             DO ji = 1, fs_jpim1   ! vector opt. 
    1639                e3f_0(ji,jj,jk) = MIN( e3v_0(ji,jj,jk), e3v_0(ji+1,jj,jk) ) 
    1640             END DO 
    1641          END DO 
    1642       END DO 
    1643       CALL lbc_lnk( e3f_0, 'F', 1._wp )       ! Lateral boundary conditions 
    1644       ! 
    1645       DO jk = 1, jpk                        ! set to z-scale factor if zero (i.e. along closed boundaries) 
    1646          WHERE( e3f_0(:,:,jk) == 0._wp )   e3f_0(:,:,jk) = e3t_1d(jk) 
    1647       END DO 
    1648 !!gm  bug ? :  must be a do loop with mj0,mj1 
    1649       !  
    1650       e3t_0(:,mj0(1),:) = e3t_0(:,mj0(2),:)     ! we duplicate factor scales for jj = 1 and jj = 2 
    1651       e3w_0(:,mj0(1),:) = e3w_0(:,mj0(2),:)  
    1652       e3u_0(:,mj0(1),:) = e3u_0(:,mj0(2),:)  
    1653       e3v_0(:,mj0(1),:) = e3v_0(:,mj0(2),:)  
    1654       e3f_0(:,mj0(1),:) = e3f_0(:,mj0(2),:)  
    1655  
    1656       ! Control of the sign 
    1657       IF( MINVAL( e3t_0  (:,:,:) ) <= 0._wp )   CALL ctl_stop( '    zgr_zps :   e r r o r   e3t_0 <= 0' ) 
    1658       IF( MINVAL( e3w_0  (:,:,:) ) <= 0._wp )   CALL ctl_stop( '    zgr_zps :   e r r o r   e3w_0 <= 0' ) 
    1659       IF( MINVAL( gdept_0(:,:,:) ) <  0._wp )   CALL ctl_stop( '    zgr_zps :   e r r o r   gdept_0 <  0' ) 
    1660       IF( MINVAL( gdepw_0(:,:,:) ) <  0._wp )   CALL ctl_stop( '    zgr_zps :   e r r o r   gdepw_0 <  0' ) 
    1661       
    1662       ! Compute gdep3w_0 (vertical sum of e3w) 
    1663       WHERE (misfdep == 0) misfdep = 1 
    1664       DO jj = 1,jpj 
    1665          DO ji = 1,jpi 
    1666             gdep3w_0(ji,jj,1) = 0.5_wp * e3w_0(ji,jj,1) 
    1667             DO jk = 2, misfdep(ji,jj) 
    1668                gdep3w_0(ji,jj,jk) = gdep3w_0(ji,jj,jk-1) + e3w_0(ji,jj,jk)  
    1669             END DO 
    1670             IF (misfdep(ji,jj) .GE. 2) gdep3w_0(ji,jj,misfdep(ji,jj)) = risfdep(ji,jj) + 0.5_wp * e3w_0(ji,jj,misfdep(ji,jj)) 
    1671             DO jk = misfdep(ji,jj) + 1, jpk 
    1672                gdep3w_0(ji,jj,jk) = gdep3w_0(ji,jj,jk-1) + e3w_0(ji,jj,jk)  
    1673             END DO 
    1674         END DO 
    1675       END DO 
    1676       !                                               ! ================= ! 
    1677       IF(lwp .AND. ll_print) THEN                     !   Control print   ! 
    1678          !                                            ! ================= ! 
    1679          DO jj = 1,jpj 
    1680             DO ji = 1, jpi 
    1681                ik = MAX( mbathy(ji,jj), 1 ) 
    1682                zprt(ji,jj,1) = e3t_0   (ji,jj,ik) 
    1683                zprt(ji,jj,2) = e3w_0   (ji,jj,ik) 
    1684                zprt(ji,jj,3) = e3u_0   (ji,jj,ik) 
    1685                zprt(ji,jj,4) = e3v_0   (ji,jj,ik) 
    1686                zprt(ji,jj,5) = e3f_0   (ji,jj,ik) 
    1687                zprt(ji,jj,6) = gdep3w_0(ji,jj,ik) 
    1688             END DO 
    1689          END DO 
    1690          WRITE(numout,*) 
    1691          WRITE(numout,*) 'domzgr e3t(mbathy)'      ;   CALL prihre(zprt(:,:,1),jpi,jpj,1,jpi,1,1,jpj,1,1.e-3,numout) 
    1692          WRITE(numout,*) 
    1693          WRITE(numout,*) 'domzgr e3w(mbathy)'      ;   CALL prihre(zprt(:,:,2),jpi,jpj,1,jpi,1,1,jpj,1,1.e-3,numout) 
    1694          WRITE(numout,*) 
    1695          WRITE(numout,*) 'domzgr e3u(mbathy)'      ;   CALL prihre(zprt(:,:,3),jpi,jpj,1,jpi,1,1,jpj,1,1.e-3,numout) 
    1696          WRITE(numout,*) 
    1697          WRITE(numout,*) 'domzgr e3v(mbathy)'      ;   CALL prihre(zprt(:,:,4),jpi,jpj,1,jpi,1,1,jpj,1,1.e-3,numout) 
    1698          WRITE(numout,*) 
    1699          WRITE(numout,*) 'domzgr e3f(mbathy)'      ;   CALL prihre(zprt(:,:,5),jpi,jpj,1,jpi,1,1,jpj,1,1.e-3,numout) 
    1700          WRITE(numout,*) 
    1701          WRITE(numout,*) 'domzgr gdep3w(mbathy)'   ;   CALL prihre(zprt(:,:,6),jpi,jpj,1,jpi,1,1,jpj,1,1.e-3,numout) 
    1702       ENDIF   
    1703       ! 
    1704       CALL wrk_dealloc( jpi, jpj, jpk, zprt ) 
    17051757      CALL wrk_dealloc( jpi, jpj, zmask, zbathy, zrisfdep ) 
    17061758      CALL wrk_dealloc( jpi, jpj, zmisfdep, zmbathy ) 
    1707       ! 
    1708       IF( nn_timing == 1 )  CALL timing_stop('zgr_zps') 
    1709       ! 
    1710    END SUBROUTINE zgr_zps 
     1759 
     1760      IF( nn_timing == 1 )  CALL timing_stop('zgr_isf') 
     1761       
     1762   END SUBROUTINE 
    17111763 
    17121764   SUBROUTINE zgr_sco 
Note: See TracChangeset for help on using the changeset viewer.