Changeset 5260 for branches/2014/dev_r4650_UKMO10_Tidally_Meaned_Diagnostics/NEMOGCM/NEMO/LIM_SRC_3/limthd_sal.F90
- Timestamp:
- 2015-05-12T12:37:15+02:00 (9 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/2014/dev_r4650_UKMO10_Tidally_Meaned_Diagnostics/NEMOGCM/NEMO/LIM_SRC_3/limthd_sal.F90
r4624 r5260 18 18 USE sbc_oce ! Surface boundary condition: ocean fields 19 19 USE ice ! LIM variables 20 USE par_ice ! LIM parameters21 20 USE thd_ice ! LIM thermodynamics 22 21 USE limvar ! LIM variables … … 30 29 31 30 PUBLIC lim_thd_sal ! called by limthd module 32 PUBLIC lim_thd_sal_init ! called by iceini module31 PUBLIC lim_thd_sal_init ! called by sbc_lim_init 33 32 34 33 !!---------------------------------------------------------------------- … … 46 45 !! 47 46 !! ** Method : 3 possibilities 48 !! -> n um_sal = 1 -> Sice = cst [ice salinity constant in both time & space]49 !! -> n um_sal = 2 -> Sice = S(z,t) [Vancoppenolle et al. 2005]50 !! -> n um_sal = 3 -> Sice = S(z) [multiyear ice]47 !! -> nn_icesal = 1 -> Sice = cst [ice salinity constant in both time & space] 48 !! -> nn_icesal = 2 -> Sice = S(z,t) [Vancoppenolle et al. 2005] 49 !! -> nn_icesal = 3 -> Sice = S(z) [multiyear ice] 51 50 !!--------------------------------------------------------------------- 52 51 INTEGER, INTENT(in) :: kideb, kiut ! thickness category index 53 52 ! 54 53 INTEGER :: ji, jk ! dummy loop indices 55 REAL(wp) :: zsold, iflush, iaccrbo, igravdr, isnowic, i_ice_switch, ztmelts ! local scalars 56 REAL(wp) :: zaaa, zbbb, zccc, zdiscrim ! local scalars 57 REAL(wp), POINTER, DIMENSION(:) :: ze_init, zhiold, zsiold 54 REAL(wp) :: iflush, igravdr ! local scalars 58 55 !!--------------------------------------------------------------------- 59 56 60 CALL wrk_alloc( jpij, ze_init, zhiold, zsiold ) 61 57 !--------------------------------------------------------- 58 ! 0) Update ice salinity from snow-ice and bottom growth 59 !--------------------------------------------------------- 60 DO ji = kideb, kiut 61 sm_i_1d(ji) = sm_i_1d(ji) + dsm_i_se_1d(ji) + dsm_i_si_1d(ji) 62 END DO 63 62 64 !------------------------------------------------------------------------------| 63 65 ! 1) Constant salinity, constant in time | 64 66 !------------------------------------------------------------------------------| 65 !!gm comment: if n um_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 !!66 !!gm ===>>> simplification of almost all test on n um_sal value67 IF( n um_sal == 1 ) THEN68 s_i_ b (kideb:kiut,1:nlay_i) = bulk_sal69 sm_i_ b (kideb:kiut) = bulk_sal70 s_i_new(kideb:kiut) = bulk_sal67 !!gm comment: if nn_icesal = 1 s_i_new, s_i_1d and sm_i_1d can be set to rn_icesal one for all in the initialisation phase !! 68 !!gm ===>>> simplification of almost all test on nn_icesal value 69 IF( nn_icesal == 1 ) THEN 70 s_i_1d (kideb:kiut,1:nlay_i) = rn_icesal 71 sm_i_1d(kideb:kiut) = rn_icesal 72 s_i_new(kideb:kiut) = rn_icesal 71 73 ENDIF 72 74 … … 74 76 ! Module 2 : Constant salinity varying in time | 75 77 !------------------------------------------------------------------------------| 76 77 IF( num_sal == 2 ) THEN 78 79 !--------------------------------- 80 ! Thickness at previous time step 81 !--------------------------------- 82 DO ji = kideb, kiut 83 zhiold(ji) = ht_i_b(ji) - dh_i_bott(ji) - dh_snowice(ji) - dh_i_surf(ji) 84 zsiold(ji) = sm_i_b(ji) 85 END DO 86 87 !--------------------- 88 ! Global heat content 89 !--------------------- 90 ze_init(:) = 0._wp 91 DO jk = 1, nlay_i 92 DO ji = kideb, kiut 93 ze_init(ji) = ze_init(ji) + q_i_b(ji,jk) * ht_i_b(ji) / REAL (nlay_i ) 94 END DO 95 END DO 78 IF( nn_icesal == 2 ) THEN 96 79 97 80 DO ji = kideb, kiut … … 99 82 ! Switches 100 83 !---------- 101 iflush = MAX( 0._wp , SIGN( 1.0 , t_su_b(ji) - rtt ) ) ! =1 if summer 102 igravdr = MAX( 0._wp , SIGN( 1.0 , t_bo_b(ji) - t_su_b(ji) ) ) ! =1 if t_su < t_bo 103 iaccrbo = MAX( 0._wp , SIGN( 1.0 , dh_i_bott(ji) ) ) ! =1 if bottom accretion 104 i_ice_switch = 1._wp - MAX ( 0._wp , SIGN( 1._wp , - ht_i_b(ji) + 1.e-2 ) ) 105 isnowic = 1._wp - MAX ( 0._wp , SIGN( 1._wp , - dh_snowice(ji) ) ) * i_ice_switch ! =1 if snow ice formation 84 iflush = MAX( 0._wp , SIGN( 1._wp , t_su_1d(ji) - rt0 ) ) ! =1 if summer 85 igravdr = MAX( 0._wp , SIGN( 1._wp , t_bo_1d(ji) - t_su_1d(ji) ) ) ! =1 if t_su < t_bo 106 86 107 87 !--------------------- 108 88 ! Salinity tendencies 109 89 !--------------------- 110 ! !drainage by gravity drainage111 dsm_i_gd_1d(ji) = - igravdr * MAX( sm_i_ b(ji) - sal_G , 0._wp ) / time_G* rdt_ice112 ! !drainage by flushing113 dsm_i_fl_1d(ji) = - iflush * MAX( sm_i_ b(ji) - sal_F , 0._wp ) / time_F* rdt_ice90 ! drainage by gravity drainage 91 dsm_i_gd_1d(ji) = - igravdr * MAX( sm_i_1d(ji) - rn_sal_gd , 0._wp ) / rn_time_gd * rdt_ice 92 ! drainage by flushing 93 dsm_i_fl_1d(ji) = - iflush * MAX( sm_i_1d(ji) - rn_sal_fl , 0._wp ) / rn_time_fl * rdt_ice 114 94 115 95 !----------------- … … 118 98 ! only drainage terms ( gravity drainage and flushing ) 119 99 ! snow ice / bottom sources are added in lim_thd_ent to conserve energy 120 sm_i_b(ji) = sm_i_b(ji) + dsm_i_fl_1d(ji) + dsm_i_gd_1d(ji) 121 122 ! if no ice, salinity = 0.1 123 i_ice_switch = 1._wp - MAX ( 0._wp, SIGN( 1._wp , - ht_i_b(ji) ) ) 124 sm_i_b(ji) = i_ice_switch * sm_i_b(ji) + s_i_min * ( 1._wp - i_ice_switch ) 125 126 !---------------------------- 127 ! Heat flux - brine drainage 128 !---------------------------- 129 fhbri_1d(ji) = 0._wp 100 sm_i_1d(ji) = sm_i_1d(ji) + dsm_i_fl_1d(ji) + dsm_i_gd_1d(ji) 130 101 131 102 !---------------------------- 132 103 ! Salt flux - brine drainage 133 104 !---------------------------- 134 sfx_bri_1d(ji) = sfx_bri_1d(ji) - i_ice_switch * rhoic * a_i_b(ji) * ht_i_b(ji) * ( sm_i_b(ji) - zsiold(ji) ) * r1_rdtice105 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 135 106 136 107 END DO … … 138 109 ! Salinity profile 139 110 CALL lim_var_salprof1d( kideb, kiut ) 140 141 142 ! Only necessary for conservation check since salinity is modified143 !--------------------144 ! Temperature update145 !--------------------146 DO jk = 1, nlay_i147 DO ji = kideb, kiut148 ztmelts = -tmut*s_i_b(ji,jk) + rtt149 !Conversion q(S,T) -> T (second order equation)150 zaaa = cpic151 zbbb = ( rcp - cpic ) * ( ztmelts - rtt ) + q_i_b(ji,jk) / rhoic - lfus152 zccc = lfus * ( ztmelts - rtt )153 zdiscrim = SQRT( MAX( zbbb*zbbb - 4.0*zaaa*zccc, 0._wp ) )154 t_i_b(ji,jk) = rtt - ( zbbb + zdiscrim ) / ( 2.0 *zaaa )155 END DO156 END DO157 111 ! 158 112 ENDIF … … 161 115 ! Module 3 : Profile of salinity, constant in time | 162 116 !------------------------------------------------------------------------------| 117 IF( nn_icesal == 3 ) CALL lim_var_salprof1d( kideb, kiut ) 163 118 164 IF( num_sal == 3 ) CALL lim_var_salprof1d( kideb, kiut )165 166 !167 CALL wrk_dealloc( jpij, ze_init, zhiold, zsiold )168 119 ! 169 120 END SUBROUTINE lim_thd_sal … … 182 133 !!------------------------------------------------------------------- 183 134 INTEGER :: ios ! Local integer output status for namelist read 184 NAMELIST/namicesal/ n um_sal, bulk_sal, sal_G, time_G, sal_F, time_F, &185 & s_i_max, s_i_min, s_i_0, s_i_1135 NAMELIST/namicesal/ nn_icesal, rn_icesal, rn_sal_gd, rn_time_gd, rn_sal_fl, rn_time_fl, & 136 & rn_simax, rn_simin 186 137 !!------------------------------------------------------------------- 187 138 ! … … 199 150 WRITE(numout,*) 'lim_thd_sal_init : Ice parameters for salinity ' 200 151 WRITE(numout,*) '~~~~~~~~~~~~~~~~' 201 WRITE(numout,*) ' switch for salinity num_sal : ', num_sal 202 WRITE(numout,*) ' bulk salinity value if num_sal = 1 : ', bulk_sal 203 WRITE(numout,*) ' restoring salinity for GD : ', sal_G 204 WRITE(numout,*) ' restoring time for GD : ', time_G 205 WRITE(numout,*) ' restoring salinity for flushing : ', sal_F 206 WRITE(numout,*) ' restoring time for flushing : ', time_F 207 WRITE(numout,*) ' Maximum tolerated ice salinity : ', s_i_max 208 WRITE(numout,*) ' Minimum tolerated ice salinity : ', s_i_min 209 WRITE(numout,*) ' 1st salinity for salinity profile : ', s_i_0 210 WRITE(numout,*) ' 2nd salinity for salinity profile : ', s_i_1 152 WRITE(numout,*) ' switch for salinity nn_icesal = ', nn_icesal 153 WRITE(numout,*) ' bulk salinity value if nn_icesal = 1 = ', rn_icesal 154 WRITE(numout,*) ' restoring salinity for GD = ', rn_sal_gd 155 WRITE(numout,*) ' restoring time for GD = ', rn_time_gd 156 WRITE(numout,*) ' restoring salinity for flushing = ', rn_sal_fl 157 WRITE(numout,*) ' restoring time for flushing = ', rn_time_fl 158 WRITE(numout,*) ' Maximum tolerated ice salinity = ', rn_simax 159 WRITE(numout,*) ' Minimum tolerated ice salinity = ', rn_simin 211 160 ENDIF 212 161 !
Note: See TracChangeset
for help on using the changeset viewer.