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 12614 for NEMO/branches/2020/dev_r12527_Gurvan_ShallowWater/src/SWE/diawri.F90 – NEMO

Ignore:
Timestamp:
2020-03-26T15:59:52+01:00 (4 years ago)
Author:
gm
Message:

first Shallow Water Eq. update

Location:
NEMO/branches/2020/dev_r12527_Gurvan_ShallowWater/src/SWE
Files:
1 added
1 copied

Legend:

Unmodified
Added
Removed
  • NEMO/branches/2020/dev_r12527_Gurvan_ShallowWater/src/SWE/diawri.F90

    r12529 r12614  
    119119      REAL(wp)::   zztmp , zztmpx   ! local scalar 
    120120      REAL(wp)::   zztmp2, zztmpy   !   -      - 
     121      REAL(wp)::   ze3              !   -      - 
    121122      REAL(wp), DIMENSION(jpi,jpj)     ::   z2d   ! 2D workspace 
    122123      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   z3d   ! 3D workspace 
     
    146147         CALL iom_put( "ssh" , (ssh(:,:,Kmm)+ssh_ref)*tmask(:,:,1) )   ! sea surface height (brought back to the reference used for wetting and drying) 
    147148      ELSE 
    148          CALL iom_put( "ssh" , ssh(:,:,Kmm) )              ! sea surface height 
    149       ENDIF 
     149         CALL iom_put( "ssh" , ssh(:,:,Kmm) )                          ! sea surface height 
     150      ENDIF 
     151 
     152!!an  
     153        IF( iom_use("ht") )   &                  ! water column at t-point 
     154         CALL iom_put( "ht" , ht_0(:,:) + ssh(:,:,Kmm) ) 
     155      ! 
     156      IF( iom_use("hu") )   THEN                   ! water column at u-point 
     157         z2d(:,:) = 0._wp 
     158         DO_2D_10_10   
     159            z2d(ji,jj) = 0.5_wp * ( e3t(ji  ,jj,1,Kmm) * e1e2t(ji  ,jj)  & 
     160               &                  + e3t(ji+1,jj,1,Kmm) * e1e2t(ji+1,jj)  ) * r1_e1e2u(ji,jj) 
     161         END_2D 
     162         CALL lbc_lnk( 'diawri', z2d, 'U', 1._wp ) 
     163         CALL iom_put( "hu", z2d )  
     164      ENDIF 
     165     !                     
     166      IF( iom_use("hv") )   THEN                  ! water column at v-point 
     167         z2d(:,:) = 0._wp 
     168         DO_2D_10_10   
     169            z2d(ji,jj) = 0.5_wp * (  e3t(ji,jj+1,1,Kmm) * e1e2t(ji,jj+1)   & 
     170              &                    + e3t(ji,jj  ,1,Kmm) * e1e2t(ji,jj  )   ) * r1_e1e2v(ji,jj) 
     171         END_2D 
     172         CALL lbc_lnk( 'diawri', z2d, 'V', 1._wp ) 
     173         CALL iom_put( "hv", z2d )     
     174      ENDIF              
     175      ! 
     176      IF( iom_use("hf") )  THEN                    ! water column at f-point 
     177         z2d(:,:) = 0._wp 
     178         DO_2D_10_10   
     179            z2d(ji,jj) = 0.25_wp * (  e3t(ji,jj+1,1,Kmm) * e1e2t(ji,jj+1) + e3t(ji+1,jj+1,1,Kmm) * e1e2t(ji+1,jj+1)    & 
     180              &                     + e3t(ji,jj  ,1,Kmm) * e1e2t(ji,jj  ) + e3t(ji+1,jj  ,1,Kmm) * e1e2t(ji+1,jj  )  ) * r1_e1e2f(ji,jj) 
     181         END_2D 
     182         CALL lbc_lnk( 'diawri', z2d, 'F', 1._wp ) 
     183         CALL iom_put( "hf", z2d )    
     184      ENDIF               
     185!!an 
    150186 
    151187      IF( iom_use("wetdep") )   &                  ! wet depth 
    152188         CALL iom_put( "wetdep" , ht_0(:,:) + ssh(:,:,Kmm) ) 
    153        
    154       CALL iom_put( "toce", ts(:,:,:,jp_tem,Kmm) )    ! 3D temperature 
    155       CALL iom_put(  "sst", ts(:,:,1,jp_tem,Kmm) )    ! surface temperature 
    156       IF ( iom_use("sbt") ) THEN 
    157          DO_2D_11_11 
    158             ikbot = mbkt(ji,jj) 
    159             z2d(ji,jj) = ts(ji,jj,ikbot,jp_tem,Kmm) 
    160          END_2D 
    161          CALL iom_put( "sbt", z2d )                ! bottom temperature 
    162       ENDIF 
    163        
    164       CALL iom_put( "soce", ts(:,:,:,jp_sal,Kmm) )    ! 3D salinity 
    165       CALL iom_put(  "sss", ts(:,:,1,jp_sal,Kmm) )    ! surface salinity 
    166       IF ( iom_use("sbs") ) THEN 
    167          DO_2D_11_11 
    168             ikbot = mbkt(ji,jj) 
    169             z2d(ji,jj) = ts(ji,jj,ikbot,jp_sal,Kmm) 
    170          END_2D 
    171          CALL iom_put( "sbs", z2d )                ! bottom salinity 
    172       ENDIF 
    173189 
    174190      IF ( iom_use("taubot") ) THEN                ! bottom stress 
     
    186202         CALL iom_put( "taubot", z2d )            
    187203      ENDIF 
    188           
    189       CALL iom_put( "uoce", uu(:,:,:,Kmm) )            ! 3D i-current 
    190       CALL iom_put(  "ssu", uu(:,:,1,Kmm) )            ! surface i-current 
    191       IF ( iom_use("sbu") ) THEN 
    192          DO_2D_11_11 
    193             ikbot = mbku(ji,jj) 
    194             z2d(ji,jj) = uu(ji,jj,ikbot,Kmm) 
     204      !   
     205      CALL iom_put(  "ssu" , uu(:,:,1,Kmm) )            ! surface i-current 
     206      CALL iom_put(  "ssv" , vv(:,:,1,Kmm) )            ! surface j-current 
     207      CALL iom_put(  "woce", ww )                       ! vertical velocity 
     208      ! 
     209       
     210      IF ( iom_use("sKE") ) THEN                        ! surface kinetic energy at T point 
     211         z2d(:,:) = 0._wp 
     212         DO_2D_00_00 
     213            z2d(ji,jj) =    0.25_wp * ( uu(ji  ,jj,1,Kmm) * uu(ji  ,jj,1,Kmm) * e1e2u(ji  ,jj) * e3u(ji  ,jj,1,Kmm)  & 
     214               &                      + uu(ji-1,jj,1,Kmm) * uu(ji-1,jj,1,Kmm) * e1e2u(ji-1,jj) * e3u(ji-1,jj,1,Kmm)  & 
     215               &                      + vv(ji,jj  ,1,Kmm) * vv(ji,jj  ,1,Kmm) * e1e2v(ji,jj  ) * e3v(ji,jj  ,1,Kmm)  &  
     216               &                      + vv(ji,jj-1,1,Kmm) * vv(ji,jj-1,1,Kmm) * e1e2v(ji,jj-1) * e3v(ji,jj-1,1,Kmm)  )  & 
     217               &                    * r1_e1e2t(ji,jj) / e3t(ji,jj,1,Kmm) * tmask(ji,jj,1) 
    195218         END_2D 
    196          CALL iom_put( "sbu", z2d )                ! bottom i-current 
     219         ! 
     220         CALL lbc_lnk( 'diawri', z2d, 'T', 1. ) 
     221         IF ( iom_use("sKE" ) )  CALL iom_put( "sKE" , z2d )    
     222                            
     223      ENDIF 
     224            
     225!!an sKEf 
     226      IF ( iom_use("sKEf") ) THEN                        ! surface kinetic energy at F point 
     227         z2d(:,:) = 0._wp                                ! CAUTION : only valid in SWE, not with bathymetry 
     228         DO_2D_00_00 
     229            z2d(ji,jj) =    0.25_wp * ( uu(ji,jj  ,1,Kmm) * uu(ji,jj  ,1,Kmm) * e1e2u(ji,jj  ) * e3u(ji,jj  ,1,Kmm)  & 
     230               &                      + uu(ji,jj+1,1,Kmm) * uu(ji,jj+1,1,Kmm) * e1e2u(ji,jj+1) * e3u(ji,jj+1,1,Kmm)  & 
     231               &                      + vv(ji  ,jj,1,Kmm) * vv(ji,jj  ,1,Kmm) * e1e2v(ji  ,jj) * e3v(ji  ,jj,1,Kmm)  &  
     232               &                      + vv(ji+1,jj,1,Kmm) * vv(ji+1,jj,1,Kmm) * e1e2v(ji+1,jj) * e3v(ji+1,jj,1,Kmm)  )  & 
     233               &                    * r1_e1e2f(ji,jj) / e3f(ji,jj,1) * ssfmask(ji,jj) 
     234         END_2D 
     235         ! 
     236         CALL lbc_lnk( 'diawri', z2d, 'F', 1. ) 
     237         CALL iom_put( "sKEf", z2d )                      
     238      ENDIF 
     239!!an 
     240      ! 
     241      CALL iom_put( "hdiv", hdiv )                  ! Horizontal divergence 
     242      ! 
     243      ! Output of vorticity terms 
     244      IF ( iom_use("relvor")    .OR. iom_use("plavor")    .OR.   & 
     245         & iom_use("relpotvor") .OR. iom_use("abspotvor") .OR.   & 
     246         & iom_use("Ens")                                        ) THEN 
     247         ! 
     248         z2d(:,:) = 0._wp  
     249         ze3 = 0._wp  
     250         DO_2D_10_10 
     251            z2d(ji,jj) = (   e2v(ji+1,jj  ) * vv(ji+1,jj  ,1,Kmm) - e2v(ji,jj) * vv(ji,jj,1,Kmm)    & 
     252            &              - e1u(ji  ,jj+1) * uu(ji  ,jj+1,1,Kmm) + e1u(ji,jj) * uu(ji,jj,1,Kmm)  ) * r1_e1e2f(ji,jj) 
     253         END_2D 
     254         CALL lbc_lnk( 'diawri', z2d, 'F', 1. ) 
     255         CALL iom_put( "relvor", z2d )                  ! relative vorticity ( zeta )  
     256         ! 
     257         CALL iom_put( "plavor", ff_f )                 ! planetary vorticity ( f ) 
     258         ! 
     259         DO_2D_10_10   
     260            ze3 = (  e3t(ji,jj+1,1,Kmm) * e1e2t(ji,jj+1) + e3t(ji+1,jj+1,1,Kmm) * e1e2t(ji+1,jj+1)    & 
     261              &    + e3t(ji,jj  ,1,Kmm) * e1e2t(ji,jj  ) + e3t(ji+1,jj  ,1,Kmm) * e1e2t(ji+1,jj  )  ) * r1_e1e2f(ji,jj) 
     262            IF( ze3 /= 0._wp ) THEN   ;   ze3 = 4._wp / ze3 
     263            ELSE                      ;   ze3 = 0._wp 
     264            ENDIF 
     265            z2d(ji,jj) = ze3 * z2d(ji,jj)  
     266         END_2D 
     267         CALL lbc_lnk( 'diawri', z2d, 'F', 1. ) 
     268         CALL iom_put( "relpotvor", z2d )                  ! relative potential vorticity (zeta/h) 
     269         ! 
     270         DO_2D_10_10 
     271            ze3 = (  e3t(ji,jj+1,1,Kmm) * e1e2t(ji,jj+1) + e3t(ji+1,jj+1,1,Kmm) * e1e2t(ji+1,jj+1)    & 
     272              &    + e3t(ji,jj  ,1,Kmm) * e1e2t(ji,jj  ) + e3t(ji+1,jj  ,1,Kmm) * e1e2t(ji+1,jj  )  ) * r1_e1e2f(ji,jj) 
     273            IF( ze3 /= 0._wp ) THEN   ;   ze3 = 4._wp / ze3 
     274            ELSE                      ;   ze3 = 0._wp 
     275            ENDIF 
     276            z2d(ji,jj) = ze3 * ff_f(ji,jj) + z2d(ji,jj)  
     277         END_2D 
     278         CALL lbc_lnk( 'diawri', z2d, 'F', 1. ) 
     279         CALL iom_put( "abspotvor", z2d )                  ! absolute potential vorticity ( q ) 
     280         ! 
     281         DO_2D_10_10   
     282            z2d(ji,jj) = 0.5_wp * z2d(ji,jj)  * z2d(ji,jj)  
     283         END_2D 
     284         CALL lbc_lnk( 'diawri', z2d, 'F', 1. ) 
     285         CALL iom_put( "Ens", z2d )                        ! potential enstrophy ( 1/2*q2 ) 
     286         ! 
    197287      ENDIF 
    198288       
    199       CALL iom_put( "voce", vv(:,:,:,Kmm) )            ! 3D j-current 
    200       CALL iom_put(  "ssv", vv(:,:,1,Kmm) )            ! surface j-current 
    201       IF ( iom_use("sbv") ) THEN 
    202          DO_2D_11_11 
    203             ikbot = mbkv(ji,jj) 
    204             z2d(ji,jj) = vv(ji,jj,ikbot,Kmm) 
    205          END_2D 
    206          CALL iom_put( "sbv", z2d )                ! bottom j-current 
    207       ENDIF 
    208  
    209       IF( ln_zad_Aimp ) ww = ww + wi               ! Recombine explicit and implicit parts of vertical velocity for diagnostic output 
    210       ! 
    211       CALL iom_put( "woce", ww )                   ! vertical velocity 
    212       IF( iom_use('w_masstr') .OR. iom_use('w_masstr2') ) THEN   ! vertical mass transport & its square value 
    213          ! Caution: in the VVL case, it only correponds to the baroclinic mass transport. 
    214          z2d(:,:) = rho0 * e1e2t(:,:) 
    215          DO jk = 1, jpk 
    216             z3d(:,:,jk) = ww(:,:,jk) * z2d(:,:) 
    217          END DO 
    218          CALL iom_put( "w_masstr" , z3d )   
    219          IF( iom_use('w_masstr2') )   CALL iom_put( "w_masstr2", z3d(:,:,:) * z3d(:,:,:) ) 
    220       ENDIF 
    221       ! 
    222       IF( ln_zad_Aimp ) ww = ww - wi               ! Remove implicit part of vertical velocity that was added for diagnostic output 
    223  
    224       CALL iom_put( "avt" , avt )                  ! T vert. eddy diff. coef. 
    225       CALL iom_put( "avs" , avs )                  ! S vert. eddy diff. coef. 
    226       CALL iom_put( "avm" , avm )                  ! T vert. eddy visc. coef. 
    227  
    228       IF( iom_use('logavt') )   CALL iom_put( "logavt", LOG( MAX( 1.e-20_wp, avt(:,:,:) ) ) ) 
    229       IF( iom_use('logavs') )   CALL iom_put( "logavs", LOG( MAX( 1.e-20_wp, avs(:,:,:) ) ) ) 
    230  
    231       IF ( iom_use("sstgrad") .OR. iom_use("sstgrad2") ) THEN 
    232          DO_2D_00_00 
    233             zztmp  = ts(ji,jj,1,jp_tem,Kmm) 
    234             zztmpx = ( ts(ji+1,jj,1,jp_tem,Kmm) - zztmp ) * r1_e1u(ji,jj) + ( zztmp - ts(ji-1,jj  ,1,jp_tem,Kmm) ) * r1_e1u(ji-1,jj) 
    235             zztmpy = ( ts(ji,jj+1,1,jp_tem,Kmm) - zztmp ) * r1_e2v(ji,jj) + ( zztmp - ts(ji  ,jj-1,1,jp_tem,Kmm) ) * r1_e2v(ji,jj-1) 
    236             z2d(ji,jj) = 0.25 * ( zztmpx * zztmpx + zztmpy * zztmpy )   & 
    237                &              * umask(ji,jj,1) * umask(ji-1,jj,1) * vmask(ji,jj,1) * umask(ji,jj-1,1) 
    238          END_2D 
    239          CALL lbc_lnk( 'diawri', z2d, 'T', 1. ) 
    240          CALL iom_put( "sstgrad2",  z2d )          ! square of module of sst gradient 
    241          z2d(:,:) = SQRT( z2d(:,:) ) 
    242          CALL iom_put( "sstgrad" ,  z2d )          ! module of sst gradient 
    243       ENDIF 
    244           
    245       ! heat and salt contents 
    246       IF( iom_use("heatc") ) THEN 
    247          z2d(:,:)  = 0._wp  
    248          DO_3D_11_11( 1, jpkm1 ) 
    249             z2d(ji,jj) = z2d(ji,jj) + e3t(ji,jj,jk,Kmm) * ts(ji,jj,jk,jp_tem,Kmm) * tmask(ji,jj,jk) 
    250          END_3D 
    251          CALL iom_put( "heatc", rho0_rcp * z2d )   ! vertically integrated heat content (J/m2) 
    252       ENDIF 
    253  
    254       IF( iom_use("saltc") ) THEN 
    255          z2d(:,:)  = 0._wp  
    256          DO_3D_11_11( 1, jpkm1 ) 
    257             z2d(ji,jj) = z2d(ji,jj) + e3t(ji,jj,jk,Kmm) * ts(ji,jj,jk,jp_sal,Kmm) * tmask(ji,jj,jk) 
    258          END_3D 
    259          CALL iom_put( "saltc", rho0 * z2d )          ! vertically integrated salt content (PSU*kg/m2) 
    260       ENDIF 
    261       ! 
    262       IF ( iom_use("eken") ) THEN 
    263          z3d(:,:,jpk) = 0._wp  
    264          DO_3D_00_00( 1, jpkm1 ) 
    265             zztmp  = 0.25_wp * r1_e1e2t(ji,jj) / e3t(ji,jj,jk,Kmm) 
    266             z3d(ji,jj,jk) = zztmp * (  uu(ji-1,jj,jk,Kmm)**2 * e2u(ji-1,jj) * e3u(ji-1,jj,jk,Kmm)   & 
    267                &                     + uu(ji  ,jj,jk,Kmm)**2 * e2u(ji  ,jj) * e3u(ji  ,jj,jk,Kmm)   & 
    268                &                     + vv(ji,jj-1,jk,Kmm)**2 * e1v(ji,jj-1) * e3v(ji,jj-1,jk,Kmm)   & 
    269                &                     + vv(ji,jj  ,jk,Kmm)**2 * e1v(ji,jj  ) * e3v(ji,jj  ,jk,Kmm)   ) 
    270          END_3D 
    271          CALL lbc_lnk( 'diawri', z3d, 'T', 1. ) 
    272          CALL iom_put( "eken", z3d )                 ! kinetic energy 
    273       ENDIF 
    274       ! 
    275       CALL iom_put( "hdiv", hdiv )                  ! Horizontal divergence 
    276       ! 
    277       IF( iom_use("u_masstr") .OR. iom_use("u_masstr_vint") .OR. iom_use("u_heattr") .OR. iom_use("u_salttr") ) THEN 
    278          z3d(:,:,jpk) = 0.e0 
    279          z2d(:,:) = 0.e0 
    280          DO jk = 1, jpkm1 
    281             z3d(:,:,jk) = rho0 * uu(:,:,jk,Kmm) * e2u(:,:) * e3u(:,:,jk,Kmm) * umask(:,:,jk) 
    282             z2d(:,:) = z2d(:,:) + z3d(:,:,jk) 
    283          END DO 
    284          CALL iom_put( "u_masstr"     , z3d )         ! mass transport in i-direction 
    285          CALL iom_put( "u_masstr_vint", z2d )         ! mass transport in i-direction vertical sum 
    286       ENDIF 
    287        
    288       IF( iom_use("u_heattr") ) THEN 
    289          z2d(:,:) = 0._wp  
    290          DO_3D_00_00( 1, jpkm1 ) 
    291             z2d(ji,jj) = z2d(ji,jj) + z3d(ji,jj,jk) * ( ts(ji,jj,jk,jp_tem,Kmm) + ts(ji+1,jj,jk,jp_tem,Kmm) ) 
    292          END_3D 
    293          CALL lbc_lnk( 'diawri', z2d, 'U', -1. ) 
    294          CALL iom_put( "u_heattr", 0.5*rcp * z2d )    ! heat transport in i-direction 
    295       ENDIF 
    296  
    297       IF( iom_use("u_salttr") ) THEN 
    298          z2d(:,:) = 0.e0  
    299          DO_3D_00_00( 1, jpkm1 ) 
    300             z2d(ji,jj) = z2d(ji,jj) + z3d(ji,jj,jk) * ( ts(ji,jj,jk,jp_sal,Kmm) + ts(ji+1,jj,jk,jp_sal,Kmm) ) 
    301          END_3D 
    302          CALL lbc_lnk( 'diawri', z2d, 'U', -1. ) 
    303          CALL iom_put( "u_salttr", 0.5 * z2d )        ! heat transport in i-direction 
    304       ENDIF 
    305  
    306        
    307       IF( iom_use("v_masstr") .OR. iom_use("v_heattr") .OR. iom_use("v_salttr") ) THEN 
    308          z3d(:,:,jpk) = 0.e0 
    309          DO jk = 1, jpkm1 
    310             z3d(:,:,jk) = rho0 * vv(:,:,jk,Kmm) * e1v(:,:) * e3v(:,:,jk,Kmm) * vmask(:,:,jk) 
    311          END DO 
    312          CALL iom_put( "v_masstr", z3d )              ! mass transport in j-direction 
    313       ENDIF 
    314        
    315       IF( iom_use("v_heattr") ) THEN 
    316          z2d(:,:) = 0.e0  
    317          DO_3D_00_00( 1, jpkm1 ) 
    318             z2d(ji,jj) = z2d(ji,jj) + z3d(ji,jj,jk) * ( ts(ji,jj,jk,jp_tem,Kmm) + ts(ji,jj+1,jk,jp_tem,Kmm) ) 
    319          END_3D 
    320          CALL lbc_lnk( 'diawri', z2d, 'V', -1. ) 
    321          CALL iom_put( "v_heattr", 0.5*rcp * z2d )    !  heat transport in j-direction 
    322       ENDIF 
    323  
    324       IF( iom_use("v_salttr") ) THEN 
    325          z2d(:,:) = 0._wp  
    326          DO_3D_00_00( 1, jpkm1 ) 
    327             z2d(ji,jj) = z2d(ji,jj) + z3d(ji,jj,jk) * ( ts(ji,jj,jk,jp_sal,Kmm) + ts(ji,jj+1,jk,jp_sal,Kmm) ) 
    328          END_3D 
    329          CALL lbc_lnk( 'diawri', z2d, 'V', -1. ) 
    330          CALL iom_put( "v_salttr", 0.5 * z2d )        !  heat transport in j-direction 
    331       ENDIF 
    332  
    333       IF( iom_use("tosmint") ) THEN 
    334          z2d(:,:) = 0._wp 
    335          DO_3D_00_00( 1, jpkm1 ) 
    336             z2d(ji,jj) = z2d(ji,jj) + e3t(ji,jj,jk,Kmm) *  ts(ji,jj,jk,jp_tem,Kmm) 
    337          END_3D 
    338          CALL lbc_lnk( 'diawri', z2d, 'T', -1. ) 
    339          CALL iom_put( "tosmint", rho0 * z2d )        ! Vertical integral of temperature 
    340       ENDIF 
    341       IF( iom_use("somint") ) THEN 
    342          z2d(:,:)=0._wp 
    343          DO_3D_00_00( 1, jpkm1 ) 
    344             z2d(ji,jj) = z2d(ji,jj) + e3t(ji,jj,jk,Kmm) * ts(ji,jj,jk,jp_sal,Kmm) 
    345          END_3D 
    346          CALL lbc_lnk( 'diawri', z2d, 'T', -1. ) 
    347          CALL iom_put( "somint", rho0 * z2d )         ! Vertical integral of salinity 
    348       ENDIF 
    349  
    350       CALL iom_put( "bn2", rn2 )                      ! Brunt-Vaisala buoyancy frequency (N^2) 
    351       ! 
    352        
    353       IF (ln_dia25h)   CALL dia_25h( kt, Kmm )        ! 25h averaging 
    354  
     289      ! 
    355290      IF( ln_timing )   CALL timing_stop('dia_wri') 
    356291      ! 
Note: See TracChangeset for help on using the changeset viewer.