function vol = gquad2dgen(funxy,limxlow,limxhigh,ylow,yhigh,b1,w1,b2,w2)
%usage: vol = gquad2dgen(funxy,limxlow,limxhigh,ylow,yhigh,bpxv,wfxv,bpyv,wfyv);
% or
%usage: vol = gquad2dgen(funxy,limxlow,limxhigh,ylow,yhigh,nquadx,nquady);
%
% This function evaluates a general double integral. The limits of the
% inner integration may be functions of the outer integral's variable of
% integration. Such as
% yhigh ghigh(y)
% Vol = Int Int f(x,y) dx dy
% ylow glow(y)
% where
% funxy = f(x,y)
% limxlow = glow(y)
% limxhigh = ghigh(y)
% and the base points and weighting functions are found from
% [bpxv,wfxv,bpyv,wfyv]=grule2dgen(nquadx,nquady);
% where nquadx and nquady are the number of gauss points in the x- and
% y-directions, respectively.
%
% The first form of gquad2dgen is faster when used several times, because
% the points and weights are only calculated once.
%
% The second form of gquad2dgen is usefull if it is only called once (or a
% few times).
% by Bryce Gardner, Purdue University, Spring 1993
% extending Howard Wilson's (U. of Alabama, Spring 1990)
% set of 1-D Gauss quadrature routines to 2-dimensions.
if nargin == 7,
nquadx=b1;
nquady=w1;
[bpxv,wfxv,bpyv,wfyv]=grule2dgen(nquadx,nquady);
elseif nargin == 9,
bpxv = b1;
wfxv = w1;
bpyv = b2;
wfyv = w2;
else
disp('Wrong Number of Input Arguments')
return
end
nquady=length(bpyv);
qy=(yhigh-ylow)/2;
py=(yhigh+ylow)/2;
vol = 0;
for i=1:nquady,
y=qy*bpyv(i)+py;
xhigh=feval(limxhigh,y);
xlow=feval(limxlow,y);
vol = vol + wfyv(i) * gquad(funxy,xlow,xhigh,1,bpxv,wfxv,y);
end
vol = vol * qy;