Files
GEOS-Chem-adjoint-v35-note/code/obs_operators/gvchsq.f
2018-08-28 00:40:44 -04:00

123 lines
4.8 KiB
Fortran

SUBROUTINE GVCHSQ ( DEGFRE, LEVEL, CHISQR, FAIL, ERRMSG )
C
C VERSION
C 08-MAY-90 AD Correct Error Message for wrong LEVEL
C More rigorous checks for LEVEL close to nominal values
C 02-AUG-89 RJW Remove unused variable
C 29-JAN-89 CJM 1st delivery
C
C DESCRIPTION
C Returns the value of chi-squared at DEGFRE degrees of freedom
C and at the LEVEL (%) confidence level.
C Uses table from "Statistical and Computational methods in data
C analysis" by Brandt (North Holland Pub. Corp.): for DEGFRE < 31
C the table is looked up directly, for 30 < DEGFRE < 101 the
C results are interpolated from the table, and for DEGFRE >100 we
C use the result on P58 of "Statistics for Physicists" by Martin
C (Academic Press).
C
IMPLICIT NONE
C
C ARGUMENTS
INTEGER DEGFRE ! I Number of degrees of freedom
REAL*4 LEVEL ! I %level of test
! (only 90.0,95.0,99.0,99.5,99.9)
REAL*4 CHISQR ! O chi-squared(DEGFREE,LEVEL)
LOGICAL FAIL ! O Routine Error flag
CHARACTER*80 ERRMSG ! O Error message
C
C LOCAL CONSTANTS
REAL*4 DIFMIN ! Tolerance allowed between LEVEL and list
PARAMETER (DIFMIN = 0.00001) ! list of nominal values
C
C LOCAL VARIABLES
INTEGER LVINDX ! Index set 1,2,3 if LEVEL is 90,95 or 99
INTEGER I1 ! Index of C for interpolation
REAL*4 ALPHA ! Interpolation coefficient
C
C DATA STATEMENTS
REAL*4 C(37,5) ! Table of Chi-squared as a function of the
! degrees of freedom and % levels
! 90.0, 95.0, 99.0, 99.5, 99.9
! The 37 degrees of freedom are 1,2,3...30,40,50..100
! From table F5 of Brandt
DATA C/2.71, 4.61, 6.25, 7.78, 9.24,10.64,12.02,13.36,14.68,
& 15.99,17.27,18.55,19.81,21.06,22.31,23.54,24.77,25.99,27.20,
& 28.41,29.61,30.81,32.01,33.20,34.38,35.56,36.74,37.92,39.09,
& 40.26,51.80,63.17,74.40,85.53,96.58, 107.56, 118.50,
& 3.84, 5.99, 7.81, 9.49,11.07,12.59,14.07,15.51,16.92,18.31,
& 19.68,21.03,22.36,23.68,25.00,26.30,27.59,28.87,30.14,31.41,
& 32.67,33.92,35.17,36.42,37.65,38.89,40.11,41.34,42.56,43.77,
& 55.76,67.51,79.08,90.53, 101.88, 113.15, 124.34,
& 6.63, 9.21,11.34,13.28,15.09,16.81,18.48,20.09,21.67,23.21,
& 24.72,26.22,27.69,29.14,30.58,32.00,33.41,34.81,36.19,37.57,
& 38.93,40.29,41.64,42.98,44.31,45.64,46.96,48.28,49.59,50.89,
& 63.70,76.16,88.38, 100.43, 112.33, 124.12, 135.81,
& 7.88,10.60,12.84,14.86,16.75,18.55,20.28,21.95,23.59,25.19,
& 26.76,28.30,29.82,31.32,32.80,34.27,35.72,37.16,38.58,40.00,
& 41.40,42.80,44.18,45.56,46.93,48.29,49.64,50.99,52.34,53.67,
& 66.76,79.49,91.95, 104.21, 116.32, 128.30, 140.17,
& 10.83,13.82,16.27,18.47,20.51,22.46,24.32,26.12,27.88,29.59,
& 31.26,32.91,34.53,36.12,37.70,39.25,40.79,42.31,43.82,45.31,
& 46.80,48.27,49.73,51.18,52.62,54.05,55.48,56.89,58.30,59.70,
& 73.39, 86.66,99.61, 112.32, 124.84, 137.21, 149.45 /
SAVE C
C
REAL*4 G(5) ! Values X of Normalised Gaussian variable x such
! that the probability of x<X is equal to
! 90.0, 95.0, 99.0, 99.5, 99.9%.
! From table F-3a of Brandt.
DATA G / 1.282, 1.645, 2.327, 2.576, 3.090 /
SAVE G
C
C- EXECUTABLE CODE -----------------------------------------------------------
C
IF ( ABS (LEVEL - 90.0) .LT. DIFMIN ) THEN
LVINDX = 1
ELSE IF ( ABS (LEVEL - 95.0) .LT. DIFMIN ) THEN
LVINDX = 2
ELSE IF ( ABS (LEVEL - 99.0) .LT. DIFMIN ) THEN
LVINDX = 3
ELSE IF ( ABS (LEVEL - 99.5) .LT. DIFMIN ) THEN
LVINDX = 4
ELSE IF ( ABS (LEVEL - 99.9) .LT. DIFMIN ) THEN
LVINDX = 5
ELSE
WRITE ( ERRMSG, '(A,E11.3)' )
& 'F-GVCHSQ: % level not in list. Value is ', LEVEL
FAIL = .TRUE.
RETURN
END IF
C
IF ( DEGFRE .LE. 0 ) THEN
WRITE ( ERRMSG, '(A,I11)' )
&'F-GVCHSQ: degrees of freedom wrongly supplied. Value is ', DEGFRE
FAIL=.TRUE.
RETURN
ELSE IF ( DEGFRE .LE. 30 ) THEN ! Read table directly
CHISQR = C(DEGFRE,LVINDX)
ELSE IF ( DEGFRE .LE. 100 ) THEN ! Interpolate
I1 = 27 + DEGFRE/10
ALPHA = 0.1*MOD(DEGFRE,10)
CHISQR = (1.-ALPHA)*C(I1,LVINDX) + ALPHA*C(I1+1,LVINDX)
ELSE ! Use Martin's result
CHISQR = 0.5*(G(LVINDX)+SQRT(2*DEGFRE-1.0))**2
END IF
FAIL = .FALSE. ! Successful exit
PRINT*, 'INSIDE AT THE END OF GVCHSQ'
END