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

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

Merge in changes from trunk up to 5021.

Location:
branches/2014/dev_r4650_UKMO11_restart_functionality/NEMOGCM/NEMO/LIM_SRC_3
Files:
26 edited

Legend:

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

    r4775 r5208  
    105105   !! ** Global variables                                                 | 
    106106   !!-------------|-------------|---------------------------------|-------| 
    107    !! a_i         | a_i_b       |    Ice concentration            |       | 
     107   !! a_i         | a_i_1d      |    Ice concentration            |       | 
    108108   !! v_i         |      -      |    Ice volume per unit area     | m     | 
    109109   !! v_s         |      -      |    Snow volume per unit area    | m     | 
     
    111111   !! oa_i        !      -      !    Sea ice areal age content    | day   | 
    112112   !! e_i         !      -      !    Ice enthalpy                 | 10^9 J|  
    113    !!      -      ! q_i_b       !    Ice enthalpy per unit vol.   | J/m3  |  
     113   !!      -      ! q_i_1d      !    Ice enthalpy per unit vol.   | J/m3  |  
    114114   !! e_s         !      -      !    Snow enthalpy                | 10^9 J|  
    115    !!      -      ! q_s_b       !    Snow enthalpy per unit vol.  | J/m3  |  
     115   !!      -      ! q_s_1d      !    Snow enthalpy per unit vol.  | J/m3  |  
    116116   !!                                                                     | 
    117117   !!-------------|-------------|---------------------------------|-------| 
     
    120120   !!-------------|-------------|---------------------------------|-------| 
    121121   !!                                                                     | 
    122    !! ht_i        | ht_i_b      |    Ice thickness                | m     | 
    123    !! ht_s        ! ht_s_b      |    Snow depth                   | m     | 
    124    !! sm_i        ! sm_i_b      |    Sea ice bulk salinity        ! ppt   | 
    125    !! s_i         ! s_i_b       |    Sea ice salinity profile     ! ppt   | 
     122   !! ht_i        | ht_i_1d     |    Ice thickness                | m     | 
     123   !! ht_s        ! ht_s_1d     |    Snow depth                   | m     | 
     124   !! sm_i        ! sm_i_1d     |    Sea ice bulk salinity        ! ppt   | 
     125   !! s_i         ! s_i_1d      |    Sea ice salinity profile     ! ppt   | 
    126126   !! o_i         !      -      |    Sea ice Age                  ! days  | 
    127    !! t_i         ! t_i_b       |    Sea ice temperature          ! K     | 
    128    !! t_s         ! t_s_b       |    Snow temperature             ! K     | 
    129    !! t_su        ! t_su_b      |    Sea ice surface temperature  ! K     | 
     127   !! t_i         ! t_i_1d      |    Sea ice temperature          ! K     | 
     128   !! t_s         ! t_s_1d      |    Snow temperature             ! K     | 
     129   !! t_su        ! t_su_1d     |    Sea ice surface temperature  ! K     | 
    130130   !!                                                                     | 
    131131   !! notes: the ice model only sees a bulk (i.e., vertically averaged)   | 
     
    142142   !! ***         Category-summed state variables (diagnostic)        *** | 
    143143   !! ******************************************************************* | 
    144    !! at_i        | at_i_b      |    Total ice concentration      |       | 
     144   !! at_i        | at_i_1d     |    Total ice concentration      |       | 
    145145   !! vt_i        |      -      |    Total ice vol. per unit area | m     | 
    146146   !! vt_s        |      -      |    Total snow vol. per unit ar. | m     | 
     
    170170   REAL(wp), PUBLIC ::   om               !: relaxation constant 
    171171   REAL(wp), PUBLIC ::   cw               !: drag coefficient for oceanic stress 
    172    REAL(wp), PUBLIC ::   angvg            !: turning angle for oceanic stress 
    173172   REAL(wp), PUBLIC ::   pstar            !: determines ice strength (N/M), Hibler JPO79 
    174173   REAL(wp), PUBLIC ::   c_rhg            !: determines changes in ice strength 
     
    176175   REAL(wp), PUBLIC ::   ecc              !: eccentricity of the elliptical yield curve 
    177176   REAL(wp), PUBLIC ::   ahi0             !: sea-ice hor. eddy diffusivity coeff. (m2/s) 
    178    REAL(wp), PUBLIC ::   telast           !: timescale for elastic waves (s) !SB 
    179    REAL(wp), PUBLIC ::   alphaevp         !: coeficient of the internal stresses !SB 
    180    REAL(wp), PUBLIC ::   unit_fac = 1.e+09_wp  !: conversion factor for ice / snow enthalpy 
     177   REAL(wp), PUBLIC ::   telast           !: timescale for elastic waves (s) 
     178   REAL(wp), PUBLIC ::   relast           !: ratio => telast/rdt_ice (1/3 or 1/9 depending on nb of subcycling nevp)  
     179   REAL(wp), PUBLIC ::   alphaevp         !: coeficient of the internal stresses  
    181180   REAL(wp), PUBLIC ::   hminrhg          !: ice volume (a*h, in m) below which ice velocity is set to ocean velocity 
    182181 
     
    223222   REAL(wp), PUBLIC ::   usecc2           !:  = 1.0 / ( ecc * ecc ) 
    224223   REAL(wp), PUBLIC ::   rhoco            !: = rau0 * cw 
    225    REAL(wp), PUBLIC ::   sangvg, cangvg   !: sin and cos of the turning angle for ocean stress 
    226    REAL(wp), PUBLIC ::   pstarh           !: pstar / 2.0 
     224 
     225   !                                     !!** switch for presence of ice or not  
     226   REAL(wp), PUBLIC ::   rswitch 
     227 
     228   !                                     !!** define some parameters  
     229   REAL(wp), PUBLIC, PARAMETER ::   unit_fac = 1.e+09_wp  !: conversion factor for ice / snow enthalpy 
     230   REAL(wp), PUBLIC, PARAMETER ::   epsi06   = 1.e-06_wp  !: small number  
     231   REAL(wp), PUBLIC, PARAMETER ::   epsi10   = 1.e-10_wp  !: small number  
     232   REAL(wp), PUBLIC, PARAMETER ::   epsi20   = 1.e-20_wp  !: small number  
    227233 
    228234   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   u_oce, v_oce   !: surface ocean velocity used in ice dynamics 
     
    247253   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   fhld        !: heat flux from the lead used for bottom melting 
    248254 
    249    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   wfx_snw     !: Variation of snow mass over 1 time step     [Kg/m2] 
    250    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   wfx_ice     !: Variation of ice mass over 1 time step      [Kg/m2] 
    251    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   wfx_sub     !: Variation of snow mass over 1 time step due to sublimation [Kg/m2] 
    252  
    253    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   wfx_sni     !: snow ice growth  
    254    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   wfx_opw     !: lateral ice growth  
    255    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   wfx_bog     !: bottom ice growth  
    256    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   wfx_dyn     !: dynamical ice growth  
    257    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   wfx_bom     !: vertical bottom melt  
    258    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   wfx_sum     !: vertical surface melt 
    259    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   wfx_res     !: production (growth+melt) due to limupdate 
    260    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   wfx_spr     !: snow precipitation on ice 
     255   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   wfx_snw    !: snow-ocean mass exchange over 1 time step [kg/m2] 
     256   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   wfx_spr    !: snow precipitation on ice over 1 time step [kg/m2] 
     257   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   wfx_sub    !: snow sublimation over 1 time step [kg/m2] 
     258 
     259   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   wfx_ice    !: ice-ocean mass exchange over 1 time step [kg/m2] 
     260   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   wfx_sni    !: snow ice growth component of wfx_ice [kg/m2] 
     261   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   wfx_opw    !: lateral ice growth component of wfx_ice [kg/m2] 
     262   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   wfx_bog    !: bottom ice growth component of wfx_ice [kg/m2] 
     263   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   wfx_dyn    !: dynamical ice growth component of wfx_ice [kg/m2] 
     264   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   wfx_bom    !: bottom melt component of wfx_ice [kg/m2] 
     265   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   wfx_sum    !: surface melt component of wfx_ice [kg/m2] 
     266   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   wfx_res    !: residual component of wfx_ice [kg/m2] 
    261267 
    262268   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   sfx_bog     !: salt flux due to ice growth/melt                      [PSU/m2/s] 
     
    323329   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   smt_i          !: mean sea ice salinity averaged over all categories [PSU] 
    324330 
    325    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   at_i_typ     !: total area   contained in each ice type [m^2] 
    326    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   vt_i_typ     !: total volume contained in each ice type [m^3] 
    327  
    328331   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:,:) ::   t_s        !: Snow temperatures [K] 
    329332   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:,:) ::   e_s        !: Snow ...       
    330  
    331    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)   ::   e_i_cat    !: ! go to trash 
    332333       
    333334   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:,:) ::   t_i        !: ice temperatures          [K] 
     
    350351   !! * Old values of global variables 
    351352   !!-------------------------------------------------------------------------- 
    352    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)   ::   old_v_s, old_v_i               !: snow and ice volumes 
    353    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)   ::   old_a_i, old_smv_i, old_oa_i   !: ??? 
    354    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:,:) ::   old_e_s                        !: snow heat content 
    355    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:,:) ::   old_e_i                        !: ice temperatures 
    356    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)     ::   old_u_ice, old_v_ice           !: ice velocity (gv6 and gv7) 
     353   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)   ::   v_s_b, v_i_b               !: snow and ice volumes 
     354   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)   ::   a_i_b, smv_i_b, oa_i_b     !: 
     355   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:,:) ::   e_s_b                      !: snow heat content 
     356   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:,:) ::   e_i_b                      !: ice temperatures 
     357   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)     ::   u_ice_b, v_ice_b           !: ice velocity 
    357358       
    358359 
     
    368369   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   d_sm_i_fl  , d_sm_i_gd                 !: 
    369370   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   d_sm_i_se  , d_sm_i_si  , d_sm_i_la    !: 
    370    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   d_oa_i_thd , d_oa_i_trp , s_i_newice   !: 
     371   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   d_oa_i_thd , d_oa_i_trp                !: 
    371372 
    372373   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:,:) ::   d_e_s_thd  , d_e_s_trp     !: 
     
    377378   !! * Ice thickness distribution variables 
    378379   !!-------------------------------------------------------------------------- 
    379    ! REMOVE 
    380    INTEGER , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:)   ::   ice_types      !: Vector connecting types and categories 
    381    INTEGER , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   ice_cat_bounds !: Matrix containing the integer upper and  
    382    !                                                                       !  lower boundaries of ice thickness categories 
    383    ! REMOVE 
    384    INTEGER , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:)   ::   ice_ncat_types !: nb of thickness categories in each ice type 
    385380   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:)   ::   hi_max         !: Boundary of ice thickness categories in thickness space 
    386381   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:)   ::   hi_mean        !: Mean ice thickness in catgories  
    387    ! REMOVE 
    388    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   hi_max_typ     !: Boundary of ice thickness categories in thickness space 
    389382 
    390383   !!-------------------------------------------------------------------------- 
     
    409402   LOGICAL , PUBLIC                                      ::   ln_limdiaout  !: flag for ice diag (T) or not (F) 
    410403   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   dv_dt_thd     !: thermodynamic growth rates  
    411    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   izero 
    412404   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   diag_trp_vi   !: transport of ice volume 
    413405   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   diag_trp_vs   !: transport of snw volume 
     
    432424      INTEGER :: ice_alloc 
    433425      ! 
    434       INTEGER :: ierr(20), ii 
     426      INTEGER :: ierr(19), ii 
    435427      !!----------------------------------------------------------------- 
    436428 
     
    462454         &      hfx_thd(jpi,jpj) , hfx_dyn(jpi,jpj) , hfx_spr(jpi,jpj) ,  STAT=ierr(ii) ) 
    463455 
    464       ii = ii + 1 
    465       ALLOCATE( dh_i_surf2D(jpi,jpj) , dh_i_bott2D(jpi,jpj) , q_s(jpi,jpj) , STAT=ierr(ii) ) 
    466  
    467456      ! * Ice global state variables 
    468457      ii = ii + 1 
     
    477466         &      bv_i (jpi,jpj) , smt_i(jpi,jpj)                                   , STAT=ierr(ii) ) 
    478467      ii = ii + 1 
    479       ALLOCATE( t_s(jpi,jpj,nlay_s,jpl) , at_i_typ(jpi,jpj,jpm) ,                            & 
    480          &      e_s(jpi,jpj,nlay_s,jpl) , vt_i_typ(jpi,jpj,jpm) , e_i_cat(jpi,jpj,jpl) , STAT=ierr(ii) ) 
    481       ii = ii + 1 
    482       ALLOCATE( t_i(jpi,jpj,jkmax,jpl) , e_i(jpi,jpj,jkmax,jpl) , s_i(jpi,jpj,jkmax,jpl) , STAT=ierr(ii) ) 
     468      ALLOCATE( t_s(jpi,jpj,nlay_s,jpl) ,                            & 
     469         &      e_s(jpi,jpj,nlay_s,jpl) , STAT=ierr(ii) ) 
     470      ii = ii + 1 
     471      ALLOCATE( t_i(jpi,jpj,nlay_i+1,jpl) , e_i(jpi,jpj,nlay_i+1,jpl) , s_i(jpi,jpj,nlay_i+1,jpl) , STAT=ierr(ii) ) 
    483472 
    484473      ! * Moments for advection 
     
    496485         &      STAT=ierr(ii) ) 
    497486      ii = ii + 1 
    498       ALLOCATE( sxe (jpi,jpj,jkmax,jpl) , sye (jpi,jpj,jkmax,jpl) , sxxe(jpi,jpj,jkmax,jpl) ,     & 
    499          &      syye(jpi,jpj,jkmax,jpl) , sxye(jpi,jpj,jkmax,jpl)                           , STAT=ierr(ii) ) 
     487      ALLOCATE( sxe (jpi,jpj,nlay_i+1,jpl) , sye (jpi,jpj,nlay_i+1,jpl) , sxxe(jpi,jpj,nlay_i+1,jpl) ,     & 
     488         &      syye(jpi,jpj,nlay_i+1,jpl) , sxye(jpi,jpj,nlay_i+1,jpl)                           , STAT=ierr(ii) ) 
    500489 
    501490      ! * Old values of global variables 
    502491      ii = ii + 1 
    503       ALLOCATE( old_v_s  (jpi,jpj,jpl) , old_v_i  (jpi,jpj,jpl) , old_e_s(jpi,jpj,nlay_s,jpl) ,     & 
    504          &      old_a_i  (jpi,jpj,jpl) , old_smv_i(jpi,jpj,jpl) , old_e_i(jpi,jpj,jkmax ,jpl) ,     & 
    505          &      old_oa_i (jpi,jpj,jpl)                                                        ,     & 
    506          &      old_u_ice(jpi,jpj)     , old_v_ice(jpi,jpj)                                   , STAT=ierr(ii) ) 
     492      ALLOCATE( v_s_b  (jpi,jpj,jpl) , v_i_b  (jpi,jpj,jpl) , e_s_b(jpi,jpj,nlay_s,jpl) ,     & 
     493         &      a_i_b  (jpi,jpj,jpl) , smv_i_b(jpi,jpj,jpl) , e_i_b(jpi,jpj,nlay_i+1 ,jpl) ,     & 
     494         &      oa_i_b (jpi,jpj,jpl)                                                        ,     & 
     495         &      u_ice_b(jpi,jpj)     , v_ice_b(jpi,jpj)                                   , STAT=ierr(ii) ) 
    507496 
    508497      ! * Increment of global variables 
     
    511500         &      d_v_i_thd(jpi,jpj,jpl) , d_v_i_trp (jpi,jpj,jpl) , d_smv_i_thd(jpi,jpj,jpl) , d_smv_i_trp(jpi,jpj,jpl) ,   &      
    512501         &      d_sm_i_fl(jpi,jpj,jpl) , d_sm_i_gd (jpi,jpj,jpl) , d_sm_i_se  (jpi,jpj,jpl) , d_sm_i_si  (jpi,jpj,jpl) ,   & 
    513          &      d_sm_i_la(jpi,jpj,jpl) , d_oa_i_thd(jpi,jpj,jpl) , d_oa_i_trp (jpi,jpj,jpl) , s_i_newice (jpi,jpj,jpl) ,   & 
     502         &      d_sm_i_la(jpi,jpj,jpl) , d_oa_i_thd(jpi,jpj,jpl) , d_oa_i_trp (jpi,jpj,jpl) ,   & 
    514503         &     STAT=ierr(ii) ) 
    515504      ii = ii + 1 
    516       ALLOCATE( d_e_s_thd(jpi,jpj,nlay_s,jpl) , d_e_i_thd(jpi,jpj,jkmax,jpl) , d_u_ice_dyn(jpi,jpj) ,     & 
    517          &      d_e_s_trp(jpi,jpj,nlay_s,jpl) , d_e_i_trp(jpi,jpj,jkmax,jpl) , d_v_ice_dyn(jpi,jpj) , STAT=ierr(ii) ) 
     505      ALLOCATE( d_e_s_thd(jpi,jpj,nlay_s,jpl) , d_e_i_thd(jpi,jpj,nlay_i,jpl) , d_u_ice_dyn(jpi,jpj) ,     & 
     506         &      d_e_s_trp(jpi,jpj,nlay_s,jpl) , d_e_i_trp(jpi,jpj,nlay_i,jpl) , d_v_ice_dyn(jpi,jpj) , STAT=ierr(ii) ) 
    518507       
    519508      ! * Ice thickness distribution variables 
    520509      ii = ii + 1 
    521       ALLOCATE( ice_types(jpl) , ice_cat_bounds(jpm,2) , ice_ncat_types  (jpm) ,     & 
    522          &      hi_max (0:jpl) , hi_mean(jpl)          , hi_max_typ(0:jpl,jpm) , STAT=ierr(ii) ) 
     510      ALLOCATE( hi_max(0:jpl), hi_mean(jpl),  STAT=ierr(ii) ) 
    523511 
    524512      ! * Ice diagnostics 
    525513      ii = ii + 1 
    526       ALLOCATE( dv_dt_thd(jpi,jpj,jpl) ,     & 
    527          &      izero    (jpi,jpj,jpl)  , diag_trp_vi(jpi,jpj) , diag_trp_vs(jpi,jpj), diag_trp_ei(jpi,jpj), diag_trp_es(jpi,jpj),     &  
    528          &      diag_heat_dhc(jpi,jpj) ,  STAT=ierr(ii) ) 
     514      ALLOCATE( dv_dt_thd(jpi,jpj,jpl),    & 
     515         &      diag_trp_vi(jpi,jpj), diag_trp_vs  (jpi,jpj), diag_trp_ei(jpi,jpj),   &  
     516         &      diag_trp_es(jpi,jpj), diag_heat_dhc(jpi,jpj),  STAT=ierr(ii) ) 
    529517 
    530518      ice_alloc = MAXVAL( ierr(:) ) 
  • branches/2014/dev_r4650_UKMO11_restart_functionality/NEMOGCM/NEMO/LIM_SRC_3/iceini.F90

    r4624 r5208  
    6666      ! 
    6767      !                                ! adequation jpk versus ice/snow layers/categories 
    68       IF( jpl   > jpk  .OR.  jpm    > jpk .OR.                                    & 
    69           jkmax > jpk  .OR.  nlay_s > jpk      )   CALL ctl_stop( 'STOP',         & 
     68      IF( jpl > jpk .OR. (nlay_i+1) > jpk .OR. nlay_s > jpk )   & 
     69         &      CALL ctl_stop( 'STOP',                     & 
    7070         &     'ice_init: the 3rd dimension of workspace arrays is too small.',   & 
    7171         &     'use more ocean levels or less ice/snow layers/categories.' ) 
     
    8989      CALL lim_itd_ini                 ! ice thickness distribution initialization 
    9090      ! 
     91      CALL lim_itd_me_init             ! ice thickness distribution initialization 
    9192      !                                ! Initial sea-ice state 
    9293      IF( .NOT. ln_rstart ) THEN              ! start from rest 
     
    173174      !!              limistate (only) and is changed to 99 m in ice_init 
    174175      !!------------------------------------------------------------------ 
    175       INTEGER  ::   jl, jm               ! dummy loop index 
     176      INTEGER  ::   jl                   ! dummy loop index 
    176177      REAL(wp) ::   zc1, zc2, zc3, zx1   ! local scalars 
    177178      !!------------------------------------------------------------------ 
     
    184185      ! 1) Ice thickness distribution parameters initialization     
    185186      !------------------------------------------------------------------------------! 
    186  
    187       !- Types boundaries (integer) 
    188       !---------------------------- 
    189       ice_cat_bounds(1,1) = 1 
    190       ice_cat_bounds(1,2) = jpl 
    191  
    192       !- Number of ice thickness categories in each ice type 
    193       DO jm = 1, jpm 
    194          ice_ncat_types(jm) = ice_cat_bounds(jm,2) - ice_cat_bounds(jm,1) + 1  
    195       END DO 
    196  
    197       !- Make the correspondence between thickness categories and ice types 
    198       !--------------------------------------------------------------------- 
    199       DO jm = 1, jpm       !over types 
    200          DO jl = ice_cat_bounds(jm,1), ice_cat_bounds(jm,2) !over thickness categories 
    201             ice_types(jl) = jm 
    202          END DO 
    203       END DO 
    204  
    205187      IF(lwp) THEN   
    206          WRITE(numout,*) ' Number of ice types jpm =      ', jpm 
    207188         WRITE(numout,*) ' Number of ice categories jpl = ', jpl 
    208          DO jm = 1, jpm 
    209             WRITE(numout,*) ' Ice type ', jm 
    210             WRITE(numout,*) ' Number of thickness categories ', ice_ncat_types(jm) 
    211             WRITE(numout,*) ' Thickness category boundaries  ', ice_cat_bounds(jm,1:2) 
    212          END DO 
    213          WRITE(numout,*) 'Ice type vector', ice_types(1:jpl) 
    214          WRITE(numout,*) 
    215189      ENDIF 
    216190 
     
    218192      !---------------------------------- 
    219193      hi_max(:) = 0._wp 
    220       hi_max_typ(:,:) = 0._wp 
    221  
    222       !- Type 1 - undeformed ice 
    223       zc1 =  3._wp / REAL( ice_cat_bounds(1,2) - ice_cat_bounds(1,1) + 1 , wp ) 
     194 
     195      zc1 =  3._wp / REAL( jpl, wp ) 
    224196      zc2 = 10._wp * zc1 
    225197      zc3 =  3._wp 
    226198 
    227       DO jl = ice_cat_bounds(1,1), ice_cat_bounds(1,2) 
    228          zx1 = REAL( jl-1 , wp ) / REAL( ice_cat_bounds(1,2) - ice_cat_bounds(1,1) + 1 , wp ) 
     199      DO jl = 1, jpl 
     200         zx1 = REAL( jl-1, wp ) / REAL( jpl, wp ) 
    229201         hi_max(jl) = hi_max(jl-1) + zc1 + zc2 * (1._wp + TANH( zc3 * (zx1 - 1._wp ) ) ) 
    230202      END DO 
    231203 
    232       !- Fill in the hi_max_typ vector, useful in other circumstances 
    233       ! Tricky trick: hi_max_typ is actually not used in the code and will be removed in a 
    234       ! next flyspray at this time, the tricky trick will also be removed (Martin, march 08) 
    235       DO jl = ice_cat_bounds(1,1), ice_cat_bounds(1,2) 
    236          hi_max_typ(jl,1) = hi_max(jl) 
    237       END DO 
    238  
    239       IF(lwp) WRITE(numout,*) ' Thickness category boundaries independently of ice type ' 
     204      IF(lwp) WRITE(numout,*) ' Thickness category boundaries ' 
    240205      IF(lwp) WRITE(numout,*) ' hi_max ', hi_max(0:jpl) 
    241206 
    242       IF(lwp) WRITE(numout,*) ' Thickness category boundaries inside ice types ' 
    243       IF(lwp) THEN  
    244          DO jm = 1, jpm 
    245             WRITE(numout,*) ' Type number ', jm 
    246             WRITE(numout,*) ' hi_max_typ : ', hi_max_typ(0:ice_ncat_types(jm),jm) 
    247          END DO 
    248       ENDIF 
    249207      ! 
    250208      DO jl = 1, jpl 
  • branches/2014/dev_r4650_UKMO11_restart_functionality/NEMOGCM/NEMO/LIM_SRC_3/limadv.F90

    r4688 r5208  
    3030   PUBLIC   lim_adv_x   ! called by lim_trp 
    3131   PUBLIC   lim_adv_y   ! called by lim_trp 
    32  
    33    REAL(wp)  ::   epsi20 = 1.e-20_wp   ! constant values 
    3432 
    3533   !! * Substitutions 
  • branches/2014/dev_r4650_UKMO11_restart_functionality/NEMOGCM/NEMO/LIM_SRC_3/limcons.F90

    r4688 r5208  
    7373      !! ** Method  : Arithmetics 
    7474      !!--------------------------------------------------------------------- 
    75       INTEGER                               , INTENT(in   ) ::   ksum   !: number of categories 
    76       INTEGER                               , INTENT(in   ) ::   klay   !: number of vertical layers 
    77       REAL(wp), DIMENSION(jpi,jpj,jkmax,jpl), INTENT(in   ) ::   pin   !: input field 
    78       REAL(wp), DIMENSION(jpi,jpj)          , INTENT(  out) ::   pout   !: output field 
     75      INTEGER                                  , INTENT(in   ) ::   ksum   !: number of categories 
     76      INTEGER                                  , INTENT(in   ) ::   klay   !: number of vertical layers 
     77      REAL(wp), DIMENSION(jpi,jpj,nlay_i+1,jpl), INTENT(in   ) ::   pin   !: input field 
     78      REAL(wp), DIMENSION(jpi,jpj)             , INTENT(  out) ::   pout   !: output field 
    7979      ! 
    8080      INTEGER ::   jk, jl   ! dummy loop indices 
     
    175175         zei_b  = glob_sum( SUM(   e_i(:,:,1:nlay_i,:), dim=3 ) + SUM( e_s(:,:,1:nlay_s,:), dim=3 ) ) 
    176176         zfw_b  = glob_sum( - ( wfx_bog(:,:) + wfx_bom(:,:) + wfx_sum(:,:) + wfx_sni(:,:) + wfx_opw(:,:) +  & 
    177             &                   wfx_res(:,:) + wfx_dyn(:,:) + wfx_snw(:,:) + wfx_sub(:,:) + wfx_spr(:,:) ) * area(:,:) * tms(:,:) ) 
     177            &                   wfx_res(:,:) + wfx_dyn(:,:) + wfx_snw(:,:) + wfx_sub(:,:) + wfx_spr(:,:)    & 
     178            &             ) * area(:,:) * tms(:,:) ) 
    178179         zfs_b  = glob_sum(   ( sfx_bri(:,:) + sfx_bog(:,:) + sfx_bom(:,:) + sfx_sum(:,:) + sfx_sni(:,:) +  & 
    179             &                   sfx_opw(:,:) + sfx_res(:,:) + sfx_dyn(:,:) ) * area(:,:) * tms(:,:) ) 
     180            &                   sfx_opw(:,:) + sfx_res(:,:) + sfx_dyn(:,:)                                  & 
     181            &                 ) * area(:,:) * tms(:,:) ) 
    180182         zft_b  = glob_sum(   ( hfx_sum(:,:) + hfx_bom(:,:) + hfx_bog(:,:) + hfx_dif(:,:) + hfx_opw(:,:) + hfx_snw(:,:)  &  
    181             &                 - hfx_thd(:,:) - hfx_dyn(:,:) - hfx_res(:,:) - hfx_sub(:,:) - hfx_spr(:,:) ) * area(:,:) / unit_fac * tms(:,:) ) 
     183            &                 - hfx_thd(:,:) - hfx_dyn(:,:) - hfx_res(:,:) - hfx_sub(:,:) - hfx_spr(:,:)   & 
     184            &                  ) * area(:,:) / unit_fac * tms(:,:) ) 
    182185 
    183186      ELSEIF( icount == 1 ) THEN 
    184187 
    185188         zfs  = glob_sum(   ( sfx_bri(:,:) + sfx_bog(:,:) + sfx_bom(:,:) + sfx_sum(:,:) + sfx_sni(:,:) +  & 
    186             &                 sfx_opw(:,:) + sfx_res(:,:) + sfx_dyn(:,:) ) * area(:,:) * tms(:,:) ) - zfs_b 
     189            &                 sfx_opw(:,:) + sfx_res(:,:) + sfx_dyn(:,:)                                  &  
     190            &                ) * area(:,:) * tms(:,:) ) - zfs_b 
    187191         zfw  = glob_sum( - ( wfx_bog(:,:) + wfx_bom(:,:) + wfx_sum(:,:) + wfx_sni(:,:) + wfx_opw(:,:) +  & 
    188             &                 wfx_res(:,:) + wfx_dyn(:,:) + wfx_snw(:,:) + wfx_sub(:,:) + wfx_spr(:,:) ) * area(:,:) * tms(:,:) ) - zfw_b 
     192            &                 wfx_res(:,:) + wfx_dyn(:,:) + wfx_snw(:,:) + wfx_sub(:,:) + wfx_spr(:,:)    & 
     193            &                ) * area(:,:) * tms(:,:) ) - zfw_b 
    189194         zft  = glob_sum(   ( hfx_sum(:,:) + hfx_bom(:,:) + hfx_bog(:,:) + hfx_dif(:,:) + hfx_opw(:,:) + hfx_snw(:,:)  &  
    190             &               - hfx_thd(:,:) - hfx_dyn(:,:) - hfx_res(:,:) - hfx_sub(:,:) - hfx_spr(:,:) ) * area(:,:) / unit_fac * tms(:,:) ) - zft_b 
     195            &               - hfx_thd(:,:) - hfx_dyn(:,:) - hfx_res(:,:) - hfx_sub(:,:) - hfx_spr(:,:)   & 
     196            &                ) * area(:,:) / unit_fac * tms(:,:) ) - zft_b 
    191197  
    192198         zvi  = ( glob_sum( SUM(   v_i(:,:,:)*rhoic + v_s(:,:,:)*rhosn, dim=3 ) * area(:,:) * tms(:,:) ) - zvi_b ) * r1_rdtice - zfw  
  • branches/2014/dev_r4650_UKMO11_restart_functionality/NEMOGCM/NEMO/LIM_SRC_3/limdiahsb.F90

    r4688 r5208  
    3535   !!PUBLIC   lim_diahsb_rst   ! routine called by ice_init.F90 
    3636 
    37    REAL(dp) ::   frc_sal, frc_vol   ! global forcing trends 
    38    REAL(dp) ::   bg_grme            ! global ice growth+melt trends 
    39    REAL(wp) ::   epsi06 = 1.e-6_wp  ! small number 
     37   real(wp) ::   frc_sal, frc_vol   ! global forcing trends 
     38   real(wp) ::   bg_grme            ! global ice growth+melt trends 
    4039 
    4140   !! * Substitutions 
     
    5857      !!--------------------------------------------------------------------------- 
    5958      !! 
    60       REAL(dp)   ::   zbg_ivo, zbg_svo, zbg_are, zbg_sal ,zbg_tem ,zbg_ihc ,zbg_shc 
    61       REAL(dp)   ::   zbg_sfx, zbg_sfx_bri, zbg_sfx_bog, zbg_sfx_bom, zbg_sfx_sum, zbg_sfx_sni, zbg_sfx_opw, zbg_sfx_res, zbg_sfx_dyn  
    62       REAL(dp)   ::   zbg_vfx, zbg_vfx_bog, zbg_vfx_opw, zbg_vfx_sni, zbg_vfx_dyn 
    63       REAL(dp)   ::   zbg_vfx_bom, zbg_vfx_sum, zbg_vfx_res, zbg_vfx_spr, zbg_vfx_snw, zbg_vfx_sub   
    64       REAL(dp)   ::   zbg_hfx_dhc, zbg_hfx_spr 
    65       REAL(dp)   ::   zbg_hfx_res, zbg_hfx_sub, zbg_hfx_dyn, zbg_hfx_thd, zbg_hfx_snw, zbg_hfx_out, zbg_hfx_in    
    66       REAL(dp)   ::   zbg_hfx_sum, zbg_hfx_bom, zbg_hfx_bog, zbg_hfx_dif, zbg_hfx_opw 
    67       REAL(dp)   ::   z_frc_vol, z_frc_sal, z_bg_grme  
    68       REAL(dp)   ::   z1_area                     !    -     - 
    69       REAL(dp)   ::   zinda, zindb 
     59      real(wp)   ::   zbg_ivo, zbg_svo, zbg_are, zbg_sal ,zbg_tem ,zbg_ihc ,zbg_shc 
     60      real(wp)   ::   zbg_sfx, zbg_sfx_bri, zbg_sfx_bog, zbg_sfx_bom, zbg_sfx_sum, zbg_sfx_sni,   & 
     61      &               zbg_sfx_opw, zbg_sfx_res, zbg_sfx_dyn  
     62      real(wp)   ::   zbg_vfx, zbg_vfx_bog, zbg_vfx_opw, zbg_vfx_sni, zbg_vfx_dyn 
     63      real(wp)   ::   zbg_vfx_bom, zbg_vfx_sum, zbg_vfx_res, zbg_vfx_spr, zbg_vfx_snw, zbg_vfx_sub   
     64      real(wp)   ::   zbg_hfx_dhc, zbg_hfx_spr 
     65      real(wp)   ::   zbg_hfx_res, zbg_hfx_sub, zbg_hfx_dyn, zbg_hfx_thd, zbg_hfx_snw, zbg_hfx_out, zbg_hfx_in    
     66      real(wp)   ::   zbg_hfx_sum, zbg_hfx_bom, zbg_hfx_bog, zbg_hfx_dif, zbg_hfx_opw 
     67      real(wp)   ::   z_frc_vol, z_frc_sal, z_bg_grme  
     68      real(wp)   ::   z1_area                     !    -     - 
     69      REAL(wp)   ::   ztmp 
    7070      !!--------------------------------------------------------------------------- 
    7171      IF( nn_timing == 1 )   CALL timing_start('lim_diahsb') 
     
    7474 
    7575      ! 1/area 
    76       z1_area = 1.d0 / MAX( glob_sum( area(:,:) * tms(:,:) ), epsi06 ) 
    77  
    78       zinda = MAX( 0.d0 , SIGN( 1.d0 , glob_sum( area(:,:) * tms(:,:) ) - epsi06 ) ) 
     76      z1_area = 1._wp / MAX( glob_sum( area(:,:) * tms(:,:) ), epsi06 ) 
     77 
     78      rswitch = MAX( 0._wp , SIGN( 1._wp , glob_sum( area(:,:) * tms(:,:) ) - epsi06 ) ) 
    7979      ! ----------------------- ! 
    8080      ! 1 -  Content variations ! 
     
    9090 
    9191      ! Volume 
    92       zbg_vfx     = zinda * glob_sum(      emp(:,:) * area(:,:) * tms(:,:) ) * z1_area * r1_rau0 * rday 
    93       zbg_vfx_bog = zinda * glob_sum( wfx_bog(:,:) * area(:,:) * tms(:,:) ) * z1_area * r1_rau0 * rday 
    94       zbg_vfx_opw = zinda * glob_sum( wfx_opw(:,:) * area(:,:) * tms(:,:) ) * z1_area * r1_rau0 * rday 
    95       zbg_vfx_sni = zinda * glob_sum( wfx_sni(:,:) * area(:,:) * tms(:,:) ) * z1_area * r1_rau0 * rday 
    96       zbg_vfx_dyn = zinda * glob_sum( wfx_dyn(:,:) * area(:,:) * tms(:,:) ) * z1_area * r1_rau0 * rday 
    97       zbg_vfx_bom = zinda * glob_sum( wfx_bom(:,:) * area(:,:) * tms(:,:) ) * z1_area * r1_rau0 * rday 
    98       zbg_vfx_sum = zinda * glob_sum( wfx_sum(:,:) * area(:,:) * tms(:,:) ) * z1_area * r1_rau0 * rday 
    99       zbg_vfx_res = zinda * glob_sum( wfx_res(:,:) * area(:,:) * tms(:,:) ) * z1_area * r1_rau0 * rday 
    100       zbg_vfx_spr = zinda * glob_sum( wfx_spr(:,:) * area(:,:) * tms(:,:) ) * z1_area * r1_rau0 * rday 
    101       zbg_vfx_snw = zinda * glob_sum( wfx_snw(:,:) * area(:,:) * tms(:,:) ) * z1_area * r1_rau0 * rday 
    102       zbg_vfx_sub = zinda * glob_sum( wfx_sub(:,:) * area(:,:) * tms(:,:) ) * z1_area * r1_rau0 * rday 
     92      ztmp = rswitch * z1_area * r1_rau0 * rday 
     93      zbg_vfx     = ztmp * glob_sum(     emp(:,:) * area(:,:) * tms(:,:) ) 
     94      zbg_vfx_bog = ztmp * glob_sum( wfx_bog(:,:) * area(:,:) * tms(:,:) ) 
     95      zbg_vfx_opw = ztmp * glob_sum( wfx_opw(:,:) * area(:,:) * tms(:,:) ) 
     96      zbg_vfx_sni = ztmp * glob_sum( wfx_sni(:,:) * area(:,:) * tms(:,:) ) 
     97      zbg_vfx_dyn = ztmp * glob_sum( wfx_dyn(:,:) * area(:,:) * tms(:,:) ) 
     98      zbg_vfx_bom = ztmp * glob_sum( wfx_bom(:,:) * area(:,:) * tms(:,:) ) 
     99      zbg_vfx_sum = ztmp * glob_sum( wfx_sum(:,:) * area(:,:) * tms(:,:) ) 
     100      zbg_vfx_res = ztmp * glob_sum( wfx_res(:,:) * area(:,:) * tms(:,:) ) 
     101      zbg_vfx_spr = ztmp * glob_sum( wfx_spr(:,:) * area(:,:) * tms(:,:) ) 
     102      zbg_vfx_snw = ztmp * glob_sum( wfx_snw(:,:) * area(:,:) * tms(:,:) ) 
     103      zbg_vfx_sub = ztmp * glob_sum( wfx_sub(:,:) * area(:,:) * tms(:,:) ) 
    103104 
    104105      ! Salt 
    105       zbg_sfx     = zinda * glob_sum(     sfx(:,:) * area(:,:) * tms(:,:) ) * z1_area * r1_rau0 * rday 
    106       zbg_sfx_bri = zinda * glob_sum( sfx_bri(:,:) * area(:,:) * tms(:,:) ) * z1_area * r1_rau0 * rday 
    107       zbg_sfx_res = zinda * glob_sum( sfx_res(:,:) * area(:,:) * tms(:,:) ) * z1_area * r1_rau0 * rday 
    108       zbg_sfx_dyn = zinda * glob_sum( sfx_dyn(:,:) * area(:,:) * tms(:,:) ) * z1_area * r1_rau0 * rday 
    109  
    110       zbg_sfx_bog = zinda * glob_sum( sfx_bog(:,:) * area(:,:) * tms(:,:) ) * z1_area * r1_rau0 * rday 
    111       zbg_sfx_opw = zinda * glob_sum( sfx_opw(:,:) * area(:,:) * tms(:,:) ) * z1_area * r1_rau0 * rday 
    112       zbg_sfx_sni = zinda * glob_sum( sfx_sni(:,:) * area(:,:) * tms(:,:) ) * z1_area * r1_rau0 * rday 
    113       zbg_sfx_bom = zinda * glob_sum( sfx_bom(:,:) * area(:,:) * tms(:,:) ) * z1_area * r1_rau0 * rday 
    114       zbg_sfx_sum = zinda * glob_sum( sfx_sum(:,:) * area(:,:) * tms(:,:) ) * z1_area * r1_rau0 * rday 
     106      zbg_sfx     = ztmp * glob_sum(     sfx(:,:) * area(:,:) * tms(:,:) ) 
     107      zbg_sfx_bri = ztmp * glob_sum( sfx_bri(:,:) * area(:,:) * tms(:,:) ) 
     108      zbg_sfx_res = ztmp * glob_sum( sfx_res(:,:) * area(:,:) * tms(:,:) ) 
     109      zbg_sfx_dyn = ztmp * glob_sum( sfx_dyn(:,:) * area(:,:) * tms(:,:) ) 
     110 
     111      zbg_sfx_bog = ztmp * glob_sum( sfx_bog(:,:) * area(:,:) * tms(:,:) ) 
     112      zbg_sfx_opw = ztmp * glob_sum( sfx_opw(:,:) * area(:,:) * tms(:,:) ) 
     113      zbg_sfx_sni = ztmp * glob_sum( sfx_sni(:,:) * area(:,:) * tms(:,:) ) 
     114      zbg_sfx_bom = ztmp * glob_sum( sfx_bom(:,:) * area(:,:) * tms(:,:) ) 
     115      zbg_sfx_sum = ztmp * glob_sum( sfx_sum(:,:) * area(:,:) * tms(:,:) ) 
    115116 
    116117      ! Heat budget 
     
    152153      ! 3 - Diagnostics writing ! 
    153154      ! ----------------------- ! 
    154       zindb = MAX( 0.d0 , SIGN( 1.d0 , zbg_ivo - epsi06 ) ) 
    155       ! 
     155      rswitch = MAX( 0._wp , SIGN( 1._wp , zbg_ivo - epsi06 ) ) 
     156      ! 
     157      IF( iom_use('ibgvoltot') )   & 
    156158      CALL iom_put( 'ibgvoltot' , zbg_ivo * rhoic * r1_rau0 * 1.e-9        )   ! ice volume (km3 equivalent liquid)          
     159      IF( iom_use('sbgvoltot') )   & 
    157160      CALL iom_put( 'sbgvoltot' , zbg_svo * rhosn * r1_rau0 * 1.e-9        )   ! snw volume (km3 equivalent liquid)        
     161      IF( iom_use('ibgarea') )   & 
    158162      CALL iom_put( 'ibgarea'   , zbg_are * 1.e-6                          )   ! ice area   (km2) 
    159       CALL iom_put( 'ibgsaline' , zindb * zbg_sal / MAX( zbg_ivo, epsi06 ) )   ! ice saline (psu) 
    160       CALL iom_put( 'ibgtemper' , zindb * zbg_tem / MAX( zbg_ivo, epsi06 ) )   ! ice temper (C) 
     163      IF( iom_use('ibgsaline') )   & 
     164      CALL iom_put( 'ibgsaline' , rswitch * zbg_sal / MAX( zbg_ivo, epsi06 ) )   ! ice saline (psu) 
     165      IF( iom_use('ibgtemper') )   & 
     166      CALL iom_put( 'ibgtemper' , rswitch * zbg_tem / MAX( zbg_ivo, epsi06 ) )   ! ice temper (C) 
    161167      CALL iom_put( 'ibgheatco' , zbg_ihc                                  )   ! ice heat content (1.e20 J)         
    162168      CALL iom_put( 'sbgheatco' , zbg_shc                                  )   ! snw heat content (1.e20 J) 
     169      IF( iom_use('ibgsaltco') )   & 
    163170      CALL iom_put( 'ibgsaltco' , zbg_sal * rhoic * r1_rau0 * 1.e-9        )   ! ice salt content (psu*km3 equivalent liquid)         
    164171 
     
    203210      CALL iom_put( 'ibgfrcvol' , frc_vol * 1.e-9                          )   ! vol - forcing     (km3 equivalent liquid)  
    204211      CALL iom_put( 'ibgfrcsfx' , frc_sal * 1.e-9                          )   ! sal - forcing     (psu*km3 equivalent liquid)    
     212      IF( iom_use('ibgvolgrm') )   & 
    205213      CALL iom_put( 'ibgvolgrm' , bg_grme * r1_rau0 * 1.e-9                )   ! vol growth + melt (km3 equivalent liquid)          
    206214 
     
    243251      ! 2 - initial conservation variables ! 
    244252      ! ---------------------------------- ! 
    245       !frc_vol = 0.d0                                           ! volume       trend due to forcing 
    246       !frc_sal = 0.d0                                           ! salt content   -    -   -    -          
    247       !bg_grme = 0.d0                                           ! ice growth + melt volume trend 
     253      !frc_vol = 0._wp                                          ! volume       trend due to forcing 
     254      !frc_sal = 0._wp                                          ! salt content   -    -   -    -          
     255      !bg_grme = 0._wp                                          ! ice growth + melt volume trend 
    248256      ! 
    249257      CALL lim_diahsb_rst( nstart, 'READ' )  !* read or initialize all required files 
     
    279287           IF(lwp) WRITE(numout,*) ' lim_diahsb at initial state ' 
    280288           IF(lwp) WRITE(numout,*) '~~~~~~~' 
    281            frc_vol  = 0.d0                                            
    282            frc_sal  = 0.d0                                                   
    283            bg_grme  = 0.d0                                         
    284        ENDIF    
     289           frc_vol  = 0._wp                                           
     290           frc_sal  = 0._wp                                                  
     291           bg_grme  = 0._wp                                        
     292       ENDIF 
    285293 
    286294     ELSEIF( TRIM(cdrw) == 'WRITE' ) THEN   ! Create restart file 
  • branches/2014/dev_r4650_UKMO11_restart_functionality/NEMOGCM/NEMO/LIM_SRC_3/limdyn.F90

    r4688 r5208  
    6464      INTEGER  ::   i_j1, i_jpj       ! Starting/ending j-indices for rheology 
    6565      REAL(wp) ::   zcoef             ! local scalar 
    66       REAL(wp), POINTER, DIMENSION(:)   ::   zind           ! i-averaged indicator of sea-ice 
     66      REAL(wp), POINTER, DIMENSION(:)   ::   zswitch        ! i-averaged indicator of sea-ice 
    6767      REAL(wp), POINTER, DIMENSION(:)   ::   zmsk           ! i-averaged of tmask 
    6868      REAL(wp), POINTER, DIMENSION(:,:) ::   zu_io, zv_io   ! ice-ocean velocity 
     
    7474 
    7575      CALL wrk_alloc( jpi, jpj, zu_io, zv_io ) 
    76       CALL wrk_alloc( jpj, zind, zmsk ) 
     76      CALL wrk_alloc( jpj, zswitch, zmsk ) 
    7777 
    7878      IF( kt == nit000 )   CALL lim_dyn_init   ! Initialization (first time-step only) 
     
    8383         IF( ln_limdiahsb ) CALL lim_cons_hsm(0, 'limdyn', zvi_b, zsmv_b, zei_b, zfw_b, zfs_b, zft_b) 
    8484 
    85          old_u_ice(:,:) = u_ice(:,:) * tmu(:,:) 
    86          old_v_ice(:,:) = v_ice(:,:) * tmv(:,:) 
     85         u_ice_b(:,:) = u_ice(:,:) * tmu(:,:) 
     86         v_ice_b(:,:) = v_ice(:,:) * tmv(:,:) 
    8787 
    8888         ! Rheology (ice dynamics) 
     
    100100            ! 
    101101            DO jj = 1, jpj 
    102                zind(jj) = SUM( 1.0 - at_i(:,jj) )   ! = REAL(jpj) if ocean everywhere on a j-line 
     102               zswitch(jj) = SUM( 1.0 - at_i(:,jj) )   ! = REAL(jpj) if ocean everywhere on a j-line 
    103103               zmsk(jj) = SUM( tmask(:,jj,1)    )   ! = 0         if land  everywhere on a j-line 
    104104            END DO 
     
    110110               i_j1  = njeq 
    111111               i_jpj = jpj 
    112                DO WHILE ( i_j1 <= jpj .AND. zind(i_j1) == FLOAT(jpi) .AND. zmsk(i_j1) /=0 ) 
     112               DO WHILE ( i_j1 <= jpj .AND. zswitch(i_j1) == FLOAT(jpi) .AND. zmsk(i_j1) /=0 ) 
    113113                  i_j1 = i_j1 + 1 
    114114               END DO 
     
    120120               i_j1  =  1 
    121121               i_jpj = njeq 
    122                DO WHILE ( i_jpj >= 1 .AND. zind(i_jpj) == FLOAT(jpi) .AND. zmsk(i_jpj) /=0 ) 
     122               DO WHILE ( i_jpj >= 1 .AND. zswitch(i_jpj) == FLOAT(jpi) .AND. zmsk(i_jpj) /=0 ) 
    123123                  i_jpj = i_jpj - 1 
    124124               END DO 
     
    132132               !                                 ! latitude strip 
    133133               i_j1  = 1 
    134                DO WHILE ( i_j1 <= jpj .AND. zind(i_j1) == FLOAT(jpi) .AND. zmsk(i_j1) /=0 ) 
     134               DO WHILE ( i_j1 <= jpj .AND. zswitch(i_j1) == FLOAT(jpi) .AND. zmsk(i_j1) /=0 ) 
    135135                  i_j1 = i_j1 + 1 
    136136               END DO 
     
    138138 
    139139               i_jpj  = jpj 
    140                DO WHILE ( i_jpj >= 1  .AND. zind(i_jpj) == FLOAT(jpi) .AND. zmsk(i_jpj) /=0 ) 
     140               DO WHILE ( i_jpj >= 1  .AND. zswitch(i_jpj) == FLOAT(jpi) .AND. zmsk(i_jpj) /=0 ) 
    141141                  i_jpj = i_jpj - 1 
    142142               END DO 
     
    221221      ! 
    222222      CALL wrk_dealloc( jpi, jpj, zu_io, zv_io ) 
    223       CALL wrk_dealloc( jpj, zind, zmsk ) 
     223      CALL wrk_dealloc( jpj, zswitch, zmsk ) 
    224224      ! 
    225225      IF( nn_timing == 1 )  CALL timing_stop('limdyn') 
     
    241241      !!------------------------------------------------------------------- 
    242242      INTEGER  ::   ios                 ! Local integer output status for namelist read 
    243       NAMELIST/namicedyn/ epsd, om, cw, angvg, pstar,   & 
     243      NAMELIST/namicedyn/ epsd, om, cw, pstar,   & 
    244244         &                c_rhg, creepl, ecc, ahi0,     & 
    245          &                nevp, telast, alphaevp, hminrhg 
     245         &                nevp, relast, alphaevp, hminrhg 
    246246      !!------------------------------------------------------------------- 
    247247 
     
    262262         WRITE(numout,*) '   relaxation constant                              om     = ', om 
    263263         WRITE(numout,*) '   drag coefficient for oceanic stress              cw     = ', cw 
    264          WRITE(numout,*) '   turning angle for oceanic stress                 angvg  = ', angvg 
    265264         WRITE(numout,*) '   first bulk-rheology parameter                    pstar  = ', pstar 
    266265         WRITE(numout,*) '   second bulk-rhelogy parameter                    c_rhg  = ', c_rhg 
     
    269268         WRITE(numout,*) '   horizontal diffusivity coeff. for sea-ice        ahi0   = ', ahi0 
    270269         WRITE(numout,*) '   number of iterations for subcycling              nevp   = ', nevp 
    271          WRITE(numout,*) '   timescale for elastic waves                      telast = ', telast 
     270         WRITE(numout,*) '   ratio of elastic timescale over ice time step    relast = ', relast 
    272271         WRITE(numout,*) '   coefficient for the solution of int. stresses  alphaevp = ', alphaevp 
    273272         WRITE(numout,*) '   min ice thickness for rheology calculations     hminrhg = ', hminrhg 
    274273      ENDIF 
    275274      ! 
    276       IF( angvg /= 0._wp ) THEN 
    277          CALL ctl_warn( 'lim_dyn_init: turning angle for oceanic stress not properly coded for EVP ',   & 
    278             &           '(see limsbc module). We force  angvg = 0._wp'  ) 
    279          angvg = 0._wp 
    280       ENDIF 
    281        
    282275      usecc2 = 1._wp / ( ecc * ecc ) 
    283276      rhoco  = rau0  * cw 
    284       angvg  = angvg * rad 
    285       sangvg = SIN( angvg ) 
    286       cangvg = COS( angvg ) 
    287       pstarh = pstar * 0.5_wp 
     277 
     278      ! elastic damping 
     279      telast = relast * rdt_ice 
    288280 
    289281      !  Diffusion coefficients. 
  • branches/2014/dev_r4650_UKMO11_restart_functionality/NEMOGCM/NEMO/LIM_SRC_3/limhdf.F90

    r4333 r5208  
    8383      zdiv0(:, 1 ) = 0._wp 
    8484      zdiv0(:,jpj) = 0._wp 
    85       IF( .NOT.lk_vopt_loop ) THEN 
    86          zflu (jpi,:) = 0._wp    
    87          zflv (jpi,:) = 0._wp 
    88          zdiv0(1,  :) = 0._wp 
    89          zdiv0(jpi,:) = 0._wp 
    90       ENDIF 
     85      zflu (jpi,:) = 0._wp    
     86      zflv (jpi,:) = 0._wp 
     87      zdiv0(1,  :) = 0._wp 
     88      zdiv0(jpi,:) = 0._wp 
    9189 
    9290      zconv = 1._wp           !==  horizontal diffusion using a Crant-Nicholson scheme  ==! 
  • branches/2014/dev_r4650_UKMO11_restart_functionality/NEMOGCM/NEMO/LIM_SRC_3/limistate.F90

    r4688 r5208  
    66   !! History :  2.0  ! 2004-01 (C. Ethe, G. Madec)  Original code 
    77   !!            4.0  ! 2011-02 (G. Madec) dynamical allocation 
    8    !!             -   ! 2012    (C. Rousset) add par_oce (for jp_sal)...bug? 
     8   !!             -   ! 2014    (C. Rousset) add N/S initializations 
    99   !!---------------------------------------------------------------------- 
    1010#if defined key_lim3 
     
    2929   USE lib_fortran      ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined)   
    3030   USE wrk_nemo         ! work arrays 
    31    USE cpl_oasis3, ONLY : lk_cpl 
    3231 
    3332   IMPLICIT NONE 
     
    3635   PUBLIC   lim_istate      ! routine called by lim_init.F90 
    3736 
    38    !! * Module variables 
    3937   !                          !!** init namelist (namiceini) ** 
    4038   REAL(wp) ::   thres_sst   ! threshold water temperature for initial sea ice 
     
    5654   !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt) 
    5755   !!---------------------------------------------------------------------- 
    58  
    5956CONTAINS 
    6057 
     
    8077      !! 
    8178      !! ** Notes   : o_i, t_su, t_s, t_i, s_i must be filled everywhere, even 
    82       !!              where there is no ice (clem: I do not know why but it is mandatory)  
     79      !!              where there is no ice (clem: I do not know why, is it mandatory?)  
    8380      !! 
    8481      !! History : 
     
    116113      CALL lim_istate_init     !  reading the initials parameters of the ice 
    117114 
    118 # if defined key_coupled 
    119       albege(:,:)   = 0.8 * tms(:,:) 
    120 # endif 
    121  
    122115      ! surface temperature 
    123116      DO jl = 1, jpl ! loop over categories 
     
    125118         tn_ice(:,:,jl) = rtt * tms(:,:) 
    126119      END DO 
    127       ! Basal temperature is set to the freezing point of seawater in Kelvin 
    128       t_bo(:,:) = ( tfreez( tsn(:,:,1,jp_sal) ) + rt0 ) * tms(:,:)  
     120 
     121      ! basal temperature (considered at freezing point) 
     122      t_bo(:,:) = ( eos_fzp( tsn(:,:,1,jp_sal) ) + rt0 ) * tms(:,:)  
    129123 
    130124      IF( ln_limini ) THEN 
     
    133127      ! 2) Basal temperature, ice mask and hemispheric index 
    134128      !-------------------------------------------------------------------- 
    135       ! ice if sst <= t-freez + thres_sst 
    136       DO jj = 1, jpj                                        
     129 
     130      DO jj = 1, jpj                                       ! ice if sst <= t-freez + ttest 
    137131         DO ji = 1, jpi 
    138             IF( ( tsn(ji,jj,1,jp_tem)  - ( t_bo(ji,jj) - rt0 ) ) * tms(ji,jj) >= thres_sst ) THEN  ; zswitch(ji,jj) = 0._wp * tms(ji,jj)    ! no ice 
    139             ELSE                                                                                   ; zswitch(ji,jj) = 1._wp * tms(ji,jj)    !    ice 
     132            IF( ( tsn(ji,jj,1,jp_tem)  - ( t_bo(ji,jj) - rt0 ) ) * tms(ji,jj) >= thres_sst ) THEN  
     133               zswitch(ji,jj) = 0._wp * tms(ji,jj)    ! no ice 
     134            ELSE                                                                                    
     135               zswitch(ji,jj) = 1._wp * tms(ji,jj)    !    ice 
    140136            ENDIF 
    141137         END DO 
     
    144140 
    145141      ! Hemispheric index 
    146       ! MV 2011 new initialization 
    147142      DO jj = 1, jpj 
    148143         DO ji = 1, jpi 
     
    154149         END DO 
    155150      END DO 
    156       ! END MV 2011 new initialization 
    157151 
    158152      !-------------------------------------------------------------------- 
     
    299293 
    300294      IF(lwp) THEN  
    301          WRITE(numout,*), ' ztests : ', ztests 
     295         WRITE(numout,*) ' ztests : ', ztests 
    302296         IF ( ztests .NE. 4 ) THEN 
    303297            WRITE(numout,*) 
    304             WRITE(numout,*), ' !!!! ALERT                  !!! ' 
    305             WRITE(numout,*), ' !!!! Something is wrong in the LIM3 initialization procedure ' 
     298            WRITE(numout,*) ' !!!! ALERT                  !!! ' 
     299            WRITE(numout,*) ' !!!! Something is wrong in the LIM3 initialization procedure ' 
    306300            WRITE(numout,*) 
    307             WRITE(numout,*), ' *** ztests is not equal to 4 ' 
    308             WRITE(numout,*), ' *** ztest_i (i=1,4) = ', ztest_1, ztest_2, ztest_3, ztest_4 
    309             WRITE(numout,*), ' zat_i_ini : ', zat_i_ini(i_hemis) 
    310             WRITE(numout,*), ' zht_i_ini : ', zht_i_ini(i_hemis) 
     301            WRITE(numout,*) ' *** ztests is not equal to 4 ' 
     302            WRITE(numout,*) ' *** ztest_i (i=1,4) = ', ztest_1, ztest_2, ztest_3, ztest_4 
     303            WRITE(numout,*) ' zat_i_ini : ', zat_i_ini(i_hemis) 
     304            WRITE(numout,*) ' zht_i_ini : ', zht_i_ini(i_hemis) 
    311305         ENDIF ! ztests .NE. 4 
    312306      ENDIF 
  • branches/2014/dev_r4650_UKMO11_restart_functionality/NEMOGCM/NEMO/LIM_SRC_3/limitd_me.F90

    r4688 r5208  
    4343   PUBLIC   lim_itd_me_alloc        ! called by iceini.F90 
    4444 
    45    REAL(wp) ::   epsi20 = 1.e-20_wp   ! constant values 
    46    REAL(wp) ::   epsi10 = 1.e-10_wp   ! constant values 
    47    REAL(wp) ::   epsi06 = 1.e-06_wp   ! constant values 
    48  
    4945   !----------------------------------------------------------------------- 
    5046   ! Variables shared among ridging subroutines 
     
    149145 
    150146      CALL wrk_alloc( jpi, jpj, closing_net, divu_adv, opning, closing_gross, msnow_mlt, esnow_mlt, vt_i_init, vt_i_final ) 
    151  
    152       IF( numit == nstart  )   CALL lim_itd_me_init   ! Initialization (first time-step only) 
    153147 
    154148      IF(ln_ctl) THEN 
     
    694688 
    695689      IF( partfun_swi == 0 ) THEN       !--- Linear formulation (Thorndike et al., 1975) 
    696          DO jl = 0, ice_cat_bounds(1,2)       ! only undeformed ice participates 
     690         DO jl = 0, jpl     
    697691            DO jj = 1, jpj  
    698692               DO ji = 1, jpi 
     
    717711            Gsum(:,:,jl) = EXP( -Gsum(:,:,jl) * astari ) * zdummy 
    718712         END DO !jl 
    719          DO jl = 0, ice_cat_bounds(1,2) 
     713         DO jl = 0, jpl 
    720714             athorn(:,:,jl) = Gsum(:,:,jl-1) - Gsum(:,:,jl) 
    721715         END DO 
     
    853847      INTEGER ::   ij                ! horizontal index, combines i and j loops 
    854848      INTEGER ::   icells            ! number of cells with aicen > puny 
    855       REAL(wp) ::   zindb    ! local scalar 
    856849      REAL(wp) ::   hL, hR, farea, zdummy, zdummy0, ztmelts    ! left and right limits of integration 
    857850      REAL(wp) ::   zsstK            ! SST in Kelvin 
     
    899892      CALL wrk_alloc( jpi, jpj,             afrft, arft1, arft2, virft, vsrft, esrft, smrft, oirft1, oirft2 ) 
    900893      CALL wrk_alloc( jpi, jpj, jpl,        aicen_init, vicen_init, vsnwn_init, esnwn_init, smv_i_init, oa_i_init ) 
    901       CALL wrk_alloc( jpi, jpj, jkmax,      eirft, erdg1, erdg2, ersw ) 
    902       CALL wrk_alloc( jpi, jpj, jkmax, jpl, eicen_init ) 
     894      CALL wrk_alloc( jpi, jpj, nlay_i+1,      eirft, erdg1, erdg2, ersw ) 
     895      CALL wrk_alloc( jpi, jpj, nlay_i+1, jpl, eicen_init ) 
    903896 
    904897      ! Conservation check 
     
    10371030            !     / rafting category n1. 
    10381031            !-------------------------------------------------------------------------- 
    1039             vrdg1(ji,jj) = vicen_init(ji,jj,jl1) * afrac(ji,jj) / ( 1._wp + ridge_por ) 
     1032            vrdg1(ji,jj) = vicen_init(ji,jj,jl1) * afrac(ji,jj) 
    10401033            vrdg2(ji,jj) = vrdg1(ji,jj) * ( 1. + ridge_por ) 
    10411034            vsw  (ji,jj) = vrdg1(ji,jj) * ridge_por 
     
    10431036            vsrdg(ji,jj) = vsnwn_init(ji,jj,jl1) * afrac(ji,jj) 
    10441037            esrdg(ji,jj) = esnwn_init(ji,jj,jl1) * afrac(ji,jj) 
    1045             srdg1(ji,jj) = smv_i_init(ji,jj,jl1) * afrac(ji,jj) / ( 1._wp + ridge_por ) 
     1038            srdg1(ji,jj) = smv_i_init(ji,jj,jl1) * afrac(ji,jj) 
    10461039            srdg2(ji,jj) = smv_i_init(ji,jj,jl1) * afrac(ji,jj) !! MV HC 2014 this line seems useless 
    10471040 
     
    11281121               jj = indxj(ij) 
    11291122               ! heat content of ridged ice 
    1130                erdg1(ji,jj,jk)      = eicen_init(ji,jj,jk,jl1) * afrac(ji,jj) / ( 1._wp + ridge_por )  
     1123               erdg1(ji,jj,jk)      = eicen_init(ji,jj,jk,jl1) * afrac(ji,jj)  
    11311124               eirft(ji,jj,jk)      = eicen_init(ji,jj,jk,jl1) * afrft(ji,jj) 
    11321125               e_i  (ji,jj,jk,jl1)  = e_i(ji,jj,jk,jl1) - erdg1(ji,jj,jk) - eirft(ji,jj,jk) 
     
    11951188         !------------------------------------------------------------------------------- 
    11961189         !        jl1 looping 1-jpl 
    1197          DO jl2  = ice_cat_bounds(1,1), ice_cat_bounds(1,2)  
     1190         DO jl2  = 1, jpl  
    11981191            ! over categories to which ridged ice is transferred 
    11991192!CDIR NODEP 
     
    12401233         END DO                 ! jl2 (new ridges)             
    12411234 
    1242          DO jl2 = ice_cat_bounds(1,1), ice_cat_bounds(1,2)  
     1235         DO jl2 = 1, jpl  
    12431236 
    12441237!CDIR NODEP 
     
    13041297      CALL wrk_dealloc( jpi, jpj,             afrft, arft1, arft2, virft, vsrft, esrft, smrft, oirft1, oirft2 ) 
    13051298      CALL wrk_dealloc( jpi, jpj, jpl,        aicen_init, vicen_init, vsnwn_init, esnwn_init, smv_i_init, oa_i_init ) 
    1306       CALL wrk_dealloc( jpi, jpj, jkmax,      eirft, erdg1, erdg2, ersw ) 
    1307       CALL wrk_dealloc( jpi, jpj, jkmax, jpl, eicen_init ) 
     1299      CALL wrk_dealloc( jpi, jpj, nlay_i+1,      eirft, erdg1, erdg2, ersw ) 
     1300      CALL wrk_dealloc( jpi, jpj, nlay_i+1, jpl, eicen_init ) 
    13081301      ! 
    13091302   END SUBROUTINE lim_itd_me_ridgeshift 
  • branches/2014/dev_r4650_UKMO11_restart_functionality/NEMOGCM/NEMO/LIM_SRC_3/limitd_th.F90

    r4688 r5208  
    66   !! History :   -   !          (W. H. Lipscomb and E.C. Hunke) CICE (c) original code 
    77   !!            3.0  ! 2005-12  (M. Vancoppenolle) adaptation to LIM-3 
    8    !!             -   ! 2006-06  (M. Vancoppenolle) adaptation to include salt, age and types 
     8   !!             -   ! 2006-06  (M. Vancoppenolle) adaptation to include salt, age 
    99   !!             -   ! 2007-04  (M. Vancoppenolle) Mass conservation checked 
    1010   !!---------------------------------------------------------------------- 
     
    4646   PUBLIC   lim_itd_shiftice 
    4747 
    48    REAL(wp) ::   epsi10 = 1.e-10_wp   ! 
    49    REAL(wp) ::   epsi06 = 1.e-6_wp   ! 
    50  
    5148   !!---------------------------------------------------------------------- 
    5249   !! NEMO/LIM3 4.0 , UCL - NEMO Consortium (2010) 
     
    6663      INTEGER, INTENT(in) ::   kt   ! time step index 
    6764      ! 
    68       INTEGER ::   ji,jj, jk, jl, ja, jm, jbnd1, jbnd2   ! ice types    dummy loop index          
     65      INTEGER ::   ji, jj, jk, jl   ! dummy loop index          
    6966      ! 
    7067      REAL(wp) :: zvi_b, zsmv_b, zei_b, zfs_b, zfw_b, zft_b  
     
    8683      ! Given thermodynamic growth rates, transport ice between 
    8784      ! thickness categories. 
    88       DO jm = 1, jpm 
    89          jbnd1 = ice_cat_bounds(jm,1) 
    90          jbnd2 = ice_cat_bounds(jm,2) 
    91          IF( ice_ncat_types(jm) > 1 )   CALL lim_itd_th_rem( jbnd1, jbnd2, jm, kt ) 
    92       END DO 
     85      IF( jpl > 1 )   CALL lim_itd_th_rem( 1, jpl, kt ) 
    9386      ! 
    9487      CALL lim_var_glo2eqv    ! only for info 
     
    123116            CALL prt_ctl(tab2d_1=sm_i  (:,:,jl)   , clinfo1= ' lim_itd_th  : sm_i     : ') 
    124117            CALL prt_ctl(tab2d_1=smv_i (:,:,jl)   , clinfo1= ' lim_itd_th  : smv_i    : ') 
    125             DO ja = 1, nlay_i 
     118            DO jk = 1, nlay_i 
    126119               CALL prt_ctl_info(' ') 
    127                CALL prt_ctl_info(' - Layer : ', ivar1=ja) 
     120               CALL prt_ctl_info(' - Layer : ', ivar1=jk) 
    128121               CALL prt_ctl_info('   ~~~~~~~') 
    129                CALL prt_ctl(tab2d_1=t_i(:,:,ja,jl) , clinfo1= ' lim_itd_th  : t_i      : ') 
    130                CALL prt_ctl(tab2d_1=e_i(:,:,ja,jl) , clinfo1= ' lim_itd_th  : e_i      : ') 
     122               CALL prt_ctl(tab2d_1=t_i(:,:,jk,jl) , clinfo1= ' lim_itd_th  : t_i      : ') 
     123               CALL prt_ctl(tab2d_1=e_i(:,:,jk,jl) , clinfo1= ' lim_itd_th  : e_i      : ') 
    131124            END DO 
    132125         END DO 
     
    140133   ! 
    141134 
    142    SUBROUTINE lim_itd_th_rem( klbnd, kubnd, ntyp, kt ) 
     135   SUBROUTINE lim_itd_th_rem( klbnd, kubnd, kt ) 
    143136      !!------------------------------------------------------------------ 
    144137      !!                ***  ROUTINE lim_itd_th_rem *** 
     
    153146      INTEGER , INTENT (in) ::   klbnd   ! Start thickness category index point 
    154147      INTEGER , INTENT (in) ::   kubnd   ! End point on which the  the computation is applied 
    155       INTEGER , INTENT (in) ::   ntyp    ! Number of the type used 
    156148      INTEGER , INTENT (in) ::   kt      ! Ocean time step  
    157149      ! 
     
    161153      REAL(wp) ::   zx1, zwk1, zdh0, zetamin, zdamax   ! local scalars 
    162154      REAL(wp) ::   zx2, zwk2, zda0, zetamax           !   -      - 
    163       REAL(wp) ::   zx3,             zareamin, zindb   !   -      - 
     155      REAL(wp) ::   zx3,             zareamin          !   -      - 
    164156      CHARACTER (len = 15) :: fieldid 
    165157 
     
    171163      REAL(wp), POINTER, DIMENSION(:,:,:) ::   hL          ! left boundary for the ITD for each thickness 
    172164      REAL(wp), POINTER, DIMENSION(:,:,:) ::   hR          ! left boundary for the ITD for each thickness 
    173       REAL(wp), POINTER, DIMENSION(:,:,:) ::   zht_i_o     ! old ice thickness 
     165      REAL(wp), POINTER, DIMENSION(:,:,:) ::   zht_i_b     ! old ice thickness 
    174166      REAL(wp), POINTER, DIMENSION(:,:,:) ::   dummy_es 
    175167      REAL(wp), POINTER, DIMENSION(:,:,:) ::   zdaice, zdvice          ! local increment of ice area and volume 
     
    189181      CALL wrk_alloc( jpi,jpj, zremap_flag )    ! integer 
    190182      CALL wrk_alloc( jpi,jpj,jpl-1, zdonor )   ! integer 
    191       CALL wrk_alloc( jpi,jpj,jpl, zdhice, g0, g1, hL, hR, zht_i_o, dummy_es ) 
     183      CALL wrk_alloc( jpi,jpj,jpl, zdhice, g0, g1, hL, hR, zht_i_b, dummy_es ) 
    192184      CALL wrk_alloc( jpi,jpj,jpl-1, zdaice, zdvice )    
    193185      CALL wrk_alloc( jpi,jpj,jpl+1, zhbnew, kkstart = 0 )    
     
    218210         WRITE(numout,*) ' klbnd :       ', klbnd 
    219211         WRITE(numout,*) ' kubnd :       ', kubnd 
    220          WRITE(numout,*) ' ntyp  :       ', ntyp  
    221212      ENDIF 
    222213 
     
    225216         DO jj = 1, jpj 
    226217            DO ji = 1, jpi 
    227                zindb             = 1.0 - MAX( 0.0, SIGN( 1.0, - a_i(ji,jj,jl) + epsi10 ) )     !0 if no ice and 1 if yes 
    228                ht_i(ji,jj,jl)    = v_i(ji,jj,jl) / MAX( a_i(ji,jj,jl), epsi10 ) * zindb 
    229                zindb             = 1.0 - MAX( 0.0, SIGN( 1.0, - old_a_i(ji,jj,jl) + epsi10) ) !0 if no ice and 1 if yes 
    230                zht_i_o(ji,jj,jl) = old_v_i(ji,jj,jl) / MAX( old_a_i(ji,jj,jl), epsi10 ) * zindb 
    231                IF( a_i(ji,jj,jl) > epsi10 )   zdhice(ji,jj,jl) = ht_i(ji,jj,jl) - zht_i_o(ji,jj,jl)  
     218               rswitch             = 1.0 - MAX( 0.0, SIGN( 1.0, - a_i(ji,jj,jl) + epsi10 ) )     !0 if no ice and 1 if yes 
     219               ht_i(ji,jj,jl)    = v_i(ji,jj,jl) / MAX( a_i(ji,jj,jl), epsi10 ) * rswitch 
     220               rswitch             = 1.0 - MAX( 0.0, SIGN( 1.0, - a_i_b(ji,jj,jl) + epsi10) ) !0 if no ice and 1 if yes 
     221               zht_i_b(ji,jj,jl) = v_i_b(ji,jj,jl) / MAX( a_i_b(ji,jj,jl), epsi10 ) * rswitch 
     222               IF( a_i(ji,jj,jl) > epsi10 )   zdhice(ji,jj,jl) = ht_i(ji,jj,jl) - zht_i_b(ji,jj,jl)  
    232223            END DO 
    233224         END DO 
     
    274265            ! 
    275266            zhbnew(ii,ij,jl) = hi_max(jl) 
    276             IF ( old_a_i(ii,ij,jl) > epsi10 .AND. old_a_i(ii,ij,jl+1) > epsi10 ) THEN 
     267            IF ( a_i_b(ii,ij,jl) > epsi10 .AND. a_i_b(ii,ij,jl+1) > epsi10 ) THEN 
    277268               !interpolate between adjacent category growth rates 
    278                zslope           = ( zdhice(ii,ij,jl+1) - zdhice(ii,ij,jl) ) / ( zht_i_o(ii,ij,jl+1) - zht_i_o(ii,ij,jl) ) 
    279                zhbnew(ii,ij,jl) = hi_max(jl) + zdhice(ii,ij,jl) + zslope * ( hi_max(jl) - zht_i_o(ii,ij,jl) ) 
    280             ELSEIF ( old_a_i(ii,ij,jl) > epsi10) THEN 
     269               zslope           = ( zdhice(ii,ij,jl+1) - zdhice(ii,ij,jl) ) / ( zht_i_b(ii,ij,jl+1) - zht_i_b(ii,ij,jl) ) 
     270               zhbnew(ii,ij,jl) = hi_max(jl) + zdhice(ii,ij,jl) + zslope * ( hi_max(jl) - zht_i_b(ii,ij,jl) ) 
     271            ELSEIF ( a_i_b(ii,ij,jl) > epsi10) THEN 
    281272               zhbnew(ii,ij,jl) = hi_max(jl) + zdhice(ii,ij,jl) 
    282             ELSEIF ( old_a_i(ii,ij,jl+1) > epsi10) THEN 
     273            ELSEIF ( a_i_b(ii,ij,jl+1) > epsi10) THEN 
    283274               zhbnew(ii,ij,jl) = hi_max(jl) + zdhice(ii,ij,jl+1) 
    284275            ENDIF 
     
    321312      DO jj = 1, jpj 
    322313         DO ji = 1, jpi 
    323             zhb0(ji,jj) = hi_max_typ(0,ntyp) ! 0eme 
    324             zhb1(ji,jj) = hi_max_typ(1,ntyp) ! 1er 
     314            zhb0(ji,jj) = hi_max(0) ! 0eme 
     315            zhb1(ji,jj) = hi_max(1) ! 1er 
    325316 
    326317            zhbnew(ji,jj,klbnd-1) = 0._wp 
     
    343334      !----------------------------------------------------------------------------------------------- 
    344335      !- 7.1 g(h) for category 1 at start of time step 
    345       CALL lim_itd_fitline( klbnd, zhb0, zhb1, zht_i_o(:,:,klbnd),         & 
     336      CALL lim_itd_fitline( klbnd, zhb0, zhb1, zht_i_b(:,:,klbnd),         & 
    346337         &                  g0(:,:,klbnd), g1(:,:,klbnd), hL(:,:,klbnd),   & 
    347338         &                  hR(:,:,klbnd), zremap_flag ) 
     
    368359                  ! Constrain new thickness <= ht_i 
    369360                  zdamax = a_i(ii,ij,klbnd) * &  
    370                      (1.0 - ht_i(ii,ij,klbnd)/zht_i_o(ii,ij,klbnd)) ! zdamax > 0 
     361                     (1.0 - ht_i(ii,ij,klbnd)/zht_i_b(ii,ij,klbnd)) ! zdamax > 0 
    371362                  !ice area lost due to melting of thin ice 
    372363                  zda0   = MIN(zda0, zdamax) 
     
    382373            ELSE ! if ice accretion 
    383374               ! ji, a_i > epsi10; zdh0 > 0 
    384                IF ( ntyp .EQ. 1 ) zhbnew(ii,ij,klbnd-1) = MIN(zdh0,hi_max(klbnd))  
     375               zhbnew(ii,ij,klbnd-1) = MIN(zdh0,hi_max(klbnd))  
    385376               ! zhbnew was 0, and is shifted to the right to account for thin ice 
    386377               ! growth in openwater (F0 = f1) 
    387                IF ( ntyp .NE. 1 ) zhbnew(ii,ij,0) = 0  
    388                ! in other types there is 
    389                ! no open water growth (F0 = 0) 
    390378            ENDIF ! zdh0  
    391379 
     
    493481      CALL wrk_dealloc( jpi,jpj, zremap_flag )    ! integer 
    494482      CALL wrk_dealloc( jpi,jpj,jpl-1, zdonor )   ! integer 
    495       CALL wrk_dealloc( jpi,jpj,jpl, zdhice, g0, g1, hL, hR, zht_i_o, dummy_es ) 
     483      CALL wrk_dealloc( jpi,jpj,jpl, zdhice, g0, g1, hL, hR, zht_i_b, dummy_es ) 
    496484      CALL wrk_dealloc( jpi,jpj,jpl-1, zdaice, zdvice )    
    497485      CALL wrk_dealloc( jpi,jpj,jpl+1, zhbnew, kkstart = 0 )    
     
    598586      REAL(wp) ::   zdo_aice           ! ice age times volume transferred 
    599587      REAL(wp) ::   zdaTsf             ! aicen*Tsfcn transferred 
    600       REAL(wp) ::   zindsn             ! snow or not 
    601       REAL(wp) ::   zindb              ! ice or not 
    602588 
    603589      INTEGER, POINTER, DIMENSION(:) ::   nind_i, nind_j   ! compressed indices for i/j directions 
     
    726712 
    727713            jl1 = zdonor(ii,ij,jl) 
    728             zindb             = MAX( 0.0 , SIGN( 1.0 , v_i(ii,ij,jl1) - epsi10 ) ) 
    729             zworka(ii,ij)   = zdvice(ii,ij,jl) / MAX(v_i(ii,ij,jl1),epsi10) * zindb 
     714            rswitch             = MAX( 0.0 , SIGN( 1.0 , v_i(ii,ij,jl1) - epsi10 ) ) 
     715            zworka(ii,ij)   = zdvice(ii,ij,jl) / MAX(v_i(ii,ij,jl1),epsi10) * rswitch 
    730716            IF( jl1 == jl) THEN   ;   jl2 = jl1+1 
    731717            ELSE                    ;   jl2 = jl  
     
    823809                  ht_i(ji,jj,jl)  =  v_i   (ji,jj,jl) / a_i(ji,jj,jl)  
    824810                  t_su(ji,jj,jl)  =  zaTsfn(ji,jj,jl) / a_i(ji,jj,jl)  
    825                   zindsn          =  1.0 - MAX(0.0,SIGN(1.0,-v_s(ji,jj,jl)+epsi10)) !0 if no ice and 1 if yes 
     811                  rswitch         =  1.0 - MAX(0.0,SIGN(1.0,-v_s(ji,jj,jl)+epsi10)) !0 if no ice and 1 if yes 
    826812               ELSE 
    827813                  ht_i(ji,jj,jl)  = 0._wp 
     
    839825    
    840826 
    841    SUBROUTINE lim_itd_th_reb( klbnd, kubnd, ntyp ) 
     827   SUBROUTINE lim_itd_th_reb( klbnd, kubnd ) 
    842828      !!------------------------------------------------------------------ 
    843829      !!                ***  ROUTINE lim_itd_th_reb *** 
     
    849835      INTEGER , INTENT (in) ::   klbnd   ! Start thickness category index point 
    850836      INTEGER , INTENT (in) ::   kubnd   ! End point on which the  the computation is applied 
    851       INTEGER , INTENT (in) ::   ntyp    ! number of the ice type involved in the rebinning process 
    852837      ! 
    853838      INTEGER ::   ji,jj, jl   ! dummy loop indices 
     
    889874 
    890875      !------------------------------------------------------------------------------ 
    891       ! 2) Make sure thickness of cat klbnd is at least hi_max_typ(klbnd) 
     876      ! 2) Make sure thickness of cat klbnd is at least hi_max(klbnd) 
    892877      !------------------------------------------------------------------------------ 
    893878      DO jj = 1, jpj  
    894879         DO ji = 1, jpi  
    895880            IF( a_i(ji,jj,klbnd) > epsi10 ) THEN 
    896                IF( ht_i(ji,jj,klbnd) <= hi_max_typ(0,ntyp) .AND. hi_max_typ(0,ntyp) > 0._wp ) THEN 
    897                   a_i(ji,jj,klbnd)  = v_i(ji,jj,klbnd) / hi_max_typ(0,ntyp)  
    898                   ht_i(ji,jj,klbnd) = hi_max_typ(0,ntyp) 
     881               IF( ht_i(ji,jj,klbnd) <= hi_max(0) .AND. hi_max(0) > 0._wp ) THEN 
     882                  a_i(ji,jj,klbnd)  = v_i(ji,jj,klbnd) / hi_max(0)  
     883                  ht_i(ji,jj,klbnd) = hi_max(0) 
    899884               ENDIF 
    900885            ENDIF 
  • branches/2014/dev_r4650_UKMO11_restart_functionality/NEMOGCM/NEMO/LIM_SRC_3/limrhg.F90

    r4688 r5208  
    5050   PUBLIC   lim_rhg        ! routine called by lim_dyn (or lim_dyn_2) 
    5151 
    52    REAL(wp) ::   epsi10 = 1.e-10_wp   ! 
    53        
    5452   !! * Substitutions 
    5553#  include "vectopt_loop_substitute.h90" 
     
    119117      CHARACTER (len=50) ::   charout 
    120118      REAL(wp) ::   zt11, zt12, zt21, zt22, ztagnx, ztagny, delta                         ! 
    121       REAL(wp) ::   za, zstms, zsang, zmask   ! local scalars 
     119      REAL(wp) ::   za, zstms, zmask   ! local scalars 
     120      REAL(wp) ::   zc1, zc2, zc3             ! ice mass 
    122121 
    123122      REAL(wp) ::   dtevp              ! time step for subcycling 
     
    125124      REAL(wp) ::   z0, zr, zcca, zccb ! temporary scalars 
    126125      REAL(wp) ::   zu_ice2, zv_ice1   ! 
    127       REAL(wp) ::   zddc, zdtc, zzdst   ! delta on corners and on centre 
     126      REAL(wp) ::   zddc, zdtc         ! delta on corners and on centre 
     127      REAL(wp) ::   zdst               ! shear at the center of the grid point 
    128128      REAL(wp) ::   zdsshx, zdsshy     ! term for the gradient of ocean surface 
    129129      REAL(wp) ::   sigma1, sigma2     ! internal ice stress 
    130130 
    131131      REAL(wp) ::   zresm         ! Maximal error on ice velocity 
    132       REAL(wp) ::   zindb         ! ice (1) or not (0)       
    133132      REAL(wp) ::   zdummy        ! dummy argument 
    134133      REAL(wp) ::   zintb, zintn  ! dummy argument 
     
    140139      REAL(wp), POINTER, DIMENSION(:,:) ::   zcorl1, zcorl2   ! coriolis parameter on U/V points 
    141140      REAL(wp), POINTER, DIMENSION(:,:) ::   za1ct , za2ct    ! temporary arrays 
    142       REAL(wp), POINTER, DIMENSION(:,:) ::   zc1              ! ice mass 
    143       REAL(wp), POINTER, DIMENSION(:,:) ::   zusw             ! temporary weight for ice strength computation 
    144141      REAL(wp), POINTER, DIMENSION(:,:) ::   u_oce1, v_oce1   ! ocean u/v component on U points                            
    145142      REAL(wp), POINTER, DIMENSION(:,:) ::   u_oce2, v_oce2   ! ocean u/v component on V points 
     
    147144      REAL(wp), POINTER, DIMENSION(:,:) ::   zf1   , zf2      ! arrays for internal stresses 
    148145       
    149       REAL(wp), POINTER, DIMENSION(:,:) ::   zdd   , zdt      ! Divergence and tension at centre of grid cells 
     146      REAL(wp), POINTER, DIMENSION(:,:) ::   zdt              ! tension at centre of grid cells 
    150147      REAL(wp), POINTER, DIMENSION(:,:) ::   zds              ! Shear on northeast corner of grid cells 
    151       REAL(wp), POINTER, DIMENSION(:,:) ::   zdst             ! Shear on centre of grid cells 
    152       REAL(wp), POINTER, DIMENSION(:,:) ::   deltat, deltac   ! Delta at centre and corners of grid cells 
    153148      REAL(wp), POINTER, DIMENSION(:,:) ::   zs1   , zs2      ! Diagonal stress tensor components zs1 and zs2  
    154149      REAL(wp), POINTER, DIMENSION(:,:) ::   zs12             ! Non-diagonal stress tensor component zs12 
     
    160155 
    161156      CALL wrk_alloc( jpi,jpj, zpresh, zfrld1, zmass1, zcorl1, za1ct , zpreshc, zfrld2, zmass2, zcorl2, za2ct ) 
    162       CALL wrk_alloc( jpi,jpj, zc1   , u_oce1, u_oce2, u_ice2, zusw  , v_oce1 , v_oce2, v_ice1                ) 
    163       CALL wrk_alloc( jpi,jpj, zf1   , deltat, zu_ice, zf2   , deltac, zv_ice , zdd   , zdt    , zds  , zdst  ) 
    164       CALL wrk_alloc( jpi,jpj, zdd   , zdt   , zds   , zs1   , zs2   , zs12   , zresr , zpice                 ) 
     157      CALL wrk_alloc( jpi,jpj, u_oce1, u_oce2, u_ice2, v_oce1 , v_oce2, v_ice1                ) 
     158      CALL wrk_alloc( jpi,jpj, zf1   , zu_ice, zf2   , zv_ice , zdt    , zds  ) 
     159      CALL wrk_alloc( jpi,jpj, zdt   , zds   , zs1   , zs2   , zs12   , zresr , zpice                 ) 
    165160 
    166161#if  defined key_lim2 && ! defined key_lim2_vp 
     
    179174      ! 
    180175      !------------------------------------------------------------------------------! 
    181       ! 1) Ice-Snow mass (zc1), ice strength (zpresh)                                ! 
     176      ! 1) Ice strength (zpresh)                                ! 
    182177      !------------------------------------------------------------------------------! 
    183178      ! 
    184179      ! Put every vector to 0 
    185       zpresh (:,:) = 0._wp   ;   zc1   (:,:) = 0._wp 
     180      delta_i(:,:) = 0._wp   ; 
     181      zpresh (:,:) = 0._wp   ;   
    186182      zpreshc(:,:) = 0._wp 
    187183      u_ice2 (:,:) = 0._wp   ;   v_ice1(:,:) = 0._wp 
    188       zdd    (:,:) = 0._wp   ;   zdt   (:,:) = 0._wp   ;   zds(:,:) = 0._wp 
     184      divu_i (:,:) = 0._wp   ;   zdt   (:,:) = 0._wp   ;   zds(:,:) = 0._wp 
     185      shear_i(:,:) = 0._wp 
    189186 
    190187#if defined key_lim3 
     
    196193!CDIR NOVERRCHK 
    197194         DO ji = 1 , jpi 
    198             zc1(ji,jj)    = tms(ji,jj) * ( rhosn * vt_s(ji,jj) + rhoic * vt_i(ji,jj) ) 
    199195#if defined key_lim3 
    200196            zpresh(ji,jj) = tms(ji,jj) *  strength(ji,jj) 
     
    218214               &              tms(ji+1,jj)   * wght(ji+1,jj+1,2,1) + & 
    219215               &              tms(ji,jj)     * wght(ji+1,jj+1,1,1) 
    220             zusw(ji,jj)    = 1.0 / MAX( zstms, epsd ) 
    221216            zpreshc(ji,jj) = (  zpresh(ji+1,jj+1) * wght(ji+1,jj+1,2,2) + & 
    222217               &                zpresh(ji,jj+1)   * wght(ji+1,jj+1,1,2) + & 
    223218               &                zpresh(ji+1,jj)   * wght(ji+1,jj+1,2,1) + &  
    224219               &                zpresh(ji,jj)     * wght(ji+1,jj+1,1,1)   & 
    225                &             ) * zusw(ji,jj) 
     220               &             ) / MAX( zstms, epsd ) 
    226221         END DO 
    227222      END DO 
     
    265260         DO ji = fs_2, fs_jpim1 
    266261 
     262            zc1 = tms(ji  ,jj  ) * ( rhosn * vt_s(ji  ,jj  ) + rhoic * vt_i(ji  ,jj  ) ) 
     263            zc2 = tms(ji+1,jj  ) * ( rhosn * vt_s(ji+1,jj  ) + rhoic * vt_i(ji+1,jj  ) ) 
     264            zc3 = tms(ji  ,jj+1) * ( rhosn * vt_s(ji  ,jj+1) + rhoic * vt_i(ji  ,jj+1) ) 
     265 
    267266            zt11 = tms(ji  ,jj) * e1t(ji  ,jj) 
    268267            zt12 = tms(ji+1,jj) * e1t(ji+1,jj) 
     
    275274 
    276275            ! Mass, coriolis coeff. and currents 
    277             zmass1(ji,jj) = ( zt12*zc1(ji,jj) + zt11*zc1(ji+1,jj) ) / (zt11+zt12+epsd) 
    278             zmass2(ji,jj) = ( zt22*zc1(ji,jj) + zt21*zc1(ji,jj+1) ) / (zt21+zt22+epsd) 
     276            zmass1(ji,jj) = ( zt12*zc1 + zt11*zc2 ) / (zt11+zt12+epsd) 
     277            zmass2(ji,jj) = ( zt22*zc1 + zt21*zc3 ) / (zt21+zt22+epsd) 
    279278            zcorl1(ji,jj) = zmass1(ji,jj) * ( e1t(ji+1,jj)*fcor(ji,jj) + e1t(ji,jj)*fcor(ji+1,jj) )   & 
    280279               &                          / ( e1t(ji,jj) + e1t(ji+1,jj) + epsd ) 
     
    344343               !   
    345344               !- Divergence, tension and shear (Section a. Appendix B of Hunke & Dukowicz, 2002) 
    346                !- zdd(:,:), zdt(:,:): divergence and tension at centre of grid cells 
     345               !- divu_i(:,:), zdt(:,:): divergence and tension at centre of grid cells 
    347346               !- zds(:,:): shear on northeast corner of grid cells 
    348347               ! 
     
    353352               !                      bugs (Martin, for Miguel). 
    354353               ! 
    355                !- ALSO: arrays zdd, zdt, zds and delta could  
     354               !- ALSO: arrays zdt, zds and delta could  
    356355               !  be removed in the future to minimise memory demand. 
    357356               ! 
     
    361360               ! 
    362361               ! 
    363                zdd(ji,jj) = ( e2u(ji,jj)*u_ice(ji,jj)                      & 
    364                   &          -e2u(ji-1,jj)*u_ice(ji-1,jj)                  & 
    365                   &          +e1v(ji,jj)*v_ice(ji,jj)                      & 
    366                   &          -e1v(ji,jj-1)*v_ice(ji,jj-1)                  & 
    367                   &          )                                             & 
    368                   &         / area(ji,jj) 
     362               divu_i(ji,jj) = ( e2u(ji,jj)*u_ice(ji,jj)                      & 
     363                  &             -e2u(ji-1,jj)*u_ice(ji-1,jj)                  & 
     364                  &             +e1v(ji,jj)*v_ice(ji,jj)                      & 
     365                  &             -e1v(ji,jj-1)*v_ice(ji,jj-1)                  & 
     366                  &             )                                             & 
     367                  &            / area(ji,jj) 
    369368 
    370369               zdt(ji,jj) = ( ( u_ice(ji,jj)/e2u(ji,jj)                    & 
     
    408407 
    409408               !- Calculate Delta at centre of grid cells 
    410                zzdst      = (  e2u(ji  , jj) * v_ice1(ji  ,jj)          & 
     409               zdst      = (  e2u(ji  , jj) * v_ice1(ji  ,jj)          & 
    411410                  &          - e2u(ji-1, jj) * v_ice1(ji-1,jj)          & 
    412411                  &          + e1v(ji, jj  ) * u_ice2(ji,jj  )          & 
     
    415414                  &         / area(ji,jj) 
    416415 
    417                delta = SQRT( zdd(ji,jj)*zdd(ji,jj) + ( zdt(ji,jj)*zdt(ji,jj) + zzdst*zzdst ) * usecc2 )   
    418                ! MV rewriting 
    419                ! deltat(ji,jj) = MAX( SQRT(zdd(ji,jj)**2 + (zdt(ji,jj)**2 + zzdst**2)*usecc2), creepl ) 
    420                !!gm faster to replace the line above with simply: 
    421                !!                deltat(ji,jj) = MAX( delta, creepl ) 
    422                !!gm end   
    423                deltat(ji,jj) = delta + creepl 
    424                ! END MV 
     416               delta = SQRT( divu_i(ji,jj)*divu_i(ji,jj) + ( zdt(ji,jj)*zdt(ji,jj) + zdst*zdst ) * usecc2 )   
     417               delta_i(ji,jj) = delta + creepl 
    425418               !-Calculate stress tensor components zs1 and zs2  
    426419               !-at centre of grid cells (see section 3.5 of CICE user's guide). 
    427                !zs1(ji,jj) = ( zs1(ji,jj) - dtotel*( ( 1._wp - alphaevp) * zs1(ji,jj) +   & 
    428                !   &          ( delta / deltat(ji,jj) - zdd(ji,jj) / deltat(ji,jj) ) * zpresh(ji,jj) ) )  &        
    429                !   &          / ( 1._wp + alphaevp * dtotel ) 
    430  
    431                !zs2(ji,jj) = ( zs2(ji,jj) - dtotel * ( ( 1._wp - alphaevp ) * ecc2 * zs2(ji,jj) -   & 
    432                !              zdt(ji,jj) / deltat(ji,jj) * zpresh(ji,jj) ) )   & 
    433                !   &          / ( 1._wp + alphaevp * ecc2 * dtotel ) 
    434  
    435                ! new formulation from S. Bouillon to help stabilizing the code (no need of alphaevp) 
    436                zs1(ji,jj) = ( zs1(ji,jj) + dtotel * ( ( zdd(ji,jj) / deltat(ji,jj) - delta / deltat(ji,jj) )  & 
     420               zs1(ji,jj) = ( zs1(ji,jj) + dtotel * ( ( divu_i(ji,jj) / delta_i(ji,jj) - delta / delta_i(ji,jj) )  & 
    437421                  &         * zpresh(ji,jj) ) ) / ( 1._wp + dtotel ) 
    438                zs2(ji,jj) = ( zs2(ji,jj) + dtotel * ( ecci * zdt(ji,jj) / deltat(ji,jj) * zpresh(ji,jj) ) )  & 
     422               zs2(ji,jj) = ( zs2(ji,jj) + dtotel * ( ecci * zdt(ji,jj) / delta_i(ji,jj) * zpresh(ji,jj) ) )  & 
    439423                  &         / ( 1._wp + dtotel ) 
    440424 
     
    468452                  &        / ( e1f(ji,jj) * e2f(ji,jj) ) 
    469453 
    470                deltac(ji,jj) = SQRT(zddc**2+(zdtc**2+zds(ji,jj)**2)*usecc2) + creepl 
     454               zddc = SQRT(zddc**2+(zdtc**2+zds(ji,jj)**2)*usecc2) + creepl 
    471455 
    472456               !-Calculate stress tensor component zs12 at corners (see section 3.5 of CICE user's guide). 
    473                !zs12(ji,jj) = ( zs12(ji,jj) - dtotel * ( (1.0-alphaevp) * ecc2 * zs12(ji,jj) - zds(ji,jj) /  & 
    474                !   &          ( 2._wp * deltac(ji,jj) ) * zpreshc(ji,jj) ) )  & 
    475                !   &          / ( 1._wp + alphaevp * ecc2 * dtotel )  
    476  
    477                ! new formulation from S. Bouillon to help stabilizing the code (no need of alphaevp) 
    478457               zs12(ji,jj) = ( zs12(ji,jj) + dtotel *  & 
    479                   &          ( ecci * zds(ji,jj) / ( 2._wp * deltac(ji,jj) ) * zpreshc(ji,jj) ) )  & 
     458                  &          ( ecci * zds(ji,jj) / ( 2._wp * zddc ) * zpreshc(ji,jj) ) )  & 
    480459                  &          / ( 1.0 + dtotel )  
    481460 
     
    513492               DO ji = fs_2, fs_jpim1 
    514493                  zmask        = (1.0-MAX(0._wp,SIGN(1._wp,-zmass1(ji,jj))))*tmu(ji,jj) 
    515                   zsang        = SIGN ( 1.0 , fcor(ji,jj) ) * sangvg 
    516494                  z0           = zmass1(ji,jj)/dtevp 
    517495 
     
    523501                     (zv_ice1-v_oce1(ji,jj))**2) * (1.0-zfrld1(ji,jj)) 
    524502                  zr           = z0*u_ice(ji,jj) + zf1(ji,jj) + za1ct(ji,jj) + & 
    525                      za*(cangvg*u_oce1(ji,jj)-zsang*v_oce1(ji,jj)) 
    526                   zcca         = z0+za*cangvg 
    527                   zccb         = zcorl1(ji,jj)+za*zsang 
     503                     za*(u_oce1(ji,jj)) 
     504                  zcca         = z0+za 
     505                  zccb         = zcorl1(ji,jj) 
    528506                  u_ice(ji,jj) = (zr+zccb*zv_ice1)/(zcca+epsd)*zmask  
    529507 
     
    536514#endif 
    537515#if defined key_bdy 
    538          ! clem: change u_ice and v_ice at the boundary for each iteration 
    539516         CALL bdy_ice_lim_dyn( 'U' ) 
    540517#endif          
     
    546523 
    547524                  zmask        = (1.0-MAX(0._wp,SIGN(1._wp,-zmass2(ji,jj))))*tmv(ji,jj) 
    548                   zsang        = SIGN(1.0,fcor(ji,jj))*sangvg 
    549525                  z0           = zmass2(ji,jj)/dtevp 
    550526                  ! SB modif because ocean has no slip boundary condition 
     
    555531                     (v_ice(ji,jj)-v_oce2(ji,jj))**2)*(1.0-zfrld2(ji,jj)) 
    556532                  zr           = z0*v_ice(ji,jj) + zf2(ji,jj) + & 
    557                      za2ct(ji,jj) + za*(cangvg*v_oce2(ji,jj)+zsang*u_oce2(ji,jj)) 
    558                   zcca         = z0+za*cangvg 
    559                   zccb         = zcorl2(ji,jj)+za*zsang 
     533                     za2ct(ji,jj) + za*(v_oce2(ji,jj)) 
     534                  zcca         = z0+za 
     535                  zccb         = zcorl2(ji,jj) 
    560536                  v_ice(ji,jj) = (zr-zccb*zu_ice2)/(zcca+epsd)*zmask 
    561537 
     
    568544#endif 
    569545#if defined key_bdy 
    570          ! clem: change u_ice and v_ice at the boundary for each iteration 
    571546         CALL bdy_ice_lim_dyn( 'V' ) 
    572547#endif          
     
    578553               DO ji = fs_2, fs_jpim1 
    579554                  zmask        = (1.0-MAX(0._wp,SIGN(1._wp,-zmass2(ji,jj))))*tmv(ji,jj) 
    580                   zsang        = SIGN(1.0,fcor(ji,jj))*sangvg 
    581555                  z0           = zmass2(ji,jj)/dtevp 
    582556                  ! SB modif because ocean has no slip boundary condition 
     
    588562                     (v_ice(ji,jj)-v_oce2(ji,jj))**2)*(1.0-zfrld2(ji,jj)) 
    589563                  zr           = z0*v_ice(ji,jj) + zf2(ji,jj) + & 
    590                      za2ct(ji,jj) + za*(cangvg*v_oce2(ji,jj)+zsang*u_oce2(ji,jj)) 
    591                   zcca         = z0+za*cangvg 
    592                   zccb         = zcorl2(ji,jj)+za*zsang 
     564                     za2ct(ji,jj) + za*(v_oce2(ji,jj)) 
     565                  zcca         = z0+za 
     566                  zccb         = zcorl2(ji,jj) 
    593567                  v_ice(ji,jj) = (zr-zccb*zu_ice2)/(zcca+epsd)*zmask 
    594568 
     
    601575#endif 
    602576#if defined key_bdy 
    603          ! clem: change u_ice and v_ice at the boundary for each iteration 
    604577         CALL bdy_ice_lim_dyn( 'V' ) 
    605578#endif          
     
    610583               DO ji = fs_2, fs_jpim1 
    611584                  zmask        = (1.0-MAX(0._wp,SIGN(1._wp,-zmass1(ji,jj))))*tmu(ji,jj) 
    612                   zsang        = SIGN(1.0,fcor(ji,jj))*sangvg 
    613585                  z0           = zmass1(ji,jj)/dtevp 
    614                   ! SB modif because ocean has no slip boundary condition 
    615                   ! GG Bug 
    616                   !                   zv_ice1       = 0.5*( (v_ice(ji,jj)+v_ice(ji,jj-1))*e1t(ji+1,jj)      & 
    617                   !                      &                 +(v_ice(ji+1,jj)+v_ice(ji+1,jj-1))*e1t(ji,jj))   & 
    618                   !                      &               /(e1t(ji+1,jj)+e1t(ji,jj)) * tmu(ji,jj) 
    619586                  zv_ice1       = 0.5*( (v_ice(ji,jj)+v_ice(ji,jj-1))*e1t(ji,jj)      & 
    620587                     &                 +(v_ice(ji+1,jj)+v_ice(ji+1,jj-1))*e1t(ji+1,jj))   & 
     
    624591                     (zv_ice1-v_oce1(ji,jj))**2)*(1.0-zfrld1(ji,jj)) 
    625592                  zr           = z0*u_ice(ji,jj) + zf1(ji,jj) + za1ct(ji,jj) + & 
    626                      za*(cangvg*u_oce1(ji,jj)-zsang*v_oce1(ji,jj)) 
    627                   zcca         = z0+za*cangvg 
    628                   zccb         = zcorl1(ji,jj)+za*zsang 
     593                     za*(u_oce1(ji,jj)) 
     594                  zcca         = z0+za 
     595                  zccb         = zcorl1(ji,jj) 
    629596                  u_ice(ji,jj) = (zr+zccb*zv_ice1)/(zcca+epsd)*zmask  
    630597               END DO ! ji 
     
    636603#endif 
    637604#if defined key_bdy 
    638          ! clem: change u_ice and v_ice at the boundary for each iteration 
    639605         CALL bdy_ice_lim_dyn( 'U' ) 
    640606#endif          
     
    666632!CDIR NOVERRCHK 
    667633         DO ji = fs_2, fs_jpim1 
    668             zindb  = MAX( 0.0, SIGN( 1.0, at_i(ji,jj) - epsi10 ) )  
    669             !zdummy = zindb * vt_i(ji,jj) / MAX(at_i(ji,jj) , epsi10 ) 
    670634            zdummy = vt_i(ji,jj) 
    671635            IF ( zdummy .LE. hminrhg ) THEN 
     
    683647#endif 
    684648#if defined key_bdy 
    685       ! clem: change u_ice and v_ice at the boundary 
    686649      CALL bdy_ice_lim_dyn( 'U' ) 
    687650      CALL bdy_ice_lim_dyn( 'V' ) 
     
    690653      DO jj = k_j1+1, k_jpj-1  
    691654         DO ji = fs_2, fs_jpim1 
    692             zindb  = MAX( 0.0, SIGN( 1.0, at_i(ji,jj) - epsi10 ) )  
    693             !zdummy = zindb * vt_i(ji,jj) / MAX(at_i(ji,jj) , epsi10 ) 
    694655            zdummy = vt_i(ji,jj) 
    695656            IF ( zdummy .LE. hminrhg ) THEN 
     
    713674!CDIR NOVERRCHK 
    714675         DO ji = fs_2, jpim1   !RB bug no vect opt due to tmi 
    715             !- zdd(:,:), zdt(:,:): divergence and tension at centre  
     676            !- divu_i(:,:), zdt(:,:): divergence and tension at centre  
    716677            !- zds(:,:): shear on northeast corner of grid cells 
    717             zindb  = MAX( 0.0, SIGN( 1.0, at_i(ji,jj) - epsi10 ) )  
    718             !zdummy = zindb * vt_i(ji,jj) / MAX(at_i(ji,jj) , epsi10 ) 
    719678            zdummy = vt_i(ji,jj) 
    720679            IF ( zdummy .LE. hminrhg ) THEN 
    721680 
    722                zdd(ji,jj) = ( e2u(ji,jj)*u_ice(ji,jj)                      & 
    723                   &          -e2u(ji-1,jj)*u_ice(ji-1,jj)                  & 
    724                   &          +e1v(ji,jj)*v_ice(ji,jj)                      & 
    725                   &          -e1v(ji,jj-1)*v_ice(ji,jj-1)                  & 
    726                   &         )                                              & 
    727                   &         / area(ji,jj) 
     681               divu_i(ji,jj) = ( e2u(ji,jj)*u_ice(ji,jj)                      & 
     682                  &             -e2u(ji-1,jj)*u_ice(ji-1,jj)                  & 
     683                  &             +e1v(ji,jj)*v_ice(ji,jj)                      & 
     684                  &             -e1v(ji,jj-1)*v_ice(ji,jj-1)                  & 
     685                  &            )                                              & 
     686                  &            / area(ji,jj) 
    728687 
    729688               zdt(ji,jj) = ( ( u_ice(ji,jj)/e2u(ji,jj)                    & 
     
    747706                  &        * tmi(ji+1,jj) * tmi(ji+1,jj+1) 
    748707 
    749                zdst(ji,jj) = (  e2u( ji  , jj   ) * v_ice1(ji  ,jj  )    & 
     708               zdst = (  e2u( ji  , jj   ) * v_ice1(ji  ,jj  )    & 
    750709                  &           - e2u( ji-1, jj   ) * v_ice1(ji-1,jj  )    & 
    751710                  &           + e1v( ji  , jj   ) * u_ice2(ji  ,jj  )    & 
    752711                  &           - e1v( ji  , jj-1 ) * u_ice2(ji  ,jj-1)  ) / area(ji,jj) 
    753712 
    754 !              deltat(ji,jj) = SQRT(    zdd(ji,jj)*zdd(ji,jj)   &  
    755 !                  &                 + ( zdt(ji,jj)*zdt(ji,jj) + zdst(ji,jj)*zdst(ji,jj) ) * usecc2 &  
    756 !                  &                          ) + creepl 
    757                ! MV rewriting 
    758                delta = SQRT( zdd(ji,jj)*zdd(ji,jj) + ( zdt(ji,jj)*zdt(ji,jj) + zdst(ji,jj)*zdst(ji,jj) ) * usecc2 )   
    759                deltat(ji,jj) = delta + creepl 
    760                ! END MV 
     713               delta = SQRT( divu_i(ji,jj)*divu_i(ji,jj) + ( zdt(ji,jj)*zdt(ji,jj) + zdst*zdst ) * usecc2 )   
     714               delta_i(ji,jj) = delta + creepl 
    761715             
    762716            ENDIF ! zdummy 
     
    773727      DO jj = k_j1+1, k_jpj-1 
    774728         DO ji = fs_2, fs_jpim1 
    775             divu_i (ji,jj) = zdd   (ji,jj) 
    776             delta_i(ji,jj) = deltat(ji,jj) 
    777729            ! begin TECLIM change  
    778             zdst(ji,jj)= (  e2u( ji  , jj   ) * v_ice1(ji,jj)           &    
     730            zdst= (  e2u( ji  , jj   ) * v_ice1(ji,jj)           &    
    779731               &          - e2u( ji-1, jj   ) * v_ice1(ji-1,jj)         &    
    780732               &          + e1v( ji  , jj   ) * u_ice2(ji,jj)           &    
    781733               &          - e1v( ji  , jj-1 ) * u_ice2(ji,jj-1) ) / area(ji,jj)  
    782             shear_i(ji,jj) = SQRT( zdt(ji,jj) * zdt(ji,jj) + zdst(ji,jj) * zdst(ji,jj) ) 
     734            shear_i(ji,jj) = SQRT( zdt(ji,jj) * zdt(ji,jj) + zdst * zdst ) 
    783735            ! end TECLIM change 
    784736         END DO 
     
    834786      ! 
    835787      CALL wrk_dealloc( jpi,jpj, zpresh, zfrld1, zmass1, zcorl1, za1ct , zpreshc, zfrld2, zmass2, zcorl2, za2ct ) 
    836       CALL wrk_dealloc( jpi,jpj, zc1   , u_oce1, u_oce2, u_ice2, zusw  , v_oce1 , v_oce2, v_ice1                ) 
    837       CALL wrk_dealloc( jpi,jpj, zf1   , deltat, zu_ice, zf2   , deltac, zv_ice , zdd   , zdt    , zds  , zdst  ) 
    838       CALL wrk_dealloc( jpi,jpj, zdd   , zdt   , zds   , zs1   , zs2   , zs12   , zresr , zpice                 ) 
     788      CALL wrk_dealloc( jpi,jpj, u_oce1, u_oce2, u_ice2, v_oce1 , v_oce2, v_ice1                ) 
     789      CALL wrk_dealloc( jpi,jpj, zf1   , zu_ice, zf2   , zv_ice , zdt    , zds  ) 
     790      CALL wrk_dealloc( jpi,jpj, zdt   , zds   , zs1   , zs2   , zs12   , zresr , zpice                 ) 
    839791 
    840792   END SUBROUTINE lim_rhg 
  • branches/2014/dev_r4650_UKMO11_restart_functionality/NEMOGCM/NEMO/LIM_SRC_3/limrst.F90

    r4780 r5208  
    315315      INTEGER :: ji, jj, jk, jl, indx 
    316316      REAL(wp) ::   zfice, ziter 
    317       REAL(wp) ::   zs_inf, z_slope_s, zsmax, zsmin, zalpha, zindb   ! local scalars used for the salinity profile 
    318       REAL(wp), POINTER, DIMENSION(:)  ::   zs_zero  
     317      REAL(wp) ::   zs_inf, z_slope_s, zsmax, zsmin, zalpha   ! local scalars used for the salinity profile 
     318      REAL(wp), POINTER, DIMENSION(:)   ::   zs_zero  
    319319      REAL(wp), POINTER, DIMENSION(:,:) ::   z2d 
    320320      CHARACTER(len=15) ::   znam 
  • branches/2014/dev_r4650_UKMO11_restart_functionality/NEMOGCM/NEMO/LIM_SRC_3/limsbc.F90

    r4688 r5208  
    3232   USE sbc_oce          ! Surface boundary condition: ocean fields 
    3333   USE sbccpl 
    34    USE cpl_oasis3, ONLY : lk_cpl 
    35    USE oce       , ONLY : iatte, oatte, sshn, sshb, snwice_mass, snwice_mass_b, snwice_fmass 
     34   USE oce       , ONLY : fraqsr_1lev, sshn, sshb, snwice_mass, snwice_mass_b, snwice_fmass 
    3635   USE albedo           ! albedo parameters 
    3736   USE lbclnk           ! ocean lateral boundary condition - MPP exchanges 
     
    5150   PUBLIC   lim_sbc_flx    ! called by sbc_ice_lim 
    5251   PUBLIC   lim_sbc_tau    ! called by sbc_ice_lim 
    53  
    54    REAL(wp)  ::   epsi10 = 1.e-10   ! 
    55    REAL(wp)  ::   epsi20 = 1.e-20   ! 
    5652 
    5753   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) ::   utau_oce, vtau_oce   ! air-ocean surface i- & j-stress     [N/m2] 
     
    9894      !!              - fr_i    : ice fraction 
    9995      !!              - tn_ice  : sea-ice surface temperature 
    100       !!              - alb_ice : sea-ice alberdo (lk_cpl=T) 
     96      !!              - alb_ice : sea-ice albedo (lk_cpl=T) 
    10197      !! 
    10298      !! References : Goosse, H. et al. 1996, Bul. Soc. Roy. Sc. Liege, 65, 87-90. 
    10399      !!              Tartinville et al. 2001 Ocean Modelling, 3, 95-108. 
     100      !!              These refs are now obsolete since everything has been revised 
     101      !!              The ref should be Rousset et al., 2015? 
    104102      !!--------------------------------------------------------------------- 
    105       INTEGER, INTENT(in) ::   kt    ! number of iteration 
    106       ! 
    107       INTEGER  ::   ji, jj, jl, jk           ! dummy loop indices 
    108       REAL(wp) ::   zinda, zemp      ! local scalars 
    109       REAL(wp) ::   zf_mass         ! Heat flux associated with mass exchange ice->ocean (W.m-2) 
    110       REAL(wp) ::   zfcm1           ! New solar flux received by the ocean 
    111       REAL(wp), POINTER, DIMENSION(:,:,:) ::   zalb, zalbp     ! 2D/3D workspace 
     103      INTEGER, INTENT(in) ::   kt                                   ! number of iteration 
     104      ! 
     105      INTEGER  ::   ji, jj, jl, jk                                  ! dummy loop indices 
     106      ! 
     107      REAL(wp) ::   zemp                                            !  local scalars 
     108      REAL(wp) ::   zf_mass                                         ! Heat flux associated with mass exchange ice->ocean (W.m-2) 
     109      REAL(wp) ::   zfcm1                                           ! New solar flux received by the ocean 
     110      ! 
     111      REAL(wp), POINTER, DIMENSION(:,:,:) ::   zalb_cs, zalb_os     ! 2D/3D workspace 
    112112      !!--------------------------------------------------------------------- 
    113        
    114       IF( lk_cpl )   CALL wrk_alloc( jpi, jpj, jpl, zalb, zalbp ) 
    115113 
    116114      ! make calls for heat fluxes before it is modified 
    117       CALL iom_put( "qsr_oce" , qsr(:,:) * pfrld(:,:) )   !     solar flux at ocean surface 
    118       CALL iom_put( "qns_oce" , qns(:,:) * pfrld(:,:) )   ! non-solar flux at ocean surface 
    119       CALL iom_put( "qsr_ice" , SUM( qsr_ice(:,:,:) * old_a_i(:,:,:), dim=3 ) ) !     solar flux at ice surface 
    120       CALL iom_put( "qns_ice" , SUM( qns_ice(:,:,:) * old_a_i(:,:,:), dim=3 ) ) ! non-solar flux at ice surface 
    121       CALL iom_put( "qtr_ice" , SUM( ftr_ice(:,:,:) * old_a_i(:,:,:), dim=3 ) ) !     solar flux transmitted thru ice 
    122       CALL iom_put( "qt_oce"  , ( qsr(:,:) + qns(:,:) ) * pfrld(:,:) )   
    123       CALL iom_put( "qt_ice"  , SUM( ( qns_ice(:,:,:) + qsr_ice(:,:,:) ) * old_a_i(:,:,:), dim=3 ) ) 
     115      IF( iom_use('qsr_oce') )   CALL iom_put( "qsr_oce" , qsr(:,:) * pfrld(:,:) )   !     solar flux at ocean surface 
     116      IF( iom_use('qns_oce') )   CALL iom_put( "qns_oce" , qns(:,:) * pfrld(:,:) )   ! non-solar flux at ocean surface 
     117      IF( iom_use('qsr_ice') )   CALL iom_put( "qsr_ice" , SUM( qsr_ice(:,:,:) * a_i_b(:,:,:), dim=3 ) ) !     solar flux at ice surface 
     118      IF( iom_use('qns_ice') )   CALL iom_put( "qns_ice" , SUM( qns_ice(:,:,:) * a_i_b(:,:,:), dim=3 ) ) ! non-solar flux at ice surface 
     119      IF( iom_use('qtr_ice') )   CALL iom_put( "qtr_ice" , SUM( ftr_ice(:,:,:) * a_i_b(:,:,:), dim=3 ) ) !     solar flux transmitted thru ice 
     120      IF( iom_use('qt_oce' ) )   CALL iom_put( "qt_oce"  , ( qsr(:,:) + qns(:,:) ) * pfrld(:,:) )   
     121      IF( iom_use('qt_ice' ) )   CALL iom_put( "qt_ice"  , SUM( ( qns_ice(:,:,:) + qsr_ice(:,:,:) ) * a_i_b(:,:,:), dim=3 ) ) 
    124122 
    125123      ! pfrld is the lead fraction at the previous time step (actually between TRP and THD) 
     
    130128            !      heat flux at the ocean surface      ! 
    131129            !------------------------------------------! 
    132             zinda   = 1._wp - MAX( 0._wp , SIGN( 1._wp , - ( 1._wp - pfrld(ji,jj) ) ) ) ! 1 if ice 
    133  
    134130            ! Solar heat flux reaching the ocean = zfcm1 (W.m-2)  
    135131            !--------------------------------------------------- 
    136             IF( lk_cpl ) THEN ! be carfeful: not been tested yet 
    137                ! original line 
     132            IF( lk_cpl ) THEN  
     133               !!! LIM2 version zqsr = qsr_tot(ji,jj) + ( fstric(ji,jj) - qsr_ice(ji,jj,1) ) * ( 1.0 - pfrld(ji,jj) ) 
    138134               zfcm1 = qsr_tot(ji,jj) 
    139                !!!zfcm1 = qsr_tot(ji,jj) + ftr_ice(ji,jj) * ( 1._wp - pfrld(ji,jj) ) / ( 1._wp - zinda + zinda * iatte(ji,jj) ) 
    140135               DO jl = 1, jpl 
    141                   zfcm1 = zfcm1 - ( qsr_ice(ji,jj,jl) - ftr_ice(ji,jj,jl) ) * old_a_i(ji,jj,jl) 
     136                  zfcm1 = zfcm1 + ( ftr_ice(ji,jj,jl) - qsr_ice(ji,jj,jl) ) * a_i_b(ji,jj,jl) 
    142137               END DO 
    143138            ELSE 
    144                !!!zfcm1   = pfrld(ji,jj) * qsr(ji,jj)  + & 
    145                !!!     &    ( 1._wp - pfrld(ji,jj) ) * ftr_ice(ji,jj) / ( 1._wp - zinda + zinda * iatte(ji,jj) ) 
     139               !!! LIM2 version zqsr = pfrld(ji,jj) * qsr(ji,jj)  + ( 1.  - pfrld(ji,jj) ) * fstric(ji,jj) 
    146140               zfcm1   = pfrld(ji,jj) * qsr(ji,jj) 
    147141               DO jl = 1, jpl 
    148                   zfcm1   = zfcm1 + old_a_i(ji,jj,jl) * ftr_ice(ji,jj,jl) 
     142                  zfcm1   = zfcm1 + a_i_b(ji,jj,jl) * ftr_ice(ji,jj,jl) 
    149143               END DO 
    150144            ENDIF 
     
    182176 
    183177            ! mass flux from ice/ocean 
    184             wfx_ice(ji,jj) = wfx_bog(ji,jj) + wfx_bom(ji,jj) + wfx_sum(ji,jj) + wfx_sni(ji,jj) + wfx_opw(ji,jj) + wfx_dyn(ji,jj) + wfx_res(ji,jj) 
     178            wfx_ice(ji,jj) = wfx_bog(ji,jj) + wfx_bom(ji,jj) + wfx_sum(ji,jj) + wfx_sni(ji,jj)   & 
     179                           + wfx_opw(ji,jj) + wfx_dyn(ji,jj) + wfx_res(ji,jj) 
    185180 
    186181            ! mass flux at the ocean/ice interface 
    187             fmmflx(ji,jj) = - wfx_ice(ji,jj) * rdt_ice                   ! F/M mass flux save at least for biogeochemical model 
    188             emp(ji,jj)    = zemp - wfx_ice(ji,jj) - wfx_snw(ji,jj) - wfx_sub(ji,jj)   ! mass flux + F/M mass flux (always ice/ocean mass exchange) 
     182            fmmflx(ji,jj) = - wfx_ice(ji,jj) * r1_rdtice                    ! F/M mass flux save at least for biogeochemical model 
     183            emp(ji,jj)    = zemp - wfx_ice(ji,jj) - wfx_snw(ji,jj)       ! mass flux + F/M mass flux (always ice/ocean mass exchange) 
    189184             
    190185         END DO 
     
    194189      !      salt flux at the ocean surface      ! 
    195190      !------------------------------------------! 
    196       sfx(:,:) = sfx_bog(:,:) + sfx_bom(:,:) + sfx_sum(:,:) + sfx_sni(:,:) + sfx_opw(:,:) + sfx_res(:,:) + sfx_dyn(:,:) + sfx_bri(:,:) 
     191      sfx(:,:) = sfx_bog(:,:) + sfx_bom(:,:) + sfx_sum(:,:) + sfx_sni(:,:) + sfx_opw(:,:)   & 
     192         &     + sfx_res(:,:) + sfx_dyn(:,:) + sfx_bri(:,:) 
    197193 
    198194      !-------------------------------------------------------------! 
     
    215211 
    216212      !------------------------------------------------! 
    217       !    Computation of snow/ice and ocean albedo    ! 
     213      !    Snow/ice albedo (only if sent to coupler)   ! 
    218214      !------------------------------------------------! 
    219215      IF( lk_cpl ) THEN          ! coupled case 
    220          CALL albedo_ice( t_su, ht_i, ht_s, zalbp, zalb )                  ! snow/ice albedo 
    221          alb_ice(:,:,:) =  0.5_wp * zalbp(:,:,:) + 0.5_wp * zalb (:,:,:)   ! Ice albedo (mean clear and overcast skys) 
     216 
     217            CALL wrk_alloc( jpi, jpj, jpl, zalb_cs, zalb_os ) 
     218 
     219            CALL albedo_ice( t_su, ht_i, ht_s, zalb_cs, zalb_os )  ! cloud-sky and overcast-sky ice albedos 
     220 
     221            alb_ice(:,:,:) = ( 1. - cldf_ice ) * zalb_cs(:,:,:) + cldf_ice * zalb_os(:,:,:) 
     222 
     223            CALL wrk_dealloc( jpi, jpj, jpl, zalb_cs, zalb_os ) 
     224 
    222225      ENDIF 
    223226 
     
    229232         CALL prt_ctl( tab3d_1=tn_ice, clinfo1=' lim_sbc: tn_ice : ', kdim=jpl ) 
    230233      ENDIF 
    231       ! 
    232       IF( lk_cpl )   CALL wrk_dealloc( jpi, jpj, jpl, zalb, zalbp ) 
    233       !  
     234 
    234235   END SUBROUTINE lim_sbc_flx 
    235236 
     
    344345      ! clem modif 
    345346      IF( .NOT. ln_rstart ) THEN 
    346          iatte(:,:) = 1._wp 
    347          oatte(:,:) = 1._wp 
     347         fraqsr_1lev(:,:) = 1._wp 
    348348      ENDIF 
    349349      ! 
  • branches/2014/dev_r4650_UKMO11_restart_functionality/NEMOGCM/NEMO/LIM_SRC_3/limthd.F90

    r4688 r5208  
    2222   USE phycst         ! physical constants 
    2323   USE dom_oce        ! ocean space and time domain variables 
    24    USE oce     , ONLY :  iatte, oatte 
     24   USE oce     , ONLY : fraqsr_1lev  
    2525   USE ice            ! LIM: sea-ice variables 
    2626   USE par_ice        ! LIM: sea-ice parameters 
     
    4343   USE lib_fortran    ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined)   
    4444   USE timing         ! Timing 
    45    USE cpl_oasis3, ONLY : lk_cpl 
    4645   USE limcons        ! conservation tests 
    4746 
     
    5150   PUBLIC   lim_thd        ! called by limstp module 
    5251   PUBLIC   lim_thd_init   ! called by iceini module 
    53  
    54    REAL(wp) ::   epsi10 = 1.e-10_wp   ! 
    5552 
    5653   !! * Substitutions 
     
    6865      !!                ***  ROUTINE lim_thd  ***        
    6966      !!   
    70       !! ** Purpose : This routine manages the ice thermodynamic. 
     67      !! ** Purpose : This routine manages ice thermodynamics 
    7168      !!          
    7269      !! ** Action : - Initialisation of some variables 
     
    7471      !!               at the ice base, snow acc.,heat budget of the leads) 
    7572      !!             - selection of the icy points and put them in an array 
    76       !!             - call lim_vert_ther for vert ice thermodynamic 
    77       !!             - back to the geographic grid 
    78       !!             - selection of points for lateral accretion 
    79       !!             - call lim_lat_acc  for the ice accretion 
     73      !!             - call lim_thd_dif  for vertical heat diffusion 
     74      !!             - call lim_thd_dh   for vertical ice growth and melt 
     75      !!             - call lim_thd_ent  for enthalpy remapping 
     76      !!             - call lim_thd_sal  for ice desalination 
     77      !!             - call lim_thd_temp to  retrieve temperature from ice enthalpy 
    8078      !!             - back to the geographic grid 
    8179      !!      
    82       !! ** References : H. Goosse et al. 1996, Bul. Soc. Roy. Sc. Liege, 65, 87-90 
     80      !! ** References :  
    8381      !!--------------------------------------------------------------------- 
    8482      INTEGER, INTENT(in) ::   kt    ! number of iteration 
     
    8987      REAL(wp) :: zfric_umin = 0._wp        ! lower bound for the friction velocity (cice value=5.e-04) 
    9088      REAL(wp) :: zch        = 0.0057_wp    ! heat transfer coefficient 
    91       REAL(wp) :: zinda, zindb, zareamin  
     89      REAL(wp) :: zareamin  
    9290      REAL(wp) :: zfric_u, zqld, zqfr 
    9391      ! 
    9492      REAL(wp) :: zvi_b, zsmv_b, zei_b, zfs_b, zfw_b, zft_b  
     93      ! 
     94      REAL(wp), POINTER, DIMENSION(:,:) ::  zqsr, zqns 
    9595      !!------------------------------------------------------------------- 
     96      CALL wrk_alloc( jpi, jpj, zqsr, zqns ) 
     97 
    9698      IF( nn_timing == 1 )  CALL timing_start('limthd') 
    9799 
     
    99101      IF( ln_limdiahsb ) CALL lim_cons_hsm(0, 'limthd', zvi_b, zsmv_b, zei_b, zfw_b, zfs_b, zft_b) 
    100102 
    101       !------------------------------------------------------------------------------! 
    102       ! 1) Initialization of diagnostic variables                                    ! 
    103       !------------------------------------------------------------------------------! 
     103      !------------------------------------------------------------------------! 
     104      ! 1) Initialization of some variables                                    ! 
     105      !------------------------------------------------------------------------! 
     106      ftr_ice(:,:,:) = 0._wp  ! part of solar radiation transmitted through the ice 
     107 
    104108 
    105109      !-------------------- 
     
    112116               DO ji = 1, jpi 
    113117                  !0 if no ice and 1 if yes 
    114                   zindb = 1.0 - MAX(  0.0 , SIGN( 1.0 , - v_i(ji,jj,jl) + epsi10 )  ) 
     118                  rswitch = 1.0 - MAX(  0.0 , SIGN( 1.0 , - v_i(ji,jj,jl) + epsi10 )  ) 
    115119                  !Energy of melting q(S,T) [J.m-3] 
    116                   e_i(ji,jj,jk,jl) = zindb * e_i(ji,jj,jk,jl) / ( area(ji,jj) * MAX( v_i(ji,jj,jl) , epsi10 ) ) * REAL( nlay_i ) 
     120                  e_i(ji,jj,jk,jl) = rswitch * e_i(ji,jj,jk,jl) / ( area(ji,jj) * MAX( v_i(ji,jj,jl) , epsi10 ) ) * REAL( nlay_i ) 
    117121                  !convert units ! very important that this line is here         
    118122                  e_i(ji,jj,jk,jl) = e_i(ji,jj,jk,jl) * unit_fac  
     
    124128               DO ji = 1, jpi 
    125129                  !0 if no ice and 1 if yes 
    126                   zindb = 1.0 - MAX(  0.0 , SIGN( 1.0 , - v_s(ji,jj,jl) + epsi10 )  ) 
     130                  rswitch = 1.0 - MAX(  0.0 , SIGN( 1.0 , - v_s(ji,jj,jl) + epsi10 )  ) 
    127131                  !Energy of melting q(S,T) [J.m-3] 
    128                   e_s(ji,jj,jk,jl) = zindb * e_s(ji,jj,jk,jl) / ( area(ji,jj) * MAX( v_s(ji,jj,jl) , epsi10 ) ) * REAL( nlay_s ) 
     132                  e_s(ji,jj,jk,jl) = rswitch * e_s(ji,jj,jk,jl) / ( area(ji,jj) * MAX( v_s(ji,jj,jl) , epsi10 ) ) * REAL( nlay_s ) 
    129133                  !convert units ! very important that this line is here 
    130134                  e_s(ji,jj,jk,jl) = e_s(ji,jj,jk,jl) * unit_fac  
     
    136140      ! 2) Partial computation of forcing for the thermodynamic sea ice model.      ! 
    137141      !-----------------------------------------------------------------------------! 
     142 
     143      !--- Ocean solar and non solar fluxes to be used in zqld 
     144      IF ( .NOT. lk_cpl ) THEN   ! --- forced case, fluxes to the lead are the same as over the ocean 
     145         ! 
     146         zqsr(:,:) = qsr(:,:)      ; zqns(:,:) = qns(:,:) 
     147         ! 
     148      ELSE                       ! --- coupled case, fluxes to the lead are total - intercepted 
     149         ! 
     150         zqsr(:,:) = qsr_tot(:,:)  ; zqns(:,:) = qns_tot(:,:) 
     151         ! 
     152         DO jl = 1, jpl 
     153            DO jj = 1, jpj 
     154               DO ji = 1, jpi 
     155                  zqsr(ji,jj) = zqsr(ji,jj) - qsr_ice(ji,jj,jl) * a_i_b(ji,jj,jl) 
     156                  zqns(ji,jj) = zqns(ji,jj) - qns_ice(ji,jj,jl) * a_i_b(ji,jj,jl) 
     157               END DO 
     158            END DO 
     159         END DO 
     160         ! 
     161      ENDIF 
    138162 
    139163!CDIR NOVERRCHK 
     
    141165!CDIR NOVERRCHK 
    142166         DO ji = 1, jpi 
    143             zinda          = tms(ji,jj) * ( 1._wp - MAX( 0._wp , SIGN( 1._wp , - at_i(ji,jj) + epsi10 ) ) ) ! 0 if no ice 
     167            rswitch          = tms(ji,jj) * ( 1._wp - MAX( 0._wp , SIGN( 1._wp , - at_i(ji,jj) + epsi10 ) ) ) ! 0 if no ice 
    144168            ! 
    145169            !           !  solar irradiance transmission at the mixed layer bottom and used in the lead heat budget 
     
    149173            !           !  temperature and turbulent mixing (McPhee, 1992) 
    150174            ! 
     175 
    151176            ! --- Energy received in the lead, zqld is defined everywhere (J.m-2) --- ! 
    152             zqld =  tms(ji,jj) * rdt_ice *                                       & 
    153                &  ( pfrld(ji,jj)         * ( qsr(ji,jj) * oatte(ji,jj)           &   ! solar heat + clem modif 
    154                &                           + qns(ji,jj) )                        &   ! non solar heat 
    155                ! latent heat of precip (note that precip is included in qns but not in qns_ice) 
    156                &    + ( pfrld(ji,jj)**betas - pfrld(ji,jj) ) * sprecip(ji,jj) * ( cpic * ( MIN( tatm_ice(ji,jj), rt0_snow ) - rtt ) - lfus )  & 
    157                &    + ( 1._wp - pfrld(ji,jj) ) * ( tprecip(ji,jj) - sprecip(ji,jj) ) * rcp * ( tatm_ice(ji,jj) - rtt ) ) 
     177            ! REMARK valid at least in forced mode from clem 
     178            ! precip is included in qns but not in qns_ice 
     179            IF ( lk_cpl ) THEN 
     180               zqld =  tms(ji,jj) * rdt_ice *  & 
     181                  &    (   zqsr(ji,jj) * fraqsr_1lev(ji,jj) + zqns(ji,jj)               &   ! pfrld already included in coupled mode 
     182                  &    + ( pfrld(ji,jj)**betas - pfrld(ji,jj) ) * sprecip(ji,jj)  *     &   ! heat content of precip 
     183                  &      ( cpic * ( MIN( tatm_ice(ji,jj), rt0_snow ) - rtt ) - lfus )   & 
     184                  &    + ( 1._wp - pfrld(ji,jj) ) * ( tprecip(ji,jj) - sprecip(ji,jj) ) * rcp * ( tatm_ice(ji,jj) - rtt ) ) 
     185            ELSE 
     186               zqld =  tms(ji,jj) * rdt_ice *  & 
     187                  &      ( pfrld(ji,jj) * ( zqsr(ji,jj) * fraqsr_1lev(ji,jj) + zqns(ji,jj) )    & 
     188                  &    + ( pfrld(ji,jj)**betas - pfrld(ji,jj) ) * sprecip(ji,jj)  *             &  ! heat content of precip 
     189                  &      ( cpic * ( MIN( tatm_ice(ji,jj), rt0_snow ) - rtt ) - lfus )           & 
     190                  &    + ( 1._wp - pfrld(ji,jj) ) * ( tprecip(ji,jj) - sprecip(ji,jj) ) * rcp * ( tatm_ice(ji,jj) - rtt ) ) 
     191            ENDIF 
    158192 
    159193            !-- Energy needed to bring ocean surface layer until its freezing (<0, J.m-2) --- ! 
     
    167201               fhld (ji,jj) = zqld * r1_rdtice / at_i(ji,jj) ! divided by at_i since this is (re)multiplied by a_i in limthd_dh.F90 
    168202               qlead(ji,jj) = 0._wp 
     203            ELSE 
     204               fhld (ji,jj) = 0._wp 
    169205            ENDIF 
    170206            ! 
     
    172208            !clem zfric_u        = MAX ( MIN( SQRT( ust2s(ji,jj) ) , zfric_umax ) , zfric_umin ) 
    173209            zfric_u      = MAX( SQRT( ust2s(ji,jj) ), zfric_umin )  
    174             fhtur(ji,jj) = MAX( 0._wp, zinda * rau0 * rcp * zch  * zfric_u * ( ( sst_m(ji,jj) + rt0 ) - t_bo(ji,jj) ) ) ! W.m-2  
     210            fhtur(ji,jj) = MAX( 0._wp, rswitch * rau0 * rcp * zch  * zfric_u * ( ( sst_m(ji,jj) + rt0 ) - t_bo(ji,jj) ) ) ! W.m-2  
    175211            ! upper bound for fhtur: we do not want SST to drop below Tfreeze.  
    176212            ! So we say that the heat retrieved from the ocean (fhtur+fhld) must be < to the heat necessary to reach Tfreeze (zqfr)    
    177213            ! This is not a clean budget, so that should be corrected at some point 
    178             fhtur(ji,jj) = zinda * MIN( fhtur(ji,jj), - fhld(ji,jj) - zqfr * r1_rdtice / MAX( at_i(ji,jj), epsi10 ) ) 
     214            fhtur(ji,jj) = rswitch * MIN( fhtur(ji,jj), - fhld(ji,jj) - zqfr * r1_rdtice / MAX( at_i(ji,jj), epsi10 ) ) 
    179215 
    180216            ! ----------------------------------------- 
     
    185221            hfx_in(ji,jj) = hfx_in(ji,jj)                                                                                         &  
    186222               ! heat flux above the ocean 
    187                &    +             pfrld(ji,jj)   * ( qns(ji,jj) + qsr(ji,jj) )                                                    & 
     223               &    +             pfrld(ji,jj)   * ( zqns(ji,jj) + zqsr(ji,jj) )                                                  & 
    188224               ! latent heat of precip (note that precip is included in qns but not in qns_ice) 
    189225               &    +   ( 1._wp - pfrld(ji,jj) ) * sprecip(ji,jj) * ( cpic * ( MIN( tatm_ice(ji,jj), rt0_snow ) - rtt ) - lfus )  & 
     
    196232            !     Second step in limthd_dh      :  heat remaining if total melt (zq_rema)  
    197233            !     Third  step in limsbc         :  heat from ice-ocean mass exchange (zf_mass) + solar 
    198             hfx_out(ji,jj) = hfx_out(ji,jj)                                                                                                        &  
     234            hfx_out(ji,jj) = hfx_out(ji,jj)                                                                                       &  
    199235               ! Non solar heat flux received by the ocean 
    200                &    +        pfrld(ji,jj) * qns(ji,jj)                                                                                             & 
     236               &    +        pfrld(ji,jj) * qns(ji,jj)                                                                            & 
    201237               ! latent heat of precip (note that precip is included in qns but not in qns_ice) 
    202                &    +      ( pfrld(ji,jj)**betas - pfrld(ji,jj) ) * sprecip(ji,jj) * ( cpic * ( MIN( tatm_ice(ji,jj), rt0_snow ) - rtt ) - lfus )  & 
    203                &    +      ( 1._wp - pfrld(ji,jj) ) * ( tprecip(ji,jj) - sprecip(ji,jj) ) * rcp * ( tatm_ice(ji,jj) - rtt )                        & 
     238               &    +      ( pfrld(ji,jj)**betas - pfrld(ji,jj) ) * sprecip(ji,jj)       & 
     239               &         * ( cpic * ( MIN( tatm_ice(ji,jj), rt0_snow ) - rtt ) - lfus )  & 
     240               &    +      ( 1._wp - pfrld(ji,jj) ) * ( tprecip(ji,jj) - sprecip(ji,jj) ) * rcp * ( tatm_ice(ji,jj) - rtt )       & 
    204241               ! heat flux taken from the ocean where there is open water ice formation 
    205                &    -      qlead(ji,jj) * r1_rdtice                                                                                                & 
     242               &    -      qlead(ji,jj) * r1_rdtice                                                                               & 
    206243               ! heat flux taken from the ocean during bottom growth/melt (fhld should be 0 while bott growth) 
    207                &    -      at_i(ji,jj) * fhtur(ji,jj)                                                                                              & 
     244               &    -      at_i(ji,jj) * fhtur(ji,jj)                                                                             & 
    208245               &    -      at_i(ji,jj) *  fhld(ji,jj) 
    209246 
     
    256293            !------------------------- 
    257294 
    258             CALL tab_2d_1d( nbpb, at_i_b     (1:nbpb), at_i            , jpi, jpj, npb(1:nbpb) ) 
    259             CALL tab_2d_1d( nbpb, a_i_b      (1:nbpb), a_i(:,:,jl)     , jpi, jpj, npb(1:nbpb) ) 
    260             CALL tab_2d_1d( nbpb, ht_i_b     (1:nbpb), ht_i(:,:,jl)    , jpi, jpj, npb(1:nbpb) ) 
    261             CALL tab_2d_1d( nbpb, ht_s_b     (1:nbpb), ht_s(:,:,jl)    , jpi, jpj, npb(1:nbpb) ) 
    262  
    263             CALL tab_2d_1d( nbpb, t_su_b     (1:nbpb), t_su(:,:,jl)    , jpi, jpj, npb(1:nbpb) ) 
    264             CALL tab_2d_1d( nbpb, sm_i_b     (1:nbpb), sm_i(:,:,jl)    , jpi, jpj, npb(1:nbpb) ) 
     295            CALL tab_2d_1d( nbpb, at_i_1d     (1:nbpb), at_i            , jpi, jpj, npb(1:nbpb) ) 
     296            CALL tab_2d_1d( nbpb, a_i_1d      (1:nbpb), a_i(:,:,jl)     , jpi, jpj, npb(1:nbpb) ) 
     297            CALL tab_2d_1d( nbpb, ht_i_1d     (1:nbpb), ht_i(:,:,jl)    , jpi, jpj, npb(1:nbpb) ) 
     298            CALL tab_2d_1d( nbpb, ht_s_1d     (1:nbpb), ht_s(:,:,jl)    , jpi, jpj, npb(1:nbpb) ) 
     299 
     300            CALL tab_2d_1d( nbpb, t_su_1d     (1:nbpb), t_su(:,:,jl)    , jpi, jpj, npb(1:nbpb) ) 
     301            CALL tab_2d_1d( nbpb, sm_i_1d     (1:nbpb), sm_i(:,:,jl)    , jpi, jpj, npb(1:nbpb) ) 
    265302            DO jk = 1, nlay_s 
    266                CALL tab_2d_1d( nbpb, t_s_b(1:nbpb,jk), t_s(:,:,jk,jl)  , jpi, jpj, npb(1:nbpb) ) 
    267                CALL tab_2d_1d( nbpb, q_s_b(1:nbpb,jk), e_s(:,:,jk,jl)  , jpi, jpj, npb(1:nbpb) ) 
     303               CALL tab_2d_1d( nbpb, t_s_1d(1:nbpb,jk), t_s(:,:,jk,jl)  , jpi, jpj, npb(1:nbpb) ) 
     304               CALL tab_2d_1d( nbpb, q_s_1d(1:nbpb,jk), e_s(:,:,jk,jl)  , jpi, jpj, npb(1:nbpb) ) 
    268305            END DO 
    269306            DO jk = 1, nlay_i 
    270                CALL tab_2d_1d( nbpb, t_i_b(1:nbpb,jk), t_i(:,:,jk,jl)  , jpi, jpj, npb(1:nbpb) ) 
    271                CALL tab_2d_1d( nbpb, q_i_b(1:nbpb,jk), e_i(:,:,jk,jl)  , jpi, jpj, npb(1:nbpb) ) 
    272                CALL tab_2d_1d( nbpb, s_i_b(1:nbpb,jk), s_i(:,:,jk,jl)  , jpi, jpj, npb(1:nbpb) ) 
     307               CALL tab_2d_1d( nbpb, t_i_1d(1:nbpb,jk), t_i(:,:,jk,jl)  , jpi, jpj, npb(1:nbpb) ) 
     308               CALL tab_2d_1d( nbpb, q_i_1d(1:nbpb,jk), e_i(:,:,jk,jl)  , jpi, jpj, npb(1:nbpb) ) 
     309               CALL tab_2d_1d( nbpb, s_i_1d(1:nbpb,jk), s_i(:,:,jk,jl)  , jpi, jpj, npb(1:nbpb) ) 
    273310            END DO 
    274311 
     
    284321            ENDIF 
    285322            CALL tab_2d_1d( nbpb, dqns_ice_1d(1:nbpb), dqns_ice(:,:,jl), jpi, jpj, npb(1:nbpb) ) 
    286             CALL tab_2d_1d( nbpb, t_bo_b     (1:nbpb), t_bo            , jpi, jpj, npb(1:nbpb) ) 
     323            CALL tab_2d_1d( nbpb, t_bo_1d     (1:nbpb), t_bo            , jpi, jpj, npb(1:nbpb) ) 
    287324            CALL tab_2d_1d( nbpb, sprecip_1d (1:nbpb), sprecip         , jpi, jpj, npb(1:nbpb) )  
    288325            CALL tab_2d_1d( nbpb, fhtur_1d   (1:nbpb), fhtur           , jpi, jpj, npb(1:nbpb) ) 
     
    306343            CALL tab_2d_1d( nbpb, sfx_bri_1d (1:nbpb), sfx_bri         , jpi, jpj, npb(1:nbpb) ) 
    307344            CALL tab_2d_1d( nbpb, sfx_res_1d (1:nbpb), sfx_res         , jpi, jpj, npb(1:nbpb) ) 
    308  
    309             CALL tab_2d_1d( nbpb, iatte_1d   (1:nbpb), iatte           , jpi, jpj, npb(1:nbpb) )  
    310             CALL tab_2d_1d( nbpb, oatte_1d   (1:nbpb), oatte           , jpi, jpj, npb(1:nbpb) )  
    311345 
    312346            CALL tab_2d_1d( nbpb, hfx_thd_1d (1:nbpb), hfx_thd         , jpi, jpj, npb(1:nbpb) ) 
     
    338372 
    339373            ! --- Ice enthalpy remapping --- ! 
    340             CALL lim_thd_ent( 1, nbpb, q_i_b(1:nbpb,:) )  
     374            CALL lim_thd_ent( 1, nbpb, q_i_1d(1:nbpb,:) )  
    341375                                             
    342376            !---------------------------------! 
     
    354388            !-------------------------------- 
    355389 
    356                CALL tab_1d_2d( nbpb, at_i          , npb, at_i_b    (1:nbpb)   , jpi, jpj ) 
    357                CALL tab_1d_2d( nbpb, ht_i(:,:,jl)  , npb, ht_i_b    (1:nbpb)   , jpi, jpj ) 
    358                CALL tab_1d_2d( nbpb, ht_s(:,:,jl)  , npb, ht_s_b    (1:nbpb)   , jpi, jpj ) 
    359                CALL tab_1d_2d( nbpb, a_i (:,:,jl)  , npb, a_i_b     (1:nbpb)   , jpi, jpj ) 
    360                CALL tab_1d_2d( nbpb, t_su(:,:,jl)  , npb, t_su_b    (1:nbpb)   , jpi, jpj ) 
    361                CALL tab_1d_2d( nbpb, sm_i(:,:,jl)  , npb, sm_i_b    (1:nbpb)   , jpi, jpj ) 
     390               CALL tab_1d_2d( nbpb, at_i          , npb, at_i_1d    (1:nbpb)   , jpi, jpj ) 
     391               CALL tab_1d_2d( nbpb, ht_i(:,:,jl)  , npb, ht_i_1d    (1:nbpb)   , jpi, jpj ) 
     392               CALL tab_1d_2d( nbpb, ht_s(:,:,jl)  , npb, ht_s_1d    (1:nbpb)   , jpi, jpj ) 
     393               CALL tab_1d_2d( nbpb, a_i (:,:,jl)  , npb, a_i_1d     (1:nbpb)   , jpi, jpj ) 
     394               CALL tab_1d_2d( nbpb, t_su(:,:,jl)  , npb, t_su_1d    (1:nbpb)   , jpi, jpj ) 
     395               CALL tab_1d_2d( nbpb, sm_i(:,:,jl)  , npb, sm_i_1d    (1:nbpb)   , jpi, jpj ) 
    362396            DO jk = 1, nlay_s 
    363                CALL tab_1d_2d( nbpb, t_s(:,:,jk,jl), npb, t_s_b     (1:nbpb,jk), jpi, jpj) 
    364                CALL tab_1d_2d( nbpb, e_s(:,:,jk,jl), npb, q_s_b     (1:nbpb,jk), jpi, jpj) 
     397               CALL tab_1d_2d( nbpb, t_s(:,:,jk,jl), npb, t_s_1d     (1:nbpb,jk), jpi, jpj) 
     398               CALL tab_1d_2d( nbpb, e_s(:,:,jk,jl), npb, q_s_1d     (1:nbpb,jk), jpi, jpj) 
    365399            END DO 
    366400            DO jk = 1, nlay_i 
    367                CALL tab_1d_2d( nbpb, t_i(:,:,jk,jl), npb, t_i_b     (1:nbpb,jk), jpi, jpj) 
    368                CALL tab_1d_2d( nbpb, e_i(:,:,jk,jl), npb, q_i_b     (1:nbpb,jk), jpi, jpj) 
    369                CALL tab_1d_2d( nbpb, s_i(:,:,jk,jl), npb, s_i_b     (1:nbpb,jk), jpi, jpj) 
     401               CALL tab_1d_2d( nbpb, t_i(:,:,jk,jl), npb, t_i_1d     (1:nbpb,jk), jpi, jpj) 
     402               CALL tab_1d_2d( nbpb, e_i(:,:,jk,jl), npb, q_i_1d     (1:nbpb,jk), jpi, jpj) 
     403               CALL tab_1d_2d( nbpb, s_i(:,:,jk,jl), npb, s_i_1d     (1:nbpb,jk), jpi, jpj) 
    370404            END DO 
    371405               CALL tab_1d_2d( nbpb, qlead         , npb, qlead_1d  (1:nbpb)   , jpi, jpj ) 
     
    386420               CALL tab_1d_2d( nbpb, sfx_sni       , npb, sfx_sni_1d(1:nbpb)   , jpi, jpj ) 
    387421               CALL tab_1d_2d( nbpb, sfx_res       , npb, sfx_res_1d(1:nbpb)   , jpi, jpj ) 
    388             ! 
    389             IF( num_sal == 2 ) THEN 
    390422               CALL tab_1d_2d( nbpb, sfx_bri       , npb, sfx_bri_1d(1:nbpb)   , jpi, jpj ) 
    391             ENDIF 
    392423 
    393424              CALL tab_1d_2d( nbpb, hfx_thd       , npb, hfx_thd_1d(1:nbpb)   , jpi, jpj ) 
     
    404435              CALL tab_1d_2d( nbpb, hfx_err_rem   , npb, hfx_err_rem_1d(1:nbpb)   , jpi, jpj ) 
    405436            ! 
    406             !+++++       temporary stuff for a dummy version 
    407               CALL tab_1d_2d( nbpb, dh_i_surf2D, npb, dh_i_surf(1:nbpb)      , jpi, jpj ) 
    408               CALL tab_1d_2d( nbpb, dh_i_bott2D, npb, dh_i_bott(1:nbpb)      , jpi, jpj ) 
    409               CALL tab_1d_2d( nbpb, s_i_newice , npb, s_i_new  (1:nbpb)      , jpi, jpj ) 
    410               CALL tab_1d_2d( nbpb, izero(:,:,jl) , npb, i0    (1:nbpb)      , jpi, jpj ) 
    411             !+++++ 
    412437              CALL tab_1d_2d( nbpb, qns_ice(:,:,jl), npb, qns_ice_1d(1:nbpb) , jpi, jpj) 
    413438              CALL tab_1d_2d( nbpb, ftr_ice(:,:,jl), npb, ftr_ice_1d(1:nbpb) , jpi, jpj ) 
     
    482507      ENDIF 
    483508      ! 
     509      ! 
     510      CALL wrk_dealloc( jpi, jpj, zqsr, zqns ) 
     511 
     512      ! 
    484513      ! conservation test 
    485514      IF( ln_limdiahsb ) CALL lim_cons_hsm(1, 'limthd', zvi_b, zsmv_b, zei_b, zfw_b, zfs_b, zft_b) 
    486515      ! 
    487516      IF( nn_timing == 1 )  CALL timing_stop('limthd') 
     517 
    488518   END SUBROUTINE lim_thd  
    489519 
     
    499529      !! 
    500530      INTEGER  ::   ji, jk   ! dummy loop indices 
    501       REAL(wp) ::   ztmelts, zswitch, zaaa, zbbb, zccc, zdiscrim  ! local scalar  
     531      REAL(wp) ::   ztmelts, zaaa, zbbb, zccc, zdiscrim  ! local scalar  
    502532      !!------------------------------------------------------------------- 
    503533      ! Recover ice temperature 
    504534      DO jk = 1, nlay_i 
    505535         DO ji = kideb, kiut 
    506             ztmelts       =  -tmut * s_i_b(ji,jk) + rtt 
     536            ztmelts       =  -tmut * s_i_1d(ji,jk) + rtt 
    507537            ! Conversion q(S,T) -> T (second order equation) 
    508538            zaaa          =  cpic 
    509             zbbb          =  ( rcp - cpic ) * ( ztmelts - rtt ) + q_i_b(ji,jk) / rhoic - lfus 
     539            zbbb          =  ( rcp - cpic ) * ( ztmelts - rtt ) + q_i_1d(ji,jk) / rhoic - lfus 
    510540            zccc          =  lfus * ( ztmelts - rtt ) 
    511541            zdiscrim      =  SQRT( MAX( zbbb * zbbb - 4._wp * zaaa * zccc, 0._wp ) ) 
    512             t_i_b(ji,jk) =  rtt - ( zbbb + zdiscrim ) / ( 2._wp * zaaa ) 
     542            t_i_1d(ji,jk) =  rtt - ( zbbb + zdiscrim ) / ( 2._wp * zaaa ) 
    513543             
    514544            ! mask temperature 
    515             zswitch      =  1._wp - MAX( 0._wp , SIGN( 1._wp , - ht_i_b(ji) ) )  
    516             t_i_b(ji,jk) =  zswitch * t_i_b(ji,jk) + ( 1._wp - zswitch ) * rtt 
     545            rswitch       =  1._wp - MAX( 0._wp , SIGN( 1._wp , - ht_i_1d(ji) ) )  
     546            t_i_1d(ji,jk) =  rswitch * t_i_1d(ji,jk) + ( 1._wp - rswitch ) * rtt 
    517547         END DO  
    518548      END DO  
     
    552582902   IF( ios /= 0 ) CALL ctl_nam ( ios , 'namicethd in configuration namelist', lwp ) 
    553583      IF(lwm) WRITE ( numoni, namicethd ) 
     584 
     585      IF( lk_cpl .AND. parsub /= 0.0 )   CALL ctl_stop( 'In coupled mode, use parsub = 0. or send dqla' ) 
    554586      ! 
    555587      IF(lwp) THEN                          ! control print 
  • branches/2014/dev_r4650_UKMO11_restart_functionality/NEMOGCM/NEMO/LIM_SRC_3/limthd_dh.F90

    r4688 r5208  
    2626   USE wrk_nemo       ! work arrays 
    2727   USE lib_fortran    ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined)   
    28    USE cpl_oasis3, ONLY : lk_cpl 
    2928    
    3029   IMPLICIT NONE 
     
    3231 
    3332   PUBLIC   lim_thd_dh   ! called by lim_thd 
    34  
    35    REAL(wp) ::   epsi20 = 1.e-20   ! constant values 
    36    REAL(wp) ::   epsi10 = 1.e-10   ! 
    3733 
    3834   !!---------------------------------------------------------------------- 
     
    112108 
    113109      ! mass and salt flux (clem) 
    114       REAL(wp) :: zdvres, zswitch_sal, zswitch 
     110      REAL(wp) :: zdvres, zswitch_sal 
    115111 
    116112      ! Heat conservation  
    117113      INTEGER  ::   num_iter_max 
    118       REAL(wp) ::   zinda, zindq, zindh  
    119       REAL(wp), POINTER, DIMENSION(:) ::   zintermelt   ! debug 
    120114 
    121115      !!------------------------------------------------------------------ 
     
    129123      CALL wrk_alloc( jpij, zh_s, zqprec, zq_su, zq_bo, zf_tt, zq_1cat, zq_rema ) 
    130124      CALL wrk_alloc( jpij, zdh_s_mel, zdh_s_pre, zdh_s_sub, zqh_i, zqh_s, zq_s ) 
    131       CALL wrk_alloc( jpij, zintermelt ) 
    132       CALL wrk_alloc( jpij, jkmax, zdeltah, zh_i ) 
     125      CALL wrk_alloc( jpij, nlay_i+1, zdeltah, zh_i ) 
    133126      CALL wrk_alloc( jpij, icount ) 
    134127       
     
    148141      zh_i      (:,:) = 0._wp        
    149142      zdeltah   (:,:) = 0._wp        
    150       zintermelt(:)   = 0._wp 
    151143      icount    (:)   = 0 
    152144 
     
    156148      DO jk = 1, nlay_i 
    157149         DO ji = kideb, kiut 
    158             h_i_old (ji,jk) = ht_i_b(ji) / REAL( nlay_i ) 
    159             qh_i_old(ji,jk) = q_i_b(ji,jk) * h_i_old(ji,jk) 
     150            h_i_old (ji,jk) = ht_i_1d(ji) / REAL( nlay_i ) 
     151            qh_i_old(ji,jk) = q_i_1d(ji,jk) * h_i_old(ji,jk) 
    160152         ENDDO 
    161153      ENDDO 
     
    166158      ! 
    167159      DO ji = kideb, kiut 
    168          zinda         = 1._wp - MAX(  0._wp , SIGN( 1._wp , - ht_s_b(ji) ) ) 
    169          ztmelts       = zinda * rtt + ( 1._wp - zinda ) * rtt 
    170  
    171          zfdum     = qns_ice_1d(ji) + ( 1._wp - i0(ji) ) * qsr_ice_1d(ji) - fc_su(ji)  
    172          zf_tt(ji) = fc_bo_i(ji) + fhtur_1d(ji) + fhld_1d(ji)  
    173  
    174          zq_su (ji) = MAX( 0._wp, zfdum     * rdt_ice ) * MAX( 0._wp , SIGN( 1._wp, t_su_b(ji) - ztmelts ) ) 
     160         rswitch       = 1._wp - MAX(  0._wp , SIGN( 1._wp , - ht_s_1d(ji) ) ) 
     161         ztmelts       = rswitch * rtt + ( 1._wp - rswitch ) * rtt 
     162 
     163         zfdum      = qns_ice_1d(ji) + ( 1._wp - i0(ji) ) * qsr_ice_1d(ji) - fc_su(ji)  
     164         zf_tt(ji)  = fc_bo_i(ji) + fhtur_1d(ji) + fhld_1d(ji)  
     165 
     166         zq_su (ji) = MAX( 0._wp, zfdum     * rdt_ice ) * MAX( 0._wp , SIGN( 1._wp, t_su_1d(ji) - ztmelts ) ) 
    175167         zq_bo (ji) = MAX( 0._wp, zf_tt(ji) * rdt_ice ) 
    176168      END DO 
     
    182174      !------------------------------------------------------------------------------! 
    183175      DO ji = kideb, kiut 
    184          IF( t_s_b(ji,1) > rtt ) THEN !!! Internal melting 
     176         IF( t_s_1d(ji,1) > rtt ) THEN !!! Internal melting 
    185177            ! Contribution to heat flux to the ocean [W.m-2], < 0   
    186             hfx_res_1d(ji) = hfx_res_1d(ji) + q_s_b(ji,1) * ht_s_b(ji) * a_i_b(ji) * r1_rdtice 
     178            hfx_res_1d(ji) = hfx_res_1d(ji) + q_s_1d(ji,1) * ht_s_1d(ji) * a_i_1d(ji) * r1_rdtice 
    187179            ! Contribution to mass flux 
    188             wfx_snw_1d(ji) = wfx_snw_1d(ji) + rhosn * ht_s_b(ji) * a_i_b(ji) * r1_rdtice 
     180            wfx_snw_1d(ji) = wfx_snw_1d(ji) + rhosn * ht_s_1d(ji) * a_i_1d(ji) * r1_rdtice 
    189181            ! updates 
    190             ht_s_b(ji)   = 0._wp 
    191             q_s_b (ji,1) = 0._wp 
    192             t_s_b (ji,1) = rtt 
     182            ht_s_1d(ji)   = 0._wp 
     183            q_s_1d (ji,1) = 0._wp 
     184            t_s_1d (ji,1) = rtt 
    193185         END IF 
    194186      END DO 
     
    199191      ! 
    200192      DO ji = kideb, kiut      
    201          zh_s(ji) = ht_s_b(ji) / REAL( nlay_s ) 
     193         zh_s(ji) = ht_s_1d(ji) / REAL( nlay_s ) 
    202194      END DO 
    203195      ! 
    204196      DO jk = 1, nlay_s 
    205197         DO ji = kideb, kiut 
    206             zqh_s(ji) =  zqh_s(ji) + q_s_b(ji,jk) * zh_s(ji) 
     198            zqh_s(ji) =  zqh_s(ji) + q_s_1d(ji,jk) * zh_s(ji) 
    207199         END DO 
    208200      END DO 
     
    210202      DO jk = 1, nlay_i 
    211203         DO ji = kideb, kiut 
    212             zh_i(ji,jk) = ht_i_b(ji) / REAL( nlay_i ) 
    213             zqh_i(ji)   = zqh_i(ji) + q_i_b(ji,jk) * zh_i(ji,jk) 
     204            zh_i(ji,jk) = ht_i_1d(ji) / REAL( nlay_i ) 
     205            zqh_i(ji)   = zqh_i(ji) + q_i_1d(ji,jk) * zh_i(ji,jk) 
    214206         END DO 
    215207      END DO 
     
    238230         !----------- 
    239231         ! thickness change 
    240          zcoeff = ( 1._wp - ( 1._wp - at_i_b(ji) )**betas ) / at_i_b(ji)  
     232         zcoeff = ( 1._wp - ( 1._wp - at_i_1d(ji) )**betas ) / at_i_1d(ji)  
    241233         zdh_s_pre(ji) = zcoeff * sprecip_1d(ji) * rdt_ice / rhosn 
    242234         ! enthalpy of the precip (>0, J.m-3) (tatm_ice is now in K) 
     
    244236         IF( sprecip_1d(ji) == 0._wp ) zqprec(ji) = 0._wp 
    245237         ! heat flux from snow precip (>0, W.m-2) 
    246          hfx_spr_1d(ji) = hfx_spr_1d(ji) + zdh_s_pre(ji) * a_i_b(ji) * zqprec(ji) * r1_rdtice 
     238         hfx_spr_1d(ji) = hfx_spr_1d(ji) + zdh_s_pre(ji) * a_i_1d(ji) * zqprec(ji) * r1_rdtice 
    247239         ! mass flux, <0 
    248          wfx_spr_1d(ji) = wfx_spr_1d(ji) - rhosn * a_i_b(ji) * zdh_s_pre(ji) * r1_rdtice 
     240         wfx_spr_1d(ji) = wfx_spr_1d(ji) - rhosn * a_i_1d(ji) * zdh_s_pre(ji) * r1_rdtice 
    249241         ! update thickness 
    250          ht_s_b    (ji) = MAX( 0._wp , ht_s_b(ji) + zdh_s_pre(ji) ) 
     242         ht_s_1d    (ji) = MAX( 0._wp , ht_s_1d(ji) + zdh_s_pre(ji) ) 
    251243 
    252244         !--------------------- 
     
    255247         ! thickness change 
    256248         IF( zdh_s_pre(ji) > 0._wp ) THEN 
    257          zindq          = 1._wp - MAX( 0._wp , SIGN( 1._wp , - zqprec(ji) + epsi20 ) ) 
    258          zdh_s_mel (ji) = - zindq * zq_su(ji) / MAX( zqprec(ji) , epsi20 ) 
     249         rswitch        = 1._wp - MAX( 0._wp , SIGN( 1._wp , - zqprec(ji) + epsi20 ) ) 
     250         zdh_s_mel (ji) = - rswitch * zq_su(ji) / MAX( zqprec(ji) , epsi20 ) 
    259251         zdh_s_mel (ji) = MAX( - zdh_s_pre(ji), zdh_s_mel(ji) ) ! bound melting  
    260252         ! heat used to melt snow (W.m-2, >0) 
    261          hfx_snw_1d(ji) = hfx_snw_1d(ji) - zdh_s_mel(ji) * a_i_b(ji) * zqprec(ji) * r1_rdtice 
     253         hfx_snw_1d(ji) = hfx_snw_1d(ji) - zdh_s_mel(ji) * a_i_1d(ji) * zqprec(ji) * r1_rdtice 
    262254         ! snow melting only = water into the ocean (then without snow precip), >0 
    263          wfx_snw_1d(ji) = wfx_snw_1d(ji) - rhosn * a_i_b(ji) * zdh_s_mel(ji) * r1_rdtice 
     255         wfx_snw_1d(ji) = wfx_snw_1d(ji) - rhosn * a_i_1d(ji) * zdh_s_mel(ji) * r1_rdtice 
    264256          
    265257         ! updates available heat + thickness 
    266258         zq_su (ji) = MAX( 0._wp , zq_su (ji) + zdh_s_mel(ji) * zqprec(ji) )       
    267          ht_s_b(ji) = MAX( 0._wp , ht_s_b(ji) + zdh_s_mel(ji) ) 
    268          zh_s  (ji) = ht_s_b(ji) / REAL( nlay_s ) 
     259         ht_s_1d(ji) = MAX( 0._wp , ht_s_1d(ji) + zdh_s_mel(ji) ) 
     260         zh_s  (ji) = ht_s_1d(ji) / REAL( nlay_s ) 
    269261 
    270262         ENDIF 
     
    276268         DO ji = kideb, kiut 
    277269            ! thickness change 
    278             zindh            = 1._wp - MAX( 0._wp, SIGN( 1._wp, - ht_s_b(ji) ) )  
    279             zindq            = 1._wp - MAX( 0._wp, SIGN( 1._wp, - q_s_b(ji,jk) + epsi20 ) )  
    280             zdeltah  (ji,jk) = - zindh * zindq * zq_su(ji) / MAX( q_s_b(ji,jk), epsi20 ) 
     270            rswitch          = 1._wp - MAX( 0._wp, SIGN( 1._wp, - ht_s_1d(ji) ) )  
     271            rswitch          = rswitch * ( 1._wp - MAX( 0._wp, SIGN( 1._wp, - q_s_1d(ji,jk) + epsi20 ) ) )  
     272            zdeltah  (ji,jk) = - rswitch * zq_su(ji) / MAX( q_s_1d(ji,jk), epsi20 ) 
    281273            zdeltah  (ji,jk) = MAX( zdeltah(ji,jk) , - zh_s(ji) ) ! bound melting 
    282274            zdh_s_mel(ji)    = zdh_s_mel(ji) + zdeltah(ji,jk)     
    283275            ! heat used to melt snow(W.m-2, >0) 
    284             hfx_snw_1d(ji)   = hfx_snw_1d(ji) - zdeltah(ji,jk) * a_i_b(ji) * q_s_b(ji,jk) * r1_rdtice  
     276            hfx_snw_1d(ji)   = hfx_snw_1d(ji) - zdeltah(ji,jk) * a_i_1d(ji) * q_s_1d(ji,jk) * r1_rdtice  
    285277            ! snow melting only = water into the ocean (then without snow precip) 
    286             wfx_snw_1d(ji)   = wfx_snw_1d(ji) - rhosn * a_i_b(ji) * zdeltah(ji,jk) * r1_rdtice 
     278            wfx_snw_1d(ji)   = wfx_snw_1d(ji) - rhosn * a_i_1d(ji) * zdeltah(ji,jk) * r1_rdtice 
    287279 
    288280            ! updates available heat + thickness 
    289             zq_su (ji) = MAX( 0._wp , zq_su (ji) + zdeltah(ji,jk) * q_s_b(ji,jk) ) 
    290             ht_s_b(ji) = MAX( 0._wp , ht_s_b(ji) + zdeltah(ji,jk) ) 
     281            zq_su (ji) = MAX( 0._wp , zq_su (ji) + zdeltah(ji,jk) * q_s_1d(ji,jk) ) 
     282            ht_s_1d(ji) = MAX( 0._wp , ht_s_1d(ji) + zdeltah(ji,jk) ) 
    291283 
    292284         END DO 
     
    305297         ! forced  mode: snow thickness change due to sublimation 
    306298         DO ji = kideb, kiut 
    307             zdh_s_sub(ji)  =  MAX( - ht_s_b(ji) , - parsub * qla_ice_1d(ji) / ( rhosn * lsub ) * rdt_ice ) 
     299            zdh_s_sub(ji)  =  MAX( - ht_s_1d(ji) , - parsub * qla_ice_1d(ji) / ( rhosn * lsub ) * rdt_ice ) 
    308300            ! Heat flux by sublimation [W.m-2], < 0 
    309301            !      sublimate first snow that had fallen, then pre-existing snow 
    310302            zcoeff         =      ( MAX( zdh_s_sub(ji), - MAX( 0._wp, zdh_s_pre(ji) + zdh_s_mel(ji) ) )   * zqprec(ji) +   & 
    311                &  ( zdh_s_sub(ji) - MAX( zdh_s_sub(ji), - MAX( 0._wp, zdh_s_pre(ji) + zdh_s_mel(ji) ) ) ) * q_s_b(ji,1) )  & 
    312                &  * a_i_b(ji) * r1_rdtice 
     303               &  ( zdh_s_sub(ji) - MAX( zdh_s_sub(ji), - MAX( 0._wp, zdh_s_pre(ji) + zdh_s_mel(ji) ) ) ) * q_s_1d(ji,1) )  & 
     304               &  * a_i_1d(ji) * r1_rdtice 
    313305            hfx_sub_1d(ji) = hfx_sub_1d(ji) + zcoeff 
    314306            ! Mass flux by sublimation 
    315             wfx_sub_1d(ji) =  wfx_sub_1d(ji) - rhosn * a_i_b(ji) * zdh_s_sub(ji) * r1_rdtice 
     307            wfx_sub_1d(ji) =  wfx_sub_1d(ji) - rhosn * a_i_1d(ji) * zdh_s_sub(ji) * r1_rdtice 
    316308            ! new snow thickness 
    317             ht_s_b(ji)     =  MAX( 0._wp , ht_s_b(ji) + zdh_s_sub(ji) ) 
     309            ht_s_1d(ji)     =  MAX( 0._wp , ht_s_1d(ji) + zdh_s_sub(ji) ) 
    318310         END DO 
    319311      ENDIF 
     
    322314      DO ji = kideb, kiut 
    323315         dh_s_tot(ji)   = zdh_s_mel(ji) + zdh_s_pre(ji) + zdh_s_sub(ji) 
    324          zh_s(ji)       = ht_s_b(ji) / REAL( nlay_s ) 
     316         zh_s(ji)       = ht_s_1d(ji) / REAL( nlay_s ) 
    325317      END DO ! ji 
    326318 
     
    332324      DO jk = 1, nlay_s 
    333325         DO ji = kideb,kiut 
    334             zindh  =  MAX(  0._wp , SIGN( 1._wp, - ht_s_b(ji) + epsi20 )  ) 
    335             q_s_b(ji,jk) = ( 1._wp - zindh ) / MAX( ht_s_b(ji), epsi20 ) *             & 
     326            rswitch       =  MAX(  0._wp , SIGN( 1._wp, - ht_s_1d(ji) + epsi20 )  ) 
     327            q_s_1d(ji,jk) = ( 1._wp - rswitch ) / MAX( ht_s_1d(ji), epsi20 ) *             & 
    336328              &            ( (   MAX( 0._wp, dh_s_tot(ji) )              ) * zqprec(ji) +  & 
    337               &              ( - MAX( 0._wp, dh_s_tot(ji) ) + ht_s_b(ji) ) * rhosn * ( cpic * ( rtt - t_s_b(ji,jk) ) + lfus ) ) 
    338             zq_s(ji)     =  zq_s(ji) + q_s_b(ji,jk) 
     329              &              ( - MAX( 0._wp, dh_s_tot(ji) ) + ht_s_1d(ji) ) * rhosn * ( cpic * ( rtt - t_s_1d(ji,jk) ) + lfus ) ) 
     330            zq_s(ji)     =  zq_s(ji) + q_s_1d(ji,jk) 
    339331         END DO 
    340332      END DO 
     
    346338      DO jk = 1, nlay_i 
    347339         DO ji = kideb, kiut  
    348             zEi            = - q_i_b(ji,jk) / rhoic                ! Specific enthalpy of layer k [J/kg, <0] 
    349  
    350             ztmelts        = - tmut * s_i_b(ji,jk) + rtt           ! Melting point of layer k [K] 
     340            zEi            = - q_i_1d(ji,jk) / rhoic                ! Specific enthalpy of layer k [J/kg, <0] 
     341 
     342            ztmelts        = - tmut * s_i_1d(ji,jk) + rtt           ! Melting point of layer k [K] 
    351343 
    352344            zEw            =    rcp * ( ztmelts - rt0 )            ! Specific enthalpy of resulting meltwater [J/kg, <0] 
     
    368360            zQm            = zfmdt * zEw                           ! Energy of the melt water sent to the ocean [J/m2, <0] 
    369361 
    370             ! Contribution to salt flux (clem: using sm_i_b and not s_i_b(jk) is ok) 
    371             sfx_sum_1d(ji)   = sfx_sum_1d(ji) - sm_i_b(ji) * a_i_b(ji) * zdeltah(ji,jk) * rhoic * r1_rdtice 
     362            ! Contribution to salt flux (clem: using sm_i_1d and not s_i_1d(jk) is ok) 
     363            sfx_sum_1d(ji)   = sfx_sum_1d(ji) - sm_i_1d(ji) * a_i_1d(ji) * zdeltah(ji,jk) * rhoic * r1_rdtice 
    372364 
    373365            ! Contribution to heat flux [W.m-2], < 0 
    374             hfx_thd_1d(ji) = hfx_thd_1d(ji) + zfmdt * a_i_b(ji) * zEw * r1_rdtice 
     366            hfx_thd_1d(ji) = hfx_thd_1d(ji) + zfmdt * a_i_1d(ji) * zEw * r1_rdtice 
    375367 
    376368            ! Total heat flux used in this process [W.m-2], > 0   
    377             hfx_sum_1d(ji) = hfx_sum_1d(ji) - zfmdt * a_i_b(ji) * zdE * r1_rdtice 
     369            hfx_sum_1d(ji) = hfx_sum_1d(ji) - zfmdt * a_i_1d(ji) * zdE * r1_rdtice 
    378370 
    379371            ! Contribution to mass flux 
    380             wfx_sum_1d(ji) =  wfx_sum_1d(ji) - rhoic * a_i_b(ji) * zdeltah(ji,jk) * r1_rdtice 
     372            wfx_sum_1d(ji) =  wfx_sum_1d(ji) - rhoic * a_i_1d(ji) * zdeltah(ji,jk) * r1_rdtice 
    381373            
    382374            ! record which layers have disappeared (for bottom melting)  
    383375            !    => icount=0 : no layer has vanished 
    384376            !    => icount=5 : 5 layers have vanished 
    385             zindh       = NINT( MAX( 0._wp , SIGN( 1._wp , - ( zh_i(ji,jk) + zdeltah(ji,jk) ) ) ) )  
    386             icount(ji)  = icount(ji) + zindh 
     377            rswitch     = MAX( 0._wp , SIGN( 1._wp , - ( zh_i(ji,jk) + zdeltah(ji,jk) ) ) )  
     378            icount(ji)  = icount(ji) + NINT( rswitch ) 
    387379            zh_i(ji,jk) = MAX( 0._wp , zh_i(ji,jk) + zdeltah(ji,jk) ) 
    388380 
    389381            ! update heat content (J.m-2) and layer thickness 
    390             qh_i_old(ji,jk) = qh_i_old(ji,jk) + zdeltah(ji,jk) * q_i_b(ji,jk) 
     382            qh_i_old(ji,jk) = qh_i_old(ji,jk) + zdeltah(ji,jk) * q_i_1d(ji,jk) 
    391383            h_i_old (ji,jk) = h_i_old (ji,jk) + zdeltah(ji,jk) 
    392384         END DO 
     
    394386      ! update ice thickness 
    395387      DO ji = kideb, kiut 
    396          ht_i_b(ji) =  MAX( 0._wp , ht_i_b(ji) + dh_i_surf(ji) ) 
     388         ht_i_1d(ji) =  MAX( 0._wp , ht_i_1d(ji) + dh_i_surf(ji) ) 
    397389      END DO 
    398390 
     
    424416      !clem debug. Just to be sure that enthalpy at nlay_i+1 is null 
    425417      DO ji = kideb, kiut 
    426          q_i_b(ji,nlay_i+1) = 0._wp 
     418         q_i_1d(ji,nlay_i+1) = 0._wp 
    427419      END DO 
    428420 
     
    446438 
    447439               s_i_new(ji)        = zswitch_sal * zfracs * sss_m(ii,ij)  &  ! New ice salinity 
    448                                   + ( 1. - zswitch_sal ) * sm_i_b(ji)  
     440                                  + ( 1. - zswitch_sal ) * sm_i_1d(ji)  
    449441               ! New ice growth 
    450442               ztmelts            = - tmut * s_i_new(ji) + rtt          ! New ice melting point (K) 
    451443 
    452                zt_i_new           = zswitch_sal * t_bo_b(ji) + ( 1. - zswitch_sal) * t_i_b(ji, nlay_i) 
     444               zt_i_new           = zswitch_sal * t_bo_1d(ji) + ( 1. - zswitch_sal) * t_i_1d(ji, nlay_i) 
    453445                
    454446               zEi                = cpic * ( zt_i_new - ztmelts ) &     ! Specific enthalpy of forming ice (J/kg, <0)       
     
    456448                  &               + rcp  * ( ztmelts-rtt )           
    457449 
    458                zEw                = rcp  * ( t_bo_b(ji) - rt0 )         ! Specific enthalpy of seawater (J/kg, < 0) 
     450               zEw                = rcp  * ( t_bo_1d(ji) - rt0 )         ! Specific enthalpy of seawater (J/kg, < 0) 
    459451 
    460452               zdE                = zEi - zEw                           ! Specific enthalpy difference (J/kg, <0) 
     
    462454               dh_i_bott(ji)      = rdt_ice * MAX( 0._wp , zf_tt(ji) / ( zdE * rhoic ) ) 
    463455 
    464                q_i_b(ji,nlay_i+1) = -zEi * rhoic                        ! New ice energy of melting (J/m3, >0) 
     456               q_i_1d(ji,nlay_i+1) = -zEi * rhoic                        ! New ice energy of melting (J/m3, >0) 
    465457                
    466458            ENDIF ! fc_bo_i 
     
    477469            ztmelts        = - tmut * s_i_new(ji) + rtt          ! New ice melting point (K) 
    478470             
    479             zt_i_new       = zswitch_sal * t_bo_b(ji) + ( 1. - zswitch_sal) * t_i_b(ji, nlay_i) 
     471            zt_i_new       = zswitch_sal * t_bo_1d(ji) + ( 1. - zswitch_sal) * t_i_1d(ji, nlay_i) 
    480472             
    481473            zEi            = cpic * ( zt_i_new - ztmelts ) &     ! Specific enthalpy of forming ice (J/kg, <0)       
     
    483475               &               + rcp  * ( ztmelts-rtt )           
    484476             
    485             zEw            = rcp  * ( t_bo_b(ji) - rt0 )         ! Specific enthalpy of seawater (J/kg, < 0) 
     477            zEw            = rcp  * ( t_bo_1d(ji) - rt0 )         ! Specific enthalpy of seawater (J/kg, < 0) 
    486478             
    487479            zdE            = zEi - zEw                           ! Specific enthalpy difference (J/kg, <0) 
    488480             
    489481            ! Contribution to heat flux to the ocean [W.m-2], >0   
    490             hfx_thd_1d(ji) = hfx_thd_1d(ji) + zfmdt * a_i_b(ji) * zEw * r1_rdtice 
     482            hfx_thd_1d(ji) = hfx_thd_1d(ji) + zfmdt * a_i_1d(ji) * zEw * r1_rdtice 
    491483 
    492484            ! Total heat flux used in this process [W.m-2], <0   
    493             hfx_bog_1d(ji) = hfx_bog_1d(ji) - zfmdt * a_i_b(ji) * zdE * r1_rdtice 
     485            hfx_bog_1d(ji) = hfx_bog_1d(ji) - zfmdt * a_i_1d(ji) * zdE * r1_rdtice 
    494486             
    495487            ! Contribution to salt flux, <0 
    496             sfx_bog_1d(ji) = sfx_bog_1d(ji) + s_i_new(ji) * a_i_b(ji) * zfmdt * r1_rdtice 
     488            sfx_bog_1d(ji) = sfx_bog_1d(ji) + s_i_new(ji) * a_i_1d(ji) * zfmdt * r1_rdtice 
    497489 
    498490            ! Contribution to mass flux, <0 
    499             wfx_bog_1d(ji) =  wfx_bog_1d(ji) - rhoic * a_i_b(ji) * dh_i_bott(ji) * r1_rdtice 
     491            wfx_bog_1d(ji) =  wfx_bog_1d(ji) - rhoic * a_i_1d(ji) * dh_i_bott(ji) * r1_rdtice 
    500492 
    501493            ! update heat content (J.m-2) and layer thickness 
    502             qh_i_old(ji,nlay_i+1) = qh_i_old(ji,nlay_i+1) + dh_i_bott(ji) * q_i_b(ji,nlay_i+1) 
     494            qh_i_old(ji,nlay_i+1) = qh_i_old(ji,nlay_i+1) + dh_i_bott(ji) * q_i_1d(ji,nlay_i+1) 
    503495            h_i_old (ji,nlay_i+1) = h_i_old (ji,nlay_i+1) + dh_i_bott(ji) 
    504496         ENDIF 
     
    513505            IF(  zf_tt(ji)  >=  0._wp  .AND. jk > icount(ji) ) THEN   ! do not calculate where layer has already disappeared from surface melting  
    514506 
    515                ztmelts = - tmut * s_i_b(ji,jk) + rtt  ! Melting point of layer jk (K) 
    516  
    517                IF( t_i_b(ji,jk) >= ztmelts ) THEN !!! Internal melting 
    518                   zintermelt(ji)    = 1._wp 
    519  
    520                   zEi               = - q_i_b(ji,jk) / rhoic        ! Specific enthalpy of melting ice (J/kg, <0) 
    521  
    522                   !!zEw               = rcp * ( t_i_b(ji,jk) - rtt )  ! Specific enthalpy of meltwater at T = t_i_b (J/kg, <0) 
     507               ztmelts = - tmut * s_i_1d(ji,jk) + rtt  ! Melting point of layer jk (K) 
     508 
     509               IF( t_i_1d(ji,jk) >= ztmelts ) THEN !!! Internal melting 
     510 
     511                  zEi               = - q_i_1d(ji,jk) / rhoic        ! Specific enthalpy of melting ice (J/kg, <0) 
     512 
     513                  !!zEw               = rcp * ( t_i_1d(ji,jk) - rtt )  ! Specific enthalpy of meltwater at T = t_i_1d (J/kg, <0) 
    523514 
    524515                  zdE               = 0._wp                         ! Specific enthalpy difference   (J/kg, <0) 
     
    533524 
    534525                  ! Contribution to heat flux to the ocean [W.m-2], <0 (ice enthalpy zEi is "sent" to the ocean)  
    535                   hfx_res_1d(ji) = hfx_res_1d(ji) + zfmdt * a_i_b(ji) * zEi * r1_rdtice 
    536  
    537                   ! Contribution to salt flux (clem: using sm_i_b and not s_i_b(jk) is ok) 
    538                   sfx_res_1d(ji) = sfx_res_1d(ji) - sm_i_b(ji) * a_i_b(ji) * zdeltah(ji,jk) * rhoic * r1_rdtice 
     526                  hfx_res_1d(ji) = hfx_res_1d(ji) + zfmdt * a_i_1d(ji) * zEi * r1_rdtice 
     527 
     528                  ! Contribution to salt flux (clem: using sm_i_1d and not s_i_1d(jk) is ok) 
     529                  sfx_res_1d(ji) = sfx_res_1d(ji) - sm_i_1d(ji) * a_i_1d(ji) * zdeltah(ji,jk) * rhoic * r1_rdtice 
    539530                                     
    540531                  ! Contribution to mass flux 
    541                   wfx_res_1d(ji) =  wfx_res_1d(ji) - rhoic * a_i_b(ji) * zdeltah(ji,jk) * r1_rdtice 
     532                  wfx_res_1d(ji) =  wfx_res_1d(ji) - rhoic * a_i_1d(ji) * zdeltah(ji,jk) * r1_rdtice 
    542533 
    543534                  ! update heat content (J.m-2) and layer thickness 
    544                   qh_i_old(ji,jk) = qh_i_old(ji,jk) + zdeltah(ji,jk) * q_i_b(ji,jk) 
     535                  qh_i_old(ji,jk) = qh_i_old(ji,jk) + zdeltah(ji,jk) * q_i_1d(ji,jk) 
    545536                  h_i_old (ji,jk) = h_i_old (ji,jk) + zdeltah(ji,jk) 
    546537 
    547538               ELSE                               !!! Basal melting 
    548539 
    549                   zEi               = - q_i_b(ji,jk) / rhoic ! Specific enthalpy of melting ice (J/kg, <0) 
     540                  zEi               = - q_i_1d(ji,jk) / rhoic ! Specific enthalpy of melting ice (J/kg, <0) 
    550541 
    551542                  zEw               = rcp * ( ztmelts - rtt )! Specific enthalpy of meltwater (J/kg, <0) 
     
    568559 
    569560                  ! Contribution to heat flux to the ocean [W.m-2], <0   
    570                   hfx_thd_1d(ji) = hfx_thd_1d(ji) + zfmdt * a_i_b(ji) * zEw * r1_rdtice 
    571  
    572                   ! Contribution to salt flux (clem: using sm_i_b and not s_i_b(jk) is ok) 
    573                   sfx_bom_1d(ji) = sfx_bom_1d(ji) - sm_i_b(ji) * a_i_b(ji) * zdeltah(ji,jk) * rhoic * r1_rdtice 
     561                  hfx_thd_1d(ji) = hfx_thd_1d(ji) + zfmdt * a_i_1d(ji) * zEw * r1_rdtice 
     562 
     563                  ! Contribution to salt flux (clem: using sm_i_1d and not s_i_1d(jk) is ok) 
     564                  sfx_bom_1d(ji) = sfx_bom_1d(ji) - sm_i_1d(ji) * a_i_1d(ji) * zdeltah(ji,jk) * rhoic * r1_rdtice 
    574565                   
    575566                  ! Total heat flux used in this process [W.m-2], >0   
    576                   hfx_bom_1d(ji) = hfx_bom_1d(ji) - zfmdt * a_i_b(ji) * zdE * r1_rdtice 
     567                  hfx_bom_1d(ji) = hfx_bom_1d(ji) - zfmdt * a_i_1d(ji) * zdE * r1_rdtice 
    577568                   
    578569                  ! Contribution to mass flux 
    579                   wfx_bom_1d(ji) =  wfx_bom_1d(ji) - rhoic * a_i_b(ji) * zdeltah(ji,jk) * r1_rdtice 
     570                  wfx_bom_1d(ji) =  wfx_bom_1d(ji) - rhoic * a_i_1d(ji) * zdeltah(ji,jk) * r1_rdtice 
    580571 
    581572                  ! update heat content (J.m-2) and layer thickness 
    582                   qh_i_old(ji,jk) = qh_i_old(ji,jk) + zdeltah(ji,jk) * q_i_b(ji,jk) 
     573                  qh_i_old(ji,jk) = qh_i_old(ji,jk) + zdeltah(ji,jk) * q_i_1d(ji,jk) 
    583574                  h_i_old (ji,jk) = h_i_old (ji,jk) + zdeltah(ji,jk) 
    584575               ENDIF 
     
    603594! 
    604595!               ! excessive energy is sent to lateral ablation 
    605 !               zinda = MAX( 0._wp, SIGN( 1._wp , 1._wp - at_i_b(ji) - epsi20 ) ) 
    606 !               zq_1cat(ji) =  zinda * rhoic * lfus * at_i_b(ji) / MAX( 1._wp - at_i_b(ji) , epsi20 ) * zdvres ! J.m-2 >=0 
     596!               rswitch = MAX( 0._wp, SIGN( 1._wp , 1._wp - at_i_1d(ji) - epsi20 ) ) 
     597!               zq_1cat(ji) =  rswitch * rhoic * lfus * at_i_1d(ji) / MAX( 1._wp - at_i_1d(ji) , epsi20 ) * zdvres ! J.m-2 >=0 
    607598! 
    608599!               ! correct salt and mass fluxes 
    609 !               sfx_bom_1d(ji) = sfx_bom_1d(ji) - sm_i_b(ji) * a_i_b(ji) * zdvres * rhoic * r1_rdtice ! this is only a raw approximation 
    610 !               wfx_bom_1d(ji) = wfx_bom_1d(ji) - rhoic * a_i_b(ji) * zdvres * r1_rdtice 
     600!               sfx_bom_1d(ji) = sfx_bom_1d(ji) - sm_i_1d(ji) * a_i_1d(ji) * zdvres * rhoic * r1_rdtice ! this is only a raw approximation 
     601!               wfx_bom_1d(ji) = wfx_bom_1d(ji) - rhoic * a_i_1d(ji) * zdvres * r1_rdtice 
    611602!            ENDIF 
    612603!         END DO 
     
    617608      !------------------------------------------- 
    618609      DO ji = kideb, kiut 
    619          ht_i_b(ji) =  MAX( 0._wp , ht_i_b(ji) + dh_i_bott(ji) ) 
     610         ht_i_1d(ji) =  MAX( 0._wp , ht_i_1d(ji) + dh_i_bott(ji) ) 
    620611      END DO   
    621612 
     
    628619      DO ji = kideb, kiut 
    629620         zq_rema(ji)     = zq_su(ji) + zq_bo(ji)  
    630 !         zindh           = 1._wp - MAX( 0._wp, SIGN( 1._wp, - ht_s_b(ji) ) )   ! =1 if snow 
     621!         zindh           = 1._wp - MAX( 0._wp, SIGN( 1._wp, - ht_s_1d(ji) ) )   ! =1 if snow 
    631622!         zindq           = 1._wp - MAX( 0._wp, SIGN( 1._wp, - zq_s(ji) + epsi20 ) ) 
    632623!         zdeltah  (ji,1) = - zindh * zindq * zq_rema(ji) / MAX( zq_s(ji), epsi20 ) 
    633 !         zdeltah  (ji,1) = MIN( 0._wp , MAX( zdeltah(ji,1) , - ht_s_b(ji) ) ) ! bound melting 
     624!         zdeltah  (ji,1) = MIN( 0._wp , MAX( zdeltah(ji,1) , - ht_s_1d(ji) ) ) ! bound melting 
    634625!         zdh_s_mel(ji)   = zdh_s_mel(ji) + zdeltah(ji,1)     
    635626!         dh_s_tot (ji)   = dh_s_tot(ji) + zdeltah(ji,1) 
    636 !         ht_s_b   (ji)   = ht_s_b(ji)   + zdeltah(ji,1) 
     627!         ht_s_1d   (ji)   = ht_s_1d(ji)   + zdeltah(ji,1) 
    637628!         
    638629!         zq_rema(ji)     = zq_rema(ji) + zdeltah(ji,1) * zq_s(ji)                ! update available heat (J.m-2) 
    639630!         ! heat used to melt snow 
    640 !         hfx_snw_1d(ji)  = hfx_snw_1d(ji) - zdeltah(ji,1) * a_i_b(ji) * zq_s(ji) * r1_rdtice ! W.m-2 (>0) 
     631!         hfx_snw_1d(ji)  = hfx_snw_1d(ji) - zdeltah(ji,1) * a_i_1d(ji) * zq_s(ji) * r1_rdtice ! W.m-2 (>0) 
    641632!         ! Contribution to mass flux 
    642 !         wfx_snw_1d(ji)  =  wfx_snw_1d(ji) - rhosn * a_i_b(ji) * zdeltah(ji,1) * r1_rdtice 
     633!         wfx_snw_1d(ji)  =  wfx_snw_1d(ji) - rhosn * a_i_1d(ji) * zdeltah(ji,1) * r1_rdtice 
    643634!     
    644635         ii = MOD( npb(ji) - 1, jpi ) + 1 ; ij = ( npb(ji) - 1 ) / jpi + 1 
    645636         ! Remaining heat flux (W.m-2) is sent to the ocean heat budget 
    646          hfx_out(ii,ij)  = hfx_out(ii,ij) + ( zq_1cat(ji) + zq_rema(ji) * a_i_b(ji) ) * r1_rdtice 
     637         hfx_out(ii,ij)  = hfx_out(ii,ij) + ( zq_1cat(ji) + zq_rema(ji) * a_i_1d(ji) ) * r1_rdtice 
    647638 
    648639         IF( ln_nicep .AND. zq_rema(ji) < 0. .AND. lwp ) WRITE(numout,*) 'ALERTE zq_rema <0 = ', zq_rema(ji) 
     
    657648      DO ji = kideb, kiut 
    658649         ! 
    659          dh_snowice(ji) = MAX(  0._wp , ( rhosn * ht_s_b(ji) + (rhoic-rau0) * ht_i_b(ji) ) / ( rhosn+rau0-rhoic )  ) 
    660  
    661          ht_i_b(ji)     = ht_i_b(ji) + dh_snowice(ji) 
    662          ht_s_b(ji)     = ht_s_b(ji) - dh_snowice(ji) 
     650         dh_snowice(ji) = MAX(  0._wp , ( rhosn * ht_s_1d(ji) + (rhoic-rau0) * ht_i_1d(ji) ) / ( rhosn+rau0-rhoic )  ) 
     651 
     652         ht_i_1d(ji)     = ht_i_1d(ji) + dh_snowice(ji) 
     653         ht_s_1d(ji)     = ht_s_1d(ji) - dh_snowice(ji) 
    663654 
    664655         ! Salinity of snow ice 
    665656         ii = MOD( npb(ji) - 1, jpi ) + 1 ; ij = ( npb(ji) - 1 ) / jpi + 1 
    666          zs_snic = zswitch_sal * sss_m(ii,ij) * ( rhoic - rhosn ) / rhoic + ( 1. - zswitch_sal ) * sm_i_b(ji) 
     657         zs_snic = zswitch_sal * sss_m(ii,ij) * ( rhoic - rhosn ) / rhoic + ( 1. - zswitch_sal ) * sm_i_1d(ji) 
    667658 
    668659         ! entrapment during snow ice formation 
    669660         ! new salinity difference stored (to be used in limthd_ent.F90) 
    670661         IF (  num_sal == 2  ) THEN 
    671             zswitch = MAX( 0._wp , SIGN( 1._wp , ht_i_b(ji) - epsi10 ) ) 
     662            rswitch = MAX( 0._wp , SIGN( 1._wp , ht_i_1d(ji) - epsi10 ) ) 
    672663            ! salinity dif due to snow-ice formation 
    673             dsm_i_si_1d(ji) = ( zs_snic - sm_i_b(ji) ) * dh_snowice(ji) / MAX( ht_i_b(ji), epsi10 ) * zswitch      
     664            dsm_i_si_1d(ji) = ( zs_snic - sm_i_1d(ji) ) * dh_snowice(ji) / MAX( ht_i_1d(ji), epsi10 ) * rswitch      
    674665            ! salinity dif due to bottom growth  
    675666            IF (  zf_tt(ji)  < 0._wp ) THEN 
    676                dsm_i_se_1d(ji) = ( s_i_new(ji) - sm_i_b(ji) ) * dh_i_bott(ji) / MAX( ht_i_b(ji), epsi10 ) * zswitch 
     667               dsm_i_se_1d(ji) = ( s_i_new(ji) - sm_i_1d(ji) ) * dh_i_bott(ji) / MAX( ht_i_1d(ji), epsi10 ) * rswitch 
    677668            ENDIF 
    678669         ENDIF 
     
    686677          
    687678         ! Contribution to heat flux 
    688          hfx_thd_1d(ji) = hfx_thd_1d(ji) + zfmdt * a_i_b(ji) * zEw * r1_rdtice  
     679         hfx_thd_1d(ji) = hfx_thd_1d(ji) + zfmdt * a_i_1d(ji) * zEw * r1_rdtice  
    689680 
    690681         ! Contribution to salt flux 
    691          sfx_sni_1d(ji) = sfx_sni_1d(ji) + sss_m(ii,ij) * a_i_b(ji) * zfmdt * r1_rdtice  
     682         sfx_sni_1d(ji) = sfx_sni_1d(ji) + sss_m(ii,ij) * a_i_1d(ji) * zfmdt * r1_rdtice  
    692683           
    693684         ! Contribution to mass flux 
    694685         ! All snow is thrown in the ocean, and seawater is taken to replace the volume 
    695          wfx_sni_1d(ji) = wfx_sni_1d(ji) - a_i_b(ji) * dh_snowice(ji) * rhoic * r1_rdtice 
    696          wfx_snw_1d(ji) = wfx_snw_1d(ji) + a_i_b(ji) * dh_snowice(ji) * rhosn * r1_rdtice 
     686         wfx_sni_1d(ji) = wfx_sni_1d(ji) - a_i_1d(ji) * dh_snowice(ji) * rhoic * r1_rdtice 
     687         wfx_snw_1d(ji) = wfx_snw_1d(ji) + a_i_1d(ji) * dh_snowice(ji) * rhosn * r1_rdtice 
    697688 
    698689         ! update heat content (J.m-2) and layer thickness 
    699          qh_i_old(ji,0) = qh_i_old(ji,0) + dh_snowice(ji) * q_s_b(ji,1) + zfmdt * zEw 
     690         qh_i_old(ji,0) = qh_i_old(ji,0) + dh_snowice(ji) * q_s_1d(ji,1) + zfmdt * zEw 
    700691         h_i_old (ji,0) = h_i_old (ji,0) + dh_snowice(ji) 
    701692          
    702693         ! Total ablation (to debug) 
    703          IF( ht_i_b(ji) <= 0._wp )   a_i_b(ji) = 0._wp 
     694         IF( ht_i_1d(ji) <= 0._wp )   a_i_1d(ji) = 0._wp 
    704695 
    705696      END DO !ji 
     
    711702      !clem bug: we should take snow into account here 
    712703      DO ji = kideb, kiut 
    713          zindh    =  1.0 - MAX( 0._wp , SIGN( 1._wp , - ht_i_b(ji) ) )  
    714          t_su_b(ji) =  zindh * t_su_b(ji) + ( 1.0 - zindh ) * rtt 
     704         rswitch     =  1.0 - MAX( 0._wp , SIGN( 1._wp , - ht_i_1d(ji) ) )  
     705         t_su_1d(ji) =  rswitch * t_su_1d(ji) + ( 1.0 - rswitch ) * rtt 
    715706      END DO  ! ji 
    716707 
     
    718709         DO ji = kideb,kiut 
    719710            ! mask enthalpy 
    720             zinda        =  MAX(  0._wp , SIGN( 1._wp, - ht_s_b(ji) )  ) 
    721             q_s_b(ji,jk) = ( 1.0 - zinda ) * q_s_b(ji,jk) 
    722             ! recalculate t_s_b from q_s_b 
    723             t_s_b(ji,jk) = rtt + ( 1._wp - zinda ) * ( - q_s_b(ji,jk) / ( rhosn * cpic ) + lfus / cpic ) 
     711            rswitch       =  MAX(  0._wp , SIGN( 1._wp, - ht_s_1d(ji) )  ) 
     712            q_s_1d(ji,jk) = ( 1.0 - rswitch ) * q_s_1d(ji,jk) 
     713            ! recalculate t_s_1d from q_s_1d 
     714            t_s_1d(ji,jk) = rtt + ( 1._wp - rswitch ) * ( - q_s_1d(ji,jk) / ( rhosn * cpic ) + lfus / cpic ) 
    724715         END DO 
    725716      END DO 
     
    727718      CALL wrk_dealloc( jpij, zh_s, zqprec, zq_su, zq_bo, zf_tt, zq_1cat, zq_rema ) 
    728719      CALL wrk_dealloc( jpij, zdh_s_mel, zdh_s_pre, zdh_s_sub, zqh_i, zqh_s, zq_s ) 
    729       CALL wrk_dealloc( jpij, zintermelt ) 
    730       CALL wrk_dealloc( jpij, jkmax, zdeltah, zh_i ) 
     720      CALL wrk_dealloc( jpij, nlay_i+1, zdeltah, zh_i ) 
    731721      CALL wrk_dealloc( jpij, icount ) 
    732722      ! 
  • branches/2014/dev_r4650_UKMO11_restart_functionality/NEMOGCM/NEMO/LIM_SRC_3/limthd_dif.F90

    r4688 r5208  
    2525   USE wrk_nemo       ! work arrays 
    2626   USE lib_fortran    ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined)   
    27    USE cpl_oasis3, ONLY : lk_cpl 
     27   USE sbc_oce, ONLY : lk_cpl 
    2828 
    2929   IMPLICIT NONE 
     
    3232   PUBLIC   lim_thd_dif   ! called by lim_thd 
    3333 
    34    REAL(wp) ::   epsi10 = 1.e-10_wp    ! 
    3534   !!---------------------------------------------------------------------- 
    3635   !! NEMO/LIM3 4.0 , UCL - NEMO Consortium (2011) 
     
    7574      !! 
    7675      !! ** Inputs / Ouputs : (global commons) 
    77       !!           surface temperature : t_su_b 
    78       !!           ice/snow temperatures   : t_i_b, t_s_b 
    79       !!           ice salinities          : s_i_b 
     76      !!           surface temperature : t_su_1d 
     77      !!           ice/snow temperatures   : t_i_1d, t_s_1d 
     78      !!           ice salinities          : s_i_1d 
    8079      !!           number of layers in the ice/snow: nlay_i, nlay_s 
    8180      !!           profile of the ice/snow layers : z_i, z_s 
    82       !!           total ice/snow thickness : ht_i_b, ht_s_b 
     81      !!           total ice/snow thickness : ht_i_1d, ht_s_1d 
    8382      !! 
    8483      !! ** External :  
     
    9897      INTEGER ::   ii, ij      ! temporary dummy loop index 
    9998      INTEGER ::   numeq       ! current reference number of equation 
    100       INTEGER ::   layer       ! vertical dummy loop index  
     99      INTEGER ::   jk       ! vertical dummy loop index  
    101100      INTEGER ::   nconv       ! number of iterations in iterative procedure 
    102101      INTEGER ::   minnumeqmin, maxnumeqmax 
     
    108107      REAL(wp) ::   zgamma    =  18009._wp    ! for specific heat 
    109108      REAL(wp) ::   zbeta     =  0.117_wp     ! for thermal conductivity (could be 0.13) 
    110       REAL(wp) ::   zraext_s  =  1.e+8_wp     ! extinction coefficient of radiation in the snow 
     109      REAL(wp) ::   zraext_s  =  10._wp       ! extinction coefficient of radiation in the snow 
    111110      REAL(wp) ::   zkimin    =  0.10_wp      ! minimum ice thermal conductivity 
    112111      REAL(wp) ::   ztsu_err  =  1.e-5_wp     ! range around which t_su is considered as 0°C  
     
    114113      REAL(wp) ::   zerritmax   ! current maximal error on temperature  
    115114      REAL(wp), POINTER, DIMENSION(:) ::   ztfs        ! ice melting point 
    116       REAL(wp), POINTER, DIMENSION(:) ::   ztsuold     ! old surface temperature (before the iterative procedure ) 
    117       REAL(wp), POINTER, DIMENSION(:) ::   ztsuoldit   ! surface temperature at previous iteration 
     115      REAL(wp), POINTER, DIMENSION(:) ::   ztsu     ! old surface temperature (before the iterative procedure ) 
     116      REAL(wp), POINTER, DIMENSION(:) ::   ztsubit     ! surface temperature at previous iteration 
    118117      REAL(wp), POINTER, DIMENSION(:) ::   zh_i        ! ice layer thickness 
    119118      REAL(wp), POINTER, DIMENSION(:) ::   zh_s        ! snow layer thickness 
     
    129128      REAL(wp), POINTER, DIMENSION(:,:) ::   zradab_i    ! Radiation absorbed in the ice 
    130129      REAL(wp), POINTER, DIMENSION(:,:) ::   zkappa_i    ! Kappa factor in the ice 
    131       REAL(wp), POINTER, DIMENSION(:,:) ::   ztiold      ! Old temperature in the ice 
     130      REAL(wp), POINTER, DIMENSION(:,:) ::   zti      ! Old temperature in the ice 
    132131      REAL(wp), POINTER, DIMENSION(:,:) ::   zeta_i      ! Eta factor in the ice 
    133132      REAL(wp), POINTER, DIMENSION(:,:) ::   ztitemp     ! Temporary temperature in the ice to check the convergence 
     
    137136      REAL(wp), POINTER, DIMENSION(:,:) ::   zradab_s    ! Radiation absorbed in the snow 
    138137      REAL(wp), POINTER, DIMENSION(:,:) ::   zkappa_s    ! Kappa factor in the snow 
    139       REAL(wp), POINTER, DIMENSION(:,:) ::   zeta_s       ! Eta factor in the snow 
    140       REAL(wp), POINTER, DIMENSION(:,:) ::   ztstemp      ! Temporary temperature in the snow to check the convergence 
    141       REAL(wp), POINTER, DIMENSION(:,:) ::   ztsold       ! Temporary temperature in the snow 
    142       REAL(wp), POINTER, DIMENSION(:,:) ::   z_s          ! Vertical cotes of the layers in the snow 
    143       REAL(wp), POINTER, DIMENSION(:,:) ::   zindterm   ! Independent term 
    144       REAL(wp), POINTER, DIMENSION(:,:) ::   zindtbis   ! temporary independent term 
     138      REAL(wp), POINTER, DIMENSION(:,:) ::   zeta_s      ! Eta factor in the snow 
     139      REAL(wp), POINTER, DIMENSION(:,:) ::   ztstemp     ! Temporary temperature in the snow to check the convergence 
     140      REAL(wp), POINTER, DIMENSION(:,:) ::   ztsb        ! Temporary temperature in the snow 
     141      REAL(wp), POINTER, DIMENSION(:,:) ::   z_s         ! Vertical cotes of the layers in the snow 
     142      REAL(wp), POINTER, DIMENSION(:,:) ::   zswiterm    ! Independent term 
     143      REAL(wp), POINTER, DIMENSION(:,:) ::   zswitbis    ! temporary independent term 
    145144      REAL(wp), POINTER, DIMENSION(:,:) ::   zdiagbis 
    146       REAL(wp), POINTER, DIMENSION(:,:,:) ::   ztrid   ! tridiagonal system terms 
     145      REAL(wp), POINTER, DIMENSION(:,:,:) ::   ztrid     ! tridiagonal system terms 
    147146      ! diag errors on heat 
    148       REAL(wp), POINTER, DIMENSION(:) :: zdq, zq_ini 
    149       REAL(wp)                        :: zhfx_err 
     147      REAL(wp), POINTER, DIMENSION(:) :: zdq, zq_ini, zhfx_err 
    150148      !!------------------------------------------------------------------      
    151149      !  
    152150      CALL wrk_alloc( jpij, numeqmin, numeqmax, isnow ) 
    153       CALL wrk_alloc( jpij, ztfs, ztsuold, ztsuoldit, zh_i, zh_s, zfsw ) 
     151      CALL wrk_alloc( jpij, ztfs, ztsub, ztsubit, zh_i, zh_s, zfsw ) 
    154152      CALL wrk_alloc( jpij, zf, dzf, zerrit, zdifcase, zftrice, zihic, zhsu ) 
    155       CALL wrk_alloc( jpij, nlay_i+1, ztcond_i, zradtr_i, zradab_i, zkappa_i, ztiold, zeta_i, ztitemp, z_i, zspeche_i, kjstart=0) 
    156       CALL wrk_alloc( jpij, nlay_s+1,           zradtr_s, zradab_s, zkappa_s, ztsold, zeta_s, ztstemp, z_s, kjstart=0) 
    157       CALL wrk_alloc( jpij, jkmax+2, zindterm, zindtbis, zdiagbis  ) 
    158       CALL wrk_alloc( jpij, jkmax+2, 3, ztrid ) 
    159  
    160       CALL wrk_alloc( jpij, zdq, zq_ini ) 
     153      CALL wrk_alloc( jpij, nlay_i+1, ztcond_i, zradtr_i, zradab_i, zkappa_i, ztib, zeta_i, ztitemp, z_i, zspeche_i, kjstart=0) 
     154      CALL wrk_alloc( jpij, nlay_s+1,           zradtr_s, zradab_s, zkappa_s, ztsb, zeta_s, ztstemp, z_s, kjstart=0) 
     155      CALL wrk_alloc( jpij, nlay_i+3, zswiterm, zswitbis, zdiagbis  ) 
     156      CALL wrk_alloc( jpij, nlay_i+3, 3, ztrid ) 
     157 
     158      CALL wrk_alloc( jpij, zdq, zq_ini, zhfx_err ) 
    161159 
    162160      ! --- diag error on heat diffusion - PART 1 --- ! 
    163161      zdq(:) = 0._wp ; zq_ini(:) = 0._wp       
    164162      DO ji = kideb, kiut 
    165          zq_ini(ji) = ( SUM( q_i_b(ji,1:nlay_i) ) * ht_i_b(ji) / REAL( nlay_i ) +  & 
    166             &           SUM( q_s_b(ji,1:nlay_s) ) * ht_s_b(ji) / REAL( nlay_s ) )  
     163         zq_ini(ji) = ( SUM( q_i_1d(ji,1:nlay_i) ) * ht_i_1d(ji) / REAL( nlay_i ) +  & 
     164            &           SUM( q_s_1d(ji,1:nlay_s) ) * ht_s_1d(ji) / REAL( nlay_s ) )  
    167165      END DO 
    168166 
     
    173171      DO ji = kideb , kiut 
    174172         ! is there snow or not 
    175          isnow(ji)= NINT(  1._wp - MAX( 0._wp , SIGN(1._wp, - ht_s_b(ji) ) )  ) 
     173         isnow(ji)= NINT(  1._wp - MAX( 0._wp , SIGN(1._wp, - ht_s_1d(ji) ) )  ) 
    176174         ! surface temperature of fusion 
    177175         ztfs(ji) = REAL( isnow(ji) ) * rtt + REAL( 1 - isnow(ji) ) * rtt 
    178176         ! layer thickness 
    179          zh_i(ji) = ht_i_b(ji) / REAL( nlay_i ) 
    180          zh_s(ji) = ht_s_b(ji) / REAL( nlay_s ) 
     177         zh_i(ji) = ht_i_1d(ji) / REAL( nlay_i ) 
     178         zh_s(ji) = ht_s_1d(ji) / REAL( nlay_s ) 
    181179      END DO 
    182180 
     
    188186      z_i(:,0) = 0._wp   ! vert. coord. of the up. lim. of the 1st ice layer 
    189187 
    190       DO layer = 1, nlay_s            ! vert. coord of the up. lim. of the layer-th snow layer 
    191          DO ji = kideb , kiut 
    192             z_s(ji,layer) = z_s(ji,layer-1) + ht_s_b(ji) / REAL( nlay_s ) 
    193          END DO 
    194       END DO 
    195  
    196       DO layer = 1, nlay_i            ! vert. coord of the up. lim. of the layer-th ice layer 
    197          DO ji = kideb , kiut 
    198             z_i(ji,layer) = z_i(ji,layer-1) + ht_i_b(ji) / REAL( nlay_i ) 
     188      DO jk = 1, nlay_s            ! vert. coord of the up. lim. of the layer-th snow layer 
     189         DO ji = kideb , kiut 
     190            z_s(ji,jk) = z_s(ji,jk-1) + ht_s_1d(ji) / REAL( nlay_s ) 
     191         END DO 
     192      END DO 
     193 
     194      DO jk = 1, nlay_i            ! vert. coord of the up. lim. of the layer-th ice layer 
     195         DO ji = kideb , kiut 
     196            z_i(ji,jk) = z_i(ji,jk-1) + ht_i_1d(ji) / REAL( nlay_i ) 
    199197         END DO 
    200198      END DO 
     
    217215      DO ji = kideb , kiut 
    218216         ! switches 
    219          isnow(ji) = NINT(  1._wp - MAX( 0._wp , SIGN( 1._wp , - ht_s_b(ji) ) )  )  
     217         isnow(ji) = NINT(  1._wp - MAX( 0._wp , SIGN( 1._wp , - ht_s_1d(ji) ) )  )  
    220218         ! hs > 0, isnow = 1 
    221219         zhsu (ji) = hnzst  ! threshold for the computation of i0 
    222          zihic(ji) = MAX( 0._wp , 1._wp - ( ht_i_b(ji) / zhsu(ji) ) )      
     220         zihic(ji) = MAX( 0._wp , 1._wp - ( ht_i_1d(ji) / zhsu(ji) ) )      
    223221 
    224222         i0(ji)    = REAL( 1 - isnow(ji) ) * ( fr1_i0_1d(ji) + zihic(ji) * fr2_i0_1d(ji) ) 
     
    227225         !            a function of the cloud cover 
    228226         ! 
    229          !i0(ji)     =  (1.0-FLOAT(isnow(ji)))*3.0/(100*ht_s_b(ji)+10.0) 
     227         !i0(ji)     =  (1.0-FLOAT(isnow(ji)))*3.0/(100*ht_s_1d(ji)+10.0) 
    230228         !formula used in Cice 
    231229      END DO 
     
    249247      END DO 
    250248 
    251       DO layer = 1, nlay_s          ! Radiation through snow 
     249      DO jk = 1, nlay_s          ! Radiation through snow 
    252250         DO ji = kideb, kiut 
    253251            !                             ! radiation transmitted below the layer-th snow layer 
    254             zradtr_s(ji,layer) = zradtr_s(ji,0) * EXP( - zraext_s * ( MAX ( 0._wp , z_s(ji,layer) ) ) ) 
     252            zradtr_s(ji,jk) = zradtr_s(ji,0) * EXP( - zraext_s * ( MAX ( 0._wp , z_s(ji,jk) ) ) ) 
    255253            !                             ! radiation absorbed by the layer-th snow layer 
    256             zradab_s(ji,layer) = zradtr_s(ji,layer-1) - zradtr_s(ji,layer) 
     254            zradab_s(ji,jk) = zradtr_s(ji,jk-1) - zradtr_s(ji,jk) 
    257255         END DO 
    258256      END DO 
     
    262260      END DO 
    263261 
    264       DO layer = 1, nlay_i          ! Radiation through ice 
     262      DO jk = 1, nlay_i          ! Radiation through ice 
    265263         DO ji = kideb, kiut 
    266264            !                             ! radiation transmitted below the layer-th ice layer 
    267             zradtr_i(ji,layer) = zradtr_i(ji,0) * EXP( - kappa_i * ( MAX ( 0._wp , z_i(ji,layer) ) ) ) 
     265            zradtr_i(ji,jk) = zradtr_i(ji,0) * EXP( - kappa_i * ( MAX ( 0._wp , z_i(ji,jk) ) ) ) 
    268266            !                             ! radiation absorbed by the layer-th ice layer 
    269             zradab_i(ji,layer) = zradtr_i(ji,layer-1) - zradtr_i(ji,layer) 
     267            zradab_i(ji,jk) = zradtr_i(ji,jk-1) - zradtr_i(ji,jk) 
    270268         END DO 
    271269      END DO 
    272270 
    273271      DO ji = kideb, kiut           ! Radiation transmitted below the ice 
    274          !!!ftr_ice_1d(ji) = ftr_ice_1d(ji) + iatte_1d(ji) * zradtr_i(ji,nlay_i) * a_i_b(ji) / at_i_b(ji) ! clem modif 
    275272         ftr_ice_1d(ji) = zradtr_i(ji,nlay_i)  
    276273      END DO 
     
    282279      ! 
    283280      DO ji = kideb, kiut        ! Old surface temperature 
    284          ztsuold  (ji) =  t_su_b(ji)                              ! temperature at the beg of iter pr. 
    285          ztsuoldit(ji) =  t_su_b(ji)                              ! temperature at the previous iter 
    286          t_su_b   (ji) =  MIN( t_su_b(ji), ztfs(ji) - ztsu_err )  ! necessary 
     281         ztsub  (ji) =  t_su_1d(ji)                              ! temperature at the beg of iter pr. 
     282         ztsubit(ji) =  t_su_1d(ji)                              ! temperature at the previous iter 
     283         t_su_1d   (ji) =  MIN( t_su_1d(ji), ztfs(ji) - ztsu_err )  ! necessary 
    287284         zerrit   (ji) =  1000._wp                                ! initial value of error 
    288285      END DO 
    289286 
    290       DO layer = 1, nlay_s       ! Old snow temperature 
    291          DO ji = kideb , kiut 
    292             ztsold(ji,layer) =  t_s_b(ji,layer) 
    293          END DO 
    294       END DO 
    295  
    296       DO layer = 1, nlay_i       ! Old ice temperature 
    297          DO ji = kideb , kiut 
    298             ztiold(ji,layer) =  t_i_b(ji,layer) 
     287      DO jk = 1, nlay_s       ! Old snow temperature 
     288         DO ji = kideb , kiut 
     289            ztsb(ji,jk) =  t_s_1d(ji,jk) 
     290         END DO 
     291      END DO 
     292 
     293      DO jk = 1, nlay_i       ! Old ice temperature 
     294         DO ji = kideb , kiut 
     295            ztib(ji,jk) =  t_i_1d(ji,jk) 
    299296         END DO 
    300297      END DO 
     
    313310         IF( thcon_i_swi == 0 ) THEN      ! Untersteiner (1964) formula 
    314311            DO ji = kideb , kiut 
    315                ztcond_i(ji,0)        = rcdic + zbeta*s_i_b(ji,1) / MIN(-epsi10,t_i_b(ji,1)-rtt) 
     312               ztcond_i(ji,0)        = rcdic + zbeta*s_i_1d(ji,1) / MIN(-epsi10,t_i_1d(ji,1)-rtt) 
    316313               ztcond_i(ji,0)        = MAX(ztcond_i(ji,0),zkimin) 
    317314            END DO 
    318             DO layer = 1, nlay_i-1 
     315            DO jk = 1, nlay_i-1 
    319316               DO ji = kideb , kiut 
    320                   ztcond_i(ji,layer) = rcdic + zbeta*( s_i_b(ji,layer) + s_i_b(ji,layer+1) ) /  & 
    321                      MIN(-2.0_wp * epsi10, t_i_b(ji,layer)+t_i_b(ji,layer+1) - 2.0_wp * rtt) 
    322                   ztcond_i(ji,layer) = MAX(ztcond_i(ji,layer),zkimin) 
     317                  ztcond_i(ji,jk) = rcdic + zbeta*( s_i_1d(ji,jk) + s_i_1d(ji,jk+1) ) /  & 
     318                     MIN(-2.0_wp * epsi10, t_i_1d(ji,jk)+t_i_1d(ji,jk+1) - 2.0_wp * rtt) 
     319                  ztcond_i(ji,jk) = MAX(ztcond_i(ji,jk),zkimin) 
    323320               END DO 
    324321            END DO 
     
    327324         IF( thcon_i_swi == 1 ) THEN      ! Pringle et al formula included: 2.11 + 0.09 S/T - 0.011.T 
    328325            DO ji = kideb , kiut 
    329                ztcond_i(ji,0) = rcdic + 0.090_wp * s_i_b(ji,1) / MIN( -epsi10, t_i_b(ji,1)-rtt )   & 
    330                   &                   - 0.011_wp * ( t_i_b(ji,1) - rtt )   
     326               ztcond_i(ji,0) = rcdic + 0.090_wp * s_i_1d(ji,1) / MIN( -epsi10, t_i_1d(ji,1)-rtt )   & 
     327                  &                   - 0.011_wp * ( t_i_1d(ji,1) - rtt )   
    331328               ztcond_i(ji,0) = MAX( ztcond_i(ji,0), zkimin ) 
    332329            END DO 
    333             DO layer = 1, nlay_i-1 
     330            DO jk = 1, nlay_i-1 
    334331               DO ji = kideb , kiut 
    335                   ztcond_i(ji,layer) = rcdic + 0.090_wp * ( s_i_b(ji,layer) + s_i_b(ji,layer+1) )   & 
    336                      &                                  / MIN(-2.0_wp * epsi10, t_i_b(ji,layer)+t_i_b(ji,layer+1) - 2.0_wp * rtt)   & 
    337                      &                       - 0.0055_wp* ( t_i_b(ji,layer) + t_i_b(ji,layer+1) - 2.0*rtt )   
    338                   ztcond_i(ji,layer) = MAX( ztcond_i(ji,layer), zkimin ) 
     332                  ztcond_i(ji,jk) = rcdic +                                                                     &  
     333                     &                 0.090_wp * ( s_i_1d(ji,jk) + s_i_1d(ji,jk+1) )                          & 
     334                     &                 / MIN(-2.0_wp * epsi10, t_i_1d(ji,jk)+t_i_1d(ji,jk+1) - 2.0_wp * rtt)   & 
     335                     &               - 0.0055_wp* ( t_i_1d(ji,jk) + t_i_1d(ji,jk+1) - 2.0*rtt )   
     336                  ztcond_i(ji,jk) = MAX( ztcond_i(ji,jk), zkimin ) 
    339337               END DO 
    340338            END DO 
    341339            DO ji = kideb , kiut 
    342                ztcond_i(ji,nlay_i) = rcdic + 0.090_wp * s_i_b(ji,nlay_i) / MIN(-epsi10,t_bo_b(ji)-rtt)   & 
    343                   &                        - 0.011_wp * ( t_bo_b(ji) - rtt )   
     340               ztcond_i(ji,nlay_i) = rcdic + 0.090_wp * s_i_1d(ji,nlay_i) / MIN(-epsi10,t_bo_1d(ji)-rtt)   & 
     341                  &                        - 0.011_wp * ( t_bo_1d(ji) - rtt )   
    344342               ztcond_i(ji,nlay_i) = MAX( ztcond_i(ji,nlay_i), zkimin ) 
    345343            END DO 
     
    357355         END DO 
    358356 
    359          DO layer = 1, nlay_s-1 
    360             DO ji = kideb , kiut 
    361                zkappa_s(ji,layer)  = 2.0 * rcdsn / & 
     357         DO jk = 1, nlay_s-1 
     358            DO ji = kideb , kiut 
     359               zkappa_s(ji,jk)  = 2.0 * rcdsn / & 
    362360                  MAX(epsi10,2.0*zh_s(ji)) 
    363361            END DO 
    364362         END DO 
    365363 
    366          DO layer = 1, nlay_i-1 
     364         DO jk = 1, nlay_i-1 
    367365            DO ji = kideb , kiut 
    368366               !-- Ice kappa factors 
    369                zkappa_i(ji,layer)  = 2.0*ztcond_i(ji,layer)/ & 
     367               zkappa_i(ji,jk)  = 2.0*ztcond_i(ji,jk)/ & 
    370368                  MAX(epsi10,2.0*zh_i(ji))  
    371369            END DO 
     
    386384         !------------------------------------------------------------------------------| 
    387385         ! 
    388          DO layer = 1, nlay_i 
    389             DO ji = kideb , kiut 
    390                ztitemp(ji,layer)   = t_i_b(ji,layer) 
    391                zspeche_i(ji,layer) = cpic + zgamma*s_i_b(ji,layer)/ & 
    392                   MAX((t_i_b(ji,layer)-rtt)*(ztiold(ji,layer)-rtt),epsi10) 
    393                zeta_i(ji,layer)    = rdt_ice / MAX(rhoic*zspeche_i(ji,layer)*zh_i(ji), & 
     386         DO jk = 1, nlay_i 
     387            DO ji = kideb , kiut 
     388               ztitemp(ji,jk)   = t_i_1d(ji,jk) 
     389               zspeche_i(ji,jk) = cpic + zgamma*s_i_1d(ji,jk)/ & 
     390                  MAX((t_i_1d(ji,jk)-rtt)*(ztib(ji,jk)-rtt),epsi10) 
     391               zeta_i(ji,jk)    = rdt_ice / MAX(rhoic*zspeche_i(ji,jk)*zh_i(ji), & 
    394392                  epsi10) 
    395393            END DO 
    396394         END DO 
    397395 
    398          DO layer = 1, nlay_s 
    399             DO ji = kideb , kiut 
    400                ztstemp(ji,layer) = t_s_b(ji,layer) 
    401                zeta_s(ji,layer)  = rdt_ice / MAX(rhosn*cpic*zh_s(ji),epsi10) 
     396         DO jk = 1, nlay_s 
     397            DO ji = kideb , kiut 
     398               ztstemp(ji,jk) = t_s_1d(ji,jk) 
     399               zeta_s(ji,jk)  = rdt_ice / MAX(rhosn*cpic*zh_s(ji),epsi10) 
    402400            END DO 
    403401         END DO 
     
    407405         !------------------------------------------------------------------------------| 
    408406         ! 
    409          DO ji = kideb , kiut 
    410             ! update of the non solar flux according to the update in T_su 
    411             qns_ice_1d(ji) = qns_ice_1d(ji) + dqns_ice_1d(ji) * ( t_su_b(ji) - ztsuoldit(ji) ) 
    412  
     407         IF( .NOT. lk_cpl ) THEN   !--- forced atmosphere case 
     408            DO ji = kideb , kiut 
     409               ! update of the non solar flux according to the update in T_su 
     410               qns_ice_1d(ji) = qns_ice_1d(ji) + dqns_ice_1d(ji) * ( t_su_1d(ji) - ztsubit(ji) ) 
     411            END DO 
     412         ENDIF 
     413 
     414         ! Update incoming flux 
     415         DO ji = kideb , kiut 
    413416            ! update incoming flux 
    414417            zf(ji)    =   zfsw(ji)              & ! net absorbed solar radiation 
    415                + qns_ice_1d(ji)                  ! non solar total flux  
     418               + qns_ice_1d(ji)                   ! non solar total flux  
    416419            ! (LWup, LWdw, SH, LH) 
    417420         END DO 
     
    429432         !!ice interior terms (top equation has the same form as the others) 
    430433 
    431          DO numeq=1,jkmax+2 
     434         DO numeq=1,nlay_i+3 
    432435            DO ji = kideb , kiut 
    433436               ztrid(ji,numeq,1) = 0. 
    434437               ztrid(ji,numeq,2) = 0. 
    435438               ztrid(ji,numeq,3) = 0. 
    436                zindterm(ji,numeq)= 0. 
    437                zindtbis(ji,numeq)= 0. 
     439               zswiterm(ji,numeq)= 0. 
     440               zswitbis(ji,numeq)= 0. 
    438441               zdiagbis(ji,numeq)= 0. 
    439442            ENDDO 
     
    442445         DO numeq = nlay_s + 2, nlay_s + nlay_i  
    443446            DO ji = kideb , kiut 
    444                layer              = numeq - nlay_s - 1 
    445                ztrid(ji,numeq,1)  =  - zeta_i(ji,layer)*zkappa_i(ji,layer-1) 
    446                ztrid(ji,numeq,2)  =  1.0 + zeta_i(ji,layer)*(zkappa_i(ji,layer-1) + & 
    447                   zkappa_i(ji,layer)) 
    448                ztrid(ji,numeq,3)  =  - zeta_i(ji,layer)*zkappa_i(ji,layer) 
    449                zindterm(ji,numeq) =  ztiold(ji,layer) + zeta_i(ji,layer)* & 
    450                   zradab_i(ji,layer) 
     447               jk              = numeq - nlay_s - 1 
     448               ztrid(ji,numeq,1)  =  - zeta_i(ji,jk)*zkappa_i(ji,jk-1) 
     449               ztrid(ji,numeq,2)  =  1.0 + zeta_i(ji,jk)*(zkappa_i(ji,jk-1) + & 
     450                  zkappa_i(ji,jk)) 
     451               ztrid(ji,numeq,3)  =  - zeta_i(ji,jk)*zkappa_i(ji,jk) 
     452               zswiterm(ji,numeq) =  ztib(ji,jk) + zeta_i(ji,jk)* & 
     453                  zradab_i(ji,jk) 
    451454            END DO 
    452455         ENDDO 
     
    459462               +  zkappa_i(ji,nlay_i-1) ) 
    460463            ztrid(ji,numeq,3)  =  0.0 
    461             zindterm(ji,numeq) =  ztiold(ji,nlay_i) + zeta_i(ji,nlay_i)* & 
     464            zswiterm(ji,numeq) =  ztib(ji,nlay_i) + zeta_i(ji,nlay_i)* & 
    462465               ( zradab_i(ji,nlay_i) + zkappa_i(ji,nlay_i)*zg1 & 
    463                *  t_bo_b(ji) )  
     466               *  t_bo_1d(ji) )  
    464467         ENDDO 
    465468 
    466469 
    467470         DO ji = kideb , kiut 
    468             IF ( ht_s_b(ji).gt.0.0 ) THEN 
     471            IF ( ht_s_1d(ji).gt.0.0 ) THEN 
    469472               ! 
    470473               !------------------------------------------------------------------------------| 
     
    474477               !!snow interior terms (bottom equation has the same form as the others) 
    475478               DO numeq = 3, nlay_s + 1 
    476                   layer =  numeq - 1 
    477                   ztrid(ji,numeq,1)   =  - zeta_s(ji,layer)*zkappa_s(ji,layer-1) 
    478                   ztrid(ji,numeq,2)   =  1.0 + zeta_s(ji,layer)*( zkappa_s(ji,layer-1) + & 
    479                      zkappa_s(ji,layer) ) 
    480                   ztrid(ji,numeq,3)   =  - zeta_s(ji,layer)*zkappa_s(ji,layer) 
    481                   zindterm(ji,numeq)  =  ztsold(ji,layer) + zeta_s(ji,layer)* & 
    482                      zradab_s(ji,layer) 
     479                  jk =  numeq - 1 
     480                  ztrid(ji,numeq,1)   =  - zeta_s(ji,jk)*zkappa_s(ji,jk-1) 
     481                  ztrid(ji,numeq,2)   =  1.0 + zeta_s(ji,jk)*( zkappa_s(ji,jk-1) + & 
     482                     zkappa_s(ji,jk) ) 
     483                  ztrid(ji,numeq,3)   =  - zeta_s(ji,jk)*zkappa_s(ji,jk) 
     484                  zswiterm(ji,numeq)  =  ztsb(ji,jk) + zeta_s(ji,jk)* & 
     485                     zradab_s(ji,jk) 
    483486               END DO 
    484487 
     
    486489               IF ( nlay_i.eq.1 ) THEN 
    487490                  ztrid(ji,nlay_s+2,3)    =  0.0 
    488                   zindterm(ji,nlay_s+2)   =  zindterm(ji,nlay_s+2) + zkappa_i(ji,1)* & 
    489                      t_bo_b(ji)  
     491                  zswiterm(ji,nlay_s+2)   =  zswiterm(ji,nlay_s+2) + zkappa_i(ji,1)* & 
     492                     t_bo_1d(ji)  
    490493               ENDIF 
    491494 
    492                IF ( t_su_b(ji) .LT. rtt ) THEN 
     495               IF ( t_su_1d(ji) .LT. rtt ) THEN 
    493496 
    494497                  !------------------------------------------------------------------------------| 
     
    503506                  ztrid(ji,1,2) = dzf(ji) - zg1s*zkappa_s(ji,0) 
    504507                  ztrid(ji,1,3) = zg1s*zkappa_s(ji,0) 
    505                   zindterm(ji,1) = dzf(ji)*t_su_b(ji)   - zf(ji) 
     508                  zswiterm(ji,1) = dzf(ji)*t_su_1d(ji)   - zf(ji) 
    506509 
    507510                  !!first layer of snow equation 
     
    509512                  ztrid(ji,2,2)  =  1.0 + zeta_s(ji,1)*(zkappa_s(ji,1) + zkappa_s(ji,0)*zg1s) 
    510513                  ztrid(ji,2,3)  =  - zeta_s(ji,1)* zkappa_s(ji,1) 
    511                   zindterm(ji,2) =  ztsold(ji,1) + zeta_s(ji,1)*zradab_s(ji,1) 
     514                  zswiterm(ji,2) =  ztsb(ji,1) + zeta_s(ji,1)*zradab_s(ji,1) 
    512515 
    513516               ELSE  
     
    526529                     zkappa_s(ji,0) * zg1s ) 
    527530                  ztrid(ji,2,3)  =  - zeta_s(ji,1)*zkappa_s(ji,1)  
    528                   zindterm(ji,2) = ztsold(ji,1) + zeta_s(ji,1) *            & 
     531                  zswiterm(ji,2) = ztsb(ji,1) + zeta_s(ji,1) *            & 
    529532                     ( zradab_s(ji,1) +                         & 
    530                      zkappa_s(ji,0) * zg1s * t_su_b(ji) )  
     533                     zkappa_s(ji,0) * zg1s * t_su_1d(ji) )  
    531534               ENDIF 
    532535            ELSE 
     
    536539               !------------------------------------------------------------------------------| 
    537540               ! 
    538                IF (t_su_b(ji) .LT. rtt) THEN 
     541               IF (t_su_1d(ji) .LT. rtt) THEN 
    539542                  ! 
    540543                  !------------------------------------------------------------------------------| 
     
    550553                  ztrid(ji,numeqmin(ji),2)   =  dzf(ji) - zkappa_i(ji,0)*zg1     
    551554                  ztrid(ji,numeqmin(ji),3)   =  zkappa_i(ji,0)*zg1 
    552                   zindterm(ji,numeqmin(ji))  =  dzf(ji)*t_su_b(ji) - zf(ji) 
     555                  zswiterm(ji,numeqmin(ji))  =  dzf(ji)*t_su_1d(ji) - zf(ji) 
    553556 
    554557                  !!first layer of ice equation 
     
    557560                     + zkappa_i(ji,0) * zg1 ) 
    558561                  ztrid(ji,numeqmin(ji)+1,3) =  - zeta_i(ji,1)*zkappa_i(ji,1)   
    559                   zindterm(ji,numeqmin(ji)+1)=  ztiold(ji,1) + zeta_i(ji,1)*zradab_i(ji,1)   
     562                  zswiterm(ji,numeqmin(ji)+1)=  ztib(ji,1) + zeta_i(ji,1)*zradab_i(ji,1)   
    560563 
    561564                  !!case of only one layer in the ice (surface & ice equations are altered) 
     
    570573                     ztrid(ji,numeqmin(ji)+1,3)  =  0.0 
    571574 
    572                      zindterm(ji,numeqmin(ji)+1) =  ztiold(ji,1) + zeta_i(ji,1)* & 
    573                         ( zradab_i(ji,1) + zkappa_i(ji,1)*t_bo_b(ji) ) 
     575                     zswiterm(ji,numeqmin(ji)+1) =  ztib(ji,1) + zeta_i(ji,1)* & 
     576                        ( zradab_i(ji,1) + zkappa_i(ji,1)*t_bo_1d(ji) ) 
    574577                  ENDIF 
    575578 
     
    590593                     zg1)   
    591594                  ztrid(ji,numeqmin(ji),3)      =  - zeta_i(ji,1) * zkappa_i(ji,1) 
    592                   zindterm(ji,numeqmin(ji))     =  ztiold(ji,1) + zeta_i(ji,1)*( zradab_i(ji,1) + & 
    593                      zkappa_i(ji,0) * zg1 * t_su_b(ji) )  
     595                  zswiterm(ji,numeqmin(ji))     =  ztib(ji,1) + zeta_i(ji,1)*( zradab_i(ji,1) + & 
     596                     zkappa_i(ji,0) * zg1 * t_su_1d(ji) )  
    594597 
    595598                  !!case of only one layer in the ice (surface & ice equations are altered) 
     
    599602                        zkappa_i(ji,1)) 
    600603                     ztrid(ji,numeqmin(ji),3)  =  0.0 
    601                      zindterm(ji,numeqmin(ji)) =  ztiold(ji,1) + zeta_i(ji,1)* & 
    602                         (zradab_i(ji,1) + zkappa_i(ji,1)*t_bo_b(ji)) & 
    603                         + t_su_b(ji)*zeta_i(ji,1)*zkappa_i(ji,0)*2.0 
     604                     zswiterm(ji,numeqmin(ji)) =  ztib(ji,1) + zeta_i(ji,1)* & 
     605                        (zradab_i(ji,1) + zkappa_i(ji,1)*t_bo_1d(ji)) & 
     606                        + t_su_1d(ji)*zeta_i(ji,1)*zkappa_i(ji,0)*2.0 
    604607                  ENDIF 
    605608 
     
    620623 
    621624         maxnumeqmax = 0 
    622          minnumeqmin = jkmax+4 
    623  
    624          DO ji = kideb , kiut 
    625             zindtbis(ji,numeqmin(ji)) =  zindterm(ji,numeqmin(ji)) 
     625         minnumeqmin = nlay_i+5 
     626 
     627         DO ji = kideb , kiut 
     628            zswitbis(ji,numeqmin(ji)) =  zswiterm(ji,numeqmin(ji)) 
    626629            zdiagbis(ji,numeqmin(ji)) =  ztrid(ji,numeqmin(ji),2) 
    627630            minnumeqmin               =  MIN(numeqmin(ji),minnumeqmin) 
     
    629632         END DO 
    630633 
    631          DO layer = minnumeqmin+1, maxnumeqmax 
    632             DO ji = kideb , kiut 
    633                numeq               =  min(max(numeqmin(ji)+1,layer),numeqmax(ji)) 
     634         DO jk = minnumeqmin+1, maxnumeqmax 
     635            DO ji = kideb , kiut 
     636               numeq               =  min(max(numeqmin(ji)+1,jk),numeqmax(ji)) 
    634637               zdiagbis(ji,numeq)  =  ztrid(ji,numeq,2) - ztrid(ji,numeq,1)* & 
    635638                  ztrid(ji,numeq-1,3)/zdiagbis(ji,numeq-1) 
    636                zindtbis(ji,numeq)  =  zindterm(ji,numeq) - ztrid(ji,numeq,1)* & 
    637                   zindtbis(ji,numeq-1)/zdiagbis(ji,numeq-1) 
     639               zswitbis(ji,numeq)  =  zswiterm(ji,numeq) - ztrid(ji,numeq,1)* & 
     640                  zswitbis(ji,numeq-1)/zdiagbis(ji,numeq-1) 
    638641            END DO 
    639642         END DO 
     
    641644         DO ji = kideb , kiut 
    642645            ! ice temperatures 
    643             t_i_b(ji,nlay_i)    =  zindtbis(ji,numeqmax(ji))/zdiagbis(ji,numeqmax(ji)) 
     646            t_i_1d(ji,nlay_i)    =  zswitbis(ji,numeqmax(ji))/zdiagbis(ji,numeqmax(ji)) 
    644647         END DO 
    645648 
    646649         DO numeq = nlay_i + nlay_s + 1, nlay_s + 2, -1 
    647650            DO ji = kideb , kiut 
    648                layer    =  numeq - nlay_s - 1 
    649                t_i_b(ji,layer)  =  (zindtbis(ji,numeq) - ztrid(ji,numeq,3)* & 
    650                   t_i_b(ji,layer+1))/zdiagbis(ji,numeq) 
     651               jk    =  numeq - nlay_s - 1 
     652               t_i_1d(ji,jk)  =  (zswitbis(ji,numeq) - ztrid(ji,numeq,3)* & 
     653                  t_i_1d(ji,jk+1))/zdiagbis(ji,numeq) 
    651654            END DO 
    652655         END DO 
     
    654657         DO ji = kideb , kiut 
    655658            ! snow temperatures       
    656             IF (ht_s_b(ji).GT.0._wp) & 
    657                t_s_b(ji,nlay_s)     =  (zindtbis(ji,nlay_s+1) - ztrid(ji,nlay_s+1,3) & 
    658                *  t_i_b(ji,1))/zdiagbis(ji,nlay_s+1) & 
    659                *        MAX(0.0,SIGN(1.0,ht_s_b(ji)))  
     659            IF (ht_s_1d(ji).GT.0._wp) & 
     660               t_s_1d(ji,nlay_s)     =  (zswitbis(ji,nlay_s+1) - ztrid(ji,nlay_s+1,3) & 
     661               *  t_i_1d(ji,1))/zdiagbis(ji,nlay_s+1) & 
     662               *        MAX(0.0,SIGN(1.0,ht_s_1d(ji)))  
    660663 
    661664            ! surface temperature 
    662             isnow(ji)     = NINT(  1.0 - MAX( 0.0 , SIGN( 1.0 , -ht_s_b(ji) )  )  ) 
    663             ztsuoldit(ji) = t_su_b(ji) 
    664             IF( t_su_b(ji) < ztfs(ji) ) & 
    665                t_su_b(ji) = ( zindtbis(ji,numeqmin(ji)) - ztrid(ji,numeqmin(ji),3)* ( REAL( isnow(ji) )*t_s_b(ji,1)   & 
    666                &          + REAL( 1 - isnow(ji) )*t_i_b(ji,1) ) ) / zdiagbis(ji,numeqmin(ji))   
     665            isnow(ji)     = NINT(  1.0 - MAX( 0.0 , SIGN( 1.0 , -ht_s_1d(ji) )  )  ) 
     666            ztsubit(ji) = t_su_1d(ji) 
     667            IF( t_su_1d(ji) < ztfs(ji) ) & 
     668               t_su_1d(ji) = ( zswitbis(ji,numeqmin(ji)) - ztrid(ji,numeqmin(ji),3)* ( REAL( isnow(ji) )*t_s_1d(ji,1)   & 
     669               &          + REAL( 1 - isnow(ji) )*t_i_1d(ji,1) ) ) / zdiagbis(ji,numeqmin(ji))   
    667670         END DO 
    668671         ! 
     
    674677         ! zerrit(ji) is a measure of error, it has to be under maxer_i_thd 
    675678         DO ji = kideb , kiut 
    676             t_su_b(ji) =  MAX(  MIN( t_su_b(ji) , ztfs(ji) ) , 190._wp  ) 
    677             zerrit(ji) =  ABS( t_su_b(ji) - ztsuoldit(ji) )      
    678          END DO 
    679  
    680          DO layer  =  1, nlay_s 
    681             DO ji = kideb , kiut 
    682                t_s_b(ji,layer) = MAX(  MIN( t_s_b(ji,layer), rtt ), 190._wp  ) 
    683                zerrit(ji)      = MAX(zerrit(ji),ABS(t_s_b(ji,layer) - ztstemp(ji,layer))) 
    684             END DO 
    685          END DO 
    686  
    687          DO layer  =  1, nlay_i 
    688             DO ji = kideb , kiut 
    689                ztmelt_i        = -tmut * s_i_b(ji,layer) + rtt  
    690                t_i_b(ji,layer) =  MAX(MIN(t_i_b(ji,layer),ztmelt_i), 190._wp) 
    691                zerrit(ji)      =  MAX(zerrit(ji),ABS(t_i_b(ji,layer) - ztitemp(ji,layer))) 
     679            t_su_1d(ji) =  MAX(  MIN( t_su_1d(ji) , ztfs(ji) ) , 190._wp  ) 
     680            zerrit(ji) =  ABS( t_su_1d(ji) - ztsubit(ji) )      
     681         END DO 
     682 
     683         DO jk  =  1, nlay_s 
     684            DO ji = kideb , kiut 
     685               t_s_1d(ji,jk) = MAX(  MIN( t_s_1d(ji,jk), rtt ), 190._wp  ) 
     686               zerrit(ji)      = MAX(zerrit(ji),ABS(t_s_1d(ji,jk) - ztstemp(ji,jk))) 
     687            END DO 
     688         END DO 
     689 
     690         DO jk  =  1, nlay_i 
     691            DO ji = kideb , kiut 
     692               ztmelt_i        = -tmut * s_i_1d(ji,jk) + rtt  
     693               t_i_1d(ji,jk) =  MAX(MIN(t_i_1d(ji,jk),ztmelt_i), 190._wp) 
     694               zerrit(ji)      =  MAX(zerrit(ji),ABS(t_i_1d(ji,jk) - ztitemp(ji,jk))) 
    692695            END DO 
    693696         END DO 
     
    714717      DO ji = kideb, kiut 
    715718         ! forced mode only : update of latent heat fluxes (sublimation) (always >=0, upward flux)  
    716          IF( .NOT. lk_cpl) qla_ice_1d (ji) = MAX( 0._wp, qla_ice_1d (ji) + dqla_ice_1d(ji) * ( t_su_b(ji) - ztsuold(ji) ) ) 
     719         IF( .NOT. lk_cpl) qla_ice_1d (ji) = MAX( 0._wp, qla_ice_1d (ji) + dqla_ice_1d(ji) * ( t_su_1d(ji) - ztsub(ji) ) ) 
    717720         !                                ! surface ice conduction flux 
    718          isnow(ji)       = NINT(  1._wp - MAX( 0._wp, SIGN( 1._wp, -ht_s_b(ji) ) )  ) 
    719          fc_su(ji)       =  -     REAL( isnow(ji) ) * zkappa_s(ji,0) * zg1s * (t_s_b(ji,1) - t_su_b(ji))   & 
    720             &               - REAL( 1 - isnow(ji) ) * zkappa_i(ji,0) * zg1  * (t_i_b(ji,1) - t_su_b(ji)) 
     721         isnow(ji)       = NINT(  1._wp - MAX( 0._wp, SIGN( 1._wp, -ht_s_1d(ji) ) )  ) 
     722         fc_su(ji)       =  -     REAL( isnow(ji) ) * zkappa_s(ji,0) * zg1s * (t_s_1d(ji,1) - t_su_1d(ji))   & 
     723            &               - REAL( 1 - isnow(ji) ) * zkappa_i(ji,0) * zg1  * (t_i_1d(ji,1) - t_su_1d(ji)) 
    721724         !                                ! bottom ice conduction flux 
    722          fc_bo_i(ji)     =  - zkappa_i(ji,nlay_i) * ( zg1*(t_bo_b(ji) - t_i_b(ji,nlay_i)) ) 
     725         fc_bo_i(ji)     =  - zkappa_i(ji,nlay_i) * ( zg1*(t_bo_1d(ji) - t_i_1d(ji,nlay_i)) ) 
    723726      END DO 
    724727 
     
    727730      !----------------------------------------- 
    728731      DO ji = kideb, kiut 
    729          IF( t_su_b(ji) < rtt ) THEN  ! case T_su < 0degC 
    730             hfx_dif_1d(ji) = hfx_dif_1d(ji) + ( qns_ice_1d(ji) + qsr_ice_1d(ji) - zradtr_i(ji,nlay_i) - fc_bo_i(ji) ) * a_i_b(ji) 
     732         IF( t_su_1d(ji) < rtt ) THEN  ! case T_su < 0degC 
     733            hfx_dif_1d(ji) = hfx_dif_1d(ji)  +   & 
     734               &            ( qns_ice_1d(ji) + qsr_ice_1d(ji) - zradtr_i(ji,nlay_i) - fc_bo_i(ji) ) * a_i_1d(ji) 
    731735         ELSE                         ! case T_su = 0degC 
    732             hfx_dif_1d(ji) = hfx_dif_1d(ji) + ( fc_su(ji) + i0(ji) * qsr_ice_1d(ji) - zradtr_i(ji,nlay_i) - fc_bo_i(ji) ) * a_i_b(ji) 
     736            hfx_dif_1d(ji) = hfx_dif_1d(ji) +    & 
     737               &             ( fc_su(ji) + i0(ji) * qsr_ice_1d(ji) - zradtr_i(ji,nlay_i) - fc_bo_i(ji) ) * a_i_1d(ji) 
    733738         ENDIF 
    734739      END DO 
     
    737742      CALL lim_thd_enmelt( kideb, kiut ) 
    738743 
    739       ! --- diag error on heat diffusion - PART 2 --- ! 
     744      ! --- diag conservation imbalance on heat diffusion - PART 2 --- ! 
    740745      DO ji = kideb, kiut 
    741          zdq(ji)        = - zq_ini(ji) + ( SUM( q_i_b(ji,1:nlay_i) ) * ht_i_b(ji) / REAL( nlay_i ) +  & 
    742             &                              SUM( q_s_b(ji,1:nlay_s) ) * ht_s_b(ji) / REAL( nlay_s ) ) 
    743          zhfx_err    = ( fc_su(ji) + i0(ji) * qsr_ice_1d(ji) - zradtr_i(ji,nlay_i) - fc_bo_i(ji) + zdq(ji) * r1_rdtice )  
    744          hfx_err_1d(ji) = hfx_err_1d(ji) + zhfx_err * a_i_b(ji) 
    745          ! --- correction of qns_ice and surface conduction flux --- ! 
    746          qns_ice_1d(ji) = qns_ice_1d(ji) - zhfx_err  
    747          fc_su     (ji) = fc_su     (ji) - zhfx_err  
    748          ! --- Heat flux at the ice surface in W.m-2 --- ! 
     746         zdq(ji)        = - zq_ini(ji) + ( SUM( q_i_1d(ji,1:nlay_i) ) * ht_i_1d(ji) / REAL( nlay_i ) +  & 
     747            &                              SUM( q_s_1d(ji,1:nlay_s) ) * ht_s_1d(ji) / REAL( nlay_s ) ) 
     748         zhfx_err(ji)   = ( fc_su(ji) + i0(ji) * qsr_ice_1d(ji) - zradtr_i(ji,nlay_i) - fc_bo_i(ji) + zdq(ji) * r1_rdtice )  
     749         hfx_err_1d(ji) = hfx_err_1d(ji) + zhfx_err(ji) * a_i_1d(ji) 
     750      END DO  
     751 
     752      ! diagnose external surface (forced case) or bottom (forced case) from heat conservation 
     753      IF( .NOT. lk_cpl ) THEN   ! --- forced case: qns_ice and fc_su are diagnosed 
     754         ! 
     755         DO ji = kideb, kiut 
     756            qns_ice_1d(ji) = qns_ice_1d(ji) - zhfx_err(ji) 
     757            fc_su     (ji) = fc_su(ji)      - zhfx_err(ji) 
     758         END DO 
     759         ! 
     760      ELSE                      ! --- coupled case: ocean turbulent heat flux is diagnosed 
     761         ! 
     762         DO ji = kideb, kiut 
     763            fhtur_1d  (ji) = fhtur_1d(ji)   - zhfx_err(ji) 
     764         END DO 
     765         ! 
     766      ENDIF 
     767 
     768      ! --- compute diagnostic net heat flux at the surface of the snow-ice system (W.m2) 
     769      DO ji = kideb, kiut 
    749770         ii = MOD( npb(ji) - 1, jpi ) + 1 ; ij = ( npb(ji) - 1 ) / jpi + 1 
    750          hfx_in (ii,ij) = hfx_in (ii,ij) + a_i_b(ji) * ( qsr_ice_1d(ji) + qns_ice_1d(ji) ) 
     771         hfx_in (ii,ij) = hfx_in (ii,ij) + a_i_1d(ji) * ( qsr_ice_1d(ji) + qns_ice_1d(ji) ) 
    751772      END DO 
    752773    
    753774      ! 
    754775      CALL wrk_dealloc( jpij, numeqmin, numeqmax, isnow ) 
    755       CALL wrk_dealloc( jpij, ztfs, ztsuold, ztsuoldit, zh_i, zh_s, zfsw ) 
     776      CALL wrk_dealloc( jpij, ztfs, ztsub, ztsubit, zh_i, zh_s, zfsw ) 
    756777      CALL wrk_dealloc( jpij, zf, dzf, zerrit, zdifcase, zftrice, zihic, zhsu ) 
    757       CALL wrk_dealloc( jpij, nlay_i+1, ztcond_i, zradtr_i, zradab_i, zkappa_i, ztiold, zeta_i, ztitemp, z_i, zspeche_i, kjstart = 0 ) 
    758       CALL wrk_dealloc( jpij, nlay_s+1,           zradtr_s, zradab_s, zkappa_s, ztsold, zeta_s, ztstemp, z_s, kjstart = 0 ) 
    759       CALL wrk_dealloc( jpij, jkmax+2, zindterm, zindtbis, zdiagbis ) 
    760       CALL wrk_dealloc( jpij, jkmax+2, 3, ztrid ) 
    761       CALL wrk_dealloc( jpij, zdq, zq_ini ) 
     778      CALL wrk_dealloc( jpij, nlay_i+1, ztcond_i, zradtr_i, zradab_i, zkappa_i,   & 
     779         &              ztib, zeta_i, ztitemp, z_i, zspeche_i, kjstart = 0 ) 
     780      CALL wrk_dealloc( jpij, nlay_s+1,           zradtr_s, zradab_s, zkappa_s, ztsb, zeta_s, ztstemp, z_s, kjstart = 0 ) 
     781      CALL wrk_dealloc( jpij, nlay_i+3, zswiterm, zswitbis, zdiagbis ) 
     782      CALL wrk_dealloc( jpij, nlay_i+3, 3, ztrid ) 
     783      CALL wrk_dealloc( jpij, zdq, zq_ini, zhfx_err ) 
    762784 
    763785   END SUBROUTINE lim_thd_dif 
     
    774796      ! 
    775797      INTEGER  ::   ji, jk   ! dummy loop indices 
    776       REAL(wp) ::   ztmelts, zindb  ! local scalar  
     798      REAL(wp) ::   ztmelts  ! local scalar  
    777799      !!------------------------------------------------------------------- 
    778800      ! 
    779801      DO jk = 1, nlay_i             ! Sea ice energy of melting 
    780802         DO ji = kideb, kiut 
    781             ztmelts      = - tmut  * s_i_b(ji,jk) + rtt  
    782             zindb        = MAX( 0._wp , SIGN( 1._wp , -(t_i_b(ji,jk) - rtt) - epsi10 ) ) 
    783             q_i_b(ji,jk) = rhoic * ( cpic * ( ztmelts - t_i_b(ji,jk) )                                             & 
    784                &                   + lfus * ( 1.0 - zindb * ( ztmelts-rtt ) / MIN( t_i_b(ji,jk)-rtt, -epsi10 ) )   & 
     803            ztmelts      = - tmut  * s_i_1d(ji,jk) + rtt  
     804            rswitch      = MAX( 0._wp , SIGN( 1._wp , -(t_i_1d(ji,jk) - rtt) - epsi10 ) ) 
     805            q_i_1d(ji,jk) = rhoic * ( cpic * ( ztmelts - t_i_1d(ji,jk) )                                             & 
     806               &                   + lfus * ( 1.0 - rswitch * ( ztmelts-rtt ) / MIN( t_i_1d(ji,jk)-rtt, -epsi10 ) )   & 
    785807               &                   - rcp  *                 ( ztmelts-rtt )  )  
    786808         END DO 
     
    788810      DO jk = 1, nlay_s             ! Snow energy of melting 
    789811         DO ji = kideb, kiut 
    790             q_s_b(ji,jk) = rhosn * ( cpic * ( rtt - t_s_b(ji,jk) ) + lfus ) 
     812            q_s_1d(ji,jk) = rhosn * ( cpic * ( rtt - t_s_1d(ji,jk) ) + lfus ) 
    791813         END DO 
    792814      END DO 
  • branches/2014/dev_r4650_UKMO11_restart_functionality/NEMOGCM/NEMO/LIM_SRC_3/limthd_ent.F90

    r4688 r5208  
    3838   PUBLIC   lim_thd_ent         ! called by limthd and limthd_lac 
    3939 
    40    REAL(wp) :: epsi20 = 1.e-20   ! constant values 
    41    REAL(wp) :: epsi10 = 1.e-10   ! constant values 
    42  
    4340   !!---------------------------------------------------------------------- 
    4441   !! NEMO/LIM3 4.0 , UCL - NEMO Consortium (2011) 
     
    7976      INTEGER  :: ji         !  dummy loop indices 
    8077      INTEGER  :: jk0, jk1   !  old/new layer indices 
    81       REAL(wp) :: zswitch 
    8278      ! 
    8379      REAL(wp), POINTER, DIMENSION(:,:) :: zqh_cum0, zh_cum0   ! old cumulative enthlapies and layers interfaces 
     
    137133      DO jk1 = 1, nlay_i 
    138134         DO ji = kideb, kiut 
    139             zswitch      = 1._wp - MAX( 0._wp , SIGN( 1._wp , - zhnew(ji) + epsi10 ) )  
    140             qnew(ji,jk1) = zswitch * ( zqh_cum1(ji,jk1) - zqh_cum1(ji,jk1-1) ) / MAX( zhnew(ji), epsi10 ) 
     135            rswitch      = 1._wp - MAX( 0._wp , SIGN( 1._wp , - zhnew(ji) + epsi10 ) )  
     136            qnew(ji,jk1) = rswitch * ( zqh_cum1(ji,jk1) - zqh_cum1(ji,jk1-1) ) / MAX( zhnew(ji), epsi10 ) 
    141137         ENDDO 
    142138      ENDDO 
     
    146142      ! then we should not (* a_i) again but not important since this is just to check that remap error is ~0 
    147143      DO ji = kideb, kiut 
    148          hfx_err_rem_1d(ji) = hfx_err_rem_1d(ji) + a_i_b(ji) * r1_rdtice *  & 
     144         hfx_err_rem_1d(ji) = hfx_err_rem_1d(ji) + a_i_1d(ji) * r1_rdtice *  & 
    149145            &               ( SUM( qnew(ji,1:nlay_i) ) * zhnew(ji) - SUM( qh_i_old(ji,0:nlay_i+1) ) )  
    150146      END DO 
  • branches/2014/dev_r4650_UKMO11_restart_functionality/NEMOGCM/NEMO/LIM_SRC_3/limthd_lac.F90

    r4688 r5208  
    2929   USE lib_mpp        ! MPP library 
    3030   USE wrk_nemo       ! work arrays 
     31   USE lbclnk         ! ocean lateral boundary conditions (or mpp link) 
    3132   USE lib_fortran    ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined)   
    3233   USE limthd_ent 
     
    3637 
    3738   PUBLIC lim_thd_lac     ! called by lim_thd 
    38  
    39    REAL(wp) ::   epsi10 = 1.e-10_wp   ! 
    40    REAL(wp) ::   epsi20 = 1.e-20_wp   ! 
    4139 
    4240   !!---------------------------------------------------------------------- 
     
    7169      !!             - Computation of variation of ice volume and mass 
    7270      !!             - Computation of frldb after lateral accretion and  
    73       !!               update ht_s_b, ht_i_b and tbif_1d(:,:)       
     71      !!               update ht_s_1d, ht_i_1d and tbif_1d(:,:)       
    7472      !!------------------------------------------------------------------------ 
    75       INTEGER ::   ji,jj,jk,jl,jm   ! dummy loop indices 
    76       INTEGER ::   layer, nbpac     ! local integers  
    77       INTEGER ::   ii, ij, iter   !   -       - 
    78       REAL(wp)  ::   ztmelts, zdv, zfrazb, zweight, zindb, zinda, zde  ! local scalars 
     73      INTEGER ::   ji,jj,jk,jl      ! dummy loop indices 
     74      INTEGER ::   nbpac            ! local integers  
     75      INTEGER ::   ii, ij, iter     !   -       - 
     76      REAL(wp)  ::   ztmelts, zdv, zfrazb, zweight, zde                         ! local scalars 
    7977      REAL(wp) ::   zgamafr, zvfrx, zvgx, ztaux, ztwogp, zf , zhicol_new        !   -      - 
    8078      REAL(wp) ::   ztenagm, zvfry, zvgy, ztauy, zvrel2, zfp, zsqcd , zhicrit   !   -      - 
     
    8987      REAL(wp) ::   zv_newfra 
    9088   
    91       INTEGER , POINTER, DIMENSION(:) ::   jcat      ! indexes of categories where new ice grows 
     89      INTEGER , POINTER, DIMENSION(:) ::   jcat        ! indexes of categories where new ice grows 
    9290      REAL(wp), POINTER, DIMENSION(:) ::   zswinew     ! switch for new ice or not 
    9391 
     
    10199      REAL(wp), POINTER, DIMENSION(:) ::   zda_res     ! residual area in case of excessive heat budget 
    102100      REAL(wp), POINTER, DIMENSION(:) ::   zat_i_1d    ! total ice fraction     
    103       REAL(wp), POINTER, DIMENSION(:) ::   zat_i_lev   ! total ice fraction for level ice only (type 1)    
    104       REAL(wp), POINTER, DIMENSION(:) ::   zv_frazb   ! accretion of frazil ice at the ice bottom 
     101      REAL(wp), POINTER, DIMENSION(:) ::   zv_frazb    ! accretion of frazil ice at the ice bottom 
    105102      REAL(wp), POINTER, DIMENSION(:) ::   zvrel_1d    ! relative ice / frazil velocity (1D vector) 
    106103 
    107       REAL(wp), POINTER, DIMENSION(:,:) ::   zv_old      ! old volume of ice in category jl 
    108       REAL(wp), POINTER, DIMENSION(:,:) ::   za_old      ! old area of ice in category jl 
    109       REAL(wp), POINTER, DIMENSION(:,:) ::   za_i_1d     ! 1-D version of a_i 
    110       REAL(wp), POINTER, DIMENSION(:,:) ::   zv_i_1d     ! 1-D version of v_i 
    111       REAL(wp), POINTER, DIMENSION(:,:) ::   zoa_i_1d    ! 1-D version of oa_i 
    112       REAL(wp), POINTER, DIMENSION(:,:) ::   zsmv_i_1d   ! 1-D version of smv_i 
     104      REAL(wp), POINTER, DIMENSION(:,:) ::   zv_b      ! old volume of ice in category jl 
     105      REAL(wp), POINTER, DIMENSION(:,:) ::   za_b      ! old area of ice in category jl 
     106      REAL(wp), POINTER, DIMENSION(:,:) ::   za_i_1d   ! 1-D version of a_i 
     107      REAL(wp), POINTER, DIMENSION(:,:) ::   zv_i_1d   ! 1-D version of v_i 
     108      REAL(wp), POINTER, DIMENSION(:,:) ::   zoa_i_1d  ! 1-D version of oa_i 
     109      REAL(wp), POINTER, DIMENSION(:,:) ::   zsmv_i_1d ! 1-D version of smv_i 
    113110 
    114111      REAL(wp), POINTER, DIMENSION(:,:,:) ::   ze_i_1d   !: 1-D version of e_i 
     
    119116      CALL wrk_alloc( jpij, jcat )   ! integer 
    120117      CALL wrk_alloc( jpij, zswinew, zv_newice, za_newice, zh_newice, ze_newice, zs_newice, zo_newice ) 
    121       CALL wrk_alloc( jpij, zdv_res, zda_res, zat_i_1d, zat_i_lev, zv_frazb, zvrel_1d ) 
    122       CALL wrk_alloc( jpij,jpl, zv_old, za_old, za_i_1d, zv_i_1d, zoa_i_1d, zsmv_i_1d ) 
    123       CALL wrk_alloc( jpij,jkmax,jpl, ze_i_1d ) 
     118      CALL wrk_alloc( jpij, zdv_res, zda_res, zat_i_1d, zv_frazb, zvrel_1d ) 
     119      CALL wrk_alloc( jpij,jpl, zv_b, za_b, za_i_1d, zv_i_1d, zoa_i_1d, zsmv_i_1d ) 
     120      CALL wrk_alloc( jpij,nlay_i+1,jpl, ze_i_1d ) 
    124121      CALL wrk_alloc( jpi,jpj, zvrel ) 
    125122 
     
    132129               DO ji = 1, jpi 
    133130                  !Energy of melting q(S,T) [J.m-3] 
    134                   zindb = 1._wp - MAX(  0._wp , SIGN( 1._wp , -v_i(ji,jj,jl) + epsi10 )  )   !0 if no ice and 1 if yes 
    135                   e_i(ji,jj,jk,jl) = zindb * e_i(ji,jj,jk,jl) / ( area(ji,jj) * MAX( v_i(ji,jj,jl) ,  epsi10 ) ) * REAL( nlay_i ) 
     131                  rswitch          = 1._wp - MAX(  0._wp , SIGN( 1._wp , -v_i(ji,jj,jl) + epsi10 )  )   !0 if no ice and 1 if yes 
     132                  e_i(ji,jj,jk,jl) = rswitch * e_i(ji,jj,jk,jl) & 
     133                      &   / ( area(ji,jj) * MAX( v_i(ji,jj,jl) ,  epsi10 ) ) * REAL( nlay_i, wp ) 
    136134                  e_i(ji,jj,jk,jl) = e_i(ji,jj,jk,jl) * unit_fac 
    137135               END DO 
     
    171169         zgamafr = 0.03 
    172170 
    173          DO jj = 1, jpj 
    174             DO ji = 1, jpi 
    175  
     171         DO jj = 2, jpj 
     172            DO ji = 2, jpi 
    176173               IF ( qlead(ji,jj) < 0._wp ) THEN 
    177174                  !------------- 
     
    189186                  ! Frazil ice velocity 
    190187                  !--------------------- 
    191                   zindb = MAX( 0._wp, SIGN( 1._wp , ztenagm - epsi10 ) ) 
    192                   zvfrx = zindb * zgamafr * zsqcd * ztaux / MAX( ztenagm, epsi10 ) 
    193                   zvfry = zindb * zgamafr * zsqcd * ztauy / MAX( ztenagm, epsi10 ) 
     188                  rswitch = MAX( 0._wp, SIGN( 1._wp , ztenagm - epsi10 ) ) 
     189                  zvfrx   = rswitch * zgamafr * zsqcd * ztaux / MAX( ztenagm, epsi10 ) 
     190                  zvfry   = rswitch * zgamafr * zsqcd * ztauy / MAX( ztenagm, epsi10 ) 
    194191 
    195192                  !------------------- 
     
    197194                  !------------------- 
    198195                  ! C-grid ice velocity 
    199                   zindb = MAX(  0._wp, SIGN( 1._wp , at_i(ji,jj) )  ) 
    200                   zvgx  = zindb * (  u_ice(ji-1,jj  ) * tmu(ji-1,jj  )    & 
    201                      &             + u_ice(ji,jj    ) * tmu(ji  ,jj  )  ) * 0.5_wp 
    202                   zvgy  = zindb * (  v_ice(ji  ,jj-1) * tmv(ji  ,jj-1)    & 
    203                      &             + v_ice(ji,jj    ) * tmv(ji  ,jj  )  ) * 0.5_wp 
     196                  rswitch = MAX(  0._wp, SIGN( 1._wp , at_i(ji,jj) )  ) 
     197                  zvgx    = rswitch * ( u_ice(ji-1,jj  ) * tmu(ji-1,jj  )  + u_ice(ji,jj) * tmu(ji,jj) ) * 0.5_wp 
     198                  zvgy    = rswitch * ( v_ice(ji  ,jj-1) * tmv(ji  ,jj-1)  + v_ice(ji,jj) * tmv(ji,jj) ) * 0.5_wp 
    204199 
    205200                  !----------------------------------- 
     
    243238            END DO ! loop on ji ends 
    244239         END DO ! loop on jj ends 
     240      !  
     241      CALL lbc_lnk( zvrel(:,:), 'T', 1. ) 
     242      CALL lbc_lnk( hicol(:,:), 'T', 1. ) 
    245243 
    246244      ENDIF ! End of computation of frazil ice collection thickness 
     
    255253      ! This occurs if open water energy budget is negative 
    256254      nbpac = 0 
     255      npac(:) = 0 
     256      ! 
    257257      DO jj = 1, jpj 
    258258         DO ji = 1, jpi 
     
    298298 
    299299         CALL tab_2d_1d( nbpac, qlead_1d  (1:nbpac)     , qlead  , jpi, jpj, npac(1:nbpac) ) 
    300          CALL tab_2d_1d( nbpac, t_bo_b    (1:nbpac)     , t_bo   , jpi, jpj, npac(1:nbpac) ) 
     300         CALL tab_2d_1d( nbpac, t_bo_1d   (1:nbpac)     , t_bo   , jpi, jpj, npac(1:nbpac) ) 
    301301         CALL tab_2d_1d( nbpac, sfx_opw_1d(1:nbpac)     , sfx_opw, jpi, jpj, npac(1:nbpac) ) 
    302302         CALL tab_2d_1d( nbpac, wfx_opw_1d(1:nbpac)     , wfx_opw, jpi, jpj, npac(1:nbpac) ) 
    303          CALL tab_2d_1d( nbpac, wfx_opw_1d(1:nbpac)     , wfx_opw, jpi, jpj, npac(1:nbpac) ) 
    304          CALL tab_2d_1d( nbpac, hicol_b   (1:nbpac)     , hicol  , jpi, jpj, npac(1:nbpac) ) 
     303         CALL tab_2d_1d( nbpac, hicol_1d  (1:nbpac)     , hicol  , jpi, jpj, npac(1:nbpac) ) 
    305304         CALL tab_2d_1d( nbpac, zvrel_1d  (1:nbpac)     , zvrel  , jpi, jpj, npac(1:nbpac) ) 
    306305 
     
    315314         ! Keep old ice areas and volume in memory 
    316315         !----------------------------------------- 
    317          zv_old(:,:) = zv_i_1d(:,:)  
    318          za_old(:,:) = za_i_1d(:,:) 
    319  
     316         zv_b(1:nbpac,:) = zv_i_1d(1:nbpac,:)  
     317         za_b(1:nbpac,:) = za_i_1d(1:nbpac,:) 
    320318         !---------------------- 
    321319         ! Thickness of new ice 
     
    324322            zh_newice(ji) = hiccrit 
    325323         END DO 
    326          IF( fraz_swi == 1 ) zh_newice(:) = hicol_b(:) 
     324         IF( fraz_swi == 1 ) zh_newice(1:nbpac) = hicol_1d(1:nbpac) 
    327325 
    328326         !---------------------- 
     
    331329         SELECT CASE ( num_sal ) 
    332330         CASE ( 1 )                    ! Sice = constant  
    333             zs_newice(:) = bulk_sal 
     331            zs_newice(1:nbpac) = bulk_sal 
    334332         CASE ( 2 )                    ! Sice = F(z,t) [Vancoppenolle et al (2005)] 
    335333            DO ji = 1, nbpac 
     
    339337            END DO 
    340338         CASE ( 3 )                    ! Sice = F(z) [multiyear ice] 
    341             zs_newice(:) =   2.3 
     339            zs_newice(1:nbpac) =   2.3 
    342340         END SELECT 
    343341 
     
    348346         DO ji = 1, nbpac 
    349347            ztmelts       = - tmut * zs_newice(ji) + rtt                  ! Melting point (K) 
    350             ze_newice(ji) =   rhoic * (  cpic * ( ztmelts - t_bo_b(ji) )                             & 
    351                &                       + lfus * ( 1.0 - ( ztmelts - rtt ) / MIN( t_bo_b(ji) - rtt, -epsi10 ) )   & 
     348            ze_newice(ji) =   rhoic * (  cpic * ( ztmelts - t_bo_1d(ji) )                             & 
     349               &                       + lfus * ( 1.0 - ( ztmelts - rtt ) / MIN( t_bo_1d(ji) - rtt, -epsi10 ) )   & 
    352350               &                       - rcp  *         ( ztmelts - rtt )  ) 
    353351         END DO ! ji 
     
    367365            zEi           = - ze_newice(ji) / rhoic                ! specific enthalpy of forming ice [J/kg] 
    368366 
    369             zEw           = rcp * ( t_bo_b(ji) - rt0 )             ! specific enthalpy of seawater at t_bo_b [J/kg] 
     367            zEw           = rcp * ( t_bo_1d(ji) - rt0 )             ! specific enthalpy of seawater at t_bo_1d [J/kg] 
    370368                                                                   ! clem: we suppose we are already at the freezing point (condition qlead<0 is satisfyied)  
    371369                                                                    
     
    388386 
    389387            ! A fraction zfrazb of frazil ice is accreted at the ice bottom 
    390             zinda         = 1._wp - MAX( 0._wp, SIGN( 1._wp , - zat_i_1d(ji) ) ) 
    391             zfrazb        = zinda * ( TANH ( Cfrazb * ( zvrel_1d(ji) - vfrazb ) ) + 1.0 ) * 0.5 * maxfrazb 
     388            rswitch       = 1._wp - MAX( 0._wp, SIGN( 1._wp , - zat_i_1d(ji) ) ) 
     389            zfrazb        = rswitch * ( TANH ( Cfrazb * ( zvrel_1d(ji) - vfrazb ) ) + 1.0 ) * 0.5 * maxfrazb 
    392390            zv_frazb(ji)  =         zfrazb   * zv_newice(ji) 
    393391            zv_newice(ji) = ( 1.0 - zfrazb ) * zv_newice(ji) 
     
    438436         DO ji = 1, nbpac 
    439437            jl = jcat(ji)                                                    ! categroy in which new ice is put 
    440             zswinew  (ji) = MAX( 0._wp , SIGN( 1._wp , - za_old(ji,jl) ) )   ! 0 if old ice 
     438            zswinew  (ji) = MAX( 0._wp , SIGN( 1._wp , - za_b(ji,jl) ) )   ! 0 if old ice 
    441439         END DO 
    442440 
     
    444442            DO ji = 1, nbpac 
    445443               jl = jcat(ji) 
    446                zinda = MAX( 0._wp, SIGN( 1._wp , zv_i_1d(ji,jl) - epsi20 ) ) 
     444               rswitch = MAX( 0._wp, SIGN( 1._wp , zv_i_1d(ji,jl) - epsi20 ) ) 
    447445               ze_i_1d(ji,jk,jl) = zswinew(ji)   *   ze_newice(ji) +                                                      & 
    448                   &        ( 1.0 - zswinew(ji) ) * ( ze_newice(ji) * zv_newice(ji) + ze_i_1d(ji,jk,jl) * zv_old(ji,jl) )  & 
    449                   &        * zinda / MAX( zv_i_1d(ji,jl), epsi20 ) 
     446                  &        ( 1.0 - zswinew(ji) ) * ( ze_newice(ji) * zv_newice(ji) + ze_i_1d(ji,jk,jl) * zv_b(ji,jl) )  & 
     447                  &        * rswitch / MAX( zv_i_1d(ji,jl), epsi20 ) 
    450448            END DO 
    451449         END DO 
     
    468466            ! new volumes including lateral/bottom accretion + residual 
    469467            DO ji = 1, nbpac 
    470                zinda          = MAX( 0._wp, SIGN( 1._wp , zat_i_1d(ji) - epsi20 ) ) 
    471                zv_newfra      = zinda * ( zdv_res(ji) + zv_frazb(ji) ) * za_i_1d(ji,jl) / MAX( zat_i_1d(ji) , epsi20 ) 
    472                za_i_1d(ji,jl) = zinda * za_i_1d(ji,jl)                
     468               rswitch        = MAX( 0._wp, SIGN( 1._wp , zat_i_1d(ji) - epsi20 ) ) 
     469               zv_newfra      = rswitch * ( zdv_res(ji) + zv_frazb(ji) ) * za_i_1d(ji,jl) / MAX( zat_i_1d(ji) , epsi20 ) 
     470               za_i_1d(ji,jl) = rswitch * za_i_1d(ji,jl)                
    473471               zv_i_1d(ji,jl) = zv_i_1d(ji,jl) + zv_newfra 
    474  
    475472               ! for remapping 
    476473               h_i_old (ji,nlay_i+1) = zv_newfra 
    477474               qh_i_old(ji,nlay_i+1) = ze_newice(ji) * zv_newfra 
    478475            ENDDO 
    479  
    480476            ! --- Ice enthalpy remapping --- ! 
    481             IF( zv_newfra > 0._wp ) THEN 
    482                CALL lim_thd_ent( 1, nbpac, ze_i_1d(1:nbpac,:,jl) )  
    483             ENDIF 
    484  
     477            CALL lim_thd_ent( 1, nbpac, ze_i_1d(1:nbpac,:,jl) )  
    485478         ENDDO 
    486479 
     
    490483         DO jl = 1, jpl 
    491484            DO ji = 1, nbpac 
    492                zindb = 1._wp - MAX( 0._wp , SIGN( 1._wp , - za_i_1d(ji,jl) + epsi20 ) )  ! 0 if no ice and 1 if yes 
    493                zoa_i_1d(ji,jl)  = za_old(ji,jl) * zoa_i_1d(ji,jl) / MAX( za_i_1d(ji,jl) , epsi20 ) * zindb    
     485               rswitch          = 1._wp - MAX( 0._wp , SIGN( 1._wp , - za_i_1d(ji,jl) + epsi20 ) )  ! 0 if no ice and 1 if yes 
     486               zoa_i_1d(ji,jl)  = za_b(ji,jl) * zoa_i_1d(ji,jl) / MAX( za_i_1d(ji,jl) , epsi20 ) * rswitch    
    494487            END DO  
    495488         END DO    
     
    500493         DO jl = 1, jpl 
    501494            DO ji = 1, nbpac 
    502                zdv   = zv_i_1d(ji,jl) - zv_old(ji,jl) 
     495               zdv   = zv_i_1d(ji,jl) - zv_b(ji,jl) 
    503496               zsmv_i_1d(ji,jl) = zsmv_i_1d(ji,jl) + zdv * zs_newice(ji) 
    504497            END DO 
     
    519512         CALL tab_1d_2d( nbpac, sfx_opw, npac(1:nbpac), sfx_opw_1d(1:nbpac), jpi, jpj ) 
    520513         CALL tab_1d_2d( nbpac, wfx_opw, npac(1:nbpac), wfx_opw_1d(1:nbpac), jpi, jpj ) 
    521          CALL tab_1d_2d( nbpac, wfx_opw, npac(1:nbpac), wfx_opw_1d(1:nbpac), jpi, jpj ) 
    522514 
    523515         CALL tab_1d_2d( nbpac, hfx_thd, npac(1:nbpac), hfx_thd_1d(1:nbpac), jpi, jpj ) 
     
    534526               DO ji = 1, jpi 
    535527                  ! heat content in Joules 
    536                   e_i(ji,jj,jk,jl) = e_i(ji,jj,jk,jl) * area(ji,jj) * v_i(ji,jj,jl) / ( REAL( nlay_i ) * unit_fac )  
     528                  e_i(ji,jj,jk,jl) = e_i(ji,jj,jk,jl) * area(ji,jj) * v_i(ji,jj,jl) / ( REAL( nlay_i ,wp ) * unit_fac )  
    537529               END DO 
    538530            END DO 
     
    543535      CALL wrk_dealloc( jpij, jcat )   ! integer 
    544536      CALL wrk_dealloc( jpij, zswinew, zv_newice, za_newice, zh_newice, ze_newice, zs_newice, zo_newice ) 
    545       CALL wrk_dealloc( jpij, zdv_res, zda_res, zat_i_1d, zat_i_lev, zv_frazb, zvrel_1d ) 
    546       CALL wrk_dealloc( jpij,jpl, zv_old, za_old, za_i_1d, zv_i_1d, zoa_i_1d, zsmv_i_1d ) 
    547       CALL wrk_dealloc( jpij,jkmax,jpl, ze_i_1d ) 
     537      CALL wrk_dealloc( jpij, zdv_res, zda_res, zat_i_1d, zv_frazb, zvrel_1d ) 
     538      CALL wrk_dealloc( jpij,jpl, zv_b, za_b, za_i_1d, zv_i_1d, zoa_i_1d, zsmv_i_1d ) 
     539      CALL wrk_dealloc( jpij,nlay_i+1,jpl, ze_i_1d ) 
    548540      CALL wrk_dealloc( jpi,jpj, zvrel ) 
    549541      ! 
  • branches/2014/dev_r4650_UKMO11_restart_functionality/NEMOGCM/NEMO/LIM_SRC_3/limthd_sal.F90

    r4688 r5208  
    6060      !--------------------------------------------------------- 
    6161      DO ji = kideb, kiut 
    62          sm_i_b(ji) = sm_i_b(ji) + dsm_i_se_1d(ji) + dsm_i_si_1d(ji) 
     62         sm_i_1d(ji) = sm_i_1d(ji) + dsm_i_se_1d(ji) + dsm_i_si_1d(ji) 
    6363      END DO 
    6464  
     
    6666      ! 1) Constant salinity, constant in time                                       | 
    6767      !------------------------------------------------------------------------------| 
    68 !!gm comment: if num_sal = 1 s_i_new, s_i_b and sm_i_b can be set to bulk_sal one for all in the initialisation phase !! 
     68!!gm comment: if num_sal = 1 s_i_new, s_i_1d and sm_i_1d can be set to bulk_sal one for all in the initialisation phase !! 
    6969!!gm           ===>>>   simplification of almost all test on num_sal value 
    7070      IF(  num_sal == 1  ) THEN 
    71             s_i_b (kideb:kiut,1:nlay_i) =  bulk_sal 
    72             sm_i_b (kideb:kiut)          =  bulk_sal  
     71            s_i_1d (kideb:kiut,1:nlay_i) =  bulk_sal 
     72            sm_i_1d(kideb:kiut)          =  bulk_sal  
    7373            s_i_new(kideb:kiut)          =  bulk_sal 
    7474      ENDIF 
     
    8383            ! Switches  
    8484            !---------- 
    85             iflush  = MAX( 0._wp , SIGN( 1._wp , t_su_b(ji) - rtt )        )    ! =1 if summer  
    86             igravdr = MAX( 0._wp , SIGN( 1._wp , t_bo_b(ji) - t_su_b(ji) ) )    ! =1 if t_su < t_bo 
     85            iflush  = MAX( 0._wp , SIGN( 1._wp , t_su_1d(ji) - rtt )        )     ! =1 if summer  
     86            igravdr = MAX( 0._wp , SIGN( 1._wp , t_bo_1d(ji) - t_su_1d(ji) ) )    ! =1 if t_su < t_bo 
    8787 
    8888            !--------------------- 
     
    9090            !--------------------- 
    9191            ! drainage by gravity drainage 
    92             dsm_i_gd_1d(ji) = - igravdr * MAX( sm_i_b(ji) - sal_G , 0._wp ) / time_G * rdt_ice  
     92            dsm_i_gd_1d(ji) = - igravdr * MAX( sm_i_1d(ji) - sal_G , 0._wp ) / time_G * rdt_ice  
    9393            ! drainage by flushing   
    94             dsm_i_fl_1d(ji) = - iflush  * MAX( sm_i_b(ji) - sal_F , 0._wp ) / time_F * rdt_ice 
     94            dsm_i_fl_1d(ji) = - iflush  * MAX( sm_i_1d(ji) - sal_F , 0._wp ) / time_F * rdt_ice 
    9595 
    9696            !----------------- 
     
    9999            ! only drainage terms ( gravity drainage and flushing ) 
    100100            ! snow ice / bottom sources are added in lim_thd_ent to conserve energy 
    101             sm_i_b(ji) = sm_i_b(ji) + dsm_i_fl_1d(ji) + dsm_i_gd_1d(ji) 
     101            sm_i_1d(ji) = sm_i_1d(ji) + dsm_i_fl_1d(ji) + dsm_i_gd_1d(ji) 
    102102 
    103103            !---------------------------- 
    104104            ! Salt flux - brine drainage 
    105105            !---------------------------- 
    106             sfx_bri_1d(ji) = sfx_bri_1d(ji) - rhoic * a_i_b(ji) * ht_i_b(ji) * ( dsm_i_fl_1d(ji) + dsm_i_gd_1d(ji) ) * r1_rdtice 
     106            sfx_bri_1d(ji) = sfx_bri_1d(ji) - rhoic * a_i_1d(ji) * ht_i_1d(ji) * ( dsm_i_fl_1d(ji) + dsm_i_gd_1d(ji) ) * r1_rdtice 
    107107 
    108108         END DO 
  • 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 
  • branches/2014/dev_r4650_UKMO11_restart_functionality/NEMOGCM/NEMO/LIM_SRC_3/limupdate1.F90

    r4688 r5208  
    5050   PUBLIC   lim_update1   ! routine called by ice_step 
    5151 
    52       REAL(wp)  ::   epsi10 = 1.e-10_wp   !    -       - 
    53           
    5452   !! * Substitutions 
    5553#  include "vectopt_loop_substitute.h90" 
     
    6967      !!                 
    7068      !!--------------------------------------------------------------------- 
    71       INTEGER  ::   ji, jj, jk, jl, jm    ! dummy loop indices 
    72       INTEGER  ::   jbnd1, jbnd2 
     69      INTEGER  ::   ji, jj, jk, jl   ! dummy loop indices 
    7370      INTEGER  ::   i_ice_switch 
    7471      REAL(wp) ::   zsal 
     
    9390      ! Rebin categories with thickness out of bounds 
    9491      !---------------------------------------------------- 
    95       DO jm = 1, jpm 
    96          jbnd1 = ice_cat_bounds(jm,1) 
    97          jbnd2 = ice_cat_bounds(jm,2) 
    98          IF (ice_ncat_types(jm) .GT. 1 )   CALL lim_itd_th_reb(jbnd1, jbnd2, jm) 
    99       END DO 
     92      IF ( jpl > 1 )   CALL lim_itd_th_reb(1, jpl) 
    10093 
    10194      at_i(:,:) = 0._wp 
     
    126119      ! Final thickness distribution rebinning 
    127120      ! -------------------------------------- 
    128       DO jm = 1, jpm 
    129          jbnd1 = ice_cat_bounds(jm,1) 
    130          jbnd2 = ice_cat_bounds(jm,2) 
    131          IF (ice_ncat_types(jm) .GT. 1 ) CALL lim_itd_th_reb(jbnd1, jbnd2, jm) 
    132          IF (ice_ncat_types(jm) .EQ. 1 ) THEN 
    133          ENDIF 
    134       END DO 
     121      IF ( jpl > 1 ) CALL lim_itd_th_reb(1, jpl) 
    135122 
    136123      !----------------- 
     
    161148      ! Diagnostics 
    162149      ! ------------------------------------------------- 
    163       d_u_ice_dyn(:,:)     = u_ice(:,:)     - old_u_ice(:,:) 
    164       d_v_ice_dyn(:,:)     = v_ice(:,:)     - old_v_ice(:,:) 
    165       d_a_i_trp  (:,:,:)   = a_i  (:,:,:)   - old_a_i  (:,:,:) 
    166       d_v_s_trp  (:,:,:)   = v_s  (:,:,:)   - old_v_s  (:,:,:)   
    167       d_v_i_trp  (:,:,:)   = v_i  (:,:,:)   - old_v_i  (:,:,:)    
    168       d_e_s_trp  (:,:,:,:) = e_s  (:,:,:,:) - old_e_s  (:,:,:,:)   
    169       d_e_i_trp  (:,:,1:nlay_i,:) = e_i  (:,:,1:nlay_i,:) - old_e_i(:,:,1:nlay_i,:) 
    170       d_oa_i_trp (:,:,:)   = oa_i (:,:,:)   - old_oa_i (:,:,:) 
     150      d_u_ice_dyn(:,:)     = u_ice(:,:)     - u_ice_b(:,:) 
     151      d_v_ice_dyn(:,:)     = v_ice(:,:)     - v_ice_b(:,:) 
     152      d_a_i_trp  (:,:,:)   = a_i  (:,:,:)   - a_i_b  (:,:,:) 
     153      d_v_s_trp  (:,:,:)   = v_s  (:,:,:)   - v_s_b  (:,:,:)   
     154      d_v_i_trp  (:,:,:)   = v_i  (:,:,:)   - v_i_b  (:,:,:)    
     155      d_e_s_trp  (:,:,:,:) = e_s  (:,:,:,:) - e_s_b  (:,:,:,:)   
     156      d_e_i_trp  (:,:,1:nlay_i,:) = e_i  (:,:,1:nlay_i,:) - e_i_b(:,:,1:nlay_i,:) 
     157      d_oa_i_trp (:,:,:)   = oa_i (:,:,:)   - oa_i_b (:,:,:) 
    171158      d_smv_i_trp(:,:,:)   = 0._wp 
    172       IF(  num_sal == 2  ) d_smv_i_trp(:,:,:) = smv_i(:,:,:) - old_smv_i(:,:,:) 
     159      IF(  num_sal == 2  ) d_smv_i_trp(:,:,:) = smv_i(:,:,:) - smv_i_b(:,:,:) 
    173160 
    174161      ! conservation test 
     
    186173         CALL prt_ctl(tab2d_1=u_ice      , clinfo1=' lim_update1  : u_ice       :', tab2d_2=v_ice      , clinfo2=' v_ice       :') 
    187174         CALL prt_ctl(tab2d_1=d_u_ice_dyn, clinfo1=' lim_update1  : d_u_ice_dyn :', tab2d_2=d_v_ice_dyn, clinfo2=' d_v_ice_dyn :') 
    188          CALL prt_ctl(tab2d_1=old_u_ice  , clinfo1=' lim_update1  : old_u_ice   :', tab2d_2=old_v_ice  , clinfo2=' old_v_ice   :') 
     175         CALL prt_ctl(tab2d_1=u_ice_b    , clinfo1=' lim_update1  : u_ice_b     :', tab2d_2=v_ice_b    , clinfo2=' v_ice_b     :') 
    189176 
    190177         DO jl = 1, jpl 
     
    199186            CALL prt_ctl(tab2d_1=o_i        (:,:,jl)        , clinfo1= ' lim_update1  : o_i         : ') 
    200187            CALL prt_ctl(tab2d_1=a_i        (:,:,jl)        , clinfo1= ' lim_update1  : a_i         : ') 
    201             CALL prt_ctl(tab2d_1=old_a_i    (:,:,jl)        , clinfo1= ' lim_update1  : old_a_i     : ') 
     188            CALL prt_ctl(tab2d_1=a_i_b      (:,:,jl)        , clinfo1= ' lim_update1  : a_i_b       : ') 
    202189            CALL prt_ctl(tab2d_1=d_a_i_trp  (:,:,jl)        , clinfo1= ' lim_update1  : d_a_i_trp   : ') 
    203190            CALL prt_ctl(tab2d_1=v_i        (:,:,jl)        , clinfo1= ' lim_update1  : v_i         : ') 
    204             CALL prt_ctl(tab2d_1=old_v_i    (:,:,jl)        , clinfo1= ' lim_update1  : old_v_i     : ') 
     191            CALL prt_ctl(tab2d_1=v_i_b      (:,:,jl)        , clinfo1= ' lim_update1  : v_i_b       : ') 
    205192            CALL prt_ctl(tab2d_1=d_v_i_trp  (:,:,jl)        , clinfo1= ' lim_update1  : d_v_i_trp   : ') 
    206193            CALL prt_ctl(tab2d_1=v_s        (:,:,jl)        , clinfo1= ' lim_update1  : v_s         : ') 
    207             CALL prt_ctl(tab2d_1=old_v_s    (:,:,jl)        , clinfo1= ' lim_update1  : old_v_s     : ') 
     194            CALL prt_ctl(tab2d_1=v_s_b      (:,:,jl)        , clinfo1= ' lim_update1  : v_s_b       : ') 
    208195            CALL prt_ctl(tab2d_1=d_v_s_trp  (:,:,jl)        , clinfo1= ' lim_update1  : d_v_s_trp   : ') 
    209196            CALL prt_ctl(tab2d_1=e_i        (:,:,1,jl)/1.0e9, clinfo1= ' lim_update1  : e_i1        : ') 
    210             CALL prt_ctl(tab2d_1=old_e_i    (:,:,1,jl)/1.0e9, clinfo1= ' lim_update1  : old_e_i1    : ') 
     197            CALL prt_ctl(tab2d_1=e_i_b      (:,:,1,jl)/1.0e9, clinfo1= ' lim_update1  : e_i1_b      : ') 
    211198            CALL prt_ctl(tab2d_1=d_e_i_trp  (:,:,1,jl)/1.0e9, clinfo1= ' lim_update1  : de_i1_trp   : ') 
    212199            CALL prt_ctl(tab2d_1=e_i        (:,:,2,jl)/1.0e9, clinfo1= ' lim_update1  : e_i2        : ') 
    213             CALL prt_ctl(tab2d_1=old_e_i    (:,:,2,jl)/1.0e9, clinfo1= ' lim_update1  : old_e_i2    : ') 
     200            CALL prt_ctl(tab2d_1=e_i_b      (:,:,2,jl)/1.0e9, clinfo1= ' lim_update1  : e_i2_b      : ') 
    214201            CALL prt_ctl(tab2d_1=d_e_i_trp  (:,:,2,jl)/1.0e9, clinfo1= ' lim_update1  : de_i2_trp   : ') 
    215202            CALL prt_ctl(tab2d_1=e_s        (:,:,1,jl)      , clinfo1= ' lim_update1  : e_snow      : ') 
    216             CALL prt_ctl(tab2d_1=old_e_s    (:,:,1,jl)      , clinfo1= ' lim_update1  : old_e_snow  : ') 
     203            CALL prt_ctl(tab2d_1=e_s_b      (:,:,1,jl)      , clinfo1= ' lim_update1  : e_snow_b    : ') 
    217204            CALL prt_ctl(tab2d_1=d_e_s_trp  (:,:,1,jl)/1.0e9, clinfo1= ' lim_update1  : d_e_s_trp   : ') 
    218205            CALL prt_ctl(tab2d_1=smv_i      (:,:,jl)        , clinfo1= ' lim_update1  : smv_i       : ') 
    219             CALL prt_ctl(tab2d_1=old_smv_i  (:,:,jl)        , clinfo1= ' lim_update1  : old_smv_i   : ') 
     206            CALL prt_ctl(tab2d_1=smv_i_b    (:,:,jl)        , clinfo1= ' lim_update1  : smv_i_b     : ') 
    220207            CALL prt_ctl(tab2d_1=d_smv_i_trp(:,:,jl)        , clinfo1= ' lim_update1  : d_smv_i_trp : ') 
    221208            CALL prt_ctl(tab2d_1=oa_i       (:,:,jl)        , clinfo1= ' lim_update1  : oa_i        : ') 
    222             CALL prt_ctl(tab2d_1=old_oa_i   (:,:,jl)        , clinfo1= ' lim_update1  : old_oa_i    : ') 
     209            CALL prt_ctl(tab2d_1=oa_i_b     (:,:,jl)        , clinfo1= ' lim_update1  : oa_i_b      : ') 
    223210            CALL prt_ctl(tab2d_1=d_oa_i_trp (:,:,jl)        , clinfo1= ' lim_update1  : d_oa_i_trp  : ') 
    224211 
  • branches/2014/dev_r4650_UKMO11_restart_functionality/NEMOGCM/NEMO/LIM_SRC_3/limupdate2.F90

    r4688 r5208  
    4747   PUBLIC   lim_update2   ! routine called by ice_step 
    4848 
    49    REAL(wp)  ::   epsi10 = 1.e-10_wp   !    -       - 
    50    REAL(wp)  ::   epsi20 = 1.e-20_wp    
    51        
    5249   !! * Substitutions 
    5350#  include "vectopt_loop_substitute.h90" 
     
    6764      !! 
    6865      !!--------------------------------------------------------------------- 
    69       INTEGER  ::   ji, jj, jk, jl, jm    ! dummy loop indices 
    70       INTEGER  ::   jbnd1, jbnd2 
     66      INTEGER  ::   ji, jj, jk, jl    ! dummy loop indices 
    7167      INTEGER  ::   i_ice_switch 
    7268      REAL(wp) ::   zh, zsal 
     
    8985      ! Rebin categories with thickness out of bounds 
    9086      !---------------------------------------------------- 
    91       DO jm = 1, jpm 
    92          jbnd1 = ice_cat_bounds(jm,1) 
    93          jbnd2 = ice_cat_bounds(jm,2) 
    94          IF (ice_ncat_types(jm) .GT. 1 )   CALL lim_itd_th_reb(jbnd1, jbnd2, jm) 
    95       END DO 
     87      IF ( jpl > 1 )   CALL lim_itd_th_reb(1, jpl) 
    9688 
    9789      !---------------------------------------------------------------------- 
    9890      ! Constrain the thickness of the smallest category above hiclim 
    9991      !---------------------------------------------------------------------- 
    100       DO jm = 1, jpm 
    101          DO jj = 1, jpj  
    102             DO ji = 1, jpi 
    103                jl = ice_cat_bounds(jm,1) 
    104                IF( v_i(ji,jj,jl) > 0._wp .AND. ht_i(ji,jj,jl) < hiclim ) THEN 
    105                   zh             = hiclim / ht_i(ji,jj,jl) 
    106                   ht_s(ji,jj,jl) = ht_s(ji,jj,jl) * zh 
    107                   ht_i(ji,jj,jl) = ht_i(ji,jj,jl) * zh 
    108                   a_i (ji,jj,jl) = a_i(ji,jj,jl)  / zh 
    109                ENDIF 
    110             END DO !ji 
    111          END DO !jj 
    112       END DO !jm 
     92      DO jj = 1, jpj  
     93         DO ji = 1, jpi 
     94            IF( v_i(ji,jj,1) > 0._wp .AND. ht_i(ji,jj,1) < hiclim ) THEN 
     95               zh             = hiclim / ht_i(ji,jj,1) 
     96               ht_s(ji,jj,1) = ht_s(ji,jj,1) * zh 
     97               ht_i(ji,jj,1) = ht_i(ji,jj,1) * zh 
     98               a_i (ji,jj,1) = a_i(ji,jj,1)  / zh 
     99            ENDIF 
     100         END DO 
     101      END DO 
    113102       
    114103      !----------------------------------------------------- 
     
    139128      ! Final thickness distribution rebinning 
    140129      ! -------------------------------------- 
    141       DO jm = 1, jpm 
    142          jbnd1 = ice_cat_bounds(jm,1) 
    143          jbnd2 = ice_cat_bounds(jm,2) 
    144          IF (ice_ncat_types(jm) .GT. 1 ) CALL lim_itd_th_reb(jbnd1, jbnd2, jm) 
    145          IF (ice_ncat_types(jm) .EQ. 1 ) THEN 
    146          ENDIF 
    147       END DO 
     130      IF ( jpl > 1 ) CALL lim_itd_th_reb( 1, jpl ) 
    148131 
    149132      !----------------- 
     
    196179      ! Diagnostics 
    197180      ! ------------------------------------------------- 
    198       d_a_i_thd(:,:,:)   = a_i(:,:,:)   - old_a_i(:,:,:)  
    199       d_v_s_thd(:,:,:)   = v_s(:,:,:)   - old_v_s(:,:,:) 
    200       d_v_i_thd(:,:,:)   = v_i(:,:,:)   - old_v_i(:,:,:)   
    201       d_e_s_thd(:,:,:,:) = e_s(:,:,:,:) - old_e_s(:,:,:,:)  
    202       d_e_i_thd(:,:,1:nlay_i,:) = e_i(:,:,1:nlay_i,:) - old_e_i(:,:,1:nlay_i,:) 
    203       !?? d_oa_i_thd(:,:,:)  = oa_i (:,:,:) - old_oa_i (:,:,:) 
     181      d_a_i_thd(:,:,:)   = a_i(:,:,:)   - a_i_b(:,:,:)  
     182      d_v_s_thd(:,:,:)   = v_s(:,:,:)   - v_s_b(:,:,:) 
     183      d_v_i_thd(:,:,:)   = v_i(:,:,:)   - v_i_b(:,:,:)   
     184      d_e_s_thd(:,:,:,:) = e_s(:,:,:,:) - e_s_b(:,:,:,:)  
     185      d_e_i_thd(:,:,1:nlay_i,:) = e_i(:,:,1:nlay_i,:) - e_i_b(:,:,1:nlay_i,:) 
     186      !?? d_oa_i_thd(:,:,:)  = oa_i (:,:,:) - oa_i_b (:,:,:) 
    204187      d_smv_i_thd(:,:,:) = 0._wp 
    205       IF( num_sal == 2 )   d_smv_i_thd(:,:,:) = smv_i(:,:,:) - old_smv_i(:,:,:) 
     188      IF( num_sal == 2 )   d_smv_i_thd(:,:,:) = smv_i(:,:,:) - smv_i_b(:,:,:) 
    206189      ! diag only (clem) 
    207190      dv_dt_thd(:,:,:) = d_v_i_thd(:,:,:) * r1_rdtice * rday 
     
    211194         DO ji = 1, jpi             
    212195            diag_heat_dhc(ji,jj) = ( SUM( d_e_i_trp(ji,jj,1:nlay_i,:) + d_e_i_thd(ji,jj,1:nlay_i,:) ) +  &  
    213                &                     SUM( d_e_s_trp(ji,jj,1:nlay_s,:) + d_e_s_thd(ji,jj,1:nlay_s,:) ) ) * unit_fac * r1_rdtice / area(ji,jj)    
     196               &                     SUM( d_e_s_trp(ji,jj,1:nlay_s,:) + d_e_s_thd(ji,jj,1:nlay_s,:) )    & 
     197               &                   ) * unit_fac * r1_rdtice / area(ji,jj)    
    214198         END DO 
    215199      END DO 
     
    228212         CALL prt_ctl(tab2d_1=strength   , clinfo1=' lim_update2  : strength    :') 
    229213         CALL prt_ctl(tab2d_1=u_ice      , clinfo1=' lim_update2  : u_ice       :', tab2d_2=v_ice      , clinfo2=' v_ice       :') 
    230          CALL prt_ctl(tab2d_1=old_u_ice  , clinfo1=' lim_update2  : old_u_ice   :', tab2d_2=old_v_ice  , clinfo2=' old_v_ice   :') 
     214         CALL prt_ctl(tab2d_1=u_ice_b    , clinfo1=' lim_update2  : u_ice_b     :', tab2d_2=v_ice_b    , clinfo2=' v_ice_b     :') 
    231215 
    232216         DO jl = 1, jpl 
     
    241225            CALL prt_ctl(tab2d_1=o_i        (:,:,jl)        , clinfo1= ' lim_update2  : o_i         : ') 
    242226            CALL prt_ctl(tab2d_1=a_i        (:,:,jl)        , clinfo1= ' lim_update2  : a_i         : ') 
    243             CALL prt_ctl(tab2d_1=old_a_i    (:,:,jl)        , clinfo1= ' lim_update2  : old_a_i     : ') 
     227            CALL prt_ctl(tab2d_1=a_i_b      (:,:,jl)        , clinfo1= ' lim_update2  : a_i_b       : ') 
    244228            CALL prt_ctl(tab2d_1=d_a_i_thd  (:,:,jl)        , clinfo1= ' lim_update2  : d_a_i_thd   : ') 
    245229            CALL prt_ctl(tab2d_1=v_i        (:,:,jl)        , clinfo1= ' lim_update2  : v_i         : ') 
    246             CALL prt_ctl(tab2d_1=old_v_i    (:,:,jl)        , clinfo1= ' lim_update2  : old_v_i     : ') 
     230            CALL prt_ctl(tab2d_1=v_i_b      (:,:,jl)        , clinfo1= ' lim_update2  : v_i_b       : ') 
    247231            CALL prt_ctl(tab2d_1=d_v_i_thd  (:,:,jl)        , clinfo1= ' lim_update2  : d_v_i_thd   : ') 
    248232            CALL prt_ctl(tab2d_1=v_s        (:,:,jl)        , clinfo1= ' lim_update2  : v_s         : ') 
    249             CALL prt_ctl(tab2d_1=old_v_s    (:,:,jl)        , clinfo1= ' lim_update2  : old_v_s     : ') 
     233            CALL prt_ctl(tab2d_1=v_s_b      (:,:,jl)        , clinfo1= ' lim_update2  : v_s_b       : ') 
    250234            CALL prt_ctl(tab2d_1=d_v_s_thd  (:,:,jl)        , clinfo1= ' lim_update2  : d_v_s_thd   : ') 
    251235            CALL prt_ctl(tab2d_1=e_i        (:,:,1,jl)/1.0e9, clinfo1= ' lim_update2  : e_i1        : ') 
    252             CALL prt_ctl(tab2d_1=old_e_i    (:,:,1,jl)/1.0e9, clinfo1= ' lim_update2  : old_e_i1    : ') 
     236            CALL prt_ctl(tab2d_1=e_i_b      (:,:,1,jl)/1.0e9, clinfo1= ' lim_update2  : e_i1_b      : ') 
    253237            CALL prt_ctl(tab2d_1=d_e_i_thd  (:,:,1,jl)/1.0e9, clinfo1= ' lim_update2  : de_i1_thd   : ') 
    254238            CALL prt_ctl(tab2d_1=e_i        (:,:,2,jl)/1.0e9, clinfo1= ' lim_update2  : e_i2        : ') 
    255             CALL prt_ctl(tab2d_1=old_e_i    (:,:,2,jl)/1.0e9, clinfo1= ' lim_update2  : old_e_i2    : ') 
     239            CALL prt_ctl(tab2d_1=e_i_b      (:,:,2,jl)/1.0e9, clinfo1= ' lim_update2  : e_i2_b      : ') 
    256240            CALL prt_ctl(tab2d_1=d_e_i_thd  (:,:,2,jl)/1.0e9, clinfo1= ' lim_update2  : de_i2_thd   : ') 
    257241            CALL prt_ctl(tab2d_1=e_s        (:,:,1,jl)      , clinfo1= ' lim_update2  : e_snow      : ') 
    258             CALL prt_ctl(tab2d_1=old_e_s    (:,:,1,jl)      , clinfo1= ' lim_update2  : old_e_snow  : ') 
     242            CALL prt_ctl(tab2d_1=e_s_b      (:,:,1,jl)      , clinfo1= ' lim_update2  : e_snow_b    : ') 
    259243            CALL prt_ctl(tab2d_1=d_e_s_thd  (:,:,1,jl)/1.0e9, clinfo1= ' lim_update2  : d_e_s_thd   : ') 
    260244            CALL prt_ctl(tab2d_1=smv_i      (:,:,jl)        , clinfo1= ' lim_update2  : smv_i       : ') 
    261             CALL prt_ctl(tab2d_1=old_smv_i  (:,:,jl)        , clinfo1= ' lim_update2  : old_smv_i   : ') 
     245            CALL prt_ctl(tab2d_1=smv_i_b    (:,:,jl)        , clinfo1= ' lim_update2  : smv_i_b     : ') 
    262246            CALL prt_ctl(tab2d_1=d_smv_i_thd(:,:,jl)        , clinfo1= ' lim_update2  : d_smv_i_thd : ') 
    263247            CALL prt_ctl(tab2d_1=oa_i       (:,:,jl)        , clinfo1= ' lim_update2  : oa_i        : ') 
    264             CALL prt_ctl(tab2d_1=old_oa_i   (:,:,jl)        , clinfo1= ' lim_update2  : old_oa_i    : ') 
     248            CALL prt_ctl(tab2d_1=oa_i_b     (:,:,jl)        , clinfo1= ' lim_update2  : oa_i_b      : ') 
    265249            CALL prt_ctl(tab2d_1=d_oa_i_thd (:,:,jl)        , clinfo1= ' lim_update2  : d_oa_i_thd  : ') 
    266250 
  • branches/2014/dev_r4650_UKMO11_restart_functionality/NEMOGCM/NEMO/LIM_SRC_3/limvar.F90

    r4688 r5208  
    6666   PUBLIC   lim_var_salprof1d    ! 
    6767 
    68    REAL(wp) ::   epsi10 = 1.e-10_wp   !    -       - 
    69  
    7068   !!---------------------------------------------------------------------- 
    7169   !! NEMO/LIM3 4.0 , UCL - NEMO Consortium (2011) 
     
    9290      ! 
    9391      INTEGER  ::   ji, jj, jk, jl   ! dummy loop indices 
    94       REAL(wp) ::   zinda, zindb 
    9592      !!------------------------------------------------------------------ 
    9693 
     
    111108               at_i(ji,jj) = at_i(ji,jj) + a_i(ji,jj,jl) ! ice concentration 
    112109               ! 
    113                zinda = MAX( 0._wp , SIGN( 1._wp , at_i(ji,jj) - epsi10 ) )  
    114                icethi(ji,jj) = vt_i(ji,jj) / MAX( at_i(ji,jj) , epsi10 ) * zinda  ! ice thickness 
     110               rswitch = MAX( 0._wp , SIGN( 1._wp , at_i(ji,jj) - epsi10 ) )  
     111               icethi(ji,jj) = vt_i(ji,jj) / MAX( at_i(ji,jj) , epsi10 ) * rswitch  ! ice thickness 
    115112            END DO 
    116113         END DO 
     
    132129            DO jj = 1, jpj 
    133130               DO ji = 1, jpi 
    134                   zinda = MAX( 0._wp , SIGN( 1._wp , vt_i(ji,jj) - epsi10 ) )  
    135                   zindb = MAX( 0._wp , SIGN( 1._wp , at_i(ji,jj) - epsi10 ) )  
    136131                  et_s(ji,jj)  = et_s(ji,jj)  + e_s(ji,jj,1,jl)                                       ! snow heat content 
    137                   smt_i(ji,jj) = smt_i(ji,jj) + smv_i(ji,jj,jl) / MAX( vt_i(ji,jj) , epsi10 ) * zinda   ! ice salinity 
    138                   ot_i(ji,jj)  = ot_i(ji,jj)  + oa_i(ji,jj,jl)  / MAX( at_i(ji,jj) , epsi10 ) * zindb   ! ice age 
     132                  rswitch = MAX( 0._wp , SIGN( 1._wp , vt_i(ji,jj) - epsi10 ) )  
     133                  smt_i(ji,jj) = smt_i(ji,jj) + smv_i(ji,jj,jl) / MAX( vt_i(ji,jj) , epsi10 ) * rswitch   ! ice salinity 
     134                  rswitch = MAX( 0._wp , SIGN( 1._wp , at_i(ji,jj) - epsi10 ) )  
     135                  ot_i(ji,jj)  = ot_i(ji,jj)  + oa_i(ji,jj,jl)  / MAX( at_i(ji,jj) , epsi10 ) * rswitch   ! ice age 
    139136               END DO 
    140137            END DO 
     
    161158      INTEGER  ::   ji, jj, jk, jl   ! dummy loop indices 
    162159      REAL(wp) ::   zq_i, zaaa, zbbb, zccc, zdiscrim     ! local scalars 
    163       REAL(wp) ::   ztmelts, zindb, zq_s, zfac1, zfac2   !   -      - 
     160      REAL(wp) ::   ztmelts, zq_s, zfac1, zfac2   !   -      - 
    164161      !!------------------------------------------------------------------ 
    165162 
     
    170167         DO jj = 1, jpj 
    171168            DO ji = 1, jpi 
    172                zindb = 1._wp - MAX( 0._wp , SIGN( 1._wp,- a_i(ji,jj,jl) + epsi10 ) )   !0 if no ice and 1 if yes 
    173                ht_i(ji,jj,jl) = v_i (ji,jj,jl) / MAX( a_i(ji,jj,jl) , epsi10 ) * zindb 
    174                ht_s(ji,jj,jl) = v_s (ji,jj,jl) / MAX( a_i(ji,jj,jl) , epsi10 ) * zindb 
    175                o_i(ji,jj,jl)  = oa_i(ji,jj,jl) / MAX( a_i(ji,jj,jl) , epsi10 ) * zindb 
     169               rswitch = 1._wp - MAX( 0._wp , SIGN( 1._wp,- a_i(ji,jj,jl) + epsi10 ) )   !0 if no ice and 1 if yes 
     170               ht_i(ji,jj,jl) = v_i (ji,jj,jl) / MAX( a_i(ji,jj,jl) , epsi10 ) * rswitch 
     171               ht_s(ji,jj,jl) = v_s (ji,jj,jl) / MAX( a_i(ji,jj,jl) , epsi10 ) * rswitch 
     172               o_i(ji,jj,jl)  = oa_i(ji,jj,jl) / MAX( a_i(ji,jj,jl) , epsi10 ) * rswitch 
    176173            END DO 
    177174         END DO 
     
    182179            DO jj = 1, jpj 
    183180               DO ji = 1, jpi 
    184                   zindb = 1._wp - MAX( 0._wp , SIGN( 1._wp,- a_i(ji,jj,jl) + epsi10 ) )   !0 if no ice and 1 if yes 
    185                   sm_i(ji,jj,jl) = smv_i(ji,jj,jl) / MAX( v_i(ji,jj,jl) , epsi10 ) * zindb 
     181                  rswitch = 1._wp - MAX( 0._wp , SIGN( 1._wp,- a_i(ji,jj,jl) + epsi10 ) )   !0 if no ice and 1 if yes 
     182                  sm_i(ji,jj,jl) = smv_i(ji,jj,jl) / MAX( v_i(ji,jj,jl) , epsi10 ) * rswitch 
    186183               END DO 
    187184            END DO 
     
    203200               DO ji = 1, jpi 
    204201                  !                                                              ! Energy of melting q(S,T) [J.m-3] 
    205                   zindb   = 1.0 - MAX( 0.0 , SIGN( 1.0 , - v_i(ji,jj,jl) + epsi10 ) )     ! zindb = 0 if no ice and 1 if yes 
    206                   zq_i    = zindb * e_i(ji,jj,jk,jl) / area(ji,jj) / MAX( v_i(ji,jj,jl) , epsi10 ) * REAL(nlay_i,wp)  
     202                  rswitch   = 1.0 - MAX( 0.0 , SIGN( 1.0 , - v_i(ji,jj,jl) + epsi10 ) )     ! rswitch = 0 if no ice and 1 if yes 
     203                  zq_i    = rswitch * e_i(ji,jj,jk,jl) / area(ji,jj) / MAX( v_i(ji,jj,jl) , epsi10 ) * REAL(nlay_i,wp)  
    207204                  zq_i    = zq_i * unit_fac                             !convert units 
    208205                  ztmelts = -tmut * s_i(ji,jj,jk,jl) + rtt                       ! Ice layer melt temperature 
     
    212209                  zccc       =  lfus * (ztmelts-rtt) 
    213210                  zdiscrim   =  SQRT( MAX(zbbb*zbbb - 4._wp*zaaa*zccc , 0._wp) ) 
    214                   t_i(ji,jj,jk,jl) = rtt + zindb *( - zbbb - zdiscrim ) / ( 2.0 *zaaa ) 
     211                  t_i(ji,jj,jk,jl) = rtt + rswitch *( - zbbb - zdiscrim ) / ( 2.0 *zaaa ) 
    215212                  t_i(ji,jj,jk,jl) = MIN( rtt, MAX( 173.15_wp, t_i(ji,jj,jk,jl) ) )       ! 100-rtt < t_i < rtt 
    216213               END DO 
     
    229226               DO ji = 1, jpi 
    230227                  !Energy of melting q(S,T) [J.m-3] 
    231                   zindb = 1._wp - MAX( 0._wp , SIGN( 1._wp , - v_s(ji,jj,jl) + epsi10 ) )     ! zindb = 0 if no ice and 1 if yes 
    232                   zq_s  = zindb * e_s(ji,jj,jk,jl) / ( area(ji,jj) * MAX( v_s(ji,jj,jl) , epsi10 ) ) * REAL(nlay_s,wp) 
     228                  rswitch = 1._wp - MAX( 0._wp , SIGN( 1._wp , - v_s(ji,jj,jl) + epsi10 ) )     ! rswitch = 0 if no ice and 1 if yes 
     229                  zq_s  = rswitch * e_s(ji,jj,jk,jl) / ( area(ji,jj) * MAX( v_s(ji,jj,jl) , epsi10 ) ) * REAL(nlay_s,wp) 
    233230                  zq_s  = zq_s * unit_fac                                    ! convert units 
    234231                  ! 
    235                   t_s(ji,jj,jk,jl) = rtt + zindb * ( - zfac1 * zq_s + zfac2 ) 
     232                  t_s(ji,jj,jk,jl) = rtt + rswitch * ( - zfac1 * zq_s + zfac2 ) 
    236233                  t_s(ji,jj,jk,jl) = MIN( rtt, MAX( 173.15, t_s(ji,jj,jk,jl) ) )     ! 100-rtt < t_i < rtt 
    237234               END DO 
     
    248245            DO jj = 1, jpj 
    249246               DO ji = 1, jpi 
    250                   zindb = (  1._wp - MAX( 0._wp , SIGN( 1._wp , - vt_i(ji,jj) + epsi10 ) )  ) 
    251                   tm_i(ji,jj) = tm_i(ji,jj) + zindb * t_i(ji,jj,jk,jl) * v_i(ji,jj,jl)   & 
     247                  rswitch = (  1._wp - MAX( 0._wp , SIGN( 1._wp , - vt_i(ji,jj) + epsi10 ) )  ) 
     248                  tm_i(ji,jj) = tm_i(ji,jj) + rswitch * t_i(ji,jj,jk,jl) * v_i(ji,jj,jl)   & 
    252249                     &                      / (  REAL(nlay_i,wp) * MAX( vt_i(ji,jj) , epsi10 )  ) 
    253250               END DO 
     
    295292      INTEGER  ::   ji, jj, jk, jl   ! dummy loop index 
    296293      REAL(wp) ::   dummy_fac0, dummy_fac1, dummy_fac, zsal      ! local scalar 
    297       REAL(wp) ::   zind0, zind01, zindbal, zargtemp , zs_zero   !   -      - 
     294      REAL(wp) ::   zswi0, zswi01, zswibal, zargtemp , zs_zero   !   -      - 
    298295      REAL(wp), POINTER, DIMENSION(:,:,:) ::   z_slope_s, zalpha   ! 3D pointer 
    299296      !!------------------------------------------------------------------ 
     
    330327            DO jj = 1, jpj 
    331328               DO ji = 1, jpi 
    332                   ! zind0 = 1 if sm_i le s_i_0 and 0 otherwise 
    333                   zind0  = MAX( 0._wp   , SIGN( 1._wp  , s_i_0 - sm_i(ji,jj,jl) ) )  
    334                   ! zind01 = 1 if sm_i is between s_i_0 and s_i_1 and 0 othws  
    335                   zind01 = ( 1._wp - zind0 ) * MAX( 0._wp   , SIGN( 1._wp  , s_i_1 - sm_i(ji,jj,jl) ) )  
    336                   ! If 2.sm_i GE sss_m then zindbal = 1 
     329                  ! zswi0 = 1 if sm_i le s_i_0 and 0 otherwise 
     330                  zswi0  = MAX( 0._wp   , SIGN( 1._wp  , s_i_0 - sm_i(ji,jj,jl) ) )  
     331                  ! zswi01 = 1 if sm_i is between s_i_0 and s_i_1 and 0 othws  
     332                  zswi01 = ( 1._wp - zswi0 ) * MAX( 0._wp   , SIGN( 1._wp  , s_i_1 - sm_i(ji,jj,jl) ) )  
     333                  ! If 2.sm_i GE sss_m then zswibal = 1 
    337334                  ! this is to force a constant salinity profile in the Baltic Sea 
    338                   zindbal = MAX( 0._wp , SIGN( 1._wp , 2._wp * sm_i(ji,jj,jl) - sss_m(ji,jj) ) ) 
    339                   zalpha(ji,jj,jl) = zind0  + zind01 * ( sm_i(ji,jj,jl) * dummy_fac0 + dummy_fac1 ) 
    340                   zalpha(ji,jj,jl) = zalpha(ji,jj,jl) * ( 1._wp - zindbal ) 
     335                  zswibal = MAX( 0._wp , SIGN( 1._wp , 2._wp * sm_i(ji,jj,jl) - sss_m(ji,jj) ) ) 
     336                  zalpha(ji,jj,jl) = zswi0  + zswi01 * ( sm_i(ji,jj,jl) * dummy_fac0 + dummy_fac1 ) 
     337                  zalpha(ji,jj,jl) = zalpha(ji,jj,jl) * ( 1._wp - zswibal ) 
    341338               END DO 
    342339            END DO 
     
    390387      !!------------------------------------------------------------------ 
    391388      INTEGER  ::   ji, jj, jk, jl   ! dummy loop indices 
    392       REAL(wp) ::   zindb   !   -      - 
    393389      !!------------------------------------------------------------------ 
    394390 
     
    399395            DO jj = 1, jpj 
    400396               DO ji = 1, jpi 
    401                   zindb = (  1._wp - MAX( 0._wp , SIGN( 1._wp , - vt_i(ji,jj) + epsi10 ) )  ) 
    402                   tm_i(ji,jj) = tm_i(ji,jj) + zindb * t_i(ji,jj,jk,jl) * v_i(ji,jj,jl)   & 
     397                  rswitch = (  1._wp - MAX( 0._wp , SIGN( 1._wp , - vt_i(ji,jj) + epsi10 ) )  ) 
     398                  tm_i(ji,jj) = tm_i(ji,jj) + rswitch * t_i(ji,jj,jk,jl) * v_i(ji,jj,jl)   & 
    403399                     &                      / (  REAL(nlay_i,wp) * MAX( vt_i(ji,jj) , epsi10 )  ) 
    404400               END DO 
     
    421417      !!------------------------------------------------------------------ 
    422418      INTEGER  ::   ji, jj, jk, jl   ! dummy loop indices 
    423       REAL(wp) ::   zbvi, zinda, zindb      ! local scalars 
     419      REAL(wp) ::   zbvi             ! local scalars 
    424420      !!------------------------------------------------------------------ 
    425421      ! 
     
    429425            DO jj = 1, jpj 
    430426               DO ji = 1, jpi 
    431                   zinda = (  1._wp - MAX( 0._wp , SIGN( 1._wp , (t_i(ji,jj,jk,jl) - rtt) + epsi10 ) )  ) 
    432                   zindb = (  1._wp - MAX( 0._wp , SIGN( 1._wp , - vt_i(ji,jj) + epsi10 ) )  ) 
    433                   zbvi  = - zinda * tmut * s_i(ji,jj,jk,jl) / MIN( t_i(ji,jj,jk,jl) - rtt, - epsi10 )   & 
     427                  rswitch = (  1._wp - MAX( 0._wp , SIGN( 1._wp , (t_i(ji,jj,jk,jl) - rtt) + epsi10 ) )  ) 
     428                  zbvi  = - rswitch * tmut * s_i(ji,jj,jk,jl) / MIN( t_i(ji,jj,jk,jl) - rtt, - epsi10 )   & 
    434429                     &                   * v_i(ji,jj,jl)    / REAL(nlay_i,wp) 
    435                   bv_i(ji,jj) = bv_i(ji,jj) + zindb * zbvi  / MAX( vt_i(ji,jj) , epsi10 ) 
     430                  rswitch = (  1._wp - MAX( 0._wp , SIGN( 1._wp , - vt_i(ji,jj) + epsi10 ) )  ) 
     431                  bv_i(ji,jj) = bv_i(ji,jj) + rswitch * zbvi  / MAX( vt_i(ji,jj) , epsi10 ) 
    436432               END DO 
    437433            END DO 
     
    454450      INTEGER  ::   ii, ij  ! local integers 
    455451      REAL(wp) ::   dummy_fac0, dummy_fac1, dummy_fac2, zargtemp, zsal   ! local scalars 
    456       REAL(wp) ::   zalpha, zind0, zind01, zindbal, zs_zero              !   -      - 
     452      REAL(wp) ::   zalpha, zswi0, zswi01, zswibal, zs_zero              !   -      - 
    457453      ! 
    458454      REAL(wp), POINTER, DIMENSION(:) ::   z_slope_s 
     
    464460      ! Vertically constant, constant in time 
    465461      !--------------------------------------- 
    466       IF( num_sal == 1 )   s_i_b(:,:) = bulk_sal 
     462      IF( num_sal == 1 )   s_i_1d(:,:) = bulk_sal 
    467463 
    468464      !------------------------------------------------------ 
     
    473469         ! 
    474470         DO ji = kideb, kiut          ! Slope of the linear profile zs_zero 
    475             z_slope_s(ji) = 2._wp * sm_i_b(ji) / MAX( epsi10 , ht_i_b(ji) ) 
     471            z_slope_s(ji) = 2._wp * sm_i_1d(ji) / MAX( epsi10 , ht_i_1d(ji) ) 
    476472         END DO 
    477473 
     
    488484               ii =  MOD( npb(ji) - 1 , jpi ) + 1 
    489485               ij =     ( npb(ji) - 1 ) / jpi + 1 
    490                ! zind0 = 1 if sm_i le s_i_0 and 0 otherwise 
    491                zind0  = MAX( 0._wp , SIGN( 1._wp  , s_i_0 - sm_i_b(ji) ) )  
    492                ! zind01 = 1 if sm_i is between s_i_0 and s_i_1 and 0 othws  
    493                zind01 = ( 1._wp - zind0 ) * MAX( 0._wp , SIGN( 1._wp , s_i_1 - sm_i_b(ji) ) )  
    494                ! if 2.sm_i GE sss_m then zindbal = 1 
     486               ! zswi0 = 1 if sm_i le s_i_0 and 0 otherwise 
     487               zswi0  = MAX( 0._wp , SIGN( 1._wp  , s_i_0 - sm_i_1d(ji) ) )  
     488               ! zswi01 = 1 if sm_i is between s_i_0 and s_i_1 and 0 othws  
     489               zswi01 = ( 1._wp - zswi0 ) * MAX( 0._wp , SIGN( 1._wp , s_i_1 - sm_i_1d(ji) ) )  
     490               ! if 2.sm_i GE sss_m then zswibal = 1 
    495491               ! this is to force a constant salinity profile in the Baltic Sea 
    496                zindbal = MAX( 0._wp , SIGN( 1._wp , 2._wp * sm_i_b(ji) - sss_m(ii,ij) ) ) 
     492               zswibal = MAX( 0._wp , SIGN( 1._wp , 2._wp * sm_i_1d(ji) - sss_m(ii,ij) ) ) 
    497493               ! 
    498                zalpha = (  zind0 + zind01 * ( sm_i_b(ji) * dummy_fac0 + dummy_fac1 )  ) * ( 1.0 - zindbal ) 
     494               zalpha = (  zswi0 + zswi01 * ( sm_i_1d(ji) * dummy_fac0 + dummy_fac1 )  ) * ( 1.0 - zswibal ) 
    499495               ! 
    500                zs_zero = z_slope_s(ji) * ( REAL(jk,wp) - 0.5_wp ) * ht_i_b(ji) * dummy_fac2 
     496               zs_zero = z_slope_s(ji) * ( REAL(jk,wp) - 0.5_wp ) * ht_i_1d(ji) * dummy_fac2 
    501497               ! weighting the profile 
    502                s_i_b(ji,jk) = zalpha * zs_zero + ( 1._wp - zalpha ) * sm_i_b(ji) 
     498               s_i_1d(ji,jk) = zalpha * zs_zero + ( 1._wp - zalpha ) * sm_i_1d(ji) 
    503499            END DO ! ji 
    504500         END DO ! jk 
     
    512508      IF( num_sal == 3 ) THEN      ! Schwarzacher (1959) multiyear salinity profile (mean = 2.30) 
    513509         ! 
    514          sm_i_b(:) = 2.30_wp 
     510         sm_i_1d(:) = 2.30_wp 
    515511         ! 
    516512!CDIR NOVERRCHK 
     
    519515            zsal =  1.6_wp * (  1._wp - COS( rpi * zargtemp**(0.407_wp/(0.573_wp+zargtemp)) )  ) 
    520516            DO ji = kideb, kiut 
    521                s_i_b(ji,jk) = zsal 
     517               s_i_1d(ji,jk) = zsal 
    522518            END DO 
    523519         END DO 
  • branches/2014/dev_r4650_UKMO11_restart_functionality/NEMOGCM/NEMO/LIM_SRC_3/limwri.F90

    r4688 r5208  
    3535   PUBLIC lim_wri_state  ! called by dia_wri_state  
    3636 
    37    REAL(wp)  ::   epsi06 = 1.e-6_wp 
    3837   !!---------------------------------------------------------------------- 
    3938   !! NEMO/LIM3 4.0 , UCL - NEMO Consortium (2011) 
     
    5958      INTEGER, INTENT(in) ::   kindic   ! if kindic < 0 there has been an error somewhere 
    6059      ! 
    61       INTEGER ::  ji, jj, jk, jl  ! dummy loop indices 
    62       REAL(wp) ::  zinda, zindb, z1_365 
    63       REAL(wp), POINTER, DIMENSION(:,:,:) ::   zoi, zei 
    64       REAL(wp), POINTER, DIMENSION(:,:)   :: z2d, z2da, z2db, zind    ! 2D workspace 
     60      INTEGER  ::  ji, jj, jk, jl  ! dummy loop indices 
     61      REAL(wp) ::  z1_365 
     62      REAL(wp) ::  ztmp 
     63      REAL(wp), POINTER, DIMENSION(:,:,:) ::  zoi, zei 
     64      REAL(wp), POINTER, DIMENSION(:,:)   ::  z2d, z2da, z2db, zswi    ! 2D workspace 
    6565      !!------------------------------------------------------------------- 
    6666 
     
    6868 
    6969      CALL wrk_alloc( jpi, jpj, jpl, zoi, zei ) 
    70       CALL wrk_alloc( jpi, jpj     , z2d, z2da, z2db, zind ) 
     70      CALL wrk_alloc( jpi, jpj     , z2d, z2da, z2db, zswi ) 
    7171 
    7272      !----------------------------- 
     
    8080      DO jj = 1, jpj          ! presence indicator of ice 
    8181         DO ji = 1, jpi 
    82             zind(ji,jj)  = MAX( 0._wp , SIGN( 1._wp , at_i(ji,jj) - epsi06 ) ) 
     82            zswi(ji,jj)  = MAX( 0._wp , SIGN( 1._wp , at_i(ji,jj) - epsi06 ) ) 
    8383         END DO 
    8484      END DO 
     
    8989         DO jj = 1, jpj  
    9090            DO ji = 1, jpi 
    91                z2d(ji,jj)  = vt_i(ji,jj) / MAX( at_i(ji,jj), epsi06 ) * zind(ji,jj) 
     91               z2d(ji,jj)  = vt_i(ji,jj) / MAX( at_i(ji,jj), epsi06 ) * zswi(ji,jj) 
    9292            END DO 
    9393         END DO 
     
    9898         DO jj = 1, jpj                                             
    9999            DO ji = 1, jpi 
    100                z2d(ji,jj)  = vt_s(ji,jj) / MAX( at_i(ji,jj), epsi06 ) * zind(ji,jj) 
     100               z2d(ji,jj)  = vt_s(ji,jj) / MAX( at_i(ji,jj), epsi06 ) * zswi(ji,jj) 
    101101            END DO 
    102102         END DO 
     
    128128            DO jj = 1, jpj 
    129129               DO ji = 1, jpi 
    130                   z2d(ji,jj) = z2d(ji,jj) + zind(ji,jj) * oa_i(ji,jj,jl) 
     130                  z2d(ji,jj) = z2d(ji,jj) + zswi(ji,jj) * oa_i(ji,jj,jl) 
    131131               END DO 
    132132            END DO 
     
    139139         DO jj = 1, jpj 
    140140            DO ji = 1, jpi 
    141                z2d(ji,jj) = ( tm_i(ji,jj) - rtt ) * zind(ji,jj) 
     141               z2d(ji,jj) = ( tm_i(ji,jj) - rtt ) * zswi(ji,jj) 
    142142            END DO 
    143143         END DO 
     
    150150            DO jj = 1, jpj 
    151151               DO ji = 1, jpi 
    152                   z2d(ji,jj) = z2d(ji,jj) + zind(ji,jj) * ( t_su(ji,jj,jl) - rtt ) * a_i(ji,jj,jl) / MAX( at_i(ji,jj) , epsi06 ) 
     152                  z2d(ji,jj) = z2d(ji,jj) + zswi(ji,jj) * ( t_su(ji,jj,jl) - rtt ) * a_i(ji,jj,jl) / MAX( at_i(ji,jj) , epsi06 ) 
    153153               END DO 
    154154            END DO 
     
    160160         DO jj = 1, jpj 
    161161            DO ji = 1, jpi 
    162                zindb  = MAX( 0._wp , SIGN( 1._wp , at_i(ji,jj) ) ) 
    163                z2d(ji,jj) = hicol(ji,jj) * zindb 
     162               rswitch  = MAX( 0._wp , SIGN( 1._wp , at_i(ji,jj) ) ) 
     163               z2d(ji,jj) = hicol(ji,jj) * rswitch 
    164164            END DO 
    165165         END DO 
     
    199199      CALL iom_put( "sfx"         , sfx     * rday      )        ! total salt flux 
    200200 
    201       CALL iom_put( "vfxres"     , wfx_res * rday / rhoic  )        ! daily prod./melting due to limupdate  
    202       CALL iom_put( "vfxopw"     , wfx_opw * rday / rhoic  )        ! daily lateral thermodynamic ice production 
    203       CALL iom_put( "vfxsni"     , wfx_sni * rday / rhoic  )        ! daily snowice ice production 
    204       CALL iom_put( "vfxbog"     , wfx_bog * rday / rhoic  )       ! daily bottom thermodynamic ice production 
    205       CALL iom_put( "vfxdyn"     , wfx_dyn * rday / rhoic  )       ! daily dynamic ice production (rid/raft) 
    206       CALL iom_put( "vfxsum"     , wfx_sum * rday / rhoic  )        ! surface melt  
    207       CALL iom_put( "vfxbom"     , wfx_bom * rday / rhoic  )        ! bottom melt  
    208       CALL iom_put( "vfxice"     , wfx_ice * rday / rhoic  )        ! total ice growth/melt  
    209       CALL iom_put( "vfxsnw"     , wfx_snw * rday / rhoic  )        ! total snw growth/melt  
    210       CALL iom_put( "vfxsub"     , wfx_sub * rday / rhoic  )        ! sublimation (snow)  
    211       CALL iom_put( "vfxspr"     , wfx_spr * rday / rhoic  )        ! precip (snow)  
     201      ztmp = rday / rhoic 
     202      CALL iom_put( "vfxres"     , wfx_res * ztmp  )             ! daily prod./melting due to limupdate  
     203      CALL iom_put( "vfxopw"     , wfx_opw * ztmp  )             ! daily lateral thermodynamic ice production 
     204      CALL iom_put( "vfxsni"     , wfx_sni * ztmp  )             ! daily snowice ice production 
     205      CALL iom_put( "vfxbog"     , wfx_bog * ztmp  )             ! daily bottom thermodynamic ice production 
     206      CALL iom_put( "vfxdyn"     , wfx_dyn * ztmp  )             ! daily dynamic ice production (rid/raft) 
     207      CALL iom_put( "vfxsum"     , wfx_sum * ztmp  )             ! surface melt  
     208      CALL iom_put( "vfxbom"     , wfx_bom * ztmp  )             ! bottom melt  
     209      CALL iom_put( "vfxice"     , wfx_ice * ztmp  )             ! total ice growth/melt  
     210      CALL iom_put( "vfxsnw"     , wfx_snw * ztmp  )             ! total snw growth/melt  
     211      CALL iom_put( "vfxsub"     , wfx_sub * ztmp  )             ! sublimation (snow)  
     212      CALL iom_put( "vfxspr"     , wfx_spr * ztmp  )             ! precip (snow)  
    212213 
    213214      CALL iom_put ('hfxthd', hfx_thd(:,:) )   !   
     
    243244            DO jj = 1, jpj 
    244245               DO ji = 1, jpi 
    245                   zinda = MAX( 0._wp , SIGN( 1._wp , a_i(ji,jj,jl) - epsi06 ) ) 
    246                   zoi(ji,jj,jl) = oa_i(ji,jj,jl)  / MAX( a_i(ji,jj,jl) , epsi06 ) * zinda 
     246                  rswitch = MAX( 0._wp , SIGN( 1._wp , a_i(ji,jj,jl) - epsi06 ) ) 
     247                  zoi(ji,jj,jl) = oa_i(ji,jj,jl)  / MAX( a_i(ji,jj,jl) , epsi06 ) * rswitch 
    247248               END DO 
    248249            END DO 
     
    258259               DO jj = 1, jpj 
    259260                  DO ji = 1, jpi 
    260                      zinda = MAX( 0._wp , SIGN( 1._wp , a_i(ji,jj,jl) - epsi06 ) ) 
     261                     rswitch = MAX( 0._wp , SIGN( 1._wp , a_i(ji,jj,jl) - epsi06 ) ) 
    261262                     zei(ji,jj,jl) = zei(ji,jj,jl) + 100.0* & 
    262263                        ( - tmut * s_i(ji,jj,jk,jl) / MIN( ( t_i(ji,jj,jk,jl) - rtt ), - epsi06 ) ) * & 
    263                         zinda / nlay_i 
     264                        rswitch / nlay_i 
    264265                  END DO 
    265266               END DO 
     
    274275       
    275276      CALL wrk_dealloc( jpi, jpj, jpl, zoi, zei ) 
    276       CALL wrk_dealloc( jpi, jpj     , z2d, zind, z2da, z2db ) 
     277      CALL wrk_dealloc( jpi, jpj     , z2d, zswi, z2da, z2db ) 
    277278 
    278279      IF( nn_timing == 1 )  CALL timing_stop('limwri') 
     
    298299      !!---------------------------------------------------------------------- 
    299300 
    300       CALL histdef( kid, "iicethic", "Ice thickness"           , "m"      , jpi, jpj, kh_i, 1, 1, 1, -99, 32, "inst(x)", rdt, rdt ) 
    301       CALL histdef( kid, "iiceconc", "Ice concentration"       , "%"      , jpi, jpj, kh_i, 1, 1, 1, -99, 32, "inst(x)", rdt, rdt ) 
    302       CALL histdef( kid, "iicetemp", "Ice temperature"         , "C"      , jpi, jpj, kh_i, 1, 1, 1, -99, 32, "inst(x)", rdt, rdt ) 
    303       CALL histdef( kid, "iicevelu", "i-Ice speed (I-point)"   , "m/s"    , jpi, jpj, kh_i, 1, 1, 1, -99, 32, "inst(x)", rdt, rdt ) 
    304       CALL histdef( kid, "iicevelv", "j-Ice speed (I-point)"   , "m/s"    , jpi, jpj, kh_i, 1, 1, 1, -99, 32, "inst(x)", rdt, rdt )  
    305       CALL histdef( kid, "iicestru", "i-Wind stress over ice (I-pt)", "Pa", jpi, jpj, kh_i, 1, 1, 1, -99, 32, "inst(x)", rdt, rdt ) 
    306       CALL histdef( kid, "iicestrv", "j-Wind stress over ice (I-pt)", "Pa", jpi, jpj, kh_i, 1, 1, 1, -99, 32, "inst(x)", rdt, rdt )  
    307       CALL histdef( kid, "iicesflx", "Solar flux over ocean"     , "w/m2"   , jpi, jpj, kh_i, 1, 1, 1, -99, 32, "inst(x)", rdt, rdt )  
    308       CALL histdef( kid, "iicenflx", "Non-solar flux over ocean" , "w/m2"   , jpi, jpj, kh_i, 1, 1, 1, -99, 32, "inst(x)", rdt, rdt ) 
    309       CALL histdef( kid, "isnowpre", "Snow precipitation"      , "kg/m2/s", jpi, jpj, kh_i, 1, 1, 1, -99, 32, "inst(x)", rdt, rdt )  
    310       CALL histdef( kid, "iicesali", "Ice salinity"            , "PSU"    , jpi, jpj, kh_i, 1, 1, 1, -99, 32, "inst(x)", rdt, rdt )  
    311       CALL histdef( kid, "iicevolu", "Ice volume"              , "m"      , jpi, jpj, kh_i, 1, 1, 1, -99, 32, "inst(x)", rdt, rdt )  
    312       CALL histdef( kid, "iicedive", "Ice divergence"          , "10-8s-1", jpi, jpj, kh_i, 1, 1, 1, -99, 32, "inst(x)", rdt, rdt )  
    313       CALL histdef( kid, "iicebopr", "Ice bottom production"   , "m/s"      , jpi, jpj, kh_i, 1, 1, 1, -99, 32, "inst(x)", rdt, rdt ) 
    314       CALL histdef( kid, "iicedypr", "Ice dynamic production"  , "m/s"      , jpi, jpj, kh_i, 1, 1, 1, -99, 32, "inst(x)", rdt, rdt ) 
    315       CALL histdef( kid, "iicelapr", "Ice open water prod"     , "m/s"      , jpi, jpj, kh_i, 1, 1, 1, -99, 32, "inst(x)", rdt, rdt ) 
    316       CALL histdef( kid, "iicesipr", "Snow ice production "    , "m/s"      , jpi, jpj, kh_i, 1, 1, 1, -99, 32, "inst(x)", rdt, rdt ) 
    317       CALL histdef( kid, "iicerepr", "Ice prod from limupdate" , "m/s"      , jpi, jpj, kh_i, 1, 1, 1, -99, 32, "inst(x)", rdt, rdt ) 
    318       CALL histdef( kid, "iicebome", "Ice bottom melt"         , "m/s"      , jpi, jpj, kh_i, 1, 1, 1, -99, 32, "inst(x)", rdt, rdt ) 
    319       CALL histdef( kid, "iicesume", "Ice surface melt"        , "m/s"      , jpi, jpj, kh_i, 1, 1, 1, -99, 32, "inst(x)", rdt, rdt ) 
    320       CALL histdef( kid, "iisfxdyn", "Salt flux from dynmics"  , ""      , jpi, jpj, kh_i, 1, 1, 1, -99, 32, "inst(x)", rdt, rdt ) 
    321       CALL histdef( kid, "iisfxres", "Salt flux from limupdate", ""      , jpi, jpj, kh_i, 1, 1, 1, -99, 32, "inst(x)", rdt, rdt ) 
     301      CALL histdef( kid, "iicethic", "Ice thickness"           , "m"      ,   & 
     302      &      jpi, jpj, kh_i, 1, 1, 1, -99, 32, "inst(x)", rdt, rdt ) 
     303      CALL histdef( kid, "iiceconc", "Ice concentration"       , "%"      ,   & 
     304      &      jpi, jpj, kh_i, 1, 1, 1, -99, 32, "inst(x)", rdt, rdt ) 
     305      CALL histdef( kid, "iicetemp", "Ice temperature"         , "C"      ,   & 
     306      &      jpi, jpj, kh_i, 1, 1, 1, -99, 32, "inst(x)", rdt, rdt ) 
     307      CALL histdef( kid, "iicevelu", "i-Ice speed (I-point)"   , "m/s"    ,   & 
     308      &      jpi, jpj, kh_i, 1, 1, 1, -99, 32, "inst(x)", rdt, rdt ) 
     309      CALL histdef( kid, "iicevelv", "j-Ice speed (I-point)"   , "m/s"    ,   & 
     310      &      jpi, jpj, kh_i, 1, 1, 1, -99, 32, "inst(x)", rdt, rdt )  
     311      CALL histdef( kid, "iicestru", "i-Wind stress over ice (I-pt)", "Pa",   & 
     312      &      jpi, jpj, kh_i, 1, 1, 1, -99, 32, "inst(x)", rdt, rdt ) 
     313      CALL histdef( kid, "iicestrv", "j-Wind stress over ice (I-pt)", "Pa",   & 
     314      &      jpi, jpj, kh_i, 1, 1, 1, -99, 32, "inst(x)", rdt, rdt )  
     315      CALL histdef( kid, "iicesflx", "Solar flux over ocean"     , "w/m2" ,   & 
     316      &      jpi, jpj, kh_i, 1, 1, 1, -99, 32, "inst(x)", rdt, rdt )  
     317      CALL histdef( kid, "iicenflx", "Non-solar flux over ocean" , "w/m2" ,   & 
     318      &      jpi, jpj, kh_i, 1, 1, 1, -99, 32, "inst(x)", rdt, rdt ) 
     319      CALL histdef( kid, "isnowpre", "Snow precipitation"      , "kg/m2/s",   & 
     320      &      jpi, jpj, kh_i, 1, 1, 1, -99, 32, "inst(x)", rdt, rdt )  
     321      CALL histdef( kid, "iicesali", "Ice salinity"            , "PSU"    ,   & 
     322      &      jpi, jpj, kh_i, 1, 1, 1, -99, 32, "inst(x)", rdt, rdt )  
     323      CALL histdef( kid, "iicevolu", "Ice volume"              , "m"      ,   & 
     324      &      jpi, jpj, kh_i, 1, 1, 1, -99, 32, "inst(x)", rdt, rdt )  
     325      CALL histdef( kid, "iicedive", "Ice divergence"          , "10-8s-1",   & 
     326      &      jpi, jpj, kh_i, 1, 1, 1, -99, 32, "inst(x)", rdt, rdt )  
     327      CALL histdef( kid, "iicebopr", "Ice bottom production"   , "m/s"    ,   & 
     328      &      jpi, jpj, kh_i, 1, 1, 1, -99, 32, "inst(x)", rdt, rdt ) 
     329      CALL histdef( kid, "iicedypr", "Ice dynamic production"  , "m/s"    ,   & 
     330      &      jpi, jpj, kh_i, 1, 1, 1, -99, 32, "inst(x)", rdt, rdt ) 
     331      CALL histdef( kid, "iicelapr", "Ice open water prod"     , "m/s"    ,   & 
     332      &       jpi, jpj, kh_i, 1, 1, 1, -99, 32, "inst(x)", rdt, rdt ) 
     333      CALL histdef( kid, "iicesipr", "Snow ice production "    , "m/s"    ,   & 
     334      &      jpi, jpj, kh_i, 1, 1, 1, -99, 32, "inst(x)", rdt, rdt ) 
     335      CALL histdef( kid, "iicerepr", "Ice prod from limupdate" , "m/s"    ,   & 
     336      &      jpi, jpj, kh_i, 1, 1, 1, -99, 32, "inst(x)", rdt, rdt ) 
     337      CALL histdef( kid, "iicebome", "Ice bottom melt"         , "m/s"    ,   & 
     338      &      jpi, jpj, kh_i, 1, 1, 1, -99, 32, "inst(x)", rdt, rdt ) 
     339      CALL histdef( kid, "iicesume", "Ice surface melt"        , "m/s"    ,   & 
     340      &      jpi, jpj, kh_i, 1, 1, 1, -99, 32, "inst(x)", rdt, rdt ) 
     341      CALL histdef( kid, "iisfxdyn", "Salt flux from dynmics"  , ""       ,   & 
     342      &      jpi, jpj, kh_i, 1, 1, 1, -99, 32, "inst(x)", rdt, rdt ) 
     343      CALL histdef( kid, "iisfxres", "Salt flux from limupdate", ""       ,   & 
     344      &      jpi, jpj, kh_i, 1, 1, 1, -99, 32, "inst(x)", rdt, rdt ) 
    322345 
    323346      CALL histend( kid, snc4set )   ! end of the file definition 
  • branches/2014/dev_r4650_UKMO11_restart_functionality/NEMOGCM/NEMO/LIM_SRC_3/par_ice.F90

    r4688 r5208  
    1212 
    1313   !                                             !!! ice thermodynamics 
    14    INTEGER, PUBLIC, PARAMETER ::   jkmax    = 6   !: maximum number of ice layers 
    1514   INTEGER, PUBLIC, PARAMETER ::   nlay_i   = 5   !: number of ice layers 
    1615   INTEGER, PUBLIC, PARAMETER ::   nlay_s   = 1   !: number of snow layers 
     
    1817   !                                             !!! ice mechanical redistribution 
    1918   INTEGER, PUBLIC, PARAMETER ::   jpl      = 5   !: number of ice categories 
    20    INTEGER, PUBLIC, PARAMETER ::   jpm      = 1   !: number of ice types 
    2119 
    2220   !!---------------------------------------------------------------------- 
  • branches/2014/dev_r4650_UKMO11_restart_functionality/NEMOGCM/NEMO/LIM_SRC_3/thd_ice.F90

    r4688 r5208  
    3434   !!----------------------------- 
    3535   !: In ice thermodynamics, to spare memory, the vectors are folded 
    36    !: from 1D to 2D vectors. The following variables, with ending _1d (or _b) 
     36   !: from 1D to 2D vectors. The following variables, with ending _1d 
    3737   !: are the variables corresponding to 2d vectors 
    3838 
     
    4040   INTEGER , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   npac   !: correspondance between points (lateral accretion) 
    4141 
    42    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   qlead_1d      !: <==> the 2D  qlead 
    43    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   ftr_ice_1d    !: <==> the 2D  ftr_ice 
    44    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   qsr_ice_1d    !: <==> the 2D  qsr_ice 
    45    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   fr1_i0_1d     !: <==> the 2D  fr1_i0 
    46    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   fr2_i0_1d     !: <==> the 2D  fr2_i0 
    47    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   qns_ice_1d    !: <==> the 2D  qns_ice 
    48    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   t_bo_b        !: <==> the 2D  t_bo 
     42   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   qlead_1d      
     43   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   ftr_ice_1d    
     44   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   qsr_ice_1d   
     45   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   fr1_i0_1d    
     46   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   fr2_i0_1d    
     47   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   qns_ice_1d   
     48   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   t_bo_1d      
    4949 
    5050   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   hfx_sum_1d 
     
    6565   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   hfx_res_1d 
    6666 
    67    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   wfx_ice_1d    !: <==> the 2D  wfx_ice 
    68    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   wfx_snw_1d    !: <==> the 2D  wfx_snw 
    69    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   wfx_sub_1d    !: <==> the 2D  wfx_sub 
     67   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   wfx_snw_1d  
     68   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   wfx_sub_1d 
    7069 
    71    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   wfx_bog_1d    !: <==> the 2D  wfx_ice 
    72    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   wfx_bom_1d    !: <==> the 2D  wfx_ice 
    73    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   wfx_sum_1d    !: <==> the 2D  wfx_ice 
    74    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   wfx_sni_1d    !: <==> the 2D  wfx_ice 
    75    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   wfx_opw_1d    !: <==> the 2D  wfx_ice 
    76    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   wfx_res_1d    !: <==> the 2D  wfx_ice 
    77    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   wfx_spr_1d    !: <==> the 2D  wfx_ice 
     70   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   wfx_bog_1d     
     71   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   wfx_bom_1d    
     72   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   wfx_sum_1d   
     73   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   wfx_sni_1d  
     74   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   wfx_opw_1d 
     75   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   wfx_res_1d  
     76   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   wfx_spr_1d 
    7877 
    79    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   sfx_bri_1d    !: <==> the 2D sfx_bri 
    80    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   sfx_bog_1d    !:  
    81    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   sfx_bom_1d    !:  
    82    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   sfx_sum_1d    !:  
    83    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   sfx_sni_1d    !:  
    84    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   sfx_opw_1d    !: 
    85    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   sfx_res_1d    !: 
     78   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   sfx_bri_1d 
     79   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   sfx_bog_1d     
     80   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   sfx_bom_1d     
     81   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   sfx_sum_1d     
     82   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   sfx_sni_1d     
     83   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   sfx_opw_1d    
     84   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   sfx_res_1d   
    8685 
    8786   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   sprecip_1d    !: <==> the 2D  sprecip 
    8887   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   frld_1d       !: <==> the 2D  frld 
    89    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   at_i_b        !: <==> the 2D  at_i 
    90    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   fhtur_1d       !: <==> the 2D  fhtur 
     88   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   at_i_1d        !: <==> the 2D  at_i 
     89   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   fhtur_1d      !: <==> the 2D  fhtur 
    9190   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   fhld_1d       !: <==> the 2D  fhld 
    9291   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   dqns_ice_1d   !: <==> the 2D  dqns_ice 
     
    10099   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   dsm_i_se_1d   !: Ice salinity variations due to basal salt entrapment 
    101100   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   dsm_i_si_1d   !: Ice salinity variations due to lateral accretion     
    102    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   hicol_b       !: Ice collection thickness accumulated in fleads 
     101   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   hicol_1d      !: Ice collection thickness accumulated in leads 
    103102 
    104    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   t_su_b      !: <==> the 2D  t_su 
    105    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   a_i_b       !: <==> the 2D  a_i 
    106    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   ht_i_b      !: <==> the 2D  ht_s 
    107    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   ht_s_b      !: <==> the 2D  ht_i 
    108    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   fc_su       !: Surface Conduction flux  
    109    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   fc_bo_i     !: Bottom  Conduction flux  
    110    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   dh_s_tot    !: Snow accretion/ablation        [m] 
    111    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   dh_i_surf   !: Ice surface accretion/ablation [m] 
    112    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   dh_i_bott   !: Ice bottom accretion/ablation  [m] 
    113    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   dh_snowice  !: Snow ice formation             [m of ice] 
    114    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   sm_i_b      !: Ice bulk salinity [ppt] 
    115    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   s_i_new     !: Salinity of new ice at the bottom 
     103   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   t_su_1d       !: <==> the 2D  t_su 
     104   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   a_i_1d        !: <==> the 2D  a_i 
     105   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   ht_i_1d       !: <==> the 2D  ht_s 
     106   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   ht_s_1d       !: <==> the 2D  ht_i 
     107   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   fc_su         !: Surface Conduction flux  
     108   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   fc_bo_i       !: Bottom  Conduction flux  
     109   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   dh_s_tot      !: Snow accretion/ablation        [m] 
     110   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   dh_i_surf     !: Ice surface accretion/ablation [m] 
     111   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   dh_i_bott     !: Ice bottom accretion/ablation  [m] 
     112   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   dh_snowice    !: Snow ice formation             [m of ice] 
     113   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   sm_i_1d       !: Ice bulk salinity [ppt] 
     114   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   s_i_new       !: Salinity of new ice at the bottom 
    116115 
    117    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   iatte_1d   !: clem attenuation coef of the input solar flux (unitless) 
    118    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   oatte_1d   !: clem attenuation coef of the input solar flux (unitless) 
     116   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   t_s_1d   !: corresponding to the 2D var  t_s 
     117   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   t_i_1d   !: corresponding to the 2D var  t_i 
     118   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   s_i_1d   !: profiled ice salinity 
     119   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   q_i_1d   !:    Ice  enthalpy per unit volume 
     120   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   q_s_1d   !:    Snow enthalpy per unit volume 
    119121 
    120    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   t_s_b   !: corresponding to the 2D var  t_s 
    121    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   t_i_b   !: corresponding to the 2D var  t_i 
    122    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   s_i_b   !: profiled ice salinity 
    123    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   q_i_b   !:    Ice  enthalpy per unit volume 
    124    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   q_s_b   !:    Snow enthalpy per unit volume 
    125  
    126    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   qh_i_old  !: ice heat content (q*h, J.m-2) 
    127    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   h_i_old   !: ice thickness layer (m) 
     122   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   qh_i_old !: ice heat content (q*h, J.m-2) 
     123   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   h_i_old  !: ice thickness layer (m) 
    128124 
    129125   INTEGER , PUBLIC ::   jiindex_1d   ! 1D index of debugging point 
     
    149145         &      qsr_ice_1d (jpij) ,     & 
    150146         &      fr1_i0_1d(jpij) , fr2_i0_1d(jpij) , qns_ice_1d(jpij) ,     & 
    151          &      t_bo_b   (jpij) , iatte_1d  (jpij) , oatte_1d (jpij) ,     & 
    152          &      hfx_sum_1d(jpij) , hfx_bom_1d(jpij) ,hfx_bog_1d(jpij) ,hfx_dif_1d(jpij) ,hfx_opw_1d(jpij) , & 
     147         &      t_bo_1d   (jpij) ,                                          & 
     148         &      hfx_sum_1d(jpij) , hfx_bom_1d(jpij) ,hfx_bog_1d(jpij) ,     &  
     149         &      hfx_dif_1d(jpij) ,hfx_opw_1d(jpij) , & 
    153150         &      hfx_thd_1d(jpij) , hfx_spr_1d(jpij) , & 
    154          &      hfx_snw_1d(jpij) , hfx_sub_1d(jpij) , hfx_err_1d(jpij) , hfx_res_1d(jpij) , hfx_err_rem_1d(jpij),       STAT=ierr(1) ) 
     151         &      hfx_snw_1d(jpij) , hfx_sub_1d(jpij) , hfx_err_1d(jpij) , & 
     152         &      hfx_res_1d(jpij) , hfx_err_rem_1d(jpij),       STAT=ierr(1) ) 
    155153      ! 
    156       ALLOCATE( sprecip_1d (jpij) , frld_1d    (jpij) , at_i_b     (jpij) ,     & 
    157          &      fhtur_1d   (jpij) , wfx_ice_1d (jpij) , wfx_snw_1d (jpij) , wfx_spr_1d (jpij) ,     & 
    158          &      fhld_1d    (jpij) , wfx_sub_1d (jpij) , wfx_bog_1d(jpij) , wfx_bom_1d(jpij) , wfx_sum_1d(jpij) , wfx_sni_1d (jpij) , wfx_opw_1d (jpij) ,  wfx_res_1d (jpij) ,  & 
     154      ALLOCATE( sprecip_1d (jpij) , frld_1d    (jpij) , at_i_1d     (jpij) ,     & 
     155         &      fhtur_1d   (jpij) , wfx_snw_1d (jpij) , wfx_spr_1d (jpij) ,     & 
     156         &      fhld_1d    (jpij) , wfx_sub_1d (jpij) , wfx_bog_1d(jpij) , wfx_bom_1d(jpij) , & 
     157         &      wfx_sum_1d(jpij)  , wfx_sni_1d (jpij) , wfx_opw_1d (jpij) ,  wfx_res_1d (jpij) ,  & 
    159158         &      dqns_ice_1d(jpij) , qla_ice_1d (jpij) , dqla_ice_1d(jpij) ,     & 
    160159         &      tatm_ice_1d(jpij) ,      &    
    161160         &      i0         (jpij) ,     &   
    162          &      sfx_bri_1d (jpij) , sfx_bog_1d (jpij) , sfx_bom_1d (jpij) ,sfx_sum_1d (jpij) ,sfx_sni_1d (jpij) , sfx_opw_1d (jpij) , sfx_res_1d (jpij) , & 
     161         &      sfx_bri_1d (jpij) , sfx_bog_1d (jpij) , sfx_bom_1d (jpij) ,sfx_sum_1d (jpij) ,   & 
     162         &      sfx_sni_1d (jpij) , sfx_opw_1d (jpij) , sfx_res_1d (jpij) , & 
    163163         &      dsm_i_fl_1d(jpij) , dsm_i_gd_1d(jpij) , dsm_i_se_1d(jpij) ,     &      
    164          &      dsm_i_si_1d(jpij) , hicol_b    (jpij)                     , STAT=ierr(2) ) 
     164         &      dsm_i_si_1d(jpij) , hicol_1d    (jpij)                     , STAT=ierr(2) ) 
    165165      ! 
    166       ALLOCATE( t_su_b    (jpij) , a_i_b    (jpij) , ht_i_b   (jpij) ,    &    
    167          &      ht_s_b    (jpij) , fc_su    (jpij) , fc_bo_i  (jpij) ,    &     
     166      ALLOCATE( t_su_1d    (jpij) , a_i_1d    (jpij) , ht_i_1d   (jpij) ,    &    
     167         &      ht_s_1d    (jpij) , fc_su    (jpij) , fc_bo_i  (jpij) ,    &     
    168168         &      dh_s_tot  (jpij) , dh_i_surf(jpij) , dh_i_bott(jpij) ,    &     
    169          &      dh_snowice(jpij) , sm_i_b   (jpij) , s_i_new  (jpij) ,    & 
    170          &      t_s_b(jpij,nlay_s),                                       & 
    171          &      t_i_b(jpij,jkmax), s_i_b(jpij,jkmax)                ,     &             
    172          &      q_i_b(jpij,jkmax), q_s_b(jpij,jkmax)                ,     & 
    173          &      qh_i_old(jpij,0:jkmax), h_i_old(jpij,0:jkmax) , STAT=ierr(3)) 
     169         &      dh_snowice(jpij) , sm_i_1d   (jpij) , s_i_new  (jpij) ,    & 
     170         &      t_s_1d(jpij,nlay_s),                                       & 
     171         &      t_i_1d(jpij,nlay_i+1), s_i_1d(jpij,nlay_i+1)                ,     &             
     172         &      q_i_1d(jpij,nlay_i+1), q_s_1d(jpij,nlay_i+1)                ,     & 
     173         &      qh_i_old(jpij,0:nlay_i+1), h_i_old(jpij,0:nlay_i+1) , STAT=ierr(3)) 
    174174      ! 
    175175      thd_ice_alloc = MAXVAL( ierr ) 
Note: See TracChangeset for help on using the changeset viewer.