Changeset 14359
- Timestamp:
- 02/21/13 08:54:44 (12 years ago)
- Location:
- issm/trunk-jpl/src
- Files:
-
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
TabularUnified issm/trunk-jpl/src/c/EnumDefinitions/EnumDefinitions.h ¶
r14357 r14359 490 490 SoftMigrationEnum, 491 491 SubelementMigrationEnum, 492 GLlevelsetEnum, 492 493 /*}}}*/ 493 494 /*Solver{{{1*/ -
TabularUnified issm/trunk-jpl/src/c/classes/objects/Elements/Tria.cpp ¶
r14175 r14359 1113 1113 return &this->horizontalneighborsids[0]; 1114 1114 1115 } 1116 /*}}}*/ 1117 /*FUNCTION Tria::GetGroundedPortion{{{*/ 1118 IssmDouble 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; 1115 1205 } 1116 1206 /*}}}*/ … … 2035 2125 int i,migration_style; 2036 2126 bool elementonshelf = false; 2127 bool elementonsheet = false; 2037 2128 IssmDouble bed_hydro,yts,gl_melting_rate; 2038 2129 IssmDouble rho_water,rho_ice,density; 2039 IssmDouble melting[NUMVERTICES] ;2130 IssmDouble melting[NUMVERTICES],phi[NUMVERTICES];; 2040 2131 IssmDouble h[NUMVERTICES],s[NUMVERTICES],b[NUMVERTICES],ba[NUMVERTICES]; 2041 2132 … … 2048 2139 GetInputListOnVertices(&b[0],BedEnum); 2049 2140 GetInputListOnVertices(&ba[0],BathymetryEnum); 2141 if(migration_style==SubelementMigrationEnum) GetInputListOnVertices(&phi[0],GLlevelsetEnum); 2050 2142 rho_water=matpar->GetRhoWater(); 2051 2143 rho_ice=matpar->GetRhoIce(); … … 2087 2179 /*If at least one vertex is now floating, the element is now floating*/ 2088 2180 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 } 2092 2194 } 2093 2195 } … … 2101 2203 /*Update inputs*/ 2102 2204 this->inputs->AddInput(new BoolInput(MaskElementonfloatingiceEnum,elementonshelf)); 2103 2104 /*Update inputs*/2105 2205 this->inputs->AddInput(new TriaP1Input(SurfaceEnum,&s[0])); 2106 2206 this->inputs->AddInput(new TriaP1Input(BedEnum,&b[0])); 2207 if(migration_style==SubelementMigrationEnum) this->inputs->AddInput(new TriaP1Input(GLlevelsetEnum,&phi[0])); 2107 2208 } 2108 2209 /*}}}*/ … … 2995 3096 IssmDouble MOUNTAINKEXPONENT = 10; 2996 3097 IssmDouble slope_magnitude,alpha2; 3098 IssmDouble migration_style; 2997 3099 IssmDouble Jdet; 3100 IssmDouble phi=1.0; 2998 3101 IssmDouble L[2][numdof]; 2999 3102 IssmDouble DL[2][2] = {{ 0,0 },{0,0}}; … … 3009 3112 3010 3113 /*Retrieve all inputs and parameters*/ 3114 parameters->FindParam(&migration_style,GroundinglineMigrationEnum); 3011 3115 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); 3016 3120 parameters->FindParam(&analysis_type,AnalysisTypeEnum); 3017 3121 3018 3122 /*build friction object, used later on: */ 3019 3123 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]); 3020 3127 3021 3128 /* Start looping on the number of gaussian points: */ … … 3031 3138 if(slope_magnitude>MAXSLOPE) alpha2=pow((IssmDouble)10,MOUNTAINKEXPONENT); 3032 3139 else friction->GetAlpha2(&alpha2, gauss,VxEnum,VyEnum,VzEnum); 3140 if(migration_style==SubelementMigrationEnum) alpha2=phi*alpha2; 3033 3141 3034 3142 GetL(&L[0][0], &xyz_list[0][0], gauss,NDOF2); -
TabularUnified issm/trunk-jpl/src/c/classes/objects/Elements/Tria.h ¶
r14159 r14359 196 196 void GetVertexSidList(int* sidlist); 197 197 void GetConnectivityList(int* connectivity); 198 IssmDouble GetGroundedPortion(IssmDouble* xyz_list); 198 199 void GetInputListOnVertices(IssmDouble* pvalue,int enumtype); 199 200 void GetInputListOnVertices(IssmDouble* pvalue,int enumtype,IssmDouble defaultvalue); -
TabularUnified issm/trunk-jpl/src/c/modules/EnumToStringx/EnumToStringx.cpp ¶
r14357 r14359 471 471 case SoftMigrationEnum : return "SoftMigration"; 472 472 case SubelementMigrationEnum : return "SubelementMigration"; 473 case GLlevelsetEnum : return "GLlevelset"; 473 474 case StokesSolverEnum : return "StokesSolver"; 474 475 case AdjointEnum : return "Adjoint"; -
TabularUnified issm/trunk-jpl/src/c/modules/StringToEnumx/StringToEnumx.cpp ¶
r14357 r14359 481 481 else if (strcmp(name,"SoftMigration")==0) return SoftMigrationEnum; 482 482 else if (strcmp(name,"SubelementMigration")==0) return SubelementMigrationEnum; 483 else if (strcmp(name,"GLlevelset")==0) return GLlevelsetEnum; 483 484 else if (strcmp(name,"StokesSolver")==0) return StokesSolverEnum; 484 485 else if (strcmp(name,"Adjoint")==0) return AdjointEnum; … … 506 507 else if (strcmp(name,"QmuOutName")==0) return QmuOutNameEnum; 507 508 else if (strcmp(name,"Regular")==0) return RegularEnum; 508 else if (strcmp(name,"Scaled")==0) return ScaledEnum;509 509 else stage=5; 510 510 } 511 511 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; 513 514 else if (strcmp(name,"Sset")==0) return SsetEnum; 514 515 else if (strcmp(name,"Verbose")==0) return VerboseEnum; -
TabularUnified issm/trunk-jpl/src/m/enum/EnumDefinitions.py ¶
r14357 r14359 4549 4549 return StringToEnum('SubelementMigration')[0] 4550 4550 4551 def GLlevelsetEnum(): 4552 """ 4553 GLLEVELSETENUM - Enum of GLlevelset 4554 4555 Usage: 4556 macro=GLlevelsetEnum() 4557 """ 4558 4559 return StringToEnum('GLlevelset')[0] 4560 4551 4561 def StokesSolverEnum(): 4552 4562 """ … … 4987 4997 """ 4988 4998 4989 return 49 74990 4999 return 498 5000 -
TabularUnified issm/trunk-jpl/src/m/enum/MaximumNumberOfEnums.m ¶
r14357 r14359 9 9 % macro=MaximumNumberOfEnums() 10 10 11 macro=49 7;11 macro=498;
Note:
See TracChangeset
for help on using the changeset viewer.