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 5709 for branches/UKMO/DEV_r5107_dynvor_updates/NEMOGCM/NEMO/LIM_SRC_3/limistate.F90 – NEMO

Ignore:
Timestamp:
2015-08-26T16:14:53+02:00 (9 years ago)
Author:
davestorkey
Message:

Updating UKMO/DEV_r5107_dynvor_updates branch to be relative to revision 5518 of the trunk
(= branching point for NEMO 3.6_STABLE).

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/UKMO/DEV_r5107_dynvor_updates/NEMOGCM/NEMO/LIM_SRC_3/limistate.F90

    r5256 r5709  
    2222   USE eosbn2           ! equation of state 
    2323   USE ice              ! sea-ice variables 
    24    USE par_ice          ! ice parameters 
    2524   USE par_oce          ! ocean parameters 
    2625   USE dom_ice          ! sea-ice domain 
     
    3635 
    3736   !                          !!** init namelist (namiceini) ** 
    38    REAL(wp) ::   thres_sst   ! threshold water temperature for initial sea ice 
    39    REAL(wp) ::   hts_ini_n   ! initial snow thickness in the north 
    40    REAL(wp) ::   hts_ini_s   ! initial snow thickness in the south 
    41    REAL(wp) ::   hti_ini_n   ! initial ice thickness in the north 
    42    REAL(wp) ::   hti_ini_s   ! initial ice thickness in the south 
    43    REAL(wp) ::   ati_ini_n   ! initial leads area in the north 
    44    REAL(wp) ::   ati_ini_s   ! initial leads area in the south 
    45    REAL(wp) ::   smi_ini_n   ! initial salinity  
    46    REAL(wp) ::   smi_ini_s   ! initial salinity 
    47    REAL(wp) ::   tmi_ini_n   ! initial temperature 
    48    REAL(wp) ::   tmi_ini_s   ! initial temperature 
    49  
    50    LOGICAL  ::  ln_limini    ! initialization or not 
     37   REAL(wp) ::   rn_thres_sst   ! threshold water temperature for initial sea ice 
     38   REAL(wp) ::   rn_hts_ini_n   ! initial snow thickness in the north 
     39   REAL(wp) ::   rn_hts_ini_s   ! initial snow thickness in the south 
     40   REAL(wp) ::   rn_hti_ini_n   ! initial ice thickness in the north 
     41   REAL(wp) ::   rn_hti_ini_s   ! initial ice thickness in the south 
     42   REAL(wp) ::   rn_ati_ini_n   ! initial leads area in the north 
     43   REAL(wp) ::   rn_ati_ini_s   ! initial leads area in the south 
     44   REAL(wp) ::   rn_smi_ini_n   ! initial salinity  
     45   REAL(wp) ::   rn_smi_ini_s   ! initial salinity 
     46   REAL(wp) ::   rn_tmi_ini_n   ! initial temperature 
     47   REAL(wp) ::   rn_tmi_ini_s   ! initial temperature 
     48 
     49   LOGICAL  ::  ln_iceini    ! initialization or not 
    5150   !!---------------------------------------------------------------------- 
    5251   !!   LIM 3.0,  UCL-LOCEAN-IPSL (2008) 
     
    8786      !! * Local variables 
    8887      INTEGER    :: ji, jj, jk, jl             ! dummy loop indices 
    89       REAL(wp)   :: epsi20, ztmelts, zdh 
     88      REAL(wp)   :: ztmelts, zdh 
    9089      INTEGER    :: i_hemis, i_fill, jl0   
    9190      REAL(wp)   :: ztest_1, ztest_2, ztest_3, ztest_4, ztests, zsigma, zarg, zA, zV, zA_cons, zV_cons, zconv 
     
    101100      CALL wrk_alloc(   2,      zht_i_ini, zat_i_ini, zvt_i_ini, zht_s_ini, zsm_i_ini, ztm_i_ini ) 
    102101 
    103       epsi20   = 1.e-20_wp 
    104  
    105102      IF(lwp) WRITE(numout,*) 
    106103      IF(lwp) WRITE(numout,*) 'lim_istate : Ice initialization ' 
     
    115112      ! surface temperature 
    116113      DO jl = 1, jpl ! loop over categories 
    117          t_su  (:,:,jl) = rtt * tms(:,:) 
    118          tn_ice(:,:,jl) = rtt * tms(:,:) 
     114         t_su  (:,:,jl) = rt0 * tmask(:,:,1) 
     115         tn_ice(:,:,jl) = rt0 * tmask(:,:,1) 
    119116      END DO 
    120117 
    121118      ! basal temperature (considered at freezing point) 
    122       t_bo(:,:) = ( eos_fzp( tsn(:,:,1,jp_sal) ) + rt0 ) * tms(:,:)  
    123  
    124       IF( ln_limini ) THEN 
     119      t_bo(:,:) = ( eos_fzp( sss_m(:,:) ) + rt0 ) * tmask(:,:,1)  
     120 
     121      IF( ln_iceini ) THEN 
    125122 
    126123      !-------------------------------------------------------------------- 
     
    130127      DO jj = 1, jpj                                       ! ice if sst <= t-freez + ttest 
    131128         DO ji = 1, jpi 
    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 
     129            IF( ( sst_m(ji,jj)  - ( t_bo(ji,jj) - rt0 ) ) * tmask(ji,jj,1) >= rn_thres_sst ) THEN  
     130               zswitch(ji,jj) = 0._wp * tmask(ji,jj,1)    ! no ice 
    134131            ELSE                                                                                    
    135                zswitch(ji,jj) = 1._wp * tms(ji,jj)    !    ice 
     132               zswitch(ji,jj) = 1._wp * tmask(ji,jj,1)    !    ice 
    136133            ENDIF 
    137134         END DO 
     
    158155      !----------------------------- 
    159156      ! assign initial thickness, concentration, snow depth and salinity to an hemisphere-dependent array 
    160       zht_i_ini(1) = hti_ini_n ; zht_i_ini(2) = hti_ini_s  ! ice thickness 
    161       zht_s_ini(1) = hts_ini_n ; zht_s_ini(2) = hts_ini_s  ! snow depth 
    162       zat_i_ini(1) = ati_ini_n ; zat_i_ini(2) = ati_ini_s  ! ice concentration 
    163       zsm_i_ini(1) = smi_ini_n ; zsm_i_ini(2) = smi_ini_s  ! bulk ice salinity 
    164       ztm_i_ini(1) = tmi_ini_n ; ztm_i_ini(2) = tmi_ini_s  ! temperature (ice and snow) 
     157      zht_i_ini(1) = rn_hti_ini_n ; zht_i_ini(2) = rn_hti_ini_s  ! ice thickness 
     158      zht_s_ini(1) = rn_hts_ini_n ; zht_s_ini(2) = rn_hts_ini_s  ! snow depth 
     159      zat_i_ini(1) = rn_ati_ini_n ; zat_i_ini(2) = rn_ati_ini_s  ! ice concentration 
     160      zsm_i_ini(1) = rn_smi_ini_n ; zsm_i_ini(2) = rn_smi_ini_s  ! bulk ice salinity 
     161      ztm_i_ini(1) = rn_tmi_ini_n ; ztm_i_ini(2) = rn_tmi_ini_s  ! temperature (ice and snow) 
    165162 
    166163      zvt_i_ini(:) = zht_i_ini(:) * zat_i_ini(:)   ! ice volume 
     
    197194               !--- Ice thicknesses in the i_fill - 1 first categories 
    198195               DO jl = 1, i_fill - 1 
    199                   zh_i_ini(jl,i_hemis)    = 0.5 * ( hi_max(jl) + hi_max(jl-1) ) 
     196                  zh_i_ini(jl,i_hemis) = hi_mean(jl) 
    200197               END DO 
    201198                
    202199               !--- jl0: most likely index where cc will be maximum 
    203200               DO jl = 1, jpl 
    204                   IF ( ( zht_i_ini(i_hemis) .GT. hi_max(jl-1) ) .AND. & 
    205                      ( zht_i_ini(i_hemis) .LE. hi_max(jl)   ) ) THEN 
     201                  IF ( ( zht_i_ini(i_hemis) > hi_max(jl-1) ) .AND. & 
     202                     & ( zht_i_ini(i_hemis) <= hi_max(jl)   ) ) THEN 
    206203                     jl0 = jl 
    207204                  ENDIF 
     
    267264 
    268265            ! Test 3: thickness of the last category is in-bounds ? 
    269             IF ( zh_i_ini(i_fill, i_hemis) .GT. hi_max(i_fill-1) ) THEN 
     266            IF ( zh_i_ini(i_fill, i_hemis) > hi_max(i_fill-1) ) THEN 
    270267               ztest_3 = 1 
    271268            ELSE 
     
    317314            DO ji = 1, jpi 
    318315               a_i(ji,jj,jl)   = zswitch(ji,jj) * za_i_ini (jl,zhemis(ji,jj))  ! concentration 
    319                ht_i(ji,jj,jl)  = zswitch(ji,jj) * zh_i_ini(jl,zhemis(ji,jj))  ! ice thickness 
     316               ht_i(ji,jj,jl)  = zswitch(ji,jj) * zh_i_ini(jl,zhemis(ji,jj))   ! ice thickness 
    320317               ht_s(ji,jj,jl)  = ht_i(ji,jj,jl) * ( zht_s_ini( zhemis(ji,jj) ) / zht_i_ini( zhemis(ji,jj) ) )  ! snow depth 
    321                sm_i(ji,jj,jl)  = zswitch(ji,jj) * zsm_i_ini(zhemis(ji,jj)) !+ ( 1._wp - zswitch(ji,jj) ) * s_i_min ! salinity 
    322                o_i(ji,jj,jl)   = zswitch(ji,jj) * 1._wp + ( 1._wp - zswitch(ji,jj) ) ! age 
    323                t_su(ji,jj,jl)  = zswitch(ji,jj) * ztm_i_ini(zhemis(ji,jj)) + ( 1._wp - zswitch(ji,jj) ) * rtt ! surf temp 
     318               sm_i(ji,jj,jl)  = zswitch(ji,jj) * zsm_i_ini(zhemis(ji,jj))     ! salinity 
     319               o_i(ji,jj,jl)   = zswitch(ji,jj) * 1._wp                        ! age (1 day) 
     320               t_su(ji,jj,jl)  = zswitch(ji,jj) * ztm_i_ini(zhemis(ji,jj)) + ( 1._wp - zswitch(ji,jj) ) * rt0 ! surf temp 
    324321 
    325322               ! This case below should not be used if (ht_s/ht_i) is ok in namelist 
     
    329326               ! recompute ht_i, ht_s avoiding out of bounds values 
    330327               ht_i(ji,jj,jl) = MIN( hi_max(jl), ht_i(ji,jj,jl) + zdh ) 
    331                ht_s(ji,jj,jl) = MAX( 0._wp, ht_s(ji,jj,jl) - zdh * rhoic / rhosn ) 
     328               ht_s(ji,jj,jl) = MAX( 0._wp, ht_s(ji,jj,jl) - zdh * rhoic * r1_rhosn ) 
    332329 
    333330               ! ice volume, salt content, age content 
     
    336333               smv_i(ji,jj,jl) = MIN( sm_i(ji,jj,jl) , sss_m(ji,jj) ) * v_i(ji,jj,jl) ! salt content 
    337334               oa_i(ji,jj,jl)  = o_i(ji,jj,jl) * a_i(ji,jj,jl)               ! age content 
    338             END DO ! ji 
    339          END DO ! jj 
    340       END DO ! jl 
     335            END DO 
     336         END DO 
     337      END DO 
    341338 
    342339      ! Snow temperature and heat content 
     
    345342            DO jj = 1, jpj 
    346343               DO ji = 1, jpi 
    347                    t_s(ji,jj,jk,jl) = zswitch(ji,jj) * ztm_i_ini(zhemis(ji,jj)) + ( 1._wp - zswitch(ji,jj) ) * rtt 
     344                   t_s(ji,jj,jk,jl) = zswitch(ji,jj) * ztm_i_ini(zhemis(ji,jj)) + ( 1._wp - zswitch(ji,jj) ) * rt0 
    348345                   ! Snow energy of melting 
    349                    e_s(ji,jj,jk,jl) = zswitch(ji,jj) * rhosn * ( cpic * ( rtt - t_s(ji,jj,jk,jl) ) + lfus ) 
    350                    ! Change dimensions 
    351                    e_s(ji,jj,jk,jl) = e_s(ji,jj,jk,jl) / unit_fac 
    352                    ! Multiply by volume, so that heat content in Joules 
    353                    e_s(ji,jj,jk,jl) = e_s(ji,jj,jk,jl) * area(ji,jj) * v_s(ji,jj,jl) / nlay_s 
    354                END DO ! ji 
    355             END DO ! jj 
    356          END DO ! jl 
    357       END DO ! jk 
     346                   e_s(ji,jj,jk,jl) = zswitch(ji,jj) * rhosn * ( cpic * ( rt0 - t_s(ji,jj,jk,jl) ) + lfus ) 
     347 
     348                   ! Mutliply by volume, and divide by number of layers to get heat content in J/m2 
     349                   e_s(ji,jj,jk,jl) = e_s(ji,jj,jk,jl) * v_s(ji,jj,jl) * r1_nlay_s 
     350               END DO 
     351            END DO 
     352         END DO 
     353      END DO 
    358354 
    359355      ! Ice salinity, temperature and heat content 
     
    362358            DO jj = 1, jpj 
    363359               DO ji = 1, jpi 
    364                    t_i(ji,jj,jk,jl) = zswitch(ji,jj) * ztm_i_ini(zhemis(ji,jj)) + ( 1._wp - zswitch(ji,jj) ) * rtt  
    365                    s_i(ji,jj,jk,jl) = zswitch(ji,jj) * zsm_i_ini(zhemis(ji,jj)) !+ ( 1._wp - zswitch(ji,jj) ) * s_i_min 
    366                    ztmelts          = - tmut * s_i(ji,jj,jk,jl) + rtt !Melting temperature in K 
     360                   t_i(ji,jj,jk,jl) = zswitch(ji,jj) * ztm_i_ini(zhemis(ji,jj)) + ( 1._wp - zswitch(ji,jj) ) * rt0  
     361                   s_i(ji,jj,jk,jl) = zswitch(ji,jj) * zsm_i_ini(zhemis(ji,jj)) !+ ( 1._wp - zswitch(ji,jj) ) * rn_simin 
     362                   ztmelts          = - tmut * s_i(ji,jj,jk,jl) + rt0 !Melting temperature in K 
    367363 
    368364                   ! heat content per unit volume 
    369365                   e_i(ji,jj,jk,jl) = zswitch(ji,jj) * rhoic * (   cpic    * ( ztmelts - t_i(ji,jj,jk,jl) ) & 
    370                       +   lfus    * ( 1._wp - (ztmelts-rtt) / MIN((t_i(ji,jj,jk,jl)-rtt),-epsi20) ) & 
    371                       -   rcp     * ( ztmelts - rtt ) ) 
    372  
    373                    ! Correct dimensions to avoid big values 
    374                    e_i(ji,jj,jk,jl) = e_i(ji,jj,jk,jl) / unit_fac  
    375  
    376                    ! Mutliply by ice volume, and divide by number of layers to get heat content in J 
    377                    e_i(ji,jj,jk,jl) = e_i(ji,jj,jk,jl) * area(ji,jj) * v_i(ji,jj,jl) / nlay_i 
    378                END DO ! ji 
    379             END DO ! jj 
    380          END DO ! jl 
    381       END DO ! jk 
     366                      +   lfus    * ( 1._wp - (ztmelts-rt0) / MIN((t_i(ji,jj,jk,jl)-rt0),-epsi20) ) & 
     367                      -   rcp     * ( ztmelts - rt0 ) ) 
     368 
     369                   ! Mutliply by ice volume, and divide by number of layers to get heat content in J/m2 
     370                   e_i(ji,jj,jk,jl) = e_i(ji,jj,jk,jl) * v_i(ji,jj,jl) * r1_nlay_i 
     371               END DO 
     372            END DO 
     373         END DO 
     374      END DO 
    382375 
    383376      tn_ice (:,:,:) = t_su (:,:,:) 
    384377 
    385378      ELSE  
    386          ! if ln_limini=false 
     379         ! if ln_iceini=false 
    387380         a_i  (:,:,:) = 0._wp 
    388381         v_i  (:,:,:) = 0._wp 
     
    400393         DO jl = 1, jpl 
    401394            DO jk = 1, nlay_i 
    402                t_i(:,:,jk,jl) = rtt * tms(:,:) 
     395               t_i(:,:,jk,jl) = rt0 * tmask(:,:,1) 
    403396            END DO 
    404397            DO jk = 1, nlay_s 
    405                t_s(:,:,jk,jl) = rtt * tms(:,:) 
     398               t_s(:,:,jk,jl) = rt0 * tmask(:,:,1) 
    406399            END DO 
    407400         END DO 
    408401       
    409       ENDIF ! ln_limini 
     402      ENDIF ! ln_iceini 
    410403       
    411404      at_i (:,:) = 0.0_wp 
     
    481474      !!  8.5  ! 07-11 (M. Vancoppenolle) rewritten initialization 
    482475      !!----------------------------------------------------------------------------- 
    483       NAMELIST/namiceini/ ln_limini, thres_sst, hts_ini_n, hts_ini_s, hti_ini_n, hti_ini_s,  & 
    484          &                                      ati_ini_n, ati_ini_s, smi_ini_n, smi_ini_s, tmi_ini_n, tmi_ini_s 
     476      NAMELIST/namiceini/ ln_iceini, rn_thres_sst, rn_hts_ini_n, rn_hts_ini_s, rn_hti_ini_n, rn_hti_ini_s,  & 
     477         &                                      rn_ati_ini_n, rn_ati_ini_s, rn_smi_ini_n, rn_smi_ini_s, rn_tmi_ini_n, rn_tmi_ini_s 
    485478      INTEGER :: ios                 ! Local integer output status for namelist read 
    486479      !!----------------------------------------------------------------------------- 
     
    502495         WRITE(numout,*) 'lim_istate_init : ice parameters inititialisation ' 
    503496         WRITE(numout,*) '~~~~~~~~~~~~~~~' 
    504          WRITE(numout,*) '   initialization with ice (T) or not (F)       ln_limini   = ', ln_limini 
    505          WRITE(numout,*) '   threshold water temp. for initial sea-ice    thres_sst  = ', thres_sst 
    506          WRITE(numout,*) '   initial snow thickness in the north          hts_ini_n  = ', hts_ini_n 
    507          WRITE(numout,*) '   initial snow thickness in the south          hts_ini_s  = ', hts_ini_s  
    508          WRITE(numout,*) '   initial ice thickness  in the north          hti_ini_n  = ', hti_ini_n 
    509          WRITE(numout,*) '   initial ice thickness  in the south          hti_ini_s  = ', hti_ini_s 
    510          WRITE(numout,*) '   initial ice concentr.  in the north          ati_ini_n  = ', ati_ini_n 
    511          WRITE(numout,*) '   initial ice concentr.  in the north          ati_ini_s  = ', ati_ini_s 
    512          WRITE(numout,*) '   initial  ice salinity  in the north          smi_ini_n  = ', smi_ini_n 
    513          WRITE(numout,*) '   initial  ice salinity  in the south          smi_ini_s  = ', smi_ini_s 
    514          WRITE(numout,*) '   initial  ice/snw temp  in the north          tmi_ini_n  = ', tmi_ini_n 
    515          WRITE(numout,*) '   initial  ice/snw temp  in the south          tmi_ini_s  = ', tmi_ini_s 
     497         WRITE(numout,*) '   initialization with ice (T) or not (F)       ln_iceini     = ', ln_iceini 
     498         WRITE(numout,*) '   threshold water temp. for initial sea-ice    rn_thres_sst  = ', rn_thres_sst 
     499         WRITE(numout,*) '   initial snow thickness in the north          rn_hts_ini_n  = ', rn_hts_ini_n 
     500         WRITE(numout,*) '   initial snow thickness in the south          rn_hts_ini_s  = ', rn_hts_ini_s  
     501         WRITE(numout,*) '   initial ice thickness  in the north          rn_hti_ini_n  = ', rn_hti_ini_n 
     502         WRITE(numout,*) '   initial ice thickness  in the south          rn_hti_ini_s  = ', rn_hti_ini_s 
     503         WRITE(numout,*) '   initial ice concentr.  in the north          rn_ati_ini_n  = ', rn_ati_ini_n 
     504         WRITE(numout,*) '   initial ice concentr.  in the north          rn_ati_ini_s  = ', rn_ati_ini_s 
     505         WRITE(numout,*) '   initial  ice salinity  in the north          rn_smi_ini_n  = ', rn_smi_ini_n 
     506         WRITE(numout,*) '   initial  ice salinity  in the south          rn_smi_ini_s  = ', rn_smi_ini_s 
     507         WRITE(numout,*) '   initial  ice/snw temp  in the north          rn_tmi_ini_n  = ', rn_tmi_ini_n 
     508         WRITE(numout,*) '   initial  ice/snw temp  in the south          rn_tmi_ini_s  = ', rn_tmi_ini_s 
    516509      ENDIF 
    517510 
Note: See TracChangeset for help on using the changeset viewer.