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/Elements/Element.cpp

    r22625 r22739  
    13871387        /*Get number of controls*/
    13881388        int num_controls;
     1389        bool isautodiff;
    13891390        parameters->FindParam(&num_controls,InversionNumControlParametersEnum);
     1391        parameters->FindParam(&isautodiff,AutodiffIsautodiffEnum);
     1392
    13901393
    13911394        /*Get number of vertices*/
    13921395        int numvertices = this->GetNumberOfVertices();
    1393 
     1396        if(isautodiff){
     1397                int* N;
     1398                int* M;
     1399                int start = 0;
     1400                parameters->FindParam(&N,NULL,ControlInputSizeNEnum);
     1401                parameters->FindParam(&M,NULL,ControlInputSizeMEnum);
     1402                if(control_index>0) for(int n=0;n<control_index-1;n++) start+=N[n]*M[n];
     1403
     1404                for(int n=0;n<N[control_index];n++){
     1405                        for(int i=0;i<numvertices;i++){
     1406                                indexing[i+n*numvertices]=this->vertices[i]->Sid() + start + n*M[control_index];
     1407                        }
     1408                }
     1409        }
     1410        else{
     1411                int M;
     1412                parameters->FindParam(&M,ControlInputSizeMEnum);
    13941413        /*get gradient indices*/
    1395         if(onsid){
    1396                 for(int i=0;i<numvertices;i++){
    1397                         indexing[i]=num_controls*this->vertices[i]->Sid() + control_index;
    1398                 }
    1399         }
    1400         else{
    1401                 for(int i=0;i<numvertices;i++){
    1402                         indexing[i]=num_controls*this->vertices[i]->Pid() + control_index;
    1403                 }
    1404         }
    1405 
     1414                if(onsid){
     1415                        for(int i=0;i<numvertices;i++){
     1416                                indexing[i]=this->vertices[i]->Sid() + (control_index)*M;
     1417                        }
     1418                }
     1419                else{
     1420                        for(int i=0;i<numvertices;i++){
     1421                                indexing[i]=this->vertices[i]->Pid() + (control_index)*M;
     1422                        }
     1423                }
     1424        }
    14061425}
    14071426/*}}}*/
     
    16191638
    16201639        /*For now we only support nodal vectors*/
    1621         if(M!=iomodel->numberofvertices) _error_("not supported");
    1622         if(N!=1) _error_("not supported");
     1640        //if(M!=iomodel->numberofvertices) _error_("not supported");
     1641        //if(N!=1) _error_("not supported");
    16231642
    16241643        /*Recover vertices ids needed to initialize inputs*/
     
    16371656                this->AddControlInput(input_enum,values,min_vector,max_vector,P1Enum,id);
    16381657        }
     1658
     1659        else if(M==iomodel->numberofvertices+1){
     1660            /*create transient input: */
     1661            IssmDouble* times = xNew<IssmDouble>(N);
     1662            for(int t=0;t<N;t++) times[t] = vector[(M-1)*N+t];
     1663                                /*Create the three transient inputs for the control input*/
     1664            TransientInput* values_input=new TransientInput(ControlInputValuesEnum,times,N);
     1665                                TransientInput* mins_input = new TransientInput(ControlInputMinsEnum,times,N);
     1666                                TransientInput* maxs_input = new TransientInput(ControlInputMaxsEnum,times,N);
     1667                           TransientInput* grad_input = new TransientInput(ControlInputGradEnum);
     1668                                for(int t=0;t<N;t++){
     1669                for(int i=0;i<numvertices;i++){
     1670                                                values[i]=vector[N*(vertexids[i]-1)+t];
     1671                                                values_min[i] = min_vector[N*(vertexids[i]-1)+t];
     1672                                                values_max[i] = max_vector[N*(vertexids[i]-1)+t];
     1673                                         }
     1674                                        switch(this->ObjectEnum()){
     1675                    case TriaEnum:
     1676                                                                        values_input->AddTimeInput(new TriaInput(ControlInputValuesEnum,values,P1Enum));
     1677                                                                        mins_input->AddTimeInput(new TriaInput(ControlInputMinsEnum,values_min,P1Enum));
     1678                                                                        maxs_input->AddTimeInput(new TriaInput(ControlInputMaxsEnum,values_max,P1Enum));
     1679                                                                break;
     1680                    case PentaEnum:
     1681                                                                printf("-------------- file: Element.cpp line: %i\n",__LINE__);
     1682                                                                        values_input->AddTimeInput(new PentaInput(ControlInputValuesEnum,values,P1Enum));
     1683                                                                        mins_input->AddTimeInput(new PentaInput(ControlInputMinsEnum,values_min,P1Enum));
     1684                                                                        maxs_input->AddTimeInput(new PentaInput(ControlInputMaxsEnum,values_max,P1Enum));
     1685                                                                        break;
     1686                    case TetraEnum:
     1687                                                                        values_input->AddTimeInput(new TetraInput(ControlInputValuesEnum,values,P1Enum));
     1688                                                                        mins_input->AddTimeInput(new TetraInput(ControlInputMinsEnum,values_min,P1Enum));
     1689                                                                        maxs_input->AddTimeInput(new TetraInput(ControlInputMaxsEnum,values_max,P1Enum));
     1690                                                                        break;
     1691                    default: _error_("Not implemented yet");
     1692                }
     1693            }
     1694            this->inputs->AddInput(new ControlInput(input_enum,TransientInputEnum,values_input,mins_input,maxs_input,grad_input,P1Enum,id));
     1695            xDelete<IssmDouble>(times);
     1696        }
     1697                  else _error_("not currently supported type of M and N attempted");
    16391698
    16401699        /*clean up*/
Note: See TracChangeset for help on using the changeset viewer.