100 USE modi_gltools_newice_r
102 USE modi_gltools_glterr
106 TYPE(t_dom),
DIMENSION(np),
INTENT(in) :: &
108 TYPE(t_mxl),
DIMENSION(np),
INTENT(inout) :: &
110 TYPE(t_sit),
DIMENSION(nt,np),
INTENT(inout) :: &
112 TYPE(t_vtp),
DIMENSION(nt,np),
INTENT(inout) :: &
114 TYPE(t_dia),
DIMENSION(np),
INTENT(inout) :: &
116 TYPE(t_sit),
DIMENSION(ntd,np),
INTENT(in) :: &
121 INTEGER,
PARAMETER :: &
127 REAL,
DIMENSION(np) :: &
128 zdamp,zwork,zfsit_i,zhsit_i,zfac,zfacfsi, &
129 zenti_i,zents_i,zenti_f,zents_f
130 REAL,
DIMENSION(nt,np) :: &
131 zfsi,zhsi,zfsinew,zhsinew
140 CALL
glt_aventh( tpsit,tpsil,zenti_i,zents_i )
151 IF ( chsidmp(1:4)==
'DAMP' .OR. trim(chsidmp)==
'PRESCRIBE' )
THEN
155 zfsinew(:,:) = tpsit(:,:)%fsi
156 zhsinew(:,:) = tpsit(:,:)%hsi
157 zfsit_i(:) = sum( tpsit(:,:)%fsi,dim=1 )
168 IF ( (
SIZE(tpsit_d(1,:)%hsi) > 0) .AND. &
169 (maxval( tpsit_d(1,:)%hsi ) < -1.) )
THEN
171 'Wrong ice thickness damping data (all %hsi < -1).',
'STOP' )
178 IF ( chsidmp(1:4)==
'DAMP' )
THEN
179 zdhsit = dtt / ( xhsidmpeft*xday2sec ) * &
180 ( tpsit_d(1,jp)%hsi - zhsit_i(jp) )
181 ELSE IF ( trim(chsidmp)==
'PRESCRIBE' )
THEN
182 zdhsit = tpsit_d(1,jp)%hsi - zhsit_i(jp)
185 IF ( zfsit_i(jp)>epsil1 )
THEN
203 IF ( trim(chsidmp)==
'DAMP_ADD' .OR. trim(chsidmp)==
'PRESCRIBE')
THEN
207 DO WHILE( gcontinue .AND. jk<=5 )
209 zmin = minval(zhsinew(:,jp),mask=zfsinew(:,jp)>epsil1)
213 IF ( zdhsit/zfsit0+zmin>0. )
THEN
214 WHERE( zfsinew(:,jp)>epsil1 )
215 zhsinew(:,jp) = zhsinew(:,jp) + zdhsit/zfsit0
221 WHERE( zfsinew(:,jp)>epsil1 )
222 zhsinew(:,jp) = zhsinew(:,jp)-zmin
224 zdhsit = zdhsit+zmin*zfsit0
226 WHERE ( zhsinew(:,jp)<epsil1 )
229 zfsit0 = sum( zfsinew(:,jp) )
232 WHERE ( tpsit(:,jp)%hsi>epsil1 .AND. zhsinew(:,jp)<=epsil1 )
233 tpsit(:,jp)%esi = .false.
240 ELSE IF ( trim(chsidmp)==
'DAMP_FAC' )
THEN
242 IF ( zhsit_i(jp)>epsil1 )
THEN
243 zfac(jp) = 1. + zdhsit/zhsit_i(jp)
249 IF ( abs(zfac(jp)-1.) > ppcent )
THEN
252 IF ( zfac(jp) < 1.-ppcent )
THEN
253 zfacfsi(jp) = zfac(jp)/(1.-ppcent)
258 IF ( zfsit_i(jp)<xfsic )
THEN
259 zfacfsi(jp) = exp( dtt/(3.*xday2sec)*log( xfsic/zfsit_i(jp) ) )
260 zfac(jp) = amin1( zfac(jp)/zfacfsi(jp),1.+ppcent )
267 zfsinew(:,jp) = zfacfsi(jp) * tpsit(:,jp)%fsi
268 zhsinew(:,jp) = zfac(jp) * tpsit(:,jp)%hsi
275 zhsi(1,jp) = zdhsit / xfsic
279 tpsit(:,:)%hsi = zhsinew(:,:)
280 tpsit(:,:)%fsi = zfsinew(:,:)
288 tpdia(:)%dci = tpdia(:)%dci + &
307 IF ( trim(cfsidmp)==
'DAMP' .OR. trim(cfsidmp)==
'PRESCRIBE' )
THEN
311 zfsinew(:,:) = tpsit(:,:)%fsi
312 zhsinew(:,:) = tpsit(:,:)%hsi
313 zfsit_i(:) = sum( tpsit(:,:)%fsi,dim=1 )
324 IF ( (
SIZE(tpsit_d(1,:)%fsi) > 0) .AND. &
325 ( minval( tpsit_d(1,:)%fsi ) < 0. .OR. &
326 maxval( tpsit_d(1,:)%fsi ) > 1. ))
THEN
328 'Wrong ice concentration damping data &
329 & (probably given in % instead of fraction of unity).',
'STOP' )
333 IF ( zfsit_i(jp)>epsil1 )
THEN
337 IF ( trim(cfsidmp)==
'DAMP' )
THEN
338 zdamp(jp) = dtt / ( xfsidmpeft*xday2sec ) * &
339 ( min(tpsit_d(1,jp)%fsi,xfsimax) - zfsit_i(jp) )
342 tpsit(jk,jp)%fsi = tpsit(jk,jp)%fsi * &
343 ( 1. + zdamp(jp) / zfsit_i(jp) )
345 tpsit(jk,jp)%hsi = tpsit(jk,jp)%hsi / &
346 ( 1. + zdamp(jp) / zfsit_i(jp) )
349 ELSE IF ( trim(cfsidmp)==
'PRESCRIBE' )
THEN
351 min(tpsit_d(1,jp)%fsi,xfsimax) / zfsit_i(jp), epsil1 )
353 tpsit(jk,jp)%fsi = tpsit(jk,jp)%fsi * zwork(jp)
355 tpsit(jk,jp)%hsi = tpsit(jk,jp)%hsi / zwork(jp)
373 IF ( trim(cfsidmp)==
'DAMP' )
THEN
374 zfsi(1,jp) = dtt / ( xfsidmpeft*xday2sec ) * &
375 ( min(tpsit_d(1,jp)%fsi,xfsimax) - zfsit_i(jp) )
376 ELSE IF ( trim(cfsidmp)==
'PRESCRIBE' )
THEN
377 zfsi(1,jp) = min(tpsit_d(1,jp)%fsi,xfsimax)
392 zwork(:) = sum( tpsit(:,:)%fsi,dim=1 )
394 WHERE ( zwork(:) > xfsimax )
395 tpsit(jk,:)%fsi = tpsit(jk,:)%fsi * xfsimax / zwork(:)
401 tpdia(:)%dci = tpdia(:)%dci + &
406 tpdia(:)%cst = 100.*tpsit_d(1,:)%fsi
418 CALL
glt_aventh( tpsit,tpsil,zenti_f,zents_f )
419 tpdia(:)%dmp = ( zenti_f+zents_f-zenti_i-zents_i ) / dtt
subroutine glt_constrain_r(tpdom, tpmxl, tpsit, tpsil, tpdia, tpsit_d)