Esempio n. 1
0
void 
StressDilatancyModel2D::CalInitialTangent(void)
{
    double nu, G, A, m, eo, patm;

    A    = modelParameter[1];
    m    = modelParameter[2];
    eo   = modelParameter[0];
    patm = modelParameter[15];

    // assume p = patm for initial shear modulus
	G = A*patm*(2.17 - eo)*(2.17 - eo)/(1 + eo)*(pow(1,m));
	nu = modelParameter[3]; 

	initialTangent(0,0) = 2*G/(1-2*nu)*(1-nu);
	initialTangent(0,1) = 2*G/(1-2*nu)*nu;
	initialTangent(0,2) = 0;


	initialTangent(1,0) = 2*G/(1-2*nu)*nu;
	initialTangent(1,1) = 2*G/(1-2*nu)*(1-nu);
	initialTangent(1,2) = 0;
	

	initialTangent(2,0) = 0;
	initialTangent(2,1) = 0;
	initialTangent(2,2) = G;
	
}
Esempio n. 2
0
void 
stressDensity::calInitialTangent(void)
{
    double nu, G, A, n, eo, patm, fct, afc;

    eo   = materialParam(0);
    nu   = materialParam(1);
    A    = materialParam(2);
    n    = materialParam(3);
    patm = materialParam(24);

    if (materialParam(4) > 0.15 && strhs[12] > 0.02) {
        fct = strhs[12]/0.05;
        if (fct > 1.0) {
            fct = 1.0;
        }
        n = materialParam(3) + (0.85 - materialParam(3))*fct;
    }

    // assume p = patm for initial shear modulus
    if (pFlag == 0) {
	    G = A*patm*(2.17 - eo)*(2.17 - eo)/(1.0 + eo)*(pow(1.0,n));
    
    } else {
        G = A*patm*(2.17 - eo)*(2.17 - eo)/(1.0 + eo)*(pow((pInit/patm),n));
    }

    initialTangent(0,0) = 2.0*G*(1.0+nu)/(3.0*(1-2.0*nu)) + 4.0*G/3.0;
    initialTangent(0,1) = 2.0*G*(1.0+nu)/(3.0*(1-2.0*nu)) - 2.0*G/3.0;
    initialTangent(0,2) = 0.0;
    initialTangent(1,2) = 0.0;
    initialTangent(1,0) = initialTangent(0,1);
    initialTangent(2,0) = initialTangent(0,2);
    initialTangent(1,1) = initialTangent(0,0);
    initialTangent(2,1) = initialTangent(1,2);
    initialTangent(2,2) = G;
}
Esempio n. 3
0
int
stressDensity::recvSelf(int commitTag, Channel &theChannel,FEM_ObjectBroker &theBroker)
{
    int res = 0;

    // place data in a vector
    static Vector vData(798);

	res = theChannel.recvVector(this->getDbTag(), commitTag, vData);
	if (res < 0) {
		opserr << "stressDensity::recvSelf() - failed to recv vData\n";
		return -1;
    }
	
    this->setTag((int)vData(0));
	theStage          = (int)vData(1);
    massDensity       = vData(2);
    materialParam(0)  = vData(3);
    materialParam(1)  = vData(4);
    materialParam(2)  = vData(5);
    materialParam(3)  = vData(6);
    materialParam(4)  = vData(7);
    materialParam(5)  = vData(8);
    materialParam(6)  = vData(9);
    materialParam(7)  = vData(10);
    materialParam(8)  = vData(11);
    materialParam(9)  = vData(12);
    materialParam(10) = vData(13);
    materialParam(11) = vData(14);
    materialParam(12) = vData(15);
    materialParam(13) = vData(16);
    materialParam(14) = vData(17);
    materialParam(15) = vData(18);
    materialParam(16) = vData(19);
    materialParam(17) = vData(20);
    materialParam(18) = vData(21);
    materialParam(19) = vData(22);
    materialParam(20) = vData(23);
    materialParam(21) = vData(24);
    materialParam(22) = vData(25);
    materialParam(23) = vData(26);
    materialParam(24) = vData(27);
    pFlag = (int)vData(28);
    pInit = vData(29);
    for (int i=0; i<12; i++) {
        oths[i] = vData(30+i);
    }
    for (int i=0; i<100; i++) {
        strhs[i] = vData(42+i);
    }
    for (int i=0; i<280; i++) {
        strhs0[i] = vData(142+i);
    }
    for (int i=0; i<40; i++) {
        etahs[i][0] = vData(422);
        etahs[i][1] = vData(462);
        etahs[i][2] = vData(502);
    }
    for (int i=0; i<80; i++) {
        hdp[i][0] = vData(542);
        hdp[i][1] = vData(622);
        hdp[i][2] = vData(702);
    }
    stressCurrent(0) = vData(782); stressCurrent(1) = vData(783); stressCurrent(2) = vData(784);
    strainCurrent(0) = vData(785); strainCurrent(1) = vData(786); strainCurrent(2) = vData(787);
    initialTangent(0,0) = vData(788); initialTangent(0,1) = vData(789); initialTangent(0,2) = vData(790);
    initialTangent(1,0) = vData(791); initialTangent(1,1) = vData(792); initialTangent(1,2) = vData(793);
    initialTangent(2,0) = vData(794); initialTangent(2,1) = vData(795); initialTangent(2,2) = vData(796);
    istep = vData(797);
       
    // set current tangent
    currentTangent = initialTangent; 
    // populate props with model parameters (not all indices used in SDM-UC)
    props[3]  = materialParam(1);
    props[5]  = materialParam(2);
    props[27] = materialParam(3);
    props[28] = materialParam(4);
    props[29] = materialParam(5);
    props[26] = materialParam(6);
    props[30] = materialParam(7);
    props[32] = materialParam(8);
    props[31] = materialParam(9);
    props[34] = materialParam(10);
    props[33] = materialParam(11);
    props[36] = materialParam(12);
    props[35] = materialParam(13);
    props[37] = materialParam(14);
    props[38] = materialParam(15);
    props[39] = materialParam(16);
    props[40] = materialParam(17);
    props[41] = materialParam(18);
    props[42] = materialParam(19);
    props[43] = materialParam(20);
    props[44] = materialParam(21);
    props[45] = materialParam(22);
    props[46] = materialParam(23);
    props[10] = materialParam(0)/(1.0 + materialParam(0));

    return 0;
}
Esempio n. 4
0
int
stressDensity::sendSelf(int commitTag, Channel &theChannel)
{
    int res = 0;
    static Vector vData(798);

    vData(0)  = this->getTag();
    vData(1)  = theStage;
    vData(2)  = massDensity;
    vData(3)  = materialParam(0);
    vData(4)  = materialParam(1);
    vData(5)  = materialParam(2);
    vData(6)  = materialParam(3);
    vData(7)  = materialParam(4);
    vData(8)  = materialParam(5);
    vData(9)  = materialParam(6);
    vData(10) = materialParam(7);
    vData(11) = materialParam(8);
    vData(12) = materialParam(9);
    vData(13) = materialParam(10);
    vData(14) = materialParam(11);
    vData(15) = materialParam(12);
    vData(16) = materialParam(13);
    vData(17) = materialParam(14);
    vData(18) = materialParam(15);
    vData(19) = materialParam(16);
    vData(20) = materialParam(17);
    vData(21) = materialParam(18);
    vData(22) = materialParam(19);
    vData(23) = materialParam(20);
    vData(24) = materialParam(21);
    vData(25) = materialParam(22);
    vData(26) = materialParam(23);
    vData(27) = materialParam(24);
    vData(28) = pFlag;
    vData(29) = pInit;
    for (int i=0; i<12; i++) {
        vData(30+i) = oths[i];
    }
    for (int i=0; i<100; i++) {
        vData(42+i) = strhs[i];
    }
    for (int i=0; i<280; i++) {
        vData(142+i) = strhs0[i];
    }
    for (int i=0; i<40; i++) {
        vData(422) = etahs[i][0];
        vData(462) = etahs[i][1];
        vData(502) = etahs[i][2];
    }
    for (int i=0; i<80; i++) {
        vData(542) = hdp[i][0];
        vData(622) = hdp[i][1];
        vData(702) = hdp[i][2];
    }
    vData(782) = stressCurrent(0); vData(783) = stressCurrent(1); vData(784) = stressCurrent(2);
    vData(785) = strainCurrent(0); vData(786) = strainCurrent(1); vData(787) = strainCurrent(2);
    vData(788) = initialTangent(0,0); vData(789) = initialTangent(0,1); vData(790) = initialTangent(0,2);
    vData(791) = initialTangent(1,0); vData(792) = initialTangent(1,1); vData(793) = initialTangent(1,2);
    vData(794) = initialTangent(2,0); vData(795) = initialTangent(2,1); vData(796) = initialTangent(2,2);
    vData(797) = istep;
        
    res = theChannel.sendVector(this->getDbTag(), commitTag, vData);
	if (res < 0) {
      opserr << "stressDensity::sendSelf() - failed to send vData\n";
	  return -1;
	}

	return 0;
}