const Matrix & SSPquadUP::getDamp(void) { Matrix dampC(8,8); // solid phase stiffness matrix GetSolidStiffness(); // contribution of stiffness matrix for Rayleigh damping if (betaK != 0.0) { dampC.addMatrix(1.0, mSolidK, betaK); } if (betaK0 != 0.0) { dampC.addMatrix(1.0, mSolidK, betaK0); } if (betaKc != 0.0) { dampC.addMatrix(1.0, mSolidK, betaKc); } // contribution of mass matrix for Rayleigh damping if (alphaM != 0.0) { dampC.addMatrix(1.0, mSolidM, alphaM); } // assemble full element damping matrix [ C -Q ] // comprised of C, Q, and H submatrices [ -Q' -H ] mDamp.Zero(); for (int i = 0; i < 4; i++) { int I = 2*i; int Ip1 = 2*i+1; int II = 3*i; int IIp1 = 3*i+1; int IIp2 = 3*i+2; for (int j = 0; j < 4; j++) { int J = 2*j; int Jp1 = 2*j+1; int JJ = 3*j; int JJp1 = 3*j+1; int JJp2 = 3*j+2; // contribution of solid phase damping matrix mDamp(II,JJ) = dampC(I,J); mDamp(IIp1,JJ) = dampC(Ip1,J); mDamp(IIp1,JJp1) = dampC(Ip1,Jp1); mDamp(II,JJp1) = dampC(I,Jp1); // contribution of solid-fluid coupling matrix mDamp(JJp2,II) = -J0*mThickness*Mmem(0,I); mDamp(JJp2,IIp1) = -J0*mThickness*Mmem(1,Ip1); mDamp(II,JJp2) = -J0*mThickness*Mmem(0,I); mDamp(IIp1,JJp2) = -J0*mThickness*Mmem(1,Ip1); // contribution of permeability matrix mDamp(IIp2,JJp2) = -mPerm(i,j); } } return mDamp; }
/* B := inv(A), both A and B are real matrices of rank x rank */ void Minv (int rank, double A[], double B[]) { int info, *ipiv; double *a, *work; a = Mmem(rank*rank); work = Vmem(rank); ipiv = VImem(rank); memcpy (a, A, (long)rank*rank*sizeof(double)); FORTRAN_SYMBOL(dgetrf) (&rank, &rank, a, &rank, ipiv, &info); if ( info != 0 ) { printf ("error: Minv: matrix of rank %d is singular.\n", rank); mump(rank,A); exit(1); } FORTRAN_SYMBOL(dgetri) (&rank, a, &rank, ipiv, work, &rank, &info); memcpy (B, a, (long)rank*rank*sizeof(double)); VFREE (ipiv); Vfree (work); Mfree (a); return; } /* end Minv() */
void SSPquad::GetStab(void) // this function computes the stabilization stiffness matrix for the element { Vector g1(SSPQ_NUM_DIM); Vector g2(SSPQ_NUM_DIM); Matrix I(SSPQ_NUM_DIM,SSPQ_NUM_DIM); Matrix FCF(SSPQ_NUM_DIM,SSPQ_NUM_DIM); Matrix Jmat(SSPQ_NUM_DIM,SSPQ_NUM_DIM); Matrix Jinv(SSPQ_NUM_DIM,SSPQ_NUM_DIM); Matrix dNloc(SSPQ_NUM_NODE,SSPQ_NUM_DIM); Matrix dN(SSPQ_NUM_NODE,SSPQ_NUM_DIM); Matrix Mben(2,SSPQ_NUM_DOF); double Hss; double Hst; double Htt; // shape function derivatives (local crd) at center dNloc(0,0) = -0.25; dNloc(1,0) = 0.25; dNloc(2,0) = 0.25; dNloc(3,0) = -0.25; dNloc(0,1) = -0.25; dNloc(1,1) = -0.25; dNloc(2,1) = 0.25; dNloc(3,1) = 0.25; // jacobian matrix Jmat = mNodeCrd*dNloc; // inverse of the jacobian matrix Jmat.Invert(Jinv); // shape function derivatives (global crd) dN = dNloc*Jinv; // define hourglass stabilization vector gamma = 0.25*(h - (h^x)*bx - (h^y)*by); double hx = mNodeCrd(0,0) - mNodeCrd(0,1) + mNodeCrd(0,2) - mNodeCrd(0,3); double hy = mNodeCrd(1,0) - mNodeCrd(1,1) + mNodeCrd(1,2) - mNodeCrd(1,3); double gamma[4]; gamma[0] = 0.25*( 1.0 - hx*dN(0,0) - hy*dN(0,1)); gamma[1] = 0.25*(-1.0 - hx*dN(1,0) - hy*dN(1,1)); gamma[2] = 0.25*( 1.0 - hx*dN(2,0) - hy*dN(2,1)); gamma[3] = 0.25*(-1.0 - hx*dN(3,0) - hy*dN(3,1)); // define mapping matrices Mmem.Zero(); Mben.Zero(); for (int i = 0; i < 4; i++) { Mmem(0,2*i) = dN(i,0); Mmem(1,2*i+1) = dN(i,1); Mmem(2,2*i) = dN(i,1); Mmem(2,2*i+1) = dN(i,0); Mben(0,2*i) = gamma[i]; Mben(1,2*i+1) = gamma[i]; } // base vectors g1(0) = Jmat(0,0); g1(1) = Jmat(1,0); g2(0) = Jmat(0,1); g2(1) = Jmat(1,1); // normalize base vectors g1.Normalize(); g2.Normalize(); // compute second moment of area tensor double fourThree = 4.0/3.0; I = fourThree*mThickness*J0*(DyadicProd(g1,g1) + DyadicProd(g2,g2)); // stabilization terms Hss = (I(0,0)*Jinv(1,0)*Jinv(1,0) + I(0,1)*Jinv(0,0)*Jinv(1,0) + I(1,1)*Jinv(0,0)*Jinv(0,0))*0.25; Htt = (I(0,0)*Jinv(1,1)*Jinv(1,1) + I(0,1)*Jinv(0,1)*Jinv(1,1) + I(1,1)*Jinv(0,1)*Jinv(0,1))*0.25; Hst = (I(0,0)*Jinv(1,1)*Jinv(1,0) + I(0,1)*(Jinv(1,0)*Jinv(0,1) + Jinv(1,1)*Jinv(0,0)) + I(1,1)*Jinv(0,1)*Jinv(0,0))*0.25; // get material tangent const Matrix &CmatI = theMaterial->getInitialTangent(); // compute stabilization matrix FCF(0,0) = (CmatI(0,0) - (CmatI(0,1) + CmatI(1,0)) + CmatI(1,1))*Hss; FCF(0,1) = (CmatI(0,1) - (CmatI(0,0) + CmatI(1,1)) + CmatI(1,0))*Hst; FCF(1,0) = (CmatI(1,0) - (CmatI(0,0) + CmatI(1,1)) + CmatI(0,1))*Hst; FCF(1,1) = (CmatI(1,1) - (CmatI(0,1) + CmatI(1,0)) + CmatI(0,0))*Htt; // compute stiffness matrix for stabilization terms Kstab.Zero(); Kstab.addMatrixTripleProduct(1.0, Mben, FCF, 1.0); return; }