Ice Sheet System Model  4.18
Code documentation
IssmDenseMat.h
Go to the documentation of this file.
1 
8 #ifndef _ISSM_DENSE_MAT_H_
9 #define _ISSM_DENSE_MAT_H_
10 
11 /*Headers:*/
12 /*{{{*/
13 #ifdef HAVE_CONFIG_H
14  #include <config.h>
15 #else
16 #error "Cannot compile with HAVE_CONFIG_H symbol! run configure first!"
17 #endif
18 
19 #include "./IssmSeqVec.h"
20 #include "./IssmToolkitUtils.h"
21 #include "../../shared/shared.h"
22 #include "../gsl/gslincludes.h"
23 
24 #include <math.h>
25 
26 /*}}}*/
27 
28 /*We need to template this class, in case we want to create Matrices that hold
29  IssmDouble* matrix or IssmPDouble* matrix.
30  Such matrices would be useful for use without or with the matlab or python
31  interface (which do not care for IssmDouble types, but only rely on
32  IssmPDouble types)*/
33 
34 template <class doubletype> class IssmAbsVec;
35 template <class doubletype> class IssmAbsMat;
36 template <class doubletype> class IssmSeqVec;
37 
38 template <class doubletype>
39 class IssmDenseMat: public IssmAbsMat<doubletype>{
40 
41  public:
42 
43  int M,N;
44  doubletype* matrix; /*here, doubletype is either IssmDouble or IssmPDouble*/
45 
46  /*IssmDenseMat constructors, destructors*/
47  /*IssmDenseMat(){{{*/
49 
50  this->M=0;
51  this->N=0;
52  this->matrix=NULL;
53  }
54  /*}}}*/
55  /*IssmDenseMat(int M,int N){{{*/
56  IssmDenseMat(int pM,int pN){
57 
58  this->M=pM;
59  this->N=pN;
60  this->matrix=NULL;
61  if(M*N) this->matrix=xNewZeroInit<doubletype>(pM*pN);
62  }
63  /*}}}*/
64  /*IssmDenseMat(int M,int N, doubletype sparsity){{{*/
65  IssmDenseMat(int pM,int pN, doubletype sparsity){
66 
67  this->M=pM;
68  this->N=pN;
69  this->matrix=NULL;
70  if(M*N) this->matrix=xNewZeroInit<doubletype>(pM*pN);
71  }
72  /*}}}*/
73  /*IssmDenseMat(int m,int n,int M,int N,int* d_nnz,int* o_nnz){{{*/
74  IssmDenseMat(int m,int n,int pM,int pN,int* d_nnz,int* o_nnz){
75 
76  this->M=pM;
77  this->N=pN;
78  this->matrix=NULL;
79  if(pM*pN) this->matrix=xNewZeroInit<doubletype>(pM*pN);
80  }
81  /*}}}*/
82  /*IssmDenseMat(doubletype* serial_mat,int M,int N,doubletype sparsity){{{*/
83  IssmDenseMat(doubletype* serial_mat,int pM,int pN,doubletype sparsity){
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  }
94  /*}}}*/
95  /*IssmDenseMat(int M,int N, int connectivity, int numberofdofspernode){{{*/
96  IssmDenseMat(int pM,int pN, int connectivity,int numberofdofspernode){
97 
98  this->M=pM;
99  this->N=pN;
100  this->matrix=NULL;
101  if(M*N) this->matrix=xNewZeroInit<doubletype>(pM*pN);
102  }
103  /*}}}*/
104  /*~IssmDenseMat(){{{*/
106 
107  xDelete<doubletype>(this->matrix);
108  M=0;
109  N=0;
110  }
111  /*}}}*/
112 
113  /*IssmAbsMat virtual functions*/
114  void Echo(void){/*{{{*/
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  }
124  /*}}}*/
125  void Assemble(void){/*{{{*/
126 
127  /*do nothing*/
128 
129  }
130  /*}}}*/
131  doubletype Norm(NormMode mode){/*{{{*/
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  }
164  /*}}}*/
165  void GetSize(int* pM,int* pN){/*{{{*/
166  *pM=this->M;
167  *pN=this->N;
168  }
169  /*}}}*/
170  void GetLocalSize(int* pM,int* pN){/*{{{*/
171 
172  *pM=this->M;
173  *pN=this->N;
174 
175  }
176  /*}}}*/
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  }
206  /*}}}*/
208 
209  doubletype dummy=0;
210 
211  return new IssmDenseMat<doubletype>(this->matrix,this->M,this->N,dummy);
212 
213  }
214  /*}}}*/
215  doubletype* ToSerial(void){/*{{{*/
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  }
226  /*}}}*/
227  void SetValues(int m,int* idxm,int n,int* idxn,doubletype* values,InsMode mode){/*{{{*/
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  }
243  /*}}}*/
244  void Convert(MatrixType type){/*{{{*/
245 
246  /*do nothing*/
247 
248  }
249  /*}}}*/
250  void SetZero(void){/*{{{*/
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  }/*}}}*/
257  #ifndef _HAVE_WRAPPERS_
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  }/*}}}*/
290  #endif
291 };
292 
293 #endif //#ifndef _ISSM_DENSE_MAT_H_
IssmToolkitUtils.h
routines used throughout the ISSM toolkit
IssmSeqVec.h
implementation of an ISSM vector which run serially (1 cpu only), which is made of a fully dense vect...
IssmDouble
double IssmDouble
Definition: types.h:37
_printf_
#define _printf_(StreamArgs)
Definition: Print.h:22
IssmDenseMat::Echo
void Echo(void)
Definition: IssmDenseMat.h:114
Parameters
Declaration of Parameters class.
Definition: Parameters.h:18
ADD_VAL
@ ADD_VAL
Definition: toolkitsenums.h:14
IssmDenseMat::ToSerial
doubletype * ToSerial(void)
Definition: IssmDenseMat.h:215
IssmDenseMat
Definition: IssmDenseMat.h:39
IssmDenseMat::Assemble
void Assemble(void)
Definition: IssmDenseMat.h:125
NORM_INF
@ NORM_INF
Definition: toolkitsenums.h:15
IssmDenseMat::SetValues
void SetValues(int m, int *idxm, int n, int *idxn, doubletype *values, InsMode mode)
Definition: IssmDenseMat.h:227
IssmSeqVec
Definition: IssmSeqVec.h:31
IssmDenseMat::Norm
doubletype Norm(NormMode mode)
Definition: IssmDenseMat.h:131
IssmSeqVec::vector
doubletype * vector
Definition: IssmSeqVec.h:35
IssmAbsMat
Definition: IssmAbsMat.h:27
IssmDenseMat::GetSize
void GetSize(int *pM, int *pN)
Definition: IssmDenseMat.h:165
IssmSolverTypeFromToolkitOptions
int IssmSolverTypeFromToolkitOptions(void)
Definition: IssmToolkitUtils.cpp:86
IssmDenseMat::IssmDenseMat
IssmDenseMat(int pM, int pN, doubletype sparsity)
Definition: IssmDenseMat.h:65
IssmDenseMat::MatMult
void MatMult(IssmAbsVec< doubletype > *Xin, IssmAbsVec< doubletype > *AXin)
Definition: IssmDenseMat.h:177
MatrixType
MatrixType
Definition: toolkitsenums.h:16
IssmDenseMat::Duplicate
IssmDenseMat< doubletype > * Duplicate(void)
Definition: IssmDenseMat.h:207
MumpsEnum
@ MumpsEnum
Definition: EnumDefinitions.h:1195
IssmDenseMat::IssmDenseMat
IssmDenseMat(int m, int n, int pM, int pN, int *d_nnz, int *o_nnz)
Definition: IssmDenseMat.h:74
IssmSeqVec::Duplicate
IssmSeqVec< doubletype > * Duplicate(void)
Definition: IssmSeqVec.h:167
xDelete
void xDelete(T **&aT_pp)
Definition: MemOps.h:97
IssmDenseMat::IssmDenseMat
IssmDenseMat(int pM, int pN, int connectivity, int numberofdofspernode)
Definition: IssmDenseMat.h:96
IssmDenseMat::Solve
IssmAbsVec< IssmDouble > * Solve(IssmAbsVec< IssmDouble > *pfin, Parameters *parameters)
Definition: IssmDenseMat.h:258
IssmDenseMat::~IssmDenseMat
~IssmDenseMat()
Definition: IssmDenseMat.h:105
NORM_FROB
@ NORM_FROB
Definition: toolkitsenums.h:15
IssmDenseMat::IssmDenseMat
IssmDenseMat()
Definition: IssmDenseMat.h:48
INS_VAL
@ INS_VAL
Definition: toolkitsenums.h:14
IssmDenseMat::M
int M
Definition: IssmDenseMat.h:43
IssmDenseMat::Convert
void Convert(MatrixType type)
Definition: IssmDenseMat.h:244
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
IssmAbsVec
Definition: IssmAbsVec.h:24
IssmDenseMat::IssmDenseMat
IssmDenseMat(doubletype *serial_mat, int pM, int pN, doubletype sparsity)
Definition: IssmDenseMat.h:83
NormMode
NormMode
Definition: toolkitsenums.h:15
IssmDenseMat::SetZero
void SetZero(void)
Definition: IssmDenseMat.h:250
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
InsMode
InsMode
Definition: toolkitsenums.h:14
DenseGslSolve
void DenseGslSolve(IssmPDouble **pX, IssmPDouble *A, IssmPDouble *B, int n)
Definition: DenseGslSolve.cpp:25
IssmDenseMat::GetLocalSize
void GetLocalSize(int *pM, int *pN)
Definition: IssmDenseMat.h:170
max
IssmDouble max(IssmDouble a, IssmDouble b)
Definition: extrema.cpp:24
IssmDenseMat::IssmDenseMat
IssmDenseMat(int pM, int pN)
Definition: IssmDenseMat.h:56
IssmDenseMat::N
int N
Definition: IssmDenseMat.h:43
GslEnum
@ GslEnum
Definition: EnumDefinitions.h:1094