56 USE modd_types_glt
, ONLY : t_glt
57 USE modd_glt_param
, ONLY : nl, nt, nx, ny, nxglo, nyglo, xdomsrf, &
58 xdomsrf_g, nprinto, cfsidmp, chsidmp, &
59 xfsidmpeft, xhsidmpeft, ntd
60 USE modd_glt_const_thm
, ONLY : epsil1
61 USE lib_mpp
, ONLY : mpp_sum
63 USE modi_gltools_alloc
64 USE modi_gltools_readnam
67 USE modi_interpol_sst_mth
83 TYPE(
grid_t),
INTENT(INOUT) :: G
86 CHARACTER(LEN=6),
INTENT(IN) :: HPROGRAM
87 INTEGER,
INTENT(IN) :: KLU
88 INTEGER,
INTENT(IN) :: KLUOUT
95 INTEGER :: JMTH, INMTH
96 CHARACTER(LEN=2 ) :: YMTH
97 CHARACTER(LEN=5) :: YLVL
99 CHARACTER(LEN=12) :: YCATEG
100 CHARACTER(LEN=12) :: YLEVEL
101 CHARACTER(LEN=12) :: YRECFM
102 CHARACTER(LEN=200) :: YMESS
105 INTEGER :: inl_in_file,int_in_file
108 REAL(KIND=JPRB) :: ZHOOK_HANDLE
113 IF (.NOT.s%LHANDLE_SIC)
THEN 121 ALLOCATE(s%XSIC(klu))
130 IF(s%LINTERPOL_SIC)
THEN 132 ALLOCATE(s%XFSIC(klu))
137 ALLOCATE(s%XSIC_MTH(klu,inmth))
139 WRITE(ymth,
'(I2)') (jmth-1)
140 yrecfm=
'SIC_MTH'//adjustl(ymth(:len_trim(ymth)))
141 CALL read_surf(hprogram,yrecfm,s%XSIC_MTH(:,jmth),iresp)
147 IF (any(s%XFSIC(:)>1.0).OR.any(s%XFSIC(:)<0.0))
THEN 148 CALL abor1_sfx(
'READ_SEAICE_n: FSIC should be >=0 and <=1')
154 ALLOCATE(s%XSIC_MTH(0,0))
164 CALL read_surf(hprogram,
'SEAICE_SCHEM',s%CSEAICE_SCHEME,iresp)
166 IF (
trim(s%CSEAICE_SCHEME) ==
'NONE' )
THEN 167 IF (s%LINTERPOL_SIC )
THEN 174 CALL abor1_sfx(
"READ_SEAICE_n: MUST HAVE CINTERPOL_SIC /= NONE WITH CSEAICE_SCHEME == NONE " 177 IF (
trim(s%CSEAICE_SCHEME) /=
'GELATO')
THEN 178 WRITE(kluout,*)
'READ_SEAICE_n:CSEAICE_SCHEME read in PREP, ',s%CSEAICE_SCHEME
', is not yet handled' 179 CALL abor1_sfx(
"READ_SEAICE_n:CAN ONLY HANDLE GELATO SEAICE MODEL YET (and not the one quoted in PREP)" 190 CALL abor1_sfx(
'READ_SEAICEN: CANNOT YET MANAGE BOTH TRUE LCPL_SEAICE AND CSEAICE_SCHEME = GELATO' 193 #if ! defined in_arpege 196 IF (nprinto > 0)
THEN 197 WRITE(kluout,*)
'Gelato cannot yet compute global averages when running in Arpege (because of collective comm vs. NPROMA blocks)' 205 IF(s%LINTERPOL_SIC)
THEN 206 IF (s%XSIC_EFOLDING_TIME==0.0)
THEN 210 xfsidmpeft=s%XSIC_EFOLDING_TIME
214 IF(s%LINTERPOL_SIT)
THEN 215 IF (s%XSIT_EFOLDING_TIME==0.0)
THEN 219 xhsidmpeft= s%XSIT_EFOLDING_TIME
227 CALL gltools_readnam(.false.,kluout)
231 CALL gltools_alloc(s%TGLT)
235 CALL read_surf(hprogram,
'ICENL',inl_in_file,iresp)
236 IF (inl_in_file /= nl)
THEN 237 WRITE(ymess,
'("Mismatch in # of seaice layers : prep=",I2," nml=",I2)' 240 CALL read_surf(hprogram,
'ICENT',int_in_file,iresp)
241 IF (int_in_file /= nt)
THEN 242 WRITE(ymess,
'("Mismatch in # of seaice categories : prep=",I2," nml=",I2)' 248 CALL read_surf(hprogram,
'ICEUSTAR',s%TGLT%ust(:,1),iresp)
253 WRITE(ylvl,
'(I2)') jk
254 ycateg=
'_'//adjustl(ylvl)
256 CALL read_surf(hprogram,
'ICEAGE'//ycateg,s%TGLT%sit(jk,:,1)%age,iresp
258 CALL read_surf(hprogram,
'ICEVMP'//ycateg,s%TGLT%sit(jk,:,1)%vmp,iresp
260 CALL read_surf(hprogram,
'ICEASN'//ycateg,s%TGLT%sit(jk,:,1)%asn,iresp
262 CALL read_surf(hprogram,
'ICEFSI'//ycateg, s%TGLT%sit(jk,:,1)%fsi,iresp
264 CALL read_surf(hprogram,
'ICEHSI'//ycateg, s%TGLT%sit(jk,:,1)%hsi,iresp
266 CALL read_surf(hprogram,
'ICESSI'//ycateg, s%TGLT%sit(jk,:,1)%ssi,iresp
268 CALL read_surf(hprogram,
'ICETSF'//ycateg, s%TGLT%sit(jk,:,1)%tsf,iresp
270 CALL read_surf(hprogram,
'ICEHSN'//ycateg, s%TGLT%sit(jk,:,1)%hsn,iresp
272 CALL read_surf(hprogram,
'ICERSN'//ycateg, s%TGLT%sit(jk,:,1)%rsn,iresp
277 WRITE(ylvl,
'(I2)') jl
278 ylevel=ycateg(1:len_trim(ycateg))//
'_'//adjustl(ylvl)
280 CALL read_surf(hprogram,
'ICEH'//ylevel, s%TGLT%sil(jl,jk,:,1)%ent,iresp
286 WHERE ( s%TGLT%sit(:,:,1)%fsi<epsil1 )
287 s%TGLT%sit(:,:,1)%esi = .false.
289 s%TGLT%sit(:,:,1)%esi = .true.
298 IF ( s%TGLT%sit(jl,jx,1)%fsi<0. )
THEN 300 '**** WARNING **** Correcting problem in ice conc. < 0 at i=' 302 s%TGLT%sit(jl,jx,1)%fsi = 0.
306 zfsit =
sum( s%TGLT%sit(:,jx,1)%fsi )
312 '**** WARNING **** Correcting problem in total ice conc. >1 at i=' 313 ' j=',jx,
' fsi=',zfsit
314 s%TGLT%sit(:,jx,1)%fsi = s%TGLT%sit(:,jx,1)%fsi / zfsit
319 WHERE( s%TGLT%sit(:,jx,1)%fsi>epsil1 .AND. s%TGLT%sit(:,jx,1)%hsi<epsil1
331 s%TGLT%dom(:,1)%tmk=1
332 s%TGLT%dom(:,1)%imk=1
336 s%TGLT%dom(:,1)%umk=1
337 s%TGLT%dom(:,1)%vmk=1
341 s%TGLT%dom(:,1)%lon=g%XLON(:)*
xpi/180.
342 s%TGLT%dom(:,1)%lat=g%XLAT(:)*
xpi/180.
347 s%TGLT%dom(:,1)%dxc=g%XMESH_SIZE(:)**0.5
348 s%TGLT%dom(:,1)%dyc=s%TGLT%dom(:,1)%dxc
349 s%TGLT%dom(:,1)%srf=g%XMESH_SIZE(:)
353 xdomsrf =
sum( s%TGLT%dom(:,1)%srf,
mask=(s%TGLT%dom(:,1)%tmk==1) )
355 #if ! defined in_arpege 356 CALL mpp_sum(xdomsrf_g)
359 xdomsrf_g = max(xdomsrf_g, 1.e-9)
370 s%TGLT%ind%end=50000000
374 s%TGLT%bat(:,1)=-s%XSEABATHY
379 IF(s%LINTERPOL_SIT)
THEN 381 ALLOCATE(s%XFSIT(klu))
386 ALLOCATE(s%XSIT_MTH(klu,inmth))
388 WRITE(ymth,
'(I2)') (jmth-1)
389 yrecfm=
'SIT_MTH'//adjustl(ymth(:len_trim(ymth)))
390 CALL read_surf(hprogram,yrecfm,s%XSIT_MTH(:,jmth),iresp)
399 ALLOCATE(s%XSIT_MTH(0,0))
406 CALL glt_sndatmf( s%TGLT,
xttsi -
xtt )
407 s%XSIC(:) = s%TGLT%ice_atm(1,:,1)%fsi
408 s%XTICE(:) = s%TGLT%ice_atm(1,:,1)%tsf
409 s%XICE_ALB(:) = s%TGLT%ice_atm(1,:,1)%alb
412 s%TGLT%oce_all(:,1)%tml=s%XSST(:)
425 CHARACTER(LEN=12),
INTENT(IN) :: HFIELD
426 REAL,
DIMENSION(:),
INTENT(IN) :: PFIELD
431 REAL(KIND=JPRB) :: ZHOOK_HANDLE
433 IF (
lhook)
CALL dr_hook(
'READ_SEAICE_n:CHECK_SEAICE',0,zhook_handle)
441 IF(pfield(ji)>zmax.OR.pfield(ji)<zmin)
THEN 443 WRITE(kluout,*)
'PROBLEM FIELD '//
trim(hfield)//
' =',pfield(ji),&
444 'NOT REALISTIC AT LOCATION (LAT/LON)',g%XLAT(ji),g%XLON
448 IF(ierrc>0)
CALL abor1_sfx(
'READ_SEAICE_n: FIELD '//
trim(hfield)//
' NOT REALISTIC' 450 IF (
lhook)
CALL dr_hook(
'READ_SEAICE_n:CHECK_SEAICE',1,zhook_handle)
static const char * trim(const char *name, int *n)
subroutine check_seaice(HFIELD, PFIELD)
subroutine abor1_sfx(YTEXT)
subroutine read_seaice_n(G, S, HPROGRAM, KLU, KLUOUT)
subroutine interpol_sst_mth(S, HFLAG)
intent(out) overrides sub arrays one Sort by the least significant key first sum(iindex(1:n))