source: issm/oecreview/Archive/17984-18295/ISSM-18002-18003.diff@ 18296

Last change on this file since 18296 was 18296, checked in by Mathieu Morlighem, 11 years ago

Added 17984-18295

File size: 20.4 KB
RevLine 
[18296]1Index: ../trunk-jpl/src/c/analyses/AdjointBalancethickness2Analysis.cpp
2===================================================================
3--- ../trunk-jpl/src/c/analyses/AdjointBalancethickness2Analysis.cpp (revision 18002)
4+++ ../trunk-jpl/src/c/analyses/AdjointBalancethickness2Analysis.cpp (revision 18003)
5@@ -37,102 +37,72 @@
6 }/*}}}*/
7 ElementMatrix* AdjointBalancethickness2Analysis::CreateKMatrix(Element* element){/*{{{*/
8
9- _error_("not implemented");
10 Balancethickness2Analysis* analysis = new Balancethickness2Analysis();
11 ElementMatrix* Ke = analysis->CreateKMatrix(element);
12 delete analysis;
13
14- /*Transpose and return Ke*/
15- Ke->Transpose();
16 return Ke;
17 }/*}}}*/
18 ElementVector* AdjointBalancethickness2Analysis::CreatePVector(Element* element){/*{{{*/
19
20- _error_("not implemented");
21- /*Intermediaries*/
22- int domaintype;
23- Element* basalelement;
24-
25- /*Get basal element*/
26- element->FindParam(&domaintype,DomainTypeEnum);
27- switch(domaintype){
28- case Domain2DhorizontalEnum:
29- basalelement = element;
30- break;
31- case Domain3DEnum:
32- if(!element->IsOnBase()) return NULL;
33- basalelement = element->SpawnBasalElement();
34- break;
35- default: _error_("mesh "<<EnumToStringx(domaintype)<<" not supported yet");
36- }
37-
38 /*Intermediaries */
39 int num_responses,i;
40- IssmDouble dH[2];
41- IssmDouble vx,vy,vel,Jdet;
42- IssmDouble thickness,thicknessobs,weight;
43+ IssmDouble hobs,hu2,weight,NUMx,NUMy,DEN,Jdet;
44+ IssmDouble vx,vy,vbar2,nux,nuy,dphi[2];
45 int *responses = NULL;
46 IssmDouble *xyz_list = NULL;
47
48 /*Fetch number of nodes and dof for this finite element*/
49- int numnodes = basalelement->GetNumberOfNodes();
50+ int numnodes = element->GetNumberOfNodes();
51
52 /*Initialize Element vector and vectors*/
53- ElementVector* pe = basalelement->NewElementVector(SSAApproximationEnum);
54+ ElementVector* pe = element->NewElementVector(SSAApproximationEnum);
55 IssmDouble* basis = xNew<IssmDouble>(numnodes);
56 IssmDouble* dbasis = xNew<IssmDouble>(2*numnodes);
57
58 /*Retrieve all inputs and parameters*/
59- basalelement->GetVerticesCoordinates(&xyz_list);
60- basalelement->FindParam(&num_responses,InversionNumCostFunctionsEnum);
61- basalelement->FindParam(&responses,NULL,InversionCostFunctionsEnum);
62- Input* thickness_input = basalelement->GetInput(ThicknessEnum); _assert_(thickness_input);
63- Input* thicknessobs_input = basalelement->GetInput(InversionThicknessObsEnum); _assert_(thicknessobs_input);
64- Input* weights_input = basalelement->GetInput(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input);
65- Input* vx_input = basalelement->GetInput(VxEnum); _assert_(vx_input);
66- Input* vy_input = basalelement->GetInput(VyEnum); _assert_(vy_input);
67+ element->GetVerticesCoordinates(&xyz_list);
68+ element->FindParam(&num_responses,InversionNumCostFunctionsEnum);
69+ element->FindParam(&responses,NULL,InversionCostFunctionsEnum);
70+ Input* thicknessobs_input = element->GetInput(InversionThicknessObsEnum); _assert_(thicknessobs_input);
71+ Input* weights_input = element->GetInput(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input);
72+ Input* potential_input = element->GetInput(PotentialEnum); _assert_(potential_input);
73+ Input* vx_input = element->GetInput(BalancethicknessVxObsEnum); _assert_(vx_input);
74+ Input* vy_input = element->GetInput(BalancethicknessVyObsEnum); _assert_(vy_input);
75+ Input* nux_input = element->GetInput(BalancethicknessNuxEnum); _assert_(nux_input);
76+ Input* nuy_input = element->GetInput(BalancethicknessNuyEnum); _assert_(nuy_input);
77
78 /* Start looping on the number of gaussian points: */
79- Gauss* gauss=basalelement->NewGauss(2);
80+ Gauss* gauss=element->NewGauss(2);
81 for(int ig=gauss->begin();ig<gauss->end();ig++){
82 gauss->GaussPoint(ig);
83
84- basalelement->JacobianDeterminant(&Jdet,xyz_list,gauss);
85- basalelement->NodalFunctions(basis,gauss);
86- basalelement->NodalFunctionsDerivatives(dbasis,xyz_list,gauss);
87+ element->JacobianDeterminant(&Jdet,xyz_list,gauss);
88+ element->NodalFunctions(basis,gauss);
89+ element->NodalFunctionsDerivatives(dbasis,xyz_list,gauss);
90
91- thickness_input->GetInputValue(&thickness, gauss);
92- thickness_input->GetInputDerivativeValue(&dH[0],xyz_list,gauss);
93- thicknessobs_input->GetInputValue(&thicknessobs, gauss);
94+ vx_input->GetInputValue(&vx,gauss);
95+ vy_input->GetInputValue(&vy,gauss);
96+ nux_input->GetInputValue(&nux,gauss);
97+ nuy_input->GetInputValue(&nuy,gauss);
98+ potential_input->GetInputDerivativeValue(&dphi[0],xyz_list,gauss);
99+ thicknessobs_input->GetInputValue(&hobs,gauss);
100
101+ vbar2 = (nux*nux*vx*vx + nuy*nuy*vy*vy);
102+ hu2 = hobs*hobs*vbar2;
103+
104+ NUMx = 2.*dbasis[0]*dphi[0]*(dphi[0]*dphi[0] + dphi[1]*dphi[1] - hu2);
105+ NUMy = 2.*dbasis[1]*dphi[1]*(dphi[0]*dphi[0] + dphi[1]*dphi[1] - hu2);
106+ DEN = vbar2*vbar2;
107+
108 /*Loop over all requested responses*/
109 for(int resp=0;resp<num_responses;resp++){
110 weights_input->GetInputValue(&weight,gauss,responses[resp]);
111
112 switch(responses[resp]){
113- case ThicknessAbsMisfitEnum:
114- for(i=0;i<numnodes;i++) pe->values[i]+=(thicknessobs-thickness)*weight*Jdet*gauss->weight*basis[i];
115+ case Balancethickness2MisfitEnum:
116+ for(i=0;i<numnodes;i++) pe->values[i]+=(NUMx+NUMy)/DEN *weight*Jdet*gauss->weight*basis[i];
117 break;
118- case ThicknessAbsGradientEnum:
119- for(i=0;i<numnodes;i++) pe->values[i]+= - weight*dH[0]*dbasis[0*numnodes+i]*Jdet*gauss->weight;
120- for(i=0;i<numnodes;i++) pe->values[i]+= - weight*dH[1]*dbasis[1*numnodes+i]*Jdet*gauss->weight;
121- break;
122- case ThicknessAlongGradientEnum:
123- vx_input->GetInputValue(&vx,gauss);
124- vy_input->GetInputValue(&vy,gauss);
125- vel = sqrt(vx*vx+vy*vy);
126- vx = vx/(vel+1.e-9);
127- vy = vy/(vel+1.e-9);
128- for(i=0;i<numnodes;i++) pe->values[i]+= - weight*(dH[0]*vx+dH[1]*vy)*(dbasis[0*numnodes+i]*vx+dbasis[1*numnodes+i]*vy)*Jdet*gauss->weight;
129- break;
130- case ThicknessAcrossGradientEnum:
131- vx_input->GetInputValue(&vx,gauss);
132- vy_input->GetInputValue(&vy,gauss);
133- vel = sqrt(vx*vx+vy*vy);
134- vx = vx/(vel+1.e-9);
135- vy = vy/(vel+1.e-9);
136- for(i=0;i<numnodes;i++) pe->values[i]+= - weight*(dH[0]*(-vy)+dH[1]*vx)*(dbasis[0*numnodes+i]*(-vy)+dbasis[1*numnodes+i]*vx)*Jdet*gauss->weight;
137- break;
138 default:
139 _error_("response " << EnumToStringx(responses[resp]) << " not supported yet");
140 }
141@@ -144,7 +114,6 @@
142 xDelete<IssmDouble>(xyz_list);
143 xDelete<IssmDouble>(basis);
144 xDelete<IssmDouble>(dbasis);
145- if(domaintype!=Domain2DhorizontalEnum){basalelement->DeleteMaterials(); delete basalelement;};
146 delete gauss;
147 return pe;
148 }/*}}}*/
149Index: ../trunk-jpl/src/c/analyses/Balancethickness2Analysis.cpp
150===================================================================
151--- ../trunk-jpl/src/c/analyses/Balancethickness2Analysis.cpp (revision 18002)
152+++ ../trunk-jpl/src/c/analyses/Balancethickness2Analysis.cpp (revision 18003)
153@@ -182,7 +182,7 @@
154 element->JacobianDeterminantSurface(&Jdet,xyz_list_front,gauss);
155 element->NodalFunctions(basis,gauss);
156
157- for(int i=0;i<numnodes;i++) pe->values[i] += - Jdet*gauss->weight*thickness*(vx*normal[0] + vy*normal[1])*basis[i];
158+ for(int i=0;i<numnodes;i++) pe->values[i] += Jdet*gauss->weight*thickness*(vx*normal[0] + vy*normal[1])*basis[i];
159 }
160
161 /*Clean up and return*/
162Index: ../trunk-jpl/src/c/modules/ModelProcessorx/Control/UpdateElementsAndMaterialsControl.cpp
163===================================================================
164--- ../trunk-jpl/src/c/modules/ModelProcessorx/Control/UpdateElementsAndMaterialsControl.cpp (revision 18002)
165+++ ../trunk-jpl/src/c/modules/ModelProcessorx/Control/UpdateElementsAndMaterialsControl.cpp (revision 18003)
166@@ -11,8 +11,7 @@
167 void UpdateElementsAndMaterialsControl(Elements* elements,Materials* materials, IoModel* iomodel){
168
169 /*Intermediary*/
170- int i;
171- int counter;
172+ int control;
173 Element *element = NULL;
174 Material *material = NULL;
175 int num_control_type;
176@@ -32,8 +31,8 @@
177
178 iomodel->FetchData(5,InversionControlParametersEnum,InversionCostFunctionsEnum,InversionCostFunctionsCoefficientsEnum,InversionMinParametersEnum,InversionMaxParametersEnum);
179
180- for(i=0;i<num_control_type;i++){
181- int control = reCast<int,IssmDouble>(iomodel->Data(InversionControlParametersEnum)[i]);
182+ for(int i=0;i<num_control_type;i++){
183+ control = reCast<int,IssmDouble>(iomodel->Data(InversionControlParametersEnum)[i]);
184 switch(control){
185 /*List of supported controls*/
186 case BalancethicknessThickeningRateEnum:
187@@ -43,6 +42,7 @@
188 case FrictionCoefficientEnum:
189 case BalancethicknessNuxEnum:
190 case BalancethicknessNuyEnum:
191+ case BalancethicknessApparentMassbalanceEnum:
192 iomodel->FetchData(1,control);
193 break;
194
195@@ -55,8 +55,8 @@
196 }
197
198 /*Update elements: */
199- counter=0;
200- for (i=0;i<iomodel->numberofelements;i++){
201+ int counter=0;
202+ for(int i=0;i<iomodel->numberofelements;i++){
203 if(iomodel->my_elements[i]){
204 element=(Element*)elements->GetObjectByOffset(counter);
205 element->InputUpdateFromIoModel(i,iomodel); //we need i to index into elements.
206@@ -65,5 +65,15 @@
207 }
208
209 /*Free data: */
210- iomodel->DeleteData(5+7,InversionControlParametersEnum,InversionCostFunctionsCoefficientsEnum,InversionCostFunctionsEnum,InversionMinParametersEnum,InversionMaxParametersEnum,BalancethicknessThickeningRateEnum,VxEnum,VyEnum,ThicknessEnum,FrictionCoefficientEnum,MaterialsRheologyBEnum,DamageDEnum);
211+ for(int i=0;i<num_control_type;i++){
212+ control = reCast<int,IssmDouble>(iomodel->Data(InversionControlParametersEnum)[i]);
213+ switch(control){
214+ case MaterialsRheologyBbarEnum: iomodel->DeleteData(1,MaterialsRheologyBEnum); break;
215+ case DamageDbarEnum: iomodel->DeleteData(1,DamageDEnum); break;
216+ default: iomodel->DeleteData(1,control);
217+ }
218+ }
219+ iomodel->DeleteData(5,InversionControlParametersEnum,InversionCostFunctionsCoefficientsEnum,InversionCostFunctionsEnum,InversionMinParametersEnum,InversionMaxParametersEnum);
220+
221+
222 }
223Index: ../trunk-jpl/src/c/cores/control_core.cpp
224===================================================================
225--- ../trunk-jpl/src/c/cores/control_core.cpp (revision 18002)
226+++ ../trunk-jpl/src/c/cores/control_core.cpp (revision 18003)
227@@ -144,18 +144,23 @@
228 femmodel->parameters->FindParam(&solution_type,SolutionTypeEnum);
229
230 /*set analysis type to compute velocity: */
231- if (solution_type==SteadystateSolutionEnum || solution_type==StressbalanceSolutionEnum){
232- femmodel->SetCurrentConfiguration(StressbalanceAnalysisEnum);
233+ switch(solution_type){
234+ case SteadystateSolutionEnum:
235+ case StressbalanceSolutionEnum:
236+ femmodel->SetCurrentConfiguration(StressbalanceAnalysisEnum);
237+ break;
238+ case BalancethicknessSolutionEnum:
239+ femmodel->SetCurrentConfiguration(BalancethicknessAnalysisEnum);
240+ break;
241+ case BalancethicknessSoftSolutionEnum:
242+ femmodel->SetCurrentConfiguration(BalancethicknessAnalysisEnum);
243+ break;
244+ case Balancethickness2SolutionEnum:
245+ femmodel->SetCurrentConfiguration(Balancethickness2AnalysisEnum);
246+ break;
247+ default:
248+ _error_("Solution " << EnumToStringx(solution_type) << " not implemented yet");
249 }
250- else if (solution_type==BalancethicknessSolutionEnum){
251- femmodel->SetCurrentConfiguration(BalancethicknessAnalysisEnum);
252- }
253- else if (solution_type==BalancethicknessSoftSolutionEnum){
254- femmodel->SetCurrentConfiguration(BalancethicknessAnalysisEnum);
255- }
256- else{
257- _error_("Solution " << EnumToStringx(solution_type) << " not implemented yet");
258- }
259
260 /*update parameter according to scalar: */ //false means: do not save control
261 InputControlUpdatex(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,search_scalar,false);
262@@ -170,6 +175,9 @@
263 else if (solution_type==BalancethicknessSolutionEnum){
264 solutionsequence_linear(femmodel);
265 }
266+ else if (solution_type==Balancethickness2SolutionEnum){
267+ solutionsequence_linear(femmodel);
268+ }
269 else if (solution_type==BalancethicknessSoftSolutionEnum){
270 /*Don't do anything*/
271 }
272Index: ../trunk-jpl/src/c/classes/FemModel.cpp
273===================================================================
274--- ../trunk-jpl/src/c/classes/FemModel.cpp (revision 18002)
275+++ ../trunk-jpl/src/c/classes/FemModel.cpp (revision 18003)
276@@ -435,17 +435,17 @@
277 case IceVolumeEnum: this->IceVolumex(responses); break;
278 case IceVolumeAboveFloatationEnum: this->IceVolumeAboveFloatationx(responses); break;
279 case MinVelEnum: this->MinVelx(responses); break;
280- case MaxVelEnum: this->MaxVelx( responses); break;
281+ case MaxVelEnum: this->MaxVelx(responses); break;
282 case MinVxEnum: this->MinVxx(responses); break;
283- case MaxVxEnum: this->MaxVxx( responses); break;
284- case MaxAbsVxEnum: this->MaxAbsVxx( responses); break;
285+ case MaxVxEnum: this->MaxVxx(responses); break;
286+ case MaxAbsVxEnum: this->MaxAbsVxx(responses); break;
287 case MinVyEnum: this->MinVyx(responses); break;
288- case MaxVyEnum: this->MaxVyx( responses); break;
289- case MaxAbsVyEnum: this->MaxAbsVyx( responses); break;
290+ case MaxVyEnum: this->MaxVyx(responses); break;
291+ case MaxAbsVyEnum: this->MaxAbsVyx(responses); break;
292 case MinVzEnum: this->MinVzx(responses); break;
293- case MaxVzEnum: this->MaxVzx( responses); break;
294- case MaxAbsVzEnum: this->MaxAbsVzx( responses); break;
295- case MassFluxEnum: this->MassFluxx( responses); break;
296+ case MaxVzEnum: this->MaxVzx(responses); break;
297+ case MaxAbsVzEnum: this->MaxAbsVzx(responses); break;
298+ case MassFluxEnum: this->MassFluxx(responses); break;
299 case SurfaceAbsVelMisfitEnum: SurfaceAbsVelMisfitx(responses, elements,nodes, vertices, loads, materials,parameters); break;
300 case SurfaceRelVelMisfitEnum: SurfaceRelVelMisfitx(responses, elements,nodes, vertices, loads, materials,parameters); break;
301 case SurfaceLogVelMisfitEnum: SurfaceLogVelMisfitx(responses, elements,nodes, vertices, loads, materials,parameters); break;
302@@ -458,6 +458,7 @@
303 case RheologyBbarAbsGradientEnum: RheologyBbarAbsGradientx(responses, elements,nodes, vertices, loads, materials, parameters); break;
304 case DragCoefficientAbsGradientEnum:DragCoefficientAbsGradientx(responses, elements,nodes, vertices, loads, materials, parameters); break;
305 case BalancethicknessMisfitEnum: BalancethicknessMisfitx(responses); break;
306+ case Balancethickness2MisfitEnum: Balancethickness2Misfitx(responses); break;
307 case TotalSmbEnum: this->TotalSmbx(responses); break;
308 case MaterialsRheologyBbarEnum: this->ElementResponsex(responses,MaterialsRheologyBbarEnum); break;
309 case VelEnum: this->ElementResponsex(responses,VelEnum); break;
310@@ -1199,6 +1200,61 @@
311 *presponse=J;
312
313 }/*}}}*/
314+void FemModel::Balancethickness2Misfitx(IssmDouble* presponse){/*{{{*/
315+
316+ /*output: */
317+ IssmDouble J=0.;
318+ IssmDouble J_sum;
319+
320+ IssmDouble weight,thicknessobs,thickness;
321+ IssmDouble Jdet;
322+ IssmDouble* xyz_list = NULL;
323+
324+ /*Compute Misfit: */
325+ for(int i=0;i<elements->Size();i++){
326+ Element* element=dynamic_cast<Element*>(elements->GetObjectByOffset(i));
327+
328+ /*If on water, return 0: */
329+ if(!element->IsIceInElement()) continue;
330+
331+ /* Get node coordinates*/
332+ element->GetVerticesCoordinates(&xyz_list);
333+ Input* weights_input =element->GetInput(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input);
334+ Input* thickness_input =element->GetInput(ThicknessEnum); _assert_(thickness_input);
335+ Input* thicknessobs_input=element->GetInput(InversionThicknessObsEnum); _assert_(thicknessobs_input);
336+
337+ /* Start looping on the number of gaussian points: */
338+ Gauss* gauss=element->NewGauss(2);
339+ for(int ig=gauss->begin();ig<gauss->end();ig++){
340+
341+ gauss->GaussPoint(ig);
342+
343+ /* Get Jacobian determinant: */
344+ element->JacobianDeterminant(&Jdet,xyz_list,gauss);
345+
346+ /*Get all parameters at gaussian point*/
347+ weights_input->GetInputValue(&weight,gauss,Balancethickness2MisfitEnum);
348+ thickness_input->GetInputValue(&thickness,gauss);
349+ thicknessobs_input->GetInputValue(&thicknessobs,gauss);
350+ gauss->GaussPoint(ig);
351+
352+ J +=0.5*(thickness*thickness - thicknessobs*thicknessobs)*weight*Jdet*gauss->weight;
353+ }
354+
355+ /*clean up and Return: */
356+ xDelete<IssmDouble>(xyz_list);
357+ delete gauss;
358+ }
359+
360+ /*Sum all J from all cpus of the cluster:*/
361+ ISSM_MPI_Reduce (&J,&J_sum,1,ISSM_MPI_DOUBLE,ISSM_MPI_SUM,0,IssmComm::GetComm() );
362+ ISSM_MPI_Bcast(&J_sum,1,ISSM_MPI_DOUBLE,0,IssmComm::GetComm());
363+ J=J_sum;
364+
365+ /*Assign output pointers: */
366+ *presponse=J;
367+
368+}/*}}}*/
369 void FemModel::ThicknessAbsGradientx( IssmDouble* pJ){/*{{{*/
370
371 /*output: */
372Index: ../trunk-jpl/src/c/classes/Elements/Tria.cpp
373===================================================================
374--- ../trunk-jpl/src/c/classes/Elements/Tria.cpp (revision 18002)
375+++ ../trunk-jpl/src/c/classes/Elements/Tria.cpp (revision 18003)
376@@ -990,6 +990,7 @@
377 switch(control){
378 /*yts conversion*/
379 case BalancethicknessThickeningRateEnum:
380+ case BalancethicknessApparentMassbalanceEnum:
381 case VxEnum:
382 case VyEnum:
383 if(iomodel->Data(control)){
384@@ -2802,8 +2803,11 @@
385 case ThicknessEnum:
386 GradjThicknessBalancethicknessSoft(gradient,control_index);
387 break;
388+ case BalancethicknessApparentMassbalanceEnum:
389+ GradjAdotBulancethickness2(gradient,control_index);
390+ break;
391 default:
392- _error_("control type not supported yet: " << control_type);
393+ _error_("control type not supported yet: " << EnumToStringx(control_type));
394 }
395
396 /*Now deal with ∂J/∂alpha*/
397@@ -2820,6 +2824,7 @@
398 case ThicknessAlongGradientEnum:
399 case ThicknessAcrossGradientEnum:
400 case BalancethicknessMisfitEnum:
401+ case Balancethickness2MisfitEnum:
402 case SurfaceAbsVelMisfitEnum:
403 case SurfaceRelVelMisfitEnum:
404 case SurfaceLogVelMisfitEnum:
405@@ -3167,6 +3172,21 @@
406 gradient->SetValues(NUMVERTICES,vertexpidlist,gradient_g,INS_VAL);
407 }
408 /*}}}*/
409+void Tria::GradjAdotBulancethickness2(Vector<IssmDouble>* gradient,int control_index){/*{{{*/
410+
411+ /*Intermediaries*/
412+ int vertexpidlist[NUMVERTICES];
413+ IssmDouble lambda[NUMVERTICES];
414+ IssmDouble gradient_g[NUMVERTICES];
415+
416+ /*Compute Gradient*/
417+ GradientIndexing(&vertexpidlist[0],control_index);
418+ GetInputListOnVertices(&lambda[0],AdjointEnum);
419+ for(int i=0;i<NUMVERTICES;i++) gradient_g[i]=lambda[i];
420+
421+ gradient->SetValues(NUMVERTICES,vertexpidlist,gradient_g,INS_VAL);
422+}
423+/*}}}*/
424 void Tria::GradjVxBalancedthickness(Vector<IssmDouble>* gradient,int control_index){/*{{{*/
425
426 /*Intermediaries*/
427Index: ../trunk-jpl/src/c/classes/Elements/Tria.h
428===================================================================
429--- ../trunk-jpl/src/c/classes/Elements/Tria.h (revision 18002)
430+++ ../trunk-jpl/src/c/classes/Elements/Tria.h (revision 18003)
431@@ -148,6 +148,7 @@
432 void GradjVxBalancedthickness(Vector<IssmDouble>* gradient,int control_index);
433 void GradjVyBalancedthickness(Vector<IssmDouble>* gradient,int control_index);
434 void GradjThicknessBalancethicknessSoft(Vector<IssmDouble>* gradient,int control_index);
435+ void GradjAdotBulancethickness2(Vector<IssmDouble>* gradient,int control_index);
436 void GetVectorFromControlInputs(Vector<IssmDouble>* gradient,int control_enum,int control_index,const char* data);
437 void SetControlInputsFromVector(IssmDouble* vector,int control_enum,int control_index);
438 void ControlInputGetGradient(Vector<IssmDouble>* gradient,int enum_type,int control_index);
439Index: ../trunk-jpl/src/c/classes/FemModel.h
440===================================================================
441--- ../trunk-jpl/src/c/classes/FemModel.h (revision 18002)
442+++ ../trunk-jpl/src/c/classes/FemModel.h (revision 18003)
443@@ -76,6 +76,7 @@
444 void IceVolumeAboveFloatationx(IssmDouble* pV);
445 void ElementResponsex(IssmDouble* presponse,int response_enum);
446 void BalancethicknessMisfitx(IssmDouble* pV);
447+ void Balancethickness2Misfitx(IssmDouble* pV);
448 #ifdef _HAVE_DAKOTA_
449 void DakotaResponsesx(double* d_responses,char** responses_descriptors,int numresponsedescriptors,int d_numresponses);
450 #endif
Note: See TracBrowser for help on using the repository browser.