Changeset 16752
- Timestamp:
- 11/13/13 21:16:11 (11 years ago)
- Location:
- issm/trunk-jpl/src/c/analyses
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/analyses/AdjointHorizAnalysis.cpp
r16751 r16752 30 30 }/*}}}*/ 31 31 void AdjointHorizAnalysis::InputUpdateFromSolution(IssmDouble* solution,Element* element){/*{{{*/ 32 int approximation; 33 element->GetInputValue(&approximation,ApproximationEnum); 34 if(approximation==FSApproximationEnum || approximation==NoneApproximationEnum){ 35 InputUpdateFromSolutionFS(solution,element); 36 } 37 else{ 38 InputUpdateFromSolutionHoriz(solution,element); 39 } 40 }/*}}}*/ 41 void AdjointHorizAnalysis::InputUpdateFromSolutionHoriz(IssmDouble* solution,Element* element){/*{{{*/ 32 42 int i; 33 43 int* doflist=NULL; … … 69 79 xDelete<int>(doflist); 70 80 }/*}}}*/ 81 void AdjointHorizAnalysis::InputUpdateFromSolutionFS(IssmDouble* solution,Element* element){/*{{{*/ 82 int i; 83 int* vdoflist=NULL; 84 int* pdoflist=NULL; 85 IssmDouble FSreconditioning; 86 87 /*Fetch number of nodes and dof for this finite element*/ 88 int vnumnodes = element->GetNumberOfNodesVelocity(); 89 int pnumnodes = element->GetNumberOfNodesPressure(); 90 int vnumdof = vnumnodes*3; 91 int pnumdof = pnumnodes*1; 92 93 /*Initialize values*/ 94 IssmDouble* vvalues = xNew<IssmDouble>(vnumdof); 95 IssmDouble* pvalues = xNew<IssmDouble>(pnumdof); 96 IssmDouble* lambdax = xNew<IssmDouble>(vnumnodes); 97 IssmDouble* lambday = xNew<IssmDouble>(vnumnodes); 98 IssmDouble* lambdaz = xNew<IssmDouble>(vnumnodes); 99 IssmDouble* lambdap = xNew<IssmDouble>(pnumnodes); 100 101 /*Get dof list: */ 102 element->GetDofListVelocity(&vdoflist,GsetEnum); 103 element->GetDofListPressure(&pdoflist,GsetEnum); 104 105 /*Use the dof list to index into the solution vector: */ 106 for(i=0;i<vnumdof;i++) vvalues[i]=solution[vdoflist[i]]; 107 for(i=0;i<pnumdof;i++) pvalues[i]=solution[pdoflist[i]]; 108 109 /*Transform solution in Cartesian Space*/ 110 element->TransformSolutionCoord(&vvalues[0],XYZEnum); 111 112 /*fill in all arrays: */ 113 for(i=0;i<vnumnodes;i++){ 114 lambdax[i] = vvalues[i*NDOF3+0]; if(xIsNan<IssmDouble>(lambdax[i])) _error_("NaN found in solution vector"); 115 lambday[i] = vvalues[i*NDOF3+1]; if(xIsNan<IssmDouble>(lambday[i])) _error_("NaN found in solution vector"); 116 lambdaz[i] = vvalues[i*NDOF3+2]; if(xIsNan<IssmDouble>(lambdaz[i])) _error_("NaN found in solution vector"); 117 } 118 for(i=0;i<pnumnodes;i++){ 119 lambdap[i] = pvalues[i]; if(xIsNan<IssmDouble>(lambdap[i])) _error_("NaN found in solution vector"); 120 } 121 122 /*Recondition pressure and compute vel: */ 123 element->FindParam(&FSreconditioning,StressbalanceFSreconditioningEnum); 124 for(i=0;i<pnumnodes;i++) lambdap[i]=lambdap[i]*FSreconditioning; 125 126 /*Add vx and vy as inputs to the tria element: */ 127 element->AddInput(AdjointxEnum,lambdax,P1Enum); 128 element->AddInput(AdjointyEnum,lambday,P1Enum); 129 element->AddInput(AdjointzEnum,lambdaz,P1Enum); 130 element->AddInput(AdjointpEnum,lambdap,P1Enum); 131 132 /*Free ressources:*/ 133 xDelete<int>(vdoflist); 134 xDelete<int>(pdoflist); 135 xDelete<IssmDouble>(lambdap); 136 xDelete<IssmDouble>(lambdaz); 137 xDelete<IssmDouble>(lambday); 138 xDelete<IssmDouble>(lambdax); 139 xDelete<IssmDouble>(vvalues); 140 xDelete<IssmDouble>(pvalues); 141 }/*}}}*/ -
issm/trunk-jpl/src/c/analyses/AdjointHorizAnalysis.h
r16684 r16752 20 20 void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element); 21 21 void InputUpdateFromSolution(IssmDouble* solution,Element* element); 22 void InputUpdateFromSolutionHoriz(IssmDouble* solution,Element* element); 23 void InputUpdateFromSolutionFS(IssmDouble* solution,Element* element); 22 24 }; 23 25 #endif
Note:
See TracChangeset
for help on using the changeset viewer.