1 subroutine r8mkintrp3d(x,nx,y,ny,z,nz,jspline,
2 > f,icoeff,ixdim,iydim,izdim,
3 > ibcxmin,bcxmin,ibcxmax,bcxmax,
4 > ibcymin,bcymin,ibcymax,bcymax,
5 > ibczmin,bczmin,ibczmax,bczmax,
14 INTEGER,
PARAMETER :: R8=selected_real_kind(12,100)
44 real*8 f(icoeff,ixdim,iydim,izdim)
51 integer ibcxmin,ibcxmax
52 integer ibcymin,ibcymax
53 integer ibczmin,ibczmax
55 REAL*8 bcxmin(iydim,izdim),bcxmax(iydim,izdim)
56 real*8 bcymin(ixdim,izdim),bcymax(ixdim,izdim)
57 real*8 bczmin(ixdim,iydim),bczmax(ixdim,iydim)
103 integer :: ii,jj,imul,imin,imax,ickx,icky,ickz,inum
104 integer :: idum1,idum2,idum3,idimcu
105 integer :: ipx,ipy,ipz
106 REAL*8 :: ztol = 0.0001_r8
107 logical :: ifound(-1:2)
109 real*8,
dimension(:,:),
allocatable :: wk2
110 real*8,
dimension(:,:,:),
allocatable :: wk3
123 imin=min(imin,jspline(ii))
124 imax=max(imax,jspline(ii))
125 if(jspline(ii).gt.0)
then
129 if(.not.ifound(jspline(ii)))
then
130 ifound(jspline(ii)) = .true.
135 if((imin.lt.-1).or.(imax.gt.2))
then
138 >
' ?mkintrp3d: spline type control out of range -1 to 2: ',
147 if(ifound(1).and.ifound(2))
then
150 >
' ?mkintrp3d: spline/Hermite hybrid not supported (',
156 if(imul.ne.icoeff)
then
158 >
' ?coeff dimension inconsistency for spline type codes ',
160 write(6,*)
' in mkintrp3d: expected: ',imul,
' got: ',icoeff
168 if(jspline(1).eq.-1)
then
174 if(jspline(2).eq.-1)
then
180 if(jspline(3).eq.-1)
then
186 if((ickx.ne.ixdim).or.(icky.ne.iydim).or.(ickz.ne.izdim))
then
188 >
' ?mkintrp2d: dimensioning inconsistent with '//
189 >
'interpolation controls: ',jspline
190 write(6,*)
' expected: ',ickx,icky,ickz,
191 >
'; got: ',ixdim,iydim,izdim
196 if(jspline(1).le.0)
then
197 call r8splinck(x,nx,idum1,ztol,ier)
199 write(6,*)
' ?mkintrp2d: x axis not strict ascending.'
204 if(jspline(2).le.0)
then
205 call r8splinck(y,ny,idum1,ztol,ier)
207 write(6,*)
' ?mkintrp2d: y axis not strict ascending.'
212 if(jspline(3).le.0)
then
213 call r8splinck(z,nz,idum1,ztol,ier)
215 write(6,*)
' ?mkintrp2d: z axis not strict ascending.'
225 if(jspline(1).eq.1)
then
226 if((min(ibcxmin,ibcxmax).lt.-1).or.
227 > (max(ibcxmin,ibcxmax).gt.1))
then
228 write(6,*)
' ?mkintrp2d: Bdy Cond code out of range for'
229 write(6,*)
' Hermite interpolation; (-1:1) allowed, '//
230 >
'found: ',ibcxmin,ibcxmax
235 if(ibcxmin.eq.-1)
then
237 else if((ibcxmin.eq.1).or.(ibcxmax.eq.1))
then
242 if(jspline(2).eq.1)
then
243 if((min(ibcymin,ibcymax).lt.-1).or.
244 > (max(ibcymin,ibcymax).gt.1))
then
245 write(6,*)
' ?mkintrp2d: Bdy Cond code out of range for'
246 write(6,*)
' Hermite interpolation; (-1:1) allowed, '//
247 >
'found: ',ibcymin,ibcymax
252 if(ibcymin.eq.-1)
then
254 else if((ibcymin.eq.1).or.(ibcymax.eq.1))
then
259 if(jspline(3).eq.1)
then
260 if((min(ibczmin,ibczmax).lt.-1).or.
261 > (max(ibczmin,ibczmax).gt.1))
then
262 write(6,*)
' ?mkintrp2d: Bdy Cond code out of range for'
263 write(6,*)
' Hermite interpolation; (-1:1) allowed, '//
264 >
'found: ',ibczmin,ibczmax
269 if(ibczmin.eq.-1)
then
271 else if((ibczmin.eq.1).or.(ibczmax.eq.1))
then
276 if(kspline.eq.1)
then
280 call r8util_bcherm3(f, ixdim, iydim, izdim,
281 > ibcxmin,ibcxmax, ibcymin,ibcymax, ibczmin,ibczmax,
282 > bcxmin, bcxmax, bcymin, bcymax, bczmin, bczmax,
285 call r8akherm3p(x,ixdim, y,iydim, z,izdim, f,ixdim,iydim,
286 > idum1,idum2,idum3, ipx,ipy,ipz, ier)
288 else if(kspline.eq.2)
then
291 call r8mktricub(x,nx,y,ny,z,nz,
293 > ibcxmin,bcxmin,ibcxmax,bcxmax,iydim,
294 > ibcymin,bcymin,ibcymax,bcymax,ixdim,
295 > ibczmin,bczmin,ibczmax,bczmax,ixdim,
296 > idum1,idum2,idum3, ier)
303 if(jspline(1).gt.0)
then
307 if(jspline(1).eq.1)
then
308 call r8util_bcherm1(f(1,1,ii,jj), ixdim,
310 > bcxmin(ii,jj), bcxmax(ii,jj), x)
311 call r8akherm1p(x,ixdim,f(1,1,ii,jj),idum1,ipx,
314 else if(jspline(1).eq.2)
then
315 call r8mkspline(x,ixdim,f(1,1,ii,jj),
316 > ibcxmin,bcxmin(ii,jj),
317 > ibcxmax,bcxmax(ii,jj),
325 else if(jspline(2).gt.0)
then
331 wk2(1,1:iydim) = f(1,ii,1:iydim,jj)
332 wk2(2,1:iydim) = 0.0_r8
333 if(jspline(2).eq.1)
then
334 call r8util_bcherm1(wk2, iydim,
336 > bcymin(ii,jj), bcymax(ii,jj), y)
337 call r8akherm1p(y,iydim,wk2,idum2,ipy,ier)
339 else if(jspline(2).eq.2)
then
340 call r8mkspline(y,iydim,wk2,
341 > ibcymin,bcymin(ii,jj),
342 > ibcymax,bcymax(ii,jj),
347 f(1:2,ii,1:iydim,jj) = wk2(1:2,1:iydim)
360 wk2(1,1:izdim) = f(1,ii,jj,1:izdim)
361 wk2(2,1:izdim) = 0.0_r8
362 if(jspline(3).eq.1)
then
363 call r8util_bcherm1(wk2, izdim,
365 > bczmin(ii,jj), bczmax(ii,jj), z)
366 call r8akherm1p(z,izdim,wk2,idum2,ipz,ier)
368 else if(jspline(3).eq.2)
then
369 call r8mkspline(z,izdim,wk2,
370 > ibczmin,bczmin(ii,jj),
371 > ibczmax,bczmax(ii,jj),
376 f(1:2,ii,jj,1:izdim) = wk2(1:2,1:izdim)
386 if(jspline(3).le.0)
then
388 if(jspline(1).eq.1)
then
389 call r8util_bcherm2(f(1,1,1,ii),ixdim,iydim,
390 > ibcxmin, ibcxmax, ibcymin, ibcymax,
391 > bcxmin(1,ii), bcxmax(1,ii),
392 > bcymin(1,ii), bcymax(1,ii),
394 call r8akherm2p(x,ixdim,y,iydim,f(1,1,1,ii),ixdim,
395 > idum1,idum2,ipx,ipy,ier)
397 call r8mkbicub(x,ixdim,y,iydim,f(1,1,1,ii),ixdim,
398 > ibcxmin, bcxmin(1,ii), ibcxmax, bcxmax(1,ii),
399 > ibcymin, bcymin(1,ii), ibcymax, bcymax(1,ii),
405 else if(jspline(2).le.0)
then
406 allocate(wk3(4,nx,nz))
409 wk3 = f(1:4,1:nx,ii,1:nz)
410 if(jspline(1).eq.1)
then
411 call r8util_bcherm2(wk3,ixdim,izdim,
412 > ibcxmin, ibcxmax, ibczmin, ibczmax,
413 > bcxmin(ii,1:nz), bcxmax(ii,1:nz),
414 > bczmin(1,ii), bczmax(1,ii), x, z)
415 call r8akherm2p(x,ixdim,z,izdim,wk3,ixdim,
416 > idum1,idum2,ipx,ipz,ier)
418 call r8mkbicub(x,ixdim,z,izdim,wk3,ixdim,
419 > ibcxmin,bcxmin(ii,1:nz),
420 > ibcxmax,bcxmax(ii,1:nz),
421 > ibczmin,bczmin(1,ii), ibczmax,bczmax(1,ii),
425 f(1:4,1:nx,ii,1:nz) = wk3
431 allocate(wk3(4,ny,nz))
434 wk3 = f(1:4,ii,1:ny,1:nz)
435 if(jspline(2).eq.1)
then
436 call r8util_bcherm2(wk3,iydim,izdim,
437 > ibcymin, ibcymax, ibczmin, ibczmax,
438 > bcymin(ii,1:nz), bcymax(ii,1:nz),
439 > bczmin(ii,1:ny), bczmax(ii,1:ny), y, z)
440 call r8akherm2p(y,iydim,z,izdim,wk3,iydim,
441 > idum1,idum2,ipy,ipz,ier)
443 call r8mkbicub(y,iydim,z,izdim,wk3,iydim,
444 > ibcymin,bcymin(ii,1:nz),
445 > ibcymax,bcymax(ii,1:nz),
446 > ibczmin,bczmin(ii,1:ny),
447 > ibczmax,bczmax(ii,1:ny),
451 f(1:4,ii,1:ny,1:nz) = wk3