Ice Sheet System Model  4.18
Code documentation
Public Member Functions | Data Fields
IssmDenseMat< doubletype > Class Template Reference

#include <IssmDenseMat.h>

Inheritance diagram for IssmDenseMat< doubletype >:
IssmAbsMat< doubletype >

Public Member Functions

 IssmDenseMat ()
 
 IssmDenseMat (int pM, int pN)
 
 IssmDenseMat (int pM, int pN, doubletype sparsity)
 
 IssmDenseMat (int m, int n, int pM, int pN, int *d_nnz, int *o_nnz)
 
 IssmDenseMat (doubletype *serial_mat, int pM, int pN, doubletype sparsity)
 
 IssmDenseMat (int pM, int pN, int connectivity, int numberofdofspernode)
 
 ~IssmDenseMat ()
 
void Echo (void)
 
void Assemble (void)
 
doubletype Norm (NormMode mode)
 
void GetSize (int *pM, int *pN)
 
void GetLocalSize (int *pM, int *pN)
 
void MatMult (IssmAbsVec< doubletype > *Xin, IssmAbsVec< doubletype > *AXin)
 
IssmDenseMat< doubletype > * Duplicate (void)
 
doubletype * ToSerial (void)
 
void SetValues (int m, int *idxm, int n, int *idxn, doubletype *values, InsMode mode)
 
void Convert (MatrixType type)
 
void SetZero (void)
 
IssmAbsVec< IssmDouble > * Solve (IssmAbsVec< IssmDouble > *pfin, Parameters *parameters)
 
- Public Member Functions inherited from IssmAbsMat< doubletype >
virtual ~IssmAbsMat ()
 

Data Fields

int M
 
int N
 
doubletype * matrix
 

Detailed Description

template<class doubletype>
class IssmDenseMat< doubletype >

Definition at line 39 of file IssmDenseMat.h.

Constructor & Destructor Documentation

◆ IssmDenseMat() [1/6]

template<class doubletype >
IssmDenseMat< doubletype >::IssmDenseMat ( )
inline

Definition at line 48 of file IssmDenseMat.h.

48  {
49 
50  this->M=0;
51  this->N=0;
52  this->matrix=NULL;
53  }

◆ IssmDenseMat() [2/6]

template<class doubletype >
IssmDenseMat< doubletype >::IssmDenseMat ( int  pM,
int  pN 
)
inline

Definition at line 56 of file IssmDenseMat.h.

56  {
57 
58  this->M=pM;
59  this->N=pN;
60  this->matrix=NULL;
61  if(M*N) this->matrix=xNewZeroInit<doubletype>(pM*pN);
62  }

◆ IssmDenseMat() [3/6]

template<class doubletype >
IssmDenseMat< doubletype >::IssmDenseMat ( int  pM,
int  pN,
doubletype  sparsity 
)
inline

Definition at line 65 of file IssmDenseMat.h.

65  {
66 
67  this->M=pM;
68  this->N=pN;
69  this->matrix=NULL;
70  if(M*N) this->matrix=xNewZeroInit<doubletype>(pM*pN);
71  }

◆ IssmDenseMat() [4/6]

template<class doubletype >
IssmDenseMat< doubletype >::IssmDenseMat ( int  m,
int  n,
int  pM,
int  pN,
int *  d_nnz,
int *  o_nnz 
)
inline

Definition at line 74 of file IssmDenseMat.h.

74  {
75 
76  this->M=pM;
77  this->N=pN;
78  this->matrix=NULL;
79  if(pM*pN) this->matrix=xNewZeroInit<doubletype>(pM*pN);
80  }

◆ IssmDenseMat() [5/6]

template<class doubletype >
IssmDenseMat< doubletype >::IssmDenseMat ( doubletype *  serial_mat,
int  pM,
int  pN,
doubletype  sparsity 
)
inline

Definition at line 83 of file IssmDenseMat.h.

83  {
84 
85  this->M=pM;
86  this->N=pN;
87  this->matrix=NULL;
88  if(M*N){
89  this->matrix=xNewZeroInit<doubletype>(pM*pN);
90  xMemCpy<doubletype>(this->matrix,serial_mat,pM*pN);
91  }
92 
93  }

◆ IssmDenseMat() [6/6]

template<class doubletype >
IssmDenseMat< doubletype >::IssmDenseMat ( int  pM,
int  pN,
int  connectivity,
int  numberofdofspernode 
)
inline

Definition at line 96 of file IssmDenseMat.h.

96  {
97 
98  this->M=pM;
99  this->N=pN;
100  this->matrix=NULL;
101  if(M*N) this->matrix=xNewZeroInit<doubletype>(pM*pN);
102  }

◆ ~IssmDenseMat()

template<class doubletype >
IssmDenseMat< doubletype >::~IssmDenseMat ( )
inline

Definition at line 105 of file IssmDenseMat.h.

105  {
106 
107  xDelete<doubletype>(this->matrix);
108  M=0;
109  N=0;
110  }

Member Function Documentation

◆ Echo()

template<class doubletype >
void IssmDenseMat< doubletype >::Echo ( void  )
inlinevirtual

Implements IssmAbsMat< doubletype >.

Definition at line 114 of file IssmDenseMat.h.

114  {/*{{{*/
115 
116  _printf_("IssmDenseMat size " << this->M << "-" << this->N << "\n");
117  for(int i=0;i<M;i++){
118  for(int j=0;j<N;j++){
119  _printf_(this->matrix[N*i+j] << " ");
120  }
121  _printf_("\n");
122  }
123  }

◆ Assemble()

template<class doubletype >
void IssmDenseMat< doubletype >::Assemble ( void  )
inlinevirtual

Implements IssmAbsMat< doubletype >.

Definition at line 125 of file IssmDenseMat.h.

125  {/*{{{*/
126 
127  /*do nothing*/
128 
129  }

◆ Norm()

template<class doubletype >
doubletype IssmDenseMat< doubletype >::Norm ( NormMode  mode)
inlinevirtual

Implements IssmAbsMat< doubletype >.

Definition at line 131 of file IssmDenseMat.h.

131  {/*{{{*/
132 
133  doubletype norm;
134  doubletype absolute;
135  int i,j;
136 
137  switch(mode){
138  case NORM_INF:
139  norm=0.;
140  for(i=0;i<this->M;i++){
141  absolute=0;
142  for(j=0;j<this->N;j++){
143  absolute+=fabs(this->matrix[N*i+j]);
144  }
145  norm=max(norm,absolute);
146  }
147  return norm;
148  break;
149  case NORM_FROB:
150  norm=0.;
151  for(i=0;i<this->M;i++){
152  for(j=0;j<this->N;j++){
153  norm+=this->matrix[N*i+j]*this->matrix[N*i+j];
154  }
155  }
156  return sqrt(norm);
157  break;
158 
159  default:
160  _error_("unknown norm !");
161  break;
162  }
163  }

◆ GetSize()

template<class doubletype >
void IssmDenseMat< doubletype >::GetSize ( int *  pM,
int *  pN 
)
inlinevirtual

Implements IssmAbsMat< doubletype >.

Definition at line 165 of file IssmDenseMat.h.

165  {/*{{{*/
166  *pM=this->M;
167  *pN=this->N;
168  }

◆ GetLocalSize()

template<class doubletype >
void IssmDenseMat< doubletype >::GetLocalSize ( int *  pM,
int *  pN 
)
inlinevirtual

Implements IssmAbsMat< doubletype >.

Definition at line 170 of file IssmDenseMat.h.

170  {/*{{{*/
171 
172  *pM=this->M;
173  *pN=this->N;
174 
175  }

◆ MatMult()

template<class doubletype >
void IssmDenseMat< doubletype >::MatMult ( IssmAbsVec< doubletype > *  Xin,
IssmAbsVec< doubletype > *  AXin 
)
inlinevirtual

Implements IssmAbsMat< doubletype >.

Definition at line 177 of file IssmDenseMat.h.

177  {/*{{{*/
178 
179  /*We assume that the vectors coming in are of compatible type: */
180  int i,j;
181  int XM,AXM;
182  doubletype dummy;
183  IssmSeqVec<doubletype>* X=NULL;
184  IssmSeqVec<doubletype>* AX=NULL;
185 
186  /*downcast X and AX: */
187  X=(IssmSeqVec<doubletype>*)Xin;
188  AX=(IssmSeqVec<doubletype>*)AXin;
189 
190  /*Some checks first: */
191  X->GetSize(&XM);
192  AX->GetSize(&AXM);
193 
194  if(M!=AXM)_error_("A and AX should have the same number of rows!");
195  if(N!=XM)_error_("A and X should have the same number of columns!");
196 
197  for(i=0;i<M;i++){
198  dummy=0;
199  for(j=0;j<N;j++){
200  dummy+= this->matrix[N*i+j]*X->vector[j];
201  }
202  AX->vector[i]=dummy;
203  }
204 
205  }

◆ Duplicate()

template<class doubletype >
IssmDenseMat<doubletype>* IssmDenseMat< doubletype >::Duplicate ( void  )
inlinevirtual

Implements IssmAbsMat< doubletype >.

Definition at line 207 of file IssmDenseMat.h.

207  {/*{{{*/
208 
209  doubletype dummy=0;
210 
211  return new IssmDenseMat<doubletype>(this->matrix,this->M,this->N,dummy);
212 
213  }

◆ ToSerial()

template<class doubletype >
doubletype* IssmDenseMat< doubletype >::ToSerial ( void  )
inlinevirtual

Implements IssmAbsMat< doubletype >.

Definition at line 215 of file IssmDenseMat.h.

215  {/*{{{*/
216 
217  doubletype* buffer=NULL;
218 
219  if(this->M*this->N){
220  buffer=xNew<doubletype>(this->M*this->N);
221  xMemCpy<doubletype>(buffer,this->matrix,this->M*this->N);
222  }
223  return buffer;
224 
225  }

◆ SetValues()

template<class doubletype >
void IssmDenseMat< doubletype >::SetValues ( int  m,
int *  idxm,
int  n,
int *  idxn,
doubletype *  values,
InsMode  mode 
)
inlinevirtual

Implements IssmAbsMat< doubletype >.

Definition at line 227 of file IssmDenseMat.h.

227  {/*{{{*/
228 
229  int i,j;
230  switch(mode){
231  case ADD_VAL:
232  for(i=0;i<m;i++) for(j=0;j<n;j++) this->matrix[N*idxm[i]+idxn[j]]+=values[n*i+j];
233  break;
234  case INS_VAL:
235  for(i=0;i<m;i++) for(j=0;j<n;j++) this->matrix[N*idxm[i]+idxn[j]]=values[n*i+j];
236  break;
237  default:
238  _error_("unknown insert mode!");
239  break;
240  }
241 
242  }

◆ Convert()

template<class doubletype >
void IssmDenseMat< doubletype >::Convert ( MatrixType  type)
inlinevirtual

Implements IssmAbsMat< doubletype >.

Definition at line 244 of file IssmDenseMat.h.

244  {/*{{{*/
245 
246  /*do nothing*/
247 
248  }

◆ SetZero()

template<class doubletype >
void IssmDenseMat< doubletype >::SetZero ( void  )
inlinevirtual

Implements IssmAbsMat< doubletype >.

Definition at line 250 of file IssmDenseMat.h.

250  {/*{{{*/
251  for(int i=0;i<M;i++){
252  for(int j=0;j<N;j++){
253  this->matrix[N*i+j] = 0.;
254  }
255  }
256  }/*}}}*/

◆ Solve()

template<class doubletype >
IssmAbsVec<IssmDouble>* IssmDenseMat< doubletype >::Solve ( IssmAbsVec< IssmDouble > *  pfin,
Parameters parameters 
)
inlinevirtual

Implements IssmAbsMat< doubletype >.

Definition at line 258 of file IssmDenseMat.h.

258  {/*{{{*/
259 
260  /*First off, we assume that the type of IssmAbsVec is IssmSeqVec. So downcast: */
261  IssmSeqVec<IssmDouble>* pf = NULL;
262  IssmSeqVec<IssmDouble> *uf = NULL;
263  IssmDouble* x=NULL;
264 
265  /*Assume we are getting an IssmMpiVec in input, downcast: */
266  pf=(IssmSeqVec<IssmDouble>*)pfin;
267 
269  #ifdef _HAVE_MUMPS_
270  case MumpsEnum: {
271  /*Assume we have a sequential vec, downcast*/
272  uf=((IssmSeqVec<IssmDouble>*)pfin)->Duplicate();
273  SeqDenseMumpsSolve(uf->vector,uf->M,uf->M, /*stiffness matrix:*/ this->matrix,this->M,this->N,this->M, /*right hand side load vector: */ pf->vector,pf->M,pf->M,parameters);
274  return uf;
275  }
276  #endif
277  #ifdef _HAVE_GSL_
278  case GslEnum: {
279  DenseGslSolve(/*output*/ &x,/*stiffness matrix:*/ this->matrix,this->M,this->N, /*right hand side load vector: */ pf->vector,pf->M,parameters);
280  uf=new IssmSeqVec<IssmDouble>(x,this->N); xDelete(x);
281  return uf;
282  }
283  #endif
284  default: _error_("No solver available");
285  }
286 
287  return NULL;
288 
289  }/*}}}*/

Field Documentation

◆ M

template<class doubletype >
int IssmDenseMat< doubletype >::M

Definition at line 43 of file IssmDenseMat.h.

◆ N

template<class doubletype >
int IssmDenseMat< doubletype >::N

Definition at line 43 of file IssmDenseMat.h.

◆ matrix

template<class doubletype >
doubletype* IssmDenseMat< doubletype >::matrix

Definition at line 44 of file IssmDenseMat.h.


The documentation for this class was generated from the following file:
IssmDouble
double IssmDouble
Definition: types.h:37
_printf_
#define _printf_(StreamArgs)
Definition: Print.h:22
ADD_VAL
@ ADD_VAL
Definition: toolkitsenums.h:14
IssmDenseMat
Definition: IssmDenseMat.h:39
NORM_INF
@ NORM_INF
Definition: toolkitsenums.h:15
IssmSeqVec
Definition: IssmSeqVec.h:31
IssmSeqVec::vector
doubletype * vector
Definition: IssmSeqVec.h:35
IssmSolverTypeFromToolkitOptions
int IssmSolverTypeFromToolkitOptions(void)
Definition: IssmToolkitUtils.cpp:86
MumpsEnum
@ MumpsEnum
Definition: EnumDefinitions.h:1195
IssmSeqVec::Duplicate
IssmSeqVec< doubletype > * Duplicate(void)
Definition: IssmSeqVec.h:167
xDelete
void xDelete(T **&aT_pp)
Definition: MemOps.h:97
NORM_FROB
@ NORM_FROB
Definition: toolkitsenums.h:15
INS_VAL
@ INS_VAL
Definition: toolkitsenums.h:14
IssmDenseMat::M
int M
Definition: IssmDenseMat.h:43
IssmSeqVec::M
int M
Definition: IssmSeqVec.h:36
IssmSeqVec::GetSize
void GetSize(int *pM)
Definition: IssmSeqVec.h:136
IssmDenseMat::matrix
doubletype * matrix
Definition: IssmDenseMat.h:44
SeqDenseMumpsSolve
void SeqDenseMumpsSolve(IssmDouble *uf, int uf_M, int uf_n, IssmDouble *Kff, int Kff_M, int Kff_N, int Kff_m, IssmDouble *pf, int pf_M, int pf_m, Parameters *parameters)
Definition: MumpsSolve.cpp:296
_error_
#define _error_(StreamArgs)
Definition: exceptions.h:49
DenseGslSolve
void DenseGslSolve(IssmPDouble **pX, IssmPDouble *A, IssmPDouble *B, int n)
Definition: DenseGslSolve.cpp:25
max
IssmDouble max(IssmDouble a, IssmDouble b)
Definition: extrema.cpp:24
IssmDenseMat::N
int N
Definition: IssmDenseMat.h:43
GslEnum
@ GslEnum
Definition: EnumDefinitions.h:1094