GRASS 8 Programmer's Manual
8.5.0(2026)-8d6ceba290
Toggle main menu visibility
Loading...
Searching...
No Matches
csolv.c
Go to the documentation of this file.
1
/* csolv.c CCMATH mathematics library source code.
2
*
3
* Copyright (C) 2000 Daniel A. Atkinson All rights reserved.
4
* This code may be redistributed under the terms of the GNU library
5
* public license (LGPL). ( See the lgpl.license file for details.)
6
* ------------------------------------------------------------------------
7
*/
8
9
#include <stdlib.h>
10
#include "
ccmath.h
"
11
12
int
csolv
(
Cpx
*a,
Cpx
*b,
int
n)
13
{
14
int
i, j, k, lc;
15
16
Cpx
*
ps
, *p, *q, *pa, *pd;
17
18
Cpx
z, h, *q0;
19
20
double
s, t, tq = 0., zr = 1.e-15;
21
22
q0 = (
Cpx
*)calloc(n,
sizeof
(
Cpx
));
23
pa = a;
24
pd = a;
25
for
(j = 0; j < n; ++j, ++pa, pd += n + 1) {
26
if
(j > 0) {
27
for
(i = 0, p = pa, q = q0; i < n; ++i, p += n)
28
*q++ = *p;
29
for
(i = 1; i < n; ++i) {
30
lc = i < j ? i : j;
31
z.
re
= z.
im
= 0.;
32
for
(k = 0, p = pa + i * n - j, q = q0; k < lc; ++k, ++q, ++p) {
33
z.
re
+= p->re * q->re - p->im * q->im;
34
z.
im
+= p->im * q->re + p->re * q->im;
35
}
36
q0[i].
re
-= z.
re
;
37
q0[i].
im
-= z.
im
;
38
}
39
for
(i = 0, p = pa, q = q0; i < n; ++i, p += n)
40
*p = *q++;
41
}
42
s = fabs(pd->
re
) + fabs(pd->
im
);
43
lc = j;
44
for
(k = j + 1,
ps
= pd; k < n; ++k) {
45
ps
+= n;
46
if
((t = fabs(
ps
->re) + fabs(
ps
->im)) > s) {
47
s = t;
48
lc = k;
49
}
50
}
51
tq = tq > s ? tq : s;
52
if
(s < zr * tq) {
53
free(q0);
54
return
-1;
55
}
56
if
(lc != j) {
57
h = b[j];
58
b[j] = b[lc];
59
b[lc] = h;
60
p = a + n * j;
61
q = a + n * lc;
62
for
(k = 0; k < n; ++k) {
63
h = *p;
64
*p++ = *q;
65
*q++ = h;
66
}
67
}
68
t = pd->
re
* pd->
re
+ pd->
im
* pd->
im
;
69
h.
re
= pd->
re
/ t;
70
h.
im
= -(pd->
im
) / t;
71
for
(k = j + 1,
ps
= pd + n; k < n; ++k,
ps
+= n) {
72
z.
re
=
ps
->re * h.
re
-
ps
->im * h.
im
;
73
z.
im
=
ps
->im * h.
re
+
ps
->re * h.
im
;
74
*
ps
= z;
75
}
76
}
77
for
(j = 1,
ps
= b + 1; j < n; ++j, ++
ps
) {
78
for
(k = 0, p = a + n * j, q = b, z.
re
= z.
im
= 0.; k < j; ++k) {
79
z.
re
+= p->
re
* q->
re
- p->
im
* q->
im
;
80
z.
im
+= p->
im
* q->
re
+ p->
re
* q->
im
;
81
++p;
82
++q;
83
}
84
ps
->re -= z.
re
;
85
ps
->im -= z.
im
;
86
}
87
for
(j = n - 1, --
ps
, pd = a + n * n - 1; j >= 0; --j, pd -= n + 1) {
88
for
(k = j + 1, p = pd + 1, q = b + j + 1, z.
re
= z.
im
= 0.; k < n;
89
++k) {
90
z.
re
+= p->
re
* q->
re
- p->
im
* q->
im
;
91
z.
im
+= p->
im
* q->
re
+ p->
re
* q->
im
;
92
++p;
93
++q;
94
}
95
h.
re
=
ps
->re - z.
re
;
96
h.
im
=
ps
->im - z.
im
;
97
t = pd->
re
* pd->
re
+ pd->
im
* pd->
im
;
98
ps
->re = (h.
re
* pd->
re
+ h.
im
* pd->
im
) / t;
99
ps
->im = (h.
im
* pd->
re
- h.
re
* pd->
im
) / t;
100
--
ps
;
101
}
102
free(q0);
103
return
0;
104
}
ccmath.h
Cpx
struct complex Cpx
Definition
ccmath.h:41
csolv
int csolv(Cpx *a, Cpx *b, int n)
Definition
csolv.c:12
ps
struct ps_state ps
Definition
psdriver/graph_set.c:26
complex::re
double re
Definition
ccmath.h:39
complex::im
double im
Definition
ccmath.h:39
external
ccmath
csolv.c
Generated on
for GRASS 8 Programmer's Manual by
1.18.0