Example #1
0
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;
}
Example #2
0
/* 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() */
Example #3
0
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;
}