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

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

NEW: large change to the code, to adapt to ADOLC requirements.

This change relates to the introduction of template classes and functions for the
Option.h abstract class. This is needed, because we want to make the Matlab
API independent from the libCore objects, which are dependent on the IssmDouble*
ADOLC type (adouble), when the Matlab API is dependent on the IssmPDouble* type (double).

To make them independent, we need to be able to specify at run time Options, Matrix and
Vector objects that hold either IssmDouble or IssmPDouble objects. The only way to do
that is through the use of templated classes for Option.h, Matrix and Vector.

The change gets rid of a lot of useless code (especially in the classes/objects/Options
directory), by introducing template versions of the same code.

The bulk of the changes to src/modules and src/mex modules is to adapt to this
new runtime declaration of templated Matrix, Vector and Option objects.

File size: 9.3 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::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<IssmDouble>* 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) _error_("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 _error_("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<IssmDouble>* vector,int* doflist){{{*/
201void ControlInput::GetVectorFromInputs(Vector<IssmDouble>* vector,int* doflist){
202 values->GetVectorFromInputs(vector,doflist);
203}/*}}}*/
204/*FUNCTION ControlInput::GetVectorFromInputs(Vector<IssmDouble>* vector,int* doflist,const char* data){{{*/
205void ControlInput::GetVectorFromInputs(Vector<IssmDouble>* 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 " << 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) _error_("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) _error_("Gradient of " << EnumToStringx(this->enum_type) << " not found");
268 if(!savedvalues) _error_("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.