1 | %DAMAGEICE class definition
|
---|
2 | %
|
---|
3 | % Usage:
|
---|
4 | % damage=damage();
|
---|
5 |
|
---|
6 | classdef damage
|
---|
7 | properties (SetAccess=public)
|
---|
8 | %damage
|
---|
9 | D = NaN;
|
---|
10 | law = '';
|
---|
11 | spcdamage = NaN;
|
---|
12 | max_damage = NaN;
|
---|
13 |
|
---|
14 | %numerical
|
---|
15 | stabilization = NaN;
|
---|
16 | penalty_threshold = NaN;
|
---|
17 | maxiter = NaN;
|
---|
18 | penalty_lock = NaN;
|
---|
19 | penalty_factor = NaN;
|
---|
20 |
|
---|
21 | %general parameters for evolution law:
|
---|
22 | stress_threshold = NaN;
|
---|
23 | c1 = NaN;
|
---|
24 | c2 = NaN;
|
---|
25 | c3 = NaN;
|
---|
26 | c4 = NaN;
|
---|
27 | healing = NaN;
|
---|
28 | end
|
---|
29 | methods
|
---|
30 | function obj = damage(varargin) % {{{
|
---|
31 | switch nargin
|
---|
32 | case 0
|
---|
33 | obj=setdefaultparameters(obj);
|
---|
34 | case 1
|
---|
35 | inputstruct=varargin{1};
|
---|
36 | list1 = properties('damage');
|
---|
37 | list2 = fieldnames(inputstruct);
|
---|
38 | for i=1:length(list1)
|
---|
39 | fieldname = list1{i};
|
---|
40 | if ismember(fieldname,list2),
|
---|
41 | obj.(fieldname) = inputstruct.(fieldname);
|
---|
42 | end
|
---|
43 | end
|
---|
44 | otherwise
|
---|
45 | error('constructor not supported');
|
---|
46 | end
|
---|
47 | end % }}}
|
---|
48 | function obj = setdefaultparameters(obj) % {{{
|
---|
49 |
|
---|
50 | %damage parameters:
|
---|
51 | obj.D=0;
|
---|
52 | obj.law='undamaged';
|
---|
53 |
|
---|
54 | obj.max_damage=1-1e-5; %if damage reaches 1, solve becomes singular, as viscosity becomes nil
|
---|
55 |
|
---|
56 | %Type of stabilization used
|
---|
57 | obj.stabilization=2;
|
---|
58 |
|
---|
59 | %Maximum number of iterations
|
---|
60 | obj.maxiter=100;
|
---|
61 |
|
---|
62 | %factor used to compute the values of the penalties: kappa=max(stiffness matrix)*10^penalty_factor
|
---|
63 | obj.penalty_factor=3;
|
---|
64 |
|
---|
65 | %stabilize unstable damage constraints that keep zigzagging after n iteration (default is 0, no stabilization)
|
---|
66 | obj.penalty_lock=0;
|
---|
67 |
|
---|
68 | %threshold to declare convergence of thermal solution (default is 0)
|
---|
69 | obj.penalty_threshold=0;
|
---|
70 |
|
---|
71 | %damage evolution parameters
|
---|
72 | obj.stress_threshold=0;
|
---|
73 | obj.healing=0;
|
---|
74 | obj.c1=0;
|
---|
75 | obj.c2=0;
|
---|
76 | obj.c3=0;
|
---|
77 | obj.c4=0;
|
---|
78 |
|
---|
79 | end % }}}
|
---|
80 | function md = checkconsistency(obj,md,solution,analyses) % {{{
|
---|
81 |
|
---|
82 | md = checkfield(md,'damage.D','>=',0,'<=',obj.max_damage,'size',[md.mesh.numberofvertices 1]);
|
---|
83 | md = checkfield(md,'damage.max_damage','<',1,'>=',0);
|
---|
84 | md = checkfield(md,'damage.law','values',{'undamaged','pralong'});
|
---|
85 | md = checkfield(md,'damage.spcdamage','forcing',1);
|
---|
86 |
|
---|
87 | md = checkfield(md,'damage.stabilization','numel',[1],'values',[0 1 2]);
|
---|
88 | md = checkfield(md,'damage.maxiter','>=0',0);
|
---|
89 | md = checkfield(md,'damage.penalty_factor','>=0',0);
|
---|
90 | md = checkfield(md,'damage.penalty_lock','>=0',0);
|
---|
91 | md = checkfield(md,'damage.penalty_threshold','>=0',0);
|
---|
92 |
|
---|
93 | if strcmpi(obj.law,'pralong'),
|
---|
94 | md = checkfield(md,'damage.healing','>=',0);
|
---|
95 | md = checkfield(md,'damage.c1','>=',0);
|
---|
96 | md = checkfield(md,'damage.c2','>=',0);
|
---|
97 | md = checkfield(md,'damage.c3','>=',0);
|
---|
98 | md = checkfield(md,'damage.c4','>=',0);
|
---|
99 | md = checkfield(md,'damage.stress_threshold','>=',0);
|
---|
100 | elseif strcmpi(obj.law,'undamaged'),
|
---|
101 | if (solution==DamageEvolutionSolutionEnum),
|
---|
102 | error('Invalid evolution law (md.damage.law) for a damage solution');
|
---|
103 | end
|
---|
104 | else
|
---|
105 | error('invalid damage evolution law');
|
---|
106 | end
|
---|
107 |
|
---|
108 | end % }}}
|
---|
109 | function disp(obj) % {{{
|
---|
110 | disp(sprintf(' Damage:\n'));
|
---|
111 |
|
---|
112 | fielddisplay(obj,'D','damage tensor (scalar)');
|
---|
113 | fielddisplay(obj,'law','damage law (string) from {''undamaged'',''pralong''}');
|
---|
114 | fielddisplay(obj,'spcdamage','damage constraints (NaN means no constraint)');
|
---|
115 | fielddisplay(obj,'max_damage','maximum possible damage (0<=max_damage<1)');
|
---|
116 |
|
---|
117 | fielddisplay(obj,'stabilization','0: no, 1: artificial_diffusivity, 2: SUPG');
|
---|
118 | fielddisplay(obj,'maxiter','maximum number of non linear iterations');
|
---|
119 | fielddisplay(obj,'penalty_lock','stabilize unstable damage constraints that keep zigzagging after n iteration (default is 0, no stabilization)');
|
---|
120 | fielddisplay(obj,'penalty_threshold','threshold to declare convergence of damage evolution solution (default is 0)');
|
---|
121 | fielddisplay(obj,'penalty_factor','scaling exponent (default is 3)');
|
---|
122 |
|
---|
123 | if strcmpi(obj.law,'pralong'),
|
---|
124 | fielddisplay(obj,'c1','damage parameter 1');
|
---|
125 | fielddisplay(obj,'c2','damage parameter 2');
|
---|
126 | fielddisplay(obj,'c3','damage parameter 3');
|
---|
127 | fielddisplay(obj,'c4','damage parameter 4');
|
---|
128 | fielddisplay(obj,'healing','damage healing parameter 1');
|
---|
129 | fielddisplay(obj,'stress_threshold','damage stress threshold [Pa]');
|
---|
130 | end
|
---|
131 |
|
---|
132 | end % }}}
|
---|
133 | function marshall(obj,md,fid) % {{{
|
---|
134 |
|
---|
135 | WriteData(fid,'object',obj,'fieldname','D','format','DoubleMat','mattype',1);
|
---|
136 | WriteData(fid,'object',obj,'fieldname','law','format','String');
|
---|
137 | WriteData(fid,'object',obj,'fieldname','spcdamage','format','DoubleMat','mattype',1,'forcinglength',md.mesh.numberofvertices+1);
|
---|
138 | WriteData(fid,'object',obj,'fieldname','max_damage','format','Double');
|
---|
139 |
|
---|
140 | WriteData(fid,'object',obj,'fieldname','stabilization','format','Integer');
|
---|
141 | WriteData(fid,'object',obj,'fieldname','penalty_threshold','format','Integer');
|
---|
142 | WriteData(fid,'object',obj,'fieldname','maxiter','format','Integer');
|
---|
143 | WriteData(fid,'object',obj,'fieldname','penalty_lock','format','Integer');
|
---|
144 | WriteData(fid,'object',obj,'fieldname','penalty_factor','format','Double');
|
---|
145 |
|
---|
146 | if strcmpi(obj.law,'pralong'),
|
---|
147 | WriteData(fid,'object',obj,'fieldname','c1','format','Double');
|
---|
148 | WriteData(fid,'object',obj,'fieldname','c2','format','Double');
|
---|
149 | WriteData(fid,'object',obj,'fieldname','c3','format','Double');
|
---|
150 | WriteData(fid,'object',obj,'fieldname','c4','format','Double');
|
---|
151 | WriteData(fid,'object',obj,'fieldname','stress_threshold','format','Double');
|
---|
152 | WriteData(fid,'object',obj,'fieldname','healing','format','Double');
|
---|
153 | end
|
---|
154 |
|
---|
155 | end % }}}
|
---|
156 | end
|
---|
157 | end
|
---|