91
92
93
94
95
96
97
98
99
100
101
102
103
106
107
108
109#include "implicit_f.inc"
110
111
112
113 TYPE(TABLE_4D_) ,INTENT(IN) :: TABLE
114 INTEGER, VALUE ,INTENT(IN) :: DIMX
115 INTEGER ,INTENT(IN) :: NEL
116 my_real,
DIMENSION(DIMX,TABLE%NDIM),
INTENT(IN) :: xx
117 INTEGER, DIMENSION(DIMX,TABLE%NDIM),INTENT(INOUT) :: IPOS
118 my_real,
DIMENSION(DIMX) ,
INTENT(INOUT) :: yy
119 my_real,
DIMENSION(DIMX) ,
INTENT(INOUT) :: dydx
120 LOGICAL, OPTIONAL, INTENT(IN) :: OPT_EXTRAPOLATE
121
122
123
124 LOGICAL :: NEED_TO_COMPUTE
125 INTEGER I,J,K,M,N,I1,I2,J1,J2,K1,K2,L1,L2,NDIM
126 INTEGER :: NINDX_1,NINDX_2
127 INTEGER, DIMENSION(NEL) :: INDX_1,INDX_2
128 INTEGER, DIMENSION(4) :: LDIM
129 my_real :: dx,dy,
alpha,alphai,beta,betai,gamma,gammai,delta,deltai
130 my_real,
DIMENSION(NEL,4) :: fac
131 LOGICAL DO_EXTRAPOLATION
132
133
134
135 do_extrapolation = .true.
136 IF(PRESENT(opt_extrapolate)) THEN
137 do_extrapolation = opt_extrapolate
138 ENDIF
139
140 ndim = table%NDIM
141 IF (SIZE(xx,2) < ndim ) THEN
142 CALL ancmsg(msgid=36,anmode=aninfo,c1=
'TABLE INTERPOLATION')
144 END IF
145
146 DO k=1,ndim
147 ldim(k) = SIZE(table%X(k)%VALUES)
148 END DO
149
150 DO k=1,ndim
151 ipos(1:nel,k) =
max(ipos(1:nel,k),1)
152 nindx_1 = 0
153 nindx_2 = 0
154#include "vectorize.inc"
155 DO i=1,nel
156 m = ipos(i,k)
157 dx = table%X(k)%VALUES(m) - xx(i,k)
158 IF (dx >= zero)THEN
159 nindx_1 = nindx_1 + 1
160 indx_1(nindx_1) = i
161 ELSE
162 nindx_2 = nindx_2 + 1
163 indx_2(nindx_2) = i
164 ENDIF
165 ENDDO
166
167 DO j=1,nindx_1
168 i = indx_1(j)
169 m = ipos(i,k)
170 need_to_compute = .true.
171 DO WHILE (need_to_compute )
172 dx = table%X(k)%VALUES(m) - xx(i,k)
173 IF (dx < zero .OR. m <= 1 ) THEN
175 need_to_compute = .false.
176 ELSE
177 m=m-1
178 ENDIF
179 ENDDO
180 ENDDO
181
182 DO j=1,nindx_2
183 i = indx_2(j)
184 m = ipos(i,k)
185 need_to_compute = .true.
186 DO WHILE (need_to_compute )
187 dx = table%X(k)%VALUES(m) - xx(i,k)
188 IF (dx >= zero .OR. m == ldim(k)) THEN
189 ipos(i,k) = m-1
190 need_to_compute = .false.
191 ELSE
192 m=m+1
193 ENDIF
194 ENDDO
195 ENDDO
196 ENDDO
197
198 DO k=1,ndim
199#include "vectorize.inc"
200 DO i=1,nel
201 n = ipos(i,k)
202 fac(i,k) = (table%X(k)%VALUES(n+1) - xx(i,k)) / (table%X(k)%VALUES(n+1) - table%X(k)%VALUES(n))
203 END DO
204 END DO
205
206 IF(.NOT. do_extrapolation)THEN
207 DO k=1,ndim
208#include "vectorize.inc"
209 DO i=1,nel
210 n = ipos(i,k)
211 fac(i,k) =
min(one,
max(fac(i,k),zero))
212 END DO
213 END DO
214 ENDIF
215
216
217 SELECT CASE(ndim)
218
219 CASE(4)
220#include "vectorize.inc"
221 DO i=1,nel
222 i1 = ipos(i,1)
223 i2 = i1 + 1
224 j1 = ipos(i,2)
225 j2 = j1 + 1
226 k1 = ipos(i,3)
227 k2 = k1 + 1
228 l1 = ipos(i,4)
229 l2 = l1 + 1
231 beta = fac(i,2)
232 gamma = fac(i,3)
233 delta = fac(i,4)
235 betai = one - beta
236 gammai = one - gamma
237 deltai = one - delta
238 yy(i) =
239 . delta* (gamma*(beta * (
alpha * table%Y4D(i1,j1,k1,l1)
240 . + alphai * table%Y4D(i2,j1,k1,l1))
241 . + betai* (
alpha * table%Y4D(i1,j2,k1,l1)
242 . + alphai * table%Y4D(i2,j2,k1,l1)) )
243 . +gammai*( beta* (
alpha * table%Y4D(i1,j1,k2,l1)
244 . + alphai * table%Y4D(i2,j1,k2,l1))
245 . + betai* (
alpha * table%Y4D(i1,j2,k2,l1)
246 . + alphai * table%Y4D(i2,j2,k2,l1))))
247
248 . + deltai*(gamma *(beta * (
alpha * table%Y4D(i1,j1,k1,l2)
249 . + alphai * table%Y4D(i2,j1,k1,l2))
250 . + betai* (
alpha * table%Y4D(i1,j2,k1,l2)
251 . + alphai * table%Y4D(i2,j2,k1,l2)))
252 . +gammai* (beta* (
alpha * table%Y4D(i1,j1,k2,l2)
253 . + alphai * table%Y4D(i2,j1,k2,l2))
254 . + betai* (
alpha * table%Y4D(i1,j2,k2,l2)
255 . + alphai * table%Y4D(i2,j2,k2,l2))))
256
257 dy = delta * (gamma *(beta *(table%Y4D(i2,j1,k1,l1)-table%Y4D(i1,j1,k1,l1))
258 . + betai*(table%Y4D(i2,j2,k1,l1)-table%Y4D(i1,j2,k1,l1)))
259 . + gammai *(beta *(table%Y4D(i2,j1,k2,l1)-table%Y4D(i1,j1,k2,l1))
260 . + betai*(table%Y4D(i2,j2,k2,l1)-table%Y4D(i1,j2,k2,l1))))
261 . + deltai * (gamma *(beta *(table%Y4D(i2,j1,k1,l2)-table%Y4D(i1,j1,k1,l2))
262 . + betai*(table%Y4D(i2,j2,k1,l2)-table%Y4D(i1,j2,k1,l2)))
263 . + gammai *(beta *(table%Y4D(i2,j1,k2,l2)-table%Y4D(i1,j1,k2,l2))
264 . + betai*(table%Y4D(i2,j2,k2,l2)-table%Y4D(i1,j2,k2,l2))))
265 dx = table%X(1)%VALUES(i2) - table%X(1)%VALUES(i1)
266 dydx(i) = dy / dx
267 END DO
268
269 CASE(3)
270#include "vectorize.inc"
271 DO i=1,nel
272 i1 = ipos(i,1)
273 i2 = i1 + 1
274 j1 = ipos(i,2)
275 j2 = j1 + 1
276 k1 = ipos(i,3)
277 k2 = k1 + 1
279 beta = fac(i,2)
280 gamma = fac(i,3)
282 betai = one - beta
283 gammai = one - gamma
284 yy(i)=(gamma * (beta * (
alpha*table%Y3D(i1,j1,k1) + alphai*table%Y3D(i2,j1,k1))
285 . + betai* (
alpha*table%Y3D(i1,j2,k1) + alphai*table%Y3D(i2,j2,k1)) )
286 . + gammai * (beta * (
alpha*table%Y3D(i1,j1,k2) + alphai*table%Y3D(i2,j1,k2))
287 . + betai* (
alpha*table%Y3D(i1,j2,k2) + alphai*table%Y3D(i2,j2,k2))))
288
289 dy = gamma * ( beta*(table%Y3D(i2,j1,k1) - table%Y3D(i1,j1,k1))
290 . + betai*(table%Y3D(i2,j2,k1) - table%Y3D(i1,j2,k1)))
291 . + gammai * ( beta*(table%Y3D(i2,j1,k2) - table%Y3D(i1,j1,k2))
292 . + betai*(table%Y3D(i2,j2,k2) - table%Y3D(i1,j2,k2)))
293 dx = table%X(1)%VALUES(i2) - table%X(1)%VALUES(i1)
294 .
295 dydx(i) = dy / dx
296 END DO
297
298 CASE(2)
299#include "vectorize.inc"
300 DO i=1,nel
301 i1 = ipos(i,1)
302 i2 = i1 + 1
303 j1 = ipos(i,2)
304 j2 = j1 + 1
306 beta = fac(i,2)
308 betai = one - beta
309 yy(i) = (beta * (
alpha*table%Y2D(i1,j1) + alphai*table%Y2D(i2,j1))
310 . + betai * (
alpha*table%Y2D(i1,j2) + alphai*table%Y2D(i2,j2)) )
311 dydx(i) = (beta *(table%Y2D(i2,j1) - table%Y2D(i1,j1))
312 . + betai *(table%Y2D(i2,j2) - table%Y2D(i1,j2)))
313 . / (table%X(1)%VALUES(i2)-table%X(1)%VALUES(i1))
314 END DO
315
316 CASE(1)
317#include "vectorize.inc"
318 DO i=1,nel
319 i1 = ipos(i,1)
320 i2 = i1 + 1
323 yy(i) =
alpha*table%Y1D(i1) + alphai*table%Y1D(i2)
324 dydx(i) = (table%Y1D(i2) - table%Y1D(i1)) / (table%X(1)%VALUES(i2) - table%X(1)%VALUES(i1))
325 END DO
326
327 END SELECT
328
329 RETURN
subroutine ancmsg(msgid, msgtype, anmode, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, r1, r2, r3, r4, r5, r6, r7, r8, r9, c1, c2, c3, c4, c5, c6, c7, c8, c9, prmode)