11 integer :: n_table,n_itp
12 double precision :: x_table(n_table),y_table(n_table)
13 double precision :: x_itp(n_itp),y_itp(n_itp)
22 if(x_itp(i)<x_table(1))
then
26 if(x_itp(i)>=x_table(n_table))
then
27 y_itp(i)=y_table(n_table)
30 loopt:
do j=1,n_table-1
31 if (x_itp(i)>=x_table(j) .and. x_itp(i)<x_table(j+1))
then
32 y_itp(i)=y_table(j) + (x_itp(i)-x_table(j))*&
33 (y_table(j+1)-y_table(j))/(x_table(j+1)-x_table(j))
46 integer :: n_table,n_itp
47 double precision :: x_table(n_table),y_table(n_table)
48 double precision :: x_itp(n_itp),y_itp(n_itp)
50 double precision :: at(n_table),bt(n_table),ct(n_table),dt(n_table)
51 double precision :: dxi
54 if (x_table(1)>x_itp(1) .or. x_table(n_table)<x_itp(n_itp))
then
55 call mpistop(
"out of interpolation table")
61 loopt:
do j=1,n_table-1
62 if (x_itp(i)>=x_table(j) .and. x_itp(i)<x_table(j+1))
then
63 dxi=x_itp(i)-x_table(j)
64 y_itp(i)=at(j)+bt(j)*dxi+ct(j)*dxi**2+dt(j)*dxi**3
70 if (x_itp(n_itp)==x_table(n_table)) y_itp(n_itp)=y_table(n_table)
78 double precision :: xi(ni),yi(ni)
79 double precision :: ai(ni),bi(ni),ci(ni),di(ni)
81 double precision :: matrix1(ni,ni),ri1(ni)
82 double precision :: matrix2(ni,ni),ri2(ni)
83 double precision :: mi(ni),hi(ni)
98 matrix1(i-1,i)=hi(i-1)
99 matrix1(i,i)=2*(hi(i-1)+hi(i))
101 ri1(i)=(yi(i+1)-yi(i))/hi(i)-(yi(i)-yi(i-1))/hi(i-1)
110 matrix2(2,1)=matrix1(2,1)/matrix1(1,1)
111 ri2(1)=ri1(1)/matrix1(1,1)
114 matrix2(i+1,i)=matrix1(i+1,i)/(matrix1(i,i)-matrix1(i-1,i)*matrix2(i,i-1))
118 ri2(i)=ri1(i)-matrix1(i-1,i)*ri2(i-1)
119 ri2(i)=ri2(i)/(matrix1(i,i)-matrix1(i-1,i)*matrix2(i,i-1))
124 mi(i)=ri2(i)-matrix2(i+1,i)*mi(i+1)
131 bi(i)=(yi(i+1)-yi(i))/hi(i)-hi(i)*mi(i)/2.0-hi(i)*(mi(i+1)-mi(i))/6.0
132 di(i)=(mi(i+1)-mi(i))/(6.0*hi(i))
141 double precision :: xc(0:1^D&,1:ndim),xp(1:ndim),factor(0:1^D&)
143 double precision :: dxc^D,xd^D
145 ^d&dxc^d=xc(1^dd&,^d)-xc(0^dd&,^d)\
146 ^d&xd^d=(xp(^d)-xc(0^dd&,^d))/dxc^d\
149 factor(ix^d)={abs(1-ix^d-xd^d)*}
159 double precision :: xc(0:1^D&,1:ndim),xp(1:ndim)
160 double precision :: wc(0:1^D&,1:nwc),wp(1:nwc)
163 double precision :: factor(0:1^D&)
170 wp(iw)=wp(iw)+wc(ix^d,iw)*factor(ix^d)
181 double precision :: xp(1:ndim),wp(1:nw)
183 double precision :: dxb^D,xb^L
184 integer :: inblock,ixO^L,j
185 integer :: ixb^D,ixi^D
186 double precision :: xc(0:1^D&,1:ndim),wc(0:1^D&,nw)
194 {
if (xp(^d)>=xbmin^d .and. xp(^d)<xbmax^d) inblock=inblock+1\}
195 if (inblock/=ndim)
then
196 call mpistop(
'Interpolation error: given point is not in given grid')
202 ^d&ixb^d=floor((xp(^d)-ps(igrid)%x(ixomin^dd,^d))/dxb^d)+ixomin^d\
206 xc(ixi^d,:)=ps(igrid)%x(ixb^d+ixi^d,:)
207 wc(ixi^d,:)=ps(igrid)%w(ixb^d+ixi^d,:)
subroutine mpistop(message)
Exit MPI-AMRVAC with an error message.
This module contains definitions of global parameters and variables and some generic functions/subrou...
integer, parameter rpxmin
double precision, dimension(:,:), allocatable rnode
Corner coordinates.
integer, parameter rpxmax
subroutine interp_cubic_spline(x_table, y_table, n_table, x_itp, y_itp, n_itp)
subroutine get_interp_factor_linear(xc, xp, factor)
subroutine get_cubic_para(xi, yi, ai, bi, ci, di, ni)
subroutine interp_from_grid_linear(igrid, xp, wp)
subroutine interp_linear_multid(xc, xp, wc, wp, nwc)
subroutine interp_linear(x_table, y_table, n_table, x_itp, y_itp, n_itp)