const Matrix& PFEMElement2DBubble::getDamp() { // resize K int ndf = this->getNumDOF(); K.resize(ndf, ndf); K.Zero(); Vector G(6); getG(G); Matrix L(3,3); getL(L); // other matrices for(int a=0; a<3; a++) { for(int b=0; b<3; b++) { K(numDOFs(2*a+1), numDOFs(2*b)) = G(2*b); // GxT K(numDOFs(2*a+1), numDOFs(2*b)+1) = G(2*b+1); // GyT K(numDOFs(2*a), numDOFs(2*b+1)) = -G(2*a); // -Gx K(numDOFs(2*a)+1, numDOFs(2*b+1)) = -G(2*a+1); // -Gy K(numDOFs(2*a+1), numDOFs(2*b+1)) = L(a,b); // bubble } } //opserr<<"K = "<<K; return K; }
int PFEMElement2DCompressible::recvSelf(int commitTag, Channel &theChannel, FEM_ObjectBroker &theBroker) { int res; int dataTag = this->getDbTag(); // receive vector static Vector data(12); res = theChannel.recvVector(dataTag, commitTag, data); if(res < 0) { opserr<<"WARNING: PFEMElement2DCompressible::recvSelf - failed to receive vector\n"; return -1; } this->setTag((int)data(0)); rho = data(1); mu = data(2); bx = data(3); by = data(4); for(int i=0; i<3; i++) { dNdx[i] = data(5+i); dNdy[i] = data(8+i); } J = data(11); for(int i=0; i<6; i++) { ntags(i) = (int)data(12+i); numDOFs(i) = (int)data(18+i); } numDOFs(6) = (int)data(24); return 0; }
int PFEMElement2DCompressible::sendSelf(int commitTag, Channel &theChannel) { int res = 0; int dataTag = this->getDbTag(); // send vector static Vector data(25); data(0) = this->getTag(); data(1) = rho; data(2) = mu; data(3) = bx; data(4) = by; for(int i=0; i<3; i++) { data(5+i) = dNdx[i]; data(8+i) = dNdy[i]; } data(11) = J; for(int i=0; i<6; i++) { data(12+i) = ntags(i); data(18+i) = numDOFs(i); } data(24) = numDOFs(6); res = theChannel.sendVector(dataTag, commitTag, data); if(res < 0) { opserr<<"WARNING: PFEMElement2DCompressible::sendSelf - "<<this->getTag()<<" failed to send vector\n"; return -1; } return 0; }
const Matrix& PFEMElement2DBubble::getMass() { // resize K int ndf = this->getNumDOF(); K.resize(ndf, ndf); K.Zero(); double m = getM(); double mp = getMp(); // mass for(int a=0; a<3; a++) { K(numDOFs(2*a), numDOFs(2*a)) = m; // Mxd K(numDOFs(2*a)+1, numDOFs(2*a)+1) = m; // Myd for(int b=0; b<3; b++) { if(a == b) { K(numDOFs(2*a+1), numDOFs(2*b+1)) = 2*mp; // Mp } else { K(numDOFs(2*a+1), numDOFs(2*b+1)) = mp; // Mp } } } //opserr<<"M = "<<K; return K; }
const Vector& PFEMElement2DBubble::getResistingForceIncInertia() { // resize P int ndf = this->getNumDOF(); P.resize(ndf); P.Zero(); // get velocity, accleration Vector v(ndf), vdot(ndf); for(int i=0; i<3; i++) { const Vector& accel = nodes[2*i]->getTrialAccel(); vdot(numDOFs(2*i)) = accel(0); vdot(numDOFs(2*i)+1) = accel(1); const Vector& accel2 = nodes[2*i+1]->getTrialAccel(); // pressure vdot(numDOFs(2*i+1)) = accel2(0); const Vector& vel = nodes[2*i]->getTrialVel(); v(numDOFs(2*i)) = vel(0); v(numDOFs(2*i)+1) = vel(1); const Vector& vel2 = nodes[2*i+1]->getTrialVel(); // pressure v(numDOFs(2*i+1)) = vel2(0); } // bubble force Vector fp(3); getFp(fp); // internal force P.addMatrixVector(1.0, getMass(), vdot, 1.0); P.addMatrixVector(1.0, getDamp(), v, 1.0); // external force Vector F(6); getF(F); for(int i=0; i<3; i++) { P(numDOFs(2*i)) -= F(2*i); P(numDOFs(2*i)+1) -= F(2*i+1); P(numDOFs(2*i+1)) -= fp(i); } //opserr<<"F = "<<F; return P; }
const Matrix& PFEMElement2DCompressible::getMass() { // resize K int ndf = this->getNumDOF(); K.resize(ndf, ndf); K.Zero(); double J2 = J/2.; // mass for(int a=0; a<3; a++) { for(int b=0; b<3; b++) { double m = rho*J2/12.0; if(a == b) m *= 2.0; K(numDOFs(2*a), numDOFs(2*b)) = m; // Mx K(numDOFs(2*a)+1, numDOFs(2*b)+1) = m; // My m = J2/12.0/kappa; if(a == b) m *= 2.0; K(numDOFs(2*a+1), numDOFs(2*a+1)) += m; // Mp } } return K; }
const Vector& PFEMElement2DCompressible::getResistingForceIncInertia() { // resize P int ndf = this->getNumDOF(); P.resize(ndf); P.Zero(); // get velocity, accleration Vector v(ndf), vdot(ndf); for(int i=0; i<3; i++) { const Vector& accel = nodes[2*i]->getTrialAccel(); vdot(numDOFs(2*i)) = accel(0); vdot(numDOFs(2*i)+1) = accel(1); const Vector& accel2 = nodes[2*i+1]->getTrialAccel(); vdot(numDOFs(2*i+1)) = accel2(0); const Vector& vel = nodes[2*i]->getTrialVel(); v(numDOFs(2*i)) = vel(0); v(numDOFs(2*i)+1) = vel(1); const Vector& vel2 = nodes[2*i+1]->getTrialVel(); v(numDOFs(2*i+1)) = vel2(0); } // Ma+k1v-Gp // Gt*v+Mp*p P.addMatrixVector(1.0, getMass(), vdot, 1.0); P.addMatrixVector(1.0, getDamp(), v, 1.0); // f double J2 = J/2.0; for(int i=0; i<3; i++) { P(numDOFs(2*i)) -= rho*bx/3.*J2; P(numDOFs(2*i)+1) -= rho*by/3.*J2; } return P; }
const Matrix& PFEMElement3D::getMass() { // resize K int ndf = this->getNumDOF(); K.resize(ndf, ndf); K.Zero(); // mass for(int a=0; a<4; a++) { double m = rho*J/24.0; K(numDOFs(2*a), numDOFs(2*a)) = m; // Mxd K(numDOFs(2*a)+1, numDOFs(2*a)+1) = m; // Myd K(numDOFs(2*a)+2, numDOFs(2*a)+2) = m; // Mzd } return K; }
const Vector & PFEMElement2DBubble::getResistingForceSensitivity(int gradnumber) { // resize P int ndf = this->getNumDOF(); P.resize(ndf); P.Zero(); Vector dF(6), dFp(3), vdot(6), v(6), p(3), du(6); for(int i=0; i<3; i++) { const Vector& accel = nodes[2*i]->getTrialAccel(); vdot(2*i) = accel(0); vdot(2*i+1) = accel(1); const Vector& vel = nodes[2*i]->getTrialVel(); v(2*i) = vel(0); v(2*i+1) = vel(1); const Vector& vel2 = nodes[2*i+1]->getTrialVel(); // pressure p(i) = vel2(0); du(2*i) = nodes[2*i]->getDispSensitivity(1,gradnumber); du(2*i+1) = nodes[2*i]->getDispSensitivity(2,gradnumber); } // consditional sensitivity getdF(dF); double dm = getdM(); dF.addVector(-1.0, vdot, dm); getdFp(dFp); Matrix dl; getdL(dl); dFp.addMatrixVector(-1.0, dl, p, 1.0); // geometric sensitivity Matrix dM, dg, df; getdM(vdot, dM); getdG(p, dg); getdF(df); dF.addMatrixVector(1.0, dM, du, 1.0); dF.addMatrixVector(1.0, dg, du, -1.0); dF.addMatrixVector(1.0, df, du, -1.0); Matrix dgt, dL, dfp; getdGt(v, dgt); getdL(p, dL); getdFp(dfp); dFp.addMatrixVector(1.0, dgt, du, 1.0); dFp.addMatrixVector(1.0, dL, du, 1.0); dFp.addMatrixVector(1.0, dfp, du, -1.0); // copy for(int i=0; i<3; i++) { P(numDOFs(2*i)) += dF(2*i); P(numDOFs(2*i)+1) += dF(2*i+1); P(numDOFs(2*i+1)) += dFp(i); } return P; }
void PFEMElement2DBubble::setDomain(Domain *theDomain) { numDOFs.resize(7); this->DomainComponent::setDomain(theDomain); if(theDomain == 0) { return; } numDOFs.Zero(); int ndf = 0; int eletag = this->getTag(); for(int i=0; i<3; i++) { // set ndf numDOFs(2*i) = ndf; // get node nodes[2*i] = theDomain->getNode(ntags(2*i)); if(nodes[2*i] == 0) { opserr<<"WARNING: node "<<ntags(2*i)<<" does not exist "; opserr<<"in PFEMElement2DBubble - setDomain() "<<eletag<<"\n "; return; } ndf += nodes[2*i]->getNumberDOF(); // set ndf numDOFs(2*i+1) = ndf; // get pc int pndf = 1; thePCs[i] = theDomain->getPressure_Constraint(ntags(2*i)); if(thePCs[i] != 0) { thePCs[i]->setDomain(theDomain); } else { thePCs[i] = new Pressure_Constraint(ntags(2*i), pndf); if(thePCs[i] == 0) { opserr<<"WARNING: no enough memory for Pressure_Constraint -- "; opserr<<"PFEMElement2DBubble::setDomain "<<eletag<<"\n"; return; } if(theDomain->addPressure_Constraint(thePCs[i]) == false) { opserr<<"WARNING: failed to add Pressure_Constraint to domain -- "; opserr<<"PFEMElement2DBubble::setDomain "<<eletag<<"\n"; delete thePCs[i]; thePCs[i] = 0; return; } } // connect thePCs[i]->connect(eletag); // get pressure node // ntags(2*i+1) = thePCs[i]->getPressureNode(); // nodes[2*i+1] = theDomain->getNode(ntags(2*i+1)); nodes[2*i+1] = thePCs[i]->getPressureNode(); if(nodes[2*i+1] == 0) { opserr<<"WARNING: pressure node does not exist "; opserr<<"in PFEMElement2DBubble - setDomain() "<<eletag<<"\n "; return; } ntags(2*i+1) = nodes[2*i+1]->getTag(); ndf += nodes[2*i+1]->getNumberDOF(); } numDOFs(numDOFs.Size()-1) = ndf; }
int PFEMElement2DBubble::getNumDOF() { if(numDOFs.Size() == 0) return 0; return numDOFs(numDOFs.Size()-1); }
int PFEMElement3D::getNumDOF() { return numDOFs(numDOFs.Size()-1); }
const Vector& PFEMElement3D::getResistingForceIncInertia() { // resize P int ndf = this->getNumDOF(); P.resize(ndf); P.Zero(); // get velocity, accleration Vector v(ndf), vdot(ndf); for(int i=0; i<4; i++) { const Vector& accel = nodes[2*i]->getTrialAccel(); vdot(numDOFs(2*i)) = accel(0); vdot(numDOFs(2*i)+1) = accel(1); vdot(numDOFs(2*i)+2) = accel(2); const Vector& vel = nodes[2*i]->getTrialVel(); v(numDOFs(2*i)) = vel(0); v(numDOFs(2*i)+1) = vel(1); v(numDOFs(2*i)+2) = vel(2); const Vector& vel2 = nodes[2*i+1]->getTrialVel(); v(numDOFs(2*i+1)) = vel2(0); v(numDOFs(2*i+1)+1) = vel2(1); v(numDOFs(2*i+1)+2) = vel2(2); v(numDOFs(2*i+1)+3) = vel2(3); } double d = v.Norm(); if(d!=d) opserr<<"v "<<this->getTag()<<"\n"; d = vdot.Norm(); if(d!=d) opserr<<"vdot "<<this->getTag()<<"\n"; P.addMatrixVector(1.0, getMass(), vdot, 1.0); P.addMatrixVector(1.0, getDampWithK(), v, 1.0); Vector ones(ndf); for(int i=0;i<ndf;i++) ones(i) = 1.0; Vector Q1(ndf), Q2(ndf); Q1.addMatrixVector(1.0, getMass(), ones, 1.0); Q2.addMatrixVector(1.0, getDampWithK(), ones, 1.0); d = Q1.Norm(); if(d!=d) opserr<<"mass "<<this->getTag()<<"\n"; d = Q2.Norm(); if(d!=d) { opserr<<"damp "<<this->getTag()<<"\n"; exit(1); } // get Jacobi for(int i=0; i<4; i++) { P(numDOFs(2*i)) -= rho*bx/24.*J; P(numDOFs(2*i)+1) -= rho*by/24.*J; P(numDOFs(2*i)+2) -= rho*bz/24.*J; } return P; }
const Matrix& PFEMElement3D::getDampWithK() { // resize K int ndf = this->getNumDOF(); K.resize(ndf, ndf); K.Zero(); double V = fabs(J/6.0); double h = exp(log(V)/3.0); // cubic root of V double tau = 1./(rho/ops_Dt+8*mu/(3*h*h)); for(int a=0; a<4; a++) { for(int b=0; b<4; b++) { // K(1,1:3) K(numDOFs(2*a), numDOFs(2*b)) = mu*J/6.0*(2*dNdx[a]*dNdx[b]+dNdy[a]*dNdy[b]+dNdz[a]*dNdz[b]); K(numDOFs(2*a), numDOFs(2*b)+1) = mu*J/6.0*dNdy[a]*dNdx[b]; K(numDOFs(2*a), numDOFs(2*b)+2) = mu*J/6.0*dNdz[a]*dNdx[b]; // K(2,1:3) K(numDOFs(2*a)+1, numDOFs(2*b)) = mu*J/6.0*dNdx[a]*dNdy[b]; K(numDOFs(2*a)+1, numDOFs(2*b)+1) = mu*J/6.0*(2*dNdy[a]*dNdy[b]+dNdx[a]*dNdx[b]+dNdz[a]*dNdz[b]); K(numDOFs(2*a)+1, numDOFs(2*b)+2) = mu*J/6.0*dNdz[a]*dNdy[b]; // K(3,1:3) K(numDOFs(2*a)+2, numDOFs(2*b)) = mu*J/6.0*dNdx[a]*dNdz[b]; K(numDOFs(2*a)+2, numDOFs(2*b)+1) = mu*J/6.0*dNdy[a]*dNdz[b]; K(numDOFs(2*a)+2, numDOFs(2*b)+2) = mu*J/6.0*(2*dNdz[a]*dNdz[b]+dNdx[a]*dNdx[b]+dNdy[a]*dNdy[b]); K(numDOFs(2*a), numDOFs(2*b+1)) = -dNdx[a]/24.*J; // -Gx K(numDOFs(2*a)+1, numDOFs(2*b+1)) = -dNdy[a]/24.*J; // -Gy K(numDOFs(2*a)+2, numDOFs(2*b+1)) = -dNdz[a]/24.*J; // -Gz K(numDOFs(2*a+1), numDOFs(2*b)) = dNdx[b]/24.*J; // GxT K(numDOFs(2*a+1), numDOFs(2*b)+1) = dNdy[b]/24.*J; // GyT K(numDOFs(2*a+1), numDOFs(2*b)+2) = dNdz[b]/24.*J; // GzT K(numDOFs(2*a+1), numDOFs(2*b+1)) = tau*J/6.0*(dNdx[a]*dNdx[b]+dNdy[a]*dNdy[b]+dNdz[a]*dNdz[b]); // L K(numDOFs(2*a+1), numDOFs(2*b+1)+1) = tau*dNdx[a]/24.*J; // Qx K(numDOFs(2*a+1), numDOFs(2*b+1)+2) = tau*dNdy[a]/24.*J; // Qy K(numDOFs(2*a+1), numDOFs(2*b+1)+3) = tau*dNdz[a]/24.*J; // Qz K(numDOFs(2*a+1)+1, numDOFs(2*b+1)) = tau*dNdx[b]/24.*J; // QxT K(numDOFs(2*a+1)+2, numDOFs(2*b+1)) = tau*dNdy[b]/24.*J; // QyT K(numDOFs(2*a+1)+3, numDOFs(2*b+1)) = tau*dNdz[b]/24.*J; // QzT } double m = tau*J/24.0; K(numDOFs(2*a+1)+1, numDOFs(2*a+1)+1) = m; // Mhatxd K(numDOFs(2*a+1)+2, numDOFs(2*a+1)+2) = m; // Mhatyd K(numDOFs(2*a+1)+3, numDOFs(2*a+1)+3) = m; // Mhatzd } return K; }
const Matrix& PFEMElement2DCompressible::getDamp() { // resize K int ndf = this->getNumDOF(); K.resize(ndf, ndf); K.Zero(); double J2 = J/2.; double lambda = -2*mu/3.0; for(int a=0; a<3; a++) { for(int b=0; b<3; b++) { K(numDOFs(2*a), numDOFs(2*b)) += mu*J2*(2*dNdx[a]*dNdx[b] + dNdy[a]*dNdy[b]); // K1 K(numDOFs(2*a), numDOFs(2*b)+1) += mu*J2*dNdy[a]*dNdx[b]; // K1 K(numDOFs(2*a)+1, numDOFs(2*b)) += mu*J2*dNdx[a]*dNdy[b]; // K1 K(numDOFs(2*a)+1, numDOFs(2*b)+1) += mu*J2*(2*dNdy[a]*dNdy[b] + dNdx[a]*dNdx[b]); // K1 K(numDOFs(2*a), numDOFs(2*b)) += lambda*J2*dNdx[a]*dNdx[b]; // K2 K(numDOFs(2*a), numDOFs(2*b)+1) += lambda*J2*dNdx[a]*dNdy[b]; // K2 K(numDOFs(2*a)+1, numDOFs(2*b)) += lambda*J2*dNdy[a]*dNdx[b]; // K2 K(numDOFs(2*a)+1, numDOFs(2*b)+1) += lambda*J2*dNdy[a]*dNdy[b]; // K2 K(numDOFs(2*a), numDOFs(2*b+1)) += -dNdx[a]/3.*J2; // -Gx K(numDOFs(2*a)+1, numDOFs(2*b+1)) += -dNdy[a]/3.*J2; // -Gy K(numDOFs(2*a+1), numDOFs(2*b)) += dNdx[b]/3.*J2; // GxT K(numDOFs(2*a+1), numDOFs(2*b)+1) += dNdy[b]/3.*J2; // GyT // K(numDOFs(2*a+1), numDOFs(2*b+1)) += Lfact*tau*J2*(dNdx[a]*dNdx[b] + dNdy[a]*dNdy[b]); // L // K(numDOFs(2*a+1), numDOFs(2*b+1)+1) = tau*dNdx[a]/3.*J2; // Qx // K(numDOFs(2*a+1), numDOFs(2*b+1)+2) = tau*dNdy[a]/3.*J2; // Qy // K(numDOFs(2*a+1)+1, numDOFs(2*b+1)) = tau*dNdx[b]/3.*J2; // QxT // K(numDOFs(2*a+1)+2, numDOFs(2*b+1)) = tau*dNdy[b]/3.*J2; // QyT } // double m = tau*J2/3.0; // K(numDOFs(2*a+1)+1, numDOFs(2*a+1)+1) = m; // Mhatxd // K(numDOFs(2*a+1)+2, numDOFs(2*a+1)+2) = m; // Mhatyd } return K; }