Changeset 16804


Ignore:
Timestamp:
11/16/13 13:48:18 (11 years ago)
Author:
Mathieu Morlighem
Message:

CHG: some clean up

Location:
issm/trunk-jpl/src/c/analyses
Files:
3 edited

Legend:

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

    r16803 r16804  
    812812                case SSAApproximationEnum:
    813813                        return CreatePVectorSSA(element);
     814                case HOApproximationEnum:
     815                        return CreatePVectorHO(element);
    814816                default:
    815817                        _error_("Approximation "<<EnumToStringx(approximation)<<" not supported");
    816818        }
     819}/*}}}*/
     820ElementVector* StressbalanceAnalysis::CreatePVectorHO(Element* element){/*{{{*/
     821
     822        /*compute all load vectors for this element*/
     823        ElementVector* pe1=CreatePVectorHODrivingStress(element);
     824        ElementVector* pe2=CreatePVectorHOFront(element);
     825        ElementVector* pe =new ElementVector(pe1,pe2);
     826
     827        /*clean-up and return*/
     828        delete pe1;
     829        delete pe2;
     830        return pe;
     831}/*}}}*/
     832ElementVector* StressbalanceAnalysis::CreatePVectorHODrivingStress(Element* element){/*{{{*/
     833
     834        /*Intermediaries */
     835        IssmDouble  Jdet,slope[3];
     836        IssmDouble* xyz_list = NULL;
     837
     838        /*Fetch number of nodes and dof for this finite element*/
     839        int numnodes = element->GetNumberOfNodes();
     840
     841        /*Initialize Element vector and vectors*/
     842        ElementVector* pe=element->NewElementVector(HOApproximationEnum);
     843        IssmDouble*    basis = xNew<IssmDouble>(numnodes);
     844
     845        /*Retrieve all inputs and parameters*/
     846        element->GetVerticesCoordinates(&xyz_list);
     847        Input*     surface_input = element->GetInput(SurfaceEnum);   _assert_(surface_input);
     848        IssmDouble rhog = element->GetMaterialParameter(MaterialsRhoIceEnum)*element->GetMaterialParameter(ConstantsGEnum);
     849
     850        /* Start  looping on the number of gaussian points: */
     851        Gauss* gauss=element->NewGauss(3);
     852        for(int ig=gauss->begin();ig<gauss->end();ig++){
     853                gauss->GaussPoint(ig);
     854
     855                element->JacobianDeterminant(&Jdet,xyz_list,gauss);
     856                element->NodalFunctions(basis, gauss);
     857                surface_input->GetInputDerivativeValue(&slope[0],xyz_list,gauss);
     858
     859                for(int i=0;i<numnodes;i++){
     860                        pe->values[i*2+0]+=-rhog*slope[0]*Jdet*gauss->weight*basis[i];
     861                        pe->values[i*2+1]+=-rhog*slope[1]*Jdet*gauss->weight*basis[i];
     862                }
     863        }
     864
     865        /*Transform coordinate system*/
     866        element->TransformLoadVectorCoord(pe,XYEnum);
     867
     868        /*Clean up and return*/
     869        xDelete<IssmDouble>(basis);
     870        xDelete<IssmDouble>(xyz_list);
     871        delete gauss;
     872        return pe;
     873}/*}}}*/
     874ElementVector* StressbalanceAnalysis::CreatePVectorHOFront(Element* element){/*{{{*/
     875
     876        return NULL;
    817877}/*}}}*/
    818878ElementVector* StressbalanceAnalysis::CreatePVectorSSA(Element* element){/*{{{*/
     
    849909
    850910        /*Intermediaries */
    851         int         i;
    852         IssmDouble  driving_stress_baseline,thickness;
    853         IssmDouble  Jdet;
    854         IssmDouble  slope[2];
    855         IssmDouble* xyz_list     = NULL;
     911        IssmDouble  thickness,Jdet,slope[2];
     912        IssmDouble* xyz_list = NULL;
    856913
    857914        /*Fetch number of nodes and dof for this finite element*/
    858915        int numnodes = element->GetNumberOfNodes();
    859         IssmDouble* icefrontlevel= xNew<IssmDouble>(numnodes);
    860916
    861917        /*Initialize Element vector and vectors*/
     
    865921        /*Retrieve all inputs and parameters*/
    866922        element->GetVerticesCoordinates(&xyz_list);
    867         Input* thickness_input=element->GetInput(ThicknessEnum);          _assert_(thickness_input);
    868         Input* surface_input  =element->GetInput(SurfaceEnum);            _assert_(surface_input);
    869         Input* drag_input     =element->GetInput(FrictionCoefficientEnum);_assert_(drag_input);
    870         element->GetInputListOnVertices(icefrontlevel,BedEnum);
     923        Input*     thickness_input=element->GetInput(ThicknessEnum); _assert_(thickness_input);
     924        Input*     surface_input  =element->GetInput(SurfaceEnum);   _assert_(surface_input);
     925        IssmDouble rhog = element->GetMaterialParameter(MaterialsRhoIceEnum)*element->GetMaterialParameter(ConstantsGEnum);
    871926
    872927        /* Start  looping on the number of gaussian points: */
     
    881936                thickness_input->GetInputValue(&thickness,gauss);
    882937                surface_input->GetInputDerivativeValue(&slope[0],xyz_list,gauss);
    883                 driving_stress_baseline=element->GetMaterialParameter(MaterialsRhoIceEnum)*element->GetMaterialParameter(ConstantsGEnum)*thickness;
    884 
    885                 /*Build load vector: */
    886                 for(i=0;i<numnodes;i++){
    887                         pe->values[i*2+0]+=-driving_stress_baseline*slope[0]*Jdet*gauss->weight*basis[i];
    888                         pe->values[i*2+1]+=-driving_stress_baseline*slope[1]*Jdet*gauss->weight*basis[i];
     938
     939                for(int i=0;i<numnodes;i++){
     940                        pe->values[i*2+0]+=-rhog*thickness*slope[0]*Jdet*gauss->weight*basis[i];
     941                        pe->values[i*2+1]+=-rhog*thickness*slope[1]*Jdet*gauss->weight*basis[i];
    889942                }
    890943        }
     
    894947
    895948        /*Clean up and return*/
     949        xDelete<IssmDouble>(xyz_list);
    896950        xDelete<IssmDouble>(basis);
    897951        delete gauss;
  • issm/trunk-jpl/src/c/analyses/StressbalanceAnalysis.h

    r16799 r16804  
    2323                ElementMatrix* CreateKMatrix(Element* element);
    2424                ElementVector* CreatePVector(Element* element);
     25                ElementVector* CreatePVectorHO(Element* element);
     26                ElementVector* CreatePVectorHODrivingStress(Element* element);
     27                ElementVector* CreatePVectorHOFront(Element* element);
    2528                ElementVector* CreatePVectorSSA(Element* element);
    2629                ElementVector* CreatePVectorSSADrivingStress(Element* element);
  • issm/trunk-jpl/src/c/analyses/StressbalanceVerticalAnalysis.cpp

    r16803 r16804  
    115115        /*Intermediaries*/
    116116        int         approximation;
    117         IssmDouble  Jdet;
    118         IssmDouble  dudx,dvdy,dwdz;
     117        IssmDouble  Jdet,dudx,dvdy,dwdz;
    119118        IssmDouble  du[3],dv[3],dw[3];
    120119        IssmDouble* xyz_list = NULL;
     
    167166
    168167        /*Intermediaries */
    169         int         i,j,approximation;
     168        int         approximation;
    170169        IssmDouble *xyz_list      = NULL;
    171170        IssmDouble *xyz_list_base = NULL;
    172         IssmDouble  Jdet;
    173         IssmDouble  vx,vy,vz,dbdx,dbdy,basalmeltingvalue;
    174         IssmDouble  slope[3];
     171        IssmDouble  Jdet,slope[3];
     172        IssmDouble  vx,vy,vz=0.,dbdx,dbdy,basalmeltingvalue;
    175173
    176174        if(!element->IsOnBed()) return NULL;
     
    208206                        vzFS_input->GetInputValue(&vz,gauss);
    209207                }
    210                 else vz=0.;
    211 
    212208                dbdx=slope[0];
    213209                dbdy=slope[1];
     
    216212                element->NodalFunctions(basis,gauss);
    217213
    218                 for(i=0;i<numnodes;i++) pe->values[i]+=-Jdet*gauss->weight*(vx*dbdx+vy*dbdy-vz-basalmeltingvalue)*basis[i];
     214                for(int i=0;i<numnodes;i++) pe->values[i]+=-Jdet*gauss->weight*(vx*dbdx+vy*dbdy-vz-basalmeltingvalue)*basis[i];
    219215        }
    220216
     
    225221        xDelete<IssmDouble>(xyz_list_base);
    226222        return pe;
    227 
    228223}/*}}}*/
    229224void StressbalanceVerticalAnalysis::GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element){/*{{{*/
Note: See TracChangeset for help on using the changeset viewer.