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
RevLine 
[17802]1Index: ../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
Note: See TracBrowser for help on using the repository browser.