1 subroutine mkbicub(x,nx,y,ny,f,nf2,
2 > ibcxmin,bcxmin,ibcxmax,bcxmax,
3 > ibcymin,bcymin,ibcymax,bcymax,
52 real,
dimension(:,:),
allocatable :: fwk
54 integer ix,iy,ibcmin,ibcmax
56 real,
dimension(:,:,:),
allocatable :: fcorr
65 if(ibcymin.ne.-1)
then
66 if((ibcymin.eq.1).or.(ibcymin.eq.2))
then
68 if (bcymin(ix).ne.0.0) iflg2=1
71 if((ibcymax.eq.1).or.(ibcymax.eq.2))
then
73 if (bcymax(ix).ne.0.0) iflg2=1
82 call ibc_ck(ibcxmin,
'bcspline',
'xmin',-1,7,ier)
83 if(ibcxmin.ge.0)
call ibc_ck(ibcxmax,
'bcspline',
'xmax',0,7,ier)
84 call ibc_ck(ibcymin,
'bcspline',
'ymin',-1,7,ier)
85 if(ibcymin.ge.0)
call ibc_ck(ibcymax,
'bcspline',
'ymax',0,7,ier)
89 call splinck(x,nx,ilinx,1.0e-3,ierx)
93 write(6,
'('' ?bcspline: x axis not strict ascending'')')
98 call splinck(y,ny,iliny,1.0e-3,iery)
102 write(6,
'('' ?bcspline: y axis not strict ascending'')')
108 allocate(fwk(2,max(nx,ny)))
115 fwk(1,1:nx) = f(1,1:nx,iy)
116 if((ibcxmin.eq.1).or.(ibcxmin.eq.2)) zbcmin=bcxmin(iy)
117 if((ibcxmax.eq.1).or.(ibcxmax.eq.2)) zbcmax=bcxmax(iy)
118 call mkspline(x,nx,fwk,
119 > ibcxmin,zbcmin,ibcxmax,zbcmax,ilinx,ier)
121 f(2,1:nx,iy)=fwk(2,1:nx)
132 fwk(1,1:ny) = f(1,ix,1:ny)
134 if((ibcymin.eq.1).or.(ibcymin.eq.2)) ibcmin=0
135 if((ibcymax.eq.1).or.(ibcymax.eq.2)) ibcmax=0
137 call mkspline(y,ny,fwk,
138 > ibcmin,zbcmin,ibcmax,zbcmax,iliny,ier)
140 f(3,ix,1:ny)=fwk(2,1:ny)
151 fwk(1,1:ny) = f(2,ix,1:ny)
153 if((ibcymin.eq.1).or.(ibcymin.eq.2)) ibcmin=0
154 if((ibcymax.eq.1).or.(ibcymax.eq.2)) ibcmax=0
156 call mkspline(y,ny,fwk,
157 > ibcmin,zbcmin,ibcmax,zbcmax,iliny,ier)
159 f(4,ix,1:ny)= fwk(2,1:ny)
163 allocate(fcorr(2,nx,ny))
172 if(ibcymin.eq.1)
then
174 zdiff(1)=(f(1,ix,2)-f(1,ix,1))/hy +
175 > hy*(-2*f(3,ix,1)-f(3,ix,2))/6
176 zdiff(1)=bcymin(ix)-zdiff(1)
177 else if(ibcymin.eq.2)
then
178 zdiff(1)=bcymin(ix)-f(3,ix,1)
182 if(ibcymax.eq.1)
then
184 zdiff(2)=(f(1,ix,ny)-f(1,ix,ny-1))/hy +
185 > hy*(2*f(3,ix,ny)+f(3,ix,ny-1))/6
186 zdiff(2)=bcymax(ix)-zdiff(2)
187 else if(ibcymax.eq.2)
then
188 zdiff(2)=bcymax(ix)-f(3,ix,ny)
192 call mkspline(y,ny,fwk,ibcymin,zdiff(1),ibcymax,zdiff(2),
195 fcorr(1,ix,1:ny)=fwk(2,1:ny)
201 fwk(1,1:nx)=fcorr(1,1:nx,iy)
202 call mkspline(x,nx,fwk,ibcxmin,zbcmin,ibcxmax,zbcmax,
205 fcorr(2,1:nx,iy)=fwk(2,1:nx)
208 f(3:4,1:nx,1:ny)=f(3:4,1:nx,1:ny)+fcorr(1:2,1:nx,1:ny)