Changeset 13699
- Timestamp:
- 10/16/12 12:04:31 (12 years ago)
- Location:
- issm/trunk-jpl/src/c
- Files:
-
- 5 deleted
- 13 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/Makefile.am
r13696 r13699 318 318 ./modules/ConstraintsStatex/ConstraintsStatex.h\ 319 319 ./modules/ConstraintsStatex/ConstraintsStateLocal.h\ 320 ./modules/Responsex/Responsex.h\321 ./modules/Responsex/Responsex.cpp\322 ./modules/RequestedOutputsx/RequestedOutputsx.h\323 ./modules/RequestedOutputsx/RequestedOutputsx.cpp\324 320 ./modules/RequestedDependentsx/RequestedDependentsx.h\ 325 321 ./modules/RequestedDependentsx/RequestedDependentsx.cpp\ … … 363 359 ./modules/InputUpdateFromDakotax/InputUpdateFromDakotax.h\ 364 360 ./modules/InputUpdateFromDakotax/InputUpdateFromDakotax.cpp\ 365 ./modules/DakotaResponsesx/DakotaResponsesx.h\366 ./modules/DakotaResponsesx/DakotaResponsesx.cpp\367 361 ./modules/InputUpdateFromVectorDakotax/InputUpdateFromVectorDakotax.h\ 368 362 ./modules/InputUpdateFromVectorDakotax/InputUpdateFromVectorDakotax.cpp\ … … 437 431 ./modules/ThicknessAbsMisfitx/ThicknessAbsMisfitx.h\ 438 432 ./modules/ThicknessAbsMisfitx/ThicknessAbsMisfitx.cpp\ 439 ./modules/CostFunctionx/CostFunctionx.h\440 ./modules/CostFunctionx/CostFunctionx.cpp\441 433 ./modules/Orthx/Orthx.h\ 442 434 ./modules/Orthx/Orthx.cpp\ … … 445 437 ./modules/DragCoefficientAbsGradientx/DragCoefficientAbsGradientx.cpp\ 446 438 ./modules/DragCoefficientAbsGradientx/DragCoefficientAbsGradientx.h\ 447 ./modules/ThicknessAbsGradientx/ThicknessAbsGradientx.cpp\448 ./modules/ThicknessAbsGradientx/ThicknessAbsGradientx.h\449 439 ./modules/ThicknessAlongGradientx/ThicknessAlongGradientx.cpp\ 450 440 ./modules/ThicknessAlongGradientx/ThicknessAlongGradientx.h\ -
issm/trunk-jpl/src/c/classes/FemModel.cpp
r13696 r13699 412 412 } 413 413 /*}}}*/ 414 void FemModel::Responsex(IssmDouble* responses,const char* response_descriptor,bool process_units,int weight_index){/*{{{*/ 415 416 417 int response_descriptor_enum; 418 419 response_descriptor_enum=StringToEnumx(response_descriptor); 420 this->Responsex(responses, response_descriptor_enum, process_units, weight_index); 421 422 } 423 /*}}}*/ 424 void FemModel::Responsex(IssmDouble* responses,int response_descriptor_enum,bool process_units,int weight_index){/*{{{*/ 425 426 427 switch (response_descriptor_enum){ 428 429 #ifdef _HAVE_RESPONSES_ 430 case IceVolumeEnum: IceVolumex( responses, elements,nodes, vertices, loads, materials, parameters,process_units); break; 431 case MinVelEnum: MinVelx( responses, elements,nodes, vertices, loads, materials, parameters,process_units); break; 432 case MaxVelEnum: MaxVelx( responses, elements,nodes, vertices, loads, materials, parameters,process_units); break; 433 case MinVxEnum: MinVxx( responses, elements,nodes, vertices, loads, materials, parameters,process_units); break; 434 case MaxVxEnum: MaxVxx( responses, elements,nodes, vertices, loads, materials, parameters,process_units); break; 435 case MaxAbsVxEnum: MaxAbsVxx( responses, elements,nodes, vertices, loads, materials, parameters,process_units); break; 436 case MinVyEnum: MinVyx( responses, elements,nodes, vertices, loads, materials, parameters,process_units); break; 437 case MaxVyEnum: MaxVyx( responses, elements,nodes, vertices, loads, materials, parameters,process_units); break; 438 case MaxAbsVyEnum: MaxAbsVyx( responses, elements,nodes, vertices, loads, materials, parameters,process_units); break; 439 case MinVzEnum: MinVzx( responses, elements,nodes, vertices, loads, materials, parameters,process_units); break; 440 case MaxVzEnum: MaxVzx( responses, elements,nodes, vertices, loads, materials, parameters,process_units); break; 441 case MaxAbsVzEnum: MaxAbsVzx( responses, elements,nodes, vertices, loads, materials, parameters,process_units); break; 442 case MassFluxEnum: MassFluxx( responses, elements,nodes, vertices, loads, materials, parameters,process_units); break; 443 case SurfaceAbsVelMisfitEnum: SurfaceAbsVelMisfitx( responses, elements,nodes, vertices, loads, materials, parameters,process_units,weight_index); break; 444 case SurfaceRelVelMisfitEnum: SurfaceRelVelMisfitx( responses, elements,nodes, vertices, loads, materials, parameters,process_units,weight_index); break; 445 case SurfaceLogVelMisfitEnum: SurfaceLogVelMisfitx( responses, elements,nodes, vertices, loads, materials, parameters,process_units,weight_index); break; 446 case SurfaceLogVxVyMisfitEnum: SurfaceLogVxVyMisfitx( responses, elements,nodes, vertices, loads, materials, parameters,process_units,weight_index); break; 447 case SurfaceAverageVelMisfitEnum:SurfaceAverageVelMisfitx( responses, elements,nodes, vertices, loads, materials, parameters,process_units,weight_index); break; 448 case ThicknessAbsMisfitEnum: ThicknessAbsMisfitx( responses, elements,nodes, vertices, loads, materials, parameters,process_units,weight_index); break; 449 case ThicknessAbsGradientEnum: this->ThicknessAbsGradientx( responses, process_units,weight_index); break; 450 case ThicknessAlongGradientEnum: ThicknessAlongGradientx( responses, elements,nodes, vertices, loads, materials, parameters,process_units,weight_index); break; 451 case ThicknessAcrossGradientEnum: ThicknessAcrossGradientx( responses, elements,nodes, vertices, loads, materials, parameters,process_units,weight_index); break; 452 case TotalSmbEnum: TotalSmbx( responses, elements,nodes, vertices, loads, materials, parameters,process_units); break; 453 case RheologyBbarAbsGradientEnum:RheologyBbarAbsGradientx( responses, elements,nodes, vertices, loads, materials, parameters,process_units,weight_index); break; 454 case DragCoefficientAbsGradientEnum:DragCoefficientAbsGradientx(responses, elements,nodes, vertices, loads, materials, parameters,process_units,weight_index); break; 455 case MaterialsRheologyBbarEnum:ElementResponsex(responses, elements,nodes, vertices, loads, materials, parameters,MaterialsRheologyBbarEnum,process_units); break; 456 case VelEnum:ElementResponsex(responses, elements,nodes, vertices, loads, materials, parameters,VelEnum,process_units); break; 457 case FrictionCoefficientEnum:NodalValuex(responses, FrictionCoefficientEnum,elements,nodes, vertices, loads, materials, parameters,process_units); break; 458 default: _error_("response descriptor \"" << EnumToStringx(response_descriptor_enum) << "\" not supported yet!"); break; 459 #else 460 default: _error_("ISSM was not compiled with responses capabilities, exiting!"); 461 #endif 462 } 463 464 } 465 /*}}}*/ 466 void FemModel::RequestedOutputsx(int* requested_outputs, int numoutputs){/*{{{*/ 467 468 469 int output_enum; 470 int step; 471 IssmDouble time; 472 IssmDouble output_value; 473 Element *element = NULL; 474 475 /*Get time and step*/ 476 parameters->FindParam(&step,StepEnum); 477 parameters->FindParam(&time,TimeEnum); 478 479 /*retrieve Inputs*/ 480 if(numoutputs){ 481 for(int i=0;i<numoutputs;i++){ 482 output_enum=requested_outputs[i]; 483 484 switch(output_enum){ 485 486 case IceVolumeEnum: 487 Responsex(&output_value,"IceVolume",false,0); 488 results->AddObject(new GenericExternalResult<double>(results->Size()+1,IceVolumeEnum,reCast<IssmPDouble>(output_value),step,time)); 489 break; 490 case TotalSmbEnum: 491 Responsex(&output_value,"TotalSmb",false,0); 492 results->AddObject(new GenericExternalResult<double>(results->Size()+1,TotalSmbEnum,reCast<IssmPDouble>(output_value),step,time)); 493 break; 494 case MaxVelEnum: 495 Responsex(&output_value,"MaxVel",false,0); 496 results->AddObject(new GenericExternalResult<double>(results->Size()+1,MaxVelEnum,reCast<IssmPDouble>(output_value),step,time)); 497 break; 498 default: 499 /*create this output in the element inputs, and then transfer to results:*/ 500 for(int j=0;j<elements->Size();j++){ 501 element=(Element*)elements->GetObjectByOffset(j); 502 element->RequestedOutput(output_enum,step,time); 503 } 504 break; 505 } 506 } 507 } 508 } 509 /*}}}*/ 510 #ifdef _HAVE_CONTROL_ 511 void FemModel::ThicknessAbsGradientx( IssmDouble* pJ, bool process_units, int weight_index){/*{{{*/ 512 513 514 /*Intermediary*/ 515 int i; 516 Element* element=NULL; 517 518 /*output: */ 519 IssmDouble J=0; 520 IssmDouble J_sum; 521 522 /*Compute Misfit: */ 523 for (i=0;i<elements->Size();i++){ 524 element=(Element*)elements->GetObjectByOffset(i); 525 J+=element->ThicknessAbsGradient(process_units,weight_index); 526 } 527 528 /*Sum all J from all cpus of the cluster:*/ 529 #ifdef _HAVE_MPI_ 530 MPI_Reduce (&J,&J_sum,1,MPI_DOUBLE,MPI_SUM,0,IssmComm::GetComm() ); 531 MPI_Bcast(&J_sum,1,MPI_DOUBLE,0,IssmComm::GetComm()); 532 J=J_sum; 533 #endif 534 535 /*Assign output pointers: */ 536 *pJ=J; 537 } 538 /*}}}*/ 539 #endif 540 541 #ifdef _HAVE_DAKOTA_ 542 void FemModel::CostFunctionx(IssmDouble* pJ){/*{{{*/ 543 544 545 /*Intermediary*/ 546 int i; 547 int num_responses; 548 Element *element = NULL; 549 int *responses = NULL; 550 551 /*output: */ 552 IssmDouble J,Jplus; 553 554 /*Recover parameters*/ 555 parameters->FindParam(&num_responses,InversionNumCostFunctionsEnum); 556 parameters->FindParam(&responses,NULL,NULL,StepResponsesEnum); 557 558 /*Get response*/ 559 J=0; 560 for(int i=0;i<num_responses;i++){ 561 this->Responsex(&Jplus,EnumToStringx(responses[i]),false,i); //False means DO NOT process units 562 J+=Jplus; 563 } 564 565 /*Assign output pointers: */ 566 xDelete<int>(responses); 567 *pJ=J; 568 } 569 /*}}}*/ 570 void FemModel::DakotaResponsesx(double* d_responses,char** responses_descriptors,int numresponsedescriptors,int d_numresponses){/*{{{*/ 571 572 573 int i,j,k; 574 int my_rank; 575 bool process_units = true; 576 577 /*intermediary: */ 578 char root[50]; 579 int index; 580 int npart; 581 double femmodel_response; 582 int flag; 583 double *vertex_response = NULL; 584 double *qmu_response = NULL; 585 double *responses_pointer = NULL; 586 587 /*retrieve npart: */ 588 parameters->FindParam(&npart,QmuNumberofpartitionsEnum); 589 my_rank=IssmComm::GetRank(); 590 591 /*save the d_responses pointer: */ 592 responses_pointer=d_responses; 593 594 //watch out, we have more d_numresponses than numresponsedescriptors, because the responses have been expanded if they were scaled. 595 //because we don't know the d_responses descriptors (the scaled ones) we can't key off them, so we will key off the responses_descriptors: */ 596 597 for(i=0;i<numresponsedescriptors;i++){ 598 599 flag=DescriptorIndex(root,&index,responses_descriptors[i]); 600 601 if(flag==ScaledEnum){ 602 603 /*this response was scaled. pick up the response from the inputs: */ 604 GetVectorFromInputsx(&vertex_response,elements,nodes, vertices, loads, materials, parameters, StringToEnumx(root),VertexEnum); 605 606 /*Now, average it onto the partition nodes: */ 607 AverageOntoPartitionx(&qmu_response,elements,nodes,vertices,loads,materials,parameters,vertex_response); 608 609 /*Copy onto our dakota responses: */ 610 if(my_rank==0){ 611 /*plug response: */ 612 for(i=0;i<npart;i++)responses_pointer[i]=qmu_response[i]; 613 614 /*increment response_pointer :*/ 615 responses_pointer+=npart; 616 } 617 618 /*Free ressources:*/ 619 xDelete<double>(vertex_response); 620 xDelete<double>(qmu_response); 621 622 } 623 else if (flag==IndexedEnum){ 624 625 /*indexed response: plug index into parameters and call response module: */ 626 parameters->SetParam(index,IndexEnum); 627 628 this->Responsex(&femmodel_response,root,process_units,0);//0 is the index for weights 629 630 if(my_rank==0){ 631 /*plug response: */ 632 responses_pointer[0]=femmodel_response; 633 634 /*increment response_pointer :*/ 635 responses_pointer++; 636 } 637 } 638 else if (flag==NodalEnum){ 639 _error_("nodal response functions not supported yet!"); 640 641 /*increment response_pointer :*/ 642 responses_pointer++; 643 } 644 else if (flag==RegularEnum){ 645 646 /*perfectly normal response function: */ 647 this->Responsex(&femmodel_response,root,process_units,0);//0 is the weight index 648 649 if(my_rank==0){ 650 /*plug response: */ 651 responses_pointer[0]=femmodel_response; 652 653 /*increment response_pointer :*/ 654 responses_pointer++; 655 } 656 } 657 else _error_("flag type " << flag << " not supported yet for response analysis"); 658 } 659 660 /*Synthesize echo: {{{*/ 661 if(my_rank==0){ 662 _printString_(" responses: " << d_numresponses << ": "); 663 for(i=0;i<d_numresponses-1;i++)_printString_(d_responses[i] << "|"); 664 _printString_(d_responses[d_numresponses-1]); 665 _printLine_(""); 666 } 667 /*}}}*/ 668 669 } 670 /*}}}*/ 671 #endif -
issm/trunk-jpl/src/c/classes/FemModel.h
r13696 r13699 63 63 /*}}}*/ 64 64 /*Modules: {{{*/ 65 int UpdateVertexPositionsx(void); 65 #ifdef _HAVE_DAKOTA_ 66 void CostFunctionx( IssmDouble* pJ); 67 void DakotaResponsesx(double* d_responses,char** responses_descriptors,int numresponsedescriptors,int d_numresponses); 68 #endif 69 70 void RequestedOutputsx(int* requested_outputs, int numoutputs); 71 void Responsex(IssmDouble* presponse,int response_descriptor_enum,bool process_units,int weight_index); 72 void Responsex(IssmDouble* presponse,const char* response_descriptor,bool process_units,int weight_index); 73 #ifdef _HAVE_CONTROL_ 74 void ThicknessAbsGradientx( IssmDouble* pJ, bool process_units,int weight_index); 75 #endif 76 void TimeAdaptx(IssmDouble* pdt); 66 77 void UpdateConstraintsx(void); 67 void TimeAdaptx(IssmDouble* pdt); 78 int UpdateVertexPositionsx(void); 79 80 68 81 /*}}}*/ 69 82 -
issm/trunk-jpl/src/c/classes/objects/DependentObject.cpp
r13622 r13699 16 16 #include "../../Container/Container.h" 17 17 #include "../../include/include.h" 18 #include "../../modules/Responsex/Responsex.h"19 18 20 19 /*DependentObject constructors and destructor*/ … … 92 91 /*}}}*/ 93 92 /*FUNCTION DependentObject::Responsex{{{*/ 94 void DependentObject::Responsex(IssmDouble* poutput_value, Elements* elements,Nodes* nodes,Vertices* vertices,Loads* loads,Materials* materials,Parameters* parameters){93 void DependentObject::Responsex(IssmDouble* poutput_value,FemModel* femmodel){ 95 94 96 95 if(this->name==MassFluxEnum){ 97 96 98 97 /*to identify the mass flux that will be computed, we need the index of the profile: */ 99 parameters->SetParam(this->index,IndexEnum);98 femmodel->parameters->SetParam(this->index,IndexEnum); 100 99 } 101 100 102 ::Responsex(poutput_value,elements,nodes,vertices,loads,materials,parameters,this->name,false,0);101 femmodel->Responsex(poutput_value,this->name,false,0); 103 102 104 103 } -
issm/trunk-jpl/src/c/classes/objects/DependentObject.h
r13623 r13699 17 17 class Materials; 18 18 class Parameters; 19 class FemModel; 19 20 20 21 class DependentObject: public Object{ … … 41 42 /*DependentObject methods: */ 42 43 int NumDependents(void); 43 void Responsex(IssmDouble* poutput_value, Elements* elements,Nodes* nodes,Vertices* vertices,Loads* loads,Materials* materials,Parameters* parameters);44 void Responsex(IssmDouble* poutput_value,FemModel* femmodel); 44 45 45 46 }; -
issm/trunk-jpl/src/c/modules/modules.h
r13696 r13699 21 21 #include "./ControlInputSetGradientx/ControlInputSetGradientx.h" 22 22 #include "./ControlInputScaleGradientx/ControlInputScaleGradientx.h" 23 #include "./CostFunctionx/CostFunctionx.h"24 23 #include "./CreateNodalConstraintsx/CreateNodalConstraintsx.h" 25 #include "./DakotaResponsesx/DakotaResponsesx.h"26 24 #include "./Delta18oParameterizationx/Delta18oParameterizationx.h" 27 25 #include "./DragCoefficientAbsGradientx/DragCoefficientAbsGradientx.h" … … 100 98 #include "./Reducevectorgtosx/Reducevectorgtosx.h" 101 99 #include "./Reducevectorgtofx/Reducevectorgtofx.h" 102 #include "./RequestedOutputsx/RequestedOutputsx.h"103 100 #include "./RequestedDependentsx/RequestedDependentsx.h" 104 101 #include "./ResetConstraintsx/ResetConstraintsx.h" 105 102 #include "./ResetCoordinateSystemx/ResetCoordinateSystemx.h" 106 #include "./Responsex/Responsex.h"107 103 #include "./RheologyBbarAbsGradientx/RheologyBbarAbsGradientx.h" 108 104 #include "./Scotchx/Scotchx.h" … … 117 113 #include "./TriMeshProcessRiftsx/TriMeshProcessRiftsx.h" 118 114 #include "./ThicknessAbsMisfitx/ThicknessAbsMisfitx.h" 119 #include "./ThicknessAbsGradientx/ThicknessAbsGradientx.h"120 115 #include "./ThicknessAlongGradientx/ThicknessAlongGradientx.h" 121 116 #include "./ThicknessAcrossGradientx/ThicknessAcrossGradientx.h" -
issm/trunk-jpl/src/c/solutions/DakotaSpawnCore.cpp
r13621 r13699 86 86 /*compute responses: */ 87 87 if(VerboseQmu()) _pprintLine_("compute dakota responses:"); 88 DakotaResponsesx(d_responses,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,responses_descriptors,numresponsedescriptors,d_numresponses);88 femmodel->DakotaResponsesx(d_responses,responses_descriptors,numresponsedescriptors,d_numresponses); 89 89 90 90 /*Free ressources:*/ -
issm/trunk-jpl/src/c/solutions/controltao_core.cpp
r13608 r13699 141 141 142 142 /*Compute objective function*/ 143 CostFunctionx(fcn,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters);143 femmodel->CostFunctionx(fcn); 144 144 145 145 /*Compute gradient*/ -
issm/trunk-jpl/src/c/solutions/diagnostic_core.cpp
r13622 r13699 102 102 InputToResultx(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,PressureEnum); 103 103 if(dim==3) InputToResultx(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,VzEnum); 104 RequestedOutputsx(femmodel->results,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,requested_outputs,numoutputs);104 femmodel->RequestedOutputsx(requested_outputs,numoutputs); 105 105 } 106 106 -
issm/trunk-jpl/src/c/solutions/objectivefunction.cpp
r13621 r13699 70 70 71 71 /*Compute misfit for this velocity field.*/ 72 CostFunctionx(&J, femmodel->elements,femmodel->nodes, femmodel->vertices,femmodel->loads, femmodel->materials, femmodel->parameters);72 femmodel->CostFunctionx(&J); 73 73 74 74 /*Free ressources:*/ -
issm/trunk-jpl/src/c/solutions/prognostic_core.cpp
r13621 r13699 51 51 if(VerboseSolution()) _pprintLine_(" saving results"); 52 52 InputToResultx(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,ThicknessEnum); 53 RequestedOutputsx(femmodel->results,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,requested_outputs,numoutputs);53 femmodel->RequestedOutputsx(requested_outputs,numoutputs); 54 54 } 55 55 -
issm/trunk-jpl/src/c/solutions/steadystate_core.cpp
r13621 r13699 89 89 if(isenthalpy) InputToResultx(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,EnthalpyEnum); 90 90 if(!isenthalpy) InputToResultx(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,BasalforcingsMeltingRateEnum); 91 RequestedOutputsx(femmodel->results,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,requested_outputs,numoutputs);91 femmodel->RequestedOutputsx(requested_outputs,numoutputs); 92 92 } 93 93 -
issm/trunk-jpl/src/c/solutions/transient_core.cpp
r13696 r13699 140 140 InputToResultx(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,SurfaceforcingsMassBalanceEnum); 141 141 InputToResultx(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,MaskElementonfloatingiceEnum); 142 RequestedOutputsx(femmodel->results,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,requested_outputs,numoutputs);142 femmodel->RequestedOutputsx(requested_outputs,numoutputs); 143 143 144 144 if(isdelta18o){
Note:
See TracChangeset
for help on using the changeset viewer.