Changeset 18281


Ignore:
Timestamp:
07/22/14 12:50:33 (11 years ago)
Author:
seroussi
Message:

NEW: added second augmentation

File:
1 edited

Legend:

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

    r18262 r18281  
    3131        if(iomodel->domaintype==Domain3DEnum) iomodel->FetchDataToInput(elements,VzEnum,0.);
    3232        iomodel->FetchDataToInput(elements,PressureEnum,0.);
     33        iomodel->FetchDataToInput(elements,SigmaNNEnum,0.);
    3334}/*}}}*/
    3435void UzawaPressureAnalysis::CreateNodes(Nodes* nodes,IoModel* iomodel){/*{{{*/
     
    171172        int        *doflist       = NULL;
    172173        IssmDouble rholambda,un,vx,vy,vz,sigmann;
    173         IssmDouble bed_normal[3];
    174174        IssmDouble *xyz_list_base = NULL;
    175175
    176176        /*Fetch number of nodes and dof for this finite element*/
    177         int numnodes       = element->GetNumberOfNodes();
    178         //int numnodessigma  = element->NumberofNodes(P2Enum);
    179         int numnodessigma;
     177        int numnodes      = element->GetNumberOfNodes();
     178        int numnodessigma = element->GetNumberOfNodes(P2Enum);
    180179
    181180        element->FindParam(&dim,DomainDimensionEnum);
    182         if(dim==2) numnodessigma=3;
    183         else numnodessigma=6;
    184181
    185182        /*Fetch dof list and allocate solution vector*/
    186183        element->GetDofList(&doflist,NoneApproximationEnum,GsetEnum);
    187         IssmDouble* values    = xNew<IssmDouble>(numnodes);
    188         IssmDouble* pressure  = xNew<IssmDouble>(numnodes);
    189         Input* vx_input=    element->GetInput(VxEnum);       _assert_(vx_input);
    190         Input* vy_input=    element->GetInput(VyEnum);       _assert_(vy_input);
    191         Input* vz_input     = NULL;
    192         if(dim==3){vz_input =element->GetInput(VzEnum);      _assert_(vz_input);}
    193         Input* sigmann_input=element->GetInput(SigmaNNEnum); _assert_(vy_input);
     184        IssmDouble* values        = xNew<IssmDouble>(numnodes);
     185        IssmDouble* valueslambda  = xNewZeroInit<IssmDouble>(numnodessigma);
     186        IssmDouble* pressure      = xNew<IssmDouble>(numnodes);
     187        Input* sigmann_input      = element->GetInput(SigmaNNEnum); _assert_(sigmann_input);
     188        Input* vx_input           = element->GetInput(VxEnum);      _assert_(vx_input);
     189        Input* vy_input           = element->GetInput(VyEnum);      _assert_(vy_input);
     190        Input* vz_input           = NULL;
     191        if(dim==3){vz_input       = element->GetInput(VzEnum);      _assert_(vz_input);}
    194192        element->GetInputListOnNodes(&pressure[0],PressureEnum);
    195193
    196194        /*Update pressure enum first*/
    197195        for(int i=0;i<numnodes;i++){
    198                 values[i]   = pressure[i] + solution[doflist[i]];
     196                values[i]  = pressure[i] + solution[doflist[i]];
    199197        }
    200198        element->AddInput(PressureEnum,values,element->GetElementType());
     
    202200        /*Now compute sigmann if on base*/
    203201        if(element->IsOnBase()){
    204 
     202                if(dim==3) _error_("not implemented yet");
     203
     204                int baselist[3];
     205                int onbase=0;
     206                IssmDouble  Jdet;
     207                IssmDouble bed_normal[3];
     208                IssmDouble  Jlambda[3][3]  = {0.0};
     209                IssmDouble  Cuk[3]         = {0.0};
     210                IssmDouble  deltalambda[3] = {0.0};
     211                IssmDouble* vertexonbase  = xNew<IssmDouble>(numnodessigma);
     212                Input* vertexonbase_input = element->GetInput(MeshVertexonbaseEnum); _assert_(vertexonbase_input);
     213                Gauss* gauss = element->NewGauss();
     214
     215                IssmDouble* basis = xNewZeroInit<IssmDouble>(numnodessigma);
    205216                element->GetVerticesCoordinatesBase(&xyz_list_base);
    206217                element->NormalBase(&bed_normal[0],xyz_list_base);
    207218                element->FindParam(&rholambda,AugmentedLagrangianRholambdaEnum);
    208219
    209                 Gauss* gauss = element->NewGauss();
    210220                for(int i=0;i<numnodessigma;i++){
    211221                        gauss->GaussNode(P2Enum,i);
    212 
    213                         sigmann_input->GetInputValue(&sigmann, gauss);
     222                        vertexonbase_input->GetInputValue(&vertexonbase[i], gauss);
     223                        if(vertexonbase[i]==1){
     224                                baselist[onbase]=i;
     225                                onbase += 1;
     226                        }
     227                }
     228                if(!onbase==3) _error_("basal nodes of element not found");
     229
     230                delete gauss;
     231                gauss = element->NewGaussBase(3);
     232                for(int ig=gauss->begin();ig<gauss->end();ig++){
     233                        gauss->GaussPoint(ig);
     234
     235                        /*Compute Jlambda*/
     236                        element->NodalFunctionsP2(basis,gauss);
     237                        element->JacobianDeterminantBase(&Jdet,xyz_list_base,gauss);
     238                        for(int i=0;i<3;i++){
     239                                for(int j=0;j<3;j++){
     240                                        Jlambda[i][j] += Jdet*gauss->weight*basis[baselist[i]]*basis[baselist[j]];
     241                                }
     242                        }
     243
     244                        /*Compute rho_lambd C u^k*/
    214245                        vx_input->GetInputValue(&vx, gauss);
    215246                        vy_input->GetInputValue(&vy, gauss);
    216247                        un=bed_normal[0]*vx + bed_normal[1]*vy;
    217                         if(dim==3){
    218                            vz_input->GetInputValue(&vz, gauss);
    219                                 un = un + bed_normal[2]*vz;
    220                         }
    221                         values[i] = sigmann + rholambda*un;
    222                 }
     248                        for(int i=0;i<3;i++) Cuk[i] += - un*rholambda*Jdet*gauss->weight*basis[baselist[i]];
     249                }
     250
     251                /*Now update sigmann*/
     252                Matrix3x3Solve(&deltalambda[0],&Jlambda[0][0],&Cuk[0]);
    223253                delete gauss;
     254                gauss = element->NewGauss();
     255                for(int i=0;i<3;i++){
     256                        gauss->GaussNode(P2Enum,baselist[i]);
     257                        sigmann_input->GetInputValue(&sigmann, gauss);
     258                        valueslambda[baselist[i]] = sigmann + deltalambda[i];
     259                }
     260
     261                delete gauss;
     262                xDelete<IssmDouble>(vertexonbase);
    224263                xDelete<IssmDouble>(xyz_list_base);
    225         }
    226         element->AddInput(SigmaNNEnum,values,P2Enum);
     264                xDelete<IssmDouble>(basis);
     265        }
     266        element->AddInput(SigmaNNEnum,valueslambda,P2Enum);
    227267
    228268        /*Free ressources:*/
    229269        xDelete<IssmDouble>(values);
     270        xDelete<IssmDouble>(valueslambda);
    230271        xDelete<IssmDouble>(pressure);
    231272        xDelete<int>(doflist);
    232 
    233273}/*}}}*/
    234274void UzawaPressureAnalysis::UpdateConstraints(FemModel* femmodel){/*{{{*/
Note: See TracChangeset for help on using the changeset viewer.