Print_Pos class
Contents
Description
This is a sub-class of the Print class for the implementation of printing methods for the .pos output format.
This output format is used in the regression tests.
classdef Print_Pos < Print
Public properties
properties (SetAccess = public, GetAccess = public)
single_file logical = logical.empty; % flag for printing all steps in a single file
results uint8 = uint8.empty; % vector of flags for types of results to print
end
Constructor method
methods
function this = Print_Pos()
this = this@Print(Print.POS);
this.setDefaultProps();
end
end
Public methods: implementation of super-class declarations
methods
%------------------------------------------------------------------
function setDefaultProps(this)
this.single_file = false;
end
%------------------------------------------------------------------
function execute(this,drv)
% Open file
if (this.single_file)
fname = strcat(drv.path_out,drv.name,".pos");
if (drv.step == 0)
fid = fopen(fname,'w'); % clear and write
else
fid = fopen(fname,'a'); % append
end
else
fname = strcat(drv.path_out,drv.name,"_",num2str(drv.step),".pos");
fid = fopen(fname,'w');
end
% Check if file could be open
if (fid < 0)
fprintf('\nResults could not be printed in step %d.',drv.step);
fclose(fid);
return;
end
% Current step info
if (this.single_file)
fprintf(fid,'---------------------------------------------------------------------------\n');
end
fprintf(fid,'%%STEP %d\n',drv.step);
fprintf(fid,'%%TIME %.6f\n',drv.time);
fprintf(fid,'\n');
% Model numbers info
fprintf(fid,'%%PARTICLES %d\n',drv.n_particles);
fprintf(fid,'%%WALLS %d\n',drv.n_walls);
fprintf(fid,'%%INTERACTIONS %d\n',drv.n_interacts);
fprintf(fid,'\n');
% Print requested results
for i = 1:length(this.results)
switch this.results(i)
case drv.result.MOTION
this.printPosition(drv,fid);
case drv.result.VELOCITY_VEC
this.printVelocity(drv,fid);
case drv.result.ACCELERATION_VEC
this.printAcceleration(drv,fid);
case drv.result.TEMPERATURE
this.printTemperature(drv,fid);
end
end
% Close file
fclose(fid);
end
end
Public methods: sub-class specifics
methods
%------------------------------------------------------------------
function printPosition(~,drv,fid)
fprintf(fid,'%%PARTICLE_COORDINATE_ORIENTATION\n');
for i = 1:drv.n_particles
p = drv.particles(i);
fprintf(fid,'%d %.15f %.15f %.15f\n',p.id,p.coord(1),p.coord(2),p.orient);
end
fprintf(fid,'\n');
if (drv.n_walls > 0)
fprintf(fid,'%%WALL_COORDINATE\n');
for i = 1:drv.n_walls
w = drv.walls(i);
if (w.type == w.LINE)
fprintf(fid,'%d %.15f %.15f %.15f %.15f\n',w.id,w.coord_ini(1),w.coord_ini(2),w.coord_end(1),w.coord_end(2));
elseif (w.type == w.CIRCLE)
fprintf(fid,'%d %.15f %.15f\n',w.id,w.center(1),w.radius);
end
end
fprintf(fid,'\n');
end
end
%------------------------------------------------------------------
function printVelocity(~,drv,fid)
fprintf(fid,'%%PARTICLE_VELOCITY\n');
for i = 1:drv.n_particles
p = drv.particles(i);
fprintf(fid,'%d %.15f %.15f %.15f\n',p.id,p.veloc_trl(1),p.veloc_trl(2),p.veloc_rot);
end
fprintf(fid,'\n');
end
%------------------------------------------------------------------
function printAcceleration(~,drv,fid)
fprintf(fid,'%%PARTICLE_ACCELERATION\n');
for i = 1:drv.n_particles
p = drv.particles(i);
fprintf(fid,'%d %.15f %.15f %.15f\n',p.id,p.accel_trl(1),p.accel_trl(2),p.accel_rot);
end
fprintf(fid,'\n');
end
%------------------------------------------------------------------
function printTemperature(~,drv,fid)
fprintf(fid,'%%PARTICLE_TEMPERATURE\n');
for i = 1:drv.n_particles
p = drv.particles(i);
fprintf(fid,'%d %.15f\n',p.id,p.temperature);
end
fprintf(fid,'\n');
if (drv.n_walls > 0)
fprintf(fid,'%%WALL_TEMPERATURE\n');
for i = 1:drv.n_walls
w = drv.walls(i);
fprintf(fid,'%d %.15f\n',w.id,w.temperature);
end
fprintf(fid,'\n');
end
end
end
end