void Tet21Stokes :: computeStiffnessMatrix(FloatMatrix &answer, MatResponseMode mode, TimeStep *tStep) { FluidDynamicMaterial *mat = static_cast< FluidCrossSection * >( this->giveCrossSection() )->giveFluidMaterial(); FloatMatrix B(6, 30), EdB, K, G, Dp, DvT, C, Ed, dN; FloatArray dN_V(30), Nlin, Ep, Cd, tmpA, tmpB; double Cp; B.zero(); for ( GaussPoint *gp: *this->integrationRulesArray [ 0 ] ) { // Compute Gauss point and determinant at current element const FloatArray &lcoords = gp->giveNaturalCoordinates(); double detJ = fabs( this->interpolation_quad.evaldNdx( dN, lcoords, FEIElementGeometryWrapper(this) ) ); double dV = detJ * gp->giveWeight(); this->interpolation_lin.evalN( Nlin, lcoords, FEIElementGeometryWrapper(this) ); for ( int j = 0, k = 0; j < dN.giveNumberOfRows(); j++, k += 3 ) { dN_V(k + 0) = B(0, k + 0) = B(3, k + 1) = B(4, k + 2) = dN(j, 0); dN_V(k + 1) = B(1, k + 1) = B(3, k + 0) = B(5, k + 2) = dN(j, 1); dN_V(k + 2) = B(2, k + 2) = B(4, k + 0) = B(5, k + 1) = dN(j, 2); } // Computing the internal forces should have been done first. // dsigma_dev/deps_dev dsigma_dev/dp deps_vol/deps_dev deps_vol/dp mat->giveStiffnessMatrices(Ed, Ep, Cd, Cp, mode, gp, tStep); EdB.beProductOf(Ed, B); K.plusProductSymmUpper(B, EdB, dV); G.plusDyadUnsym(dN_V, Nlin, -dV); C.plusDyadSymmUpper(Nlin, Cp * dV); tmpA.beTProductOf(B, Ep); Dp.plusDyadUnsym(tmpA, Nlin, dV); tmpB.beTProductOf(B, Cd); DvT.plusDyadUnsym(Nlin, tmpB, dV); } K.symmetrized(); C.symmetrized(); FloatMatrix GTDvT, GDp; GTDvT.beTranspositionOf(G); GTDvT.add(DvT); GDp = G; GDp.add(Dp); answer.resize(34, 34); answer.zero(); answer.assemble(K, this->momentum_ordering); answer.assemble(GDp, this->momentum_ordering, this->conservation_ordering); answer.assemble(GTDvT, this->conservation_ordering, this->momentum_ordering); answer.assemble(C, this->conservation_ordering); // K.printYourself(); // GDp.printYourself(); // GTDvT.printYourself(); // C.printYourself(); }
void Tr21Stokes :: computeInternalForcesVector(FloatArray &answer, TimeStep *tStep) { IntegrationRule *iRule = integrationRulesArray [ 0 ]; FluidDynamicMaterial *mat = ( FluidDynamicMaterial * ) this->domain->giveMaterial(this->material); FloatArray a_pressure, a_velocity, devStress, epsp, BTs, Nh, dNv(12); double r_vol, pressure; FloatMatrix dN, B(3, 12); B.zero(); this->computeVectorOf(EID_MomentumBalance, VM_Total, tStep, a_velocity); this->computeVectorOf(EID_ConservationEquation, VM_Total, tStep, a_pressure); FloatArray momentum(12), conservation(3); momentum.zero(); conservation.zero(); GaussPoint *gp; for ( int i = 0; i < iRule->getNumberOfIntegrationPoints(); i++ ) { gp = iRule->getIntegrationPoint(i); FloatArray *lcoords = gp->giveCoordinates(); double detJ = fabs(this->interpolation_quad.giveTransformationJacobian(* lcoords, FEIElementGeometryWrapper(this))); this->interpolation_quad.evaldNdx(dN, * lcoords, FEIElementGeometryWrapper(this)); this->interpolation_lin.evalN(Nh, * lcoords, FEIElementGeometryWrapper(this)); double dA = detJ * gp->giveWeight(); for ( int j = 0, k = 0; j < 6; j++, k += 2 ) { dNv(k) = B(0, k) = B(2, k + 1) = dN(j, 0); dNv(k + 1) = B(1, k + 1) = B(2, k) = dN(j, 1); } pressure = Nh.dotProduct(a_pressure); epsp.beProductOf(B, a_velocity); mat->computeDeviatoricStressVector(devStress, r_vol, gp, epsp, pressure, tStep); BTs.beTProductOf(B, devStress); momentum.add(dA, BTs); momentum.add(-pressure*dA, dNv); conservation.add(r_vol*dA, Nh); } FloatArray temp(15); temp.zero(); temp.addSubVector(momentum, 1); temp.addSubVector(conservation, 13); answer.resize(15); answer.zero(); answer.assemble(temp, this->ordering); }
const Matrix & SSPquadUP::getMass(void) { mMass.Zero(); // compute compressibility matrix term double oneOverQ = -0.25*J0*mThickness*mPorosity/fBulk; // get mass density from the material double density = theMaterial->getRho(); // transpose the shape function derivative array Matrix dNp(2,4); dNp(0,0) = dN(0,0); dNp(0,1) = dN(1,0); dNp(0,2) = dN(2,0); dNp(0,3) = dN(3,0); dNp(1,0) = dN(0,1); dNp(1,1) = dN(1,1); dNp(1,2) = dN(2,1); dNp(1,3) = dN(3,1); // compute stabilization matrix for incompressible problems Matrix Kp(4,4); Kp = -4.0*mAlpha*J0*mThickness*dN*dNp; // return zero matrix if density is zero if (density == 0.0) { return mMass; } // full mass matrix for the element [ M 0 ] // includes M and S submatrices [ 0 -S ] 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; mMass(II,JJ) = mSolidM(I,J); mMass(IIp1,JJ) = mSolidM(Ip1,J); mMass(IIp1,JJp1) = mSolidM(Ip1,Jp1); mMass(II,JJp1) = mSolidM(I,Jp1); // contribution of compressibility matrix mMass(IIp2,JJp2) = Kp(i,j) + oneOverQ; } } return mMass; }
ZSparseMatrix Assembler2D::getLaplacianMatrix() { typedef Eigen::Triplet<double> T; std::vector<T> triplets; for (size_t i=0; i<m_mesh->getNbrElements(); ++i) { VectorI idx = m_mesh->getElement(i); assert(idx.size() == 3); Eigen::MatrixXd& dN = m_DN[i]; // Small strain-displacement matrix // Eigen::MatrixXd B(2,3); B << dN(0,0), dN(1,0), dN(2,0), dN(0,1), dN(1,1), dN(2,1); Eigen::MatrixXd k_el = B.transpose() * B * m_mesh->getElementVolume(i); for (size_t j=0; j<3; ++j) for (size_t k=0; k<3; ++k) triplets.push_back(T(idx[j], idx[k], k_el(j,k))); } Eigen::SparseMatrix<double> L = Eigen::SparseMatrix<double>(m_mesh->getNbrNodes(), m_mesh->getNbrNodes()); L.setFromTriplets(triplets.begin(), triplets.end()); return ZSparseMatrix(L); }
void Tr21Stokes :: computeInternalForcesVector(FloatArray &answer, TimeStep *tStep) { FluidDynamicMaterial *mat = static_cast< FluidCrossSection * >( this->giveCrossSection() )->giveFluidMaterial(); FloatArray a_pressure, a_velocity, devStress, epsp, Nh, dNv(12); double r_vol, pressure; FloatMatrix dN, B(3, 12); B.zero(); this->computeVectorOfVelocities(VM_Total, tStep, a_velocity); this->computeVectorOfPressures(VM_Total, tStep, a_pressure); FloatArray momentum, conservation; for ( GaussPoint *gp: *integrationRulesArray [ 0 ] ) { const FloatArray &lcoords = gp->giveNaturalCoordinates(); double detJ = fabs( this->interpolation_quad.evaldNdx( dN, lcoords, FEIElementGeometryWrapper(this) ) ); this->interpolation_lin.evalN( Nh, lcoords, FEIElementGeometryWrapper(this) ); double dA = detJ * gp->giveWeight(); for ( int j = 0, k = 0; j < dN.giveNumberOfRows(); j++, k += 2 ) { dNv(k) = B(0, k) = B(2, k + 1) = dN(j, 0); dNv(k + 1) = B(1, k + 1) = B(2, k) = dN(j, 1); } pressure = Nh.dotProduct(a_pressure); epsp.beProductOf(B, a_velocity); mat->computeDeviatoricStressVector(devStress, r_vol, gp, epsp, pressure, tStep); momentum.plusProduct(B, devStress, dA); momentum.add(-pressure * dA, dNv); conservation.add(r_vol * dA, Nh); } answer.resize(15); answer.zero(); answer.assemble(momentum, this->momentum_ordering); answer.assemble(conservation, this->conservation_ordering); }
Matrix QuadTriSF::dNds(point pt){ Matrix dN(6,2); double r = pt.x; double s = pt.y; dN[0][0]=4.*r-1.; dN[0][1]=0.; dN[1][0]=0.; dN[1][1]=4.*s-1.; dN[2][0]=-3.+4.*s+4.*r; dN[2][1]=-3.+4.*r+4.*s; dN[3][0]=4.*s; dN[3][1]=4.*r; dN[4][0]=-4.*s; dN[4][1]=4.-4.*r-8.*s; dN[5][0]=4.-4.*s-8.*r; dN[5][1]=-4.*r; return dN; };
void SSPquadUP::GetPermeabilityMatrix(void) // this function computes the permeability matrix for the element { mPerm.Zero(); Matrix k(2,2); Matrix dNp(2,4); // permeability tensor k(0,0) = perm[0]; k(1,1) = perm[1]; // transpose the shape function derivative array dNp(0,0) = dN(0,0); dNp(0,1) = dN(1,0); dNp(0,2) = dN(2,0); dNp(0,3) = dN(3,0); dNp(1,0) = dN(0,1); dNp(1,1) = dN(1,1); dNp(1,2) = dN(2,1); dNp(1,3) = dN(3,1); // compute permeability matrix mPerm.addMatrixTripleProduct(1.0, dNp, k, 4.0*J0*mThickness); return; }
ZSparseMatrix Assembler2D::getStiffnessMatrix() { // Elastic modulii // Eigen::MatrixXd& D = m_D; Eigen::MatrixXd& C = m_C; typedef Eigen::Triplet<double> T; std::vector<T> triplets; for (size_t i=0; i<m_mesh->getNbrElements(); ++i) { VectorI idx = m_mesh->getElement(i); assert(idx.size() == 3); Eigen::MatrixXd& dN = m_DN[i]; // Small strain-displacement matrix // Eigen::MatrixXd B(3,6); B << dN(0,0), 0.0,dN(1,0), 0.0,dN(2,0), 0.0, 0.0 ,dN(0,1), 0.0,dN(1,1), 0.0,dN(2,1), 0.5*dN(0,1),0.5*dN(0,0), 0.5*dN(1,1),0.5*dN(1,0), 0.5*dN(2,1),0.5*dN(2,0); Eigen::MatrixXd k_el = B.transpose() * D * C * B * m_mesh->getElementVolume(i); for (size_t j=0; j<3; ++j) for (size_t k=0; k<3; ++k) for (size_t l=0; l<2; ++l) for (size_t m=0; m<2; ++m) triplets.push_back(T(2*idx[j]+l, 2*idx[k]+m, k_el(2*j+l, 2*k+m))); } Eigen::SparseMatrix<double> K = Eigen::SparseMatrix<double>(2*m_mesh->getNbrNodes(), 2*m_mesh->getNbrNodes()); K.setFromTriplets(triplets.begin(), triplets.end()); ZSparseMatrix tmp = ZSparseMatrix(K); return tmp; }
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; }
int R() { int SG; int tu; int b; int cbnn; int fJA; int Ywh; int Sd3i; int U; int FTe; ; if (AgC9 > + (Y0V(UnE, 791438648 + cK(517618502, + N_ != Ed() != - (Yk(((883538282)), nBa)), sdDM(kC, (1604897559), ! ! 528836364 / (1815076270) / 1477268768), n), psl, - 126855483))) while (om(AZ)) { int xF; int yd; int xEmV; int vc; int m9; while (2044928990) while (- 644557172 + 1573824677 + 1727264726 < TvAP(1980609521, Jy47, C, 953854953, - WyD(RlhU(LY0), + ipA(G, (Vg((1882502790), (1790689388) == 711715734 / (_) != + ! (134548752)))), nk1(((2078180300)) - + - 1230367323 - gD13, pK38 / 1377998756, m4G(1127784867) > u, (QSs()), 1389625403), 929895424, 895835811 < dW) * - 1339857856) / 2045295101) while (pLb) while (+ 1321345616) return ! 708468611; (J); return eUY; continue; (bRvz = 1838176344); r(F + ! 196992386, Gg); if (1419330106) ! (- (uG)) <= ! 996971325; else T((- ! 2092297653 <= AA >= ! 1494541558 == o((! + v7nD))), 1818433226); } else break; ; ; if (! (! cQ63(1853496451, i(DW9, 988295904 > _Gv, Wlbr, b) / ! ((O(xl))) - - O(+ a_O > 318640956, 1005354893, 167517361) / If, GDD, u, B) * B) + 443946612 + (dN(BFD3(mg <= 1303591176 + hFH2, x) % hch > 1053610009 / RaZ0(ZC7O((720576768)), 124325761, K(! C, 1901412912 * 1202992483, + (+ + e * 389490648), + 1244843051 < (sm = dH), W9(1583501857)), - ! sIs, 1297610228)))) lYAi(1443174874, U8R, + 925787186); else continue; continue; if (+ ! 329152016 + K2()) continue; else ; continue; continue; }
void Tr21Stokes :: computeStiffnessMatrix(FloatMatrix &answer, TimeStep *tStep) { // Note: Working with the components; [K, G+Dp; G^T+Dv^T, C] . [v,p] FluidDynamicMaterial *mat = ( FluidDynamicMaterial * ) this->domain->giveMaterial(this->material); IntegrationRule *iRule = this->integrationRulesArray [ 0 ]; GaussPoint *gp; FloatMatrix B(3, 12), EdB, K(12,12), G, Dp, DvT, C, Ed, dN; FloatArray *lcoords, dN_V(12), Nlin, Ep, Cd, tmpA, tmpB; double Cp; K.zero(); G.zero(); for ( int i = 0; i < iRule->getNumberOfIntegrationPoints(); i++ ) { // Compute Gauss point and determinant at current element gp = iRule->getIntegrationPoint(i); lcoords = gp->giveCoordinates(); double detJ = fabs(this->interpolation_quad.giveTransformationJacobian(* lcoords, FEIElementGeometryWrapper(this))); double dA = detJ * gp->giveWeight(); this->interpolation_quad.evaldNdx(dN, * lcoords, FEIElementGeometryWrapper(this)); this->interpolation_lin.evalN(Nlin, * lcoords, FEIElementGeometryWrapper(this)); for ( int j = 0, k = 0; j < 6; j++, k += 2 ) { dN_V(k) = B(0, k) = B(2, k + 1) = dN(j, 0); dN_V(k + 1) = B(1, k + 1) = B(2, k) = dN(j, 1); } // Computing the internal forces should have been done first. mat->giveDeviatoricStiffnessMatrix(Ed, TangentStiffness, gp, tStep); // dsigma_dev/deps_dev mat->giveDeviatoricPressureStiffness(Ep, TangentStiffness, gp, tStep); // dsigma_dev/dp mat->giveVolumetricDeviatoricStiffness(Cd, TangentStiffness, gp, tStep); // deps_vol/deps_dev mat->giveVolumetricPressureStiffness(Cp, TangentStiffness, gp, tStep); // deps_vol/dp EdB.beProductOf(Ed,B); K.plusProductSymmUpper(B, EdB, dA); G.plusDyadUnsym(dN_V, Nlin, -dA); C.plusDyadSymmUpper(Nlin, Nlin, Cp*dA); tmpA.beTProductOf(B, Ep); Dp.plusDyadUnsym(tmpA, Nlin, dA); tmpB.beTProductOf(B, Cd); DvT.plusDyadUnsym(Nlin, tmpB, dA); } K.symmetrized(); C.symmetrized(); FloatMatrix GTDvT, GDp; GTDvT.beTranspositionOf(G); GTDvT.add(DvT); GDp = G; GDp.add(Dp); FloatMatrix temp(15, 15); temp.setSubMatrix(K, 1, 1); temp.setSubMatrix(GTDvT, 13, 1); temp.setSubMatrix(GDp, 1, 13); temp.setSubMatrix(C, 13, 13); answer.resize(15, 15); answer.zero(); answer.assemble(temp, this->ordering); }