47 #define mmax(a,b)(a>b?a:b)
48 #define mmin(a,b)(a<b?a:b)
49 #define ssqr(x) ((x)*(x))
61 #define sizecmat sizeof(cmat)
62 #define sizecvect sizeof(cvect)
63 #define deter2(a11,a12,a21,a22) (a11*a22 - a12*a21)
65 const float epsilon =(float)1.0e-20;
69 typedef Complex creal;
71 typedef Complex ccomplex;
72 #define sizeccomplex sizeof(ccomplex)
74 #define sizecreal sizeof(creal)
75 #define sizeccreal sizeof(ccreal)
77 void cgauss( cmat& a, cvect& b);
79 float norm2(
const float& a);
80 float imagpart(
const float& a);
81 float realpart(
const float& a);
82 cmat id(
const cvect& a);
83 Complex id(
const Complex& x);
84 void myassert(
int what);
92 Complex() { re = 0.F; im =0.F; }
93 Complex(
float r,
float i =0.F) {re =r; im =i;}
95 float& real () {
return re;};
96 float real()
const {
return re;}
97 float& imag() {
return im;};
98 float imag()
const {
return im;}
102 Complex& operator=(
const Complex& a) { re =a.re; im = a.im;
return *
this; }
104 Complex& operator*=(
const Complex& a) { re =a.re*re - a.im*im;im= a.re*im + a.im*re;
return *
this; }
106 float xl=ssqr(a.re) + ssqr(a.im); re =(a.re*re+a.im*im)/xl; im =(a.re*im-a.im*re)/xl;
109 Complex& operator+=(
const Complex& a) { re +=a.re; im += a.im;
return *
this; }
110 Complex& operator-=(
const Complex& a) { re -=a.re; im -= a.im;
return *
this; }
111 Complex& operator*=(
const float a) { re *= a;im *= a;
return *
this; }
112 Complex& operator/=(
const float a) { re /= a;im /= a;
return *
this; }
113 Complex& operator+=(
const float a) { re +=a;
return *
this; }
114 Complex& operator-=(
const float a) { re -=a;
return *
this; }
115 Complex& operator-() { re =-re; im =-im;
return *
this; }
116 float modul2()
const {
return ssqr(re)+ssqr(im);}
125 Complex c;
float xl=ssqr(b.re) + ssqr(b.im); c.re =(a.re*b.re+a.im*b.im)/xl; c.im =(b.re*a.im-b.im*a.re)/xl;
134 friend float norm2(
const Complex& a) {
return a.modul2(); }
135 friend float realpart(
const Complex& a){
return a.re; }
136 friend float imagpart(
const Complex& a){
return a.im; }
137 friend std::ostream& operator<<(std::ostream& os,
const Complex& a);
138 friend std::istream& operator>>(std::istream& os,
Complex& a);
142 friend float cos(
const Complex&);
143 friend float sin(
const Complex&);
151 return acos(re/sqrt(modul2()));
153 return 8*atan(1.) - acos(re/sqrt(modul2()));
159 pow(
const Complex& c,
const float& f)
161 Complex z(std::cos(f*c.arg()), std::sin(f*c.arg()));
162 return std::pow(std::sqrt(c.modul2()),f)*z;
165 cos(
const Complex& c)
167 return std::cos(c.real())*std::cosh(c.imag()) + std::sin(c.real())*std::sinh(c.imag());\
170 sin(
const Complex& c)
172 return std::sin(c.real())*std::cosh(c.imag()) - std::cos(c.real())*std::sinh(c.imag());
177 cvect() { val[0]=0.F; val[1]=0.F; }
178 cvect(
const cvect& r) { val[0]=r.val[0];val[1]=r.val[1];}
180 cvect(ccreal r) { val[0]=r;val[1]=r;}
181 ccreal& operator[] (
int i) {
return val[i];}
182 const ccreal& operator[] (
int i)
const {
return val[i];}
183 float modul2() {
return norm2(val[0])+norm2(val[1]);}
184 ccreal operator*=(
const cvect& a) {
return val[0]*a.val[0] + val[1]*a.val[1]; }
185 cvect& operator*=(
const ccreal a) { val[0] *= a; val[1] *= a;
return *
this; }
186 friend ccreal operator *(
const cvect& a,
const cvect& b) { cvect c(a);
return c *= b; }
187 friend cvect operator *(
const cvect& a,
const ccreal b) { cvect c(a);
return c *= b; }
188 friend cvect operator *(
const ccreal b,
const cvect& a) { cvect c(a);
return c *= b; }
189 cvect& operator/=(
const ccreal a) {val[0] /= a;val[1] /= a;
return *
this; }
190 friend cvect operator /(
const cvect& a,
const ccreal b) { cvect c(a);
return c /= b; }
191 cvect& operator+=(
const cvect& a) { val[0] += a.val[0];val[1] += a.val[1];
return *
this; }
192 cvect& operator+=(
const ccreal a) { val[0] += a;val[1] += a;
return *
this; }
193 friend cvect operator +(
const cvect& a,
const cvect& b) { cvect c(a);
return c += b; }
194 friend cvect operator +(
const cvect& a,
const ccreal b) { cvect c(a);
return c += b; }
195 friend cvect operator +(
const ccreal b,
const cvect& a) { cvect c(a);
return c += b; }
196 cvect& operator-=(
const cvect& a) { val[0] -= a.val[0];val[1] -= a.val[1];
return *
this; }
197 cvect& operator-=(
const ccreal a) { val[0] -= a;val[1] -= a;
return *
this; }
198 friend cvect operator -(
const cvect& a,
const cvect& b) { cvect c(a);
return c -= b; }
199 friend cvect operator -(
const cvect& a,
const ccreal b) { cvect c(a);
return c -= b; }
200 friend cvect operator -(
const ccreal b,
const cvect& a) { cvect c(b);
return c -= a; }
201 cvect& operator=(
const cvect& a) { val[0] = a.val[0];val[1] = a.val[1];
return *
this; }
202 cvect& operator=(
const ccreal a) {val[0] = a; val[1] = a;
return *
this; }
203 cvect& operator-() { val[0] = -val[0]; val[1] = -val[1];
return *
this; }
204 friend float norm2( cvect& a) {
return a.modul2();}
205 friend float realpart(
const cvect& a){
return realpart(a.val[0]); }
207 friend std::ostream& operator<<(std::ostream& os, cvect& a);
208 friend std::istream& operator>>(std::istream& os, cvect& a);
214 public: ccreal val[4];
215 cmat() {val[0]=0.F;val[1]=0.F;val[2]=0.F;val[3]=0.F; }
216 cmat(
const cmat& r) {val[0]=r.val[0];val[1]=r.val[1];val[2]=r.val[2];val[3]=r.val[3];}
218 cmat(ccreal r) { val[0] = r;val[1] = r;val[2] = r;val[3] = r;}
219 ccreal& operator() (
int i,
int j) {
return val[i+i+j];}
220 ccreal& operator[] (
int i) {
return val[i];}
221 const ccreal& operator[] (
int i)
const {
return val[i];}
222 float modul2() {
return val[0]+val[1]+val[2]+val[3];}
223 cmat operator*=(
const cmat& a)
225 b.val[0] =val[0]*a.val[0]+val[1]*a.val[2];
226 b.val[1] =val[0]*a.val[1]+val[1]*a.val[3];
227 b.val[2] =val[2]*a.val[0]+val[3]*a.val[2];
228 b.val[3] =val[2]*a.val[1]+val[3]*a.val[3];
231 cmat& operator*=(
const ccreal a) { val[0] *= a; val[1] *= a; val[2] *= a; val[3] *= a;
return *
this; }
232 friend cmat operator *(
const cmat& a,
const cmat& b) { cmat c(a);
return c *= b; }
233 friend cmat operator *(
const cmat& a,
const ccreal b) { cmat c(a);
return c *= b; }
234 friend cmat operator *(
const ccreal b,
const cmat& a) { cmat c(a);
return c *= b; }
235 cmat& operator/=(
const ccreal a) { val[0] /= a; val[1] /= a; val[2] /= a; val[3] /= a;
return *
this; }
236 friend cmat operator /(
const cmat& a,
const ccreal b) { cmat c(a);
return c /= b; }
237 cmat& operator+=(
const cmat& a){val[0]+=a.val[0];val[1]+=a.val[1];val[2]+=a.val[2];val[3]+=a.val[3];
return *
this; }
238 cmat& operator+=(
const ccreal a) { val[0] += a; val[1] += a; val[2] += a; val[3] += a;
return *
this; }
239 friend cmat operator +(
const cmat& a,
const cmat& b) { cmat c(a);
return c += b; }
240 friend cmat operator +(
const cmat& a,
const ccreal b) { cmat c(a);
return c += b; }
241 friend cmat operator +(
const ccreal b,
const cmat& a) { cmat c(a);
return c += b; }
243 cmat& operator-=(
const cmat& a){val[0]-=a.val[0];val[1]-=a.val[1];val[2]-=a.val[2];val[3]-=a.val[3];
return *
this; }
244 cmat& operator-=(
const ccreal a) { val[0] -= a; val[2] -= a; val[1] -= a; val[3] -= a;
return *
this; }
245 friend cmat operator -(
const cmat& a,
const cmat& b) { cmat c(a);
return c -= b; }
246 friend cmat operator -(
const cmat& a,
const ccreal b) { cmat c(a);
return c -= b; }
247 friend cmat operator -(
const ccreal b,
const cmat& a) { cmat c(b);
return c -= a; }
248 cmat& operator=(
const cmat& a){val[0]=a.val[0];val[1]=a.val[1];val[2]=a.val[2]; val[3] = a.val[3];
return *
this; }
249 cmat& operator=(
const ccreal a) { val[0] = a; val[1] = a; val[2] = a; val[3] = a;
return *
this; }
250 cmat& operator-() { val[0] = -val[0];val[1] = -val[1];val[2] = -val[2];val[3] = -val[3];
return *
this; }
251 friend float norm2( cmat& a) {
return a.modul2();}
253 friend cvect operator *(
const cmat& a,
const cvect& b)
254 { cvect c; c.val[0] = a.val[0]*b.val[0]+a.val[1]*b.val[1];
255 c.val[1] = a.val[2]*b.val[0]+a.val[3]*b.val[1];
257 friend cvect operator *(
const cvect& b,
const cmat& a)
258 { cvect c; c.val[0] = a.val[0]*b.val[0]+a.val[2]*b.val[1];
259 c.val[1] = a.val[1]*b.val[0]+a.val[3]*b.val[1];
261 friend cvect operator /(
const cvect& b,
const cmat& a)
262 { cvect c; ccreal s = deter2(a.val[0],a.val[1], a.val[2],a.val[3]);
263 if(norm2(s)<epsilon) { s = epsilon;}
264 c.val[0] = deter2(b.val[0],a.val[1], b.val[1],a.val[3]) / s;
265 c.val[1] = deter2(a.val[0],b.val[0], a.val[2],b.val[1]) / s;
268 friend cmat operator /(
const cmat& b,
const cmat& a)
270 cmat c; ccreal s = deter2(a.val[0],a.val[1], a.val[2],a.val[3]);
271 if(norm2(s)<epsilon){ s = epsilon;}
272 c.val[0] = deter2(b.val[0],a.val[1], b.val[2],a.val[3]) / s;
273 c.val[2] = deter2(a.val[0],b.val[0], a.val[2],b.val[2]) / s;
274 c.val[1] = deter2(b.val[1],a.val[1], b.val[3],a.val[3]) / s;
275 c.val[3] = deter2(a.val[0],b.val[1], a.val[2],b.val[3]) / s;
278 friend std::ostream& operator<<(std::ostream& os, cmat& a);
279 friend std::istream& operator>>(std::istream& os, cmat& a);
280 friend cmat id(
const cvect& a);
317 ~
Acreal() {
delete [] cc;cc=0;szz = 0;}
318 void destroy() {
delete [] cc;cc=0;szz = 0;}
319 creal& operator[] (
long i) {
return cc[i];}
320 creal* operator&() {
return cc;}
321 void init(
long newSize);
334 ~
Aint() {
delete [] cc;cc=0;szz = 0;}
335 void destroy() {
delete [] cc;cc=0;szz = 0;}
336 int& operator[] (
long i) { myassert((i< szz)&&(i>=0));
return cc[i];}
337 int* operator&() {
return cc;}
350 ~
Acvect() {
delete [] cc;cc=0;szz = 0;}
351 void destroy() {
delete [] cc;cc=0;szz = 0;}
352 cvect& operator[] (
long i) {
return cc[i];}
353 cvect* operator&() {
return cc;}
371 void destroy() {
delete [] cc;cc=0;szz = 0;}
372 cmat& operator[] (
long i) {
return cc[i];}
373 cmat* operator&() {
return cc;}
385 ~
AAcmat() {
delete [] cc;cc=0;szz = 0;}
386 void destroy() {
delete [] cc;cc=0;szz = 0;}
387 Acmat& operator[] (
long i) {
return cc[i];}
388 Acmat* operator&() {
return cc;}
400 ~
AAcreal() {
delete [] cc;cc=0;szz = 0;}
401 void destroy() {
delete [] cc;cc=0;szz = 0;}
402 Acreal& operator[] (
long i) {
return cc[i];}
403 Acreal* operator&() {
return cc;}
Definition: femMisc.hpp:342
cvect(ccreal r)
cvect( cvect& r) { val[0]=r.val[0];val[1]=r.val[1];} // copy constructor
Definition: femMisc.hpp:180
Definition: femMisc.hpp:326
Definition: femMisc.hpp:377
Definition: femDisk.cpp:50
cmat(ccreal r)
cmat(cmat& r) { val[0]=r.val[0]; val[1]=r.val[1]; val[2]=r.val[2]; val[3]=r.val[3]; } // copy constru...
Definition: femMisc.hpp:218
Definition: femMisc.hpp:392
Definition: femMisc.hpp:175
Definition: femMisc.hpp:212
Definition: femMisc.hpp:309
Definition: femMisc.hpp:357
Definition: femMisc.hpp:86