1 | %DAMAGEICE class definition
|
---|
2 | %
|
---|
3 | % Usage:
|
---|
4 | % damage=damage();
|
---|
5 |
|
---|
6 | classdef damage
|
---|
7 | properties (SetAccess=public)
|
---|
8 | %damage
|
---|
9 | isdamage = 0;
|
---|
10 | D = NaN;
|
---|
11 | law = 0;
|
---|
12 | spcdamage = NaN;
|
---|
13 | max_damage = 0;
|
---|
14 |
|
---|
15 | %numerical
|
---|
16 | stabilization = 0;
|
---|
17 | maxiter = 0;
|
---|
18 | elementinterp = '';
|
---|
19 |
|
---|
20 | %general parameters for evolution law:
|
---|
21 | stress_threshold = 0;
|
---|
22 | stress_ubound = 0;
|
---|
23 | kappa = 0;
|
---|
24 | c1 = 0;
|
---|
25 | c2 = 0;
|
---|
26 | c3 = 0;
|
---|
27 | c4 = 0;
|
---|
28 | healing = 0;
|
---|
29 | equiv_stress = 0;
|
---|
30 | requested_outputs = {};
|
---|
31 | end
|
---|
32 | methods
|
---|
33 | function self = damage(varargin) % {{{
|
---|
34 | switch nargin
|
---|
35 | case 0
|
---|
36 | self=setdefaultparameters(self);
|
---|
37 | case 1
|
---|
38 | inputstruct=varargin{1};
|
---|
39 | list1 = properties('damage');
|
---|
40 | list2 = fieldnames(inputstruct);
|
---|
41 | for i=1:length(list1)
|
---|
42 | fieldname = list1{i};
|
---|
43 | if ismember(fieldname,list2),
|
---|
44 | self.(fieldname) = inputstruct.(fieldname);
|
---|
45 | end
|
---|
46 | end
|
---|
47 | otherwise
|
---|
48 | error('constructor not supported');
|
---|
49 | end
|
---|
50 | end % }}}
|
---|
51 | function self = extrude(self,md) % {{{
|
---|
52 | self.D=project3d(md,'vector',self.D,'type','node');
|
---|
53 | self.spcdamage=project3d(md,'vector',self.spcdamage,'type','node');
|
---|
54 | end % }}}
|
---|
55 | function self = setdefaultparameters(self) % {{{
|
---|
56 |
|
---|
57 | %damage parameters:
|
---|
58 | self.isdamage=0;
|
---|
59 | self.D=0;
|
---|
60 | self.law=0;
|
---|
61 |
|
---|
62 | self.max_damage=1-1e-5; %if damage reaches 1, solve becomes singular, as viscosity becomes nil
|
---|
63 |
|
---|
64 | %Type of stabilization used
|
---|
65 | self.stabilization=4;
|
---|
66 |
|
---|
67 | %Maximum number of iterations
|
---|
68 | self.maxiter=100;
|
---|
69 |
|
---|
70 | %finite element interpolation
|
---|
71 | self.elementinterp='P1';
|
---|
72 |
|
---|
73 | %damage evolution parameters
|
---|
74 | self.stress_threshold=1.3e5;
|
---|
75 | self.kappa=2.8;
|
---|
76 | self.healing=0;
|
---|
77 | self.c1=0;
|
---|
78 | self.c2=0;
|
---|
79 | self.c3=0;
|
---|
80 | self.c4=0;
|
---|
81 | self.equiv_stress=0;
|
---|
82 |
|
---|
83 | %output default:
|
---|
84 | self.requested_outputs={'default'};
|
---|
85 |
|
---|
86 | end % }}}
|
---|
87 | function md = checkconsistency(self,md,solution,analyses) % {{{
|
---|
88 |
|
---|
89 | md = checkfield(md,'fieldname','damage.isdamage','values',[1,0]);
|
---|
90 | if self.isdamage,
|
---|
91 | md = checkfield(md,'fieldname','damage.law','numel',[1],'values',[0,1,2,3]);
|
---|
92 | md = checkfield(md,'fieldname','damage.D','>=',0,'<=',self.max_damage,'size',[md.mesh.numberofvertices 1]);
|
---|
93 | md = checkfield(md,'fieldname','damage.spcdamage','Inf',1,'timeseries',1);
|
---|
94 | md = checkfield(md,'fieldname','damage.max_damage','<',1,'>=',0);
|
---|
95 | md = checkfield(md,'fieldname','damage.stabilization','numel',[1],'values',[0 1 2 4]);
|
---|
96 | md = checkfield(md,'fieldname','damage.maxiter','>=0',0);
|
---|
97 | md = checkfield(md,'fieldname','damage.elementinterp','values',{'P1','P2'});
|
---|
98 | md = checkfield(md,'fieldname','damage.stress_threshold','>=',0);
|
---|
99 | md = checkfield(md,'fieldname','damage.stress_ubound','>=',0);
|
---|
100 | md = checkfield(md,'fieldname','damage.kappa','>',1);
|
---|
101 | md = checkfield(md,'fieldname','damage.healing','>=',0);
|
---|
102 | md = checkfield(md,'fieldname','damage.c1','>=',0);
|
---|
103 | md = checkfield(md,'fieldname','damage.c2','>=',0);
|
---|
104 | md = checkfield(md,'fieldname','damage.c3','>=',0);
|
---|
105 | md = checkfield(md,'fieldname','damage.c4','>=',0);
|
---|
106 | md = checkfield(md,'fieldname','damage.equiv_stress','numel',[1],'values',[0 1]);
|
---|
107 | md = checkfield(md,'fieldname','damage.requested_outputs','stringrow',1);
|
---|
108 | elseif (self.law~=0),
|
---|
109 | if (strcmp(solution,'DamageEvolutionSolution')),
|
---|
110 | error('Invalid evolution law (md.damage.law) for a damage solution');
|
---|
111 | end
|
---|
112 | end
|
---|
113 | end % }}}
|
---|
114 | function list=defaultoutputs(self,md) % {{{
|
---|
115 |
|
---|
116 | if strcmp(domaintype(md.mesh),'2Dhorizontal'),
|
---|
117 | list = {'DamageDbar'};
|
---|
118 | else
|
---|
119 | list = {'DamageD'};
|
---|
120 | end
|
---|
121 | end % }}}
|
---|
122 | function disp(self) % {{{
|
---|
123 | disp(sprintf(' Damage:\n'));
|
---|
124 |
|
---|
125 | fielddisplay(self,'isdamage','is damage mechanics being used? {true,false}');
|
---|
126 | if self.isdamage,
|
---|
127 | fielddisplay(self,'law','damage law {''0: analytical'',''1: pralong''}');
|
---|
128 | fielddisplay(self,'D','damage tensor (scalar)');
|
---|
129 | fielddisplay(self,'spcdamage','damage constraints (NaN means no constraint)');
|
---|
130 | fielddisplay(self,'max_damage','maximum possible damage (0<=max_damage<1)');
|
---|
131 |
|
---|
132 | fielddisplay(self,'stabilization','0: no, 1: artificial_diffusivity, 2: SUPG (not working), 4: flux corrected transport');
|
---|
133 | fielddisplay(self,'maxiter','maximum number of non linear iterations');
|
---|
134 | fielddisplay(self,'elementinterp','interpolation scheme for finite elements {''P1'',''P2''}');
|
---|
135 | fielddisplay(self,'stress_threshold','stress threshold for damage initiation (Pa)');
|
---|
136 | fielddisplay(self,'stress_ubound','stress upper bound for damage healing (Pa), arctan law');
|
---|
137 | fielddisplay(self,'kappa','ductility parameter for stress softening and damage');
|
---|
138 | fielddisplay(self,'c1','damage parameter 1');
|
---|
139 | fielddisplay(self,'c2','damage parameter 2');
|
---|
140 | fielddisplay(self,'c3','damage parameter 3');
|
---|
141 | fielddisplay(self,'c4','damage parameter 4');
|
---|
142 | fielddisplay(self,'healing','damage healing parameter');
|
---|
143 | fielddisplay(self,'equiv_stress','0: von Mises, 1: max principal');
|
---|
144 | fielddisplay(self,'requested_outputs','additional outputs requested');
|
---|
145 | end
|
---|
146 |
|
---|
147 | end % }}}
|
---|
148 | function marshall(self,prefix,md,fid) % {{{
|
---|
149 |
|
---|
150 | WriteData(fid,prefix,'object',self,'fieldname','isdamage','format','Boolean');
|
---|
151 | if self.isdamage,
|
---|
152 | WriteData(fid,prefix,'object',self,'fieldname','law','format','Integer');
|
---|
153 | WriteData(fid,prefix,'object',self,'fieldname','D','format','DoubleMat','mattype',1);
|
---|
154 | WriteData(fid,prefix,'object',self,'fieldname','spcdamage','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1,'yts',md.constants.yts);
|
---|
155 | WriteData(fid,prefix,'object',self,'fieldname','max_damage','format','Double');
|
---|
156 |
|
---|
157 | WriteData(fid,prefix,'object',self,'fieldname','stabilization','format','Integer');
|
---|
158 | WriteData(fid,prefix,'object',self,'fieldname','maxiter','format','Integer');
|
---|
159 | WriteData(fid,prefix,'name','md.damage.elementinterp','data',self.elementinterp,'format','String');
|
---|
160 | WriteData(fid,prefix,'object',self,'fieldname','stress_threshold','format','Double');
|
---|
161 | WriteData(fid,prefix,'object',self,'fieldname','stress_ubound','format','Double');
|
---|
162 | WriteData(fid,prefix,'object',self,'fieldname','kappa','format','Double');
|
---|
163 | WriteData(fid,prefix,'object',self,'fieldname','c1','format','Double');
|
---|
164 | WriteData(fid,prefix,'object',self,'fieldname','c2','format','Double');
|
---|
165 | WriteData(fid,prefix,'object',self,'fieldname','c3','format','Double');
|
---|
166 | WriteData(fid,prefix,'object',self,'fieldname','c4','format','Double');
|
---|
167 | WriteData(fid,prefix,'object',self,'fieldname','healing','format','Double');
|
---|
168 | WriteData(fid,prefix,'object',self,'fieldname','equiv_stress','format','Integer');
|
---|
169 | end
|
---|
170 |
|
---|
171 | %process requested outputs
|
---|
172 | outputs = self.requested_outputs;
|
---|
173 | pos = find(ismember(outputs,'default'));
|
---|
174 | if ~isempty(pos),
|
---|
175 | outputs(pos) = []; %remove 'default' from outputs
|
---|
176 | outputs = [outputs defaultoutputs(self,md)]; %add defaults
|
---|
177 | end
|
---|
178 | if self.isdamage,
|
---|
179 | WriteData(fid,prefix,'data',outputs,'name','md.damage.requested_outputs','format','StringArray');
|
---|
180 | end
|
---|
181 |
|
---|
182 | end % }}}
|
---|
183 | function savemodeljs(self,fid,modelname) % {{{
|
---|
184 |
|
---|
185 | writejsdouble(fid,[modelname '.damage.isdamage'],self.isdamage);
|
---|
186 | if self.isdamage,
|
---|
187 | error('savemodeljs error message: not implemented yet!');
|
---|
188 | end
|
---|
189 |
|
---|
190 | end % }}}
|
---|
191 | end
|
---|
192 | end
|
---|