Ignore:
Timestamp:
02/18/16 16:16:01 (9 years ago)
Author:
seroussi
Message:

NEW: compute exact total melting

File:
1 edited

Legend:

Unmodified
Added
Removed
  • issm/trunk-jpl/src/c/classes/Elements/Tria.cpp

    r20209 r20212  
    30733073
    30743074        /*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;
    30763079        IssmDouble Total_Fbmb=0;
    30773080        IssmDouble xyz_list[NUMVERTICES][3];
     3081        Gauss*     gauss     = NULL;
     3082
     3083   if(!IsIceInElement())return 0;
    30783084
    30793085        /*Get material parameters :*/
    30803086        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);
    30843089        ::GetVerticesCoordinates(&xyz_list[0][0],vertices,NUMVERTICES);
    30853090
    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
    30953103
    30963104        /*Return: */
     3105        delete gauss;
    30973106        return Total_Fbmb;
    30983107}
     
    31013110
    31023111        /*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;
    31043116        IssmDouble Total_Gbmb=0;
    31053117        IssmDouble xyz_list[NUMVERTICES][3];
     3118        Gauss*     gauss     = NULL;
     3119
     3120   if(!IsIceInElement())return 0;
    31063121
    31073122        /*Get material parameters :*/
    31083123        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);
    31123126        ::GetVerticesCoordinates(&xyz_list[0][0],vertices,NUMVERTICES);
    31133127
    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
    31233140
    31243141        /*Return: */
     3142        delete gauss;
    31253143        return Total_Gbmb;
    31263144}
Note: See TracChangeset for help on using the changeset viewer.