2
* $Id: nwpw_scratch.F 19707 2010-10-29 17:59:36Z d3y133 $
5
* *********************************
9
* *********************************
10
subroutine nwpw_interp_init(ndim0,norder0)
14
#include "mafdecls.fh"
17
* **** nwpw_interp_common block ****
18
integer ndim_max,norder_max
19
integer root(2),coeff(2),pbasis(2)
20
common /nwpw_interp_common/ root,coeff,pbasis,ndim_max,norder_max
22
* **** local variable ****
29
value = MA_alloc_get(mt_dbl,norder_max,'root',root(2),root(1))
31
> MA_alloc_get(mt_dbl,norder_max,'coef',coeff(2),coeff(1))
33
> MA_alloc_get(mt_dbl,norder_max*ndim_max*2,
34
> 'pbasis',pbasis(2),pbasis(1))
36
> call errquit('nwpw_interp_init:out of heap',0,MA_ERR)
39
dbl_mb(root(1)+i) = -1.0d0 + i*2.0d0/dble(norder_max-1)
44
do k=i+1,(norder_max+i-1)
46
> *(dbl_mb(root(1)+i)-dbl_mb(root(1)+mod(k,norder_max)))
48
dbl_mb(coeff(1)+i) = 1.0d0/tmp
54
* *********************************
58
* *********************************
59
subroutine nwpw_interp_end()
62
#include "mafdecls.fh"
65
* **** nwpw_interp_common block ****
66
integer ndim_max,norder_max
67
integer root(2),coeff(2),pbasis(2)
68
common /nwpw_interp_common/ root,coeff,pbasis,ndim_max,norder_max
70
* **** local variables ****
73
value = MA_free_heap(pbasis(2))
74
value = value.and.MA_free_heap(coeff(2))
75
value = value.and.MA_free_heap(root(2))
77
> call errquit('nwpw_interp_end:freeing heap',0,MA_ERR)
82
* *********************************
84
* * nwpw_interp_basis *
86
* *********************************
87
real*8 function nwpw_interp_basis(i,x)
92
#include "mafdecls.fh"
95
* **** nwpw_interp_common block ****
96
integer ndim_max,norder_max
97
integer root(2),coeff(2),pbasis(2)
98
common /nwpw_interp_common/ root,coeff,pbasis,ndim_max,norder_max
100
* **** local variables ****
105
do k=i+1,(i+norder_max-1)
106
f = f*(x-dbl_mb(root(1)+mod(k,norder_max)))
108
f = f*dbl_mb(coeff(1)+i)
110
nwpw_interp_basis = f
115
* *********************************
117
* * nwpw_interp_dbasis *
119
* *********************************
120
real*8 function nwpw_interp_dbasis(i,x)
125
#include "mafdecls.fh"
126
#include "errquit.fh"
128
* **** nwpw_interp_common block ****
129
integer ndim_max,norder_max
130
integer root(2),coeff(2),pbasis(2)
131
common /nwpw_interp_common/ root,coeff,pbasis,ndim_max,norder_max
133
* **** local variables ****
138
do k=i+1,(i+norder_max-1)
140
do kk=i+1,(i+norder_max-1)
141
if (kk.ne.k) tmp=tmp*(x-dbl_mb(root(1)+mod(kk,norder_max)))
145
df = df*dbl_mb(coeff(1)+i)
147
nwpw_interp_dbasis = df
152
* *********************************
156
* *********************************
157
real*8 function nwpw_interp(ndim,N,a,b,mesh,x)
160
real*8 a(*),b(*),mesh(*),x(*)
162
#include "mafdecls.fh"
163
#include "errquit.fh"
165
* **** nwpw_interp_common block ****
166
integer ndim_max,norder_max
167
integer root(2),coeff(2),pbasis(2)
168
common /nwpw_interp_common/ root,coeff,pbasis,ndim_max,norder_max
170
* **** local variables ****
172
integer d,n1,nn1,i,ii,im,ip,ishift,jm(10),j(10)
173
real*8 xm,xp,xtilde,f,fi
175
* **** external functions ****
176
real*8 nwpw_interp_basis
177
external nwpw_interp_basis
181
failed = failed.or.(x(d).lt.a(d))
182
failed = failed.or.(x(d).gt.b(d))
190
ishift = norder_max/2 - 1 + mod(norder_max,2)
193
im = (N(d)-1)*(x(d)-a(d))/(b(d)-a(d)) - ishift
199
if (ip>(N(d)-1)) then
203
xm = a(d) + im*(b(d)-a(d))/dble(N(d)-1)
204
xp = a(d) + ip*(b(d)-a(d))/dble(N(d)-1)
205
xtilde = (2.0d0*x(d) - xp - xm)/(xp-xm)
208
dbl_mb(pbasis(1)+i+(d-1)*norder_max)
209
> = nwpw_interp_basis(i,xtilde)
226
ii = ii + (jm(d)+j(d))*nn1
231
fi = fi*dbl_mb(pbasis(1)+j(d)+(d-1)*norder_max)
233
f = f + mesh(ii+1)*fi
237
if (j(d).ge.norder_max) then
249
* *********************************
253
* *********************************
254
subroutine nwpw_dinterp(ndim,N,a,b,mesh,x,df)
257
real*8 a(*),b(*),mesh(*),x(*),df(*)
259
#include "mafdecls.fh"
260
#include "errquit.fh"
262
* **** nwpw_interp_common block ****
263
integer ndim_max,norder_max
264
integer root(2),coeff(2),pbasis(2)
265
common /nwpw_interp_common/ root,coeff,pbasis,ndim_max,norder_max
267
* **** local variables ****
269
integer d,dd,n1,nn1,i,ii,im,ip,ishift,k,jm(10),j(10)
270
real*8 xm,xp,xtilde,dx,fi
272
* **** external functions ****
273
real*8 nwpw_interp_basis,nwpw_interp_dbasis
274
external nwpw_interp_basis,nwpw_interp_dbasis
278
failed = failed.or.(x(d).lt.a(d))
279
failed = failed.or.(x(d).gt.b(d))
285
ishift = norder_max/2 - 1 + mod(norder_max,2)
288
im = (N(d)-1)*(x(d)-a(d))/(b(d)-a(d)) - ishift
294
if (ip>(N(d)-1)) then
298
xm = a(d) + im*(b(d)-a(d))/dble(N(d)-1)
299
xp = a(d) + ip*(b(d)-a(d))/dble(N(d)-1)
300
xtilde = (2.0d0*x(d) - xp - xm)/(xp-xm)
304
dbl_mb(pbasis(1)+2*i+ (d-1)*2*norder_max)
305
> = nwpw_interp_basis(i,xtilde)
306
dbl_mb(pbasis(1)+2*i+1+(d-1)*2*norder_max)
307
> = dx*nwpw_interp_dbasis(i,xtilde)
326
ii = ii + (jm(d)+j(d))*nn1
330
fi = dbl_mb(pbasis(1)+2*j(d+1)+1+d*2*norder_max)
333
fi = fi*dbl_mb(pbasis(1)+2*j(k+1)+k*2*norder_max)
335
df(d+1) = df(d+1) + mesh(ii+1)*fi
341
if (j(d).ge.norder_max) then