59 USE modd_glt_param, ONLY : nl, nt, nx, ny, nxglo, nyglo, xdomsrf, &
60 xdomsrf_g, nprinto, cfsidmp, chsidmp, &
61 xfsidmpeft, xhsidmpeft, ntd
65 USE modi_gltools_alloc
66 USE modi_gltools_readnam
69 USE modi_interpol_sst_mth
75 USE yomhook
,ONLY : lhook, dr_hook
76 USE parkind1
,ONLY : jprb
89 CHARACTER(LEN=6),
INTENT(IN) :: hprogram
90 INTEGER,
INTENT(IN) :: klu
91 INTEGER,
INTENT(IN) :: kluout
98 INTEGER :: jmth, inmth
99 CHARACTER(LEN=2 ) :: ymth
100 CHARACTER(LEN=5) :: ylvl
102 CHARACTER(LEN=12) :: ycateg
103 CHARACTER(LEN=12) :: ylevel
104 CHARACTER(LEN=12) :: yrecfm
105 CHARACTER(LEN=200) :: ymess
108 INTEGER :: inl_in_file,int_in_file
111 REAL(KIND=JPRB) :: zhook_handle
114 IF (lhook) CALL dr_hook(
'READ_SEAICE_n',0,zhook_handle)
116 IF (.NOT.s%LHANDLE_SIC)
THEN
118 IF (lhook) CALL dr_hook(
'READ_SEAICE_n',1,zhook_handle)
124 ALLOCATE(s%XSIC(klu))
133 IF(s%LINTERPOL_SIC)
THEN
135 ALLOCATE(s%XFSIC(klu))
140 ALLOCATE(s%XSIC_MTH(klu,inmth))
142 WRITE(ymth,
'(I2)') (jmth-1)
143 yrecfm=
'SIC_MTH'//adjustl(ymth(:len_trim(ymth)))
145 hprogram,yrecfm,s%XSIC_MTH(:,jmth),iresp)
150 s%TTIME%TDATE%YEAR,s%TTIME%TDATE%MONTH,s%TTIME%TDATE%DAY,
'C',s%XFSIC)
152 IF (any(s%XFSIC(:)>1.0).OR.any(s%XFSIC(:)<0.0))
THEN
153 CALL
abor1_sfx(
'READ_SEAICE_n: FSIC should be >=0 and <=1')
159 ALLOCATE(s%XSIC_MTH(0,0))
170 hprogram,
'SEAICE_SCHEM',s%CSEAICE_SCHEME,iresp)
172 IF (trim(s%CSEAICE_SCHEME) ==
'GELATO' .AND. (nblocktot>1))
THEN
173 CALL
abor1_sfx(
"READ_SEAICE_n: GELATO CANNOT YET RUN MULTI-THREAD")
176 IF (trim(s%CSEAICE_SCHEME) ==
'NONE' )
THEN
177 IF (s%LINTERPOL_SIC )
THEN
180 s%XICE_ALB=xalbseaice
181 IF (lhook) CALL dr_hook(
'READ_SEAICE_n',1,zhook_handle)
184 CALL
abor1_sfx(
"READ_SEAICE_n: MUST HAVE CINTERPOL_SIC /= NONE WITH CSEAICE_SCHEME == NONE ")
187 IF (trim(s%CSEAICE_SCHEME) /=
'GELATO')
THEN
188 WRITE(kluout,*)
'READ_SEAICE_n:CSEAICE_SCHEME read in PREP, ',s%CSEAICE_SCHEME,
', is not yet handled'
189 CALL
abor1_sfx(
"READ_SEAICE_n:CAN ONLY HANDLE GELATO SEAICE MODEL YET (and not the one quoted in PREP)")
200 CALL
abor1_sfx(
'READ_SEAICEN: CANNOT YET MANAGE BOTH TRUE LCPL_SEAICE AND CSEAICE_SCHEME = GELATO')
203 #if ! defined in_arpege
206 IF (nprinto > 0)
THEN
207 WRITE(kluout,*)
'Gelato cannot yet compute global averages when running in Arpege (because of collective comm vs. NPROMA blocks)'
215 IF(s%LINTERPOL_SIC)
THEN
216 IF (s%XSIC_EFOLDING_TIME==0.0)
THEN
220 xfsidmpeft=s%XSIC_EFOLDING_TIME
224 IF(s%LINTERPOL_SIT)
THEN
225 IF (s%XSIT_EFOLDING_TIME==0.0)
THEN
229 xhsidmpeft= s%XSIT_EFOLDING_TIME
246 hprogram,
'ICENL',inl_in_file,iresp)
247 IF (inl_in_file /= nl)
THEN
248 WRITE(ymess,
'("Mismatch in # of seaice layers : prep=",I2," nml=",I2)') inl_in_file, nl
252 hprogram,
'ICENT',int_in_file,iresp)
253 IF (int_in_file /= nt)
THEN
254 WRITE(ymess,
'("Mismatch in # of seaice categories : prep=",I2," nml=",I2)') int_in_file, nt
261 hprogram,
'ICEUSTAR',s%TGLT%ust(:,1),iresp)
266 WRITE(ylvl,
'(I2)') jk
267 ycateg=
'_'//adjustl(ylvl)
270 hprogram,
'ICEAGE'//ycateg,s%TGLT%sit(jk,:,1)%age,iresp)
273 hprogram,
'ICEVMP'//ycateg,s%TGLT%sit(jk,:,1)%vmp,iresp)
276 hprogram,
'ICEASN'//ycateg,s%TGLT%sit(jk,:,1)%asn,iresp)
279 hprogram,
'ICEFSI'//ycateg, s%TGLT%sit(jk,:,1)%fsi,iresp)
282 hprogram,
'ICEHSI'//ycateg, s%TGLT%sit(jk,:,1)%hsi,iresp)
285 hprogram,
'ICESSI'//ycateg, s%TGLT%sit(jk,:,1)%ssi,iresp)
288 hprogram,
'ICETSF'//ycateg, s%TGLT%sit(jk,:,1)%tsf,iresp)
291 hprogram,
'ICEHSN'//ycateg, s%TGLT%sit(jk,:,1)%hsn,iresp)
294 hprogram,
'ICERSN'//ycateg, s%TGLT%sit(jk,:,1)%rsn,iresp)
299 WRITE(ylvl,
'(I2)') jl
300 ylevel=ycateg(1:len_trim(ycateg))//
'_'//adjustl(ylvl)
303 hprogram,
'ICEH'//ylevel, s%TGLT%sil(jl,jk,:,1)%ent,iresp)
309 WHERE ( s%TGLT%sit(:,:,1)%fsi<epsil1 )
310 s%TGLT%sit(:,:,1)%esi = .false.
312 s%TGLT%sit(:,:,1)%esi = .true.
321 IF ( s%TGLT%sit(jl,jx,1)%fsi<0. )
THEN
323 '**** WARNING **** Correcting problem in ice conc. < 0 at i=', &
325 s%TGLT%sit(jl,jx,1)%fsi = 0.
329 zfsit = sum( s%TGLT%sit(:,jx,1)%fsi )
335 '**** WARNING **** Correcting problem in total ice conc. >1 at i=', &
336 1,
' j=',jx,
' fsi=',zfsit
337 s%TGLT%sit(:,jx,1)%fsi = s%TGLT%sit(:,jx,1)%fsi / zfsit
342 WHERE( s%TGLT%sit(:,jx,1)%fsi>epsil1 .AND. s%TGLT%sit(:,jx,1)%hsi<epsil1)
343 s%TGLT%sit(:,jx,1)%fsi=0.
344 s%TGLT%sit(:,jx,1)%hsi=0.
345 s%TGLT%sit(:,jx,1)%hsn=0.
354 s%TGLT%dom(:,1)%tmk=1
355 s%TGLT%dom(:,1)%imk=1
359 s%TGLT%dom(:,1)%umk=1
360 s%TGLT%dom(:,1)%vmk=1
364 s%TGLT%dom(:,1)%lon=sg%XLON(:)*xpi/180.
365 s%TGLT%dom(:,1)%lat=sg%XLAT(:)*xpi/180.
370 s%TGLT%dom(:,1)%dxc=sg%XMESH_SIZE(:)**0.5
371 s%TGLT%dom(:,1)%dyc=s%TGLT%dom(:,1)%dxc
372 s%TGLT%dom(:,1)%srf=sg%XMESH_SIZE(:)
376 xdomsrf = sum( s%TGLT%dom(:,1)%srf, mask=(s%TGLT%dom(:,1)%tmk==1) )
378 #if ! defined in_arpege
382 xdomsrf_g = max(xdomsrf_g, 1.e-9)
393 s%TGLT%ind%end=50000000
397 s%TGLT%bat(:,1)=-s%XSEABATHY
402 IF(s%LINTERPOL_SIT)
THEN
404 ALLOCATE(s%XFSIT(klu))
409 ALLOCATE(s%XSIT_MTH(klu,inmth))
411 WRITE(ymth,
'(I2)') (jmth-1)
412 yrecfm=
'SIT_MTH'//adjustl(ymth(:len_trim(ymth)))
414 hprogram,yrecfm,s%XSIT_MTH(:,jmth),iresp)
419 s%TTIME%TDATE%YEAR,s%TTIME%TDATE%MONTH,s%TTIME%TDATE%DAY,
'H',s%XFSIT)
424 ALLOCATE(s%XSIT_MTH(0,0))
432 s%XSIC(:) = s%TGLT%ice_atm(1,:,1)%fsi
433 s%XTICE(:) = s%TGLT%ice_atm(1,:,1)%tsf
434 s%XICE_ALB(:) = s%TGLT%ice_atm(1,:,1)%alb
437 s%TGLT%oce_all(:,1)%tml=s%XSST(:)
439 IF (lhook) CALL dr_hook(
'READ_SEAICE_n',1,zhook_handle)
450 CHARACTER(LEN=12),
INTENT(IN) :: hfield
451 REAL,
DIMENSION(:),
INTENT(IN) :: pfield
456 REAL(KIND=JPRB) :: zhook_handle
458 IF (lhook) CALL dr_hook(
'READ_SEAICE_n:CHECK_SEAICE',0,zhook_handle)
466 IF(pfield(ji)>zmax.OR.pfield(ji)<zmin)
THEN
468 WRITE(kluout,*)
'PROBLEM FIELD '//trim(hfield)//
' =',pfield(ji),&
469 'NOT REALISTIC AT LOCATION (LAT/LON)',sg%XLAT(ji),sg%XLON(ji)
473 IF(ierrc>0) CALL
abor1_sfx(
'READ_SEAICE_n: FIELD '//trim(hfield)//
' NOT REALISTIC')
475 IF (lhook) CALL dr_hook(
'READ_SEAICE_n:CHECK_SEAICE',1,zhook_handle)
subroutine read_seaice_n(SG, S, HPROGRAM, KLU, KLUOUT)
subroutine check_seaice(HFIELD, PFIELD)
subroutine abor1_sfx(YTEXT)
subroutine interpol_sst_mth(S, KYEAR, KMONTH, KDAY, HFLAG, POUT)
subroutine glt_sndatmf(tpglt, xtmlf)