Changeset 18633
- Timestamp:
- 10/14/14 12:15:04 (10 years ago)
- Location:
- issm/trunk-jpl/src/c/analyses
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.cpp
r18581 r18633 158 158 basalelement->GetVerticesCoordinates(&xyz_list); 159 159 basalelement->FindParam(&dt,TimesteppingTimeStepEnum); 160 Input* thickness_input = basalelement->GetInput(HydrologydcEplThicknessEnum); _assert_(thickness_input); 160 161 Input* epl_thick_input = basalelement->GetInput(HydrologydcEplThicknessEnum); _assert_(epl_thick_input); 161 162 Input* sed_head_input = basalelement->GetInput(SedimentHeadEnum); 162 163 Input* epl_head_input = basalelement->GetInput(EplHeadEnum); 163 Input* sed_trans_input = basalelement->GetInput(HydrologydcSedimentTransmitivityEnum);164 164 Input* residual_input = basalelement->GetInput(SedimentHeadResidualEnum); 165 165 … … 172 172 gauss ->GaussPoint(ig); 173 173 basalelement ->JacobianDeterminant(&Jdet,xyz_list,gauss); 174 thickness_input ->GetInputValue(&epl_thickness,gauss);174 epl_thick_input ->GetInputValue(&epl_thickness,gauss); 175 175 176 176 /*Diffusivity*/ … … 195 195 196 196 /*Transfer EPL part*/ 197 transfer=GetHydrologyKMatrixTransfer(basalelement,gauss, thickness_input,sed_head_input,epl_head_input,sed_trans_input,residual_input);197 transfer=GetHydrologyKMatrixTransfer(basalelement,gauss,sed_head_input,epl_head_input,residual_input); 198 198 D_scalar=transfer*gauss->weight*Jdet*dt; 199 199 TripleMultiply(basis,numnodes,1,0, … … 266 266 basalelement->FindParam(&dt,TimesteppingTimeStepEnum); 267 267 268 Input* thickness_input = basalelement->GetInput(HydrologydcEplThicknessEnum); _assert_(thickness_input); 269 Input* sed_head_input = basalelement->GetInput(SedimentHeadEnum); 270 Input* epl_head_input = basalelement->GetInput(EplHeadEnum); 271 Input* sed_trans_input = basalelement->GetInput(HydrologydcSedimentTransmitivityEnum); 272 Input* residual_input = basalelement->GetInput(SedimentHeadResidualEnum); _assert_(residual_input); 268 Input* epl_thick_input = basalelement->GetInput(HydrologydcEplThicknessEnum); _assert_(epl_thick_input); 269 Input* sed_head_input = basalelement->GetInput(SedimentHeadEnum); 270 Input* epl_head_input = basalelement->GetInput(EplHeadEnum); 271 Input* residual_input = basalelement->GetInput(SedimentHeadResidualEnum); _assert_(residual_input); 273 272 if(dt!= 0.){old_wh_input = basalelement->GetInput(EplHeadOldEnum); _assert_(old_wh_input);} 274 273 … … 286 285 if(dt!=0.){ 287 286 old_wh_input ->GetInputValue(&water_head,gauss); 288 thickness_input ->GetInputValue(&epl_thickness,gauss);287 epl_thick_input ->GetInputValue(&epl_thickness,gauss); 289 288 290 289 /*Dealing with the epl part of the transfer term*/ 291 transfer=GetHydrologyPVectorTransfer(basalelement,gauss, thickness_input,sed_head_input,epl_head_input,sed_trans_input,residual_input);290 transfer=GetHydrologyPVectorTransfer(basalelement,gauss,sed_head_input,epl_head_input,residual_input); 292 291 scalar = Jdet*gauss->weight*((water_head*epl_specificstoring*epl_thickness)+(transfer*dt)); 293 292 for(int i=0;i<numnodes;i++)pe->values[i]+=scalar*basis[i]; … … 322 321 void HydrologyDCEfficientAnalysis::InputUpdateFromSolution(IssmDouble* solution,Element* element){/*{{{*/ 323 322 323 bool active_element; 324 324 int domaintype,i; 325 325 Element* basalelement=NULL; … … 341 341 int numnodes = basalelement->GetNumberOfNodes(); 342 342 343 343 344 /*Fetch dof list and allocate solution vector*/ 345 IssmDouble* sedhead = xNew<IssmDouble>(numnodes); 346 IssmDouble* eplHeads = xNew<IssmDouble>(numnodes); 347 344 348 basalelement->GetDofList(&doflist,NoneApproximationEnum,GsetEnum); 345 IssmDouble* eplHeads = xNew<IssmDouble>(numnodes); 346 347 /*Use the dof list to index into the solution vector: */ 349 basalelement->GetInputListOnVertices(&sedhead[0],SedimentHeadEnum); 350 351 Input* active_element_input=basalelement->GetInput(HydrologydcMaskEplactiveEltEnum); _assert_(active_element_input); 352 active_element_input->GetInputValue(&active_element); 353 354 /* if(!active_element){ */ 355 /* /\*Keeping thickness to initial value if EPL is not active*\/ */ 356 /* for(i=0;i<numnodes;i++){ */ 357 /* eplHeads[i]=sedhead[i]; */ 358 /* } */ 359 /* } */ 360 /* else{ */ 361 /*Use the dof list to index into the solution vector: */ 348 362 for(i=0;i<numnodes;i++){ 349 363 eplHeads[i]=solution[doflist[i]]; 350 364 if(xIsNan<IssmDouble>(eplHeads[i])) _error_("NaN found in solution vector"); 351 365 } 366 // } 352 367 /*Add input to the element: */ 353 368 element->AddBasalInput(EplHeadEnum,eplHeads,P1Enum); … … 355 370 /*Free ressources:*/ 356 371 xDelete<IssmDouble>(eplHeads); 372 xDelete<IssmDouble>(sedhead); 357 373 xDelete<int>(doflist); 358 374 if(domaintype!=Domain2DhorizontalEnum){basalelement->DeleteMaterials(); delete basalelement;}; … … 381 397 return rho_freshwater*g*sediment_porosity*sediment_thickness*(water_compressibility+(sediment_compressibility/sediment_porosity)); 382 398 }/*}}}*/ 383 IssmDouble HydrologyDCEfficientAnalysis::GetHydrologyKMatrixTransfer(Element* element, Gauss* gauss, Input* epl_thick_input, Input* sed_head_input, Input* epl_head_input, Input* sed_trans_input, Input* residual_input){/*{{{*/ 399 400 IssmDouble HydrologyDCEfficientAnalysis::GetHydrologyKMatrixTransfer(Element* element, Gauss* gauss, Input* sed_head_input, Input* epl_head_input, Input* residual_input){/*{{{*/ 384 401 402 385 403 int transfermethod; 386 IssmDouble epl_thickness; 387 IssmDouble epl_head,sed_head; 388 IssmDouble sediment_transmitivity; 389 IssmDouble leakage,residual,transfer; 390 391 IssmDouble sediment_thickness = element->GetMaterialParameter(HydrologydcSedimentThicknessEnum); 392 IssmDouble sediment_storing = SedimentStoring(element); 393 IssmDouble epl_specificstoring = EplSpecificStoring(element); 404 IssmDouble epl_thickness,sed_residual; 405 IssmDouble epl_head,sediment_head; 406 IssmDouble leakage,transfer; 394 407 395 408 element->FindParam(&transfermethod,HydrologydcTransferFlagEnum); 409 396 410 /*Switch between the different transfer methods cases*/ 397 411 switch(transfermethod){ … … 401 415 break; 402 416 case 1: 403 _assert_(epl_thick_input); 404 _assert_(sed_head_input); 405 _assert_(epl_head_input); 406 _assert_(sed_trans_input); 407 _assert_(residual_input); 408 /* get input */ 409 epl_thick_input->GetInputValue(&epl_thickness,gauss); 410 sed_head_input->GetInputValue(&sed_head,gauss); 417 _assert_(sed_head_input); 418 _assert_(epl_head_input); 419 _assert_(residual_input); 420 421 sed_head_input->GetInputValue(&sediment_head,gauss); 411 422 epl_head_input->GetInputValue(&epl_head,gauss); 412 sed_trans_input->GetInputValue(&sediment_transmitivity,gauss); 413 residual_input->GetInputValue(&residual,gauss); 423 residual_input->GetInputValue(&sed_residual,gauss); 414 424 element->FindParam(&leakage,HydrologydcLeakageFactorEnum); 415 transfer=(sediment_transmitivity)/(sediment_thickness*leakage); 425 426 if(epl_head>sediment_head){ 427 if(sed_residual>0.0){ 428 transfer=0.0; 429 } 430 else{ 431 transfer=(leakage); 432 } 433 } 434 else{ 435 transfer=(leakage); 436 } 416 437 break; 417 438 default: 418 439 _error_("no case higher than 1 for the Transfer method"); 419 440 } 420 441 if(element->Id()==42){ 442 printf("Transferefficient Kmat %e, %e, %e, %i \n",transfer,sediment_head,epl_head,element->Id()); 443 } 421 444 return transfer; 422 445 }/*}}}*/ 423 IssmDouble HydrologyDCEfficientAnalysis::GetHydrologyPVectorTransfer(Element* element, Gauss* gauss, Input* epl_thick_input, Input* sed_head_input, Input* epl_head_input, Input* sed_trans_input, Input* residual_input){/*{{{*/ 446 447 IssmDouble HydrologyDCEfficientAnalysis::GetHydrologyPVectorTransfer(Element* element, Gauss* gauss, Input* sed_head_input, Input* epl_head_input, Input* residual_input){/*{{{*/ 424 448 425 449 int transfermethod; 426 IssmDouble epl_thickness;450 IssmDouble sed_residual; 427 451 IssmDouble epl_head,sediment_head; 428 IssmDouble sediment_transmitivity; 429 IssmDouble leakage,residual,transfer; 430 431 IssmDouble sediment_thickness = element->GetMaterialParameter(HydrologydcSedimentThicknessEnum); 432 IssmDouble sediment_storing = SedimentStoring(element); 433 IssmDouble epl_specificstoring = EplSpecificStoring(element); 452 IssmDouble leakage,transfer; 434 453 435 454 element->FindParam(&transfermethod,HydrologydcTransferFlagEnum); 455 436 456 /*Switch between the different transfer methods cases*/ 437 457 switch(transfermethod){ … … 441 461 break; 442 462 case 1: 443 _assert_(epl_thick_input); 444 _assert_(sed_head_input); 445 _assert_(epl_head_input); 446 _assert_(sed_trans_input); 447 _assert_(residual_input); 448 /* get input */ 449 epl_thick_input->GetInputValue(&epl_thickness,gauss); 463 _assert_(sed_head_input); 464 _assert_(epl_head_input); 465 _assert_(residual_input); 466 450 467 sed_head_input->GetInputValue(&sediment_head,gauss); 451 468 epl_head_input->GetInputValue(&epl_head,gauss); 452 sed_trans_input->GetInputValue(&sediment_transmitivity,gauss); 453 residual_input->GetInputValue(&residual,gauss); 469 residual_input->GetInputValue(&sed_residual,gauss); 454 470 element->FindParam(&leakage,HydrologydcLeakageFactorEnum); 455 471 456 transfer=(sediment_transmitivity*sediment_head)/(sediment_thickness*leakage); 472 if(epl_head>sediment_head){ 473 if(sed_residual>0.0){ 474 transfer=0.0; 475 } 476 else{ 477 transfer=(sediment_head*leakage); 478 } 479 } 480 else{ 481 transfer=(sediment_head*leakage); 482 } 457 483 break; 458 484 default: 459 485 _error_("no case higher than 1 for the Transfer method"); 486 } 487 if(element->Id()==42){ 488 printf("Transferefficient Pvec %e, %e, %e\n",transfer,sediment_head,epl_head); 460 489 } 461 490 return transfer; … … 519 548 element->GetInputListOnVertices(&ice_thickness[0],ThicknessEnum); 520 549 element->GetInputListOnVertices(&bed[0],BaseEnum); 521 550 522 551 if(!active_element){ 523 552 -
issm/trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.h
r18057 r18633 36 36 IssmDouble EplSpecificStoring(Element* element); 37 37 IssmDouble SedimentStoring(Element* element); 38 IssmDouble GetHydrologyKMatrixTransfer(Element* element, Gauss* gauss, Input* epl_thick_input, Input* sed_head_input, Input* epl_head_input, Input* sed_trans_input, Input* residual_input);39 IssmDouble GetHydrologyPVectorTransfer(Element* element, Gauss* gauss, Input* epl_thick_input, Input* sed_head_input, Input* epl_head_input, Input* sed_trans_input, Input* residual_input);38 IssmDouble GetHydrologyKMatrixTransfer(Element* element, Gauss* gauss, Input* sed_head_input, Input* epl_head_input, Input* residual_input); 39 IssmDouble GetHydrologyPVectorTransfer(Element* element, Gauss* gauss, Input* sed_head_input, Input* epl_head_input, Input* residual_input); 40 40 void HydrologyEPLGetMask(Vector<IssmDouble>* vec_mask,Element* element); 41 41 void HydrologyEPLGetActive(Vector<IssmDouble>* active_vec, Element* element); -
issm/trunk-jpl/src/c/analyses/HydrologyDCInefficientAnalysis.cpp
r18576 r18633 197 197 basalelement ->FindParam(&dt,TimesteppingTimeStepEnum); 198 198 basalelement ->FindParam(&isefficientlayer,HydrologydcIsefficientlayerEnum); 199 200 Input* epl_thick_input = basalelement->GetInput(HydrologydcEplThicknessEnum); 199 Input* SedTrans_input = basalelement->GetInput(HydrologydcSedimentTransmitivityEnum); _assert_(SedTrans_input); 201 200 Input* sed_head_input = basalelement->GetInput(SedimentHeadEnum); 202 201 Input* epl_head_input = basalelement->GetInput(EplHeadEnum); 203 Input* thickness_input = basalelement->GetInput(ThicknessEnum); 204 Input* base_input = basalelement->GetInput(BaseEnum); 205 Input* SedTrans_input = basalelement->GetInput(HydrologydcSedimentTransmitivityEnum); _assert_(SedTrans_input); 202 Input* residual_input = basalelement->GetInput(SedimentHeadResidualEnum); 203 206 204 IssmDouble sediment_storing = SedimentStoring(basalelement); 207 205 /*Transfer related Inputs*/ … … 240 238 active_element_input->GetInputValue(&active_element); 241 239 if(active_element){ 242 transfer=GetHydrologyKMatrixTransfer(basalelement,gauss, epl_thick_input,sed_head_input,epl_head_input,SedTrans_input,thickness_input,base_input);240 transfer=GetHydrologyKMatrixTransfer(basalelement,gauss,sed_head_input,epl_head_input,residual_input); 243 241 basalelement->NodalFunctions(&basis[0],gauss); 244 242 D_scalar=transfer*gauss->weight*Jdet*dt; … … 296 294 IssmDouble* basis = xNew<IssmDouble>(numnodes); 297 295 296 298 297 /*Retrieve all inputs and parameters*/ 299 298 basalelement->GetVerticesCoordinates(&xyz_list); … … 301 300 basalelement->FindParam(&isefficientlayer,HydrologydcIsefficientlayerEnum); 302 301 303 Input* epl_thick_input = basalelement->GetInput(HydrologydcEplThicknessEnum);304 302 Input* sed_head_input = basalelement->GetInput(SedimentHeadEnum); 305 303 Input* epl_head_input = basalelement->GetInput(EplHeadEnum); 306 Input* sed_trans_input = basalelement->GetInput(HydrologydcSedimentTransmitivityEnum);307 Input* thickness_input = basalelement->GetInput(ThicknessEnum);308 Input* base_input = basalelement->GetInput(BaseEnum);309 304 Input* water_input = basalelement->GetInput(BasalforcingsGroundediceMeltingRateEnum); _assert_(water_input); 305 Input* residual_input = basalelement->GetInput(SedimentHeadResidualEnum); 310 306 if(dt!= 0.){old_wh_input = basalelement->GetInput(SedimentHeadOldEnum); _assert_(old_wh_input);} 311 307 … … 342 338 active_element_input->GetInputValue(&active_element); 343 339 if(active_element){ 344 transfer=GetHydrologyPVectorTransfer(basalelement,gauss, epl_thick_input,sed_head_input,epl_head_input,sed_trans_input,thickness_input,base_input);340 transfer=GetHydrologyPVectorTransfer(basalelement,gauss,sed_head_input,epl_head_input,residual_input); 345 341 } 346 342 else{ … … 571 567 } 572 568 /*}}}*/ 573 IssmDouble HydrologyDCInefficientAnalysis::GetHydrologyKMatrixTransfer(Element* element, Gauss* gauss, Input* epl_thick_input, Input* sed_head_input, Input* epl_head_input, Input* sed_trans_input, Input* thickness_input, Input* base_input){/*{{{*/ 569 570 IssmDouble HydrologyDCInefficientAnalysis::GetHydrologyKMatrixTransfer(Element* element, Gauss* gauss, Input* sed_head_input, Input* epl_head_input, Input* residual_input){/*{{{*/ 574 571 575 572 int transfermethod; 576 IssmDouble epl_thickness; 577 IssmDouble epl_head,sed_head; 578 IssmDouble sediment_transmitivity; 579 IssmDouble leakage,h_max,transfer; 580 581 IssmDouble sediment_thickness = element->GetMaterialParameter(HydrologydcSedimentThicknessEnum); 582 IssmDouble sediment_storing = SedimentStoring(element); 583 IssmDouble epl_specificstoring = EplSpecificStoring(element); 573 IssmDouble sed_residual; 574 IssmDouble epl_head,sediment_head; 575 IssmDouble leakage,transfer; 584 576 585 577 element->FindParam(&transfermethod,HydrologydcTransferFlagEnum); 578 586 579 /*Switch between the different transfer methods cases*/ 587 580 switch(transfermethod){ … … 591 584 break; 592 585 case 1: 593 594 _assert_(epl_thick_input);595 586 _assert_(sed_head_input); 596 587 _assert_(epl_head_input); 597 _assert_(sed_trans_input); 598 _assert_(thickness_input); 599 _assert_(base_input); 600 601 epl_thick_input->GetInputValue(&epl_thickness,gauss); 602 sed_head_input->GetInputValue(&sed_head,gauss); 588 _assert_(residual_input); 589 590 sed_head_input->GetInputValue(&sediment_head,gauss); 603 591 epl_head_input->GetInputValue(&epl_head,gauss); 604 sed_trans_input->GetInputValue(&sediment_transmitivity,gauss);592 residual_input->GetInputValue(&sed_residual,gauss); 605 593 element->FindParam(&leakage,HydrologydcLeakageFactorEnum); 606 594 607 transfer=(sediment_transmitivity)/(sediment_thickness*leakage); 595 if(epl_head>sediment_head){ 596 if(sediment_head>=400.0){ 597 transfer=0.0; 598 } 599 else{ 600 transfer=(leakage); 601 } 602 } 603 else{ 604 transfer=(leakage); 605 } 608 606 break; 609 607 default: 610 608 _error_("no case higher than 1 for the Transfer method"); 611 609 } 612 610 if(element->Id()==42){ 611 printf("TransferInfficient Kmat %e, %e, %e, %i\n",transfer,sediment_head,epl_head,element->Id()); 612 } 613 613 return transfer; 614 614 }/*}}}*/ 615 615 616 IssmDouble HydrologyDCInefficientAnalysis::GetHydrologyPVectorTransfer(Element* element, Gauss* gauss, Input* epl_thick_input, Input* sed_head_input, Input* epl_head_input, Input* sed_trans_input, Input* thickness_input, Input* base_input){/*{{{*/616 IssmDouble HydrologyDCInefficientAnalysis::GetHydrologyPVectorTransfer(Element* element, Gauss* gauss, Input* sed_head_input, Input* epl_head_input, Input* residual_input){/*{{{*/ 617 617 618 618 int transfermethod; 619 IssmDouble epl_thickness;619 IssmDouble sed_residual; 620 620 IssmDouble epl_head,sediment_head; 621 IssmDouble sediment_transmitivity; 622 IssmDouble leakage,h_max,transfer; 623 624 IssmDouble sediment_thickness = element->GetMaterialParameter(HydrologydcSedimentThicknessEnum); 625 IssmDouble sediment_storing = SedimentStoring(element); 626 IssmDouble epl_specificstoring = EplSpecificStoring(element); 621 IssmDouble leakage,transfer; 627 622 628 623 element->FindParam(&transfermethod,HydrologydcTransferFlagEnum); 624 629 625 /*Switch between the different transfer methods cases*/ 630 626 switch(transfermethod){ … … 634 630 break; 635 631 case 1: 636 637 _assert_(epl_thick_input);638 632 _assert_(sed_head_input); 639 633 _assert_(epl_head_input); 640 _assert_(sed_trans_input); 641 _assert_(thickness_input); 642 _assert_(base_input); 643 644 epl_thick_input->GetInputValue(&epl_thickness,gauss); 634 _assert_(residual_input); 635 645 636 sed_head_input->GetInputValue(&sediment_head,gauss); 646 637 epl_head_input->GetInputValue(&epl_head,gauss); 647 sed_trans_input->GetInputValue(&sediment_transmitivity,gauss);638 residual_input->GetInputValue(&sed_residual,gauss); 648 639 element->FindParam(&leakage,HydrologydcLeakageFactorEnum); 649 640 650 transfer=(sediment_transmitivity*epl_head)/(sediment_thickness*leakage); 641 if(epl_head>sediment_head){ 642 if(sediment_head>=400.0){ 643 transfer=0.0; 644 } 645 else{ 646 transfer=(epl_head*leakage); 647 } 648 } 649 else{ 650 transfer=(epl_head*leakage); 651 } 651 652 break; 652 653 default: 653 654 _error_("no case higher than 1 for the Transfer method"); 655 } 656 if(element->Id()==42){ 657 printf("TransferInfficient Pvec %e, %e, %e, %i\n",transfer,sediment_head,epl_head,element->Id()); 654 658 } 655 659 return transfer; -
issm/trunk-jpl/src/c/analyses/HydrologyDCInefficientAnalysis.h
r18057 r18633 38 38 IssmDouble GetHydrologyDCInefficientHmax(Element* element, Gauss* gauss, Input* thickness_input, Input* base_input); 39 39 void GetHydrologyDCInefficientHmax(IssmDouble* ph_max,Element* element, Node* innode); 40 IssmDouble GetHydrologyKMatrixTransfer(Element* element, Gauss* gauss, Input* epl_thick_input, Input* sed_head_input, Input* epl_head_input, Input* sed_trans_input, Input* thickness_input, Input* base_input);41 IssmDouble GetHydrologyPVectorTransfer(Element* element, Gauss* gauss, Input* epl_thick_input, Input* sed_head_input, Input* epl_head_input, Input* sed_trans_input, Input* thickness_input, Input* base_input);40 IssmDouble GetHydrologyKMatrixTransfer(Element* element, Gauss* gauss, Input* sed_head_input, Input* epl_head_input, Input* residual_input); 41 IssmDouble GetHydrologyPVectorTransfer(Element* element, Gauss* gauss, Input* sed_head_input, Input* epl_head_input, Input* residual_input); 42 42 void ElementizeEplMask(FemModel* femmodel); 43 43 };
Note:
See TracChangeset
for help on using the changeset viewer.