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 4616 for branches/2014/dev_CNRS0_NOC1_LDF/NEMOGCM/NEMO/OPA_SRC/DYN/dynhpg.F90 – NEMO

Ignore:
Timestamp:
2014-04-06T17:28:25+02:00 (10 years ago)
Author:
gm
Message:

#1260 : see the associated wiki page for explanation

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/2014/dev_CNRS0_NOC1_LDF/NEMOGCM/NEMO/OPA_SRC/DYN/dynhpg.F90

    r4596 r4616  
    6060#  include "vectopt_loop_substitute.h90" 
    6161   !!---------------------------------------------------------------------- 
    62    !! NEMO/OPA 3.3 , NEMO Consortium (2010) 
     62   !! NEMO/OPA 3.7 , NEMO Consortium (2014) 
    6363   !! $Id$ 
    6464   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt) 
     
    217217            zcoef1 = zcoef0 * fse3w(ji,jj,1) 
    218218            ! hydrostatic pressure gradient 
    219             zhpi(ji,jj,1) = zcoef1 * ( rhd(ji+1,jj,1) - rhd(ji,jj,1) ) / e1u(ji,jj) 
    220             zhpj(ji,jj,1) = zcoef1 * ( rhd(ji,jj+1,1) - rhd(ji,jj,1) ) / e2v(ji,jj) 
     219            zhpi(ji,jj,1) = zcoef1 * ( rhd(ji+1,jj,1) - rhd(ji,jj,1) ) * r1_e1u(ji,jj) 
     220            zhpj(ji,jj,1) = zcoef1 * ( rhd(ji,jj+1,1) - rhd(ji,jj,1) ) * r1_e2v(ji,jj) 
    221221            ! add to the general momentum trend 
    222222            ua(ji,jj,1) = ua(ji,jj,1) + zhpi(ji,jj,1) 
     
    234234               zhpi(ji,jj,jk) = zhpi(ji,jj,jk-1)   & 
    235235                  &           + zcoef1 * (  ( rhd(ji+1,jj,jk)+rhd(ji+1,jj,jk-1) )   & 
    236                   &                       - ( rhd(ji  ,jj,jk)+rhd(ji  ,jj,jk-1) )  ) / e1u(ji,jj) 
     236                  &                       - ( rhd(ji  ,jj,jk)+rhd(ji  ,jj,jk-1) )  ) * r1_e1u(ji,jj) 
    237237 
    238238               zhpj(ji,jj,jk) = zhpj(ji,jj,jk-1)   & 
    239239                  &           + zcoef1 * (  ( rhd(ji,jj+1,jk)+rhd(ji,jj+1,jk-1) )   & 
    240                   &                       - ( rhd(ji,jj,  jk)+rhd(ji,jj  ,jk-1) )  ) / e2v(ji,jj) 
     240                  &                       - ( rhd(ji,jj,  jk)+rhd(ji,jj  ,jk-1) )  ) * r1_e2v(ji,jj) 
    241241               ! add to the general momentum trend 
    242242               ua(ji,jj,jk) = ua(ji,jj,jk) + zhpi(ji,jj,jk) 
     
    284284            zcoef1 = zcoef0 * fse3w(ji,jj,1) 
    285285            ! hydrostatic pressure gradient 
    286             zhpi(ji,jj,1) = zcoef1 * ( rhd(ji+1,jj  ,1) - rhd(ji,jj,1) ) / e1u(ji,jj) 
    287             zhpj(ji,jj,1) = zcoef1 * ( rhd(ji  ,jj+1,1) - rhd(ji,jj,1) ) / e2v(ji,jj) 
     286            zhpi(ji,jj,1) = zcoef1 * ( rhd(ji+1,jj  ,1) - rhd(ji,jj,1) ) * r1_e1u(ji,jj) 
     287            zhpj(ji,jj,1) = zcoef1 * ( rhd(ji  ,jj+1,1) - rhd(ji,jj,1) ) * r1_e2v(ji,jj) 
    288288            ! add to the general momentum trend 
    289289            ua(ji,jj,1) = ua(ji,jj,1) + zhpi(ji,jj,1) 
     
    300300               ! hydrostatic pressure gradient 
    301301               zhpi(ji,jj,jk) = zhpi(ji,jj,jk-1)   & 
    302                   &           + zcoef1 * (  ( rhd(ji+1,jj,jk) + rhd(ji+1,jj,jk-1) )   & 
    303                   &                       - ( rhd(ji  ,jj,jk) + rhd(ji  ,jj,jk-1) )  ) / e1u(ji,jj) 
     302                  &           + zcoef1 * (  ( rhd(ji+1,jj,jk) + rhd(ji+1,jj,jk-1) )    & 
     303                  &                       - ( rhd(ji  ,jj,jk) + rhd(ji  ,jj,jk-1) )  ) * r1_e1u(ji,jj) 
    304304 
    305305               zhpj(ji,jj,jk) = zhpj(ji,jj,jk-1)   & 
    306                   &           + zcoef1 * (  ( rhd(ji,jj+1,jk) + rhd(ji,jj+1,jk-1) )   & 
    307                   &                       - ( rhd(ji,jj,  jk) + rhd(ji,jj  ,jk-1) )  ) / e2v(ji,jj) 
     306                  &           + zcoef1 * (  ( rhd(ji,jj+1,jk) + rhd(ji,jj+1,jk-1) )    & 
     307                  &                       - ( rhd(ji,jj,  jk) + rhd(ji,jj  ,jk-1) )  ) * r1_e2v(ji,jj) 
    308308               ! add to the general momentum trend 
    309309               ua(ji,jj,jk) = ua(ji,jj,jk) + zhpi(ji,jj,jk) 
     
    315315 
    316316      ! partial steps correction at the last level  (use gru & grv computed in zpshde.F90) 
    317 # if defined key_vectopt_loop 
    318          jj = 1 
    319          DO ji = jpi+2, jpij-jpi-1   ! vector opt. (forced unrolling) 
    320 # else 
    321317      DO jj = 2, jpjm1 
    322318         DO ji = 2, jpim1 
    323 # endif 
    324319            iku = mbku(ji,jj) 
    325320            ikv = mbkv(ji,jj) 
     
    329324               ua  (ji,jj,iku) = ua(ji,jj,iku) - zhpi(ji,jj,iku)         ! subtract old value 
    330325               zhpi(ji,jj,iku) = zhpi(ji,jj,iku-1)                   &   ! compute the new one 
    331                   &            + zcoef2 * ( rhd(ji+1,jj,iku-1) - rhd(ji,jj,iku-1) + gru(ji,jj) ) / e1u(ji,jj) 
     326                  &            + zcoef2 * ( rhd(ji+1,jj,iku-1) - rhd(ji,jj,iku-1) + gru(ji,jj) ) * r1_e1u(ji,jj) 
    332327               ua  (ji,jj,iku) = ua(ji,jj,iku) + zhpi(ji,jj,iku)         ! add the new one to the general momentum trend 
    333328            ENDIF 
     
    335330               va  (ji,jj,ikv) = va(ji,jj,ikv) - zhpj(ji,jj,ikv)         ! subtract old value 
    336331               zhpj(ji,jj,ikv) = zhpj(ji,jj,ikv-1)                   &   ! compute the new one 
    337                   &            + zcoef3 * ( rhd(ji,jj+1,ikv-1) - rhd(ji,jj,ikv-1) + grv(ji,jj) ) / e2v(ji,jj) 
     332                  &            + zcoef3 * ( rhd(ji,jj+1,ikv-1) - rhd(ji,jj,ikv-1) + grv(ji,jj) ) * r1_e2v(ji,jj) 
    338333               va  (ji,jj,ikv) = va(ji,jj,ikv) + zhpj(ji,jj,ikv)         ! add the new one to the general momentum trend 
    339334            ENDIF 
    340 # if ! defined key_vectopt_loop 
    341          END DO 
    342 # endif 
     335         END DO 
    343336      END DO 
    344337      ! 
     
    392385         DO ji = fs_2, fs_jpim1   ! vector opt. 
    393386            ! hydrostatic pressure gradient along s-surfaces 
    394             zhpi(ji,jj,1) = zcoef0 / e1u(ji,jj) * ( fse3w(ji+1,jj  ,1) * ( znad + rhd(ji+1,jj  ,1) )   & 
    395                &                                  - fse3w(ji  ,jj  ,1) * ( znad + rhd(ji  ,jj  ,1) ) ) 
    396             zhpj(ji,jj,1) = zcoef0 / e2v(ji,jj) * ( fse3w(ji  ,jj+1,1) * ( znad + rhd(ji  ,jj+1,1) )   & 
    397                &                                  - fse3w(ji  ,jj  ,1) * ( znad + rhd(ji  ,jj  ,1) ) ) 
     387            zhpi(ji,jj,1) = zcoef0 * r1_e1u(ji,jj) * ( fse3w(ji+1,jj  ,1) * ( znad + rhd(ji+1,jj  ,1) )   & 
     388               &                                     - fse3w(ji  ,jj  ,1) * ( znad + rhd(ji  ,jj  ,1) ) ) 
     389            zhpj(ji,jj,1) = zcoef0 * r1_e2v(ji,jj) * ( fse3w(ji  ,jj+1,1) * ( znad + rhd(ji  ,jj+1,1) )   & 
     390               &                                     - fse3w(ji  ,jj  ,1) * ( znad + rhd(ji  ,jj  ,1) ) ) 
    398391            ! s-coordinate pressure gradient correction 
    399392            zuap = -zcoef0 * ( rhd   (ji+1,jj,1) + rhd   (ji,jj,1) + 2._wp * znad )   & 
    400                &           * ( fsde3w(ji+1,jj,1) - fsde3w(ji,jj,1) ) / e1u(ji,jj) 
     393               &           * ( fsde3w(ji+1,jj,1) - fsde3w(ji,jj,1) ) * r1_e1u(ji,jj) 
    401394            zvap = -zcoef0 * ( rhd   (ji,jj+1,1) + rhd   (ji,jj,1) + 2._wp * znad )   & 
    402                &           * ( fsde3w(ji,jj+1,1) - fsde3w(ji,jj,1) ) / e2v(ji,jj) 
     395               &           * ( fsde3w(ji,jj+1,1) - fsde3w(ji,jj,1) ) * r1_e2v(ji,jj) 
    403396            ! add to the general momentum trend 
    404397            ua(ji,jj,1) = ua(ji,jj,1) + zhpi(ji,jj,1) + zuap 
     
    406399         END DO 
    407400      END DO 
     401 
     402!!gm 
     403!!gm Idea of optimization here : only divide by e1u and e2v  when apply to ua, va .... 
     404!!gm 
    408405 
    409406      ! interior value (2=<jk=<jpkm1) 
     
    412409            DO ji = fs_2, fs_jpim1   ! vector opt. 
    413410               ! hydrostatic pressure gradient along s-surfaces 
    414                zhpi(ji,jj,jk) = zhpi(ji,jj,jk-1) + zcoef0 / e1u(ji,jj)   & 
     411               zhpi(ji,jj,jk) = zhpi(ji,jj,jk-1) + zcoef0 * r1_e1u(ji,jj)   & 
    415412                  &           * (  fse3w(ji+1,jj,jk) * ( rhd(ji+1,jj,jk) + rhd(ji+1,jj,jk-1) + 2*znad )   & 
    416413                  &              - fse3w(ji  ,jj,jk) * ( rhd(ji  ,jj,jk) + rhd(ji  ,jj,jk-1) + 2*znad )  ) 
    417                zhpj(ji,jj,jk) = zhpj(ji,jj,jk-1) + zcoef0 / e2v(ji,jj)   & 
     414               zhpj(ji,jj,jk) = zhpj(ji,jj,jk-1) + zcoef0 * r1_e2v(ji,jj)   & 
    418415                  &           * (  fse3w(ji,jj+1,jk) * ( rhd(ji,jj+1,jk) + rhd(ji,jj+1,jk-1) + 2*znad )   & 
    419416                  &              - fse3w(ji,jj  ,jk) * ( rhd(ji,jj,  jk) + rhd(ji,jj  ,jk-1) + 2*znad )  ) 
    420417               ! s-coordinate pressure gradient correction 
    421418               zuap = -zcoef0 * ( rhd   (ji+1,jj  ,jk) + rhd   (ji,jj,jk) + 2._wp * znad )   & 
    422                   &           * ( fsde3w(ji+1,jj  ,jk) - fsde3w(ji,jj,jk) ) / e1u(ji,jj) 
     419                  &           * ( fsde3w(ji+1,jj  ,jk) - fsde3w(ji,jj,jk) ) * r1_e1u(ji,jj) 
    423420               zvap = -zcoef0 * ( rhd   (ji  ,jj+1,jk) + rhd   (ji,jj,jk) + 2._wp * znad )   & 
    424                   &           * ( fsde3w(ji  ,jj+1,jk) - fsde3w(ji,jj,jk) ) / e2v(ji,jj) 
     421                  &           * ( fsde3w(ji  ,jj+1,jk) - fsde3w(ji,jj,jk) ) * r1_e2v(ji,jj) 
    425422               ! add to the general momentum trend 
    426423               ua(ji,jj,jk) = ua(ji,jj,jk) + zhpi(ji,jj,jk) + zuap 
     
    625622      DO jj = 2, jpjm1 
    626623         DO ji = fs_2, fs_jpim1   ! vector opt. 
    627             zhpi(ji,jj,1) = ( rho_k(ji+1,jj  ,1) - rho_k(ji,jj,1) - rho_i(ji,jj,1) ) / e1u(ji,jj) 
    628             zhpj(ji,jj,1) = ( rho_k(ji  ,jj+1,1) - rho_k(ji,jj,1) - rho_j(ji,jj,1) ) / e2v(ji,jj) 
     624            zhpi(ji,jj,1) = ( rho_k(ji+1,jj  ,1) - rho_k(ji,jj,1) - rho_i(ji,jj,1) ) * r1_e1u(ji,jj) 
     625            zhpj(ji,jj,1) = ( rho_k(ji  ,jj+1,1) - rho_k(ji,jj,1) - rho_j(ji,jj,1) ) * r1_e2v(ji,jj) 
    629626            ! add to the general momentum trend 
    630627            ua(ji,jj,1) = ua(ji,jj,1) + zhpi(ji,jj,1) 
     
    642639               zhpi(ji,jj,jk) = zhpi(ji,jj,jk-1)                                & 
    643640                  &           + (  ( rho_k(ji+1,jj,jk) - rho_k(ji,jj,jk  ) )    & 
    644                   &              - ( rho_i(ji  ,jj,jk) - rho_i(ji,jj,jk-1) )  ) / e1u(ji,jj) 
     641                  &              - ( rho_i(ji  ,jj,jk) - rho_i(ji,jj,jk-1) )  ) * r1_e1u(ji,jj) 
    645642               zhpj(ji,jj,jk) = zhpj(ji,jj,jk-1)                                & 
    646643                  &           + (  ( rho_k(ji,jj+1,jk) - rho_k(ji,jj,jk  ) )    & 
    647                   &               -( rho_j(ji,jj  ,jk) - rho_j(ji,jj,jk-1) )  ) / e2v(ji,jj) 
     644                  &               -( rho_j(ji,jj  ,jk) - rho_j(ji,jj,jk-1) )  ) * r1_e2v(ji,jj) 
    648645               ! add to the general momentum trend 
    649646               ua(ji,jj,jk) = ua(ji,jj,jk) + zhpi(ji,jj,jk) 
     
    853850               ! update the momentum trends in u direction 
    854851 
    855                zdpdx1 = zcoef0 / e1u(ji,jj) * (zhpi(ji+1,jj,jk) - zhpi(ji,jj,jk)) 
     852               zdpdx1 = zcoef0 * r1_e1u(ji,jj) * (zhpi(ji+1,jj,jk) - zhpi(ji,jj,jk)) 
    856853               IF( lk_vvl ) THEN 
    857                  zdpdx2 = zcoef0 / e1u(ji,jj) * & 
     854                 zdpdx2 = zcoef0 * r1_e1u(ji,jj) * & 
    858855                         ( REAL(jis-jid, wp) * (zpwes + zpwed) + (sshn(ji+1,jj)-sshn(ji,jj)) ) 
    859856                ELSE 
    860                  zdpdx2 = zcoef0 / e1u(ji,jj) * REAL(jis-jid, wp) * (zpwes + zpwed) 
     857                 zdpdx2 = zcoef0 * r1_e1u(ji,jj) * REAL(jis-jid, wp) * (zpwes + zpwed) 
    861858               ENDIF 
    862859 
    863860               ua(ji,jj,jk) = ua(ji,jj,jk) + (zdpdx1 + zdpdx2) * & 
    864861               &           umask(ji,jj,jk) * tmask(ji,jj,jk) * tmask(ji+1,jj,jk) 
     862!!gm above it is stupid:   umask is equal to the product of the 2 tmask that follows... 
    865863            ENDIF 
    866864 
     
    910908               ! update the momentum trends in v direction 
    911909 
    912                zdpdy1 = zcoef0 / e2v(ji,jj) * (zhpi(ji,jj+1,jk) - zhpi(ji,jj,jk)) 
     910               zdpdy1 = zcoef0 * r1_e2v(ji,jj) * (zhpi(ji,jj+1,jk) - zhpi(ji,jj,jk)) 
    913911               IF( lk_vvl ) THEN 
    914                    zdpdy2 = zcoef0 / e2v(ji,jj) * & 
     912                   zdpdy2 = zcoef0 * r1_e2v(ji,jj) * & 
    915913                           ( REAL(jjs-jjd, wp) * (zpnss + zpnsd) + (sshn(ji,jj+1)-sshn(ji,jj)) ) 
    916914               ELSE 
     
    920918               va(ji,jj,jk) = va(ji,jj,jk) + (zdpdy1 + zdpdy2)*& 
    921919               &              vmask(ji,jj,jk)*tmask(ji,jj,jk)*tmask(ji,jj+1,jk) 
     920!!gm above it is stupid:   vmask is equal to the product of the 2 tmask that follows... 
    922921            ENDIF 
    923922 
     
    932931   END SUBROUTINE hpg_prj 
    933932 
     933 
    934934   SUBROUTINE cspline(fsp, xsp, asp, bsp, csp, dsp, polynomial_type) 
    935935      !!---------------------------------------------------------------------- 
     
    940940      !! ** Method  :   f(x) = asp + bsp*x + csp*x^2 + dsp*x^3 
    941941      !! Reference: CJC Kruger, Constrained Cubic Spline Interpoltation 
    942       !! 
    943       !!---------------------------------------------------------------------- 
    944       IMPLICIT NONE 
     942      !!---------------------------------------------------------------------- 
    945943      REAL(wp), DIMENSION(:,:,:), INTENT(in)  :: fsp, xsp           ! value and coordinate 
    946       REAL(wp), DIMENSION(:,:,:), INTENT(out) :: asp, bsp, csp, dsp ! coefficients of 
    947                                                                     ! the interpoated function 
     944      REAL(wp), DIMENSION(:,:,:), INTENT(out) :: asp, bsp, csp, dsp ! coefficients of the interpolated function 
    948945      INTEGER, INTENT(in) :: polynomial_type                        ! 1: cubic spline 
    949                                                                     ! 2: Linear 
    950  
    951       ! Local Variables 
     946      !                                                             ! 2: Linear 
     947      ! 
    952948      INTEGER  ::   ji, jj, jk                 ! dummy loop indices 
    953949      INTEGER  ::   jpi, jpj, jpkm1 
     
    10381034           CALL ctl_stop( 'invalid polynomial type in cspline' ) 
    10391035      ENDIF 
    1040  
    1041  
     1036      ! 
    10421037   END SUBROUTINE cspline 
    10431038 
     
    10691064   END FUNCTION interp1 
    10701065 
     1066 
    10711067   FUNCTION interp2(x, a, b, c, d)  RESULT(f) 
    10721068      !!---------------------------------------------------------------------- 
Note: See TracChangeset for help on using the changeset viewer.