Changeset 16727


Ignore:
Timestamp:
11/12/13 20:38:11 (11 years ago)
Author:
seroussi
Message:

BUG: fixed SSA InputUpdateFromSolution

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

Legend:

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

    r16721 r16727  
    297297        xDelete<IssmDouble>(phi);
    298298        xDelete<int>(doflist);
    299         if(meshtype!=Mesh2DhorizontalEnum) delete element;
    300 }/*}}}*/
     299        if(meshtype!=Mesh2DhorizontalEnum) delete basalelement;
     300}/*}}}*/
  • TabularUnified issm/trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp

    r16717 r16727  
    937937                        InputUpdateFromSolutionFS(solution,element);
    938938                        return;
    939                 case SSAApproximationEnum: case HOApproximationEnum: case SIAApproximationEnum:
    940                         InputUpdateFromSolutionHoriz(solution,element);
     939                case SSAApproximationEnum:
     940                        InputUpdateFromSolutionSSA(solution,element);
     941                        return;
     942                case HOApproximationEnum:
     943                        InputUpdateFromSolutionHO(solution,element);
     944                        return;
     945                case SIAApproximationEnum:
     946                        InputUpdateFromSolutionHO(solution,element);
    941947                        return;
    942948                case L1L2ApproximationEnum:
    943                         InputUpdateFromSolutionHoriz(solution,element);
     949                        InputUpdateFromSolutionHO(solution,element);
    944950                        return;
    945951                case SSAHOApproximationEnum: case HOFSApproximationEnum: case SSAFSApproximationEnum:
     
    950956        }
    951957}/*}}}*/
    952 void StressbalanceAnalysis::InputUpdateFromSolutionHoriz(IssmDouble* solution,Element* element){/*{{{*/
     958void StressbalanceAnalysis::InputUpdateFromSolutionSSA(IssmDouble* solution,Element* element){/*{{{*/
     959
     960        int         i,meshtype;
     961        IssmDouble  rho_ice,g;
     962        int*        doflist=NULL;
     963        IssmDouble* xyz_list=NULL;
     964        Element*    basalelement=NULL;
     965
     966        /*Deal with pressure first*/
     967        int numvertices = element->GetNumberOfVertices();
     968        IssmDouble* pressure  = xNew<IssmDouble>(numvertices);
     969        IssmDouble* thickness = xNew<IssmDouble>(numvertices);
     970        IssmDouble* surface   = xNew<IssmDouble>(numvertices);
     971
     972        element->FindParam(&meshtype,MeshTypeEnum);
     973        rho_ice =element->GetMaterialParameter(MaterialsRhoIceEnum);
     974        g       =element->GetMaterialParameter(ConstantsGEnum);
     975        switch(meshtype){
     976                case Mesh2DhorizontalEnum:
     977                        element->GetInputListOnNodes(thickness,ThicknessEnum);
     978                        for(i=0;i<numvertices;i++) pressure[i]=rho_ice*g*thickness[i];
     979                        break;
     980                case Mesh3DEnum:
     981                        element->GetVerticesCoordinates(&xyz_list);
     982                        element->GetInputListOnNodes(surface,SurfaceEnum);
     983                        for(i=0;i<numvertices;i++) pressure[i]=rho_ice*g*(surface[i]-xyz_list[i*3+2]);
     984                        break;
     985                default: _error_("mesh "<<EnumToStringx(meshtype)<<" not supported yet");
     986        }
     987        element->AddInput(PressureEnum,pressure,P1Enum);
     988        xDelete<IssmDouble>(pressure);
     989        xDelete<IssmDouble>(thickness);
     990        xDelete<IssmDouble>(surface);
     991
     992        /*Get basal element*/
     993        switch(meshtype){
     994                case Mesh2DhorizontalEnum:
     995                        basalelement = element;
     996                        break;
     997                case Mesh3DEnum:
     998                        if(!element->IsOnBed()) return;
     999                        basalelement=element->SpawnBasalElement();
     1000                        break;
     1001                default: _error_("mesh "<<EnumToStringx(meshtype)<<" not supported yet");
     1002        }
     1003
     1004        /*Fetch number of nodes and dof for this finite element*/
     1005        int numnodes = basalelement->GetNumberOfNodes();
     1006        int numdof   = numnodes*2;
     1007
     1008        /*Fetch dof list and allocate solution vectors*/
     1009        basalelement->GetDofList(&doflist,NoneApproximationEnum,GsetEnum);
     1010        IssmDouble* values    = xNew<IssmDouble>(numdof);
     1011        IssmDouble* vx        = xNew<IssmDouble>(numnodes);
     1012        IssmDouble* vy        = xNew<IssmDouble>(numnodes);
     1013        IssmDouble* vz        = xNew<IssmDouble>(numnodes);
     1014        IssmDouble* vel       = xNew<IssmDouble>(numnodes);
     1015
     1016        /*Use the dof list to index into the solution vector: */
     1017        for(i=0;i<numdof;i++) values[i]=solution[doflist[i]];
     1018
     1019        /*Transform solution in Cartesian Space*/
     1020        basalelement->TransformSolutionCoord(&values[0],XYEnum);
     1021        basalelement->FindParam(&meshtype,MeshTypeEnum);
     1022
     1023        /*Ok, we have vx and vy in values, fill in vx and vy arrays: */
     1024        for(i=0;i<numnodes;i++){
     1025                vx[i]=values[i*2+0];
     1026                vy[i]=values[i*2+1];
     1027
     1028                /*Check solution*/
     1029                if(xIsNan<IssmDouble>(vx[i])) _error_("NaN found in solution vector");
     1030                if(xIsNan<IssmDouble>(vy[i])) _error_("NaN found in solution vector");
     1031        }
     1032
     1033        /*Get Vz and compute vel*/
     1034        basalelement->GetInputListOnNodes(&vz[0],VzEnum,0.);
     1035        for(i=0;i<numnodes;i++) vel[i]=sqrt(vx[i]*vx[i] + vy[i]*vy[i] + vz[i]*vz[i]);
     1036
     1037        /*Now, we have to move the previous Vx and Vy inputs  to old
     1038         * status, otherwise, we'll wipe them off: */
     1039        element->InputChangeName(VxEnum,VxPicardEnum);
     1040        element->InputChangeName(VyEnum,VyPicardEnum);
     1041
     1042        /*Add vx and vy as inputs to the tria element: */
     1043        element->AddBasalInput(VxEnum,vx,P1Enum);
     1044        element->AddBasalInput(VyEnum,vy,P1Enum);
     1045        element->AddBasalInput(VelEnum,vel,P1Enum);
     1046
     1047        /*Free ressources:*/
     1048        xDelete<IssmDouble>(vel);
     1049        xDelete<IssmDouble>(vz);
     1050        xDelete<IssmDouble>(vy);
     1051        xDelete<IssmDouble>(vx);
     1052        xDelete<IssmDouble>(values);
     1053        xDelete<IssmDouble>(xyz_list);
     1054        xDelete<int>(doflist);
     1055        if(meshtype!=Mesh2DhorizontalEnum) delete basalelement;
     1056}/*}}}*/
     1057void StressbalanceAnalysis::InputUpdateFromSolutionHO(IssmDouble* solution,Element* element){/*{{{*/
    9531058
    9541059        int         i,meshtype;
     
    9691074        IssmDouble* vel       = xNew<IssmDouble>(numnodes);
    9701075        IssmDouble* pressure  = xNew<IssmDouble>(numnodes);
    971         IssmDouble* thickness = xNew<IssmDouble>(numnodes);
    9721076        IssmDouble* surface   = xNew<IssmDouble>(numnodes);
    9731077
     
    9971101        rho_ice = element->GetMaterialParameter(MaterialsRhoIceEnum);
    9981102        g       = element->GetMaterialParameter(ConstantsGEnum);
    999         switch(meshtype){
    1000                 case Mesh2DhorizontalEnum:
    1001                         element->GetInputListOnNodes(&thickness[0],ThicknessEnum);
    1002                         for(i=0;i<numnodes;i++) pressure[i]=rho_ice*g*thickness[i];
    1003                         break;
    1004                 case Mesh3DEnum:   
    1005                         element->GetVerticesCoordinates(&xyz_list);
    1006                         element->GetInputListOnNodes(&surface[0],SurfaceEnum);
    1007                         for(i=0;i<numnodes;i++) pressure[i]=rho_ice*g*(surface[i]-xyz_list[i*3+2]);
    1008                         break;
    1009                 default: _error_("mesh "<<EnumToStringx(meshtype)<<" not supported yet");
    1010         }
     1103        element->GetVerticesCoordinates(&xyz_list);
     1104        element->GetInputListOnNodes(&surface[0],SurfaceEnum);
     1105        for(i=0;i<numnodes;i++) pressure[i]=rho_ice*g*(surface[i]-xyz_list[i*3+2]);
    10111106
    10121107        /*Now, we have to move the previous Vx and Vy inputs  to old
     
    10191114        element->AddInput(VxEnum,vx,P1Enum);
    10201115        element->AddInput(VyEnum,vy,P1Enum);
    1021         element->AddInput(VelEnum,vel,P1Enum);
    1022         element->AddInput(PressureEnum,pressure,P1Enum);
     1116        element->AddBasalInput(VelEnum,vel,P1Enum);
     1117        element->AddBasalInput(PressureEnum,pressure,P1Enum);
    10231118
    10241119        /*Free ressources:*/
    1025         xDelete<IssmDouble>(thickness);
    10261120        xDelete<IssmDouble>(surface);
    10271121        xDelete<IssmDouble>(pressure);
     
    10331127        xDelete<IssmDouble>(xyz_list);
    10341128        xDelete<int>(doflist);
    1035 
    10361129}/*}}}*/
    10371130void StressbalanceAnalysis::InputUpdateFromSolutionFS(IssmDouble* solution,Element* element){/*{{{*/
  • TabularUnified issm/trunk-jpl/src/c/analyses/StressbalanceAnalysis.h

    r16715 r16727  
    2323                void InputUpdateFromSolution(IssmDouble* solution,Element* element);
    2424                void InputUpdateFromSolutionFS(IssmDouble* solution,Element* element);
    25                 void InputUpdateFromSolutionHoriz(IssmDouble* solution,Element* element);
     25                void InputUpdateFromSolutionHO(IssmDouble* solution,Element* element);
     26                void InputUpdateFromSolutionSSA(IssmDouble* solution,Element* element);
    2627};
    2728#endif
  • TabularUnified issm/trunk-jpl/src/c/classes/Elements/Element.h

    r16721 r16727  
    6060                virtual int    GetNumberOfNodesVelocity(void)=0;
    6161                virtual int    GetNumberOfNodesPressure(void)=0;
     62                virtual int    GetNumberOfVertices(void)=0;
    6263                virtual void   GetNodesSidList(int* sidlist)=0;
    6364                virtual void   GetNodesLidList(int* sidlist)=0;
  • TabularUnified issm/trunk-jpl/src/c/classes/Elements/Penta.cpp

    r16725 r16727  
    139139                        Penta*     penta=NULL;
    140140
    141                         for(i=1;i<NUMVERTICES2D;i++){
     141                        for(i=0;i<NUMVERTICES2D;i++){
    142142                                extrudedvalues[i]=values[i];
    143143                                extrudedvalues[i+NUMVERTICES2D]=values[i];
    144144                        }
    145                         this->inputs->AddInput(new PentaInput(input_enum,&extrudedvalues[0],P1Enum));
    146145                        penta=this;
    147146                        for(;;){
     
    13941393int Penta::GetNumberOfNodesVelocity(void){
    13951394        return this->NumberofNodesVelocity();
     1395}
     1396/*}}}*/
     1397/*FUNCTION Penta::GetNumberOfVertices;{{{*/
     1398int Penta::GetNumberOfVertices(void){
     1399        return NUMVERTICES;
    13961400}
    13971401/*}}}*/
  • TabularUnified issm/trunk-jpl/src/c/classes/Elements/Penta.h

    r16721 r16727  
    9393                int    GetNumberOfNodesPressure(void);
    9494                int    GetNumberOfNodesVelocity(void);
     95                int    GetNumberOfVertices(void);
    9596                IssmDouble GetMaterialParameter(int enum_in);
    9697                void   GetSolutionFromInputsOneDof(Vector<IssmDouble>* solution,int enum_type);
  • TabularUnified issm/trunk-jpl/src/c/classes/Elements/Seg.h

    r16721 r16727  
    9898                int         GetNumberOfNodesVelocity(void){_error_("not implemented yet");};
    9999                int         GetNumberOfNodesPressure(void){_error_("not implemented yet");};
     100                int         GetNumberOfVertices(void){_error_("not implemented yet");};
    100101                void        GetVerticesCoordinates(IssmDouble** pxyz_list){_error_("not implemented yet");};
    101102                int         Sid(){_error_("not implemented yet");};
  • TabularUnified issm/trunk-jpl/src/c/classes/Elements/Tria.cpp

    r16725 r16727  
    13671367int Tria::GetNumberOfNodes(void){
    13681368        return this->NumberofNodes();
     1369}
     1370/*}}}*/
     1371/*FUNCTION Tria::GetNumberOfVertices;{{{*/
     1372int Tria::GetNumberOfVertices(void){
     1373        return NUMVERTICES;
    13691374}
    13701375/*}}}*/
  • TabularUnified issm/trunk-jpl/src/c/classes/Elements/Tria.h

    r16721 r16727  
    9191                int         GetNumberOfNodesPressure(void){_error_("not implemented yet");};
    9292                int         GetNumberOfNodesVelocity(void){_error_("not implemented yet");};
     93                int         GetNumberOfVertices(void);
    9394                int         Sid();
    9495                bool        IsOnBed();
Note: See TracChangeset for help on using the changeset viewer.