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 8568 for branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/DYN/dynhpg.F90 – NEMO

Ignore:
Timestamp:
2017-09-27T16:29:24+02:00 (7 years ago)
Author:
gm
Message:

#1911 (ENHANCE-09): PART I.2 - _NONE option + remove zts + see associated wiki page

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/DYN/dynhpg.F90

    r8215 r8568  
    4444   USE lib_mpp         ! MPP library 
    4545   USE eosbn2          ! compute density 
    46    USE wrk_nemo        ! Memory Allocation 
    4746   USE timing          ! Timing 
    4847   USE iom 
     
    8483      !!---------------------------------------------------------------------- 
    8584      INTEGER, INTENT(in) ::   kt   ! ocean time-step index 
    86       REAL(wp), POINTER, DIMENSION(:,:,:) ::  ztrdu, ztrdv 
    87       !!---------------------------------------------------------------------- 
    88       ! 
    89       IF( nn_timing == 1 )  CALL timing_start('dyn_hpg') 
     85      REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) ::   ztrdu, ztrdv 
     86      !!---------------------------------------------------------------------- 
     87      ! 
     88      IF( ln_timing )   CALL timing_start('dyn_hpg') 
    9089      ! 
    9190      IF( l_trddyn ) THEN                    ! Temporary saving of ua and va trends (l_trddyn) 
    92          CALL wrk_alloc( jpi,jpj,jpk, ztrdu, ztrdv ) 
     91         ALLOCATE( ztrdu(jpi,jpj,jpk) , ztrdv(jpi,jpj,jpk) ) 
    9392         ztrdu(:,:,:) = ua(:,:,:) 
    9493         ztrdv(:,:,:) = va(:,:,:) 
     
    108107         ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:) 
    109108         CALL trd_dyn( ztrdu, ztrdv, jpdyn_hpg, kt ) 
    110          CALL wrk_dealloc( jpi,jpj,jpk, ztrdu, ztrdv ) 
     109         DEALLOCATE( ztrdu , ztrdv ) 
    111110      ENDIF 
    112111      ! 
     
    114113         &                       tab3d_2=va, clinfo2=       ' Va: ', mask2=vmask, clinfo3='dyn' ) 
    115114      ! 
    116       IF( nn_timing == 1 )  CALL timing_stop('dyn_hpg') 
     115      IF( ln_timing )   CALL timing_stop('dyn_hpg') 
    117116      ! 
    118117   END SUBROUTINE dyn_hpg 
     
    134133      INTEGER  ::   ji, jj, jk, ikt    ! dummy loop indices      ISF 
    135134      REAL(wp) ::   znad 
    136       REAL(wp), POINTER, DIMENSION(:,:,:)   ::  ztstop, zrhd ! hypothesys on isf density 
    137       REAL(wp), POINTER, DIMENSION(:,:)     ::  zrhdtop_isf  ! density at bottom of ISF 
    138       REAL(wp), POINTER, DIMENSION(:,:)     ::  ziceload     ! density at bottom of ISF 
     135      REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) ::  zts_top, zrhd  ! hypothesys on isf density 
     136      REAL(wp), ALLOCATABLE, DIMENSION(:,:)   ::  zrhdtop_isf    ! density at bottom of ISF 
     137      REAL(wp), ALLOCATABLE, DIMENSION(:,:)   ::  ziceload       ! density at bottom of ISF 
    139138      !! 
    140139      NAMELIST/namdyn_hpg/ ln_hpg_zco, ln_hpg_zps, ln_hpg_sco,     & 
     
    165164      ! 
    166165      IF( ln_hpg_djc )   & 
    167          &   CALL ctl_stop('dyn_hpg_init : Density Jacobian: Cubic polynominal method & 
    168                            & currently disabled (bugs under investigation). Please select & 
    169                            & either  ln_hpg_sco or  ln_hpg_prj instead') 
    170       ! 
    171       IF( .NOT.ln_linssh .AND. .NOT.(ln_hpg_sco.OR.ln_hpg_prj.OR.ln_hpg_isf) )        & 
    172          &   CALL ctl_stop('dyn_hpg_init : non-linear free surface requires either ', & 
    173          &                 '   the standard jacobian formulation hpg_sco    or '    , & 
    174          &                 '   the pressure jacobian formulation hpg_prj'            ) 
    175  
    176       IF(       ln_hpg_isf .AND. .NOT. ln_isfcav )   & 
    177          &   CALL ctl_stop( ' hpg_isf not available if ln_isfcav = false ' ) 
    178       IF( .NOT. ln_hpg_isf .AND.       ln_isfcav )   & 
    179          &   CALL ctl_stop( 'Only hpg_isf has been corrected to work with ice shelf cavity.' ) 
     166         &   CALL ctl_stop('dyn_hpg_init : Density Jacobian: Cubic polynominal method',   & 
     167         &                 '   currently disabled (bugs under investigation).'        ,   & 
     168         &                 '   Please select either  ln_hpg_sco or  ln_hpg_prj instead' ) 
     169         ! 
     170      IF( .NOT.ln_linssh .AND. .NOT.(ln_hpg_sco.OR.ln_hpg_prj.OR.ln_hpg_isf) )          & 
     171         &   CALL ctl_stop('dyn_hpg_init : non-linear free surface requires either ',   & 
     172         &                 '   the standard jacobian formulation hpg_sco    or '    ,   & 
     173         &                 '   the pressure jacobian formulation hpg_prj'             ) 
     174         ! 
     175      IF( ln_hpg_isf ) THEN 
     176         IF( .NOT. ln_isfcav )   CALL ctl_stop( ' hpg_isf not available if ln_isfcav = false ' ) 
     177       ELSE 
     178         IF(       ln_isfcav )   CALL ctl_stop( 'Only hpg_isf has been corrected to work with ice shelf cavity.' ) 
     179      ENDIF 
    180180      ! 
    181181      !                               ! Set nhpg from ln_hpg_... flags 
     
    197197      IF( ioptio /= 1 )   CALL ctl_stop( 'NO or several hydrostatic pressure gradient options used' ) 
    198198      !  
    199       ! initialisation of ice shelf load 
    200       IF ( .NOT. ln_isfcav ) riceload(:,:)=0.0 
    201       IF (       ln_isfcav ) THEN 
    202          CALL wrk_alloc( jpi,jpj, 2,  ztstop)  
    203          CALL wrk_alloc( jpi,jpj,jpk, zrhd  ) 
    204          CALL wrk_alloc( jpi,jpj,     zrhdtop_isf, ziceload)  
     199      !                           
     200      IF ( .NOT. ln_isfcav ) THEN     !--- no ice shelf load 
     201         riceload(:,:) = 0._wp 
     202         ! 
     203      ELSE                            !--- set an ice shelf load 
    205204         ! 
    206205         IF(lwp) WRITE(numout,*) 
    207          IF(lwp) WRITE(numout,*) 'dyn:hpg_isf : hydrostatic pressure gradient trend for ice shelf' 
    208          IF(lwp) WRITE(numout,*) '~~~~~~~~~~~'   
    209  
    210          ! To use density and not density anomaly 
    211          znad=1._wp 
    212           
    213          ! assume water displaced by the ice shelf is at T=-1.9 and S=34.4 (rude) 
    214          ztstop(:,:,1)=-1.9_wp ; ztstop(:,:,2)=34.4_wp 
    215  
    216          ! compute density of the water displaced by the ice shelf  
    217          DO jk = 1, jpk 
    218             CALL eos(ztstop(:,:,:),gdept_n(:,:,jk),zrhd(:,:,jk)) 
    219          END DO 
    220        
    221          ! compute rhd at the ice/oce interface (ice shelf side) 
    222          CALL eos(ztstop,risfdep,zrhdtop_isf) 
    223  
    224          ! Surface value + ice shelf gradient 
    225          ! compute pressure due to ice shelf load (used to compute hpgi/j for all the level from 1 to miku/v) 
    226          ! divided by 2 later 
    227          ziceload = 0._wp 
    228          DO jj = 1, jpj 
    229             DO ji = 1, jpi 
    230                ikt=mikt(ji,jj) 
     206         IF(lwp) WRITE(numout,*) '   ice shelf case: set the ice-shelf load' 
     207         ALLOCATE( zts_top(jpi,jpj,jpts) , zrhd(jpi,jpj,jpk) , zrhdtop_isf(jpi,jpj) , ziceload(jpi,jpj) )  
     208         ! 
     209         znad = 1._wp                     !- To use density and not density anomaly 
     210         ! 
     211         !                                !- assume water displaced by the ice shelf is at T=-1.9 and S=34.4 (rude) 
     212         zts_top(:,:,jp_tem) = -1.9_wp   ;   zts_top(:,:,jp_sal) = 34.4_wp 
     213         ! 
     214         DO jk = 1, jpk                   !- compute density of the water displaced by the ice shelf  
     215            CALL eos( zts_top(:,:,:), gdept_n(:,:,jk), zrhd(:,:,jk) ) 
     216         END DO 
     217         ! 
     218         !                                !- compute rhd at the ice/oce interface (ice shelf side) 
     219         CALL eos( zts_top , risfdep, zrhdtop_isf ) 
     220         ! 
     221         !                                !- Surface value + ice shelf gradient 
     222         ziceload = 0._wp                       ! compute pressure due to ice shelf load  
     223         DO jj = 1, jpj                         ! (used to compute hpgi/j for all the level from 1 to miku/v) 
     224            DO ji = 1, jpi                      ! divided by 2 later 
     225               ikt = mikt(ji,jj) 
    231226               ziceload(ji,jj) = ziceload(ji,jj) + (znad + zrhd(ji,jj,1) ) * e3w_n(ji,jj,1) * (1._wp - tmask(ji,jj,1)) 
    232                DO jk=2,ikt-1 
     227               DO jk = 2, ikt-1 
    233228                  ziceload(ji,jj) = ziceload(ji,jj) + (2._wp * znad + zrhd(ji,jj,jk-1) + zrhd(ji,jj,jk)) * e3w_n(ji,jj,jk) & 
    234229                     &                              * (1._wp - tmask(ji,jj,jk)) 
    235230               END DO 
    236231               IF (ikt  >=  2) ziceload(ji,jj) = ziceload(ji,jj) + (2._wp * znad + zrhdtop_isf(ji,jj) + zrhd(ji,jj,ikt-1)) & 
    237                                   &                              * ( risfdep(ji,jj) - gdept_1d(ikt-1) ) 
    238             END DO 
    239          END DO 
    240          riceload(:,:)=ziceload(:,:)  ! need to be saved for diaar5 
    241  
    242          CALL wrk_dealloc( jpi,jpj, 2,  ztstop)  
    243          CALL wrk_dealloc( jpi,jpj,jpk, zrhd  ) 
    244          CALL wrk_dealloc( jpi,jpj,     zrhdtop_isf, ziceload)  
    245       END IF 
     232                  &                                              * ( risfdep(ji,jj) - gdept_1d(ikt-1) ) 
     233            END DO 
     234         END DO 
     235         riceload(:,:) = ziceload(:,:)  ! need to be saved for diaar5 
     236         ! 
     237         DEALLOCATE( zts_top , zrhd , zrhdtop_isf , ziceload )  
     238      ENDIF 
    246239      ! 
    247240   END SUBROUTINE dyn_hpg_init 
     
    268261      INTEGER  ::   ji, jj, jk       ! dummy loop indices 
    269262      REAL(wp) ::   zcoef0, zcoef1   ! temporary scalars 
    270       REAL(wp), POINTER, DIMENSION(:,:,:) ::  zhpi, zhpj 
    271       !!---------------------------------------------------------------------- 
    272       ! 
    273       CALL wrk_alloc( jpi,jpj,jpk,   zhpi, zhpj ) 
     263      REAL(wp), DIMENSION(jpi,jpj,jpk) ::  zhpi, zhpj 
     264      !!---------------------------------------------------------------------- 
    274265      ! 
    275266      IF( kt == nit000 ) THEN 
     
    315306      END DO 
    316307      ! 
    317       CALL wrk_dealloc( jpi,jpj,jpk,   zhpi, zhpj ) 
    318       ! 
    319308   END SUBROUTINE hpg_zco 
    320309 
     
    333322      INTEGER  ::   iku, ikv                         ! temporary integers 
    334323      REAL(wp) ::   zcoef0, zcoef1, zcoef2, zcoef3   ! temporary scalars 
    335       REAL(wp), POINTER, DIMENSION(:,:,:) ::  zhpi, zhpj 
    336       !!---------------------------------------------------------------------- 
    337       ! 
    338       CALL wrk_alloc( jpi,jpj,jpk,   zhpi, zhpj ) 
     324      REAL(wp), DIMENSION(jpi,jpj,jpk) ::  zhpi, zhpj 
     325      !!---------------------------------------------------------------------- 
    339326      ! 
    340327      IF( kt == nit000 ) THEN 
     
    405392      END DO 
    406393      ! 
    407       CALL wrk_dealloc( jpi,jpj,jpk,   zhpi, zhpj ) 
    408       ! 
    409394   END SUBROUTINE hpg_zps 
    410395 
     
    433418      REAL(wp) ::   zcoef0, zuap, zvap, znad, ztmp       ! temporary scalars 
    434419      LOGICAL  ::   ll_tmp1, ll_tmp2                     ! local logical variables 
    435       REAL(wp), POINTER, DIMENSION(:,:,:) ::  zhpi, zhpj 
    436       REAL(wp), POINTER, DIMENSION(:,:)   ::  zcpx, zcpy !W/D pressure filter 
    437       !!---------------------------------------------------------------------- 
    438       ! 
    439       CALL wrk_alloc( jpi,jpj,jpk, zhpi, zhpj ) 
    440       IF( ln_wd ) CALL wrk_alloc( jpi,jpj, zcpx, zcpy ) 
     420      REAL(wp), DIMENSION(jpi,jpj,jpk)      ::   zhpi, zhpj 
     421      REAL(wp), DIMENSION(:,:), ALLOCATABLE ::   zcpx, zcpy   !W/D pressure filter 
     422      !!---------------------------------------------------------------------- 
    441423      ! 
    442424      IF( kt == nit000 ) THEN 
     
    452434      ! 
    453435      IF( ln_wd ) THEN 
    454         DO jj = 2, jpjm1 
    455            DO ji = 2, jpim1  
    456              ll_tmp1 = MIN(   sshn(ji,jj)               ,   sshn(ji+1,jj) ) >                & 
     436         ALLOCATE( zcpx(jpi,jpj) , zcpy(jpi,jpj) ) 
     437         DO jj = 2, jpjm1 
     438            DO ji = 2, jpim1  
     439               ll_tmp1 = MIN(   sshn(ji,jj)               ,   sshn(ji+1,jj) ) >                & 
    457440                  &    MAX( -ht_wd(ji,jj)               , -ht_wd(ji+1,jj) ) .AND.            & 
    458441                  &    MAX(   sshn(ji,jj) + ht_wd(ji,jj),   sshn(ji+1,jj) + ht_wd(ji+1,jj) ) & 
    459442                  &                                                         > rn_wdmin1 + rn_wdmin2 
    460              ll_tmp2 = ( ABS( sshn(ji,jj)               -   sshn(ji+1,jj) ) > 1.E-12 ) .AND. (             & 
     443               ll_tmp2 = ( ABS( sshn(ji,jj)               -   sshn(ji+1,jj) ) > 1.E-12 ) .AND. (             & 
    461444                  &    MAX(   sshn(ji,jj)               ,   sshn(ji+1,jj) ) >                & 
    462445                  &    MAX( -ht_wd(ji,jj)               , -ht_wd(ji+1,jj) ) + rn_wdmin1 + rn_wdmin2 ) 
    463446 
    464              IF(ll_tmp1) THEN 
    465                zcpx(ji,jj) = 1.0_wp 
    466              ELSE IF(ll_tmp2) THEN 
    467                ! no worries about  sshn(ji+1,jj) -  sshn(ji  ,jj) = 0, it won't happen ! here 
    468                zcpx(ji,jj) = ABS( (sshn(ji+1,jj) + ht_wd(ji+1,jj) - sshn(ji,jj) - ht_wd(ji,jj)) & 
    469                            &    / (sshn(ji+1,jj) -  sshn(ji  ,jj)) ) 
    470              ELSE 
    471                zcpx(ji,jj) = 0._wp 
    472              END IF 
    473        
    474              ll_tmp1 = MIN(   sshn(ji,jj)               ,   sshn(ji,jj+1) ) >                & 
     447               IF(ll_tmp1) THEN 
     448                  zcpx(ji,jj) = 1.0_wp 
     449               ELSE IF(ll_tmp2) THEN 
     450                  ! no worries about  sshn(ji+1,jj) -  sshn(ji  ,jj) = 0, it won't happen ! here 
     451                  zcpx(ji,jj) = ABS(   ( sshn(ji+1,jj)+ht_wd(ji+1,jj) - sshn(ji,jj)-ht_wd(ji,jj) )  & 
     452                     &                / ( sshn(ji+1,jj)                - sshn(ji,jj)              )  ) 
     453               ELSE 
     454                  zcpx(ji,jj) = 0._wp 
     455               ENDIF 
     456               ! 
     457               ll_tmp1 = MIN(   sshn(ji,jj)               ,   sshn(ji,jj+1) ) >                & 
    475458                  &    MAX( -ht_wd(ji,jj)               , -ht_wd(ji,jj+1) ) .AND.            & 
    476459                  &    MAX(   sshn(ji,jj) + ht_wd(ji,jj),   sshn(ji,jj+1) + ht_wd(ji,jj+1) ) & 
    477460                  &                                                         > rn_wdmin1 + rn_wdmin2 
    478              ll_tmp2 = ( ABS( sshn(ji,jj)               -   sshn(ji,jj+1) ) > 1.E-12 ) .AND. (             & 
     461               ll_tmp2 = ( ABS( sshn(ji,jj)               -   sshn(ji,jj+1) ) > 1.E-12 ) .AND. (             & 
    479462                  &    MAX(   sshn(ji,jj)               ,   sshn(ji,jj+1) ) >                & 
    480463                  &    MAX( -ht_wd(ji,jj)               , -ht_wd(ji,jj+1) ) + rn_wdmin1 + rn_wdmin2 ) 
    481  
    482              IF(ll_tmp1) THEN 
    483                zcpy(ji,jj) = 1.0_wp 
    484              ELSE IF(ll_tmp2) THEN 
    485                ! no worries about  sshn(ji,jj+1) -  sshn(ji,jj  ) = 0, it won't happen ! here 
    486                zcpy(ji,jj) = ABS( (sshn(ji,jj+1) + ht_wd(ji,jj+1) - sshn(ji,jj) - ht_wd(ji,jj)) & 
    487                            &    / (sshn(ji,jj+1) -  sshn(ji,jj  )) ) 
    488              ELSE 
    489                zcpy(ji,jj) = 0._wp 
    490              END IF 
    491            END DO 
    492         END DO 
    493         CALL lbc_lnk( zcpx, 'U', 1._wp )    ;   CALL lbc_lnk( zcpy, 'V', 1._wp ) 
    494       END IF 
     464                  ! 
     465               IF(ll_tmp1) THEN 
     466                  zcpy(ji,jj) = 1.0_wp 
     467               ELSE IF(ll_tmp2) THEN 
     468                  ! no worries about  sshn(ji,jj+1) -  sshn(ji,jj  ) = 0, it won't happen ! here 
     469                  zcpy(ji,jj) = ABS(   ( sshn(ji,jj+1)+ht_wd(ji,jj+1) - sshn(ji,jj) - ht_wd(ji,jj) )  & 
     470                     &               / ( sshn(ji,jj+1)                - sshn(ji,jj)                )  ) 
     471               ELSE 
     472                  zcpy(ji,jj) = 0._wp 
     473               ENDIF 
     474            END DO 
     475         END DO 
     476         CALL lbc_lnk( zcpx, 'U', 1._wp )    ;   CALL lbc_lnk( zcpy, 'V', 1._wp ) 
     477      ENDIF 
    495478 
    496479      ! Surface value 
     
    507490            zvap = -zcoef0 * ( rhd    (ji,jj+1,1) + rhd    (ji,jj,1) + 2._wp * znad )   & 
    508491               &           * ( gde3w_n(ji,jj+1,1) - gde3w_n(ji,jj,1) ) * r1_e2v(ji,jj) 
    509  
    510  
     492            ! 
    511493            IF( ln_wd ) THEN 
    512  
    513               zhpi(ji,jj,1) = zhpi(ji,jj,1) * zcpx(ji,jj) 
    514               zhpj(ji,jj,1) = zhpj(ji,jj,1) * zcpy(ji,jj)  
    515               zuap = zuap * zcpx(ji,jj) 
    516               zvap = zvap * zcpy(ji,jj) 
     494               zhpi(ji,jj,1) = zhpi(ji,jj,1) * zcpx(ji,jj) 
     495               zhpj(ji,jj,1) = zhpj(ji,jj,1) * zcpy(ji,jj)  
     496               zuap = zuap * zcpx(ji,jj) 
     497               zvap = zvap * zcpy(ji,jj) 
    517498            ENDIF 
    518  
     499            ! 
    519500            ! add to the general momentum trend 
    520501            ua(ji,jj,1) = ua(ji,jj,1) + zhpi(ji,jj,1) + zuap 
     
    539520               zvap = -zcoef0 * ( rhd    (ji  ,jj+1,jk) + rhd    (ji,jj,jk) + 2._wp * znad )   & 
    540521                  &           * ( gde3w_n(ji  ,jj+1,jk) - gde3w_n(ji,jj,jk) ) * r1_e2v(ji,jj) 
    541  
     522               ! 
    542523               IF( ln_wd ) THEN 
    543                  zhpi(ji,jj,jk) = zhpi(ji,jj,jk) * zcpx(ji,jj) 
    544                  zhpj(ji,jj,jk) = zhpj(ji,jj,jk) * zcpy(ji,jj)  
    545                  zuap = zuap * zcpx(ji,jj) 
    546                  zvap = zvap * zcpy(ji,jj) 
    547                ENDIF 
    548  
     524                  zhpi(ji,jj,jk) = zhpi(ji,jj,jk) * zcpx(ji,jj) 
     525                  zhpj(ji,jj,jk) = zhpj(ji,jj,jk) * zcpy(ji,jj)  
     526                  zuap = zuap * zcpx(ji,jj) 
     527                  zvap = zvap * zcpy(ji,jj) 
     528               ENDIF 
     529               ! 
    549530               ! add to the general momentum trend 
    550531               ua(ji,jj,jk) = ua(ji,jj,jk) + zhpi(ji,jj,jk) + zuap 
     
    554535      END DO 
    555536      ! 
    556       CALL wrk_dealloc( jpi,jpj,jpk, zhpi, zhpj ) 
    557       IF( ln_wd ) CALL wrk_dealloc( jpi,jpj, zcpx, zcpy ) 
     537      IF( ln_wd )   DEALLOCATE( zcpx , zcpy ) 
    558538      ! 
    559539   END SUBROUTINE hpg_sco 
     
    583563      INTEGER  ::   ji, jj, jk, ikt, iktp1i, iktp1j   ! dummy loop indices 
    584564      REAL(wp) ::   zcoef0, zuap, zvap, znad          ! temporary scalars 
    585       REAL(wp), POINTER, DIMENSION(:,:,:)   ::  zhpi, zhpj 
    586       REAL(wp), POINTER, DIMENSION(:,:,:)   ::  ztstop 
    587       REAL(wp), POINTER, DIMENSION(:,:)     ::  zrhdtop_oce 
    588       !!---------------------------------------------------------------------- 
    589       ! 
    590       CALL wrk_alloc( jpi,jpj,  2, ztstop)  
    591       CALL wrk_alloc( jpi,jpj,jpk, zhpi, zhpj) 
    592       CALL wrk_alloc( jpi,jpj,     zrhdtop_oce ) 
    593       ! 
    594       ! Local constant initialization 
    595       zcoef0 = - grav * 0.5_wp 
    596    
    597       ! To use density and not density anomaly 
    598       znad=1._wp 
    599  
    600       ! iniitialised to 0. zhpi zhpi  
    601       zhpi(:,:,:)=0._wp ; zhpj(:,:,:)=0._wp 
     565      REAL(wp), DIMENSION(jpi,jpj,jpk ) ::  zhpi, zhpj 
     566      REAL(wp), DIMENSION(jpi,jpj,jpts) ::  zts_top 
     567      REAL(wp), DIMENSION(jpi,jpj)      ::  zrhdtop_oce 
     568      !!---------------------------------------------------------------------- 
     569      ! 
     570      zcoef0 = - grav * 0.5_wp   ! Local constant initialization 
     571      ! 
     572      znad=1._wp                 ! To use density and not density anomaly 
     573      ! 
     574      !                          ! iniitialised to 0. zhpi zhpi  
     575      zhpi(:,:,:) = 0._wp   ;   zhpj(:,:,:) = 0._wp 
    602576 
    603577      ! compute rhd at the ice/oce interface (ocean side) 
    604578      ! usefull to reduce residual current in the test case ISOMIP with no melting 
    605       DO ji=1,jpi 
    606         DO jj=1,jpj 
    607           ikt=mikt(ji,jj) 
    608           ztstop(ji,jj,1)=tsn(ji,jj,ikt,1) 
    609           ztstop(ji,jj,2)=tsn(ji,jj,ikt,2) 
     579      DO ji = 1, jpi 
     580        DO jj = 1, jpj 
     581          ikt = mikt(ji,jj) 
     582          zts_top(ji,jj,1) = tsn(ji,jj,ikt,1) 
     583          zts_top(ji,jj,2) = tsn(ji,jj,ikt,2) 
    610584        END DO 
    611585      END DO 
    612       CALL eos( ztstop, risfdep, zrhdtop_oce ) 
     586      CALL eos( zts_top, risfdep, zrhdtop_oce ) 
    613587 
    614588!==================================================================================      
     
    667641         END DO 
    668642      END DO 
    669      ! 
    670       CALL wrk_dealloc( jpi,jpj,2  , ztstop) 
    671       CALL wrk_dealloc( jpi,jpj,jpk, zhpi, zhpj) 
    672       CALL wrk_dealloc( jpi,jpj    , zrhdtop_oce ) 
    673643      ! 
    674644   END SUBROUTINE hpg_isf 
     
    690660      REAL(wp) ::   z1_12, cffv, cffy   !    "         " 
    691661      LOGICAL  ::   ll_tmp1, ll_tmp2    ! local logical variables 
    692       REAL(wp), POINTER, DIMENSION(:,:,:) ::  zhpi, zhpj 
    693       REAL(wp), POINTER, DIMENSION(:,:,:) ::  dzx, dzy, dzz, dzu, dzv, dzw 
    694       REAL(wp), POINTER, DIMENSION(:,:,:) ::  drhox, drhoy, drhoz, drhou, drhov, drhow 
    695       REAL(wp), POINTER, DIMENSION(:,:,:) ::  rho_i, rho_j, rho_k 
    696       REAL(wp), POINTER, DIMENSION(:,:)   ::  zcpx, zcpy    !W/D pressure filter 
    697       !!---------------------------------------------------------------------- 
    698       ! 
    699       CALL wrk_alloc( jpi, jpj, jpk, dzx  , dzy  , dzz  , dzu  , dzv  , dzw   ) 
    700       CALL wrk_alloc( jpi, jpj, jpk, drhox, drhoy, drhoz, drhou, drhov, drhow ) 
    701       CALL wrk_alloc( jpi, jpj, jpk, rho_i, rho_j, rho_k,  zhpi,  zhpj        ) 
    702       IF( ln_wd ) CALL wrk_alloc( jpi,jpj, zcpx, zcpy ) 
    703       ! 
     662      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   zhpi, zhpj 
     663      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   dzx, dzy, dzz, dzu, dzv, dzw 
     664      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   drhox, drhoy, drhoz, drhou, drhov, drhow 
     665      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   rho_i, rho_j, rho_k 
     666      REAL(wp), DIMENSION(:,:), ALLOCATABLE ::   zcpx, zcpy   !W/D pressure filter 
     667      !!---------------------------------------------------------------------- 
    704668      ! 
    705669      IF( ln_wd ) THEN 
    706         DO jj = 2, jpjm1 
    707            DO ji = 2, jpim1  
    708              ll_tmp1 = MIN(   sshn(ji,jj)               ,   sshn(ji+1,jj) ) >                & 
     670         ALLOCATE( zcpx(jpi,jpj) , zcpy(jpi,jpj) ) 
     671         DO jj = 2, jpjm1 
     672            DO ji = 2, jpim1  
     673               ll_tmp1 = MIN(   sshn(ji,jj)               ,   sshn(ji+1,jj) ) >                & 
    709674                  &    MAX( -ht_wd(ji,jj)               , -ht_wd(ji+1,jj) ) .AND.            & 
    710675                  &    MAX(   sshn(ji,jj) + ht_wd(ji,jj),   sshn(ji+1,jj) + ht_wd(ji+1,jj) ) & 
    711676                  &                                                         > rn_wdmin1 + rn_wdmin2 
    712              ll_tmp2 = ( ABS( sshn(ji,jj)               -   sshn(ji+1,jj) ) > 1.E-12 ) .AND. (             & 
     677               ll_tmp2 = ( ABS( sshn(ji,jj)               -   sshn(ji+1,jj) ) > 1.E-12 ) .AND. (             & 
    713678                  &    MAX(   sshn(ji,jj)               ,   sshn(ji+1,jj) ) >                & 
    714679                  &    MAX( -ht_wd(ji,jj)               , -ht_wd(ji+1,jj) ) + rn_wdmin1 + rn_wdmin2 ) 
    715680 
    716              IF(ll_tmp1) THEN 
    717                zcpx(ji,jj) = 1.0_wp 
    718              ELSE IF(ll_tmp2) THEN 
    719                ! no worries about  sshn(ji+1,jj) -  sshn(ji  ,jj) = 0, it won't happen ! here 
    720                zcpx(ji,jj) = ABS( (sshn(ji+1,jj) + ht_wd(ji+1,jj) - sshn(ji,jj) - ht_wd(ji,jj)) & 
    721                            &    / (sshn(ji+1,jj) -  sshn(ji  ,jj)) ) 
    722              ELSE 
    723                zcpx(ji,jj) = 0._wp 
    724              END IF 
     681               IF(ll_tmp1) THEN 
     682                  zcpx(ji,jj) = 1.0_wp 
     683               ELSE IF(ll_tmp2) THEN 
     684                  ! no worries about  sshn(ji+1,jj) -  sshn(ji  ,jj) = 0, it won't happen ! here 
     685                  zcpx(ji,jj) = ABS( (sshn(ji+1,jj) + ht_wd(ji+1,jj) - sshn(ji,jj) - ht_wd(ji,jj)) & 
     686                              &    / (sshn(ji+1,jj) -  sshn(ji  ,jj)) ) 
     687               ELSE 
     688                  zcpx(ji,jj) = 0._wp 
     689               ENDIF 
    725690       
    726              ll_tmp1 = MIN(   sshn(ji,jj)               ,   sshn(ji,jj+1) ) >                & 
     691               ll_tmp1 = MIN(   sshn(ji,jj)               ,   sshn(ji,jj+1) ) >                & 
    727692                  &    MAX( -ht_wd(ji,jj)               , -ht_wd(ji,jj+1) ) .AND.            & 
    728693                  &    MAX(   sshn(ji,jj) + ht_wd(ji,jj),   sshn(ji,jj+1) + ht_wd(ji,jj+1) ) & 
    729694                  &                                                         > rn_wdmin1 + rn_wdmin2 
    730              ll_tmp2 = ( ABS( sshn(ji,jj)               -   sshn(ji,jj+1) ) > 1.E-12 ) .AND. (             & 
     695               ll_tmp2 = ( ABS( sshn(ji,jj)               -   sshn(ji,jj+1) ) > 1.E-12 ) .AND. (             & 
    731696                  &    MAX(   sshn(ji,jj)               ,   sshn(ji,jj+1) ) >                & 
    732697                  &    MAX( -ht_wd(ji,jj)               , -ht_wd(ji,jj+1) ) + rn_wdmin1 + rn_wdmin2 ) 
    733698 
    734              IF(ll_tmp1) THEN 
    735                zcpy(ji,jj) = 1.0_wp 
    736              ELSE IF(ll_tmp2) THEN 
    737                ! no worries about  sshn(ji,jj+1) -  sshn(ji,jj  ) = 0, it won't happen ! here 
    738                zcpy(ji,jj) = ABS( (sshn(ji,jj+1) + ht_wd(ji,jj+1) - sshn(ji,jj) - ht_wd(ji,jj)) & 
    739                            &    / (sshn(ji,jj+1) -  sshn(ji,jj  )) ) 
    740              ELSE 
    741                zcpy(ji,jj) = 0._wp 
    742              END IF 
    743            END DO 
    744         END DO 
    745         CALL lbc_lnk( zcpx, 'U', 1._wp )    ;   CALL lbc_lnk( zcpy, 'V', 1._wp ) 
    746       END IF 
     699               IF(ll_tmp1) THEN 
     700                  zcpy(ji,jj) = 1.0_wp 
     701               ELSE IF(ll_tmp2) THEN 
     702                  ! no worries about  sshn(ji,jj+1) -  sshn(ji,jj  ) = 0, it won't happen ! here 
     703                  zcpy(ji,jj) = ABS( (sshn(ji,jj+1) + ht_wd(ji,jj+1) - sshn(ji,jj) - ht_wd(ji,jj)) & 
     704                              &    / (sshn(ji,jj+1) -  sshn(ji,jj  )) ) 
     705               ELSE 
     706                  zcpy(ji,jj) = 0._wp 
     707               ENDIF 
     708            END DO 
     709         END DO 
     710         CALL lbc_lnk( zcpx, 'U', 1._wp )    ;   CALL lbc_lnk( zcpy, 'V', 1._wp ) 
     711      ENDIF 
    747712 
    748713      IF( kt == nit000 ) THEN 
     
    903868         END DO 
    904869      END DO 
    905       CALL lbc_lnk(rho_k,'W',1.) 
    906       CALL lbc_lnk(rho_i,'U',1.) 
    907       CALL lbc_lnk(rho_j,'V',1.) 
     870      CALL lbc_lnk( rho_k, 'W', 1. ) 
     871      CALL lbc_lnk( rho_i, 'U', 1. ) 
     872      CALL lbc_lnk( rho_j, 'V', 1. ) 
    908873 
    909874 
     
    949914      END DO 
    950915      ! 
    951       CALL wrk_dealloc( jpi, jpj, jpk, dzx  , dzy  , dzz  , dzu  , dzv  , dzw   ) 
    952       CALL wrk_dealloc( jpi, jpj, jpk, drhox, drhoy, drhoz, drhou, drhov, drhow ) 
    953       CALL wrk_dealloc( jpi, jpj, jpk, rho_i, rho_j, rho_k,  zhpi,  zhpj        ) 
    954       IF( ln_wd ) CALL wrk_dealloc( jpi,jpj, zcpx, zcpy ) 
     916      IF( ln_wd )   DEALLOCATE( zcpx, zcpy ) 
    955917      ! 
    956918   END SUBROUTINE hpg_djc 
     
    980942      REAL(wp) :: zrhdt1 
    981943      REAL(wp) :: zdpdx1, zdpdx2, zdpdy1, zdpdy2 
    982       REAL(wp), POINTER, DIMENSION(:,:,:) ::   zdept, zrhh 
    983       REAL(wp), POINTER, DIMENSION(:,:,:) ::   zhpi, zu, zv, fsp, xsp, asp, bsp, csp, dsp 
    984       REAL(wp), POINTER, DIMENSION(:,:)   ::   zsshu_n, zsshv_n 
    985       REAL(wp), POINTER, DIMENSION(:,:)   ::  zcpx, zcpy    !W/D pressure filter 
    986       !!---------------------------------------------------------------------- 
    987       ! 
    988       CALL wrk_alloc( jpi,jpj,jpk,   zhpi, zu, zv, fsp, xsp, asp, bsp, csp, dsp ) 
    989       CALL wrk_alloc( jpi,jpj,jpk,   zdept, zrhh ) 
    990       CALL wrk_alloc( jpi,jpj,       zsshu_n, zsshv_n ) 
    991       IF( ln_wd ) CALL wrk_alloc( jpi,jpj, zcpx, zcpy ) 
     944      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   zdept, zrhh 
     945      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   zhpi, zu, zv, fsp, xsp, asp, bsp, csp, dsp 
     946      REAL(wp), DIMENSION(jpi,jpj)   ::   zsshu_n, zsshv_n 
     947      REAL(wp), DIMENSION(:,:), ALLOCATABLE ::   zcpx, zcpy   !W/D pressure filter 
     948      !!---------------------------------------------------------------------- 
    992949      ! 
    993950      IF( kt == nit000 ) THEN 
     
    1003960 
    1004961      IF( ln_wd ) THEN 
    1005         DO jj = 2, jpjm1 
    1006            DO ji = 2, jpim1  
    1007              ll_tmp1 = MIN(   sshn(ji,jj)               ,   sshn(ji+1,jj) ) >                & 
     962         ALLOCATE( zcpx(jpi,jpj) , zcpy(jpi,jpj) ) 
     963         DO jj = 2, jpjm1 
     964            DO ji = 2, jpim1  
     965               ll_tmp1 = MIN(   sshn(ji,jj)               ,   sshn(ji+1,jj) ) >                & 
    1008966                  &    MAX( -ht_wd(ji,jj)               , -ht_wd(ji+1,jj) ) .AND.            & 
    1009967                  &    MAX(   sshn(ji,jj) + ht_wd(ji,jj),   sshn(ji+1,jj) + ht_wd(ji+1,jj) ) & 
    1010968                  &                                                         > rn_wdmin1 + rn_wdmin2 
    1011              ll_tmp2 = ( ABS( sshn(ji,jj)               -   sshn(ji+1,jj) ) > 1.E-12 ) .AND. (             & 
     969               ll_tmp2 = ( ABS( sshn(ji,jj)               -   sshn(ji+1,jj) ) > 1.E-12 ) .AND. (             & 
    1012970                  &    MAX(   sshn(ji,jj)               ,   sshn(ji+1,jj) ) >                & 
    1013971                  &    MAX( -ht_wd(ji,jj)               , -ht_wd(ji+1,jj) ) + rn_wdmin1 + rn_wdmin2 ) 
    1014972 
    1015              IF(ll_tmp1) THEN 
    1016                zcpx(ji,jj) = 1.0_wp 
    1017              ELSE IF(ll_tmp2) THEN 
    1018                ! no worries about  sshn(ji+1,jj) -  sshn(ji  ,jj) = 0, it won't happen ! here 
    1019                zcpx(ji,jj) = ABS( (sshn(ji+1,jj) + ht_wd(ji+1,jj) - sshn(ji,jj) - ht_wd(ji,jj)) & 
    1020                            &    / (sshn(ji+1,jj) -  sshn(ji  ,jj)) ) 
    1021              ELSE 
    1022                zcpx(ji,jj) = 0._wp 
    1023              END IF 
     973               IF(ll_tmp1) THEN 
     974                  zcpx(ji,jj) = 1.0_wp 
     975               ELSE IF(ll_tmp2) THEN 
     976                  ! no worries about  sshn(ji+1,jj) -  sshn(ji  ,jj) = 0, it won't happen ! here 
     977                  zcpx(ji,jj) = ABS( (sshn(ji+1,jj) + ht_wd(ji+1,jj) - sshn(ji,jj) - ht_wd(ji,jj)) & 
     978                             &    / (sshn(ji+1,jj) -  sshn(ji  ,jj)) ) 
     979               ELSE 
     980                  zcpx(ji,jj) = 0._wp 
     981               ENDIF 
    1024982       
    1025              ll_tmp1 = MIN(   sshn(ji,jj)               ,   sshn(ji,jj+1) ) >                & 
     983               ll_tmp1 = MIN(   sshn(ji,jj)             ,   sshn(ji,jj+1) ) >                & 
    1026984                  &    MAX( -ht_wd(ji,jj)               , -ht_wd(ji,jj+1) ) .AND.            & 
    1027985                  &    MAX(   sshn(ji,jj) + ht_wd(ji,jj),   sshn(ji,jj+1) + ht_wd(ji,jj+1) ) & 
    1028986                  &                                                         > rn_wdmin1 + rn_wdmin2 
    1029              ll_tmp2 = ( ABS( sshn(ji,jj)               -   sshn(ji,jj+1) ) > 1.E-12 ) .AND. (             & 
     987               ll_tmp2 = ( ABS( sshn(ji,jj)             -   sshn(ji,jj+1) ) > 1.E-12 ) .AND. (             & 
    1030988                  &    MAX(   sshn(ji,jj)               ,   sshn(ji,jj+1) ) >                & 
    1031989                  &    MAX( -ht_wd(ji,jj)               , -ht_wd(ji,jj+1) ) + rn_wdmin1 + rn_wdmin2 ) 
    1032990 
    1033              IF(ll_tmp1) THEN 
    1034                zcpy(ji,jj) = 1.0_wp 
    1035              ELSE IF(ll_tmp2) THEN 
    1036                ! no worries about  sshn(ji,jj+1) -  sshn(ji,jj  ) = 0, it won't happen ! here 
    1037                zcpy(ji,jj) = ABS( (sshn(ji,jj+1) + ht_wd(ji,jj+1) - sshn(ji,jj) - ht_wd(ji,jj)) & 
     991               IF(ll_tmp1) THEN 
     992                  zcpy(ji,jj) = 1.0_wp 
     993               ELSE IF(ll_tmp2) THEN 
     994                  ! no worries about  sshn(ji,jj+1) -  sshn(ji,jj  ) = 0, it won't happen ! here 
     995                  zcpy(ji,jj) = ABS( (sshn(ji,jj+1) + ht_wd(ji,jj+1) - sshn(ji,jj) - ht_wd(ji,jj)) & 
    1038996                           &    / (sshn(ji,jj+1) -  sshn(ji,jj  )) ) 
    1039              ELSE 
    1040                zcpy(ji,jj) = 0._wp 
    1041              END IF 
    1042            END DO 
    1043         END DO 
    1044         CALL lbc_lnk( zcpx, 'U', 1._wp )    ;   CALL lbc_lnk( zcpy, 'V', 1._wp ) 
    1045       END IF 
     997               ELSE 
     998                  zcpy(ji,jj) = 0._wp 
     999               ENDIF 
     1000            END DO 
     1001         END DO 
     1002         CALL lbc_lnk( zcpx, 'U', 1._wp )    ;   CALL lbc_lnk( zcpy, 'V', 1._wp ) 
     1003      ENDIF 
    10461004 
    10471005      ! Clean 3-D work arrays 
     
    12981256      END DO 
    12991257      ! 
    1300       CALL wrk_dealloc( jpi,jpj,jpk,   zhpi, zu, zv, fsp, xsp, asp, bsp, csp, dsp ) 
    1301       CALL wrk_dealloc( jpi,jpj,jpk,   zdept, zrhh ) 
    1302       CALL wrk_dealloc( jpi,jpj,       zsshu_n, zsshv_n ) 
    1303       IF( ln_wd ) CALL wrk_dealloc( jpi,jpj, zcpx, zcpy ) 
     1258      IF( ln_wd )   DEALLOCATE( zcpx, zcpy ) 
    13041259      ! 
    13051260   END SUBROUTINE hpg_prj 
     
    13531308           !!Simply geometric average 
    13541309               DO jk = 2, jpkm1-1 
    1355                   zdf1 = (fsp(ji,jj,jk) - fsp(ji,jj,jk-1)) / (xsp(ji,jj,jk) - xsp(ji,jj,jk-1)) 
    1356                   zdf2 = (fsp(ji,jj,jk+1) - fsp(ji,jj,jk)) / (xsp(ji,jj,jk+1) - xsp(ji,jj,jk)) 
     1310                  zdf1 = (fsp(ji,jj,jk  ) - fsp(ji,jj,jk-1)) / (xsp(ji,jj,jk  ) - xsp(ji,jj,jk-1)) 
     1311                  zdf2 = (fsp(ji,jj,jk+1) - fsp(ji,jj,jk  )) / (xsp(ji,jj,jk+1) - xsp(ji,jj,jk  )) 
    13571312 
    13581313                  IF(zdf1 * zdf2 <= 0._wp) THEN 
     
    14031358            END DO 
    14041359         END DO 
    1405  
     1360         ! 
    14061361      ELSE 
    1407            CALL ctl_stop( 'invalid polynomial type in cspline' ) 
    1408       ENDIF 
    1409  
     1362         CALL ctl_stop( 'invalid polynomial type in cspline' ) 
     1363      ENDIF 
     1364      ! 
    14101365   END SUBROUTINE cspline 
    14111366 
Note: See TracChangeset for help on using the changeset viewer.