function U = abaqus_static_fil(main_data_file,F,N_inc) % Runs abaqus static analysis, by applying force vector [F] with [N_inc] increments. %{ This code is intended for research purposes. Evangelia Nicolaidou, e.nicolaidou@bristol.ac.uk 2020-10-16 %} %% Initialise % main_data_file is obtained after running freq_analysis.m load(main_data_file,'main_job_name','N_nodes'); assert(length(F) == 6*N_nodes); static_job_name = 'static_job'; %% Create input file % generate commands for node set definitions and applied loads/moments S_nodeset_def = cell(2*N_nodes,1); % 2 lines for each node S_load_app = cell(6*N_nodes,1); % 6 lines for each node for ii = 1:N_nodes S_nodeset_def{2*ii-1} = sprintf('*Nset, nset=node%i, instance=beam_part-1',ii); S_nodeset_def{2*ii} = sprintf('%i,',ii); for jj = 1:6 kk = (ii-1)*6+jj; S_load_app{kk} = sprintf('node%i, %i, %.95e',ii,jj,F(kk)); end end S_load_app = [sprintf('*Cload'); S_load_app]; % read template .inp file fname = [main_job_name,'.inp']; fid = fopen(fname,'rt') ; S = textscan(fid,'%s','Delimiter','\n'); S = S{1} ; fclose(fid); % insert commands for nodeset definition S_nodeset_def = ['** ================================================================'; S_nodeset_def]; S_nodeset_def = [S_nodeset_def; '** ================================================================']; ii = find(contains(S,'*Nset')); jj = find(contains(S,'name=beam_part-1')); ii = ii(ii>jj); ii = ii(1); S = [S(1:ii-1); S_nodeset_def; S(ii:end)]; % append commands % insert commands for load application S{end+1} = '** ================================================================'; S{end+1} = ['*Step, name=static_step, nlgeom=yes, extrapolation=parabolic, amplitude=ramp, inc=',num2str(N_inc)]; % S{end+1} = '*Static, direct'; % ",direct" used for fixed incrementation S{end+1} = ['1, ',num2str(N_inc)]; % (fixed) inc, period [for automatic incrementation: initial, period, min max] S = [S; S_load_app]; S{end+1} = '*Restart, write, frequency=0'; S{end+1} = '*FILE FORMAT, ASCII'; S{end+1} = '*Output, field'; S{end+1} = '*Node Output'; S{end+1} = 'U,'; S{end+1} = '*Element Output, directions=YES'; S{end+1} = 'SP,'; S{end+1} = '*NODE FILE'; S{end+1} = 'U,'; S{end+1} = '*End Step'; S{end+1} = '** ================================================================'; % create static .inp file and write additional commands fname = [static_job_name,'.inp']; static_fid = fopen(fname,'wt'); fprintf(static_fid,'%s\n',S{:}); fclose(static_fid); fprintf('Input file: %s.inp has been created.\n',static_job_name); %% Run static analysis job fprintf('%s Abaqus running... %s\n',repmat('=',1,30),repmat('=',1,30)) system(['abaqus job=',static_job_name,' interactive']); fprintf('%s Done. %s\n',repmat('=',1,36),repmat('=',1,36)) %% Process static analysis results % extract results (first column is node index, columns 2:7 are the displacements) out = readFil([static_job_name,'.fil'],101); % displacement (U) out = out{1}; % check number of increments assert(N_inc == size(out,1)/N_nodes) fprintf('Number of increments in static analysis: %i %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n\n',N_inc); U = out; end