Ignore:
Timestamp:
09/24/12 22:26:49 (12 years ago)
Author:
Eric.Larour
Message:

CHG: new way of handling independent and dependent objects. We create a dataset for
each of these objects, so that we do not confuse num_dependents and num_dependent_objects,
same thing for indepedndents. Makes handling of Autodiff drivers easier too.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • issm/trunk-jpl/src/c/modules/ModelProcessorx/Autodiff/CreateParametersAutodiff.cpp

    r13283 r13432  
    1414void CreateParametersAutodiff(Parameters** pparameters,IoModel* iomodel,int solution_type,int analysis_type){
    1515       
    16         int         i,j;
     16        int         i;
    1717        Parameters *parameters       = NULL;
    1818        bool        autodiff_analysis;
    19         int*        dependents       = NULL;
    20         int         num_dependents;
    21         int*        independents       = NULL;
    22         int         num_independents;
    23         int         numberofvertices;
     19        int         num_dependent_objects;
     20        int         num_dep=0;
     21        int*        names=NULL;
     22        int*        types=NULL;
     23        int         dummy;
     24       
    2425        IssmDouble* xp=NULL;
     26        IssmDouble* xp_backup=NULL;
     27        int         num_ind,local_num_ind;
     28        DataSet*    dependent_objects=NULL;
    2529       
    2630        /*Get parameters: */
     
    3236        if(autodiff_analysis){
    3337
    34                 iomodel->Constant(&num_independents,AutodiffNumIndependentsEnum);
    35                 iomodel->Constant(&num_dependents,AutodiffNumDependentsEnum);
    36                 iomodel->Constant(&numberofvertices,MeshNumberofverticesEnum);
     38                /*retrieve driver: */
     39                parameters->AddObject(iomodel->CopyConstantObject(AutodiffDriverEnum));
     40                parameters->AddObject(iomodel->CopyConstantObject(AutodiffFosForwardIndexEnum));
    3741
    38                 /*recover dependents: */
    39                 parameters->AddObject(iomodel->CopyConstantObject(AutodiffNumDependentsEnum));
    40                 if(num_dependents){
    41                         iomodel->FetchData(&dependents,NULL,&num_dependents,AutodiffDependentsEnum);
    42                         parameters->AddObject(new IntVecParam(AutodiffDependentsEnum,dependents,num_dependents));
     42                /*Deal with dependents first: {{{*/
     43                iomodel->Constant(&num_dependent_objects,AutodiffNumDependentObjectsEnum);
     44                dependent_objects=new DataSet();
     45                num_dep=0;
     46               
     47                if(num_dependent_objects){
     48                        iomodel->FetchData(&names,&dummy,&dummy,AutodiffDependentObjectNamesEnum);
     49                        iomodel->FetchData(&types,&dummy,&dummy,AutodiffDependentObjectTypesEnum);
     50
     51                        for(i=0;i<num_dependent_objects;i++){
     52                                DependentObject* dep=new DependentObject(names[i],types[i]);
     53                                dependent_objects->AddObject(dep);
     54                                num_dep+=dep->NumDependents();
     55                        }
     56
     57                        /*Free ressources:*/
     58                        xDelete<int>(names);
     59                        xDelete<int>(types);
    4360                }
     61                parameters->AddObject(new DataSetParam(AutodiffDependentObjectsEnum,dependent_objects));
     62                parameters->AddObject(new IntParam(AutodiffNumDependentsEnum,num_dep));
    4463
    45                 /*recover independents: */
    46                 parameters->AddObject(iomodel->CopyConstantObject(AutodiffNumIndependentsEnum));
    47                 if(num_independents){
    48                         iomodel->FetchData(&independents,NULL,&num_independents,AutodiffIndependentsEnum);
    49                         parameters->AddObject(new IntVecParam(AutodiffIndependentsEnum,independents,num_independents));
     64                delete dependent_objects;
     65                /*}}}*/
    5066
    51                         /*Build state vector, value at which we compute our gradients of dependent variables in adolc: the xp vector  */
    52                         xp=xNew<IssmDouble>(num_independents*numberofvertices);
    53                         for(i=0;i<num_independents;i++){
    54                                 IssmDouble* values=iomodel->data[independents[i]];
    55                                 for(j=0;j<numberofvertices;j++){
    56                                         xp[i*numberofvertices+j]=values[j];
    57                                 }
     67                /*Deal with independents: {{{*/
     68
     69                /*Independents have already been recovered in iomodel->DeclareIndependents. Just do some more processing.
     70                 *In particular, figure out num_independents, and create the state vector xp, or size num_independents x 1 :*/
     71                num_ind=0;
     72                for(i=0;i<iomodel->independent_objects->Size();i++){
     73                        IndependentObject* ind=(IndependentObject*)iomodel->independent_objects->GetObjectByOffset(i);
     74                        num_ind+=ind->NumIndependents();
     75                }
     76                if(num_ind){
     77                        xp=xNew<IssmDouble>(num_ind);
     78                        xp_backup=xp;
     79                        for(i=0;i<iomodel->independent_objects->Size();i++){
     80                                IndependentObject* ind=(IndependentObject*)iomodel->independent_objects->GetObjectByOffset(i);
     81                                ind->FillIndependents(iomodel->data,xp);
     82                                local_num_ind=ind->NumIndependents(); xp=xp+local_num_ind;
    5883                        }
    59                         parameters->AddObject(new DoubleVecParam(AutodiffXpEnum,xp,num_independents*numberofvertices));
     84                        xp=xp_backup; parameters->AddObject(new DoubleVecParam(AutodiffXpEnum,xp,num_ind));
    6085                }
     86                parameters->AddObject(new IntParam(AutodiffNumIndependentsEnum,num_ind));
     87
     88                /*Don't forget to copy  iomodel->independent_objects to parameters: */
     89                parameters->AddObject(new DataSetParam(AutodiffIndependentObjectsEnum,iomodel->independent_objects));
     90                /*}}}*/
    6191
    6292                /*Assign output pointer: */
Note: See TracChangeset for help on using the changeset viewer.