Changeset 16756


Ignore:
Timestamp:
11/14/13 09:43:52 (11 years ago)
Author:
Mathieu Morlighem
Message:

NEW: extended InputUpdateFromSolution for FS 2d

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

Legend:

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

    r16727 r16756  
    11301130void StressbalanceAnalysis::InputUpdateFromSolutionFS(IssmDouble* solution,Element* element){/*{{{*/
    11311131
    1132         int          i;
     1132        int          i,dim,meshtype;
    11331133        int*         vdoflist=NULL;
    11341134        int*         pdoflist=NULL;
    11351135        IssmDouble   FSreconditioning;
    11361136
     1137        element->FindParam(&meshtype,MeshTypeEnum);
     1138        element->FindParam(&FSreconditioning,StressbalanceFSreconditioningEnum);
     1139        switch(meshtype){
     1140                case Mesh2DverticalEnum: dim = 2; break;
     1141                case Mesh3DEnum:         dim = 3; break;
     1142                default: _error_("mesh "<<EnumToStringx(meshtype)<<" not supported yet");
     1143        }
     1144
    11371145        /*Fetch number of nodes and dof for this finite element*/
    11381146        int vnumnodes = element->GetNumberOfNodesVelocity();
    11391147        int pnumnodes = element->GetNumberOfNodesPressure();
    1140         int vnumdof   = vnumnodes*3;
     1148        int vnumdof   = vnumnodes*dim;
    11411149        int pnumdof   = pnumnodes*1;
    11421150
     
    11511159        /*Prepare coordinate system list*/
    11521160        int* cs_list = xNew<int>(vnumnodes+pnumnodes);
    1153         for(i=0;i<vnumnodes;i++) cs_list[i]           = XYZEnum;
     1161        if(dim==2){
     1162                for(i=0;i<vnumnodes;i++) cs_list[i] = XYEnum;
     1163        }
     1164        else{
     1165                for(i=0;i<vnumnodes;i++) cs_list[i] = XYZEnum;
     1166        }
    11541167        for(i=0;i<pnumnodes;i++) cs_list[vnumnodes+i] = PressureEnum;
    11551168
     
    11671180        /*Ok, we have vx and vy in values, fill in all arrays: */
    11681181        for(i=0;i<vnumnodes;i++){
    1169                 vx[i] = values[i*NDOF3+0];
    1170                 vy[i] = values[i*NDOF3+1];
    1171                 vz[i] = values[i*NDOF3+2];
     1182                vx[i] = values[i*dim+0];
     1183                vy[i] = values[i*dim+1];
    11721184                if(xIsNan<IssmDouble>(vx[i])) _error_("NaN found in solution vector");
    11731185                if(xIsNan<IssmDouble>(vy[i])) _error_("NaN found in solution vector");
    1174                 if(xIsNan<IssmDouble>(vz[i])) _error_("NaN found in solution vector");
     1186
     1187                if(dim==3){
     1188                        vz[i] = values[i*dim+2];
     1189                        if(xIsNan<IssmDouble>(vz[i])) _error_("NaN found in solution vector");
     1190                }
    11751191        }
    11761192        for(i=0;i<pnumnodes;i++){
     
    11801196
    11811197        /*Recondition pressure and compute vel: */
    1182         element->FindParam(&FSreconditioning,StressbalanceFSreconditioningEnum);
    1183         for(i = 0;i<pnumnodes;i++) pressure[i] = pressure[i]*FSreconditioning;
    1184         for(i = 0;i<vnumnodes;i++) vel[i]      = sqrt(vx[i]*vx[i] + vy[i]*vy[i] + vz[i]*vz[i]);
     1198        for(i=0;i<pnumnodes;i++) pressure[i] = pressure[i]*FSreconditioning;
     1199        if(dim==3) for(i=0;i<vnumnodes;i++) vel[i] = sqrt(vx[i]*vx[i] + vy[i]*vy[i] + vz[i]*vz[i]);
     1200        else       for(i=0;i<vnumnodes;i++) vel[i] = sqrt(vx[i]*vx[i] + vy[i]*vy[i]);
    11851201
    11861202        /*Now, we have to move the previous inputs  to old
     
    11881204        element->InputChangeName(VxEnum,VxPicardEnum);
    11891205        element->InputChangeName(VyEnum,VyPicardEnum);
    1190         element->InputChangeName(VzEnum,VzPicardEnum);
    11911206        element->InputChangeName(PressureEnum,PressurePicardEnum);
     1207        if(dim==3) element->InputChangeName(VzEnum,VzPicardEnum);
    11921208
    11931209        /*Add vx and vy as inputs to the tria element: */
    11941210        element->AddInput(VxEnum,vx,P1Enum);
    11951211        element->AddInput(VyEnum,vy,P1Enum);
    1196         element->AddInput(VzEnum,vz,P1Enum);
    11971212        element->AddInput(VelEnum,vel,P1Enum);
    11981213        element->AddInput(PressureEnum,pressure,P1Enum);
     1214        if(dim==3) element->AddInput(VzEnum,vz,P1Enum);
    11991215
    12001216        /*Free ressources:*/
     
    12081224        xDelete<int>(pdoflist);
    12091225        xDelete<int>(cs_list);
    1210 
    1211 
    12121226}/*}}}*/
  • issm/trunk-jpl/src/c/classes/Elements/Tria.cpp

    r16754 r16756  
    28472847
    28482848        ::TransformSolutionCoord(values,this->nodes,this->NumberofNodes(),transformenum);
     2849
     2850}
     2851/*}}}*/
     2852/*FUNCTION Tria::TransformSolutionCoord{{{*/
     2853void Tria::TransformSolutionCoord(IssmDouble* values,int* transformenum_list){
     2854
     2855        ::TransformSolutionCoord(values,this->nodes,this->NumberofNodes(),transformenum_list);
    28492856
    28502857}
  • issm/trunk-jpl/src/c/classes/Elements/Tria.h

    r16754 r16756  
    271271                void             SurfaceNormal(IssmDouble* surface_normal, IssmDouble xyz_list[3][3]);
    272272                void           TransformSolutionCoord(IssmDouble* values,int transformenum);
    273                 void           TransformSolutionCoord(IssmDouble* values,int* transformenum_list){_error_("not implemented yet");};
     273                void           TransformSolutionCoord(IssmDouble* values,int* transformenum_list);
    274274                #ifdef _HAVE_STRESSBALANCE_
    275275                ElementMatrix* CreateKMatrixStressbalanceSSA(void);
  • issm/trunk-jpl/src/c/modules/InputUpdateFromSolutionx/InputUpdateFromSolutionx.cpp

    r16696 r16756  
    2828        for(int i=0;i<femmodel->elements->Size();i++){
    2929                Element* element=dynamic_cast<Element*>(femmodel->elements->GetObjectByOffset(i));
    30                 //analysis->InputUpdateFromSolution(solution,element);
    31                 element->InputUpdateFromSolution(solution);
     30                analysis->InputUpdateFromSolution(solution,element);
     31                //element->InputUpdateFromSolution(solution);
    3232        }
    3333        delete analysis;
Note: See TracChangeset for help on using the changeset viewer.