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

Last change on this file since 13055 was 13055, checked in by glperez, 13 years ago

BUG: Reverted back. Chaco module not compiling...

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#include "../../../include/include.h"
18
19/*ControlInput constructors and destructor*/
20/*FUNCTION ControlInput::ControlInput(){{{*/
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,IssmDouble* pvalues,IssmDouble* pmin,IssmDouble* pmax,int id){{{*/
31ControlInput::ControlInput(int in_enum_type,int enum_input,IssmDouble* pvalues,IssmDouble* pmin,IssmDouble* 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 _error2_("Input of Enum " << EnumToStringx(enum_input) << " not supported yet by ControlInput");
51 }
52 gradient =NULL;
53}
54/*}}}*/
55/*FUNCTION ControlInput::~ControlInput(){{{*/
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 {{{*/
67void ControlInput::Echo(void){
68 this->DeepEcho();
69}
70/*}}}*/
71/*FUNCTION ControlInput::DeepEcho{{{*/
72void ControlInput::DeepEcho(void){
73
74 _printLine_("ControlInput:");
75 _printLine_(" enum: " << this->enum_type << " (" << EnumToStringx(this->enum_type) << ")");
76 _printLine_("---values: "); if (values) values->Echo();
77 _printLine_("---savedvalues: ");if (savedvalues) savedvalues->Echo();
78 _printLine_("---minvalues: "); if (minvalues) minvalues->Echo();
79 _printLine_("---maxvalues: "); if (maxvalues) maxvalues->Echo();
80 _printLine_("---gradient: "); if (gradient) gradient->Echo();
81}
82/*}}}*/
83/*FUNCTION ControlInput::Id{{{*/
84int ControlInput::Id(void){ return -1; }
85/*}}}*/
86/*FUNCTION ControlInput::MyRank{{{*/
87int ControlInput::MyRank(void){
88 extern int my_rank;
89 return my_rank;
90}
91/*}}}*/
92/*FUNCTION ControlInput::ObjectEnum{{{*/
93int ControlInput::ObjectEnum(void){
94
95 return ControlInputEnum;
96
97}
98/*}}}*/
99/*FUNCTION ControlInput::copy{{{*/
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{{{*/
120int ControlInput::InstanceEnum(void){
121
122 return this->enum_type;
123
124}
125/*}}}*/
126
127/*Object functions*/
128/*FUNCTION ControlInput::Constrain(){{{*/
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(IssmDouble min, IssmDouble max){{{*/
139void ControlInput::Constrain(IssmDouble min, IssmDouble max){
140 values->Constrain(min,max);
141}/*}}}*/
142/*FUNCTION ControlInput::Extrude{{{*/
143void ControlInput::Extrude(void){
144 values->Extrude();
145 savedvalues->Extrude();
146 //gradient->Extrude();
147}/*}}}*/
148/*FUNCTION ControlInput::GetGradient{{{*/
149void ControlInput::GetGradient(Vector* gradient_vec,int* doflist){
150 if(gradient) gradient->GetVectorFromInputs(gradient_vec,doflist);
151}/*}}}*/
152/*FUNCTION ControlInput::ScaleGradient{{{*/
153void ControlInput::ScaleGradient(IssmDouble scaling_factor){
154 if(!gradient) _error2_("Gradient of ControlInput " << EnumToStringx(enum_type) << " not found");
155 gradient->Scale(scaling_factor);
156}/*}}}*/
157/*FUNCTION ControlInput::SetGradient{{{*/
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 _error2_("more than 3 controls not implemented yet (Gradient " << this->control_id << " was requested). EnumDefinitions.h needs to be updated.");
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{{{*/
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{{{*/
188ElementResult* ControlInput::SpawnResult(int step, IssmDouble time){
189 return savedvalues->SpawnResult(step,time);
190}/*}}}*/
191/*FUNCTION ControlInput::SpawnTriaInput{{{*/
192Input* ControlInput::SpawnTriaInput(int* indices){
193 return values->SpawnTriaInput(indices);
194}/*}}}*/
195/*FUNCTION ControlInput::SpawnGradient{{{*/
196ElementResult* ControlInput::SpawnGradient(int step, IssmDouble time){
197 _assert_(gradient);
198 return gradient->SpawnResult(step,time);
199}/*}}}*/
200/*FUNCTION ControlInput::GetVectorFromInputs(Vector* vector,int* doflist){{{*/
201void ControlInput::GetVectorFromInputs(Vector* vector,int* doflist){
202 values->GetVectorFromInputs(vector,doflist);
203}/*}}}*/
204/*FUNCTION ControlInput::GetVectorFromInputs(Vector* vector,int* doflist,const char* data){{{*/
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 _error2_("Data " << data << " not supported yet");
224 }
225}/*}}}*/
226/*FUNCTION ControlInput::GetInputAverage(IssmDouble* pvalue){{{*/
227void ControlInput::GetInputAverage(IssmDouble* pvalue){
228 values->GetInputAverage(pvalue);
229}/*}}}*/
230/*FUNCTION ControlInput::GetInputValue(bool* pvalue){{{*/
231void ControlInput::GetInputValue(bool* pvalue){
232 values->GetInputValue(pvalue);
233}/*}}}*/
234/*FUNCTION ControlInput::GetInputValue(int* pvalue){{{*/
235void ControlInput::GetInputValue(int* pvalue){
236 values->GetInputValue(pvalue);
237}/*}}}*/
238/*FUNCTION ControlInput::GetInputValue(IssmDouble* pvalue){{{*/
239void ControlInput::GetInputValue(IssmDouble* pvalue){
240 values->GetInputValue(pvalue);
241}/*}}}*/
242/*FUNCTION ControlInput::GetInputValue(IssmDouble* pvalue){{{*/
243void ControlInput::GetInputValue(IssmDouble* pvalue,GaussTria* gauss){
244 values->GetInputValue(pvalue,gauss);
245}/*}}}*/
246/*FUNCTION ControlInput::GetInputValue(IssmDouble* pvalue){{{*/
247void ControlInput::GetInputValue(IssmDouble* pvalue,GaussPenta* gauss){
248 values->GetInputValue(pvalue,gauss);
249}/*}}}*/
250/*FUNCTION ControlInput::GetInputDerivativeValue(IssmDouble* derivativevalues, IssmDouble* xyz_list, GaussTria* gauss){{{*/
251void ControlInput::GetInputDerivativeValue(IssmDouble* derivativevalues, IssmDouble* xyz_list, GaussTria* gauss){
252 values->GetInputDerivativeValue(derivativevalues,xyz_list,gauss);
253}/*}}}*/
254/*FUNCTION ControlInput::GetInputDerivativeValue(IssmDouble* derivativevalues, IssmDouble* xyz_list, GaussPenta* gauss){{{*/
255void ControlInput::GetInputDerivativeValue(IssmDouble* derivativevalues, IssmDouble* xyz_list, GaussPenta* gauss){
256 values->GetInputDerivativeValue(derivativevalues,xyz_list,gauss);
257}/*}}}*/
258/*FUNCTION ControlInput::SaveValue{{{*/
259void ControlInput::SaveValue(void){
260 if(!values) _error2_("Values of " << EnumToStringx(this->enum_type) << " not found");
261
262 if(savedvalues) delete this->savedvalues;
263 this->savedvalues=(Input*)this->values->copy();
264}/*}}}*/
265/*FUNCTION ControlInput::UpdateValue{{{*/
266void ControlInput::UpdateValue(IssmDouble scalar){
267 if(!gradient) _error2_("Gradient of " << EnumToStringx(this->enum_type) << " not found");
268 if(!savedvalues) _error2_("Values of " << EnumToStringx(this->enum_type) << " not found");
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{{{*/
275void ControlInput::VerticallyIntegrate(Input* thickness_input){
276 values->VerticallyIntegrate(thickness_input);
277}/*}}}*/
278/*FUNCTION ControlInput::Configure{{{*/
279void ControlInput::Configure(Parameters* parameters){
280 /*do nothing: */
281}
282/*}}}*/
Note: See TracBrowser for help on using the repository browser.