Changeset 22469


Ignore:
Timestamp:
02/26/18 10:47:40 (7 years ago)
Author:
tpelle
Message:

NEW: Added enums

File:
1 edited

Legend:

Unmodified
Added
Removed
  • issm/trunk-jpl/src/c/modules/FloatingiceMeltingRatex/FloatingiceMeltingRatex.cpp

    r20020 r22469  
    2929                        MismipFloatingiceMeltingRatex(femmodel);
    3030                        break;
     31                case BasalforcingsPicoEnum:
     32                        if(VerboseSolution())_printf0_(" call Pico Floating melting rate module\n");
     33                        PicoFloatingiceMeltingRatex(femmodel);
     34                        break;
    3135                default:
    3236                        _error_("Basal forcing model "<<EnumToStringx(basalforcing_model)<<" not supported yet");
     
    4953                element->MismipFloatingiceMeltingRate();
    5054        }
     55}
     56/*}}}*/
    5157
     58void PicoFloatingiceMeltingRatex(FemModel* femmodel){/*{{{*/
     59
     60        int i,k,p,numvertices;
     61        int num_basins,maxbox,basinid,boxid;
     62        IssmDouble dist_max,area,earth_grav,rhoi,rhow,rho_star,nu,latentheat;
     63        IssmDouble c_p_ocean,lambda,a,b,c,alpha,Beta,gamma_T,overturning_coeff;
     64        IssmDouble g1,g2,s1,p_coeff,tavg,savg,overturning_avg;
     65        IssmDouble mean_toc,mean_soc,mean_overturning,pressure,T_star;
     66        IssmDouble q_coeff,potential_pressure_melting_point,T_pressure_melting,overturning;
     67        IssmDouble thickness,toc_farocean,soc_farocean,area_box1,Toc,Soc,basalmeltrate_shelf;
     68        int* nd=NULL;
     69        IssmDouble* dmax_basin=NULL;
     70        IssmDouble* t_farocean=NULL;
     71        IssmDouble* s_farocean=NULL;
     72        IssmDouble* distances=NULL;
     73        IssmDouble* boxareas=NULL;
     74        Element* element=NULL;
     75
     76        femmodel->parameters->FindParam(&num_basins,BasalforcingsPicoNumBasinsEnum);
     77        femmodel->parameters->FindParam(&maxbox,BasalforcingsPicoMaxboxcountEnum);
     78        dmax_basin=xNew<IssmDouble>(num_basins);
     79        femmodel->DistanceToFieldValue(MaskGroundediceLevelsetEnum,0.,DistanceToGroundinglineEnum);
     80        femmodel->DistanceToFieldValue(MaskIceLevelsetEnum,0.,DistanceToCalvingfrontEnum);
     81        // find maximum distance to grounding line
     82        dist_max=-1.;
     83        for(i=0;i<num_basins;i++){
     84                dmax_basin[i]=-1;
     85        }
     86        for(i=0;i<femmodel->elements->Size();i++){
     87                element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
     88                if(!element->IsFloating()) continue;
     89                numvertices = element->GetNumberOfVertices();
     90                distances=xNew<IssmDouble>(numvertices);
     91                element->GetInputListOnVertices(&distances[0],DistanceToGroundinglineEnum);
     92                element->inputs->GetInputValue(&basinid,BasalforcingsPicoBasinIdEnum);
     93                for(k=0; k<numvertices; k++){
     94                        if(abs(distances[k])>dist_max){dist_max=abs(distances[k]);}
     95                        if(abs(distances[k])>dmax_basin[basinid]){dmax_basin[basinid]=abs(distances[k]);}
     96                }
     97        }
     98        //1 Define pico boxes
     99        nd=xNew<int>(num_basins);
     100        for(i=0; i<num_basins;i++){
     101                nd[i] = round(sqrt(dmax_basin[i]/dist_max)*(maxbox-1)); //0-based
     102        }
     103        for(int i=0;i<femmodel->elements->Size();i++){
     104                Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
     105                element->PicoUpdateBoxid(nd);
     106        }
     107
     108        //2 Get area of the boxes
     109        boxareas=new Vector<IssmDouble>(num_basins*maxbox);
     110        for(i=0;i<num_basins*maxbox;i++){boxareas[i]=0.;}
     111        for(i=0;i<femmodel->elements->Size();i++){
     112                element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
     113                if(!element->IsFloating()) continue;
     114                element->inputs->GetInputValue(&basinid,BasalforcingsPicoBasinIdEnum);
     115                element->inputs->GetInputValue(&boxid,BasalforcingsPicoBoxIdEnum);
     116                boxareas[basinid*maxbox+boxid]+=element->GetArea();
     117        }
     118
     119        //3 Compute variables in first box
     120        for(int p=0;p<femmodel->elements->Size();p++){
     121                element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(p));
     122                element->PicoUpdateFirstBox();
     123                //Need to save the box1 average of temp, sal, and overt for input into next box.
     124        }
     125
     126
     127        //4 Compute variables of all other boxes
     128
     129//      for(int i=0;i<femmodel->elements->Size();i++){
     130//              Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
     131//              element->PicoFloatingiceMeltingRate();
     132//      }
     133        /*Cleanup and return */
     134        xDelete<int>(nd);
     135        xDelete<IssmDouble>(dmax_basin);
     136        xDelete<IssmDouble>(distances);
     137        xDelete<IssmDouble>(boxareas);
     138        xDelete<IssmDouble>(t_farocean);
     139   xDelete<IssmDouble>(s_farocean);
     140        xDelete<IssmDouble>(element);
    52141}/*}}}*/
Note: See TracChangeset for help on using the changeset viewer.