SUBROUTINE PUTDX2(CDTLMADJ) 9 #if defined (DOC) * ***s/r PUTDX2 - Communicating Delta X to the TLM * * *Author : P. Gauthier *ARMA/MSC June 15, 2001 *Revision: * S. Pellerin *ARMA/SMC Nov. 2001 * * M. Buehner *ARMA/MSC August 2002 * - Added character argument to allow use in SV calculation * * S. Pellerin *ARMA/SMC March 2003 * - Added char argument E to allow additional TLM intergration * for 4Dvar diagnostic purposes * S. Pellerin, ARMA, August 2008 * - Added calls to 'tmg_*' subroutines * C. Charette *ARMA/SMC April 2006 * - Added chemistry tracers * * ------------------ * Arguments: CDTLMADJ = 'P' write state vector for 4Dvar * 'F' write state from forward integration for SV * 'N' write state from nonlinear forward integration for SV * 'A' write state for adjoint integration for SV * 'E' write state vector for 4Dvar and request * additional integration of TLM without * profile output and adjoint integration * (event EVN_TLME) * ------------------ * * ---------------- * Writes the model state GD0 in the Prof_File 'dwgf.prof' * Input: GD0(:,:,:) * Output: Prof_File 'delta_x.type9' #endif * use modstag, only: r1qm2_s, lstagwinds implicit none include 'prof_f.h' #include "pardim.cdk"
#include "comdim.cdk"
#include "comlun.cdk"
#include "comgd0.cdk"
#include "comgem.cdk"
#include "comstate.cdk"
#include "comcva.cdk"
#include "comvfiles.cdk"
#include "comcst.cdk"
#include "comchem.cdk"
* character CDTLMADJ * * local variables * integer ihdlin, ihdlout, istat, iulout, istag integer prof_wrrec, ievent,ininj * REAL*8, POINTER::DLBUFF(:,:),DLBUFF2D(:) INTEGER ICOUNT, JLAT, JLON, JLEV, jj INTEGER ITRLEV, JTR character(len=128) :: clprof character(len=3) :: clsim3d * real*8 :: dlconphy_vv(njbeg:njend) * * Adjustment for the computation of wind images... * if(lstagwinds) then dlconphy_vv(:) = ra*r1qm2_s(:) else dlconphy_vv(:) = conphy(:) end if * if(CDTLMADJ.eq.'E') nsim3d = nsim3d + 1 if(CDTLMADJ.eq.'P' .or. CDTLMADJ.eq.'E') THEN clprof = trim(CEXC4DV) // '/dwgf.prof' WRITE(NULOUT,*)'PUTDX2 - SENDING MODEL STATE ON GRID POINTS' S ,' TO TLM for simulation number ',nsim3d elseif(CDTLMADJ.eq.'F'.or.CDTLMADJ.eq.'N') THEN clprof = trim(CEXC4DV) // '/dwgf.prof' WRITE(NULOUT,*)'PUTDX2 - SENDING MODEL STATE ON GRID POINTS' S ,' TO TLM for simulation number ',nsim3d elseif(CDTLMADJ.eq.'A') THEN clprof = trim(CEXC4DV) // '/dwga1.prof' WRITE(NULOUT,*)'PUTDX2 - SENDING MODEL STATE ON GRID POINTS' S ,' TO ADJ for simulation number ',nsim3d endif ALLOCATE(DLBUFF(NI*NJ,NFLEV),stat=istat) IHDLOUT = PROF_OPEN(clprof,'WRITE','FILE') call mvbits(ni,0,16,ininj,16) call mvbits(nj,0,16,ininj,0) istat = prof_pvar(ihdlout,ininj,prm_ninj) if (lstagwinds) then istag = 1 else istag = 0 endif istat = prof_pvar(ihdlout,istag,prm_stag) * * 3D fields * ---------- * if(istat == 0) then IF(NGEXIST(NGUU).EQ.1) THEN * DLBUFF(:,:) = 0. if(CDTLMADJ.eq.'F'.or.CDTLMADJ.eq.'P'.or.CDTLMADJ.eq.'E'.or & .CDTLMADJ.eq.'N') THEN DO JLEV = 1, NFLEV ICOUNT = 0 DO JLAT = 1, NJ DO JLON = 1, NI ICOUNT = ICOUNT + 1 DLBUFF(ICOUNT,JLEV) = UT0(JLON,JLEV,JLAT)*conphy(jlat) END DO END DO END DO elseif(CDTLMADJ.eq.'A') THEN DO JLEV = 1, NFLEV ICOUNT = 0 DO JLAT = 1, NJ DO JLON = 1, NI ICOUNT = ICOUNT + 1 DLBUFF(ICOUNT,JLEV) = UT0(JLON,JLEV,JLAT)*conima(jlat) END DO END DO END DO endif ISTAT = PROF_PVAR(IHDLOUT,DLBUFF,V3D_UTRU) + istat END IF * IF(NGEXIST(NGVV).EQ.1) THEN DLBUFF(:,:) = 0. if(CDTLMADJ.eq.'F'.or.CDTLMADJ.eq.'P'.or.CDTLMADJ.eq.'E'.or & .CDTLMADJ.eq.'N') THEN DO JLEV = 1, NFLEV ICOUNT = 0 DO JLAT = 1, NJ DO JLON = 1, NI ICOUNT = ICOUNT + 1 DLBUFF(ICOUNT,JLEV) = VT0(JLON,JLEV,JLAT)*dlconphy_vv(jlat) END DO END DO END DO elseif(CDTLMADJ.eq.'A') THEN DO JLEV = 1, NFLEV ICOUNT = 0 DO JLAT = 1, NJ DO JLON = 1, NI ICOUNT = ICOUNT + 1 DLBUFF(ICOUNT,JLEV) = VT0(JLON,JLEV,JLAT)*conima(jlat) END DO END DO END DO endif ISTAT = PROF_PVAR(IHDLOUT,DLBUFF,V3D_VTRU) + istat END IF * IF(NGEXIST(NGTT).EQ.1) THEN DLBUFF(:,:) = 0. DO JLEV = 1, NFLEV ICOUNT = 0 DO JLAT = 1, NJ DO JLON = 1, NI ICOUNT = ICOUNT + 1 DLBUFF(ICOUNT,JLEV) = TT0(JLON,JLEV,JLAT) END DO END DO END DO ISTAT = PROF_PVAR(IHDLOUT,DLBUFF,V3D_TEMP) + istat END IF * IF(NGEXIST(NGQ).EQ.1) THEN DLBUFF(:,:) = 0. DO JLEV = 1, NFLEV ICOUNT = 0 DO JLAT = 1, NJ DO JLON = 1, NI ICOUNT = ICOUNT + 1 DLBUFF(ICOUNT,JLEV) = Q0(JLON,JLEV,JLAT) END DO END DO END DO ISTAT = PROF_PVAR(IHDLOUT,DLBUFF,V3D_SPHU) + istat END IF * * TRACERS * IF(NGCMT .GT. 0) THEN DO JTR = 1,NGCMT IF(NGEXIST(NGTR(JTR)).EQ.1) THEN DLBUFF(:,:) = 0. DO JLEV = 1, NFLEV ITRLEV = (JTR-1)*NFLEV + JLEV ICOUNT = 0 DO JLAT = 1, NJ DO JLON = 1, NI ICOUNT = ICOUNT + 1 DLBUFF(ICOUNT,JLEV) = GTR0(JLON,ITRLEV,JLAT) END DO END DO END DO IF(CGCMT(JTR) .EQ. 'O3') THEN ISTAT = PROF_PVAR(IHDLOUT,DLBUFF,V3D_O3) + istat ELSEIF(CGCMT(JTR) .EQ. 'CH4') THEN ISTAT = PROF_PVAR(IHDLOUT,DLBUFF,V3D_CH4) + istat ELSEIF(CGCMT(JTR) .EQ. 'N2O') THEN ISTAT = PROF_PVAR(IHDLOUT,DLBUFF,V3D_N2O) + istat END IF END IF END DO ENDIF endif if(istat == 0) then ISTAT = PROF_PVAR(IHDLOUT,nsim3d,PRM_EVNT) C The size of the second dimension of the 3D vectors being different of C the size of the 2D vectors... 2D vars need to be stored in a different C record DEALLOCATE(DLBUFF) call tmg_start(81,'PROF_R+W') istat = prof_wrrec(ihdlout) call tmg_stop(81) else ISTAT = PROF_PVAR(IHDLOUT,evn_ferr,PRM_EVNT) ISTAT = PROF_CLOSE(IHDLOUT) call abort3d(nulout,'PUTDX2') endif * * 2D fields * ALLOCATE(DLBUFF2D(NI*NJ),stat=istat) ! IF(NGEXIST(NGPS).EQ.1) THEN DLBUFF2D(:) = 0. ICOUNT = 0 DO JLAT = 1, NJ DO JLON = 1, NI ICOUNT = ICOUNT + 1 DLBUFF2D(ICOUNT) = GPS0(JLON,1,JLAT) END DO END DO ISTAT = PROF_PVAR(IHDLOUT,DLBUFF2D,V2D_PSUR) + istat END IF * IF(NGEXIST(NGTG).EQ.1) THEN DLBUFF2D(:) = 0. ICOUNT = 0 DO JLAT = 1, NJ DO JLON = 1, NI ICOUNT = ICOUNT + 1 DLBUFF2D(ICOUNT) = GTG0(JLON,1,JLAT) END DO END DO write(nulout,*)'!!!WRITING TG!!!' ISTAT = PROF_PVAR(IHDLOUT,DLBUFF2D,V2D_TGRN) + istat END IF * if(istat == 0) then ISTAT = PROF_PVAR(IHDLOUT,nsim3d,PRM_EVNT) * * The size of the second dimension of the 3D vectors being different of C the size of the 2D vectors... 2D vars need to be stored in a different C record DEALLOCATE(DLBUFF2D) call tmg_start(81,'PROF_R+W') istat = prof_wrrec(ihdlout) call tmg_stop(81) ISTAT = PROF_CLOSE(IHDLOUT) clprof = trim(CEXC4DV) // '/evnt.prof' if(CDTLMADJ.eq.'P') THEN WRITE(NULOUT,*)'PUTDX2 - SENDING EVN_TLMO SIGNAL :',EVN_TLMO IHDLOUT = PROF_OPEN(clprof,'WRITE','FILE') ISTAT = PROF_PVAR(IHDLOUT,EVN_TLMO,PRM_EVNT) elseif(CDTLMADJ.eq.'F') THEN WRITE(NULOUT,*)'PUTDX2 - SENDING EVN_TLMX SIGNAL :',EVN_TLMX IHDLOUT = PROF_OPEN(clprof,'WRITE','FILE') ISTAT = PROF_PVAR(IHDLOUT,EVN_TLMX,PRM_EVNT) elseif(CDTLMADJ.eq.'N') THEN WRITE(NULOUT,*)'PUTDX2 - SENDING EVN_NLMX SIGNAL :',EVN_NLMX IHDLOUT = PROF_OPEN(clprof,'WRITE','FILE') ISTAT = PROF_PVAR(IHDLOUT,EVN_NLMX,PRM_EVNT) elseif(CDTLMADJ.eq.'A') THEN WRITE(NULOUT,*)'PUTDX2 - SENDING EVN_ADJX SIGNAL :',EVN_ADJX IHDLOUT = PROF_OPEN(clprof,'WRITE','FILE') ISTAT = PROF_PVAR(IHDLOUT,EVN_ADJX,PRM_EVNT) elseif(CDTLMADJ.eq.'E') THEN WRITE(NULOUT,*)'PUTDX2 - SENDING EVN_TLME SIGNAL :',EVN_TLME IHDLOUT = PROF_OPEN(clprof,'WRITE','FILE') ISTAT = PROF_PVAR(IHDLOUT,EVN_TLME,PRM_EVNT) endif call tmg_start(81,'PROF_R+W') istat = prof_wrrec(ihdlout) call tmg_stop(81) ISTAT = PROF_CLOSE(IHDLOUT) else ISTAT = PROF_PVAR(IHDLOUT,evn_ferr,PRM_EVNT) call tmg_start(81,'PROF_R+W') istat = prof_wrrec(ihdlout) call tmg_stop(81) ISTAT = PROF_CLOSE(IHDLOUT) clprof = trim(CEXC4DV) // '/evnt.prof' WRITE(NULOUT,*)'PUTDX2 - SENDING EVN_FERR SIGNAL :',EVN_FERR IHDLOUT = PROF_OPEN(clprof,'WRITE','FILE') ISTAT = PROF_PVAR(IHDLOUT,EVN_FERR,PRM_EVNT) call tmg_start(81,'PROF_R+W') istat = prof_wrrec(ihdlout) ISTAT = PROF_CLOSE(IHDLOUT) call tmg_stop(81) call abort3d(nulout,'PUTDX2') endif END SUBROUTINE PUTDX2