subroutine postmin 2,13
use mod4dv, only : l4dvar
use modstag, only : lstagwinds
#if defined (DOC)
*
***s/r postmin - Post-minimization control of the 3Dvar
*
*
*Author : S. Pellerin *ARMA/SMC May 2000
*Revision:
* S. Pellerin: fix to spa2sp/spgd call conditions
* C. Charette - ARMA/SMC - Sep. 2004
* - Conversion to hybrid vertical coordinate
* Y. Yang Sep. 2004
* - Added call to ch_varout for outputing species
* Y. Yang Feb. 2005
* - Deleted ZO3 and PXO3
* Bin He *ARMA/SMC Dec. 2006
* - added calling memfree before varout to free some memories
* which are not needed in varout.
* S. Pellerin August 2008
* - Added calls to 'tmg_*' subroutines
* Y. Yang, Aug. 2010
* - Added call to chi_2_test
* -------------------
**
*
*Arguments
* -NONE-
#endif
IMPLICIT NONE
*implicits
#include "pardim.cdk"
#include "comdim.cdk"
#include "comlun.cdk"
#include "comcva.cdk"
#include "comgem.cdk"
#include "comgdpar.cdk"
#include "compost.cdk"
#include "comgd0.cdk"
#include "localpost.cdk"
#include "comoabdy.cdk"
#include "comvarqc.cdk"
#include "comvfiles.cdk"
*
C
INTEGER IZS(1)
REAL*8 ZZS(1)
REAL*8 DLDS(1)
LOGICAL LLTEST
CHARACTER *8 CSTATUS
C
INTEGER IMPRES, IMODE, ITERMAX, ISIMMAX, INDIC, ISCALE
INTEGER IERR,ITERDONE,ITERTOT,JK, JLA,ilen,jj,ji
REAL*8 ZJSP, ZXMIN, ZDF1, ZEPS, ZSMACH,ztemp
REAL*8 DLGNORM, DLXNORM, DLGNORM0, DLGNORMS
C
LOGICAL LSTAGTEMP
INTEGER FNOM,FCLOS
EXTERNAL FNOM,FCLOS
EXTERNAL TESTSP, M1QN2, M1QN3, ABORT3D
S , SCALQN, CANAB, CANONB, PRSCAL , DEMARRE
S , TRANSFER, SUPOST
c
c if a restart file was writen at the end of minimize.ftn,
c lrestart was turn to .true. to avoid postmin execution
c
if (lrestart) return
c
write(nulout,*) 'ENTERING POSTMIN'
C
LVARDIAG=.FALSE.
ILEN = NI*NFLEV*NJ
CALL HPALLOC(PXTTG,MAX(1,ILEN),IERR,8)
CALL HPALLOC(PXHUG,MAX(1,ILEN),IERR,8)
CALL HPALLOC(PXUUG,MAX(1,ILEN),IERR,8)
CALL HPALLOC(PXVVG,MAX(1,ILEN),IERR,8)
CALL HPALLOC(PXPP,MAX(1,ILEN),IERR,8)
CALL HPALLOC(PXQQ,MAX(1,ILEN),IERR,8)
CALL HPALLOC(PXCC,MAX(1,ILEN),IERR,8)
CALL HPALLOC(PXQR,MAX(1,ILEN),IERR,8)
CALL HPALLOC(PXDD,MAX(1,ILEN),IERR,8)
CALL HPALLOC(PXTTB,MAX(1,ILEN),IERR,8)
CALL HPALLOC(PXTTU,MAX(1,ILEN),IERR,8)
CALL HPALLOC(PXTV,MAX(1,ILEN),IERR,8)
CALL HPALLOC(PXGZ,MAX(1,ILEN),IERR,8)
CALL HPALLOC(PXGZB,MAX(1,ILEN),IERR,8)
CALL HPALLOC(PXGZU,MAX(1,ILEN),IERR,8)
CALL HPALLOC(PXES,MAX(1,ILEN),IERR,8)
CALL HPALLOC(PXESG,MAX(1,ILEN),IERR,8)
CALL HPALLOC(PXHU,MAX(1,ILEN),IERR,8)
CALL HPALLOC(PXPSG,MAX(1,NI*NJ),IERR,8)
CALL HPALLOC(PXPSB,MAX(1,NI*NJ),IERR,8)
CALL HPALLOC(PXPSU,MAX(1,NI*NJ),IERR,8)
CALL HPALLOC(PXPT,MAX(1,NI*NJ),IERR,8)
*
CALL ZERO(ILEN,ZQQ(1,1,1))
CALL ZERO(ILEN,ZQR(1,1,1))
CALL ZERO(ILEN,ZPP(1,1,1))
CALL ZERO(ILEN,ZDD(1,1,1))
CALL ZERO(ILEN,ZCC(1,1,1))
CALL ZERO(ILEN,ZUUG(1,1,1))
CALL ZERO(ILEN,ZVVG(1,1,1))
CALL ZERO(ILEN,ZTTG(1,1,1))
CALL ZERO(ILEN,ZTTB(1,1,1))
CALL ZERO(ILEN,ZTTU(1,1,1))
CALL ZERO(ILEN,ZTV(1,1,1))
CALL ZERO(ILEN,ZGZ(1,1,1))
CALL ZERO(ILEN,ZGZB(1,1,1))
CALL ZERO(ILEN,ZGZU(1,1,1))
CALL ZERO(ILEN,ZES(1,1,1))
CALL ZERO(ILEN,ZESG(1,1,1))
CALL ZERO(ILEN,ZHU(1,1,1))
CALL ZERO(ILEN,ZHUG(1,1,1))
CALL ZERO(NI*NJ,zpsg(1,1))
CALL ZERO(NI*NJ,zpsb(1,1))
CALL ZERO(NI*NJ,zpsu(1,1))
CALL ZERO(NI*NJ,zpt(1,1))
C
C Copy REAL*8 part of CMA back to REAL*4 CMA counterpart
C after minimization has ended. From this point all CMA
C references are to ROBDATA.
call cprob8to4
C
IF (LVARQC) CALL LISTREJ
C
CALL VINT3DFD
(NCMOMA)
CALL VINT3DFD
(NCMOMF)
CALL SETASSFLG
CALL FILBRPPOST
c
CALL SUPOST
c
NIP2 = NIP2A
NIG2 = NIG2A
NDEET = NDEETA
NPAS = NPASA
NSTAMP= NSTAMPA
CVARPOST = 'R'
c
WRITE(NULOUT,FMT='(/," POSTMIN - Postprocessing")')
WRITE(NULOUT,FMT='(11X,"of the analysis increment (X -Xb)")')
C
C In l4dvar mode transform of variables has already been done in ENDSIM2
C at the end of minimize
C
if(.not. l4dvar .or. .not. ltlmend) then
call tmg_start(51,'VAR_CH') !
CALL CAIN(NVADIM,VAZX)
WRITE(NULOUT,*)' SPA2SP: Transform analysis variables to'
S ,' model variables -'
if(nanalvar.eq.4) then
LSTAGTEMP=LSTAGWINDS
LSTAGWINDS=.FALSE.
CALL SPA2GD
LSTAGWINDS=LSTAGTEMP
else
CALL SPA2SP
call spgd
endif
call tmg_stop (51) !
endif
C
c Get first guess fields on analysis grid
C Compute increments of HU on analysis grid
c This field is compulsary because it is used
c to produce the analysis of HU in FELIX
c
call getfstg
(zttg,zhug,zuug,zvvg,zesg,zpsg,zpt,ni,nj,nflev)
c
IF ( CHUM .EQ. 'LQ') THEN
do jk = 1,nflev
do jj = 1,nj
do ji = 1,ni
ZTEMP = log(zhug(ji,jk,jj)) + q0(ji,jk,jj)
zhu(ji,jk,jj) = EXP(ZTEMP) - zhug(ji,jk,jj)
enddo
enddo
enddo
endif
IF ( CHUM .EQ. 'ES') THEN
call mhuaesgd
(zesg,zhug,zttg,zpsg,zpt,ni,nj,nflev)
call lesahugd(zhu,zttg,zhug,zesg,zpsg,zpt,ni,nj,nflev)
ENDIF
c
call diag3dvar
c
c Free these memory which are not needed in varout
c
CALL memfree
(nulout)
call tmg_start(99,'VAROUT')
CALL varout
CALL ch_varout
call tmg_stop(99)
C
C chi^2 test
C
call chi_2_test
C
CALL HPDEALLC(PXTTG,IERR,1)
CALL HPDEALLC(PXHUG,IERR,1)
CALL HPDEALLC(PXUUG,IERR,1)
CALL HPDEALLC(PXVVG,IERR,1)
CALL HPDEALLC(PXPP,IERR,1)
CALL HPDEALLC(PXQQ,IERR,1)
CALL HPDEALLC(PXCC,IERR,1)
CALL HPDEALLC(PXQR,IERR,1)
CALL HPDEALLC(PXDD,IERR,1)
CALL HPDEALLC(PXTTB,IERR,1)
CALL HPDEALLC(PXTTU,IERR,1)
CALL HPDEALLC(PXTV,IERR,1)
CALL HPDEALLC(PXGZ,IERR,1)
CALL HPDEALLC(PXGZB,IERR,1)
CALL HPDEALLC(PXGZU,IERR,1)
CALL HPDEALLC(PXES,IERR,1)
CALL HPDEALLC(PXESG,IERR,1)
CALL HPDEALLC(PXHU,IERR,1)
CALL HPDEALLC(PXPSG,IERR,1)
CALL HPDEALLC(PXPSB,IERR,1)
CALL HPDEALLC(PXPSU,IERR,1)
CALL HPDEALLC(PXPT,IERR,1)
C
write(nulout,*) 'LEAVING POSTMIN'
C
RETURN
END