Changeset 18505
- Timestamp:
- 09/11/14 08:39:35 (11 years ago)
- Location:
- issm/trunk-jpl/src/c
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/analyses/SeaiceAnalysis.cpp
r18504 r18505 141 141 for(int i=0;i<3;i++){ 142 142 for(int j=0;j<3;j++){ 143 C[i][j] = dt*t ime_ratio*gauss->weight*Jdet*C[i][j];143 C[i][j] = dt*thickness*time_ratio*gauss->weight*Jdet*C[i][j]; 144 144 } 145 145 } … … 320 320 321 321 /*Intermediaries*/ 322 int* doflist=NULL; 323 IssmDouble* xyz_list=NULL; 322 int* doflist=NULL; 324 323 325 324 /*Fetch number of nodes and dof for this finite element*/ … … 358 357 xDelete<IssmDouble>(vx); 359 358 xDelete<IssmDouble>(values); 360 xDelete<IssmDouble>(xyz_list);361 359 xDelete<int>(doflist); 362 360 }/*}}}*/ … … 416 414 /*Intermediaries*/ 417 415 IssmDouble D[3][3]; 418 IssmDouble damage, thickness,concentration;416 IssmDouble damage,concentration; 419 417 420 418 /*Get Material parameters*/ … … 425 423 /*Get damage input at this location*/ 426 424 Input* damage_input = element->GetInput(DamageEnum); _assert_(damage_input); 427 Input* thickness_input = element->GetInput(SeaiceThicknessEnum); _assert_(thickness_input);428 425 Input* concentration_input = element->GetInput(SeaiceConcentrationEnum); _assert_(concentration_input); 429 426 damage_input->GetInputValue(&damage,gauss); 430 thickness_input->GetInputValue(&thickness,gauss);431 427 concentration_input->GetInputValue(&concentration,gauss); 432 428 … … 448 444 for(int i=0;i<3;i++){ 449 445 for(int j=0;j<3;j++){ 450 C[i*3+j] = thickness*E*D[i][j];446 C[i*3+j] = E*D[i][j]; 451 447 } 452 448 } … … 623 619 } 624 620 }/*}}}*/ 621 void SeaiceAnalysis::PostProcess(FemModel* femmodel){/*{{{*/ 622 623 /*Intermediaties*/ 624 IssmDouble *xyz_list = NULL; 625 IssmDouble *xyz_list_old = NULL; 626 IssmDouble *xyz_list_new = NULL; 627 IssmDouble dt,meshx,meshy,vx,vy,eps_xx,eps_yy,eps_zz,area_old,area_new; 628 IssmDouble time_relaxation_stress,time_relaxation_damage,damage,concentration,thickness; 629 IssmDouble sigma_dot_xx,sigma_dot_yy,sigma_dot_xy; 630 IssmDouble sigma_pred_xx,sigma_pred_yy,sigma_pred_xy; 631 IssmDouble sigma_xx,sigma_yy,sigma_xy; 632 IssmDouble min_c,min_h,max_h; 633 IssmDouble epsilon[3]; /*eps_xx,eps_yy,eps_xy*/ 634 IssmDouble C[3][3]; 635 636 /*Fetch the parameters once for all*/ 637 femmodel->parameters->FindParam(&dt,TimesteppingTimeStepEnum); 638 femmodel->parameters->FindParam(&min_c,SeaiceMinConcentrationEnum); 639 femmodel->parameters->FindParam(&min_h,SeaiceMinThicknessEnum); 640 femmodel->parameters->FindParam(&max_h,SeaiceMaxThicknessEnum); 641 642 /*Loop over the elements of this partition and update accordingly*/ 643 for(int i=0;i<femmodel->elements->Size();i++){ 644 Element* element=dynamic_cast<Element*>(femmodel->elements->GetObjectByOffset(i)); 645 646 /*Get some inputs needed for the update*/ 647 element->GetVerticesCoordinates(&xyz_list); 648 time_relaxation_stress = element->GetMaterialParameter(MaterialsTimeRelaxationStressEnum); 649 time_relaxation_damage = element->GetMaterialParameter(MaterialsTimeRelaxationDamageEnum); 650 Input* meshx_input = element->GetInput(MeshXEnum); _assert_(meshx_input); 651 Input* meshy_input = element->GetInput(MeshYEnum); _assert_(meshy_input); 652 Input* vx_input = element->GetInput(VxEnum); _assert_(vx_input); 653 Input* vy_input = element->GetInput(VyEnum); _assert_(vy_input); 654 655 /*Preallocate future inputs*/ 656 int numvertices=element->GetNumberOfVertices(); 657 IssmDouble* meshx_new_list = xNew<IssmDouble>(numvertices); 658 IssmDouble* meshy_new_list = xNew<IssmDouble>(numvertices); 659 xyz_list_old = xNew<IssmDouble>(numvertices*3); 660 xyz_list_new = xNew<IssmDouble>(numvertices*3); 661 662 /*1. update vertex positions (using a Gauss object for convenience)*/ 663 Gauss* gauss=element->NewGauss(); 664 for (int iv=0;iv<numvertices;iv++){ 665 gauss->GaussVertex(iv); 666 667 meshx_input->GetInputValue(&meshx,gauss); 668 meshy_input->GetInputValue(&meshy,gauss); 669 vx_input->GetInputValue(&vx,gauss); 670 vy_input->GetInputValue(&vy,gauss); 671 672 meshx_new_list[iv] = meshx + vx*dt; 673 meshy_new_list[iv] = meshy + vy*dt; 674 675 xyz_list_old[iv*3+0] = meshx; 676 xyz_list_old[iv*3+1] = meshy; 677 xyz_list_old[iv*3+2] = 0.; 678 679 xyz_list_new[iv*3+0] = meshx_new_list[iv]; 680 xyz_list_new[iv*3+1] = meshy_new_list[iv]; 681 xyz_list_new[iv*3+2] = 0.; 682 } 683 element->AddInput(MeshXEnum,meshx_new_list,P1Enum); 684 element->AddInput(MeshYEnum,meshy_new_list,P1Enum); 685 686 /*Now we are going to use a point in the center of the element, because we are P0 for the stress*/ 687 gauss->GaussNode(P0Enum,0); 688 689 /*Calculate sigma_dot*/ 690 sigma_dot_xx=sigma_dot_yy=sigma_dot_xy=0.; 691 this->CreateCTensor(&C[0][0],element,gauss); 692 element->StrainRateSSA(&epsilon[0],xyz_list,gauss,vx_input,vy_input); 693 for(int j=0;j<3;j++){ 694 sigma_dot_xx += C[0][j]*epsilon[0]; 695 sigma_dot_yy += C[1][j]*epsilon[1]; 696 sigma_dot_xy += C[2][j]*epsilon[2]; 697 } 698 699 /*Get predicted stress state*/ 700 Input* sigma_xx_input = element->GetInput(StressTensorPredictorxxEnum); _assert_(sigma_xx_input); 701 Input* sigma_yy_input = element->GetInput(StressTensorPredictoryyEnum); _assert_(sigma_yy_input); 702 Input* sigma_xy_input = element->GetInput(StressTensorPredictorxyEnum); _assert_(sigma_xy_input); 703 sigma_xx_input->GetInputAverage(&sigma_xx); 704 sigma_yy_input->GetInputAverage(&sigma_yy); 705 sigma_xy_input->GetInputAverage(&sigma_xy); 706 707 /*Calculate new stress and push to element*/ 708 sigma_xx = sigma_xx + dt*(sigma_dot_xx - sigma_xx/time_relaxation_stress); 709 sigma_yy = sigma_yy + dt*(sigma_dot_yy - sigma_yy/time_relaxation_stress); 710 sigma_xy = sigma_xy + dt*(sigma_dot_xy - sigma_xy/time_relaxation_stress); 711 element->AddInput(StressTensorxxEnum,&sigma_xx,P0Enum); 712 element->AddInput(StressTensoryyEnum,&sigma_yy,P0Enum); 713 element->AddInput(StressTensorxyEnum,&sigma_xy,P0Enum); 714 715 /*Update Damage According*/ 716 Input* damage_input = element->GetInput(DamageEnum); _assert_(damage_input); 717 damage_input->GetInputAverage(&damage); 718 damage = damage*(1.-dt/time_relaxation_damage); 719 element->AddInput(DamageEnum,&damage,P0Enum); 720 721 /*Prepare new predictor*/ 722 this->CreateCTensor(&C[0][0],element,gauss); /*C is updated now that there is a new damage in inputs*/ 723 for(int j=0;j<3;j++){ 724 sigma_pred_xx += C[0][j]*epsilon[0]; 725 sigma_pred_yy += C[1][j]*epsilon[1]; 726 sigma_pred_xy += C[2][j]*epsilon[2]; 727 } 728 element->AddInput(StressTensorPredictorxxEnum,&sigma_pred_xx,P0Enum); 729 element->AddInput(StressTensorPredictoryyEnum,&sigma_pred_yy,P0Enum); 730 element->AddInput(StressTensorPredictorxyEnum,&sigma_pred_xy,P0Enum); 731 732 /*Calculate Old and new area (FIXME: for now we assume trianlges...)*/ 733 element->JacobianDeterminant(&area_old,xyz_list_old,gauss); 734 element->JacobianDeterminant(&area_new,xyz_list_new,gauss); 735 area_old = area_old/SQRT3; 736 area_new = area_new/SQRT3; 737 738 /*Update ice thickness and concentration using element distortion*/ 739 Input* thickness_input = element->GetInput(SeaiceThicknessEnum); _assert_(thickness_input); 740 Input* concentration_input = element->GetInput(SeaiceConcentrationEnum); _assert_(concentration_input); 741 thickness_input->GetInputAverage(&thickness); 742 concentration_input->GetInputAverage(&concentration); 743 IssmDouble ice_area = concentration*area_old; 744 IssmDouble ice_volume = thickness*area_old; 745 if(concentration>min_c){ 746 concentration = ice_area /area_new; 747 thickness = ice_volume/area_new; 748 749 /* lower bounds */ 750 concentration = ((concentration>min_c)?(concentration):(min_c)); 751 thickness = ((thickness >min_h)?(thickness ):(min_h)); 752 753 /* upper bounds (only for the concentration) */ 754 concentration = ((concentration<1. )?(concentration):(1)); 755 thickness = ((thickness <max_h)?(thickness ):(max_h)); 756 } 757 element->AddInput(SeaiceConcentrationEnum,&concentration,P0Enum); 758 element->AddInput(SeaiceThicknessEnum,&thickness,P0Enum); 759 760 /*Clean up*/ 761 xDelete<IssmDouble>(meshx_new_list); 762 xDelete<IssmDouble>(meshy_new_list); 763 xDelete<IssmDouble>(xyz_list); 764 xDelete<IssmDouble>(xyz_list_old); 765 xDelete<IssmDouble>(xyz_list_new); 766 } 767 768 }/*}}}*/ -
issm/trunk-jpl/src/c/analyses/SeaiceAnalysis.h
r18502 r18505 36 36 void GetB(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss); 37 37 void GetM(IssmDouble* M,Element* element,IssmDouble* xyz_list,Gauss* gauss); 38 void PostProcess(FemModel* femmodel); 38 39 }; 39 40 #endif -
issm/trunk-jpl/src/c/cores/seaice_core.cpp
r18504 r18505 13 13 14 14 /*parameters: */ 15 bool save_results; 15 bool save_results; 16 SeaiceAnalysis analysis = SeaiceAnalysis(); 16 17 17 18 /*recover parameters: */ … … 20 21 /*Launch solution sequence for the only analysis we are interested in*/ 21 22 femmodel->SetCurrentConfiguration(SeaiceAnalysisEnum); 22 SeaiceAnalysis* analysis = new SeaiceAnalysis(); 23 analysis->UpdateDamageAndStress(femmodel); 23 analysis.UpdateDamageAndStress(femmodel); 24 24 solutionsequence_linear(femmodel); 25 analysis.PostProcess(femmodel); 25 26 26 27 if(save_results){ 27 28 if(VerboseSolution()) _printf0_(" saving results\n"); 28 int outputs[6] = {VxEnum,VyEnum,VelEnum,SeaiceConcentrationEnum,SeaiceThicknessEnum,DamageEnum}; 29 femmodel->RequestedOutputsx(&femmodel->results,&outputs[0],6); 29 int outputs[14] = {VxEnum,VyEnum,VelEnum, 30 SeaiceConcentrationEnum,SeaiceThicknessEnum,DamageEnum, 31 StressTensorPredictorxxEnum,StressTensorPredictoryyEnum,StressTensorPredictorxyEnum, 32 StressTensorxxEnum,StressTensoryyEnum,StressTensorxyEnum, 33 MeshXEnum,MeshYEnum}; 34 femmodel->RequestedOutputsx(&femmodel->results,&outputs[0],14); 30 35 } 31 36
Note:
See TracChangeset
for help on using the changeset viewer.