Skip to content
Snippets Groups Projects
Commit ef84f93c authored by Francesco Carpanese's avatar Francesco Carpanese
Browse files

First commit of routines to get data from TCV mds and put in ids structures.

Started with the minimum requests.
Need to have a file with the empty structures.



git-svn-id: https://spcsvn.epfl.ch/repos/TCV/gdat/trunk@11358 d63d8f72-b253-0410-a779-e742ad2e26cf
parent 152ba4d3
Branches
Tags
No related merge requests found
function [ids_structures] = get_ids(shot)
load('ids_structures_20190128.mat')
addpath(genpath(pwd))
ids_structures.magnetics.bpol_probe = imasget_bpol_probe(shot, ids_structures);
ids_structures.magnetics.flux_loop = imasget_flux_loop(shot, ids_structures);
ids_structures.magnetics.method = imasget_ip(shot, ids_structures);
ids_structures.pf_active.circuit = imasget_circuit(shot, ids_structures);
ids_structures.pf_active.coil = imasget_coil(shot, ids_structures);
ids_structures.wall.description_2d = imasget_description_2d(shot, ids_structures);
end
\ No newline at end of file
function [ids_struct_out] = imasget_bpol_probe(shot, ids_structures)
% Get bpol probes
ids_struct_out = {};
mdsopen(shot);
tmp = gdat( shot, '\MAGNETICS::BPOL_003');
% Get dimension
Nprobes = size(tmp.data,2);
Ntime = size(tmp.data,1);
names = tmp.dim{2};
time = tmp.dim{1};
data = tmp.data;
% Preallocate dimension
ids_struct_out(1:Nprobes) = ids_structures.magnetics.bpol_probe(1);
for ii=1:Nprobes
ids_struct_out{ii} = ids_structures.magnetics.bpol_probe{1};
ids_struct_out{ii}.name = [names{ii}];
ids_struct_out{ii}.position.r = mdsvalue('STATIC("R_M" )[$1]',ids_struct_out{ii}.name);
ids_struct_out{ii}.position.z = mdsvalue('STATIC("Z_M" )[$1]',ids_struct_out{ii}.name);
ids_struct_out{ii}.field.data = data(:,ii);
ids_struct_out{ii}.field.time = time;
%ids_struct_out{ii}.position.toroidal_angle = mdsdata('STATIC("ANG_M" )[$1]',ids_struct_out{ii}.position.name);
%ids_struct_out{ii}.position.poloidal_angle = 0; % TO BE FOUND
%ids_struct_out{ii}.position.field.data_error_upper = % TO BE FOUND;
%ids_struct_out{ii}.position.field.data_error_upper = % TO BE FOUND;
end
function ids_struct_out = imasget_flux_loop(shot, ids_structures)
% Get the bpol_probe signals into IDS structure
ids_struct_out = {};
mdsopen(shot);
tmp = gdat(shot, 'tcv_idealloop("FLUX")');
% Get dimension
Nprobes = size(tmp.data,2);
Ntime = size(tmp.data,1);
names = tmp.dim{2};
time = tmp.dim{1};
data = tmp.data;
% Preallocate dimension
ids_struct_out(1:Nprobes) = ids_structures.magnetics.flux_loop(1);
% Get all the data
for ii=1:Nprobes
ids_struct_out{ii}.name = [names{ii}];
ids_struct_out{ii}.position{1}.r = mdsvalue('STATIC("R_F" )[$1]',ids_struct_out{ii}.name);
ids_struct_out{ii}.position{1}.z = mdsvalue('STATIC("Z_F" )[$1]',ids_struct_out{ii}.name);
ids_struct_out{ii}.flux.data = data(:,ii);
ids_struct_out{ii}.flux.time = time;
%ids_struct_out{ii}.position.phi = 0; % TO BE FOUND
%ids_struct_out{ii}.flux.data_error_upper = % TO BE FOUND;
%ids_struct_out{ii}.flux.data_error_lower = % TO BE FOUND;
end
function [ids_struct_out] = imasget_ip(shot, ids_structures)
% Get the bpol_probe signals into IDS structure
mdsopen(shot);
tmp = gdat( shot, 'ip_trapeze');
% Get dimension
Ntime = size(tmp.data,1);
time = tmp.dim{1};
data = tmp.data;
% Preallocate dimension
ids_struct_out = ids_structures.magnetics.method(1);
ids_struct_out{1}.ip.data = data;
ids_struct_out{1}.ip.time = time;
function [ids_struct_out] = imasget_circuit(shot, ids_structures)
mdsopen(shot)
%% Get power supply/coils names for each circuit.
[coil_names2ids, power_supply_names2ids, circuit_names2ids, mds_paths2ids, ~] = pf_active_definition();
% Get dimension
ncircuits2ids = numel(circuit_names2ids);
ids_struct_out(1:ncircuits2ids) = ids_structures.pf_active.circuit(1);
for ii=1:ncircuits2ids
tmpdata = tdi(mds_paths2ids{ii});
ids_struct_out{ii}.current.data = tmpdata.data;
ids_struct_out{ii}.current.time = tmpdata.dim{1};
%ids_struct_out{ii}.connection =
end
%%
%{
% 19 circuits + TF (19 rectifiers power supplies) + FPS
% Same order as power supplies
% nnodes: Number of nodes used to describe each the circuits.
% If circuit is series connected then nnodes = (ncoils + npowersupply)
% All circuit are series connected in TCV and has only one power supply
% therefore for a given circuit nnode = ncoils +1;
nnodes = [2,7,repmat(2,1,16),7,4];
value = nnodes;
npfs=length(namepfs); % Number of power supplies
npfc=length(namepfc); % Number of coils
ncomponents = npfs + npfc; % 20 supplies + 32 coils = 52 components
value = zeros(ncircuits,max(nnodes),2*ncomponents); % [20 x 7 x 104]
% Create varibales with indices
for l=1:npfs
eval(sprintf('s%sin=2*%d-1;',namepfs{l},l));
eval(sprintf('s%sout=2*%d;',namepfs{l},l));
end
for l=1:npfc
eval(sprintf('c%sin=2*npfs+2*%d-1;',namepfc{l},l));
eval(sprintf('c%sout=2*npfs+2*%d;',namepfc{l},l));
end
% OH1
icircuit=1;
value(icircuit,1,[sOH_001out,cA_001in]) = 1;
value(icircuit,2,[cA_001out,sOH_001in]) = 1;
% OH2
icircuit=2;
value(icircuit,1,[sOH_002out,cB_001in]) = 1;
value(icircuit,2,[cB_001out, cC_001in]) = 1;
value(icircuit,3,[cC_001out, cD_001in]) = 1;
value(icircuit,4,[cD_001out, cD_002in]) = 1;
value(icircuit,5,[cD_002out, cC_002in]) = 1;
value(icircuit,6,[cC_002out, cB_002in]) = 1;
value(icircuit,7,[cB_002out,sOH_002in]) = 1;
% E_001
icircuit=3;
value(icircuit,1,[sE_001out,cE_001in]) = 1;
value(icircuit,2,[cE_001out,sE_001in]) = 1;
% E_002
icircuit=4;
value(icircuit,1,[sE_002out,cE_002in]) = 1;
value(icircuit,2,[cE_002out,sE_002in]) = 1;
% E_003
icircuit=5;
value(icircuit,1,[sE_003out,cE_003in]) = 1;
value(icircuit,2,[cE_003out,sE_003in]) = 1;
% E_004
icircuit=6;
value(icircuit,1,[sE_004out,cE_004in]) = 1;
value(icircuit,2,[cE_004out,sE_004in]) = 1;
% E_005
icircuit=7;
value(icircuit,1,[sE_005out,cE_005in]) = 1;
value(icircuit,2,[cE_005out,sE_005in]) = 1;
% E_006
icircuit=8;
value(icircuit,1,[sE_006out,cE_006in]) = 1;
value(icircuit,2,[cE_006out,sE_006in]) = 1;
% E_007
icircuit=9;
value(icircuit,1,[sE_007out,cE_007in]) = 1;
value(icircuit,2,[cE_007out,sE_007in]) = 1;
% E_008
icircuit=10;
value(icircuit,1,[sE_008out,cE_008in]) = 1;
value(icircuit,2,[cE_008out,sE_008in]) = 1;
% F_001
icircuit=11;
value(icircuit,1,[sF_001out,cF_001in]) = 1;
value(icircuit,2,[cF_001out,sF_001in]) = 1;
% F_002
icircuit=12;
value(icircuit,1,[sF_002out,cF_002in]) = 1;
value(icircuit,2,[cF_002out,sF_002in]) = 1;
% F_003
icircuit=13;
value(icircuit,1,[sF_003out,cF_003in]) = 1;
value(icircuit,2,[cF_003out,sF_003in]) = 1;
% F_004
icircuit=14;
value(icircuit,1,[sF_004out,cF_004in]) = 1;
value(icircuit,2,[cF_004out,sF_004in]) = 1;
% F_005
icircuit=15;
value(icircuit,1,[sF_005out,cF_005in]) = 1;
value(icircuit,2,[cF_005out,sF_005in]) = 1;
% F_006
icircuit=16;
value(icircuit,1,[sF_006out,cF_006in]) = 1;
value(icircuit,2,[cF_006out,sF_006in]) = 1;
% F_007
icircuit=17;
value(icircuit,1,[sF_007out,cF_007in]) = 1;
value(icircuit,2,[cF_007out,sF_007in]) = 1;
% F_008
icircuit=18;
value(icircuit,1,[sF_008out,cF_008in]) = 1;
value(icircuit,2,[cF_008out,sF_008in]) = 1;
% G_001/FPS
icircuit=19;
value(icircuit,1,[sG_001out, cG_001in]) = 1;
value(icircuit,2,[cG_001out,cG_002in]) = 1;
value(icircuit,3,[cG_002out,cG_003in]) = 1;
value(icircuit,4,[cG_003out,cG_004out])= 1; % Lower coils connected in the
value(icircuit,5,[cG_004in,cG_005out]) = 1; % opposite direction
value(icircuit,6,[cG_005in,cG_006out]) = 1;
value(icircuit,7,[cG_006in, sG_001in]) = 1;
% BCOIL
icircuit=20;
value(icircuit,1,[sBCOILout, cT_001in]) = 1;
value(icircuit,2,[cT_001out, cT_002in]) = 1;
value(icircuit,3,[cT_002out,cT_003out]) = 1; % T_003 connected in the opposite
value(icircuit,4,[cT_003in, sBCOILin]) = 1; % direction!
%}
end
function connection = create_connection_matrix()
end
function [ids_struct_out] = imasget_coil(shot, ids_structures)
% pf_active coils
% TODO add logic to get the current in the coils only onces.
% Coils that can be characterized by R, Z and a
% crosssectional area are described as distinct coils with a single element this also corresponds to coils with distinct TCV names).
% Elements can be used in the future to refine the spatial
% description of each coil.
% the circular conductor of G-coils approximated by a square of equal
% crosssectional area.
% Each coil has a positive turnsign. The return current in T_003 is
% dealt with in the circuit description and in the machine mapping.
% In practice the dissipated energy in the pf '
% coils is not a relevant limit.
mdsopen(shot)
%% Get power supply/coils names for each circuit.
[coil_names2ids, ~, ~, mds_paths2ids, ~] = pf_active_definition();
ncircuits2ids = numel(coil_names2ids);
%% Get geometrical data from the static tree
% Information from the static tree - Z-zeroed with respect to coils
r_c = mdsvalue('_r_c=static(''r_c'')'); % R position
z_c = mdsvalue('_z_c=static(''z_c'')'); % Z position
w_c = mdsvalue('static(''w_c'')'); % width rectangular description
h_c = mdsvalue('static(''h_c'')'); % height rectangular description
a_c = mdsvalue('static(''a_c'')'); % tilt angle for parallelogram representation ( deprecated representation in IDS)
nt_c = mdsvalue('static(''nt_c'')'); % number of turns
xsect_c = mdsvalue('static(''xsect_c'')');
res_c = mdsvalue('static(''res_c'')'); % resistence of the coil
sizepfc = numel(r_c);
namepfc = mdsvalue('dim_of(_r_c)');
% Set effective turns in T1 and T2 (see J.-M. Moret, et al., RSI 69 (1998) 2333)
iT = strmatch('T_001',namepfc);
nt_c(iT)=26/68;
iT = strmatch('T_002',namepfc);
nt_c(iT)=42/68;
iT = strmatch('T_003',namepfc); % Return current
nt_c(iT)=1;
% Approximate circular G-coil conductor with a square of the same crosssection
iG=strmatch('G_00',namepfc);
w_c(iG)=sqrt(xsect_c(iG));
h_c(iG)=sqrt(xsect_c(iG));
%% Put data to ids structure
ids_struct_out(1:sizepfc) = ids_structures.pf_active.coil(1);
ind_coil_ids = 0;
for ii=1:ncircuits2ids
ncoil2ids = numel(coil_names2ids{ii}); % number of coils for a given circuit
for jj = 1:ncoil2ids
ind_coil_ids = ind_coil_ids +1;
ids_struct_out{ind_coil_ids}.name = coil_names2ids{ii}{jj};
tmpdata = tdi(mds_paths2ids{ii});
ids_struct_out{ind_coil_ids}.current.data = tmpdata.data;
ids_struct_out{ind_coil_ids}.current.time = tmpdata.dim{1};
% Find index on static tree
tmpind = find(strcmp(ids_struct_out{ii}.name, namepfc));
ids_struct_out{ind_coil_ids}.element{1}.geometry.rectangle.r = r_c(tmpind);
ids_struct_out{ind_coil_ids}.element{1}.geometry.rectangle.z = z_c(tmpind);
ids_struct_out{ind_coil_ids}.element{1}.geometry.rectangle.width = w_c(tmpind);
ids_struct_out{ind_coil_ids}.element{1}.geometry.rectangle.height = h_c(tmpind);
ids_struct_out{ind_coil_ids}.element{1}.turns_with_sign = nt_c(tmpind);
ids_struct_out{ind_coil_ids}.element{1}.geometry.geometry_type = 2; % 1 outline, 2 rectangle, 4 arc of circle
%ids_struct_out{ind_coil_ids}.current.data_error_upper = % TO BE FOUND;
%ids_struct_out{ind_coil_ids}.current.data_error_lower = % TO BE FOUND;
end
end
end
function [ids_struct_out] = imasget_supply(shot, ids_structures)
% TODO
%{
% ./pfsupplies/
% ./desc_supply/
namepfs = {'OH_001','OH_002', ...
'E_001','E_002','E_003','E_004','E_005','E_006','E_007','E_008', ...
'F_001','F_002','F_003','F_004','F_005','F_006','F_007','F_008', ...
'G_001','BCOIL'};
name = 'pfsupplies/desc_supply/name';
value = namepfs;
status= xmlWriteElement(xNodek,name,value,'Quiet',quiet);
name = 'pfsupplies/desc_supply/id';
name = 'pfsupplies/desc_supply/type';
name = 'pfsupplies/desc_supply/delay';
name = 'pfsupplies/desc_supply/filter';
name = 'pfsupplies/desc_supply/imin'; % Source: http://crpplocal.epfl.ch/wiki/Supply_scheme
value = [repmat(-31e3,1,2),repmat(-7.7e3,1,8),repmat(-7.7e3,1,8),-2e3,-78e3];
status= xmlWriteElement(xNodek,name,value,'Quiet',quiet);
name = 'pfsupplies/desc_supply/imax'; % Source: http://crpplocal.epfl.ch/wiki/Supply_scheme
value = [ repmat(31e3,1,2), repmat(7.7e3,1,8), repmat(7.7e3,1,8), 2e3,78e3];
status= xmlWriteElement(xNodek,name,value,'Quiet',quiet);
name = 'pfsupplies/desc_supply/res';
name = 'pfsupplies/desc_supply/umin'; % Source: http://crpplocal.epfl.ch/wiki/Supply_scheme
value = [repmat(-1400,1,2),repmat(-648,1,8),repmat(-1250,1,8),-566, -626];
status= xmlWriteElement(xNodek,name,value,'Quiet',quiet);
name = 'pfsupplies/desc_supply/umax'; % Source: http://crpplocal.epfl.ch/wiki/Supply_scheme
value = [ repmat(1400,1,2), repmat(648,1,8), repmat(1250,1,8), 566, 626];
status= xmlWriteElement(xNodek,name,value,'Quiet',quiet);
name = 'pfsupplies/desc_supply/emax'; % Not a relevant limit
% ../ END of desc_supply
% ../ END of pfsupplies
%}
\ No newline at end of file
function [coil_names, power_supply_names, circuit_names, mds_paths, combined_structure] = pf_active_definition()
% All circuits are connected in series and has only 1 power supply, so they
% share the same current.
coil_names = {...
{'A_001'}; ... % Circuit 1
{'B_001', 'B_002', 'C_001', 'C_002', 'D_001', 'D_002'}; ... % Circuit 2
{'E_001'}; ... % Circuit 3
{'E_002'}; ... % Circuit 4
{'E_003'}; ... % Circuit 5
{'E_004'}; ... % Circuit 6
{'E_005'}; ... % Circuit 7
{'E_006'}; ... % Circuit 8
{'E_007'}; ... % Circuit 9
{'E_008'}; ... % Circuit 10
{'F_001'}; ... % Circuit 11
{'F_002'}; ... % Circuit 12
{'F_003'}; ... % Circuit 13
{'F_004'}; ... % Circuit 14
{'F_005'}; ... % Circuit 15
{'F_006'}; ... % Circuit 16
{'F_007'}; ... % Circuit 17
{'F_008'}; ... % Circuit 18
{'G_001', 'G_002', 'G_003', 'G_004', 'G_005', 'G_006'}; ... % Circuit 19
{'T_001', 'T_002', 'T_003'}; ...% Circuit 20
};
power_supply_names = {...
'OH1';... % Circuit 1
'OH2';... % Circuit 2
'E1';...% Circuit 3
'E2';...% Circuit 4
'E3';... % Circuit 5
'E4';... % Circuit 6
'E5';... % Circuit 7
'E6';... % Circuit 8
'E7';... % Circuit 9
'E8';... % Circuit 10
'F1';... % Circuit 11
'F2';... % Circuit 12
'F3';... % Circuit 13
'F4';... % Circuit 14
'F5';... % Circuit 15
'F6';... % Circuit 16
'F7';... % Circuit 17
'F8';... % Circuit 18
'FPS';...% Circuit 19
'T';... % Circuit 20
};
circuit_names = power_supply_names;
% mds path to be called with gdat
mds_paths = {...
'\magnetics::ipol[*,"OH_001"]';... % Circuit 1
'\magnetics::ipol[*,"OH_002"]'; ... % Circuit 2
'\magnetics::ipol[*,"E_001"]';... % Circuit 3
'\magnetics::ipol[*,"E_002"]';...% Circuit 4
'\magnetics::ipol[*,"E_003"]';...% Circuit 5
'\magnetics::ipol[*,"E_004"]';...% Circuit 6
'\magnetics::ipol[*,"E_005"]';...% Circuit 7
'\magnetics::ipol[*,"E_006"]';...% Circuit 8
'\magnetics::ipol[*,"E_007"]';...% Circuit 9
'\magnetics::ipol[*,"E_008"]'; ...% Circuit 10
'\magnetics::ipol[*,"F_001"]';...% Circuit 11
'\magnetics::ipol[*,"F_002"]';...% Circuit 12
'\magnetics::ipol[*,"F_003"]';...% Circuit 13
'\magnetics::ipol[*,"F_004"]';...% Circuit 14
'\magnetics::ipol[*,"F_005"]';...% Circuit 15
'\magnetics::ipol[*,"F_006"]';...% Circuit 16
'\magnetics::ipol[*,"F_007"]';...% Circuit 17
'\magnetics::ipol[*,"F_008"]';... % Circuit 18
'is_in("G_001",dim_of(\magnetics::ipol,1)) ? \magnetics::ipol[*,"G_001"] : make_signal(zero(shape(data(\magnetics::ipol))[0],1.0),*,dim_of(\magnetics::ipol,0))';... % G coils % Circuit 19
'\magnetics::iphi';... % Connection between tf coils % Circuit 20
};
% conbined_structure(icircuit).
% .coil_names
% .power_supply_name
% .mds_path
combined_structure = struct();
for ii=1:numel(coil_names)
combined_structure(ii).coil_names = coil_names{ii};
combined_structure(ii).power_supply_name = power_supply_names{ii};
combined_structure(ii).mds_path = mds_paths{ii};
end
function [ids_struct_out] = description_2d(shot, ids_structures)
mdsopen(shot)
% Vessel
r_l = mdsdata('STATIC("R_T")');
z_l = mdsdata('STATIC("Z_T")');
ids_struct_out = ids_structures.wall;
ids_struct_out.description_2d{1}.limiter.unit{1}.outline.r = r_l;
ids_struct_out.description_2d{1}.limiter.unit{1}.outline.z = z_l;
end
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment