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 1495 – NEMO

Changeset 1495


Ignore:
Timestamp:
2009-07-20T16:17:45+02:00 (15 years ago)
Author:
ctlod
Message:

optimization (step I) of internal tidal mixing coefficient calculation, see ticket: #457

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/NEMO/OPA_SRC/ZDF/zdftmx.F90

    r1418 r1495  
    4141 
    4242   REAL(wp), DIMENSION(jpi,jpj,jpk) ::   az_tmx          ! coefficient used to evaluate the tidal induced Kz 
    43    REAL(wp), DIMENSION(jpi,jpj,jpk) ::   az_tmx_itf      ! coefficient used to evaluate the tidal induced Kz 
    44    REAL(wp), DIMENSION(jpi,jpj,jpk) ::   az_tsm          ! avt(tidal) = avt0 + az_tmx / n2 
    45    !                                                     ! vertical structure function taking into account  
    46    !                                                     ! of the subscale topographic effect 
    47    REAL(wp), DIMENSION(jpk) ::   zempba                  ! zempba profil vertical d'energie 
    48    REAL(wp), DIMENSION(jpi,jpj) ::  zhdep                ! Ocean depth  
    49    REAL(wp), DIMENSION(jpi,jpj) ::  zsum1, zsum2, zsum     
    50    REAL(wp), DIMENSION(jpi,jpj) ::  z1sum1, z1sum2, z1sum   
    51  
    52    REAL(wp), DIMENSION(jpi,jpj,jpk) ::  zempba_3d_1, zempba_3d_2 
    53    REAL(wp), DIMENSION(jpi,jpj,jpk) ::  zempba_3d, drn2dz                              ! 
    5443 
    5544   !! * Substitutions 
     
    5847   !!---------------------------------------------------------------------- 
    5948   !! NEMO/OPA 3.2 , LOCEAN-IPSL (2009)  
    60    !! $Id:$  
     49   !! $Id$  
    6150   !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt) 
    6251   !!---------------------------------------------------------------------- 
     
    122111            END DO 
    123112         END DO 
    124          ztpc= rau0 * 1/(rn_tfe * rn_me) * ztpc 
     113         ztpc= rau0 / ( rn_tfe * rn_me ) * ztpc 
    125114         IF(lwp) WRITE(numout,*)  
    126          IF(lwp) WRITE(numout,*) '          N Total power consumption by av_tide    : ztpc = ', ztpc * 1.e-12 ,'TW' 
     115         IF(lwp) WRITE(numout,*) '          N Total power consumption by av_tide : ztpc = ', ztpc * 1.e-12 ,'TW' 
    127116      ENDIF 
    128  
    129       DO jk = 2, jpkm1              ! update momentum & tracer diffusivity with tidal mixing 
    130          av_tide(:,:,jk) = av_tide(:,:,jk) * ( 1. - mask_itf(:,:) ) 
    131          avt    (:,:,jk) = avt    (:,:,jk) + av_tide(:,:,jk) 
     117        
     118      !                     ! ----------------------- ! 
     119      CALL tmx_itf( kt )    !    ITF  tidal mixing    !  (update av_tide) 
     120      !                     ! ----------------------- ! 
     121 
     122      !                     ! ----------------------- ! 
     123      !                     !   Update  mixing coefs  !                           
     124      !                     ! ----------------------- ! 
     125      DO jk = 2, jpkm1              !* update momentum & tracer diffusivity with tidal mixing 
     126         avt(:,:,jk) = avt(:,:,jk) + av_tide(:,:,jk) 
    132127         DO jj = 2, jpjm1 
    133128            DO ji = fs_2, fs_jpim1  ! vector opt. 
     
    173168      INTEGER, INTENT(in) ::   kt   ! ocean time-step 
    174169      !!  
    175       INTEGER  ::   ji, jj, jk   ! dummy loop indices 
    176       REAL(wp) ::   ztpc         ! total power consumption 
     170      INTEGER  ::   ji, jj, jk    ! dummy loop indices 
     171      REAL(wp) ::   zcoef, ztpc   ! temporary scalar 
    177172      REAL(wp), DIMENSION(jpi,jpj) ::   zkz   ! temporary 2D workspace 
     173      REAL(wp), DIMENSION(jpi,jpj) ::   zsum1 , zsum2 , zsum     
     174      REAL(wp), DIMENSION(jpi,jpj) ::   z1sum1, z1sum2, z1sum   
     175      REAL(wp), DIMENSION(jpi,jpj,jpk) ::  zempba_3d_1, zempba_3d_2   ! 3D workspace 
     176      REAL(wp), DIMENSION(jpi,jpj,jpk) ::  zempba_3d  , zdn2dz        !  -      - 
     177      REAL(wp), DIMENSION(jpi,jpj,jpk) ::  zavt_itf                   !  -      - 
    178178      !!---------------------------------------------------------------------- 
    179179 
    180180      !                             ! compute the form function using N2 at each time step 
     181!!gm better/faster coding  (not tmask as rn2 is already masked) 
     182!      zempba_3d_1(:,:,jpk) = 0.e0 
     183!      zempba_3d_2(:,:,jpk) = 0.e0 
     184!      DO jk = 1, jpkm1              
     185!         zdn2dz     (:,:,jk) = rn2(:,:,jk) - rn2(:,:,jk+1)           ! Vertical profile of dN2/dz 
     186!CDIR NOVERRCHK 
     187!         zempba_3d_1(:,:,jk) = SQRT(  MAX( O.e0, rn2(:,:,jk) )  )    !    -        -    of N 
     188!         zempba_3d_2(:,:,jk) =        MAX( O.e0, rn2(:,:,jk) )       !    -        -    of N^2 
     189!      END DO 
     190!!gm replacing: 
    181191      zempba_3d_1(:,:,:) = 0.e0 
    182192      zempba_3d_2(:,:,:) = 0.e0 
     
    185195         DO jj = 1, jpj                
    186196            DO ji = 1, jpi 
    187                drn2dz(ji,jj,jk) =(rn2(ji,jj,jk) - rn2(ji,jj,jk+1) ) 
     197               zdn2dz(ji,jj,jk) =(rn2(ji,jj,jk) - rn2(ji,jj,jk+1) ) 
    188198               IF( rn2(ji,jj,jk) > 0 ) THEN  
    189199                  zempba_3d_1(ji,jj,jk)=SQRT(rn2(ji,jj,jk))*tmask(ji,jj,jk) 
     
    193203         END DO 
    194204      END DO 
     205!!gm end 
     206 
     207!!gm better/faster coding  (suppression of z1sum, z1sum1 and z1sum2) 
     208!      zsum (:,:) = 0.e0 
     209!      zsum1(:,:) = 0.e0 
     210!      zsum2(:,:) = 0.e0 
     211!      DO jk= 2, jpk 
     212!         zsum1(:,:) = zsum1(:,:) + zempba_3d_1(:,:,jk) * fse3w(:,:,jk) 
     213!         zsum2(:,:) = zsum2(:,:) + zempba_3d_2(:,:,jk) * fse3w(:,:,jk)                 
     214!      END DO 
     215!      DO jj = 1, jpj 
     216!         DO ji = 1, jpi 
     217!            IF( zsum1(ji,jj) /= 0.e0 )   zsum1(ji,jj) = 1.e0 / zsum1(ji,jj) 
     218!            IF( zsum2(ji,jj) /= 0.e0 )   zsum2(ji,jj) = 1.e0 / zsum2(ji,jj)                 
     219!         END DO 
     220!      END DO 
     221! 
     222!      DO jk= 1, jpk 
     223!         DO jj = 1, jpj 
     224!            DO ji = 1, jpi 
     225!               zcoef = 0.5 - SIGN( 0.5, zdn2dz(ji,jj,jk) )       ! =0 if dN2/dz > 0, =1 otherwise  
     226!               ztpc  = zempba_3d_1(ji,jj,jk) * z1sum1(ji,jj) *        zcoef     & 
     227!                  &  + zempba_3d_2(ji,jj,jk) * z1sum2(ji,jj) * ( 1. - zcoef ) 
     228!               ! 
     229!               zempba_3d(ji,jj,jk) =               ztpc  
     230!               zsum     (ji,jj)    = zsum(ji,jj) + ztpc * fse3w(ji,jj,jk) 
     231!            END DO 
     232!         END DO 
     233!       END DO 
     234!       DO jj = 1, jpj 
     235!          DO ji = 1, jpi 
     236!             IF( zsum(ji,jj) > 0.e0 )   zsum(ji,jj) = en_tmx(:,:) / zsum(ji,jj)                 
     237!          END DO 
     238!       END DO 
     239! 
     240!      !                             ! first estimation bounded by 10 cm2/s (with n2 bounded by rn_n2min)  
     241!      zcoef = rn_tfe_itf / ( rn_tfe * rau0 ) 
     242!      DO jk = 1, jpk 
     243!         zavt_itf(:,:,jk) = MIN(  10.e-4, zcoef * zsum(:,:) * zempba_3d(:,:,jk)   & 
     244!            &                                      / MAX( rn_n2min, rn2(:,:,jk) ) * tmask(:,:,jk)  ) 
     245!      END DO            
     246!!gm replacing: 
    195247 
    196248      zsum1(:,:)=0.e0 
     
    219271         DO jj = 1, jpj 
    220272            DO ji = 1, jpi 
    221                zempba_3d(ji,jj,jk)=zempba_3d_1(ji,jj,jk)*z1sum1(ji,jj)*0.5*(1-SIGN(1.0,drn2dz(ji,jj,jk)))       & 
    222                   &               +zempba_3d_2(ji,jj,jk)*z1sum2(ji,jj)*0.5*(1+SIGN(1.0,drn2dz(ji,jj,jk))) 
     273               zempba_3d(ji,jj,jk)=zempba_3d_1(ji,jj,jk)*z1sum1(ji,jj)*0.5*(1-SIGN(1.0,zdn2dz(ji,jj,jk)))       & 
     274                  &               +zempba_3d_2(ji,jj,jk)*z1sum2(ji,jj)*0.5*(1+SIGN(1.0,zdn2dz(ji,jj,jk))) 
    223275               zsum(ji,jj)=zsum(ji,jj)+zempba_3d(ji,jj,jk)*fse3w(ji,jj,jk) 
    224276            END DO 
     
    232284       END DO 
    233285 
    234        DO jk= 1, jpk 
    235           DO jj = 1, jpj 
    236              DO ji = 1, jpi 
    237                 az_tmx_itf(ji,jj,jk) = en_tmx(ji,jj) * rn_tfe_itf / rn_tfe / rau0    & 
    238                     &                  * zempba_3d(ji,jj,jk) * z1sum(ji,jj) * tmask(ji,jj,jk)  
    239              END DO 
    240           END DO 
    241        END DO            
    242  
    243       !                             ! first estimation (with n2 bound by rn_n2min) bounded by 10 cm2/s 
    244       av_tide_itf(:,:,:) = MIN(  10.e-4, az_tmx_itf(:,:,:) / MAX( rn_n2min, rn2(:,:,:) )  ) 
     286      !                             ! first estimation bounded by 10 cm2/s (with n2 bounded by rn_n2min)  
     287      zcoef = rn_tfe_itf / ( rn_tfe * rau0 ) 
     288      DO jk= 1, jpk 
     289         zavt_itf(:,:,jk) = MIN(  10.e-4, zcoef * en_tmx(:,:) * z1sum(:,:) * zempba_3d(:,:,jk)   & 
     290            &                                   / MAX( rn_n2min, rn2(:,:,jk) ) * tmask(:,:,jk)  ) 
     291      END DO            
     292!!gm end 
    245293 
    246294      zkz(:,:) = 0.e0               ! Associated potential energy consummed over the whole water column 
    247295      DO jk = 2, jpkm1 
    248          zkz(:,:) = zkz(:,:) + fse3w(:,:,jk) * MAX( 0.e0, rn2(:,:,jk) ) * rau0 * av_tide_itf(:,:,jk)* tmask(:,:,jk) 
     296         zkz(:,:) = zkz(:,:) + fse3w(:,:,jk) * MAX( 0.e0, rn2(:,:,jk) ) * rau0 * zavt_itf(:,:,jk) * tmask(:,:,jk) 
    249297      END DO 
    250298 
     
    255303      END DO 
    256304 
    257       DO jk = 2, jpkm1              ! Mutiply by zkz to recover en_tmx, BUT bound by 30/6 ==> av_tide_itf bound by 300 cm2/s 
    258          av_tide_itf(:,:,jk) = av_tide_itf(:,:,jk) * MIN( zkz(:,:), 120./10. )   ! kz max = 120 cm2/s 
    259       END DO 
    260  
    261       IF( kt == nit000 ) THEN       ! diagnose the nergy consumed by av_tide_itf 
     305      DO jk = 2, jpkm1              ! Mutiply by zkz to recover en_tmx, BUT bound by 30/6 ==> zavt_itf bound by 300 cm2/s 
     306         zavt_itf(:,:,jk) = zavt_itf(:,:,jk) * MIN( zkz(:,:), 120./10. )   ! kz max = 120 cm2/s 
     307      END DO 
     308 
     309      IF( kt == nit000 ) THEN       ! diagnose the nergy consumed by zavt_itf 
    262310         ztpc = 0.e0 
    263311         DO jk= 1, jpk 
    264312            DO jj= 1, jpj 
    265313               DO ji= 1, jpi 
    266                   ztpc = ztpc + fse3w(ji,jj,jk)*e1t(ji,jj)*e2t(ji,jj) * 1/(rn_tfe_itf)  & 
    267                      &         *MAX(0.e0,rn2(ji,jj,jk))*av_tide_itf(ji,jj,jk)*tmask(ji,jj,jk)*tmask_i(ji,jj) 
     314                  ztpc = ztpc + e1t(ji,jj) * e2t(ji,jj) * fse3w(ji,jj,jk) * MAX( 0.e0, rn2(ji,jj,jk) )   & 
     315                     &                     * zavt_itf(ji,jj,jk) * tmask(ji,jj,jk) * tmask_i(ji,jj) 
    268316               END DO 
    269317            END DO 
    270318         END DO 
    271          ztpc= rau0 * 1/( rn_me) * ztpc 
    272          IF(lwp) WRITE(numout,*) '          N Total power consumption by av_tide_itf: ztpc = ', ztpc * 1.e-12 ,'TW' 
     319         ztpc= rau0 * ztpc / ( rn_me * rn_tfe_itf ) 
     320         IF(lwp) WRITE(numout,*) '          N Total power consumption by zavt_itf: ztpc = ', ztpc * 1.e-12 ,'TW' 
    273321      ENDIF 
    274322 
     323      !                             ! Update av_tide with the ITF mixing coefficient 
    275324      DO jk = 2, jpkm1 
    276          av_tide_itf(:,:,jk) = av_tide_itf(:,:,jk) * mask_itf(:,:)  
    277          avt(:,:,jk) = avt(:,:,jk) + av_tide_itf(:,:,jk) 
    278          ! 
    279          DO jj = 2, jpjm1 
    280             DO ji = fs_2, fs_jpim1  ! vector opt. 
    281                avmu(ji,jj,jk) = avmu(ji,jj,jk) + 0.5 * ( av_tide_itf(ji,jj,jk) + av_tide_itf(ji+1,jj  ,jk) ) * umask(ji,jj,jk) 
    282                avmv(ji,jj,jk) = avmv(ji,jj,jk) + 0.5 * ( av_tide_itf(ji,jj,jk) + av_tide_itf(ji  ,jj+1,jk) ) * vmask(ji,jj,jk) 
    283             END DO 
    284          END DO 
    285       END DO 
    286       CALL lbc_lnk( avmu, 'U', 1. )    
    287       CALL lbc_lnk( avmv, 'V', 1. ) 
    288  
     325         av_tide(:,:,jk) = av_tide (:,:,jk) * ( 1.e0 - mask_itf(:,:) )   & 
     326            &            + zavt_itf(:,:,jk) *          mask_itf(:,:)  
     327      END DO 
    289328      ! 
    290329   END SUBROUTINE tmx_itf 
     
    320359      REAL(wp), DIMENSION(jpi,jpj) ::  zkz              ! total M2, K1 and S2 tidal energy 
    321360      REAL(wp), DIMENSION(jpi,jpj) ::  zfact            ! used for vertical structure function 
     361      REAL(wp), DIMENSION(jpi,jpj) ::  zhdep                ! Ocean depth  
    322362      REAL(wp), DIMENSION(jpi,jpj,jpk) ::  zpc          ! power consumption 
    323363 
Note: See TracChangeset for help on using the changeset viewer.