Changeset 16715


Ignore:
Timestamp:
11/12/13 12:09:40 (11 years ago)
Author:
seroussi
Message:

NEW: moved InputUpdateFromSolution in analyses for Stokes

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

Legend:

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

    r16684 r16715  
    5959}/*}}}*/
    6060void L2ProjectionBaseAnalysis::InputUpdateFromSolution(IssmDouble* solution,Element* element){/*{{{*/
    61         _error_("not implemented yet");
     61
     62        int inputenum;
     63
     64        element->FindParam(&inputenum,InputToL2ProjectEnum);
     65        element->InputUpdateFromSolutionOneDofCollapsed(solution,inputenum);
    6266}/*}}}*/
  • issm/trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp

    r16698 r16715  
    935935        switch(approximation){
    936936                case FSApproximationEnum: case NoneApproximationEnum:
    937                         //InputUpdateFromSolutionFS(solution,element);
     937                        InputUpdateFromSolutionFS(solution,element);
    938938                        return;
    939939                case SSAApproximationEnum: case HOApproximationEnum: case SIAApproximationEnum:
     
    10351035
    10361036}/*}}}*/
     1037void StressbalanceAnalysis::InputUpdateFromSolutionFS(IssmDouble* solution,Element* element){/*{{{*/
     1038
     1039        int          i;
     1040        int*         vdoflist=NULL;
     1041        int*         pdoflist=NULL;
     1042        IssmDouble   FSreconditioning;
     1043
     1044        /*Fetch number of nodes and dof for this finite element*/
     1045        int vnumnodes = element->GetNumberOfNodesVelocity();
     1046        int pnumnodes = element->GetNumberOfNodesPressure();
     1047        int vnumdof   = vnumnodes*3;
     1048        int pnumdof   = pnumnodes*1;
     1049
     1050        /*Initialize values*/
     1051        IssmDouble* values   = xNew<IssmDouble>(vnumdof+pnumdof);
     1052        IssmDouble* vx       = xNew<IssmDouble>(vnumnodes);
     1053        IssmDouble* vy       = xNew<IssmDouble>(vnumnodes);
     1054        IssmDouble* vz       = xNew<IssmDouble>(vnumnodes);
     1055        IssmDouble* vel      = xNew<IssmDouble>(vnumnodes);
     1056        IssmDouble* pressure = xNew<IssmDouble>(pnumnodes);
     1057
     1058        /*Prepare coordinate system list*/
     1059        int* cs_list = xNew<int>(vnumnodes+pnumnodes);
     1060        for(i=0;i<vnumnodes;i++) cs_list[i]           = XYZEnum;
     1061        for(i=0;i<pnumnodes;i++) cs_list[vnumnodes+i] = PressureEnum;
     1062
     1063        /*Get dof list: */
     1064        element->GetDofListVelocity(&vdoflist,GsetEnum);
     1065        element->GetDofListPressure(&pdoflist,GsetEnum);
     1066
     1067        /*Use the dof list to index into the solution vector: */
     1068        for(i=0;i<vnumdof;i++) values[i]        =solution[vdoflist[i]];
     1069        for(i=0;i<pnumdof;i++) values[vnumdof+i]=solution[pdoflist[i]];
     1070
     1071        /*Transform solution in Cartesian Space*/
     1072        element->TransformSolutionCoord(&values[0],&cs_list[0]);
     1073
     1074        /*Ok, we have vx and vy in values, fill in all arrays: */
     1075        for(i=0;i<vnumnodes;i++){
     1076                vx[i] = values[i*NDOF3+0];
     1077                vy[i] = values[i*NDOF3+1];
     1078                vz[i] = values[i*NDOF3+2];
     1079                if(xIsNan<IssmDouble>(vx[i])) _error_("NaN found in solution vector");
     1080                if(xIsNan<IssmDouble>(vy[i])) _error_("NaN found in solution vector");
     1081                if(xIsNan<IssmDouble>(vz[i])) _error_("NaN found in solution vector");
     1082        }
     1083        for(i=0;i<pnumnodes;i++){
     1084                pressure[i] = values[vnumdof+i];
     1085                if(xIsNan<IssmDouble>(pressure[i])) _error_("NaN found in solution vector");
     1086        }
     1087
     1088        /*Recondition pressure and compute vel: */
     1089        element->FindParam(&FSreconditioning,StressbalanceFSreconditioningEnum);
     1090        for(i = 0;i<pnumnodes;i++) pressure[i] = pressure[i]*FSreconditioning;
     1091        for(i = 0;i<vnumnodes;i++) vel[i]      = sqrt(vx[i]*vx[i] + vy[i]*vy[i] + vz[i]*vz[i]);
     1092
     1093        /*Now, we have to move the previous inputs  to old
     1094         * status, otherwise, we'll wipe them off: */
     1095        element->InputChangeName(VxEnum,VxPicardEnum);
     1096        element->InputChangeName(VyEnum,VyPicardEnum);
     1097        element->InputChangeName(VzEnum,VzPicardEnum);
     1098        element->InputChangeName(PressureEnum,PressurePicardEnum);
     1099
     1100        /*Add vx and vy as inputs to the tria element: */
     1101        element->AddInput(VxEnum,vx,P1Enum);
     1102        element->AddInput(VyEnum,vy,P1Enum);
     1103        element->AddInput(VzEnum,vz,P1Enum);
     1104        element->AddInput(VelEnum,vel,P1Enum);
     1105        element->AddInput(PressureEnum,pressure,P1Enum);
     1106
     1107        /*Free ressources:*/
     1108        xDelete<IssmDouble>(pressure);
     1109        xDelete<IssmDouble>(vel);
     1110        xDelete<IssmDouble>(vz);
     1111        xDelete<IssmDouble>(vy);
     1112        xDelete<IssmDouble>(vx);
     1113        xDelete<IssmDouble>(values);
     1114        xDelete<int>(vdoflist);
     1115        xDelete<int>(pdoflist);
     1116        xDelete<int>(cs_list);
     1117
     1118
     1119}/*}}}*/
  • issm/trunk-jpl/src/c/analyses/StressbalanceAnalysis.h

    r16693 r16715  
    2121                void GetSolutionFromInputsFS(Vector<IssmDouble>* solution,Element* element);
    2222                void GetSolutionFromInputsHoriz(Vector<IssmDouble>* solution,Element* element);
     23                void InputUpdateFromSolution(IssmDouble* solution,Element* element);
     24                void InputUpdateFromSolutionFS(IssmDouble* solution,Element* element);
    2325                void InputUpdateFromSolutionHoriz(IssmDouble* solution,Element* element);
    24                 void InputUpdateFromSolution(IssmDouble* solution,Element* element);
    2526};
    2627#endif
  • issm/trunk-jpl/src/c/classes/Elements/Element.h

    r16699 r16715  
    5050                virtual IssmDouble GetMaterialParameter(int enum_in)=0;
    5151                virtual void   TransformSolutionCoord(IssmDouble* values,int transformenum)=0;
     52                virtual void   TransformSolutionCoord(IssmDouble* values,int* transformenum_list)=0;
    5253                virtual void    GetDofList(int** pdoflist,int approximation_enum,int setenum)=0;
    5354                virtual void    GetDofListVelocity(int** pdoflist,int setenum)=0;
     
    5657                virtual int    GetNodeIndex(Node* node)=0;
    5758                virtual int    GetNumberOfNodes(void)=0;
     59                virtual int    GetNumberOfNodesVelocity(void)=0;
     60                virtual int    GetNumberOfNodesPressure(void)=0;
    5861                virtual void   GetNodesSidList(int* sidlist)=0;
    5962                virtual void   GetNodesLidList(int* sidlist)=0;
     
    8588                virtual void   InputDuplicate(int original_enum,int new_enum)=0;
    8689                virtual void   InputCreate(IssmDouble* vector,IoModel* iomodel,int M,int N,int vector_type,int vector_enum,int code)=0;
     90                virtual void   InputUpdateFromSolutionOneDofCollapsed(IssmDouble* solution,int inputenum)=0;
    8791
    8892                virtual int    NodalValue(IssmDouble* pvalue, int index, int natureofdataenum)=0;
  • issm/trunk-jpl/src/c/classes/Elements/Penta.cpp

    r16702 r16715  
    13591359}
    13601360/*}}}*/
     1361/*FUNCTION Penta::GetNumberOfNodesPressure;{{{*/
     1362int Penta::GetNumberOfNodesPressure(void){
     1363        return this->NumberofNodesPressure();
     1364}
     1365/*}}}*/
     1366/*FUNCTION Penta::GetNumberOfNodesVelocity;{{{*/
     1367int Penta::GetNumberOfNodesVelocity(void){
     1368        return this->NumberofNodesVelocity();
     1369}
     1370/*}}}*/
    13611371/*FUNCTION Penta::GetInput(int inputenum) {{{*/
    13621372Input* Penta::GetInput(int inputenum){
     
    32783288
    32793289        ::TransformSolutionCoord(values,this->nodes,this->NumberofNodes(),transformenum);
     3290
     3291}
     3292/*}}}*/
     3293/*FUNCTION Penta::TransformSolutionCoord{{{*/
     3294void Penta::TransformSolutionCoord(IssmDouble* values,int* transformenum_list){
     3295
     3296        ::TransformSolutionCoord(values,this->nodes,this->NumberofNodes(),transformenum_list);
    32803297
    32813298}
  • issm/trunk-jpl/src/c/classes/Elements/Penta.h

    r16699 r16715  
    9191                void   GetNodesLidList(int* lidlist);
    9292                int    GetNumberOfNodes(void);
     93                int    GetNumberOfNodesPressure(void);
     94                int    GetNumberOfNodesVelocity(void);
    9395                IssmDouble GetMaterialParameter(int enum_in);
    9496                void   GetSolutionFromInputsOneDof(Vector<IssmDouble>* solution,int enum_type);
     
    242244                void             SurfaceNormal(IssmDouble* surface_normal, IssmDouble xyz_list[3][3]);
    243245                void           TransformSolutionCoord(IssmDouble* values,int transformenum);
     246                void           TransformSolutionCoord(IssmDouble* values,int* transformenum_list);
    244247
    245248                #ifdef _HAVE_STRESSBALANCE_
  • issm/trunk-jpl/src/c/classes/Elements/Seg.h

    r16699 r16715  
    5454                /*}}}*/
    5555                /*Update virtual functions resolution: {{{*/
    56                 void  InputUpdateFromSolution(IssmDouble* solutiong){_error_("not implemented yet");};
     56                void  InputUpdateFromSolution(IssmDouble* solution){_error_("not implemented yet");};
     57                void  InputUpdateFromSolutionOneDofCollapsed(IssmDouble* solution,int inputenum){_error_("not implemented yet");};
    5758                void  InputUpdateFromVector(IssmDouble* vector, int name, int type){_error_("not implemented yet");};
    5859#ifdef _HAVE_DAKOTA_
     
    9394                void        GetNodesLidList(int* lidlist){_error_("not implemented yet");};
    9495                int         GetNumberOfNodes(void){_error_("not implemented yet");};
     96                int         GetNumberOfNodesVelocity(void){_error_("not implemented yet");};
     97                int         GetNumberOfNodesPressure(void){_error_("not implemented yet");};
    9598                void        GetVerticesCoordinates(IssmDouble** pxyz_list){_error_("not implemented yet");};
    9699                int         Sid(){_error_("not implemented yet");};
     
    143146                IssmDouble  TimeAdapt(){_error_("not implemented yet");};
    144147                void        TransformSolutionCoord(IssmDouble* values,int transformenum){_error_("not implemented yet");};
     148                void        TransformSolutionCoord(IssmDouble* values,int* transformenum_list){_error_("not implemented yet");};
    145149                void UpdateConstraintsExtrudeFromBase(){_error_("not implemented");};
    146150                void UpdateConstraintsExtrudeFromTop(){_error_("not implemented");};
  • issm/trunk-jpl/src/c/classes/Elements/Tria.h

    r16699 r16715  
    8989                void        GetNodesLidList(int* lidlist);
    9090                int         GetNumberOfNodes(void);
     91                int         GetNumberOfNodesPressure(void){_error_("not implemented yet");};
     92                int         GetNumberOfNodesVelocity(void){_error_("not implemented yet");};
    9193                int         Sid();
    9294                bool        IsOnBed();
     
    257259                void             InputChangeName(int enum_type,int enum_type_old);
    258260                void             InputUpdateFromSolutionOneDof(IssmDouble* solution,int enum_type);
     261                void             InputUpdateFromSolutionOneDofCollapsed(IssmDouble* solution,int enum_type){_error_("not implemented yet");};
    259262                void             InputUpdateFromSolutionMasstransport(IssmDouble* solution);
    260263                bool             IsInput(int name);
     
    264267                void             SurfaceNormal(IssmDouble* surface_normal, IssmDouble xyz_list[3][3]);
    265268                void           TransformSolutionCoord(IssmDouble* values,int transformenum);
     269                void           TransformSolutionCoord(IssmDouble* values,int* transformenum_list){_error_("not implemented yet");};
    266270                #ifdef _HAVE_STRESSBALANCE_
    267271                ElementMatrix* CreateKMatrixStressbalanceSSA(void);
Note: See TracChangeset for help on using the changeset viewer.