Changeset 13432 for issm/trunk-jpl/src/c/modules/ModelProcessorx/Autodiff/CreateParametersAutodiff.cpp
- Timestamp:
- 09/24/12 22:26:49 (12 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/modules/ModelProcessorx/Autodiff/CreateParametersAutodiff.cpp
r13283 r13432 14 14 void CreateParametersAutodiff(Parameters** pparameters,IoModel* iomodel,int solution_type,int analysis_type){ 15 15 16 int i ,j;16 int i; 17 17 Parameters *parameters = NULL; 18 18 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 24 25 IssmDouble* xp=NULL; 26 IssmDouble* xp_backup=NULL; 27 int num_ind,local_num_ind; 28 DataSet* dependent_objects=NULL; 25 29 26 30 /*Get parameters: */ … … 32 36 if(autodiff_analysis){ 33 37 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)); 37 41 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); 43 60 } 61 parameters->AddObject(new DataSetParam(AutodiffDependentObjectsEnum,dependent_objects)); 62 parameters->AddObject(new IntParam(AutodiffNumDependentsEnum,num_dep)); 44 63 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 /*}}}*/ 50 66 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; 58 83 } 59 parameters->AddObject(new DoubleVecParam(AutodiffXpEnum,xp,num_independents*numberofvertices));84 xp=xp_backup; parameters->AddObject(new DoubleVecParam(AutodiffXpEnum,xp,num_ind)); 60 85 } 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 /*}}}*/ 61 91 62 92 /*Assign output pointer: */
Note:
See TracChangeset
for help on using the changeset viewer.