[17802] | 1 | Index: ../trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp
|
---|
| 2 | ===================================================================
|
---|
| 3 | --- ../trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp (revision 17547)
|
---|
| 4 | +++ ../trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp (revision 17548)
|
---|
| 5 | @@ -4257,6 +4257,7 @@
|
---|
| 6 | IssmDouble dvx[3],dvy[3],dvz[3],B,n;
|
---|
| 7 | IssmDouble *xyz_list = NULL;
|
---|
| 8 | IssmDouble Jdet,r;
|
---|
| 9 | + Gauss* gauss = NULL;
|
---|
| 10 |
|
---|
| 11 | parameters->FindParam(&meshtype,MeshTypeEnum);
|
---|
| 12 | switch(meshtype){
|
---|
| 13 | @@ -4308,7 +4309,7 @@
|
---|
| 14 | sigmapyz_input=element->GetInput(DeviatoricStressyzEnum); _assert_(sigmapyz_input);
|
---|
| 15 | }
|
---|
| 16 |
|
---|
| 17 | - Gauss* gauss=element->NewGauss(5);
|
---|
| 18 | + gauss=element->NewGauss(5);
|
---|
| 19 | for(int ig=gauss->begin();ig<gauss->end();ig++){
|
---|
| 20 | gauss->GaussPoint(ig);
|
---|
| 21 | element->JacobianDeterminant(&Jdet,xyz_list,gauss);
|
---|
| 22 | @@ -4373,30 +4374,128 @@
|
---|
| 23 | Ke,1);
|
---|
| 24 |
|
---|
| 25 | /*Create Right hand sides*/
|
---|
| 26 | - for(int ii=0;ii<tnumnodes;ii++) pe_xx[ii] += sigmapxx*tbasis[ii]*gauss->weight*Jdet;
|
---|
| 27 | - for(int ii=0;ii<tnumnodes;ii++) pe_yy[ii] += sigmapyy*tbasis[ii]*gauss->weight*Jdet;
|
---|
| 28 | - for(int ii=0;ii<tnumnodes;ii++) pe_xy[ii] += sigmapxy*tbasis[ii]*gauss->weight*Jdet;
|
---|
| 29 | + for(int ii=0;ii<tnumnodes;ii++) pe_xx[ii] += (r*epsxx+sigmapxx)*tbasis[ii]*gauss->weight*Jdet;
|
---|
| 30 | + for(int ii=0;ii<tnumnodes;ii++) pe_yy[ii] += (r*epsyy+sigmapyy)*tbasis[ii]*gauss->weight*Jdet;
|
---|
| 31 | + for(int ii=0;ii<tnumnodes;ii++) pe_xy[ii] += (r*epsxy+sigmapxy)*tbasis[ii]*gauss->weight*Jdet;
|
---|
| 32 | if(dim==3){
|
---|
| 33 | - for(int ii=0;ii<tnumnodes;ii++) pe_zz[ii] += sigmapzz*tbasis[ii]*gauss->weight*Jdet;
|
---|
| 34 | - for(int ii=0;ii<tnumnodes;ii++) pe_xz[ii] += sigmapxz*tbasis[ii]*gauss->weight*Jdet;
|
---|
| 35 | - for(int ii=0;ii<tnumnodes;ii++) pe_yz[ii] += sigmapyz*tbasis[ii]*gauss->weight*Jdet;
|
---|
| 36 | + for(int ii=0;ii<tnumnodes;ii++) pe_zz[ii] += (r*epszz+sigmapzz)*tbasis[ii]*gauss->weight*Jdet;
|
---|
| 37 | + for(int ii=0;ii<tnumnodes;ii++) pe_xz[ii] += (r*epsxz+sigmapxz)*tbasis[ii]*gauss->weight*Jdet;
|
---|
| 38 | + for(int ii=0;ii<tnumnodes;ii++) pe_yz[ii] += (r*epsyz+sigmapyz)*tbasis[ii]*gauss->weight*Jdet;
|
---|
| 39 | }
|
---|
| 40 | }
|
---|
| 41 |
|
---|
| 42 | /*Solve the systems*/
|
---|
| 43 | - _error_("S");
|
---|
| 44 | + IssmDouble* d_xx = xNew<IssmDouble>(tnumnodes);
|
---|
| 45 | + IssmDouble* d_yy = xNew<IssmDouble>(tnumnodes);
|
---|
| 46 | + IssmDouble* d_xy = xNew<IssmDouble>(tnumnodes);
|
---|
| 47 | + IssmDouble* d_zz = NULL;
|
---|
| 48 | + IssmDouble* d_xz = NULL;
|
---|
| 49 | + IssmDouble* d_yz = NULL;
|
---|
| 50 | + if(dim==2){
|
---|
| 51 | + _assert_(tnumnodes==3);
|
---|
| 52 | + Matrix3x3Solve(&d_xx[0],Ke,pe_xx);
|
---|
| 53 | + Matrix3x3Solve(&d_yy[0],Ke,pe_yy);
|
---|
| 54 | + Matrix3x3Solve(&d_xy[0],Ke,pe_xy);
|
---|
| 55 | + element->AddInput(StrainRatexxEnum,d_xx,P1DGEnum);
|
---|
| 56 | + element->AddInput(StrainRateyyEnum,d_yy,P1DGEnum);
|
---|
| 57 | + element->AddInput(StrainRatexyEnum,d_xy,P1DGEnum);
|
---|
| 58 | + }
|
---|
| 59 | + else{
|
---|
| 60 | + _assert_(tnumnodes==4);
|
---|
| 61 | + Matrix3x3Solve(&d_xx[0],Ke,pe_xx);
|
---|
| 62 | + Matrix3x3Solve(&d_yy[0],Ke,pe_yy);
|
---|
| 63 | + Matrix3x3Solve(&d_xy[0],Ke,pe_xy);
|
---|
| 64 | + Matrix3x3Solve(&d_zz[0],Ke,pe_zz);
|
---|
| 65 | + Matrix3x3Solve(&d_xz[0],Ke,pe_xz);
|
---|
| 66 | + Matrix3x3Solve(&d_yz[0],Ke,pe_yz);
|
---|
| 67 | + element->AddInput(StrainRatexxEnum,d_xx,P1DGEnum);
|
---|
| 68 | + element->AddInput(StrainRateyyEnum,d_yy,P1DGEnum);
|
---|
| 69 | + element->AddInput(StrainRatexyEnum,d_xy,P1DGEnum);
|
---|
| 70 | + element->AddInput(StrainRatezzEnum,d_zz,P1DGEnum);
|
---|
| 71 | + element->AddInput(StrainRatexzEnum,d_xz,P1DGEnum);
|
---|
| 72 | + element->AddInput(StrainRateyzEnum,d_yz,P1DGEnum);
|
---|
| 73 | + }
|
---|
| 74 |
|
---|
| 75 | + /*Update tau accordingly*/
|
---|
| 76 | + IssmDouble* tau_xx = xNew<IssmDouble>(tnumnodes);
|
---|
| 77 | + IssmDouble* tau_yy = xNew<IssmDouble>(tnumnodes);
|
---|
| 78 | + IssmDouble* tau_xy = xNew<IssmDouble>(tnumnodes);
|
---|
| 79 | + IssmDouble* tau_zz = NULL;
|
---|
| 80 | + IssmDouble* tau_xz = NULL;
|
---|
| 81 | + IssmDouble* tau_yz = NULL;
|
---|
| 82 | + Input* epsxx_input=element->GetInput(StrainRatexxEnum); _assert_(epsxx_input);
|
---|
| 83 | + Input* epsyy_input=element->GetInput(StrainRateyyEnum); _assert_(epsyy_input);
|
---|
| 84 | + Input* epsxy_input=element->GetInput(StrainRatexyEnum); _assert_(epsxy_input);
|
---|
| 85 | + Input* epszz_input=NULL; Input* epsxz_input=NULL; Input* epsyz_input=NULL;
|
---|
| 86 | + if(dim==3){
|
---|
| 87 | + epszz_input=element->GetInput(StrainRatezzEnum); _assert_(epszz_input);
|
---|
| 88 | + epsxz_input=element->GetInput(StrainRatexzEnum); _assert_(epsxz_input);
|
---|
| 89 | + epsyz_input=element->GetInput(StrainRateyzEnum); _assert_(epsyz_input);
|
---|
| 90 | + }
|
---|
| 91 | + Gauss* gauss = element->NewGauss();
|
---|
| 92 | + for(int ig=0;ig<tnumnodes;ig++){
|
---|
| 93 | + gauss->GaussNode(P1DGEnum,ig);
|
---|
| 94 | +
|
---|
| 95 | + /*Get D(u)*/
|
---|
| 96 | + vx_input->GetInputDerivativeValue(&dvx[0],xyz_list,gauss);
|
---|
| 97 | + vy_input->GetInputDerivativeValue(&dvy[0],xyz_list,gauss);
|
---|
| 98 | + if(dim==3){
|
---|
| 99 | + vz_input->GetInputDerivativeValue(&dvz[0],xyz_list,gauss);
|
---|
| 100 | + }
|
---|
| 101 | + epsxx = dvx[0];
|
---|
| 102 | + epsyy = dvy[1];
|
---|
| 103 | + epsxy = 0.5*(dvx[1] + dvy[0]);
|
---|
| 104 | + if(dim==3){
|
---|
| 105 | + epszz = dvz[2];
|
---|
| 106 | + epsxz = 0.5*(dvx[2] + dvz[0]);
|
---|
| 107 | + epsyz = 0.5*(dvy[2] + dvz[1]);
|
---|
| 108 | + }
|
---|
| 109 | +
|
---|
| 110 | + /*Get tau^(n-1) from inputs*/
|
---|
| 111 | + sigmapxx_input->GetInputValue(&sigmapxx,gauss);
|
---|
| 112 | + sigmapyy_input->GetInputValue(&sigmapyy,gauss);
|
---|
| 113 | + sigmapxy_input->GetInputValue(&sigmapxy,gauss);
|
---|
| 114 | + if(dim==3){
|
---|
| 115 | + sigmapzz_input->GetInputValue(&sigmapzz,gauss);
|
---|
| 116 | + sigmapxz_input->GetInputValue(&sigmapxz,gauss);
|
---|
| 117 | + sigmapyz_input->GetInputValue(&sigmapyz,gauss);
|
---|
| 118 | + }
|
---|
| 119 | +
|
---|
| 120 | + /*Get d and update tau accordingly*/
|
---|
| 121 | + tau_xx[ig] = sigmapxx + r*(epsxx - d_xx[ig]);
|
---|
| 122 | + tau_yy[ig] = sigmapyy + r*(epsyy - d_yy[ig]);
|
---|
| 123 | + tau_xy[ig] = sigmapxy + r*(epsxy - d_xy[ig]);
|
---|
| 124 | + if(dim==3){
|
---|
| 125 | + tau_zz[ig] = sigmapzz + r*(epszz - d_zz[ig]);
|
---|
| 126 | + tau_xz[ig] = sigmapxz + r*(epsxz - d_xz[ig]);
|
---|
| 127 | + tau_yz[ig] = sigmapyz + r*(epsyz - d_yz[ig]);
|
---|
| 128 | + }
|
---|
| 129 | + }
|
---|
| 130 | +
|
---|
| 131 | + /*Add inputs*/
|
---|
| 132 | + element->AddInput(StrainRatexxEnum,tau_xx,P1DGEnum);
|
---|
| 133 | + element->AddInput(StrainRateyyEnum,tau_yy,P1DGEnum);
|
---|
| 134 | + element->AddInput(StrainRatexyEnum,tau_xy,P1DGEnum);
|
---|
| 135 | + if(dim==3){
|
---|
| 136 | + element->AddInput(StrainRatezzEnum,tau_zz,P1DGEnum);
|
---|
| 137 | + element->AddInput(StrainRatexzEnum,tau_xz,P1DGEnum);
|
---|
| 138 | + element->AddInput(StrainRateyzEnum,tau_yz,P1DGEnum);
|
---|
| 139 | + }
|
---|
| 140 | +
|
---|
| 141 | /*Clean up and */
|
---|
| 142 | + xDelete<IssmDouble>(xyz_list);
|
---|
| 143 | xDelete<IssmDouble>(tbasis);
|
---|
| 144 | xDelete<IssmDouble>(Ke);
|
---|
| 145 | - xDelete<IssmDouble>(pe_xx);
|
---|
| 146 | - xDelete<IssmDouble>(pe_yy);
|
---|
| 147 | - xDelete<IssmDouble>(pe_zz);
|
---|
| 148 | - xDelete<IssmDouble>(pe_xy);
|
---|
| 149 | - xDelete<IssmDouble>(pe_xz);
|
---|
| 150 | - xDelete<IssmDouble>(pe_yz);
|
---|
| 151 | + xDelete<IssmDouble>(pe_xx); xDelete<IssmDouble>(d_xx); xDelete<IssmDouble>(tau_xx);
|
---|
| 152 | + xDelete<IssmDouble>(pe_yy); xDelete<IssmDouble>(d_yy); xDelete<IssmDouble>(tau_yy);
|
---|
| 153 | + xDelete<IssmDouble>(pe_zz); xDelete<IssmDouble>(d_zz); xDelete<IssmDouble>(tau_zz);
|
---|
| 154 | + xDelete<IssmDouble>(pe_xy); xDelete<IssmDouble>(d_xy); xDelete<IssmDouble>(tau_xy);
|
---|
| 155 | + xDelete<IssmDouble>(pe_xz); xDelete<IssmDouble>(d_xz); xDelete<IssmDouble>(tau_xz);
|
---|
| 156 | + xDelete<IssmDouble>(pe_yz); xDelete<IssmDouble>(d_yz); xDelete<IssmDouble>(tau_yz);
|
---|
| 157 | }
|
---|
| 158 |
|
---|
| 159 | + delete gauss;
|
---|
| 160 | +
|
---|
| 161 | }/*}}}*/
|
---|
| 162 |
|
---|
| 163 | /*Coupling (Tiling)*/
|
---|
| 164 | Index: ../trunk-jpl/src/c/shared/Matrix/MatrixUtils.cpp
|
---|
| 165 | ===================================================================
|
---|
| 166 | --- ../trunk-jpl/src/c/shared/Matrix/MatrixUtils.cpp (revision 17547)
|
---|
| 167 | +++ ../trunk-jpl/src/c/shared/Matrix/MatrixUtils.cpp (revision 17548)
|
---|
| 168 | @@ -366,3 +366,16 @@
|
---|
| 169 | Ainv[8]=(A[0]*A[4]-A[1]*A[3])/det; /* = (a*e-b*d)/det */
|
---|
| 170 |
|
---|
| 171 | }/*}}}*/
|
---|
| 172 | +/*FUNCTION Matrix3x3Solve(IssmDouble* X,IssmDouble* A,IssmDouble* B) {{{*/
|
---|
| 173 | +void Matrix3x3Solve(IssmDouble* X,IssmDouble* A,IssmDouble* B){
|
---|
| 174 | +
|
---|
| 175 | + IssmDouble Ainv[3][3];
|
---|
| 176 | +
|
---|
| 177 | + Matrix3x3Invert(&Ainv[0][0],A);
|
---|
| 178 | + for(int i=0;i<3;i++) X[i]=Ainv[i][0]*B[0] + Ainv[i][1]*B[1] + Ainv[i][2]*B[2];
|
---|
| 179 | +
|
---|
| 180 | +}/*}}}*/
|
---|
| 181 | +/*FUNCTION Matrix4x4Solve(IssmDouble* X,IssmDouble* A,IssmDouble *B) {{{*/
|
---|
| 182 | +void Matrix4x4Solve(IssmDouble* X,IssmDouble* A,IssmDouble *B){
|
---|
| 183 | + _error_("STOP");
|
---|
| 184 | +}/*}}}*/
|
---|
| 185 | Index: ../trunk-jpl/src/c/shared/Matrix/matrix.h
|
---|
| 186 | ===================================================================
|
---|
| 187 | --- ../trunk-jpl/src/c/shared/Matrix/matrix.h (revision 17547)
|
---|
| 188 | +++ ../trunk-jpl/src/c/shared/Matrix/matrix.h (revision 17548)
|
---|
| 189 | @@ -14,5 +14,7 @@
|
---|
| 190 | void Matrix2x2Determinant(IssmDouble* Adet,IssmDouble* A);
|
---|
| 191 | void Matrix3x3Invert(IssmDouble* Ainv, IssmDouble* A);
|
---|
| 192 | void Matrix3x3Determinant(IssmDouble* Adet,IssmDouble* A);
|
---|
| 193 | +void Matrix3x3Solve(IssmDouble* X,IssmDouble* A,IssmDouble* B);
|
---|
| 194 | +void Matrix4x4Solve(IssmDouble* X,IssmDouble* A,IssmDouble* B);
|
---|
| 195 |
|
---|
| 196 | #endif //ifndef _MATRIXUTILS_H_
|
---|