!-------------------------------------- LICENCE BEGIN ------------------------------------
!Environment Canada - Atmospheric Science and Technology License/Disclaimer,
! version 3; Last Modified: May 7, 2008.
!This is free but copyrighted software; you can use/redistribute/modify it under the terms
!of the Environment Canada - Atmospheric Science and Technology License/Disclaimer
!version 3 or (at your option) any later version that should be found at:
!http://collaboration.cmc.ec.gc.ca/science/rpn.comm/license.html
!
!This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
!without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
!See the above mentioned License/Disclaimer for more details.
!You should have received a copy of the License/Disclaimer along with this software;
!if not, you can write to: EC-RPN COMM Group, 2121 TransCanada, suite 500, Dorval (Quebec),
!CANADA, H9P 1J3; or send e-mail to service.rpn@ec.gc.ca
!-------------------------------------- LICENCE END --------------------------------------
!
SUBROUTINE TESTSP(KULOUT) 1,71
#if defined (DOC)
*
***s/r TESTSP - Test of the exactness of the spectral transform
*
*
*Author : P. Gauthier *ARMA/AES June 9, 1992
*Revision:
* . L. Fillion *RPN/AES Feb 93 - Test of BILIN and BILINAD
* . P. Gauthier *ARMA/AES May 25,1993: - Treatment of specific humidity
* . and surface pressure
* . - Analytical test for a single wave
* removed.
* . L. Fillion *RPN/AES Aug 93
* . - Test of sef-adjointness of LINBAL
* . L. Fillion *ARMA/AES Sep 94
* . - Test of the adjoint of the transformed operator
* . - Test of the adjoint of the inverse transformed
* operator
* . S. Pellerin *ARMA/AES Sept 97.
* - Change from TT to GZ state variables.
* . S. Pellerin *ARMA/SMC May 2000
* - Fix for F90 conversion
* -------------------
** Purpose: verification of the spectral transform
* .
*
*Arguments
* KULOUT: logical unit for printing
#endif
IMPLICIT NONE
*implicits
#include "comdim.cdk"
#include "comlun.cdk"
#include "com2ini.cdk"
#include "comsp.cdk"
#include "comsp1.cdk"
*
C
INTEGER KULOUT
C
LOGICAL LLFPLAN
INTEGER ILEN, IERR, JI, JLEV, JK
REAL*8 ZTRANS(NLA,2,NFLEV), ZX(NLA,2,NKSDIM)
POINTER (PXTRANS,ZTRANS), (PXX,ZX)
C
ILEN = NLA*2*NFLEV
CALL HPALLOC(PXTRANS,MAX(ILEN,1),IERR,8)
ILEN = NLA*2*NKSDIM
CALL HPALLOC(PXX,MAX(ILEN,1),IERR,8)
C
WRITE(NULOUT,FMT=9000)
9000 FORMAT(//,' -Testing the spectral transforms and their adjoints')
C
SINVOR = 1.
SINDIV = 1.
SINGZ = 1.
SINQ = 1.
SINPS = 1.
GINUU = 1.
GINGZ = 1.
GINQ = 1.
GINPS = 1.
C
C
C* 1. Spectral transform * Inverse spectral transform
C . -----------------------------------------------
100 CONTINUE
C
WRITE(KULOUT,FMT='(/,8X,''Test No. 1: GDSP * SPGD'')')
CALL INITRND
('S',KULOUT)
CALL SPGD
CALL TRANSFER
('GD01')
CALL DOTEUCL
('G',KULOUT)
CALL GDSP
CALL SPGD
CALL DOTEUCL
('G',KULOUT)
C
C* 2. Inverse spectral transform * Spectral transform
C . -----------------------------------------------
200 CONTINUE
C
WRITE(KULOUT,FMT='(/,8X,''Test No.2 : SPGD * GDSP'')')
WRITE(KULOUT,FMT='(8X,''Results for GZ should be the '',
S ''same as in Test No.1'')')
C
CALL TRANSFER
('SP01')
CALL DOTEUCL
('S',KULOUT)
CALL SPGD
CALL GDSP
CALL DOTEUCL
('S',KULOUT)
C
C* 3. Adjoint of the spectral transform
C . ---------------------------------
300 CONTINUE
C
WRITE(KULOUT,FMT='(/,8X,''Test No.3: Adjoint of GDSP'')')
C
CALL INITRND
('S',KULOUT)
CALL SPGD
CALL TRANSFER
('GD01')
CALL GDSP
CALL TRANSFER
('SP01')
CALL INITRND
('S',KULOUT)
CALL DOTEUCL
('S',KULOUT)
CALL GDSPA
CALL DOTEUCL
('G',KULOUT)
C
C* 4. Adjoint of the inverse spectral transform
C . -----------------------------------------
400 CONTINUE
C
WRITE(KULOUT,FMT='(/,8X,''Test No.4: Adjoint of SPGD'')')
C
CALL INITRND
('S',KULOUT)
CALL SPGD
CALL TRANSFER
('GD01')
CALL INITRND
('S',KULOUT)
CALL TRANSFER
('SP01')
C
CALL SPGD
CALL DOTEUCL
('G',KULOUT)
CALL TRANSFER
('GD10')
CALL SPGDA
CALL DOTEUCL
('S',KULOUT)
C
C* 6. Test of BILIN and BILINAD
C . -------------------------
600 CONTINUE
C
WRITE(NULOUT,FMT='(//,4X,"TEST. NO.6: BILIN: BILINAD")')
C
IF(NJSUR.GE.2.AND.NISUR.GE.2)THEN
GINUU = 10.
GINGZ = 10.
GINQ = 1.
GINPS = 1.
C
CALL INITRND
('G',KULOUT)
CALL TRANSFER
('GD01')
CALL BILIN
CALL TRANSFER
('OB01')
CALL INITRND
('M',KULOUT)
CALL DOTEUCL
('M',KULOUT)
CALL TRANSFER
('ZGD0')
CALL BILINAD
CALL DOTEUCL
('G',KULOUT)
ELSE
WRITE(NULOUT,FMT=9600)
END IF
9600 FORMAT(4X,"NOT DONE. OVERDIMENSIONING IS LACKING")
C
C* 7. Adjoint of the linear balance operator
C . --------------------------------------
700 CONTINUE
C
WRITE(KULOUT,FMT='(/,8X,''Test No.7: Adjoint of LINBAL'')')
WRITE(KULOUT,FMT='(/,8X,''*****************************'')')
WRITE(KULOUT,FMT='(/,8X,''Incremental configuration'')')
WRITE(KULOUT,FMT='(/,8X,''Adjoint check for NVMOD modes'')')
WRITE(KULOUT,FMT='(/,8X,''*****************************'')')
C
LLFPLAN = .FALSE.
IF(LLFPLAN) THEN
WRITE(KULOUT,FMT='(/,8X,''F-PLANE TEST'')')
ELSE
WRITE(KULOUT,FMT='(/,8X,''VARIABLE CORIOLIS PARAMETER TEST'')')
ENDIF
CALL INITRND
('S',KULOUT)
C
C ENSURE ZERO (0,0) SPECTRAL COMPONENT FOR INCREMENT ON VORTICITY
C
DO 710 JLEV = 1, NFLEV
SPVOR(1,1,JLEV) = 0.0
SPVOR(1,2,JLEV) = 0.0
710 CONTINUE
C
CALL TRANSFER
('SP01')
DO 730 JLEV = 1, NFLEV
DO 720 JI = 1, NLA
ZTRANS(JI,1,JLEV) = SPVOR(JI,1,JLEV)
ZTRANS(JI,2,JLEV) = SPVOR(JI,2,JLEV)
720 CONTINUE
730 CONTINUE
CALL LINBAL
(+1,LLFPLAN)
CALL TRANSFER
('SP01')
CALL INITRND
('S',KULOUT)
C
C ENSURE ZERO (0,0) SPECTRAL COMPONENT FOR INCREMENT ON TEMPERATURE
C
DO 740 JLEV = 1, NFLEV
SPGZ(1,1,JLEV) = 0.0
SPGZ(1,2,JLEV) = 0.0
740 CONTINUE
C
WRITE(KULOUT,FMT='(/,8X,''FIRST PRODUCT, RESULT IN GZ'')')
CALL DOTEUCL
('S',KULOUT)
C
CALL TRANSFER
('SP01')
CALL LINBAL
(-1,LLFPLAN)
DO 760 JLEV = 1, NFLEV
DO 750 JI = 1, NLA
SPVOR1(JI,1,JLEV) = ZTRANS(JI,1,JLEV)
SPVOR1(JI,2,JLEV) = ZTRANS(JI,2,JLEV)
750 CONTINUE
760 CONTINUE
WRITE(KULOUT,FMT='(/,8X,''SECOND PRODUCT, RESULT IN VORT'')')
CALL DOTEUCL
('S',KULOUT)
C
CALL HPDEALLC(PXTRANS,IERR,1)
IF(IERR.NE.0)THEN
CALL ABORT3D
(NULOUT,'TESTSP Problem with ZTRANS.')
END IF
C
C* 8. Adjoint of the transformed operator
C . -----------------------------------
800 CONTINUE
C
WRITE(KULOUT,FMT='(/,8X,''Test No.8: Adjoint of PROJ'')')
WRITE(KULOUT,FMT='(/,8X,''*****************************'')')
WRITE(KULOUT,FMT='(/,8X,''Adjoint check for NVMOD modes'')')
WRITE(KULOUT,FMT='(/,8X,''*****************************'')')
C
CALL INITRND
('S',KULOUT)
C
C ENSURE ZERO (0,0) SPECTRAL COMPONENT FOR INCREMENT ON VORTICITY
C
DO 805 JLEV = 1, NFLEV
SPVOR(1,1,JLEV) = 0.0
SPVOR(1,2,JLEV) = 0.0
805 CONTINUE
DO 820 JK = 1, NKSDIM
DO 810 JI = 1, NLA
ZX(JI,1,JK) = SP(JI,1,JK)
ZX(JI,2,JK) = SP(JI,2,JK)
810 CONTINUE
820 CONTINUE
CALL PROJ
(.TRUE.)
CALL TRANSFER
('SP01')
CALL INITRND
('S',KULOUT)
C
C ENSURE ZERO (0,0) SPECTRAL COMPONENT FOR INCREMENT ON TEMPERATURE
C
DO 825 JLEV = 1, NFLEV
SPGZ(1,1,JLEV) = 0.0
SPGZ(1,2,JLEV) = 0.0
825 CONTINUE
CALL DOTEUCL
('S',KULOUT)
C
CALL PROJA
(.TRUE.)
DO 840 JK = 1, NKSDIM
DO 830 JI = 1, NLA
SPVOR1(JI,1,JK) = ZX(JI,1,JK)
SPVOR1(JI,2,JK) = ZX(JI,2,JK)
830 CONTINUE
840 CONTINUE
CALL DOTEUCL
('S',KULOUT)
C
C* 9. Adjoint of the inverse transformed operator
C . -------------------------------------------
900 CONTINUE
C
WRITE(KULOUT,FMT='(/,8X,''Test No.9: Adjoint of PROJI'')')
WRITE(KULOUT,FMT='(/,8X,''*****************************'')')
WRITE(KULOUT,FMT='(/,8X,''Adjoint check for NVMOD modes'')')
WRITE(KULOUT,FMT='(/,8X,''*****************************'')')
C
C TEST OF THE INVERSE OF PROJ
C
CALL INITRND
('S',KULOUT)
C
C ENSURE ZERO (0,0) SPECTRAL COMPONENT FOR INCREMENT ON VORTICITY
C
DO 905 JLEV = 1, NFLEV
SPVOR(1,1,JLEV) = 0.0
SPVOR(1,2,JLEV) = 0.0
905 CONTINUE
DO 920 JK = 1, NKSDIM
DO 910 JI = 1, NLA
ZX(JI,1,JK) = SP(JI,1,JK)
ZX(JI,2,JK) = SP(JI,2,JK)
910 CONTINUE
920 CONTINUE
CALL TRANSFER
('SP01')
DO 940 JK = 1, NKSDIM
DO 930 JI = 1, NLA
SP(JI,1,JK) = ZX(JI,1,JK)
SP(JI,2,JK) = ZX(JI,2,JK)
930 CONTINUE
940 CONTINUE
WRITE(KULOUT,FMT='(/,8X,''<X,X>'')')
CALL DOTEUCL
('S',KULOUT)
C
CALL PROJ
(.TRUE.)
CALL PROJI
(.TRUE.)
CALL TRANSFER
('SP01')
DO 960 JK = 1, NKSDIM
DO 950 JI = 1, NLA
SP(JI,1,JK) = ZX(JI,1,JK)
SP(JI,2,JK) = ZX(JI,2,JK)
950 CONTINUE
960 CONTINUE
WRITE(KULOUT,FMT='(/,8X,''<X,P-1PX>'')')
CALL DOTEUCL
('S',KULOUT)
C
C TEST OF THE AJOINT OF THE INVERSE PROJECTION
C
CALL PROJI
(.TRUE.)
CALL TRANSFER
('SP01')
DO 970 JK = 1, NKSDIM
DO 965 JI = 1, NLA
SP(JI,1,JK) = ZX(JI,1,JK)
SP(JI,2,JK) = ZX(JI,2,JK)
965 CONTINUE
970 CONTINUE
WRITE(KULOUT,FMT='(/,8X,''<X,P-1X>'')')
CALL DOTEUCL
('S',KULOUT)
C
CALL PROJIA
(.TRUE.)
CALL TRANSFER
('SP01')
DO 980 JK = 1, NKSDIM
DO 975 JI = 1, NLA
SP(JI,1,JK) = ZX(JI,1,JK)
SP(JI,2,JK) = ZX(JI,2,JK)
975 CONTINUE
980 CONTINUE
WRITE(KULOUT,FMT='(/,8X,''<P-1TX,X>'')')
CALL DOTEUCL
('S',KULOUT)
C
CALL HPDEALLC(PXX,IERR,1)
IF(IERR.NE.0)THEN
CALL ABORT3D
(NULOUT,'TESTSP Problem with ZX.')
END IF
C
C
RETURN
END