C -------------------------------------------------------------
C CHECKDESIGN cheks design.dll or design.m
C Developed by A.Rossi, C.Planas and G.Fiorentini
C
C State-space format: y(t) = c(t)z(t) + H(t)x(t) + G(t)u(t)
C x(t) = a(t) + F(t)x(t-1) + R(t)u(t)
C
C y(t) (ny x 1) ny = # of endogenous series
C z(t) (nz x 1) nz = # of exogenous series
C x(t) (nx x 1) nx = # of continous states
C u(t) (nu x 1) nu = # of shocks
C c(t) (ny x nz x ns1) ns1 = # of states for c(t)
C H(t) (ny x nx x ns2) ns2 = # of states for H(t)
C G(t) (ny x nu x ns3) ns3 = # of states for G(t)
C a(t) (nx x ns4) ns4 = # of states for a(t)
C F(t) (nx x nx x ns5) ns5 = # of states for F(t)
C R(t) (nx x nu x ns6) ns6 = # of states for R(t)
C
C Copyright (C) 2010-2014 European Commission
C
C This file is part of Program DMM
C
C DMM is free software developed at the Joint Research Centre of the
C European Commission: you can redistribute it and/or modify it under
C the terms of the GNU General Public License as published by
C the Free Software Foundation, either version 3 of the License, or
C (at your option) any later version.
C
C DMM is distributed in the hope that it will be useful,
C but WITHOUT ANY WARRANTY; without even the implied warranty of
C MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
C GNU General Public License for more details.
C
C You should have received a copy of the GNU General Public License
C along with DMM. If not, see .
C -------------------------------------------------------------
SUBROUTINE CHECKDESIGN(ny,nz,nx,nu,ns,nt,d,theta,pdll,PATH,NMLNAME)
USE dfwin
INTERFACE
SUBROUTINE DESIGN(ny,nz,nx,nu,ns,nt,theta,c,H,G,a,F,R)
INTEGER ny,nz,nx,nu,ns(6),nt
DOUBLE PRECISION theta(nt)
DOUBLE PRECISION c(ny,max(1,nz),ns(1)),H(ny,nx,ns(2)),
1 G(ny,nu,ns(3)),a(nx,ns(4)),F(nx,nx,ns(5)),R(nx,nu,ns(6))
END SUBROUTINE
END INTERFACE
POINTER (pdll,fittizia) ! ASSOCIATE pointer pdll alla DLL ad una varibile fittizia
POINTER (pdesign,DESIGN)
C INPUT
INTEGER ny,nz,nx,nu,ns(6),nt,d(2)
DOUBLE PRECISION theta(nt)
CHARACTER*200 NMLNAME,PATH,FILEOUT
C LOCALS
INTEGER I,J,maxnz,IFAIL,ESTABLE
DOUBLE PRECISION WORK(4*nx),WR(nx),WI(nx),VR(1),
1 VI(1),W(nx) !WRY(ny),WORK1(64*ny)
DOUBLE PRECISION,ALLOCATABLE::c(:,:,:),H(:,:,:),
1 G(:,:,:),a(:,:),F(:,:,:),R(:,:,:) !,HRG(:,:),HRGRH(:,:)
CHARACTER*3 CJ
C EXTERNAL SUBROUTINES
EXTERNAL DGEEV
ALLOCATE(c(ny,max(nz,1),ns(1)),H(ny,nx,ns(2)),
1 G(ny,nu,ns(3)),a(nx,ns(4)),F(nx,nx,ns(5)),R(nx,nu,ns(6))) !,HRG(ny,nu),HRGRH(ny,ny))
pdesign = getprocaddress(pdll, "design_"C)
CALL DESIGN(ny,nz,nx,nu,ns,nt,theta,c,H,G,a,F,R)
maxnz = max(1,nz)
FILEOUT = TRIM(PATH)//TRIM(NMLNAME)//'.CHK'
OPEN(11,FILE = FILEOUT, ACCESS='SEQUENTIAL')
C write ny,nx,etc
WRITE(11,1000) nt,ny,nx,nu,nz
1000 FORMAT(' nt = ',I3,'; ny = ',I3,'; nx = ',I3,'; nu = ',I3,
# '; nz = ',I3,';')
C write theta
WRITE(11,*) 'theta(1:nt) = ['
WRITE(11,*) ' '
WRITE(11,'((F20.10))') theta(1:nt)
WRITE(11,*) ']'
C write c(ny,max(1,nz),ns(1))
DO J = 1,ns(1)
WRITE(11,*) ' '
IF (J.LE.9) THEN
WRITE(CJ,'(I1)') J
ELSEIF ((J.GE.10).AND.(J.LE.99)) THEN
WRITE(CJ,'(I2)') J
ELSEIF ((J.GE.100).AND.(J.LE.999)) THEN
WRITE(CJ,'(I3)') J
ENDIF
WRITE(11,*) 'c(1:ny,1:nz,'//TRIM(CJ)// ') = ['
WRITE(11,*) ' '
WRITE(11,'((F20.10))') (c(I,1:maxnz,J),I=1,ny)
WRITE(11,*) ']'
ENDDO
C write H(ny,nx,ns(2))
DO J = 1,ns(2)
WRITE(11,*) ' '
IF (J.LE.9) THEN
WRITE(CJ,'(I1)') J
ELSEIF ((J.GE.10).AND.(J.LE.99)) THEN
WRITE(CJ,'(I2)') J
ELSEIF ((J.GE.100).AND.(J.LE.999)) THEN
WRITE(CJ,'(I3)') J
ENDIF
WRITE(11,*) 'H(1:ny,1:nx,'//TRIM(CJ)// ') = ['
WRITE(11,*) ' '
WRITE(11,'((F20.10))') (H(I,1:nx,J),I=1,ny)
WRITE(11,*) ']'
ENDDO
C write G(ny,nu,ns(3))
DO J = 1,ns(3)
WRITE(11,*) ' '
IF (J.LE.9) THEN
WRITE(CJ,'(I1)') J
ELSEIF ((J.GE.10).AND.(J.LE.99)) THEN
WRITE(CJ,'(I2)') J
ELSEIF ((J.GE.100).AND.(J.LE.999)) THEN
WRITE(CJ,'(I3)') J
ENDIF
WRITE(11,*) 'G(1:ny,1:nu,'//TRIM(CJ)// ') = ['
WRITE(11,*) ' '
WRITE(11,'((F20.10))') (G(I,1:nu,J),I=1,ny)
WRITE(11,*) ']'
ENDDO
C write a(nx,ns(4))
DO J = 1,ns(4)
WRITE(11,*) ' '
IF (J.LE.9) THEN
WRITE(CJ,'(I1)') J
ELSEIF ((J.GE.10).AND.(J.LE.99)) THEN
WRITE(CJ,'(I2)') J
ELSEIF ((J.GE.100).AND.(J.LE.999)) THEN
WRITE(CJ,'(I3)') J
ENDIF
WRITE(11,*) 'a(1:nx,'//TRIM(CJ)// ') = ['
WRITE(11,*) ' '
WRITE(11,'(<1>(F20.10))') (a(I,J),I=1,nx)
WRITE(11,*) ']'
ENDDO
C write F(nx,nx,ns(5))
DO J = 1,ns(5)
WRITE(11,*) ' '
IF (J.LE.9) THEN
WRITE(CJ,'(I1)') J
ELSEIF ((J.GE.10).AND.(J.LE.99)) THEN
WRITE(CJ,'(I2)') J
ELSEIF ((J.GE.100).AND.(J.LE.999)) THEN
WRITE(CJ,'(I3)') J
ENDIF
WRITE(11,*) 'F(1:nx,1:nx,'//TRIM(CJ)// ') = ['
WRITE(11,*) ' '
WRITE(11,'((F20.10))') (F(I,1:nx,J),I=1,nx)
WRITE(11,*) ']'
ENDDO
C write R(nx,nu,ns(6))
DO J = 1,ns(6)
WRITE(11,*) ' '
IF (J.LE.9) THEN
WRITE(CJ,'(I1)') J
ELSEIF ((J.GE.10).AND.(J.LE.99)) THEN
WRITE(CJ,'(I2)') J
ELSEIF ((J.GE.100).AND.(J.LE.999)) THEN
WRITE(CJ,'(I3)') J
ENDIF
WRITE(11,*) 'R(1:nx,1:nu,'//TRIM(CJ)// ') = ['
WRITE(11,*) ' '
WRITE(11,'((F20.10))') (R(I,1:nu,J),I=1,nx)
WRITE(11,*) ']'
ENDDO
C Check unstable eigenvalues of F
DO J = 1,ns(5)
IF (d(2).GT.0) THEN
IFAIL=-1
C CALL F02EBF('N',d(2),F(1:d(2),1:d(2),J),d(2),
C 1 WR(1:d(2)),WI(1:d(2)),VR,1,VI,1,WORK,4*nx,IFAIL)
CALL DGEEV('N','N',d(2),F(1:d(2),1:d(2),J),d(2),
1 WR(1:d(2)),WI(1:d(2)),VR,1,VI,1,WORK,4*nx,IFAIL)
ESTABLE = 0
DO I = 1,d(2)
W(I) = WR(I)**2+WI(I)**2
ESTABLE = ESTABLE + ABS(W(I).GE.1.D0)
ENDDO
IF (ESTABLE.NE.d(2)) THEN
WRITE(11,*) ' '
WRITE(11,*) 'WARNING: the number of unstable eigenvalues for '
WRITE(11,*) 'F(1:nx,1:nx,'//TRIM(CJ)// 'is not equal to d(2) '
WRITE(11,*) 'or non-stationary states are not placed in the'
WRITE(11,*) 'first d(2) positions.'
ENDIF
ENDIF
C Check stable eigenvalues of F
IF (nx-d(2).GT.0) THEN
IFAIL=-1
c CALL F02EBF('N',nx-d(2),F(d(2)+1:nx,d(2)+1:nx,J),
c 1 nx-d(2),WR,WI,VR,1,VI,1,WORK,4*nx,IFAIL)
CALL DGEEV('N','N',nx-d(2),F(d(2)+1:nx,d(2)+1:nx,J),
# nx-d(2),WR,WI,VR,1,VI,1,WORK,4*nx,IFAIL)
ESTABLE = 0
DO I = 1,nx-d(2)
W(I) = WR(I)**2+WI(I)**2
ESTABLE = ESTABLE + ABS(W(I).LT.1.D0)
ENDDO
IF (ESTABLE.NE.(nx-d(2))) THEN
WRITE(11,*) ' '
WRITE(11,*) 'WARNING: the number of stable eigenvalues for '
WRITE(11,*) 'F(1:nx,1:nx,'//TRIM(CJ)//'is not equal to nx-d(2)'
WRITE(11,*) 'or non-stationary states are not placed in the '
WRITE(11,*) 'first d(2) positions.'
ENDIF
ENDIF
ENDDO
CLOSE(11)
DEALLOCATE(c,H,G,a,F,R)
RETURN
PAUSE
END
C Check rank{(HR+G)*(HR+G)'} this check is wrong!!!
c DO J = 1,ns(2) !H
c DO JJ = 1,ns(3) !G
c DO JJJ = 1,ns(6) !R
c DO I =1,ny
c DO K =1,nu
c HRG(I,K) = SUM(H(I,1:nx,J)*R(1:nx,K,JJJ))+G(I,K,JJ)
c ENDDO
c ENDDO
c DO I =1,ny
c DO K =1,ny
c HRGRH(I,K) = SUM(HRG(I,1:nu)*HRG(K,1:nu))
c ENDDO
c ENDDO
c IFAIL = -1
c CALL F02FAF('N','U',ny,HRGRH,ny,WRY(1:ny),WORK1,64*ny,IFAIL)
c SRANK = 0
c DO 10 I=1,ny
c10 IF (WRY(I).GT.1.D-12) SRANK=SRANK+1
c IF (SRANK.LT.ny) THEN
c WRITE(11,*) ' '
c WRITE(11,*) 'WARNING: the rank of the system computed looking '
c WRITE(11,*) 'at rank{(HR+G)*transpose(HR+G)} is less than ny '
c ENDIF
c ENDDO
c ENDDO
c ENDDO