Ignore:
Timestamp:
11/12/13 13:54:57 (11 years ago)
Author:
seroussi
Message:

NEW: moved SIA update from solution in analyses

File:
1 edited

Legend:

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

    r16684 r16717  
    168168}/*}}}*/
    169169void StressbalanceSIAAnalysis::InputUpdateFromSolution(IssmDouble* solution,Element* element){/*{{{*/
    170         _error_("not implemented yet");
    171 }/*}}}*/
     170
     171        int         i,meshtype;
     172        IssmDouble  rho_ice,g;
     173        int*        doflist=NULL;
     174        IssmDouble* xyz_list=NULL;
     175
     176        /*Fetch number of nodes and dof for this finite element*/
     177        int numnodes = element->GetNumberOfNodes();
     178        int numdof   = numnodes*2;
     179
     180        /*Fetch dof list and allocate solution vectors*/
     181        element->GetDofList(&doflist,NoneApproximationEnum,GsetEnum);
     182        IssmDouble* values    = xNew<IssmDouble>(numdof);
     183        IssmDouble* vx        = xNew<IssmDouble>(numdof);
     184        IssmDouble* vy        = xNew<IssmDouble>(numdof);
     185        IssmDouble* vz        = xNew<IssmDouble>(numdof);
     186        IssmDouble* vel       = xNew<IssmDouble>(numdof);
     187        IssmDouble* pressure  = xNew<IssmDouble>(numdof);
     188        IssmDouble* thickness = xNew<IssmDouble>(numdof);
     189        IssmDouble* surface   = xNew<IssmDouble>(numnodes);
     190
     191        /*Use the dof list to index into the solution vector: */
     192        for(i=0;i<numdof;i++) values[i]=solution[doflist[i]];
     193
     194        /*Transform solution in Cartesian Space*/
     195        element->TransformSolutionCoord(&values[0],XYEnum);
     196
     197        /*Ok, we have vx and vy in values, fill in vx and vy arrays: */
     198        for(i=0;i<numnodes;i++){
     199                vx[i]=values[i*NDOF2+0];
     200                vy[i]=values[i*NDOF2+1];
     201
     202                /*Check solution*/
     203                if(xIsNan<IssmDouble>(vx[i])) _error_("NaN found in solution vector");
     204                if(xIsNan<IssmDouble>(vy[i])) _error_("NaN found in solution vector");
     205        }
     206
     207        /*Get Vz and compute vel*/
     208        element->GetInputListOnNodes(&vz[0],VzEnum,0.);
     209        for(i=0;i<numnodes;i++) vel[i]=sqrt(vx[i]*vx[i] + vy[i]*vy[i] + vz[i]*vz[i]);
     210
     211        /*For pressure: we have not computed pressure in this analysis, for this element. We are in 2D,
     212         *so the pressure is just the pressure at the bedrock: */
     213        rho_ice = element->GetMaterialParameter(MaterialsRhoIceEnum);
     214        g       = element->GetMaterialParameter(ConstantsGEnum);
     215        switch(meshtype){
     216                case Mesh2DhorizontalEnum:
     217                        element->GetInputListOnNodes(&thickness[0],ThicknessEnum);
     218                        for(i=0;i<numnodes;i++) pressure[i]=rho_ice*g*thickness[i];
     219                        break;
     220                case Mesh3DEnum:   
     221                        element->GetVerticesCoordinates(&xyz_list);
     222                        element->GetInputListOnNodes(&surface[0],SurfaceEnum);
     223                        for(i=0;i<numnodes;i++) pressure[i]=rho_ice*g*(surface[i]-xyz_list[i*3+2]);
     224                        break;
     225                default: _error_("mesh "<<EnumToStringx(meshtype)<<" not supported yet");
     226        }
     227
     228        /*Now, we have to move the previous Vx and Vy inputs  to old
     229         * status, otherwise, we'll wipe them off: */
     230        element->InputChangeName(VxEnum,VxPicardEnum);
     231        element->InputChangeName(VyEnum,VyPicardEnum);
     232        element->InputChangeName(PressureEnum,PressurePicardEnum);
     233
     234        /*Add vx and vy as inputs to the tria element: */
     235        element->AddInput(VxEnum,vx,P1Enum);
     236        element->AddInput(VyEnum,vy,P1Enum);
     237        element->AddInput(VelEnum,vel,P1Enum);
     238        element->AddInput(PressureEnum,pressure,P1Enum);
     239
     240        /*Free ressources:*/
     241        xDelete<IssmDouble>(thickness);
     242        xDelete<IssmDouble>(surface);
     243        xDelete<IssmDouble>(pressure);
     244        xDelete<IssmDouble>(vel);
     245        xDelete<IssmDouble>(vz);
     246        xDelete<IssmDouble>(vy);
     247        xDelete<IssmDouble>(vx);
     248        xDelete<IssmDouble>(values);
     249        xDelete<int>(doflist);
     250}/*}}}*/
Note: See TracChangeset for help on using the changeset viewer.