Changeset 18736
- Timestamp:
- 11/05/14 15:40:11 (10 years ago)
- Location:
- issm/trunk-jpl/src/c
- Files:
-
- 18 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/analyses/DamageEvolutionAnalysis.cpp
r18470 r18736 48 48 49 49 int finiteelement; 50 bool islevelset; 50 51 51 52 iomodel->Constant(&finiteelement,DamageElementinterpEnum); 53 iomodel->Constant(&islevelset,TransientIslevelsetEnum); 52 54 53 55 /*Update elements: */ … … 68 70 iomodel->FetchDataToInput(elements,MaskIceLevelsetEnum); 69 71 iomodel->FetchDataToInput(elements,PressureEnum); 72 73 if(islevelset){ 74 iomodel->FetchDataToInput(elements,IceMaskNodeActivationEnum); 75 } 70 76 71 77 }/*}}}*/ … … 441 447 void DamageEvolutionAnalysis::UpdateConstraints(FemModel* femmodel){/*{{{*/ 442 448 /*Default, do nothing*/ 449 bool islevelset; 450 femmodel->parameters->FindParam(&islevelset,TransientIslevelsetEnum); 451 if(islevelset){ 452 SetActiveNodesLSMx(femmodel); 453 } 443 454 return; 444 455 }/*}}}*/ -
issm/trunk-jpl/src/c/analyses/LevelsetAnalysis.cpp
r18733 r18736 105 105 IssmDouble Jdet, dt, D_scalar; 106 106 IssmDouble h,hx,hy,hz; 107 IssmDouble vel , calvingrate;108 IssmDouble norm_dlsf;107 IssmDouble vel; 108 // IssmDouble norm_dlsf; 109 109 IssmDouble* xyz_list = NULL; 110 110 … … 130 130 IssmDouble* w = xNew<IssmDouble>(dim); 131 131 IssmDouble* c = xNew<IssmDouble>(dim); 132 IssmDouble* dlsf = xNew<IssmDouble>(dim);132 //IssmDouble* dlsf = xNew<IssmDouble>(dim); 133 133 134 134 /*Retrieve all inputs and parameters*/ … … 137 137 Input* vx_input=NULL; 138 138 Input* vy_input=NULL; 139 Input* calvingratex_input=NULL; 140 Input* calvingratey_input=NULL; 139 141 if(domaintype==Domain2DhorizontalEnum){ 140 142 vx_input=basalelement->GetInput(VxEnum); _assert_(vx_input); 141 143 vy_input=basalelement->GetInput(VyEnum); _assert_(vy_input); 144 calvingratex_input=basalelement->GetInput(CalvingratexEnum); _assert_(calvingratex_input); 145 calvingratey_input=basalelement->GetInput(CalvingrateyEnum); _assert_(calvingratey_input); 142 146 } 143 147 else{ 144 148 if(dim==1){ 145 149 vx_input=basalelement->GetInput(VxEnum); _assert_(vx_input); 150 calvingratex_input=basalelement->GetInput(CalvingratexEnum); _assert_(calvingratex_input); 146 151 } 147 152 if(dim==2){ 148 153 vx_input=basalelement->GetInput(VxAverageEnum); _assert_(vx_input); 149 154 vy_input=basalelement->GetInput(VyAverageEnum); _assert_(vy_input); 150 } 151 } 152 153 Input* lsf_slopex_input = basalelement->GetInput(LevelsetfunctionSlopeXEnum); _assert_(lsf_slopex_input); 154 Input* lsf_slopey_input = basalelement->GetInput(LevelsetfunctionSlopeYEnum); _assert_(lsf_slopey_input); 155 Input* calvingrate_input = basalelement->GetInput(MasstransportCalvingrateEnum); _assert_(calvingrate_input); 155 calvingratex_input=basalelement->GetInput(CalvingratexAverageEnum); _assert_(calvingratex_input); 156 calvingratey_input=basalelement->GetInput(CalvingrateyAverageEnum); _assert_(calvingratey_input); 157 } 158 } 159 160 // Input* lsf_slopex_input = basalelement->GetInput(LevelsetfunctionSlopeXEnum); _assert_(lsf_slopex_input); 161 // Input* lsf_slopey_input = basalelement->GetInput(LevelsetfunctionSlopeYEnum); _assert_(lsf_slopey_input); 162 //Input* calvingrate_input = basalelement->GetInput(MasstransportCalvingrateEnum); _assert_(calvingrate_input); 156 163 157 164 /* Start looping on the number of gaussian points: */ … … 178 185 vx_input->GetInputValue(&v[0],gauss); // in 3D case, add mesh velocity 179 186 vy_input->GetInputValue(&v[1],gauss); 180 lsf_slopex_input->GetInputValue(&dlsf[0],gauss); 181 lsf_slopey_input->GetInputValue(&dlsf[1],gauss); 182 calvingrate_input->GetInputValue(&calvingrate,gauss); 183 184 norm_dlsf=0.; 185 for(i=0;i<dim;i++) norm_dlsf+=pow(dlsf[i],2); 186 norm_dlsf=sqrt(norm_dlsf); 187 188 if(norm_dlsf>1.e-10) 189 for(i=0;i<dim;i++) c[i]=calvingrate*dlsf[i]/norm_dlsf; 190 else 191 for(i=0;i<dim;i++) c[i]=0.; 187 calvingratex_input->GetInputValue(&c[0],gauss); // in 3D case, add mesh velocity 188 calvingratey_input->GetInputValue(&c[1],gauss); 189 //lsf_slopex_input->GetInputValue(&dlsf[0],gauss); 190 //lsf_slopey_input->GetInputValue(&dlsf[1],gauss); 191 //calvingrate_input->GetInputValue(&calvingrate,gauss); 192 193 //norm_dlsf=0.; 194 //for(i=0;i<dim;i++) norm_dlsf+=pow(dlsf[i],2); 195 //norm_dlsf=sqrt(norm_dlsf); 196 197 //if(norm_dlsf>1.e-10) 198 // for(i=0;i<dim;i++) c[i]=calvingrate*dlsf[i]/norm_dlsf; 199 //else 200 //for(i=0;i<dim;i++) c[i]=0.; 192 201 193 202 for(i=0;i<dim;i++) w[i]=v[i]-c[i]; … … 206 215 207 216 /* Stabilization */ 208 int stabilization= 2;217 int stabilization=1; 209 218 vel=0.; 210 for(i=0;i<dim;i++) vel+= v[i]*v[i];219 for(i=0;i<dim;i++) vel+=w[i]*w[i]; 211 220 vel=sqrt(vel)+1.e-14; 212 221 switch(stabilization){ … … 217 226 /* Artificial Diffusion */ 218 227 basalelement->ElementSizes(&hx,&hy,&hz); 219 h=sqrt( pow(hx* v[0]/vel,2) + pow(hy*v[1]/vel,2) );228 h=sqrt( pow(hx*w[0]/vel,2) + pow(hy*w[1]/vel,2) ); 220 229 kappa=h*vel/2.; 221 230 for(row=0;row<dim;row++) … … 234 243 /* Streamline Upwinding */ 235 244 basalelement->ElementSizes(&hx,&hy,&hz); 236 h=sqrt( pow(hx* v[0]/vel,2) + pow(hy*v[1]/vel,2) );245 h=sqrt( pow(hx*w[0]/vel,2) + pow(hy*w[1]/vel,2) ); 237 246 for(row=0;row<dim;row++) 238 247 for(col=0;col<dim;col++) 239 D[row*dim+col] = D_scalar*h/(2.*vel)* v[row]*v[col];248 D[row*dim+col] = D_scalar*h/(2.*vel)*w[row]*w[col]; 240 249 241 250 TripleMultiply(Bprime,dim,numnodes,1, … … 258 267 xDelete<IssmDouble>(w); 259 268 xDelete<IssmDouble>(c); 260 xDelete<IssmDouble>(dlsf);269 //xDelete<IssmDouble>(dlsf); 261 270 delete gauss; 262 271 if(domaintype!=Domain2DhorizontalEnum){basalelement->DeleteMaterials(); delete basalelement;}; -
issm/trunk-jpl/src/c/classes/Elements/Element.cpp
r18699 r18736 1210 1210 input=this->inputs->GetInput(output_enum); 1211 1211 break; 1212 case CalvingratexEnum: 1213 case CalvingrateyEnum: 1214 case MasstransportCalvingrateEnum: 1215 this->StrainRateparallel(); 1216 this->StrainRateperpendicular(); 1217 this->CalvingRateLevermann(); 1218 input=this->inputs->GetInput(output_enum); 1219 break; 1212 1220 case StrainRateparallelEnum: 1213 1221 this->StrainRateparallel(); -
issm/trunk-jpl/src/c/classes/Elements/Element.h
r18699 r18736 221 221 virtual void StressIntensityFactor(void)=0; 222 222 virtual void StrainRateparallel(void)=0; 223 virtual void StrainRateperpendicular(void)=0; 223 virtual void StrainRateperpendicular(void)=0; 224 virtual void CalvingRateLevermann(void)=0; 224 225 225 226 virtual void Update(int index, IoModel* iomodel,int analysis_counter,int analysis_type,int finite_element)=0; -
issm/trunk-jpl/src/c/classes/Elements/Penta.cpp
r18717 r18736 345 345 /*Clean up and return*/ 346 346 delete gauss; 347 } 348 /*}}}*/ 349 void Penta::CalvingRateLevermann(){/*{{{*/ 350 351 IssmDouble xyz_list[NUMVERTICES][3]; 352 GaussPenta* gauss=NULL; 353 IssmDouble vx,vy,vel; 354 IssmDouble strainparallel; 355 IssmDouble propcoeff; 356 IssmDouble strainperpendicular; 357 IssmDouble calvingratex[NUMVERTICES]; 358 IssmDouble calvingratey[NUMVERTICES]; 359 IssmDouble calvingrate[NUMVERTICES]; 360 361 362 /* Get node coordinates and dof list: */ 363 ::GetVerticesCoordinates(&xyz_list[0][0],vertices,NUMVERTICES); 364 365 /*Retrieve all inputs and parameters we will need*/ 366 Input* vx_input=inputs->GetInput(VxEnum); _assert_(vx_input); 367 Input* vy_input=inputs->GetInput(VyEnum); _assert_(vy_input); 368 Input* strainparallel_input=inputs->GetInput(StrainRateparallelEnum); _assert_(strainparallel_input); 369 Input* strainperpendicular_input=inputs->GetInput(StrainRateperpendicularEnum); _assert_(strainperpendicular_input); 370 this->parameters->FindParam(&propcoeff,MasstransportLevermannCalvingCoeffEnum); 371 372 /* Start looping on the number of vertices: */ 373 gauss=new GaussPenta(); 374 for (int iv=0;iv<NUMVERTICES;iv++){ 375 gauss->GaussVertex(iv); 376 377 /* Get the value we need*/ 378 vx_input->GetInputValue(&vx,gauss); 379 vy_input->GetInputValue(&vy,gauss); 380 vel=vx*vx+vy*vy; 381 strainparallel_input->GetInputValue(&strainparallel,gauss); 382 strainperpendicular_input->GetInputValue(&strainperpendicular,gauss); 383 384 /*Calving rate proportionnal to the positive product of the strain rate along the ice flow direction and the strain rate perpendicular to the ice flow */ 385 calvingrate[iv]=propcoeff*strainparallel*strainperpendicular; 386 if(calvingrate[iv]<0){ 387 calvingrate[iv]=0; 388 } 389 calvingratex[iv]=calvingrate[iv]*vx/(vel+1.e-6); 390 calvingratey[iv]=calvingrate[iv]*vy/(vel+1.e-6); 391 } 392 393 /*Add input*/ 394 this->inputs->AddInput(new PentaInput(CalvingratexEnum,&calvingratex[0],P1Enum)); 395 this->inputs->AddInput(new PentaInput(CalvingrateyEnum,&calvingratey[0],P1Enum)); 396 this->inputs->AddInput(new PentaInput(MasstransportCalvingrateEnum,&calvingrate[0],P1Enum)); 397 398 /*Clean up and return*/ 399 delete gauss; 400 347 401 } 348 402 /*}}}*/ … … 426 480 void Penta::StrainRateparallel(){/*{{{*/ 427 481 428 IssmDouble xyz_list[NUMVERTICES][3]; 482 IssmDouble *xyz_list = NULL; 483 IssmDouble epsilon[6]; 429 484 GaussPenta* gauss=NULL; 430 485 IssmDouble vx,vy,vel; … … 435 490 436 491 /* Get node coordinates and dof list: */ 437 ::GetVerticesCoordinates(&xyz_list[0][0],vertices,NUMVERTICES);438 492 this->GetVerticesCoordinates(&xyz_list); 493 439 494 /*Retrieve all inputs we will need*/ 440 495 Input* vx_input=inputs->GetInput(VxEnum); _assert_(vx_input); 441 496 Input* vy_input=inputs->GetInput(VyEnum); _assert_(vy_input); 442 Input* strainxx_input=inputs->GetInput(StrainRatexxEnum); _assert_(strainxx_input); 443 Input* strainxy_input=inputs->GetInput(StrainRatexyEnum); _assert_(strainxy_input); 444 Input* strainyy_input=inputs->GetInput(StrainRateyyEnum); _assert_(strainyy_input); 497 Input* vz_input=inputs->GetInput(VzEnum); _assert_(vz_input); 445 498 446 499 /* Start looping on the number of vertices: */ … … 453 506 vy_input->GetInputValue(&vy,gauss); 454 507 vel=vx*vx+vy*vy; 455 strainxx_input->GetInputValue(&strainxx,gauss); 456 strainxy_input->GetInputValue(&strainxy,gauss); 457 strainyy_input->GetInputValue(&strainyy,gauss); 508 509 /*Compute strain rate and viscosity: */ 510 this->StrainRateFS(&epsilon[0],xyz_list,gauss,vx_input,vy_input,vz_input); 511 strainxx=epsilon[0]; 512 strainyy=epsilon[1]; 513 strainxy=epsilon[3]; 458 514 459 515 /*strainparallel= Strain rate along the ice flow direction */ … … 466 522 /*Clean up and return*/ 467 523 delete gauss; 524 xDelete<IssmDouble>(xyz_list); 468 525 } 469 526 /*}}}*/ 470 527 void Penta::StrainRateperpendicular(){/*{{{*/ 471 528 472 IssmDouble xyz_list[NUMVERTICES][3]; 529 IssmDouble *xyz_list = NULL; 530 IssmDouble epsilon[6]; 473 531 GaussPenta* gauss=NULL; 474 532 IssmDouble vx,vy,vel; … … 479 537 480 538 /* Get node coordinates and dof list: */ 481 ::GetVerticesCoordinates(&xyz_list[0][0],vertices,NUMVERTICES);539 this->GetVerticesCoordinates(&xyz_list); 482 540 483 541 /*Retrieve all inputs we will need*/ 484 542 Input* vx_input=inputs->GetInput(VxEnum); _assert_(vx_input); 485 543 Input* vy_input=inputs->GetInput(VyEnum); _assert_(vy_input); 486 Input* strainxx_input=inputs->GetInput(StrainRatexxEnum); _assert_(strainxx_input); 487 Input* strainxy_input=inputs->GetInput(StrainRatexyEnum); _assert_(strainxy_input); 488 Input* strainyy_input=inputs->GetInput(StrainRateyyEnum); _assert_(strainyy_input); 489 544 Input* vz_input=inputs->GetInput(VzEnum); _assert_(vz_input); 490 545 491 546 /* Start looping on the number of vertices: */ … … 498 553 vy_input->GetInputValue(&vy,gauss); 499 554 vel=vx*vx+vy*vy; 500 strainxx_input->GetInputValue(&strainxx,gauss); 501 strainxy_input->GetInputValue(&strainxy,gauss); 502 strainyy_input->GetInputValue(&strainyy,gauss); 555 556 /*Compute strain rate and viscosity: */ 557 this->StrainRateFS(&epsilon[0],xyz_list,gauss,vx_input,vy_input,vz_input); 558 strainxx=epsilon[0]; 559 strainyy=epsilon[1]; 560 strainxy=epsilon[3]; 503 561 504 562 /*strainperpendicular= Strain rate perpendicular to the ice flow direction */ … … 511 569 /*Clean up and return*/ 512 570 delete gauss; 571 xDelete<IssmDouble>(xyz_list); 513 572 } 514 573 /*}}}*/ … … 2176 2235 if(this->inputs->GetInput(VxEnum)) this->InputDepthAverageAtBase(VxEnum,VxAverageEnum); 2177 2236 if(this->inputs->GetInput(VyEnum)) this->InputDepthAverageAtBase(VyEnum,VyAverageEnum); 2237 if(this->inputs->GetInput(CalvingratexEnum)) this->InputDepthAverageAtBase(CalvingratexEnum,CalvingratexAverageEnum); 2238 if(this->inputs->GetInput(CalvingrateyEnum)) this->InputDepthAverageAtBase(CalvingrateyEnum,CalvingrateyAverageEnum); 2178 2239 Tria* tria=(Tria*)SpawnTria(0,1,2); 2179 2240 this->inputs->DeleteInput(MaterialsRheologyBbarEnum); … … 2181 2242 this->inputs->DeleteInput(VxAverageEnum); 2182 2243 this->inputs->DeleteInput(VyAverageEnum); 2244 this->inputs->DeleteInput(CalvingratexAverageEnum); 2245 this->inputs->DeleteInput(CalvingrateyAverageEnum); 2183 2246 2184 2247 return tria; -
issm/trunk-jpl/src/c/classes/Elements/Penta.h
r18699 r18736 60 60 void StrainRateparallel(); 61 61 void StrainRateperpendicular(); 62 void CalvingRateLevermann(); 62 63 void Configure(Elements* elements,Loads* loads,Nodes* nodes,Vertices* vertices,Materials* materials,Parameters* parameters); 63 64 void ElementSizes(IssmDouble* hx,IssmDouble* hy,IssmDouble* hz); -
issm/trunk-jpl/src/c/classes/Elements/Seg.h
r18699 r18736 58 58 void ComputeDeviatoricStressTensor(){_error_("not implemented yet");}; 59 59 void StressIntensityFactor(void){_error_("not implemented yet");}; 60 void StrainRateparallel(void){_error_("not implemented yet");}; 61 void StrainRateperpendicular(void){_error_("not implemented yet");}; 60 void StrainRateparallel(void){_error_("not implemented yet");}; 61 void StrainRateperpendicular(void){_error_("not implemented yet");}; 62 void CalvingRateLevermann(void){_error_("not implemented yet");}; 62 63 void Configure(Elements* elements,Loads* loads,Nodes* nodesin,Vertices* verticesin,Materials* materials,Parameters* parameters){_error_("not implemented yet");}; 63 64 void SetCurrentConfiguration(Elements* elements,Loads* loads,Nodes* nodes,Materials* materials,Parameters* parameters){_error_("not implemented yet");}; -
issm/trunk-jpl/src/c/classes/Elements/Tetra.h
r18699 r18736 60 60 void StrainRateparallel(void){_error_("not implemented yet");}; 61 61 void StrainRateperpendicular(void){_error_("not implemented yet");}; 62 void CalvingRateLevermann(void){_error_("not implemented yet");}; 62 63 void Configure(Elements* elements,Loads* loads,Nodes* nodesin,Vertices* verticesin,Materials* materials,Parameters* parameters); 63 64 void SetCurrentConfiguration(Elements* elements,Loads* loads,Nodes* nodes,Materials* materials,Parameters* parameters); -
issm/trunk-jpl/src/c/classes/Elements/Tria.cpp
r18717 r18736 276 276 } 277 277 /*}}}*/ 278 void Tria::StrainRateperpendicular(){/*{{{*/279 280 IssmDouble xyz_list[NUMVERTICES][3];281 GaussPenta* gauss=NULL;282 IssmDouble vx,vy,vel;283 IssmDouble strainxx;284 IssmDouble strainxy;285 IssmDouble strainyy;286 IssmDouble strainperpendicular[NUMVERTICES];287 288 /* Get node coordinates and dof list: */289 ::GetVerticesCoordinates(&xyz_list[0][0],vertices,NUMVERTICES);290 291 /*Retrieve all inputs we will need*/292 Input* vx_input=inputs->GetInput(VxEnum); _assert_(vx_input);293 Input* vy_input=inputs->GetInput(VyEnum); _assert_(vy_input);294 Input* strainxx_input=inputs->GetInput(StrainRatexxEnum); _assert_(strainxx_input);295 Input* strainxy_input=inputs->GetInput(StrainRatexyEnum); _assert_(strainxy_input);296 Input* strainyy_input=inputs->GetInput(StrainRateyyEnum); _assert_(strainyy_input);297 298 299 /* Start looping on the number of vertices: */300 gauss=new GaussPenta();301 for (int iv=0;iv<NUMVERTICES;iv++){302 gauss->GaussVertex(iv);303 304 /* Get the value we need*/305 vx_input->GetInputValue(&vx,gauss);306 vy_input->GetInputValue(&vy,gauss);307 vel=vx*vx+vy*vy;308 strainxx_input->GetInputValue(&strainxx,gauss);309 strainxy_input->GetInputValue(&strainxy,gauss);310 strainyy_input->GetInputValue(&strainyy,gauss);311 312 /*strainperpendicular= Strain rate perpendicular to the ice flow direction */313 strainperpendicular[iv]=(vx*vx*(strainyy)+vy*vy*(strainxx)-2*vy*vx*strainxy)/(vel+1.e-6);314 }315 316 /*Add input*/317 this->inputs->AddInput(new PentaInput(StrainRateperpendicularEnum,&strainperpendicular[0],P1Enum));318 319 /*Clean up and return*/320 delete gauss;321 }322 /*}}}*/323 void Tria::StrainRateparallel(){/*{{{*/324 325 IssmDouble xyz_list[NUMVERTICES][3];326 GaussPenta* gauss=NULL;327 IssmDouble vx,vy,vel;328 IssmDouble strainxx;329 IssmDouble strainxy;330 IssmDouble strainyy;331 IssmDouble strainparallel[NUMVERTICES];332 333 /* Get node coordinates and dof list: */334 ::GetVerticesCoordinates(&xyz_list[0][0],vertices,NUMVERTICES);335 336 /*Retrieve all inputs we will need*/337 Input* vx_input=inputs->GetInput(VxEnum); _assert_(vx_input);338 Input* vy_input=inputs->GetInput(VyEnum); _assert_(vy_input);339 Input* strainxx_input=inputs->GetInput(StrainRatexxEnum); _assert_(strainxx_input);340 Input* strainxy_input=inputs->GetInput(StrainRatexyEnum); _assert_(strainxy_input);341 Input* strainyy_input=inputs->GetInput(StrainRateyyEnum); _assert_(strainyy_input);342 343 /* Start looping on the number of vertices: */344 gauss=new GaussPenta();345 for (int iv=0;iv<NUMVERTICES;iv++){346 gauss->GaussVertex(iv);347 348 /* Get the value we need*/349 vx_input->GetInputValue(&vx,gauss);350 vy_input->GetInputValue(&vy,gauss);351 vel=vx*vx+vy*vy;352 strainxx_input->GetInputValue(&strainxx,gauss);353 strainxy_input->GetInputValue(&strainxy,gauss);354 strainyy_input->GetInputValue(&strainyy,gauss);355 356 /*strainparallel= Strain rate along the ice flow direction */357 strainparallel[iv]=(vx*vx*(strainxx)+vy*vy*(strainyy)+2*vy*vx*strainxy)/(vel+1.e-6);358 }359 360 /*Add input*/361 this->inputs->AddInput(new PentaInput(StrainRateparallelEnum,&strainparallel[0],P1Enum));362 363 /*Clean up and return*/364 delete gauss;365 }366 /*}}}*/367 278 void Tria::ComputeDeviatoricStressTensor(){/*{{{*/ 368 279 … … 413 324 /*Clean up and return*/ 414 325 delete gauss; 326 } 327 /*}}}*/ 328 void Tria::StrainRateparallel(){/*{{{*/ 329 330 IssmDouble *xyz_list = NULL; 331 IssmDouble epsilon[3]; 332 GaussTria* gauss=NULL; 333 IssmDouble vx,vy,vel; 334 IssmDouble strainxx; 335 IssmDouble strainxy; 336 IssmDouble strainyy; 337 IssmDouble strainparallel[NUMVERTICES]; 338 339 /* Get node coordinates and dof list: */ 340 this->GetVerticesCoordinates(&xyz_list); 341 342 /*Retrieve all inputs we will need*/ 343 Input* vx_input=inputs->GetInput(VxEnum); _assert_(vx_input); 344 Input* vy_input=inputs->GetInput(VyEnum); _assert_(vy_input); 345 346 /* Start looping on the number of vertices: */ 347 gauss=new GaussTria(); 348 for (int iv=0;iv<NUMVERTICES;iv++){ 349 gauss->GaussVertex(iv); 350 351 /* Get the value we need*/ 352 vx_input->GetInputValue(&vx,gauss); 353 vy_input->GetInputValue(&vy,gauss); 354 vel=vx*vx+vy*vy; 355 356 /*Compute strain rate viscosity and pressure: */ 357 this->StrainRateSSA(&epsilon[0],xyz_list,gauss,vx_input,vy_input); 358 strainxx=epsilon[0]; 359 strainyy=epsilon[1]; 360 strainxy=epsilon[2]; 361 362 /*strainparallel= Strain rate along the ice flow direction */ 363 strainparallel[iv]=(vx*vx*(strainxx)+vy*vy*(strainyy)+2*vy*vx*strainxy)/(vel+1.e-6); 364 } 365 366 /*Add input*/ 367 this->inputs->AddInput(new TriaInput(StrainRateparallelEnum,&strainparallel[0],P1Enum)); 368 369 /*Clean up and return*/ 370 delete gauss; 371 xDelete<IssmDouble>(xyz_list); 372 } 373 /*}}}*/ 374 void Tria::StrainRateperpendicular(){/*{{{*/ 375 376 IssmDouble *xyz_list = NULL; 377 GaussTria* gauss=NULL; 378 IssmDouble epsilon[3]; 379 IssmDouble vx,vy,vel; 380 IssmDouble strainxx; 381 IssmDouble strainxy; 382 IssmDouble strainyy; 383 IssmDouble strainperpendicular[NUMVERTICES]; 384 385 /* Get node coordinates and dof list: */ 386 this->GetVerticesCoordinates(&xyz_list); 387 388 /*Retrieve all inputs we will need*/ 389 Input* vx_input=inputs->GetInput(VxEnum); _assert_(vx_input); 390 Input* vy_input=inputs->GetInput(VyEnum); _assert_(vy_input); 391 392 /* Start looping on the number of vertices: */ 393 gauss=new GaussTria(); 394 for (int iv=0;iv<NUMVERTICES;iv++){ 395 gauss->GaussVertex(iv); 396 397 /* Get the value we need*/ 398 vx_input->GetInputValue(&vx,gauss); 399 vy_input->GetInputValue(&vy,gauss); 400 vel=vx*vx+vy*vy; 401 402 /*Compute strain rate viscosity and pressure: */ 403 this->StrainRateSSA(&epsilon[0],xyz_list,gauss,vx_input,vy_input); 404 strainxx=epsilon[0]; 405 strainyy=epsilon[1]; 406 strainxy=epsilon[2]; 407 408 /*strainperpendicular= Strain rate perpendicular to the ice flow direction */ 409 strainperpendicular[iv]=(vx*vx*(strainyy)+vy*vy*(strainxx)-2*vy*vx*strainxy)/(vel+1.e-6); 410 } 411 412 /*Add input*/ 413 this->inputs->AddInput(new TriaInput(StrainRateperpendicularEnum,&strainperpendicular[0],P1Enum)); 414 415 /*Clean up and return*/ 416 delete gauss; 417 xDelete<IssmDouble>(xyz_list); 418 } 419 /*}}}*/ 420 void Tria::CalvingRateLevermann(){/*{{{*/ 421 422 IssmDouble xyz_list[NUMVERTICES][3]; 423 GaussTria* gauss=NULL; 424 IssmDouble vx,vy,vel; 425 IssmDouble strainparallel; 426 IssmDouble propcoeff; 427 IssmDouble strainperpendicular; 428 IssmDouble calvingratex[NUMVERTICES]; 429 IssmDouble calvingratey[NUMVERTICES]; 430 IssmDouble calvingrate[NUMVERTICES]; 431 432 433 /* Get node coordinates and dof list: */ 434 ::GetVerticesCoordinates(&xyz_list[0][0],vertices,NUMVERTICES); 435 436 /*Retrieve all inputs and parameters we will need*/ 437 Input* vx_input=inputs->GetInput(VxEnum); _assert_(vx_input); 438 Input* vy_input=inputs->GetInput(VyEnum); _assert_(vy_input); 439 Input* strainparallel_input=inputs->GetInput(StrainRateparallelEnum); _assert_(strainparallel_input); 440 Input* strainperpendicular_input=inputs->GetInput(StrainRateperpendicularEnum); _assert_(strainperpendicular_input); 441 this->parameters->FindParam(&propcoeff,MasstransportLevermannCalvingCoeffEnum); 442 443 /* Start looping on the number of vertices: */ 444 gauss=new GaussTria(); 445 for (int iv=0;iv<NUMVERTICES;iv++){ 446 gauss->GaussVertex(iv); 447 448 /* Get the value we need*/ 449 vx_input->GetInputValue(&vx,gauss); 450 vy_input->GetInputValue(&vy,gauss); 451 vel=vx*vx+vy*vy; 452 strainparallel_input->GetInputValue(&strainparallel,gauss); 453 strainperpendicular_input->GetInputValue(&strainperpendicular,gauss); 454 455 /*Calving rate proportionnal to the positive product of the strain rate along the ice flow direction and the strain rate perpendicular to the ice flow */ 456 calvingrate[iv]=propcoeff*strainparallel*strainperpendicular; 457 if(calvingrate[iv]<0){ 458 calvingrate[iv]=0; 459 } 460 calvingratex[iv]=calvingrate[iv]*vx/(vel+1.e-6); 461 calvingratey[iv]=calvingrate[iv]*vy/(vel+1.e-6); 462 } 463 464 /*Add input*/ 465 this->inputs->AddInput(new TriaInput(CalvingratexEnum,&calvingratex[0],P1Enum)); 466 this->inputs->AddInput(new TriaInput(CalvingrateyEnum,&calvingratey[0],P1Enum)); 467 this->inputs->AddInput(new TriaInput(MasstransportCalvingrateEnum,&calvingrate[0],P1Enum)); 468 469 /*Clean up and return*/ 470 delete gauss; 471 415 472 } 416 473 /*}}}*/ -
issm/trunk-jpl/src/c/classes/Elements/Tria.h
r18699 r18736 55 55 void ComputeStressTensor(); 56 56 void ComputeDeviatoricStressTensor(); 57 void StrainRateparallel(); 58 void StrainRateperpendicular(); 57 59 void ComputeSurfaceNormalVelocity(); 58 60 void StressIntensityFactor(void){_error_("not implemented yet");}; 59 void StrainRateparallel(); 60 void StrainRateperpendicular(); 61 void CalvingRateLevermann(); 61 62 void Configure(Elements* elements,Loads* loads,Nodes* nodesin,Vertices* verticesin,Materials* materials,Parameters* parameters); 62 63 void SetCurrentConfiguration(Elements* elements,Loads* loads,Nodes* nodes,Materials* materials,Parameters* parameters); -
issm/trunk-jpl/src/c/classes/FemModel.cpp
r18730 r18736 1695 1695 } 1696 1696 /*}}}*/ 1697 void FemModel::CalvingRateLevermannx(){/*{{{*/ 1698 1699 for(int i=0;i<elements->Size();i++){ 1700 Element* element=dynamic_cast<Element*>(this->elements->GetObjectByOffset(i)); 1701 element->CalvingRateLevermann(); 1702 } 1703 } 1704 /*}}}*/ 1705 void FemModel::StrainRateparallelx(){/*{{{*/ 1706 1707 for(int i=0;i<elements->Size();i++){ 1708 Element* element=dynamic_cast<Element*>(this->elements->GetObjectByOffset(i)); 1709 element->StrainRateparallel(); 1710 } 1711 } 1712 /*}}}*/ 1713 void FemModel::StrainRateperpendicularx(){/*{{{*/ 1714 1715 for(int i=0;i<elements->Size();i++){ 1716 Element* element=dynamic_cast<Element*>(this->elements->GetObjectByOffset(i)); 1717 element->StrainRateperpendicular(); 1718 } 1719 } 1720 /*}}}*/ 1697 1721 #ifdef _HAVE_DAKOTA_ 1698 1722 void FemModel::DakotaResponsesx(double* d_responses,char** responses_descriptors,int numresponsedescriptors,int d_numresponses){/*{{{*/ -
issm/trunk-jpl/src/c/classes/FemModel.h
r18613 r18736 82 82 void BalancethicknessMisfitx(IssmDouble* pV); 83 83 void StressIntensityFactorx(); 84 void StrainRateparallelx(); 85 void StrainRateperpendicularx(); 86 void CalvingRateLevermannx(); 84 87 #ifdef _HAVE_DAKOTA_ 85 88 void DakotaResponsesx(double* d_responses,char** responses_descriptors,int numresponsedescriptors,int d_numresponses); -
issm/trunk-jpl/src/c/cores/transient_core.cpp
r18237 r18736 21 21 /*parameters: */ 22 22 IssmDouble starttime,finaltime,dt,yts; 23 bool isstressbalance,ismasstransport,isFS,isthermal,isgroundingline,isgia,islevelset,isdamageevolution,ishydrology ;23 bool isstressbalance,ismasstransport,isFS,isthermal,isgroundingline,isgia,islevelset,isdamageevolution,ishydrology,iscalvingrate; 24 24 bool save_results,dakota_analysis; 25 25 bool time_adapt=false; … … 53 53 femmodel->parameters->FindParam(&ishydrology,TransientIshydrologyEnum); 54 54 femmodel->parameters->FindParam(&isFS,FlowequationIsFSEnum); 55 femmodel->parameters->FindParam(&iscalvingrate,MasstransportIscalvingrateEnum); 55 56 if(isgroundingline) femmodel->parameters->FindParam(&groundingline_migration,GroundinglineMigrationEnum); 56 57 femmodel->parameters->FindParam(&numoutputs,TransientNumRequestedOutputsEnum); … … 101 102 102 103 if(islevelset){ 104 if(iscalvingrate){ 105 if(VerboseSolution()) _printf0_(" computing calving rate\n"); 106 femmodel->StrainRateparallelx(); 107 femmodel->StrainRateperpendicularx(); 108 femmodel->CalvingRateLevermannx(); 109 } 103 110 if(VerboseSolution()) _printf0_(" computing movement of ice boundaries\n"); 104 111 /* smoothen slope of lsf for computation of normal on ice domain*/ -
issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateParameters.cpp
r18717 r18736 83 83 parameters->AddObject(iomodel->CopyConstantObject(TransientIsdamageevolutionEnum)); 84 84 parameters->AddObject(iomodel->CopyConstantObject(TransientIshydrologyEnum)); 85 parameters->AddObject(iomodel->CopyConstantObject(MasstransportIscalvingrateEnum)); 86 parameters->AddObject(iomodel->CopyConstantObject(MasstransportLevermannCalvingCoeffEnum)); 85 87 parameters->AddObject(iomodel->CopyConstantObject(MaterialsRheologyLawEnum)); 86 88 parameters->AddObject(iomodel->CopyConstantObject(GiaCrossSectionShapeEnum)); -
issm/trunk-jpl/src/c/modules/SetActiveNodesLSMx/SetActiveNodesLSMx.cpp
r18521 r18736 59 59 analysis_type==BalancethicknessAnalysisEnum || 60 60 analysis_type==HydrologyDCInefficientAnalysisEnum || 61 analysis_type==DamageEvolutionAnalysisEnum ||61 //analysis_type==DamageEvolutionAnalysisEnum || 62 62 analysis_type==HydrologyDCEfficientAnalysisEnum || 63 63 analysis_type==LevelsetAnalysisEnum || -
issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h
r18732 r18736 208 208 NewDamageEnum, 209 209 StressIntensityFactorEnum, 210 CalvingratexEnum, 211 CalvingrateyEnum, 212 CalvingratexAverageEnum, 213 CalvingrateyAverageEnum, 210 214 StrainRateparallelEnum, 211 215 StrainRateperpendicularEnum, … … 245 249 MiscellaneousNameEnum, //FIXME: only used by qmu, should not be marshalled (already in queueing script) 246 250 MasstransportHydrostaticAdjustmentEnum, 251 MasstransportIscalvingrateEnum, 252 MasstransportLevermannCalvingCoeffEnum, 247 253 MasstransportIsfreesurfaceEnum, 248 254 MasstransportMinThicknessEnum, -
issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp
r18732 r18736 216 216 case NewDamageEnum : return "NewDamage"; 217 217 case StressIntensityFactorEnum : return "StressIntensityFactor"; 218 case CalvingratexEnum : return "Calvingratex"; 219 case CalvingrateyEnum : return "Calvingratey"; 220 case CalvingratexAverageEnum : return "CalvingratexAverage"; 221 case CalvingrateyAverageEnum : return "CalvingrateyAverage"; 218 222 case StrainRateparallelEnum : return "StrainRateparallel"; 219 223 case StrainRateperpendicularEnum : return "StrainRateperpendicular"; … … 253 257 case MiscellaneousNameEnum : return "MiscellaneousName"; 254 258 case MasstransportHydrostaticAdjustmentEnum : return "MasstransportHydrostaticAdjustment"; 259 case MasstransportIscalvingrateEnum : return "MasstransportIscalvingrate"; 260 case MasstransportLevermannCalvingCoeffEnum : return "MasstransportLevermannCalvingCoeff"; 255 261 case MasstransportIsfreesurfaceEnum : return "MasstransportIsfreesurface"; 256 262 case MasstransportMinThicknessEnum : return "MasstransportMinThickness"; -
issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp
r18732 r18736 219 219 else if (strcmp(name,"NewDamage")==0) return NewDamageEnum; 220 220 else if (strcmp(name,"StressIntensityFactor")==0) return StressIntensityFactorEnum; 221 else if (strcmp(name,"Calvingratex")==0) return CalvingratexEnum; 222 else if (strcmp(name,"Calvingratey")==0) return CalvingrateyEnum; 223 else if (strcmp(name,"CalvingratexAverage")==0) return CalvingratexAverageEnum; 224 else if (strcmp(name,"CalvingrateyAverage")==0) return CalvingrateyAverageEnum; 221 225 else if (strcmp(name,"StrainRateparallel")==0) return StrainRateparallelEnum; 222 226 else if (strcmp(name,"StrainRateperpendicular")==0) return StrainRateperpendicularEnum; … … 256 260 else if (strcmp(name,"MiscellaneousName")==0) return MiscellaneousNameEnum; 257 261 else if (strcmp(name,"MasstransportHydrostaticAdjustment")==0) return MasstransportHydrostaticAdjustmentEnum; 262 else stage=3; 263 } 264 if(stage==3){ 265 if (strcmp(name,"MasstransportIscalvingrate")==0) return MasstransportIscalvingrateEnum; 266 else if (strcmp(name,"MasstransportLevermannCalvingCoeff")==0) return MasstransportLevermannCalvingCoeffEnum; 258 267 else if (strcmp(name,"MasstransportIsfreesurface")==0) return MasstransportIsfreesurfaceEnum; 259 268 else if (strcmp(name,"MasstransportMinThickness")==0) return MasstransportMinThicknessEnum; 260 269 else if (strcmp(name,"MasstransportPenaltyFactor")==0) return MasstransportPenaltyFactorEnum; 261 270 else if (strcmp(name,"MasstransportSpcthickness")==0) return MasstransportSpcthicknessEnum; 262 else stage=3; 263 } 264 if(stage==3){ 265 if (strcmp(name,"MasstransportCalvingrate")==0) return MasstransportCalvingrateEnum; 271 else if (strcmp(name,"MasstransportCalvingrate")==0) return MasstransportCalvingrateEnum; 266 272 else if (strcmp(name,"MasstransportStabilization")==0) return MasstransportStabilizationEnum; 267 273 else if (strcmp(name,"MasstransportVertexPairing")==0) return MasstransportVertexPairingEnum; … … 377 383 else if (strcmp(name,"BalancethicknessSolution")==0) return BalancethicknessSolutionEnum; 378 384 else if (strcmp(name,"Balancethickness2Analysis")==0) return Balancethickness2AnalysisEnum; 379 else if (strcmp(name,"Balancethickness2Solution")==0) return Balancethickness2SolutionEnum; 385 else stage=4; 386 } 387 if(stage==4){ 388 if (strcmp(name,"Balancethickness2Solution")==0) return Balancethickness2SolutionEnum; 380 389 else if (strcmp(name,"BalancethicknessSoftAnalysis")==0) return BalancethicknessSoftAnalysisEnum; 381 390 else if (strcmp(name,"BalancethicknessSoftSolution")==0) return BalancethicknessSoftSolutionEnum; … … 383 392 else if (strcmp(name,"BalancevelocitySolution")==0) return BalancevelocitySolutionEnum; 384 393 else if (strcmp(name,"L2ProjectionEPLAnalysis")==0) return L2ProjectionEPLAnalysisEnum; 385 else stage=4; 386 } 387 if(stage==4){ 388 if (strcmp(name,"L2ProjectionBaseAnalysis")==0) return L2ProjectionBaseAnalysisEnum; 394 else if (strcmp(name,"L2ProjectionBaseAnalysis")==0) return L2ProjectionBaseAnalysisEnum; 389 395 else if (strcmp(name,"BedSlopeSolution")==0) return BedSlopeSolutionEnum; 390 396 else if (strcmp(name,"DamageEvolutionSolution")==0) return DamageEvolutionSolutionEnum; … … 500 506 else if (strcmp(name,"TriaInput")==0) return TriaInputEnum; 501 507 else if (strcmp(name,"Tetra")==0) return TetraEnum; 502 else if (strcmp(name,"TetraInput")==0) return TetraInputEnum; 508 else stage=5; 509 } 510 if(stage==5){ 511 if (strcmp(name,"TetraInput")==0) return TetraInputEnum; 503 512 else if (strcmp(name,"Penta")==0) return PentaEnum; 504 513 else if (strcmp(name,"PentaInput")==0) return PentaInputEnum; … … 506 515 else if (strcmp(name,"VertexPId")==0) return VertexPIdEnum; 507 516 else if (strcmp(name,"VertexSId")==0) return VertexSIdEnum; 508 else stage=5; 509 } 510 if(stage==5){ 511 if (strcmp(name,"Air")==0) return AirEnum; 517 else if (strcmp(name,"Air")==0) return AirEnum; 512 518 else if (strcmp(name,"Ice")==0) return IceEnum; 513 519 else if (strcmp(name,"Melange")==0) return MelangeEnum; … … 623 629 else if (strcmp(name,"P2xP4")==0) return P2xP4Enum; 624 630 else if (strcmp(name,"P1P1")==0) return P1P1Enum; 625 else if (strcmp(name,"P1P1GLS")==0) return P1P1GLSEnum; 631 else stage=6; 632 } 633 if(stage==6){ 634 if (strcmp(name,"P1P1GLS")==0) return P1P1GLSEnum; 626 635 else if (strcmp(name,"MINI")==0) return MINIEnum; 627 636 else if (strcmp(name,"MINIcondensed")==0) return MINIcondensedEnum; … … 629 638 else if (strcmp(name,"LATaylorHood")==0) return LATaylorHoodEnum; 630 639 else if (strcmp(name,"XTaylorHood")==0) return XTaylorHoodEnum; 631 else stage=6; 632 } 633 if(stage==6){ 634 if (strcmp(name,"OneLayerP4z")==0) return OneLayerP4zEnum; 640 else if (strcmp(name,"OneLayerP4z")==0) return OneLayerP4zEnum; 635 641 else if (strcmp(name,"CrouzeixRaviart")==0) return CrouzeixRaviartEnum; 636 642 else if (strcmp(name,"LACrouzeixRaviart")==0) return LACrouzeixRaviartEnum; … … 746 752 else if (strcmp(name,"LevelsetfunctionSlopeY")==0) return LevelsetfunctionSlopeYEnum; 747 753 else if (strcmp(name,"LevelsetfunctionPicard")==0) return LevelsetfunctionPicardEnum; 748 else if (strcmp(name,"Seaiceatm")==0) return SeaiceatmEnum; 754 else stage=7; 755 } 756 if(stage==7){ 757 if (strcmp(name,"Seaiceatm")==0) return SeaiceatmEnum; 749 758 else if (strcmp(name,"Seaiceocean")==0) return SeaiceoceanEnum; 750 759 else if (strcmp(name,"SeaiceThickness")==0) return SeaiceThicknessEnum; … … 752 761 else if (strcmp(name,"SeaiceMinConcentration")==0) return SeaiceMinConcentrationEnum; 753 762 else if (strcmp(name,"SeaiceMinThickness")==0) return SeaiceMinThicknessEnum; 754 else stage=7; 755 } 756 if(stage==7){ 757 if (strcmp(name,"SeaiceMaxThickness")==0) return SeaiceMaxThicknessEnum; 763 else if (strcmp(name,"SeaiceMaxThickness")==0) return SeaiceMaxThicknessEnum; 758 764 else if (strcmp(name,"SeaiceSpcvx")==0) return SeaiceSpcvxEnum; 759 765 else if (strcmp(name,"SeaiceSpcvy")==0) return SeaiceSpcvyEnum;
Note:
See TracChangeset
for help on using the changeset viewer.