Changeset 8601


Ignore:
Timestamp:
06/10/11 13:44:02 (14 years ago)
Author:
Mathieu Morlighem
Message:

now, multiple responses is 'almost' feasable

Location:
issm/trunk/src/c
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • issm/trunk/src/c/modules/ModelProcessorx/Control/CreateParametersControl.cpp

    r8330 r8601  
    2323        if(iomodel->control_analysis){
    2424
    25                 /*How many controls?*/
     25                /*How many controls and how many responses?*/
    2626                parameters->AddObject(new IntParam(NumControlsEnum,iomodel->num_control_type));
     27                parameters->AddObject(new IntParam(NumResponsesEnum,iomodel->num_cm_responses));
    2728
    2829                /*What control type?*/
     
    5253                IoModelFetchData(&iomodel->maxiter,NULL,NULL,iomodel_handle,"maxiter");
    5354
    54                 parameters->AddObject(new DoubleVecParam(CmResponsesEnum,iomodel->cm_responses,iomodel->nsteps));
     55                parameters->AddObject(new DoubleMatParam(OptScalEnum,iomodel->optscal,iomodel->nsteps,iomodel->num_control_type));
     56                parameters->AddObject(new DoubleMatParam(CmResponsesEnum,iomodel->cm_responses,iomodel->nsteps,iomodel->num_cm_responses));
    5557                parameters->AddObject(new DoubleVecParam(CmJumpEnum,iomodel->cm_jump,iomodel->nsteps));
    56                 parameters->AddObject(new DoubleMatParam(OptScalEnum,iomodel->optscal,iomodel->nsteps,iomodel->num_control_type));
    5758                parameters->AddObject(new DoubleVecParam(MaxIterEnum,iomodel->maxiter,iomodel->nsteps));
    5859
  • issm/trunk/src/c/objects/Elements/Penta.cpp

    r8592 r8601  
    62956295                                name==VzObsEnum ||
    62966296                                name==TemperatureEnum ||
    6297                                 name==CmResponseEnum ||
    62986297                                name==DragCoefficientEnum ||
    62996298                                name==GradientEnum ||
  • issm/trunk/src/c/objects/Elements/Tria.cpp

    r8596 r8601  
    16501650
    16511651        /*Intermediaries */
    1652         int        i,ig,response;
     1652        int        i,ig;
     1653        int       *responses=NULL;
     1654        int        response;
    16531655        double     Jdet;
    16541656        double     obs_velocity_mag,velocity_mag;
     
    16671669        this->parameters->FindParam(&meanvel,MeanVelEnum);
    16681670        this->parameters->FindParam(&epsvel,EpsVelEnum);
     1671        this->parameters->FindParam(&responses,NULL,NULL,StepResponsesEnum); response=responses[0];
    16691672        Input* weights_input=inputs->GetInput(WeightsEnum);   _assert_(weights_input);
    16701673        Input* vx_input     =inputs->GetInput(VxEnum);        _assert_(vx_input);
     
    16731676        Input* vyobs_input  =inputs->GetInput(VyObsEnum);     _assert_(vyobs_input);
    16741677
    1675         inputs->GetParameterValue(&response,CmResponseEnum);
    16761678        if(response==SurfaceAverageVelMisfitEnum) inputs->GetParameterValue(&S,SurfaceAreaEnum);
    16771679
     
    17961798        /*Clean up and return*/
    17971799        delete gauss;
     1800        xfree((void**)&responses);
    17981801        return pe;
    17991802}
     
    18031806
    18041807        /*Intermediaries */
    1805         int        i,ig,response;
     1808        int        i,ig;
     1809        int       *responses=NULL;
     1810        int        response;
    18061811        double     Jdet;
    18071812        double     obs_velocity_mag,velocity_mag;
     
    18201825        this->parameters->FindParam(&meanvel,MeanVelEnum);
    18211826        this->parameters->FindParam(&epsvel,EpsVelEnum);
     1827        this->parameters->FindParam(&responses,NULL,NULL,StepResponsesEnum); response=responses[0];
    18221828        Input* weights_input=inputs->GetInput(WeightsEnum);   _assert_(weights_input);
    18231829        Input* vx_input     =inputs->GetInput(VxEnum);        _assert_(vx_input);
     
    18261832        Input* vyobs_input  =inputs->GetInput(VyObsEnum);     _assert_(vyobs_input);
    18271833
    1828         inputs->GetParameterValue(&response,CmResponseEnum);
    18291834        if(response==SurfaceAverageVelMisfitEnum) inputs->GetParameterValue(&S,SurfaceAreaEnum);
    18301835
     
    19491954        /*Clean up and return*/
    19501955        delete gauss;
     1956        xfree((void**)&responses);
    19511957        return pe;
    19521958}
     
    41034109                                name==VxObsEnum ||
    41044110                                name==VyObsEnum ||
    4105                                 name==CmResponseEnum ||
    41064111                                name==DragCoefficientEnum ||
    41074112                                name==GradientEnum ||
  • issm/trunk/src/c/objects/OptArgs.h

    r4540 r8601  
    99
    1010#include "mex.h"
    11 
    1211struct OptArgs{
    13 
    1412        char* function_name;
    1513        mxArray* femmodel;
    16         mxArray* n;
     14};
    1715
    18 };
    1916#else
     17
    2018class Model;
    2119struct OptArgs{
    2220        FemModel* femmodel;
    23         int n;
    2421};
    2522#endif
  • issm/trunk/src/c/objects/objects.h

    r8592 r8601  
    125125#include "./Params/IntParam.h"
    126126#include "./Params/IntVecParam.h"
     127#include "./Params/IntMatParam.h"
    127128#include "./Params/FileParam.h"
    128129#include "./Params/Param.h"
  • issm/trunk/src/c/shared/Numerics/OptFunc.cpp

    r6412 r8601  
    2020        double J;
    2121
    22         mxArray*   inputs[3];
     22        mxArray*   inputs[2];
    2323        mxArray*   psearch_scalar=NULL;
    2424        mxArray*   mxJ=NULL;
     
    2727        inputs[0]=psearch_scalar;
    2828        inputs[1]=optargs->femmodel;
    29         inputs[2]=optargs->n;
    3029
    31         mexCallMATLAB( 1, &mxJ, 3, (mxArray**)inputs, optargs->function_name);
     30        mexCallMATLAB(1,&mxJ,2,(mxArray**)inputs, optargs->function_name);
    3231
    3332        /*extract misfit from mxArray*/
  • issm/trunk/src/c/solutions/control_core.cpp

    r8224 r8601  
    1717       
    1818        /*parameters: */
    19         int     num_controls;
     19        int     num_controls,num_responses;
    2020        int     nsteps;
    2121        double  eps_cm;
     
    2929        int*    control_type = NULL;
    3030        double* responses=NULL;
     31        int*    step_responses=NULL;
    3132        double* maxiter=NULL;
    3233        double* cm_jump=NULL;
    33 
    3434               
    3535        /*intermediary: */
     
    4646
    4747        /*Recover parameters used throughout the solution:{{{1*/
     48        femmodel->parameters->FindParam(&num_controls,NumControlsEnum);
     49        femmodel->parameters->FindParam(&num_responses,NumResponsesEnum);
     50        femmodel->parameters->FindParam(&control_type,NULL,ControlTypeEnum);
     51        femmodel->parameters->FindParam(&responses,NULL,NULL,CmResponsesEnum);
    4852        femmodel->parameters->FindParam(&nsteps,NStepsEnum);
    49         femmodel->parameters->FindParam(&num_controls,NumControlsEnum);
    50         femmodel->parameters->FindParam(&control_type,NULL,ControlTypeEnum);
    51         femmodel->parameters->FindParam(&responses,NULL,CmResponsesEnum);
    5253        femmodel->parameters->FindParam(&maxiter,NULL,MaxIterEnum);
    5354        femmodel->parameters->FindParam(&cm_jump,NULL,CmJumpEnum);
     
    7172        /*Initialize responses: */
    7273        J=(double*)xmalloc(nsteps*sizeof(double));
     74        step_responses=(int*)xmalloc(num_responses*sizeof(double));
    7375               
    7476        /*Initialize some of the BrentSearch arguments: */
     
    8183                /*Display info*/
    8284                _printf_(VerboseControl(),"\n%s%i%s%i\n","   control method step ",n+1,"/",nsteps);
    83                 InputUpdateFromConstantx(femmodel->elements,femmodel->nodes, femmodel->vertices, femmodel->loads, femmodel->materials, femmodel->parameters,(int)responses[n],CmResponseEnum);
     85                for(i=0;i<num_responses;i++) step_responses[i]=(int)responses[n*num_responses+i];
     86                femmodel->parameters->SetParam(step_responses,1,num_responses,StepResponsesEnum);
    8487               
    8588                /*In case we are running a steady state control method, compute new temperature field using new parameter distribution: */
     
    98101
    99102                _printf_(VerboseControl(),"%s\n","   optimizing along gradient direction");
    100                 optargs.n=n; optpars.maxiter=(int)maxiter[n]; optpars.cm_jump=cm_jump[n];
     103                optpars.maxiter=(int)maxiter[n]; optpars.cm_jump=cm_jump[n];
    101104                BrentSearch(&search_scalar,J+n,&optpars,&objectivefunctionC,&optargs);
    102105                //OptimalSearch(&search_scalar,J+n,&optpars,&objectivefunctionC,&optargs);
     
    129132        xfree((void**)&control_type);
    130133        xfree((void**)&responses);
     134        xfree((void**)&step_responses);
    131135        xfree((void**)&maxiter);
    132136        xfree((void**)&cm_jump);
  • issm/trunk/src/c/solutions/objectivefunctionC.cpp

    r8287 r8601  
    2525       
    2626        /*output: */
    27         double J;
     27        double J=0,Jplus;
    2828       
    2929        /*parameters: */
    30         FemModel  *femmodel       = NULL;
    31         int        n;
    32         double    *responses      = NULL;
    33         int        solution_type;
    34         int        analysis_type;
     30        int        num_responses;
     31        int        solution_type,analysis_type;
    3532        bool       isstokes       = false;
    3633        bool       conserve_loads = true;
     34        int       *responses      = NULL;
     35        FemModel  *femmodel       = NULL;
    3736
    3837        /*Recover finite element model: */
     
    4039
    4140        /*Recover parameters: */
    42         n=optargs->n;
    43 
    44         femmodel->parameters->FindParam(&responses,NULL,CmResponsesEnum);
     41        femmodel->parameters->FindParam(&num_responses,NumResponsesEnum);
     42        femmodel->parameters->FindParam(&responses,NULL,NULL,StepResponsesEnum);
    4543        femmodel->parameters->FindParam(&isstokes,IsStokesEnum);
    4644        femmodel->parameters->FindParam(&analysis_type,AnalysisTypeEnum);
     
    7674
    7775        /*Compute misfit for this velocity field.*/
    78         CostFunctionx( &J, femmodel->elements,femmodel->nodes, femmodel->vertices,femmodel->loads, femmodel->materials, femmodel->parameters,(int)responses[n]);
     76        for(int i=0;i<num_responses;i++){
     77                CostFunctionx(&Jplus, femmodel->elements,femmodel->nodes, femmodel->vertices,femmodel->loads, femmodel->materials, femmodel->parameters,responses[i]);
     78                J+=Jplus;
     79        }
    7980
    8081        /*Free ressources:*/
Note: See TracChangeset for help on using the changeset viewer.