SUBROUTINE CH_VAVG(KNUM,KFLAG,KFLAG2,PINOUT,PROF, 4,1
1 CDBGTYP,pvtr,pobslev,pobslev2,
1 pressa,knflev,plat,klat,pstate,
1 cdvar,kmod,kobstyp)
C
IMPLICIT NONE
C
C* Declaration of arguments
C
CHARACTER*(*) CDBGTYP
CHARACTER*(*) cdvar
INTEGER knflev,kmod,knum,klat
INTEGER KFLAG(knum),KFLAG2(knum),kobstyp
REAL*8 pvtr(knflev),pstate(knflev),pinout(knum),prof(knflev)
REAL*8 plat,pobslev(knum),pobslev2(knum),pressa(knflev)
C
*---------------------------------------------------------------------
#if defined (DOC)
*
***s/r CH_VAVG -- Control module for forward model or adjoit model calculations
* related to observations of columnar/layer averages.
*
*Author : Y.J. Rochon and Y. Yang AQRB/MSC July 2005
*
*Revision:
*
** Purpose: Control module for forward model or adjoint model calculations
* related to observations of columnar/layer averages.
*
*Arguments:
*
* Input pvtr(nvlev) -- background values at eta levels when kmod=0
* pinout(knum) -- Layer averages (divided by std. dev.)
* when kmod=1
* kmod -- Flag indicating purpose of call:
* 0: Use as forward model
* 1: Use as adjoint of forward model.
* knvlev -- # of analysis vertical levels
* plat -- Latitude of obs. (=ROBHDR(NMCLAT,obsindex)
* klat -- Latitude index (=MOBHDR(NCMLAT,obsindex)
* cdvar -- Model variable name
* pstate(knflev) -- State profile for possible use in CH_GENOPER
* (see CH_VERTAVG)
* CDBGTYP -- 'HR' for high resolution (trial field) grid
* 'BG' for low resolution (rebm) grid
* knum -- # of obs elements in the obs profile
* kflag(knum) -- MOBDATA(NCMASS,*) for obs elements
* kflag2(knum) -- MOBDATA(NCMXTR,*) for obs elements
* prof(knflev) -- Initial GOMOBS segment when kmod=1
* kobstyp -- Straight summation if kobstyp=4
*
* Output pinout(knum) -- Layer averages when kmod=0
* prof(knflev) -- Updated GOMOBS segment when kmod=1
* kflag(knum) -- MOBDATA(NCMASS,*) for obs elements
* kflag2(knum) -- MOBDATA(NCMXTR,*) for obs elements
*
* Others ztot -- partial (or total column) value between
* pressure levels ptop and pbtm when kmod=0
* itot -- Flag indicating of pinout(j) (or pvtr) was
* correctly produced (1 for yes)
*
*Comments:
*
*---------------------------------------------------------------------
#endif
C
C* Global variables
C
#include "pardim.cdk"
#include "comdim.cdk"
#include "comlun.cdk"
#include "comgem.cdk"
#include "comchem.cdk"
C
INTEGER J,J1,ITOT,KFIRST
REAL*8 ZTOT,ZPTOP,ZPBTM
C
C Loop over observation elements in a profile
C (with common lat-long)
C
if (kmod.eq.0) pinout(:)=0.0
C
kfirst=1
DO J=1,knum
C
C Check for partial columns which extend above the top analysis level
C or are entirely below surface.
C
if (kflag(j).EQ.1.AND.kflag2(j).EQ.0) then
if (POBSLEV2(J).lt.PRESSA(1)*10.0.and.POBSLEV(J).lt.PRESSA(1)) then
kflag2(j)=1
else if (POBSLEV2(J).gt.PRESSA(KNFLEV).and.POBSLEV(J).gt.PRESSA(KNFLEV)) then
kflag(j)=0
kflag2(j)=2
end if
end if
C
if (kflag(j).EQ.1.AND.kflag2(j).EQ.0) then
C
C Set range of vertical levels
C
ZPTOP = POBSLEV(J)
ZPBTM = POBSLEV2(J)
if (ZPBTM.gt.PRESSA(KNFLEV)) ZPBTM=PRESSA(KNFLEV)
IF (ZPTOP.EQ.ZPBTM.OR.ZPTOP.GT.ZPBTM) THEN
call abort3d(nulout,'CH_VAVG: Boundary problem')
END IF
C
C Perform the integration
C
CALL CH_VERTAVG
(CDBGTYP, pvtr, pinout(j),zptop,zpbtm,
1 pressa,knflev,kfirst,plat,klat,pstate,
1 nulout,cdvar,ngenoper,itot,kmod,kobstyp)
kfirst=2
C
if (itot.eq.0) then
kflag(j)=0
else if (kmod.eq.0) then
C
C Forward/TLM model calc. - output is 'pinout'
C
else if (kmod.eq.1) then
C
C Adjoint of TLM model calc.
C
do j1=1,knflev
prof(j1)=prof(j1)+pvtr(j1)
end do
end if
end if
END DO
C
RETURN
END