public static void ElasticK(double[,] k, List <Vec3Float> xyz, float[] r, double L, double Le, int n1, int n2, double Ax, double Asy, double Asz, double J, double Iy, double Iz, double E, double G, float p, bool shear) { double Ksy, Ksz; /* shear deformatn coefficients */ int i, j; double[] t = Coordtrans.coordTrans(xyz, L, n1, n2, p); for (i = 0; i < 12; i++) { for (j = 0; j < 12; j++) { k[i, j] = 0.0; } } if (shear) { Ksy = 12.0 * E * Iz / (G * Asy * Le * Le); Ksz = 12.0 * E * Iy / (G * Asz * Le * Le); } else { Ksy = Ksz = 0.0; } k[0, 0] = k[6, 6] = E * Ax / Le; k[1, 1] = k[7, 7] = 12.0 * E * Iz / (Le * Le * Le * (1.0 + Ksy)); k[2, 2] = k[8, 8] = 12.0 * E * Iy / (Le * Le * Le * (1.0 + Ksz)); k[3, 3] = k[9, 9] = G * J / Le; k[4, 4] = k[10, 10] = (4.0 + Ksz) * E * Iy / (Le * (1.0 + Ksz)); k[5, 5] = k[11, 11] = (4.0 + Ksy) * E * Iz / (Le * (1.0 + Ksy)); k[4, 2] = k[2, 4] = -6.0 * E * Iy / (Le * Le * (1.0 + Ksz)); k[5, 1] = k[1, 5] = 6.0 * E * Iz / (Le * Le * (1.0 + Ksy)); k[6, 0] = k[0, 6] = -k[0, 0]; k[11, 7] = k[7, 11] = k[7, 5] = k[5, 7] = -k[5, 1]; k[10, 8] = k[8, 10] = k[8, 4] = k[4, 8] = -k[4, 2]; k[9, 3] = k[3, 9] = -k[3, 3]; k[10, 2] = k[2, 10] = k[4, 2]; k[11, 1] = k[1, 11] = k[5, 1]; k[7, 1] = k[1, 7] = -k[1, 1]; k[8, 2] = k[2, 8] = -k[2, 2]; k[10, 4] = k[4, 10] = (2.0 - Ksz) * E * Iy / (Le * (1.0 + Ksz)); k[11, 5] = k[5, 11] = (2.0 - Ksy) * E * Iz / (Le * (1.0 + Ksy)); k = Coordtrans.Atma(t, k, r[n1], r[n2]); for (i = 0; i < 12; i++) { for (j = i + 1; j < 12; j++) { if (k[i, j] != k[j, i]) { if (Math.Abs(k[i, j] / k[j, i] - 1.0) > 1.0e-6 && (Math.Abs(k[i, j] / k[i, i]) > 1e-6 || Math.Abs(k[j, i] / k[i, i]) > 1e-6 ) ) { Console.WriteLine($"elastic_K: element stiffness matrix not symetric ..."); Console.WriteLine($" ... k[{i}][{j}] = {k[i, j]} "); Console.WriteLine($" ... k[{j}][{i}] = {k[j, i]} "); Console.WriteLine($" ... relative error = {Math.Abs(k[i, j] / k[j, i] - 1.0)} "); Console.WriteLine($" ... element matrix saved in file 'kt'"); } k[i, j] = k[j, i] = 0.5 * (k[i, j] + k[j, i]); } } } }
private static void FrameElementForce(double[] s, List <Vec3Float> xyz, double L, double Le, int n1, int n2, float Ax, float Asy, float Asz, float J, float Iy, float Iz, float E, float G, float p, double[] fT, double[] fM, double[] D, bool shear, bool geom, double axialStrain)//return s { double d1, d2, d3, d4, d5, d6, d7, d8, d9, d10, d11, d12, delta = 0.0, /* stretch in the frame element */ Ksy, Ksz, Dsy, Dsz, /* shear deformation coeff's */ T = 0.0; /* axial force for geometric stiffness */ double f1 = 0, f2 = 0, f3 = 0, f4 = 0, f5 = 0, f6 = 0, f7 = 0, f8 = 0, f9 = 0, f10 = 0, f11 = 0, f12 = 0; double[] t = Coordtrans.coordTrans(xyz, L, n1, n2, p); n1 = 6 * n1; n2 = 6 * n2; d1 = D[n1 + 0]; d2 = D[n1 + 1]; d3 = D[n1 + 2]; d4 = D[n1 + 3]; d5 = D[n1 + 4]; d6 = D[n1 + 5]; d7 = D[n2 + 0]; d8 = D[n2 + 1]; d9 = D[n2 + 2]; d10 = D[n2 + 3]; d11 = D[n2 + 4]; d12 = D[n2 + 5]; if (shear) { Ksy = 12.0 * E * Iz / (G * Asy * Le * Le); Ksz = 12.0 * E * Iy / (G * Asz * Le * Le); Dsy = (1 + Ksy) * (1 + Ksy); Dsz = (1 + Ksz) * (1 + Ksz); } else { Ksy = Ksz = 0.0; Dsy = Dsz = 1.0; } delta = (d7 - d1) * t[0] + (d8 - d2) * t[1] + (d9 - d3) * t[2]; axialStrain = delta / Le; // log(Ls/Le); s[0] = -(Ax * E / Le) * ((d7 - d1) * t[0] + (d8 - d2) * t[1] + (d9 - d3) * t[2]); if (geom) { T = -s[0]; } s[1] = -(12.0 * E * Iz / (Le * Le * Le * (1.0 + Ksy)) + T / L * (1.2 + 2.0 * Ksy + Ksy * Ksy) / Dsy) * ((d7 - d1) * t[3] + (d8 - d2) * t[4] + (d9 - d3) * t[5]) + (6.0 * E * Iz / (Le * Le * (1.0 + Ksy)) + T / 10.0 / Dsy) * ((d4 + d10) * t[6] + (d5 + d11) * t[7] + (d6 + d12) * t[8]); s[2] = -(12.0 * E * Iy / (Le * Le * Le * (1.0 + Ksz)) + T / L * (1.2 + 2.0 * Ksz + Ksz * Ksz) / Dsz) * ((d7 - d1) * t[6] + (d8 - d2) * t[7] + (d9 - d3) * t[8]) - (6.0 * E * Iy / (Le * Le * (1.0 + Ksz)) + T / 10.0 / Dsz) * ((d4 + d10) * t[3] + (d5 + d11) * t[4] + (d6 + d12) * t[5]); s[3] = -(G * J / Le) * ((d10 - d4) * t[0] + (d11 - d5) * t[1] + (d12 - d6) * t[2]); s[4] = (6.0 * E * Iy / (Le * Le * (1.0 + Ksz)) + T / 10.0 / Dsz) * ((d7 - d1) * t[6] + (d8 - d2) * t[7] + (d9 - d3) * t[8]) + ((4.0 + Ksz) * E * Iy / (Le * (1.0 + Ksz)) + T * L * (2.0 / 15.0 + Ksz / 6.0 + Ksz * Ksz / 12.0) / Dsz) * (d4 * t[3] + d5 * t[4] + d6 * t[5]) + ((2.0 - Ksz) * E * Iy / (Le * (1.0 + Ksz)) - T * L * (1.0 / 30.0 + Ksz / 6.0 + Ksz * Ksz / 12.0) / Dsz) * (d10 * t[3] + d11 * t[4] + d12 * t[5]); s[5] = -(6.0 * E * Iz / (Le * Le * (1.0 + Ksy)) + T / 10.0 / Dsy) * ((d7 - d1) * t[3] + (d8 - d2) * t[4] + (d9 - d3) * t[5]) + ((4.0 + Ksy) * E * Iz / (Le * (1.0 + Ksy)) + T * L * (2.0 / 15.0 + Ksy / 6.0 + Ksy * Ksy / 12.0) / Dsy) * (d4 * t[6] + d5 * t[7] + d6 * t[8]) + ((2.0 - Ksy) * E * Iz / (Le * (1.0 + Ksy)) - T * L * (1.0 / 30.0 + Ksy / 6.0 + Ksy * Ksy / 12.0) / Dsy) * (d10 * t[6] + d11 * t[7] + d12 * t[8]); s[6] = -s[0]; s[7] = -s[1]; s[8] = -s[2]; s[9] = -s[3]; s[10] = (6.0 * E * Iy / (Le * Le * (1.0 + Ksz)) + T / 10.0 / Dsz) * ((d7 - d1) * t[6] + (d8 - d2) * t[7] + (d9 - d3) * t[8]) + ((4.0 + Ksz) * E * Iy / (Le * (1.0 + Ksz)) + T * L * (2.0 / 15.0 + Ksz / 6.0 + Ksz * Ksz / 12.0) / Dsz) * (d10 * t[3] + d11 * t[4] + d12 * t[5]) + ((2.0 - Ksz) * E * Iy / (Le * (1.0 + Ksz)) - T * L * (1.0 / 30.0 + Ksz / 6.0 + Ksz * Ksz / 12.0) / Dsz) * (d4 * t[3] + d5 * t[4] + d6 * t[5]); s[11] = -(6.0 * E * Iz / (Le * Le * (1.0 + Ksy)) + T / 10.0 / Dsy) * ((d7 - d1) * t[3] + (d8 - d2) * t[4] + (d9 - d3) * t[5]) + ((4.0 + Ksy) * E * Iz / (Le * (1.0 + Ksy)) + T * L * (2.0 / 15.0 + Ksy / 6.0 + Ksy * Ksy / 12.0) / Dsy) * (d10 * t[6] + d11 * t[7] + d12 * t[8]) + ((2.0 - Ksy) * E * Iz / (Le * (1.0 + Ksy)) - T * L * (1.0 / 30.0 + Ksy / 6.0 + Ksy * Ksy / 12.0) / Dsy) * (d4 * t[6] + d5 * t[7] + d6 * t[8]); // add fixed end forces to internal element forces // 18oct[1]012, 14may1204, 15may2014 // add temperature fixed-end-forces to variables f1-f12 // add mechanical load fixed-end-forces to variables f1-f12 // f1 ... f12 are in the global element coordinate system f1 = fT[0] + fM[0]; f2 = fT[1] + fM[1]; f3 = fT[2] + fM[2]; f4 = fT[3] + fM[3]; f5 = fT[4] + fM[4]; f6 = fT[5] + fM[5]; f7 = fT[6] + fM[6]; f8 = fT[7] + fM[7]; f9 = fT[8] + fM[8]; f10 = fT[9] + fM[9]; f11 = fT[10] + fM[10]; f12 = fT[11] + fM[11]; // transform f1 ... f12 to local element coordinate system and // add local fixed end forces (-equivalent loads) to internal loads // {Q} = [T]{f} s[0] -= (f1 * t[0] + f2 * t[1] + f3 * t[2]); s[1] -= (f1 * t[3] + f2 * t[4] + f3 * t[5]); s[2] -= (f1 * t[6] + f2 * t[7] + f3 * t[8]); s[3] -= (f4 * t[0] + f5 * t[1] + f6 * t[2]); s[4] -= (f4 * t[3] + f5 * t[4] + f6 * t[5]); s[5] -= (f4 * t[6] + f5 * t[7] + f6 * t[8]); s[6] -= (f7 * t[0] + f8 * t[1] + f9 * t[2]); s[7] -= (f7 * t[3] + f8 * t[4] + f9 * t[5]); s[8] -= (f7 * t[6] + f8 * t[7] + f9 * t[8]); s[9] -= (f10 * t[0] + f11 * t[1] + f12 * t[2]); s[10] -= (f10 * t[3] + f11 * t[4] + f12 * t[5]); s[11] -= (f10 * t[6] + f11 * t[7] + f12 * t[8]); }