Skip to content
Snippets Groups Projects
Commit 13227a1b authored by Francesco Carpanese's avatar Francesco Carpanese Committed by Olivier Sauter
Browse files

Moving to a unique version of LIUQE IDS to include all cases

parent 0590752c
Branches
Tags
1 merge request!41Add corsica liuqe complete ids from meq
function [discretizationr, discretizationz, Twc] = eval_trap(vvdata, num, type, varargin ) function [discretizationr, discretizationz, Twc] = gen_filament(vvdata, num, type_coil_description,varargin)
% Evaluate the trapezoid from vv data structure, and computes the % Generate filamentary(windings) discretization from different geometrical coil descriptions
% discretization
% type = 2 -> rectangle description
% type = 3 -> oblique description
% type = 4 -> contour of the coils are specified varargin = [r, z ]
% contours
% vv data contains R, Z, dR, dZ for type = 2.
% vv data contains R, Z, dR, dZ, AC, AC2 for type = 3 where AC, AC2 are the
% angles of the parallelogram. Refer to GA document for specifications.
if mod(num,1)~=0, warning('The number of turns must be an integer. Ceil operation on it'); end % type_coil_description = 2 -> rectangle description
num = ceil(num); % type_coil_description = 3 -> oblique description
% type_coil_description = 4 -> contour of the coils are specified varargin = [r, z ] contours
% vvdata = R, Z, dR, dZ for type_coil_description = 2.
% vvdata = R, Z, dR, dZ, AC, AC2 for type_coil_description = 3 where AC, AC2 are the angles of the parallelogram.
R = vvdata(1, :); R = vvdata(1, :);
Z = vvdata(2, :); Z = vvdata(2, :);
dR = vvdata(3, :); dR = vvdata(3, :);
dZ = vvdata(4, :); dZ = vvdata(4, :);
switch type_coil_description
switch type
case 1 % outline option case 1 % outline option
disp('Not yet implemented. It will contain outline option IMAS') error('Filamentary discretization for ''outline'' coils description in ids type_coil_description not yet implmented')
return
case 2 % rectangle case 2 % rectangle
AC = 0*ones(size(R)); AC = 0*ones(size(R));
AC2 = 90*ones(size(R)); AC2 = 90*ones(size(R));
case 3 % oblique (parallelogram)
case 3 % oblique
AC = vvdata(5, :); AC = vvdata(5, :);
AC2 = vvdata(6, :); AC2 = vvdata(6, :);
case 4 % contour of the polygon case 4 % contour of the polygon
error('Filamentary discretizaion for ''polygon'' coils description in ids typ not yet implemented')
otherwise otherwise
disp('case not defined') error('Coils description not supported for filamenteray discretization ')
return
end end
% Initialize the extrema of the trapezoid % Initialize the extrema of the trapezoid
pointr = zeros(numel(AC),4); pointr = zeros(numel(AC),4);
pointz = zeros(numel(AC),4); pointz = zeros(numel(AC),4);
discretizationr = []; discretizationr = [];
discretizationz = []; discretizationz = [];
Twc = []; % Grouping matrix from windings to active coil Twc = []; % Grouping matrix from windings to active coil
for ii = 1:numel(AC) % loop all the coils for ii = 1:numel(AC) % loop all the coils given vvstructure
% Find 4 extrema of the parallelogram
% D----C
% / /
% A----B
if AC2(ii) ~= 0 && AC(ii) ==0 if AC2(ii) ~= 0 && AC(ii) ==0
DH = dZ(ii)/tand(AC2(ii)); DH = dZ(ii)/tand(AC2(ii));
pointr(ii,1) = R(ii) -DH/2 -dR(ii)/2; pointr(ii,1) = R(ii) -DH/2 -dR(ii)/2;
pointr(ii,2) = R(ii) +DH/2 -dR(ii)/2; pointr(ii,2) = R(ii) +DH/2 -dR(ii)/2;
pointr(ii,3) = R(ii) +DH/2 +dR(ii)/2; pointr(ii,3) = R(ii) +DH/2 +dR(ii)/2;
pointr(ii,4) = R(ii) -DH/2 +dR(ii)/2; pointr(ii,4) = R(ii) -DH/2 +dR(ii)/2;
pointz(ii,1) = Z(ii) -dZ(ii)/2; pointz(ii,1) = Z(ii) -dZ(ii)/2;
pointz(ii,2) = Z(ii) +dZ(ii)/2; pointz(ii,2) = Z(ii) +dZ(ii)/2;
pointz(ii,3) = Z(ii) +dZ(ii)/2; pointz(ii,3) = Z(ii) +dZ(ii)/2;
pointz(ii,4) = Z(ii) -dZ(ii)/2; pointz(ii,4) = Z(ii) -dZ(ii)/2;
elseif AC(ii) ~= 0 && AC2(ii) ==0 elseif AC(ii) ~= 0 && AC2(ii) ==0
DH = dR(ii)*tand(AC(ii)); DH = dR(ii)*tand(AC(ii));
pointr(ii,1) = R(ii) - dR(ii)/2; pointr(ii,1) = R(ii) - dR(ii)/2;
pointr(ii,2) = R(ii) - dR(ii)/2; pointr(ii,2) = R(ii) - dR(ii)/2;
pointr(ii,3) = R(ii) + dR(ii)/2; pointr(ii,3) = R(ii) + dR(ii)/2;
pointr(ii,4) = R(ii) + dR(ii)/2; pointr(ii,4) = R(ii) + dR(ii)/2;
pointz(ii,1) = Z(ii) - DH/2- dZ(ii)/2; pointz(ii,1) = Z(ii) - DH/2- dZ(ii)/2;
pointz(ii,2) = Z(ii) - DH/2 +dZ(ii)/2; pointz(ii,2) = Z(ii) - DH/2 +dZ(ii)/2;
pointz(ii,3) = Z(ii) + DH/2 +dZ(ii)/2; pointz(ii,3) = Z(ii) + DH/2 +dZ(ii)/2;
pointz(ii,4) = Z(ii) + DH/2 -dZ(ii)/2; pointz(ii,4) = Z(ii) + DH/2 -dZ(ii)/2;
elseif AC2(ii) == 0 && AC(ii) ==0 elseif AC2(ii) == 0 && AC(ii) ==0
pointr(ii,1) = R(ii) -dR(ii)/2; pointr(ii,1) = R(ii) -dR(ii)/2;
pointr(ii,2) = R(ii) -dR(ii)/2; pointr(ii,2) = R(ii) -dR(ii)/2;
pointr(ii,3) = R(ii) +dR(ii)/2; pointr(ii,3) = R(ii) +dR(ii)/2;
pointr(ii,4) = R(ii) +dR(ii)/2; pointr(ii,4) = R(ii) +dR(ii)/2;
pointz(ii,1) = Z(ii) -dZ(ii)/2; pointz(ii,1) = Z(ii) -dZ(ii)/2;
pointz(ii,2) = Z(ii) +dZ(ii)/2; pointz(ii,2) = Z(ii) +dZ(ii)/2;
pointz(ii,3) = Z(ii) +dZ(ii)/2; pointz(ii,3) = Z(ii) +dZ(ii)/2;
pointz(ii,4) = Z(ii) -dZ(ii)/2; pointz(ii,4) = Z(ii) -dZ(ii)/2;
end end
% Define base vector of the 2D deformed space for the parallelogram
AD = [pointr(ii,4)-pointr(ii,1), pointz(ii,4)-pointz(ii,1)]; AD = [pointr(ii,4)-pointr(ii,1), pointz(ii,4)-pointz(ii,1)];
AB = [pointr(ii,2)-pointr(ii,1), pointz(ii,2)-pointz(ii,1)]; AB = [pointr(ii,2)-pointr(ii,1), pointz(ii,2)-pointz(ii,1)];
ex = [1,0]; ex = [1,0];
ey = [0,1]; ey = [0,1];
% Rotation matrix containing the scalar product of the deformed space
% and orthogonal space
S = ([ex*AD', ex*AB'; ey*AD', ey*AB']); S = ([ex*AD', ex*AB'; ey*AD', ey*AB']);
%fixed_area = 0.01; %Decide the area represented by each single coils % Try to use a number of filaments that respect the shape of the parallelogram
%area_of_element = abs(AB(1)*AD(2)-AB(2)*AD(1)); %Evaluate the closer area to the element ratio = sqrt((AD*AD'))/sqrt((AB*AB'));
num1 = ceil(sqrt(num(ii)*ratio));
num2 = ceil(num1/ratio);
%num = round(area_of_element/fixed_area); %Find the number of integer pointx = zeros(num1*num2, 1);
%filaments closer to a fixed desired area for each element. pointy = zeros(num1*num2, 1);
for kk=1:num1
for jj=1:num2
if numel(num) == 1 %selfsimilar equally spaced pointx((kk-1)*num1+jj) = (2*kk-1)/(2*num1); %uniform grid in the deformed space defined by the parallelogram
pointy((kk-1)*num2+jj) = (2*jj-1)/(2*num2);
pointx = zeros(num*num, 1); tmp = S*[pointx((kk-1)*(num1)+jj), pointy((kk-1)*(num2)+jj)]'; % evaluate component in the r,z system of reference
pointy = zeros(num*num, 1); discretizationr(end+1) = pointr(ii,1) + tmp(1) ; % translate to the original central location
discretizationz(end+1) = pointz(ii,1) + tmp(2); % translate to the original central location
% Mode with selfsimilar shape
for kk=1:num
for jj=1:num
pointx((kk-1)*num+jj) = (2*kk-1)/(2*num); %uniform grid in the deformed space defined by the parallelogram
pointy((kk-1)*num+jj) = (2*jj-1)/(2*num);
tmp = S*[pointx((kk-1)*(num)+jj), pointy((kk-1)*(num)+jj)]'; % evaluate component in the r,z system of reference
discretizationr(end+1) = pointr(ii,1)+ tmp(1) ; % translate to the original point
discretizationz(end+1) = pointz(ii,1) + tmp(2);
end
end end
% Creating the grouping matrix
tmp = zeros(num*num, numel(AC));
tmp(:,ii) = 1;
Twc = [Twc ; tmp];
else %Depending on the turns and same similar aspect ration
ratio = sqrt(dot(AB,AB)/dot(AD,AD));
nx = ceil(sqrt(num(ii)/ratio));
ny = ceil(nx*ratio);
if ny>=2
pointy = linspace(1/(ny-1)/2, 1- 1/(ny-1)/2, ny);
else
pointy = 0.5;
end
if nx>=2
pointx = linspace(1/(nx-1)/2, 1- 1/(nx-1)/2, nx);
else
pointx = 0.5;
end
[ pointxx, pointyy ] = meshgrid(pointx, pointy);
for kk=1:ny
for jj=1:nx
tmp = S*[pointxx(kk,jj); pointyy(kk,jj)]; % evaluate component in the r,z system of reference
discretizationr(end+1) = pointr(ii,1)+ tmp(1) ; % translate to the original point
discretizationz(end+1) = pointz(ii,1) + tmp(2);
end
end
% Creating the grouping matrix
tmp = zeros(nx*ny, numel(num));
tmp(:,ii) = 1;
Twc = [Twc ; tmp];
end end
% Only the number of turns is specified but not the position of
% each individual winding. The function eval_trap generates a winding
% distrubution that nicely resamble the geometry of the coil section,
% but will not necessarily generate a number of windings = number of
% turns. The following normalization garanties that the total current
% flowing in the cross section of coil Iw*nw = Ia*nturns respect the input data.
Twc(end+1:end+num1*num2,end+1) = 1*sign(num(ii))/(num1*num2)*num(ii);
end end
% Reshape filaments(windings) into unique vector
%% Plot the coils discretization from the original data
%{
figure
hold on
axis equal
for ii = 1:numel(AC) % loop all the coils
patch(pointr(ii,:),pointz(ii,:),'red');
end
scatter(discretizationr, discretizationz, '.');
%}
discretizationr = reshape(discretizationr, numel(discretizationr),1); discretizationr = reshape(discretizationr, numel(discretizationr),1);
discretizationz = reshape(discretizationz, numel(discretizationz),1); discretizationz = reshape(discretizationz, numel(discretizationz),1);
% Plot the coils discretization
if ~isempty(varargin) && varargin{1} == 1
figure
hold on
axis equal
for ii = 1:numel(AC) % loop all the coils
patch(pointr(ii,:),pointz(ii,:),'red');
end
scatter(discretizationr, discretizationz, '.');
end
end end
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment