GNU WOCSS (gwocss)  2.2.4-pre
GNU version of Winds On Critical Streamline Surfaces (WOCSS)
invwt.f
Go to the documentation of this file.
1 C*********************************************************************
2  SUBROUTINE rinvmod(TRPVAL,X0,Y0,XX,YY,NOBS,VARBL)
3 C*********************************************************************
4 C
5 C
6 C MODIFIED INVERSE DISTANCE INTERPOLATION; USES ONLY NEARBY
7 C OBSERVATIONS. THE WEIGHTING FUNCTION IS WNDWT (X0,Y0,X1,Y1).
8 C INTERPOLATES TO THE POINT X0,Y0 FROM VALUES OF THE VARIABLE (VARBL)
9 C AT POINTS XX, YY. IF A SINGLE OBSERVED VALUE IS WITHIN THE MINIMUM
10 C DISTANCE SPECIFIED IN WNDWT, IT IS USED. ASSUMES THAT GRID UNITS
11 C ARE USED.
12 C
13 C FLUDWIG, 5/2002
14 C
15  include 'NGRIDS.PAR'
16 C
17  include 'LIMITS.CMM'
18 C
19  parameter(npts=26)
20 C
21  REAL VARBL(nsites),XX(nsites),YY(nsites)
22 C
23  d2min=0.1
24 C
25 C IF ONLY ONE OBS, USE THAT VALUE EVERYWHERE.
26 C
27  IF (nobs.EQ.1) THEN
28  trpval=varbl(1)
29  RETURN
30  ELSE IF (nobs.EQ.0) THEN
31  WRITE (*,*) 'SOMETHING WRONG -- NOBS= ',nobs
32  stop
33  END IF
34 C
35 C CHECK FOR TOO MANY INPUT VALUES
36 C
37  IF (nobs.GT.nsites) THEN
38  WRITE (*,*) 'TOO MANY OBS IN RM2MOD; USING 1ST ',nsites
39  ntry=nsites
40  ELSE
41  ntry=nobs
42  END IF
43 C
44 C DEFINE EVER INCREASING RADIUS UNTIL ENOUGH OBS AVAILABLE FOR
45 C INTERPOLATION. MAXIMUM SET TO BE TWICW THE MAXIMUM RADIUS OF THE
46 C DOMAIN (RMAX). SEARCHED AREA INCREASES BY RSTEP UNTIL AT LEAST 2
47 C OBSERVATIONS FOUND. RSTEP IS 1/20 MAX NUMBER OF GRID UNITS.
48 C FIRST STEP IS A RADIUS OF SQRT(2) GRID UNITS. IF ANY VALUE FOUND
49 C THIS CLOSE, IT IS USED.
50 C
51  rmax=sqrt(float(nxgrd**2+nygrd**2))
52  rstep=rmax/20.0
53 C
54 C 3 CHOICES EXAMINED FOR RMIN:
55 C 1. RADIUS (0.5) OF CIRCLE TANGENT TO THE 4 SIDES OF A
56 C GRID SQUARE
57 C 2. RADIUS (0.707) OF CIRCLE THROUGH THE 4 CORNERS OF A
58 C GRID SQUARE
59 C 3. RADIUS (.604) MIDWAY BETWEEN 0.5 & SQRT(1/2)
60 C 4. IN SQUARE OF 0.5 UNIT SIDE WITH CORNER AT GRID SQUARE
61 C
62 C APPROACH 3 SEEMS TO GET MOST OF OBSERVATIONS, WHILE AVERAGING
63 C MORE THAN ONE OB ON FEWER OCCASIONS.
64 C
65  rmin=0.604
66 C
67  sum=0.0
68  sumwt=0.0
69  ncase=0
70  r2past=0.0
71  DO 200 nr=0,20
72  rad=rmin+float(nr)*rstep
73  r2test=rad**2
74  DO 150 iob=1,ntry
75  IF (nint(varbl(iob)).NE.-9999) THEN
76  r2=(x0-xx(iob))**2+(y0-yy(iob))**2
77 C
78 C IF OBSERVATION IS WITHIN A GRID SQUARE AROUND THIS POINT, USE IT.
79 C OTHERWISE, GET VALUES FOR INVERSE DISTANCE INTRPOLATION.
80 C
81  IF (nr.EQ.0 .AND. r2.LE.r2test) THEN
82 C
83  wt=wndwt(x0,y0,xx(iob),yy(iob))
84  sum=sum+wt*varbl(iob)
85  sumwt=sumwt+wt
86  ELSE IF (r2.LE.r2test .AND. r2.GT.r2past) THEN
87 C
88  wt=wndwt(x0,y0,xx(iob),yy(iob))
89  sum=sum+wt*varbl(iob)
90  sumwt=sumwt+wt
91  ncase=ncase+1
92  END IF
93  END IF
94 150 CONTINUE
95 C
96 C TE FOLLOWING USES NEARBY OBS WITH LITTLE OR NO INTERPOLATION.
97 C
98  IF (nr.EQ.0 .AND. sumwt .GT. 0.0) THEN
99  trpval=sum/sumwt
100  RETURN
101 C
102 C WHEN WE HAVE ACCUMULATED AT LEAST 15 PTS, STOP ADDING POINTS
103 C AND INTERPOLATE
104 C
105  ELSE IF (ncase .GE. 15) THEN
106 C
107  trpval=sum/sumwt
108  RETURN
109  END IF
110  r2past=r2test
111 200 CONTINUE
112 C
113 C WE NEVER GOT 15 PTS, SO WE USE THE INVERSE DISTANCE WEIGHTED
114 C ESTIMATE WITH WHAT WE HAVE.
115 C
116  IF (sumwt.GT.0.0) THEN
117  trpval=sum/sumwt
118  RETURN
119  ELSE
120  WRITE (*,*) 'SOMETHING WRONG -- NCASE= ', ncase
121  stop
122  END IF
123 C
124  END
125 C
126 C*********************************************************************
127  SUBROUTINE rinvmold(TRPVAL,X0,Y0,XX,YY,NOBS,VARBL)
128 C*********************************************************************
129 C
130 C INVERSE DISTANCE INTERPOLATION; USES ALL AVAILABLE
131 C OBSERVATIONS. THE WEIGHTING FUNCTION IS WNDWT (X0,Y0,X1,Y1).
132 C INTERPOLATES TO THE POINT X0,Y0 FROM VALUES OF THE VARIABLE (VARBL)
133 C AT POINTS XX, YY. IF A SINGLE OBSERVED VALUE IS WITHIN THE MINIMUM
134 C DISTANCE SPECIFIED IN WNDWT, THE FIELD AROUND THAT PT IS ADJUSTED
135 C ELSEWHERE TO MATCH THE VALUE AT THE PT.
136 C
137 C FLUDWIG, 7/2002
138 C
139  include 'NGRIDS.PAR'
140 C
141  include 'LIMITS.CMM'
142 C
143  parameter(npts=nsites)
144 C
145  REAL VARBL(nsites),XX(nsites),YY(nsites)
146 C
147 C IF ONLY ONE OBS, USE THAT VALUE EVERYWHERE.
148 C
149  IF (nobs.GT.1 .AND. nobs.LE. nsites) THEN
150  sum=0.0
151  sumwt=0.0
152  ncase=0
153  DO 200 iob=1,nobs
154  wt=wndwt(x0,y0,xx(iob),yy(iob))
155  sum=sum+wt*varbl(iob)
156  sumwt=sumwt+wt
157 200 CONTINUE
158  trpval=sum/sumwt
159  RETURN
160  ELSE IF (nobs.EQ.1) THEN
161  trpval=varbl(1)
162  RETURN
163  ELSE IF (nobs.GT.nsites) THEN
164  WRITE (*,*) 'TOO MANY OBS IN RM2MOLD '
165  stop
166  ELSE IF (nobs.EQ.0) THEN
167  WRITE (*,*) 'SOMETHING WRONG IN RM2MOLD -- NOBS= ',nobs
168  stop
169  END IF
170 C
171  END
172 
subroutine rinvmold(TRPVAL, X0, Y0, XX, YY, NOBS, VARBL)
Definition: invwt.f:128
subroutine rinvmod(TRPVAL, X0, Y0, XX, YY, NOBS, VARBL)
Definition: invwt.f:3
real function wndwt(X, Y, XOBS, YOBS)
Definition: utils.f:216