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

Last change on this file since 12330 was 12330, checked in by Mathieu Morlighem, 13 years ago

merged trunk-jpl and trunk for revision 12326M

File size: 9.0 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 minvalues = NULL;
26 maxvalues = NULL;
27 gradient = NULL;
28}
29/*}}}*/
30/*FUNCTION ControlInput::ControlInput(int enum_type,int enum_input,double* pvalues,double* pmin,double* pmax,int id){{{1*/
31ControlInput::ControlInput(int in_enum_type,int enum_input,double* pvalues,double* pmin,double* pmax,int id){
32
33 control_id=id;
34 enum_type=in_enum_type;
35
36 switch(enum_input){
37 case TriaP1InputEnum:
38 values =new TriaP1Input(enum_type,pvalues);
39 savedvalues=new TriaP1Input(enum_type,pvalues);
40 minvalues =new TriaP1Input(enum_type,pmin);
41 maxvalues =new TriaP1Input(enum_type,pmax);
42 break;
43 case PentaP1InputEnum:
44 values =new PentaP1Input(enum_type,pvalues);
45 savedvalues=new PentaP1Input(enum_type,pvalues);
46 minvalues =new PentaP1Input(enum_type,pmin);
47 maxvalues =new PentaP1Input(enum_type,pmax);
48 break;
49 default:
50 _error_("Input of Enum %s not supported yet by ControlInput",EnumToStringx(enum_input));
51 }
52 gradient =NULL;
53}
54/*}}}*/
55/*FUNCTION ControlInput::~ControlInput(){{{1*/
56ControlInput::~ControlInput(){
57 delete values;
58 delete savedvalues;
59 delete minvalues;
60 delete maxvalues;
61 delete gradient;
62}
63/*}}}*/
64
65/*Object virtual functions definitions:*/
66 /*FUNCTION ControlInput::Echo {{{1*/
67void ControlInput::Echo(void){
68 this->DeepEcho();
69}
70/*}}}*/
71/*FUNCTION ControlInput::DeepEcho{{{1*/
72void ControlInput::DeepEcho(void){
73
74 printf("ControlInput:\n");
75 printf(" enum: %i (%s)\n",this->enum_type,EnumToStringx(this->enum_type));
76 printf("---values: \n"); if (values) values->Echo();
77 printf("---savedvalues: \n");if (savedvalues) savedvalues->Echo();
78 printf("---minvalues: \n"); if (minvalues) minvalues->Echo();
79 printf("---maxvalues: \n"); if (maxvalues) maxvalues->Echo();
80 printf("---gradient: \n"); if (gradient) gradient->Echo();
81}
82/*}}}*/
83/*FUNCTION ControlInput::Id{{{1*/
84int ControlInput::Id(void){ return -1; }
85/*}}}*/
86/*FUNCTION ControlInput::MyRank{{{1*/
87int ControlInput::MyRank(void){
88 extern int my_rank;
89 return my_rank;
90}
91/*}}}*/
92/*FUNCTION ControlInput::ObjectEnum{{{1*/
93int ControlInput::ObjectEnum(void){
94
95 return ControlInputEnum;
96
97}
98/*}}}*/
99/*FUNCTION ControlInput::copy{{{1*/
100Object* ControlInput::copy() {
101
102 ControlInput* output=NULL;
103
104 output = new ControlInput();
105 output->enum_type=this->enum_type;
106 output->control_id=this->control_id;
107
108 if(values) output->values=(Input*)this->values->copy();
109 if(savedvalues) output->savedvalues=(Input*)this->savedvalues->copy();
110 if(minvalues) output->minvalues=(Input*)this->minvalues->copy();
111 if(maxvalues) output->maxvalues=(Input*)this->maxvalues->copy();
112 if(gradient) output->gradient=(Input*)this->gradient->copy();
113
114 return output;
115}
116/*}}}*/
117
118/*ControlInput management*/
119/*FUNCTION ControlInput::InstanceEnum{{{1*/
120int ControlInput::InstanceEnum(void){
121
122 return this->enum_type;
123
124}
125/*}}}*/
126
127/*Object functions*/
128/*FUNCTION ControlInput::Constrain(){{{1*/
129void ControlInput::Constrain(void){
130
131 Input* newvalues=NULL;
132
133 newvalues=this->values->PointwiseMin(maxvalues);
134 delete values; this->values=newvalues;
135 newvalues=this->values->PointwiseMax(minvalues);
136 delete values; this->values=newvalues;
137}/*}}}*/
138/*FUNCTION ControlInput::Constrain(double min, double max){{{1*/
139void ControlInput::Constrain(double min, double max){
140 values->Constrain(min,max);
141}/*}}}*/
142/*FUNCTION ControlInput::Extrude{{{1*/
143void ControlInput::Extrude(void){
144 values->Extrude();
145 savedvalues->Extrude();
146 //gradient->Extrude();
147}/*}}}*/
148/*FUNCTION ControlInput::GetGradient{{{1*/
149void ControlInput::GetGradient(Vector* gradient_vec,int* doflist){
150 if(gradient) gradient->GetVectorFromInputs(gradient_vec,doflist);
151}/*}}}*/
152/*FUNCTION ControlInput::ScaleGradient{{{1*/
153void ControlInput::ScaleGradient(double scaling_factor){
154 if(!gradient) _error_("Gradient of ControlInput %s not found",EnumToStringx(enum_type));
155 gradient->Scale(scaling_factor);
156}/*}}}*/
157/*FUNCTION ControlInput::SetGradient{{{1*/
158void ControlInput::SetGradient(Input* gradient_in){
159
160 /*Get enum for current gradient*/
161 switch(this->control_id){
162 case 1:
163 gradient_in->ChangeEnum(Gradient1Enum);
164 break;
165 case 2:
166 gradient_in->ChangeEnum(Gradient2Enum);
167 break;
168 case 3:
169 gradient_in->ChangeEnum(Gradient3Enum);
170 break;
171 default:
172 _error_("more than 3 controls not implemented yet (Gradient %i was requested). EnumDefinitions.h needs to be updated.",this->control_id);
173 }
174
175 /*Delete old gradient and assign new gradient*/
176 if(gradient) delete gradient;
177 gradient=gradient_in;
178
179}/*}}}*/
180/*FUNCTION ControlInput::SetInput{{{1*/
181void ControlInput::SetInput(Input* in_input){
182
183 delete values; this->values=in_input;
184 this->SaveValue(); //because this is what SpawnResult saves FIXME
185
186}/*}}}*/
187/*FUNCTION ControlInput::SpawnResult{{{1*/
188ElementResult* ControlInput::SpawnResult(int step, double time){
189 return savedvalues->SpawnResult(step,time);
190}/*}}}*/
191/*FUNCTION ControlInput::SpawnTriaInput{{{1*/
192Input* ControlInput::SpawnTriaInput(int* indices){
193 return values->SpawnTriaInput(indices);
194}/*}}}*/
195/*FUNCTION ControlInput::SpawnGradient{{{1*/
196ElementResult* ControlInput::SpawnGradient(int step, double time){
197 _assert_(gradient);
198 return gradient->SpawnResult(step,time);
199}/*}}}*/
200/*FUNCTION ControlInput::GetVectorFromInputs(Vector* vector,int* doflist){{{1*/
201void ControlInput::GetVectorFromInputs(Vector* vector,int* doflist){
202 values->GetVectorFromInputs(vector,doflist);
203}/*}}}*/
204/*FUNCTION ControlInput::GetVectorFromInputs(Vector* vector,int* doflist,const char* data){{{1*/
205void ControlInput::GetVectorFromInputs(Vector* vector,int* doflist,const char* data){
206 if(strcmp(data,"value")==0){
207 _assert_(values);
208 values->GetVectorFromInputs(vector,doflist);
209 }
210 else if (strcmp(data,"lowerbound")==0){
211 _assert_(minvalues);
212 minvalues->GetVectorFromInputs(vector,doflist);
213 }
214 else if (strcmp(data,"upperbound")==0){
215 _assert_(maxvalues);
216 maxvalues->GetVectorFromInputs(vector,doflist);
217 }
218 else if (strcmp(data,"gradient")==0){
219 _assert_(gradient);
220 gradient->GetVectorFromInputs(vector,doflist);
221 }
222 else{
223 _error_("Data %s not supported yet",data);
224 }
225}/*}}}*/
226/*FUNCTION ControlInput::GetInputAverage(double* pvalue){{{1*/
227void ControlInput::GetInputAverage(double* pvalue){
228 values->GetInputAverage(pvalue);
229}/*}}}*/
230/*FUNCTION ControlInput::GetInputValue(bool* pvalue){{{1*/
231void ControlInput::GetInputValue(bool* pvalue){
232 values->GetInputValue(pvalue);
233}/*}}}*/
234/*FUNCTION ControlInput::GetInputValue(int* pvalue){{{1*/
235void ControlInput::GetInputValue(int* pvalue){
236 values->GetInputValue(pvalue);
237}/*}}}*/
238/*FUNCTION ControlInput::GetInputValue(double* pvalue){{{1*/
239void ControlInput::GetInputValue(double* pvalue){
240 values->GetInputValue(pvalue);
241}/*}}}*/
242/*FUNCTION ControlInput::GetInputValue(double* pvalue){{{1*/
243void ControlInput::GetInputValue(double* pvalue,GaussTria* gauss){
244 values->GetInputValue(pvalue,gauss);
245}/*}}}*/
246/*FUNCTION ControlInput::GetInputValue(double* pvalue){{{1*/
247void ControlInput::GetInputValue(double* pvalue,GaussPenta* gauss){
248 values->GetInputValue(pvalue,gauss);
249}/*}}}*/
250/*FUNCTION ControlInput::GetInputDerivativeValue(double* derivativevalues, double* xyz_list, GaussTria* gauss){{{1*/
251void ControlInput::GetInputDerivativeValue(double* derivativevalues, double* xyz_list, GaussTria* gauss){
252 values->GetInputDerivativeValue(derivativevalues,xyz_list,gauss);
253}/*}}}*/
254/*FUNCTION ControlInput::GetInputDerivativeValue(double* derivativevalues, double* xyz_list, GaussPenta* gauss){{{1*/
255void ControlInput::GetInputDerivativeValue(double* derivativevalues, double* xyz_list, GaussPenta* gauss){
256 values->GetInputDerivativeValue(derivativevalues,xyz_list,gauss);
257}/*}}}*/
258/*FUNCTION ControlInput::SaveValue{{{1*/
259void ControlInput::SaveValue(void){
260 if(!values) _error_("Values of %s not found",EnumToStringx(this->enum_type));
261
262 if(savedvalues) delete this->savedvalues;
263 this->savedvalues=(Input*)this->values->copy();
264}/*}}}*/
265/*FUNCTION ControlInput::UpdateValue{{{1*/
266void ControlInput::UpdateValue(double scalar){
267 if(!gradient) _error_("Gradient of %s not found",EnumToStringx(this->enum_type));
268 if(!savedvalues) _error_("Values of %s not found",EnumToStringx(this->enum_type));
269
270 if(values) delete this->values;
271 this->values=(Input*)this->savedvalues->copy();
272 this->values->AXPY(gradient,scalar);
273}/*}}}*/
274/*FUNCTION ControlInput::VerticallyIntegrate{{{1*/
275void ControlInput::VerticallyIntegrate(Input* thickness_input){
276 values->VerticallyIntegrate(thickness_input);
277}/*}}}*/
278/*FUNCTION ControlInput::Configure{{{1*/
279void ControlInput::Configure(Parameters* parameters){
280 /*do nothing: */
281}
282/*}}}*/
Note: See TracBrowser for help on using the repository browser.