source: issm/trunk/src/c/objects/Inputs/ControlInput.cpp@ 6260

Last change on this file since 6260 was 6260, checked in by Mathieu Morlighem, 14 years ago

Retrun all gradients

File size: 11.2 KB
Line 
1/*!\file ControlInput.c
2 * \brief: implementation of the ControlInput 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 <string.h>
13#include "../objects.h"
14#include "../../EnumDefinitions/EnumDefinitions.h"
15#include "../../shared/shared.h"
16#include "../../Container/Container.h"
17#include "../../include/include.h"
18
19/*ControlInput constructors and destructor*/
20/*FUNCTION ControlInput::ControlInput(){{{1*/
21ControlInput::ControlInput(){
22 control_id = 0;
23 values = NULL;
24 savedvalues = NULL;
25 gradient = NULL;
26}
27/*}}}*/
28/*FUNCTION ControlInput::ControlInput(int enum_type,int enum_input,double* pvalues,int id){{{1*/
29ControlInput::ControlInput(int in_enum_type,int enum_input,double* pvalues,int id){
30
31 control_id=id;
32 enum_type=in_enum_type;
33
34 switch(enum_input){
35 case TriaVertexInputEnum:
36 values =new TriaVertexInput(enum_type,pvalues);
37 savedvalues=new TriaVertexInput(enum_type,pvalues);
38 break;
39 case PentaVertexInputEnum:
40 values =new PentaVertexInput(enum_type,pvalues);
41 savedvalues=new PentaVertexInput(enum_type,pvalues);
42 break;
43 default:
44 ISSMERROR("Input of Enum %s not supported yet by ControlInput",EnumToString(enum_input));
45 }
46 gradient =NULL;
47}
48/*}}}*/
49/*FUNCTION ControlInput::~ControlInput(){{{1*/
50ControlInput::~ControlInput(){
51 delete values;
52 delete savedvalues;
53 delete gradient;
54}
55/*}}}*/
56
57/*Object virtual functions definitions:*/
58 /*FUNCTION ControlInput::Echo {{{1*/
59void ControlInput::Echo(void){
60 this->DeepEcho();
61}
62/*}}}*/
63/*FUNCTION ControlInput::DeepEcho{{{1*/
64void ControlInput::DeepEcho(void){
65
66 printf("ControlInput:\n");
67 printf(" enum: %i (%s)\n",this->enum_type,EnumToString(this->enum_type));
68 printf("---values: \n"); if (values) values->Echo();
69 printf("---savedvalues: \n"); if (savedvalues) savedvalues->Echo();
70 printf("---gradient: \n"); if (gradient) gradient->Echo();
71}
72/*}}}*/
73/*FUNCTION ControlInput::Id{{{1*/
74int ControlInput::Id(void){ return -1; }
75/*}}}*/
76/*FUNCTION ControlInput::MyRank{{{1*/
77int ControlInput::MyRank(void){
78 extern int my_rank;
79 return my_rank;
80}
81/*}}}*/
82/*FUNCTION ControlInput::Marshall{{{1*/
83void ControlInput::Marshall(char** pmarshalled_dataset){
84
85 char* marshalled_dataset=NULL;
86 int enum_value=0;
87 int flag;
88
89 /*recover marshalled_dataset: */
90 marshalled_dataset=*pmarshalled_dataset;
91
92 /*get enum value of ControlInput: */
93 enum_value=ControlInputEnum;
94
95 /*marshall enum: */
96 memcpy(marshalled_dataset,&enum_value,sizeof(enum_value));marshalled_dataset+=sizeof(enum_value);
97
98 /*marshall enum_type: */
99 memcpy(marshalled_dataset,&enum_type,sizeof(enum_type));marshalled_dataset+=sizeof(enum_type);
100 memcpy(marshalled_dataset,&control_id,sizeof(control_id));marshalled_dataset+=sizeof(control_id);
101
102 /*marshal values*/
103 if(!values){
104 flag=0;
105 memcpy(marshalled_dataset,&flag,sizeof(flag));marshalled_dataset+=sizeof(flag);
106 }
107 else{
108 flag=1;
109 memcpy(marshalled_dataset,&flag,sizeof(flag));marshalled_dataset+=sizeof(flag);
110 this->values->Marshall(&marshalled_dataset);
111 }
112
113 /*marshal savedvalues*/
114 if(!savedvalues){
115 flag=0;
116 memcpy(marshalled_dataset,&flag,sizeof(flag));marshalled_dataset+=sizeof(flag);
117 }
118 else{
119 flag=1;
120 memcpy(marshalled_dataset,&flag,sizeof(flag));marshalled_dataset+=sizeof(flag);
121 this->savedvalues->Marshall(&marshalled_dataset);
122 }
123
124 /*marshal gradient*/
125 if(!gradient){
126 flag=0;
127 memcpy(marshalled_dataset,&flag,sizeof(flag));marshalled_dataset+=sizeof(flag);
128 }
129 else{
130 flag=1;
131 memcpy(marshalled_dataset,&flag,sizeof(flag));marshalled_dataset+=sizeof(flag);
132 this->gradient->Marshall(&marshalled_dataset);
133 }
134
135 /*clean up and assign output pointer*/
136 *pmarshalled_dataset=marshalled_dataset;
137}
138/*}}}*/
139/*FUNCTION ControlInput::MarshallSize{{{1*/
140int ControlInput::MarshallSize(){
141
142 int size=0;
143
144 size=sizeof(enum_type)+
145 +sizeof(control_id)
146 +3*sizeof(int) //3 flags
147 +sizeof(int); //sizeof(int) for enum value
148
149 if(values) size+=values->MarshallSize();
150 if(savedvalues)size+=savedvalues->MarshallSize();
151 if(gradient) size+=gradient->MarshallSize();
152 return size;
153}
154/*}}}*/
155/*FUNCTION ControlInput::Demarshall{{{1*/
156void ControlInput::Demarshall(char** pmarshalled_dataset){
157
158 char* marshalled_dataset=NULL;
159 int flag,input_enum_type;
160
161 /*recover marshalled_dataset: */
162 marshalled_dataset=*pmarshalled_dataset;
163
164 /*this time, no need to get enum type, the pointer directly points to the beginning of the
165 *object data (thanks to DataSet::Demarshall):*/
166 memcpy(&enum_type,marshalled_dataset,sizeof(enum_type));marshalled_dataset+=sizeof(enum_type);
167 memcpy(&control_id,marshalled_dataset,sizeof(control_id));marshalled_dataset+=sizeof(control_id);
168
169 /*Demarshal values*/
170 memcpy(&flag,marshalled_dataset,sizeof(int));marshalled_dataset+=sizeof(int);
171 if(flag){
172 memcpy(&input_enum_type,marshalled_dataset,sizeof(int)); marshalled_dataset+=sizeof(int);
173 if(input_enum_type==PentaVertexInputEnum){
174 values=new PentaVertexInput();
175 values->Demarshall(&marshalled_dataset);
176 }
177 else if(input_enum_type==TriaVertexInputEnum){
178 values=new TriaVertexInput();
179 values->Demarshall(&marshalled_dataset);
180 }
181 else ISSMERROR("Not supported yet");
182 }
183 else{
184 values=NULL;
185 }
186
187 /*Demarshal savedvalues*/
188 memcpy(&flag,marshalled_dataset,sizeof(int));marshalled_dataset+=sizeof(int);
189 if(flag){
190 memcpy(&input_enum_type,marshalled_dataset,sizeof(int)); marshalled_dataset+=sizeof(int);
191 if(input_enum_type==PentaVertexInputEnum){
192 savedvalues=new PentaVertexInput();
193 savedvalues->Demarshall(&marshalled_dataset);
194 }
195 else if(input_enum_type==TriaVertexInputEnum){
196 savedvalues=new TriaVertexInput();
197 savedvalues->Demarshall(&marshalled_dataset);
198 }
199 else ISSMERROR("Not supported yet");
200 }
201 else{
202 savedvalues=NULL;
203 }
204
205 /*Demarshal gradient*/
206 memcpy(&flag,marshalled_dataset,sizeof(int));marshalled_dataset+=sizeof(int);
207 if(flag){
208 memcpy(&input_enum_type,marshalled_dataset,sizeof(int)); marshalled_dataset+=sizeof(int);
209 if(input_enum_type==PentaVertexInputEnum){
210 gradient=new PentaVertexInput();
211 gradient->Demarshall(&marshalled_dataset);
212 }
213 else if(input_enum_type==TriaVertexInputEnum){
214 gradient=new TriaVertexInput();
215 gradient->Demarshall(&marshalled_dataset);
216 }
217 else ISSMERROR("Not supported yet");
218 }
219 else{
220 gradient=NULL;
221 }
222
223 /*return: */
224 *pmarshalled_dataset=marshalled_dataset;
225 return;
226}
227/*}}}*/
228/*FUNCTION ControlInput::Enum{{{1*/
229int ControlInput::Enum(void){
230
231 return ControlInputEnum;
232
233}
234/*}}}*/
235/*FUNCTION ControlInput::copy{{{1*/
236Object* ControlInput::copy() {
237
238 ControlInput* output=NULL;
239
240 output = new ControlInput();
241 output->enum_type=this->enum_type;
242 output->control_id=this->control_id;
243
244 if(values) output->values=(Input*)this->values->copy();
245 if(savedvalues) output->savedvalues=(Input*)this->savedvalues->copy();
246 if(gradient) output->gradient=(Input*)this->gradient->copy();
247
248 return output;
249}
250/*}}}*/
251
252/*ControlInput management*/
253/*FUNCTION ControlInput::EnumType{{{1*/
254int ControlInput::EnumType(void){
255
256 return this->enum_type;
257
258}
259/*}}}*/
260
261/*Object functions*/
262/*FUNCTION ControlInput::Constrain{{{1*/
263void ControlInput::Constrain(double cm_min, double cm_max){
264 values->Constrain(cm_min,cm_max);
265}/*}}}*/
266/*FUNCTION ControlInput::Extrude{{{1*/
267void ControlInput::Extrude(void){
268 values->Extrude();
269 savedvalues->Extrude();
270 //gradient->Extrude();
271}/*}}}*/
272/*FUNCTION ControlInput::GetGradient{{{1*/
273void ControlInput::GetGradient(Vec gradient_vec,int* doflist){
274 if(gradient) gradient->GetVectorFromInputs(gradient_vec,doflist);
275}/*}}}*/
276/*FUNCTION ControlInput::ScaleGradient{{{1*/
277void ControlInput::ScaleGradient(double scaling_factor){
278 if(!gradient) ISSMERROR("Gradient of ControlInput %s not found",EnumToString(enum_type));
279 gradient->Scale(scaling_factor);
280}/*}}}*/
281/*FUNCTION ControlInput::SetGradient{{{1*/
282void ControlInput::SetGradient(Input* gradient_in){
283
284 /*Get enum for current gradient*/
285 switch(this->control_id){
286 case 1:
287 gradient_in->ChangeEnum(Gradient1Enum);
288 break;
289 case 2:
290 gradient_in->ChangeEnum(Gradient2Enum);
291 break;
292 case 3:
293 gradient_in->ChangeEnum(Gradient3Enum);
294 break;
295 default:
296 ISSMERROR("more than 3 controls not implemented yet (Gradient %i was requested). EnumDefinitions.h needs to be updated.",this->control_id);
297 }
298
299 /*Delete old gradient and assign new gradient*/
300 if(gradient) delete gradient;
301 gradient=gradient_in;
302
303}/*}}}*/
304/*FUNCTION ControlInput::SpawnResult{{{1*/
305ElementResult* ControlInput::SpawnResult(int step, double time){
306 return savedvalues->SpawnResult(step,time);
307}/*}}}*/
308/*FUNCTION ControlInput::SpawnTriaInput{{{1*/
309Input* ControlInput::SpawnTriaInput(int* indices){
310 return values->SpawnTriaInput(indices);
311}/*}}}*/
312/*FUNCTION ControlInput::SpawnGradient{{{1*/
313ElementResult* ControlInput::SpawnGradient(int step, double time){
314 return gradient->SpawnResult(step,time);
315}/*}}}*/
316/*FUNCTION ControlInput::GetParameterAverage(double* pvalue){{{1*/
317void ControlInput::GetParameterAverage(double* pvalue){
318 values->GetParameterAverage(pvalue);
319}/*}}}*/
320/*FUNCTION ControlInput::GetParameterValue(bool* pvalue){{{1*/
321void ControlInput::GetParameterValue(bool* pvalue){
322 values->GetParameterValue(pvalue);
323}/*}}}*/
324/*FUNCTION ControlInput::GetParameterValue(int* pvalue){{{1*/
325void ControlInput::GetParameterValue(int* pvalue){
326 values->GetParameterValue(pvalue);
327}/*}}}*/
328/*FUNCTION ControlInput::GetParameterValue(double* pvalue){{{1*/
329void ControlInput::GetParameterValue(double* pvalue){
330 values->GetParameterValue(pvalue);
331}/*}}}*/
332/*FUNCTION ControlInput::GetParameterValue(double* pvalue){{{1*/
333void ControlInput::GetParameterValue(double* pvalue,GaussTria* gauss){
334 values->GetParameterValue(pvalue,gauss);
335}/*}}}*/
336/*FUNCTION ControlInput::GetParameterValue(double* pvalue){{{1*/
337void ControlInput::GetParameterValue(double* pvalue,GaussPenta* gauss){
338 values->GetParameterValue(pvalue,gauss);
339}/*}}}*/
340/*FUNCTION ControlInput::GetParameterDerivativeValue(double* derivativevalues, double* xyz_list, GaussTria* gauss){{{1*/
341void ControlInput::GetParameterDerivativeValue(double* derivativevalues, double* xyz_list, GaussTria* gauss){
342 values->GetParameterDerivativeValue(derivativevalues,xyz_list,gauss);
343}/*}}}*/
344/*FUNCTION ControlInput::GetParameterDerivativeValue(double* derivativevalues, double* xyz_list, GaussPenta* gauss){{{1*/
345void ControlInput::GetParameterDerivativeValue(double* derivativevalues, double* xyz_list, GaussPenta* gauss){
346 values->GetParameterDerivativeValue(derivativevalues,xyz_list,gauss);
347}/*}}}*/
348/*FUNCTION ControlInput::SaveValue{{{1*/
349void ControlInput::SaveValue(void){
350 if(!values) ISSMERROR("Values of %s not found",EnumToString(this->enum_type));
351
352 if(savedvalues) delete this->savedvalues;
353 this->savedvalues=(Input*)this->values->copy();
354}/*}}}*/
355/*FUNCTION ControlInput::UpdateValue{{{1*/
356void ControlInput::UpdateValue(double scalar){
357 if(!gradient) ISSMERROR("Gradient of %s not found",EnumToString(this->enum_type));
358 if(!savedvalues) ISSMERROR("Values of %s not found",EnumToString(this->enum_type));
359
360 if(values) delete this->values;
361 this->values=(Input*)this->savedvalues->copy();
362 this->values->AXPY(gradient,scalar);
363}/*}}}*/
364/*FUNCTION ControlInput::VerticallyIntegrate{{{1*/
365void ControlInput::VerticallyIntegrate(Input* thickness_input){
366 values->VerticallyIntegrate(thickness_input);
367}/*}}}*/
Note: See TracBrowser for help on using the repository browser.