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 6225 for branches/2014/dev_r4704_NOC5_MPP_BDY_UPDATE/NEMOGCM/NEMO/OPA_SRC/TRD/trdvor.F90 – NEMO

Ignore:
Timestamp:
2016-01-08T10:35:19+01:00 (8 years ago)
Author:
jamesharle
Message:

Update MPP_BDY_UPDATE branch to be consistent with head of trunk

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/2014/dev_r4704_NOC5_MPP_BDY_UPDATE/NEMOGCM/NEMO/OPA_SRC/TRD/trdvor.F90

    r3294 r6225  
    44   !! Ocean diagnostics:  momentum trends 
    55   !!===================================================================== 
    6    !! History :  1.0  !  04-2006  (L. Brunier, A-M. Treguier) Original code  
    7    !!            2.0  !  04-2008  (C. Talandier) New trends organization 
     6   !! History :  1.0  !  2006-01  (L. Brunier, A-M. Treguier) Original code  
     7   !!            2.0  !  2008-04  (C. Talandier) New trends organization 
     8   !!            3.5  !  2012-02  (G. Madec) regroup beta.V computation with pvo trend 
    89   !!---------------------------------------------------------------------- 
    9 #if defined key_trdvor   ||   defined key_esopa 
    10    !!---------------------------------------------------------------------- 
    11    !!   'key_trdvor'   : momentum trend diagnostics 
     10 
    1211   !!---------------------------------------------------------------------- 
    1312   !!   trd_vor      : momentum trends averaged over the depth 
     
    1716   USE oce             ! ocean dynamics and tracers variables 
    1817   USE dom_oce         ! ocean space and time domain variables 
    19    USE trdmod_oce      ! ocean variables trends 
     18   USE trd_oce         ! trends: ocean variables 
    2019   USE zdf_oce         ! ocean vertical physics 
    21    USE in_out_manager  ! I/O manager 
     20   USE sbc_oce         ! surface boundary condition: ocean 
    2221   USE phycst          ! Define parameters for the routines 
    23    USE ldfdyn_oce      ! ocean active tracers: lateral physics 
     22   USE ldfdyn          ! ocean active tracers: lateral physics 
    2423   USE dianam          ! build the name of file (routine) 
    2524   USE zdfmxl          ! mixed layer depth 
     25   ! 
     26   USE in_out_manager  ! I/O manager 
    2627   USE ioipsl          ! NetCDF library 
    2728   USE lbclnk          ! ocean lateral boundary conditions (or mpp link) 
     
    2930   USE wrk_nemo        ! Memory allocation 
    3031 
    31  
    3232   IMPLICIT NONE 
    3333   PRIVATE 
     
    3737   END INTERFACE 
    3838 
    39    PUBLIC   trd_vor        ! routine called by step.F90 
    40    PUBLIC   trd_vor_zint   ! routine called by dynamics routines 
     39   PUBLIC   trd_vor        ! routine called by trddyn.F90 
    4140   PUBLIC   trd_vor_init   ! routine called by opa.F90 
    4241   PUBLIC   trd_vor_alloc  ! routine called by nemogcm.F90 
     
    5857 
    5958   !! * Substitutions 
    60 #  include "domzgr_substitute.h90" 
    61 #  include "ldfdyn_substitute.h90" 
    6259#  include "vectopt_loop_substitute.h90" 
    6360   !!---------------------------------------------------------------------- 
     
    8077      IF( trd_vor_alloc /= 0 )   CALL ctl_warn('trd_vor_alloc: failed to allocate arrays') 
    8178   END FUNCTION trd_vor_alloc 
     79 
     80 
     81   SUBROUTINE trd_vor( putrd, pvtrd, ktrd, kt ) 
     82      !!---------------------------------------------------------------------- 
     83      !!                  ***  ROUTINE trd_vor  *** 
     84      !!  
     85      !! ** Purpose :  computation of cumulated trends over analysis period 
     86      !!               and make outputs (NetCDF format) 
     87      !!---------------------------------------------------------------------- 
     88      REAL(wp), DIMENSION(:,:,:), INTENT(inout) ::   putrd, pvtrd   ! U and V trends  
     89      INTEGER                   , INTENT(in   ) ::   ktrd           ! trend index 
     90      INTEGER                   , INTENT(in   ) ::   kt             ! time step 
     91      ! 
     92      INTEGER ::   ji, jj   ! dummy loop indices 
     93      REAL(wp), POINTER, DIMENSION(:,:) ::   ztswu, ztswv    ! 2D workspace  
     94      !!---------------------------------------------------------------------- 
     95 
     96      CALL wrk_alloc( jpi, jpj, ztswu, ztswv ) 
     97 
     98      SELECT CASE( ktrd )  
     99      CASE( jpdyn_hpg )   ;   CALL trd_vor_zint( putrd, pvtrd, jpvor_prg )   ! Hydrostatique Pressure Gradient  
     100      CASE( jpdyn_keg )   ;   CALL trd_vor_zint( putrd, pvtrd, jpvor_keg )   ! KE Gradient  
     101      CASE( jpdyn_rvo )   ;   CALL trd_vor_zint( putrd, pvtrd, jpvor_rvo )   ! Relative Vorticity  
     102      CASE( jpdyn_pvo )   ;   CALL trd_vor_zint( putrd, pvtrd, jpvor_pvo )   ! Planetary Vorticity Term  
     103      CASE( jpdyn_ldf )   ;   CALL trd_vor_zint( putrd, pvtrd, jpvor_ldf )   ! Horizontal Diffusion  
     104      CASE( jpdyn_zad )   ;   CALL trd_vor_zint( putrd, pvtrd, jpvor_zad )   ! Vertical Advection  
     105      CASE( jpdyn_spg )   ;   CALL trd_vor_zint( putrd, pvtrd, jpvor_spg )   ! Surface Pressure Grad.  
     106      CASE( jpdyn_zdf )                                                      ! Vertical Diffusion  
     107         ztswu(:,:) = 0.e0   ;   ztswv(:,:) = 0.e0 
     108         DO jj = 2, jpjm1                                                             ! wind stress trends 
     109            DO ji = fs_2, fs_jpim1   ! vector opt. 
     110               ztswu(ji,jj) = 0.5 * ( utau_b(ji,jj) + utau(ji,jj) ) / ( e3u_n(ji,jj,1) * rau0 ) 
     111               ztswv(ji,jj) = 0.5 * ( vtau_b(ji,jj) + vtau(ji,jj) ) / ( e3v_n(ji,jj,1) * rau0 ) 
     112            END DO 
     113         END DO 
     114         ! 
     115         CALL trd_vor_zint( putrd, pvtrd, jpvor_zdf )                             ! zdf trend including surf./bot. stresses  
     116         CALL trd_vor_zint( ztswu, ztswv, jpvor_swf )                             ! surface wind stress  
     117      CASE( jpdyn_bfr ) 
     118         CALL trd_vor_zint( putrd, pvtrd, jpvor_bfr )                             ! Bottom stress 
     119         ! 
     120      CASE( jpdyn_atf )       ! last trends: perform the output of 2D vorticity trends 
     121         CALL trd_vor_iom( kt ) 
     122      END SELECT 
     123      ! 
     124      CALL wrk_dealloc( jpi, jpj, ztswu, ztswv ) 
     125      ! 
     126   END SUBROUTINE trd_vor 
    82127 
    83128 
     
    109154      !!      trends output in netCDF format using ioipsl 
    110155      !!---------------------------------------------------------------------- 
    111       ! 
    112156      INTEGER                     , INTENT(in   ) ::   ktrd       ! ocean trend index 
    113157      REAL(wp), DIMENSION(jpi,jpj), INTENT(inout) ::   putrdvor   ! u vorticity trend  
     
    131175      !  ===================================== 
    132176 
    133       SELECT CASE (ktrd)  
    134       ! 
    135       CASE (jpvor_bfr)        ! bottom friction 
     177      SELECT CASE( ktrd )  
     178      ! 
     179      CASE( jpvor_bfr )        ! bottom friction 
    136180         DO jj = 2, jpjm1 
    137181            DO ji = fs_2, fs_jpim1  
    138182               ikbu = mbkv(ji,jj) 
    139183               ikbv = mbkv(ji,jj)             
    140                zudpvor(ji,jj) = putrdvor(ji,jj) * fse3u(ji,jj,ikbu) * e1u(ji,jj) * umask(ji,jj,ikbu) 
    141                zvdpvor(ji,jj) = pvtrdvor(ji,jj) * fse3v(ji,jj,ikbv) * e2v(ji,jj) * vmask(ji,jj,ikbv) 
     184               zudpvor(ji,jj) = putrdvor(ji,jj) * e3u_n(ji,jj,ikbu) * e1u(ji,jj) * umask(ji,jj,ikbu) 
     185               zvdpvor(ji,jj) = pvtrdvor(ji,jj) * e3v_n(ji,jj,ikbv) * e2v(ji,jj) * vmask(ji,jj,ikbv) 
    142186            END DO 
    143187         END DO 
    144188         ! 
    145       CASE (jpvor_swf)        ! wind stress 
    146          zudpvor(:,:) = putrdvor(:,:) * fse3u(:,:,1) * e1u(:,:) * umask(:,:,1) 
    147          zvdpvor(:,:) = pvtrdvor(:,:) * fse3v(:,:,1) * e2v(:,:) * vmask(:,:,1) 
     189      CASE( jpvor_swf )        ! wind stress 
     190         zudpvor(:,:) = putrdvor(:,:) * e3u_n(:,:,1) * e1u(:,:) * umask(:,:,1) 
     191         zvdpvor(:,:) = pvtrdvor(:,:) * e3v_n(:,:,1) * e2v(:,:) * vmask(:,:,1) 
    148192         ! 
    149193      END SELECT 
    150194 
    151195      ! Average except for Beta.V 
    152       zudpvor(:,:) = zudpvor(:,:) * hur(:,:) 
    153       zvdpvor(:,:) = zvdpvor(:,:) * hvr(:,:) 
     196      zudpvor(:,:) = zudpvor(:,:) * r1_hu_n(:,:) 
     197      zvdpvor(:,:) = zvdpvor(:,:) * r1_hv_n(:,:) 
    154198    
    155199      ! Curl 
    156       DO ji=1,jpim1 
    157          DO jj=1,jpjm1 
     200      DO ji = 1, jpim1 
     201         DO jj = 1, jpjm1 
    158202            vortrd(ji,jj,ktrd) = (    zvdpvor(ji+1,jj) - zvdpvor(ji,jj)       & 
    159203                 &                - ( zudpvor(ji,jj+1) - zudpvor(ji,jj) )   ) / ( e1f(ji,jj) * e2f(ji,jj) ) 
     
    225269      ! putrdvor and pvtrdvor terms 
    226270      DO jk = 1,jpk 
    227         zudpvor(:,:) = zudpvor(:,:) + putrdvor(:,:,jk) * fse3u(:,:,jk) * e1u(:,:) * umask(:,:,jk) 
    228         zvdpvor(:,:) = zvdpvor(:,:) + pvtrdvor(:,:,jk) * fse3v(:,:,jk) * e2v(:,:) * vmask(:,:,jk) 
     271        zudpvor(:,:) = zudpvor(:,:) + putrdvor(:,:,jk) * e3u_n(:,:,jk) * e1u(:,:) * umask(:,:,jk) 
     272        zvdpvor(:,:) = zvdpvor(:,:) + pvtrdvor(:,:,jk) * e3v_n(:,:,jk) * e2v(:,:) * vmask(:,:,jk) 
    229273      END DO 
    230274 
    231       ! Save Beta.V term to avoid average before Curl 
    232       ! Beta.V : intergration, no average 
    233       IF( ktrd == jpvor_bev ) THEN  
     275      ! Planetary vorticity: 2nd computation (Beta.V term) store the vertical sum 
     276      ! as Beta.V term need intergration, not average 
     277      IF( ktrd == jpvor_pvo ) THEN  
    234278         zubet(:,:) = zudpvor(:,:) 
    235279         zvbet(:,:) = zvdpvor(:,:) 
    236       ENDIF 
    237  
    238       ! Average except for Beta.V 
    239       zudpvor(:,:) = zudpvor(:,:) * hur(:,:) 
    240       zvdpvor(:,:) = zvdpvor(:,:) * hvr(:,:) 
    241     
     280         DO ji = 1, jpim1 
     281            DO jj = 1, jpjm1 
     282               vortrd(ji,jj,jpvor_bev) = (    zvbet(ji+1,jj) - zvbet(ji,jj)     & 
     283                  &                       - ( zubet(ji,jj+1) - zubet(ji,jj) ) ) / ( e1f(ji,jj) * e2f(ji,jj) ) 
     284            END DO 
     285         END DO 
     286         ! Average of the Curl and Surface mask 
     287         vortrd(:,:,jpvor_bev) = vortrd(:,:,jpvor_bev) * r1_hu_n(:,:) * fmask(:,:,1) 
     288      ENDIF 
     289      ! 
     290      ! Average  
     291      zudpvor(:,:) = zudpvor(:,:) * r1_hu_n(:,:) 
     292      zvdpvor(:,:) = zvdpvor(:,:) * r1_hv_n(:,:) 
     293      ! 
    242294      ! Curl 
    243295      DO ji=1,jpim1 
     
    247299         END DO 
    248300      END DO 
    249  
    250301      ! Surface mask 
    251302      vortrd(:,:,ktrd) = vortrd(:,:,ktrd) * fmask(:,:,1) 
    252  
    253       ! Special treatement for the Beta.V term 
    254       ! Compute the Curl of the Beta.V term which is not averaged 
    255       IF( ktrd == jpvor_bev ) THEN 
    256          DO ji=1,jpim1 
    257             DO jj=1,jpjm1 
    258                vortrd(ji,jj,jpvor_bev) = (    zvbet(ji+1,jj) - zvbet(ji,jj)     & 
    259                   &                       - ( zubet(ji,jj+1) - zubet(ji,jj) ) ) / ( e1f(ji,jj) * e2f(ji,jj) ) 
    260             END DO 
    261          END DO 
    262  
    263          ! Average on the Curl 
    264          vortrd(:,:,jpvor_bev) = vortrd(:,:,jpvor_bev) * hur(:,:) 
    265  
    266          ! Surface mask 
    267          vortrd(:,:,jpvor_bev) = vortrd(:,:,jpvor_bev) * fmask(:,:,1) 
    268       ENDIF 
    269303    
    270304      IF( ndebug /= 0 ) THEN 
     
    278312 
    279313 
    280    SUBROUTINE trd_vor( kt ) 
     314   SUBROUTINE trd_vor_iom( kt ) 
    281315      !!---------------------------------------------------------------------- 
    282316      !!                  ***  ROUTINE trd_vor  *** 
    283317      !!  
    284318      !! ** Purpose :  computation of cumulated trends over analysis period 
    285       !!               and make outputs (NetCDF or DIMG format) 
    286       !!---------------------------------------------------------------------- 
    287       ! 
    288       INTEGER, INTENT(in) ::   kt   ! ocean time-step index 
     319      !!               and make outputs (NetCDF format) 
     320      !!---------------------------------------------------------------------- 
     321      INTEGER                   , INTENT(in   ) ::   kt             ! time step 
    289322      ! 
    290323      INTEGER  ::   ji, jj, jk, jl   ! dummy loop indices 
     
    305338 
    306339      IF( kt > nit000 )   vor_avrb(:,:) = vor_avr(:,:) 
    307  
    308       IF( ndebug /= 0 ) THEN 
    309           WRITE(numout,*) ' debuging trd_vor: I.1 done ' 
    310           CALL FLUSH(numout) 
    311       ENDIF 
    312340 
    313341      ! I.2 vertically integrated vorticity 
     
    322350      ! Vertically averaged velocity 
    323351      DO jk = 1, jpk - 1 
    324          zun(:,:) = zun(:,:) + e1u(:,:) * un(:,:,jk) * fse3u(:,:,jk) 
    325          zvn(:,:) = zvn(:,:) + e2v(:,:) * vn(:,:,jk) * fse3v(:,:,jk) 
     352         zun(:,:) = zun(:,:) + e1u(:,:) * un(:,:,jk) * e3u_n(:,:,jk) 
     353         zvn(:,:) = zvn(:,:) + e2v(:,:) * vn(:,:,jk) * e3v_n(:,:,jk) 
    326354      END DO 
    327355  
    328       zun(:,:) = zun(:,:) * hur(:,:) 
    329       zvn(:,:) = zvn(:,:) * hvr(:,:) 
     356      zun(:,:) = zun(:,:) * r1_hu_n(:,:) 
     357      zvn(:,:) = zvn(:,:) * r1_hv_n(:,:) 
    330358 
    331359      ! Curl 
    332       DO ji=1,jpim1 
    333          DO jj=1,jpjm1 
     360      DO ji = 1, jpim1 
     361         DO jj = 1, jpjm1 
    334362            vor_avr(ji,jj) = (  ( zvn(ji+1,jj) - zvn(ji,jj) )    & 
    335363               &              - ( zun(ji,jj+1) - zun(ji,jj) ) ) / ( e1f(ji,jj) * e2f(ji,jj) ) * fmask(ji,jj,1) 
     
    337365      END DO 
    338366       
    339       IF( ndebug /= 0 ) THEN 
    340          WRITE(numout,*) ' debuging trd_vor: I.2 done' 
    341          CALL FLUSH(numout) 
    342       ENDIF 
    343  
    344367      !  ================================= 
    345368      !   II. Cumulated trends 
     
    351374         vor_avrbb(:,:) = vor_avrb(:,:) 
    352375         vor_avrbn(:,:) = vor_avr (:,:) 
    353       ENDIF 
    354  
    355       IF( ndebug /= 0 ) THEN 
    356          WRITE(numout,*) ' debuging trd_vor: I1.1 done' 
    357          CALL FLUSH(numout) 
    358376      ENDIF 
    359377 
     
    371389      ENDIF 
    372390 
    373       IF( ndebug /= 0 ) THEN 
    374          WRITE(numout,*) ' debuging trd_vor: II.2 done' 
    375          CALL FLUSH(numout) 
    376       ENDIF 
    377  
    378391      !  ============================================= 
    379392      !   III. Output in netCDF + residual computation 
     
    391404         vor_avrtot(:,:) = (  vor_avr(:,:) - vor_avrbn(:,:) + vor_avrb(:,:) - vor_avrbb(:,:) ) * zmean 
    392405 
    393          IF( ndebug /= 0 ) THEN 
    394              WRITE(numout,*) ' zmean = ',zmean 
    395              WRITE(numout,*) ' debuging trd_vor: III.1 done' 
    396              CALL FLUSH(numout) 
    397          ENDIF 
    398406 
    399407         ! III.2 compute residual 
     
    406414         CALL lbc_lnk( vor_avrres, 'F', 1. ) 
    407415 
    408          IF( ndebug /= 0 ) THEN 
    409             WRITE(numout,*) ' debuging trd_vor: III.2 done' 
    410             CALL FLUSH(numout) 
    411          ENDIF 
    412416 
    413417         ! III.3 time evolution array swap 
     
    415419         vor_avrbb(:,:) = vor_avrb(:,:) 
    416420         vor_avrbn(:,:) = vor_avr (:,:) 
    417  
    418          IF( ndebug /= 0 ) THEN 
    419             WRITE(numout,*) ' debuging trd_vor: III.3 done' 
    420             CALL FLUSH(numout) 
    421          ENDIF 
    422421         ! 
    423422         nmoydpvor = 0 
     
    463462      CALL wrk_dealloc( jpi, jpj, zun, zvn )                                    
    464463      ! 
    465    END SUBROUTINE trd_vor 
     464   END SUBROUTINE trd_vor_iom 
    466465 
    467466 
     
    587586   END SUBROUTINE trd_vor_init 
    588587 
    589 #else 
    590    !!---------------------------------------------------------------------- 
    591    !!   Default option :                                       Empty module 
    592    !!---------------------------------------------------------------------- 
    593    INTERFACE trd_vor_zint 
    594       MODULE PROCEDURE trd_vor_zint_2d, trd_vor_zint_3d 
    595    END INTERFACE 
    596 CONTAINS 
    597    SUBROUTINE trd_vor( kt )        ! Empty routine 
    598       WRITE(*,*) 'trd_vor: You should not have seen this print! error?', kt 
    599    END SUBROUTINE trd_vor 
    600    SUBROUTINE trd_vor_zint_2d( putrdvor, pvtrdvor, ktrd ) 
    601       REAL, DIMENSION(:,:), INTENT( inout ) ::   putrdvor, pvtrdvor 
    602       INTEGER, INTENT( in ) ::   ktrd         ! ocean trend index 
    603       WRITE(*,*) 'trd_vor_zint_2d: You should not have seen this print! error?', putrdvor(1,1), pvtrdvor(1,1), ktrd 
    604    END SUBROUTINE trd_vor_zint_2d 
    605    SUBROUTINE trd_vor_zint_3d( putrdvor, pvtrdvor, ktrd ) 
    606       REAL, DIMENSION(:,:,:), INTENT( inout ) ::   putrdvor, pvtrdvor 
    607       INTEGER, INTENT( in ) ::   ktrd         ! ocean trend index 
    608       WRITE(*,*) 'trd_vor_zint_3d: You should not have seen this print! error?', putrdvor(1,1,1), pvtrdvor(1,1,1), ktrd 
    609    END SUBROUTINE trd_vor_zint_3d 
    610    SUBROUTINE trd_vor_init              ! Empty routine 
    611       WRITE(*,*) 'trd_vor_init: You should not have seen this print! error?' 
    612    END SUBROUTINE trd_vor_init 
    613 #endif 
    614588   !!====================================================================== 
    615589END MODULE trdvor 
Note: See TracChangeset for help on using the changeset viewer.