%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

function flux=mapflux_fast(cij,ri,zi,r,z,varargin)

% mapflux : carte de flux normalise (r,z) sur jet
%
% syntaxe :   flux=mapflux(cij,ri,zi,r,z)
%
% entrees :
% 	cij : coefficients bspline (efit/sspr(nr+nz+1:nr+nz+nc))
% 	ri  : points de controle pour r (efit/sspr(1:nr))
% 	zi  : points de controle pour z (efit/sspr(nr+1:nr+nz))
% 	r   : grille en r pour la carte de flux (vecteur)
% 	z   : grille en z pour la carte de flux (vecteur)
%
%    varargin{1}=1: output as diagonal of flux to get psin on (R,Z) set of points
%                0: output full matrix (default)
%    varargin{1}=1: limits spline calculation to relevant ri,zi points
%                   (useful when computing on a few (r,z) points)
%                   (default)
%               =0: compute all splines (slightly faster when whole grid needed)
%
% sortie :
% 	flux : matrice donnant le flux normalise sur la grille (r,z)
%~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
% auteur : patrick maget
% date : 13/10/2000
%~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
nr=length(ri);
nz=length(zi);
nrout=length(r);
nzout=length(z);
r=reshape(r,1,length(r));
z=reshape(z,1,length(z));
absplr=zeros(nrout,nr-4);
if nargin>6 & varargin{2}==0
  i1=1;
  i2=nr-4;
else
  ii=find(ri>=min(r));i1=ii(1);
  ii=find(ri>max(r));
  if ~isempty(ii)
    i2=ii(1);
  else
    i2=nr;
  end
end
for i=max(1,i1-4):min(nr-4,i2-1)
   absplr(:,i)=bsplinev(ri,r,3,i)';
end
absplz=zeros(nz-4,nzout);
if nargin>6 & varargin{2}==0
  i1=1;
  i2=nz-4;
else
  ii=find(zi>=min(z));i1=ii(1);
  ii=find(zi>max(z));
  if ~isempty(ii)
    i2=ii(1);
  else
    i2=nz;
  end
end
for j=max(1,i1-4):min(nz-4,i2-1)
  absplz(j,:)=bsplinev(zi,z,3,j);
end
cij2D=reshape(cij,nz-4,nr-4)';
flux=absplr*(cij2D*absplz);
if ~isempty(varargin) & varargin{1}
  flux=diag(flux);
end

%~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
% fonction b-spline
% bki=bspline(ti,t,k,i)
%~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
% auteur : patrick maget 
% date : 14/12/99
%~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
% retourne pour la valeur de i, 
% le vecteur de poids correspondant au vecteur de demande t
% seuls les elements de t situes entre ti(i) et ti(i+k+1) ont un poids non nul


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

function bki=bsplinev(ti,t,k,i)

if (i>=length(ti))
   bki=0.0;
elseif (k==0)
   bki= ((t>=ti(i))&(t<ti(i+1)));
 %  if ((t<ti(i)) | (t>=ti(i+1)))
 %     bki=0.0;
 %  else
 %     bki=1.0;
 %  end
else
   if (ti(i+k)==ti(i))
      fac1=0.0;
   else
      fac1=(t-ti(i))/(ti(i+k)-ti(i));
   end
   if (ti(i+k+1)==ti(i+1))
      fac2=0.0;
   else
      fac2=(ti(i+k+1)-t)/(ti(i+k+1)-ti(i+1));
   end
   bki=fac1.*bsplinev(ti,t,k-1,i)+fac2.*bsplinev(ti,t,k-1,i+1);
end
