source: issm/trunk/src/m/classes/damage.m@ 16560

Last change on this file since 16560 was 16560, checked in by Mathieu Morlighem, 11 years ago

merged trunk-jpl and trunk for revision 16554

File size: 5.5 KB
Line 
1%DAMAGEICE class definition
2%
3% Usage:
4% damage=damage();
5
6classdef 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
157end
Note: See TracBrowser for help on using the repository browser.