diff --git a/JET/mapflux_fast.m b/JET/mapflux_fast.m new file mode 100644 index 0000000000000000000000000000000000000000..4cb5fee37af39cd8f7b0d8d3795e4c929ff8a41b --- /dev/null +++ b/JET/mapflux_fast.m @@ -0,0 +1,98 @@ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +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); +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));i2=ii(1); +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));i2=ii(1); +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 diff --git a/JET/psinrzjet.m b/JET/psinrzjet.m new file mode 100644 index 0000000000000000000000000000000000000000..09c82d122b0163b3dc511893a065479526752f4e --- /dev/null +++ b/JET/psinrzjet.m @@ -0,0 +1,128 @@ +function [r,z,psinrz,sspr,sspi]=psinrzjet(shot,time,nrg_rg,nzg_zg,efitlab,uid,seqd,varargin); +% +% psirz : reconstruction des surfaces de flux +% +% ce programme utilise les donnees de efit ou eftm +% +% examples: +% [r,z,psinrz,sspr,sspi]=psinrzjet(shot,time,nrg_rg,nzg_zg,[efitlab,uid,seq,ncont]); +% [r,z,psinrz,sspr,sspi]=psinrzjet(50814,60,65,65,[],[],[],60,sspr,sspi); % to get plot and give sspr,sspi +% [r,z,psinrz]=psinrzjet(50814,60.4,[3 3.2],[0 0.1],[],[],[],0,sspr,sspi,[],1); % +% +% entrees : +% shot : numero du choc jet +% time : time de l'analyse +% nrg_rg, nzg_zg: nb de points de la grille en r (resp. en z) sur laquelle on fait la +% reconstruction des surfaces de flux. +% if nzg_zg is negative, make symmetric box around zero +% if array, assumes rout and zout given firectly +% varargin{1}: plot option: 0: do not plot contours, >0 plot contour with varargin{1} nb of contours (60 is good) +% varargin{2}: sspr from ppf/efit/sspr, structure containing sspr.data and sspr.t +% varargin{3}: sspi from ppf/efit/sspi, structure containing sspi.data and sspi.t +% varargin{4}: deltaz +% varargin{5}: idiag: =1 : gives diag(psinrz) as output to give psi at (r,z) points +% idiag=0 (default) full matrix as output +% +% facultatifs : +% efitlab : efit ou eftm (efitlab=efit par defaut) +% uid : eventuellement, donnees ppf privees (uid='jetppf' par defaut). +% seq : "sequence number" de l'uid (0 par defaut -> version la plus recente) +% +% sorties : +% r, z : vecteurs de la grille (r,z) +% psinrz : matrice psin(r,z) (flux normalise) +% +%~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +if nargin<=4 | isempty(efitlab) + efitlab='efit'; +end +if nargin<=5 | isempty(uid) + uid='jetppf'; +end +if nargin<=6 | isempty(seqd) + seqd='0'; +end +ncont=0; +if nargin>=8 & ~isempty(varargin{1}) + ncont=varargin{1}; +end + +% equilibre magnetique +%--------------------- +if nargin>=9 & ~isempty(varargin{2}) + sspr=varargin{2}; +else + sspr=gdat(shot,'ppf',[efitlab '/sspr?uid=' uid '+seq=' seqd]); +end +ssprs=sspr.data; +tpefit=sspr.t; +if nargin>=10 & ~isempty(varargin{3}) + sspi=varargin{3}; +else + sspi=gdat(shot,'ppf',[efitlab '/sspi?uid=' uid '+seq=' seqd]); +end +sspis=sspi.data; +tpefit=sspi.t; +if nargin>=11 & ~isempty(varargin{4}) + deltaz=varargin{4}; +else + deltaz=0; +end +if nargin>=12 & ~isempty(varargin{5}) + idiag=varargin{5}; +else + idiag=0; +end + +[x,ind]=min(abs(time-tpefit)); +sspr_t=ssprs(:,ind); +sspi_t=sspis(:,ind); + +nr=sspi_t(1); +nz=sspi_t(2); +nc=sspi_t(3); +ri=sspr_t(1:nr); +zi=sspr_t((nr+1):(nr+nz)); +cij=sspr_t((nr+nz+1):(nr+nz+nc)); + +rmin=0.01*sspr_t(1); +rmax=0.01*sspr_t(nr); +zmin=0.01*sspr_t(nr+1); +zmax=0.01*sspr_t(nr+nz); + +rmin=rmin+1e-4; +rmax=rmax-1e-4; +zmin=zmin+1e-4; +zmax=zmax-1e-4; + +if length(nrg_rg)==1 & length(nzg_zg)==1 + r=linspace(rmin,rmax,nrg_rg); + z=linspace(zmin,zmax,abs(nzg_zg)); + if nzg_zg<0 + zlim=max(abs(zmin-deltaz),abs(zmax+deltaz)); + z=linspace(-zlim-deltaz,zlim-deltaz,abs(nzg_zg)); + end +else + r=nrg_rg; + z=nzg_zg; +end + +% mapflux contruit la carte de flux psin sur (r,z) +psinrz=mapflux_fast(cij,0.01*ri,0.01*zi,r,z,idiag); + +if ncont>0 + figure + contour(r,z,psinrz',ncont); + hold on + [h1, h2]=contour(r,z,psinrz',[1 1],'k'); + for i=1:length(h2) + set(h2(i),'LineWidth',2); + end + ss=sprintf('%.4f',time); + title(['JET #' num2str(shot) ' t= ' ss]) + xlabel('R [m]') + ylabel('Z [m]') + axis equal + axis([rmin rmax zmin zmax]) +end