cisst-saw
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
nmrHFTISolver.h
Go to the documentation of this file.
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /* ex: set filetype=cpp softtabstop=4 shiftwidth=4 tabstop=4 cindent expandtab: */
3 
4 /*
5  Author(s): Ankur Kapoor
6  Created on: 2004-10-30
7 
8  (C) Copyright 2004-2014 Johns Hopkins University (JHU), All Rights
9  Reserved.
10 
11 --- begin cisst license - do not edit ---
12 
13 This software is provided "as is" under an open source license, with
14 no warranty. The complete license can be found in license.txt and
15 http://www.cisst.org/cisst/license.txt.
16 
17 --- end cisst license ---
18 */
19 
20 
26 #ifndef _nmrHFTISolver_h
27 #define _nmrHFTISolver_h
28 
31 
32 // forward declaration of fortran routine for very old cisstNetlib
33 #ifndef CISSTNETLIB_VERSION
34 # define NEEDS_HFTI_FORWARD_DECLARATION
35 #else
36 # if (CISSTNETLIB_VERSION_MAJOR == 3)
37 # define NEEDS_HFTI_FORWARD_DECLARATION
38 # endif
39 #endif
40 
41 
42 #ifdef NEEDS_HFTI_FORWARD_DECLARATION
43 CISSTNETLIB_INTEGER hfti_(CISSTNETLIB_DOUBLE * a, CISSTNETLIB_INTEGER * mda, CISSTNETLIB_INTEGER * m, CISSTNETLIB_INTEGER * n,
44  CISSTNETLIB_DOUBLE * b, CISSTNETLIB_INTEGER * mdb, CISSTNETLIB_INTEGER * nb, CISSTNETLIB_DOUBLE * tau,
45  CISSTNETLIB_INTEGER * krank, CISSTNETLIB_DOUBLE * rnorm, CISSTNETLIB_DOUBLE * h__, CISSTNETLIB_DOUBLE * g,
46  CISSTNETLIB_INTEGER * ip);
47 # undef NEEDS_HFTI_FORWARD_DECLARATION
48 #endif
49 
91 
92 protected:
93  CISSTNETLIB_INTEGER M;
94  CISSTNETLIB_INTEGER N;
95  CISSTNETLIB_INTEGER NB;
98  CISSTNETLIB_DOUBLE tau;
99  CISSTNETLIB_INTEGER krank;
105 
106 public:
112  M(0),
113  N(0),
114  NB(0)
115  {
116  Allocate(M, N, NB);
117  }
118 
119 
129  nmrHFTISolver(CISSTNETLIB_INTEGER m, CISSTNETLIB_INTEGER n, CISSTNETLIB_INTEGER nb) {
130  Allocate(m, n, nb);
131  }
132 
133 
140  Allocate(A, B);
141  }
142 
143 
152  inline void Allocate(CISSTNETLIB_INTEGER m, CISSTNETLIB_INTEGER n, CISSTNETLIB_INTEGER nb) {
153  M = m;
154  N = n;
155  NB = nb;
162  RNORM.SetSize(NB, 1, VCT_COL_MAJOR);
163  G.SetSize(N, 1, VCT_COL_MAJOR);
164  H.SetSize(N, 1, VCT_COL_MAJOR);
165  IP.SetSize(N, 1, VCT_COL_MAJOR);
167  }
168 
169 
175  Allocate(A.rows(), A.cols(), B.cols());
176  }
177 
178 
186  /* check that the size matches with Allocate() */
187  if ((M != static_cast<CISSTNETLIB_INTEGER>(A.rows()))
188  || (N != static_cast<CISSTNETLIB_INTEGER>(A.cols()))
189  || (NB != static_cast<CISSTNETLIB_INTEGER>(B.cols()))) {
190  cmnThrow(std::runtime_error("nmrHFTISolver Solve: Sizes used for Allocate were different"));
191  }
192 
193  /* check that the matrices are Fortran like */
194  if (! (A.IsFortran()
195  && B.IsFortran())) {
196  cmnThrow(std::runtime_error("nmrHFTISolver Solve: All parameters must be Fortran compatible"));
197  }
198 
199  hfti_(A.Pointer(), &M, &M, &N, B.Pointer(), &M, &NB, &tau,
200  &krank, RNORM.Pointer(),
201  H.Pointer(), G.Pointer(), IP.Pointer());
202  //error handling??
203  }
204 };
205 
206 
207 #endif // _nmrHFTISolver_h
nmrHFTISolver(void)
Definition: nmrHFTISolver.h:111
Declaration of vctDynamicMatrix.
Definition: nmrHFTISolver.h:90
nmrHFTISolver(vctDynamicMatrix< CISSTNETLIB_DOUBLE > &A, vctDynamicMatrix< CISSTNETLIB_DOUBLE > &B)
Definition: nmrHFTISolver.h:139
vctDynamicMatrix< CISSTNETLIB_DOUBLE > H
Definition: nmrHFTISolver.h:102
bool IsFortran(void) const
Definition: vctDynamicConstMatrixBase.h:650
vctDynamicMatrix< CISSTNETLIB_DOUBLE > RNORM
Definition: nmrHFTISolver.h:100
CISSTNETLIB_INTEGER krank
Definition: nmrHFTISolver.h:99
CISSTNETLIB_INTEGER hfti_(CISSTNETLIB_DOUBLE *a, CISSTNETLIB_INTEGER *mda, CISSTNETLIB_INTEGER *m, CISSTNETLIB_INTEGER *n, CISSTNETLIB_DOUBLE *b, CISSTNETLIB_INTEGER *mdb, CISSTNETLIB_INTEGER *nb, CISSTNETLIB_DOUBLE *tau, CISSTNETLIB_INTEGER *krank, CISSTNETLIB_DOUBLE *rnorm, CISSTNETLIB_DOUBLE *h__, CISSTNETLIB_DOUBLE *g, CISSTNETLIB_INTEGER *ip)
vctDynamicMatrix< CISSTNETLIB_DOUBLE > B
Definition: nmrHFTISolver.h:97
void Allocate(vctDynamicMatrix< CISSTNETLIB_DOUBLE > &A, vctDynamicMatrix< CISSTNETLIB_DOUBLE > &B)
Definition: nmrHFTISolver.h:174
pointer Pointer(size_type rowIndex, size_type colIndex)
Definition: vctDynamicMatrixBase.h:143
CISSTNETLIB_INTEGER N
Definition: nmrHFTISolver.h:94
CISSTNETLIB_INTEGER NB
Definition: nmrHFTISolver.h:95
size_type rows() const
Definition: vctDynamicConstMatrixBase.h:238
size_type cols() const
Definition: vctDynamicConstMatrixBase.h:243
vctDynamicMatrix< CISSTNETLIB_DOUBLE > G
Definition: nmrHFTISolver.h:101
nmrHFTISolver(CISSTNETLIB_INTEGER m, CISSTNETLIB_INTEGER n, CISSTNETLIB_INTEGER nb)
Definition: nmrHFTISolver.h:129
void Allocate(CISSTNETLIB_INTEGER m, CISSTNETLIB_INTEGER n, CISSTNETLIB_INTEGER nb)
Definition: nmrHFTISolver.h:152
CISSTNETLIB_INTEGER M
Definition: nmrHFTISolver.h:93
void SetSize(size_type rows, size_type cols, bool storageOrder)
Definition: vctDynamicMatrix.h:364
#define cmnThrow(a)
Definition: MinimalCmn.h:4
vctDynamicMatrix< CISSTNETLIB_DOUBLE > X
Definition: nmrHFTISolver.h:104
CISSTNETLIB_DOUBLE tau
Definition: nmrHFTISolver.h:98
void Solve(vctDynamicMatrix< CISSTNETLIB_DOUBLE > &A, vctDynamicMatrix< CISSTNETLIB_DOUBLE > &B)
Definition: nmrHFTISolver.h:185
vctDynamicMatrix< CISSTNETLIB_DOUBLE > A
Definition: nmrHFTISolver.h:96
const bool VCT_COL_MAJOR
Definition: vctForwardDeclarations.h:46
vctDynamicMatrix< CISSTNETLIB_INTEGER > IP
Definition: nmrHFTISolver.h:103