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 5208 for branches/2014/dev_r4650_UKMO11_restart_functionality/NEMOGCM/NEMO/LIM_SRC_3/limtrp.F90 – NEMO

Ignore:
Timestamp:
2015-04-13T15:08:59+02:00 (9 years ago)
Author:
davestorkey
Message:

Merge in changes from trunk up to 5021.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/2014/dev_r4650_UKMO11_restart_functionality/NEMOGCM/NEMO/LIM_SRC_3/limtrp.F90

    r4688 r5208  
    3737   PUBLIC   lim_trp    ! called by ice_step 
    3838 
    39    REAL(wp)  ::   epsi10 = 1.e-10_wp   
    40    REAL(wp)  ::   epsi20 = 1.e-20_wp   
    41  
    4239   !! * Substitution 
    4340#  include "vectopt_loop_substitute.h90" 
     
    6360      INTEGER, INTENT(in) ::   kt   ! number of iteration 
    6461      ! 
    65       INTEGER  ::   ji, jj, jk, jl, layer   ! dummy loop indices 
     62      INTEGER  ::   ji, jj, jk, jl, jn      ! dummy loop indices 
    6663      INTEGER  ::   initad                  ! number of sub-timestep for the advection 
    67       INTEGER  ::   ierr                    ! error status 
    68       REAL(wp) ::   zindb  , zindsn , zindic, zindh, zinda      ! local scalar 
    69       REAL(wp) ::   zcfl , zusnit                 !   -      - 
    70       REAL(wp) ::   zsal   , zage          !   -      - 
     64      REAL(wp) ::   zcfl , zusnit           !   -      - 
    7165      ! 
    7266      REAL(wp), POINTER, DIMENSION(:,:)      ::   zui_u, zvi_v, zsm, zs0at, zs0ow 
    7367      REAL(wp), POINTER, DIMENSION(:,:,:)    ::   zs0ice, zs0sn, zs0a, zs0c0 , zs0sm , zs0oi 
    7468      REAL(wp), POINTER, DIMENSION(:,:,:,:)  ::   zs0e 
    75       ! mass and salt flux (clem) 
    76       REAL(wp), POINTER, DIMENSION(:,:,:) ::   zviold, zvsold   ! old ice volume... 
    77       REAL(wp), POINTER, DIMENSION(:,:,:) ::   zaiold, zhimax   ! old ice concentration and thickness 
    78       REAL(wp), POINTER, DIMENSION(:,:)   ::   zeiold, zesold   ! old enthalpies 
     69      REAL(wp), POINTER, DIMENSION(:,:,:)    ::   zviold, zvsold   ! old ice volume... 
     70      REAL(wp), POINTER, DIMENSION(:,:,:)    ::   zaiold, zhimax   ! old ice concentration and thickness 
     71      REAL(wp), POINTER, DIMENSION(:,:)      ::   zeiold, zesold   ! old enthalpies 
    7972      REAL(wp) :: zdv, zda, zvi, zvs, zsmv, zes, zei 
    8073      ! 
     
    8578      CALL wrk_alloc( jpi, jpj, zui_u, zvi_v, zsm, zs0at, zs0ow, zeiold, zesold ) 
    8679      CALL wrk_alloc( jpi, jpj, jpl, zs0ice, zs0sn, zs0a, zs0c0 , zs0sm , zs0oi ) 
    87       CALL wrk_alloc( jpi, jpj, jkmax, jpl, zs0e ) 
     80      CALL wrk_alloc( jpi, jpj, nlay_i+1, jpl, zs0e ) 
    8881 
    8982      CALL wrk_alloc( jpi, jpj, jpl, zaiold, zhimax, zviold, zvsold )   ! clem 
     
    167160 
    168161         IF( MOD( ( kt - 1) / nn_fsbc , 2 ) == 0 ) THEN       !==  odd ice time step:  adv_x then adv_y  ==! 
    169             DO jk = 1,initad 
     162            DO jn = 1,initad 
    170163               CALL lim_adv_x( zusnit, u_ice, 1._wp , zsm, zs0ow (:,:), sxopw(:,:),   &             !--- ice open water area 
    171164                  &                                       sxxopw(:,:), syopw(:,:), syyopw(:,:), sxyopw(:,:)  ) 
     
    197190                  CALL lim_adv_y( zusnit, v_ice, 0._wp, zsm, zs0c0 (:,:,jl), sxc0 (:,:,jl),   & 
    198191                     &                                       sxxc0 (:,:,jl), syc0 (:,:,jl), syyc0 (:,:,jl), sxyc0 (:,:,jl)  ) 
    199                   DO layer = 1, nlay_i                                                           !--- ice heat contents --- 
    200                      CALL lim_adv_x( zusnit, u_ice, 1._wp , zsm, zs0e(:,:,layer,jl), sxe (:,:,layer,jl),   &  
    201                         &                                       sxxe(:,:,layer,jl), sye (:,:,layer,jl),   & 
    202                         &                                       syye(:,:,layer,jl), sxye(:,:,layer,jl) ) 
    203                      CALL lim_adv_y( zusnit, v_ice, 0._wp, zsm, zs0e(:,:,layer,jl), sxe (:,:,layer,jl),   &  
    204                         &                                       sxxe(:,:,layer,jl), sye (:,:,layer,jl),   & 
    205                         &                                       syye(:,:,layer,jl), sxye(:,:,layer,jl) ) 
     192                  DO jk = 1, nlay_i                                                           !--- ice heat contents --- 
     193                     CALL lim_adv_x( zusnit, u_ice, 1._wp , zsm, zs0e(:,:,jk,jl), sxe (:,:,jk,jl),   &  
     194                        &                                       sxxe(:,:,jk,jl), sye (:,:,jk,jl),   & 
     195                        &                                       syye(:,:,jk,jl), sxye(:,:,jk,jl) ) 
     196                     CALL lim_adv_y( zusnit, v_ice, 0._wp, zsm, zs0e(:,:,jk,jl), sxe (:,:,jk,jl),   &  
     197                        &                                       sxxe(:,:,jk,jl), sye (:,:,jk,jl),   & 
     198                        &                                       syye(:,:,jk,jl), sxye(:,:,jk,jl) ) 
    206199                  END DO 
    207200               END DO 
    208201            END DO 
    209202         ELSE 
    210             DO jk = 1, initad 
     203            DO jn = 1, initad 
    211204               CALL lim_adv_y( zusnit, v_ice, 1._wp , zsm, zs0ow (:,:), sxopw(:,:),   &             !--- ice open water area 
    212205                  &                                       sxxopw(:,:), syopw(:,:), syyopw(:,:), sxyopw(:,:)  ) 
     
    239232                  CALL lim_adv_x( zusnit, u_ice, 0._wp, zsm, zs0c0 (:,:,jl), sxc0 (:,:,jl),   & 
    240233                     &                                       sxxc0 (:,:,jl), syc0 (:,:,jl), syyc0 (:,:,jl), sxyc0 (:,:,jl)  ) 
    241                   DO layer = 1, nlay_i                                                           !--- ice heat contents --- 
    242                      CALL lim_adv_y( zusnit, v_ice, 1._wp , zsm, zs0e(:,:,layer,jl), sxe (:,:,layer,jl),   &  
    243                         &                                       sxxe(:,:,layer,jl), sye (:,:,layer,jl),   & 
    244                         &                                       syye(:,:,layer,jl), sxye(:,:,layer,jl) ) 
    245                      CALL lim_adv_x( zusnit, u_ice, 0._wp, zsm, zs0e(:,:,layer,jl), sxe (:,:,layer,jl),   &  
    246                         &                                       sxxe(:,:,layer,jl), sye (:,:,layer,jl),   & 
    247                         &                                       syye(:,:,layer,jl), sxye(:,:,layer,jl) ) 
     234                  DO jk = 1, nlay_i                                                           !--- ice heat contents --- 
     235                     CALL lim_adv_y( zusnit, v_ice, 1._wp , zsm, zs0e(:,:,jk,jl), sxe (:,:,jk,jl),   &  
     236                        &                                       sxxe(:,:,jk,jl), sye (:,:,jk,jl),   & 
     237                        &                                       syye(:,:,jk,jl), sxye(:,:,jk,jl) ) 
     238                     CALL lim_adv_x( zusnit, u_ice, 0._wp, zsm, zs0e(:,:,jk,jl), sxe (:,:,jk,jl),   &  
     239                        &                                       sxxe(:,:,jk,jl), sye (:,:,jk,jl),   & 
     240                        &                                       syye(:,:,jk,jl), sxye(:,:,jk,jl) ) 
    248241                  END DO 
    249242               END DO 
     
    341334            DO jj = 1, jpj 
    342335               DO ji = 1, jpi 
    343                   zindb= MAX( 0._wp , SIGN( 1._wp, zs0a(ji,jj,jl) - epsi10 ) ) 
     336                  rswitch = MAX( 0._wp , SIGN( 1._wp, zs0a(ji,jj,jl) - epsi10 ) ) 
    344337 
    345338                  zvi  = zs0ice(ji,jj,jl) 
     
    349342                  ! 
    350343                  ! Remove very small areas 
    351                   v_s(ji,jj,jl)   = zindb * zs0sn (ji,jj,jl)  
    352                   v_i(ji,jj,jl)   = zindb * zs0ice(ji,jj,jl) 
    353                   a_i(ji,jj,jl)   = zindb * zs0a  (ji,jj,jl) 
    354                   e_s(ji,jj,1,jl) = zindb * zs0c0 (ji,jj,jl)       
     344                  v_s(ji,jj,jl)   = rswitch * zs0sn (ji,jj,jl)  
     345                  v_i(ji,jj,jl)   = rswitch * zs0ice(ji,jj,jl) 
     346                  a_i(ji,jj,jl)   = rswitch * zs0a  (ji,jj,jl) 
     347                  e_s(ji,jj,1,jl) = rswitch * zs0c0 (ji,jj,jl)       
    355348                  ! Ice salinity and age 
    356349                  IF(  num_sal == 2  ) THEN 
    357350                     smv_i(ji,jj,jl) = MAX( MIN( s_i_max * v_i(ji,jj,jl), zsmv ), s_i_min * v_i(ji,jj,jl) ) 
    358351                  ENDIF 
    359                   oa_i(ji,jj,jl) = MAX( zindb * zs0oi(ji,jj,jl) / MAX( a_i(ji,jj,jl), epsi10 ), 0._wp ) * a_i(ji,jj,jl) 
     352                  oa_i(ji,jj,jl) = MAX( rswitch * zs0oi(ji,jj,jl) / MAX( a_i(ji,jj,jl), epsi10 ), 0._wp ) * a_i(ji,jj,jl) 
    360353 
    361354                 ! Update fluxes 
     
    372365               DO jj = 1, jpj 
    373366                  DO ji = 1, jpi 
    374                      zindb            = MAX( 0._wp , SIGN( 1._wp, zs0a(ji,jj,jl) - epsi10 ) ) 
     367                     rswitch          = MAX( 0._wp , SIGN( 1._wp, zs0a(ji,jj,jl) - epsi10 ) ) 
    375368                     zei              = zs0e(ji,jj,jk,jl)       
    376                      e_i(ji,jj,jk,jl) = zindb * MAX( 0._wp, zs0e(ji,jj,jk,jl) ) 
     369                     e_i(ji,jj,jk,jl) = rswitch * MAX( 0._wp, zs0e(ji,jj,jk,jl) ) 
    377370                     ! Update fluxes 
    378371                     hfx_res(ji,jj) = hfx_res(ji,jj) + ( e_i(ji,jj,jk,jl) - zei ) * unit_fac / area(ji,jj) * r1_rdtice ! W.m-2 <0 
     
    393386                     zsmv = smv_i(ji,jj,jl) 
    394387                     zes  = e_s  (ji,jj,1,jl) 
    395                      zei  = SUM( e_i(ji,jj,:,jl) ) 
     388                     zei  = SUM( e_i(ji,jj,1:nlay_i,jl) ) 
    396389                     zdv  = v_i(ji,jj,jl) - zviold(ji,jj,jl)    
    397390                     !zda = a_i(ji,jj,jl) - zaiold(ji,jj,jl)    
    398391                      
    399                      zindh = 1._wp 
     392                     rswitch = 1._wp 
    400393                     IF ( ( zdv > 0.0 .AND. ht_i(ji,jj,jl) > zhimax(ji,jj,jl) .AND. SUM( zaiold(ji,jj,1:jpl) ) < 0.80 ) .OR. & 
    401394                        & ( zdv < 0.0 .AND. ht_i(ji,jj,jl) > zhimax(ji,jj,jl) ) ) THEN                                           
    402395                        ht_i(ji,jj,jl) = MIN( zhimax(ji,jj,jl), hi_max(jl) ) 
    403                         zindh   = MAX( 0._wp, SIGN( 1._wp, ht_i(ji,jj,jl) - epsi20 ) ) 
    404                         a_i(ji,jj,jl)  = zindh * v_i(ji,jj,jl) / MAX( ht_i(ji,jj,jl), epsi20 ) 
     396                        rswitch        = MAX( 0._wp, SIGN( 1._wp, ht_i(ji,jj,jl) - epsi20 ) ) 
     397                        a_i(ji,jj,jl)  = rswitch * v_i(ji,jj,jl) / MAX( ht_i(ji,jj,jl), epsi20 ) 
    405398                     ELSE 
    406399                        ht_i(ji,jj,jl) = MAX( MIN( ht_i(ji,jj,jl), hi_max(jl) ), hi_max(jl-1) ) 
    407                         zindh   = MAX( 0._wp, SIGN( 1._wp, ht_i(ji,jj,jl) - epsi20 ) ) 
    408                         a_i(ji,jj,jl)  = zindh * v_i(ji,jj,jl) / MAX( ht_i(ji,jj,jl), epsi20 ) 
     400                        rswitch        = MAX( 0._wp, SIGN( 1._wp, ht_i(ji,jj,jl) - epsi20 ) ) 
     401                        a_i(ji,jj,jl)  = rswitch * v_i(ji,jj,jl) / MAX( ht_i(ji,jj,jl), epsi20 ) 
    409402                     ENDIF 
    410403 
    411                      ! small correction due to *zindh for a_i 
    412                      v_i  (ji,jj,jl) = zindh * v_i  (ji,jj,jl) 
    413                      v_s  (ji,jj,jl) = zindh * v_s  (ji,jj,jl) 
    414                      smv_i(ji,jj,jl) = zindh * smv_i(ji,jj,jl) 
    415                      e_s(ji,jj,1,jl) = zindh * e_s(ji,jj,1,jl) 
    416                      e_i(ji,jj,:,jl) = zindh * e_i(ji,jj,:,jl) 
     404                     ! small correction due to *rswitch for a_i 
     405                     v_i  (ji,jj,jl) = rswitch * v_i  (ji,jj,jl) 
     406                     v_s  (ji,jj,jl) = rswitch * v_s  (ji,jj,jl) 
     407                     smv_i(ji,jj,jl) = rswitch * smv_i(ji,jj,jl) 
     408                     e_s(ji,jj,1,jl) = rswitch * e_s(ji,jj,1,jl) 
     409                     e_i(ji,jj,1:nlay_i,jl) = rswitch * e_i(ji,jj,1:nlay_i,jl) 
    417410 
    418411                     ! Update mass fluxes 
     
    421414                     sfx_res(ji,jj) = sfx_res(ji,jj) - ( smv_i(ji,jj,jl) - zsmv ) * rhoic * r1_rdtice  
    422415                     hfx_res(ji,jj) = hfx_res(ji,jj) + ( e_s(ji,jj,1,jl) - zes ) * unit_fac / area(ji,jj) * r1_rdtice ! W.m-2 <0 
    423                      hfx_res(ji,jj) = hfx_res(ji,jj) + ( SUM( e_i(ji,jj,:,jl) ) - zei ) * unit_fac / area(ji,jj) * r1_rdtice ! W.m-2 <0 
    424  
     416                     hfx_res(ji,jj) = hfx_res(ji,jj) + ( SUM( e_i(ji,jj,1:nlay_i,jl) ) - zei ) * unit_fac / area(ji,jj) * r1_rdtice ! W.m-2 <0 
    425417                  ENDIF 
    426  
    427                   diag_trp_vi(ji,jj) = diag_trp_vi(ji,jj) + ( v_i(ji,jj,jl) - zviold(ji,jj,jl) ) * r1_rdtice 
    428                   diag_trp_vs(ji,jj) = diag_trp_vs(ji,jj) + ( v_s(ji,jj,jl) - zvsold(ji,jj,jl) ) * r1_rdtice 
    429  
    430418               END DO 
    431419            END DO 
     
    438426               diag_trp_ei(ji,jj) = ( SUM( e_i(ji,jj,1:nlay_i,:) ) - zeiold(ji,jj) ) / area(ji,jj) * unit_fac * r1_rdtice 
    439427               diag_trp_es(ji,jj) = ( SUM( e_s(ji,jj,1:nlay_s,:) ) - zesold(ji,jj) ) / area(ji,jj) * unit_fac * r1_rdtice 
    440             END DO 
    441          END DO 
    442  
    443          ! --- agglomerate variables (clem) ----------------- 
     428 
     429               diag_trp_vi(ji,jj) = SUM( v_i(ji,jj,:) - zviold(ji,jj,:) ) * r1_rdtice 
     430               diag_trp_vs(ji,jj) = SUM( v_s(ji,jj,:) - zvsold(ji,jj,:) ) * r1_rdtice 
     431            END DO 
     432         END DO 
     433 
     434         ! --- agglomerate variables ----------------- 
    444435         vt_i (:,:) = 0._wp 
    445436         vt_s (:,:) = 0._wp 
     
    462453            DO ji = 1, jpi 
    463454               ! open water = 1 if at_i=0 
    464                zindb        = MAX( 0._wp , SIGN( 1._wp, - at_i(ji,jj) ) ) 
    465                ato_i(ji,jj) = zindb + (1._wp - zindb ) * zs0ow(ji,jj) 
     455               rswitch      = MAX( 0._wp , SIGN( 1._wp, - at_i(ji,jj) ) ) 
     456               ato_i(ji,jj) = rswitch + (1._wp - rswitch ) * zs0ow(ji,jj) 
    466457            END DO 
    467458         END DO       
     
    506497      CALL wrk_dealloc( jpi, jpj, zui_u, zvi_v, zsm, zs0at, zs0ow, zeiold, zesold ) 
    507498      CALL wrk_dealloc( jpi, jpj, jpl, zs0ice, zs0sn, zs0a, zs0c0 , zs0sm , zs0oi ) 
    508       CALL wrk_dealloc( jpi, jpj, jkmax, jpl, zs0e ) 
     499      CALL wrk_dealloc( jpi, jpj, nlay_i+1, jpl, zs0e ) 
    509500 
    510501      CALL wrk_dealloc( jpi, jpj, jpl, zviold, zvsold, zaiold, zhimax )   ! clem 
Note: See TracChangeset for help on using the changeset viewer.