MODULE limthd_sal !!---------------------------------------------------------------------- !! 'key_lim3' LIM3 sea-ice model !!---------------------------------------------------------------------- !!====================================================================== !! *** MODULE limthd_sal *** !! computation salinity variations in !! the ice !!====================================================================== #if defined key_lim3 !!---------------------------------------------------------------------- !! lim_thd_sal : salinity variations in the ice !! * Modules used USE par_oce ! ocean parameters USE phycst ! physical constants (ocean directory) USE sbc_oce ! Surface boundary condition: ocean fields USE thd_ice USE iceini USE ice USE limistate USE in_out_manager USE limvar USE par_ice IMPLICIT NONE PRIVATE !! * Routine accessibility PUBLIC lim_thd_sal ! called by lim_thd PUBLIC lim_thd_sal_init ! called by lim_thd !! * Module variables REAL(wp) :: & ! constant values epsi20 = 1e-20 , & epsi13 = 1e-13 , & zzero = 0.e0 , & zone = 1.e0 !!---------------------------------------------------------------------- !! LIM 3.0, UCL-ASTR-LOCEAN-IPSL (2008) !! $Id$ !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt) !!---------------------------------------------------------------------- CONTAINS SUBROUTINE lim_thd_sal(kideb,kiut) !!------------------------------------------------------------------- !! *** ROUTINE lim_thd_sal *** !! ** Purpose : !! This routine computes new salinities in the ice !! !! ** Method : 4 possibilities !! -> num_sal = 1 -> constant salinity for z,t !! -> num_sal = 2 -> S = S(z,t) [simple Vancoppenolle et al 2005] !! -> num_sal = 3 -> S = S(z) [multiyear ice] !! -> num_sal = 4 -> S = S(h) [Cox and Weeks 74] !! !! ** Steps !! !! ** Arguments !! !! ** Inputs / Outputs !! !! ** External !! !! ** References !! !! ** History : !! !! "Je ne suis pour l'instant qu'a 80% de ma condition, mais c'est !! les 30% qui restent qui seront les plus difficiles" !! E. Mpenza !! !!------------------------------------------------------------------- !! History : !! ori ! 03-05 M. Vancoppenolle UCL-ASTR first coding for LIM-1D !! 3.0 ! 05-12 Routine rewritten for the 3-D version !!--------------------------------------------------------------------- !! !! * Local variables INTEGER, INTENT(in) :: & kideb, kiut !: thickness category index INTEGER :: & ji, jk , & !: geographic and layer index zji, zjj REAL(wp) :: & zsold, & !: old salinity zeps=1.0e-06 , & !: very small iflush , & !: flushing (1) or not (0) iaccrbo , & !: bottom accretion (1) or not (0) igravdr , & !: gravity drainage or not isnowic , & !: gravity drainage or not i_ice_switch , & !: ice thickness above a certain treshold or not ztmelts , & !: freezing point of sea ice zaaa , & !: dummy factor zbbb , & !: dummy factor zccc , & !: dummy factor zdiscrim !: dummy factor REAL(wp), DIMENSION(jpij) :: & ze_init , & !initial total enthalpy zhiold , & zsiold !!--------------------------------------------------------------------- !------------------------------------------------------------------------------| ! 1) Constant salinity, constant in time | !------------------------------------------------------------------------------| IF (num_sal.eq.1) THEN ! WRITE(numout,*) ! WRITE(numout,*) 'lim_thd_sal : Ice salinity computation module ', & ! num_sal ! WRITE(numout,*) '~~~~~~~~~~~~' DO jk = 1, nlay_i DO ji = kideb, kiut s_i_b(ji,jk) = bulk_sal END DO ! ji END DO ! jk DO ji = kideb, kiut sm_i_b(ji) = bulk_sal END DO ! ji ENDIF ! num_sal .EQ. 1 !------------------------------------------------------------------------------| ! Module 2 : Constant salinity varying in time | !------------------------------------------------------------------------------| IF ( ( num_sal .EQ. 2 ) .OR. ( num_sal .EQ. 4 ) ) THEN ! WRITE(numout,*) ! WRITE(numout,*) 'lim_thd_sal : Ice salinity computation module ', & ! num_sal ! WRITE(numout,*) '~~~~~~~~~~~' ! WRITE(numout,*) !--------------------------------- ! Thickness at previous time step !--------------------------------- DO ji = kideb, kiut zhiold(ji) = ht_i_b(ji) - dh_i_bott(ji) - dh_snowice(ji) - & dh_i_surf(ji) END DO ! ji !--------------------- ! Global heat content !--------------------- ze_init(:) = 0.0 DO jk = 1, nlay_i DO ji = kideb, kiut ze_init(ji) = ze_init(ji) + q_i_b(ji,jk) * ht_i_b(ji) / nlay_i END DO ! ji END DO ! jk DO ji = kideb, kiut !---------- ! Switches !---------- ! iflush : 1 if summer iflush = MAX( 0.0 , SIGN ( 1.0 , t_su_b(ji) - rtt ) ) ! igravdr : 1 if t_su lt t_bo igravdr = MAX( 0.0 , SIGN ( 1.0 , t_bo_b(ji) - t_su_b(ji) ) ) ! iaccrbo : 1 if bottom accretion iaccrbo = MAX( 0.0 , SIGN ( 1.0 , dh_i_bott(ji) ) ) ! isnowic : 1 if snow ice formation i_ice_switch = 1.0 - MAX ( 0.0 , SIGN ( 1.0 , - ht_i_b(ji) + 1.0e-2 ) ) isnowic = 1.0 - MAX ( 0.0 , SIGN ( 1.0 , - dh_snowice(ji) ) ) * & i_ice_switch !--------------------- ! Salinity tendencies !--------------------- ! drainage by gravity drainage dsm_i_gd_1d(ji) = - igravdr * & MAX( sm_i_b(ji) - sal_G , 0.0 ) / & time_G * rdt_ice ! drainage by flushing dsm_i_fl_1d(ji) = - iflush * & MAX( sm_i_b(ji) - sal_F , 0.0 ) / & time_F * rdt_ice !----------------- ! Update salinity !----------------- ! only drainage terms ( gravity drainage and flushing ) ! snow ice / bottom sources are added in lim_thd_ent ! to conserve energy zsiold(ji) = sm_i_b(ji) sm_i_b(ji) = sm_i_b(ji) & + dsm_i_fl_1d(ji) + dsm_i_gd_1d(ji) ! & ! if no ice, salinity eq 0.1 i_ice_switch = 1.0 - MAX ( 0.0, SIGN (1.0 , - ht_i_b(ji) ) ) sm_i_b(ji) = i_ice_switch*sm_i_b(ji) + s_i_min * ( 1.0 - & i_ice_switch ) END DO ! ji ! Salinity profile CALL lim_var_salprof1d(kideb,kiut) !---------------------------- ! Heat flux - brine drainage !---------------------------- DO ji = kideb, kiut ! iflush : 1 if summer iflush = MAX( 0.0 , SIGN ( 1.0 , t_su_b(ji) - rtt ) ) ! igravdr : 1 if t_su lt t_bo igravdr = MAX( 0.0 , SIGN ( 1.0 , t_bo_b(ji) - t_su_b(ji) ) ) ! iaccrbo : 1 if bottom accretion iaccrbo = MAX( 0.0 , SIGN ( 1.0 , dh_i_bott(ji) ) ) fhbri_1d(ji) = 0.0 END DO ! ji !---------------------------- ! Salt flux - brine drainage !---------------------------- DO ji = kideb, kiut i_ice_switch = 1.0 - MAX ( 0.0, SIGN (1.0 , - ht_i_b(ji) ) ) fsbri_1d(ji) = fsbri_1d(ji) - & i_ice_switch * rhoic * a_i_b(ji) * ht_i_b(ji) * & ( MAX(dsm_i_gd_1d(ji) + dsm_i_fl_1d(ji), & sm_i_b(ji) - zsiold(ji) ) ) / rdt_ice IF ( num_sal .EQ. 4 ) fsbri_1d(ji) = 0.0 END DO ! ji ! Only necessary for conservation check since salinity is modified !-------------------- ! Temperature update !-------------------- DO jk = 1, nlay_i DO ji = kideb, kiut ztmelts = -tmut*s_i_b(ji,jk) + rtt !Conversion q(S,T) -> T (second order equation) zaaa = cpic zbbb = ( rcp - cpic ) * ( ztmelts - rtt ) + & q_i_b(ji,jk) / rhoic - lfus zccc = lfus * ( ztmelts - rtt ) zdiscrim = SQRT( MAX(zbbb*zbbb - 4.0*zaaa*zccc,0.0) ) t_i_b(ji,jk) = rtt - ( zbbb + zdiscrim ) / & ( 2.0 *zaaa ) END DO !ji END DO !jk ENDIF ! num_sal .EQ. 2 !------------------------------------------------------------------------------| ! Module 3 : Profile of salinity, constant in time | !------------------------------------------------------------------------------| IF ( num_sal .EQ. 3 ) THEN WRITE(numout,*) WRITE(numout,*) 'lim_thd_sal : Ice salinity computation module ', & num_sal WRITE(numout,*) '~~~~~~~~~~~~' CALL lim_var_salprof1d(kideb,kiut) ENDIF ! num_sal .EQ. 3 !------------------------------------------------------------------------------| ! Module 4 : Constant salinity varying in time | !------------------------------------------------------------------------------| ! Cox and Weeks, 1974 IF (num_sal.eq.5) THEN WRITE(numout,*) WRITE(numout,*) 'lim_thd_sal : Ice salinity computation module ', & num_sal WRITE(numout,*) '~~~~~~~~~~~~' DO ji = kideb, kiut zsold = sm_i_b(ji) IF (ht_i_b(ji).lt.0.4) THEN sm_i_b(ji) = 14.24 - 19.39*ht_i_b(ji) ELSE sm_i_b(ji) = 7.88 - 1.59*ht_i_b(ji) sm_i_b(ji) = MIN(sm_i_b(ji),zsold) ENDIF IF ( ht_i_b(ji) .GT. 3.06918239 ) THEN sm_i_b(ji) = 3.0 ENDIF DO jk = 1, nlay_i s_i_b(ji,jk) = sm_i_b(ji) END DO END DO ! ji ENDIF ! num_sal !------------------------------------------------------------------------------| ! 5) Computation of salt flux due to Bottom growth !------------------------------------------------------------------------------| IF ( num_sal .EQ. 4 ) THEN DO ji = kideb, kiut zji = MOD( npb(ji) - 1, jpi ) + 1 zjj = ( npb(ji) - 1 ) / jpi + 1 fseqv_1d(ji) = fseqv_1d(ji) + & ( sss_m(zji,zjj) - bulk_sal ) * & rhoic * a_i_b(ji) * & MAX( dh_i_bott(ji) , 0.0 ) / rdt_ice END DO ELSE DO ji = kideb, kiut zji = MOD( npb(ji) - 1, jpi ) + 1 zjj = ( npb(ji) - 1 ) / jpi + 1 fseqv_1d(ji) = fseqv_1d(ji) + & ( sss_m(zji,zjj) - s_i_new(ji) ) * & rhoic * a_i_b(ji) * & MAX( dh_i_bott(ji) , 0.0 ) / rdt_ice END DO ! ji ENDIF !-- End of salinity computations END SUBROUTINE lim_thd_sal !============================================================================== SUBROUTINE lim_thd_sal_init !!------------------------------------------------------------------- !! *** ROUTINE lim_thd_sal_init *** !! !! ** Purpose : initialization of ice salinity parameters !! !! ** Method : Read the namicesal namelist and check the parameter !! values called at the first timestep (nit000) !! !! ** input : Namelist namicesal !! !! history : !! 3.0 ! July 2005 M. Vancoppenolle Original code !!------------------------------------------------------------------- NAMELIST/namicesal/ num_sal, bulk_sal, sal_G, time_G, sal_F, time_F, & s_i_max, s_i_min, s_i_0, s_i_1 !!------------------------------------------------------------------- ! Read Namelist namicesal REWIND ( numnam_ice ) READ ( numnam_ice , namicesal ) IF(lwp) THEN WRITE(numout,*) WRITE(numout,*) 'lim_thd_sal_init : Ice parameters for salinity ' WRITE(numout,*) '~~~~~~~~~~~~~~~~' WRITE(numout,*) ' switch for salinity num_sal : ', num_sal WRITE(numout,*) ' bulk salinity value if num_sal = 1 : ', bulk_sal WRITE(numout,*) ' restoring salinity for GD : ', sal_G WRITE(numout,*) ' restoring time for GD : ', time_G WRITE(numout,*) ' restoring salinity for flushing : ', sal_F WRITE(numout,*) ' restoring time for flushing : ', time_F WRITE(numout,*) ' Maximum tolerated ice salinity : ', s_i_max WRITE(numout,*) ' Minimum tolerated ice salinity : ', s_i_min WRITE(numout,*) ' 1st salinity for salinity profile : ', s_i_0 WRITE(numout,*) ' 2nd salinity for salinity profile : ', s_i_1 ENDIF END SUBROUTINE lim_thd_sal_init #else !!---------------------------------------------------------------------- !! Default option Empty Module No sea-ice model !!---------------------------------------------------------------------- CONTAINS SUBROUTINE lim_thd_sal ! Empty routine END SUBROUTINE lim_thd_sal #endif !!====================================================================== END MODULE limthd_sal