Changeset 13314


Ignore:
Timestamp:
09/10/12 23:06:01 (13 years ago)
Author:
utke
Message:

setup for fos_forward

File:
1 edited

Legend:

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

    r13301 r13314  
    1212
    1313void AutodiffDriversx(Elements* elements,Nodes* nodes,Vertices* vertices,Loads* loads,Materials* materials,Parameters* parameters,Results* results){
    14 
    15         int  i                  ,j;
    1614        bool isautodiff       = false;
    17         int  num_dependents;
    18         int  num_independents;
    19         int  numberofvertices;
    20 
    21         /*outputs: */
    22         IssmDouble  *matJ = NULL;
    23         IssmDouble  *axp  = NULL;
    24         double     **J    = NULL;
    25         double      *xp   = NULL;
    26                
    27         /*diverse: */
    28         int configuration_type;
    29         int solveSize;
    30         int edf_n,edf_m;
    31 
    3215        /*AD mode on?: */
    3316        parameters->FindParam(&isautodiff,AutodiffIsautodiffEnum);
    34 
    3517        if(isautodiff){
    36                 #ifdef _HAVE_ADOLC_
    37                 parameters->FindParam(&num_dependents,AutodiffNumDependentsEnum);
    38                 parameters->FindParam(&num_independents,AutodiffNumIndependentsEnum);
    39                 parameters->FindParam(&numberofvertices,MeshNumberofverticesEnum);
    40 
    41                 if(!(num_dependents*num_independents)) return;
    42                
     18                #ifdef _HAVE_ADOLC_
     19                int  num_dependents;
     20                parameters->FindParam(&num_dependents,AutodiffNumDependentsEnum);
     21                int  num_independents;
     22                parameters->FindParam(&num_independents,AutodiffNumIndependentsEnum);
     23                if(!(num_dependents*num_independents)) return;
     24                int  numberofvertices;
     25                parameters->FindParam(&numberofvertices,MeshNumberofverticesEnum);
    4326                /*retrieve state variable: */
     27                IssmDouble  *axp  = NULL;
    4428                parameters->FindParam(&axp,&num_independents,AutodiffXpEnum);
    45 
    46                 /*allocate driver results: */
    47                 J=xNew<double*>(num_independents);
    48                 xp=xNew<double>(num_independents);
    49 
    50                 for(i=0;i<num_independents;i++){
    51                         J[i]=xNew<double>(num_dependents);
     29                /* driver argument */
     30                double *xp=xNew<double>(num_independents);
     31                for(int i=0;i<num_independents;i++){
    5232                        xp[i]=reCast<double,IssmDouble>(axp[i]);
    5333                }
    54 
    5534                /* get the dimension for the solverx arguments*/
     35                int configuration_type;
    5636                parameters->FindParam(&configuration_type,ConfigurationTypeEnum);
    57                 solveSize=nodes->NumberOfDofs(configuration_type,FsetEnum);
    58                 edf_n=solveSize*(solveSize+1), edf_m=solveSize;
     37                int solveSize=nodes->NumberOfDofs(configuration_type,FsetEnum);
     38                int edf_n=solveSize*(solveSize+1), edf_m=solveSize;
    5939
    6040                /*get the EDF pointer:*/
     
    6242               
    6343                /*set the forward method function pointers: */
     44                anEDF_for_solverx_p->zos_forward=EDF_for_solverx;
    6445                anEDF_for_solverx_p->fos_forward=EDF_fos_forward_for_solverx;
    6546                anEDF_for_solverx_p->fov_forward=EDF_fov_forward_for_solverx;
    66 
     47                anEDF_for_solverx_p->fos_reverse=EDF_fos_reverse_for_solverx;
     48                // anEDF_for_solverx_p->fov_reverse=EDF_fov_reverse_for_solverx;
    6749                /*allocate the space for the parameters to invoke the forward methods:*/
    6850                anEDF_for_solverx_p->dp_x=xNew<double>(edf_n);
     
    7254                anEDF_for_solverx_p->dp_Y=xNew<double>(edf_m);
    7355                anEDF_for_solverx_p->dpp_Y=xNew<double>(edf_m, num_independents);
     56                anEDF_for_solverx_p->dp_U=xNew<double>(edf_m);
     57                anEDF_for_solverx_p->dpp_U=xNew<double>(num_dependents,edf_m);
     58                anEDF_for_solverx_p->dp_Z=xNew<double>(edf_n);
     59                anEDF_for_solverx_p->dpp_Z=xNew<double>(num_dependents,edf_n);
     60                /* Call AD driver:*/
     61                // single direction:
     62                double *tangentDir=xNewZeroInit<double>(num_independents);
     63                unsigned int anIndepNum=55; // <---------- make this selectable via config
     64                tangentDir[anIndepNum]=1.0;
     65                double *theJacVecProduct=xNew<double>(num_dependents);
     66                double *theOutput=xNew<double>(num_dependents);
     67                if (fos_forward(1,num_dependents,num_independents, 0, xp, tangentDir, theOutput, theJacVecProduct ))
     68                  _error_("fos_forward returned non-zero error code");
     69                IssmDouble *theJacVecProductA=xNew<IssmDouble>(num_dependents);
     70                for (int i=0;i<num_dependents;++i)
     71                  theJacVecProductA[i]=theJacVecProduct[i];
     72                results->AddObject(new DoubleVecExternalResult(results->Size()+1,AutodiffJacobianEnum,theJacVecProductA,num_dependents,1,0.0));
    7473
    75                 /* Call AD driver:*/
     74#if 0
     75                double **J=xNew<double>(num_dependents,num_independents);
    7676                jacobian(1,num_dependents,num_independents,xp,J);
     77                IssmDouble *matJ=xNew<IssmDouble>(num_dependents*num_independents);
     78                for (int i=0;i<num_dependents*num_independents;++i)
     79                  matJ[i]=J[i];
     80                results->AddObject(new DoubleMatExternalResult(results->Size()+1,AutodiffJacobianEnum,matJ,num_independents,num_dependents,1,0.0));
     81                xDelete(matJ);
     82                xDelete(J);
     83#endif
    7784
    78                 /* delete the allocated space for the parameters:*/
    79                 xDelete(anEDF_for_solverx_p->dp_x);
    80                 xDelete(anEDF_for_solverx_p->dp_X);
    81                 xDelete(anEDF_for_solverx_p->dpp_X,edf_n);
    82                 xDelete(anEDF_for_solverx_p->dp_y);
    83                 xDelete(anEDF_for_solverx_p->dp_Y);
    84                 xDelete(anEDF_for_solverx_p->dpp_Y,edf_m);
    85                
    86                 /*Add jacobian matrix to results: */
    87                 matJ=xNew<IssmDouble>(num_dependents*num_independents);
    88                 for (i=0;i<num_independents;++i){
    89                         double* rowi=J[i];
    90                         for (j=0;j<num_dependents;++j){
    91                                 *(matJ+num_dependents*i+j)=rowi[j];
    92                         }
    93                 }
    94                 results->AddObject(new DoubleMatExternalResult(results->Size()+1,AutodiffJacobianEnum,matJ,num_independents,num_dependents,1,0.0));
    95 
     85                /* delete the allocated space for the parameters:*/
     86                xDelete(anEDF_for_solverx_p->dp_x);
     87                xDelete(anEDF_for_solverx_p->dp_X);
     88                xDelete(anEDF_for_solverx_p->dpp_X);
     89                xDelete(anEDF_for_solverx_p->dp_y);
     90                xDelete(anEDF_for_solverx_p->dp_Y);
     91                xDelete(anEDF_for_solverx_p->dpp_Y);
     92                xDelete(anEDF_for_solverx_p->dp_U);
     93                xDelete(anEDF_for_solverx_p->dpp_U);
     94                xDelete(anEDF_for_solverx_p->dp_Z);
     95                xDelete(anEDF_for_solverx_p->dpp_Z);
    9696                /*Free ressources: */
    97                 xDelete<double*>(J);
    98                 xDelete<double>(xp);
    99                 xDelete<IssmDouble>(matJ);
    100                 xDelete<IssmDouble>(axp);
     97                xDelete(xp);
     98                xDelete(axp); // did we allocate this?
    10199                #else
    102100                _error_("Should not be requesting AD drivers when an AD library is not available!");
Note: See TracChangeset for help on using the changeset viewer.