Changeset 18786


Ignore:
Timestamp:
11/14/14 16:42:09 (10 years ago)
Author:
Eric.Larour
Message:

NEW: introduced new Masscon output definition, relying on a levelset definition of the masscon shape.

Location:
issm/trunk-jpl/src
Files:
5 added
15 edited

Legend:

Unmodified
Added
Removed
  • TabularUnified issm/trunk-jpl/src/c/Makefile.am

    r18613 r18786  
    437437                                        ./classes/Massfluxatgate.h \
    438438                                        ./classes/Misfit.h \
     439                                        ./classes/Masscon.h \
    439440                                        ./modules/ModelProcessorx/CreateOutputDefinitions.cpp\
    440441                                        ./modules/OutputDefinitionsResponsex/OutputDefinitionsResponsex.h\
  • TabularUnified issm/trunk-jpl/src/c/classes/Elements/Element.h

    r18736 r18786  
    205205                virtual bool   IsOnSurface()=0;
    206206                virtual void   GetGroundedPart(int* point1,IssmDouble* fraction1,IssmDouble* fraction2, bool* mainlyfloating)=0;
     207                virtual void   GetLevelsetPositivePart(int* point1,IssmDouble* fraction1,IssmDouble* fraction2, bool* mainlynegative,IssmDouble* levelsetvalues)=0;
    207208                virtual IssmDouble GetGroundedPortion(IssmDouble* xyz_list)=0;
    208209                virtual void   GetInputValue(IssmDouble* pvalue,Node* node,int enumtype)=0;
     
    273274                virtual IssmDouble TotalSmb(void)=0;
    274275                virtual IssmDouble Misfit(int modelenum,int observationenum,int weightsenum)=0;
     276                virtual IssmDouble Masscon(IssmDouble* levelset)=0;
    275277                virtual IssmDouble MisfitArea(int weightsenum)=0;
    276278                virtual int    VertexConnectivity(int vertexindex)=0;
  • TabularUnified issm/trunk-jpl/src/c/classes/Elements/Penta.h

    r18736 r18786  
    7474                Element* GetUpperElement(void);
    7575                Element* GetBasalElement(void);
     76                void        GetLevelsetPositivePart(int* point1,IssmDouble* fraction1,IssmDouble* fraction2, bool* mainlynegative,IssmDouble* levelsetvalues){_error_("not implemented yet");};
    7677                void   GetGroundedPart(int* point1,IssmDouble* fraction1, IssmDouble* fraction2,bool* mainlyfloating);
    7778                IssmDouble GetGroundedPortion(IssmDouble* xyz_list);
     
    132133                IssmDouble Misfit(int modelenum,int observationenum,int weightsenum){_error_("not implemented yet");};
    133134                IssmDouble MisfitArea(int weightsenum){_error_("not implemented yet");};
     135                IssmDouble Masscon(IssmDouble* levelset){_error_("not implemented yet");};
    134136
    135137                void   MigrateGroundingLine(IssmDouble* sheet_ungrounding);
  • TabularUnified issm/trunk-jpl/src/c/classes/Elements/Seg.h

    r18736 r18786  
    109109                int         VelocityInterpolation(void){_error_("not implemented yet");};
    110110                int         TensorInterpolation(void){_error_("not implemented yet");};
     111                void        GetLevelsetPositivePart(int* point1,IssmDouble* fraction1,IssmDouble* fraction2, bool* mainlynegative,IssmDouble* levelsetvalues){_error_("not implemented yet");};
    111112                void        GetGroundedPart(int* point1,IssmDouble* fraction1, IssmDouble* fraction2,bool* mainlyfloating){_error_("not implemented yet");};
    112113                IssmDouble  GetGroundedPortion(IssmDouble* xyz_list){_error_("not implemented yet");};
     
    157158                IssmDouble Misfit(int modelenum,int observationenum,int weightsenum){_error_("not implemented yet");};
    158159                IssmDouble MisfitArea(int weightsenum){_error_("not implemented yet");};
     160                IssmDouble Masscon(IssmDouble* levelset){_error_("not implemented yet");};
    159161
    160162#ifdef _HAVE_GIA_
  • TabularUnified issm/trunk-jpl/src/c/classes/Elements/Tetra.h

    r18736 r18786  
    114114                int         VelocityInterpolation(void);
    115115                int         TensorInterpolation(void);
     116                void        GetLevelsetPositivePart(int* point1,IssmDouble* fraction1,IssmDouble* fraction2, bool* mainlynegative,IssmDouble* levelsetvalues){_error_("not implemented yet");};
    116117                void        GetGroundedPart(int* point1,IssmDouble* fraction1, IssmDouble* fraction2,bool* mainlyfloating){_error_("not implemented yet");};
    117118                IssmDouble  GetGroundedPortion(IssmDouble* xyz_list){_error_("not implemented yet");};
     
    161162                IssmDouble Misfit(int modelenum,int observationenum,int weightsenum){_error_("not implemented yet");};
    162163                IssmDouble MisfitArea(int weightsenum){_error_("not implemented yet");};
     164                IssmDouble Masscon(IssmDouble* levelset){_error_("not implemented yet");};
    163165
    164166#ifdef _HAVE_GIA_
  • TabularUnified issm/trunk-jpl/src/c/classes/Elements/Tria.cpp

    r18758 r18786  
    666666        return this->element_type;
    667667
     668}
     669/*}}}*/
     670void        Tria::GetLevelsetPositivePart(int* point1,IssmDouble* fraction1,IssmDouble* fraction2, bool* mainlynegative,IssmDouble* gl){/*{{{*/
     671       
     672        /*Computeportion of the element that has a positive levelset*/
     673
     674        bool               negative=true;
     675        int                point;
     676        const IssmPDouble  epsilon= 1.e-15;
     677        IssmDouble         f1,f2;
     678
     679        /*Be sure that values are not zero*/
     680        if(gl[0]==0.) gl[0]=gl[0]+epsilon;
     681        if(gl[1]==0.) gl[1]=gl[1]+epsilon;
     682        if(gl[2]==0.) gl[2]=gl[2]+epsilon;
     683
     684        /*Check that not all nodes are positive or negative*/
     685        if(gl[0]>0 && gl[1]>0 && gl[2]>0){ // All positive
     686                point=0;
     687                f1=1.;
     688                f2=1.;
     689        }
     690        else if(gl[0]<0 && gl[1]<0 && gl[2]<0){ //All negative
     691                point=0;
     692                f1=0.;
     693                f2=0.;
     694        }
     695        else{
     696                if(gl[0]*gl[1]*gl[2]<0) negative=false;
     697
     698                if(gl[0]*gl[1]>0){ //Nodes 0 and 1 are similar, so points must be found on segment 0-2 and 1-2
     699                        point=2;
     700                        f1=gl[2]/(gl[2]-gl[0]);
     701                        f2=gl[2]/(gl[2]-gl[1]);
     702                }
     703                else if(gl[1]*gl[2]>0){ //Nodes 1 and 2 are similar, so points must be found on segment 0-1 and 0-2
     704                        point=0;
     705                        f1=gl[0]/(gl[0]-gl[1]);
     706                        f2=gl[0]/(gl[0]-gl[2]);
     707                }
     708                else if(gl[0]*gl[2]>0){ //Nodes 0 and 2 are similar, so points must be found on segment 1-0 and 1-2
     709                        point=1;
     710                        f1=gl[1]/(gl[1]-gl[2]);
     711                        f2=gl[1]/(gl[1]-gl[0]);
     712                }
     713        }
     714        *point1=point;
     715        *fraction1=f1;
     716        *fraction2=f2;
     717        *mainlynegative=negative;
    668718}
    669719/*}}}*/
     
    27162766}
    27172767/*}}}*/
     2768IssmDouble Tria::Masscon(IssmDouble* levelset){ /*{{{*/
     2769
     2770
     2771        /*intermediary: */
     2772        IssmDouble* values=NULL;
     2773        Input*      thickness_input=NULL;
     2774        IssmDouble  thickness;
     2775        IssmDouble  weight;
     2776        IssmDouble  Jdet;
     2777        IssmDouble  volume;
     2778        IssmDouble  rho_ice;
     2779        IssmDouble* xyz_list=NULL;
     2780        int         point1;
     2781        IssmDouble  fraction1,fraction2;
     2782        bool        mainlynegative=true;
     2783       
     2784        /*Output:*/
     2785        volume=0;
     2786
     2787        /* Get node coordinates and dof list: */
     2788        GetVerticesCoordinates(&xyz_list);
     2789
     2790        /*Retrieve inputs required:*/
     2791        thickness_input=this->GetInput(ThicknessEnum); _assert_(thickness_input);
     2792       
     2793        /*Retrieve material parameters: */
     2794        rho_ice=matpar->GetRhoIce();
     2795
     2796        /*Retrieve values of the levelset defining the masscon: */
     2797        values = xNew<IssmDouble>(NUMVERTICES);
     2798        for(int i=0;i<NUMVERTICES;i++){
     2799                values[i]=levelset[this->vertices[i]->Sid()];
     2800        }
     2801               
     2802        /*Ok, use the level set values to figure out where we put our gaussian points:*/
     2803        this->GetLevelsetPositivePart(&point1,&fraction1,&fraction2,&mainlynegative,values);
     2804        Gauss* gauss = this->NewGauss(point1,fraction1,fraction2,mainlynegative,4);
     2805
     2806        volume=0;
     2807
     2808        for(int ig=gauss->begin();ig<gauss->end();ig++){
     2809                gauss->GaussPoint(ig);
     2810
     2811                this->JacobianDeterminant(&Jdet,xyz_list,gauss);
     2812                thickness_input->GetInputValue(&thickness, gauss);
     2813
     2814                volume+=thickness*gauss->weight*Jdet;
     2815        }
     2816
     2817        /* clean up and Return: */
     2818        xDelete<IssmDouble>(xyz_list);
     2819        xDelete<IssmDouble>(values);
     2820        delete gauss;
     2821        return rho_ice*volume;
     2822}
     2823/*}}}*/
    27182824
    27192825#ifdef _HAVE_GIA_
  • TabularUnified issm/trunk-jpl/src/c/classes/Elements/Tria.h

    r18736 r18786  
    6969                Element*    GetUpperElement(void){_error_("not implemented yet");};
    7070                Element*    GetBasalElement(void){_error_("not implemented yet");};
     71                void        GetLevelsetPositivePart(int* point1,IssmDouble* fraction1,IssmDouble* fraction2, bool* mainlynegative,IssmDouble* levelsetvalues);
    7172                void        GetGroundedPart(int* point1,IssmDouble* fraction1, IssmDouble* fraction2,bool* mainlyfloating);
    7273                IssmDouble  GetGroundedPortion(IssmDouble* xyz_list);
     
    123124                IssmDouble MassFlux(IssmDouble x1,IssmDouble y1, IssmDouble x2, IssmDouble y2,int segment_id);
    124125                void       ElementResponse(IssmDouble* presponse,int response_enum);
     126                IssmDouble Masscon(IssmDouble* levelset);
    125127                IssmDouble Misfit(int modelenum,int observationenum,int weightsenum);
    126128                IssmDouble MisfitArea(int weightsenum);
  • TabularUnified issm/trunk-jpl/src/c/classes/classes.h

    r18492 r18786  
    1919#include "./Massfluxatgate.h"
    2020#include "./Misfit.h"
     21#include "./Masscon.h"
    2122
    2223/*Constraints: */
  • TabularUnified issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateOutputDefinitions.cpp

    r18521 r18786  
    114114                                /*}}}*/
    115115                        }
     116                        else if (output_definition_enums[i]==MassconEnum){
     117                                /*Deal with masscons: {{{*/
     118                               
     119                                /*masscon variables: */
     120                                int          nummasscons;
     121                                char**       masscon_name_s             = NULL;   
     122                                IssmDouble** masscon_levelset_s           = NULL;
     123                                int*         masscon_levelset_M_s    = NULL;
     124                                int*         masscon_levelset_N_s    = NULL;
    116125
     126                                /*Fetch name and levelset, etc ... (see src/m/classes/masscon.m): */
     127                                iomodel->FetchMultipleData(&masscon_name_s,&nummasscons,MassconNameEnum);
     128                                iomodel->FetchMultipleData(&masscon_levelset_s,&masscon_levelset_M_s,&masscon_levelset_N_s,&nummasscons,MassconLevelsetEnum);
     129                                for(j=0;j<nummasscons;j++){
     130
     131                                        /*Create a masscon object: */
     132                                        output_definitions->AddObject(new Masscon(masscon_name_s[j],masscon_levelset_s[j],masscon_levelset_M_s[j]));
     133
     134                                }
     135
     136                                /*Free ressources:*/
     137                                for(j=0;j<nummasscons;j++){
     138                                        char* string=NULL;
     139                                        IssmDouble* matrix = NULL;
     140
     141                                        string = masscon_name_s[j];    xDelete<char>(string);
     142                                        matrix = masscon_levelset_s[j]; xDelete<IssmDouble>(matrix);
     143                                }
     144                                xDelete<char*>(masscon_name_s);
     145                                xDelete<IssmDouble*>(masscon_levelset_s);
     146                                xDelete<int>(masscon_levelset_M_s);
     147                                xDelete<int>(masscon_levelset_N_s);
     148                                /*}}}*/
     149                        }
    117150                        else _error_("output definition enum " << output_definition_enums[i] << "not supported yet!");
    118151                }
  • TabularUnified issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h

    r18778 r18786  
    491491        ProfilerEnum,
    492492        MatrixParamEnum,
     493        MassconEnum,
     494        MassconNameEnum,
     495        MassconLevelsetEnum,
    493496        NodeSIdEnum,
    494497        VectorParamEnum,
  • TabularUnified issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp

    r18778 r18786  
    488488                case ProfilerEnum : return "Profiler";
    489489                case MatrixParamEnum : return "MatrixParam";
     490                case MassconEnum : return "Masscon";
     491                case MassconNameEnum : return "MassconName";
     492                case MassconLevelsetEnum : return "MassconLevelset";
    490493                case NodeSIdEnum : return "NodeSId";
    491494                case VectorParamEnum : return "VectorParam";
  • TabularUnified issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp

    r18778 r18786  
    497497              else if (strcmp(name,"Profiler")==0) return ProfilerEnum;
    498498              else if (strcmp(name,"MatrixParam")==0) return MatrixParamEnum;
     499              else if (strcmp(name,"Masscon")==0) return MassconEnum;
     500              else if (strcmp(name,"MassconName")==0) return MassconNameEnum;
     501              else if (strcmp(name,"MassconLevelset")==0) return MassconLevelsetEnum;
    499502              else if (strcmp(name,"NodeSId")==0) return NodeSIdEnum;
    500503              else if (strcmp(name,"VectorParam")==0) return VectorParamEnum;
     
    503506              else if (strcmp(name,"Segment")==0) return SegmentEnum;
    504507              else if (strcmp(name,"SegmentRiftfront")==0) return SegmentRiftfrontEnum;
    505               else if (strcmp(name,"SpcDynamic")==0) return SpcDynamicEnum;
    506               else if (strcmp(name,"SpcStatic")==0) return SpcStaticEnum;
    507               else if (strcmp(name,"SpcTransient")==0) return SpcTransientEnum;
    508508         else stage=5;
    509509   }
    510510   if(stage==5){
    511               if (strcmp(name,"StringArrayParam")==0) return StringArrayParamEnum;
     511              if (strcmp(name,"SpcDynamic")==0) return SpcDynamicEnum;
     512              else if (strcmp(name,"SpcStatic")==0) return SpcStaticEnum;
     513              else if (strcmp(name,"SpcTransient")==0) return SpcTransientEnum;
     514              else if (strcmp(name,"StringArrayParam")==0) return StringArrayParamEnum;
    512515              else if (strcmp(name,"StringParam")==0) return StringParamEnum;
    513516              else if (strcmp(name,"Seg")==0) return SegEnum;
     
    626629              else if (strcmp(name,"P1")==0) return P1Enum;
    627630              else if (strcmp(name,"P1DG")==0) return P1DGEnum;
    628               else if (strcmp(name,"P1bubble")==0) return P1bubbleEnum;
    629               else if (strcmp(name,"P1bubblecondensed")==0) return P1bubblecondensedEnum;
    630               else if (strcmp(name,"P2")==0) return P2Enum;
    631631         else stage=6;
    632632   }
    633633   if(stage==6){
    634               if (strcmp(name,"P2bubble")==0) return P2bubbleEnum;
     634              if (strcmp(name,"P1bubble")==0) return P1bubbleEnum;
     635              else if (strcmp(name,"P1bubblecondensed")==0) return P1bubblecondensedEnum;
     636              else if (strcmp(name,"P2")==0) return P2Enum;
     637              else if (strcmp(name,"P2bubble")==0) return P2bubbleEnum;
    635638              else if (strcmp(name,"P2bubblecondensed")==0) return P2bubblecondensedEnum;
    636639              else if (strcmp(name,"P2xP1")==0) return P2xP1Enum;
     
    749752              else if (strcmp(name,"OptionCell")==0) return OptionCellEnum;
    750753              else if (strcmp(name,"OptionStruct")==0) return OptionStructEnum;
    751               else if (strcmp(name,"Cuffey")==0) return CuffeyEnum;
    752               else if (strcmp(name,"Paterson")==0) return PatersonEnum;
    753               else if (strcmp(name,"Arrhenius")==0) return ArrheniusEnum;
    754754         else stage=7;
    755755   }
    756756   if(stage==7){
    757               if (strcmp(name,"LliboutryDuval")==0) return LliboutryDuvalEnum;
     757              if (strcmp(name,"Cuffey")==0) return CuffeyEnum;
     758              else if (strcmp(name,"Paterson")==0) return PatersonEnum;
     759              else if (strcmp(name,"Arrhenius")==0) return ArrheniusEnum;
     760              else if (strcmp(name,"LliboutryDuval")==0) return LliboutryDuvalEnum;
    758761              else if (strcmp(name,"TransientIslevelset")==0) return TransientIslevelsetEnum;
    759762              else if (strcmp(name,"ExtrapolationVariable")==0) return ExtrapolationVariableEnum;
  • TabularUnified issm/trunk-jpl/src/m/enum/EnumDefinitions.py

    r18779 r18786  
    480480def ProfilerEnum(): return StringToEnum("Profiler")[0]
    481481def MatrixParamEnum(): return StringToEnum("MatrixParam")[0]
     482def MassconEnum(): return StringToEnum("Masscon")[0]
     483def MassconNameEnum(): return StringToEnum("MassconName")[0]
     484def MassconLevelsetEnum(): return StringToEnum("MassconLevelset")[0]
    482485def NodeSIdEnum(): return StringToEnum("NodeSId")[0]
    483486def VectorParamEnum(): return StringToEnum("VectorParam")[0]
  • TabularUnified issm/trunk-jpl/src/m/exp/exp_to_levelset.m

    r18773 r18786  
    2323        cleanup=1;
    2424        if cleanup,
    25                 flags=zeros(length(segments),1);
    26                 for j=1:length(segments),
     25                flags=zeros(size(segments,1),1);
     26                for j=1:size(segments,1),
    2727                        segment=segments(j,:);
    2828                        x1=segment(1); x2=segment(3);
     
    7474        %cleanup: remove 0 length segments:
    7575        if cleanup,
    76                 flags=zeros(length(segments),1);
    77                 for j=1:length(segments),
     76                flags=zeros(size(segments,1),1);
     77                for j=1:size(segments,1),
    7878                        segment=segments(j,:);
    7979                        x1=segment(1); x2=segment(3);
  • TabularUnified issm/trunk-jpl/src/m/plot/applyoptions.m

    r18660 r18786  
    427427        end
    428428        hold on,p=plot(x,y,'k.');
    429         markersize=getfieldvalue(options,'markersize',5);
     429        markersize=getfieldvalue(options,'markersize',12);
    430430        color=getfieldvalue(options,'cloudcolor','k');
    431431        set(p,'Color',color);
Note: See TracChangeset for help on using the changeset viewer.