source: issm/oecreview/Archive/16554-17801/ISSM-16908-16909.diff@ 17802

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

Added archives

File size: 4.0 KB
  • ../trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp

     
    30893089        return Ke;
    30903090}/*}}}*/
    30913091ElementMatrix* StressbalanceAnalysis::CreateKMatrixCouplingSSAHOFriction(Element* element){/*{{{*/
    3092         return NULL;
    30933092
     3093        if(element->IsFloating() || !element->IsOnBed()) return NULL;
     3094
     3095        /*Constants*/
     3096        int numnodes    = element->GetNumberOfNodes();
     3097        int numdof      = 2*numnodes;
     3098        int numdoftotal = 4*numnodes;
     3099
     3100        /*Intermediaries */
     3101        int         i,j;
     3102        IssmDouble  Jdet2d,alpha2;
     3103        IssmDouble *xyz_list_tria=NULL;
     3104        IssmDouble* L           = xNewZeroInit<IssmDouble>(2*numdof);
     3105        IssmDouble  DL[2][2]     ={{ 0,0 },{0,0}}; //for basal drag
     3106        IssmDouble  DL_scalar;
     3107        IssmDouble* Ke_gg       = xNewZeroInit<IssmDouble>(numdof*numdof);
     3108        Node       *node_list[2*numnodes];
     3109        int*        cs_list= xNew<int>(2*numnodes);
     3110
     3111        /*Initialize Element matrix and return if necessary*/
     3112        ElementMatrix* Ke1=element->NewElementMatrix(SSAApproximationEnum);
     3113        ElementMatrix* Ke2=element->NewElementMatrix(HOApproximationEnum);
     3114        ElementMatrix* Ke=new ElementMatrix(Ke1,Ke2);
     3115        delete Ke1; delete Ke2;
     3116
     3117        /*Prepare node list*/
     3118        for(i=0;i<numnodes;i++){
     3119                node_list[i+0*numnodes] = element->GetNode(i);
     3120                node_list[i+1*numnodes] = element->GetNode(i);
     3121                cs_list[i+0*numnodes] = XYEnum;
     3122                cs_list[i+1*numnodes] = XYEnum;
     3123        }
     3124
     3125        /*retrieve inputs :*/
     3126        element->GetVerticesCoordinatesBase(&xyz_list_tria);
     3127        Input* vx_input=element->GetInput(VxEnum);  _assert_(vx_input);
     3128        Input* vy_input=element->GetInput(VyEnum);  _assert_(vy_input);
     3129        Input* vz_input=element->GetInput(VzEnum);  _assert_(vz_input);
     3130
     3131        /*build friction object, used later on: */
     3132        Friction* friction=new Friction(element,2);
     3133
     3134        /* Start  looping on the number of gaussian points: */
     3135        Gauss* gauss=element->NewGaussBase(2);
     3136        for(int ig=gauss->begin();ig<gauss->end();ig++){
     3137
     3138                gauss->GaussPoint(ig);
     3139
     3140                /*Friction: */
     3141                friction->GetAlpha2(&alpha2,gauss,vx_input,vy_input,vz_input);
     3142                element->JacobianDeterminantBase(&Jdet2d, xyz_list_tria,gauss);
     3143                this->GetBHOFriction(L,element,xyz_list_tria,gauss);
     3144
     3145                DL_scalar=alpha2*gauss->weight*Jdet2d;
     3146                for (i=0;i<2;i++) DL[i][i]=DL_scalar;
     3147
     3148                /*  Do the triple producte tL*D*L: */
     3149                TripleMultiply( L,2,numdof,1,
     3150                                        &DL[0][0],2,2,0,
     3151                                        L,2,numdof,0,
     3152                                        Ke_gg,1);
     3153        }
     3154
     3155        for(i=0;i<numdof;i++) for(j=0;j<numdof;j++) Ke->values[i*numdoftotal+(numdof+j)]+=Ke_gg[i*numdof+j];
     3156        for(i=0;i<numdof;i++) for(j=0;j<numdof;j++) Ke->values[(i+numdof)*numdoftotal+j]+=Ke_gg[i*numdof+j];
     3157
     3158        /*Transform Coordinate System*/
     3159        element->TransformStiffnessMatrixCoord(Ke,node_list,2*numnodes,cs_list);
     3160
     3161        /*Clean up and return*/
     3162        delete gauss;
     3163        delete friction;
     3164        xDelete<int>(cs_list);
     3165        xDelete<IssmDouble>(xyz_list_tria);
     3166        xDelete<IssmDouble>(Ke_gg);
     3167        return Ke;
    30943168}/*}}}*/
    30953169ElementMatrix* StressbalanceAnalysis::CreateKMatrixCouplingSSAHOViscous(Element* element){/*{{{*/
    30963170
     
    31093183        IssmDouble  D[3][3]={0.0}; // material matrix, simple scalar matrix.
    31103184        IssmDouble  D_scalar;
    31113185        IssmDouble* Ke_gg          = xNewZeroInit<IssmDouble>(numdofp*numdofm);
    3112         IssmDouble* Ke_gg_gaussian = xNew<IssmDouble>(numdofp*numdofm);
    31133186        Node        *node_list[2*numnodes];
    31143187        int*         cs_list= xNew<int>(2*numnodes);
    31153188
     
    31603233                TripleMultiply( B,3,numdofp,1,
    31613234                                        &D[0][0],3,3,0,
    31623235                                        Bprime,3,numdofm,0,
    3163                                         Ke_gg_gaussian,0);
    3164 
    3165                 for( i=0; i<numdofp; i++) for(j=0;j<numdofm; j++) Ke_gg[i*numdofm+j]+=Ke_gg_gaussian[i*numdofm+j];
     3236                                        Ke_gg,1);
    31663237        }
    31673238        for(i=0;i<numdofp;i++) for(j=0;j<numdofm;j++) Ke->values[(i+2*numdofm)*numdoftotal+j]+=Ke_gg[i*numdofm+j];
    31683239        for(i=0;i<numdofm;i++) for(j=0;j<numdofp;j++) Ke->values[i*numdoftotal+(j+2*numdofm)]+=Ke_gg[j*numdofm+i];
     
    31763247        delete gauss;
    31773248        delete gauss_tria;
    31783249        xDelete<IssmDouble>(Ke_gg);
    3179         xDelete<IssmDouble>(Ke_gg_gaussian);
     3250        xDelete<IssmDouble>(xyz_list);
    31803251        xDelete<int>(cs_list);
    31813252        return Ke;
    31823253
Note: See TracBrowser for help on using the repository browser.