void ntTruss::def_BC(){ Kb = K; int n = nodes.size(); for (int i = 0; i < n; i++){ int bc = nodes.at(i)->get_BC(); //number of bc's at node BCs += bc; //add boundary conditions to total ///define matrix id for bc's within global K if (nodes.at(i)->free == false){ int dofX = i * DOF + 0; int dofY = i * DOF + 1; int dofZ = i * DOF + 2; if (nodes.at(i)->fixed == true){ bc_Id.push_back(dofX); bc_Id.push_back(dofY); bc_Id.push_back(dofZ); } else { if (nodes.at(i)->fixed_X == true){ bc_Id.push_back(dofX); } if (nodes.at(i)->fixed_Y == true){ bc_Id.push_back(dofY); } if (nodes.at(i)->fixed_Z == true){ bc_Id.push_back(dofZ); } } } } ////IMPLEMENT BIG SPRING FACTOR float bsFX = pow(10, 20); // Big Spring Factor for (int i = 0; i < BCs; i++){ int index = bc_Id.at(i); Kb(index, index) = Kb(index, index) + bsFX; F(index, 0) = 0; } }
#define sb4(x) (((x) >> 1) ^ (x)) #define sb5(x) (((x) >> 2) ^ (x)) #define rb1(x) SPH_ROTL64(x, 5) #define rb2(x) SPH_ROTL64(x, 11) #define rb3(x) SPH_ROTL64(x, 27) #define rb4(x) SPH_ROTL64(x, 32) #define rb5(x) SPH_ROTL64(x, 37) #define rb6(x) SPH_ROTL64(x, 43) #define rb7(x) SPH_ROTL64(x, 53) #define Kb(j) SPH_T64((sph_u64)(j) * SPH_C64(0x0555555555555555)) #if SPH_SMALL_FOOTPRINT_BMW static const sph_u64 Kb_tab[] = { Kb(16), Kb(17), Kb(18), Kb(19), Kb(20), Kb(21), Kb(22), Kb(23), Kb(24), Kb(25), Kb(26), Kb(27), Kb(28), Kb(29), Kb(30), Kb(31) }; #define rol_off(mf, j, off) \ SPH_ROTL64(mf(((j) + (off)) & 15), (((j) + (off)) & 15) + 1) #define add_elt_b(mf, hf, j) \ (SPH_T64(rol_off(mf, j, 0) + rol_off(mf, j, 3) \ - rol_off(mf, j, 10) + Kb_tab[j]) ^ hf(((j) + 7) & 15)) #define expand1b(qf, mf, hf, i) \ SPH_T64(sb1(qf((i) - 16)) + sb2(qf((i) - 15)) \ + sb3(qf((i) - 14)) + sb0(qf((i) - 13)) \ + sb1(qf((i) - 12)) + sb2(qf((i) - 11)) \ + sb3(qf((i) - 10)) + sb0(qf((i) - 9)) \
int PFEMElement2D::update() { // get nodal coordinates double x[3], y[3]; for(int a=0; a<3; a++) { const Vector& coord = nodes[2*a]->getCrds(); const Vector& disp = nodes[2*a]->getTrialDisp(); x[a] = coord(0) + disp(0); y[a] = coord(1) + disp(1); } // get c and d double cc[3], dd[3]; cc[0] = y[1]-y[2]; dd[0] = x[2]-x[1]; cc[1] = y[2]-y[0]; dd[1] = x[0]-x[2]; cc[2] = y[0]-y[1]; dd[2] = x[1]-x[0]; // get Jacobi double J = cc[0]*dd[1]-dd[0]*cc[1]; if(fabs(J)<1e-15) { opserr<<"WARNING: element area is nearly zero"; opserr<<" -- PFEMElement2D::update\n"; for (int i=0; i<3; i++) { opserr<<"node "<<ntags[2*i]<<"\n"; opserr<<"x = "<<x[i]<<" , y = "<<y[i]<<"\n"; } return -1; } // get M M = rho*J*thickness/6.0; Mp = (kappa<=0? 0.0 : J*thickness/kappa/24.0); double Mb = 9.*rho*J*thickness/40.0; // get Km Km.Zero(); double fact = mu*thickness/(6.*J); for (int a=0; a<3; a++) { for (int b=0; b<3; b++) { Km(2*a,2*b) = fact*(4*cc[a]*cc[b]+3*dd[a]*dd[b]); // Kxx Km(2*a,2*b+1) = fact*(3*dd[a]*cc[b]-2*cc[a]*dd[b]); // Kxy Km(2*a+1,2*b) = fact*(3*cc[a]*dd[b]-2*dd[a]*cc[b]); // Kyx Km(2*a+1,2*b+1) = fact*(3*cc[a]*cc[b]+4*dd[a]*dd[b]); // Kyy } } // get Kb Matrix Kb(2,2); fact = 27.*mu*thickness/(40.*J); double cc2 = 0., dd2 = 0., cd2 = 0.; for(int a=0; a<3; a++) { cc2 += cc[a]*cc[a]; dd2 += dd[a]*dd[a]; cd2 += cc[a]*dd[a]; } Kb(0,0) = fact*(4*cc2+3*dd2); // Kxx Kb(0,1) = fact*cd2; // Kxy Kb(1,0) = fact*cd2; // Kyx Kb(1,1) = fact*(3*cc2+4*dd2); // Kyy // get Gx and Gy Gx.Zero(); Gy.Zero(); fact = thickness/6.0; for (int a=0; a<3; a++) { Gx(a) = cc[a]*fact; Gy(a) = dd[a]*fact; } // get Gb Matrix Gb(2,3); fact = -9.*thickness/40.0; for (int a=0; a<3; a++) { Gb(0,a) = cc[a]*fact; Gb(1,a) = dd[a]*fact; } // get S S.Zero(); if (ops_Dt > 0) { Kb(0,0) += Mb/ops_Dt; Kb(1,1) += Mb/ops_Dt; } if (Kb(0,0)!=0 && Kb(1,1)!=0) { this->inverse(Kb); } S.addMatrixTripleProduct(0.0, Gb, Kb, 1); // get F F.Zero(); fact = rho*J*thickness/6.0; F(0) = fact*b1; F(1) = fact*b2; // get Fb Vector Fb(2); fact = 9.*rho*J*thickness/40.; Fb(0) = fact*b1; Fb(1) = fact*b2; // get Fp Fp.Zero(); Fp.addMatrixTransposeVector(0.0, Gb, Kb*Fb, -1); return 0; }