324
326
327
328
329#include "implicit_f.inc"
330
331
332
333#include "com01_c.inc"
334#include "units_c.inc"
335
336
337
338 TYPE(TTABLE) :: TABLE
339 INTEGER ,INTENT(IN) :: NEL
340 INTEGER ,VALUE ,INTENT(IN) :: DIMX
341 INTEGER ,DIMENSION(DIMX,TABLE%NDIM) :: IPOS
342 my_real ,
DIMENSION(DIMX,TABLE%NDIM) :: xx
343 my_real ,
DIMENSION(NEL) :: yy, dydx1
344
345
346
347 LOGICAL, DIMENSION(NEL) :: NEED_TO_COMPUTE
348 INTEGER NDIM, K, NXK(4), I, IB(NEL,2,2,2,2),
349 . IP,IN,IM,IL,P,N,M,L,N1,N12,N123
350 my_real :: dx2,r(nel,4),unr(nel,4),dx2_0(nel)
351 INTEGER :: J
352 INTEGER :: NINDX_1,M_INDX1,NINDX_2,M_INDX2
353 INTEGER, DIMENSION(NEL) :: ,INDX_2
354
355 r(1:nel,1:4) = zero
356 ndim=table%NDIM
357 IF (SIZE(xx,2) < table%NDIM) THEN
358 WRITE(iout,*) ' ** INTERNAL ERROR - TABLE INTERPOLATION'
359 WRITE(istdo,*)' ** INTERNAL ERROR - TABLE INTERPOLATION'
361 END IF
362
363 DO k=1,ndim
364 nxk(k)=SIZE(table%X(k)%VALUES)
365 ENDDO
366
367 DO k=1,ndim
368 ipos(1:nel,k)=
max(ipos(1:nel,k),1)
369 nindx_1 = 0
370 m_indx1 = 0
371 nindx_2 = 0
372 m_indx2 = nxk(k) + 1
373#include "vectorize.inc"
374 DO i=1,nel
375 m = ipos(i,k)
376 dx2_0(i) = table%X(k)%VALUES(m) - xx(i,k)
377 IF(dx2_0(i) >= zero)THEN
378 nindx_1 = nindx_1 + 1
379 indx_1(nindx_1) = i
380 m_indx1 =
max(m_indx1,m)
381 ELSE
382 nindx_2 = nindx_2 + 1
383 indx_2(nindx_2) = i
384 m_indx2 =
min(m_indx2,m)
385 ENDIF
386 ENDDO
387
388 need_to_compute(1:nindx_1) = .true.
389 DO n=m_indx1,1,-1
390#include "vectorize.inc"
391 DO j=1,nindx_1
392 IF(need_to_compute(j)) THEN
393 i = indx_1(j)
394 m = ipos(i,k)
395 dx2 = table%X(k)%VALUES(n) - xx(i,k)
396 IF(dx2<zero.OR.n <=1)THEN
398 need_to_compute(j) = .false.
399 ENDIF
400 ENDIF
401 ENDDO
402 ENDDO
403 need_to_compute(1:nindx_2) = .true.
404 DO n=m_indx2,nxk(k)
405#include "vectorize.inc"
406 DO j=1,nindx_2
407 IF(need_to_compute(j)) THEN
408 i = indx_2(j)
409 m = ipos(i,k)
410 dx2 = table%X(k)%VALUES(n) - xx(i,k)
411 IF(dx2>=zero.OR.n==nxk(k))THEN
412 ipos(i,k)=n-1
413 need_to_compute(j) = .false.
414 ENDIF
415 ENDIF
416 ENDDO
417 ENDDO
418 ENDDO
419
420 DO k=1,ndim
421#include "vectorize.inc"
422 DO i=1,nel
423 n = ipos(i,k)
424 r(i,k) =(table%X(k)%VALUES(n+1)-xx(i,k))/
425 . (table%X(k)%VALUES(n+1)-table%X(k)%VALUES(n))
426 END DO
427 END DO
428
429 SELECT CASE(ndim)
430
431 CASE(4)
432
433 n1 =nxk(1)
434 n12 =nxk(1)*nxk(2)
435 n123=n12 *nxk(3)
436 DO i=1,nel
437 DO p=0,1
438 ip=n123*(ipos(i,4)-1+p)
439 DO n=0,1
440 in=n12*(ipos(i,3)-1+n)
441 DO m=0,1
442 im=n1*(ipos(i,2)-1+m)
443 DO l=0,1
444 il=ipos(i,1)+l
445 ib(i,l+1,m+1,n+1,p+1)=ip+in+im+il
446 END DO
447 END DO
448 END DO
449 END DO
450 END DO
451
452 unr(1:nel,1:4)=one-r(1:nel,1:4)
453#include "vectorize.inc"
454 DO i=1,nel
455
456 yy(i)=
457 . r(i,4)*(r(i,3)*(r(i,2)*(r(i,1)*table%Y%VALUES(ib(i,1,1,1,1))
458 . +unr(i,1)*table%Y%VALUES(ib(i,2,1,1,1)))
459 . +unr(i,2)*(r(i,1)*table%Y%VALUES(ib(i,1,2,1,1))
460 . +unr(i,1)*table%Y%VALUES(ib(i,2,2,1,1))))
461 . +unr(i,3)*(r(i,2)*(r(i,1)*table%Y%VALUES(ib(i,1,1,2,1))
462 . +unr(i,1)*table%Y%VALUES(ib(i,2,1,2,1)))
463 . +unr(i,2)*(r(i,1)*table%Y%VALUES(ib(i,1,2,2,1))
464 . +unr(i,1)*table%Y%VALUES(ib(i,2,2,2,1)))))
465 . +unr(i,4)*(r(i,3)*(r(i,2)*(r(i,1)*table%Y%VALUES(ib(i,1,1,1,1))
466 . +unr(i,1)*table%Y%VALUES(ib(i,2,1,1,1)))
467 . +unr(i,2)*(r(i,1)*table%Y%VALUES(ib(i,1,2,1,1))
468 . +unr(i,1)*table%Y%VALUES(ib(i,2,2,1,1))))
469 . +unr(i,3)*(r(i,2)*(r(i,1)*table%Y%VALUES(ib(i,1,1,2,1))
470 . +unr(i,1)*table%Y%VALUES(ib(i,2,1,2,1)))
471 . +unr(i,2)*(r(i,1)*table%Y%VALUES(ib(i,1,2,2,1))
472 . +unr(i,1)*table%Y%VALUES(ib(i,2,2,2,1)))))
473
474 dydx1(i)=
475 . (r(i,4)*(r(i,3)*(r(i,2)*( table%Y%VALUES(ib(i,2,1,1,1))
476 . -table%Y%VALUES(ib(i,1,1,1,1)))
477 . +unr(i,2)*( table%Y%VALUES(ib(i,2,2,1,1))
478 . -table%Y%VALUES(ib(i,1,2,1,1))))
479 . +unr(i,3)*(r(i,2)*( table%Y%VALUES(ib(i,2,1,2,1))
480 . -table%Y%VALUES(ib(i,1,1,2,1)))
481 . +unr(i,2)*( table%Y%VALUES(ib(i,2,2,2,1))
482 . -table%Y%VALUES(ib(i,1,2,2,1)))))
483 . +unr(i,4)*(r(i,3)*(r(i,2)*( table%Y%VALUES(ib(i,2,1,1,1))
484 . -table%Y%VALUES(ib(i,1,1,1,1)))
485 . +unr(i,2)*( table%Y%VALUES(ib(i,2,2,1,1))
486 . -table%Y%VALUES(ib(i,1,2,1,1))))
487 . +unr(i,3)*(r(i,2)*( table%Y%VALUES(ib(i,2,1,2,1))
488 . -table%Y%VALUES(ib(i,1,1,2,1)))
489 . +unr(i,2)*( table%Y%VALUES(ib(i,2,2,2,1))
490 . -table%Y%VALUES(ib(i,1,2,2,1))))))/
491 . (table%X(1)%VALUES(ipos(i,1)+1)-table%X(1)%VALUES(ipos(i,1)))
492
493 END DO
494
495 CASE(3)
496
497 n1 =nxk(1)
498 n12 =nxk(1)*nxk(2)
499 DO i=1,nel
500 DO n=0,1
501 in=n12*(ipos(i,3)-1+n)
502 DO m=0,1
503 im=n1*(ipos(i,2)-1+m)
504 DO l=0,1
505 il=ipos(i,1)+l
506 ib(i,l+1,m+1,n+1,1)=in+im+il
507 END DO
508 END DO
509 END DO
510 END DO
511
512 unr(1:nel,1:3)=one-r(1:nel,1:3)
513#include "vectorize.inc"
514 DO i=1,nel
515
516 yy(i)=
517 . (r(i,3)*(r(i,2)*(r(i,1)*table%Y%VALUES(ib(i,1,1,1,1))
518 . +unr(i,1)*table%Y%VALUES(ib(i,2,1,1,1)))
519 . +unr(i,2)*(r(i,1)*table%Y%VALUES(ib(i,1,2,1,1))
520 . +unr(i,1)*table%Y%VALUES(ib(i,2,2,1,1))))
521 . +unr(i,3)*(r(i,2)*(r(i,1)*table%Y%VALUES(ib(i,1,1,2,1))
522 . +unr(i,1)*table%Y%VALUES(ib(i,2,1,2,1)))
523 . +unr(i,2)*(r(i,1)*table%Y%VALUES(ib(i,1,2,2,1))
524 . +unr(i,1)*table%Y%VALUES(ib(i,2,2,2,1)))))
525
526 dydx1(i)=
527 . (r(i,3)*(r(i,2)*( table%Y%VALUES(ib(i,2,1,1,1))
528 . -table%Y%VALUES(ib(i,1,1,1,1)))
529 . +unr(i,2)*( table%Y%VALUES(ib(i,2,2,1,1))
530 . -table%Y%VALUES(ib(i,1,2,1,1))))
531 . +unr(i,3)*(r(i,2)*( table%Y%VALUES(ib(i,2,1,2,1))
532 . -table%Y%VALUES(ib(i,1,1,2,1)))
533 . +unr(i,2)*( table%Y%VALUES(ib(i,2,2,2,1))
534 . -table%Y%VALUES(ib(i,1,2,2,1)))))/
535 . (table%X(1)%VALUES(ipos(i,1)+1)-table%X(1)%VALUES(ipos(i,1)))
536
537 END DO
538
539 CASE(2)
540
541 n1 =nxk(1)
542 DO i=1,nel
543 DO m=0,1
544 im=n1*(ipos(i,2)-1+m)
545 DO l=0,1
546 il=ipos(i,1)+l
547 ib(i,l+1,m+1,1,1)=im+il
548 END DO
549 END DO
550 END DO
551
552 unr(1:nel,1:2)=one-r(1:nel,1:2)
553#include "vectorize.inc"
554 DO i=1,nel
555
556 yy(i)=
557 . (r(i,2)*(r(i,1)*table%Y%VALUES(ib(i,1,1,1,1))
558 . +unr(i,1)*table%Y%VALUES(ib(i,2,1,1,1)))
559 . +unr(i,2)*(r(i,1)*table%Y%VALUES(ib(i,1,2,1,1))
560 . +unr(i,1)*table%Y%VALUES(ib(i,2,2,1,1))))
561 dydx1(i)=
562 . (r(i,2)*( table%Y%VALUES(ib(i,2,1,1,1))
563 . -table%Y%VALUES(ib(i,1,1,1,1)))
564 . +unr(i,2)*( table%Y%VALUES(ib(i,2,2,1,1))
565 . -table%Y%VALUES(ib(i,1,2,1,1))))/
566 . (table%X(1)%VALUES(ipos(i,1)+1)-table%X(1)%VALUES(ipos(i,1)))
567 END DO
568
569 CASE(1)
570
571 unr(1:nel,1:1)=one-r(1:nel,1:1)
572#include "vectorize.inc"
573 DO i=1,nel
574
575 yy(i)= r(i,1)*table%Y%VALUES(ipos(i,1))
576 . +unr(i,1)*table%Y%VALUES(ipos(i,1)+1)
577 dydx1(i)=(table%Y%VALUES(ipos(i,1)+1)-table%Y%VALUES(ipos(i,1)))/
578 . (table%X(1)%VALUES(ipos(i,1)+1)-table%X(1)%VALUES(ipos(i,1)))
579 END DO
580
581 END SELECT
582
583 RETURN