Changeset 11313
- Timestamp:
- 02/03/12 07:55:52 (13 years ago)
- Location:
- issm/trunk-jpl/src
- Files:
-
- 25 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/modules/ControlInputGetGradientx/ControlInputGetGradientx.cpp
r7177 r11313 9 9 #include "../../EnumDefinitions/EnumDefinitions.h" 10 10 11 void ControlInputGetGradientx( Vec* pgradient, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters , int name){11 void ControlInputGetGradientx( Vec* pgradient, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters){ 12 12 13 Vec gradient=NULL; 14 gradient=NewVec(vertices->NumberOfVertices()); 13 /*Intermediaries*/ 14 int num_controls; 15 int *control_type = NULL; 16 Vec gradient=NULL; 15 17 16 for(int i=0;i<elements->Size();i++){ 17 Element* element=(Element*)elements->GetObjectByOffset(i); 18 element->ControlInputGetGradient(gradient,name); 18 /*Retrieve some parameters*/ 19 parameters->FindParam(&num_controls,InversionNumControlParametersEnum); 20 parameters->FindParam(&control_type,NULL,InversionControlParametersEnum); 21 22 /*Allocate and populate gradient*/ 23 gradient=NewVec(num_controls*vertices->NumberOfVertices()); 24 25 for(int i=0;i<num_controls;i++){ 26 for(int j=0;j<elements->Size();j++){ 27 Element* element=(Element*)elements->GetObjectByOffset(j); 28 element->ControlInputGetGradient(gradient,control_type[i],i); 29 } 19 30 } 20 31 … … 22 33 VecAssemblyEnd(gradient); 23 34 24 /*Assign output pointers:*/ 35 /*Clean up and return*/ 36 xfree((void**)&control_type); 25 37 *pgradient=gradient; 26 38 } -
issm/trunk-jpl/src/c/modules/ControlInputGetGradientx/ControlInputGetGradientx.h
r7177 r11313 8 8 #include "../../Container/Container.h" 9 9 10 void ControlInputGetGradientx( Vec* pgradient, Elements* elements,Nodes* nodes, Vertices* vertices,Loads* loads, Materials* materials, Parameters* parameters ,int name);10 void ControlInputGetGradientx( Vec* pgradient, Elements* elements,Nodes* nodes, Vertices* vertices,Loads* loads, Materials* materials, Parameters* parameters); 11 11 12 12 #endif -
issm/trunk-jpl/src/c/modules/ControlInputScaleGradientx/ControlInputScaleGradientx.cpp
r7177 r11313 9 9 #include "../../EnumDefinitions/EnumDefinitions.h" 10 10 11 void ControlInputScaleGradientx(Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters, int name,double scale){11 void ControlInputScaleGradientx(Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters,double* norm_list,int step){ 12 12 13 for(int i=0;i<elements->Size();i++){ 14 Element* element=(Element*)elements->GetObjectByOffset(i); 15 element->ControlInputScaleGradient(name,scale); 13 /*Intermediaries*/ 14 int i,j,num_controls; 15 int *control_type = NULL; 16 double *scalar_list = NULL; 17 double scalar; 18 19 20 /*Retrieve some parameters*/ 21 parameters->FindParam(&num_controls,InversionNumControlParametersEnum); 22 parameters->FindParam(&control_type,NULL,InversionControlParametersEnum); 23 parameters->FindParam(&scalar_list,NULL,NULL,InversionGradientScalingEnum); 24 25 /*Compute scaling factor*/ 26 scalar=scalar_list[0]/norm_list[0]; 27 for(i=0;i<num_controls;i++){ 28 scalar=min(scalar,scalar_list[num_controls*step+i]/norm_list[i]); 16 29 } 17 30 31 for(i=0;i<num_controls;i++){ 32 for(j=0;j<elements->Size();j++){ 33 Element* element=(Element*)elements->GetObjectByOffset(j); 34 element->ControlInputScaleGradient(control_type[i],scalar); 35 } 36 } 37 38 /*Clean up and return*/ 39 xfree((void**)&control_type); 40 xfree((void**)&scalar_list); 18 41 } -
issm/trunk-jpl/src/c/modules/ControlInputScaleGradientx/ControlInputScaleGradientx.h
r7177 r11313 8 8 #include "../../Container/Container.h" 9 9 10 void ControlInputScaleGradientx(Elements* elements,Nodes* nodes, Vertices* vertices,Loads* loads, Materials* materials, Parameters* parameters, int name,double scale);10 void ControlInputScaleGradientx(Elements* elements,Nodes* nodes, Vertices* vertices,Loads* loads, Materials* materials, Parameters* parameters,double* norm_list,int step); 11 11 12 12 #endif -
issm/trunk-jpl/src/c/modules/ControlInputSetGradientx/ControlInputSetGradientx.cpp
r7177 r11313 9 9 #include "../../EnumDefinitions/EnumDefinitions.h" 10 10 11 void ControlInputSetGradientx(Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters, int name,double* gradient){11 void ControlInputSetGradientx(Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters,double* gradient){ 12 12 13 for(int i=0;i<elements->Size();i++){ 14 Element* element=(Element*)elements->GetObjectByOffset(i); 15 element->ControlInputSetGradient(gradient,name); 13 /*Intermediaries*/ 14 int num_controls; 15 int *control_type = NULL; 16 17 /*Retrieve some parameters*/ 18 parameters->FindParam(&num_controls,InversionNumControlParametersEnum); 19 parameters->FindParam(&control_type,NULL,InversionControlParametersEnum); 20 21 for(int i=0;i<num_controls;i++){ 22 for(int j=0;j<elements->Size();j++){ 23 Element* element=(Element*)elements->GetObjectByOffset(j); 24 element->ControlInputSetGradient(gradient,control_type[i],i); 25 } 16 26 } 17 27 28 /*Clean up and return*/ 29 xfree((void**)&control_type); 30 18 31 } 19 void ControlInputSetGradientx(Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters, int name,Vec gradient){32 void ControlInputSetGradientx(Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters,Vec gradient){ 20 33 21 34 /*Serialize gradient*/ … … 23 36 VecToMPISerial(&serial_gradient,gradient); 24 37 25 ControlInputSetGradientx(elements,nodes,vertices, loads, materials, parameters, name,serial_gradient);38 ControlInputSetGradientx(elements,nodes,vertices, loads, materials, parameters,serial_gradient); 26 39 27 40 /*Clean up and return*/ -
issm/trunk-jpl/src/c/modules/ControlInputSetGradientx/ControlInputSetGradientx.h
r7177 r11313 8 8 #include "../../Container/Container.h" 9 9 10 void ControlInputSetGradientx(Elements* elements,Nodes* nodes, Vertices* vertices,Loads* loads, Materials* materials, Parameters* parameters, int name,double* gradient);11 void ControlInputSetGradientx(Elements* elements,Nodes* nodes, Vertices* vertices,Loads* loads, Materials* materials, Parameters* parameters, int name,Vec gradient);10 void ControlInputSetGradientx(Elements* elements,Nodes* nodes, Vertices* vertices,Loads* loads, Materials* materials, Parameters* parameters,double* gradient); 11 void ControlInputSetGradientx(Elements* elements,Nodes* nodes, Vertices* vertices,Loads* loads, Materials* materials, Parameters* parameters,Vec gradient); 12 12 13 13 #endif -
issm/trunk-jpl/src/c/modules/Gradjx/Gradjx.cpp
r11310 r11313 10 10 #include "../../EnumDefinitions/EnumDefinitions.h" 11 11 12 void Gradjx( Vec* pgradient,double* pnorm_grad, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters,int control_index){12 void Gradjx(Vec* pgradient,double** pnorm_list, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters){ 13 13 14 int i; 15 int numberofvertices; 16 double norm_grad; 17 int *control_type = NULL; 18 Vec gradient = NULL; 14 int i,j,numberofvertices; 15 int num_controls; 16 double norm_inf; 17 double *norm_list = NULL; 18 int *control_type = NULL; 19 Vec gradient = NULL; 20 Vec *gradient_list = NULL; 19 21 20 22 /*retrieve some parameters: */ 23 parameters->FindParam(&num_controls,InversionNumControlParametersEnum); _assert_(num_controls); 21 24 parameters->FindParam(&control_type,NULL,InversionControlParametersEnum); 22 25 numberofvertices=vertices->NumberOfVertices(); 23 26 24 /*Allocate gradient: */ 25 gradient=NewVec(numberofvertices); 27 /*Allocate gradient_list */ 28 gradient_list = (Vec*)xmalloc(num_controls*sizeof(Vec)); 29 norm_list = (double*)xmalloc(num_controls*sizeof(double)); 30 for(i=0;i<num_controls;i++){ 31 gradient_list[i]=NewVec(num_controls*numberofvertices); 32 } 33 gradient=NewVec(num_controls*numberofvertices); 26 34 27 /*Compute gradients: */ 28 for (i=0;i<elements->Size();i++){ 29 Element* element=(Element*)elements->GetObjectByOffset(i); 30 element->Gradj(gradient,control_type[control_index]); 35 /*Compute all gradient_list*/ 36 for(i=0;i<num_controls;i++){ 37 38 for(j=0;j<elements->Size();j++){ 39 Element* element=(Element*)elements->GetObjectByOffset(j); 40 element->Gradj(gradient_list[i],control_type[i],i); 41 } 42 43 VecAssemblyBegin(gradient_list[i]); 44 VecAssemblyEnd(gradient_list[i]); 45 46 VecNorm(gradient_list[i],NORM_INFINITY,&norm_list[i]); 31 47 } 32 48 33 /*Assemble vector: */ 34 VecAssemblyBegin(gradient); 35 VecAssemblyEnd(gradient); 49 /*Add all gradient_list together*/ 50 for(i=0;i<num_controls;i++){ 51 VecAXPY(gradient,1.,gradient_list[i]); 52 VecFree(&gradient_list[i]); 53 } 36 54 37 /*Clean up and return*/ 55 /*Check that gradient is clean*/ 56 VecNorm(gradient,NORM_INFINITY,&norm_inf); 57 if(norm_inf<=0) _error_("||∂J/∂α||∞ = 0 gradient norm is zero"); 58 if(isnan(norm_inf))_error_("||∂J/∂α||∞ = NaN gradient norm is NaN"); 59 60 /*Clean-up and assign output pointer*/ 61 *pnorm_list=norm_list; 62 *pgradient=gradient; 63 xfree((void**)&gradient_list); 38 64 xfree((void**)&control_type); 39 if(pnorm_grad){40 VecNorm(gradient,NORM_INFINITY,&norm_grad);41 *pnorm_grad=norm_grad;42 }43 *pgradient=gradient;44 65 } -
issm/trunk-jpl/src/c/modules/Gradjx/Gradjx.h
r11310 r11313 10 10 11 11 /* local prototypes: */ 12 void Gradjx(Vec* pgrad_g,double* pgrad_norm,Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters, int control_type);12 void Gradjx(Vec* pgrad_g,double** pgrad_norm,Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials,Parameters* parameters); 13 13 14 14 #endif /* _GRADJX_H */ 15 -
issm/trunk-jpl/src/c/objects/Elements/Element.h
r11260 r11313 90 90 91 91 #ifdef _HAVE_CONTROL_ 92 virtual void Gradj(Vec gradient,int control_type )=0;92 virtual void Gradj(Vec gradient,int control_type,int control_index)=0; 93 93 virtual double ThicknessAbsMisfit(bool process_units ,int weight_index)=0; 94 94 virtual double SurfaceAbsVelMisfit(bool process_units ,int weight_index)=0; … … 100 100 virtual double RheologyBbarAbsGradient(bool process_units,int weight_index)=0; 101 101 virtual double DragCoefficientAbsGradient(bool process_units,int weight_index)=0; 102 virtual void ControlInputGetGradient(Vec gradient,int enum_type )=0;103 virtual void ControlInputSetGradient(double* gradient,int enum_type )=0;102 virtual void ControlInputGetGradient(Vec gradient,int enum_type,int control_index)=0; 103 virtual void ControlInputSetGradient(double* gradient,int enum_type,int control_index)=0; 104 104 virtual void ControlInputScaleGradient(int enum_type, double scale)=0; 105 105 virtual void InputControlUpdate(double scalar,bool save_parameter)=0; -
issm/trunk-jpl/src/c/objects/Elements/Penta.cpp
r11299 r11313 4314 4314 #ifdef _HAVE_CONTROL_ 4315 4315 /*FUNCTION Penta::ControlInputGetGradient{{{1*/ 4316 void Penta::ControlInputGetGradient(Vec gradient,int enum_type ){4316 void Penta::ControlInputGetGradient(Vec gradient,int enum_type,int control_index){ 4317 4317 4318 4318 int doflist1[NUMVERTICES]; … … 4329 4329 if (input->ObjectEnum()!=ControlInputEnum) _error_("Input %s is not a ControlInput",EnumToStringx(enum_type)); 4330 4330 4331 this->GetDofList1(&doflist1[0]);4331 GradientIndexing(&doflist1[0],control_index); 4332 4332 ((ControlInput*)input)->GetGradient(gradient,&doflist1[0]); 4333 4333 … … 4350 4350 }/*}}}*/ 4351 4351 /*FUNCTION Penta::ControlInputSetGradient{{{1*/ 4352 void Penta::ControlInputSetGradient(double* gradient,int enum_type ){4352 void Penta::ControlInputSetGradient(double* gradient,int enum_type,int control_index){ 4353 4353 4354 4354 int doflist1[NUMVERTICES]; … … 4366 4366 if (input->ObjectEnum()!=ControlInputEnum) _error_("Input %s is not a ControlInput",EnumToStringx(enum_type)); 4367 4367 4368 this->GetDofList1(&doflist1[0]);4368 GradientIndexing(&doflist1[0],control_index); 4369 4369 for(int i=0;i<NUMVERTICES;i++) grad_list[i]=gradient[doflist1[i]]; 4370 4370 grad_input=new PentaP1Input(GradientEnum,grad_list); … … 4434 4434 } 4435 4435 /*}}}*/ 4436 /*FUNCTION Penta::GradientIndexing{{{1*/ 4437 void Penta::GradientIndexing(int* indexing,int control_index){ 4438 4439 /*Get some parameters*/ 4440 int num_controls; 4441 parameters->FindParam(&num_controls,InversionNumControlParametersEnum); 4442 4443 /*get gradient indices*/ 4444 for(int i=0;i<NUMVERTICES;i++){ 4445 indexing[i]=num_controls*this->nodes[i]->GetVertexDof() + control_index; 4446 } 4447 4448 } 4449 /*}}}*/ 4436 4450 /*FUNCTION Penta::Gradj {{{1*/ 4437 void Penta::Gradj(Vec gradient,int control_type ){4451 void Penta::Gradj(Vec gradient,int control_type,int control_index){ 4438 4452 /*dJ/dalpha = ∂L/∂alpha = ∂J/∂alpha + ∂/∂alpha(KU-F)*/ 4439 4453 … … 4451 4465 switch(approximation){ 4452 4466 case MacAyealApproximationEnum: 4453 GradjDragMacAyeal(gradient );4467 GradjDragMacAyeal(gradient,control_index); 4454 4468 break; 4455 4469 case PattynApproximationEnum: 4456 GradjDragPattyn(gradient );4470 GradjDragPattyn(gradient,control_index); 4457 4471 break; 4458 4472 case StokesApproximationEnum: 4459 GradjDragStokes(gradient );4473 GradjDragStokes(gradient,control_index); 4460 4474 break; 4461 4475 case NoneApproximationEnum: … … 4471 4485 switch(approximation){ 4472 4486 case MacAyealApproximationEnum: 4473 GradjBbarMacAyeal(gradient );4487 GradjBbarMacAyeal(gradient,control_index); 4474 4488 break; 4475 4489 case PattynApproximationEnum: 4476 GradjBbarPattyn(gradient );4490 GradjBbarPattyn(gradient,control_index); 4477 4491 break; 4478 4492 case StokesApproximationEnum: 4479 GradjBbarStokes(gradient );4493 GradjBbarStokes(gradient,control_index); 4480 4494 break; 4481 4495 case NoneApproximationEnum: … … 4510 4524 if (!IsOnBed()) return; 4511 4525 tria=(Tria*)SpawnTria(0,1,2); //nodes 0, 1 and 2 make the new tria. 4512 tria->GradjDragGradient(gradient,resp );4526 tria->GradjDragGradient(gradient,resp,control_index); 4513 4527 delete tria->matice; delete tria; 4514 4528 break; … … 4516 4530 if (!IsOnBed()) return; 4517 4531 tria=(Tria*)SpawnTria(0,1,2); //nodes 0, 1 and 2 make the new tria. 4518 tria->GradjBGradient(gradient,resp );4532 tria->GradjBGradient(gradient,resp,control_index); 4519 4533 delete tria->matice; delete tria; 4520 4534 break; … … 4526 4540 /*}}}*/ 4527 4541 /*FUNCTION Penta::GradjDragMacAyeal {{{1*/ 4528 void Penta::GradjDragMacAyeal(Vec gradient ){4542 void Penta::GradjDragMacAyeal(Vec gradient,int control_index){ 4529 4543 4530 4544 /*Gradient is 0 if on shelf or not on bed*/ … … 4533 4547 /*Spawn tria*/ 4534 4548 Tria* tria=(Tria*)SpawnTria(0,1,2); //nodes 0, 1 and 2 make the new tria. 4535 tria->GradjDragMacAyeal(gradient );4549 tria->GradjDragMacAyeal(gradient,control_index); 4536 4550 delete tria->matice; delete tria; 4537 4551 4538 4552 } /*}}}*/ 4539 4553 /*FUNCTION Penta::GradjDragPattyn {{{1*/ 4540 void Penta::GradjDragPattyn(Vec gradient ){4554 void Penta::GradjDragPattyn(Vec gradient,int control_index){ 4541 4555 4542 4556 int i,j,ig; … … 4559 4573 /*Retrieve all inputs and parameters*/ 4560 4574 parameters->FindParam(&analysis_type,AnalysisTypeEnum); 4575 GradientIndexing(&doflist1[0],control_index); 4561 4576 GetVerticesCoordinates(&xyz_list[0][0], nodes, NUMVERTICES); 4562 4577 for(i=0;i<NUMVERTICES2D;i++) for(j=0;j<2;j++) xyz_list_tria[i][j]=xyz_list[i][j]; 4563 GetDofList1(&doflist1[0]);4564 4578 Input* adjointx_input=inputs->GetInput(AdjointxEnum); _assert_(adjointx_input); 4565 4579 Input* adjointy_input=inputs->GetInput(AdjointyEnum); _assert_(adjointy_input); … … 4609 4623 /*}}}*/ 4610 4624 /*FUNCTION Penta::GradjDragStokes {{{1*/ 4611 void Penta::GradjDragStokes(Vec gradient ){4625 void Penta::GradjDragStokes(Vec gradient,int control_index){ 4612 4626 4613 4627 int i,j,ig; … … 4634 4648 GetVerticesCoordinates(&xyz_list[0][0], nodes, NUMVERTICES); 4635 4649 for(i=0;i<NUMVERTICES2D;i++) for(j=0;j<2;j++) xyz_list_tria[i][j]=xyz_list[i][j]; 4636 G etDofList1(&doflist1[0]);4650 GradientIndexing(&doflist1[0],control_index); 4637 4651 Input* drag_input =inputs->GetInput(FrictionCoefficientEnum); _assert_(drag_input); 4638 Input* vx_input =inputs->GetInput(VxEnum); _assert_(vx_input);4639 Input* vy_input =inputs->GetInput(VyEnum); _assert_(vy_input);4640 Input* vz_input =inputs->GetInput(VzEnum); _assert_(vz_input);4641 Input* adjointx_input=inputs->GetInput(AdjointxEnum); _assert_(adjointx_input);4642 Input* adjointy_input=inputs->GetInput(AdjointyEnum); _assert_(adjointy_input);4643 Input* adjointz_input=inputs->GetInput(AdjointzEnum); _assert_(adjointz_input);4652 Input* vx_input =inputs->GetInput(VxEnum); _assert_(vx_input); 4653 Input* vy_input =inputs->GetInput(VyEnum); _assert_(vy_input); 4654 Input* vz_input =inputs->GetInput(VzEnum); _assert_(vz_input); 4655 Input* adjointx_input=inputs->GetInput(AdjointxEnum); _assert_(adjointx_input); 4656 Input* adjointy_input=inputs->GetInput(AdjointyEnum); _assert_(adjointy_input); 4657 Input* adjointz_input=inputs->GetInput(AdjointzEnum); _assert_(adjointz_input); 4644 4658 4645 4659 /*Build frictoin element, needed later: */ … … 4701 4715 /*}}}*/ 4702 4716 /*FUNCTION Penta::GradjBbarMacAyeal {{{1*/ 4703 void Penta::GradjBbarMacAyeal(Vec gradient ){4717 void Penta::GradjBbarMacAyeal(Vec gradient,int control_index){ 4704 4718 4705 4719 /*This element should be collapsed into a tria element at its base*/ … … 4711 4725 /*Collapse element to the base*/ 4712 4726 Tria* tria=(Tria*)SpawnTria(0,1,2); //nodes 0, 1 and 2 make the new tria (lower face). 4713 tria->GradjBMacAyeal(gradient );4727 tria->GradjBMacAyeal(gradient,control_index); 4714 4728 delete tria->matice; delete tria; 4715 4729 … … 4719 4733 } /*}}}*/ 4720 4734 /*FUNCTION Penta::GradjBbarPattyn {{{1*/ 4721 void Penta::GradjBbarPattyn(Vec gradient ){4735 void Penta::GradjBbarPattyn(Vec gradient,int control_index){ 4722 4736 4723 4737 /*Gradient is computed on bed only (Bbar)*/ … … 4729 4743 /*Collapse element to the base*/ 4730 4744 Tria* tria=(Tria*)SpawnTria(0,1,2); 4731 tria->GradjBMacAyeal(gradient ); //We use MacAyeal as an estimate for now4745 tria->GradjBMacAyeal(gradient,control_index); //We use MacAyeal as an estimate for now 4732 4746 delete tria->matice; delete tria; 4733 4747 … … 4736 4750 } /*}}}*/ 4737 4751 /*FUNCTION Penta::GradjBbarStokes {{{1*/ 4738 void Penta::GradjBbarStokes(Vec gradient ){4752 void Penta::GradjBbarStokes(Vec gradient,int control_index){ 4739 4753 4740 4754 /*Gradient is computed on bed only (Bbar)*/ … … 4746 4760 /*Collapse element to the base*/ 4747 4761 Tria* tria=(Tria*)SpawnTria(0,1,2); 4748 tria->GradjBMacAyeal(gradient ); //We use MacAyeal as an estimate for now4762 tria->GradjBMacAyeal(gradient,control_index); //We use MacAyeal as an estimate for now 4749 4763 delete tria->matice; delete tria; 4750 4764 -
issm/trunk-jpl/src/c/objects/Elements/Penta.h
r11260 r11313 141 141 #ifdef _HAVE_CONTROL_ 142 142 double DragCoefficientAbsGradient(bool process_units,int weight_index); 143 void Gradj(Vec gradient,int control_type); 144 void GradjDragMacAyeal(Vec gradient); 145 void GradjDragPattyn(Vec gradient); 146 void GradjDragStokes(Vec gradient); 147 void GradjBbarMacAyeal(Vec gradient); 148 void GradjBbarPattyn(Vec gradient); 149 void GradjBbarStokes(Vec gradient); 150 void ControlInputGetGradient(Vec gradient,int enum_type); 143 void GradientIndexing(int* indexing,int control_index); 144 void Gradj(Vec gradient,int control_type,int control_index); 145 void GradjDragMacAyeal(Vec gradient,int control_index); 146 void GradjDragPattyn(Vec gradient,int control_index); 147 void GradjDragStokes(Vec gradient,int control_index); 148 void GradjBbarMacAyeal(Vec gradient,int control_index); 149 void GradjBbarPattyn(Vec gradient,int control_index); 150 void GradjBbarStokes(Vec gradient,int control_index); 151 void ControlInputGetGradient(Vec gradient,int enum_type,int control_index); 151 152 void ControlInputScaleGradient(int enum_type,double scale); 152 void ControlInputSetGradient(double* gradient,int enum_type );153 void ControlInputSetGradient(double* gradient,int enum_type,int control_index); 153 154 double RheologyBbarAbsGradient(bool process_units,int weight_index); 154 155 double ThicknessAbsMisfit( bool process_units,int weight_index); -
issm/trunk-jpl/src/c/objects/Elements/Tria.cpp
r11292 r11313 3266 3266 /*}}}*/ 3267 3267 /*FUNCTION Tria::ControlInputGetGradient{{{1*/ 3268 void Tria::ControlInputGetGradient(Vec gradient,int enum_type ){3268 void Tria::ControlInputGetGradient(Vec gradient,int enum_type,int control_index){ 3269 3269 3270 3270 int doflist1[NUMVERTICES]; … … 3280 3280 if (input->ObjectEnum()!=ControlInputEnum) _error_("Input %s is not a ControlInput",EnumToStringx(enum_type)); 3281 3281 3282 this->GetDofList1(&doflist1[0]);3282 GradientIndexing(&doflist1[0],control_index); 3283 3283 ((ControlInput*)input)->GetGradient(gradient,&doflist1[0]); 3284 3284 … … 3301 3301 }/*}}}*/ 3302 3302 /*FUNCTION Tria::ControlInputSetGradient{{{1*/ 3303 void Tria::ControlInputSetGradient(double* gradient,int enum_type ){3303 void Tria::ControlInputSetGradient(double* gradient,int enum_type,int control_index){ 3304 3304 3305 3305 int doflist1[NUMVERTICES]; … … 3317 3317 if (input->ObjectEnum()!=ControlInputEnum) _error_("Input %s is not a ControlInput",EnumToStringx(enum_type)); 3318 3318 3319 this->GetDofList1(&doflist1[0]);3319 GradientIndexing(&doflist1[0],control_index); 3320 3320 for(int i=0;i<NUMVERTICES;i++) grad_list[i]=gradient[doflist1[i]]; 3321 3321 grad_input=new TriaP1Input(GradientEnum,grad_list); … … 3325 3325 }/*}}}*/ 3326 3326 /*FUNCTION Tria::Gradj {{{1*/ 3327 void Tria::Gradj(Vec gradient,int control_type ){3327 void Tria::Gradj(Vec gradient,int control_type,int control_index){ 3328 3328 /*dJ/dalpha = ∂L/∂alpha = ∂J/∂alpha + ∂/∂alpha(KU-F)*/ 3329 3329 … … 3334 3334 switch(control_type){ 3335 3335 case FrictionCoefficientEnum: 3336 GradjDragMacAyeal(gradient );3336 GradjDragMacAyeal(gradient,control_index); 3337 3337 break; 3338 3338 case MaterialsRheologyBbarEnum: 3339 GradjBMacAyeal(gradient );3339 GradjBMacAyeal(gradient,control_index); 3340 3340 break; 3341 3341 case BalancethicknessThickeningRateEnum: 3342 GradjDhDtBalancedthickness(gradient );3342 GradjDhDtBalancedthickness(gradient,control_index); 3343 3343 break; 3344 3344 case VxEnum: 3345 GradjVxBalancedthickness(gradient );3345 GradjVxBalancedthickness(gradient,control_index); 3346 3346 break; 3347 3347 case VyEnum: 3348 GradjVyBalancedthickness(gradient );3348 GradjVyBalancedthickness(gradient,control_index); 3349 3349 break; 3350 3350 default: … … 3371 3371 break; 3372 3372 case DragCoefficientAbsGradientEnum: 3373 GradjDragGradient(gradient,resp );3373 GradjDragGradient(gradient,resp,control_index); 3374 3374 break; 3375 3375 case RheologyBbarAbsGradientEnum: 3376 GradjBGradient(gradient,resp );3376 GradjBGradient(gradient,resp,control_index); 3377 3377 break; 3378 3378 default: … … 3384 3384 /*}}}*/ 3385 3385 /*FUNCTION Tria::GradjBGradient{{{1*/ 3386 void Tria::GradjBGradient(Vec gradient, int weight_index){3386 void Tria::GradjBGradient(Vec gradient,int weight_index,int control_index){ 3387 3387 3388 3388 int i,ig; … … 3397 3397 /*Retrieve all inputs we will be needing: */ 3398 3398 GetVerticesCoordinates(&xyz_list[0][0], nodes, NUMVERTICES); 3399 G etDofList1(&doflist1[0]);3399 GradientIndexing(&doflist1[0],control_index); 3400 3400 Input* rheologyb_input=matice->inputs->GetInput(MaterialsRheologyBbarEnum); _assert_(rheologyb_input); 3401 3401 Input* weights_input=inputs->GetInput(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input); … … 3424 3424 /*}}}*/ 3425 3425 /*FUNCTION Tria::GradjBMacAyeal{{{1*/ 3426 void Tria::GradjBMacAyeal(Vec gradient ){3426 void Tria::GradjBMacAyeal(Vec gradient,int control_index){ 3427 3427 3428 3428 /*Intermediaries*/ … … 3439 3439 /* Get node coordinates and dof list: */ 3440 3440 GetVerticesCoordinates(&xyz_list[0][0], nodes, NUMVERTICES); 3441 G etDofList1(&doflist[0]);3441 GradientIndexing(&doflist[0],control_index); 3442 3442 3443 3443 /*Retrieve all inputs*/ 3444 Input* thickness_input=inputs->GetInput(ThicknessEnum); _assert_(thickness_input);3445 Input* vx_input=inputs->GetInput(VxEnum); _assert_(vx_input);3446 Input* vy_input=inputs->GetInput(VyEnum); _assert_(vy_input);3447 Input* adjointx_input=inputs->GetInput(AdjointxEnum); _assert_(adjointx_input);3448 Input* adjointy_input=inputs->GetInput(AdjointyEnum); _assert_(adjointy_input);3444 Input* thickness_input=inputs->GetInput(ThicknessEnum); _assert_(thickness_input); 3445 Input* vx_input=inputs->GetInput(VxEnum); _assert_(vx_input); 3446 Input* vy_input=inputs->GetInput(VyEnum); _assert_(vy_input); 3447 Input* adjointx_input=inputs->GetInput(AdjointxEnum); _assert_(adjointx_input); 3448 Input* adjointy_input=inputs->GetInput(AdjointyEnum); _assert_(adjointy_input); 3449 3449 Input* rheologyb_input=matice->inputs->GetInput(MaterialsRheologyBbarEnum); _assert_(rheologyb_input); 3450 3450 … … 3481 3481 /*}}}*/ 3482 3482 /*FUNCTION Tria::GradjDragMacAyeal {{{1*/ 3483 void Tria::GradjDragMacAyeal(Vec gradient ){3483 void Tria::GradjDragMacAyeal(Vec gradient,int control_index){ 3484 3484 3485 3485 int i,ig; … … 3502 3502 parameters->FindParam(&analysis_type,AnalysisTypeEnum); 3503 3503 GetVerticesCoordinates(&xyz_list[0][0], nodes, NUMVERTICES); 3504 G etDofList1(&doflist1[0]);3504 GradientIndexing(&doflist1[0],control_index); 3505 3505 3506 3506 /*Build frictoin element, needed later: */ … … 3508 3508 3509 3509 /*Retrieve all inputs we will be needing: */ 3510 Input* adjointx_input=inputs->GetInput(AdjointxEnum); _assert_(adjointx_input);3511 Input* adjointy_input=inputs->GetInput(AdjointyEnum); _assert_(adjointy_input);3512 Input* vx_input=inputs->GetInput(VxEnum); _assert_(vx_input);3513 Input* vy_input=inputs->GetInput(VyEnum); _assert_(vy_input);3510 Input* adjointx_input=inputs->GetInput(AdjointxEnum); _assert_(adjointx_input); 3511 Input* adjointy_input=inputs->GetInput(AdjointyEnum); _assert_(adjointy_input); 3512 Input* vx_input=inputs->GetInput(VxEnum); _assert_(vx_input); 3513 Input* vy_input=inputs->GetInput(VyEnum); _assert_(vy_input); 3514 3514 Input* dragcoefficient_input=inputs->GetInput(FrictionCoefficientEnum); _assert_(dragcoefficient_input); 3515 3515 … … 3568 3568 /*}}}*/ 3569 3569 /*FUNCTION Tria::GradjDragGradient{{{1*/ 3570 void Tria::GradjDragGradient(Vec gradient, int weight_index ){3570 void Tria::GradjDragGradient(Vec gradient, int weight_index,int control_index){ 3571 3571 3572 3572 int i,ig; … … 3582 3582 if(IsFloating())return; 3583 3583 GetVerticesCoordinates(&xyz_list[0][0], nodes, NUMVERTICES); 3584 G etDofList1(&doflist1[0]);3584 GradientIndexing(&doflist1[0],control_index); 3585 3585 Input* dragcoefficient_input=inputs->GetInput(FrictionCoefficientEnum); _assert_(dragcoefficient_input); 3586 3586 Input* weights_input=inputs->GetInput(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input); … … 3612 3612 /*}}}*/ 3613 3613 /*FUNCTION Tria::GradjDhDtBalancedthickness{{{1*/ 3614 void Tria::GradjDhDtBalancedthickness(Vec gradient ){3614 void Tria::GradjDhDtBalancedthickness(Vec gradient,int control_index){ 3615 3615 3616 3616 /*Intermediaries*/ … … 3619 3619 double gradient_g[NUMVERTICES]; 3620 3620 3621 GetDofList1(&doflist1[0]);3622 3623 3621 /*Compute Gradient*/ 3622 GradientIndexing(&doflist1[0],control_index); 3624 3623 GetInputListOnVertices(&lambda[0],AdjointEnum); 3625 3624 for(int i=0;i<NUMVERTICES;i++) gradient_g[i]=-lambda[i]; … … 3629 3628 /*}}}*/ 3630 3629 /*FUNCTION Tria::GradjVxBalancedthickness{{{1*/ 3631 void Tria::GradjVxBalancedthickness(Vec gradient ){3630 void Tria::GradjVxBalancedthickness(Vec gradient,int control_index){ 3632 3631 3633 3632 /*Intermediaries*/ … … 3643 3642 /* Get node coordinates and dof list: */ 3644 3643 GetVerticesCoordinates(&xyz_list[0][0], nodes, NUMVERTICES); 3645 G etDofList1(&doflist1[0]);3644 GradientIndexing(&doflist1[0],control_index); 3646 3645 3647 3646 /*Retrieve all inputs we will be needing: */ … … 3672 3671 /*}}}*/ 3673 3672 /*FUNCTION Tria::GradjVyBalancedthickness{{{1*/ 3674 void Tria::GradjVyBalancedthickness(Vec gradient ){3673 void Tria::GradjVyBalancedthickness(Vec gradient,int control_index){ 3675 3674 3676 3675 /*Intermediaries*/ … … 3686 3685 /* Get node coordinates and dof list: */ 3687 3686 GetVerticesCoordinates(&xyz_list[0][0], nodes, NUMVERTICES); 3688 G etDofList1(&doflist1[0]);3687 GradientIndexing(&doflist1[0],control_index); 3689 3688 3690 3689 /*Retrieve all inputs we will be needing: */ … … 3711 3710 /*Clean up and return*/ 3712 3711 delete gauss; 3712 } 3713 /*}}}*/ 3714 /*FUNCTION Tria::GradientIndexing{{{1*/ 3715 void Tria::GradientIndexing(int* indexing,int control_index){ 3716 3717 /*Get some parameters*/ 3718 int num_controls; 3719 parameters->FindParam(&num_controls,InversionNumControlParametersEnum); 3720 3721 /*get gradient indices*/ 3722 for(int i=0;i<NUMVERTICES;i++){ 3723 indexing[i]=num_controls*this->nodes[i]->GetVertexDof() + control_index; 3724 } 3725 3713 3726 } 3714 3727 /*}}}*/ … … 4225 4238 /*Clean up and return*/ 4226 4239 delete gauss; 4240 xfree((void**)&responses); 4227 4241 return pe; 4228 4242 } -
issm/trunk-jpl/src/c/objects/Elements/Tria.h
r11260 r11313 140 140 #ifdef _HAVE_CONTROL_ 141 141 double DragCoefficientAbsGradient(bool process_units,int weight_index); 142 void Gradj(Vec gradient,int control_type); 143 void GradjBGradient(Vec gradient,int weight_index); 144 void GradjBMacAyeal(Vec gradient); 145 void GradjDragMacAyeal(Vec gradient); 146 void GradjDragStokes(Vec gradient); 147 void GradjDragGradient(Vec gradient,int weight_index); 148 void GradjDhDtBalancedthickness(Vec gradient); 149 void GradjVxBalancedthickness(Vec gradient); 150 void GradjVyBalancedthickness(Vec gradient); 151 void ControlInputGetGradient(Vec gradient,int enum_type); 142 void GradientIndexing(int* indexing,int control_index); 143 void Gradj(Vec gradient,int control_type,int control_index); 144 void GradjBGradient(Vec gradient,int weight_index,int control_index); 145 void GradjBMacAyeal(Vec gradient,int control_index); 146 void GradjDragMacAyeal(Vec gradient,int control_index); 147 void GradjDragStokes(Vec gradient,int control_index); 148 void GradjDragGradient(Vec gradient,int weight_index,int control_index); 149 void GradjDhDtBalancedthickness(Vec gradient,int control_index); 150 void GradjVxBalancedthickness(Vec gradient,int control_index); 151 void GradjVyBalancedthickness(Vec gradient,int control_index); 152 void ControlInputGetGradient(Vec gradient,int enum_type,int control_index); 152 153 void ControlInputScaleGradient(int enum_type,double scale); 153 void ControlInputSetGradient(double* gradient,int enum_type );154 void ControlInputSetGradient(double* gradient,int enum_type,int control_index); 154 155 double RheologyBbarAbsGradient(bool process_units,int weight_index); 155 156 double ThicknessAbsMisfit( bool process_units,int weight_index); -
issm/trunk-jpl/src/c/solutions/controltao_core.cpp
r11310 r11313 85 85 adjointdiagnostic_core(user->femmodel); 86 86 //Gradjx(&gradient,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,MaterialsRheologyBbarEnum); 87 Gradjx(&gradient,NULL,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters ,0);87 Gradjx(&gradient,NULL,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters); 88 88 VecScale(gradient,-1.); 89 89 VecCopy(gradient,G); -
issm/trunk-jpl/src/c/solutions/gradient_core.cpp
r11310 r11313 14 14 15 15 void gradient_core(FemModel* femmodel,int step,bool orthogonalize){ 16 17 /*parameters: */18 bool control_steady;19 int num_controls;20 int *control_type = NULL;21 double *optscal_list = NULL;22 double optscal=1.e+100,norm_grad;23 16 24 17 /*Intermediaries*/ 25 Vec new_gradient=NULL; 26 Vec gradient=NULL; 27 Vec old_gradient=NULL; 18 double norm_inf; 19 double *norm_list = NULL; 20 Vec new_gradient = NULL; 21 Vec gradient = NULL; 22 Vec old_gradient = NULL; 28 23 29 /*retrieve parameters:*/ 30 femmodel->parameters->FindParam(&control_steady,ControlSteadyEnum); 31 femmodel->parameters->FindParam(&num_controls,InversionNumControlParametersEnum); 32 femmodel->parameters->FindParam(&control_type,NULL,InversionControlParametersEnum); 33 femmodel->parameters->FindParam(&optscal_list,NULL,NULL,InversionGradientScalingEnum); 24 /*Compute gradient*/ 25 _printf_(VerboseControl()," compute cost function gradient\n"); 26 Gradjx(&gradient,&norm_list,femmodel->elements,femmodel->nodes, femmodel->vertices,femmodel->loads, femmodel->materials,femmodel->parameters); 34 27 35 /*Compute and norm gradient of all controls*/ 36 for (int i=0;i<num_controls;i++){ 37 38 _printf_(VerboseControl()," compute gradient of J with respect to %s\n",EnumToStringx(control_type[i])); 39 Gradjx(&gradient,&norm_grad,femmodel->elements,femmodel->nodes, femmodel->vertices,femmodel->loads, femmodel->materials,femmodel->parameters,i); 40 41 if (orthogonalize){ 42 _printf_(VerboseControl()," orthogonalization\n"); 43 ControlInputGetGradientx(&old_gradient,femmodel->elements,femmodel->nodes, femmodel->vertices,femmodel->loads, femmodel->materials,femmodel->parameters,control_type[i]); 44 Orthx(&new_gradient,gradient,old_gradient); VecFree(&old_gradient); VecFree(&gradient); 45 } 46 else{ 47 new_gradient=gradient; 48 } 49 50 /*Get scaling factor of current control:*/ 51 VecNorm(new_gradient,NORM_INFINITY,&norm_grad); 52 if(norm_grad<=0) _error_("||∂J/∂α||∞ = 0 gradient norm of J with respect to %s is zero",EnumToStringx(control_type[i])); 53 if(isnan(norm_grad))_error_("||∂J/∂α||∞ = NaN gradient norm of J with respect to %s is NaN" ,EnumToStringx(control_type[i])); 54 optscal=min(optscal,optscal_list[num_controls*step+i]/norm_grad); 55 56 /*plug back into inputs: */ 57 ControlInputSetGradientx(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,control_type[i],new_gradient); 58 VecFree(&new_gradient); 28 if (orthogonalize){ 29 _printf_(VerboseControl()," orthogonalization\n"); 30 ControlInputGetGradientx(&old_gradient,femmodel->elements,femmodel->nodes, femmodel->vertices,femmodel->loads, femmodel->materials,femmodel->parameters); 31 Orthx(&new_gradient,gradient,old_gradient); VecFree(&old_gradient); VecFree(&gradient); 32 } 33 else{ 34 new_gradient=gradient; 59 35 } 60 36 37 /*Check that gradient is clean*/ 38 VecNorm(new_gradient,NORM_INFINITY,&norm_inf); 39 if(norm_inf<=0) _error_("||∂J/∂α||∞ = 0 gradient norm is zero"); 40 if(isnan(norm_inf))_error_("||∂J/∂α||∞ = NaN gradient norm is NaN"); 41 42 /*plug back into inputs: */ 43 ControlInputSetGradientx(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,new_gradient); 44 VecFree(&new_gradient); 45 61 46 /*Scale Gradients*/ 62 for (int i=0;i<num_controls;i++) ControlInputScaleGradientx(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,control_type[i],optscal);47 ControlInputScaleGradientx(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,norm_list,step); 63 48 64 49 /*Clean up and return*/ 65 xfree((void**)&control_type); 66 xfree((void**)&optscal_list); 50 xfree((void**)&norm_list); 67 51 } -
issm/trunk-jpl/src/m/solutions/control_core.m
r11306 r11313 50 50 eval(['femmodel=' adjointcore '(femmodel);']); 51 51 52 femmodel=gradient_core(femmodel,n ,search_scalar==0);52 femmodel=gradient_core(femmodel,n-1,search_scalar==0); 53 53 54 54 %Return gradient if asked -
issm/trunk-jpl/src/m/solutions/gradient_core.m
r11310 r11313 20 20 end 21 21 22 %recover parameters common to all solutions 23 num_controls=femmodel.parameters.InversionNumControlParameters; 24 control_type=femmodel.parameters.InversionControlParameters; 25 control_steady=femmodel.parameters.ControlSteady; 26 gradient_scaling_list=femmodel.parameters.InversionGradientScaling; 27 gradient_scaling=10^100; 22 issmprintf(VerboseControl,[' compute cost function gradient']); 23 [grad norm_list]=Gradj(femmodel.elements,femmodel.nodes,femmodel.vertices,femmodel.loads,femmodel.materials,femmodel.parameters); 28 24 29 for i=1:num_controls, 30 31 issmprintf(VerboseControl,[' compute gradient of J with respect to %s'],EnumToString(control_type(i))); 32 [grad norm_grad]=Gradj(femmodel.elements,femmodel.nodes,femmodel.vertices,femmodel.loads,femmodel.materials,femmodel.parameters,i-1); 33 34 if orthogonalize, 35 issmprintf(VerboseControl,'%s',[' orthogonalization']); 36 old_gradient=ControlInputGetGradient(femmodel.elements,femmodel.nodes, femmodel.vertices,femmodel.loads, femmodel.materials,femmodel.parameters,control_type(i)); 37 new_gradient=Orth(grad,old_gradient); 38 else 39 new_gradient=grad; 40 end 41 42 %Get scaling factor of current control: 43 norm_grad=norm(new_gradient,inf); 44 if(norm_grad<=0), error(['||∂J/∂α||∞ = 0 gradient norm of J with respect to ' EnumToString(control_type(i)) ' is zero']); end 45 if(isnan(norm_grad)), error(['||∂J/∂α||∞ = NaN gradient norm of J with respect to ' EnumToString(control_type(i)) ' is NaN' ]); end 46 gradient_scaling=min(gradient_scaling,gradient_scaling_list(step,i)/norm_grad); 47 48 %plug back into inputs: 49 [femmodel.elements,femmodel.nodes,femmodel.vertices,femmodel.loads,femmodel.materials,femmodel.parameters]=ControlInputSetGradient(femmodel.elements,femmodel.nodes, femmodel.vertices,femmodel.loads, femmodel.materials, femmodel.parameters,control_type(i),new_gradient); 50 25 if orthogonalize, 26 issmprintf(VerboseControl,'%s',[' orthogonalization']); 27 old_gradient=ControlInputGetGradient(femmodel.elements,femmodel.nodes, femmodel.vertices,femmodel.loads, femmodel.materials,femmodel.parameters); 28 new_gradient=Orth(grad,old_gradient); 29 else 30 new_gradient=grad; 51 31 end 52 32 33 %Check that gradient is clean 34 norm_grad=norm(new_gradient,inf); 35 if(norm_grad<=0), error(['||∂J/∂α||∞ = 0 gradient norm is zero']); end 36 if(isnan(norm_grad)), error(['||∂J/∂α||∞ = NaN gradient norm is NaN' ]); end 37 38 %plug back into inputs: 39 [femmodel.elements,femmodel.nodes,femmodel.vertices,femmodel.loads,femmodel.materials,femmodel.parameters]=ControlInputSetGradient(femmodel.elements,femmodel.nodes, femmodel.vertices,femmodel.loads, femmodel.materials, femmodel.parameters,new_gradient); 40 53 41 %Scale all gradients 54 for i=1:num_controls, 55 [femmodel.elements,femmodel.nodes,femmodel.vertices,femmodel.loads,femmodel.materials,femmodel.parameters]=ControlInputScaleGradient(femmodel.elements,femmodel.nodes, femmodel.vertices,femmodel.loads, femmodel.materials, femmodel.parameters,control_type(i),gradient_scaling); 56 end 42 [femmodel.elements,femmodel.nodes,femmodel.vertices,femmodel.loads,femmodel.materials,femmodel.parameters]=ControlInputScaleGradient(femmodel.elements,femmodel.nodes, femmodel.vertices,femmodel.loads, femmodel.materials, femmodel.parameters,norm_list,step); -
issm/trunk-jpl/src/mex/ControlInputGetGradient/ControlInputGetGradient.cpp
r8910 r11313 14 14 Materials *materials = NULL; 15 15 Parameters *parameters = NULL; 16 int control_type;17 16 Vec gradient = NULL; 18 17 … … 32 31 FetchMatlabData((DataSet**)&materials,MATERIALS); 33 32 FetchMatlabData(¶meters,PARAMETERS); 34 FetchMatlabData(&control_type,CONTROLTYPE);35 33 36 34 /*configure: */ … … 41 39 42 40 /*!core code:*/ 43 ControlInputGetGradientx(&gradient,elements, nodes,vertices,loads, materials,parameters ,control_type);41 ControlInputGetGradientx(&gradient,elements, nodes,vertices,loads, materials,parameters); 44 42 45 43 /*write output datasets: */ … … 61 59 { 62 60 _printf_(true,"\n"); 63 _printf_(true," usage: [gradient] = %s(elements,nodes,vertices,loads, materials,parameters ,control_type);\n",__FUNCT__);61 _printf_(true," usage: [gradient] = %s(elements,nodes,vertices,loads, materials,parameters);\n",__FUNCT__); 64 62 _printf_(true,"\n"); 65 63 } -
issm/trunk-jpl/src/mex/ControlInputGetGradient/ControlInputGetGradient.h
r6200 r11313 23 23 #define MATERIALS (mxArray*)prhs[4] 24 24 #define PARAMETERS (mxArray*)prhs[5] 25 #define CONTROLTYPE (mxArray*)prhs[6]26 25 27 26 /* serial output macros: */ … … 32 31 #define NLHS 1 33 32 #undef NRHS 34 #define NRHS 733 #define NRHS 6 35 34 36 35 #endif -
issm/trunk-jpl/src/mex/ControlInputScaleGradient/ControlInputScaleGradient.cpp
r8910 r11313 8 8 9 9 /*input datasets: */ 10 int step; 10 11 Elements *elements = NULL; 11 12 Nodes *nodes = NULL; … … 14 15 Materials *materials = NULL; 15 16 Parameters *parameters = NULL; 16 int control_type; 17 double scaling_factor; 17 double *norm_list = NULL; 18 18 19 19 /*Boot module: */ … … 30 30 FetchMatlabData((DataSet**)&materials,MATERIALSIN); 31 31 FetchMatlabData(¶meters,PARAMETERSIN); 32 FetchMatlabData(& control_type,CONTROLTYPE);33 FetchMatlabData(&s caling_factor,SCALE);32 FetchMatlabData(&norm_list,NULL,NULL,NORMLIST); 33 FetchMatlabData(&step,STEP); 34 34 35 35 /*configure: */ … … 39 39 40 40 /*call "x" code layer*/ 41 ControlInputScaleGradientx(elements,nodes,vertices,loads, materials,parameters, control_type,scaling_factor);41 ControlInputScaleGradientx(elements,nodes,vertices,loads, materials,parameters,norm_list,step); 42 42 43 43 /*write output datasets: */ … … 64 64 { 65 65 _printf_(true,"\n"); 66 _printf_(true," usage: [elements,nodes,vertices,loads,materials,parameters] = %s(elements,nodes,vertices,loads,materials, control_type,scaling_factor);\n",__FUNCT__);66 _printf_(true," usage: [elements,nodes,vertices,loads,materials,parameters] = %s(elements,nodes,vertices,loads,materials,norm_list,step);\n",__FUNCT__); 67 67 _printf_(true,"\n"); 68 68 } -
issm/trunk-jpl/src/mex/ControlInputScaleGradient/ControlInputScaleGradient.h
r6238 r11313 24 24 #define MATERIALSIN (mxArray*)prhs[4] 25 25 #define PARAMETERSIN (mxArray*)prhs[5] 26 #define CONTROLTYPE(mxArray*)prhs[6]27 #define S CALE(mxArray*)prhs[7]26 #define NORMLIST (mxArray*)prhs[6] 27 #define STEP (mxArray*)prhs[7] 28 28 29 29 /* serial output macros: */ -
issm/trunk-jpl/src/mex/ControlInputSetGradient/ControlInputSetGradient.cpp
r8910 r11313 14 14 Materials *materials = NULL; 15 15 Parameters *parameters = NULL; 16 int control_type;17 16 double *gradient = NULL; 18 17 … … 30 29 FetchMatlabData((DataSet**)&materials,MATERIALSIN); 31 30 FetchMatlabData(¶meters,PARAMETERSIN); 32 FetchMatlabData(&control_type,CONTROLTYPE);33 31 FetchMatlabData(&gradient,NULL,GRADIENT); 34 32 … … 39 37 40 38 /*call "x" code layer*/ 41 ControlInputSetGradientx(elements,nodes,vertices,loads, materials,parameters, control_type,gradient);39 ControlInputSetGradientx(elements,nodes,vertices,loads, materials,parameters,gradient); 42 40 43 41 /*write output datasets: */ … … 64 62 { 65 63 _printf_(true,"\n"); 66 _printf_(true," usage: [elements,nodes,vertices,loads,materials,parameters] = %s(elements,nodes,vertices,loads,materials, control_type,gradient);\n",__FUNCT__);64 _printf_(true," usage: [elements,nodes,vertices,loads,materials,parameters] = %s(elements,nodes,vertices,loads,materials,gradient);\n",__FUNCT__); 67 65 _printf_(true,"\n"); 68 66 } -
issm/trunk-jpl/src/mex/ControlInputSetGradient/ControlInputSetGradient.h
r6200 r11313 24 24 #define MATERIALSIN (mxArray*)prhs[4] 25 25 #define PARAMETERSIN (mxArray*)prhs[5] 26 #define CONTROLTYPE (mxArray*)prhs[6] 27 #define GRADIENT (mxArray*)prhs[7] 26 #define GRADIENT (mxArray*)prhs[6] 28 27 29 28 /* serial output macros: */ … … 39 38 #define NLHS 6 40 39 #undef NRHS 41 #define NRHS 840 #define NRHS 7 42 41 43 42 #endif -
issm/trunk-jpl/src/mex/Gradj/Gradj.cpp
r11310 r11313 8 8 9 9 /*input datasets: */ 10 int control_index ;11 double grad_norm;10 int control_index,num_controls; 11 double *norm_list = NULL; 12 12 Elements *elements = NULL; 13 13 Nodes *nodes = NULL; … … 33 33 FetchMatlabData((DataSet**)&materials,MATERIALS); 34 34 FetchMatlabData(¶meters,PARAMETERS); 35 FetchMatlabData(&control_index,CONTROLINDEX);35 parameters->FindParam(&num_controls,InversionNumControlParametersEnum); 36 36 37 37 /*configure: */ … … 41 41 42 42 /*!Call core code: */ 43 Gradjx(&gradient,& grad_norm,elements,nodes, vertices,loads, materials,parameters, control_index);43 Gradjx(&gradient,&norm_list,elements,nodes, vertices,loads, materials,parameters); 44 44 45 45 /*write output : */ 46 WriteMatlabData( GRADNORM,grad_norm);46 WriteMatlabData(NORMLIST,norm_list,num_controls,1); 47 47 WriteMatlabData(GRADG,gradient); 48 48 -
issm/trunk-jpl/src/mex/Gradj/Gradj.h
r11310 r11313 24 24 #define MATERIALS (mxArray*)prhs[4] 25 25 #define PARAMETERS (mxArray*)prhs[5] 26 #define CONTROLINDEX (mxArray*)prhs[6]27 26 28 27 /* serial output macros: */ 29 28 #define GRADG (mxArray**)&plhs[0] 30 #define GRADNORM(mxArray**)&plhs[1]29 #define NORMLIST (mxArray**)&plhs[1] 31 30 32 31 /* serial arg counts: */ … … 34 33 #define NLHS 2 35 34 #undef NRHS 36 #define NRHS 735 #define NRHS 6 37 36 38 37 #endif /* _GRADJ_H */
Note:
See TracChangeset
for help on using the changeset viewer.