Ejemplo n.º 1
0
        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]);
                    }
                }
            }
        }
Ejemplo n.º 2
0
        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]);
        }