Skip to content
Snippets Groups Projects
geteqdskAUG.m 7.05 KiB
Newer Older
function [eqdskAUG, equil_all_t, equil_t_index]=geteqdskAUG(shot,time,zshift,varargin);
% [eqdskAUG, equil_all_t, equil_t_index]=geteqdskAUG(shot,time,zshift,varargin);
%
% if shot is a structure assumes obtained from gdat(shot,'equil',...);
% varargin{1:2}: 'source','EQI' (default) or 'source','IDE'  (used in gdat(...,'equil') )
% varargin{3:4}: 'extra_arg_sf2sig','[]' (default) or 'extra_arg_sf2sig','''-ed'',2'
% varargin{5:6}: 'fignb',ii (default is a new fig each time, if a number is given it over plots on this figure, needed if called in series)
%
% [eqdskAUG, equil_all_t, equil_t_index]=geteqdskAUG(shot,time);
% [eqdskAUG, equil_all_t, equil_t_index]=geteqdskAUG(shot,time,[],'source','IDE');
%
%     write_eqdsk('fname',eqdskAUG,17); % EQI is COCOS=17 by default
%     write_eqdsk('fname',eqdskAUG,[17 11]); % if you want an ITER version with COCOS=11
  disp('requires a shot or equil structure from gdat(shot,''equil'',...) in geteqdskAUG')
  return
end

  time_eff = 2.0;
else
  time_eff = time;
end

if ~exist('zshift') || isempty(zshift) || ~isnumeric(zshift)
if nargin >= 5 && ~isempty(varargin{1}) && strcmp(lower(varargin{1}),'source')
    equil_source = varargin{2};
  else
    disp(['Warning source for equil in geteqdskAUG not defined']);
    return;
  end
else
  equil_source = 'EQI';
end
equilpar_source = 'FPG';
if strcmp(upper(equil_source),'IDE');   equilpar_source = 'IDG'; end
if strcmp(upper(equil_source),'EQI');   equilpar_source = 'GQI'; end
if strcmp(upper(equil_source),'EQH');   equilpar_source = 'GQH'; end
if strcmp(upper(equil_source),'TRA');   equilpar_source = 'TRE'; end
if nargin >= 7 && ~isempty(varargin{3}) && strcmp(lower(varargin{3}),'extra_arg_sf2sig')
  if ~isempty(varargin{4})
    extra_arg_sf2sig = varargin{4};
  else
    disp(['Warning extra_arg_sf2sig in geteqdskAUG not defined']);
    return;
  end
else
  extra_arg_sf2sig = '[]';
end

if nargin >= 9 && ~isempty(varargin{5}) && strcmp(lower(varargin{5}),'fignb')
  if ~isempty(varargin{6})
    fignb = varargin{6};
  else
    disp(['Warning fignb in geteqdskAUG not defined']);
    return;
  end
else
  fignb = [];
end

  equil=gdat_aug(shot,'equil','equil',equil_source,'extra_arg_sf2sig',extra_arg_sf2sig);
end
[zz it]=min(abs(equil.t-time_eff));

equil_all_t = equil;
equil_t_index = it;

eqdsk.nr = size(equil.Rmesh,1);
eqdsk.nz = size(equil.Zmesh,1);
eqdsk.rmesh = equil.Rmesh(:,it);
eqdsk.zmesh = equil.Zmesh(:,it) - zshift_eff;
eqdsk.zshift = zshift_eff;
eqdsk.psi = equil.psi2D(:,:,it);
eqdsk.psirz = equil.psi2D(:,:,it);
eqdsk.rboxlen = equil.Rmesh(end,it) - equil.Rmesh(1,it) ;
eqdsk.rboxleft=eqdsk.rmesh(1);
eqdsk.zboxlen = equil.Zmesh(end,it) - equil.Zmesh(1,it) ;
eqdsk.zmid = 0.5*(equil.Zmesh(end,it) + equil.Zmesh(1,it)) ;
eqdsk.psiaxis = equil.psi_axis(it);
eqdsk.psiedge = equil.psi_lcfs(it);
ixpoint = 2;
if abs(equil.Xpoints.psi(ixpoint,it)-eqdsk.psiedge) < 0.1.*abs(eqdsk.psiedge-eqdsk.psiaxis)
  eqdsk.psiedge = equil.Xpoints.psi(ixpoint,it);
end
% need psimesh ot be equidistant and same nb of points as nr
eqdsk.psimesh=linspace(0,1,eqdsk.nr)';
eqdsk.rhopsi = sqrt(eqdsk.psimesh);
% psimesh assumed from 0 on axis (so psi_edge is delta_psi) to have correct d/dpsi but to have sign(dpsi) easily
% (psimesh from 0 to 1) eqdsk.psimesh = (eqdsk.psiedge-eqdsk.psiaxis) .* eqdsk.psimesh;
eqdsk.p = interpos(equil.rhopolnorm(:,it),equil.pressure(:,it),eqdsk.rhopsi,-0.01,[1 2],[0 equil.pressure(end,it)]);
eqdsk.pprime = interpos(equil.rhopolnorm(:,it),equil.dpressuredpsi(:,it),eqdsk.rhopsi,-0.01,[1 2],[0 equil.dpressuredpsi(end,it)]);
eqdsk.FFprime = interpos(equil.rhopolnorm(:,it),equil.ffprime(:,it),eqdsk.rhopsi,-0.01,[1 2],[0 equil.ffprime(end,it)]);
if abs(equil.qvalue(end,it)) > 25
  eqdsk.q = interpos(21,equil.rhopolnorm(:,it),equil.qvalue(:,it),eqdsk.rhopsi);
else
  eqdsk.q = interpos(equil.rhopolnorm(:,it),equil.qvalue(:,it),eqdsk.rhopsi,-0.01,[1 2],[0 equil.qvalue(end,it)]);
if strcmp(upper(equil_source),'IDE');
  % q of IDE ids abs(q), add sign from EQI
  q95_eqi=gdat_aug(shot,{'GQI','q95'},'extra_arg_sf2sig',extra_arg_sf2sig);
  eqdsk.q = abs(eqdsk.q) * sign(q95_eqi.data(round(length(q95_eqi.data)/2)));
end
eqdsk.ip = equil.Ip(it);
eqdsk.stitle=['#' num2str(shot) ' t=' num2str(time_eff) ' from ' equil.gdat_params.exp_name '/' equil.gdat_params.equil];
eqdsk.ind1=1;

psisign = sign(eqdsk.psimesh(end)-eqdsk.psimesh(1));
[dum1,dum2,dum3,F2_05]=interpos(psisign.*eqdsk.psimesh,eqdsk.FFprime,-0.01);
[zz itb0]=min(abs(b0.t-time_eff));
eqdsk.b0 = b0.data(itb0);
eqdsk.r0 = 1.65;
fedge=eqdsk.r0.*eqdsk.b0;
F2 = psisign.*2.*F2_05 + fedge.^2;
eqdsk.F = sqrt(F2)*sign(eqdsk.b0);
rmag=gdat_aug(shot,'rmag','source',equilpar_source,'extra_arg_sf2sig',extra_arg_sf2sig);
[zz itrmag]=min(abs(rmag.t-time_eff));
eqdsk.raxis = rmag.data(itrmag);
zmag=gdat_aug(shot,'zmag','source',equilpar_source,'extra_arg_sf2sig',extra_arg_sf2sig);
eqdsk.zaxis = zmag.data(itrmag) - eqdsk.zshift;

% get plasma boundary
doplot = 1;
if isnumeric(fignb) && fignb <= 0
  doplot = 0;
elseif isempty(fignb) || (isnumeric(fignb) && fignb < 1) || (~isnumeric(fignb) && ~ishandle(fignb)) 
  fignb_handle = gcf;
  set(gcf,'Name','from geteqdskAUG');
  fignb_handle = gcf;
  clf
  set(gcf,'Name','from geteqdskAUG');
end

if doplot
  contour(eqdsk.rmesh,eqdsk.zmesh,eqdsk.psi',100)
  hold on
end
psiedge_eff = 0.001*eqdsk.psiaxis + 0.999*eqdsk.psiedge; % note for IDE psi edge is already 99%
%ixpoint=iround_os(equil.Xpoints.psi(:,it),eqdsk.psiedge);
if abs(equil.Xpoints.psi(ixpoint,it)-eqdsk.psiedge) < 0.1.*abs(eqdsk.psiedge-eqdsk.psiaxis)
  psiedge_eff = 0.002*eqdsk.psiaxis + 0.998*equil.Xpoints.psi(ixpoint,it);
end
if doplot
  [hh1 hh2]=contour(eqdsk.rmesh,eqdsk.zmesh,eqdsk.psi',[psiedge_eff psiedge_eff],'k');
  axis equal
else
  [hh1]=contourc(eqdsk.rmesh,eqdsk.zmesh,eqdsk.psi',[psiedge_eff psiedge_eff]);
end
if ~isempty(hh1)
  ij=1;
  ij_prev = 0;
  nbhh1(ij)=hh1(2,ij_prev+1);
  Rbnd{ij}=hh1(1,2:1+nbhh1(ij));
  Zbnd{ij}=hh1(2,2:1+nbhh1(ij));
  ij_prev = ij_prev+1+nbhh1(ij);
  while (ij_prev+1<size(hh1,2))
    % next
    ij=ij + 1;
    nbhh1(ij)=hh1(2,ij_prev+1);
    Rbnd{ij}=hh1(1,ij_prev+2:ij_prev+1+nbhh1(ij));
    Zbnd{ij}=hh1(2,ij_prev+2:ij_prev+1+nbhh1(ij));
    ij_prev = ij_prev+1+nbhh1(ij);
  end
  % assume LCFS with most points
  [zzz irz]=max(nbhh1);
  eqdsk.nbbound = nbhh1(irz);
  eqdsk.rplas = Rbnd{irz}';
  eqdsk.zplas = Zbnd{irz}';
  if doplot
    plot(eqdsk.rplas,eqdsk.zplas,'k-')
  end
else
  eqdsk.nbbound = [];
  eqdsk.rplas = [];
  eqdsk.zplas = [];

[aget]=which('geteqdskAUG');
[path1,name2,ext3]=fileparts(aget);
eval(['load ' fullfile(path1,'AUG_innerouterwall.data')])
eqdsk.nblim=size(AUG_innerouterwall,1);
eqdsk.rlim=AUG_innerouterwall(:,1);
eqdsk.zlim=AUG_innerouterwall(:,2);
if doplot
  plot(eqdsk.rlim,eqdsk.zlim,'k-')
  title(eqdsk.stitle)
end
eqdskAUG = eqdsk;