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; }
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; }
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; }
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; }