Changeset 16275
- Timestamp:
- 09/30/13 20:08:04 (11 years ago)
- Location:
- issm/trunk-jpl/src/c
- Files:
-
- 10 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/classes/Elements/Element.h
r16272 r16275 96 96 virtual void ElementResponse(IssmDouble* presponse,int response_enum)=0; 97 97 virtual IssmDouble IceVolume(void)=0; 98 virtual IssmDouble IceVolumeAboveFloatation(void)=0; 98 99 virtual IssmDouble TotalSmb(void)=0; 99 100 #endif -
issm/trunk-jpl/src/c/classes/Elements/Penta.cpp
r16272 r16275 3684 3684 } 3685 3685 /*}}}*/ 3686 /*FUNCTION Penta::IceVolumeAboveFloatation {{{*/ 3687 IssmDouble Penta::IceVolumeAboveFloatation(void){ 3688 3689 /*Volume above floatation: H + rho_water/rho_ice*bathymetry for nodes on the bed*/ 3690 IssmDouble rho_ice,rho_water; 3691 IssmDouble base,bed,surface,bathymetry; 3692 IssmDouble xyz_list[NUMVERTICES][3]; 3693 3694 if(NoIceInElement() || IsFloating() || !IsOnBed())return 0; 3695 3696 rho_ice=matpar->GetRhoIce(); 3697 rho_water=matpar->GetRhoWater(); 3698 GetVerticesCoordinates(&xyz_list[0][0],vertices,NUMVERTICES); 3699 3700 /*First calculate the area of the base (cross section triangle) 3701 * http://en.wikipedia.org/wiki/Pentangle 3702 * base = 1/2 abs((xA-xC)(yB-yA)-(xA-xB)(yC-yA))*/ 3703 base = 1./2.*fabs((xyz_list[0][0]-xyz_list[2][0])*(xyz_list[1][1]-xyz_list[0][1]) - (xyz_list[0][0]-xyz_list[1][0])*(xyz_list[2][1]-xyz_list[0][1])); 3704 3705 /*Now get the average height above floatation*/ 3706 Input* surface_input = inputs->GetInput(SurfaceEnum); _assert_(surface_input); 3707 Input* bed_input = inputs->GetInput(BedEnum); _assert_(bed_input); 3708 Input* bathymetry_input = inputs->GetInput(BathymetryEnum); _assert_(bathymetry_input); 3709 surface_input->GetInputAverage(&surface); 3710 bed_input->GetInputAverage(&bed); 3711 bathymetry_input->GetInputAverage(&bathymetry); 3712 3713 /*Return: */ 3714 return base*(surface - bed + rho_water/rho_ice * bathymetry); 3715 } 3716 /*}}}*/ 3686 3717 /*FUNCTION Penta::MinVel{{{*/ 3687 3718 void Penta::MinVel(IssmDouble* pminvel){ … … 4849 4880 IssmDouble B_average,s_average; 4850 4881 int *doflist = NULL; 4851 //IssmDouble pressure[numdof];4882 IssmDouble pressure[numdof]; 4852 4883 4853 4884 /*Get dof list: */ … … 4857 4888 for(i=0;i<numdof;i++){ 4858 4889 values[i]=solution[doflist[i]]; 4859 //GetInputListOnVertices(&pressure[0],PressureEnum);4860 //if(values[i]>matpar->TMeltingPoint(pressure[i])) values[i]=matpar->TMeltingPoint(pressure[i]);4861 //if(values[i]<matpar->TMeltingPoint(pressure[i])-50) values[i]=matpar->TMeltingPoint(pressure[i])-50;4890 GetInputListOnVertices(&pressure[0],PressureEnum); 4891 if(values[i]>matpar->TMeltingPoint(pressure[i])) values[i]=matpar->TMeltingPoint(pressure[i]); 4892 if(values[i]<matpar->TMeltingPoint(pressure[i])-50) values[i]=matpar->TMeltingPoint(pressure[i])-50; 4862 4893 4863 4894 /*Check solution*/ -
issm/trunk-jpl/src/c/classes/Elements/Penta.h
r16272 r16275 115 115 void AverageOntoPartition(Vector<IssmDouble>* partition_contributions,Vector<IssmDouble>* partition_areas,IssmDouble* vertex_response,IssmDouble* qmu_part); 116 116 IssmDouble IceVolume(void); 117 IssmDouble IceVolumeAboveFloatation(void); 117 118 IssmDouble TotalSmb(void); 118 119 void MinVel(IssmDouble* pminvel); -
issm/trunk-jpl/src/c/classes/Elements/Tria.cpp
r16256 r16275 2537 2537 /*Return: */ 2538 2538 return base*(surface-bed); 2539 } 2540 /*}}}*/ 2541 /*FUNCTION Tria::IceVolumeAboveFloatation {{{*/ 2542 IssmDouble Tria::IceVolumeAboveFloatation(void){ 2543 2544 /*The volume above floatation: H + rho_water/rho_ice * bathymetry */ 2545 IssmDouble rho_ice,rho_water; 2546 IssmDouble base,surface,bed,bathymetry; 2547 IssmDouble xyz_list[NUMVERTICES][3]; 2548 2549 if(NoIceInElement() || IsFloating())return 0; 2550 2551 rho_ice=matpar->GetRhoIce(); 2552 rho_water=matpar->GetRhoWater(); 2553 GetVerticesCoordinates(&xyz_list[0][0],vertices,NUMVERTICES); 2554 2555 /*First calculate the area of the base (cross section triangle) 2556 * http://en.wikipedia.org/wiki/Triangle 2557 * base = 1/2 abs((xA-xC)(yB-yA)-(xA-xB)(yC-yA))*/ 2558 base = 1./2. * fabs((xyz_list[0][0]-xyz_list[2][0])*(xyz_list[1][1]-xyz_list[0][1]) - (xyz_list[0][0]-xyz_list[1][0])*(xyz_list[2][1]-xyz_list[0][1])); 2559 2560 /*Now get the average height and bathymetry*/ 2561 Input* surface_input = inputs->GetInput(SurfaceEnum); _assert_(surface_input); 2562 Input* bed_input = inputs->GetInput(BedEnum); _assert_(bed_input); 2563 Input* bathymetry_input = inputs->GetInput(BathymetryEnum); _assert_(bathymetry_input); 2564 surface_input->GetInputAverage(&surface); 2565 bed_input->GetInputAverage(&bed); 2566 bathymetry_input->GetInputAverage(&bathymetry); 2567 2568 /*Return: */ 2569 return base*(surface-bed+rho_water/rho_ice*bathymetry); 2539 2570 } 2540 2571 /*}}}*/ -
issm/trunk-jpl/src/c/classes/Elements/Tria.h
r16272 r16275 112 112 void AverageOntoPartition(Vector<IssmDouble>* partition_contributions,Vector<IssmDouble>* partition_areas,IssmDouble* vertex_response,IssmDouble* qmu_part); 113 113 IssmDouble IceVolume(void); 114 IssmDouble IceVolumeAboveFloatation(void); 114 115 IssmDouble TotalSmb(void); 115 116 void MinVel(IssmDouble* pminvel); -
issm/trunk-jpl/src/c/classes/FemModel.cpp
r16272 r16275 430 430 431 431 #ifdef _HAVE_RESPONSES_ 432 case IceVolumeEnum: this->IceVolumex(responses); break; 433 case MinVelEnum: this->MinVelx(responses); break; 434 case MaxVelEnum: this->MaxVelx( responses); break; 435 case MinVxEnum: this->MinVxx(responses); break; 436 case MaxVxEnum: this->MaxVxx( responses); break; 437 case MaxAbsVxEnum: this->MaxAbsVxx( responses); break; 438 case MinVyEnum: this->MinVyx(responses); break; 439 case MaxVyEnum: this->MaxVyx( responses); break; 440 case MaxAbsVyEnum: this->MaxAbsVyx( responses); break; 441 case MinVzEnum: this->MinVzx(responses); break; 442 case MaxVzEnum: this->MaxVzx( responses); break; 443 case MaxAbsVzEnum: this->MaxAbsVzx( responses); break; 444 case MassFluxEnum: this->MassFluxx( responses); break; 432 case IceVolumeEnum: this->IceVolumex(responses); break; 433 case IceVolumeAboveFloatationEnum: this->IceVolumeAboveFloatationx(responses); break; 434 case MinVelEnum: this->MinVelx(responses); break; 435 case MaxVelEnum: this->MaxVelx( responses); break; 436 case MinVxEnum: this->MinVxx(responses); break; 437 case MaxVxEnum: this->MaxVxx( responses); break; 438 case MaxAbsVxEnum: this->MaxAbsVxx( responses); break; 439 case MinVyEnum: this->MinVyx(responses); break; 440 case MaxVyEnum: this->MaxVyx( responses); break; 441 case MaxAbsVyEnum: this->MaxAbsVyx( responses); break; 442 case MinVzEnum: this->MinVzx(responses); break; 443 case MaxVzEnum: this->MaxVzx( responses); break; 444 case MaxAbsVzEnum: this->MaxAbsVzx( responses); break; 445 case MassFluxEnum: this->MassFluxx( responses); break; 445 446 #ifdef _HAVE_CONTROL_ 446 case SurfaceAbsVelMisfitEnum: SurfaceAbsVelMisfitx(responses, elements,nodes, vertices, loads, materials, parameters,weight_index); break;447 case SurfaceRelVelMisfitEnum: SurfaceRelVelMisfitx(responses, elements,nodes, vertices, loads, materials, parameters,weight_index); break;448 case SurfaceLogVelMisfitEnum: SurfaceLogVelMisfitx(responses, elements,nodes, vertices, loads, materials, parameters,weight_index); break;449 case SurfaceLogVxVyMisfitEnum: SurfaceLogVxVyMisfitx(responses, elements,nodes, vertices, loads, materials, parameters,weight_index); break;450 case SurfaceAverageVelMisfitEnum: SurfaceAverageVelMisfitx(responses,this,weight_index); break;451 case ThicknessAbsMisfitEnum: ThicknessAbsMisfitx(responses, elements,nodes, vertices, loads, materials, parameters,weight_index); break;452 case ThicknessAbsGradientEnum: this->ThicknessAbsGradientx(responses,weight_index); break;453 case ThicknessAlongGradientEnum: ThicknessAlongGradientx(responses, elements,nodes, vertices, loads, materials, parameters,weight_index); break;454 case ThicknessAcrossGradientEnum: ThicknessAcrossGradientx(responses, elements,nodes, vertices, loads, materials, parameters,weight_index); break;455 case RheologyBbarAbsGradientEnum: RheologyBbarAbsGradientx(responses, elements,nodes, vertices, loads, materials, parameters,weight_index); break;447 case SurfaceAbsVelMisfitEnum: SurfaceAbsVelMisfitx(responses, elements,nodes, vertices, loads, materials, parameters,weight_index); break; 448 case SurfaceRelVelMisfitEnum: SurfaceRelVelMisfitx(responses, elements,nodes, vertices, loads, materials, parameters,weight_index); break; 449 case SurfaceLogVelMisfitEnum: SurfaceLogVelMisfitx(responses, elements,nodes, vertices, loads, materials, parameters,weight_index); break; 450 case SurfaceLogVxVyMisfitEnum: SurfaceLogVxVyMisfitx(responses, elements,nodes, vertices, loads, materials, parameters,weight_index); break; 451 case SurfaceAverageVelMisfitEnum: SurfaceAverageVelMisfitx(responses,this,weight_index); break; 452 case ThicknessAbsMisfitEnum: ThicknessAbsMisfitx(responses, elements,nodes, vertices, loads, materials, parameters,weight_index); break; 453 case ThicknessAbsGradientEnum: this->ThicknessAbsGradientx(responses,weight_index); break; 454 case ThicknessAlongGradientEnum: ThicknessAlongGradientx(responses, elements,nodes, vertices, loads, materials, parameters,weight_index); break; 455 case ThicknessAcrossGradientEnum: ThicknessAcrossGradientx(responses, elements,nodes, vertices, loads, materials, parameters,weight_index); break; 456 case RheologyBbarAbsGradientEnum: RheologyBbarAbsGradientx(responses, elements,nodes, vertices, loads, materials, parameters,weight_index); break; 456 457 case DragCoefficientAbsGradientEnum:DragCoefficientAbsGradientx(responses, elements,nodes, vertices, loads, materials, parameters,weight_index); break; 457 case BalancethicknessMisfitEnum: BalancethicknessMisfitx(responses,weight_index); break;458 case BalancethicknessMisfitEnum: BalancethicknessMisfitx(responses,weight_index); break; 458 459 #endif 459 case TotalSmbEnum: this->TotalSmbx(responses); break;460 case MaterialsRheologyBbarEnum: this->ElementResponsex(responses,MaterialsRheologyBbarEnum); break;461 case VelEnum: this->ElementResponsex(responses,VelEnum); break;462 case FrictionCoefficientEnum: NodalValuex(responses, FrictionCoefficientEnum,elements,nodes, vertices, loads, materials, parameters); break;460 case TotalSmbEnum: this->TotalSmbx(responses); break; 461 case MaterialsRheologyBbarEnum: this->ElementResponsex(responses,MaterialsRheologyBbarEnum); break; 462 case VelEnum: this->ElementResponsex(responses,VelEnum); break; 463 case FrictionCoefficientEnum: NodalValuex(responses, FrictionCoefficientEnum,elements,nodes, vertices, loads, materials, parameters); break; 463 464 default: _error_("response descriptor \"" << EnumToStringx(response_descriptor_enum) << "\" not supported yet!"); break; 464 465 #else … … 491 492 Responsex(&output_value,"IceVolume",0); 492 493 results->AddObject(new GenericExternalResult<double>(results->Size()+1,IceVolumeEnum,reCast<IssmPDouble>(output_value),step,time)); 494 break; 495 case IceVolumeAboveFloatationEnum: 496 Responsex(&output_value,"IceVolumeAboveFloatation",0); 497 results->AddObject(new GenericExternalResult<double>(results->Size()+1,IceVolumeAboveFloatationEnum,reCast<IssmPDouble>(output_value),step,time)); 493 498 break; 494 499 case TotalSmbEnum: … … 934 939 935 940 }/*}}}*/ 941 void FemModel::IceVolumeAboveFloatationx(IssmDouble* pV){/*{{{*/ 942 943 IssmDouble local_ice_volume_af = 0; 944 IssmDouble total_ice_volume_af; 945 946 for(int i=0;i<this->elements->Size();i++){ 947 Element* element=dynamic_cast<Element*>(this->elements->GetObjectByOffset(i)); 948 local_ice_volume_af+=element->IceVolumeAboveFloatation(); 949 } 950 ISSM_MPI_Reduce(&local_ice_volume_af,&total_ice_volume_af,1,ISSM_MPI_DOUBLE,ISSM_MPI_SUM,0,IssmComm::GetComm() ); 951 ISSM_MPI_Bcast(&total_ice_volume_af,1,ISSM_MPI_DOUBLE,0,IssmComm::GetComm()); 952 953 /*Assign output pointers: */ 954 *pV=total_ice_volume_af; 955 956 }/*}}}*/ 936 957 void FemModel::ElementResponsex(IssmDouble* presponse,int response_enum){/*{{{*/ 937 958 -
issm/trunk-jpl/src/c/classes/FemModel.h
r16272 r16275 75 75 void TotalSmbx(IssmDouble* pSmb); 76 76 void IceVolumex(IssmDouble* pV); 77 void IceVolumeAboveFloatationx(IssmDouble* pV); 77 78 void ElementResponsex(IssmDouble* presponse,int response_enum); 78 79 void BalancethicknessMisfitx(IssmDouble* pV,int weight_index); -
issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h
r16252 r16275 553 553 MaxAbsVzEnum, 554 554 IceVolumeEnum, 555 IceVolumeAboveFloatationEnum, 555 556 TotalSmbEnum, 556 557 /*}}}*/ -
issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp
r16252 r16275 541 541 case MaxAbsVzEnum : return "MaxAbsVz"; 542 542 case IceVolumeEnum : return "IceVolume"; 543 case IceVolumeAboveFloatationEnum : return "IceVolumeAboveFloatation"; 543 544 case TotalSmbEnum : return "TotalSmb"; 544 545 case AbsoluteEnum : return "Absolute"; -
issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp
r16252 r16275 553 553 else if (strcmp(name,"MaxAbsVz")==0) return MaxAbsVzEnum; 554 554 else if (strcmp(name,"IceVolume")==0) return IceVolumeEnum; 555 else if (strcmp(name,"IceVolumeAboveFloatation")==0) return IceVolumeAboveFloatationEnum; 555 556 else if (strcmp(name,"TotalSmb")==0) return TotalSmbEnum; 556 557 else if (strcmp(name,"Absolute")==0) return AbsoluteEnum;
Note:
See TracChangeset
for help on using the changeset viewer.