Ignore:
Timestamp:
05/03/18 13:31:36 (7 years ago)
Author:
erobo
Message:

CHG: allow for transient ControlInputs

File:
1 edited

Legend:

Unmodified
Added
Removed
  • issm/trunk-jpl/src/c/classes/Inputs/ControlInput.cpp

    r22515 r22739  
    2626        control_id=id;
    2727        enum_type=in_enum_type;
     28        layout_enum = input_layout_enum;
    2829
    2930        _assert_(interp==P1Enum);
     
    4849}
    4950/*}}}*/
     51ControlInput::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/*}}}*/
    5067ControlInput::~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;
    5673}
    5774/*}}}*/
     
    6582        output->enum_type=this->enum_type;
    6683        output->control_id=this->control_id;
     84        output->layout_enum = this->control_id;
    6785
    6886        if(values)      output->values      = xDynamicCast<Input*>(this->values->copy());
     
    7997        _printf_("ControlInput:\n");
    8098        _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");
    81100        _printf_("---values: \n");     if (values)      values->Echo();
    82101        _printf_("---savedvalues: \n");if (savedvalues) savedvalues->Echo();
     
    98117        MARSHALLING(enum_type);
    99118        MARSHALLING(control_id);
     119        MARSHALLING(layout_enum);
    100120
    101121        if (marshall_direction == MARSHALLING_BACKWARD){
     
    115135                                gradient   =new PentaInput();
    116136                                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;
    117144                        default:
    118145                                _error_("Input of Enum " << EnumToStringx(enum_type) << " not supported yet by ControlInput");
     
    146173}/*}}}*/
    147174void 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        }
    148181        /*do nothing: */
    149182}
     
    194227}/*}}}*/
    195228void ControlInput::GetVectorFromInputs(Vector<IssmDouble>* vector,int* doflist,const char* data){/*{{{*/
    196          if(strcmp(data,"value")==0){
     229        if(strcmp(data,"value")==0){
    197230                 _assert_(values);
    198231                 values->GetVectorFromInputs(vector,doflist);
     
    226259        this->savedvalues=xDynamicCast<Input*>(this->values->copy());
    227260}/*}}}*/
    228 void ControlInput::SetGradient(Input* gradient_in){/*{{{*/
     261void ControlInput::SetGradient(Input* gradient_in,int timestep){/*{{{*/
     262if(this->values->ObjectEnum()!=TransientInputEnum)_error_("you are in the wrong place, go home");
    229263
    230264        /*Get enum for current gradient*/
     
    243277        }
    244278
     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}/*}}}*/
     298void 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
    245315        /*Delete old gradient and assign new gradient*/
    246316        if(gradient) delete gradient;
     
    250320void ControlInput::SetInput(Input* in_input){/*{{{*/
    251321
     322        if(layout_enum==TransientInputEnum)_error_("need two arguments in SetInput for TransientInput Controls");
    252323        delete values; this->values=in_input;
    253324        this->SaveValue(); //because this is what SpawnResult saves FIXME
     325
     326}/*}}}*/
     327void 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();
    254345
    255346}/*}}}*/
Note: See TracChangeset for help on using the changeset viewer.