Changeset 17540


Ignore:
Timestamp:
03/25/14 13:42:51 (11 years ago)
Author:
Mathieu Morlighem
Message:

CHG: moved initialization to solution sequence

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

Legend:

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

    r17539 r17540  
    234234                iomodel->FetchDataToInput(elements,PressureEnum,0.);
    235235                if(dakota_analysis)elements->InputDuplicate(PressureEnum,QmuPressureEnum);
    236                 if(finiteelement==XTaylorHoodEnum) this->InitializeXTH(elements);
    237236        }
    238237        if(islevelset){
     
    821820        }
    822821}/*}}}*/
    823 void StressbalanceAnalysis::InitializeXTH(Elements* elements){/*{{{*/
    824 
    825         /*Intermediaries*/
    826         int        meshtype,dim;
    827         IssmDouble dvx[3],dvy[3],dvz[3];
    828         IssmDouble viscosity;
    829         IssmDouble *xyz_list = NULL;
    830 
    831         for(int i=0;i<elements->Size();i++){
    832                 Element* element=dynamic_cast<Element*>(elements->GetObjectByOffset(i));
    833 
    834                 /*Get problem dimension*/
    835                 element->FindParam(&meshtype,MeshTypeEnum);
    836                 switch(meshtype){
    837                         case Mesh2DverticalEnum: dim = 2; break;
    838                         case Mesh3DEnum:         dim = 3; break;
    839                         case Mesh3DtetrasEnum:   dim = 3; break;
    840                         default: _error_("mesh "<<EnumToStringx(meshtype)<<" not supported yet");
    841                 }
    842 
    843                 int tnumnodes = element->GetNumberOfVertices();      //Tensors, P1 DG
    844 
    845                 /*Get inputs and parameters*/
    846                 element->GetVerticesCoordinates(&xyz_list);
    847                 Input* vx_input=element->GetInput(VxEnum); _assert_(vx_input);
    848                 Input* vy_input=element->GetInput(VyEnum); _assert_(vy_input);
    849                 Input* vz_input;
    850                 if(dim==3){vz_input=element->GetInput(VzEnum); _assert_(vz_input);}
    851 
    852                 /*Get d and tau*/
    853                 Gauss* gauss = element->NewGauss();
    854                 for(int i=0;i<tnumnodes;i++){
    855                         gauss->GaussNode(P1DGEnum,i);
    856 
    857                         vx_input->GetInputDerivativeValue(&dvx[0],xyz_list,gauss);
    858                         vy_input->GetInputDerivativeValue(&dvy[0],xyz_list,gauss);
    859                         if(dim==3){
    860                                 vz_input->GetInputDerivativeValue(&dvz[0],xyz_list,gauss);
    861                         }
    862 
    863                         _error_("STOP");
    864                         element->ViscosityFS(&viscosity,dim,xyz_list,gauss,vx_input,vy_input,vz_input);
    865                 }
    866 
    867                 /*Clean up*/
    868                 xDelete<IssmDouble>(xyz_list);
    869         }
    870 
    871 }/*}}}*/
    872822
    873823/*Finite Element Analysis*/
     
    41094059        xDelete<IssmDouble>(vvalues);
    41104060}/*}}}*/
     4061void StressbalanceAnalysis::InitializeXTH(Elements* elements,Parameters* parameters){/*{{{*/
     4062
     4063        /*Intermediaries*/
     4064        int        meshtype,dim;
     4065        IssmDouble dvx[3],dvy[3],dvz[3];
     4066        IssmDouble viscosity;
     4067        IssmDouble *xyz_list = NULL;
     4068
     4069        /*Get problem dimension*/
     4070        parameters->FindParam(&meshtype,MeshTypeEnum);
     4071        switch(meshtype){
     4072                case Mesh2DverticalEnum: dim = 2; break;
     4073                case Mesh3DEnum:         dim = 3; break;
     4074                case Mesh3DtetrasEnum:   dim = 3; break;
     4075                default: _error_("mesh "<<EnumToStringx(meshtype)<<" not supported yet");
     4076        }
     4077
     4078        for(int i=0;i<elements->Size();i++){
     4079                Element* element=dynamic_cast<Element*>(elements->GetObjectByOffset(i));
     4080
     4081                /*Get inputs and parameters*/
     4082                element->GetVerticesCoordinates(&xyz_list);
     4083                Input* vx_input=element->GetInput(VxEnum); _assert_(vx_input);
     4084                Input* vy_input=element->GetInput(VyEnum); _assert_(vy_input);
     4085                Input* vz_input;
     4086                if(dim==3){vz_input=element->GetInput(VzEnum); _assert_(vz_input);}
     4087
     4088                /*Allocate new inputs*/
     4089                int tnumnodes = element->GetNumberOfVertices();      //Tensors, P1 DG
     4090                IssmDouble* epsxx = xNew<IssmDouble>(tnumnodes); IssmDouble* sigmapxx = xNew<IssmDouble>(tnumnodes);
     4091                IssmDouble* epsyy = xNew<IssmDouble>(tnumnodes); IssmDouble* sigmapyy = xNew<IssmDouble>(tnumnodes);
     4092                IssmDouble* epsxy = xNew<IssmDouble>(tnumnodes); IssmDouble* sigmapxy = xNew<IssmDouble>(tnumnodes);
     4093                IssmDouble* epszz = NULL;                        IssmDouble* sigmapzz = NULL; 
     4094                IssmDouble* epsxz = NULL;                        IssmDouble* sigmapxz = NULL; 
     4095                IssmDouble* epsyz = NULL;                        IssmDouble* sigmapyz = NULL; 
     4096                if(dim==3){
     4097                        epszz = xNew<IssmDouble>(tnumnodes); sigmapzz = xNew<IssmDouble>(tnumnodes);
     4098                        epsxz = xNew<IssmDouble>(tnumnodes); sigmapxz = xNew<IssmDouble>(tnumnodes);
     4099                        epsyz = xNew<IssmDouble>(tnumnodes); sigmapyz = xNew<IssmDouble>(tnumnodes);
     4100                }
     4101
     4102                /*Get d and tau*/
     4103                Gauss* gauss = element->NewGauss();
     4104                for(int i=0;i<tnumnodes;i++){
     4105                        gauss->GaussNode(P1DGEnum,i);
     4106
     4107                        vx_input->GetInputDerivativeValue(&dvx[0],xyz_list,gauss);
     4108                        vy_input->GetInputDerivativeValue(&dvy[0],xyz_list,gauss);
     4109                        if(dim==3){
     4110                                vz_input->GetInputDerivativeValue(&dvz[0],xyz_list,gauss);
     4111                        }
     4112
     4113                        element->ViscosityFS(&viscosity,dim,xyz_list,gauss,vx_input,vy_input,vz_input);
     4114                        epsxx[i] = dvx[0];                sigmapxx[i] = 2.*viscosity*epsxx[i];
     4115                        epsyy[i] = dvy[1];                sigmapyy[i] = 2.*viscosity*epsyy[i];
     4116                        epsxy[i] = 0.5*(dvx[1] + dvy[0]); sigmapxy[i] = 2.*viscosity*epsxy[i];
     4117                        if(dim==3){
     4118                                epszz[i] = dvz[2];                sigmapzz[i] = 2.*viscosity*epszz[i];
     4119                                epsxz[i] = 0.5*(dvx[2] + dvz[0]); sigmapxz[i] = 2.*viscosity*epsxz[i];
     4120                                epsyz[i] = 0.5*(dvy[2] + dvz[1]); sigmapyz[i] = 2.*viscosity*epsyz[i];
     4121                        }
     4122                }
     4123
     4124                /*Add inputs*/
     4125                element->AddInput(StrainRatexxEnum,epsxx,P1DGEnum); element->AddInput(DeviatoricStressxxEnum,sigmapxx,P1DGEnum);
     4126                element->AddInput(StrainRateyyEnum,epsyy,P1DGEnum); element->AddInput(DeviatoricStressyyEnum,sigmapyy,P1DGEnum);
     4127                element->AddInput(StrainRatexyEnum,epsxy,P1DGEnum); element->AddInput(DeviatoricStressxyEnum,sigmapxy,P1DGEnum);
     4128                if(dim==3){
     4129                        element->AddInput(StrainRatezzEnum,epszz,P1DGEnum); element->AddInput(DeviatoricStresszzEnum,sigmapzz,P1DGEnum);
     4130                        element->AddInput(StrainRatexzEnum,epsxz,P1DGEnum); element->AddInput(DeviatoricStressxzEnum,sigmapxz,P1DGEnum);
     4131                        element->AddInput(StrainRateyzEnum,epsyz,P1DGEnum); element->AddInput(DeviatoricStressyzEnum,sigmapyz,P1DGEnum);
     4132                }
     4133
     4134                /*Clean up*/
     4135                xDelete<IssmDouble>(xyz_list);
     4136                xDelete<IssmDouble>(epsxx);
     4137                xDelete<IssmDouble>(epsyy);
     4138                xDelete<IssmDouble>(epszz);
     4139                xDelete<IssmDouble>(epsxy);
     4140                xDelete<IssmDouble>(epsxz);
     4141                xDelete<IssmDouble>(epsyz);
     4142        }
     4143
     4144}/*}}}*/
    41114145void StressbalanceAnalysis::InputUpdateFromSolutionFS(IssmDouble* solution,Element* element){/*{{{*/
    41124146
  • issm/trunk-jpl/src/c/analyses/StressbalanceAnalysis.h

    r17539 r17540  
    1919                void CreateConstraints(Constraints* constraints,IoModel* iomodel);
    2020                void CreateLoads(Loads* loads, IoModel* iomodel);
    21                 void InitializeXTH(Elements* elements);
    2221
    2322                /*Finite element Analysis*/
     
    8281                void GetSolutionFromInputsFS(Vector<IssmDouble>* solution,Element* element);
    8382                void InputUpdateFromSolutionFS(IssmDouble* solution,Element* element);
     83                void InitializeXTH(Elements* elements,Parameters* parameters);
    8484                /*Coupling*/
    8585                ElementMatrix* CreateKMatrixSSA3d(Element* element);
  • issm/trunk-jpl/src/c/classes/Elements/TriaRef.cpp

    r17536 r17540  
    246246                        this->element_type = TaylorHoodEnum;
    247247                        return;
     248                case XTaylorHoodEnum:
     249                        this->element_type = P2Enum;
     250                        this->GetNodalFunctions(basis,gauss);
     251                        this->element_type = XTaylorHoodEnum;
     252                        return;
    248253                default:
    249254                        _error_("Element type "<<EnumToStringx(this->element_type)<<" not supported yet");
     
    280285                        this->GetNodalFunctions(basis,gauss);
    281286                        this->element_type = TaylorHoodEnum;
     287                        return;
     288                case XTaylorHoodEnum:
     289                        this->element_type = P1Enum;
     290                        this->GetNodalFunctions(basis,gauss);
     291                        this->element_type = XTaylorHoodEnum;
    282292                        return;
    283293                default:
     
    439449                        this->element_type = P2Enum;
    440450                        this->GetNodalFunctionsDerivatives(dbasis,xyz_list,gauss);
    441                         this->element_type = TaylorHoodEnum;
     451                        this->element_type = XTaylorHoodEnum;
    442452                        return;
    443453                default:
  • issm/trunk-jpl/src/c/solutionsequences/solutionsequence_la_theta.cpp

    r17525 r17540  
    2020        int  configuration_type;
    2121
     22        /*Create analysis*/
     23        StressbalanceAnalysis* analysis = new StressbalanceAnalysis();
     24
    2225        /*Recover parameters: */
    2326        femmodel->parameters->FindParam(&configuration_type,ConfigurationTypeEnum);
     27
     28        /*Update constraints and initialize d and tau if necessary*/
    2429        femmodel->UpdateConstraintsx();
     30        analysis->InitializeXTH(femmodel->elements,femmodel->parameters);
     31
     32        /*Solve KU=F*/
    2533        SystemMatricesx(&Kff,&Kfs,&pf,&df,NULL,femmodel);
    26         _error_("STOP");
    2734        CreateNodalConstraintsx(&ys,femmodel->nodes,configuration_type);
    2835        Reduceloadx(pf, Kfs, ys); delete Kfs;
     
    3037        delete Kff; delete pf; delete df;
    3138        Mergesolutionfromftogx(&ug, uf,ys,femmodel->nodes,femmodel->parameters);delete uf; delete ys;
     39
     40        /*Update solution*/
    3241        InputUpdateFromSolutionx(femmodel,ug);
     42
     43        /*Update d and tau accordingly*/
     44        _error_("STOP");
     45
    3346        delete ug; 
     47        delete analysis;
    3448}
Note: See TracChangeset for help on using the changeset viewer.