File qucs-conj.diff of Package qucs
diff --git a/qucs-core/src/eqnsys.cpp b/qucs-core/src/eqnsys.cpp
index 2b54271..994c1bf 100644
--- a/qucs-core/src/eqnsys.cpp
+++ b/qucs-core/src/eqnsys.cpp
@@ -867,6 +867,16 @@ nr_double_t eqnsys<nr_type_t>::euclidian_r (int r, int c) {
return scale * sqrt (n);
}
+template <typename nr_type_t>
+inline nr_type_t cond_conj (nr_type_t t) {
+ return std::tr1::conj(t);
+}
+
+template <>
+inline double cond_conj (double t) {
+ return t;
+}
+
/* The function decomposes the matrix A into two matrices, the
orthonormal matrix Q and the upper triangular matrix R. The
original matrix is replaced by the householder vectors in the lower
@@ -920,7 +930,7 @@ void eqnsys<nr_type_t>::factorize_qrh (void) {
// apply householder transformation to remaining columns
for (r = c + 1; r < N; r++) {
- for (f = 0, k = c; k < N; k++) f += conj (A_(k, c)) * A_(k, r);
+ for (f = 0, k = c; k < N; k++) f += cond_conj (A_(k, c)) * A_(k, r);
for (k = c; k < N; k++) A_(k, r) -= 2.0 * f * A_(k, c);
}
@@ -994,7 +1004,7 @@ void eqnsys<nr_type_t>::substitute_qrh (void) {
// form the new right hand side Q'B
for (c = 0; c < N - 1; c++) {
// scalar product u_k^T * B
- for (f = 0, r = c; r < N; r++) f += conj (A_(r, c)) * B_(r);
+ for (f = 0, r = c; r < N; r++) f += cond_conj (A_(r, c)) * B_(r);
// z - 2 * f * u_k
for (r = c; r < N; r++) B_(r) -= 2.0 * f * A_(r, c);
}
@@ -1021,9 +1031,9 @@ void eqnsys<nr_type_t>::substitute_qr_householder (void) {
for (c = 0; c < N; c++) {
if (T_(c) != 0) {
// scalar product u' * B
- for (f = B_(c), r = c + 1; r < N; r++) f += conj (A_(r, c)) * B_(r);
+ for (f = B_(c), r = c + 1; r < N; r++) f += cond_conj (A_(r, c)) * B_(r);
// z - T * f * u
- f *= conj (T_(c)); B_(c) -= f;
+ f *= cond_conj (T_(c)); B_(c) -= f;
for (r = c + 1; r < N; r++) B_(r) -= f * A_(r, c);
}
}
@@ -1060,7 +1070,7 @@ void eqnsys<nr_type_t>::substitute_qr_householder_ls (void) {
for (c = N - 1; c >= 0; c--) {
if (T_(c) != 0) {
// scalar product u' * B
- for (f = B_(c), r = c + 1; r < N; r++) f += conj (A_(r, c)) * B_(r);
+ for (f = B_(c), r = c + 1; r < N; r++) f += cond_conj (A_(r, c)) * B_(r);
// z - T * f * u_k
f *= T_(c); B_(c) -= f;
for (r = c + 1; r < N; r++) B_(r) -= f * A_(r, c);
@@ -1169,9 +1179,9 @@ void eqnsys<nr_type_t>::householder_apply_left (int c, nr_type_t t) {
for (r = c + 1; r < N; r++) {
// calculate f = u' * A (a scalar product)
f = A_(c, r);
- for (k = c + 1; k < N; k++) f += conj (A_(k, c)) * A_(k, r);
+ for (k = c + 1; k < N; k++) f += cond_conj (A_(k, c)) * A_(k, r);
// calculate A -= T * f * u
- f *= conj (t); A_(c, r) -= f;
+ f *= cond_conj (t); A_(c, r) -= f;
for (k = c + 1; k < N; k++) A_(k, r) -= f * A_(k, c);
}
}
@@ -1186,9 +1196,9 @@ void eqnsys<nr_type_t>::householder_apply_right (int r, nr_type_t t) {
for (c = r + 1; c < N; c++) {
// calculate f = u' * A (a scalar product)
f = A_(c, r + 1);
- for (k = r + 2; k < N; k++) f += conj (A_(r, k)) * A_(c, k);
+ for (k = r + 2; k < N; k++) f += cond_conj (A_(r, k)) * A_(c, k);
// calculate A -= T * f * u
- f *= conj (t); A_(c, r + 1) -= f;
+ f *= cond_conj (t); A_(c, r + 1) -= f;
for (k = r + 2; k < N; k++) A_(c, k) -= f * A_(r, k);
}
}
@@ -1210,9 +1220,9 @@ void eqnsys<nr_type_t>::householder_apply_right_extern (int r, nr_type_t t) {
for (c = r + 1; c < N; c++) {
// calculate f = u' * A (a scalar product)
f = V_(c, r + 1);
- for (k = r + 2; k < N; k++) f += conj (A_(r, k)) * V_(c, k);
+ for (k = r + 2; k < N; k++) f += cond_conj (A_(r, k)) * V_(c, k);
// calculate A -= T * f * u
- f *= conj (t); V_(c, r + 1) -= f;
+ f *= cond_conj (t); V_(c, r + 1) -= f;
for (k = r + 2; k < N; k++) V_(c, k) -= f * A_(r, k);
}
}
@@ -1249,7 +1259,7 @@ void eqnsys<nr_type_t>::substitute_svd (void) {
f = 0.0;
// non-zero result only if S is non-zero
if (S_(c) != 0.0) {
- for (r = 0; r < N; r++) f += conj (U_(r, c)) * B_(r);
+ for (r = 0; r < N; r++) f += cond_conj (U_(r, c)) * B_(r);
// this is the divide by S
f /= S_(c);
}
@@ -1257,7 +1267,7 @@ void eqnsys<nr_type_t>::substitute_svd (void) {
}
// matrix multiply by V to get the final solution
for (r = 0; r < N; r++) {
- for (f = 0.0, c = 0; c < N; c++) f += conj (V_(c, r)) * R_(c);
+ for (f = 0.0, c = 0; c < N; c++) f += cond_conj (V_(c, r)) * R_(c);
X_(r) = f;
}
}
@@ -1265,6 +1275,7 @@ void eqnsys<nr_type_t>::substitute_svd (void) {
/* The function decomposes the matrix A into three other matrices U, S
and V'. The matrix A is overwritten by the U matrix, S is stored
in a separate vector and V in a separate matrix. */
+
template <class nr_type_t>
void eqnsys<nr_type_t>::factorize_svd (void) {
int i, j, l;
@@ -1292,7 +1303,7 @@ void eqnsys<nr_type_t>::factorize_svd (void) {
for (l = N, i = N - 1; i >= 0; l = i--) {
if (i < N - 1) {
if ((t = R_(i)) != 0.0) {
- householder_apply_right_extern (i, conj (t));
+ householder_apply_right_extern (i, cond_conj (t));
}
else for (j = l; j < N; j++) // cleanup this row
V_(i, j) = V_(j, i) = 0.0;
@@ -1306,7 +1317,7 @@ void eqnsys<nr_type_t>::factorize_svd (void) {
for (j = l; j < N; j++) // cleanup upper row
A_(i, j) = 0.0;
if ((t = T_(i)) != 0.0) {
- householder_apply_left (i, conj (t));
+ householder_apply_left (i, cond_conj (t));
for (j = l; j < N; j++) A_(j, i) *= -t;
}
else for (j = l; j < N; j++) // cleanup this column