6 //this is the basic operate of vec and mat. speed is the most important thing
19 inline void Set_Vec5_zero(Vec5
&vec
)
28 inline void Set_Vec5(Vec5
&vec
,PetscScalar value
)
37 inline void Set_Vec5(Vec5
&vec
,PetscScalar v1
,PetscScalar v2
,PetscScalar v3
,PetscScalar v4
, PetscScalar v5
)
46 inline Vec5
operator +(const Vec5
&vec1
,const Vec5
&vec2
)
49 sum
.v
[0]=vec1
.v
[0]+vec2
.v
[0];
50 sum
.v
[1]=vec1
.v
[1]+vec2
.v
[1];
51 sum
.v
[2]=vec1
.v
[2]+vec2
.v
[2];
52 sum
.v
[3]=vec1
.v
[3]+vec2
.v
[3];
53 sum
.v
[4]=vec1
.v
[4]+vec2
.v
[4];
57 inline Vec5
operator +(const Vec5
&vec1
,const PetscScalar value
)
60 sum
.v
[0]=vec1
.v
[0]+value
;
61 sum
.v
[1]=vec1
.v
[1]+value
;
62 sum
.v
[2]=vec1
.v
[2]+value
;
63 sum
.v
[3]=vec1
.v
[3]+value
;
64 sum
.v
[4]=vec1
.v
[4]+value
;
68 inline Vec5
operator +(const PetscScalar value
,const Vec5
&vec1
)
71 sum
.v
[0]=vec1
.v
[0]+value
;
72 sum
.v
[1]=vec1
.v
[1]+value
;
73 sum
.v
[2]=vec1
.v
[2]+value
;
74 sum
.v
[3]=vec1
.v
[3]+value
;
75 sum
.v
[4]=vec1
.v
[4]+value
;
79 inline Vec5
operator -(const Vec5
&vec1
,const Vec5
&vec2
)
82 sub
.v
[0]=vec1
.v
[0]-vec2
.v
[0];
83 sub
.v
[1]=vec1
.v
[1]-vec2
.v
[1];
84 sub
.v
[2]=vec1
.v
[2]-vec2
.v
[2];
85 sub
.v
[3]=vec1
.v
[3]-vec2
.v
[3];
86 sub
.v
[4]=vec1
.v
[4]-vec2
.v
[4];
90 inline Vec5
operator -(const Vec5
&vec1
,const PetscScalar value
)
93 sum
.v
[0]=vec1
.v
[0]-value
;
94 sum
.v
[1]=vec1
.v
[1]-value
;
95 sum
.v
[2]=vec1
.v
[2]-value
;
96 sum
.v
[3]=vec1
.v
[3]-value
;
97 sum
.v
[4]=vec1
.v
[4]-value
;
101 inline Vec5
operator -(const PetscScalar value
,const Vec5
&vec1
)
104 sum
.v
[0]=value
-vec1
.v
[0];
105 sum
.v
[1]=value
-vec1
.v
[1];
106 sum
.v
[2]=value
-vec1
.v
[2];
107 sum
.v
[3]=value
-vec1
.v
[3];
108 sum
.v
[4]=value
-vec1
.v
[4];
112 inline Vec5
operator *(const Vec5
&vec
,const PetscScalar
&value
)
115 result
.v
[0]=vec
.v
[0]*value
;
116 result
.v
[1]=vec
.v
[1]*value
;
117 result
.v
[2]=vec
.v
[2]*value
;
118 result
.v
[3]=vec
.v
[3]*value
;
119 result
.v
[4]=vec
.v
[4]*value
;
123 inline Vec5
operator *(const PetscScalar
&value
,const Vec5
&vec
)
126 result
.v
[0]=vec
.v
[0]*value
;
127 result
.v
[1]=vec
.v
[1]*value
;
128 result
.v
[2]=vec
.v
[2]*value
;
129 result
.v
[3]=vec
.v
[3]*value
;
130 result
.v
[4]=vec
.v
[4]*value
;
134 inline Vec5
operator /(const Vec5
&vec
,const PetscScalar
&value
)
137 result
.v
[0]=vec
.v
[0]/value
;
138 result
.v
[1]=vec
.v
[1]/value
;
139 result
.v
[2]=vec
.v
[2]/value
;
140 result
.v
[3]=vec
.v
[3]/value
;
141 result
.v
[4]=vec
.v
[4]/value
;
145 inline Vec5
operator /(const PetscScalar
&value
,const Vec5
&vec
)
148 result
.v
[0]=value
/vec
.v
[0];
149 result
.v
[1]=value
/vec
.v
[1];
150 result
.v
[2]=value
/vec
.v
[2];
151 result
.v
[3]=value
/vec
.v
[3];
152 result
.v
[4]=value
/vec
.v
[4];
156 inline Vec5
operator *(const Vec5
&vec1
,const Vec5
&vec2
)
159 result
.v
[0]=vec1
.v
[0]*vec2
.v
[0];
160 result
.v
[1]=vec1
.v
[1]*vec2
.v
[1];
161 result
.v
[2]=vec1
.v
[2]*vec2
.v
[2];
162 result
.v
[3]=vec1
.v
[3]*vec2
.v
[3];
163 result
.v
[4]=vec1
.v
[4]*vec2
.v
[4];
167 inline Vec5
operator /(const Vec5
&vec1
,const Vec5
&vec2
)
170 result
.v
[0]=vec1
.v
[0]/vec2
.v
[0];
171 result
.v
[1]=vec1
.v
[1]/vec2
.v
[1];
172 result
.v
[2]=vec1
.v
[2]/vec2
.v
[2];
173 result
.v
[3]=vec1
.v
[3]/vec2
.v
[3];
174 result
.v
[4]=vec1
.v
[4]/vec2
.v
[4];
178 //--------------------------------------------------------------------
180 inline PetscScalar
vmaxvalue(const Vec5
&a
)
182 PetscScalar v
=a
.v
[0];
183 if(a
.v
[1]>v
) v
=a
.v
[1];
184 if(a
.v
[2]>v
) v
=a
.v
[2];
185 if(a
.v
[3]>v
) v
=a
.v
[3];
186 if(a
.v
[4]>v
) v
=a
.v
[4];
190 inline Vec5
vmax(const Vec5
&a
,const Vec5
&b
)
193 result
.v
[0]=a
.v
[0]>b
.v
[0] ? a
.v
[0]:b
.v
[0];
194 result
.v
[1]=a
.v
[1]>b
.v
[1] ? a
.v
[1]:b
.v
[1];
195 result
.v
[2]=a
.v
[2]>b
.v
[2] ? a
.v
[2]:b
.v
[2];
196 result
.v
[3]=a
.v
[3]>b
.v
[3] ? a
.v
[3]:b
.v
[3];
197 result
.v
[4]=a
.v
[4]>b
.v
[4] ? a
.v
[4]:b
.v
[4];
201 inline Vec5
vmin(const Vec5
&a
,const Vec5
&b
)
204 result
.v
[0]=a
.v
[0]<b
.v
[0] ? a
.v
[0]:b
.v
[0];
205 result
.v
[1]=a
.v
[1]<b
.v
[1] ? a
.v
[1]:b
.v
[1];
206 result
.v
[2]=a
.v
[2]<b
.v
[2] ? a
.v
[2]:b
.v
[2];
207 result
.v
[3]=a
.v
[3]<b
.v
[3] ? a
.v
[3]:b
.v
[3];
208 result
.v
[4]=a
.v
[4]<b
.v
[4] ? a
.v
[4]:b
.v
[4];
212 inline Vec5
vabs(const Vec5
&a
)
215 result
.v
[0]=fabs(a
.v
[0]);
216 result
.v
[1]=fabs(a
.v
[1]);
217 result
.v
[2]=fabs(a
.v
[2]);
218 result
.v
[3]=fabs(a
.v
[3]);
219 result
.v
[4]=fabs(a
.v
[4]);
223 inline Vec5
vsign(const Vec5
&a
)
226 result
.v
[0]=a
.v
[0]>0.0? 1.0:-1.0;
227 result
.v
[1]=a
.v
[1]>0.0? 1.0:-1.0;
228 result
.v
[2]=a
.v
[2]>0.0? 1.0:-1.0;
229 result
.v
[3]=a
.v
[3]>0.0? 1.0:-1.0;
230 result
.v
[4]=a
.v
[4]>0.0? 1.0:-1.0;
234 //-------------------------------------------------------------------------
236 inline void Set_Mat5_zero(Mat5
&A
)
238 A
.m
[0]=0; A
.m
[1]=0; A
.m
[2]=0; A
.m
[3]=0; A
.m
[4]=0;
239 A
.m
[5]=0; A
.m
[6]=0; A
.m
[7]=0; A
.m
[8]=0; A
.m
[9]=0;
240 A
.m
[10]=0; A
.m
[11]=0; A
.m
[12]=0; A
.m
[13]=0; A
.m
[14]=0;
241 A
.m
[15]=0; A
.m
[16]=0; A
.m
[17]=0; A
.m
[18]=0; A
.m
[19]=0;
242 A
.m
[20]=0; A
.m
[21]=0; A
.m
[22]=0; A
.m
[23]=0; A
.m
[24]=0;
245 inline void Set_Mat5_I(Mat5
&A
)
247 A
.m
[0]=1; A
.m
[1]=0; A
.m
[2]=0; A
.m
[3]=0; A
.m
[4]=0;
248 A
.m
[5]=0; A
.m
[6]=1; A
.m
[7]=0; A
.m
[8]=0; A
.m
[9]=0;
249 A
.m
[10]=0; A
.m
[11]=0; A
.m
[12]=1; A
.m
[13]=0; A
.m
[14]=0;
250 A
.m
[15]=0; A
.m
[16]=0; A
.m
[17]=0; A
.m
[18]=1; A
.m
[19]=0;
251 A
.m
[20]=0; A
.m
[21]=0; A
.m
[22]=0; A
.m
[23]=0; A
.m
[24]=1;
255 inline Mat5
operator +(const Mat5
&A
, const Mat5
&B
)
258 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]; C
.m
[3]=A
.m
[3]+B
.m
[3]; C
.m
[4]=A
.m
[4]+B
.m
[4];
259 C
.m
[5]=A
.m
[5]+B
.m
[5]; 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]; C
.m
[9]=A
.m
[9]+B
.m
[9];
260 C
.m
[10]=A
.m
[10]+B
.m
[10]; C
.m
[11]=A
.m
[11]+B
.m
[11]; C
.m
[12]=A
.m
[12]+B
.m
[12]; C
.m
[13]=A
.m
[13]+B
.m
[13]; C
.m
[14]=A
.m
[14]+B
.m
[14];
261 C
.m
[15]=A
.m
[15]+B
.m
[15]; C
.m
[16]=A
.m
[16]+B
.m
[16]; C
.m
[17]=A
.m
[17]+B
.m
[17]; C
.m
[18]=A
.m
[18]+B
.m
[18]; C
.m
[19]=A
.m
[19]+B
.m
[19];
262 C
.m
[20]=A
.m
[20]+B
.m
[20]; C
.m
[21]=A
.m
[21]+B
.m
[21]; C
.m
[22]=A
.m
[22]+B
.m
[22]; C
.m
[23]=A
.m
[23]+B
.m
[23]; C
.m
[24]=A
.m
[24]+B
.m
[24];
266 inline Mat5
operator -(const Mat5
&A
, const Mat5
&B
)
269 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]; C
.m
[3]=A
.m
[3]-B
.m
[3]; C
.m
[4]=A
.m
[4]-B
.m
[4];
270 C
.m
[5]=A
.m
[5]-B
.m
[5]; 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]; C
.m
[9]=A
.m
[9]-B
.m
[9];
271 C
.m
[10]=A
.m
[10]-B
.m
[10]; C
.m
[11]=A
.m
[11]-B
.m
[11]; C
.m
[12]=A
.m
[12]-B
.m
[12]; C
.m
[13]=A
.m
[13]-B
.m
[13]; C
.m
[14]=A
.m
[14]-B
.m
[14];
272 C
.m
[15]=A
.m
[15]-B
.m
[15]; C
.m
[16]=A
.m
[16]-B
.m
[16]; C
.m
[17]=A
.m
[17]-B
.m
[17]; C
.m
[18]=A
.m
[18]-B
.m
[18]; C
.m
[19]=A
.m
[19]-B
.m
[19];
273 C
.m
[20]=A
.m
[20]-B
.m
[20]; C
.m
[21]=A
.m
[21]-B
.m
[21]; C
.m
[22]=A
.m
[22]-B
.m
[22]; C
.m
[23]=A
.m
[23]-B
.m
[23]; C
.m
[24]=A
.m
[24]-B
.m
[24];
277 inline Mat5
operator *(const Mat5
&A
,const PetscScalar
&a
)
280 C
.m
[0]=a
*A
.m
[0]; C
.m
[1]=a
*A
.m
[1]; C
.m
[2]=a
*A
.m
[2]; C
.m
[3]=a
*A
.m
[3]; C
.m
[4]=a
*A
.m
[4];
281 C
.m
[5]=a
*A
.m
[5]; C
.m
[6]=a
*A
.m
[6]; C
.m
[7]=a
*A
.m
[7]; C
.m
[8]=a
*A
.m
[8]; C
.m
[9]=a
*A
.m
[9];
282 C
.m
[10]=a
*A
.m
[10]; C
.m
[11]=a
*A
.m
[11]; C
.m
[12]=a
*A
.m
[12]; C
.m
[13]=a
*A
.m
[13]; C
.m
[14]=a
*A
.m
[14];
283 C
.m
[15]=a
*A
.m
[15]; C
.m
[16]=a
*A
.m
[16]; C
.m
[17]=a
*A
.m
[17]; C
.m
[18]=a
*A
.m
[18]; C
.m
[19]=a
*A
.m
[19];
284 C
.m
[20]=a
*A
.m
[20]; C
.m
[21]=a
*A
.m
[21]; C
.m
[22]=a
*A
.m
[22]; C
.m
[23]=a
*A
.m
[23]; C
.m
[24]=a
*A
.m
[24];
288 inline Mat5
operator *(const PetscScalar
&a
,const Mat5
&A
)
291 C
.m
[0]=a
*A
.m
[0]; C
.m
[1]=a
*A
.m
[1]; C
.m
[2]=a
*A
.m
[2]; C
.m
[3]=a
*A
.m
[3]; C
.m
[4]=a
*A
.m
[4];
292 C
.m
[5]=a
*A
.m
[5]; C
.m
[6]=a
*A
.m
[6]; C
.m
[7]=a
*A
.m
[7]; C
.m
[8]=a
*A
.m
[8]; C
.m
[9]=a
*A
.m
[9];
293 C
.m
[10]=a
*A
.m
[10]; C
.m
[11]=a
*A
.m
[11]; C
.m
[12]=a
*A
.m
[12]; C
.m
[13]=a
*A
.m
[13]; C
.m
[14]=a
*A
.m
[14];
294 C
.m
[15]=a
*A
.m
[15]; C
.m
[16]=a
*A
.m
[16]; C
.m
[17]=a
*A
.m
[17]; C
.m
[18]=a
*A
.m
[18]; C
.m
[19]=a
*A
.m
[19];
295 C
.m
[20]=a
*A
.m
[20]; C
.m
[21]=a
*A
.m
[21]; C
.m
[22]=a
*A
.m
[22]; C
.m
[23]=a
*A
.m
[23]; C
.m
[24]=a
*A
.m
[24];
299 inline Mat5
operator /(const Mat5
&A
, const PetscScalar
&a
)
302 C
.m
[0]=A
.m
[0]/a
; C
.m
[1]=A
.m
[1]/a
; C
.m
[2]=A
.m
[2]/a
; C
.m
[3]=A
.m
[3]/a
; C
.m
[4]=A
.m
[4]/a
;
303 C
.m
[5]=A
.m
[5]/a
; C
.m
[6]=A
.m
[6]/a
; C
.m
[7]=A
.m
[7]/a
; C
.m
[8]=A
.m
[8]/a
; C
.m
[9]=A
.m
[9]/a
;
304 C
.m
[10]=A
.m
[10]/a
; C
.m
[11]=A
.m
[11]/a
; C
.m
[12]=A
.m
[12]/a
; C
.m
[13]=A
.m
[13]/a
; C
.m
[14]=A
.m
[14]/a
;
305 C
.m
[15]=A
.m
[15]/a
; C
.m
[16]=A
.m
[16]/a
; C
.m
[17]=A
.m
[17]/a
; C
.m
[18]=A
.m
[18]/a
; C
.m
[19]=A
.m
[19]/a
;
306 C
.m
[20]=A
.m
[20]/a
; C
.m
[21]=A
.m
[21]/a
; C
.m
[22]=A
.m
[22]/a
; C
.m
[23]=A
.m
[23]/a
; C
.m
[24]=A
.m
[24]/a
;
310 inline Mat5
operator /(const Mat5
&A
, const Vec5
&a
)
313 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]; C
.m
[3]=A
.m
[3]/a
.v
[0]; C
.m
[4]=A
.m
[4]/a
.v
[0];
314 C
.m
[5]=A
.m
[5]/a
.v
[1]; C
.m
[6]=A
.m
[6]/a
.v
[1]; C
.m
[7]=A
.m
[7]/a
.v
[1]; C
.m
[8]=A
.m
[8]/a
.v
[1]; C
.m
[9]=A
.m
[9]/a
.v
[1];
315 C
.m
[10]=A
.m
[10]/a
.v
[2]; C
.m
[11]=A
.m
[11]/a
.v
[2]; C
.m
[12]=A
.m
[12]/a
.v
[2]; C
.m
[13]=A
.m
[13]/a
.v
[2]; C
.m
[14]=A
.m
[14]/a
.v
[2];
316 C
.m
[15]=A
.m
[15]/a
.v
[3]; C
.m
[16]=A
.m
[16]/a
.v
[3]; C
.m
[17]=A
.m
[17]/a
.v
[3]; C
.m
[18]=A
.m
[18]/a
.v
[3]; C
.m
[19]=A
.m
[19]/a
.v
[3];
317 C
.m
[20]=A
.m
[20]/a
.v
[4]; C
.m
[21]=A
.m
[21]/a
.v
[4]; C
.m
[22]=A
.m
[22]/a
.v
[4]; C
.m
[23]=A
.m
[23]/a
.v
[4]; C
.m
[24]=A
.m
[24]/a
.v
[4];
321 inline Vec5
operator *(const Mat5
&A
, const Vec5
&x
)
324 b
.v
[0]=A
.m
[0]*x
.v
[0]+A
.m
[1]*x
.v
[1]+A
.m
[2]*x
.v
[2]+A
.m
[3]*x
.v
[3]+A
.m
[4]*x
.v
[4];
325 b
.v
[1]=A
.m
[5]*x
.v
[0]+A
.m
[6]*x
.v
[1]+A
.m
[7]*x
.v
[2]+A
.m
[8]*x
.v
[3]+A
.m
[9]*x
.v
[4];
326 b
.v
[2]=A
.m
[10]*x
.v
[0]+A
.m
[11]*x
.v
[1]+A
.m
[12]*x
.v
[2]+A
.m
[13]*x
.v
[3]+A
.m
[14]*x
.v
[4];
327 b
.v
[3]=A
.m
[15]*x
.v
[0]+A
.m
[16]*x
.v
[1]+A
.m
[17]*x
.v
[2]+A
.m
[18]*x
.v
[3]+A
.m
[19]*x
.v
[4];
328 b
.v
[4]=A
.m
[20]*x
.v
[0]+A
.m
[21]*x
.v
[1]+A
.m
[22]*x
.v
[2]+A
.m
[23]*x
.v
[3]+A
.m
[24]*x
.v
[4];
333 inline void mat5_transport(Mat5
&A
)
336 for (int i
=0;i
<5;i
++)
337 for (int j
=0;j
<=i
;j
++)
340 A
.m
[i
*5+j
]=A
.m
[j
*5+i
];
345 inline ostream
& operator << ( ostream
& out
, const Mat5
& A
)
347 for (int i
=0;i
<5;i
++)
349 for (int j
=0;j
<5;j
++)
350 out
<<A
.m
[i
*5+j
]<<" ";