Mechanics of Defect Evolution Library
Loading...
Searching...
No Matches
UniformOpen.h
Go to the documentation of this file.
1/* This file is part of MoDELib, the Mechanics Of Defects Evolution Library.
2 *
3 *
4 * MoDELib is distributed without any warranty under the
5 * GNU General Public License (GPL) v2 <http://www.gnu.org/licenses/>.
6 */
7
8#ifndef model_UNIFORMOPEN_H_
9#define model_UNIFORMOPEN_H_
10
11#include <cmath>
12#include <assert.h>
13#include <Eigen/Dense>
14
15namespace model
16{
17
18 /**************************************************/
19 /* UniformOpen: general case */
20 /**************************************************/
24 template<short unsigned int dim, size_t qOrder>
26 {
28 {
29 assert(0 && "UniformOpen: dimensionality not implemented.");
30 }
31
32 };
33
34
35 /**************************************************/
36 /* UniformOpen: template specialization dim=1 */
37 /**************************************************/
43 template<size_t qOrder>
44 struct UniformOpen<1,qOrder>
45 {
46 static Eigen::Matrix<double,2,qOrder> abcsissasAndWeights()
47 {
48 Eigen::Matrix<double,2,qOrder> U;
49 for(size_t k=0;k<qOrder;++k)
50 {
51 U(0,k)= 0.5/qOrder+k*1.0/qOrder; //1.0 forces double conversion
52 U(1,k)= 1.0/qOrder;
53 }
54 return U;
55 }
56
57 };
58
59 /**************************************************/
60 /* UniformOpen: template specialization dim=2 */
61 /**************************************************/
66 template<size_t qOrder>
67 struct UniformOpen<2,qOrder>
68 {
69// static_assert(0,"THIS CLASS IS NOT COMPATIBLE WITH QUADRATURE.H YET, BECAUSE THE RETURNED MATRIX HAS qOrder^2 COLS, INSTEAD OF qOrder");
70
71 static Eigen::Matrix<double,3,qOrder> abcsissasAndWeights()
72 {
73 std::cout<<"UniformOpen<2,"<<qOrder<<"> computing abcsissas and weights"<<std::endl;
74
75 const double nd=sqrt(qOrder);
76 const size_t N=round(nd);
77 assert(nd==N && "qOrder must be a perfect sqaure (e.g. 1,4,9,16...)");
78
79 const double w=0.5/qOrder; // constant weight
80
81 Eigen::Matrix<double,3,qOrder> U;
82 size_t m=0;
83 // Triangles pointing up
84 for(size_t i=0;i<N;++i)
85 {
86 for(size_t j=0;j<N-i;++j)
87 {
88 U(0,m)= 1.0/N*(i+1.0/3.0); //1.0 forces double conversion
89 U(1,m)= 1.0/N*(j+1.0/3.0); //1.0 forces double conversion
90 U(2,m)= w;
91 m++;
92 }
93 }
94
95 // Triangles pointing down
96 for(size_t i=0;i<N-1;++i)
97 {
98 for(size_t j=0;j<N-1-i;++j)
99 {
100 U(0,m)= 1.0/N*(i+2.0/3.0); //1.0 forces double conversion
101 U(1,m)= 1.0/N*(j+2.0/3.0); //1.0 forces double conversion
102 U(2,m)= w;
103 m++;
104 }
105 }
106
107 assert(m==qOrder);
108
109// std::cout<<U.transpose()<<std::endl;
110
111 return U;
112 }
113
114
115
116 };
117
118} // namespace model
119#endif
120
static Eigen::Matrix< double, 2, qOrder > abcsissasAndWeights()
Definition UniformOpen.h:46
static Eigen::Matrix< double, 3, qOrder > abcsissasAndWeights()
Definition UniformOpen.h:71
int j
REAL w[16]
int k
int i
void t struct mesh * m