Changeset 13314
- Timestamp:
- 09/10/12 23:06:01 (13 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/modules/AutodiffDriversx/AutodiffDriversx.cpp
r13301 r13314 12 12 13 13 void AutodiffDriversx(Elements* elements,Nodes* nodes,Vertices* vertices,Loads* loads,Materials* materials,Parameters* parameters,Results* results){ 14 15 int i ,j;16 14 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 32 15 /*AD mode on?: */ 33 16 parameters->FindParam(&isautodiff,AutodiffIsautodiffEnum); 34 35 17 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); 43 26 /*retrieve state variable: */ 27 IssmDouble *axp = NULL; 44 28 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++){ 52 32 xp[i]=reCast<double,IssmDouble>(axp[i]); 53 33 } 54 55 34 /* get the dimension for the solverx arguments*/ 35 int configuration_type; 56 36 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; 59 39 60 40 /*get the EDF pointer:*/ … … 62 42 63 43 /*set the forward method function pointers: */ 44 anEDF_for_solverx_p->zos_forward=EDF_for_solverx; 64 45 anEDF_for_solverx_p->fos_forward=EDF_fos_forward_for_solverx; 65 46 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; 67 49 /*allocate the space for the parameters to invoke the forward methods:*/ 68 50 anEDF_for_solverx_p->dp_x=xNew<double>(edf_n); … … 72 54 anEDF_for_solverx_p->dp_Y=xNew<double>(edf_m); 73 55 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)); 74 73 75 /* Call AD driver:*/ 74 #if 0 75 double **J=xNew<double>(num_dependents,num_independents); 76 76 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 77 84 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); 96 96 /*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? 101 99 #else 102 100 _error_("Should not be requesting AD drivers when an AD library is not available!");
Note:
See TracChangeset
for help on using the changeset viewer.