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 5034 for branches/2014/dev_r4650_UKMO14.12_STAND_ALONE_OBSOPER/NEMOGCM/NEMO/OPA_SRC/DYN/dynhpg.F90 – NEMO

Ignore:
Timestamp:
2015-01-15T14:48:42+01:00 (9 years ago)
Author:
andrewryan
Message:

merge with trunk

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/2014/dev_r4650_UKMO14.12_STAND_ALONE_OBSOPER/NEMOGCM/NEMO/OPA_SRC/DYN/dynhpg.F90

    r4624 r5034  
    2929   !!---------------------------------------------------------------------- 
    3030   USE oce             ! ocean dynamics and tracers 
     31   USE sbc_oce         ! surface variable (only for the flag with ice shelf) 
    3132   USE dom_oce         ! ocean space and time domain 
    3233   USE phycst          ! physical constants 
    33    USE trdmod          ! ocean dynamics trends 
    34    USE trdmod_oce      ! ocean variables trends 
     34   USE trd_oce         ! trends: ocean variables 
     35   USE trddyn          ! trend manager: dynamics 
     36   ! 
    3537   USE in_out_manager  ! I/O manager 
    3638   USE prtctl          ! Print control 
    37    USE lbclnk          ! lateral boundary condition 
     39   USE lbclnk          ! lateral boundary condition  
    3840   USE lib_mpp         ! MPP library 
     41   USE eosbn2          ! compute density 
    3942   USE wrk_nemo        ! Memory Allocation 
    4043   USE timing          ! Timing 
     
    7477      !! 
    7578      !! ** Action : - Update (ua,va) with the now hydrastatic pressure trend 
    76       !!             - Save the trend (l_trddyn=T) 
     79      !!             - send trends to trd_dyn for futher diagnostics (l_trddyn=T) 
    7780      !!---------------------------------------------------------------------- 
    7881      INTEGER, INTENT(in) ::   kt   ! ocean time-step index 
     
    99102         ztrdu(:,:,:) = ua(:,:,:) - ztrdu(:,:,:) 
    100103         ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:) 
    101          CALL trd_mod( ztrdu, ztrdv, jpdyn_trd_hpg, 'DYN', kt ) 
     104         CALL trd_dyn( ztrdu, ztrdv, jpdyn_hpg, kt ) 
    102105         CALL wrk_dealloc( jpi,jpj,jpk, ztrdu, ztrdv ) 
    103106      ENDIF 
     
    175178      IF( ln_hpg_prj )   ioptio = ioptio + 1 
    176179      IF( ioptio /= 1 )   CALL ctl_stop( 'NO or several hydrostatic pressure gradient options used' ) 
     180      IF( (ln_hpg_zco .OR. ln_hpg_zps .OR. ln_hpg_djc .OR. ln_hpg_prj ) .AND. nn_isf .NE. 0 )   & 
     181          &  CALL ctl_stop( 'Only hpg_sco has been corrected to work with ice shelf cavity.' ) 
    177182      ! 
    178183   END SUBROUTINE dyn_hpg_init 
     
    315320 
    316321      ! 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 
    321322      DO jj = 2, jpjm1 
    322323         DO ji = 2, jpim1 
    323 # endif 
    324324            iku = mbku(ji,jj) 
    325325            ikv = mbkv(ji,jj) 
     
    338338               va  (ji,jj,ikv) = va(ji,jj,ikv) + zhpj(ji,jj,ikv)         ! add the new one to the general momentum trend 
    339339            ENDIF 
    340 # if ! defined key_vectopt_loop 
    341          END DO 
    342 # endif 
     340         END DO 
    343341      END DO 
    344342      ! 
     
    368366      INTEGER, INTENT(in) ::   kt    ! ocean time-step index 
    369367      !! 
    370       INTEGER  ::   ji, jj, jk                 ! dummy loop indices 
    371       REAL(wp) ::   zcoef0, zuap, zvap, znad   ! temporary scalars 
    372       REAL(wp), POINTER, DIMENSION(:,:,:) ::  zhpi, zhpj 
    373       !!---------------------------------------------------------------------- 
    374       ! 
    375       CALL wrk_alloc( jpi,jpj,jpk, zhpi, zhpj ) 
    376       ! 
    377       IF( kt == nit000 ) THEN 
     368      INTEGER  ::   ji, jj, jk, iku, ikv, ikt, iktp1i, iktp1j                 ! dummy loop indices 
     369      REAL(wp) ::   zcoef0, zuap, zvap, znad, ze3wu, ze3wv, zuapint, zvapint, zhpjint, zhpiint, zdzwt, zdzwtjp1, zdzwtip1             ! temporary scalars 
     370      REAL(wp), POINTER, DIMENSION(:,:,:)   ::  zhpi, zhpj, zrhd 
     371      REAL(wp), POINTER, DIMENSION(:,:,:)   ::  ztstop 
     372      REAL(wp), POINTER, DIMENSION(:,:)     ::  ze3w, zp, zrhdtop_isf, zrhdtop_oce, ziceload, zdept, zpshpi, zpshpj 
     373      !!---------------------------------------------------------------------- 
     374      ! 
     375      CALL wrk_alloc( jpi,jpj, 2, ztstop)  
     376      CALL wrk_alloc( jpi,jpj,jpk, zhpi, zhpj, zrhd) 
     377      CALL wrk_alloc( jpi,jpj, ze3w, zp, zrhdtop_isf, zrhdtop_oce, ziceload, zdept, zpshpi, zpshpj)  
     378      ! 
     379     IF( kt == nit000 ) THEN 
    378380         IF(lwp) WRITE(numout,*) 
    379381         IF(lwp) WRITE(numout,*) 'dyn:hpg_sco : hydrostatic pressure gradient trend' 
     
    384386      zcoef0 = - grav * 0.5_wp 
    385387      ! To use density and not density anomaly 
    386       IF ( lk_vvl ) THEN   ;     znad = 1._wp          ! Variable volume 
    387       ELSE                 ;     znad = 0._wp         ! Fixed volume 
    388       ENDIF 
    389  
    390       ! Surface value 
     388!      IF ( lk_vvl ) THEN   ;     znad = 1._wp          ! Variable volume 
     389!      ELSE                 ;     znad = 0._wp         ! Fixed volume 
     390!      ENDIF 
     391      znad=1._wp 
     392      ! iniitialised to 0. zhpi zhpi  
     393      zhpi(:,:,:)=0._wp ; zhpj(:,:,:)=0._wp 
     394 
     395!==================================================================================      
     396!=====Compute iceload and contribution of the half first wet layer =================  
     397!=================================================================================== 
     398 
     399      ! assume water displaced by the ice shelf is at T=-1.9 and S=34.4 (rude) 
     400      ztstop(:,:,1)=-1.9_wp ; ztstop(:,:,2)=34.4_wp 
     401 
     402      ! compute density of the water displaced by the ice shelf  
     403      zrhd = rhd ! save rhd 
     404      DO jk = 1, jpk 
     405           zdept(:,:)=gdept_1d(jk) 
     406           CALL eos(ztstop(:,:,:),zdept(:,:),rhd(:,:,jk)) 
     407      END DO 
     408      WHERE ( tmask(:,:,:) == 1._wp) 
     409        rhd(:,:,:) = zrhd(:,:,:) ! replace wet cell by the saved rhd 
     410      END WHERE 
     411       
     412      ! compute rhd at the ice/oce interface (ice shelf side) 
     413      CALL eos(ztstop,risfdep,zrhdtop_isf) 
     414 
     415      ! compute rhd at the ice/oce interface (ocean side) 
     416      DO ji=1,jpi 
     417        DO jj=1,jpj 
     418          ikt=mikt(ji,jj) 
     419          ztstop(ji,jj,1)=tsn(ji,jj,ikt,1) 
     420          ztstop(ji,jj,2)=tsn(ji,jj,ikt,2) 
     421        END DO 
     422      END DO 
     423      CALL eos(ztstop,risfdep,zrhdtop_oce) 
     424      ! 
     425      ! Surface value + ice shelf gradient 
     426      ! compute pressure due to ice shelf load (used to compute hpgi/j for all the level from 1 to miku/v) 
     427      ziceload = 0._wp 
     428      DO jj = 1, jpj 
     429         DO ji = 1, jpi   ! vector opt. 
     430            ikt=mikt(ji,jj) 
     431            ziceload(ji,jj) = ziceload(ji,jj) + (znad + rhd(ji,jj,1) ) * fse3w(ji,jj,1) * (1._wp - tmask(ji,jj,1)) 
     432            DO jk=2,ikt-1 
     433               ziceload(ji,jj) = ziceload(ji,jj) + (2._wp * znad + rhd(ji,jj,jk-1) + rhd(ji,jj,jk)) * fse3w(ji,jj,jk) & 
     434                  &                              * (1._wp - tmask(ji,jj,jk)) 
     435            END DO 
     436            IF (ikt .GE. 2) ziceload(ji,jj) = ziceload(ji,jj) + (2._wp * znad + zrhdtop_isf(ji,jj) + rhd(ji,jj,ikt-1)) & 
     437                               &                              * ( risfdep(ji,jj) - gdept_1d(ikt-1) ) 
     438         END DO 
     439      END DO 
     440      riceload(:,:) = 0.0_wp ; riceload(:,:)=ziceload(:,:)  ! need to be saved for diaar5 
     441      ! compute zp from z=0 to first T wet point (correction due to zps not yet applied) 
    391442      DO jj = 2, jpjm1 
    392443         DO ji = fs_2, fs_jpim1   ! vector opt. 
    393             ! 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) ) ) 
    398             ! s-coordinate pressure gradient correction 
     444            ikt=mikt(ji,jj) ; iktp1i=mikt(ji+1,jj); iktp1j=mikt(ji,jj+1) 
     445            ! hydrostatic pressure gradient along s-surfaces and ice shelf pressure 
     446            ! we assume ISF is in isostatic equilibrium 
     447            zhpi(ji,jj,1) = zcoef0 / e1u(ji,jj) * ( 0.5_wp * fse3w(ji+1,jj  ,iktp1i)                                    & 
     448               &                                  * ( 2._wp * znad + rhd(ji+1,jj  ,iktp1i) + zrhdtop_oce(ji+1,jj  ) )   & 
     449               &                                  - 0.5_wp * fse3w(ji  ,jj  ,ikt   )                                    & 
     450               &                                  * ( 2._wp * znad + rhd(ji  ,jj  ,ikt   ) + zrhdtop_oce(ji  ,jj  ) )   & 
     451               &                                  + ( ziceload(ji+1,jj) - ziceload(ji,jj))                              )  
     452            zhpj(ji,jj,1) = zcoef0 / e2v(ji,jj) * ( 0.5_wp * fse3w(ji  ,jj+1,iktp1j)                                    & 
     453               &                                  * ( 2._wp * znad + rhd(ji  ,jj+1,iktp1j) + zrhdtop_oce(ji  ,jj+1) )   & 
     454               &                                  - 0.5_wp * fse3w(ji  ,jj  ,ikt   )                                    &  
     455               &                                  * ( 2._wp * znad + rhd(ji  ,jj  ,ikt   ) + zrhdtop_oce(ji  ,jj  ) )   & 
     456               &                                  + ( ziceload(ji,jj+1) - ziceload(ji,jj) )                             )  
     457            ! s-coordinate pressure gradient correction (=0 if z coordinate) 
    399458            zuap = -zcoef0 * ( rhd   (ji+1,jj,1) + rhd   (ji,jj,1) + 2._wp * znad )   & 
    400459               &           * ( fsde3w(ji+1,jj,1) - fsde3w(ji,jj,1) ) / e1u(ji,jj) 
     
    402461               &           * ( fsde3w(ji,jj+1,1) - fsde3w(ji,jj,1) ) / e2v(ji,jj) 
    403462            ! add to the general momentum trend 
    404             ua(ji,jj,1) = ua(ji,jj,1) + zhpi(ji,jj,1) + zuap 
    405             va(ji,jj,1) = va(ji,jj,1) + zhpj(ji,jj,1) + zvap 
    406          END DO 
    407       END DO 
    408  
    409       ! interior value (2=<jk=<jpkm1) 
    410       DO jk = 2, jpkm1 
    411          DO jj = 2, jpjm1 
    412             DO ji = fs_2, fs_jpim1   ! vector opt. 
     463            ua(ji,jj,1) = ua(ji,jj,1) + (zhpi(ji,jj,1) + zuap) * umask(ji,jj,1) 
     464            va(ji,jj,1) = va(ji,jj,1) + (zhpj(ji,jj,1) + zvap) * vmask(ji,jj,1) 
     465         END DO 
     466      END DO 
     467!==================================================================================      
     468!===== Compute partial cell contribution for the top cell =========================  
     469!================================================================================== 
     470      DO jj = 2, jpjm1 
     471         DO ji = fs_2, fs_jpim1   ! vector opt. 
     472            iku = miku(ji,jj) ;  
     473            zpshpi(ji,jj)=0.0_wp ; zpshpj(ji,jj)=0.0_wp 
     474            ze3wu  = (gdepw_0(ji+1,jj,iku+1) - gdept_0(ji+1,jj,iku)) - (gdepw_0(ji,jj,iku+1) - gdept_0(ji,jj,iku)) 
     475            ! u direction 
     476            IF ( iku .GT. 1 ) THEN 
     477               ! case iku 
     478               zhpi(ji,jj,iku)   =  zcoef0 / e1u(ji,jj) * ze3wu                                            & 
     479                      &                                 * ( rhd    (ji+1,jj,iku) + rhd   (ji,jj,iku)       & 
     480                      &                                   + SIGN(1._wp,ze3wu) * grui(ji,jj) + 2._wp * znad ) 
     481               ! corrective term ( = 0 if z coordinate ) 
     482               zuap              = -zcoef0 * ( arui(ji,jj) + 2._wp * znad ) * gzui(ji,jj) / e1u(ji,jj) 
     483               ! zhpi will be added in interior loop 
     484               ua(ji,jj,iku)     = ua(ji,jj,iku) + zuap 
     485               ! in case of 2 cell water column, need to save the pressure gradient to compute the bottom pressure   
     486               IF (mbku(ji,jj) == iku + 1) zpshpi(ji,jj)  = zhpi(ji,jj,iku) 
     487 
     488               ! case iku + 1 (remove the zphi term added in the interior loop and compute the one corrected for zps) 
     489               zhpiint        =  zcoef0 / e1u(ji,jj)                                                               &     
     490                  &           * (  fse3w(ji+1,jj  ,iku+1) * ( (rhd(ji+1,jj,iku+1) + znad)                          & 
     491                  &                                         + (rhd(ji+1,jj,iku  ) + znad) ) * tmask(ji+1,jj,iku)   & 
     492                  &              - fse3w(ji  ,jj  ,iku+1) * ( (rhd(ji  ,jj,iku+1) + znad)                          & 
     493                  &                                         + (rhd(ji  ,jj,iku  ) + znad) ) * tmask(ji  ,jj,iku)   ) 
     494               zhpi(ji,jj,iku+1) =  zcoef0 / e1u(ji,jj) * ge3rui(ji,jj) - zhpiint  
     495            END IF 
     496                
     497            ! v direction 
     498            ikv = mikv(ji,jj) 
     499            ze3wv  = (gdepw_0(ji,jj+1,ikv+1) - gdept_0(ji,jj+1,ikv)) - (gdepw_0(ji,jj,ikv+1) - gdept_0(ji,jj,ikv)) 
     500            IF ( ikv .GT. 1 ) THEN 
     501               ! case ikv 
     502               zhpj(ji,jj,ikv)   =  zcoef0 / e2v(ji,jj) * ze3wv                                            & 
     503                     &                                  * ( rhd(ji,jj+1,ikv) + rhd   (ji,jj,ikv)           & 
     504                     &                                    + SIGN(1._wp,ze3wv) * grvi(ji,jj) + 2._wp * znad ) 
     505               ! corrective term ( = 0 if z coordinate ) 
     506               zvap              = -zcoef0 * ( arvi(ji,jj) + 2._wp * znad ) * gzvi(ji,jj) / e2v(ji,jj) 
     507               ! zhpi will be added in interior loop 
     508               va(ji,jj,ikv)      = va(ji,jj,ikv) + zvap 
     509               ! in case of 2 cell water column, need to save the pressure gradient to compute the bottom pressure   
     510               IF (mbkv(ji,jj) == ikv + 1)  zpshpj(ji,jj)  =  zhpj(ji,jj,ikv)  
     511                
     512               ! case ikv + 1 (remove the zphj term added in the interior loop and compute the one corrected for zps) 
     513               zhpjint        =  zcoef0 / e2v(ji,jj)                                                              & 
     514                  &           * (  fse3w(ji  ,jj+1,ikv+1) * ( (rhd(ji,jj+1,ikv+1) + znad)                         & 
     515                  &                                       + (rhd(ji,jj+1,ikv  ) + znad) ) * tmask(ji,jj+1,ikv)    & 
     516                  &              - fse3w(ji  ,jj  ,ikv+1) * ( (rhd(ji,jj  ,ikv+1) + znad)                         & 
     517                  &                                       + (rhd(ji,jj  ,ikv  ) + znad) ) * tmask(ji,jj  ,ikv)  ) 
     518               zhpj(ji,jj,ikv+1) =  zcoef0 / e2v(ji,jj) * ge3rvi(ji,jj) - zhpjint 
     519            END IF 
     520         END DO 
     521      END DO 
     522 
     523!==================================================================================      
     524!===== Compute interior value =====================================================  
     525!================================================================================== 
     526 
     527      DO jj = 2, jpjm1 
     528         DO ji = fs_2, fs_jpim1   ! vector opt. 
     529            iku=miku(ji,jj); ikv=mikv(ji,jj) 
     530            DO jk = 2, jpkm1 
    413531               ! hydrostatic pressure gradient along s-surfaces 
    414                zhpi(ji,jj,jk) = zhpi(ji,jj,jk-1) + zcoef0 / e1u(ji,jj)   & 
    415                   &           * (  fse3w(ji+1,jj,jk) * ( rhd(ji+1,jj,jk) + rhd(ji+1,jj,jk-1) + 2*znad )   & 
    416                   &              - 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)   & 
    418                   &           * (  fse3w(ji,jj+1,jk) * ( rhd(ji,jj+1,jk) + rhd(ji,jj+1,jk-1) + 2*znad )   & 
    419                   &              - fse3w(ji,jj  ,jk) * ( rhd(ji,jj,  jk) + rhd(ji,jj  ,jk-1) + 2*znad )  ) 
     532               ! zhpi is masked for the first wet cell  (contribution already done in the upper bloc) 
     533               zhpi(ji,jj,jk) = zhpi(ji,jj,jk) + zhpi(ji,jj,jk-1)                                                              & 
     534                  &                            + zcoef0 / e1u(ji,jj)                                                           & 
     535                  &                                     * ( fse3w(ji+1,jj  ,jk) * ( (rhd(ji+1,jj,jk  ) + znad)                 & 
     536                  &                                                     + (rhd(ji+1,jj,jk-1) + znad) ) * tmask(ji+1,jj,jk-1)   & 
     537                  &                                       - fse3w(ji  ,jj  ,jk) * ( (rhd(ji  ,jj,jk  ) + znad)                 & 
     538                  &                                                     + (rhd(ji  ,jj,jk-1) + znad) ) * tmask(ji  ,jj,jk-1)   )  
    420539               ! s-coordinate pressure gradient correction 
    421                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) 
    423                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) 
     540               ! corrective term, we mask this term for the first wet level beneath the ice shelf (contribution done in the upper bloc)  
     541               zuap = - zcoef0 * ( rhd   (ji+1,jj  ,jk) + rhd   (ji,jj,jk) + 2._wp * znad )                    & 
     542                  &            * ( fsde3w(ji+1,jj  ,jk) - fsde3w(ji,jj,jk) ) / e1u(ji,jj) * umask(ji,jj,jk-1) 
     543               ua(ji,jj,jk) = ua(ji,jj,jk) + ( zhpi(ji,jj,jk) + zuap) * umask(ji,jj,jk) 
     544 
     545               ! hydrostatic pressure gradient along s-surfaces 
     546               ! zhpi is masked for the first wet cell  (contribution already done in the upper bloc) 
     547               zhpj(ji,jj,jk) = zhpj(ji,jj,jk) + zhpj(ji,jj,jk-1)                                                              & 
     548                  &                            + zcoef0 / e2v(ji,jj)                                                           & 
     549                  &                                     * ( fse3w(ji  ,jj+1,jk) * ( (rhd(ji,jj+1,jk  ) + znad)                 & 
     550                  &                                                     + (rhd(ji,jj+1,jk-1) + znad) ) * tmask(ji,jj+1,jk-1)   & 
     551                  &                                       - fse3w(ji  ,jj  ,jk) * ( (rhd(ji,jj  ,jk  ) + znad)                 & 
     552                  &                                                     + (rhd(ji,jj  ,jk-1) + znad) ) * tmask(ji,jj  ,jk-1)   ) 
     553               ! s-coordinate pressure gradient correction 
     554               ! corrective term, we mask this term for the first wet level beneath the ice shelf (contribution done in the upper bloc) 
     555               zvap = - zcoef0 * ( rhd   (ji  ,jj+1,jk) + rhd   (ji,jj,jk) + 2._wp * znad )                     & 
     556                  &            * ( fsde3w(ji  ,jj+1,jk) - fsde3w(ji,jj,jk) ) / e2v(ji,jj) * vmask(ji,jj,jk-1) 
    425557               ! add to the general momentum trend 
    426                ua(ji,jj,jk) = ua(ji,jj,jk) + zhpi(ji,jj,jk) + zuap 
    427                va(ji,jj,jk) = va(ji,jj,jk) + zhpj(ji,jj,jk) + zvap 
     558               va(ji,jj,jk) = va(ji,jj,jk) + ( zhpj(ji,jj,jk) + zvap ) * vmask(ji,jj,jk) 
    428559            END DO 
    429560         END DO 
    430561      END DO 
    431       ! 
    432       CALL wrk_dealloc( jpi,jpj,jpk, zhpi, zhpj ) 
     562 
     563!==================================================================================      
     564!===== Compute bottom cell contribution (partial cell) ============================  
     565!================================================================================== 
     566 
     567# if defined key_vectopt_loop 
     568         jj = 1 
     569         DO ji = jpi+2, jpij-jpi-1   ! vector opt. (forced unrolling) 
     570# else 
     571      DO jj = 2, jpjm1 
     572         DO ji = 2, jpim1 
     573# endif 
     574            iku = mbku(ji,jj) 
     575            ikv = mbkv(ji,jj) 
     576 
     577            IF (iku .GT. 1) THEN 
     578               ! remove old value (interior case) 
     579               zuap            = -zcoef0 * ( rhd   (ji+1,jj  ,iku) + rhd   (ji,jj,iku) + 2._wp * znad )   & 
     580                     &                   * ( fsde3w(ji+1,jj  ,iku) - fsde3w(ji,jj,iku) ) / e1u(ji,jj) 
     581               ua(ji,jj,iku)   = ua(ji,jj,iku) - zhpi(ji,jj,iku) - zuap 
     582               ! put new value 
     583               ! -zpshpi to avoid double contribution of the partial step in the top layer  
     584               zuap            = -zcoef0 * ( aru(ji,jj) + 2._wp * znad ) * gzu(ji,jj)  / e1u(ji,jj) 
     585               zhpi(ji,jj,iku) =  zhpi(ji,jj,iku-1) + zcoef0 / e1u(ji,jj) * ge3ru(ji,jj) - zpshpi(ji,jj)  
     586               ua(ji,jj,iku)   =  ua(ji,jj,iku) + zhpi(ji,jj,iku) + zuap 
     587            END IF 
     588            ! v direction 
     589            IF (ikv .GT. 1) THEN 
     590               ! remove old value (interior case) 
     591               zvap            = -zcoef0 * ( rhd   (ji  ,jj+1,ikv) + rhd   (ji,jj,ikv) + 2._wp * znad )   & 
     592                     &                   * ( fsde3w(ji  ,jj+1,ikv) - fsde3w(ji,jj,ikv) )   / e2v(ji,jj) 
     593               va(ji,jj,ikv)   = va(ji,jj,ikv) - zhpj(ji,jj,ikv) - zvap 
     594               ! put new value 
     595               ! -zpshpj to avoid double contribution of the partial step in the top layer  
     596               zvap            = -zcoef0 * ( arv(ji,jj) + 2._wp * znad ) * gzv(ji,jj)     / e2v(ji,jj) 
     597               zhpj(ji,jj,ikv) =  zhpj(ji,jj,ikv-1) + zcoef0 / e2v(ji,jj) * ge3rv(ji,jj) - zpshpj(ji,jj)    
     598               va(ji,jj,ikv)   =  va(ji,jj,ikv) + zhpj(ji,jj,ikv) + zvap 
     599            END IF 
     600# if ! defined key_vectopt_loop 
     601         END DO 
     602# endif 
     603      END DO 
     604      
     605      ! set back to original density value into the ice shelf cell (maybe useless because it is masked) 
     606      rhd = zrhd 
     607      ! 
     608      CALL wrk_dealloc( jpi,jpj,2, ztstop) 
     609      CALL wrk_dealloc( jpi,jpj,jpk, zhpi, zhpj, zrhd) 
     610      CALL wrk_dealloc( jpi,jpj, ze3w, zp, zrhdtop_isf, zrhdtop_oce, ziceload, zdept, zpshpi, zpshpj) 
    433611      ! 
    434612   END SUBROUTINE hpg_sco 
     613 
    435614 
    436615   SUBROUTINE hpg_djc( kt ) 
     
    671850      !! 
    672851      !! ** Action : - Update (ua,va) with the now hydrastatic pressure trend 
    673       !!             - Save the trend (l_trddyn=T) 
    674       !! 
    675852      !!---------------------------------------------------------------------- 
    676853      INTEGER, PARAMETER  :: polynomial_type = 1    ! 1: cubic spline, 2: linear 
     
    724901 
    725902      ! Transfer the depth of "T(:,:,:)" to vertical coordinate "zdept(:,:,:)" 
    726       DO jj = 1, jpj;   DO ji = 1, jpi 
    727           zdept(ji,jj,1) = 0.5_wp * fse3w(ji,jj,1) - sshn(ji,jj) * znad 
    728       END DO        ;   END DO 
    729  
    730       DO jk = 2, jpk;   DO jj = 1, jpj;   DO ji = 1, jpi 
    731           zdept(ji,jj,jk) = zdept(ji,jj,jk-1) + fse3w(ji,jj,jk) 
    732       END DO        ;   END DO        ;   END DO 
    733  
    734       fsp(:,:,:) = zrhh(:,:,:) 
     903      DO jj = 1, jpj 
     904         DO ji = 1, jpi 
     905            zdept(ji,jj,1) = 0.5_wp * fse3w(ji,jj,1) - sshn(ji,jj) * znad 
     906         END DO 
     907      END DO 
     908 
     909      DO jk = 2, jpk 
     910         DO jj = 1, jpj 
     911            DO ji = 1, jpi 
     912               zdept(ji,jj,jk) = zdept(ji,jj,jk-1) + fse3w(ji,jj,jk) 
     913            END DO 
     914         END DO 
     915      END DO 
     916 
     917      fsp(:,:,:) = zrhh (:,:,:) 
    735918      xsp(:,:,:) = zdept(:,:,:) 
    736919 
     
    9331116   END SUBROUTINE hpg_prj 
    9341117 
     1118 
    9351119   SUBROUTINE cspline(fsp, xsp, asp, bsp, csp, dsp, polynomial_type) 
    9361120      !!---------------------------------------------------------------------- 
     
    9401124      !! 
    9411125      !! ** Method  :   f(x) = asp + bsp*x + csp*x^2 + dsp*x^3 
     1126      !! 
    9421127      !! Reference: CJC Kruger, Constrained Cubic Spline Interpoltation 
    943       !! 
    9441128      !!---------------------------------------------------------------------- 
    9451129      IMPLICIT NONE 
     
    9491133      INTEGER, INTENT(in) :: polynomial_type                        ! 1: cubic spline 
    9501134                                                                    ! 2: Linear 
    951  
    952       ! Local Variables 
     1135      ! 
    9531136      INTEGER  ::   ji, jj, jk                 ! dummy loop indices 
    9541137      INTEGER  ::   jpi, jpj, jpkm1 
     
    10401223      ENDIF 
    10411224 
    1042  
    10431225   END SUBROUTINE cspline 
    10441226 
     
    10501232      !! ** Purpose :   1-d linear interpolation 
    10511233      !! 
    1052       !! ** Method  : 
    1053       !!                interpolation is straight forward 
     1234      !! ** Method  :   interpolation is straight forward 
    10541235      !!                extrapolation is also permitted (no value limit) 
    1055       !! 
    10561236      !!---------------------------------------------------------------------- 
    10571237      IMPLICIT NONE 
     
    10701250   END FUNCTION interp1 
    10711251 
     1252 
    10721253   FUNCTION interp2(x, a, b, c, d)  RESULT(f) 
    10731254      !!---------------------------------------------------------------------- 
     
    11331314   END FUNCTION integ_spline 
    11341315 
    1135  
    11361316   !!====================================================================== 
    11371317END MODULE dynhpg 
Note: See TracChangeset for help on using the changeset viewer.