Changeset 20212 for issm/trunk-jpl/src/c/classes/Elements/Tria.cpp
- Timestamp:
- 02/18/16 16:16:01 (9 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/classes/Elements/Tria.cpp
r20209 r20212 3073 3073 3074 3074 /*The fbmb[kg yr-1] of one element is area[m2] * melting_rate [kg m^-2 yr^-1]*/ 3075 IssmDouble base,fbmb,rho_ice; 3075 int point1; 3076 bool mainlyfloating; 3077 IssmDouble fbmb=0; 3078 IssmDouble rho_ice,fraction1,fraction2,floatingmelt,Jdet; 3076 3079 IssmDouble Total_Fbmb=0; 3077 3080 IssmDouble xyz_list[NUMVERTICES][3]; 3081 Gauss* gauss = NULL; 3082 3083 if(!IsIceInElement())return 0; 3078 3084 3079 3085 /*Get material parameters :*/ 3080 3086 rho_ice=matpar->GetMaterialParameter(MaterialsRhoIceEnum); 3081 3082 if(!IsIceInElement())return 0; 3083 3087 Input* floatingmelt_input = this->GetInput(BasalforcingsFloatingiceMeltingRateEnum); _assert_(floatingmelt_input); 3088 Input* gllevelset_input = this->GetInput(MaskGroundediceLevelsetEnum); _assert_(gllevelset_input); 3084 3089 ::GetVerticesCoordinates(&xyz_list[0][0],vertices,NUMVERTICES); 3085 3090 3086 /*First calculate the area of the base (cross section triangle) 3087 * http://en.wikipedia.org/wiki/Triangle 3088 * base = 1/2 abs((xA-xC)(yB-yA)-(xA-xB)(yC-yA))*/ 3089 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])); // area of element in m2 3090 3091 /*Now get the average SMB over the element*/ 3092 Input* fbmb_input = inputs->GetInput(BasalforcingsFloatingiceMeltingRateEnum); _assert_(fbmb_input); 3093 fbmb_input->GetInputAverage(&fbmb); // average melting rate on element in m ice s-1 3094 Total_Fbmb=rho_ice*base*fbmb; // melting rate on element in kg s-1 3091 this->GetGroundedPart(&point1,&fraction1,&fraction2,&mainlyfloating); 3092 /* Start looping on the number of gaussian points: */ 3093 gauss = this->NewGauss(point1,fraction1,fraction2,1-mainlyfloating,2); 3094 for(int ig=gauss->begin();ig<gauss->end();ig++){ 3095 3096 gauss->GaussPoint(ig); 3097 this->JacobianDeterminant(&Jdet,&xyz_list[0][0],gauss); 3098 floatingmelt_input->GetInputValue(&floatingmelt,gauss); 3099 fbmb+=floatingmelt*Jdet*gauss->weight; 3100 } 3101 3102 Total_Fbmb=rho_ice*fbmb; // from volume to mass 3095 3103 3096 3104 /*Return: */ 3105 delete gauss; 3097 3106 return Total_Fbmb; 3098 3107 } … … 3101 3110 3102 3111 /*The gbmb[kg yr-1] of one element is area[m2] * gounded melting rate [kg m^-2 yr^-1]*/ 3103 IssmDouble base,gbmb,rho_ice; 3112 int point1; 3113 bool mainlyfloating; 3114 IssmDouble gbmb=0; 3115 IssmDouble rho_ice,fraction1,fraction2,groundedmelt,Jdet; 3104 3116 IssmDouble Total_Gbmb=0; 3105 3117 IssmDouble xyz_list[NUMVERTICES][3]; 3118 Gauss* gauss = NULL; 3119 3120 if(!IsIceInElement())return 0; 3106 3121 3107 3122 /*Get material parameters :*/ 3108 3123 rho_ice=matpar->GetMaterialParameter(MaterialsRhoIceEnum); 3109 3110 if(!IsIceInElement())return 0; 3111 3124 Input* groundedmelt_input = this->GetInput(BasalforcingsGroundediceMeltingRateEnum); _assert_(groundedmelt_input); 3125 Input* gllevelset_input = this->GetInput(MaskGroundediceLevelsetEnum); _assert_(gllevelset_input); 3112 3126 ::GetVerticesCoordinates(&xyz_list[0][0],vertices,NUMVERTICES); 3113 3127 3114 /*First calculate the area of the base (cross section triangle) 3115 * http://en.wikipedia.org/wiki/Triangle 3116 * base = 1/2 abs((xA-xC)(yB-yA)-(xA-xB)(yC-yA))*/ 3117 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])); // area of element in m2 3118 3119 /*Now get the average grounded melting rate over the element*/ 3120 Input* gbmb_input = inputs->GetInput(BasalforcingsGroundediceMeltingRateEnum); _assert_(gbmb_input); 3121 gbmb_input->GetInputAverage(&gbmb); // average smb on element in m ice s-1 3122 Total_Gbmb=rho_ice*base*gbmb; // smb on element in kg s-1 3128 this->GetGroundedPart(&point1,&fraction1,&fraction2,&mainlyfloating); 3129 /* Start looping on the number of gaussian points: */ 3130 gauss = this->NewGauss(point1,fraction1,fraction2,mainlyfloating,2); 3131 for(int ig=gauss->begin();ig<gauss->end();ig++){ 3132 3133 gauss->GaussPoint(ig); 3134 this->JacobianDeterminant(&Jdet,&xyz_list[0][0],gauss); 3135 groundedmelt_input->GetInputValue(&groundedmelt,gauss); 3136 gbmb+=groundedmelt*Jdet*gauss->weight; 3137 } 3138 3139 Total_Gbmb=rho_ice*gbmb; // from volume to mass 3123 3140 3124 3141 /*Return: */ 3142 delete gauss; 3125 3143 return Total_Gbmb; 3126 3144 }
Note:
See TracChangeset
for help on using the changeset viewer.