313 SUBROUTINE sfcdrv(LUGB, IDIM,JDIM,LENSFC,LSOIL,DELTSFC, &
314 IY,IM,ID,IH,FH,IALB, &
315 USE_UFO,DO_NSST,DO_SFCCYCLE,DO_LANDINCR,&
316 FRAC_GRID,COUPLED,ZSEA1,ZSEA2,ISOT,IVEGSRC,MYRANK)
321 USE land_increments,
ONLY: gaussian_to_fv3_interp, &
322 add_increment_soil, &
323 add_increment_snow, &
324 calculate_landinc_mask, &
325 apply_land_da_adjustments_soil, &
326 apply_land_da_adjustments_snd, &
331 INTEGER,
INTENT(IN) :: IDIM, JDIM, LENSFC, LSOIL, IALB
332 INTEGER,
INTENT(IN) :: LUGB, IY, IM, ID, IH
333 INTEGER,
INTENT(IN) :: ISOT, IVEGSRC, MYRANK
335 LOGICAL,
INTENT(IN) :: USE_UFO, DO_NSST,DO_SFCCYCLE
336 LOGICAL,
INTENT(IN) :: DO_LANDINCR, FRAC_GRID, COUPLED
338 REAL,
INTENT(IN) :: FH, DELTSFC, ZSEA1, ZSEA2
340 INTEGER,
PARAMETER :: NLUNIT=35
341 INTEGER,
PARAMETER :: SZ_NML=1
344 REAL,
PARAMETER :: MIN_LAKEICE=0.15
345 REAL,
PARAMETER :: MIN_SEAICE=0.15
347 CHARACTER(LEN=5) :: TILE_NUM
348 CHARACTER(LEN=500) :: NST_FILE
349 CHARACTER(LEN=50) :: FNAME_INC
350 CHARACTER(LEN=4) :: INPUT_NML_FILE(SZ_NML)
353 INTEGER :: I_INDEX(LENSFC), J_INDEX(LENSFC)
354 INTEGER :: IDUM(IDIM,JDIM)
355 integer :: num_parthds, num_threads
360 real(kind=
kind_io8) :: min_ice(lensfc)
362 REAL :: SLMASK(LENSFC), OROG(LENSFC)
363 REAL :: SIHFCS(LENSFC), SICFCS(LENSFC)
364 REAL :: SITFCS(LENSFC), TSFFCS(LENSFC)
365 REAL :: SWEFCS(LENSFC), ZORFCS(LENSFC)
366 REAL :: ALBFCS(LENSFC,4), TG3FCS(LENSFC)
367 REAL :: CNPFCS(LENSFC), SMCFCS(LENSFC,LSOIL)
368 REAL :: STCFCS(LENSFC,LSOIL), SLIFCS(LENSFC)
369 REAL :: AISFCS(LENSFC), F10M(LENSFC)
370 REAL :: VEGFCS(LENSFC), VETFCS(LENSFC)
371 REAL :: SOTFCS(LENSFC), ALFFCS(LENSFC,2)
372 REAL :: CVFCS(LENSFC), CVTFCS(LENSFC)
373 REAL :: CVBFCS(LENSFC), TPRCP(LENSFC)
374 REAL :: SRFLAG(LENSFC), SNDFCS(LENSFC)
375 REAL :: SLCFCS(LENSFC,LSOIL), VMXFCS(LENSFC)
376 REAL :: VMNFCS(LENSFC), T2M(LENSFC)
377 REAL :: Q2M(LENSFC), SLPFCS(LENSFC)
378 REAL :: ABSFCS(LENSFC), OROG_UF(LENSFC)
379 REAL :: USTAR(LENSFC), SOCFCS(LENSFC)
380 REAL :: FMM(LENSFC), FHH(LENSFC)
381 REAL :: RLA(LENSFC), RLO(LENSFC)
382 REAL(KIND=4) :: zsoil(lsoil)
383 REAL :: SIG1T(LENSFC)
386 REAL,
ALLOCATABLE :: STC_BCK(:,:), SMC_BCK(:,:), SLC_BCK(:,:)
387 REAL,
ALLOCATABLE :: SLIFCS_FG(:), SICFCS_FG(:), SIHFCS_FG(:), SITFCS_FG(:)
388 INTEGER,
ALLOCATABLE :: LANDINC_MASK_FG(:), LANDINC_MASK(:)
389 REAL,
ALLOCATABLE :: SND_BCK(:), SND_INC(:), SWE_BCK(:)
390 REAL(KIND=
kind_io8),
ALLOCATABLE :: slmaskl(:), slmaskw(:), landfrac(:)
391 REAL(KIND=
kind_io8),
ALLOCATABLE :: lakefrac(:)
394 real,
dimension(idim,jdim) :: tf_clm,tf_trd,sal_clm
395 real,
dimension(lensfc) :: tf_clm_tile,tf_trd_tile,sal_clm_tile
396 INTEGER :: veg_type_landice
397 INTEGER,
DIMENSION(LENSFC) :: stc_updated, slc_updated
398 REAL,
DIMENSION(LENSFC,LSOIL) :: stcinc, slcinc
400 LOGICAL :: file_exists, do_soilincr, interp_landincr, do_snowincr
401 CHARACTER(LEN=3) :: rankch
402 INTEGER :: lsoil_incr
409 NAMELIST/namsfcd/ nst_file, lsoil_incr, do_snowincr, do_soilincr, interp_landincr
411 DATA nst_file/
'NULL'/
413 do_snowincr = .false.
414 do_soilincr = .false.
415 interp_landincr = .false.
420 input_nml_file =
"NULL"
422 CALL baopenr(37,
"fort.37", ierr)
424 print*,
'FATAL ERROR OPENING FORT.37 NAMELIST. IERR: ', ierr
425 CALL mpi_abort(mpi_comm_world, 30, ierr)
427 READ (37, nml=namsfcd, iostat=ierr)
429 print*,
'FATAL ERROR READING FORT.37 NAMELIST. IERR: ', ierr
430 CALL mpi_abort(mpi_comm_world, 31, ierr)
434 print*,
'IN ROUTINE SFCDRV,IDIM=',idim,
'JDIM=',jdim,
'FH=',fh
442 ALLOCATE(landfrac(lensfc))
443 ALLOCATE(lakefrac(lensfc))
444 IF(frac_grid .OR. coupled)
THEN
445 print*,
'- RUNNING WITH FRACTIONAL GRID.'
447 landfrac=landfrac,lakefrac=lakefrac)
458 i_index = reshape(idum, (/lensfc/))
464 j_index = reshape(idum, (/lensfc/) )
468 print*,
"WILL PROCESS NSST RECORDS."
469 ALLOCATE(nsst%C_0(lensfc))
470 ALLOCATE(nsst%C_D(lensfc))
471 ALLOCATE(nsst%D_CONV(lensfc))
472 ALLOCATE(nsst%DT_COOL(lensfc))
473 ALLOCATE(nsst%IFD(lensfc))
474 ALLOCATE(nsst%QRAIN(lensfc))
475 ALLOCATE(nsst%TREF(lensfc))
476 ALLOCATE(nsst%TFINC(lensfc))
477 ALLOCATE(nsst%W_0(lensfc))
478 ALLOCATE(nsst%W_D(lensfc))
479 ALLOCATE(nsst%XS(lensfc))
480 ALLOCATE(nsst%XT(lensfc))
481 ALLOCATE(nsst%XTTS(lensfc))
482 ALLOCATE(nsst%XU(lensfc))
483 ALLOCATE(nsst%XV(lensfc))
484 ALLOCATE(nsst%XZ(lensfc))
485 ALLOCATE(nsst%XZTS(lensfc))
486 ALLOCATE(nsst%Z_C(lensfc))
487 ALLOCATE(nsst%ZM(lensfc))
488 ALLOCATE(slifcs_fg(lensfc))
491 IF (do_nsst .OR. coupled)
THEN
492 ALLOCATE(sicfcs_fg(lensfc))
496 ALLOCATE(sihfcs_fg(lensfc))
497 ALLOCATE(sitfcs_fg(lensfc))
502 IF (do_soilincr )
THEN
504 print*,
" APPLYING SOIL INCREMENTS"
505 ALLOCATE(stc_bck(lensfc, lsoil), smc_bck(lensfc, lsoil), slc_bck(lensfc,lsoil))
506 ALLOCATE(landinc_mask_fg(lensfc))
509 IF (do_snowincr)
THEN
514 print*,
" APPLYING SNOW INCREMENTS"
515 ALLOCATE(snd_bck(lensfc), snd_inc(lensfc), swe_bck(lensfc))
518 ALLOCATE(landinc_mask(lensfc))
519 if (ivegsrc == 2)
then
530 CALL read_data(lsoil,lensfc,do_nsst,is_noahmp=is_noahmp, &
531 tsffcs=tsffcs,smcfcs=smcfcs, &
532 swefcs=swefcs,stcfcs=stcfcs,tg3fcs=tg3fcs,zorfcs=zorfcs, &
533 cvfcs=cvfcs, cvbfcs=cvbfcs,cvtfcs=cvtfcs,albfcs=albfcs, &
534 vegfcs=vegfcs,slifcs=slifcs,cnpfcs=cnpfcs,f10m=f10m , &
535 vetfcs=vetfcs,sotfcs=sotfcs,alffcs=alffcs,ustar=ustar , &
536 fmm=fmm ,fhh=fhh ,sihfcs=sihfcs,sicfcs=sicfcs, &
537 sitfcs=sitfcs,tprcp=tprcp ,srflag=srflag,sndfcs=sndfcs, &
538 vmnfcs=vmnfcs,vmxfcs=vmxfcs,slcfcs=slcfcs,slpfcs=slpfcs, &
539 absfcs=absfcs,t2m=t2m ,q2m=q2m ,slmask=slmask, &
540 zsoil=zsoil, nsst=nsst)
542 IF (frac_grid .AND. .NOT. is_noahmp)
THEN
543 print *,
'FATAL ERROR: NOAH lsm update does not work with fractional grids.'
544 call mpi_abort(mpi_comm_world, 18, ierr)
547 IF ( (is_noahmp .OR. interp_landincr) .AND. do_snowincr)
THEN
548 print *,
'FATAL ERROR: Snow increment update does not work with NOAH_MP/with interp'
549 call mpi_abort(mpi_comm_world, 29, ierr)
560 print*,
'USE UNFILTERED OROGRAPHY.'
567 IF(nint(slifcs(i)).EQ.2) aisfcs(i) = 1.
570 IF (do_nsst .OR. coupled)
THEN
575 IF (.NOT. do_sfccycle )
THEN
577 print*,
"FIRST GUESS MASK ADJUSTED BY IFD RECORD"
579 WHERE(nint(nsst%IFD) == 3) slifcs_fg = 2.0
582 print*,
"SAVE FIRST GUESS MASK"
593 IF (do_landincr)
THEN
594 CALL calculate_landinc_mask(swefcs, vetfcs, sotfcs, &
595 lensfc,veg_type_landice, landinc_mask)
606 IF (do_sfccycle)
THEN
607 ALLOCATE(slmaskl(lensfc), slmaskw(lensfc))
609 set_mask :
IF (frac_grid)
THEN
612 IF(landfrac(i) > 0.0_kind_io8)
THEN
613 slmaskl(i) = ceiling(landfrac(i)-1.0e-6_kind_io8)
614 slmaskw(i) = floor(landfrac(i)+1.0e-6_kind_io8)
616 IF(nint(slmask(i)) == 1)
THEN
618 print*,
'FATAL ERROR: LAND FRAC AND SLMASK MISMATCH.'
619 CALL mpi_abort(mpi_comm_world, 27, ierr)
621 slmaskl(i) = 0.0_kind_io8
622 slmaskw(i) = 0.0_kind_io8
633 IF(nint(slmask(i)) == 1)
THEN
634 slmaskl(i) = 1.0_kind_io8
635 slmaskw(i) = 1.0_kind_io8
637 slmaskl(i) = 0.0_kind_io8
638 slmaskw(i) = 0.0_kind_io8
646 if(lakefrac(i) > 0.0)
then
647 min_ice(i) = min_lakeice
649 min_ice(i) = min_seaice
655 num_threads = num_parthds()
657 print*,
"CALL SFCCYCLE TO UPDATE SURFACE FIELDS."
658 CALL sfccycle(lugb,lensfc,lsoil,sig1t,deltsfc, &
659 iy,im,id,ih,fh,rla,rlo, &
660 slmaskl,slmaskw, orog, orog_uf, use_ufo, do_nsst, &
661 sihfcs,sicfcs,sitfcs,sndfcs,slcfcs, &
662 vmnfcs,vmxfcs,slpfcs,absfcs, &
663 tsffcs,swefcs,zorfcs,albfcs,tg3fcs, &
664 cnpfcs,smcfcs,stcfcs,slifcs,aisfcs, &
665 vegfcs,vetfcs,sotfcs,socfcs,alffcs, &
666 cvfcs,cvbfcs,cvtfcs,myrank,num_threads, nlunit, &
667 sz_nml, input_nml_file, &
669 ialb,isot,ivegsrc,tile_num,i_index,j_index)
671 DEALLOCATE(slmaskl, slmaskw)
681 IF (nst_file ==
"NULL")
THEN
683 print*,
"NO GSI FILE. ADJUST IFD FOR FORMER ICE POINTS."
685 IF (sicfcs_fg(i) > 0.0 .AND. sicfcs(i) == 0)
THEN
692 print*,
"ADJUST TREF FROM GSI INCREMENT"
696 call get_tf_clm(rla,rlo,jdim,idim,iy,im,id,ih,tf_clm,tf_trd)
697 tf_clm_tile(:) = reshape(tf_clm, (/lensfc/) )
698 tf_trd_tile(:) = reshape(tf_trd, (/lensfc/) )
702 call get_sal_clm(rla,rlo,jdim,idim,iy,im,id,ih,sal_clm)
703 sal_clm_tile(:) = reshape(sal_clm, (/lensfc/) )
711 CALL adjust_nsst(rla,rlo,slifcs,slifcs_fg,tsffcs,sitfcs,sicfcs,sicfcs_fg,&
712 stcfcs,nsst,lensfc,lsoil,idim,jdim,zsea1,zsea2, &
713 tf_clm_tile,tf_trd_tile,sal_clm_tile,landfrac,frac_grid, &
720 if (lakefrac(i) == 0.0)
then
721 sicfcs(i) = sicfcs_fg(i)
722 sihfcs(i) = sihfcs_fg(i)
723 sitfcs(i) = sitfcs_fg(i)
726 deallocate(sihfcs_fg, sitfcs_fg)
730 if (nint(slifcs(i)) /= 1)
then
731 if (sicfcs(i) > 0.0)
then
743 IF (do_landincr)
THEN
747 IF (do_snowincr)
THEN
753 WRITE(rankch,
'(I3.3)') (myrank+1)
754 fname_inc =
"snow_xainc." // rankch
756 INQUIRE(file=trim(fname_inc), exist=file_exists)
757 IF (.not. file_exists)
then
758 print *,
'FATAL ERROR: snow increment (fv3 grid) update requested, &
759 but file does not exist : ', trim(fname_inc)
760 call mpi_abort(mpi_comm_world, 10, ierr)
767 CALL read_data(lsoil,lensfc,.false.,fname_inc=fname_inc,sndfcs=snd_inc)
777 CALL add_increment_snow(snd_inc,landinc_mask,lensfc,sndfcs)
783 CALL apply_land_da_adjustments_snd(lsm, lensfc, landinc_mask, swe_bck, snd_bck, &
789 landinc_mask_fg = landinc_mask
791 IF (do_sfccycle .OR. do_snowincr)
THEN
792 CALL calculate_landinc_mask(swefcs, vetfcs, sotfcs, lensfc, &
793 veg_type_landice, landinc_mask)
802 IF ( do_soilincr )
THEN
803 IF ( interp_landincr )
THEN
809 WRITE(rankch,
'(I3.3)') (myrank+1)
810 fname_inc =
"sfcincr_gsi." // rankch
812 INQUIRE(file=trim(fname_inc), exist=file_exists)
813 IF (.not. file_exists)
then
814 print *,
'FATAL ERROR: gsi soil increment (gaussian grid) update requested, &
815 but file does not exist : ', trim(fname_inc)
816 call mpi_abort(mpi_comm_world, 10, ierr)
825 CALL gaussian_to_fv3_interp(lsoil_incr,rla,rlo,&
826 stcinc,slcinc,landinc_mask,lensfc,lsoil,idim,jdim,lsm,myrank)
832 CALL write_data(lensfc,idim,jdim,lsoil,do_nsst,.true.,nsst, &
833 stcinc=stcinc,slcinc=slcinc)
841 WRITE(rankch,
'(I3.3)') (myrank+1)
842 fname_inc =
"soil_xainc." // rankch
844 INQUIRE(file=trim(fname_inc), exist=file_exists)
845 IF (.not. file_exists)
then
846 print *,
'FATAL ERROR: soil increment (fv3 grid) update requested, but file &
847 does not exist: ', trim(fname_inc)
848 call mpi_abort(mpi_comm_world, 10, ierr)
851 CALL read_data(lsoil,lensfc,.false.,fname_inc=fname_inc, &
852 lsoil_incr=lsoil_incr, is_noahmp=is_noahmp, &
853 stcinc=stcinc,slcinc=slcinc)
862 CALL add_increment_soil(lsoil_incr,stcinc,slcinc,stcfcs,smcfcs,slcfcs,stc_updated, &
863 slc_updated,landinc_mask,landinc_mask_fg,lensfc,lsoil,lsm,myrank)
869 CALL apply_land_da_adjustments_soil(lsoil_incr, lsm, isot, ivegsrc,lensfc, lsoil, &
870 sotfcs, landinc_mask_fg, stc_bck, stcfcs, smcfcs, slcfcs, stc_updated, &
880 IF(
ALLOCATED(landinc_mask_fg))
DEALLOCATE(landinc_mask_fg)
881 IF(
ALLOCATED(landinc_mask))
DEALLOCATE(landinc_mask)
882 IF(
ALLOCATED(stc_bck))
DEALLOCATE(stc_bck)
883 IF(
ALLOCATED(smc_bck))
DEALLOCATE(smc_bck)
884 IF(
ALLOCATED(slc_bck))
DEALLOCATE(slc_bck)
885 IF(
ALLOCATED(snd_bck))
DEALLOCATE(snd_bck)
886 IF(
ALLOCATED(swe_bck))
DEALLOCATE(swe_bck)
887 IF(
ALLOCATED(snd_inc))
DEALLOCATE(snd_inc)
894 IF (do_landincr)
THEN
896 CALL write_data(lensfc,idim,jdim,lsoil,do_nsst,.false.,nsst,vegfcs=vegfcs, &
897 swefcs=swefcs,swdfcs=sndfcs,slcfcs=slcfcs,smcfcs=smcfcs,stcfcs=stcfcs,&
898 sicfcs=sicfcs,sihfcs=sihfcs)
900 ELSEIF (lsm==lsm_noahmp .OR. coupled)
THEN
902 CALL write_data(lensfc,idim,jdim,lsoil,do_nsst,.false.,nsst,slifcs=slifcs,vegfcs=vegfcs, &
903 slcfcs=slcfcs,smcfcs=smcfcs,stcfcs=stcfcs,&
904 sicfcs=sicfcs,sihfcs=sihfcs,sitfcs=sitfcs)
906 ELSEIF (lsm==lsm_noah)
THEN
909 do_nsst,.false.,nsst,slifcs=slifcs,tsffcs=tsffcs,vegfcs=vegfcs, &
910 swefcs=swefcs,tg3fcs=tg3fcs,zorfcs=zorfcs, &
911 albfcs=albfcs,alffcs=alffcs,cnpfcs=cnpfcs, &
912 f10m=f10m,t2m=t2m,q2m=q2m,vetfcs=vetfcs, &
913 sotfcs=sotfcs,ustar=ustar,fmm=fmm,fhh=fhh, &
914 sicfcs=sicfcs,sihfcs=sihfcs,sitfcs=sitfcs,tprcp=tprcp, &
915 srflag=srflag,swdfcs=sndfcs,vmnfcs=vmnfcs, &
916 vmxfcs=vmxfcs,slpfcs=slpfcs,absfcs=absfcs, &
917 slcfcs=slcfcs,smcfcs=smcfcs,stcfcs=stcfcs)
924 DEALLOCATE(nsst%D_CONV)
925 DEALLOCATE(nsst%DT_COOL)
927 DEALLOCATE(nsst%QRAIN)
928 DEALLOCATE(nsst%TREF)
929 DEALLOCATE(nsst%TFINC)
934 DEALLOCATE(nsst%XTTS)
938 DEALLOCATE(nsst%XZTS)
941 DEALLOCATE(slifcs_fg)
942 DEALLOCATE(sicfcs_fg)
945 IF(
ALLOCATED(landfrac))
DEALLOCATE(landfrac)
946 IF(
ALLOCATED(lakefrac))
DEALLOCATE(lakefrac)
985 SUBROUTINE adjust_nsst(RLA,RLO,SLMSK_TILE,SLMSK_FG_TILE,SKINT_TILE,&
986 SICET_TILE,sice_tile,sice_fg_tile,SOILT_TILE,NSST, &
987 LENSFC,LSOIL,IDIM,JDIM,ZSEA1,ZSEA2, &
988 tf_clm_tile,tf_trd_tile,sal_clm_tile,LANDFRAC, &
989 FRAC_GRID,LAKEFRAC,COUPLED)
1001 INTEGER,
INTENT(IN) :: lensfc, lsoil, idim, jdim
1003 LOGICAL,
INTENT(IN) :: frac_grid, coupled
1005 REAL,
INTENT(IN) :: slmsk_tile(lensfc), SLMSK_FG_TILE(LENSFC), LANDFRAC(LENSFC)
1006 REAL,
INTENT(IN) :: LAKEFRAC(LENSFC)
1007 real,
intent(in) :: tf_clm_tile(lensfc),tf_trd_tile(lensfc),sal_clm_tile(lensfc)
1008 REAL,
INTENT(IN) :: ZSEA1, ZSEA2,sice_tile(lensfc),sice_fg_tile(lensfc)
1009 REAL,
INTENT(IN) :: RLA(LENSFC), RLO(LENSFC)
1010 REAL,
INTENT(INOUT) :: SKINT_TILE(LENSFC)
1011 REAL,
INTENT(INOUT) :: SICET_TILE(LENSFC),SOILT_TILE(LENSFC,LSOIL)
1015 REAL,
PARAMETER :: TMAX=313.0,tzero=273.16
1017 INTEGER :: IOPT, NRET, KGDS_GAUS(200)
1018 INTEGER :: IGAUS, JGAUS, IJ, II, JJ, III, JJJ, KRAD
1019 INTEGER :: ISTART, IEND, JSTART, JEND
1021 INTEGER,
allocatable :: MASK_TILE(:),MASK_FG_TILE(:)
1022 INTEGER :: ITILE, JTILE
1023 INTEGER :: MAX_SEARCH, J, IERR
1024 INTEGER :: IGAUSP1, JGAUSP1
1025 integer :: nintp,nsearched,nice,nland
1026 integer :: nfill,nfill_tice,nfill_clm
1027 integer :: nset_thaw,nset_thaw_s,nset_thaw_i,nset_thaw_c
1029 INTEGER,
ALLOCATABLE :: ID1(:,:), ID2(:,:), JDC(:,:)
1034 REAL :: TREF_SAVE,WSUM,tf_ice,tf_thaw
1035 REAL :: FILL, DTZM, GAUS_RES_KM, DTREF
1036 REAL,
ALLOCATABLE :: XPTS(:), YPTS(:), LATS(:), LONS(:)
1037 REAL,
ALLOCATABLE :: DUM2D(:,:), LATS_RAD(:), LONS_RAD(:)
1038 REAL,
ALLOCATABLE :: AGRID(:,:,:), S2C(:,:,:)
1044 kgds_gaus(4) = 90000
1047 kgds_gaus(7) = -90000
1048 kgds_gaus(8) = nint(-360000./float(
idim_gaus))
1049 kgds_gaus(9) = nint((360.0 / float(
idim_gaus))*1000.0)
1056 print*,
'ADJUST NSST USING GSI INCREMENTS ON GAUSSIAN GRID'
1076 print*,
'FATAL ERROR: PROBLEM IN GDSWZD. STOP.'
1077 CALL mpi_abort(mpi_comm_world, 12, ierr)
1080 DEALLOCATE (xpts, ypts)
1088 lats_rad(j) = dum2d(1,
jdim_gaus-j+1) * 3.1415926 / 180.0
1094 lons_rad = dum2d(:,1) * 3.1415926 / 180.0
1098 ALLOCATE(agrid(idim,jdim,2))
1099 agrid(:,:,1) = reshape(rlo, (/idim,jdim/) )
1100 agrid(:,:,2) = reshape(rla, (/idim,jdim/) )
1101 agrid = agrid * 3.1415926 / 180.0
1103 ALLOCATE(id1(idim,jdim))
1104 ALLOCATE(id2(idim,jdim))
1105 ALLOCATE(jdc(idim,jdim))
1106 ALLOCATE(s2c(idim,jdim,4))
1115 lons_rad, lats_rad, id1, id2, jdc, s2c, agrid )
1117 DEALLOCATE(lons_rad, lats_rad, agrid)
1125 max_search = ceiling(500.0/gaus_res_km)
1128 print*,
'MAXIMUM SEARCH IS ',max_search,
' GAUSSIAN POINTS.'
1151 allocate(mask_tile(lensfc))
1152 allocate(mask_fg_tile(lensfc))
1154 IF(.NOT. frac_grid)
THEN
1155 mask_tile = nint(slmsk_tile)
1156 mask_fg_tile = nint(slmsk_fg_tile)
1159 WHERE(sice_tile > 0.0) mask_tile=2
1160 WHERE(landfrac == 1.0) mask_tile=1
1162 WHERE(sice_fg_tile > 0.0) mask_fg_tile=2
1163 WHERE(landfrac == 1.0) mask_fg_tile=1
1170 WHERE(lakefrac == 0.0) mask_tile=1
1173 ij_loop :
DO ij = 1, lensfc
1178 tf_ice = tfreez(sal_clm_tile(ij)) + tzero
1183 IF (mask_tile(ij) == 1)
THEN
1191 if (mask_tile(ij) == 2)
then
1192 nsst%tref(ij)=tf_ice
1193 skint_tile(ij)=(1.0-sice_tile(ij))*nsst%tref(ij)+sice_tile(ij)*sicet_tile(ij)
1201 jtile = (ij-1) / idim + 1
1202 itile = mod(ij,idim)
1203 IF (itile==0) itile = idim
1211 IF (mask_fg_tile(ij) == 2 .AND. mask_tile(ij) == 0)
THEN
1215 call tf_thaw_set(nsst%tref,mask_fg_tile,itile,jtile,tf_ice,tf_clm_tile(ij),tf_thaw,idim,jdim, &
1216 nset_thaw_s,nset_thaw_i,nset_thaw_c)
1218 nset_thaw = nset_thaw + 1
1234 igaus = id1(itile,jtile)
1235 jgaus = jdc(itile,jtile)
1236 igausp1 = id2(itile,jtile)
1237 jgausp1 = jdc(itile,jtile)+1
1248 dtref = dtref + (s2c(itile,jtile,1) *
dtref_gaus(igaus,jgaus))
1249 wsum = wsum + s2c(itile,jtile,1)
1253 dtref = dtref + (s2c(itile,jtile,2) *
dtref_gaus(igausp1,jgaus))
1254 wsum = wsum + s2c(itile,jtile,2)
1258 dtref = dtref + (s2c(itile,jtile,3) *
dtref_gaus(igausp1,jgausp1))
1259 wsum = wsum + s2c(itile,jtile,3)
1263 dtref = dtref + (s2c(itile,jtile,4) *
dtref_gaus(igaus,jgausp1))
1264 wsum = wsum + s2c(itile,jtile,4)
1268 dtref = dtref / wsum
1270 tref_save = nsst%TREF(ij)
1271 nsst%TREF(ij) = nsst%TREF(ij) + dtref
1272 nsst%TREF(ij) = max(nsst%TREF(ij), tf_ice)
1273 nsst%TREF(ij) = min(nsst%TREF(ij), tmax)
1274 nsst%TFINC(ij) = nsst%TREF(ij) - tref_save
1276 CALL dtzm_point(nsst%XT(ij),nsst%XZ(ij),nsst%DT_COOL(ij), &
1277 nsst%Z_C(ij),zsea1,zsea2,dtzm)
1279 skint_tile(ij) = nsst%TREF(ij) + dtzm
1280 skint_tile(ij) = max(skint_tile(ij), tf_ice)
1281 skint_tile(ij) = min(skint_tile(ij), tmax)
1283 sicet_tile(ij) = skint_tile(ij)
1286 IF(.NOT. frac_grid) soilt_tile(ij,:) = skint_tile(ij)
1297 DO krad = 1, max_search
1299 istart = igaus - krad
1301 jstart = jgaus - krad
1304 DO jj = jstart, jend
1305 DO ii = istart, iend
1307 IF((jj == jstart) .OR. (jj == jend) .OR. &
1308 (ii == istart) .OR. (ii == iend))
THEN
1310 IF ((jj >= 1) .AND. (jj <=
jdim_gaus))
THEN
1327 IF (krad <= 2 .AND.
slmsk_gaus(iii,jjj) == 2) is_ice = .true.
1333 nsearched = nsearched + 1
1335 tref_save = nsst%TREF(ij)
1336 nsst%TREF(ij ) = nsst%TREF(ij) +
dtref_gaus(iii,jjj)
1337 nsst%TREF(ij) = max(nsst%TREF(ij), tf_ice)
1338 nsst%TREF(ij) = min(nsst%TREF(ij), tmax)
1339 nsst%TFINC(ij) = nsst%TREF(ij) - tref_save
1341 CALL dtzm_point(nsst%XT(ij),nsst%XZ(ij),nsst%DT_COOL(ij), &
1342 nsst%Z_C(ij),zsea1,zsea2,dtzm)
1344 skint_tile(ij) = nsst%TREF(ij) + dtzm
1345 skint_tile(ij) = max(skint_tile(ij), tf_ice)
1346 skint_tile(ij) = min(skint_tile(ij), tmax)
1348 sicet_tile(ij) = skint_tile(ij)
1349 IF(.NOT. frac_grid) soilt_tile(ij,:) = skint_tile(ij)
1372 nsst%TREF(ij) = tf_ice
1374 nfill_tice = nfill_tice + 1
1376 tref_save = nsst%TREF(ij)
1377 nsst%TREF(ij) = nsst%TREF(ij) + tf_trd_tile(ij)
1378 nsst%TREF(ij) = max(nsst%TREF(ij), tf_ice)
1379 nsst%TREF(ij) = min(nsst%TREF(ij), tmax)
1380 nsst%TFINC(ij) = nsst%TREF(ij) - tref_save
1382 nfill_clm = nfill_clm + 1
1385 CALL dtzm_point(nsst%XT(ij),nsst%XZ(ij),nsst%DT_COOL(ij), &
1386 nsst%Z_C(ij),zsea1,zsea2,dtzm)
1388 skint_tile(ij) = nsst%TREF(ij) + dtzm
1389 skint_tile(ij) = max(skint_tile(ij), tf_ice)
1390 skint_tile(ij) = min(skint_tile(ij), tmax)
1392 sicet_tile(ij) = skint_tile(ij)
1393 IF (.NOT. frac_grid) soilt_tile(ij,:) = skint_tile(ij)
1399 write(*,
'(a)')
'statistics of grids number processed for tile : '
1400 write(*,
'(a,I8)')
' nintp = ',nintp
1401 write(*,
'(a,4I8)')
'nset_thaw,nset_thaw_s,nset_thaw_i,nset_thaw_c =',nset_thaw,nset_thaw_s,nset_thaw_i,nset_thaw_c
1402 write(*,
'(a,I8)')
' nsearched = ',nsearched
1403 write(*,
'(a,3I6)')
' nfill,nfill_tice,nfill_clm = ',nfill,nfill_tice,nfill_clm
1404 write(*,
'(a,I8)')
' nice = ',nice
1405 write(*,
'(a,I8)')
' nland = ',nland
1407 DEALLOCATE(id1, id2, jdc, s2c, mask_tile, mask_fg_tile)
1424 INTEGER,
INTENT(IN) :: MON, DAY
1426 REAL,
INTENT(IN) :: LATITUDE, DELTSFC
1427 REAL,
INTENT(OUT) :: DTREF
1429 INTEGER :: NUM_DAYS(12), MON2, MON1
1431 REAL,
TARGET :: SST_80_90(12)
1432 REAL,
TARGET :: SST_70_80(12)
1433 REAL,
TARGET :: SST_60_70(12)
1434 REAL,
TARGET :: SST_50_60(12)
1435 REAL,
TARGET :: SST_40_50(12)
1436 REAL,
TARGET :: SST_30_40(12)
1437 REAL,
TARGET :: SST_20_30(12)
1438 REAL,
TARGET :: SST_10_20(12)
1439 REAL,
TARGET :: SST_00_10(12)
1440 REAL,
TARGET :: SST_M10_00(12)
1441 REAL,
TARGET :: SST_M20_M10(12)
1442 REAL,
TARGET :: SST_M30_M20(12)
1443 REAL,
TARGET :: SST_M40_M30(12)
1444 REAL,
TARGET :: SST_M50_M40(12)
1445 REAL,
TARGET :: SST_M60_M50(12)
1446 REAL,
TARGET :: SST_M70_M60(12)
1447 REAL,
TARGET :: SST_M80_M70(12)
1448 REAL,
TARGET :: SST_M90_M80(12)
1450 REAL,
POINTER :: SST(:)
1452 DATA num_days /31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31/
1454 DATA sst_80_90 /271.466, 271.458, 271.448, 271.445, 271.519, 271.636, &
1455 272.023, 272.066, 272.001, 271.698, 271.510, 271.472/
1457 DATA sst_70_80 /272.149, 272.103, 272.095, 272.126, 272.360, 272.988, &
1458 274.061, 274.868, 274.415, 273.201, 272.468, 272.268/
1460 DATA sst_60_70 /274.240, 274.019, 273.988, 274.185, 275.104, 276.875, &
1461 279.005, 280.172, 279.396, 277.586, 275.818, 274.803/
1463 DATA sst_50_60 /277.277, 276.935, 277.021, 277.531, 279.100, 281.357, &
1464 283.735, 285.171, 284.399, 282.328, 279.918, 278.199/
1466 DATA sst_40_50 /281.321, 280.721, 280.850, 281.820, 283.958, 286.588, &
1467 289.195, 290.873, 290.014, 287.652, 284.898, 282.735/
1469 DATA sst_30_40 /289.189, 288.519, 288.687, 289.648, 291.547, 293.904, &
1470 296.110, 297.319, 296.816, 295.225, 292.908, 290.743/
1472 DATA sst_20_30 /294.807, 294.348, 294.710, 295.714, 297.224, 298.703, &
1473 299.682, 300.127, 300.099, 299.455, 297.953, 296.177/
1475 DATA sst_10_20 /298.878, 298.720, 299.033, 299.707, 300.431, 300.709, &
1476 300.814, 300.976, 301.174, 301.145, 300.587, 299.694/
1478 DATA sst_00_10 /300.415, 300.548, 300.939, 301.365, 301.505, 301.141, &
1479 300.779, 300.660, 300.818, 300.994, 300.941, 300.675/
1481 DATA sst_m10_00 /300.226, 300.558, 300.914, 301.047, 300.645, 299.870, &
1482 299.114, 298.751, 298.875, 299.294, 299.721, 299.989/
1484 DATA sst_m20_m10 /299.547, 299.985, 300.056, 299.676, 298.841, 297.788, &
1485 296.893, 296.491, 296.687, 297.355, 298.220, 298.964/
1487 DATA sst_m30_m20 /297.524, 298.073, 297.897, 297.088, 295.846, 294.520, &
1488 293.525, 293.087, 293.217, 293.951, 295.047, 296.363/
1490 DATA sst_m40_m30 /293.054, 293.765, 293.468, 292.447, 291.128, 289.781, &
1491 288.773, 288.239, 288.203, 288.794, 289.947, 291.553/
1493 DATA sst_m50_m40 /285.052, 285.599, 285.426, 284.681, 283.761, 282.826, &
1494 282.138, 281.730, 281.659, 281.965, 282.768, 283.961/
1496 DATA sst_m60_m50 /277.818, 278.174, 277.991, 277.455, 276.824, 276.229, &
1497 275.817, 275.585, 275.560, 275.687, 276.142, 276.968/
1499 DATA sst_m70_m60 /273.436, 273.793, 273.451, 272.813, 272.349, 272.048, &
1500 271.901, 271.838, 271.845, 271.889, 272.080, 272.607/
1502 DATA sst_m80_m70 /271.579, 271.578, 271.471, 271.407, 271.392, 271.391, &
1503 271.390, 271.391, 271.394, 271.401, 271.422, 271.486/
1505 DATA sst_m90_m80 /271.350, 271.350, 271.350, 271.350, 271.350, 271.350, &
1506 271.350, 271.350, 271.350, 271.350, 271.350, 271.350/
1509 IF (latitude > 80.0)
THEN
1511 ELSEIF (latitude > 70.0)
THEN
1513 ELSEIF (latitude > 60.0)
THEN
1515 ELSEIF (latitude > 50.0)
THEN
1517 ELSEIF (latitude > 40.0)
THEN
1519 ELSEIF (latitude > 30.0)
THEN
1521 ELSEIF (latitude > 20.0)
THEN
1523 ELSEIF (latitude > 10.0)
THEN
1525 ELSEIF (latitude > 0.0)
THEN
1527 ELSEIF (latitude > -10.0)
THEN
1529 ELSEIF (latitude > -20.0)
THEN
1531 ELSEIF (latitude > -30.0)
THEN
1533 ELSEIF (latitude > -40.0)
THEN
1535 ELSEIF (latitude > -50.0)
THEN
1537 ELSEIF (latitude > -60.0)
THEN
1539 ELSEIF (latitude > -70.0)
THEN
1541 ELSEIF (latitude > -80.0)
THEN
1549 IF(mon2 == 13) mon2 = 1
1551 dtref = (sst(mon2) - sst(mon1)) / num_days(mon1)
1554 IF (mon1 == 0) mon1=12
1556 dtref = (sst(mon2) - sst(mon1)) / num_days(mon1)
1559 dtref = dtref * (deltsfc / 24.0)