Changeset 10786


Ignore:
Timestamp:
2019-03-20T19:59:24+01:00 (21 months ago)
Author:
clem
Message:

fix tickets #2256 and #2257

Location:
NEMO/trunk/src/ICE
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • NEMO/trunk/src/ICE/ice1d.F90

    r10534 r10786  
    123123   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   sv_i_1d       !: 
    124124   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   oa_i_1d       !: 
     125   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   o_i_1d        !: 
    125126   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   a_ip_1d       !: 
    126127   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   v_ip_1d       !: 
     
    209210         &      a_ip_1d (jpij) , v_ip_1d (jpij) , v_i_1d    (jpij) , v_s_1d  (jpij) ,                   & 
    210211         &      h_ip_1d (jpij) , a_ip_frac_1d(jpij) ,                                                   & 
    211          &      sv_i_1d (jpij) , oa_i_1d (jpij) , STAT=ierr(ii) ) 
     212         &      sv_i_1d (jpij) , oa_i_1d (jpij) , o_i_1d    (jpij) , STAT=ierr(ii) ) 
    212213      ! 
    213214      ii = ii + 1 
  • NEMO/trunk/src/ICE/icedyn_adv_umx.F90

    r10579 r10786  
    2323   ! 
    2424   USE in_out_manager ! I/O manager 
     25   USE iom            ! I/O manager library 
    2526   USE lib_mpp        ! MPP library 
    2627   USE lib_fortran    ! fortran utilities (glob_sum + no signed zero) 
     
    160161          
    161162         zamsk = 1._wp 
    162          CALL adv_umx( zamsk, kn_umx, jt, kt, zdt, zudy, zvdx, zua_ho, zva_ho, zcu_box, zcv_box, pa_i, pa_i, zua_ho, zva_ho ) ! Ice area 
     163         CALL adv_umx( zamsk, kn_umx, jt, kt, zdt, zudy, zvdx, zua_ho, zva_ho, zcu_box, zcv_box, pa_i, pa_i, zua_ho, zva_ho ) !-- Ice area 
    163164         zamsk = 0._wp 
    164165         ! 
    165166         zhvar(:,:,:) = pv_i(:,:,:) * z1_ai(:,:,:) 
    166          CALL adv_umx( zamsk, kn_umx, jt, kt, zdt, zudy, zvdx, zua_ho, zva_ho, zcu_box, zcv_box, zhvar, pv_i )                ! Ice volume 
     167         CALL adv_umx( zamsk, kn_umx, jt, kt, zdt, zudy, zvdx, zua_ho, zva_ho, zcu_box, zcv_box, zhvar, pv_i )                !-- Ice volume 
    167168         ! 
    168169         zhvar(:,:,:) = pv_s(:,:,:) * z1_ai(:,:,:) 
    169          CALL adv_umx( zamsk, kn_umx, jt, kt, zdt, zudy, zvdx, zua_ho, zva_ho, zcu_box, zcv_box, zhvar, pv_s )                ! Snw volume 
     170         CALL adv_umx( zamsk, kn_umx, jt, kt, zdt, zudy, zvdx, zua_ho, zva_ho, zcu_box, zcv_box, zhvar, pv_s )                !-- Snw volume 
    170171         ! 
    171172         zhvar(:,:,:) = psv_i(:,:,:) * z1_ai(:,:,:) 
    172          CALL adv_umx( zamsk, kn_umx, jt, kt, zdt, zudy, zvdx, zua_ho, zva_ho, zcu_box, zcv_box, zhvar, psv_i )               ! Salt content 
    173          ! 
    174          zhvar(:,:,:) = poa_i(:,:,:) * z1_ai(:,:,:) 
    175          CALL adv_umx( zamsk, kn_umx, jt, kt, zdt, zudy, zvdx, zua_ho, zva_ho, zcu_box, zcv_box, zhvar, poa_i )               ! Age content 
     173         CALL adv_umx( zamsk, kn_umx, jt, kt, zdt, zudy, zvdx, zua_ho, zva_ho, zcu_box, zcv_box, zhvar, psv_i )               !-- Salt content 
    176174         ! 
    177175         DO jk = 1, nlay_i 
    178176            zhvar(:,:,:) = pe_i(:,:,jk,:) * z1_ai(:,:,:) 
    179             CALL adv_umx( zamsk, kn_umx, jt, kt, zdt, zudy, zvdx, zua_ho, zva_ho, zcu_box, zcv_box, zhvar, pe_i(:,:,jk,:) )   ! Ice heat content 
     177            CALL adv_umx( zamsk, kn_umx, jt, kt, zdt, zudy, zvdx, zua_ho, zva_ho, zcu_box, zcv_box, zhvar, pe_i(:,:,jk,:) )   !-- Ice heat content 
    180178         END DO 
    181179         ! 
    182180         DO jk = 1, nlay_s 
    183181            zhvar(:,:,:) = pe_s(:,:,jk,:) * z1_ai(:,:,:) 
    184             CALL adv_umx( zamsk, kn_umx, jt, kt, zdt, zudy, zvdx, zua_ho, zva_ho, zcu_box, zcv_box, zhvar, pe_s(:,:,jk,:) )   ! Snw heat content 
    185          END DO 
    186          ! 
    187          IF ( ln_pnd_H12 ) THEN 
     182            CALL adv_umx( zamsk, kn_umx, jt, kt, zdt, zudy, zvdx, zua_ho, zva_ho, zcu_box, zcv_box, zhvar, pe_s(:,:,jk,:) )   !-- Snw heat content 
     183         END DO 
     184         ! 
     185         IF( iom_use('iceage') .OR. iom_use('iceage_cat') ) THEN                                                              !-- Ice Age 
     186            ! clem: in theory we should use the formulation below to advect the ice age, but the code is unable to deal with 
     187            !       fields that do not depend on volume (here oa_i depends on concentration). It creates abnormal ages that 
     188            !       spread into the domain. Therefore we cheat and consider that ice age should be advected as ice concentration 
     189            !!zhvar(:,:,:) = poa_i(:,:,:) * z1_ai(:,:,:) 
     190            !!CALL adv_umx( zamsk, kn_umx, jt, kt, zdt, zudy, zvdx, zua_ho, zva_ho, zcu_box, zcv_box, zhvar, poa_i ) 
     191            ! set u*a=u for advection of ice age 
     192            DO jl = 1, jpl 
     193               zua_ho(:,:,jl) = zudy(:,:) 
     194               zva_ho(:,:,jl) = zvdx(:,:) 
     195            END DO 
     196            zamsk = 1._wp 
     197            CALL adv_umx( zamsk, kn_umx, jt, kt, zdt, zudy, zvdx, zua_ho, zva_ho, zcu_box, zcv_box, poa_i, poa_i ) 
     198            zamsk = 0._wp 
     199         ENDIF 
     200         ! 
     201         IF ( ln_pnd_H12 ) THEN                                                                                               !-- melt ponds 
    188202            ! set u*a=u for advection of Ap only  
    189203            DO jl = 1, jpl 
     
    191205               zva_ho(:,:,jl) = zvdx(:,:) 
    192206            END DO 
    193              
     207            ! 
    194208            zamsk = 1._wp 
    195             CALL adv_umx( zamsk, kn_umx, jt, kt, zdt, zudy, zvdx, zua_ho, zva_ho, zcu_box, zcv_box, pa_ip, pa_ip, zua_ho, zva_ho ) ! mp fraction 
     209            CALL adv_umx( zamsk, kn_umx, jt, kt, zdt, zudy, zvdx, zua_ho, zva_ho, zcu_box, zcv_box, pa_ip, pa_ip, zua_ho, zva_ho ) ! fraction 
    196210            zamsk = 0._wp 
    197211            ! 
    198212            zhvar(:,:,:) = pv_ip(:,:,:) * z1_aip(:,:,:) 
    199             CALL adv_umx( zamsk, kn_umx, jt, kt, zdt, zudy, zvdx, zua_ho, zva_ho, zcu_box, zcv_box, zhvar, pv_ip )                 ! mp volume 
     213            CALL adv_umx( zamsk, kn_umx, jt, kt, zdt, zudy, zvdx, zua_ho, zva_ho, zcu_box, zcv_box, zhvar, pv_ip )                 ! volume 
    200214         ENDIF 
    201215         ! 
     
    203217         DO jj = 2, jpjm1 
    204218            DO ji = fs_2, fs_jpim1 
    205                pato_i(ji,jj) = pato_i(ji,jj) - ( zati2(ji,jj) - zati1(ji,jj) ) &                                                   ! Open water area 
     219               pato_i(ji,jj) = pato_i(ji,jj) - ( zati2(ji,jj) - zati1(ji,jj) ) &                                              !-- Open water area 
    206220                  &                          - ( zudy(ji,jj) - zudy(ji-1,jj) + zvdx(ji,jj) - zvdx(ji,jj-1) ) * r1_e1e2t(ji,jj) * zdt 
    207221            END DO 
  • NEMO/trunk/src/ICE/icethd.F90

    r10534 r10786  
    244244         ! 
    245245      END DO 
    246       ! update ice age (in case a_i changed, i.e. becomes 0 or lateral melting) 
    247       oa_i(:,:,:) = o_i(:,:,:) * a_i(:,:,:) 
    248246 
    249247      IF( ln_icediachk )   CALL ice_cons_hsm(1, 'icethd', rdiag_v, rdiag_s, rdiag_t, rdiag_fv, rdiag_fs, rdiag_ft) 
     
    418416         CALL tab_2d_1d( npti, nptidx(1:npti), sst_1d(1:npti), sst_m ) 
    419417         CALL tab_2d_1d( npti, nptidx(1:npti), sss_1d(1:npti), sss_m ) 
    420  
     418         ! 
     419         ! to update ice age 
     420         CALL tab_2d_1d( npti, nptidx(1:npti), o_i_1d (1:npti), o_i (:,:,kl) ) 
     421         CALL tab_2d_1d( npti, nptidx(1:npti), oa_i_1d(1:npti), oa_i(:,:,kl) ) 
     422         ! 
    421423         ! --- Change units of e_i, e_s from J/m2 to J/m3 --- ! 
    422424         DO jk = 1, nlay_i 
     
    443445         sv_i_1d(1:npti) = s_i_1d (1:npti) * v_i_1d (1:npti) 
    444446         v_ip_1d(1:npti) = h_ip_1d(1:npti) * a_ip_1d(1:npti) 
     447         oa_i_1d(1:npti) = o_i_1d (1:npti) * a_i_1d (1:npti) 
    445448          
    446449         CALL tab_1d_2d( npti, nptidx(1:npti), at_i_1d(1:npti), at_i             ) 
     
    516519         CALL tab_1d_2d( npti, nptidx(1:npti), sv_i_1d(1:npti), sv_i(:,:,kl) ) 
    517520         CALL tab_1d_2d( npti, nptidx(1:npti), v_ip_1d(1:npti), v_ip(:,:,kl) ) 
     521         CALL tab_1d_2d( npti, nptidx(1:npti), oa_i_1d(1:npti), oa_i(:,:,kl) ) 
    518522         ! 
    519523      END SELECT 
  • NEMO/trunk/src/ICE/icethd_dh.F90

    r10534 r10786  
    614614      DO jk = 1, nlay_s 
    615615         DO ji = 1,npti 
    616             ! mask enthalpy 
    617             rswitch       = 1._wp - MAX(  0._wp , SIGN( 1._wp, - h_s_1d(ji) )  ) 
     616            ! where there is no ice or no snow 
     617            rswitch = ( 1._wp - MAX( 0._wp, SIGN( 1._wp, - h_s_1d(ji) ) ) ) * ( 1._wp - MAX( 0._wp, SIGN(1._wp, - h_i_1d(ji) ) ) ) 
     618            ! mass & energy loss to the ocean 
     619            hfx_res_1d(ji) = hfx_res_1d(ji) + ( 1._wp - rswitch ) * & 
     620               &                              ( e_s_1d(ji,jk) * h_s_1d(ji) * r1_nlay_s * a_i_1d(ji) * r1_rdtice )  ! heat flux to the ocean [W.m-2], < 0 
     621            wfx_res_1d(ji) = wfx_res_1d(ji) + ( 1._wp - rswitch ) * & 
     622               &                              ( rhos          * h_s_1d(ji) * r1_nlay_s * a_i_1d(ji) * r1_rdtice )  ! mass flux 
     623            ! update energy (mass is updated in the next loop) 
    618624            e_s_1d(ji,jk) = rswitch * e_s_1d(ji,jk) 
    619625            ! recalculate t_s_1d from e_s_1d 
     
    622628      END DO 
    623629 
    624       ! --- ensure that a_i = 0 where h_i = 0 --- 
    625       WHERE( h_i_1d(1:npti) == 0._wp )   a_i_1d(1:npti) = 0._wp 
     630      ! --- ensure that a_i = 0 & h_s = 0 where h_i = 0 --- 
     631      WHERE( h_i_1d(1:npti) == 0._wp )    
     632         a_i_1d(1:npti) = 0._wp 
     633         h_s_1d(1:npti) = 0._wp 
     634      END WHERE 
    626635      ! 
    627636   END SUBROUTINE ice_thd_dh 
  • NEMO/trunk/src/ICE/icewri.F90

    r10425 r10786  
    100100      IF( iom_use('snwthic'  ) )   CALL iom_put( "snwthic", hm_s  * zmsk00        )   ! snw thickness 
    101101      IF( iom_use('icebrv'   ) )   CALL iom_put( "icebrv" , bvm_i * zmsk00 * 100. )   ! brine volume 
    102       IF( iom_use('iceage'   ) )   CALL iom_put( "iceage" , om_i  * zmsk00 / rday )   ! ice age 
     102      IF( iom_use('iceage'   ) )   CALL iom_put( "iceage" , om_i  * zmsk15 / rday )   ! ice age 
    103103      IF( iom_use('icehnew'  ) )   CALL iom_put( "icehnew", ht_i_new              )   ! new ice thickness formed in the leads 
    104104      IF( iom_use('snwvolu'  ) )   CALL iom_put( "snwvolu", vt_s  * zmsksn        )   ! snow volume 
Note: See TracChangeset for help on using the changeset viewer.