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)