source: issm/trunk/src/c/objects/Numpar.cpp@ 3607

Last change on this file since 3607 was 3607, checked in by Mathieu Morlighem, 15 years ago

Destruction of control_type leads to a matlab crash in serial

File size: 8.5 KB
Line 
1/*!\file Numpar.c
2 * \brief: implementation of the Numpar object
3 */
4
5#ifdef HAVE_CONFIG_H
6 #include "config.h"
7#else
8#error "Cannot compile with HAVE_CONFIG_H symbol! run configure first!"
9#endif
10
11#include "stdio.h"
12#include "./Numpar.h"
13#include <string.h>
14#include "../EnumDefinitions/EnumDefinitions.h"
15#include "../shared/shared.h"
16#include "../DataSet/DataSet.h"
17#include "../include/typedefs.h"
18#include "../include/macros.h"
19
20/*Object constructors and destructor*/
21/*FUNCTION Numpar::constructor {{{1*/
22Numpar::Numpar(){
23 return;
24}
25/*}}}*/
26/*FUNCTION Numpar::creation {{{1*/
27Numpar::Numpar(int numpar_id){
28 id=numpar_id;
29
30 meanvel=UNDEF;
31 epsvel=UNDEF;
32 artdiff=UNDEF;
33 viscosity_overshoot=UNDEF;
34 stokesreconditioning=UNDEF;
35 control_type=NULL;
36 cm_noisedmp=UNDEF;
37 cm_mindmp_value=UNDEF;
38 cm_mindmp_slope=UNDEF;
39 cm_maxdmp_value=UNDEF;
40 cm_maxdmp_slope=UNDEF;
41
42 return;
43}
44/*}}}*/
45/*FUNCTION Numpar::destructor {{{1*/
46Numpar::~Numpar(){
47
48 /*Free the only pointer*/
49 //xfree((void**)&control_type);
50
51 return;
52}
53/*}}}*/
54
55/*Object marshall*/
56/*FUNCTION Numpar::Marshall {{{1*/
57void Numpar::Marshall(char** pmarshalled_dataset){
58
59 char* marshalled_dataset=NULL;
60 int enum_type=0;
61
62 /*recover marshalled_dataset: */
63 marshalled_dataset=*pmarshalled_dataset;
64
65 /*get enum type of Numpar: */
66 enum_type=NumparEnum;
67
68 /*marshall enum: */
69 memcpy(marshalled_dataset,&enum_type,sizeof(enum_type));marshalled_dataset+=sizeof(enum_type);
70
71 /*marshall Numpar data: */
72 memcpy(marshalled_dataset,&id,sizeof(id));marshalled_dataset+=sizeof(id);
73 memcpy(marshalled_dataset,&meanvel,sizeof(meanvel));marshalled_dataset+=sizeof(meanvel);
74 memcpy(marshalled_dataset,&epsvel,sizeof(epsvel));marshalled_dataset+=sizeof(epsvel);
75 memcpy(marshalled_dataset,&artdiff,sizeof(artdiff));marshalled_dataset+=sizeof(artdiff);
76 memcpy(marshalled_dataset,&viscosity_overshoot,sizeof(viscosity_overshoot));marshalled_dataset+=sizeof(viscosity_overshoot);
77 memcpy(marshalled_dataset,&stokesreconditioning,sizeof(stokesreconditioning));marshalled_dataset+=sizeof(stokesreconditioning);
78 memcpy(marshalled_dataset,&control_type,sizeof(control_type));marshalled_dataset+=sizeof(control_type);
79 memcpy(marshalled_dataset,&cm_noisedmp,sizeof(cm_noisedmp));marshalled_dataset+=sizeof(cm_noisedmp);
80 memcpy(marshalled_dataset,&cm_mindmp_value,sizeof(cm_mindmp_value));marshalled_dataset+=sizeof(cm_mindmp_value);
81 memcpy(marshalled_dataset,&cm_mindmp_slope,sizeof(cm_mindmp_slope));marshalled_dataset+=sizeof(cm_mindmp_slope);
82 memcpy(marshalled_dataset,&cm_maxdmp_value,sizeof(cm_maxdmp_value));marshalled_dataset+=sizeof(cm_maxdmp_value);
83 memcpy(marshalled_dataset,&cm_maxdmp_slope,sizeof(cm_maxdmp_slope));marshalled_dataset+=sizeof(cm_maxdmp_slope);
84
85 *pmarshalled_dataset=marshalled_dataset;
86 return;
87}
88/*}}}*/
89/*FUNCTION Numpar::MarshallSize{{{1*/
90int Numpar::MarshallSize(){
91 return sizeof(id)
92 +sizeof(meanvel)
93 +sizeof(epsvel)
94 +sizeof(artdiff)
95 +sizeof(viscosity_overshoot)
96 +sizeof(stokesreconditioning)
97 +sizeof(control_type)
98 +sizeof(cm_noisedmp)
99 +sizeof(cm_mindmp_value)
100 +sizeof(cm_mindmp_slope)
101 +sizeof(cm_maxdmp_value)
102 +sizeof(cm_maxdmp_slope)
103 +sizeof(int); //sizeof(int) for enum type
104}
105/*}}}*/
106/*FUNCTION Numpar::Demarshall {{{1*/
107void Numpar::Demarshall(char** pmarshalled_dataset){
108
109 char* marshalled_dataset=NULL;
110 int i;
111
112 /*recover marshalled_dataset: */
113 marshalled_dataset=*pmarshalled_dataset;
114
115 /*this time, no need to get enum type, the pointer directly points to the beginning of the
116 *object data (thanks to DataSet::Demarshall):*/
117
118 memcpy(&id,marshalled_dataset,sizeof(id));marshalled_dataset+=sizeof(id);
119 memcpy(&meanvel,marshalled_dataset,sizeof(meanvel));marshalled_dataset+=sizeof(meanvel);
120 memcpy(&epsvel,marshalled_dataset,sizeof(epsvel));marshalled_dataset+=sizeof(epsvel);
121 memcpy(&artdiff,marshalled_dataset,sizeof(artdiff));marshalled_dataset+=sizeof(artdiff);
122 memcpy(&viscosity_overshoot,marshalled_dataset,sizeof(viscosity_overshoot));marshalled_dataset+=sizeof(viscosity_overshoot);
123 memcpy(&stokesreconditioning,marshalled_dataset,sizeof(stokesreconditioning));marshalled_dataset+=sizeof(stokesreconditioning);
124 memcpy(&control_type,marshalled_dataset,sizeof(control_type));marshalled_dataset+=sizeof(control_type);
125 memcpy(&cm_noisedmp,marshalled_dataset,sizeof(cm_noisedmp));marshalled_dataset+=sizeof(cm_noisedmp);
126 memcpy(&cm_mindmp_value,marshalled_dataset,sizeof(cm_mindmp_value));marshalled_dataset+=sizeof(cm_mindmp_value);
127 memcpy(&cm_mindmp_slope,marshalled_dataset,sizeof(cm_mindmp_slope));marshalled_dataset+=sizeof(cm_mindmp_slope);
128 memcpy(&cm_maxdmp_value,marshalled_dataset,sizeof(cm_maxdmp_value));marshalled_dataset+=sizeof(cm_maxdmp_value);
129 memcpy(&cm_maxdmp_slope,marshalled_dataset,sizeof(cm_maxdmp_slope));marshalled_dataset+=sizeof(cm_maxdmp_slope);
130
131 /*return: */
132 *pmarshalled_dataset=marshalled_dataset;
133 return;
134}
135/*}}}*/
136
137/*Object functions*/
138/*FUNCTION Numpar::Configure {{{1*/
139void Numpar::Configure(void* pparametersin){
140
141 DataSet* parameters=NULL;
142
143 /*Recover virtual pointer:*/
144 parameters=(DataSet*)pparametersin;
145
146 /*Go through parameters dataset, and find the Param object corresponding to our fields,
147 * and update the fields: */
148 parameters->FindParam(&meanvel,"meanvel");
149 parameters->FindParam(&epsvel,"epsvel");
150 if(!parameters->FindParam(&artdiff,"artdiff"))ISSMERROR(" error message: could not update artdiff field");
151 if(!parameters->FindParam(&viscosity_overshoot,"viscosity_overshoot"))ISSMERROR(" error message: could not update viscosity_overshoot field");
152 if(!parameters->FindParam(&stokesreconditioning,"stokesreconditioning"))ISSMERROR(" error message: could not update stokesreconditioning field");
153 xfree((void**)&control_type);
154 parameters->FindParam(&control_type,"control_type");
155 parameters->FindParam(&cm_noisedmp,"cm_noisedmp");
156 parameters->FindParam(&cm_mindmp_value,"cm_mindmp_value");
157 parameters->FindParam(&cm_mindmp_slope,"cm_mindmp_slope");
158 parameters->FindParam(&cm_maxdmp_value,"cm_maxdmp_value");
159 parameters->FindParam(&cm_maxdmp_slope,"cm_maxdmp_slope");
160
161 return;
162}
163/*}}}*/
164/*FUNCTION Numpar::copy {{{1*/
165Object* Numpar::copy() {
166
167 return new Numpar(*this);
168
169}
170/*}}}*/
171/*FUNCTION Numpar::DeepEcho {{{1*/
172void Numpar::DeepEcho(void){
173
174 printf("Numpar:\n");
175 printf(" id: %i\n",id);
176 printf(" meanvel: %g\n",meanvel);
177 printf(" epsvel: %g\n",epsvel);
178 printf(" artdiff: %i\n",artdiff);
179 printf(" viscosity_overshoot: %g\n",viscosity_overshoot);
180 printf(" stokesreconditioning: %g\n",stokesreconditioning);
181 printf(" control_type: %s\n",control_type);
182 printf(" cm_noisedmp: %g\n",cm_noisedmp);
183 printf(" cm_mindmp_value: %g\n",cm_mindmp_value);
184 printf(" cm_mindmp_slope: %g\n",cm_mindmp_slope);
185 printf(" cm_maxdmp_value: %g\n",cm_maxdmp_value);
186 printf(" cm_maxdmp_slope: %g\n",cm_maxdmp_slope);
187}
188/*}}}*/
189/*FUNCTION Numpar::Echo{{{1*/
190void Numpar::Echo(void){
191
192 printf("Numpar:\n");
193 printf(" id: %i\n",id);
194 printf(" meanvel: %g\n",meanvel);
195 printf(" epsvel: %g\n",epsvel);
196 printf(" artdiff: %i\n",artdiff);
197 printf(" viscosity_overshoot: %g\n",viscosity_overshoot);
198 printf(" stokesreconditioning: %g\n",stokesreconditioning);
199 printf(" control_type: %s\n",control_type);
200 printf(" cm_noisedmp: %g\n",cm_noisedmp);
201 printf(" cm_mindmp_value: %g\n",cm_mindmp_value);
202 printf(" cm_mindmp_slope: %g\n",cm_mindmp_slope);
203 printf(" cm_maxdmp_value: %g\n",cm_maxdmp_value);
204 printf(" cm_maxdmp_slope: %g\n",cm_maxdmp_slope);
205}
206/*}}}*/
207/*FUNCTION Numpar::Enum {{{1*/
208int Numpar::Enum(void){
209
210 return NumparEnum;
211
212}
213/*}}}*/
214/*FUNCTION Numpar::GetId {{{1*/
215int Numpar::GetId(void){ return id; }
216/*}}}*/
217/*FUNCTION Numpar::GetName {{{1*/
218char* Numpar::GetName(void){
219 return "beam";
220}
221/*}}}*/
222/*FUNCTION Numpar::MyRank {{{1*/
223int Numpar::MyRank(void){
224 extern int my_rank;
225 return my_rank;
226}
227/*}}}*/
228/*FUNCTION Numpar::UpdateFromInputs {{{1*/
229void Numpar::UpdateFromInputs(void* vinputs){
230
231 ParameterInputs* inputs=NULL;
232
233 /*recover pointers: */
234 inputs=(ParameterInputs*)vinputs;
235
236 /*Update internal data if inputs holds new values: */
237 inputs->Recover("meanvel",&meanvel);
238 inputs->Recover("epsvel",&epsvel);
239 inputs->Recover("artdiff",&artdiff);
240 inputs->Recover("viscosity_overshoot",&viscosity_overshoot);
241 inputs->Recover("stokesreconditioning",&stokesreconditioning);
242 inputs->Recover("control_type",&control_type);
243 inputs->Recover("cm_noisedmp",&cm_noisedmp);
244 inputs->Recover("cm_mindmp_value",&cm_mindmp_value);
245 inputs->Recover("cm_mindmp_slope",&cm_mindmp_slope);
246 inputs->Recover("cm_maxdmp_value",&cm_maxdmp_value);
247 inputs->Recover("cm_maxdmp_slope",&cm_maxdmp_slope);
248
249}
250/*}}}*/
Note: See TracBrowser for help on using the repository browser.