NEURON
znorm.c
Go to the documentation of this file.
1 #include <../../nrnconf.h>
2 
3 /**************************************************************************
4 **
5 ** Copyright (C) 1993 David E. Steward & Zbigniew Leyk, all rights reserved.
6 **
7 ** Meschach Library
8 **
9 ** This Meschach Library is provided "as is" without any express
10 ** or implied warranty of any kind with respect to this software.
11 ** In particular the authors shall not be liable for any direct,
12 ** indirect, special, incidental or consequential damages arising
13 ** in any way from use of the software.
14 **
15 ** Everyone is granted permission to copy, modify and redistribute this
16 ** Meschach Library, provided:
17 ** 1. All copies contain this copyright notice.
18 ** 2. All modified copies shall carry a notice stating who
19 ** made the last modification and the date of such modification.
20 ** 3. No charge is made for this software or works derived from it.
21 ** This clause shall not be construed as constraining other software
22 ** distributed on the same medium as this software, nor is a
23 ** distribution fee considered a charge.
24 **
25 ***************************************************************************/
26 
27 
28 /*
29  A collection of functions for computing norms: scaled and unscaled
30  Complex version
31 */
32 static char rcsid[] = "znorm.c,v 1.1 1997/12/04 17:56:14 hines Exp";
33 
34 #include <stdio.h>
35 #include "zmatrix.h"
36 #include <math.h>
37 
38 
39 
40 /* _zv_norm1 -- computes (scaled) 1-norms of vectors */
41 double _zv_norm1(x,scale)
42 ZVEC *x;
43 VEC *scale;
44 {
45  int i, dim;
46  Real s, sum;
47 
48  if ( x == ZVNULL )
49  error(E_NULL,"_zv_norm1");
50  dim = x->dim;
51 
52  sum = 0.0;
53  if ( scale == VNULL )
54  for ( i = 0; i < dim; i++ )
55  sum += zabs(x->ve[i]);
56  else if ( scale->dim < dim )
57  error(E_SIZES,"_zv_norm1");
58  else
59  for ( i = 0; i < dim; i++ )
60  {
61  s = scale->ve[i];
62  sum += ( s== 0.0 ) ? zabs(x->ve[i]) : zabs(x->ve[i])/fabs(s);
63  }
64 
65  return sum;
66 }
67 
68 /* square -- returns x^2 */
69 /******************************
70 double square(x)
71 double x;
72 { return x*x; }
73 ******************************/
74 
75 #define square(x) ((x)*(x))
76 
77 /* _zv_norm2 -- computes (scaled) 2-norm (Euclidean norm) of vectors */
78 double _zv_norm2(x,scale)
79 ZVEC *x;
80 VEC *scale;
81 {
82  int i, dim;
83  Real s, sum;
84 
85  if ( x == ZVNULL )
86  error(E_NULL,"_zv_norm2");
87  dim = x->dim;
88 
89  sum = 0.0;
90  if ( scale == VNULL )
91  for ( i = 0; i < dim; i++ )
92  sum += square(x->ve[i].re) + square(x->ve[i].im);
93  else if ( scale->dim < dim )
94  error(E_SIZES,"_v_norm2");
95  else
96  for ( i = 0; i < dim; i++ )
97  {
98  s = scale->ve[i];
99  sum += ( s== 0.0 ) ? square(x->ve[i].re) + square(x->ve[i].im) :
100  (square(x->ve[i].re) + square(x->ve[i].im))/square(s);
101  }
102 
103  return sqrt(sum);
104 }
105 
106 #define max(a,b) ((a) > (b) ? (a) : (b))
107 
108 /* _zv_norm_inf -- computes (scaled) infinity-norm (supremum norm) of vectors */
109 double _zv_norm_inf(x,scale)
110 ZVEC *x;
111 VEC *scale;
112 {
113  int i, dim;
114  Real s, maxval, tmp;
115 
116  if ( x == ZVNULL )
117  error(E_NULL,"_zv_norm_inf");
118  dim = x->dim;
119 
120  maxval = 0.0;
121  if ( scale == VNULL )
122  for ( i = 0; i < dim; i++ )
123  {
124  tmp = zabs(x->ve[i]);
125  maxval = max(maxval,tmp);
126  }
127  else if ( scale->dim < dim )
128  error(E_SIZES,"_zv_norm_inf");
129  else
130  for ( i = 0; i < dim; i++ )
131  {
132  s = scale->ve[i];
133  tmp = ( s == 0.0 ) ? zabs(x->ve[i]) : zabs(x->ve[i])/fabs(s);
134  maxval = max(maxval,tmp);
135  }
136 
137  return maxval;
138 }
139 
140 /* zm_norm1 -- compute matrix 1-norm -- unscaled
141  -- complex version */
142 double zm_norm1(A)
143 ZMAT *A;
144 {
145  int i, j, m, n;
146  Real maxval, sum;
147 
148  if ( A == ZMNULL )
149  error(E_NULL,"zm_norm1");
150 
151  m = A->m; n = A->n;
152  maxval = 0.0;
153 
154  for ( j = 0; j < n; j++ )
155  {
156  sum = 0.0;
157  for ( i = 0; i < m; i ++ )
158  sum += zabs(A->me[i][j]);
159  maxval = max(maxval,sum);
160  }
161 
162  return maxval;
163 }
164 
165 /* zm_norm_inf -- compute matrix infinity-norm -- unscaled
166  -- complex version */
167 double zm_norm_inf(A)
168 ZMAT *A;
169 {
170  int i, j, m, n;
171  Real maxval, sum;
172 
173  if ( A == ZMNULL )
174  error(E_NULL,"zm_norm_inf");
175 
176  m = A->m; n = A->n;
177  maxval = 0.0;
178 
179  for ( i = 0; i < m; i++ )
180  {
181  sum = 0.0;
182  for ( j = 0; j < n; j ++ )
183  sum += zabs(A->me[i][j]);
184  maxval = max(maxval,sum);
185  }
186 
187  return maxval;
188 }
189 
190 /* zm_norm_frob -- compute matrix frobenius-norm -- unscaled */
192 ZMAT *A;
193 {
194  int i, j, m, n;
195  Real sum;
196 
197  if ( A == ZMNULL )
198  error(E_NULL,"zm_norm_frob");
199 
200  m = A->m; n = A->n;
201  sum = 0.0;
202 
203  for ( i = 0; i < m; i++ )
204  for ( j = 0; j < n; j ++ )
205  sum += square(A->me[i][j].re) + square(A->me[i][j].im);
206 
207  return sqrt(sum);
208 }
209 
#define max(a, b)
Definition: znorm.c:106
#define ZVNULL
Definition: zmatrix.h:57
#define Real
Definition: machine.h:189
#define ZMNULL
Definition: zmatrix.h:58
Definition: zmatrix.h:50
Definition: zmatrix.h:44
static char rcsid[]
Definition: znorm.c:32
Real * ve
Definition: matrix.h:69
#define square(x)
Definition: znorm.c:75
Definition: matrix.h:67
double _zv_norm_inf(ZVEC *x, VEC *scale)
Definition: znorm.c:109
#define E_SIZES
Definition: err.h:95
int const size_t const size_t n
Definition: nrngsl.h:12
_CONST char * s
Definition: system.cpp:74
double zm_norm_inf(ZMAT *A)
Definition: znorm.c:167
u_int dim
Definition: matrix.h:68
#define E_NULL
Definition: err.h:102
size_t j
double zm_norm_frob(ZMAT *A)
Definition: znorm.c:191
double _zv_norm1(ZVEC *x, VEC *scale)
Definition: znorm.c:41
sqrt
Definition: extdef.h:3
double _zv_norm2(ZVEC *x, VEC *scale)
Definition: znorm.c:78
#define i
Definition: md1redef.h:12
#define A(i)
Definition: multisplit.cpp:61
#define error(err_num, fn_name)
Definition: err.h:73
fabs
Definition: extdef.h:3
double zabs(complex z)
Definition: zfunc.c:65
#define VNULL
Definition: matrix.h:631
double zm_norm1(ZMAT *A)
Definition: znorm.c:142