6 //--------------------------------------------------------------------
7 //this is the basic operate of vec and mat. speed is the most important thing
18 inline void Set_Vec3_zero(Vec3
&vec
)
25 inline void Set_Vec3(Vec3
&vec
,PetscScalar value
)
32 inline void Set_Vec3(Vec3
&vec
,PetscScalar v1
, PetscScalar v2
,PetscScalar v3
)
39 inline Vec3
operator +(const Vec3
&vec1
,const Vec3
&vec2
)
42 sum
.v
[0]=vec1
.v
[0]+vec2
.v
[0];
43 sum
.v
[1]=vec1
.v
[1]+vec2
.v
[1];
44 sum
.v
[2]=vec1
.v
[2]+vec2
.v
[2];
48 inline Vec3
operator +(const Vec3
&vec1
,const PetscScalar value
)
51 sum
.v
[0]=vec1
.v
[0]+value
;
52 sum
.v
[1]=vec1
.v
[1]+value
;
53 sum
.v
[2]=vec1
.v
[2]+value
;
57 inline Vec3
operator +(const PetscScalar value
,const Vec3
&vec1
)
60 sum
.v
[0]=vec1
.v
[0]+value
;
61 sum
.v
[1]=vec1
.v
[1]+value
;
62 sum
.v
[2]=vec1
.v
[2]+value
;
66 inline Vec3
operator -(const Vec3
&vec1
,const Vec3
&vec2
)
69 sub
.v
[0]=vec1
.v
[0]-vec2
.v
[0];
70 sub
.v
[1]=vec1
.v
[1]-vec2
.v
[1];
71 sub
.v
[2]=vec1
.v
[2]-vec2
.v
[2];
75 inline Vec3
operator -(const Vec3
&vec1
,const PetscScalar value
)
78 sum
.v
[0]=vec1
.v
[0]-value
;
79 sum
.v
[1]=vec1
.v
[1]-value
;
80 sum
.v
[2]=vec1
.v
[2]-value
;
84 inline Vec3
operator -(const PetscScalar value
,const Vec3
&vec1
)
87 sum
.v
[0]=value
-vec1
.v
[0];
88 sum
.v
[1]=value
-vec1
.v
[1];
89 sum
.v
[2]=value
-vec1
.v
[2];
93 inline Vec3
operator -(const Vec3
&vec1
)
102 inline Vec3
operator *(const Vec3
&vec
,const PetscScalar
&value
)
105 result
.v
[0]=vec
.v
[0]*value
;
106 result
.v
[1]=vec
.v
[1]*value
;
107 result
.v
[2]=vec
.v
[2]*value
;
111 inline Vec3
operator *(const PetscScalar
&value
,const Vec3
&vec
)
114 result
.v
[0]=vec
.v
[0]*value
;
115 result
.v
[1]=vec
.v
[1]*value
;
116 result
.v
[2]=vec
.v
[2]*value
;
120 inline Vec3
operator /(const Vec3
&vec
,const PetscScalar
&value
)
123 result
.v
[0]=vec
.v
[0]/value
;
124 result
.v
[1]=vec
.v
[1]/value
;
125 result
.v
[2]=vec
.v
[2]/value
;
129 inline Vec3
operator /(const PetscScalar
&value
,const Vec3
&vec
)
132 result
.v
[0]=value
/vec
.v
[0];
133 result
.v
[1]=value
/vec
.v
[1];
134 result
.v
[2]=value
/vec
.v
[2];
138 inline Vec3
operator *(const Vec3
&vec1
,const Vec3
&vec2
)
141 result
.v
[0]=vec1
.v
[0]*vec2
.v
[0];
142 result
.v
[1]=vec1
.v
[1]*vec2
.v
[1];
143 result
.v
[2]=vec1
.v
[2]*vec2
.v
[2];
147 inline Vec3
operator /(const Vec3
&vec1
,const Vec3
&vec2
)
150 result
.v
[0]=vec1
.v
[0]/vec2
.v
[0];
151 result
.v
[1]=vec1
.v
[1]/vec2
.v
[1];
152 result
.v
[2]=vec1
.v
[2]/vec2
.v
[2];
157 //----------------------------------------------------
158 inline void Set_Mat3_zero(Mat3
&A
)
160 A
.m
[0]=0; A
.m
[1]=0; A
.m
[2]=0;
161 A
.m
[3]=0; A
.m
[4]=0; A
.m
[5]=0;
162 A
.m
[6]=0; A
.m
[7]=0; A
.m
[8]=0;
165 inline void Set_Mat3_I(Mat3
&A
)
167 A
.m
[0]=1; A
.m
[1]=0; A
.m
[2]=0;
168 A
.m
[3]=0; A
.m
[4]=1; A
.m
[5]=0;
169 A
.m
[6]=0; A
.m
[7]=0; A
.m
[8]=1;
173 inline Mat3
Set_Mat3_Scale(const Mat3
&A
, const Vec3
&a
)
176 C
.m
[0]=A
.m
[0]*a
.v
[0]; C
.m
[1]=A
.m
[1]*a
.v
[0]; C
.m
[2]=A
.m
[2]*a
.v
[0];
177 C
.m
[3]=A
.m
[3]*a
.v
[1]; C
.m
[4]=A
.m
[4]*a
.v
[1]; C
.m
[5]=A
.m
[5]*a
.v
[1];
178 C
.m
[6]=A
.m
[6]*a
.v
[2]; C
.m
[7]=A
.m
[7]*a
.v
[2]; C
.m
[8]=A
.m
[8]*a
.v
[2];
183 inline Mat3
operator +(const Mat3
&A
, const Mat3
&B
)
186 C
.m
[0]=A
.m
[0]+B
.m
[0]; C
.m
[1]=A
.m
[1]+B
.m
[1]; C
.m
[2]=A
.m
[2]+B
.m
[2];
187 C
.m
[3]=A
.m
[3]+B
.m
[3]; C
.m
[4]=A
.m
[4]+B
.m
[4]; C
.m
[5]=A
.m
[5]+B
.m
[5];
188 C
.m
[6]=A
.m
[6]+B
.m
[6]; C
.m
[7]=A
.m
[7]+B
.m
[7]; C
.m
[8]=A
.m
[8]+B
.m
[8];
192 inline Mat3
operator -(const Mat3
&A
, const Mat3
&B
)
195 C
.m
[0]=A
.m
[0]-B
.m
[0]; C
.m
[1]=A
.m
[1]-B
.m
[1]; C
.m
[2]=A
.m
[2]-B
.m
[2];
196 C
.m
[3]=A
.m
[3]-B
.m
[3]; C
.m
[4]=A
.m
[4]-B
.m
[4]; C
.m
[5]=A
.m
[5]-B
.m
[5];
197 C
.m
[6]=A
.m
[6]-B
.m
[6]; C
.m
[7]=A
.m
[7]-B
.m
[7]; C
.m
[8]=A
.m
[8]-B
.m
[8];
201 inline Mat3
operator -(const Mat3
&A
)
204 C
.m
[0]=-A
.m
[0]; C
.m
[1]=-A
.m
[1]; C
.m
[2]=-A
.m
[2];
205 C
.m
[3]=-A
.m
[3]; C
.m
[4]=-A
.m
[4]; C
.m
[5]=-A
.m
[5];
206 C
.m
[6]=-A
.m
[6]; C
.m
[7]=-A
.m
[7]; C
.m
[8]=-A
.m
[8];
210 inline Mat3
operator *(const Mat3
&A
,const PetscScalar
&a
)
213 C
.m
[0]=a
*A
.m
[0]; C
.m
[1]=a
*A
.m
[1]; C
.m
[2]=a
*A
.m
[2];
214 C
.m
[3]=a
*A
.m
[3]; C
.m
[4]=a
*A
.m
[4]; C
.m
[5]=a
*A
.m
[5];
215 C
.m
[6]=a
*A
.m
[6]; C
.m
[7]=a
*A
.m
[7]; C
.m
[8]=a
*A
.m
[8];
219 inline Mat3
operator *(const PetscScalar
&a
,const Mat3
&A
)
222 C
.m
[0]=a
*A
.m
[0]; C
.m
[1]=a
*A
.m
[1]; C
.m
[2]=a
*A
.m
[2];
223 C
.m
[3]=a
*A
.m
[3]; C
.m
[4]=a
*A
.m
[4]; C
.m
[5]=a
*A
.m
[5];
224 C
.m
[6]=a
*A
.m
[6]; C
.m
[7]=a
*A
.m
[7]; C
.m
[8]=a
*A
.m
[8];
228 inline Mat3
operator /(const Mat3
&A
, const PetscScalar
&a
)
231 C
.m
[0]=A
.m
[0]/a
; C
.m
[1]=A
.m
[1]/a
; C
.m
[2]=A
.m
[2]/a
;
232 C
.m
[3]=A
.m
[3]/a
; C
.m
[4]=A
.m
[4]/a
; C
.m
[5]=A
.m
[5]/a
;
233 C
.m
[6]=A
.m
[6]/a
; C
.m
[7]=A
.m
[7]/a
; C
.m
[8]=A
.m
[8]/a
;
237 inline Mat3
operator /(const Mat3
&A
, const Vec3
&a
)
240 C
.m
[0]=A
.m
[0]/a
.v
[0]; C
.m
[1]=A
.m
[1]/a
.v
[0]; C
.m
[2]=A
.m
[2]/a
.v
[0];
241 C
.m
[3]=A
.m
[3]/a
.v
[1]; C
.m
[4]=A
.m
[4]/a
.v
[1]; C
.m
[5]=A
.m
[5]/a
.v
[1];
242 C
.m
[6]=A
.m
[6]/a
.v
[2]; C
.m
[7]=A
.m
[7]/a
.v
[2]; C
.m
[8]=A
.m
[8]/a
.v
[2];
246 inline Vec3
operator *(const Mat3
&A
, const Vec3
&x
)
249 b
.v
[0]=A
.m
[0]*x
.v
[0] + A
.m
[1]*x
.v
[1] + A
.m
[2]*x
.v
[2];
250 b
.v
[1]=A
.m
[3]*x
.v
[0] + A
.m
[4]*x
.v
[1] + A
.m
[5]*x
.v
[2];
251 b
.v
[2]=A
.m
[6]*x
.v
[0] + A
.m
[7]*x
.v
[1] + A
.m
[8]*x
.v
[2];
255 inline Mat3
operator *(const Mat3
&A
, const Mat3
&B
)
258 C
.m
[0]=A
.m
[0]*B
.m
[0] + A
.m
[1]*B
.m
[3] + A
.m
[2]*B
.m
[6];
259 C
.m
[1]=A
.m
[0]*B
.m
[1] + A
.m
[1]*B
.m
[4] + A
.m
[2]*B
.m
[7];
260 C
.m
[2]=A
.m
[0]*B
.m
[2] + A
.m
[1]*B
.m
[5] + A
.m
[2]*B
.m
[8];
262 C
.m
[3]=A
.m
[3]*B
.m
[0] + A
.m
[4]*B
.m
[3] + A
.m
[5]*B
.m
[6];
263 C
.m
[4]=A
.m
[3]*B
.m
[1] + A
.m
[4]*B
.m
[4] + A
.m
[5]*B
.m
[7];
264 C
.m
[5]=A
.m
[3]*B
.m
[2] + A
.m
[4]*B
.m
[5] + A
.m
[5]*B
.m
[8];
266 C
.m
[6]=A
.m
[6]*B
.m
[0] + A
.m
[7]*B
.m
[3] + A
.m
[8]*B
.m
[6];
267 C
.m
[7]=A
.m
[6]*B
.m
[1] + A
.m
[7]*B
.m
[4] + A
.m
[8]*B
.m
[7];
268 C
.m
[8]=A
.m
[6]*B
.m
[2] + A
.m
[7]*B
.m
[5] + A
.m
[8]*B
.m
[8];
273 inline void mat3_transport(Mat3
&A
)
277 for (int i
=0;i
<3;i
++)
278 for (int j
=0;j
<=i
;j
++)
281 A
.m
[i
*3+j
]=A
.m
[j
*3+i
];
286 inline ostream
& operator << ( ostream
& out
, const Mat3
& A
)
288 for (int i
=0;i
<3;i
++)
290 for (int j
=0;j
<3;j
++)
291 out
<<A
.m
[i
*3+j
]<<" ";