/wrfv2_fire/phys/module_sf_ruclsm.F
FORTRAN Legacy | 6031 lines | 3585 code | 793 blank | 1653 comment | 96 complexity | 926e2faf7df8889ef7fefb2ef52fc9ed MD5 | raw file
Possible License(s): AGPL-1.0
Large files files are truncated, but you can click here to view the full file
- #define LSMRUC_DBG_LVL 3000
- !WRF:MODEL_LAYER:PHYSICS
- !
- MODULE module_sf_ruclsm
- USE module_model_constants
- USE module_wrf_error
- ! VEGETATION PARAMETERS
- INTEGER :: LUCATS , BARE, NATURAL
- integer, PARAMETER :: NLUS=50
- CHARACTER*8 LUTYPE
- INTEGER, DIMENSION(1:NLUS) :: IFORTBL
- real, dimension(1:NLUS) :: SNUPTBL, RSTBL, RGLTBL, HSTBL, LAITBL, &
- ALBTBL, Z0TBL, LEMITBL, PCTBL, SHDTBL, MAXALB
- REAL :: TOPT_DATA,CMCMAX_DATA,CFACTR_DATA,RSMAX_DATA
- ! SOIL PARAMETERS
- INTEGER :: SLCATS
- INTEGER, PARAMETER :: NSLTYPE=30
- CHARACTER*8 SLTYPE
- REAL, DIMENSION (1:NSLTYPE) :: BB,DRYSMC,HC, &
- MAXSMC, REFSMC,SATPSI,SATDK,SATDW, WLTSMC,QTZ
- ! LSM GENERAL PARAMETERS
- INTEGER :: SLPCATS
- INTEGER, PARAMETER :: NSLOPE=30
- REAL, DIMENSION (1:NSLOPE) :: SLOPE_DATA
- REAL :: SBETA_DATA,FXEXP_DATA,CSOIL_DATA,SALP_DATA,REFDK_DATA, &
- REFKDT_DATA,FRZK_DATA,ZBOT_DATA, SMLOW_DATA,SMHIGH_DATA, &
- CZIL_DATA
- CHARACTER*256 :: err_message
- CONTAINS
- !-----------------------------------------------------------------
- SUBROUTINE LSMRUC( &
- DT,KTAU,NSL,ZS, &
- RAINBL,SNOW,SNOWH,SNOWC,FRZFRAC,frpcpn, &
- Z3D,P8W,T3D,QV3D,QC3D,RHO3D, & !p8W in [PA]
- GLW,GSW,EMISS,CHKLOWQ, CHS, &
- FLQC,FLHC,MAVAIL,CANWAT,VEGFRA,ALB,ZNT, &
- Z0,SNOALB,ALBBCK,LAI, & !new
- mminlu, landusef, nlcat, mosaic_lu, &
- mosaic_soil, soilctop, nscat, & !new
- QSFC,QSG,QVG,QCG,DEW,SOILT1,TSNAV, &
- TBOT,IVGTYP,ISLTYP,XLAND, &
- ISWATER,ISICE,XICE,XICE_THRESHOLD, &
- CP,ROVCP,G0,LV,STBOLT, &
- SOILMOIS,SH2O,SMAVAIL,SMMAX, &
- TSO,SOILT,HFX,QFX,LH, &
- SFCRUNOFF,UDRUNOFF,SFCEXC, &
- SFCEVP,GRDFLX,ACSNOW,SNOM, &
- SMFR3D,KEEPFR3DFLAG, &
- myj, &
- ids,ide, jds,jde, kds,kde, &
- ims,ime, jms,jme, kms,kme, &
- its,ite, jts,jte, kts,kte )
- !-----------------------------------------------------------------
- IMPLICIT NONE
- !-----------------------------------------------------------------
- !
- ! The RUC LSM model is described in:
- ! Smirnova, T.G., J.M. Brown, and S.G. Benjamin, 1997:
- ! Performance of different soil model configurations in simulating
- ! ground surface temperature and surface fluxes.
- ! Mon. Wea. Rev. 125, 1870-1884.
- ! Smirnova, T.G., J.M. Brown, and D. Kim, 2000: Parameterization of
- ! cold-season processes in the MAPS land-surface scheme.
- ! J. Geophys. Res. 105, 4077-4086.
- !-----------------------------------------------------------------
- !-- DT time step (second)
- ! ktau - number of time step
- ! NSL - number of soil layers
- ! NZS - number of levels in soil
- ! ZS - depth of soil levels (m)
- !-- RAINBL - accumulated rain in [mm] between the PBL calls
- !-- RAINNCV one time step grid scale precipitation (mm/step)
- ! SNOW - snow water equivalent [mm]
- ! FRAZFRAC - fraction of frozen precipitation
- !-- SNOWC flag indicating snow coverage (1 for snow cover)
- !-- Z3D heights (m)
- !-- P8W 3D pressure (Pa)
- !-- T3D temperature (K)
- !-- QV3D 3D water vapor mixing ratio (Kg/Kg)
- ! QC3D - 3D cloud water mixing ratio (Kg/Kg)
- ! RHO3D - 3D air density (kg/m^3)
- !-- GLW downward long wave flux at ground surface (W/m^2)
- !-- GSW absorbed short wave flux at ground surface (W/m^2)
- !-- EMISS surface emissivity (between 0 and 1)
- ! FLQC - surface exchange coefficient for moisture (kg/m^2/s)
- ! FLHC - surface exchange coefficient for heat [W/m^2/s/degreeK]
- ! SFCEXC - surface exchange coefficient for heat [m/s]
- ! CANWAT - CANOPY MOISTURE CONTENT (mm)
- ! VEGFRA - vegetation fraction (between 0 and 1)
- ! ALB - surface albedo (between 0 and 1)
- ! SNOALB - maximum snow albedo (between 0 and 1)
- ! ALBBCK - snow-free albedo (between 0 and 1)
- ! ZNT - roughness length [m]
- !-- TBOT soil temperature at lower boundary (K)
- ! IVGTYP - USGS vegetation type (24 classes)
- ! ISLTYP - STASGO soil type (16 classes)
- !-- XLAND land mask (1 for land, 2 for water)
- !-- CP heat capacity at constant pressure for dry air (J/kg/K)
- !-- G0 acceleration due to gravity (m/s^2)
- !-- LV latent heat of melting (J/kg)
- !-- STBOLT Stefan-Boltzmann constant (W/m^2/K^4)
- ! SOILMOIS - soil moisture content (volumetric fraction)
- ! TSO - soil temp (K)
- !-- SOILT surface temperature (K)
- !-- HFX upward heat flux at the surface (W/m^2)
- !-- QFX upward moisture flux at the surface (kg/m^2/s)
- !-- LH upward latent heat flux (W/m^2)
- ! SFCRUNOFF - ground surface runoff [mm]
- ! UDRUNOFF - underground runoff [mm]
- ! SFCEVP - total evaporation in [kg/m^2]
- ! GRDFLX - soil heat flux (W/m^2: negative, if downward from surface)
- ! ACSNOW - accumulation of snow water [m]
- !-- CHKLOWQ - is either 0 or 1 (so far set equal to 1).
- !-- used only in MYJPBL.
- !-- tice - sea ice temperture (C)
- !-- rhosice - sea ice density (kg m^-3)
- !-- capice - sea ice volumetric heat capacity (J/m^3/K)
- !-- thdifice - sea ice thermal diffusivity (m^2/s)
- !--
- !-- ims start index for i in memory
- !-- ime end index for i in memory
- !-- jms start index for j in memory
- !-- jme end index for j in memory
- !-- kms start index for k in memory
- !-- kme end index for k in memory
- !-------------------------------------------------------------------------
- ! INTEGER, PARAMETER :: nzss=5
- ! INTEGER, PARAMETER :: nddzs=2*(nzss-2)
- INTEGER, PARAMETER :: nvegclas=24+3
- REAL, INTENT(IN ) :: DT
- LOGICAL, INTENT(IN ) :: myj,frpcpn
- INTEGER, INTENT(IN ) :: NLCAT, NSCAT, mosaic_lu, mosaic_soil
- INTEGER, INTENT(IN ) :: ktau, nsl, isice, iswater, &
- ims,ime, jms,jme, kms,kme, &
- ids,ide, jds,jde, kds,kde, &
- its,ite, jts,jte, kts,kte
- REAL, DIMENSION( ims:ime, kms:kme, jms:jme ) , &
- INTENT(IN ) :: QV3D, &
- QC3D, &
- p8w, &
- rho3D, &
- T3D, &
- z3D
- REAL, DIMENSION( ims:ime , jms:jme ), &
- INTENT(IN ) :: RAINBL, &
- GLW, &
- GSW, &
- FLHC, &
- FLQC, &
- CHS , &
- EMISS, &
- XICE, &
- XLAND, &
- ALBBCK, &
- VEGFRA, &
- TBOT
- REAL, DIMENSION( 1:nsl), INTENT(IN ) :: ZS
- REAL, DIMENSION( ims:ime , jms:jme ), &
- INTENT(INOUT) :: &
- SNOW, & !new
- SNOWH, &
- SNOWC, &
- CANWAT, & ! new
- SNOALB, &
- ALB, &
- LAI, &
- MAVAIL, &
- SFCEXC, &
- Z0 , &
- ZNT
- REAL, DIMENSION( ims:ime , jms:jme ), &
- INTENT(IN ) :: &
- FRZFRAC
- INTEGER, DIMENSION( ims:ime , jms:jme ), &
- INTENT(IN ) :: IVGTYP, &
- ISLTYP
- CHARACTER(LEN=*), INTENT(IN ) :: MMINLU
- REAL, DIMENSION( ims:ime , 1:nlcat, jms:jme ), INTENT(IN):: LANDUSEF
- REAL, DIMENSION( ims:ime , 1:nscat, jms:jme ), INTENT(IN):: SOILCTOP
- REAL, INTENT(IN ) :: CP,ROVCP,G0,LV,STBOLT,XICE_threshold
-
- REAL, DIMENSION( ims:ime , 1:nsl, jms:jme ) , &
- INTENT(INOUT) :: SOILMOIS,SH2O,TSO
- REAL, DIMENSION( ims:ime, jms:jme ) , &
- INTENT(INOUT) :: SOILT, &
- HFX, &
- QFX, &
- LH, &
- SFCEVP, &
- SFCRUNOFF, &
- UDRUNOFF, &
- GRDFLX, &
- ACSNOW, &
- SNOM, &
- QVG, &
- QCG, &
- DEW, &
- QSFC, &
- QSG, &
- CHKLOWQ, &
- SOILT1, &
- TSNAV
- REAL, DIMENSION( ims:ime, jms:jme ) , &
- INTENT(INOUT) :: SMAVAIL, &
- SMMAX
- REAL, DIMENSION( its:ite, jts:jte ) :: &
- PC, &
- RUNOFF1, &
- RUNOFF2, &
- EMISSL, &
- ZNTL, &
- LMAVAIL, &
- SMELT, &
- SNOH, &
- SNFLX, &
- EDIR, &
- EC, &
- ETT, &
- SUBLIM, &
- sflx, &
- EVAPL, &
- PRCPL, &
- SEAICE, &
- INFILTR
- !--- soil/snow properties
- REAL, DIMENSION( ims:ime, 1:nsl, jms:jme) &
- :: KEEPFR3DFLAG, &
- SMFR3D
- REAL &
- :: RHOCS, &
- RHOSN, &
- RHONEWSN, &
- BCLH, &
- DQM, &
- KSAT, &
- PSIS, &
- QMIN, &
- QWRTZ, &
- REF, &
- WILT, &
- CANWATR, &
- SNOWFRAC, &
- SNHEI, &
- SNWE
- REAL :: CN, &
- SAT,CW, &
- C1SN, &
- C2SN, &
- KQWRTZ, &
- KICE, &
- KWT
- REAL, DIMENSION(1:NSL) :: ZSMAIN, &
- ZSHALF, &
- DTDZS2
- REAL, DIMENSION(1:2*(nsl-2)) :: DTDZS
- REAL, DIMENSION(1:4001) :: TBQ
- REAL, DIMENSION( 1:nsl ) :: SOILM1D, &
- TSO1D, &
- SOILICE, &
- SOILIQW, &
- SMFRKEEP
- REAL, DIMENSION( 1:nsl ) :: KEEPFR
-
- REAL, DIMENSION( 1:nlcat ) :: lufrac
- REAL, DIMENSION( 1:nscat ) :: soilfrac
- REAL :: RSM, &
- SNWEPRINT, &
- SNHEIPRINT
- REAL :: PRCPMS, &
- NEWSNMS, &
- PATM, &
- PATMB, &
- TABS, &
- QVATM, &
- QCATM, &
- Q2SAT, &
- CONFLX, &
- RHO, &
- QKMS, &
- TKMS, &
- INFILTRP
- REAL :: cq,r61,r273,arp,brp,x,evs,eis
- REAL :: meltfactor
- INTEGER :: NROOT
- INTEGER :: ILAND,ISOIL,IFOREST
-
- INTEGER :: I,J,K,NZS,NZS1,NDDZS
- INTEGER :: k1,l,k2,kp,km
- CHARACTER (LEN=132) :: message
- !-----------------------------------------------------------------
- NZS=NSL
- NDDZS=2*(nzs-2)
- !---- table TBQ is for resolution of balance equation in VILKA
- CQ=173.15-.05
- R273=1./273.15
- R61=6.1153*0.62198
- ARP=77455.*41.9/461.525
- BRP=64.*41.9/461.525
- DO K=1,4001
- CQ=CQ+.05
- ! TBQ(K)=R61*EXP(ARP*(R273-1./CQ)-BRP*LOG(CQ*R273))
- EVS=EXP(17.67*(CQ-273.15)/(CQ-29.65))
- EIS=EXP(22.514-6.15E3/CQ)
- if(CQ.ge.273.15) then
- ! tbq is in mb
- tbq(k) = R61*evs
- else
- tbq(k) = R61*eis
- endif
- END DO
- !--- Initialize soil/vegetation parameters
- !--- This is temporary until SI is added to mass coordinate ---!!!!!
- #if ( NMM_CORE == 1 )
- if(ktau+1.eq.1) then
- #else
- if(ktau.eq.1) then
- #endif
- DO J=jts,jte
- DO i=its,ite
- do k=1,nsl
- ! smfr3d (i,k,j)=soilmois(i,k,j)/900.*1.e3
- ! sh2o (i,k,j)=soilmois(i,k,j)-smfr3d(i,k,j)/1.e3*900.
- keepfr3dflag(i,k,j)=0.
- enddo
- !--- initializing to zero snow fraction
- snowc(i,j) = min(1.,snowh(i,j)/0.05)
- !--- initializing inside snow temp if it is not defined
- IF((soilt1(i,j) .LT. 170.) .or. (soilt1(i,j) .GT.400.)) THEN
- IF(snowc(i,j).gt.0.1) THEN
- soilt1(i,j)=0.5*(soilt(i,j)+tso(i,1,j))
- IF ( wrf_at_debug_level(LSMRUC_DBG_LVL) ) THEN
- WRITE ( message , FMT='(A,F8.3,2I6)' ) &
- 'Temperature inside snow is initialized in RUCLSM ', soilt1(i,j),i,j
- CALL wrf_debug ( 0 , message )
- ENDIF
- ELSE
- soilt1(i,j) = soilt(i,j)
- ENDIF
- ENDIF
- tsnav(i,j) =0.5*(soilt(i,j)+tso(i,1,j))-273.
- qcg (i,j) =0.
- patmb=P8w(i,kms,j)*1.e-2
- QSG (i,j) = QSN(SOILT(i,j),TBQ)/PATMB
- IF((qvg(i,j) .LE. 0.) .or. (qvg(i,j) .GT.0.1)) THEN
- qvg (i,j) = QSG(i,j)*mavail(i,j)
- IF ( wrf_at_debug_level(LSMRUC_DBG_LVL) ) THEN
- WRITE ( message , FMT='(A,F8.3,2I6)' ) &
- 'QVG is initialized in RUCLSM ', qvg(i,j),mavail(i,j),qsg(i,j),i,j
- CALL wrf_debug ( 0 , message )
- ENDIF
- ENDIF
- ! qvg (i,j) =qv3d(i,1,j)
- ! qsfc(i,j) = qsg(i,j)/(1.+qsg(i,j))
- qsfc(i,j) = qvg(i,j)/(1.+qvg(i,j))
- SMELT(i,j) = 0.
- SNOM (i,j) = 0.
- SNFLX(i,j) = 0.
- DEW (i,j) = 0.
- PC (i,j) = 0.
- zntl (i,j) = 0.
- RUNOFF1(i,j) = 0.
- RUNOFF2(i,j) = 0.
- SFCRUNOFF(i,j) = 0.
- UDRUNOFF(i,j) = 0.
- emissl (i,j) = 0.
- ! Temporarily!!!
- canwat(i,j)=0.
- ! For RUC LSM CHKLOWQ needed for MYJPBL should
- ! 1 because is actual specific humidity at the surface, and
- ! not the saturation value
- chklowq(i,j) = 1.
- infiltr(i,j) = 0.
- snoh (i,j) = 0.
- edir (i,j) = 0.
- ec (i,j) = 0.
- ett (i,j) = 0.
- sublim(i,j) = 0.
- sflx (i,j) = 0.
- evapl (i,j) = 0.
- prcpl (i,j) = 0.
- ENDDO
- ENDDO
- do k=1,nsl
- soilice(k)=0.
- soiliqw(k)=0.
- enddo
- endif
- !-----------------------------------------------------------------
- PRCPMS = 0.
- DO J=jts,jte
- DO i=its,ite
- IF ( wrf_at_debug_level(LSMRUC_DBG_LVL) ) THEN
- print *,' IN LSMRUC ','ims,ime,jms,jme,its,ite,jts,jte,nzs', &
- ims,ime,jms,jme,its,ite,jts,jte,nzs
- print *,' IVGTYP, ISLTYP ', ivgtyp(i,j),isltyp(i,j)
- print *,' MAVAIL ', mavail(i,j)
- print *,' SOILT,QVG,P8w',soilt(i,j),qvg(i,j),p8w(i,1,j)
- print *, 'LSMRUC, I,J,xland, QFX,HFX from SFCLAY',i,j,xland(i,j), &
- qfx(i,j),hfx(i,j)
- print *, ' GSW, GLW =',gsw(i,j),glw(i,j)
- print *, 'SOILT, TSO start of time step =',soilt(i,j),(tso(i,k,j),k=1,nsl)
- print *, 'SOILMOIS start of time step =',(soilmois(i,k,j),k=1,nsl)
- print *, 'SMFROZEN start of time step =',(smfr3d(i,k,j),k=1,nsl)
- print *, ' I,J=, after SFCLAY CHS,FLHC ',i,j,chs(i,j),flhc(i,j)
- print *, 'LSMRUC, IVGTYP,ISLTYP,ALB = ', ivgtyp(i,j),isltyp(i,j),alb(i,j),i,j
- print *, 'LSMRUC I,J,DT,RAINBL =',I,J,dt,RAINBL(i,j)
- print *, 'XLAND ---->, ivgtype,isoiltyp,i,j',xland(i,j),ivgtyp(i,j),isltyp(i,j),i,j
- ENDIF
- ILAND = IVGTYP(i,j)
- ISOIL = ISLTYP(I,J)
- TABS = T3D(i,kms,j)
- QVATM = QV3D(i,kms,j)
- QCATM = QC3D(i,kms,j)
- PATM = P8w(i,kms,j)*1.e-5
- !-- Z3D(1) is thickness between first full sigma level and the surface,
- !-- but first mass level is at the half of the first sigma level
- !-- (u and v are also at the half of first sigma level)
- CONFLX = Z3D(i,kms,j)*0.5
- RHO = RHO3D(I,kms,J)
- !--- 1*e-3 is to convert from mm/s to m/s
- IF(FRPCPN) THEN
- PRCPMS = (RAINBL(i,j)/DT*1.e-3)*(1-FRZFRAC(I,J))
- NEWSNMS = (RAINBL(i,j)/DT*1.e-3)*FRZFRAC(I,J)
- ELSE
- if (tabs.le.273.15) then
- PRCPMS = 0.
- NEWSNMS = RAINBL(i,j)/DT*1.e-3
- else
- PRCPMS = RAINBL(i,j)/DT*1.e-3
- NEWSNMS = 0.
- endif
- ENDIF
- ! if (myj) then
- QKMS=CHS(i,j)
- TKMS=CHS(i,j)
- ! else
- !--- convert exchange coeff QKMS to [m/s]
- ! QKMS=FLQC(I,J)/RHO/MAVAIL(I,J)
- ! TKMS=FLHC(I,J)/RHO/CP
- ! endif
- !--- convert incoming snow and canwat from mm to m
- SNWE=SNOW(I,J)*1.E-3
- SNHEI=SNOWH(I,J)
- CANWATR=CANWAT(I,J)*1.E-3
- SNOWFRAC=SNOWC(I,J)
- !-----
- zsmain(1)=0.
- zshalf(1)=0.
- do k=2,nzs
- zsmain(k)= zs(k)
- zshalf(k)=0.5*(zsmain(k-1) + zsmain(k))
- enddo
- do k=1,nlcat
- lufrac(k) = landusef(i,k,j)
- enddo
- do k=1,nscat
- soilfrac(k) = soilctop(i,k,j)
- enddo
- !------------------------------------------------------------
- !----- DDZS and DSDZ1 are for implicit solution of soil eqns.
- !-------------------------------------------------------------
- NZS1=NZS-1
- !-----
- IF ( wrf_at_debug_level(LSMRUC_DBG_LVL) ) THEN
- print *,' DT,NZS1, ZSMAIN, ZSHALF --->', dt,nzs1,zsmain,zshalf
- ENDIF
- DO K=2,NZS1
- K1=2*K-3
- K2=K1+1
- X=DT/2./(ZSHALF(K+1)-ZSHALF(K))
- DTDZS(K1)=X/(ZSMAIN(K)-ZSMAIN(K-1))
- DTDZS2(K-1)=X
- DTDZS(K2)=X/(ZSMAIN(K+1)-ZSMAIN(K))
- END DO
- !27jul2011 - CN and SAT are defined in VEGPARM.TBL
- ! CN=0.5 ! exponent
- ! SAT=0.0004 ! canopy water saturated
-
- CW =4.183E6
- !--- Constants used in Johansen soil thermal
- !--- conductivity method
- KQWRTZ=7.7
- KICE=2.2
- KWT=0.57
- !***********************************************************************
- !--- Constants for snow density calculations C1SN and C2SN
- c1sn=0.026
- ! c1sn=0.01
- c2sn=21.
- !***********************************************************************
- NROOT= 4
- ! ! rooting depth
- RHONEWSN = 200.
- if(SNOW(i,j).gt.0. .and. SNOWH(i,j).gt.0.) then
- RHOSN = SNOW(i,j)/SNOWH(i,j)
- else
- RHOSN = 300.
- endif
- IF ( wrf_at_debug_level(LSMRUC_DBG_LVL) ) THEN
- if(ktau.eq.1 .and.(i.eq.195.and.j.eq.254)) &
- print *,'before SOILVEGIN - z0,znt(195,254)',z0(i,j),znt(i,j)
- ENDIF
- !--- initializing soil and surface properties
- CALL SOILVEGIN ( mosaic_lu, mosaic_soil,soilfrac,nscat, &
- NLCAT,ILAND,ISOIL,iswater,MYJ,IFOREST,lufrac, &
- EMISSL(I,J),PC(I,J),ZNT(I,J),LAI(I,J), &
- QWRTZ,RHOCS,BCLH,DQM,KSAT,PSIS,QMIN,REF,WILT,i,j )
- IF ( wrf_at_debug_level(LSMRUC_DBG_LVL) ) THEN
- if(ktau.eq.1 .and.(i.eq.195.and.j.eq.254)) &
- print *,'after SOILVEGIN - z0,znt(195,254)',z0(i,j),znt(i,j)
- if(ktau.eq.1 .and. (i.eq.195.and.j.eq.254)) then
- print *,'NLCAT,iland,lufrac,EMISSL(I,J),PC(I,J),ZNT(I,J),LAI(I,J)', &
- NLCAT,iland,lufrac,EMISSL(I,J),PC(I,J),ZNT(I,J),LAI(I,J),i,j
- print *,'NSCAT,soilfrac,QWRTZ,RHOCS,BCLH,DQM,KSAT,PSIS,QMIN,REF,WILT',&
- NSCAT,soilfrac,QWRTZ,RHOCS,BCLH,DQM,KSAT,PSIS,QMIN,REF,WILT,i,j
- endif
- ENDIF
- CN=CFACTR_DATA ! exponent
- SAT=max(1.e-4,CMCMAX_DATA * LAI(I,J) * 0.01*VEGFRA(I,J)) ! canopy water saturated
- !-- definition of number of soil levels in the rooting zone
- ! IF(iforest(ivgtyp(i,j)).ne.1) THEN
- IF(iforest.ne.1) THEN
- !---- all vegetation types except evergreen and mixed forests
- !18apr08 - define meltfactor for Egglston melting limit:
- ! for open areas factor is 2, and for forests - factor is 1.5
- ! This will make limit on snow melting smaller and let snow stay
- ! longer in the forests.
- meltfactor = 2.0
- do k=2,nzs
- if(zsmain(k).ge.0.4) then
- NROOT=K
- goto 111
- endif
- enddo
- ELSE
- !---- evergreen and mixed forests
- !18apr08 - define meltfactor
- ! meltfactor = 1.5
- ! 28 March 11 - Previously used value of metfactor= 1.5 needs to be further reduced
- ! to compensate for low snow albedos in the forested areas.
- ! Melting rate in forests will reduce.
- meltfactor = 0.85
- do k=2,nzs
- if(zsmain(k).ge.1.1) then
- NROOT=K
- goto 111
- endif
- enddo
- ENDIF
- 111 continue
- !-----
- IF ( wrf_at_debug_level(LSMRUC_DBG_LVL) ) THEN
- print *,' ZNT, LAI, VEGFRA, SAT, EMIS, PC --->', &
- ZNT(I,J),LAI(I,J),VEGFRA(I,J),SAT,EMISSL(I,J),PC(I,J)
- print *,' ZS, ZSMAIN, ZSHALF, CONFLX, CN, SAT, --->', zs,zsmain,zshalf,conflx,cn,sat
- print *,'NROOT, meltfactor, iforest, ivgtyp, i,j ', nroot,meltfactor,iforest,ivgtyp(I,J),I,J
- ! print *,'NROOT, iforest, ivgtyp, i,j ', nroot,iforest(ivgtyp(i,j)),ivgtyp(I,J),I,J
- ENDIF
- !*** SET ZERO-VALUE FOR SOME OUTPUT DIAGNOSTIC ARRAYS
- IF((XLAND(I,J)-1.5).GE.0.)THEN
- !-- Water
- SMAVAIL(I,J)=1.0
- SMMAX(I,J)=1.0
- SNOW(I,J)=0.0
- SNOWH(I,J)=0.0
- SNOWC(I,J)=0.0
- LMAVAIL(I,J)=1.0
- ILAND=iswater
- ! ILAND=16
- ISOIL=14
- patmb=P8w(i,1,j)*1.e-2
- qvg (i,j) = QSN(SOILT(i,j),TBQ)/PATMB
- qsfc(i,j) = qvg(i,j)/(1.+qvg(i,j))
- CHKLOWQ(I,J)=1.
- Q2SAT=QSN(TABS,TBQ)/PATMB
- DO K=1,NZS
- SOILMOIS(I,K,J)=1.0
- SH2O (I,K,J)=1.0
- TSO(I,K,J)= SOILT(I,J)
- ENDDO
- IF ( wrf_at_debug_level(LSMRUC_DBG_LVL) ) THEN
- PRINT*,' water point, I=',I, &
- 'J=',J, 'SOILT=', SOILT(i,j)
- ENDIF
- ELSE
- ! LAND POINT OR SEA ICE
- if(xice(i,j).ge.xice_threshold) then
- ! if(IVGTYP(i,j).eq.isice) then
- SEAICE(i,j)=1.
- else
- SEAICE(i,j)=0.
- endif
- IF(SEAICE(I,J).GT.0.5)THEN
- !-- Sea-ice case
- IF ( wrf_at_debug_level(LSMRUC_DBG_LVL) ) THEN
- PRINT*,' sea-ice at water point, I=',I, &
- 'J=',J
- ENDIF
- ! ILAND = 24
- ILAND = isice
- ISOIL = 16
- ZNT(I,J) = 0.011
- snoalb(i,j) = 0.75
- dqm = 1.
- ref = 1.
- qmin = 0.
- wilt = 0.
- emissl(i,j) = 1.0
- DO K=1,NZS
- soilmois(i,k,j) = 1.
- smfr3d(i,k,j) = 1.
- sh2o(i,k,j) = 0.
- keepfr3dflag(i,k,j) = 0.
- ENDDO
- ENDIF
- ! Attention!!!! RUC LSM uses soil moisture content minus residual (minimum
- ! or dry soil moisture content for a given soil type) as a state variable.
- DO k=1,nzs
- ! soilm1d - soil moisture content minus residual [m**3/m**3]
- soilm1d (k) = min(max(0.,soilmois(i,k,j)-qmin),dqm)
- ! soilm1d (k) = min(max(0.,soilmois(i,k,j)),dqm)
- tso1d (k) = tso(i,k,j)
- soiliqw (k) = min(max(0.,sh2o(i,k,j)-qmin),soilm1d(k))
- ENDDO
- do k=1,nzs
- smfrkeep(k) = smfr3d(i,k,j)
- keepfr (k) = keepfr3dflag(i,k,j)
- enddo
- ! LMAVAIL(I,J)=max(0.00001,min(1.,soilmois(i,1,j)/(REF-QMIN)))
- ! LMAVAIL(I,J)=max(0.00001,min(1.,soilmois(i,1,j)/dqm))
- LMAVAIL(I,J)=max(0.00001,min(1.,soilm1d(1)/dqm))
- #if ( NMM_CORE == 1 )
- if(ktau+1.gt.1) then
- #else
- if(ktau.gt.1) then
- #endif
- ! extract dew from the cloud water at the surface
- QCG(I,J)=QCG(I,J)-DEW(I,J)
- endif
- IF ( wrf_at_debug_level(LSMRUC_DBG_LVL) ) THEN
- print *,'LAND, i,j,tso1d,soilm1d,PATM,TABS,QVATM,QCATM,RHO', &
- i,j,tso1d,soilm1d,PATM,TABS,QVATM,QCATM,RHO
- print *,'CONFLX =',CONFLX
- print *,'SMFRKEEP,KEEPFR ',SMFRKEEP,KEEPFR
- ENDIF
- !-----------------------------------------------------------------
- CALL SFCTMP (dt,ktau,conflx,i,j, &
- !--- input variables
- nzs,nddzs,nroot,meltfactor, & !added meltfactor
- iland,isoil,xland(i,j),ivgtyp(i,j),PRCPMS, &
- NEWSNMS,SNWE,SNHEI,SNOWFRAC,RHOSN,RHONEWSN, &
- PATM,TABS,QVATM,QCATM,RHO, &
- GLW(I,J),GSW(I,J),EMISSL(I,J), &
- QKMS,TKMS,PC(I,J),LMAVAIL(I,J), &
- canwatr,vegfra(I,J),alb(I,J),znt(I,J), &
- snoalb(i,j),albbck(i,j), & !new
- myj,seaice(i,j),isice, &
- !--- soil fixed fields
- QWRTZ, &
- rhocs,dqm,qmin,ref, &
- wilt,psis,bclh,ksat, &
- sat,cn,zsmain,zshalf,DTDZS,DTDZS2,tbq, &
- !--- constants
- cp,rovcp,g0,lv,stbolt,cw,c1sn,c2sn, &
- KQWRTZ,KICE,KWT, &
- !--- output variables
- snweprint,snheiprint,rsm, &
- soilm1d,tso1d,smfrkeep,keepfr, &
- soilt(I,J),soilt1(i,j),tsnav(i,j),dew(I,J), &
- qvg(I,J),qsg(I,J),qcg(I,J),SMELT(I,J), &
- SNOH(I,J),SNFLX(I,J),SNOM(I,J),ACSNOW(I,J), &
- edir(I,J),ec(I,J),ett(I,J),qfx(I,J), &
- lh(I,J),hfx(I,J),sflx(I,J),sublim(I,J), &
- evapl(I,J),prcpl(I,J),runoff1(I,J), &
- runoff2(I,J),soilice,soiliqw,infiltrp)
- !-----------------------------------------------------------------
- !*** DIAGNOSTICS
- !--- available and maximum soil moisture content in the soil
- !--- domain
- smavail(i,j) = 0.
- smmax (i,j) = 0.
- do k=1,nzs-1
- smavail(i,j)=smavail(i,j)+(qmin+soilm1d(k))* &
- (zshalf(k+1)-zshalf(k))
- smmax (i,j) =smmax (i,j)+(qmin+dqm)* &
- (zshalf(k+1)-zshalf(k))
- enddo
- smavail(i,j)=smavail(i,j)+(qmin+soilm1d(nzs))* &
- (zsmain(nzs)-zshalf(nzs))
- smmax (i,j) =smmax (i,j)+(qmin+dqm)* &
- (zsmain(nzs)-zshalf(nzs))
- !--- Convert the water unit into mm
- SFCRUNOFF(I,J) = SFCRUNOFF(I,J)+RUNOFF1(I,J)*DT*1000.0
- UDRUNOFF (I,J) = UDRUNOFF(I,J)+RUNOFF2(I,J)*1000.0
- SMAVAIL (I,J) = SMAVAIL(I,J) * 1000.
- SMMAX (I,J) = SMMAX(I,J) * 1000.
- do k=1,nzs
- ! soilmois(i,k,j) = soilm1d(k)
- soilmois(i,k,j) = soilm1d(k) + qmin
- sh2o (i,k,j) = min(soiliqw(k) + qmin,soilmois(i,k,j))
- tso(i,k,j) = tso1d(k)
- enddo
- tso(i,nzs,j) = tbot(i,j)
- do k=1,nzs
- smfr3d(i,k,j) = smfrkeep(k)
- keepfr3dflag(i,k,j) = keepfr (k)
- enddo
- !tgs add together dew and cloud at the ground surface
- qcg(i,j)=qcg(i,j)+dew(i,j)
- Z0 (I,J) = ZNT (I,J)
- SFCEXC (I,J) = TKMS
- patmb=P8w(i,1,j)*1.e-2
- Q2SAT=QSN(TABS,TBQ)/PATMB
- QSFC(I,J) = QVG(I,J)/(1.+QVG(I,J))
- ! for MYJ surface and PBL scheme
- ! if (myj) then
- ! MYJSFC expects QSFC as actual specific humidity at the surface
- IF((QVATM.GE.Q2SAT*0.95).AND.QVATM.LT.qvg(I,J))THEN
- CHKLOWQ(I,J)=0.
- ELSE
- CHKLOWQ(I,J)=1.
- ENDIF
- ! else
- ! CHKLOWQ(I,J)=1.
- ! endif
- IF ( wrf_at_debug_level(LSMRUC_DBG_LVL) ) THEN
- if(CHKLOWQ(I,J).eq.0.) then
- print *,'i,j,CHKLOWQ', &
- i,j,CHKLOWQ(I,J)
- endif
- ENDIF
- ! SNOW is in [mm], SNWE is in [m]; CANWAT is in mm, CANWATR is in m
- SNOW (i,j) = SNWE*1000.
- SNOWH (I,J) = SNHEI
- CANWAT (I,J) = CANWATR*1000.
- INFILTR(I,J) = INFILTRP
- MAVAIL (i,j) = LMAVAIL(I,J)
- IF ( wrf_at_debug_level(LSMRUC_DBG_LVL) ) THEN
- print *,' LAND, I=,J=, QFX, HFX after SFCTMP', i,j,lh(i,j),hfx(i,j)
- ENDIF
- !!! QFX (I,J) = LH(I,J)/LV
- SFCEVP (I,J) = SFCEVP (I,J) + QFX (I,J) * DT
- GRDFLX (I,J) = -1. * sflx(I,J)
- IF ( wrf_at_debug_level(LSMRUC_DBG_LVL) ) THEN
- print *,' QFX after change, LH ', i,j, QFX(i,j),LH(I,J)
- ENDIF
- !--- SNOWC snow cover flag
- if(snowfrac > 0. .and. xice(i,j).ge.xice_threshold ) then
- SNOWFRAC = SNOWFRAC*XICE(I,J)
- endif
- SNOWC(I,J)=SNOWFRAC
- !--- get 3d soil fields
- IF ( wrf_at_debug_level(LSMRUC_DBG_LVL) ) THEN
- print *,'LAND, i,j,tso1d,soilm1d - end of time step', &
- i,j,tso1d,soilm1d
- ENDIF
- !--- end of a land or sea ice point
- ENDIF
- ENDDO
- ENDDO
- !-----------------------------------------------------------------
- END SUBROUTINE LSMRUC
- !-----------------------------------------------------------------
- SUBROUTINE SFCTMP (delt,ktau,conflx,i,j, &
- !--- input variables
- nzs,nddzs,nroot,meltfactor, &
- ILAND,ISOIL,XLAND,IVGTYP,PRCPMS, &
- NEWSNMS,SNWE,SNHEI,SNOWFRAC,RHOSN,RHONEWSN, &
- PATM,TABS,QVATM,QCATM,rho, &
- GLW,GSW,EMISS,QKMS,TKMS,PC, &
- MAVAIL,CST,VEGFRA,ALB,ZNT, &
- ALB_SNOW,ALB_SNOW_FREE, &
- MYJ,SEAICE,ISICE, &
- !--- soil fixed fields
- QWRTZ,rhocs,dqm,qmin,ref,wilt,psis,bclh,ksat, &
- sat,cn,zsmain,zshalf,DTDZS,DTDZS2,tbq, &
- !--- constants
- cp,rovcp,g0,lv,stbolt,cw,c1sn,c2sn, &
- KQWRTZ,KICE,KWT, &
- !--- output variables
- snweprint,snheiprint,rsm, &
- soilm1d,ts1d,smfrkeep,keepfr,soilt,soilt1, &
- tsnav,dew,qvg,qsg,qcg, &
- SMELT,SNOH,SNFLX,SNOM,ACSNOW, &
- edir1,ec1,ett1,eeta,qfx,hfx,s,sublim, &
- evapl,prcpl,runoff1,runoff2,soilice, &
- soiliqw,infiltr)
- !-----------------------------------------------------------------
- IMPLICIT NONE
- !-----------------------------------------------------------------
- !--- input variables
- INTEGER, INTENT(IN ) :: isice,i,j,nroot,ktau,nzs , &
- nddzs !nddzs=2*(nzs-2)
- REAL, INTENT(IN ) :: DELT,CONFLX,meltfactor
- REAL, INTENT(IN ) :: C1SN,C2SN
- LOGICAL, INTENT(IN ) :: myj
- !--- 3-D Atmospheric variables
- REAL , &
- INTENT(IN ) :: PATM, &
- TABS, &
- QVATM, &
- QCATM
- REAL , &
- INTENT(IN ) :: GLW, &
- GSW, &
- PC, &
- VEGFRA, &
- ALB_SNOW_FREE, &
- SEAICE, &
- XLAND, &
- RHO, &
- QKMS, &
- TKMS
-
- INTEGER, INTENT(IN ) :: IVGTYP
- !--- 2-D variables
- REAL , &
- INTENT(INOUT) :: EMISS, &
- MAVAIL, &
- SNOWFRAC, &
- ALB_SNOW, &
- ALB, &
- CST
- !--- soil properties
- REAL :: &
- RHOCS, &
- BCLH, &
- DQM, &
- KSAT, &
- PSIS, &
- QMIN, &
- QWRTZ, &
- REF, &
- SAT, &
- WILT
- REAL, INTENT(IN ) :: CN, &
- CW, &
- CP, &
- ROVCP, &
- G0, &
- LV, &
- STBOLT, &
- KQWRTZ, &
- KICE, &
- KWT
- REAL, DIMENSION(1:NZS), INTENT(IN) :: ZSMAIN, &
- ZSHALF, &
- DTDZS2
- REAL, DIMENSION(1:NDDZS), INTENT(IN) :: DTDZS
- REAL, DIMENSION(1:4001), INTENT(IN) :: TBQ
- !--- input/output variables
- !-------- 3-d soil moisture and temperature
- REAL, DIMENSION( 1:nzs ) , &
- INTENT(INOUT) :: TS1D, &
- SOILM1D, &
- SMFRKEEP
- REAL, DIMENSION( 1:nzs ) , &
- INTENT(INOUT) :: KEEPFR
-
- INTEGER, INTENT(INOUT) :: ILAND,ISOIL
- !-------- 2-d variables
- REAL , &
- INTENT(INOUT) :: DEW, &
- EDIR1, &
- EC1, &
- ETT1, &
- EETA, &
- EVAPL, &
- INFILTR, &
- RHOSN, &
- RHONEWSN, &
- SUBLIM, &
- PRCPL, &
- QVG, &
- QSG, &
- QCG, &
- QFX, &
- HFX, &
- S, &
- RUNOFF1, &
- RUNOFF2, &
- ACSNOW, &
- SNWE, &
- SNHEI, &
- SMELT, &
- SNOM, &
- SNOH, &
- SNFLX, &
- SOILT, &
- SOILT1, &
- TSNAV, &
- ZNT
- REAL, DIMENSION(1:NZS) :: &
- tice, &
- rhosice, &
- capice, &
- thdifice
- !-------- 1-d variables
- REAL, DIMENSION(1:NZS), INTENT(OUT) :: SOILICE, &
- SOILIQW
-
-
- REAL, INTENT(OUT) :: RSM, &
- SNWEPRINT, &
- SNHEIPRINT
- !--- Local variables
- INTEGER :: K,ILNB
- REAL :: BSN, XSN , &
- RAINF, SNTH, NEWSN, PRCPMS, NEWSNMS , &
- T3, UPFLUX, XINET
- REAL :: snhei_crit, keep_snow_albedo
- REAL :: RNET,GSWNEW,EMISSN,ZNTSN
- REAL :: VEGFRAC
- real :: cice, albice, albsn
- !-----------------------------------------------------------------
- integer, parameter :: ilsnow=99
-
- IF ( wrf_at_debug_level(LSMRUC_DBG_LVL) ) THEN
- print *,' in SFCTMP',i,j,nzs,nddzs,nroot, &
- SNWE,RHOSN,SNOM,SMELT,TS1D
- ENDIF
- NEWSN=0.
- RAINF = 0.
- RSM=0.
- INFILTR=0.
- VEGFRAC=0.01*VEGFRA
- ! if(VEGFRAC.le.0.01) VEGFRAC=0.
- !---initialize local arrays for sea ice
- do k=1,nzs
- tice(k) = 0.
- rhosice(k) = 0.
- cice = 0.
- capice(k) = 0.
- thdifice(k) = 0.
- enddo
- GSWnew=GSW
- ALBice=ALB_SNOW_FREE
- !--- sea ice properties
- !--- N.N Zubov "Arctic Ice"
- !--- no salinity dependence because we consider the ice pack
- !--- to be old and to have low salinity (0.0002)
- if(SEAICE.ge.0.5) then
- do k=1,nzs
- tice(k) = ts1d(k) - 273.15
- rhosice(k) = 917.6/(1-0.000165*tice(k))
- cice = 2115.85 +7.7948*tice(k)
- capice(k) = cice*rhosice(k)
- thdifice(k) = 2.260872/capice(k)
- enddo
- !-- SEA ICE ALB dependence on ice temperature. When ice temperature is
- !-- below critical value of -10C - no change to albedo.
- !-- If temperature is higher that -10C then albedo is decreasing.
- !-- The minimum albedo at t=0C for ice is 0.1 less.
- GSWNEW=GSW/(1.-ALB)
- ALBice = MIN(ALB_SNOW_FREE,MAX(ALB_SNOW_FREE - 0.05, &
- ALB_SNOW_FREE - 0.1*(tice(1)+10.)/10. ))
- GSWNEW=GSW*(1.-ALBice)
- endif
- IF ( wrf_at_debug_level(LSMRUC_DBG_LVL) ) THEN
- print *,'I,J,KTAU,QKMS,TKMS', i,j,ktau,qkms,tkms
- print *,'GSW,GSWnew,GLW,SOILT,EMISS,ALB,ALBice,SNWE',&
- GSW,GSWnew,GLW,SOILT,EMISS,ALB,ALBice,SNWE
- ENDIF
- SNHEI = SNWE * 1000. / RHOSN
- !--------------
- T3 = STBOLT*SOILT*SOILT*SOILT
- UPFLUX = T3 *SOILT
- XINET = EMISS*(GLW-UPFLUX)
- RNET = GSWnew + XINET
- !Calculate the amount (m) of fresh snow
- if(snhei.gt.0.0081*1.e3/rhosn) then
- !*** Correct snow density for current temperature (Koren et al. 1999)
- BSN=delt/3600.*c1sn*exp(0.08*tsnav-c2sn*rhosn*1.e-3)
- if(bsn*snwe*100..lt.1.e-4) goto 777
- XSN=rhosn*(exp(bsn*snwe*100.)-1.)/(bsn*snwe*100.)
- rhosn=MIN(MAX(100.,XSN),400.)
- ! rhosn=MIN(MAX(50.,XSN),400.)
- 777 continue
- ! else
- ! rhosn =200.
- ! rhonewsn =200.
- endif
- newsn=newsnms*delt
- !---- ACSNOW - accumulated snow water [kg m-2]
- acsnow=acsnow+newsn*1.e3
- IF(NEWSN.GT.0.) THEN
- ! IF(NEWSN.GE.1.E-8) THEN
- !*** Calculate fresh snow density (t > -15C, else MIN value)
- !*** Eq. 10 from Koren et al. (1999)
- IF ( wrf_at_debug_level(LSMRUC_DBG_LVL) ) THEN
- print *, 'THERE IS NEW SNOW, newsn', newsn
- ENDIF
- if(tabs.lt.258.15) then
- ! rhonewsn=50.
- rhonewsn=100.
- else
- rhonewsn=1.e3*max((0.10+0.0017*(Tabs-273.15+15.)**1.5) &
- , 0.10)
- ! rhonewsn=1.e3*max((0.05+0.0017*(Tabs-273.15+15.)**1.5) &
- ! , 0.05)
- rhonewsn=MIN(rhonewsn,400.)
- ! rhonewsn=100.
- endif
- !*** Define average snow density of the snow pack considering
- !*** the amount of fresh snow (eq. 9 in Koren et al.(1999)
- !*** without snow melt )
- xsn=(rhosn*snwe+rhonewsn*newsn)/ &
- (snwe+newsn)
- rhosn=MIN(MAX(100.,XSN),400.)
- ! rhosn=MIN(MAX(50.,XSN),400.)
- snwe=snwe+newsn
- snhei=snwe*1.E3/rhosn
- NEWSN=NEWSN*1.E3/rhonewsn
- ENDIF
- IF(PRCPMS.NE.0.) THEN
- ! PRCPMS is liquid precipitation rate
- ! RAINF is a flag used for calculation of rain water
- ! heat content contribution into heat budget equation. Rain's temperature
- ! is set equal to air temperature at the first atmospheric
- ! level.
- RAINF=1.
- ENDIF
- IF(SNHEI.GT.0.0) THEN
- !--- Set of surface parameters should be changed to snow values for grid
- !--- points where the snow cover exceeds snow threshold of 2 cm
- ILAND=ISICE
- SNHEI_CRIT=0.01601*1.e3/rhosn
- ! SNOWFRAC=MIN(1.,SNHEI/SNHEI_CRIT)
- SNOWFRAC=MIN(1.,SNHEI/(2.*SNHEI_CRIT))
- !tgs - low limit on snow fraction
- ! if(SNOWFRAC.lt.0.01) snowfrac=0.
- !--- EMISS = 0.98 for snow
- EMISS = EMISS*(1.-snowfrac)+0.98*snowfrac
- !-- Set znt for snow from VEGPARM table (snow/ice landuse), except for
- !-- land-use types with higher roughness (forests, urban).
- IF(znt.lt.0.2 .and. snowfrac.gt.0.99) znt=z0tbl(iland)
- KEEP_SNOW_ALBEDO = 0.
- IF (NEWSN.GT.0.) KEEP_SNOW_ALBEDO = 1.
- !--- GSW in-coming solar
- GSWNEW=GSW/(1.-ALB)
- IF(SEAICE .LT. 0.5) THEN
- !----- SNOW on soil
- !-- ALB dependence on snow depth
- ALBsn = MAX(keep_snow_albedo*alb_snow, &
- MIN((alb_snow_free + &
- (alb_snow - alb_snow_free) * snowfrac), alb_snow))
- !28mar11 if canopy is covered with snow to its capacity and snow depth is
- ! higher than patchy snow treshold - then snow albedo is not less than 0.7
- if(cst.ge.sat .and. snowfrac .eq.1.) albsn=max(alb_snow,0.7)
- !-- ALB dependence on snow temperature. When snow temperature is
- !-- below critical value of -10C - no change to albedo.
- !-- If temperature is higher that -10C then albedo is decreasing.
- !-- The minimum albedo at t=0C for snow on land is 15% less than
- !-- albedo of temperatures below -10C.
- if(albsn.lt.0.5) then
- ALB=ALBsn
- else
- !-- change albedo when no fresh snow and snow albedo is higher than 0.5
- ALB = MIN(ALBSN,MAX(ALBSN - 0.1*(soilt - 263.15)/ &
- (273.15-263.15)*ALBSN, ALBSN - 0.05))
- endif
- ELSE
- !----- S…
Large files files are truncated, but you can click here to view the full file