!copyright (C) 2001 MSC-RPN COMM %%%RPNPHY%%%
*** S/P ISBA2
*
#include "phy_macros_f.h"
SUBROUTINE ISBA2 (BUS, BUSSIZ, 1,9
$ PTSURF, PTSURFSIZ,
$ DT, KOUNT, TRNCH,
$ N, M, NK)
*
#include "impnone.cdk"
*
INTEGER BUSSIZ, LONCLEF, VSIZ, N, NK, KOUNT, TRNCH
REAL BUS(BUSSIZ), DT
INTEGER PTSURFSIZ
INTEGER PTSURF(PTSURFSIZ)
*
*Author
* S. Belair (January 1997)
*Revisions
*
* 001 J. Mailhot (March 1998)
* Add sea ice surface
*
* 002 J. Mailhot (October 1998)
* New SURFACE interface
*
* 003 B. Bilodeau (November 1998)
* Merge phyexe and param4
*
* 004 S. Belair (December 1998 and January 1999)
* New code for frozen soil water and for liquid water
* retained in the snow pack
*
* 005 S. Belair (March 1999)
* New variable names for the buses
*
* 006 B. Bilodeau and S. Belair (April 1999)
* Adaptation to new surface structure
*
* 007 S. Belair (September 1999)
* New tendency for snow density due to water freezing
*
* 008 B. Bilodeau (December 1999)
* Pass the real downward solar radiation to EBUDGET
* Make the distinction between total and vegetation albedoes
*
* 009 S. Belair (January 2000)
* Changes to the snow model following stand-alone
* experiments with the datasets from Col-de-Porte and
* Goose Bay
* 010 B. Bilodeau (November 2000)
* New comdeck sfcbus.cdk
*
* 011 B. Bilodeau (January 2001)
* Automatic arrays
* 012 S. Belair and B. Bilodeau (May 2001)
* New density for fresh snow
* 013 B. Bilodeau (August 2001)
* LOCBUS: a new macro for the management of pointers
* in the bus
* 014 J.-F. Mahfouf (Spring 2003)
* Add implicit boundary condition option for vert. diff.
* 015 B. Bilodeau (Mar 2004) - Change indexing of BT
*
*Object
* Multitasking of the surface scheme ISBA
*
*Arguments
*
* - Input/Output -
* BUS bus of surface variables
*
* - Input -
* BUSSIZ size of the surface bus
* PTSURF surface pointers
* PTSURFSIZ dimension of ptsurf
* KOUNT number of timestep
* TRNCH row number
* DT timestep
* N running length
* M horizontal dimension
* NK vertical dimension
*
*
**
*
*
INTEGER I
*
*
*
integer ptr, x
*
integer k,j,ik,m
*
#include "locbus.cdk"
INTEGER INDX_SFC, SURFLEN
PARAMETER (INDX_SFC = INDX_SOIL)
INTEGER QUELNIVO(MAXVARSURF)
*
#include "consphy.cdk"
*
#include "clefcon.cdk"
*
#include "options.cdk"
*
#include "sfcbus.cdk"
*
*
*
*MODULES
EXTERNAL PRELIM1
EXTERNAL SOILI
EXTERNAL VEGI
EXTERNAL DRAG1
EXTERNAL EBUDGET
EXTERNAL HYDRO1
EXTERNAL UPDATE3
*
*
#include "zuzt.cdk"
*
*******************************************************
* AUTOMATIC ARRAYS
*******************************************************
*
AUTOMATIC ( VMOD , REAL , (N) )
AUTOMATIC ( VDIR , REAL , (N) )
AUTOMATIC ( TVA , REAL , (N) )
AUTOMATIC ( RHOA , REAL , (N) )
AUTOMATIC ( RNWATER , REAL , (N) )
AUTOMATIC ( CG , REAL , (N) )
AUTOMATIC ( ZC1 , REAL , (N) )
AUTOMATIC ( ZC2 , REAL , (N) )
AUTOMATIC ( WGEQ , REAL , (N) )
AUTOMATIC ( CT , REAL , (N) )
AUTOMATIC ( ZCS , REAL , (N) )
AUTOMATIC ( PSNZ0 , REAL , (N) )
AUTOMATIC ( Z0TOT , REAL , (N) )
AUTOMATIC ( CH , REAL , (N) )
AUTOMATIC ( CD , REAL , (N) )
AUTOMATIC ( HRSURF , REAL , (N) )
AUTOMATIC ( DEL , REAL , (N) )
AUTOMATIC ( TST , REAL , (N) )
AUTOMATIC ( T2T , REAL , (N) )
AUTOMATIC ( WGT , REAL , (N) )
AUTOMATIC ( W2T , REAL , (N) )
AUTOMATIC ( WFT , REAL , (N) )
AUTOMATIC ( WLT , REAL , (N) )
AUTOMATIC ( WRT , REAL , (N) )
AUTOMATIC ( WST , REAL , (N) )
AUTOMATIC ( ALPHAST , REAL , (N) )
AUTOMATIC ( RHOST , REAL , (N) )
AUTOMATIC ( RNICE , REAL , (N) )
AUTOMATIC ( LEFF , REAL , (N) )
AUTOMATIC ( DWATERDT , REAL , (N) )
AUTOMATIC ( DSNOWDT , REAL , (N) )
AUTOMATIC ( ZTN , REAL , (N) )
AUTOMATIC ( ZUN , REAL , (N) )
AUTOMATIC ( FREEZS , REAL , (N) )
AUTOMATIC ( RHOMAX , REAL , (N) )
AUTOMATIC ( RSNOW , REAL , (N) )
*
*******************************************************
*
REAL RHO
*
REAL ALVIS_SOL, CMU, CTU
REAL FC_SOL, FV_SOL
REAL HST_SOL, ILMO_SOL
REAL PS, QS, TS
REAL Z0H, Z0M
REAL ZALFAQ, ZALFAT, ZTSURF, ZTSRAD
*
POINTER (IALVIS_SOL , ALVIS_SOL (1) )
POINTER (ICMU , CMU (1) )
POINTER (ICTU , CTU (1) )
POINTER (IFC _SOL , FC _SOL (1) )
POINTER (IFV _SOL , FV _SOL (1) )
POINTER (IHST _SOL , HST _SOL (1) )
POINTER (IILMO _SOL , ILMO _SOL (1) )
POINTER (IPS , PS (1) )
POINTER (IQS , QS (1) )
POINTER (ITS , TS (1) )
POINTER (IZ0H , Z0H (1) )
POINTER (IZ0M , Z0M (1) )
POINTER (IZALFAQ , ZALFAQ (1) )
POINTER (IZALFAT , ZALFAT (1) )
POINTER (IZTSURF , ZTSURF (1) )
POINTER (IZTSRAD , ZTSRAD (1) )
*
*
integer sommet
*
#include "xptsurf.cdk"
*
*
SURFLEN = M
*
*
* EQUIVALENCES
*
INIT_LOCBUS()
*
* Syntax of macro locbus (must be typed in CAPITAL letters):
* locbus (pointer, array_name_in_the_bus, level)
* If level=0, array chosen automatically as follows:
* 1) level = 1 if array has 1 level only (e.g. TSURF )
* 2) level = nk if array has nk levels (e.g. TMOINS)
* 3) level = indx_sfc if array has a level for each surface type (e.g. FC)
* 4) level has to be specified by user if array has more than one level
* that all "belong" to the same surface type (e.g. TSOIL)
*
LOCBUS (IALVIS_SOL , ALVIS , 0 )
LOCBUS (ICMU , BM , 0 )
LOCBUS (ICTU , BT , 0 )
LOCBUS (IFC _SOL , FC , 0 )
LOCBUS (IFV _SOL , FV , 0 )
LOCBUS (IHST _SOL , HST , 0 )
LOCBUS (IILMO _SOL , ILMO , 0 )
LOCBUS (IPS , PMOINS , 0 )
LOCBUS (IQS , QSURF , 0 )
LOCBUS (ITS , TSOIL , 1 )
LOCBUS (IZ0H , Z0T , 0 )
LOCBUS (IZ0M , Z0 , 0 )
LOCBUS (IZALFAT , ALFAT , 0 )
LOCBUS (IZTSURF , TSURF , 0 )
LOCBUS (IZTSRAD , TSRAD , 0 )
*
*
DO I=1,N
ZUN(I) = ZU
ZTN(I) = ZT
END DO
*
*
CALL PRELIM1
( BUS(X(TMOINS,1,NK)),
1 BUS(X(UMOINS ,1,NK)), BUS(X(VMOINS,1,NK)),
1 BUS(X(HUMOINS,1,NK)), BUS(X(PMOINS,1,1 )),
1 VMOD, VDIR, TVA, RHOA, N )
*
*
CALL SOILI
( BUS(X(TSOIL ,1,1)), BUS(X(WSOIL,1,1)),
1 BUS(X(WSOIL ,1,2)), BUS(X(ISOIL,1,1)),
1 BUS(X(SNOMA ,1,1)), BUS(X(SNORO,1,1)),
1 BUS(X(VEGFRAC,1,1)), BUS(X(CGSAT,1,1)),
1 BUS(X(WSAT ,1,1)), BUS(X(WWILT,1,1)),
1 BUS(X(BCOEF ,1,1)), BUS(X(C1SAT,1,1)),
1 BUS(X(C2REF ,1,1)), BUS(X(ACOEF,1,1)),
1 BUS(X(PCOEF ,1,1)), bus(x(CVEG ,1,1)),
1 bus(x(z0 ,1,indx_soil)),
1 CG, ZC1, ZC2, WGEQ, CT, ZCS,
1 bus(x(psn,1,1)),
1 bus(x(PSNG,1,1)), bus(x(PSNV,1,1)),
1 PSNZ0, Z0TOT, BUS(X(Z0T,1,indx_soil)), N )
*
*
CALL VEGI
( bus(x(FLUSOLIS,1,1)),
1 bus(x(tmoins ,1,nk)), bus(x(TSOIL ,1,1)),
1 bus(x(humoins,1,nk)), bus(x(pmoins,1,1)),
1 bus(x(WSOIL ,1,2)), bus(x(RGL ,1,1)),
1 bus(x(LAI ,1,1)), bus(x(STOMR ,1,1)),
1 bus(x(GAMVEG ,1,1)), bus(x(WWILT ,1,1)),
1 bus(x(WFC ,1,1)), bus(x(RS ,1,1)),
1 N )
*
*
CALL DRAG1
( bus(x(TSOIL ,1,1)), bus(x(WSOIL ,1,1)),
1 bus(x(WVEG ,1,1)), bus(x(thetaa,1,1)),
1 VMOD, bus(x(humoins,1,nk)),
1 bus(x(pmoins ,1,1)), bus(x(RS ,1,1)),
1 bus(x(VEGFRAC,1,1)),
1 BUS(X(Z0T,1,indx_soil)), Z0TOT, bus(x(WFC,1,1)),
1 bus(x(PSNG ,1,1)), bus(x(PSNV ,1,1)),
1 PSNZ0, bus(x(LAI ,1,1)), bus(x(za,1,1)),
1 bus(x(FCOR,1,1)), bus(x(RESA ,1,1)),
1 bus(x(ilmo,1,indx_soil)), bus(x(hst ,1,indx_soil)),
1 bus(x(ue2 ,1,indx_soil)), bus(x(ftemp,1,indx_soil)),
1 bus(x(fvap,1,indx_soil)),
1 CH, CD, HRSURF, bus(x(HUSURF,1,1)),
1 bus(x(HV,1,1)),
1 DEL, bus(x(qsurf,1,indx_soil)),
1 bus(x(bt,1,indx_soil)),
1 N )
*
*
CALL EBUDGET
( BUS(X(TMOINS,1,NK)),
1 bus(x(TSOIL,1,1)), bus(x(TSOIL,1,2)),
1 bus(x(WSOIL,1,2)), bus(x(ISOIL,1,1)),
1 bus(x(WSNOW,1,1)), bus(x(SNOMA,1,1)), DT,
1 bus(x(SNOAL,1,1)), CD, bus(x(rainrate,1,1)),
1 VMOD, VDIR, bus(x(FLUSOLIS,1,1)),
1 bus(x(ALVEG,1,1)), bus(x(ALVIS,1,indx_soil)),
1 bus(x(FDSI,1,1)), bus(x(thetaa,1,1)),
1 bus(x(humoins,1,nk)), bus(x(pmoins,1,1)), RHOA,
1 bus(x(umoins,1,nk)), bus(x(vmoins,1,nk)),
1 bus(x(VEGFRAC,1,1)), HRSURF,
1 bus(x(HV ,1,1)), DEL,
1 bus(x(RESA ,1,1)), bus(x(RS ,1,1)),
1 CT, CG, ZCS,
1 bus(x(PSN ,1,1)), bus(x(PSNV ,1,1)),
1 bus(x(PSNG ,1,1)), bus(x(WSAT ,1,1)),
1 bus(x(ROOTDP,1,1)), bus(x(SNODP,1,indx_soil)),
1 TST, T2T,
1 bus(x(RNET_S,1,1)),
1 bus(x(FC ,1,indx_soil)),
1 bus(x(FV ,1,indx_soil)),
1 bus(x(LEG ,1,1)), bus(x(LEV ,1,1)),
1 bus(x(LES,1,1)), bus(x(LER,1,1)),
1 bus(x(LETR ,1,1)), bus(x(FL,1,1)),
1 bus(x(EFLUX,1,1)),
1 LEFF, DWATERDT, DSNOWDT, FREEZS, RHOMAX,
1 bus(x(FTEMP,1,indx_soil)), BUS(X(FVAP,1,indx_soil)),
1 N )
*
*
CALL HYDRO1
( DT, bus(x(TSOIL,1,1)),
1 bus(x(TSOIL,1,2)), bus(x(WSOIL,1,1)),
1 bus(x(WSOIL,1,2)), bus(x(ISOIL,1,1)),
1 bus(x(WSNOW,1,1)), bus(x(WVEG ,1,1)),
1 bus(x(SNOMA,1,1)), bus(x(SNOAL,1,1)),
1 bus(x(SNORO,1,1)), bus(x(SNODP,1,indx_soil)),
1 bus(x(rainrate,1,1)), bus(x(snowrate,1,1)),
1 bus(x(tdiag,1,1)),
1 bus(x(udiag,1,1)),
1 bus(x(vdiag,1,1)),
1 bus(x(LEV ,1,1)), bus(x(LETR ,1,1)),
1 bus(x(LEG ,1,1)), bus(x(LES ,1,1)),
1 ZC1, ZC2, bus(x(C3REF,1,1)),
1 CG, WGEQ, CT, bus(x(LAI,1,1)), bus(x(VEGFRAC,1,1)),
1 bus(x(ROOTDP,1,1)), bus(x(WSAT,1,1)),
1 bus(x(WFC ,1,1)), bus(x(PSN ,1,1)),
1 bus(x(PSNG ,1,1)), bus(x(PSNV ,1,1)),
1 LEFF, DWATERDT, DSNOWDT, FREEZS, RHOMAX,
1 TST, T2T,
1 WGT, W2T, WFT, WLT, WRT, WST, ALPHAST, RHOST,
1 bus(x(drain,1,1)), bus(x(overfl,1,1)),
1 RSNOW, N )
*
*
CALL UPDATE3
( bus(x(TSOIL,1,1)), bus(x(TSOIL,1,2)),
1 bus(x(WSOIL,1,1)), bus(x(WSOIL,1,2)),
1 bus(x(ISOIL,1,1)), bus(x(WSNOW,1,1)),
1 bus(x(WVEG ,1,1)), bus(x(SNOMA,1,1)),
1 bus(x(SNOAL,1,1)), bus(x(SNORO,1,1)),
1 bus(x(SNODEN,1,1)), VMOD, CD, RHOA,
1 bus(x(FC ,1,indx_soil)),
1 bus(x(EFLUX,1,1)),
1 TST, T2T, WGT, W2T, WFT, WLT, WRT, WST,
1 ALPHAST, RHOST,
1 bus(x(BM ,1,1)), bus(x(FQ ,1,1)),
1 bus(x(ALFAT,1,1)),
1 bus(x(ALFAQ,1,1)),
1 bus(x(bt,1,indx_soil)),
1 bus(x(thetaa,1,1)),
1 bus(x(humoins,1,nk)),
1 bus(x(za,1,1)), N)
*
call diasurf1
(bus(x(udiag ,1,1 )),
$ bus(x(vdiag ,1,1 )),
$ bus(x(tdiag ,1,1 )),
$ bus(x(qdiag ,1,1 )),
$ n,
$ bus(x(umoins,1,nk )),
$ bus(x(vmoins,1,nk )),
$ bus(x(tsoil ,1,1 )),
$ bus(x(qsurf ,1,indx_soil)),
$ bus(x(z0 ,1,indx_soil)),
$ bus(x(z0t ,1,indx_soil)),
$ bus(x(ilmo ,1,indx_soil)),
$ bus(x(za ,1,1 )),
$ bus(x(hst ,1,indx_soil)),
$ bus(x(ue2 ,1,indx_soil)),
$ bus(x(ftemp ,1,indx_soil)),
$ bus(x(fvap ,1,indx_soil)),
$ zun, ztn,
$ bus(x(dlat ,1,1 ))
$ )
*
*
*VDIR NODEP
do i=1,n
*
*
ZTSURF (I) = TS (I)
ZTSRAD (I) = TS (I)
*
IF (.NOT.IMPFLX) CTU (I) = 0.
*
end do
*
* FILL THE ARRAYS TO BE AGGREGATED LATER IN S/R AGREGE
CALL FILLAGG
( BUS, BUSSIZ, PTSURF, PTSURFSIZ, INDX_SOIL,
+ SURFLEN )
*
RETURN
END