%DAMAGEICE class definition
%
% Usage:
% damage=damage();
classdef damage
properties (SetAccess=public)
%damage
isdamage = NaN;
D = NaN;
law = '';
spcdamage = NaN;
max_damage = NaN;
%numerical
stabilization = NaN;
maxiter = NaN;
elementinterp = '';
penalty_threshold = NaN;
penalty_lock = NaN;
penalty_factor = NaN;
%general parameters for evolution law:
stress_threshold = NaN;
c1 = NaN;
c2 = NaN;
c3 = NaN;
c4 = NaN;
healing = NaN;
equiv_stress = NaN;
requested_outputs = {};
end
methods
function createxml(obj,fid) % {{{
fprintf(fid, '\n\n');
fprintf(fid, '%s\n', '');
fprintf(fid, '%s\n', '');
%fprintf(fid,'%s%s%s%s\n%s\n%s\n%s\n', '', ' ',' damage law (string) from {"undamaged","pralong"} ','');
% drop-down
fprintf(fid,'%s%s%s%s%s\n\t%s\n','','');
% law = 'undamage'
fprintf(fid,'\t%s%s%s%s%s\n\t\t%s\n','');
% law = 'pralong'
fprintf(fid,'\t%s%s%s%s%s\n\t\t%s\n','');
% footer for drop-down
fprintf(fid,'\t%s\n%s\n%s',' damage law (string) from {"undamaged","pralong"} ','');
fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n', '', ' ',' damage tensor (scalar) ','');
fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n', '', ' ',' damage law (string) from {"undamaged","pralong"} ','');
fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n', '', ' ',' damage constraints (NaN means no constraint) ','');
fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n', '', ' ',' maximum possible damage (0<=max_damage<1) ','');
fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n', '', ' ',' 0: no, 1: artificial_diffusivity, 2: SUPG ','');
fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n', '', ' ',' maximum number of non linear iterations ','');
fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n', '', ' ',' stabilize unstable damage constraints that keep zigzagging after n iteration (default is 0, no stabilization) ','');
fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n', '', ' ',' threshold to declare convergence of damage evolution solution (default is 0) ','');
fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n', '', ' ',' scaling exponent (default is 3) ','');
end % }}}
function obj = damage(varargin) % {{{
switch nargin
case 0
obj=setdefaultparameters(obj);
case 1
inputstruct=varargin{1};
list1 = properties('damage');
list2 = fieldnames(inputstruct);
for i=1:length(list1)
fieldname = list1{i};
if ismember(fieldname,list2),
obj.(fieldname) = inputstruct.(fieldname);
end
end
otherwise
error('constructor not supported');
end
end % }}}
function obj = setdefaultparameters(obj) % {{{
%damage parameters:
obj.isdamage=0;
obj.D=0;
obj.law='undamaged';
obj.max_damage=1-1e-5; %if damage reaches 1, solve becomes singular, as viscosity becomes nil
%Type of stabilization used
obj.stabilization=2;
%Maximum number of iterations
obj.maxiter=100;
%finite element interpolation
obj.elementinterp='P1';
%factor used to compute the values of the penalties: kappa=max(stiffness matrix)*10^penalty_factor
obj.penalty_factor=3;
%stabilize unstable damage constraints that keep zigzagging after n iteration (default is 0, no stabilization)
obj.penalty_lock=0;
%threshold to declare convergence of thermal solution (default is 0)
obj.penalty_threshold=0;
%damage evolution parameters
obj.stress_threshold=0;
obj.healing=0;
obj.c1=0;
obj.c2=0;
obj.c3=0;
obj.c4=0;
obj.equiv_stress=0;
%output default:
obj.requested_outputs={'default'};
end % }}}
function md = checkconsistency(obj,md,solution,analyses) % {{{
md = checkfield(md,'fieldname','damage.isdamage','values',[1,0]);
if obj.isdamage,
md = checkfield(md,'fieldname','damage.law','values',{'undamaged','pralong'});
md = checkfield(md,'fieldname','damage.D','>=',0,'<=',obj.max_damage,'size',[md.mesh.numberofvertices 1]);
md = checkfield(md,'fieldname','damage.spcdamage','forcing',1);
md = checkfield(md,'fieldname','damage.max_damage','<',1,'>=',0);
md = checkfield(md,'fieldname','damage.stabilization','numel',[1],'values',[0 1 2]);
md = checkfield(md,'fieldname','damage.maxiter','>=0',0);
md = checkfield(md,'fieldname','damage.elementinterp','values',{'P1','P2'});
md = checkfield(md,'fieldname','damage.penalty_factor','>=0',0);
md = checkfield(md,'fieldname','damage.penalty_lock','>=0',0);
md = checkfield(md,'fieldname','damage.penalty_threshold','>=0',0);
end
if strcmpi(obj.law,'pralong'),
md = checkfield(md,'fieldname','damage.healing','>=',0);
md = checkfield(md,'fieldname','damage.c1','>=',0);
md = checkfield(md,'fieldname','damage.c2','>=',0);
md = checkfield(md,'fieldname','damage.c3','>=',0);
md = checkfield(md,'fieldname','damage.c4','>=',0);
md = checkfield(md,'fieldname','damage.stress_threshold','>=',0);
md = checkfield(md,'fieldname','damage.equiv_stress','numel',[1],'values',[0 1]);
md = checkfield(md,'fieldname','damage.requested_outputs','stringrow',1);
elseif strcmpi(obj.law,'undamaged'),
if (solution==DamageEvolutionSolutionEnum),
error('Invalid evolution law (md.damage.law) for a damage solution');
end
else
error('invalid damage evolution law');
end
end % }}}
function list=defaultoutputs(self,md) % {{{
if strcmp(domaintype(md.mesh),'2Dhorizontal'),
list = {'DamageDbar'};
else
list = {'DamageD'};
end
end % }}}
function disp(obj) % {{{
disp(sprintf(' Damage:\n'));
fielddisplay(obj,'isdamage','is damage mechanics being used? {true,false}');
if obj.isdamage,
fielddisplay(obj,'law','damage law (string) from {''undamaged'',''pralong''}');
fielddisplay(obj,'D','damage tensor (scalar)');
fielddisplay(obj,'spcdamage','damage constraints (NaN means no constraint)');
fielddisplay(obj,'max_damage','maximum possible damage (0<=max_damage<1)');
fielddisplay(obj,'stabilization','0: no, 1: artificial_diffusivity, 2: SUPG');
fielddisplay(obj,'maxiter','maximum number of non linear iterations');
fielddisplay(obj,'elementinterp','interpolation scheme for finite elements {''P1'',''P2''}');
fielddisplay(obj,'penalty_lock','stabilize unstable damage constraints that keep zigzagging after n iteration (default is 0, no stabilization)');
fielddisplay(obj,'penalty_threshold','threshold to declare convergence of damage evolution solution (default is 0)');
fielddisplay(obj,'penalty_factor','scaling exponent (default is 3)');
end
if strcmpi(obj.law,'pralong'),
fielddisplay(obj,'c1','damage parameter 1');
fielddisplay(obj,'c2','damage parameter 2');
fielddisplay(obj,'c3','damage parameter 3');
fielddisplay(obj,'c4','damage parameter 4');
fielddisplay(obj,'healing','damage healing parameter');
fielddisplay(obj,'stress_threshold','damage stress threshold [Pa]');
fielddisplay(obj,'equiv_stress','0: von Mises, 1: max principal');
fielddisplay(obj,'requested_outputs','additional outputs requested');
end
end % }}}
function marshall(obj,md,fid) % {{{
WriteData(fid,'object',obj,'fieldname','isdamage','format','Boolean');
if obj.isdamage,
WriteData(fid,'object',obj,'fieldname','law','format','String');
WriteData(fid,'object',obj,'fieldname','D','format','DoubleMat','mattype',1);
WriteData(fid,'object',obj,'fieldname','spcdamage','format','DoubleMat','mattype',1,'forcinglength',md.mesh.numberofvertices+1);
WriteData(fid,'object',obj,'fieldname','max_damage','format','Double');
WriteData(fid,'object',obj,'fieldname','stabilization','format','Integer');
WriteData(fid,'object',obj,'fieldname','maxiter','format','Integer');
WriteData(fid,'object',obj,'fieldname','elementinterp','format','String');
WriteData(fid,'object',obj,'fieldname','penalty_threshold','format','Integer');
WriteData(fid,'object',obj,'fieldname','penalty_lock','format','Integer');
WriteData(fid,'object',obj,'fieldname','penalty_factor','format','Double');
end
if strcmpi(obj.law,'pralong'),
WriteData(fid,'object',obj,'fieldname','c1','format','Double');
WriteData(fid,'object',obj,'fieldname','c2','format','Double');
WriteData(fid,'object',obj,'fieldname','c3','format','Double');
WriteData(fid,'object',obj,'fieldname','c4','format','Double');
WriteData(fid,'object',obj,'fieldname','stress_threshold','format','Double');
WriteData(fid,'object',obj,'fieldname','healing','format','Double');
WriteData(fid,'object',obj,'fieldname','equiv_stress','format','Integer');
end
%process requested outputs
outputs = obj.requested_outputs;
pos = find(ismember(outputs,'default'));
if ~isempty(pos),
outputs(pos) = []; %remove 'default' from outputs
outputs = [outputs defaultoutputs(obj,md)]; %add defaults
end
if obj.isdamage,
WriteData(fid,'data',outputs,'enum',DamageEvolutionRequestedOutputsEnum,'format','StringArray');
end
end % }}}
end
end