[17802] | 1 | Index: ../trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp
|
---|
| 2 | ===================================================================
|
---|
| 3 | --- ../trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp (revision 16908)
|
---|
| 4 | +++ ../trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp (revision 16909)
|
---|
| 5 | @@ -3089,8 +3089,82 @@
|
---|
| 6 | return Ke;
|
---|
| 7 | }/*}}}*/
|
---|
| 8 | ElementMatrix* StressbalanceAnalysis::CreateKMatrixCouplingSSAHOFriction(Element* element){/*{{{*/
|
---|
| 9 | - return NULL;
|
---|
| 10 |
|
---|
| 11 | + if(element->IsFloating() || !element->IsOnBed()) return NULL;
|
---|
| 12 | +
|
---|
| 13 | + /*Constants*/
|
---|
| 14 | + int numnodes = element->GetNumberOfNodes();
|
---|
| 15 | + int numdof = 2*numnodes;
|
---|
| 16 | + int numdoftotal = 4*numnodes;
|
---|
| 17 | +
|
---|
| 18 | + /*Intermediaries */
|
---|
| 19 | + int i,j;
|
---|
| 20 | + IssmDouble Jdet2d,alpha2;
|
---|
| 21 | + IssmDouble *xyz_list_tria=NULL;
|
---|
| 22 | + IssmDouble* L = xNewZeroInit<IssmDouble>(2*numdof);
|
---|
| 23 | + IssmDouble DL[2][2] ={{ 0,0 },{0,0}}; //for basal drag
|
---|
| 24 | + IssmDouble DL_scalar;
|
---|
| 25 | + IssmDouble* Ke_gg = xNewZeroInit<IssmDouble>(numdof*numdof);
|
---|
| 26 | + Node *node_list[2*numnodes];
|
---|
| 27 | + int* cs_list= xNew<int>(2*numnodes);
|
---|
| 28 | +
|
---|
| 29 | + /*Initialize Element matrix and return if necessary*/
|
---|
| 30 | + ElementMatrix* Ke1=element->NewElementMatrix(SSAApproximationEnum);
|
---|
| 31 | + ElementMatrix* Ke2=element->NewElementMatrix(HOApproximationEnum);
|
---|
| 32 | + ElementMatrix* Ke=new ElementMatrix(Ke1,Ke2);
|
---|
| 33 | + delete Ke1; delete Ke2;
|
---|
| 34 | +
|
---|
| 35 | + /*Prepare node list*/
|
---|
| 36 | + for(i=0;i<numnodes;i++){
|
---|
| 37 | + node_list[i+0*numnodes] = element->GetNode(i);
|
---|
| 38 | + node_list[i+1*numnodes] = element->GetNode(i);
|
---|
| 39 | + cs_list[i+0*numnodes] = XYEnum;
|
---|
| 40 | + cs_list[i+1*numnodes] = XYEnum;
|
---|
| 41 | + }
|
---|
| 42 | +
|
---|
| 43 | + /*retrieve inputs :*/
|
---|
| 44 | + element->GetVerticesCoordinatesBase(&xyz_list_tria);
|
---|
| 45 | + Input* vx_input=element->GetInput(VxEnum); _assert_(vx_input);
|
---|
| 46 | + Input* vy_input=element->GetInput(VyEnum); _assert_(vy_input);
|
---|
| 47 | + Input* vz_input=element->GetInput(VzEnum); _assert_(vz_input);
|
---|
| 48 | +
|
---|
| 49 | + /*build friction object, used later on: */
|
---|
| 50 | + Friction* friction=new Friction(element,2);
|
---|
| 51 | +
|
---|
| 52 | + /* Start looping on the number of gaussian points: */
|
---|
| 53 | + Gauss* gauss=element->NewGaussBase(2);
|
---|
| 54 | + for(int ig=gauss->begin();ig<gauss->end();ig++){
|
---|
| 55 | +
|
---|
| 56 | + gauss->GaussPoint(ig);
|
---|
| 57 | +
|
---|
| 58 | + /*Friction: */
|
---|
| 59 | + friction->GetAlpha2(&alpha2,gauss,vx_input,vy_input,vz_input);
|
---|
| 60 | + element->JacobianDeterminantBase(&Jdet2d, xyz_list_tria,gauss);
|
---|
| 61 | + this->GetBHOFriction(L,element,xyz_list_tria,gauss);
|
---|
| 62 | +
|
---|
| 63 | + DL_scalar=alpha2*gauss->weight*Jdet2d;
|
---|
| 64 | + for (i=0;i<2;i++) DL[i][i]=DL_scalar;
|
---|
| 65 | +
|
---|
| 66 | + /* Do the triple producte tL*D*L: */
|
---|
| 67 | + TripleMultiply( L,2,numdof,1,
|
---|
| 68 | + &DL[0][0],2,2,0,
|
---|
| 69 | + L,2,numdof,0,
|
---|
| 70 | + Ke_gg,1);
|
---|
| 71 | + }
|
---|
| 72 | +
|
---|
| 73 | + for(i=0;i<numdof;i++) for(j=0;j<numdof;j++) Ke->values[i*numdoftotal+(numdof+j)]+=Ke_gg[i*numdof+j];
|
---|
| 74 | + for(i=0;i<numdof;i++) for(j=0;j<numdof;j++) Ke->values[(i+numdof)*numdoftotal+j]+=Ke_gg[i*numdof+j];
|
---|
| 75 | +
|
---|
| 76 | + /*Transform Coordinate System*/
|
---|
| 77 | + element->TransformStiffnessMatrixCoord(Ke,node_list,2*numnodes,cs_list);
|
---|
| 78 | +
|
---|
| 79 | + /*Clean up and return*/
|
---|
| 80 | + delete gauss;
|
---|
| 81 | + delete friction;
|
---|
| 82 | + xDelete<int>(cs_list);
|
---|
| 83 | + xDelete<IssmDouble>(xyz_list_tria);
|
---|
| 84 | + xDelete<IssmDouble>(Ke_gg);
|
---|
| 85 | + return Ke;
|
---|
| 86 | }/*}}}*/
|
---|
| 87 | ElementMatrix* StressbalanceAnalysis::CreateKMatrixCouplingSSAHOViscous(Element* element){/*{{{*/
|
---|
| 88 |
|
---|
| 89 | @@ -3109,7 +3183,6 @@
|
---|
| 90 | IssmDouble D[3][3]={0.0}; // material matrix, simple scalar matrix.
|
---|
| 91 | IssmDouble D_scalar;
|
---|
| 92 | IssmDouble* Ke_gg = xNewZeroInit<IssmDouble>(numdofp*numdofm);
|
---|
| 93 | - IssmDouble* Ke_gg_gaussian = xNew<IssmDouble>(numdofp*numdofm);
|
---|
| 94 | Node *node_list[2*numnodes];
|
---|
| 95 | int* cs_list= xNew<int>(2*numnodes);
|
---|
| 96 |
|
---|
| 97 | @@ -3160,9 +3233,7 @@
|
---|
| 98 | TripleMultiply( B,3,numdofp,1,
|
---|
| 99 | &D[0][0],3,3,0,
|
---|
| 100 | Bprime,3,numdofm,0,
|
---|
| 101 | - Ke_gg_gaussian,0);
|
---|
| 102 | -
|
---|
| 103 | - for( i=0; i<numdofp; i++) for(j=0;j<numdofm; j++) Ke_gg[i*numdofm+j]+=Ke_gg_gaussian[i*numdofm+j];
|
---|
| 104 | + Ke_gg,1);
|
---|
| 105 | }
|
---|
| 106 | for(i=0;i<numdofp;i++) for(j=0;j<numdofm;j++) Ke->values[(i+2*numdofm)*numdoftotal+j]+=Ke_gg[i*numdofm+j];
|
---|
| 107 | for(i=0;i<numdofm;i++) for(j=0;j<numdofp;j++) Ke->values[i*numdoftotal+(j+2*numdofm)]+=Ke_gg[j*numdofm+i];
|
---|
| 108 | @@ -3176,7 +3247,7 @@
|
---|
| 109 | delete gauss;
|
---|
| 110 | delete gauss_tria;
|
---|
| 111 | xDelete<IssmDouble>(Ke_gg);
|
---|
| 112 | - xDelete<IssmDouble>(Ke_gg_gaussian);
|
---|
| 113 | + xDelete<IssmDouble>(xyz_list);
|
---|
| 114 | xDelete<int>(cs_list);
|
---|
| 115 | return Ke;
|
---|
| 116 |
|
---|