Changeset 14359


Ignore:
Timestamp:
02/21/13 08:54:44 (12 years ago)
Author:
seroussi
Message:

CHG: started work on grounding line

Location:
issm/trunk-jpl/src
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • TabularUnified issm/trunk-jpl/src/c/EnumDefinitions/EnumDefinitions.h

    r14357 r14359  
    490490        SoftMigrationEnum,
    491491        SubelementMigrationEnum,
     492        GLlevelsetEnum,
    492493        /*}}}*/
    493494        /*Solver{{{1*/
  • TabularUnified issm/trunk-jpl/src/c/classes/objects/Elements/Tria.cpp

    r14175 r14359  
    11131113        return &this->horizontalneighborsids[0];
    11141114
     1115}
     1116/*}}}*/
     1117/*FUNCTION Tria::GetGroundedPortion{{{*/
     1118IssmDouble Tria::GetGroundedPortion(IssmDouble* xyz_list){
     1119        /*Computeportion of the element that is grounded*/
     1120
     1121        bool mainlyfloating=false;
     1122        IssmDouble phi,s1,s2,area_init,area_grounded;
     1123        IssmDouble gl[3];
     1124        IssmDouble xyz_bis[3][3];
     1125        GaussTria *gauss    = NULL;
     1126
     1127        /*Recover parameters and values*/
     1128        GetInputListOnVertices(&gl[0],GLlevelsetEnum);
     1129       
     1130        /*Check that not all nodes are grounded or floating*/
     1131        if(gl[0]>0 && gl[1]>0 && gl[2]>0) _error_("Error. Three nodes of the element are grounded, should not compute the fraction of grounded element");
     1132        if(gl[0]<0 && gl[1]<0 && gl[2]<0) _error_("Error. Three nodes of the element are floating, should not compute the fraction of grounded element");
     1133
     1134        /*Figure out if two nodes are floating or grounded*/
     1135        if(gl[0]*gl[1]*gl[2]>0) mainlyfloating=true;
     1136
     1137        if(gl[0]*gl[1]>0){ //Nodes 0 and 1 are similar, so points must be found on segment 0-2 and 1-2
     1138                /*Coordinates of point 2: same as initial point 2*/
     1139                xyz_bis[2][0]=*(xyz_list+3*2+0);
     1140                xyz_bis[2][1]=*(xyz_list+3*2+1);
     1141                xyz_bis[2][2]=*(xyz_list+3*2+2);
     1142
     1143                /*Portion of the segments*/
     1144                s1=gl[2]/(gl[2]-gl[1]);
     1145                s2=gl[2]/(gl[2]-gl[0]);
     1146               
     1147                /*New point 1*/
     1148                xyz_bis[1][0]=*(xyz_list+3*2+0)+s1*(*(xyz_list+3*1+0)-*(xyz_list+3*2+0));
     1149                xyz_bis[1][1]=*(xyz_list+3*2+1)+s1*(*(xyz_list+3*1+1)-*(xyz_list+3*2+1));
     1150                xyz_bis[1][2]=*(xyz_list+3*2+2)+s1*(*(xyz_list+3*1+2)-*(xyz_list+3*2+2));
     1151
     1152                /*New point 0*/
     1153                xyz_bis[0][0]=*(xyz_list+3*2+0)+s1*(*(xyz_list+3*0+0)-*(xyz_list+3*2+0));
     1154                xyz_bis[0][1]=*(xyz_list+3*2+1)+s1*(*(xyz_list+3*0+1)-*(xyz_list+3*2+1));
     1155                xyz_bis[0][2]=*(xyz_list+3*2+2)+s1*(*(xyz_list+3*0+2)-*(xyz_list+3*2+2));
     1156        }
     1157        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
     1158                /*Coordinates of point 0: same as initial point 2*/
     1159                xyz_bis[0][0]=*(xyz_list+3*0+0);
     1160                xyz_bis[0][1]=*(xyz_list+3*0+1);
     1161                xyz_bis[0][2]=*(xyz_list+3*0+2);
     1162
     1163                /*Portion of the segments*/
     1164                s1=gl[0]/(gl[0]-gl[1]);
     1165                s2=gl[0]/(gl[0]-gl[2]);
     1166               
     1167                /*New point 1*/
     1168                xyz_bis[1][0]=*(xyz_list+3*0+0)+s1*(*(xyz_list+3*1+0)-*(xyz_list+3*0+0));
     1169                xyz_bis[1][1]=*(xyz_list+3*0+1)+s1*(*(xyz_list+3*1+1)-*(xyz_list+3*0+1));
     1170                xyz_bis[1][2]=*(xyz_list+3*0+2)+s1*(*(xyz_list+3*1+2)-*(xyz_list+3*0+2));
     1171
     1172                /*New point 2*/
     1173                xyz_bis[2][0]=*(xyz_list+3*0+0)+s1*(*(xyz_list+3*2+0)-*(xyz_list+3*0+0));
     1174                xyz_bis[2][1]=*(xyz_list+3*0+1)+s1*(*(xyz_list+3*2+1)-*(xyz_list+3*0+1));
     1175                xyz_bis[2][2]=*(xyz_list+3*0+2)+s1*(*(xyz_list+3*2+2)-*(xyz_list+3*0+2));
     1176        }
     1177        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
     1178                /*Coordinates of point 1: same as initial point 2*/
     1179                xyz_bis[1][0]=*(xyz_list+3*1+0);
     1180                xyz_bis[1][1]=*(xyz_list+3*1+1);
     1181                xyz_bis[1][2]=*(xyz_list+3*1+2);
     1182
     1183                /*Portion of the segments*/
     1184                s1=gl[1]/(gl[1]-gl[0]);
     1185                s2=gl[1]/(gl[1]-gl[2]);
     1186               
     1187                /*New point 0*/
     1188                xyz_bis[0][0]=*(xyz_list+3*1+0)+s1*(*(xyz_list+3*0+0)-*(xyz_list+3*1+0));
     1189                xyz_bis[0][1]=*(xyz_list+3*1+1)+s1*(*(xyz_list+3*0+1)-*(xyz_list+3*1+1));
     1190                xyz_bis[0][2]=*(xyz_list+3*1+2)+s1*(*(xyz_list+3*0+2)-*(xyz_list+3*1+2));
     1191
     1192                /*New point 2*/
     1193                xyz_bis[2][0]=*(xyz_list+3*1+0)+s1*(*(xyz_list+3*2+0)-*(xyz_list+3*1+0));
     1194                xyz_bis[2][1]=*(xyz_list+3*1+1)+s1*(*(xyz_list+3*2+1)-*(xyz_list+3*1+1));
     1195                xyz_bis[2][2]=*(xyz_list+3*1+2)+s1*(*(xyz_list+3*2+2)-*(xyz_list+3*1+2));
     1196        }
     1197
     1198        /*Compute fraction of grounded element*/
     1199        GetJacobianDeterminant2d(&area_init, xyz_list,gauss);
     1200        GetJacobianDeterminant2d(&area_grounded, &xyz_bis[0][0],gauss);
     1201        if(mainlyfloating==true) area_grounded=area_init-area_grounded;
     1202        phi=area_grounded/area_init;
     1203        if(phi>1 || phi<0) _error_("Error. Problem with portion of grounded element: value should be between 0 and 1");
     1204        return phi;
    11151205}
    11161206/*}}}*/
     
    20352125        int     i,migration_style;
    20362126        bool    elementonshelf = false;
     2127        bool    elementonsheet = false;
    20372128        IssmDouble  bed_hydro,yts,gl_melting_rate;
    20382129        IssmDouble  rho_water,rho_ice,density;
    2039         IssmDouble  melting[NUMVERTICES];
     2130        IssmDouble  melting[NUMVERTICES],phi[NUMVERTICES];;
    20402131        IssmDouble  h[NUMVERTICES],s[NUMVERTICES],b[NUMVERTICES],ba[NUMVERTICES];
    20412132
     
    20482139        GetInputListOnVertices(&b[0],BedEnum);
    20492140        GetInputListOnVertices(&ba[0],BathymetryEnum);
     2141        if(migration_style==SubelementMigrationEnum) GetInputListOnVertices(&phi[0],GLlevelsetEnum);
    20502142        rho_water=matpar->GetRhoWater();
    20512143        rho_ice=matpar->GetRhoIce();
     
    20872179        /*If at least one vertex is now floating, the element is now floating*/
    20882180        for(i=0;i<NUMVERTICES;i++){
    2089                 if(nodes[i]->IsFloating()){
    2090                         elementonshelf=true;
    2091                         break;
     2181                if(migration_style==SubelementMigrationEnum){
     2182                        if(nodes[i]->IsGrounded()){
     2183                                elementonsheet=true;
     2184                                break;
     2185                        }
     2186                        phi[i]=h[i]+ba[i]/density;
     2187                        elementonshelf=!elementonsheet;
     2188                }
     2189                else{
     2190                        if(nodes[i]->IsFloating()){
     2191                                elementonshelf=true;
     2192                                break;
     2193                        }
    20922194                }
    20932195        }
     
    21012203        /*Update inputs*/
    21022204   this->inputs->AddInput(new BoolInput(MaskElementonfloatingiceEnum,elementonshelf));
    2103 
    2104         /*Update inputs*/   
    21052205        this->inputs->AddInput(new TriaP1Input(SurfaceEnum,&s[0]));
    21062206        this->inputs->AddInput(new TriaP1Input(BedEnum,&b[0]));
     2207        if(migration_style==SubelementMigrationEnum) this->inputs->AddInput(new TriaP1Input(GLlevelsetEnum,&phi[0]));
    21072208}
    21082209/*}}}*/
     
    29953096        IssmDouble MOUNTAINKEXPONENT = 10;
    29963097        IssmDouble slope_magnitude,alpha2;
     3098        IssmDouble migration_style;
    29973099        IssmDouble Jdet;
     3100        IssmDouble phi=1.0;
    29983101        IssmDouble L[2][numdof];
    29993102        IssmDouble DL[2][2]  = {{ 0,0 },{0,0}};
     
    30093112
    30103113        /*Retrieve all inputs and parameters*/
     3114        parameters->FindParam(&migration_style,GroundinglineMigrationEnum);
    30113115        GetVerticesCoordinates(&xyz_list[0][0], nodes, NUMVERTICES);
    3012         Input* surface_input=inputs->GetInput(SurfaceEnum); _assert_(surface_input);
    3013         Input* vx_input=inputs->GetInput(VxEnum);           _assert_(vx_input);
    3014         Input* vy_input=inputs->GetInput(VyEnum);           _assert_(vy_input);
    3015         Input* vz_input=inputs->GetInput(VzEnum);           _assert_(vz_input);
     3116        Input* surface_input=inputs->GetInput(SurfaceEnum);       _assert_(surface_input);
     3117        Input* vx_input=inputs->GetInput(VxEnum);                 _assert_(vx_input);
     3118        Input* vy_input=inputs->GetInput(VyEnum);                 _assert_(vy_input);
     3119        Input* vz_input=inputs->GetInput(VzEnum);                 _assert_(vz_input);
    30163120        parameters->FindParam(&analysis_type,AnalysisTypeEnum);
    30173121
    30183122        /*build friction object, used later on: */
    30193123        friction=new Friction("2d",inputs,matpar,analysis_type);
     3124
     3125        /*Recover portion of element that is grounded*/
     3126        if(migration_style==SubelementMigrationEnum) phi=this->GetGroundedPortion(&xyz_list[0][0]);
    30203127
    30213128        /* Start  looping on the number of gaussian points: */
     
    30313138                if(slope_magnitude>MAXSLOPE) alpha2=pow((IssmDouble)10,MOUNTAINKEXPONENT);
    30323139                else friction->GetAlpha2(&alpha2, gauss,VxEnum,VyEnum,VzEnum);
     3140                if(migration_style==SubelementMigrationEnum) alpha2=phi*alpha2;
    30333141
    30343142                GetL(&L[0][0], &xyz_list[0][0], gauss,NDOF2);
  • TabularUnified issm/trunk-jpl/src/c/classes/objects/Elements/Tria.h

    r14159 r14359  
    196196                void           GetVertexSidList(int* sidlist);
    197197                void           GetConnectivityList(int* connectivity);
     198                IssmDouble     GetGroundedPortion(IssmDouble* xyz_list);
    198199                void           GetInputListOnVertices(IssmDouble* pvalue,int enumtype);
    199200                void           GetInputListOnVertices(IssmDouble* pvalue,int enumtype,IssmDouble defaultvalue);
  • TabularUnified issm/trunk-jpl/src/c/modules/EnumToStringx/EnumToStringx.cpp

    r14357 r14359  
    471471                case SoftMigrationEnum : return "SoftMigration";
    472472                case SubelementMigrationEnum : return "SubelementMigration";
     473                case GLlevelsetEnum : return "GLlevelset";
    473474                case StokesSolverEnum : return "StokesSolver";
    474475                case AdjointEnum : return "Adjoint";
  • TabularUnified issm/trunk-jpl/src/c/modules/StringToEnumx/StringToEnumx.cpp

    r14357 r14359  
    481481              else if (strcmp(name,"SoftMigration")==0) return SoftMigrationEnum;
    482482              else if (strcmp(name,"SubelementMigration")==0) return SubelementMigrationEnum;
     483              else if (strcmp(name,"GLlevelset")==0) return GLlevelsetEnum;
    483484              else if (strcmp(name,"StokesSolver")==0) return StokesSolverEnum;
    484485              else if (strcmp(name,"Adjoint")==0) return AdjointEnum;
     
    506507              else if (strcmp(name,"QmuOutName")==0) return QmuOutNameEnum;
    507508              else if (strcmp(name,"Regular")==0) return RegularEnum;
    508               else if (strcmp(name,"Scaled")==0) return ScaledEnum;
    509509         else stage=5;
    510510   }
    511511   if(stage==5){
    512               if (strcmp(name,"Separate")==0) return SeparateEnum;
     512              if (strcmp(name,"Scaled")==0) return ScaledEnum;
     513              else if (strcmp(name,"Separate")==0) return SeparateEnum;
    513514              else if (strcmp(name,"Sset")==0) return SsetEnum;
    514515              else if (strcmp(name,"Verbose")==0) return VerboseEnum;
  • TabularUnified issm/trunk-jpl/src/m/enum/EnumDefinitions.py

    r14357 r14359  
    45494549        return StringToEnum('SubelementMigration')[0]
    45504550
     4551def GLlevelsetEnum():
     4552        """
     4553        GLLEVELSETENUM - Enum of GLlevelset
     4554
     4555           Usage:
     4556              macro=GLlevelsetEnum()
     4557        """
     4558
     4559        return StringToEnum('GLlevelset')[0]
     4560
    45514561def StokesSolverEnum():
    45524562        """
     
    49874997        """
    49884998
    4989         return 497
    4990 
     4999        return 498
     5000
  • TabularUnified issm/trunk-jpl/src/m/enum/MaximumNumberOfEnums.m

    r14357 r14359  
    99%      macro=MaximumNumberOfEnums()
    1010
    11 macro=497;
     11macro=498;
Note: See TracChangeset for help on using the changeset viewer.