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