Ignore:
Timestamp:
04/22/14 10:39:19 (11 years ago)
Author:
Mathieu Morlighem
Message:

merged trunk-jpl and trunk for revision 17804

Location:
issm/trunk
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • issm/trunk

  • issm/trunk/src

  • issm/trunk/src/c

    • Property svn:ignore
      •  

        old new  
        1616.deps
        1717.dirstamp
         18.libs
  • issm/trunk/src/c/analyses

    • Property svn:ignore
      •  

        old new  
         1*.obj
        12.deps
        23.dirstamp
  • issm/trunk/src/c/analyses/BalancevelocityAnalysis.cpp

    r16542 r17806  
    66
    77/*Model processing*/
    8 int  BalancevelocityAnalysis::DofsPerNode(int** doflist,int meshtype,int approximation){/*{{{*/
     8int  BalancevelocityAnalysis::DofsPerNode(int** doflist,int domaintype,int approximation){/*{{{*/
    99        return 1;
    1010}/*}}}*/
     
    2525        iomodel->FetchDataToInput(elements,ThicknessEnum);
    2626        iomodel->FetchDataToInput(elements,SurfaceEnum);
    27         iomodel->FetchDataToInput(elements,BedEnum);
     27        iomodel->FetchDataToInput(elements,BaseEnum);
    2828        iomodel->FetchDataToInput(elements,MaskIceLevelsetEnum);
    2929        iomodel->FetchDataToInput(elements,VxEnum);
     
    3333        iomodel->FetchDataToInput(elements,BalancethicknessThickeningRateEnum);
    3434
    35         if(iomodel->meshtype==Mesh3DEnum){
    36                 iomodel->FetchDataToInput(elements,MeshElementonbedEnum);
     35        if(iomodel->domaintype==Domain3DEnum){
     36                iomodel->FetchDataToInput(elements,MeshElementonbaseEnum);
    3737                iomodel->FetchDataToInput(elements,MeshElementonsurfaceEnum);
    3838        }
     
    4141
    4242        /*Check in 3d*/
    43         if(iomodel->meshtype==Mesh3DEnum) _error_("DG 3d not implemented yet");
     43        if(iomodel->domaintype==Domain3DEnum) _error_("DG 3d not implemented yet");
    4444
    4545        /*First fetch data: */
    46         iomodel->FetchData(3,MeshVertexonbedEnum,MeshVertexonsurfaceEnum,FlowequationVertexEquationEnum);
    4746        ::CreateNodes(nodes,iomodel,BalancevelocityAnalysisEnum,P1Enum);
    48         iomodel->DeleteData(3,MeshVertexonbedEnum,MeshVertexonsurfaceEnum,FlowequationVertexEquationEnum);
    4947}/*}}}*/
    5048void BalancevelocityAnalysis::CreateConstraints(Constraints* constraints,IoModel* iomodel){/*{{{*/
     
    5755        /*No loads*/
    5856}/*}}}*/
     57
     58/*Finite Element Analysis*/
     59void           BalancevelocityAnalysis::Core(FemModel* femmodel){/*{{{*/
     60        _error_("not implemented");
     61}/*}}}*/
     62ElementVector* BalancevelocityAnalysis::CreateDVector(Element* element){/*{{{*/
     63        /*Default, return NULL*/
     64        return NULL;
     65}/*}}}*/
     66ElementMatrix* BalancevelocityAnalysis::CreateJacobianMatrix(Element* element){/*{{{*/
     67_error_("Not implemented");
     68}/*}}}*/
     69ElementMatrix* BalancevelocityAnalysis::CreateKMatrix(Element* element){/*{{{*/
     70
     71        /*Intermediaries */
     72        IssmDouble  dhdt,mb,ms,Jdet;
     73        IssmDouble  h,gamma,thickness;
     74        IssmDouble  hnx,hny,dhnx[2],dhny[2];
     75        IssmDouble *xyz_list = NULL;
     76
     77        /*Fetch number of nodes and dof for this finite element*/
     78        int numnodes = element->GetNumberOfNodes();
     79
     80        /*Initialize Element matrix and vectors*/
     81        ElementMatrix* Ke     = element->NewElementMatrix();
     82        IssmDouble*    B      = xNew<IssmDouble>(2*numnodes);
     83        IssmDouble*    basis  = xNew<IssmDouble>(numnodes);
     84        IssmDouble*    dbasis = xNew<IssmDouble>(2*numnodes);
     85        IssmDouble*    HNx    = xNew<IssmDouble>(numnodes);
     86        IssmDouble*    HNy    = xNew<IssmDouble>(numnodes);
     87        IssmDouble*    H      = xNew<IssmDouble>(numnodes);
     88        IssmDouble*    Nx     = xNew<IssmDouble>(numnodes);
     89        IssmDouble*    Ny     = xNew<IssmDouble>(numnodes);
     90
     91        /*Retrieve all Inputs and parameters: */
     92        element->GetVerticesCoordinates(&xyz_list);
     93        Input* H_input = element->GetInput(ThicknessEnum); _assert_(H_input);
     94        h = element->CharacteristicLength();
     95
     96        /*Get vector N for all nodes and build HNx and HNy*/
     97        element->GetInputListOnNodes(Nx,SurfaceSlopeXEnum);
     98        element->GetInputListOnNodes(Ny,SurfaceSlopeYEnum);
     99        element->GetInputListOnNodes(H,ThicknessEnum);
     100        for(int i=0;i<numnodes;i++){
     101                IssmDouble norm=sqrt(Nx[i]*Nx[i]+Ny[i]*Ny[i]+1.e-10);
     102                HNx[i] = -H[i]*Nx[i]/norm;
     103                HNy[i] = -H[i]*Ny[i]/norm;
     104        }
     105
     106        /*Start looping on the number of gaussian points:*/
     107        Gauss* gauss=element->NewGauss(2);
     108        for(int ig=gauss->begin();ig<gauss->end();ig++){
     109                gauss->GaussPoint(ig);
     110
     111                H_input->GetInputValue(&thickness,gauss);
     112                if(thickness<50.) thickness=50.;
     113                element->ValueP1DerivativesOnGauss(&dhnx[0],HNx,xyz_list,gauss);
     114                element->ValueP1DerivativesOnGauss(&dhny[0],HNy,xyz_list,gauss);
     115                element->ValueP1OnGauss(&hnx,HNx,gauss);
     116                element->ValueP1OnGauss(&hny,HNy,gauss);
     117
     118                gamma=h/(2.*thickness+1.e-10);
     119
     120                element->JacobianDeterminant(&Jdet,xyz_list,gauss);
     121                element->NodalFunctions(basis,gauss);
     122                element->NodalFunctionsDerivatives(dbasis,xyz_list,gauss);
     123
     124                for(int i=0;i<numnodes;i++){
     125                        for(int j=0;j<numnodes;j++){
     126                                Ke->values[i*numnodes+j] += gauss->weight*Jdet*(
     127                                                        (basis[i]+gamma*(basis[i]*(dhnx[0]+dhny[1]) + dbasis[0*numnodes+i]*hnx + dbasis[1*numnodes+i]*hny))*
     128                                                        (basis[j]*(dhnx[0]+dhny[1])  + dbasis[0*numnodes+j]*hnx + dbasis[1*numnodes+j]*hny)
     129                                                        );
     130                        }
     131                }
     132        }
     133
     134        /*Clean up and return*/
     135        xDelete<IssmDouble>(xyz_list);
     136        xDelete<IssmDouble>(basis);
     137        xDelete<IssmDouble>(dbasis);
     138        xDelete<IssmDouble>(H);
     139        xDelete<IssmDouble>(Nx);
     140        xDelete<IssmDouble>(Ny);
     141        xDelete<IssmDouble>(HNx);
     142        xDelete<IssmDouble>(HNy);
     143        xDelete<IssmDouble>(B);
     144        delete gauss;
     145        return Ke;
     146}/*}}}*/
     147ElementVector* BalancevelocityAnalysis::CreatePVector(Element* element){/*{{{*/
     148
     149        /*Intermediaries*/
     150        int      domaintype;
     151        Element* basalelement;
     152
     153        /*Get basal element*/
     154        element->FindParam(&domaintype,DomainTypeEnum);
     155        switch(domaintype){
     156                case Domain2DhorizontalEnum:
     157                        basalelement = element;
     158                        break;
     159                case Domain3DEnum:
     160                        if(!element->IsOnBase()) return NULL;
     161                        basalelement = element->SpawnBasalElement();
     162                        break;
     163                default: _error_("mesh "<<EnumToStringx(domaintype)<<" not supported yet");
     164        }
     165
     166        /*Intermediaries */
     167        IssmDouble dhdt,mb,ms,Jdet;
     168        IssmDouble gamma,thickness;
     169        IssmDouble hnx,hny,dhnx[2],dhny[2];
     170        IssmDouble *xyz_list  = NULL;
     171
     172        /*Fetch number of nodes and dof for this finite element*/
     173        int numnodes = basalelement->GetNumberOfNodes();
     174
     175        /*Initialize Element vector*/
     176        ElementVector* pe    = basalelement->NewElementVector();
     177        IssmDouble*    basis  = xNew<IssmDouble>(numnodes);
     178        IssmDouble*    dbasis = xNew<IssmDouble>(numnodes*2);
     179        IssmDouble*    H      = xNew<IssmDouble>(numnodes);
     180        IssmDouble*    Nx     = xNew<IssmDouble>(numnodes);
     181        IssmDouble*    Ny     = xNew<IssmDouble>(numnodes);
     182
     183        /*Retrieve all inputs and parameters*/
     184        basalelement->GetVerticesCoordinates(&xyz_list);
     185        Input* ms_input   = basalelement->GetInput(SurfaceforcingsMassBalanceEnum);     _assert_(ms_input);
     186        Input* mb_input   = basalelement->GetInput(BasalforcingsMeltingRateEnum);       _assert_(mb_input);
     187        Input* dhdt_input = basalelement->GetInput(BalancethicknessThickeningRateEnum); _assert_(dhdt_input);
     188        Input* H_input    = basalelement->GetInput(ThicknessEnum);                      _assert_(H_input);
     189        IssmDouble h = basalelement->CharacteristicLength();
     190
     191        /*Get vector N for all nodes*/
     192        basalelement->GetInputListOnNodes(Nx,SurfaceSlopeXEnum);
     193        basalelement->GetInputListOnNodes(Ny,SurfaceSlopeYEnum);
     194        basalelement->GetInputListOnNodes(H,ThicknessEnum);
     195        for(int i=0;i<numnodes;i++){
     196                IssmDouble norm=sqrt(Nx[i]*Nx[i]+Ny[i]*Ny[i]+1.e-10);
     197                Nx[i] = -H[i]*Nx[i]/norm;
     198                Ny[i] = -H[i]*Ny[i]/norm;
     199        }
     200
     201
     202        /* Start  looping on the number of gaussian points: */
     203        Gauss* gauss=basalelement->NewGauss(2);
     204        for(int ig=gauss->begin();ig<gauss->end();ig++){
     205                gauss->GaussPoint(ig);
     206
     207                basalelement->JacobianDeterminant(&Jdet,xyz_list,gauss);
     208                basalelement->NodalFunctions(basis,gauss);
     209                basalelement->NodalFunctionsDerivatives(dbasis,xyz_list,gauss);
     210
     211                element->ValueP1DerivativesOnGauss(&dhnx[0],Nx,xyz_list,gauss);
     212                element->ValueP1DerivativesOnGauss(&dhny[0],Ny,xyz_list,gauss);
     213                element->ValueP1OnGauss(&hnx,Nx,gauss);
     214                element->ValueP1OnGauss(&hny,Ny,gauss);
     215
     216                ms_input->GetInputValue(&ms,gauss);
     217                mb_input->GetInputValue(&mb,gauss);
     218                dhdt_input->GetInputValue(&dhdt,gauss);
     219                H_input->GetInputValue(&thickness,gauss);
     220                if(thickness<50.) thickness=50.;
     221
     222                gamma=h/(2.*thickness+1.e-10);
     223
     224                for(int i=0;i<numnodes;i++){
     225                        pe->values[i]+=Jdet*gauss->weight*(ms-mb-dhdt)*( basis[i] + gamma*(basis[i]*(dhnx[0]+dhny[1])+hnx*dbasis[0*numnodes+i] + hny*dbasis[1*numnodes+i]));
     226                }
     227        }
     228
     229        /*Clean up and return*/
     230        xDelete<IssmDouble>(xyz_list);
     231        xDelete<IssmDouble>(basis);
     232        xDelete<IssmDouble>(dbasis);
     233        xDelete<IssmDouble>(H);
     234        xDelete<IssmDouble>(Nx);
     235        xDelete<IssmDouble>(Ny);
     236        delete gauss;
     237        if(domaintype!=Domain2DhorizontalEnum){basalelement->DeleteMaterials(); delete basalelement;};
     238        return pe;
     239}/*}}}*/
     240void BalancevelocityAnalysis::GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element){/*{{{*/
     241           _error_("not implemented yet");
     242}/*}}}*/
     243void BalancevelocityAnalysis::InputUpdateFromSolution(IssmDouble* solution,Element* element){/*{{{*/
     244
     245        int domaintype;
     246        element->FindParam(&domaintype,DomainTypeEnum);
     247        switch(domaintype){
     248                case Domain2DhorizontalEnum:
     249                        element->InputUpdateFromSolutionOneDof(solution,VelEnum);
     250                        break;
     251                case Domain3DEnum:
     252                        element->InputUpdateFromSolutionOneDofCollapsed(solution,VelEnum);
     253                        break;
     254                default: _error_("mesh "<<EnumToStringx(domaintype)<<" not supported yet");
     255        }
     256}/*}}}*/
     257void BalancevelocityAnalysis::UpdateConstraints(FemModel* femmodel){/*{{{*/
     258        /*Default, do nothing*/
     259        return;
     260}/*}}}*/
Note: See TracChangeset for help on using the changeset viewer.