diff --git a/JET/psirz.m b/JET/psirz.m new file mode 100644 index 0000000000000000000000000000000000000000..dc3296a0a8af4b14b4584bc53e13b2dce75fb194 --- /dev/null +++ b/JET/psirz.m @@ -0,0 +1,174 @@ +function [r,z,psinrz,sspr,sspi]=psirz(shot,time,nrg,nzg,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]=psirz(shot,time,nrg,nzg,[efitlab,uid,seq,ncont]); +% [r,z,psinrz,sspr,sspi]=psirz(50814,60,65,65,[],[],[],60,sspr,sspi); % to get plot and give sspr,sspi +% +% entrees : +% shot : numero du choc jet +% time : time de l'analyse +% nrg, nzg: nb de points de la grille en r (resp. en z) sur laquelle on fait la +% reconstruction des surfaces de flux. +% 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 +% +% 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; + +[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; + +r=linspace(rmin,rmax,nrg); +z=linspace(zmin,zmax,nzg); + +% mapflux contruit la carte de flux psin sur (r,z) +psinrz=mapflux(cij,0.01*ri,0.01*zi,r,z); + +if ncont>0 + figure + contour(r,z,psinrz',ncont); + hold on + [h1, h2]=contour(r,z,psinrz',[1 1]); + 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 + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +function flux=mapflux(cij,ri,zi,r,z) + +% 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) +% +% 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); +fpq=zeros(length(r),length(z)); +for i=1:(nr-4) + for j=1:(nz-4) + fpq=fpq+cij(j+(i-1)*(nz-4))*bsplinev(ri,r,3,i)'*bsplinev(zi,z,3,j); + end +end +flux=fpq; + +%~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +% 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