source: issm/trunk-jpl/src/c/classes/objects/Params/DoubleMatArrayParam.cpp@ 12832

Last change on this file since 12832 was 12832, checked in by Eric.Larour, 13 years ago

Almost done migrating objects to classes

File size: 5.9 KB
Line 
1/*!\file DoubleMatArrayParam.c
2 * \brief: implementation of the DoubleMatArrayParam object
3 */
4
5/*header files: */
6/*{{{*/
7#ifdef HAVE_CONFIG_H
8 #include <config.h>
9#else
10#error "Cannot compile with HAVE_CONFIG_H symbol! run configure first!"
11#endif
12
13#include <stdio.h>
14#include <string.h>
15#include "../objects.h"
16#include "../../../EnumDefinitions/EnumDefinitions.h"
17#include "../../../shared/shared.h"
18#include "../../../Container/Container.h"
19#include "../../../include/include.h"
20/*}}}*/
21
22/*DoubleMatArrayParam constructors and destructor*/
23/*FUNCTION DoubleMatArrayParam::DoubleMatArrayParam(){{{*/
24DoubleMatArrayParam::DoubleMatArrayParam(){
25 return;
26}
27/*}}}*/
28/*FUNCTION DoubleMatArrayParam::DoubleMatArrayParam(int enum_type,IssmDouble** array, int M, int* mdim_array, int* ndim_array){{{*/
29DoubleMatArrayParam::DoubleMatArrayParam(int in_enum_type,IssmDouble** in_array, int in_M, int* in_mdim_array, int* in_ndim_array){
30
31 int i;
32 IssmDouble* matrix=NULL;
33 int m,n;
34
35 enum_type=in_enum_type;
36 M=in_M;
37 if(M){
38 array=xNew<IssmDouble*>(M);
39 mdim_array=xNew<int>(M);
40 ndim_array=xNew<int>(M);
41
42 for(i=0;i<M;i++){
43 m=in_mdim_array[i];
44 n=in_ndim_array[i];
45
46 mdim_array[i]=m;
47 ndim_array[i]=n;
48
49 if(m*n){
50 matrix=xNew<IssmDouble>(m*n);
51 xMemCpy<IssmDouble>(matrix,in_array[i],m*n);
52 }
53 else{
54 matrix=NULL;
55 }
56 array[i]=matrix;
57 }
58 }
59 else{
60 array=NULL;
61 mdim_array=NULL;
62 ndim_array=NULL;
63 }
64}
65/*}}}*/
66/*FUNCTION DoubleMatArrayParam::~DoubleMatArrayParam(){{{*/
67DoubleMatArrayParam::~DoubleMatArrayParam(){
68
69 int i;
70 IssmDouble* matrix=NULL;
71
72 xDelete<int>(mdim_array);
73 xDelete<int>(ndim_array);
74
75 for(i=0;i<M;i++){
76 matrix=array[i];
77 xDelete<IssmDouble>(matrix);
78 }
79
80 xDelete<IssmDouble*>(array);
81 return;
82}
83/*}}}*/
84
85/*Object virtual functions definitions:*/
86/*FUNCTION DoubleMatArrayParam::Echo {{{*/
87void DoubleMatArrayParam::Echo(void){
88
89 _printLine_("DoubleMatArrayParam:");
90 _printLine_(" enum: " << this->enum_type << " (" << EnumToStringx(this->enum_type) << ")");
91 _printLine_(" array size: " << this->M);
92 _printLine_(" array pointer: " << this->array);
93
94}
95/*}}}*/
96/*FUNCTION DoubleMatArrayParam::DeepEcho{{{*/
97void DoubleMatArrayParam::DeepEcho(void){
98
99 int i,j,k;
100 int m,n;
101 IssmDouble* matrix=NULL;
102
103 _printLine_("DoubleMatArrayParam:");
104 _printLine_(" enum: " << this->enum_type << " (" << EnumToStringx(this->enum_type) << ")");
105 _printLine_(" array size: " << this->M);
106 for(i=0;i<M;i++){
107 _printLine_(" array " << i << " (" << mdim_array[i] << "x" << ndim_array[i] << "):");
108 matrix=array[i];
109 m=mdim_array[i];
110 n=ndim_array[i];
111
112 for(j=0;j<m;j++){
113 _printString_(" ");
114 for(k=0;k<n;k++)_printString_(*(matrix+n*j+k) << " ");
115 _printLine_("");
116 }
117 }
118}
119/*}}}*/
120/*FUNCTION DoubleMatArrayParam::Id{{{*/
121int DoubleMatArrayParam::Id(void){ return -1; }
122/*}}}*/
123/*FUNCTION DoubleMatArrayParam::MyRank{{{*/
124int DoubleMatArrayParam::MyRank(void){
125 extern int my_rank;
126 return my_rank;
127}
128/*}}}*/
129/*FUNCTION DoubleMatArrayParam::ObjectEnum{{{*/
130int DoubleMatArrayParam::ObjectEnum(void){
131
132 return DoubleMatArrayParamEnum;
133
134}
135/*}}}*/
136/*FUNCTION DoubleMatArrayParam::copy{{{*/
137Object* DoubleMatArrayParam::copy() {
138
139 return new DoubleMatArrayParam(this->enum_type,this->array, this->M, this->mdim_array,this->ndim_array);
140
141}
142/*}}}*/
143
144/*DoubleMatArrayParam virtual functions definitions: */
145/*FUNCTION DoubleMatArrayParam::GetParameterValue(IssmDouble*** parray, int* pM,int** pmdims, int** pndims){{{*/
146void DoubleMatArrayParam::GetParameterValue(IssmDouble*** pout_array, int* pout_M,int** pout_mdim_array, int** pout_ndim_array){
147
148 int i,m,n;
149 IssmDouble* matrix=NULL;
150 IssmDouble* out_matrix=NULL;
151
152 /*output: */
153 IssmDouble** out_array=NULL;
154 int out_M;
155 int* out_mdim_array=NULL;
156 int* out_ndim_array=NULL;
157
158
159 out_M=this->M;
160 if(out_M){
161 out_array=xNew<IssmDouble*>(M);
162 out_mdim_array=xNew<int>(M);
163 out_ndim_array=xNew<int>(M);
164
165 xMemCpy<int>(out_mdim_array,this->mdim_array,M);
166 xMemCpy<int>(out_ndim_array,this->ndim_array,M);
167
168 for(i=0;i<this->M;i++){
169 matrix=this->array[i];
170 m=this->mdim_array[i];
171 n=this->ndim_array[i];
172
173 if(m*n){
174 out_matrix=xNew<IssmDouble>(m*n);
175 xMemCpy<IssmDouble>(out_matrix,matrix,m*n);
176 }
177 else{
178 out_matrix=NULL;
179 }
180 out_array[i]=out_matrix;
181 }
182 }
183 else{
184 out_array=NULL;
185 out_matrix=NULL;
186 out_ndim_array=NULL;
187 }
188
189
190 /*Assign output pointers:*/
191 if(pout_M) *pout_M=out_M;
192 if(pout_mdim_array) *pout_mdim_array=out_mdim_array;
193 if(pout_ndim_array) *pout_ndim_array=out_ndim_array;
194 *pout_array=out_array;
195
196}
197/*}}}*/
198/*FUNCTION DoubleMatArrayParam::GetParameterName{{{*/
199void DoubleMatArrayParam::GetParameterName(char**pname){
200 EnumToStringx(pname,this->enum_type);
201}
202/*}}}*/
203/*FUNCTION DoubleMatArrayParam::SetValue(IssmDouble** array, int M, int* mdim_array, int* ndim_array){{{*/
204void DoubleMatArrayParam::SetValue(IssmDouble** in_array, int in_M, int* in_mdim_array, int* in_ndim_array){
205
206 int i,m,n;
207 IssmDouble* in_matrix=NULL;
208 IssmDouble* matrix=NULL;
209
210 /*avoid leak: */
211 xDelete<int>(mdim_array);
212 xDelete<int>(ndim_array);
213 for(i=0;i<M;i++){
214 matrix=array[i];
215 xDelete<IssmDouble>(matrix);
216 }
217 xDelete<IssmDouble*>(array);
218
219 /*copy data: */
220 this->M=in_M;
221 this->array=xNew<IssmDouble*>(M);
222 this->mdim_array=xNew<int>(M);
223 this->ndim_array=xNew<int>(M);
224
225 xMemCpy<int>(this->mdim_array,in_mdim_array,M);
226 xMemCpy<int>(this->ndim_array,in_ndim_array,M);
227
228 for(i=0;i<M;i++){
229 in_matrix=in_array[i];
230 m=in_mdim_array[i];
231 n=in_ndim_array[i];
232
233 matrix=xNew<IssmDouble>(m*n);
234 xMemCpy<IssmDouble>(matrix,in_matrix,m*n);
235
236 this->array[i]=matrix;
237 }
238
239}
240/*}}}*/
241/*FUNCTION DoubleMatArrayParam::UnitConversion{{{*/
242void DoubleMatArrayParam::UnitConversion(int direction_enum){
243 /*go through all matrices and convert: */
244 for (int i=0;i<this->M;i++){
245 IssmDouble* matrix=this->array[i];
246 int m=this->mdim_array[i];
247 int n=this->ndim_array[i];
248 ::UnitConversion(matrix,m*n,direction_enum,this->enum_type);
249 }
250
251}
252/*}}}*/
Note: See TracBrowser for help on using the repository browser.