3 % Validation
function for the Assembly of the Stiffness Elasticity
4 % Matrix
for `P_1`-Lagrange finite elements.
6 % The Stiffness Elasticity Matrix is given by
7 % ``\StiffElas_{m,l}=\int_{\DOMH} \Odv^t(\BasisFuncTwoD_m) \Ocv(\BasisFuncTwoD_l)dT, \ \forall (m,l)\in\ENS{1}{2\,\nq}^2,``
8 % where `\BasisFuncTwoD_m` are `P_1`-Lagrange vector basis functions.
9 % Here `\Ocv=(\Occ_{xx},\Occ_{yy},\Occ_{xy})^t` and `\Odv=(\Odc_{xx},\Odc_{yy},2\Odc_{xy})^t`
10 % are the elastic stress and strain tensors respectively.
12 % This Matrix is computed by functions StiffElasAssemblingP1{Version} where {Version} is one of
13 %
'base',
'OptV0',
'OptV1' and
'OptV2'.
14 % - Test 1: computation of the Elastic Stiffness Matrix using previous functions giving errors and computation times
15 % - Test 2: compute ``\int_\DOM \Odv^t(\vecb{u}) \Ocv(\vecb{v})d\q \approx \DOT{\StiffElas \vecb{U}}{\vecb{V}}``
16 % with `\foncdefsmall{\vecb{u}=(u_1,u_2)}{\DOM}{\R^2}` and `\foncdefsmall{\vecb{v}=(v_1,v_2)}{\DOM}{\R^2}`.
17 % We have `\vecb{U}_{2i-1}=u_1(\q^i),` `\vecb{U}_{2i}=u_2(\q^i),` `\vecb{V}_{2i-1}=v_1(\q^i),` `\vecb{V}_{2i}=v_2(\q^i)`
18 %
if Num in {0,2} and `\vecb{U}_{i}=u_1(\q^i),` `\vecb{U}_{i+\nq}=u_2(\q^i),` `\vecb{V}_{i}=v_1(\q^i),` `\vecb{V}_{i+\nq}=v_2(\q^i)`
19 % if Num in {1,3}. Use functions `\vecb{u}` and `\vecb{u}` defined in #
valid_StiffElas.
20 % - Test 3: retrieve order 2 of `P_1`-Lagrange integration
21 % ``|\int_\DOM \Odv^t(\vecb{u}) \Ocv(\vecb{v})d\q - \DOT{\StiffElas \vecb{U}}{\vecb{V}}| \leq C h^2``
24 % - 0 global alternate numbering with local alternate numbering (classical method),
25 % - 1 global block numbering with local alternate numbering,
26 % - 2 global alternate numbering with local block numbering,
27 % - 3 global block numbering with local block numbering.
29 % #StiffElasAssemblingP1base, #StiffElasAssemblingP1OptV0,
30 % #StiffElasAssemblingP1OptV1, #StiffElasAssemblingP1OptV2, #SquareMesh
32 % @author François Cuvelier @date 2012-11-26
36 disp('********************************************')
37 disp('* Stiff Elas Assembling P1 validations *')
38 disp('********************************************')
41 s=sprintf('Global alternate numbering / local alternate numbering');
43 s=sprintf(
'Global block numbering / local alternate numbering');
45 s=sprintf(
'Global alternate numbering / local block numbering');
47 s=sprintf(
'Global block numbering / local block numbering');
49 error(
'invalid Num value')
51 fprintf(' Numbering Choice : %s\n',s);
58 disp('-----------------------------------------')
59 disp(' Test 1: Matrices errors and CPU times ')
60 disp('-----------------------------------------')
67 Test1.error(1)=norm(Mbase-MOptV0,Inf);
68 Test1.name{1}=
'StiffElasAssemblingP1OptV0';
69 fprintf(
' Error P1base vs OptV0 : %e\n',Test1.error(1))
73 Test1.error(2)=norm(Mbase-MOptV1,Inf);
74 Test1.name{2}=
'StiffElasAssemblingP1OptV1';
75 fprintf(
' Error P1base vs OptV1 : %e\n',Test1.error(2))
79 Test1.error(3)=norm(Mbase-MOptV2,Inf);
80 Test1.name{3}=
'StiffElasAssemblingP1OptV2';
81 fprintf(
' Error P1base vs OptV2 : %e\n',Test1.error(3))
83 fprintf(
' CPU times base (ref) : %3.4f (s)\n',T(1))
84 fprintf(
' CPU times OptV0 : %3.4f (s) - Speed Up X%3.3f\n',T(2),T(1)/T(2))
85 fprintf(
' CPU times OptV1 : %3.4f (s) - Speed Up X%3.3f\n',T(3),T(1)/T(3))
86 fprintf(
' CPU times OptV2 : %3.4f (s) - Speed Up X%3.3f\n',T(4),T(1)/T(4))
93 disp(
'-----------------------------------------------------')
94 disp(' Test 2: Validations by integration on [0,1]x[0,1] ')
95 disp('-----------------------------------------------------')
104 U=[u{1}(qf(1,:),qf(2,:));u{2}(qf(1,:),qf(2,:))];
106 V=[v{1}(qf(1,:),qf(2,:));v{2}(qf(1,:),qf(2,:))];
109 U=[u{1}(qf(1,:),qf(2,:)) u{2}(qf(1,:),qf(2,:))]
';
110 V=[v{1}(qf(1,:),qf(2,:)) v{2}(qf(1,:),qf(2,:))]';
113 Test(kk).error=abs(Test(kk).Stiff-U
'*KK*V);
114 fprintf(' functions %d : u(x,y)=(%s,%s), v(x,y)=(%s,%s),\n -> Stiff error=%e\n
', ...
115 kk,Test(kk).cu{1},Test(kk).cu{2},Test(kk).cv{1},Test(kk).cv{2},Test(kk).error);
120 disp('--------------------------------
')
121 disp(' Test 3: Validations by order
')
122 disp('--------------------------------
')
126 lambda=Test(n).lambda;
131 Th=SquareMesh(20*k+50);
133 fprintf(' Matrix size : %d\n
',Th.nq);
134 h(k)=GetMaxLengthEdges(Th.q,Th.me);
136 M=StiffElasAssemblingP1OptV2(Th.nq,Th.nme,Th.q,Th.me,Th.areas,lambda,mu,Num);
140 U=[u{1}(qf(1,:),qf(2,:));u{2}(qf(1,:),qf(2,:))];
142 V=[v{1}(qf(1,:),qf(2,:));v{2}(qf(1,:),qf(2,:))];
145 U=[u{1}(qf(1,:),qf(2,:)) u{2}(qf(1,:),qf(2,:))]';
146 V=[v{1}(qf(1,:),qf(2,:)) v{2}(qf(1,:),qf(2,:))]
';
148 Error(k)=abs(ExSol-U'*M*V);
149 fprintf(
' StiffElasAssemblingP1OptV2 CPU times : %3.3f(s)\n',TT(k));
150 fprintf(
' Error : %e\n',Error(k));
153 loglog(h,Error,
'+-r',h,h*1.1*Error(1)/h(1),
'-sm',h,1.1*Error(1)*(h/h(1)).^2,
'-db')
154 legend('Error','O(h)','O(h^2)')
156 title(sprintf('Test 3 : Stiff Elas. Matrix (Num=%d)',Num))
161 %title(sprintf('Matrix sparsity for %s numbering',s))
164 function checkTest1(Test)
165 I=find(Test.error>1e-14);
167 disp('------------------------')
168 disp(' Test 1 (results): OK')
169 disp('------------------------')
171 disp('----------------------------')
172 disp(' Test 1 (results): FAILED')
173 disp('----------------------------')
177 function checkTest2(Test)
181 if (ismember(Test(k).degree,[0 1]))
182 if (Test(k).error>1e-12)
188 disp('------------------------')
189 disp(' Test 2 (results): OK')
190 disp('------------------------')
192 disp('----------------------------')
193 disp(' Test 2 (results): FAILED')
194 disp('----------------------------')
198 function checkTest3(h,error)
200 P=polyfit(log(h),log(error),1);
202 disp('------------------------')
203 disp(' Test 3 (results): OK')
204 fprintf(' -> found numerical order %f. Must be 2\n',P(1))
205 disp('------------------------')
207 disp('----------------------------')
208 disp(' Test 3 (results): FAILED')
209 fprintf(' -> found numerical order %f. Must be 2\n',P(1))
210 disp('----------------------------')