OpendTect  6.6
linsolv.h
Go to the documentation of this file.
1 #pragma once
2 
3 /*@+
4 ________________________________________________________________________
5 
6  (C) dGB Beheer B.V.; (LICENSE) http://opendtect.org/OpendTect_license.txt
7  Author: Kristofer Tingdahl
8  Date: 07-10-1999
9 ________________________________________________________________________
10 
11 @$
12 */
13 
14 #include "arrayndimpl.h"
15 #include "executor.h"
16 #include "uistrings.h"
17 #include <math.h>
18 
25 template <class T>
26 mClass(Algo) LinSolver
27 {
28 public:
29  LinSolver(const Array2D<T>& A);
31 
33 
34  bool init(TaskRunner* =0);
35  bool ready() const { return ready_; }
36  int size() const { return n_; }
37 
38  void apply(const T* b,T* x) const;
39 
40 protected:
42  int* croutsidx_;
43  int n_;
44  bool parity_;
45  bool ready_;
46 
47 };
48 
49 
50 template <class T>
53 public:
56 
57 protected:
58 
59  int nextStep();
61  {
62  return errmsg_.isEmpty()
63  ? tr("Generating linear model")
64  : errmsg_;
65  }
67  { return tr("Nr points processed"); }
68 
69  od_int64 nrDone() const { return curidx_; }
70  od_int64 totalNr() const { return totalnr_; }
71 
72  int curidx_;
73  int totalnr_;
74  int imax_;
75  int* croutsidx_;
79 };
80 
81 
82 template <class T>
84  : Executor("Generating linear model")
85  , croutsmatrix_(A)
86  , totalnr_(A.info().getSize(0))
87  , curidx_(0)
88  , imax_(mUdf(int))
89  , vv_(totalnr_,0)
90  , croutsidx_(croutsidx)
91 {
92  if ( A.info().getSize(0) != A.info().getSize(1) )
93  {
95  return;
96  }
97 
98  for ( int idx=0; idx<totalnr_; idx++ )
99  {
100  T maxval = 0;
101  for ( int idy=0; idy<totalnr_; idy++ )
102  {
103  const T temp = fabs( croutsmatrix_.get(idx,idy) );
104  if ( temp > maxval )
105  maxval = temp;
106  }
107 
108  if ( mIsZero(maxval,mDefEps) )
109  {
111  return;
112  }
113 
114  vv_[idx] = 1.0f/maxval;
115  }
116 }
117 
118 
119 #define TINY 1.0e-20
120 
121 template <class T>
123 {
124  if ( !errmsg_.isEmpty() )
125  return ErrorOccurred();
126 
127  if ( curidx_ >= totalnr_ )
128  return Finished();
129 
130  for (int idx=0; idx<curidx_; idx++ )
131  {
132  T sum = croutsmatrix_.get( idx, curidx_ );
133  for ( int idz=0; idz<idx; idz++ )
134  sum -= croutsmatrix_.get(idx,idz) * croutsmatrix_.get(idz,curidx_);
135 
136  croutsmatrix_.set( idx, curidx_, sum );
137  }
138 
139  T big = 0.0;
140  for ( int idx=curidx_; idx<totalnr_; idx++ )
141  {
142  T sum = croutsmatrix_.get( idx, curidx_ );
143  for ( int idz=0; idz<curidx_; idz++ )
144  {
145  sum -= croutsmatrix_.get(idx,idz)*croutsmatrix_.get(idz,curidx_);
146  }
147 
148  croutsmatrix_.set( idx, curidx_, sum );
149 
150  T dum = vv_[idx]*fabs(sum);
151 
152  if ( dum >= big )
153  {
154  big = dum;
155  imax_ = idx;
156  }
157  }
158 
159  if ( curidx_ != imax_ )
160  {
161  for ( int idz=0; idz<totalnr_; idz++ )
162  {
163  const T dum = croutsmatrix_.get( imax_, idz );
164  croutsmatrix_.set( imax_, idz, croutsmatrix_.get(curidx_,idz) );
165  croutsmatrix_.set( curidx_, idz, dum );
166  }
167 
168  vv_[imax_] = vv_[curidx_];
169  }
170 
171  croutsidx_[curidx_] = imax_;
172 
173  if ( mIsZero(croutsmatrix_.get(curidx_,curidx_),mDefEps) )
174  croutsmatrix_.set(curidx_,curidx_,TINY);
175 
176  if ( curidx_ != totalnr_-1 )
177  {
178  const T dum = 1.0f/croutsmatrix_.get(curidx_,curidx_);
179  for ( int idx=curidx_+1; idx<totalnr_; idx++ )
180  croutsmatrix_.set(idx, curidx_, dum*croutsmatrix_.get(idx,curidx_));
181  }
182 
183  return ++curidx_>=totalnr_ ? Finished() : MoreToDo();
184 }
185 
186 #undef TINY
187 
188 
189 template <class T> inline
191  : croutsmatrix_(A)
192  , croutsidx_(new int[A.info().getSize(0)])
193  , n_(A.info().getSize(0))
194  , ready_(false)
195  , parity_(true)
196 {
197 }
198 
199 
200 template <class T> inline
202 {
203  LinSolverTask<T> task( croutsmatrix_, croutsidx_ );
204  ready_ = TaskRunner::execute( taskr, task );
205  return ready_;
206 }
207 
208 
209 template <class T> inline
211  : croutsmatrix_(s.croutsmatrix_)
212  , croutsidx_(0)
213  , n_(s.n_)
214  , parity_(s.parity_)
215  , ready_(s.ready_)
216 {
217  if ( s.croutsidx_ )
218  {
219  croutsidx_ = new int[s.n_];
220  for ( int idx=0; idx<s.n_; idx++ )
221  croutsidx_[idx] = s.croutsidx_[idx];
222  }
223 }
224 
225 
226 template <class T> inline
228 {
229  delete [] croutsidx_;
230 }
231 
232 
233 template <class T> inline
234 void LinSolver<T>::apply( const T* b, T* x ) const
235 {
236  if ( !ready_ )
237  {
238  pErrMsg("Cannot apply. Did you forget to call LinSolver::init()?");
239  return;
240  }
241 
242  for ( int idx=0; idx<n_; idx++ )
243  x[idx] = b[idx];
244 
245  int ii=-1;
246 
247  for ( int i=0; i<n_; i++ )
248  {
249  int ip=croutsidx_[i];
250  T sum=x[ip];
251  x[ip]=x[i];
252 
253  if ( ii != -1 )
254  {
255  for ( int j=ii; j<=i-1; j++ )
256  {
257  sum -= croutsmatrix_.get(i,j)*x[j];
258  }
259  }
260  else if ( !mIsZero(sum,mDefEps) )
261  ii=i;
262 
263  x[i]=sum;
264  }
265 
266  for ( int i=n_-1; i>=0; i-- )
267  {
268  T sum=x[i];
269  for ( int j=i+1; j<n_; j++ )
270  sum -= croutsmatrix_.get(i,j)*x[j];
271 
272  x[i]=sum/croutsmatrix_.get(i,i);
273  }
274 
275 }
276 
LinSolverTask::imax_
int imax_
Definition: linsolv.h:74
TaskRunner::execute
static bool execute(TaskRunner *tr, Task &)
Taskrunner may be zero.
uiStrings::phrInvalid
static uiString phrInvalid(const uiString &string)
"Invalid <string>"
LinSolverTask::vv_
TypeSet< T > vv_
Definition: linsolv.h:76
od_int64
#define od_int64
Definition: plftypes.h:35
Array2DImpl::info
const Array2DInfo & info() const
Definition: arrayndimpl.h:123
LinSolverTask::mODTextTranslationClass
mODTextTranslationClass(LinSolverTask)
TINY
#define TINY
Definition: linsolv.h:119
LinSolverTask::croutsmatrix_
Array2DImpl< T > & croutsmatrix_
Definition: linsolv.h:77
mDefEps
#define mDefEps
Definition: commondefs.h:71
LinSolver::parity_
bool parity_
Definition: linsolv.h:44
LinSolver::LinSolver
LinSolver(const Array2D< T > &A)
Definition: linsolv.h:190
uiStrings::sInput
static uiString sInput()
ArrayNDInfo::getSize
virtual int getSize(int dim) const =0
LinSolverTask::nextStep
int nextStep()
Definition: linsolv.h:122
LinSolver::init
bool init(TaskRunner *=0)
Definition: linsolv.h:201
LinSolverTask::uiNrDoneText
uiString uiNrDoneText() const
will be nrDoneText() in 7.x
Definition: linsolv.h:66
arrayndimpl.h
LinSolverTask::LinSolverTask
LinSolverTask(Array2DImpl< T > &, int *)
Definition: linsolv.h:83
LinSolver::ready_
bool ready_
Definition: linsolv.h:45
LinSolverTask::nrDone
od_int64 nrDone() const
Definition: linsolv.h:69
LinSolver::LinSolver
LinSolver(const LinSolver &)
Definition: linsolv.h:210
LinSolverTask::~LinSolverTask
~LinSolverTask()
Definition: linsolv.h:55
LinSolver::~LinSolver
~LinSolver()
Definition: linsolv.h:227
LinSolver::croutsidx_
int * croutsidx_
Definition: linsolv.h:42
LinSolverTask::croutsidx_
int * croutsidx_
Definition: linsolv.h:75
mIsZero
#define mIsZero(x, eps)
Definition: commondefs.h:66
mClass
#define mClass(module)
Definition: commondefs.h:181
uistrings.h
Executor
Specification to enable chunkwise execution of a process.
Definition: executor.h:39
LinSolverTask::totalnr_
int totalnr_
Definition: linsolv.h:73
TaskRunner
Class that can execute a task.
Definition: task.h:170
OD::String::isEmpty
bool isEmpty() const
Definition: odstring.h:50
executor.h
pErrMsg
#define pErrMsg(msg)
Usual access point for programmer error messages.
Definition: errmsg.h:37
LinSolver::apply
void apply(const T *b, T *x) const
Definition: linsolv.h:234
LinSolverTask::totalNr
od_int64 totalNr() const
Definition: linsolv.h:70
LinSolver::n_
int n_
Definition: linsolv.h:43
Array2DImpl
Implementation of Array2D.
Definition: arrayndimpl.h:102
LinSolver
LinSolver - Solves linear systems of equations on the form A*x=B. A is a matrix of the size N*N,...
Definition: gridder2d.h:23
uiString
String that is able to hold international (UTF-8) strings for the user interface.
Definition: uistring.h:121
LinSolverTask::uiMessage
uiString uiMessage() const
will be message() again in 7.x
Definition: linsolv.h:60
MPE::errmsg_
BufferString errmsg_
Definition: horizontracker.h:118
LinSolver::croutsmatrix_
Array2DImpl< T > croutsmatrix_
Definition: linsolv.h:41
mUdf
#define mUdf(type)
Use this macro to get the undefined for simple types.
Definition: undefval.h:274
LinSolverTask
Definition: linsolv.h:52
LinSolver::size
int size() const
Definition: linsolv.h:36
LinSolverTask::errmsg_
uiString errmsg_
Definition: linsolv.h:78
LinSolverTask::curidx_
int curidx_
Definition: linsolv.h:72
LinSolver::ready
bool ready() const
Definition: linsolv.h:35
Array2D
Array2D ( Subclass of ArrayND ) is a two dimensional array.
Definition: arraynd.h:140
TypeSet
Sets of (small) copyable elements.
Definition: commontypes.h:29

Generated at for the OpendTect seismic interpretation project. Copyright (C): dGB Beheer B.V. 1995-2021