- Timestamp:
- 2016-11-21T11:40:00+01:00 (7 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/2016/dev_CNRS_2016/NEMOGCM/NEMO/LIM_SRC_3/limistate.F90
r7278 r7280 5 5 !!====================================================================== 6 6 !! History : 2.0 ! 2004-01 (C. Ethe, G. Madec) Original code 7 !! 4.0 ! 2011-02 (G. Madec) dynamical allocation7 !! 3.0 ! 2011-02 (G. Madec) dynamical allocation 8 8 !! - ! 2014 (C. Rousset) add N/S initializations 9 9 !!---------------------------------------------------------------------- … … 25 25 USE dom_ice ! sea-ice domain 26 26 USE limvar ! lim_var_salprof 27 ! 27 28 USE in_out_manager ! I/O manager 28 29 USE lib_mpp ! MPP library … … 37 38 PUBLIC lim_istate ! routine called by lim_init.F90 38 39 39 ! !!** init namelist (namiceini) **40 ! !!** init namelist (namiceini) ** 40 41 REAL(wp) :: rn_thres_sst ! threshold water temperature for initial sea ice 41 42 REAL(wp) :: rn_hts_ini_n ! initial snow thickness in the north … … 57 58 INTEGER , PARAMETER :: jp_tmi = 5 ! index of ice temp at T-point 58 59 INTEGER , PARAMETER :: jp_smi = 6 ! index of ice sali at T-point 59 TYPE(FLD), ALLOCATABLE, DIMENSION(:) :: si 60 TYPE(FLD), ALLOCATABLE, DIMENSION(:) :: si ! structure of input fields (file informations, fields read) 60 61 61 62 LOGICAL :: ln_iceini ! initialization or not … … 74 75 !! ** Purpose : defined the sea-ice initial state 75 76 !! 76 !! ** Method : 77 !! This routine will put some ice where ocean 77 !! ** Method : This routine will put some ice where ocean 78 78 !! is at the freezing point, then fill in ice 79 79 !! state variables using prescribed initial 80 80 !! values in the namelist 81 81 !! 82 !! ** Steps : 83 !! 1) Read namelist 82 !! ** Steps : 1) Read namelist 84 83 !! 2) Basal temperature; ice and hemisphere masks 85 84 !! 3) Fill in the ice thickness distribution using gaussian … … 96 95 !! 4.0 ! 09-11 (M. Vancoppenolle) Enhanced version for ice cats 97 96 !!-------------------------------------------------------------------- 98 99 !! * Local variables 100 INTEGER :: ji, jj, jk, jl ! dummy loop indices 101 REAL(wp) :: ztmelts, zdh 102 INTEGER :: i_hemis, i_fill, jl0 97 INTEGER :: ji, jj, jk, jl ! dummy loop indices 98 REAL(wp) :: ztmelts, zdh 99 INTEGER :: i_hemis, i_fill, jl0 103 100 REAL(wp) :: ztest_1, ztest_2, ztest_3, ztest_4, ztests, zsigma, zarg, zA, zV, zA_cons, zV_cons, zconv 104 101 REAL(wp), POINTER, DIMENSION(:,:) :: zswitch ! ice indicator … … 108 105 !-------------------------------------------------------------------- 109 106 110 CALL wrk_alloc( jpi, jpj, jpl,zh_i_ini, za_i_ini, zv_i_ini )111 CALL wrk_alloc( jpi, jpj,zht_i_ini, zat_i_ini, zvt_i_ini, zts_u_ini, zht_s_ini, zsm_i_ini, ztm_i_ini )112 CALL wrk_alloc( jpi, jpj,zswitch )107 CALL wrk_alloc( jpi,jpj,jpl, zh_i_ini, za_i_ini, zv_i_ini ) 108 CALL wrk_alloc( jpi,jpj, zht_i_ini, zat_i_ini, zvt_i_ini, zts_u_ini, zht_s_ini, zsm_i_ini, ztm_i_ini ) 109 CALL wrk_alloc( jpi,jpj, zswitch ) 113 110 114 111 IF(lwp) WRITE(numout,*) 115 IF(lwp) WRITE(numout,*) 'lim_istate : Ice initialization '116 IF(lwp) WRITE(numout,*) '~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~'112 IF(lwp) WRITE(numout,*) 'lim_istate : sea-ice initialization ' 113 IF(lwp) WRITE(numout,*) '~~~~~~~~~~ ' 117 114 118 115 !-------------------------------------------------------------------- 119 116 ! 1) Read namelist 120 117 !-------------------------------------------------------------------- 121 118 ! 122 119 CALL lim_istate_init ! reading the initials parameters of the ice 123 120 … … 134 131 135 132 IF( ln_iceini ) THEN 136 133 ! 137 134 !-------------------------------------------------------------------- 138 135 ! 2) Basal temperature, ice mask and hemispheric index 139 136 !-------------------------------------------------------------------- 140 137 ! 141 138 DO jj = 1, jpj ! ice if sst <= t-freez + ttest 142 139 DO ji = 1, jpi … … 153 150 !-------------------------------------------------------------------- 154 151 IF( ln_iceini_file )THEN 155 152 ! 156 153 zht_i_ini(:,:) = si(jp_hti)%fnow(:,:,1) 157 154 zht_s_ini(:,:) = si(jp_hts)%fnow(:,:,1) … … 160 157 ztm_i_ini(:,:) = si(jp_tmi)%fnow(:,:,1) 161 158 zsm_i_ini(:,:) = si(jp_smi)%fnow(:,:,1) 162 159 ! 163 160 ELSE ! ln_iceini_file = F 164 161 ! 165 162 !----------------------------- 166 163 ! 3.1) Hemisphere-dependent arrays … … 186 183 END DO 187 184 END DO 188 185 ! 189 186 ENDIF ! ln_iceini_file 190 187 … … 200 197 za_i_ini(:,:,:) = 0._wp 201 198 zv_i_ini(:,:,:) = 0._wp 202 199 ! 203 200 DO jj = 1, jpj 204 201 DO ji = 1, jpi 205 202 ! 206 203 IF( zat_i_ini(ji,jj) > 0._wp .AND. zht_i_ini(ji,jj) > 0._wp )THEN 207 208 ztest_1 = 0 ; ztest_2 = 0 ; ztest_3 = 0 ;ztest_4 = 0204 ! 205 ztest_1 = 0 ; ztest_2 = 0 ; ztest_3 = 0 ; ztest_4 = 0 209 206 ! ztests = 0 210 207 ! 211 208 DO i_fill = jpl, 1, -1 212 213 ! IF( ztests .NE.4 ) THEN214 IF ( ( ztest_1 + ztest_2 + ztest_3 + ztest_4 ) .NE.4 ) THEN209 ! 210 ! IF( ztests /= 4 ) THEN 211 IF ( ( ztest_1 + ztest_2 + ztest_3 + ztest_4 ) /= 4 ) THEN 215 212 !---------------------------- 216 213 ! fill the i_fill categories … … 223 220 za_i_ini(ji,jj,2:jpl) = 0._wp 224 221 ELSE 225 222 ! 226 223 ! *** >1 categores to fill 227 224 !--- Ice thicknesses in the i_fill - 1 first categories … … 229 226 zh_i_ini(ji,jj,jl) = hi_mean(jl) 230 227 END DO 231 228 ! 232 229 !--- jl0: most likely index where cc will be maximum 233 230 DO jl = 1, jpl … … 238 235 END DO 239 236 jl0 = MIN(jl0, i_fill) 240 237 ! 241 238 !--- Concentrations 242 239 za_i_ini(ji,jj,jl0) = zat_i_ini(ji,jj) / SQRT(REAL(jpl)) 243 240 DO jl = 1, i_fill - 1 244 IF( jl .NE.jl0 )THEN241 IF( jl /= jl0 )THEN 245 242 zsigma = 0.5 * zht_i_ini(ji,jj) 246 243 zarg = ( zh_i_ini(ji,jj,jl) - zht_i_ini(ji,jj) ) / zsigma … … 248 245 ENDIF 249 246 END DO 250 247 ! 251 248 zA = 0. ! sum of the areas in the jpl categories 252 249 DO jl = 1, i_fill - 1 … … 254 251 END DO 255 252 za_i_ini(ji,jj,i_fill) = zat_i_ini(ji,jj) - zA ! ice conc in the last category 256 IF ( i_fill .LT.jpl ) za_i_ini(ji,jj,i_fill+1:jpl) = 0._wp257 253 IF ( i_fill < jpl ) za_i_ini(ji,jj,i_fill+1:jpl) = 0._wp 254 ! 258 255 !--- Ice thickness in the last category 259 256 zV = 0. ! sum of the volumes of the N-1 categories … … 262 259 END DO 263 260 zh_i_ini(ji,jj,i_fill) = ( zvt_i_ini(ji,jj) - zV ) / za_i_ini(ji,jj,i_fill) 264 IF ( i_fill .LT.jpl ) zh_i_ini(ji,jj,i_fill+1:jpl) = 0._wp265 261 IF ( i_fill < jpl ) zh_i_ini(ji,jj,i_fill+1:jpl) = 0._wp 262 ! 266 263 !--- volumes 267 264 zv_i_ini(ji,jj,:) = za_i_ini(ji,jj,:) * zh_i_ini(ji,jj,:) 268 IF ( i_fill .LT.jpl ) zv_i_ini(ji,jj,i_fill+1:jpl) = 0._wp269 265 IF ( i_fill < jpl ) zv_i_ini(ji,jj,i_fill+1:jpl) = 0._wp 266 ! 270 267 ENDIF ! i_fill 271 268 ! 272 269 !--------------------- 273 270 ! Compatibility tests … … 275 272 ! Test 1: area conservation 276 273 zA_cons = SUM(za_i_ini(ji,jj,:)) ; zconv = ABS(zat_i_ini(ji,jj) - zA_cons ) 277 IF ( zconv .LT. 1.0e-6 ) THEN 278 ztest_1 = 1 279 ELSE 280 ztest_1 = 0 274 IF( zconv < 1.0e-6 ) THEN ; ztest_1 = 1. 275 ELSE ; ztest_1 = 0. 281 276 ENDIF 282 277 ! 283 278 ! Test 2: volume conservation 284 279 zV_cons = SUM(zv_i_ini(ji,jj,:)) 285 zconv = ABS(zvt_i_ini(ji,jj) - zV_cons) 286 287 IF( zconv .LT. 1.0e-6 ) THEN 288 ztest_2 = 1 289 ELSE 290 ztest_2 = 0 280 zconv = ABS(zvt_i_ini(ji,jj) - zV_cons) 281 IF( zconv < 1.0e-6 ) THEN ; ztest_2 = 1. 282 ELSE ; ztest_2 = 0. 291 283 ENDIF 292 284 ! 293 285 ! Test 3: thickness of the last category is in-bounds ? 294 IF ( zh_i_ini(ji,jj,i_fill) > hi_max(i_fill-1) ) THEN 295 ztest_3 = 1 296 ELSE 297 ztest_3 = 0 286 IF( zh_i_ini(ji,jj,i_fill) > hi_max(i_fill-1) ) THEN ; ztest_3 = 1. 287 ELSE ; ztest_3 = 0. 298 288 ENDIF 299 289 ! 300 290 ! Test 4: positivity of ice concentrations 301 291 ztest_4 = 1 302 292 DO jl = 1, jpl 303 IF ( za_i_ini(ji,jj,jl) .LT. 0._wp ) THEN 304 ztest_4 = 0 305 ENDIF 293 IF( za_i_ini(ji,jj,jl) < 0._wp ) ztest_4 = 0 306 294 END DO 307 295 ! 308 296 ENDIF ! ztest_1 + ztest_2 + ztest_3 + ztest_4 309 297 ! 310 298 ztests = ztest_1 + ztest_2 + ztest_3 + ztest_4 311 299 ! 312 300 END DO ! i_fill 313 301 ! 314 302 IF(lwp) THEN 315 WRITE(numout,*) ' ztests : ', ztests 316 IF( ztests .NE. 4 )THEN 303 IF( ztests /= 4 ) THEN 317 304 WRITE(numout,*) 318 305 WRITE(numout,*) ' !!!! ALERT !!! ' 319 306 WRITE(numout,*) ' !!!! Something is wrong in the LIM3 initialization procedure ' 320 307 WRITE(numout,*) 321 WRITE(numout,*) ' *** ztests is not equal to 4 '308 WRITE(numout,*) ' *** ztests is not equal to 4 : ztests : ', ztests 322 309 WRITE(numout,*) ' *** ztest_i (i=1,4) = ', ztest_1, ztest_2, ztest_3, ztest_4 323 310 WRITE(numout,*) ' zat_i_ini : ', zat_i_ini(ji,jj) 324 311 WRITE(numout,*) ' zht_i_ini : ', zht_i_ini(ji,jj) 325 ENDIF ! ztests .NE.4312 ENDIF ! ztests /= 4 326 313 ENDIF 327 314 ! 328 315 ENDIF ! zat_i_ini(ji,jj) > 0._wp .AND. zhm_i_ini(ji,jj) > 0._wp 329 330 END DO331 END DO316 ! 317 END DO 318 END DO 332 319 333 320 !---------------------------------------------------------------------
Note: See TracChangeset
for help on using the changeset viewer.