LMDZ
extrapol.F
Go to the documentation of this file.
1 !
2 ! $Id: extrapol.F 1952 2014-01-28 13:05:47Z lguez $
3 !
4 C
5 C
6  SUBROUTINE extrapol (pfild, kxlon, kylat, pmask,
7  . norsud, ldper, knbor, pwork)
8  IMPLICIT none
9 c
10 c OASIS routine (Adaptation: Laurent Li, le 14 mars 1997)
11 c Fill up missed values by using the neighbor points
12 c
13  INTEGER kxlon, kylat ! longitude and latitude dimensions (Input)
14  INTEGER knbor ! minimum neighbor number (Input)
15  LOGICAL norsud ! True if field is from North to South (Input)
16  LOGICAL ldper ! True if take into account the periodicity (Input)
17  REAL pmask ! mask value (Input)
18  REAL pfild(kxlon,kylat) ! field to be extrapolated (Input/Output)
19  REAL pwork(kxlon,kylat) ! working space
20 c
21  REAL zwmsk
22  INTEGER incre, idoit, i, j, k, inbor, ideb, ifin, ilon, jlat
23  INTEGER ix(9), jy(9) ! index arrays for the neighbors coordinates
24  REAL zmask(9)
25 C
26 C We search over the eight closest neighbors
27 C
28 C j+1 7 8 9
29 C j 4 5 6 Current point 5 --> (i,j)
30 C j-1 1 2 3
31 C i-1 i i+1
32 c
33 c
34  IF (norsud) THEN
35  DO j = 1, kylat
36  DO i = 1, kxlon
37  pwork(i,j) = pfild(i,kylat-j+1)
38  ENDDO
39  ENDDO
40  DO j = 1, kylat
41  DO i = 1, kxlon
42  pfild(i,j) = pwork(i,j)
43  ENDDO
44  ENDDO
45  ENDIF
46 c
47  incre = 0
48 c
49  DO j = 1, kylat
50  DO i = 1, kxlon
51  pwork(i,j) = pfild(i,j)
52  ENDDO
53  ENDDO
54 c
55 C* To avoid problems in floating point tests
56  zwmsk = pmask - 1.0
57 c
58 200 CONTINUE
59  incre = incre + 1
60  DO 99999 j = 1, kylat
61  DO 99999 i = 1, kxlon
62  IF (pfild(i,j).GT. zwmsk) THEN
63  pwork(i,j) = pfild(i,j)
64  inbor = 0
65  ideb = 1
66  ifin = 9
67 C
68 C* Fill up ix array
69  ix(1) = max(1,i-1)
70  ix(2) = i
71  ix(3) = min(kxlon,i+1)
72  ix(4) = max(1,i-1)
73  ix(5) = i
74  ix(6) = min(kxlon,i+1)
75  ix(7) = max(1,i-1)
76  ix(8) = i
77  ix(9) = min(kxlon,i+1)
78 C
79 C* Fill up iy array
80  jy(1) = max(1,j-1)
81  jy(2) = max(1,j-1)
82  jy(3) = max(1,j-1)
83  jy(4) = j
84  jy(5) = j
85  jy(6) = j
86  jy(7) = min(kylat,j+1)
87  jy(8) = min(kylat,j+1)
88  jy(9) = min(kylat,j+1)
89 C
90 C* Correct latitude bounds if southernmost or northernmost points
91  IF (j .EQ. 1) ideb = 4
92  IF (j .EQ. kylat) ifin = 6
93 C
94 C* Account for periodicity in longitude
95 C
96  IF (ldper) THEN
97  IF (i .EQ. kxlon) THEN
98  ix(3) = 1
99  ix(6) = 1
100  ix(9) = 1
101  ELSE IF (i .EQ. 1) THEN
102  ix(1) = kxlon
103  ix(4) = kxlon
104  ix(7) = kxlon
105  ENDIF
106  ELSE
107  IF (i .EQ. 1) THEN
108  ix(1) = i
109  ix(2) = i + 1
110  ix(3) = i
111  ix(4) = i + 1
112  ix(5) = i
113  ix(6) = i + 1
114  ENDIF
115  IF (i .EQ. kxlon) THEN
116  ix(1) = i -1
117  ix(2) = i
118  ix(3) = i - 1
119  ix(4) = i
120  ix(5) = i - 1
121  ix(6) = i
122  ENDIF
123 C
124  IF (i .EQ. 1 .OR. i .EQ. kxlon) THEN
125  jy(1) = max(1,j-1)
126  jy(2) = max(1,j-1)
127  jy(3) = j
128  jy(4) = j
129  jy(5) = min(kylat,j+1)
130  jy(6) = min(kylat,j+1)
131 C
132  ideb = 1
133  ifin = 6
134  IF (j .EQ. 1) ideb = 3
135  IF (j .EQ. kylat) ifin = 4
136  ENDIF
137  ENDIF ! end for ldper test
138 C
139 C* Find unmasked neighbors
140 C
141  DO 230 k = ideb, ifin
142  zmask(k) = 0.
143  ilon = ix(k)
144  jlat = jy(k)
145  IF (pfild(ilon,jlat) .LT. zwmsk) THEN
146  zmask(k) = 1.
147  inbor = inbor + 1
148  ENDIF
149  230 CONTINUE
150 C
151 C* Not enough points around point P are unmasked; interpolation on P
152 C will be done in a future call to extrap.
153 C
154  IF (inbor .GE. knbor) THEN
155  pwork(i,j) = 0.
156  DO k = ideb, ifin
157  ilon = ix(k)
158  jlat = jy(k)
159  pwork(i,j) = pwork(i,j)
160  $ + pfild(ilon,jlat) * zmask(k)/ REAL(inbor)
161  ENDDO
162  ENDIF
163 C
164  ENDIF
165 99999 CONTINUE
166 C
167 C* 3. Writing back unmasked field in pfild
168 C ------------------------------------
169 C
170 C* pfild then contains:
171 C - Values which were not masked
172 C - Interpolated values from the inbor neighbors
173 C - Values which are not yet interpolated
174 C
175  idoit = 0
176  DO j = 1, kylat
177  DO i = 1, kxlon
178  IF (pwork(i,j) .GT. zwmsk) idoit = idoit + 1
179  pfild(i,j) = pwork(i,j)
180  ENDDO
181  ENDDO
182 c
183  IF (idoit .ne. 0) GOTO 200
184 ccc PRINT*, "Number of extrapolation steps incre =", incre
185 c
186  IF (norsud) THEN
187  DO j = 1, kylat
188  DO i = 1, kxlon
189  pwork(i,j) = pfild(i,kylat-j+1)
190  ENDDO
191  ENDDO
192  DO j = 1, kylat
193  DO i = 1, kxlon
194  pfild(i,j) = pwork(i,j)
195  ENDDO
196  ENDDO
197  ENDIF
198 c
199  RETURN
200  END
subroutine extrapol(pfild, kxlon, kylat, pmask, norsud, ldper, knbor, pwork)
Definition: extrapol.F:8