OptFEM3DP1 Toolbox  20130618_070730
Matlab/Octave Optimized P1-Lagrange Finite Element Method in 3D
 All Files Functions Variables Pages
validMassVF3DP1.m
Go to the documentation of this file.
1 function validMassVF3DP1(Num)
2 % Copyright:
3 % See \ref license
4 
5  disp('*******************************************')
6  disp('* MassVF 3D Assembling P1 validations *')
7  disp('*******************************************')
8  switch Num
9  case 0
10  s=sprintf('Global alternate numbering / local alternate numbering');
11  case 1
12  s=sprintf('Global block numbering / local alternate numbering');
13  case 2
14  s=sprintf('Global alternate numbering / local block numbering');
15  case 3
16  s=sprintf('Global block numbering / local block numbering');
17  otherwise
18  error('invalid Num value')
19  end
20  fprintf(' Numbering Choice : %s\n',s);
21 
22 
23 
24  Th=CubeMesh(10);
25 
26 % TEST 1
27  disp('----------------------------------StiffElasAssemblingP1OptV2-------')
28  disp(' Test 1: Matrices errors and CPU times ')
29  fprintf(' Matrix size : %d\n',3*Th.nq);
30  disp('-----------------------------------------')
31  tic();
32  Mbase=MassVFAssembling3DP1base(Th.nq,Th.nme,Th.me,Th.volumes,Num);
33  T(1)=toc();
34  tic();
35  MOptV0=MassVFAssembling3DP1OptV0(Th.nq,Th.nme,Th.me,Th.volumes,Num);
36  T(2)=toc();
37  Test1.error(1)=norm(Mbase-MOptV0,Inf);
38  Test1.name{1}='MassVFAssembling3DP1OptV0';
39  fprintf(' Error P1base vs OptV0 : %e\n',Test1.error(1))
40  tic();
41  MOptV1=MassVFAssembling3DP1OptV1(Th.nq,Th.nme,Th.me,Th.volumes,Num);
42  T(3)=toc();
43  Test1.error(2)=norm(Mbase-MOptV1,Inf);
44  Test1.name{2}='MassVFAssembling3DP1OptV1';
45  fprintf(' Error P1base vs OptV1 : %e\n',Test1.error(2))
46  tic();
47  MOptV2=MassVFAssembling3DP1OptV2(Th.nq,Th.nme,Th.me,Th.volumes,Num);
48  T(4)=toc();
49  Test1.error(3)=norm(Mbase-MOptV2,Inf);
50  Test1.name{3}='MassVFAssembling3DP1OptV2';
51  fprintf(' Error P1base vs OptV2 : %e\n',Test1.error(3))
52  MOptV3=MassVFAssembling3DP1OptV3(Th.nq,Th.nme,Th.me,Th.volumes,Num);
53  T(5)=toc();
54  Test1.error(4)=norm(Mbase-MOptV3,Inf);
55  Test1.name{4}='MassVFAssembling3DP1OptV3';
56  fprintf(' Error P1base vs OptV3 : %e\n',Test1.error(4))
57 
58  fprintf(' CPU times base (ref) : %3.4f (s)\n',T(1))
59  fprintf(' CPU times OptV0 : %3.4f (s) - Speed Up X%3.3f\n',T(2),T(1)/T(2))
60  fprintf(' CPU times OptV1 : %3.4f (s) - Speed Up X%3.3f\n',T(3),T(1)/T(3))
61  fprintf(' CPU times OptV2 : %3.4f (s) - Speed Up X%3.3f\n',T(4),T(1)/T(4))
62  fprintf(' CPU times OptV3 : %3.4f (s) - Speed Up X%3.3f\n',T(5),T(1)/T(5))
63  checkTest1(Test1)
64 
65 
66 
67 
68 % TEST 2
69  disp('-----------------------------------------------------------')
70  disp(' Test 2: Validations by integration on [0,1]x[0,1]x[0,1] ')
71  disp('-----------------------------------------------------------')
72  Test=valid_MECA();
73  qf=Th.q;
74  for kk=1:length(Test)
75  KK=MassVFAssembling3DP1OptV2(Th.nq,Th.nme,Th.me,Th.volumes,Num);
76  u=Test(kk).u;
77  v=Test(kk).v;
78  switch Num
79  case {0,2}
80  U=[u{1}(qf(1,:),qf(2,:),qf(3,:));u{2}(qf(1,:),qf(2,:),qf(3,:));u{3}(qf(1,:),qf(2,:),qf(3,:))];
81  U=U(:);
82  V=[v{1}(qf(1,:),qf(2,:),qf(3,:));v{2}(qf(1,:),qf(2,:),qf(3,:));v{3}(qf(1,:),qf(2,:),qf(3,:))];
83  V=V(:);
84  case {1,3}
85  U=[u{1}(qf(1,:),qf(2,:),qf(3,:)) u{2}(qf(1,:),qf(2,:)) u{3}(qf(1,:),qf(2,:),qf(3,:))]';
86  V=[v{1}(qf(1,:),qf(2,:),qf(3,:)) v{2}(qf(1,:),qf(2,:),qf(3,:)) v{3}(qf(1,:),qf(2,:),qf(3,:))]';
87  end
88  %whos
89  Test(kk).error=abs(Test(kk).Mass-U'*KK*V);
90  fprintf(' functions %d : u(x,y,z)=(%s,%s,%s), v(x,y,z)=(%s,%s,%s),\n -> MassVF error=%e\n', ...
91  kk,Test(kk).cu{1},Test(kk).cu{2},Test(kk).cu{3},Test(kk).cv{1},Test(kk).cv{2},Test(kk).cv{3},Test(kk).error);
92  end
93  checkTest2(Test)
94 
95 % TEST 3
96  disp('--------------------------------')
97  disp(' Test 3: Validations by order ')
98  disp('--------------------------------')
99  n=length(Test);
100  u=Test(n).u;
101  v=Test(n).v;
102  ExSol=Test(n).Mass;
103  fprintf(' functions %d : u(x,y,z)=(%s,%s,%s), v(x,y,z)=(%s,%s,%s),\n',n, ...
104  Test(n).cu{1},Test(n).cu{2},Test(n).cu{3}, ...
105  Test(n).cv{1},Test(n).cv{2},Test(n).cv{3});
106  fprintf(' Integral of dot(u(x,y,z),v(x,y,z)) over unit cube : %.16f\n',ExSol);
107  N=10;
108  for k=1:N
109  Th=CubeMesh(5*k+5);
110  qf=Th.q;
111  fprintf('(%d/%d) Matrix size : %d\n',k,N,Th.nq);
112  h(k)=GetMaxLengthEdges(Th.q,Th.me);
113  tic();
114  M=MassVFAssembling3DP1OptV2(Th.nq,Th.nme,Th.me,Th.volumes,Num);
115  TT(k)=toc();
116  switch Num
117  case {0,2}
118  U=[u{1}(qf(1,:),qf(2,:),qf(3,:));u{2}(qf(1,:),qf(2,:),qf(3,:));u{3}(qf(1,:),qf(2,:),qf(3,:))];
119  U=U(:);
120  V=[v{1}(qf(1,:),qf(2,:),qf(3,:));v{2}(qf(1,:),qf(2,:),qf(3,:));v{3}(qf(1,:),qf(2,:),qf(3,:))];
121  V=V(:);
122  case {1,3}
123  U=[u{1}(qf(1,:),qf(2,:),qf(3,:)) u{2}(qf(1,:),qf(2,:)) u{3}(qf(1,:),qf(2,:),qf(3,:))]';
124  V=[v{1}(qf(1,:),qf(2,:),qf(3,:)) v{2}(qf(1,:),qf(2,:),qf(3,:)) v{3}(qf(1,:),qf(2,:),qf(3,:))]';
125  end
126  Error(k)=abs(ExSol-U'*M*V);
127  fprintf(' MassVFAssembling3DP1OptV2 CPU times : %3.3f(s)\n',TT(k));
128  fprintf(' Error : %e\n',Error(k));
129  end
130 
131  loglog(h,Error,'+-r',h,h*1.1*Error(1)/h(1),'-sm',h,1.1*Error(1)*(h/h(1)).^2,'-db')
132  legend('Error','O(h)','O(h^2)')
133  xlabel('h')
134  title(sprintf('Test 3 : 3D MassVF Matrix (Num=%d)',Num))
135  checkTest3(h,Error)
136 
137  %figure(3)
138  %spy(M)
139  %title(sprintf('Matrix sparsity for %s numbering',s))
140 end
141 
142 function checkTest1(Test)
143  I=find(Test.error>1e-14);
144  if isempty(I)
145  disp('------------------------')
146  disp(' Test 1 (results): OK')
147  disp('------------------------')
148  else
149  disp('----------------------------')
150  disp(' Test 1 (results): FAILED')
151  disp('----------------------------')
152  end
153 end
154 
155 function checkTest2(Test)
156  N=length(Test);
157  cntFalse=0;
158  for k=1:N
159  if (ismember(Test(k).degree,[0 1]))
160  if (Test(k).error>1e-12)
161  cntFalse=cntFalse+1;
162  end
163  end
164  end
165  if (cntFalse==0)
166  disp('------------------------')
167  disp(' Test 2 (results): OK')
168  disp('------------------------')
169  else
170  disp('----------------------------')
171  disp(' Test 2 (results): FAILED')
172  disp('----------------------------')
173  end
174 end
175 
176 function checkTest3(h,error)
177  % order 2
178  P=polyfit(log(h),log(error),1);
179  if abs(P(1)-2)<5e-2
180  disp('------------------------')
181  disp(' Test 3 (results): OK')
182  fprintf(' -> found numerical order %f. Must be 2\n',P(1))
183  disp('------------------------')
184  else
185  disp('----------------------------')
186  disp(' Test 3 (results): FAILED')
187  fprintf(' -> found numerical order %f. Must be 2\n',P(1))
188  disp('----------------------------')
189  end
190 end