Changeset 13507


Ignore:
Timestamp:
10/02/12 15:43:10 (12 years ago)
Author:
utke
Message:

CHG factored out EDF allocations, changed driver names, added fos_reverse case, fov_reverse doesn't do anything yet

File:
1 edited

Legend:

Unmodified
Added
Removed
  • issm/trunk-jpl/src/c/modules/AutodiffDriversx/AutodiffDriversx.cpp

    r13499 r13507  
    5656                        parameters->FindParam(&driver,AutodiffDriverEnum);
    5757
     58                        /* these are always needed regardless of the interpreter */
     59                        anEDF_for_solverx_p->dp_x=xNew<double>(anEDF_for_solverx_p->max_n);
     60                        anEDF_for_solverx_p->dp_y=xNew<double>(anEDF_for_solverx_p->max_m);
     61
    5862                        if (strcmp(driver,"fos_forward")==0){
    5963                               
     
    6670                                parameters->FindParam(&anIndepIndex,AutodiffFosForwardIndexEnum);
    6771                               
     72                                if (anIndepIndex<0 || anIndepIndex>=num_independents) _error_("index value for AutodiffFosForwardIndexEnum should be in [0,num_independents-1]");
     73
    6874                                tangentDir=xNewZeroInit<double>(num_independents);
    6975                                tangentDir[anIndepIndex]=1.0;
     
    7278                                theOutput=xNew<double>(num_dependents);
    7379                               
    74                                 /*set the forward method function pointers: */
    75                                 anEDF_for_solverx_p->zos_forward=EDF_for_solverx;
     80                                /*set the forward method function pointer: */
    7681                                anEDF_for_solverx_p->fos_forward=EDF_fos_forward_for_solverx;
    77                                 anEDF_for_solverx_p->fos_reverse=EDF_fos_reverse_for_solverx;
    78 
    79                                 /*allocate the space for the parameters to invoke the forward methods:*/
    80                                 anEDF_for_solverx_p->dp_x=xNew<double>(anEDF_for_solverx_p->max_n);
     82
     83                                /*allocate the space for the parameters to invoke the EDF fos_forward:*/
    8184                                anEDF_for_solverx_p->dp_X=xNew<double>(anEDF_for_solverx_p->max_n);
    82                                 anEDF_for_solverx_p->dpp_X=xNew<double>(anEDF_for_solverx_p->max_n, 1);
    83                                 anEDF_for_solverx_p->dp_y=xNew<double>(anEDF_for_solverx_p->max_m);
    8485                                anEDF_for_solverx_p->dp_Y=xNew<double>(anEDF_for_solverx_p->max_m);
    85                                 anEDF_for_solverx_p->dpp_Y=xNew<double>(anEDF_for_solverx_p->max_m, 1);
    86 
    87                                 /*allocate the space for the parameters to invoke the reverse methods:*/
    88                                 anEDF_for_solverx_p->dp_U=xNew<double>(anEDF_for_solverx_p->max_m);
    89                                 anEDF_for_solverx_p->dpp_U=xNew<double>(num_dependents,anEDF_for_solverx_p->max_m);
    90                                 anEDF_for_solverx_p->dp_Z=xNew<double>(anEDF_for_solverx_p->max_n);
    91                                 anEDF_for_solverx_p->dpp_Z=xNew<double>(num_dependents,anEDF_for_solverx_p->max_n);
    9286
    9387                                /*call driver: */
     
    9791                                results->AddObject(new GenericExternalResult<IssmPDouble*>(results->Size()+1,AutodiffJacobianEnum,jacTimesTangentDir,num_dependents,1,1,0.0));
    9892                               
    99                                 /*free ressources :*/
     93                                /*free resources :*/
    10094                                xDelete(theOutput);
    10195                                xDelete(jacTimesTangentDir);
    10296                                xDelete(tangentDir);
    10397                        }
    104                         else if ((strcmp(driver,"fov_forward")==0) || (strcmp(driver,"jacobian")==0)){
     98                        else if ((strcmp(driver,"fov_forward")==0) || (strcmp(driver,"fov_forward_all")==0)){
    10599                               
    106100                                int* indepIndices=NULL;
     
    114108                                       
    115109                                /*retrieve directions:*/
    116                                 if (strcmp(driver,"jacobian")==0){
     110                                if (strcmp(driver,"fov_forward_all")==0){
    117111                                        tangentDirNum=num_independents;
    118112                                        indepIndices=xNewZeroInit<int>(tangentDirNum);
     
    130124                               
    131125                                /*set the forward method function pointers: */
    132                                 anEDF_for_solverx_p->zos_forward=EDF_for_solverx;
    133126                                anEDF_for_solverx_p->fov_forward=EDF_fov_forward_for_solverx;
    134127                                // anEDF_for_solverx_p->fov_reverse=EDF_fov_reverse_for_solverx;
    135128
    136                                 /*allocate the space for the parameters to invoke the forward methods:*/
    137                                 anEDF_for_solverx_p->dp_x=xNew<double>(anEDF_for_solverx_p->max_n);
    138                                 anEDF_for_solverx_p->dp_X=xNew<double>(anEDF_for_solverx_p->max_n);
     129                                /*allocate the space for the parameters to invoke EDF fov_forward:*/
    139130                                anEDF_for_solverx_p->dpp_X=xNew<double>(anEDF_for_solverx_p->max_n, tangentDirNum);
    140                                 anEDF_for_solverx_p->dp_y=xNew<double>(anEDF_for_solverx_p->max_m);
    141                                 anEDF_for_solverx_p->dp_Y=xNew<double>(anEDF_for_solverx_p->max_m);
    142131                                anEDF_for_solverx_p->dpp_Y=xNew<double>(anEDF_for_solverx_p->max_m, tangentDirNum);
    143 
    144                                 /*allocate the space for the parameters to invoke the reverse methods:*/
    145                                 anEDF_for_solverx_p->dp_U=xNew<double>(anEDF_for_solverx_p->max_m);
    146                                 anEDF_for_solverx_p->dpp_U=xNew<double>(num_dependents,anEDF_for_solverx_p->max_m);
    147                                 anEDF_for_solverx_p->dp_Z=xNew<double>(anEDF_for_solverx_p->max_n);
    148                                 anEDF_for_solverx_p->dpp_Z=xNew<double>(num_dependents,anEDF_for_solverx_p->max_n);
    149132
    150133                                /*seed matrix: */
     
    170153
    171154                                /*call driver: */
    172                                 if (strcmp(driver,"fov_forward")==0){
    173                                         fov_forward(1,num_dependents,num_independents, tangentDirNum, xp, seed, theOutput, jacTimesSeed );
    174                                 }
    175                                 else{
    176                                         jacobian(1,num_dependents,num_independents,xp,jacTimesSeed);
    177                                 }
    178 
    179                                 /*Free ressources: */
     155                                fov_forward(1,num_dependents,num_independents, tangentDirNum, xp, seed, theOutput, jacTimesSeed );
     156                                /*Free resources: */
    180157                                xDelete(theOutput);
    181158                                xDelete(indepIndices);
     
    185162                                results->AddObject(new GenericExternalResult<IssmPDouble*>(results->Size()+1,AutodiffJacobianEnum,*jacTimesSeed,num_dependents*tangentDirNum,1,1,0.0));
    186163
    187                                 /*Free ressources: */
     164                                /*Free resources: */
    188165                                xDelete(jacTimesSeed);
    189                                 xDelete<int>(indepIndices);
     166                                xDelete(indepIndices);
     167                        }
     168                        else if (strcmp(driver,"fos_reverse")==0) {
     169
     170                                int     aDepIndex=0;
     171                                double *aWeightVector=NULL;
     172                                double *weightVectorTimesJac=NULL;
     173
     174                                /*retrieve direction index: */
     175                                parameters->FindParam(&aDepIndex,AutodiffFosReverseIndexEnum);
     176
     177                                if (aDepIndex<0 || aDepIndex>=num_dependents) _error_("index value for AutodiffFosReverseIndexEnum should be in [0,num_dependents-1]");
     178
     179                                aWeightVector=xNewZeroInit<double>(num_dependents);
     180                                aWeightVector[aDepIndex]=1.0;
     181
     182                                weightVectorTimesJac=xNew<double>(num_independents);
     183
     184                                /*set the forward method function pointer: */
     185                                anEDF_for_solverx_p->fos_reverse=EDF_fos_reverse_for_solverx;
     186
     187                                /*allocate the space for the parameters to invoke the EDF fos_reverse :*/
     188                                anEDF_for_solverx_p->dp_U=xNew<double>(anEDF_for_solverx_p->max_m);
     189                                anEDF_for_solverx_p->dp_Z=xNew<double>(anEDF_for_solverx_p->max_n);
     190
     191                                /*call driver: */
     192                                fos_reverse(1,num_dependents,num_independents, aWeightVector, weightVectorTimesJac );
     193
     194                                /*add to results*/
     195                                results->AddObject(new GenericExternalResult<IssmPDouble*>(results->Size()+1,AutodiffJacobianEnum,weightVectorTimesJac,num_independents,1,1,0.0));
     196
     197                                /*free resources :*/
     198                                xDelete(weightVectorTimesJac);
     199                                xDelete(aWeightVector);
     200                        }
     201                        else if (strcmp(driver,"fov_reverse")==0) {
     202                                /*allocate the space for the parameters to invoke the EDF fos_reverse :*/
     203                                anEDF_for_solverx_p->dpp_U=xNew<double>(num_dependents,anEDF_for_solverx_p->max_m);
     204                                anEDF_for_solverx_p->dpp_Z=xNew<double>(num_dependents,anEDF_for_solverx_p->max_n);
     205                                _error_("driver: " << driver << " not yet supported!");
    190206                        }
    191207                        else _error_("driver: " << driver << " not yet supported!");
     
    203219                        xDelete(anEDF_for_solverx_p->dpp_Z);
    204220
    205                         /*Free ressources: */
     221                        /*Free resources: */
    206222                        xDelete(xp);
    207223                        xDelete(axp);
Note: See TracChangeset for help on using the changeset viewer.