Ice Sheet System Model  4.18
Code documentation
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
IssmSeqVec.h
Go to the documentation of this file.
1 
8 #ifndef _ISSM_SEQ_VEC_H_
9 #define _ISSM_SEQ_VEC_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 "../../shared/shared.h"
20 #include <math.h>
21 
22 /*}}}*/
23 
24 /*We need to template this class, in case we want to create vectors that hold IssmDouble* vector or IssmPDouble* vector.
25  Such vectors would be useful for use without or with the matlab or python interface (which do not care for IssmDouble types,
26  but only rely on IssmPDouble types)*/
27 
28 template <class doubletype> class IssmAbsVec;
29 
30 template <class doubletype>
31 class IssmSeqVec: public IssmAbsVec<doubletype>{
32 
33  public:
34 
35  doubletype* vector;
36  int M;
37 
38  /*IssmSeqVec constructors, destructors*/
39  IssmSeqVec(){/*{{{*/
40 
41  this->M=0;
42  this->vector=NULL;
43  }
44  /*}}}*/
45  IssmSeqVec(int pM){/*{{{*/
46 
47  this->M=pM;
48  this->vector=NULL;
49  if(this->M) this->vector=xNewZeroInit<doubletype>(pM);
50  }
51  /*}}}*/
52  IssmSeqVec(int pm,int pM){/*{{{*/
53 
54  this->M=pM;
55  this->vector=NULL;
56  if(this->M) this->vector=xNewZeroInit<doubletype>(pM);
57  }
58  /*}}}*/
59  IssmSeqVec(int pM,bool fromlocalsize){/*{{{*/
60 
61  this->M=pM;
62  this->vector=NULL;
63  if(this->M) this->vector=xNewZeroInit<doubletype>(pM);
64  }
65  /*}}}*/
66  IssmSeqVec(doubletype* buffer,int pM){/*{{{*/
67 
68  this->M=pM;
69  this->vector=NULL;
70  if(this->M){
71  this->vector=xNew<doubletype>(pM);
72  xMemCpy<doubletype>(this->vector,buffer,pM);
73  }
74  }
75  /*}}}*/
76  ~IssmSeqVec(){/*{{{*/
77  if(this->M)xDelete<doubletype>(this->vector);
78  M=0;
79  }
80  /*}}}*/
81 
82  /*IssmSeqVec specific routines*/
83  void Echo(void){/*{{{*/
84 
85  int i;
86  _printf_("IssmSeqVec size " << this->M << "\n");
87  for(i=0;i<M;i++){
88  _printf_(vector[i] << "\n ");
89  }
90  }
91  /*}}}*/
92  void Assemble(void){/*{{{*/
93 
94  /*do nothing*/
95 
96  }
97  /*}}}*/
98  void SetValues(int ssize, int* list, doubletype* values, InsMode mode){/*{{{*/
99 
100  int i;
101  switch(mode){
102  case ADD_VAL:
103  for(i=0;i<ssize;i++) this->vector[list[i]]+=values[i];
104  break;
105  case INS_VAL:
106  for(i=0;i<ssize;i++) this->vector[list[i]]=values[i];
107  break;
108  default:
109  _error_("unknown insert mode!");
110  break;
111  }
112 
113  }
114  /*}}}*/
115  void SetValue(int dof, doubletype value, InsMode mode){/*{{{*/
116 
117  switch(mode){
118  case ADD_VAL:
119  this->vector[dof]+=value;
120  break;
121  case INS_VAL:
122  this->vector[dof]=value;
123  break;
124  default:
125  _error_("unknown insert mode!");
126  break;
127  }
128  }
129  /*}}}*/
130  void GetValue(doubletype* pvalue,int dof){/*{{{*/
131 
132  *pvalue=this->vector[dof];
133 
134  }
135  /*}}}*/
136  void GetSize(int* pM){/*{{{*/
137 
138  *pM=this->M;
139 
140  }
141  /*}}}*/
142  void GetLocalSize(int* pM){/*{{{*/
143  *pM=this->M;
144  }/*}}}*/
145  void GetLocalVector(doubletype** pvector,int** pindices){/*{{{*/
146 
147  /*First, check that vector size is not 0*/
148  int vector_size;
149  this->GetSize(&vector_size);
150  if(vector_size==0){
151  *pvector=NULL;
152  *pindices=NULL;
153  return;
154  }
155 
156  /*Build indices*/
157  int* indices=xNew<int>(vector_size);
158  for(int i=0;i<vector_size;i++) indices[i]=i;
159 
160  /*Get vector*/
161  doubletype* values =xNew<doubletype>(vector_size);
162  xMemCpy<doubletype>(values,this->vector,vector_size);
163 
164  *pvector = values;
165  *pindices = indices;
166  } /*}}}*/
168 
169  return new IssmSeqVec<doubletype>(this->vector,this->M);
170 
171  }
172  /*}}}*/
173  void Set(doubletype value){/*{{{*/
174 
175  for(int i=0;i<this->M;i++)this->vector[i]=value;
176 
177  }
178  /*}}}*/
179  void AXPY(IssmAbsVec<doubletype>* Xin, doubletype a){/*{{{*/
180 
181  int i;
182 
183  /*Assume X is of the correct type, and downcast: */
184  IssmSeqVec* X=NULL;
185 
186  X=(IssmSeqVec<doubletype>*)Xin;
187 
188  /*y=a*x+y where this->vector is y*/
189  for(i=0;i<this->M;i++)this->vector[i]=a*X->vector[i]+this->vector[i];
190 
191  }
192  /*}}}*/
193  void AYPX(IssmAbsVec<doubletype>* Xin, doubletype a){/*{{{*/
194 
195  int i;
196 
197  /*Assume X is of the correct type, and downcast: */
198  IssmSeqVec* X=NULL;
199 
200  X=(IssmSeqVec<doubletype>*)Xin;
201 
202  /*y=x+a*y where this->vector is y*/
203  for(i=0;i<this->M;i++)this->vector[i]=X->vector[i]+a*this->vector[i];
204 
205  }
206  /*}}}*/
207  doubletype* ToMPISerial(void){/*{{{*/
208 
209  doubletype* buffer=NULL;
210 
211  if(this->M){
212  buffer=xNew<doubletype>(this->M);
213  xMemCpy<doubletype>(buffer,this->vector,this->M);
214  }
215  return buffer;
216 
217  }
218  /*}}}*/
219  doubletype* ToMPISerial0(void){/*{{{*/
220 
221  return this->ToMPISerial();
222 
223  }
224  /*}}}*/
225  void Shift(doubletype shift){/*{{{*/
226 
227  for(int i=0;i<this->M;i++)this->vector[i]+=shift;
228 
229  }
230  /*}}}*/
231  void Copy(IssmAbsVec<doubletype>* toin){/*{{{*/
232 
233  int i;
234 
235  /*Assume toin is of the correct type, and downcast: */
236  IssmSeqVec* to=NULL;
237 
238  to=(IssmSeqVec<doubletype>*)toin;
239 
240  to->M=this->M;
241  for(i=0;i<this->M;i++)to->vector[i]=this->vector[i];
242 
243  }
244  /*}}}*/
245  doubletype Norm(NormMode mode){/*{{{*/
246 
247  doubletype norm;
248  int i;
249 
250  switch(mode){
251  case NORM_INF:
252  norm=0.; for(i=0;i<this->M;i++)norm=max(norm,fabs(this->vector[i]));
253  //norm=0.; for(i=0;i<this->M;i++)norm=max(norm,this->vector[i]);
254  return norm;
255  break;
256  case NORM_TWO:
257  norm=0.;
258  for(i=0;i<this->M;i++)norm+=this->vector[i]*this->vector[i];
259  return sqrt(norm);
260  break;
261  default:
262  _error_("unknown norm !");
263  break;
264  }
265  }
266  /*}}}*/
267  void Scale(doubletype scale_factor){/*{{{*/
268 
269  int i;
270  for(i=0;i<this->M;i++)this->vector[i]=scale_factor*this->vector[i];
271 
272  }
273  /*}}}*/
274  doubletype Dot(IssmAbsVec<doubletype>* inputin){/*{{{*/
275 
276  int i;
277 
278  /*Assume inputin is of the correct type, and downcast: */
279  IssmSeqVec* input=NULL;
280 
281  input=(IssmSeqVec<doubletype>*)inputin;
282 
283  doubletype dot=0;
284  for(i=0;i<this->M;i++)dot+=this->vector[i]*input->vector[i];
285  return dot;
286 
287  }
288  /*}}}*/
290 
291  int i;
292 
293  /*Assume xin and yin are of the correct type, and downcast: */
294  IssmSeqVec* x=NULL;
295  IssmSeqVec* y=NULL;
296 
297  x=(IssmSeqVec<doubletype>*)xin;
298  y=(IssmSeqVec<doubletype>*)yin;
299 
300  /*pointwise w=x/y where this->vector is w: */
301  for(i=0;i<this->M;i++)this->vector[i]=x->vector[i]/y->vector[i];
302  }
303  /*}}}*/
304 };
305 #endif //#ifndef _ISSM_SEQ_VEC_H_
IssmSeqVec::GetLocalVector
void GetLocalVector(doubletype **pvector, int **pindices)
Definition: IssmSeqVec.h:145
IssmSeqVec::~IssmSeqVec
~IssmSeqVec()
Definition: IssmSeqVec.h:76
IssmSeqVec::ToMPISerial
doubletype * ToMPISerial(void)
Definition: IssmSeqVec.h:207
IssmSeqVec::IssmSeqVec
IssmSeqVec(int pm, int pM)
Definition: IssmSeqVec.h:52
_printf_
#define _printf_(StreamArgs)
Definition: Print.h:22
ADD_VAL
@ ADD_VAL
Definition: toolkitsenums.h:14
IssmSeqVec::Echo
void Echo(void)
Definition: IssmSeqVec.h:83
IssmSeqVec::Dot
doubletype Dot(IssmAbsVec< doubletype > *inputin)
Definition: IssmSeqVec.h:274
NORM_INF
@ NORM_INF
Definition: toolkitsenums.h:15
IssmSeqVec
Definition: IssmSeqVec.h:31
IssmSeqVec::SetValue
void SetValue(int dof, doubletype value, InsMode mode)
Definition: IssmSeqVec.h:115
IssmSeqVec::IssmSeqVec
IssmSeqVec(int pM, bool fromlocalsize)
Definition: IssmSeqVec.h:59
IssmSeqVec::IssmSeqVec
IssmSeqVec()
Definition: IssmSeqVec.h:39
IssmSeqVec::vector
doubletype * vector
Definition: IssmSeqVec.h:35
NORM_TWO
@ NORM_TWO
Definition: toolkitsenums.h:15
IssmSeqVec::AYPX
void AYPX(IssmAbsVec< doubletype > *Xin, doubletype a)
Definition: IssmSeqVec.h:193
IssmSeqVec::Duplicate
IssmSeqVec< doubletype > * Duplicate(void)
Definition: IssmSeqVec.h:167
IssmSeqVec::Shift
void Shift(doubletype shift)
Definition: IssmSeqVec.h:225
IssmSeqVec::ToMPISerial0
doubletype * ToMPISerial0(void)
Definition: IssmSeqVec.h:219
IssmSeqVec::Scale
void Scale(doubletype scale_factor)
Definition: IssmSeqVec.h:267
INS_VAL
@ INS_VAL
Definition: toolkitsenums.h:14
IssmSeqVec::GetValue
void GetValue(doubletype *pvalue, int dof)
Definition: IssmSeqVec.h:130
IssmSeqVec::M
int M
Definition: IssmSeqVec.h:36
IssmSeqVec::GetSize
void GetSize(int *pM)
Definition: IssmSeqVec.h:136
IssmSeqVec::PointwiseDivide
void PointwiseDivide(IssmAbsVec< doubletype > *xin, IssmAbsVec< doubletype > *yin)
Definition: IssmSeqVec.h:289
IssmAbsVec
Definition: IssmAbsVec.h:24
IssmSeqVec::Copy
void Copy(IssmAbsVec< doubletype > *toin)
Definition: IssmSeqVec.h:231
NormMode
NormMode
Definition: toolkitsenums.h:15
IssmSeqVec::Norm
doubletype Norm(NormMode mode)
Definition: IssmSeqVec.h:245
_error_
#define _error_(StreamArgs)
Definition: exceptions.h:49
IssmSeqVec::IssmSeqVec
IssmSeqVec(doubletype *buffer, int pM)
Definition: IssmSeqVec.h:66
IssmSeqVec::IssmSeqVec
IssmSeqVec(int pM)
Definition: IssmSeqVec.h:45
IssmSeqVec::AXPY
void AXPY(IssmAbsVec< doubletype > *Xin, doubletype a)
Definition: IssmSeqVec.h:179
InsMode
InsMode
Definition: toolkitsenums.h:14
IssmSeqVec::Assemble
void Assemble(void)
Definition: IssmSeqVec.h:92
IssmSeqVec::GetLocalSize
void GetLocalSize(int *pM)
Definition: IssmSeqVec.h:142
max
IssmDouble max(IssmDouble a, IssmDouble b)
Definition: extrema.cpp:24
IssmSeqVec::SetValues
void SetValues(int ssize, int *list, doubletype *values, InsMode mode)
Definition: IssmSeqVec.h:98
IssmSeqVec::Set
void Set(doubletype value)
Definition: IssmSeqVec.h:173