80
81
82
83
84
85
86
87
88
89
90
91
92
95
96
97
98#include "implicit_f.inc"
99
100
101
102 TYPE(TABLE_4D_) ,INTENT(IN) :: TABLE
103 INTEGER, VALUE ,INTENT(IN) :: DIMX
104 INTEGER ,INTENT(IN) :: NEL
105 my_real,
DIMENSION(DIMX,TABLE%NDIM),
INTENT(IN) :: xx
106 INTEGER, DIMENSION(DIMX,TABLE%NDIM),INTENT(INOUT) :: IPOS
107 my_real,
DIMENSION(DIMX) ,
INTENT(INOUT) :: yy
108 my_real,
DIMENSION(DIMX) ,
INTENT(INOUT) :: dydx
109 LOGICAL, OPTIONAL, INTENT(IN) :: OPT_EXTRAPOLATE
110
111
112
113 LOGICAL :: NEED_TO_COMPUTE
114 INTEGER I,J,K,M,N,I1,I2,J1,J2,K1,K2,L1,L2,NDIM
115 INTEGER :: NINDX_1,NINDX_2
116 INTEGER, DIMENSION(NEL) :: INDX_1,INDX_2
117 INTEGER, DIMENSION(4) :: LDIM
118 my_real :: dx,dy,
alpha,alphai,beta,betai,gamma,gammai,delta,deltai
119 my_real,
DIMENSION(NEL,4) :: fac
120 LOGICAL DO_EXTRAPOLATION
121
122
123
124 do_extrapolation = .true.
125 IF(PRESENT(opt_extrapolate)) THEN
126 do_extrapolation = opt_extrapolate
127 ENDIF
128
129 ndim = table%NDIM
130 IF (SIZE(xx,2) < ndim ) THEN
131 CALL ancmsg(msgid=36,anmode=aninfo,c1=
'TABLE INTERPOLATION')
133 END IF
134
135 DO k=1,ndim
136 ldim(k) = SIZE(table%X(k)%VALUES)
137 END DO
138
139 DO k=1,ndim
140 ipos(1:nel,k) =
max(ipos(1:nel,k),1)
141 nindx_1 = 0
142 nindx_2 = 0
143#include "vectorize.inc"
144 DO i=1,nel
145 m = ipos(i,k)
146 dx = table%X(k)%VALUES(m) - xx(i,k)
147 IF (dx >= zero)THEN
148 nindx_1 = nindx_1 + 1
149 indx_1(nindx_1) = i
150 ELSE
151 nindx_2 = nindx_2 + 1
152 indx_2(nindx_2) = i
153 ENDIF
154 ENDDO
155
156 DO j=1,nindx_1
157 i = indx_1(j)
158 m = ipos(i,k)
159 need_to_compute = .true.
160 DO WHILE (need_to_compute )
161 dx = table%X(k)%VALUES(m) - xx(i,k)
162 IF (dx < zero .OR. m <= 1 ) THEN
164 need_to_compute = .false.
165 ELSE
166 m=m-1
167 ENDIF
168 ENDDO
169 ENDDO
170
171 DO j=1,nindx_2
172 i = indx_2(j)
173 m = ipos(i,k)
174 need_to_compute = .true.
175 DO WHILE (need_to_compute )
176 dx = table%X(k)%VALUES(m) - xx(i,k)
177 IF (dx >= zero .OR. m == ldim(k)) THEN
178 ipos(i,k) = m-1
179 need_to_compute = .false.
180 ELSE
181 m=m+1
182 ENDIF
183 ENDDO
184 ENDDO
185 ENDDO
186
187 DO k=1,ndim
188#include "vectorize.inc"
189 DO i=1,nel
190 n = ipos(i,k)
191 fac(i,k) = (table%X(k)%VALUES(n+1) - xx(i,k)) / (table%X(k)%VALUES(n+1) - table%X(k)%VALUES(n))
192 END DO
193 END DO
194
195 IF(.NOT. do_extrapolation)THEN
196 DO k=1,ndim
197#include "vectorize.inc"
198 DO i=1,nel
199 n = ipos(i,k)
200 fac(i,k) =
min(one,
max(fac(i,k),zero))
201 END DO
202 END DO
203 ENDIF
204
205
206 SELECT CASE(ndim)
207
208 CASE(4)
209#include "vectorize.inc"
210 DO i=1,nel
211 i1 = ipos(i,1)
212 i2 = i1 + 1
213 j1 = ipos(i,2)
214 j2 = j1 + 1
215 k1 = ipos(i,3)
216 k2 = k1 + 1
217 l1 = ipos(i,4)
218 l2 = l1 + 1
220 beta = fac(i,2)
221 gamma = fac(i,3)
222 delta = fac(i,4)
224 betai = one - beta
225 gammai = one - gamma
226 deltai = one - delta
227 yy(i) =
228 . delta* (gamma*(beta * (
alpha * table%Y4D(i1,j1,k1,l1)
229 . + alphai * table%Y4D(i2,j1,k1,l1))
230 . + betai* (
alpha * table%Y4D(i1,j2,k1,l1)
231 . + alphai * table%Y4D(i2,j2,k1,l1)) )
232 . +gammai*( beta* (
alpha * table%Y4D(i1,j1,k2,l1)
233 . + alphai * table%Y4D(i2,j1,k2,l1))
234 . + betai* (
alpha * table%Y4D(i1,j2,k2,l1)
235 . + alphai * table%Y4D(i2,j2,k2,l1))))
236
237 . + deltai*(gamma *(beta * (
alpha * table%Y4D(i1,j1,k1,l2)
238 . + alphai * table%Y4D(i2,j1,k1,l2))
239 . + betai* (
alpha * table%Y4D(i1,j2,k1,l2)
240 . + alphai * table%Y4D(i2,j2,k1,l2)))
241 . +gammai* (beta* (
alpha * table%Y4D(i1,j1,k2,l2)
242 . + alphai * table%Y4D(i2,j1,k2,l2))
243 . + betai* (
alpha * table%Y4D(i1,j2,k2,l2)
244 . + alphai * table%Y4D(i2,j2,k2,l2))))
245
246 dy = delta * (gamma *(beta *(table%Y4D(i2,j1,k1,l1)-table%Y4D(i1,j1,k1,l1))
247 . + betai*(table%Y4D(i2,j2,k1,l1)-table%Y4D(i1,j2,k1,l1)))
248 . + gammai *(beta *(table%Y4D(i2,j1,k2,l1)-table%Y4D(i1,j1,k2,l1))
249 . + betai*(table%Y4D(i2,j2,k2,l1)-table%Y4D(i1,j2,k2,l1))))
250 . + deltai * (gamma *(beta *(table%Y4D(i2,j1,k1,l2)-table%Y4D(i1,j1,k1,l2))
251 . + betai*(table%Y4D(i2,j2,k1,l2)-table%Y4D(i1,j2,k1,l2)))
252 . + gammai *(beta *(table%Y4D(i2,j1,k2,l2)-table%Y4D(i1,j1,k2,l2))
253 . + betai*(table%Y4D(i2,j2,k2,l2)-table%Y4D(i1,j2,k2,l2))))
254 dx = table%X(1)%VALUES(i2) - table%X(1)%VALUES(i1)
255 dydx(i) = dy / dx
256 END DO
257
258 CASE(3)
259#include "vectorize.inc"
260 DO i=1,nel
261 i1 = ipos(i,1)
262 i2 = i1 + 1
263 j1 = ipos(i,2)
264 j2 = j1 + 1
265 k1 = ipos(i,3)
266 k2 = k1 + 1
268 beta = fac(i,2)
269 gamma = fac(i,3)
271 betai = one - beta
272 gammai = one - gamma
273 yy(i)=(gamma * (beta * (
alpha*table%Y3D(i1,j1,k1) + alphai*table%Y3D(i2,j1,k1))
274 . + betai* (
alpha*table%Y3D(i1,j2,k1) + alphai*table%Y3D(i2,j2,k1)) )
275 . + gammai * (beta * (
alpha*table%Y3D(i1,j1,k2) + alphai*table%Y3D(i2,j1,k2))
276 . + betai* (
alpha*table%Y3D(i1,j2,k2) + alphai*table%Y3D(i2,j2,k2))))
277
278 dy = gamma * ( beta*(table%Y3D(i2,j1,k1) - table%Y3D(i1,j1,k1))
279 . + betai*(table%Y3D(i2,j2,k1) - table%Y3D(i1,j2,k1)))
280 . + gammai * ( beta*(table%Y3D(i2,j1,k2) - table%Y3D(i1,j1,k2))
281 . + betai*(table%Y3D(i2,j2,k2) - table%Y3D(i1,j2,k2)))
282 dx = table%X(1)%VALUES(i2) - table%X(1)%VALUES(i1)
283 .
284 dydx(i) = dy / dx
285 END DO
286
287 CASE(2)
288#include "vectorize.inc"
289 DO i=1,nel
290 i1 = ipos(i,1)
291 i2 = i1 + 1
292 j1 = ipos(i,2)
293 j2 = j1 + 1
295 beta = fac(i,2)
297 betai = one - beta
298 yy(i) = (beta * (
alpha*table%Y2D(i1,j1) + alphai*table%Y2D(i2,j1))
299 . + betai * (
alpha*table%Y2D(i1,j2) + alphai*table%Y2D(i2,j2)) )
300 dydx(i) = (beta *(table%Y2D(i2,j1) - table%Y2D(i1,j1))
301 . + betai *(table%Y2D(i2,j2) - table%Y2D(i1,j2)))
302 . / (table%X(1)%VALUES(i2)-table%X(1)%VALUES(i1))
303 END DO
304
305 CASE(1)
306#include "vectorize.inc"
307 DO i=1,nel
308 i1 = ipos(i,1)
309 i2 = i1 + 1
312 yy(i) =
alpha*table%Y1D(i1) + alphai*table%Y1D(i2)
313 dydx(i) = (table%Y1D(i2) - table%Y1D(i1)) / (table%X(1)%VALUES(i2) - table%X(1)%VALUES(i1))
314 END DO
315
316 END SELECT
317
318 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)