Changeset 22739 for issm/trunk-jpl/src/c/classes/Inputs/ControlInput.cpp
- Timestamp:
- 05/03/18 13:31:36 (7 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/classes/Inputs/ControlInput.cpp
r22515 r22739 26 26 control_id=id; 27 27 enum_type=in_enum_type; 28 layout_enum = input_layout_enum; 28 29 29 30 _assert_(interp==P1Enum); … … 48 49 } 49 50 /*}}}*/ 51 ControlInput::ControlInput(int in_enum_type,int input_layout_enum,Input* input_pvalues,Input* input_pmin,Input* input_pmax,Input* input_pgrad,int interp,int id){/*{{{*/ 52 53 this->control_id=id; 54 this->enum_type=in_enum_type; 55 this->layout_enum = input_layout_enum; 56 57 _assert_(interp==P1Enum); 58 if(input_layout_enum!=TransientInputEnum) _error_("Wrong type of layout_enum, needs to be a TransientInputEnum"); 59 60 this->values = input_pvalues; 61 this->savedvalues= NULL; 62 this->minvalues = input_pmin; 63 this->maxvalues = input_pmax; 64 this->gradient = input_pgrad; 65 } 66 /*}}}*/ 50 67 ControlInput::~ControlInput(){/*{{{*/ 51 delete values;52 delete savedvalues;53 delete minvalues;54 delete maxvalues;55 delete gradient;68 if(values) delete values; 69 if(savedvalues) delete savedvalues; 70 if(minvalues) delete minvalues; 71 if(maxvalues) delete maxvalues; 72 if(gradient) delete gradient; 56 73 } 57 74 /*}}}*/ … … 65 82 output->enum_type=this->enum_type; 66 83 output->control_id=this->control_id; 84 output->layout_enum = this->control_id; 67 85 68 86 if(values) output->values = xDynamicCast<Input*>(this->values->copy()); … … 79 97 _printf_("ControlInput:\n"); 80 98 _printf_(setw(15)<<" ControlInput "<<setw(25)<<left<<EnumToStringx(this->enum_type)<<"\n"); 99 _printf_(setw(15)<<" ControlInput "<<setw(25)<<left<<EnumToStringx(this->layout_enum)<<"\n"); 81 100 _printf_("---values: \n"); if (values) values->Echo(); 82 101 _printf_("---savedvalues: \n");if (savedvalues) savedvalues->Echo(); … … 98 117 MARSHALLING(enum_type); 99 118 MARSHALLING(control_id); 119 MARSHALLING(layout_enum); 100 120 101 121 if (marshall_direction == MARSHALLING_BACKWARD){ … … 115 135 gradient =new PentaInput(); 116 136 break; 137 case TransientInputEnum: 138 values =new TransientInput(); 139 savedvalues=new TransientInput(); 140 minvalues =new TransientInput(); 141 maxvalues =new TransientInput(); 142 gradient =new TransientInput(); 143 break; 117 144 default: 118 145 _error_("Input of Enum " << EnumToStringx(enum_type) << " not supported yet by ControlInput"); … … 146 173 }/*}}}*/ 147 174 void ControlInput::Configure(Parameters* parameters){/*{{{*/ 175 if(this->values->ObjectEnum()==TransientInputEnum){ 176 this->values->Configure(parameters); 177 this->minvalues->Configure(parameters); 178 this->maxvalues->Configure(parameters); 179 this->gradient->Configure(parameters); 180 } 148 181 /*do nothing: */ 149 182 } … … 194 227 }/*}}}*/ 195 228 void ControlInput::GetVectorFromInputs(Vector<IssmDouble>* vector,int* doflist,const char* data){/*{{{*/ 196 229 if(strcmp(data,"value")==0){ 197 230 _assert_(values); 198 231 values->GetVectorFromInputs(vector,doflist); … … 226 259 this->savedvalues=xDynamicCast<Input*>(this->values->copy()); 227 260 }/*}}}*/ 228 void ControlInput::SetGradient(Input* gradient_in){/*{{{*/ 261 void ControlInput::SetGradient(Input* gradient_in,int timestep){/*{{{*/ 262 if(this->values->ObjectEnum()!=TransientInputEnum)_error_("you are in the wrong place, go home"); 229 263 230 264 /*Get enum for current gradient*/ … … 243 277 } 244 278 279 TransientInput* transient_input = xDynamicCast<TransientInput*>(this->gradient); 280 TransientInput* values_input = xDynamicCast<TransientInput*>(this->values); 281 if(values_input->numtimesteps==transient_input->numtimesteps){ 282 TransientInput* new_trans_input = new TransientInput(ControlInputGradEnum); 283 IssmDouble time = transient_input->GetTimeByOffset(timestep); 284 for(int i=0;i<transient_input->numtimesteps;i++){ 285 if(transient_input->timesteps[i]==time) new_trans_input->AddTimeInput(xDynamicCast<TriaInput*>(gradient_in),time); 286 else { 287 Input* input = transient_input->GetTimeInput(transient_input->timesteps[i]); 288 new_trans_input->AddTimeInput(xDynamicCast<TriaInput*>(input),transient_input->timesteps[i]); 289 } 290 } 291 this->gradient=new_trans_input; 292 } 293 else{ 294 IssmDouble time = values_input->GetTimeByOffset(timestep); 295 transient_input->AddTimeInput(gradient_in,time); 296 } 297 }/*}}}*/ 298 void ControlInput::SetGradient(Input* gradient_in){/*{{{*/ 299 300 /*Get enum for current gradient*/ 301 switch(this->control_id){ 302 case 1: 303 gradient_in->ChangeEnum(Gradient1Enum); 304 break; 305 case 2: 306 gradient_in->ChangeEnum(Gradient2Enum); 307 break; 308 case 3: 309 gradient_in->ChangeEnum(Gradient3Enum); 310 break; 311 default: 312 _error_("more than 3 controls not implemented yet (Gradient " << this->control_id << " was requested). EnumDefinitions.h needs to be updated."); 313 } 314 245 315 /*Delete old gradient and assign new gradient*/ 246 316 if(gradient) delete gradient; … … 250 320 void ControlInput::SetInput(Input* in_input){/*{{{*/ 251 321 322 if(layout_enum==TransientInputEnum)_error_("need two arguments in SetInput for TransientInput Controls"); 252 323 delete values; this->values=in_input; 253 324 this->SaveValue(); //because this is what SpawnResult saves FIXME 325 326 }/*}}}*/ 327 void ControlInput::SetInput(Input* in_input,int timeoffset){/*{{{*/ 328 Input* input = this->values; 329 if(input->ObjectEnum()!=TransientInputEnum)_error_("cannot have timeoffset argument if not TransientInput Control"); 330 TransientInput* transient_input = xDynamicCast<TransientInput*>(input); 331 IssmDouble time = transient_input->GetTimeByOffset(timeoffset); 332 TransientInput* new_trans_input = new TransientInput(ControlInputValuesEnum); 333 for(int i=0;i<transient_input->numtimesteps;i++){ 334 if(transient_input->timesteps[i]==time) new_trans_input->AddTimeInput(xDynamicCast<TriaInput*>(in_input),time); 335 else { 336 input = transient_input->GetTimeInput(transient_input->timesteps[i]); 337 new_trans_input->AddTimeInput(xDynamicCast<TriaInput*>(input),transient_input->timesteps[i]); 338 } 339 } 340 this->values=new_trans_input; 341 342 // this->values->Echo(); 343 //this->values->Echo(); 344 //new_trans_input->Echo(); 254 345 255 346 }/*}}}*/
Note:
See TracChangeset
for help on using the changeset viewer.