GCC Code Coverage Report


Directory: ./
File: dyn3d_common/extrapol.f
Date: 2022-01-11 19:19:34
Exec Total Coverage
Lines: 0 93 0.0%
Branches: 0 68 0.0%

Line Branch Exec Source
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
201