Changeset 13507
- Timestamp:
- 10/02/12 15:43:10 (12 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/modules/AutodiffDriversx/AutodiffDriversx.cpp
r13499 r13507 56 56 parameters->FindParam(&driver,AutodiffDriverEnum); 57 57 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 58 62 if (strcmp(driver,"fos_forward")==0){ 59 63 … … 66 70 parameters->FindParam(&anIndepIndex,AutodiffFosForwardIndexEnum); 67 71 72 if (anIndepIndex<0 || anIndepIndex>=num_independents) _error_("index value for AutodiffFosForwardIndexEnum should be in [0,num_independents-1]"); 73 68 74 tangentDir=xNewZeroInit<double>(num_independents); 69 75 tangentDir[anIndepIndex]=1.0; … … 72 78 theOutput=xNew<double>(num_dependents); 73 79 74 /*set the forward method function pointers: */ 75 anEDF_for_solverx_p->zos_forward=EDF_for_solverx; 80 /*set the forward method function pointer: */ 76 81 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:*/ 81 84 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);84 85 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);92 86 93 87 /*call driver: */ … … 97 91 results->AddObject(new GenericExternalResult<IssmPDouble*>(results->Size()+1,AutodiffJacobianEnum,jacTimesTangentDir,num_dependents,1,1,0.0)); 98 92 99 /*free res sources :*/93 /*free resources :*/ 100 94 xDelete(theOutput); 101 95 xDelete(jacTimesTangentDir); 102 96 xDelete(tangentDir); 103 97 } 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)){ 105 99 106 100 int* indepIndices=NULL; … … 114 108 115 109 /*retrieve directions:*/ 116 if (strcmp(driver," jacobian")==0){110 if (strcmp(driver,"fov_forward_all")==0){ 117 111 tangentDirNum=num_independents; 118 112 indepIndices=xNewZeroInit<int>(tangentDirNum); … … 130 124 131 125 /*set the forward method function pointers: */ 132 anEDF_for_solverx_p->zos_forward=EDF_for_solverx;133 126 anEDF_for_solverx_p->fov_forward=EDF_fov_forward_for_solverx; 134 127 // anEDF_for_solverx_p->fov_reverse=EDF_fov_reverse_for_solverx; 135 128 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:*/ 139 130 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);142 131 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);149 132 150 133 /*seed matrix: */ … … 170 153 171 154 /*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: */ 180 157 xDelete(theOutput); 181 158 xDelete(indepIndices); … … 185 162 results->AddObject(new GenericExternalResult<IssmPDouble*>(results->Size()+1,AutodiffJacobianEnum,*jacTimesSeed,num_dependents*tangentDirNum,1,1,0.0)); 186 163 187 /*Free res sources: */164 /*Free resources: */ 188 165 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!"); 190 206 } 191 207 else _error_("driver: " << driver << " not yet supported!"); … … 203 219 xDelete(anEDF_for_solverx_p->dpp_Z); 204 220 205 /*Free res sources: */221 /*Free resources: */ 206 222 xDelete(xp); 207 223 xDelete(axp);
Note:
See TracChangeset
for help on using the changeset viewer.