1 subroutine mktricub(x,nx,y,ny,z,nz,f,nf2,nf3,
2 > ibcxmin,bcxmin,ibcxmax,bcxmax,inb1x,
3 > ibcymin,bcymin,ibcymax,bcymax,inb1y,
4 > ibczmin,bczmin,ibczmax,bczmax,inb1z,
5 > ilinx,iliny,ilinz,ier)
53 integer ibcxmin,ibcxmax
54 integer ibcymin,ibcymax
55 integer ibczmin,ibczmax
57 real bcxmin(inb1x,nz),bcxmax(inb1x,nz)
58 real bcymin(inb1y,nz),bcymax(inb1y,nz)
59 real bczmin(inb1z,ny),bczmax(inb1z,ny)
115 real,
dimension(:,:,:),
allocatable :: fbicub
116 real,
dimension(:,:),
allocatable :: fwk
117 real,
dimension(:),
allocatable :: bcx1,bcx2,bcy1,bcy2
119 real,
dimension(:,:,:,:),
allocatable :: fcorr
120 real,
dimension(:,:),
allocatable :: bcc1,bcc2
122 integer iflg,ierx,iery,ierz
138 if(ibczmin.ne.-1)
then
139 if((ibczmin.eq.1).or.(ibczmin.eq.2))
then
142 if(bczmin(ix,iy).ne.0.0) iflg=1
146 if((ibczmax.eq.1).or.(ibczmax.eq.2))
then
149 if(bczmax(ix,iy).ne.0.0) iflg=1
156 write(6,
'('' ?mktricub: at least 2 x points required.'')')
160 write(6,
'('' ?mktricub: need at least 2 y points.'')')
164 write(6,
'('' ?mktricub: need at least 2 z points.'')')
168 if((ibcxmin.eq.1).or.(ibcxmax.eq.1).or.(ibcxmin.eq.2).or.
169 > (ibcxmax.eq.2))
then
173 >
'('.lt.
' ?mktricub: 1st dim of bcxmin/max arrays ny'')')
177 if((ibcymin.eq.1).or.(ibcymax.eq.1).or.(ibcymin.eq.2).or.
178 > (ibcymax.eq.2))
then
182 >
'('.lt.
' ?mktricub: 1st dim of bcymin/max arrays nx'')')
186 if((ibczmin.eq.1).or.(ibczmax.eq.1).or.(ibczmin.eq.2).or.
187 > (ibczmax.eq.2))
then
191 >
'('.lt.
' ?mktricub: 1st dim of bczmin/max arrays nx'')')
195 call ibc_ck(ibcxmin,
'mktricub',
'xmin',-1,7,ier)
196 if(ibcxmin.ge.0)
call ibc_ck(ibcxmax,
'mktricub',
'xmax',0,7,ier)
198 call ibc_ck(ibcymin,
'mktricub',
'ymin',-1,7,ier)
199 if(ibcymin.ge.0)
call ibc_ck(ibcymax,
'mktricub',
'ymax',0,7,ier)
201 call ibc_ck(ibczmin,
'mktricub',
'zmin',-1,7,ier)
202 if(ibczmax.ge.0)
call ibc_ck(ibczmax,
'mktricub',
'zmax',0,7,ier)
206 call splinck(x,nx,ilinx,ztol,ierx)
210 write(6,
'('' ?mktricub: x axis not strict ascending'')')
215 call splinck(y,ny,iliny,ztol,iery)
219 write(6,
'('' ?mktricub: y axis not strict ascending'')')
224 call splinck(z,nz,ilinz,ztol,ierz)
228 write(6,
'('' ?mktricub: z axis not strict ascending'')')
236 allocate(fbicub(4,nx,ny))
237 allocate(bcx1(ny),bcx2(ny),bcy1(nx),bcy2(nx))
238 bcx1=0.0; bcx2=0.0; bcy1=0.0; bcy2=0.0
241 if(ibcxmin.ne.-1)
then
242 if((ibcxmin.eq.1).or.(ibcxmin.eq.2))
then
243 bcx1(1:ny)=bcxmin(1:ny,iz)
245 if((ibcxmax.eq.1).or.(ibcxmax.eq.2))
then
246 bcx2(1:ny)=bcxmax(1:ny,iz)
249 if(ibcymin.ne.-1)
then
250 if((ibcymin.eq.1).or.(ibcymin.eq.2))
then
251 bcy1(1:nx)=bcymin(1:nx,iz)
253 if((ibcymax.eq.1).or.(ibcymax.eq.2))
then
254 bcy2(1:nx)=bcymax(1:nx,iz)
258 fbicub(1,1:nx,1:ny) = f(1,1:nx,1:ny,iz)
260 call mkbicub(x,nx,y,ny,fbicub,nx,
261 > ibcxmin,bcx1,ibcxmax,bcx2,
262 > ibcymin,bcy1,ibcymax,bcy2,
266 f(2:3,1:nx,1:ny,iz) = fbicub(2:3,1:nx,1:ny)
267 f(5,1:nx,1:ny,iz) = fbicub(4,1:nx,1:ny)
271 deallocate(fbicub,bcx1,bcx2,bcy1,bcy2)
281 if((ibczmin.eq.1).or.(ibczmin.eq.2)) ibc1=0
282 if((ibczmax.eq.1).or.(ibczmax.eq.2)) ibc2=0
290 fwk(1,1:nz) = f(1,ix,iy,1:nz)
291 call mkspline(z,nz,fwk,
292 > ibc1,zbc1,ibc2,zbc2,ilinz,ier)
294 f(4,ix,iy,1:nz) = fwk(2,1:nz)
296 fwk(1,1:nz) = f(2,ix,iy,1:nz)
297 call mkspline(z,nz,fwk,
298 > ibc1,zbc1,ibc2,zbc2,ilinz,ier)
300 f(6,ix,iy,1:nz) = fwk(2,1:nz)
302 fwk(1,1:nz) = f(3,ix,iy,1:nz)
303 call mkspline(z,nz,fwk,
304 > ibc1,zbc1,ibc2,zbc2,ilinz,ier)
306 f(7,ix,iy,1:nz) = fwk(2,1:nz)
308 fwk(1,1:nz) = f(5,ix,iy,1:nz)
309 call mkspline(z,nz,fwk,
310 > ibc1,zbc1,ibc2,zbc2,ilinz,ier)
312 f(8,ix,iy,1:nz) = fwk(2,1:nz)
323 allocate(fwk(2,max(nx,ny,nz)))
324 allocate(bcc1(nx,ny),bcc2(nx,ny))
325 allocate(fcorr(4,nx,ny,nz))
332 if(ibczmin.eq.1)
then
334 bcc1(ix,iy)=(f(1,ix,iy,2)-f(1,ix,iy,1))/hz +
335 > hz*(-2*f(4,ix,iy,1)-f(4,ix,iy,2))/6
336 bcc1(ix,iy)=bczmin(ix,iy)-bcc1(ix,iy)
337 else if(ibczmin.eq.2)
then
338 bcc1(ix,iy)=bczmin(ix,iy)-f(4,ix,iy,1)
346 if(ibczmax.eq.1)
then
348 bcc2(ix,iy)=(f(1,ix,iy,2)-f(1,ix,iy,1))/hz +
349 > hz*(-2*f(4,ix,iy,1)-f(4,ix,iy,2))/6
350 bcc2(ix,iy)=bczmax(ix,iy)-bcc2(ix,iy)
351 else if(ibczmax.eq.2)
then
352 bcc2(ix,iy)=bczmax(ix,iy)-f(4,ix,iy,1)
360 call mkspline(z,nz,fwk,
361 > ibczmin,bcc1(ix,iy),ibczmax,bcc2(ix,iy),ilinz,ier)
363 fcorr(1,ix,iy,1:nz)=fwk(2,1:nz)
374 fwk(1,1:nx)=fcorr(1,1:nx,iy,iz)
375 call mkspline(x,nx,fwk,
376 > ibcxmin,zbc1,ibcxmax,zbc2,ilinx,ier)
378 fcorr(2,1:nx,iy,iz)=fwk(2,1:nx)
384 fwk(1,1:ny)=fcorr(1,ix,1:ny,iz)
385 call mkspline(y,ny,fwk,
386 > ibcymin,zbc1,ibcymax,zbc2,iliny,ier)
388 fcorr(3,ix,1:ny,iz)=fwk(2,1:ny)
390 fwk(1,1:ny)=fcorr(2,ix,1:ny,iz)
391 call mkspline(y,ny,fwk,
392 > ibcymin,zbc1,ibcymax,zbc2,iliny,ier)
394 fcorr(4,ix,1:ny,iz)=fwk(2,1:ny)
403 f(4,ix,iy,iz)=f(4,ix,iy,iz)+fcorr(1,ix,iy,iz)
404 f(6,ix,iy,iz)=f(6,ix,iy,iz)+fcorr(2,ix,iy,iz)
405 f(7,ix,iy,iz)=f(7,ix,iy,iz)+fcorr(3,ix,iy,iz)
406 f(8,ix,iy,iz)=f(8,ix,iy,iz)+fcorr(4,ix,iy,iz)
411 deallocate(fwk,fcorr,bcc1,bcc2)