!copyright (C) 2001 MSC-RPN COMM %%%RPNPHY%%%
*** S/P CALCDIAG
subroutine calcdiag (d,f,v,dsiz,fsiz,vsiz, 1,1
$ dt,trnch,kount,ni,nk)
*
#include "phy_macros_f.h"
#include "impnone.cdk"
*
integer dsiz,fsiz,vsiz,trnch,kount,ni,nk
real dt
real d(dsiz),f(fsiz), v(vsiz)
*
*
*Author
* B. Bilodeau Feb 2003
*
*Revisions
* 001 A. PLante (Sep 2003) - Test temperature at surface and not at nk-1 for
* freezing rain diag. Also include ipcptype in
* ice pellets logic (fip).
* 002 B. Bilodeau and L. Spacek (Dec 2003) - Set accumulators to zero
* 003 A. Plante (Dec 2003) - PCPN TYPE from volatile pcpn rate
* 004 A. Plante (Feb 2004) - Add shallow convection precipitation rate and accumulation.
* 005 A. Plante (Mar 2004) - Move bourge in this routine from vkuocon
* 006 A. Plante (Apr 2004) - Default PCPN TYPE from PCPN rates tsc tlc tscs tlcs tss tls.
*
*Object
* to calculate averages and accumulators
* of tendencies and diagnostics
*
*Arguments
*
* - Input/Output -
* D dynamic bus
* F permanent bus
*
* - Input -
* V volatile (output) bus
*
* - Input -
* DSIZ dimension of d
* FSIZ dimension of f
* VSIZ dimension of v
* TRNCH slice number
* KOUNT timestep number
* DT length of timestep
* N horizontal running length
* NK vertical dimension
*
*
*IMPLICITES
*
#include "indx_sfc.cdk"
#include "consphy.cdk"
#include "phybus.cdk"
#include "options.cdk"
*
*MODULES
*
**
EXTERNAL BOURGE1
INTEGER I
REAL MOYHRI
REAL TEMPO, SOL_STRA, SOL_CONV, LIQ_STRA, LIQ_CONV
*
*****************************************************************
* PRECIPITATION RATES AND ACCUMULATIONS *
* ------------------------------------- *
*****************************************************************
*
if (moyhr.gt.0) moyhri= 1./float(moyhr)
*
if (kount.gt.0) then
* DIAGNOSTICS ON PRECIPITATION TYPE.
if(ipcptype.eq.1)then
call bourge1
(v(fneige),v(fip),d(tplus),d(sigm),ni,nk-1)
endif
*
*VDIR NODEP
do i=0,ni-1
*
* taux des precipitations de la convection profonde
v(ry+i) = f(tsc+i) + f(tlc+i)
*
* taux des precipitations de la convection restreinte
v(rz+i) = f(tscs+i) + f(tlcs+i)
*
* taux des precipitations implicites
v(rc+i) = v(ry+i) + v(rz+i)
**
* taux des precipitations stratiformes
v(rr+i) = f(tss+i) + f(tls+i)
*
* taux total
v(rt+i) = v(rc+i) + v(rr+i)
*
* asc : accumulation des precipitations solides de la convection profonde
f(asc+i) = f(asc+i) + f(tsc+i) * dt
*
* ascs : accumulation des precipitations solides de la convection restreinte
f(ascs+i) = f(ascs+i) + f(tscs+i) * dt
*
* ass : accumulation des precipitations solides stratiformes
f(ass+i) = f(ass+i) + f(tss+i) * dt
*
* alc : accumulation des precipitations liquides de la convection profonde
f(alc+i) = f(alc+i) + f(tlc+i) * dt
*
* alcs : accumulation des precipitations liquides de la convection restreinte
f(alcs+i) = f(alcs+i) + f(tlcs+i) * dt
*
* als : accumulation des precipitations liquides stratiformes
f(als+i) = f(als+i) + f(tls+i) * dt
*
* pc : accumulation des precipitations implicites
v(pc+i) = f(alc+i) + f(asc+i) + f(alcs+i) + f(ascs+i)
*
* py : accumulation des precipitations de la convection profonde
v(py+i) = f(alc+i) + f(asc+i)
**
* pz : accumulation des precipitations de la convection restreinte
v(pz+i) = f(alcs+i) + f(ascs+i)
*
* ae : accumulation des precipitations stratiformes
v(ae+i) = f(als+i) + f(ass+i)
*
* pr : accumulation des precipitations totales
v(pr+i) = v(pc+i) + v(ae+i)
*
* RN : ACCUMULATION DES PRECIPITATIONS de PLUIE
* AZR: ACCUMULATION DES PRECIPITATIONS VERGLACLACANTES
if (istcond.ne.5.and.ipcptype.eq.0) then
sol_stra=f(tss+i)
liq_stra=f(tls+i)
sol_conv=f(tsc+i)+f(tscs+i)
liq_conv=f(tlc+i)+f(tlcs+i)
else
tempo=f(tls+i)+f(tss+i)
sol_stra=max(0.,v(fneige+i)*tempo)
liq_stra=max(0.,tempo-sol_stra)
tempo=(f(tlc+i)+f(tlcs+i))+(f(tsc+i)+f(tscs+i))
sol_conv=max(0.,v(fneige+i)*tempo)
liq_conv=max(0.,tempo-sol_conv)
endif
tempo=liq_stra+liq_conv
if ( d(tplus+(nk-1)*ni+i) .lt. tcdk ) then
f(azr+i) = f(azr+i) +
$ (1.-v(fip+i))*tempo*dt
if(tempo.gt.0.)v(zrflag+i)=1.
else
f(rn+i) = f(rn+i) +
$ (1.-v(fip+i))*tempo*dt
endif
*
* AIP: ACCUMULATION DES PRECIPITATIONS RE-GELEES
*
f(aip+i) = f(aip+i) +
$ v(fip+i)*tempo*dt
*
* SN: ACCUMULATION DES PRECIPITATIONS de neige
*
f(sn+i) = f(sn+i) + (sol_stra+sol_conv)*dt
*
end do
*
endif
*
*
*
*****************************************************************
* AVERAGES *
* -------- *
*****************************************************************
*
* set accumulators to zero every moyhr hours
if (moyhr.gt.0) then
*
if (mod((kount-1),moyhr).eq.0) then
*
do i = 0, ni-1
f(fcmy +i) = 0.0
f(fvmy +i) = 0.0
end do
*
do i = 0, ni*(nk-1)-1
*
* minimum and maximum temperature
f(ttmin +i) = d(tplus +i)
f(ttmax +i) = d(tplus +i)
*
f(kshalm +i) = 0.0
f(ccnm +i) = 0.0
f(tim +i) = 0.0
f(t2m +i) = 0.0
f(ugwdm +i) = 0.0
f(vgwdm +i) = 0.0
f(udifvm +i) = 0.0
f(vdifvm +i) = 0.0
f(tdifvm +i) = 0.0
f(qdifvm +i) = 0.0
f(hushalm+i) = 0.0
f(tshalm +i) = 0.0
f(lwcm +i) = 0.0
f(iwcm +i) = 0.0
*
* see vkuocon6 for the calculation of the
* averages of the following arrays
f(zctem +i) = 0.0
f(zstem +i) = 0.0
f(zcqem +i) = 0.0
f(zsqem +i) = 0.0
f(zsqcem +i) = 0.0
end do
*
* kfc or kfckuo2 convection schemes
if (iconvec.eq.6.or.iconvec.eq.12) then
*
do i=0, ni-1
f(capekfcm +i) = 0.0
f(wumkfcm +i) = 0.0
f(zbaskfcm +i) = 0.0
f(ztopkfcm +i) = 0.0
f(kkfcm +i) = 0.0
end do
*
do i = 0, ni*(nk-1)-1
f(tfcpm +i) = 0.0
f(hufcpm +i) = 0.0
f(qckfcm +i) = 0.0
f(umfkfcm +i) = 0.0
f(dmfkfcm +i) = 0.0
end do
*
endif
*
endif
*
endif
*
if ((moyhr.gt.0).and.(kount.gt.0)) then
*
do i = 0, ni-1
*
f(fcmy +i) = f(fcmy +i) + v(fc + (indx_agrege-1)*ni+i)
f(fvmy +i) = f(fvmy +i) + v(fv + (indx_agrege-1)*ni+i)
f(kshalm +i)= f(kshalm +i)+ v(kshal +i)
*
if (mod((kount),moyhr).eq.0) then
f(fcmy +i) = f(fcmy +i) * moyhri
f(fvmy +i) = f(fvmy +i) * moyhri
f(kshalm +i) = f(kshalm +i) * moyhri
endif
*
end do
*
do i = 0, ni*(nk-1)-1
*
* minimum and maximum temperature
f(ttmin +i) = min( f(ttmin +i), d(tplus + i) )
f(ttmax +i) = max( f(ttmax +i), d(tplus + i) )
*
f(ccnm +i) = f(ccnm +i) + f(ccn +i)
f(tim +i) = f(tim +i) + f(ti +i)
f(t2m +i) = f(t2m +i) + f(t2 +i)
f(ugwdm +i) = f(ugwdm +i) + v( ugwd+i)
f(vgwdm +i) = f(vgwdm +i) + v( vgwd+i)
f(udifvm +i) = f(udifvm +i) + v(udifv+i)
f(vdifvm +i) = f(vdifvm +i) + v(vdifv+i)
f(tdifvm +i) = f(tdifvm +i) + v(tdifv+i)
f(qdifvm +i) = f(qdifvm +i) + v(qdifv+i)
f(hushalm+i) = f(hushalm+i) + v(hushal+i)
f(tshalm +i) = f(tshalm +i) + v(tshal+i)
f(lwcm +i) = f(lwcm +i) + f(lwc+i)
f(iwcm +i) = f(iwcm +i) + f(iwc+i)
*
if (mod((kount),moyhr).eq.0) then
f(ccnm +i) = f(ccnm +i) * moyhri
f(tim +i) = f(tim +i) * moyhri
f(t2m +i) = f(t2m +i) * moyhri
f(ugwdm +i) = f(ugwdm +i) * moyhri
f(vgwdm +i) = f(vgwdm +i) * moyhri
f(udifvm +i) = f(udifvm +i) * moyhri
f(vdifvm +i) = f(vdifvm +i) * moyhri
f(tdifvm +i) = f(tdifvm +i) * moyhri
f(qdifvm +i) = f(qdifvm +i) * moyhri
f(zctem +i) = f(zctem +i) * moyhri
f(zcqem +i) = f(zcqem +i) * moyhri
f(zcqcem +i) = f(zcqcem +i) * moyhri
f(zstem +i) = f(zstem +i) * moyhri
f(zsqem +i) = f(zsqem +i) * moyhri
f(zsqcem +i) = f(zsqcem +i) * moyhri
f(hushalm+i) = f(hushalm+i) * moyhri
f(tshalm +i) = f(tshalm +i) * moyhri
f(lwcm +i) = f(lwcm +i) * moyhri
f(iwcm +i) = f(iwcm +i) * moyhri
*
endif
end do
*
if (iconvec.eq.6.or.iconvec.eq.12) then
do i = 0, ni*(nk-1)-1
f(tfcpm +i) = f(tfcpm +i) + f(tfcp +i)
f(hufcpm +i) = f(hufcpm +i) + f(hufcp+i)
f(qckfcm +i) = f(qckfcm +i) + f(qckfc+i)
f(umfkfcm +i) = f(umfkfcm +i) + f(umfkfc+i)
f(dmfkfcm +i) = f(dmfkfcm +i) + f(dmfkfc+i)
*
if (mod((kount),moyhr).eq.0) then
f(tfcpm +i) = f(tfcpm +i) * moyhri
f(hufcpm +i) = f(hufcpm +i) * moyhri
f(qckfcm +i) = f(qckfcm +i) * moyhri
f(umfkfcm +i) = f(umfkfcm +i) * moyhri
f(dmfkfcm +i) = f(dmfkfcm +i) * moyhri
endif
end do
do i=0, ni-1
f(capekfcm +i) = f(capekfcm+i) + f(capekfc+i)
f(wumkfcm +i) = f(wumkfcm+i) + f(wumaxkfc+i)
f(zbaskfcm +i) = f(zbaskfcm+i) + f(zbasekfc+i)
f(ztopkfcm +i) = f(ztopkfcm+i) + f(ztopkfc+i)
f(kkfcm+i) = f(kkfcm+i) + v(kkfc+i)
*
if (mod((kount),moyhr).eq.0) then
f(capekfcm +i) = f(capekfcm +i) * moyhri
f(wumkfcm+i) = f(wumkfcm+i) * moyhri
f(zbaskfcm+i) = f(zbaskfcm+i) * moyhri
f(ztopkfcm+i) = f(ztopkfcm+i) * moyhri
f(kkfcm+i) = f(kkfcm+i) * moyhri
endif
*
end do
endif
*
endif
*
*
*****************************************************************
* ACCUMULATORS *
* ------------ *
*****************************************************************
*
if (kount.gt.0) then
*
*VDIR NODEP
do i = 0,ni-1
*
* Accumulation of precipitation (in m)
*
f(rainaf+i) = f(rainaf+i) + v(rainrate+i)*dt
f(snowaf+i) = f(snowaf+i) + v(snowrate+i)*dt
*
if (iradia.ge.1) then
f(eiaf +i) = f(eiaf +i) + f(ei +i) * dt
f(evaf +i) = f(evaf +i) + f(ev +i) * dt
f(fiaf +i) = f(fiaf +i) + f(fdsi+i) * dt
f(fsaf +i) = f(fsaf +i) + f(fdss+i) * dt
f(ivaf +i) = f(ivaf +i) + v(iv +i) * dt
f(ntaf +i) = f(ntaf +i) + f(nt +i) * dt
f(flusolaf+i) = f(flusolaf+i) +
1 v(flusolis+i) * dt
endif
*
if (ifluvert.ge.1) then
f(suaf +i) = f(suaf +i) + v(ustress+i) * dt
f(svaf +i) = f(svaf +i) + v(vstress+i) * dt
f(fqaf +i) = f(fqaf +i) + f(fq +i) * dt
f(siaf +i) = f(siaf +i) + v(fnsi+i) * dt
f(flaf +i) = f(flaf +i) + v(fl +i) * dt
f(fcaf +i) = f(fcaf +i) +
+ v(fc + (indx_agrege-1)*ni+i) * dt
f(fvaf +i) = f(fvaf +i) +
+ v(fv + (indx_agrege-1)*ni+i) * dt
endif
*
if (ischmsol.eq.3) then
*
* Accumulation of evaporation (in kg/m2)
*
f(legaf +i) = f(legaf +i) + v(leg +i) * dt / CHLC
f(leraf +i) = f(leraf +i) + v(ler +i) * dt / CHLC
f(letraf +i) = f(letraf +i) + v(letr +i) * dt / CHLC
f(levaf +i) = f(levaf +i) + v(lev +i) * dt / CHLC
f(lesaf +i) = f(lesaf +i) + v(les +i) * dt
1 / (CHLC+CHLF)
*
* Accumulation of drained water
* (soil base water flux, in kg/m2 or mm);
* factor 1000 is for density of water.
*
f(drainaf +i) = f(drainaf +i)
1 - 1000. * f(drain+i) * f(rootdp+i)
*
* Accumulation of surface runoff (in kg/m2 or mm)
*
f(overflaf+i) = f(overflaf+i) + v(overfl+i)
*
endif
*
end do
*
endif
*
*
return
end