source: issm/trunk-jpl/src/c/classes/objects/Inputs/ControlInput.cpp@ 14917

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

CHG: got rid of the include/include.h headere file, finally :)

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