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

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

CHG: integrated Container/ directory into src/c/classes/objects directory. No reason to have the containers
and the objects that they contain defined in different places.

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