source: issm/oecreview/Archive/16554-17801/ISSM-16716-16717.diff@ 17802

Last change on this file since 17802 was 17802, checked in by Mathieu Morlighem, 11 years ago

Added archives

File size: 6.6 KB
  • ../trunk-jpl/src/c/analyses/L2ProjectionBaseAnalysis.cpp

     
    5959}/*}}}*/
    6060void L2ProjectionBaseAnalysis::InputUpdateFromSolution(IssmDouble* solution,Element* element){/*{{{*/
    6161
    62         int inputenum;
     62        int inputenum,meshtype;
    6363
    6464        element->FindParam(&inputenum,InputToL2ProjectEnum);
    65         element->InputUpdateFromSolutionOneDofCollapsed(solution,inputenum);
     65        element->FindParam(&meshtype,MeshTypeEnum);
     66        switch(meshtype){
     67                case Mesh2DhorizontalEnum:
     68                        element->InputUpdateFromSolutionOneDof(solution,inputenum);
     69                        break;
     70                case Mesh3DEnum:
     71                        element->InputUpdateFromSolutionOneDofCollapsed(solution,inputenum);
     72                        break;
     73                default: _error_("mesh "<<EnumToStringx(meshtype)<<" not supported yet");
     74        }
    6675}/*}}}*/
  • ../trunk-jpl/src/c/analyses/StressbalanceSIAAnalysis.cpp

     
    167167        xDelete<IssmDouble>(values);
    168168}/*}}}*/
    169169void StressbalanceSIAAnalysis::InputUpdateFromSolution(IssmDouble* solution,Element* element){/*{{{*/
    170         _error_("not implemented yet");
     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);
    171250}/*}}}*/
  • ../trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp

     
    940940                        InputUpdateFromSolutionHoriz(solution,element);
    941941                        return;
    942942                case L1L2ApproximationEnum:
    943                         //InputUpdateFromSolutionHoriz(solution,element);
     943                        InputUpdateFromSolutionHoriz(solution,element);
    944944                        return;
    945945                case SSAHOApproximationEnum: case HOFSApproximationEnum: case SSAFSApproximationEnum:
    946946                        /*the elements around will create the solution*/
  • ../trunk-jpl/src/c/classes/Elements/Element.h

     
    8888                virtual void   InputDuplicate(int original_enum,int new_enum)=0;
    8989                virtual void   InputCreate(IssmDouble* vector,IoModel* iomodel,int M,int N,int vector_type,int vector_enum,int code)=0;
    9090                virtual void   InputUpdateFromSolutionOneDofCollapsed(IssmDouble* solution,int inputenum)=0;
     91                virtual void   InputUpdateFromSolutionOneDof(IssmDouble* solution,int inputenum)=0;
    9192
    9293                virtual int    NodalValue(IssmDouble* pvalue, int index, int natureofdataenum)=0;
    9394                virtual int    NumberofNodesVelocity(void)=0;
  • ../trunk-jpl/src/c/classes/Elements/Seg.h

     
    5555                /*Update virtual functions resolution: {{{*/
    5656                void  InputUpdateFromSolution(IssmDouble* solution){_error_("not implemented yet");};
    5757                void  InputUpdateFromSolutionOneDofCollapsed(IssmDouble* solution,int inputenum){_error_("not implemented yet");};
     58                void  InputUpdateFromSolutionOneDof(IssmDouble* solution,int inputenum){_error_("not implemented yet");};
    5859                void  InputUpdateFromVector(IssmDouble* vector, int name, int type){_error_("not implemented yet");};
    5960#ifdef _HAVE_DAKOTA_
    6061                void  InputUpdateFromVectorDakota(IssmDouble* vector, int name, int type){_error_("not implemented yet");};
Note: See TracBrowser for help on using the repository browser.