1 subroutine r8mkbicub(x,nx,y,ny,f,nf2,
2 > ibcxmin,bcxmin,ibcxmax,bcxmax,
3 > ibcymin,bcymin,ibcymax,bcymax,
22 INTEGER,
PARAMETER :: R8=selected_real_kind(12,100)
53 REAL*8,
dimension(:,:),
allocatable :: fwk
54 real*8 :: zbcmin,zbcmax
55 integer ix,iy,ibcmin,ibcmax
57 real*8,
dimension(:,:,:),
allocatable :: fcorr
66 if(ibcymin.ne.-1)
then
67 if((ibcymin.eq.1).or.(ibcymin.eq.2))
then
69 if (bcymin(ix).ne.0.0_r8) iflg2=1
72 if((ibcymax.eq.1).or.(ibcymax.eq.2))
then
74 if (bcymax(ix).ne.0.0_r8) iflg2=1
83 call ibc_ck(ibcxmin,
'bcspline',
'xmin',-1,7,ier)
84 if(ibcxmin.ge.0)
call ibc_ck(ibcxmax,
'bcspline',
'xmax',0,7,ier)
85 call ibc_ck(ibcymin,
'bcspline',
'ymin',-1,7,ier)
86 if(ibcymin.ge.0)
call ibc_ck(ibcymax,
'bcspline',
'ymax',0,7,ier)
90 call r8splinck(x,nx,ilinx,1.0e-3_r8,ierx)
94 write(6,
'('' ?bcspline: x axis not strict ascending'')')
99 call r8splinck(y,ny,iliny,1.0e-3_r8,iery)
103 write(6,
'('' ?bcspline: y axis not strict ascending'')')
109 allocate(fwk(2,max(nx,ny)))
116 fwk(1,1:nx) = f(1,1:nx,iy)
117 if((ibcxmin.eq.1).or.(ibcxmin.eq.2)) zbcmin=bcxmin(iy)
118 if((ibcxmax.eq.1).or.(ibcxmax.eq.2)) zbcmax=bcxmax(iy)
119 call r8mkspline(x,nx,fwk,
120 > ibcxmin,zbcmin,ibcxmax,zbcmax,ilinx,ier)
122 f(2,1:nx,iy)=fwk(2,1:nx)
133 fwk(1,1:ny) = f(1,ix,1:ny)
135 if((ibcymin.eq.1).or.(ibcymin.eq.2)) ibcmin=0
136 if((ibcymax.eq.1).or.(ibcymax.eq.2)) ibcmax=0
138 call r8mkspline(y,ny,fwk,
139 > ibcmin,zbcmin,ibcmax,zbcmax,iliny,ier)
141 f(3,ix,1:ny)=fwk(2,1:ny)
152 fwk(1,1:ny) = f(2,ix,1:ny)
154 if((ibcymin.eq.1).or.(ibcymin.eq.2)) ibcmin=0
155 if((ibcymax.eq.1).or.(ibcymax.eq.2)) ibcmax=0
157 call r8mkspline(y,ny,fwk,
158 > ibcmin,zbcmin,ibcmax,zbcmax,iliny,ier)
160 f(4,ix,1:ny)= fwk(2,1:ny)
164 allocate(fcorr(2,nx,ny))
173 if(ibcymin.eq.1)
then
175 zdiff(1)=(f(1,ix,2)-f(1,ix,1))/hy +
176 > hy*(-2*f(3,ix,1)-f(3,ix,2))/6
177 zdiff(1)=bcymin(ix)-zdiff(1)
178 else if(ibcymin.eq.2)
then
179 zdiff(1)=bcymin(ix)-f(3,ix,1)
183 if(ibcymax.eq.1)
then
185 zdiff(2)=(f(1,ix,ny)-f(1,ix,ny-1))/hy +
186 > hy*(2*f(3,ix,ny)+f(3,ix,ny-1))/6
187 zdiff(2)=bcymax(ix)-zdiff(2)
188 else if(ibcymax.eq.2)
then
189 zdiff(2)=bcymax(ix)-f(3,ix,ny)
193 call r8mkspline(y,ny,fwk,ibcymin,zdiff(1),ibcymax,zdiff(2),
196 fcorr(1,ix,1:ny)=fwk(2,1:ny)
202 fwk(1,1:nx)=fcorr(1,1:nx,iy)
203 call r8mkspline(x,nx,fwk,ibcxmin,zbcmin,ibcxmax,zbcmax,
206 fcorr(2,1:nx,iy)=fwk(2,1:nx)
209 f(3:4,1:nx,1:ny)=f(3:4,1:nx,1:ny)+fcorr(1:2,1:nx,1:ny)