phd-simscape-micro-station/matlab/src/initializeDisturbances.m

230 lines
6.7 KiB
Mathematica
Raw Normal View History

function [] = initializeDisturbances(args)
% initializeDisturbances - Initialize the disturbances
%
% Syntax: [] = initializeDisturbances(args)
%
% Inputs:
% - args -
arguments
% Global parameter to enable or disable the disturbances
args.enable logical {mustBeNumericOrLogical} = true
% Ground Motion - X direction
args.Dwx logical {mustBeNumericOrLogical} = true
% Ground Motion - Y direction
args.Dwy logical {mustBeNumericOrLogical} = true
% Ground Motion - Z direction
args.Dwz logical {mustBeNumericOrLogical} = true
% Translation Stage - X direction
args.Fty_x logical {mustBeNumericOrLogical} = true
% Translation Stage - Z direction
args.Fty_z logical {mustBeNumericOrLogical} = true
% Spindle - X direction
args.Frz_x logical {mustBeNumericOrLogical} = true
% Spindle - Y direction
args.Frz_y logical {mustBeNumericOrLogical} = true
% Spindle - Z direction
args.Frz_z logical {mustBeNumericOrLogical} = true
end
% Initialization of random numbers
rng("shuffle");
%% Ground Motion
load('dist_psd.mat', 'dist_f');
% Frequency Data
Dw.f = dist_f.f(2:end);
Dw.psd_x = dist_f.psd_gm(2:end);
Dw.psd_y = dist_f.psd_gm(2:end);
Dw.psd_z = dist_f.psd_gm(2:end);
% Time data
Fs = 2*Dw.f(end); % Sampling Frequency of data is twice the maximum frequency of the PSD vector [Hz]
N = 2*length(Dw.f); % Number of Samples match the one of the wanted PSD
T0 = N/Fs; % Signal Duration [s]
Dw.t = linspace(0, T0, N+1)'; % Time Vector [s]
C = zeros(N/2,1);
for i = 1:N/2
C(i) = sqrt(Dw.psd_x(i)/T0);
end
if args.Dwx && args.enable
2024-10-30 14:29:52 +01:00
theta = 2*pi*rand(N/2,1); % Generate random phase [rad]
Cx = [0 ; C.*complex(cos(theta),sin(theta))];
Cx = [Cx; flipud(conj(Cx(2:end)))];;
Dw.x = N/sqrt(2)*ifft(Cx); % Ground Motion - x direction [m]
else
Dw.x = zeros(length(Dw.t), 1);
end
2024-10-30 14:29:52 +01:00
if args.Dwy && args.enable
2024-10-30 14:29:52 +01:00
theta = 2*pi*rand(N/2,1); % Generate random phase [rad]
Cx = [0 ; C.*complex(cos(theta),sin(theta))];
Cx = [Cx; flipud(conj(Cx(2:end)))];;
Dw.y = N/sqrt(2)*ifft(Cx); % Ground Motion - y direction [m]
else
Dw.y = zeros(length(Dw.t), 1);
end
2024-10-30 14:29:52 +01:00
if args.Dwy && args.enable
2024-10-30 14:29:52 +01:00
theta = 2*pi*rand(N/2,1); % Generate random phase [rad]
Cx = [0 ; C.*complex(cos(theta),sin(theta))];
Cx = [Cx; flipud(conj(Cx(2:end)))];;
Dw.z = N/sqrt(2)*ifft(Cx); % Ground Motion - z direction [m]
else
Dw.z = zeros(length(Dw.t), 1);
end
load('dist_psd.mat', 'dist_f');
dist_f.f = dist_f.f(2:end);
dist_f.psd_gm = dist_f.psd_gm(2:end);
dist_f.psd_ty = dist_f.psd_ty(2:end);
dist_f.psd_rz = dist_f.psd_rz(2:end);
%% Translation Stage
load('dist_psd.mat', 'dist_f');
% Frequency Data
Ty.f = dist_f.f(2:end);
Ty.psd_x = dist_f.psd_ty(2:end); % TODO - we take here the vertical direction which is wrong but approximate
Ty.psd_z = dist_f.psd_ty(2:end);
% Time data
Fs = 2*Ty.f(end); % Sampling Frequency of data is twice the maximum frequency of the PSD vector [Hz]
N = 2*length(Ty.f); % Number of Samples match the one of the wanted PSD
T0 = N/Fs; % Signal Duration [s]
Ty.t = linspace(0, T0, N+1)'; % Time Vector [s]
C = zeros(N/2,1);
for i = 1:N/2
C(i) = sqrt(Ty.psd_x(i)/T0);
end
2024-10-30 14:29:52 +01:00
% Translation Stage - X
if args.Fty_x && args.enable
phi = Ty.psd_x;
2024-10-30 14:29:52 +01:00
C = zeros(N/2,1);
for i = 1:N/2
C(i) = sqrt(phi(i)/T0);
2024-10-30 14:29:52 +01:00
end
theta = 2*pi*rand(N/2,1); % Generate random phase [rad]
Cx = [0 ; C.*complex(cos(theta),sin(theta))];
Cx = [Cx; flipud(conj(Cx(2:end)))];;
u = N/sqrt(2)*ifft(Cx); % Disturbance Force Ty x [N]
Ty.x = u;
else
Ty.x = zeros(length(Ty.t), 1);
end
2024-10-30 14:29:52 +01:00
% Translation Stage - Z
if args.Fty_z && args.enable
phi = Ty.psd_z;
2024-10-30 14:29:52 +01:00
C = zeros(N/2,1);
for i = 1:N/2
C(i) = sqrt(phi(i)/T0);
2024-10-30 14:29:52 +01:00
end
theta = 2*pi*rand(N/2,1); % Generate random phase [rad]
Cx = [0 ; C.*complex(cos(theta),sin(theta))];
Cx = [Cx; flipud(conj(Cx(2:end)))];;
u = N/sqrt(2)*ifft(Cx); % Disturbance Force Ty z [N]
Ty.z = u;
else
Ty.z = zeros(length(Ty.t), 1);
end
%% Translation Stage
load('dist_psd.mat', 'dist_f');
% Frequency Data
Rz.f = dist_f.f(2:end);
Rz.psd_x = dist_f.psd_rz(2:end); % TODO - we take here the vertical direction which is wrong but approximate
Rz.psd_y = dist_f.psd_rz(2:end); % TODO - we take here the vertical direction which is wrong but approximate
Rz.psd_z = dist_f.psd_rz(2:end);
% Time data
Fs = 2*Rz.f(end); % Sampling Frequency of data is twice the maximum frequency of the PSD vector [Hz]
N = 2*length(Rz.f); % Number of Samples match the one of the wanted PSD
T0 = N/Fs; % Signal Duration [s]
Rz.t = linspace(0, T0, N+1)'; % Time Vector [s]
C = zeros(N/2,1);
for i = 1:N/2
C(i) = sqrt(Rz.psd_x(i)/T0);
end
% Translation Stage - X
if args.Frz_x && args.enable
phi = Rz.psd_x;
C = zeros(N/2,1);
for i = 1:N/2
C(i) = sqrt(phi(i)/T0);
end
theta = 2*pi*rand(N/2,1); % Generate random phase [rad]
Cx = [0 ; C.*complex(cos(theta),sin(theta))];
Cx = [Cx; flipud(conj(Cx(2:end)))];;
u = N/sqrt(2)*ifft(Cx); % Disturbance Force Rz x [N]
Rz.x = u;
else
Rz.x = zeros(length(Rz.t), 1);
end
% Translation Stage - Y
if args.Frz_y && args.enable
phi = Rz.psd_y;
2024-10-30 14:29:52 +01:00
C = zeros(N/2,1);
for i = 1:N/2
C(i) = sqrt(phi(i)/T0);
end
theta = 2*pi*rand(N/2,1); % Generate random phase [rad]
Cx = [0 ; C.*complex(cos(theta),sin(theta))];
Cx = [Cx; flipud(conj(Cx(2:end)))];;
u = N/sqrt(2)*ifft(Cx); % Disturbance Force Rz y [N]
Rz.y = u;
else
Rz.y = zeros(length(Rz.t), 1);
end
% Translation Stage - Z
if args.Frz_z && args.enable
phi = Rz.psd_z;
C = zeros(N/2,1);
for i = 1:N/2
C(i) = sqrt(phi(i)/T0);
2024-10-30 14:29:52 +01:00
end
theta = 2*pi*rand(N/2,1); % Generate random phase [rad]
Cx = [0 ; C.*complex(cos(theta),sin(theta))];
Cx = [Cx; flipud(conj(Cx(2:end)))];;
u = N/sqrt(2)*ifft(Cx); % Disturbance Force Rz z [N]
Rz.z = u;
else
Rz.z = zeros(length(Rz.t), 1);
end
2024-10-30 14:29:52 +01:00
u = zeros(100, 6);
Fd = u;
2024-10-30 14:29:52 +01:00
Dw.x = Dw.x - Dw.x(1);
Dw.y = Dw.y - Dw.y(1);
Dw.z = Dw.z - Dw.z(1);
Ty.x = Ty.x - Ty.x(1);
Ty.z = Ty.z - Ty.z(1);
Rz.x = Rz.x - Rz.x(1);
Rz.y = Rz.y - Rz.y(1);
Rz.z = Rz.z - Rz.z(1);
2024-10-30 14:29:52 +01:00
if exist('./mat', 'dir')
if exist('./mat/nass_disturbances.mat', 'file')
save('mat/nass_disturbances.mat', 'Dw', 'Ty', 'Rz', 'Fd', 'args', '-append');
2024-10-30 14:29:52 +01:00
else
save('mat/nass_disturbances.mat', 'Dw', 'Ty', 'Rz', 'Fd', 'args');
2024-10-30 14:29:52 +01:00
end
elseif exist('./matlab', 'dir')
if exist('./matlab/mat/nass_disturbances.mat', 'file')
save('matlab/mat/nass_disturbances.mat', 'Dw', 'Ty', 'Rz', 'Fd', 'args', '-append');
2024-10-30 14:29:52 +01:00
else
save('matlab/mat/nass_disturbances.mat', 'Dw', 'Ty', 'Rz', 'Fd', 'args');
2024-10-30 14:29:52 +01:00
end
end