Changeset 18505


Ignore:
Timestamp:
09/11/14 08:39:35 (11 years ago)
Author:
Mathieu Morlighem
Message:

NEW: finished implementing post processing... debuging to come

Location:
issm/trunk-jpl/src/c
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • issm/trunk-jpl/src/c/analyses/SeaiceAnalysis.cpp

    r18504 r18505  
    141141                for(int i=0;i<3;i++){
    142142                        for(int j=0;j<3;j++){
    143                                 C[i][j] = dt*time_ratio*gauss->weight*Jdet*C[i][j];
     143                                C[i][j] = dt*thickness*time_ratio*gauss->weight*Jdet*C[i][j];
    144144                        }
    145145                }
     
    320320
    321321        /*Intermediaries*/
    322         int*        doflist=NULL;
    323         IssmDouble* xyz_list=NULL;
     322        int* doflist=NULL;
    324323
    325324        /*Fetch number of nodes and dof for this finite element*/
     
    358357        xDelete<IssmDouble>(vx);
    359358        xDelete<IssmDouble>(values);
    360         xDelete<IssmDouble>(xyz_list);
    361359        xDelete<int>(doflist);
    362360}/*}}}*/
     
    416414        /*Intermediaries*/
    417415        IssmDouble D[3][3];
    418         IssmDouble damage,thickness,concentration;
     416        IssmDouble damage,concentration;
    419417
    420418        /*Get Material parameters*/
     
    425423        /*Get damage input at this location*/
    426424        Input* damage_input        = element->GetInput(DamageEnum);              _assert_(damage_input);
    427         Input* thickness_input     = element->GetInput(SeaiceThicknessEnum);     _assert_(thickness_input);
    428425        Input* concentration_input = element->GetInput(SeaiceConcentrationEnum); _assert_(concentration_input);
    429426        damage_input->GetInputValue(&damage,gauss);
    430         thickness_input->GetInputValue(&thickness,gauss);
    431427        concentration_input->GetInputValue(&concentration,gauss);
    432428
     
    448444        for(int i=0;i<3;i++){
    449445                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];
    451447                }
    452448        }
     
    623619        }
    624620}/*}}}*/
     621void 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  
    3636                void GetB(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss);
    3737                void GetM(IssmDouble* M,Element* element,IssmDouble* xyz_list,Gauss* gauss);
     38                void PostProcess(FemModel* femmodel);
    3839};
    3940#endif
  • issm/trunk-jpl/src/c/cores/seaice_core.cpp

    r18504 r18505  
    1313
    1414        /*parameters: */
    15         bool save_results;
     15        bool           save_results;
     16        SeaiceAnalysis analysis = SeaiceAnalysis();
    1617
    1718        /*recover parameters: */
     
    2021        /*Launch solution sequence for the only analysis we are interested in*/
    2122        femmodel->SetCurrentConfiguration(SeaiceAnalysisEnum);
    22         SeaiceAnalysis* analysis = new SeaiceAnalysis();
    23         analysis->UpdateDamageAndStress(femmodel);
     23        analysis.UpdateDamageAndStress(femmodel);
    2424        solutionsequence_linear(femmodel);
     25        analysis.PostProcess(femmodel);
    2526
    2627        if(save_results){
    2728                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);
    3035        }
    3136
Note: See TracChangeset for help on using the changeset viewer.