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

Last change on this file since 13414 was 13414, checked in by Mathieu Morlighem, 12 years ago

CHG: clean-up removed MyRank which is not used anymore, and removed IssmBool

File size: 9.1 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 _error_("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::ObjectEnum{{{*/
87int ControlInput::ObjectEnum(void){
88
89 return ControlInputEnum;
90
91}
92/*}}}*/
93/*FUNCTION ControlInput::copy{{{*/
94Object* ControlInput::copy() {
95
96 ControlInput* output=NULL;
97
98 output = new ControlInput();
99 output->enum_type=this->enum_type;
100 output->control_id=this->control_id;
101
102 if(values) output->values=(Input*)this->values->copy();
103 if(savedvalues) output->savedvalues=(Input*)this->savedvalues->copy();
104 if(minvalues) output->minvalues=(Input*)this->minvalues->copy();
105 if(maxvalues) output->maxvalues=(Input*)this->maxvalues->copy();
106 if(gradient) output->gradient=(Input*)this->gradient->copy();
107
108 return output;
109}
110/*}}}*/
111
112/*ControlInput management*/
113/*FUNCTION ControlInput::InstanceEnum{{{*/
114int ControlInput::InstanceEnum(void){
115
116 return this->enum_type;
117
118}
119/*}}}*/
120
121/*Object functions*/
122/*FUNCTION ControlInput::Constrain(){{{*/
123void ControlInput::Constrain(void){
124
125 Input* newvalues=NULL;
126
127 newvalues=this->values->PointwiseMin(maxvalues);
128 delete values; this->values=newvalues;
129 newvalues=this->values->PointwiseMax(minvalues);
130 delete values; this->values=newvalues;
131}/*}}}*/
132/*FUNCTION ControlInput::Constrain(IssmDouble min, IssmDouble max){{{*/
133void ControlInput::Constrain(IssmDouble min, IssmDouble max){
134 values->Constrain(min,max);
135}/*}}}*/
136/*FUNCTION ControlInput::Extrude{{{*/
137void ControlInput::Extrude(void){
138 values->Extrude();
139 savedvalues->Extrude();
140 //gradient->Extrude();
141}/*}}}*/
142/*FUNCTION ControlInput::GetGradient{{{*/
143void ControlInput::GetGradient(Vector<IssmDouble>* gradient_vec,int* doflist){
144 if(gradient) gradient->GetVectorFromInputs(gradient_vec,doflist);
145}/*}}}*/
146/*FUNCTION ControlInput::ScaleGradient{{{*/
147void ControlInput::ScaleGradient(IssmDouble scaling_factor){
148 if(!gradient) _error_("Gradient of ControlInput " << EnumToStringx(enum_type) << " not found");
149 gradient->Scale(scaling_factor);
150}/*}}}*/
151/*FUNCTION ControlInput::SetGradient{{{*/
152void ControlInput::SetGradient(Input* gradient_in){
153
154 /*Get enum for current gradient*/
155 switch(this->control_id){
156 case 1:
157 gradient_in->ChangeEnum(Gradient1Enum);
158 break;
159 case 2:
160 gradient_in->ChangeEnum(Gradient2Enum);
161 break;
162 case 3:
163 gradient_in->ChangeEnum(Gradient3Enum);
164 break;
165 default:
166 _error_("more than 3 controls not implemented yet (Gradient " << this->control_id << " was requested). EnumDefinitions.h needs to be updated.");
167 }
168
169 /*Delete old gradient and assign new gradient*/
170 if(gradient) delete gradient;
171 gradient=gradient_in;
172
173}/*}}}*/
174/*FUNCTION ControlInput::SetInput{{{*/
175void ControlInput::SetInput(Input* in_input){
176
177 delete values; this->values=in_input;
178 this->SaveValue(); //because this is what SpawnResult saves FIXME
179
180}/*}}}*/
181/*FUNCTION ControlInput::SpawnResult{{{*/
182ElementResult* ControlInput::SpawnResult(int step, IssmDouble time){
183 return savedvalues->SpawnResult(step,time);
184}/*}}}*/
185/*FUNCTION ControlInput::SpawnTriaInput{{{*/
186Input* ControlInput::SpawnTriaInput(int* indices){
187 return values->SpawnTriaInput(indices);
188}/*}}}*/
189/*FUNCTION ControlInput::SpawnGradient{{{*/
190ElementResult* ControlInput::SpawnGradient(int step, IssmDouble time){
191 _assert_(gradient);
192 return gradient->SpawnResult(step,time);
193}/*}}}*/
194/*FUNCTION ControlInput::GetVectorFromInputs(Vector<IssmDouble>* vector,int* doflist){{{*/
195void ControlInput::GetVectorFromInputs(Vector<IssmDouble>* vector,int* doflist){
196 values->GetVectorFromInputs(vector,doflist);
197}/*}}}*/
198/*FUNCTION ControlInput::GetVectorFromInputs(Vector<IssmDouble>* vector,int* doflist,const char* data){{{*/
199void ControlInput::GetVectorFromInputs(Vector<IssmDouble>* vector,int* doflist,const char* data){
200 if(strcmp(data,"value")==0){
201 _assert_(values);
202 values->GetVectorFromInputs(vector,doflist);
203 }
204 else if (strcmp(data,"lowerbound")==0){
205 _assert_(minvalues);
206 minvalues->GetVectorFromInputs(vector,doflist);
207 }
208 else if (strcmp(data,"upperbound")==0){
209 _assert_(maxvalues);
210 maxvalues->GetVectorFromInputs(vector,doflist);
211 }
212 else if (strcmp(data,"gradient")==0){
213 _assert_(gradient);
214 gradient->GetVectorFromInputs(vector,doflist);
215 }
216 else{
217 _error_("Data " << data << " not supported yet");
218 }
219}/*}}}*/
220/*FUNCTION ControlInput::GetInputAverage(IssmDouble* pvalue){{{*/
221void ControlInput::GetInputAverage(IssmDouble* pvalue){
222 values->GetInputAverage(pvalue);
223}/*}}}*/
224/*FUNCTION ControlInput::GetInputValue(bool* pvalue){{{*/
225void ControlInput::GetInputValue(bool* pvalue){
226 values->GetInputValue(pvalue);
227}/*}}}*/
228/*FUNCTION ControlInput::GetInputValue(int* pvalue){{{*/
229void ControlInput::GetInputValue(int* pvalue){
230 values->GetInputValue(pvalue);
231}/*}}}*/
232/*FUNCTION ControlInput::GetInputValue(IssmDouble* pvalue){{{*/
233void ControlInput::GetInputValue(IssmDouble* pvalue){
234 values->GetInputValue(pvalue);
235}/*}}}*/
236/*FUNCTION ControlInput::GetInputValue(IssmDouble* pvalue){{{*/
237void ControlInput::GetInputValue(IssmDouble* pvalue,GaussTria* gauss){
238 values->GetInputValue(pvalue,gauss);
239}/*}}}*/
240/*FUNCTION ControlInput::GetInputValue(IssmDouble* pvalue){{{*/
241void ControlInput::GetInputValue(IssmDouble* pvalue,GaussPenta* gauss){
242 values->GetInputValue(pvalue,gauss);
243}/*}}}*/
244/*FUNCTION ControlInput::GetInputDerivativeValue(IssmDouble* derivativevalues, IssmDouble* xyz_list, GaussTria* gauss){{{*/
245void ControlInput::GetInputDerivativeValue(IssmDouble* derivativevalues, IssmDouble* xyz_list, GaussTria* gauss){
246 values->GetInputDerivativeValue(derivativevalues,xyz_list,gauss);
247}/*}}}*/
248/*FUNCTION ControlInput::GetInputDerivativeValue(IssmDouble* derivativevalues, IssmDouble* xyz_list, GaussPenta* gauss){{{*/
249void ControlInput::GetInputDerivativeValue(IssmDouble* derivativevalues, IssmDouble* xyz_list, GaussPenta* gauss){
250 values->GetInputDerivativeValue(derivativevalues,xyz_list,gauss);
251}/*}}}*/
252/*FUNCTION ControlInput::SaveValue{{{*/
253void ControlInput::SaveValue(void){
254 if(!values) _error_("Values of " << EnumToStringx(this->enum_type) << " not found");
255
256 if(savedvalues) delete this->savedvalues;
257 this->savedvalues=(Input*)this->values->copy();
258}/*}}}*/
259/*FUNCTION ControlInput::UpdateValue{{{*/
260void ControlInput::UpdateValue(IssmDouble scalar){
261 if(!gradient) _error_("Gradient of " << EnumToStringx(this->enum_type) << " not found");
262 if(!savedvalues) _error_("Values of " << EnumToStringx(this->enum_type) << " not found");
263
264 if(values) delete this->values;
265 this->values=(Input*)this->savedvalues->copy();
266 this->values->AXPY(gradient,scalar);
267}/*}}}*/
268/*FUNCTION ControlInput::VerticallyIntegrate{{{*/
269void ControlInput::VerticallyIntegrate(Input* thickness_input){
270 values->VerticallyIntegrate(thickness_input);
271}/*}}}*/
272/*FUNCTION ControlInput::Configure{{{*/
273void ControlInput::Configure(Parameters* parameters){
274 /*do nothing: */
275}
276/*}}}*/
Note: See TracBrowser for help on using the repository browser.