Skip to content
Snippets Groups Projects
line_average.m 3.75 KiB
Newer Older
Olivier Sauter's avatar
Olivier Sauter committed
function [nel_out,s_out,nes_out,varargout] = line_average(shot,time,Rdiag,Zdiag,ne_in,rhopol_in,Rmesh,Zmesh,psi_RZmesh,psi_axis,psi_edge);
%
% compute s and ne(s) in s_out and nes_out; where s is distance from first point into the plasma along Rdiag,Zdiag chord
% compute int[ne(s)ds]/int[ds] in nel_out
%
% can get Rmesh, Zmesh and psi_RZmesh from eqdsk at shot,time from gdat if not given, but for many times, should use equil output from gdat
%

nel_out = [];
s_out = [];
nes_out = [];

time_eff = time;

if ~exist('Rmesh') || isempty(Rmesh)
  % do only 1st time
  time_eff = time(1);
  ab=gdat(shot,'eqdsk','time',time_eff);
  eqdsk=ab.eqdsk;
  if isempty(Rdiag)
    % assume H-1 line
    par=sf2par('DCN',shot,'H1LFS_R','DCNgeo');
    Rlfs=par.value/1e3;
    par=sf2par('DCN',shot,'H1LFS_z','DCNgeo');
    Zlfs=par.value/1e3;
    par=sf2par('DCN',shot,'H1HFS_R','DCNgeo');
    Rhfs=par.value/1e3;
    par=sf2par('DCN',shot,'H1HFS_z','DCNgeo');
    Zhfs=par.value/1e3;
    Rdiag=[Rlfs Rhfs];
    Zdiag=[Zlfs Zhfs];
  end
  if length(Rdiag)==2
    nbpoints=50;
    Rout=linspace(Rdiag(1),Rdiag(2),nbpoints);
    Zout=linspace(Zdiag(1),Zdiag(2),nbpoints);
  elseif length(Rdiag)>10
    Rout=Rdiag;
    Zout=Zdiag;
  else
    disp(['unexpected nb of diag points: length(Rdiag) = ',length(Rdiag)]);
    return
  end
  Rmesh = eqdsk.rmesh;
  Zmesh = eqdsk.zmesh;
  psi_RZmesh(:,:,1) = eqdsk.psirz;
  psi_axis(1) = eqdsk.psiaxis;
  psi_edge(1) = eqdsk.psiedge;
end

if prod(size(Rmesh)) == max(size(Rmesh))
  Rmesh_eff = repmat(reshape(Rmesh,length(Rmesh),1),1,length(time_eff));
  Zmesh_eff = repmat(reshape(Zmesh,length(Zmesh),1),1,length(time_eff));
end

for it=1:length(time_eff)
  psi_at_routzout(:,it) = interpos2Dcartesian(Rmesh_eff(:,it),Zmesh(:,it),psi_RZmesh(:,:,it),Rout,Zout);
  ij_in=find((psi_at_routzout(:,it)-psi_axis(it)).*(psi_at_routzout(:,it)-psi_edge(it))<=0);
  if ~isempty(ij_in)
    if ij_in(1)==1
      Rstart=Rout(ij_in(1));
      Zstart=Zout(ij_in(1));
    else
      Rstart = (psi_edge(it)-psi_at_routzout(ij_in(1)-1),it)./diff(psi_at_routzout(ij_in(1)-1:ij_in(1),it)).*diff(Rout(ij_in(1)-1:ij_in(1))) + Rout(ij_in(1)-1);
      Zstart = (psi_edge(it)-psi_at_routzout(ij_in(1)-1),it)./diff(psi_at_routzout(ij_in(1)-1:ij_in(1),it)).*diff(Zout(ij_in(1)-1:ij_in(1))) + Zout(ij_in(1)-1);
    end
    if ij_in(end)==length(Rout)
      Rend=Rout(ij_in(end));
      Zend=Zout(ij_in(end));
    else
      Rend = (psi_edge(it)-psi_at_routzout(ij_in(end),it))./diff(psi_at_routzout(ij_in(end):ij_in(end)+1,it)).*diff(Rout(ij_in(end):ij_in(end)+1)) + Rout(ij_in(end));
      Zend = (psi_edge(it)-psi_at_routzout(ij_in(end),it))./diff(psi_at_routzout(ij_in(end):ij_in(end)+1,it)).*diff(Zout(ij_in(end):ij_in(end)+1)) + Zout(ij_in(end));
    end
    s_eff = sqrt((Rout(ij_in)-Rstart).^2 + (Zout(ij_in)-Zstart).^2);
    rhopol_eff=sqrt((psi_at_routzout(ij_in,it)-psi_axis(it))./(psi_edge(it)-psi_axis(it)));
    if ij_in(1)==1
      rhopol_eff = reshape(rhopol_eff,length(rhopol_eff),1);
      s_eff = reshape(s_eff,length(s_eff),1);
    else
      rhopol_eff=[1 ;reshape(rhopol_eff,length(rhopol_eff),1); 1];
      s_eff=[0 ;reshape(s_eff,length(s_eff),1); sqrt((Rend-Rstart).^2 + (Zend-Zstart).^2)];
    end
    [rho_in_eff,isort]=sort(rhopol_in(:,it));
    if rho_in_eff(1)<1e-3
      % assume 1st point is center
      nes = interpos(rho_in_eff,ne_in(isort,it),rhopol_eff,-0.1,[1 0],[0 0]);
    else
      rho_in_eff = [0 ; rho_in_eff];
      ne_in_eff = [ne_in(isort(1),it); ne_in(isort,it)];
      sigma_in = ones(size(ne_in_eff));
      sigma_in(1)=100;
      nes = interpos(rho_in_eff,ne_in_eff,rhopol_eff,-1,[1 0],[0 0],sigma_in);
    end
    nes_out(:,it) = nes;
    s_out(:,it) = s_eff;
    [dum1,~,~,nel_out_prof] = interpos(s_eff,nes,-0.1);
    nel_out(it) = nel_out_prof(end)./(s_eff(end)-s_eff(1));
  end
end