예제 #1
0
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;
}
예제 #4
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;
}
예제 #5
0
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;
}
예제 #8
0
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;
}
예제 #9
0
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;
}
예제 #10
0
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;
}
예제 #11
0
int
PFEMElement2DBubble::getNumDOF()
{
    if(numDOFs.Size() == 0) return 0;
    return numDOFs(numDOFs.Size()-1);
}
예제 #12
0
int
PFEMElement3D::getNumDOF()
{
    return numDOFs(numDOFs.Size()-1);
}
예제 #13
0
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;
}
예제 #14
0
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;
}