Пример #1
0
        private void CalculateInitialConfigurationData(IElement element)
        {
            IReadOnlyList <Matrix> shapeFunctionNaturalDerivatives;

            shapeFunctionNaturalDerivatives = Interpolation.EvaluateNaturalGradientsAtGaussPoints(QuadratureForStiffness);
            Matrix[] BL13_hexa;
            BL13_hexa = GetBL13Hexa(shapeFunctionNaturalDerivatives);

            Matrix[] BNL1_hexa;

            ox_i = new double[8][];
            tu_i = new double[8][];

            (Matrix[] J_0inv_hexa, double[] detJ_0) = JacobianHexa8Reverse.GetJ_0invHexaAndDetJ_0(
                shapeFunctionNaturalDerivatives, element.Nodes, nGaussPoints);

            integrationCoeffs = new double[nGaussPoints];

            BNL1_hexa = GetBNL1_hexa(J_0inv_hexa);

            for (int j = 0; j < 8; j++)
            {
                ox_i[j] = new double[] { element.Nodes[j].X, element.Nodes[j].Y, element.Nodes[j].Z, };
            }

            for (int gpoint = 0; gpoint < nGaussPoints; gpoint++)
            {
                integrationCoeffs[gpoint] = detJ_0[gpoint] * QuadratureForStiffness.IntegrationPoints[gpoint].Weight;
            }

            tu_i = new double[8][];
            //GLvec = new double[nGaussPoints][]; //MS
            //GLvec_last_converged = new double[nGaussPoints][];
            DefGradVec = new double[nGaussPoints][];
            for (int gpoint = 0; gpoint < nGaussPoints; gpoint++)
            {
                //GLvec[gpoint] = new double[6]; //MS
                //GLvec_last_converged[gpoint] = new double[6];
                DefGradVec[gpoint] = new double[9];
            }
            for (int k = 0; k < 8; k++)
            {
                tu_i[k] = new double[3];
            }
            isInitialized = true;
        }
Пример #2
0
        private void CalculateStrains(double[] localdisplacements, IElement element, double[][] tx_i)
        {
            IReadOnlyList <Matrix> shapeFunctionNaturalDerivatives;

            shapeFunctionNaturalDerivatives         = Interpolation.EvaluateNaturalGradientsAtGaussPoints(QuadratureForStiffness);
            (Matrix[] J_0inv_hexa, double[] detJ_0) = JacobianHexa8Reverse.GetJ_0invHexaAndDetJ_0(
                shapeFunctionNaturalDerivatives, element.Nodes, nGaussPoints);
            //TODO: possibility of caching ll1_hexa or J_0inv

            Matrix[] DGtr = new Matrix[nGaussPoints];
            //Matrix[] GL = new Matrix[nGaussPoints]; //MS
            for (int npoint = 0; npoint < nGaussPoints; npoint++)
            {
                DGtr[npoint] = Matrix.CreateZero(3, 3);
                //GL[npoint] = Matrix.CreateZero(3, 3); //MS
            }

            Matrix[] J_1 = JacobianHexa8Reverse.Get_J_1(nGaussPoints, tx_i, shapeFunctionNaturalDerivatives);

            //
            for (int npoint = 0; npoint < nGaussPoints; npoint++)
            {
                //
                DGtr[npoint]       = J_0inv_hexa[npoint] * J_1[npoint];
                DefGradVec[npoint] = new double[9] {
                    DGtr[npoint][0, 0], DGtr[npoint][1, 1], DGtr[npoint][2, 2], DGtr[npoint][1, 0], DGtr[npoint][2, 1], DGtr[npoint][0, 2], DGtr[npoint][2, 0], DGtr[npoint][0, 1], DGtr[npoint][1, 2],
                };                                                                                                                                                                                                                         //MS
                ////
                //GL[npoint] = DGtr[npoint] * DGtr[npoint].Transpose();
                //for (int m = 0; m < 3; m++)
                //{
                //    GL[npoint][m, m] += -1;
                //}
                //GL[npoint].ScaleIntoThis(0.5);

                ////
                //for (int m = 0; m < 3; m++)
                //{
                //    GLvec[npoint][m] = GL[npoint][m, m];
                //}
                //GLvec[npoint][3] = 2 * GL[npoint][0, 1];
                //GLvec[npoint][4] = 2 * GL[npoint][1, 2];
                //GLvec[npoint][5] = 2 * GL[npoint][2, 0];
            }
        }
Пример #3
0
        private Matrix UpdateKmatrices(IElement element)
        {
            Matrix k_element = Matrix.CreateZero(24, 24);


            // initialization of matrices that are not cached currently
            double[][] integrCoeff_Spkvec = new double[nGaussPoints][];
            Matrix[]   BL = new Matrix[nGaussPoints];
            for (int gpoint = 0; gpoint < nGaussPoints; gpoint++)
            {
                integrCoeff_Spkvec[gpoint] = new double[6];
                BL[gpoint] = Matrix.CreateZero(6, 24);
            }
            Matrix ll2 = Matrix.CreateZero(8, 3);

            for (int m = 0; m < 8; m++)
            {
                for (int n = 0; n < 3; n++)
                {
                    ll2[m, n] = tu_i[m][n];
                }
            }
            IReadOnlyList <Matrix> shapeFunctionNaturalDerivatives;

            shapeFunctionNaturalDerivatives         = Interpolation.EvaluateNaturalGradientsAtGaussPoints(QuadratureForStiffness);
            (Matrix[] J_0inv_hexa, double[] detJ_0) = JacobianHexa8Reverse.GetJ_0invHexaAndDetJ_0(
                shapeFunctionNaturalDerivatives, element.Nodes, nGaussPoints);
            Matrix[] BL13_hexa;
            BL13_hexa = GetBL13Hexa(shapeFunctionNaturalDerivatives);
            Matrix[] BL11a_hexa;             // dimension: gpoints
            Matrix[] BL12_hexa;
            Matrix[] BL01_hexa;
            BL11a_hexa = GetBL11a_hexa(J_0inv_hexa);
            BL12_hexa  = GetBL12_hexa(J_0inv_hexa);
            BL01_hexa  = GetBL01_hexa(J_0inv_hexa);

            Matrix[] BL11             = new Matrix[nGaussPoints];
            Matrix[] BL1112sun01_hexa = new Matrix[nGaussPoints];
            for (int npoint = 0; npoint < nGaussPoints; npoint++)
            {
                BL11[npoint]             = Matrix.CreateZero(6, 9);
                BL1112sun01_hexa[npoint] = Matrix.CreateZero(6, 9);                 //TODO this may be unnescessary
            }



            for (int npoint = 0; npoint < nGaussPoints; npoint++)
            {
                //
                integrCoeff_Spkvec[npoint] = materialsAtGaussPoints[npoint].Stresses.Scale(integrationCoeffs[npoint]);

                //
                Matrix l_cyrcumflex = Matrix.CreateZero(3, 3);
                l_cyrcumflex = shapeFunctionNaturalDerivatives[npoint] * ll2;

                for (int m = 0; m < 6; m++)
                {
                    for (int n = 0; n < 3; n++)
                    {
                        for (int p = 0; p < 3; p++)
                        {
                            BL11[npoint][m, n]     += BL11a_hexa[npoint][m, p] * l_cyrcumflex[p, n];
                            BL11[npoint][m, 3 + n] += BL11a_hexa[npoint][m, 3 + p] * l_cyrcumflex[p, n];
                            BL11[npoint][m, 6 + n] += BL11a_hexa[npoint][m, 6 + p] * l_cyrcumflex[p, n];
                        }
                    }
                }

                //
                BL1112sun01_hexa[npoint] = BL11[npoint] * BL12_hexa[npoint];
                BL1112sun01_hexa[npoint].AddIntoThis(BL01_hexa[npoint]);

                //
                BL[npoint] = BL1112sun01_hexa[npoint] * BL13_hexa[npoint];
            }
            // TODO: BL and above calculations can cached from calculate forces method

            Matrix[] BNL1_hexa;
            Matrix[] BNL_hexa;
            BNL1_hexa = GetBNL1_hexa(J_0inv_hexa);
            BNL_hexa  = new Matrix[nGaussPoints];
            for (int gpoint = 0; gpoint < nGaussPoints; gpoint++)
            {
                BNL_hexa[gpoint] = Matrix.CreateZero(9, 24);                 //todo this may be unnescessary

                BNL_hexa[gpoint] = BNL1_hexa[gpoint] * BL13_hexa[gpoint];
            }


            Matrix[] integrCoeff_Spk = new Matrix[nGaussPoints];
            for (int npoint = 0; npoint < nGaussPoints; npoint++)
            {
                integrCoeff_Spk[npoint] = Matrix.CreateZero(3, 3);
            }

            Matrix[] kl_  = new Matrix[nGaussPoints + 1];
            Matrix[] knl_ = new Matrix[nGaussPoints + 1];
            for (int npoint = 0; npoint < nGaussPoints + 1; npoint++)
            {
                kl_[npoint]  = Matrix.CreateZero(24, 24);
                knl_[npoint] = Matrix.CreateZero(24, 24);
            }



            for (int npoint = 0; npoint < nGaussPoints; npoint++)
            {
                Matrix integrCoeff_SPK_epi_BNL_hexa = Matrix.CreateZero(9, 24);         //TODO
                Matrix integrCoeff_cons_disp        = Matrix.CreateZero(6, 6);          //TODO
                Matrix integrCoeff_cons_disp_epi_BL = Matrix.CreateZero(6, 24);         //TODO

                //
                integrCoeff_Spk[npoint][0, 0] = integrCoeff_Spkvec[npoint][0];
                integrCoeff_Spk[npoint][0, 1] = integrCoeff_Spkvec[npoint][3];
                integrCoeff_Spk[npoint][0, 2] = integrCoeff_Spkvec[npoint][5];
                integrCoeff_Spk[npoint][1, 0] = integrCoeff_Spkvec[npoint][3];
                integrCoeff_Spk[npoint][1, 1] = integrCoeff_Spkvec[npoint][1];
                integrCoeff_Spk[npoint][1, 2] = integrCoeff_Spkvec[npoint][4];
                integrCoeff_Spk[npoint][2, 0] = integrCoeff_Spkvec[npoint][5];
                integrCoeff_Spk[npoint][2, 1] = integrCoeff_Spkvec[npoint][4];
                integrCoeff_Spk[npoint][2, 2] = integrCoeff_Spkvec[npoint][2];

                //
                IMatrixView consDisp = materialsAtGaussPoints[npoint].ConstitutiveMatrix;

                for (int m = 0; m < 6; m++)
                {
                    for (int n = 0; n < 6; n++)
                    {
                        integrCoeff_cons_disp[m, n] = integrationCoeffs[npoint] * consDisp[m, n];
                    }
                }

                //
                integrCoeff_cons_disp_epi_BL = integrCoeff_cons_disp * BL[npoint];

                //
                kl_[npoint] = BL[npoint].Transpose() * integrCoeff_cons_disp_epi_BL;

                //
                for (int m = 0; m < 3; m++)                 // 3x24 dimensions
                {
                    for (int n = 0; n < 24; n++)
                    {
                        for (int p = 0; p < 3; p++)
                        {
                            integrCoeff_SPK_epi_BNL_hexa[m, n]     += integrCoeff_Spk[npoint][m, p] * BNL_hexa[npoint][p, n];
                            integrCoeff_SPK_epi_BNL_hexa[3 + m, n] += integrCoeff_Spk[npoint][m, p] * BNL_hexa[npoint][3 + p, n];
                            integrCoeff_SPK_epi_BNL_hexa[6 + m, n] += integrCoeff_Spk[npoint][m, p] * BNL_hexa[npoint][6 + p, n];
                        }
                    }
                }

                //
                knl_[npoint] = BNL_hexa[npoint].Transpose() * integrCoeff_SPK_epi_BNL_hexa;
            }

            // Add contributions of each gp on the total element stiffness matrix k_element
            for (int npoint = 0; npoint < nGaussPoints; npoint++)
            {
                for (int m = 0; m < 24; m++)
                {
                    for (int n = 0; n < 24; n++)
                    {
                        kl_[nGaussPoints][m, n]  += kl_[npoint][m, n];
                        knl_[nGaussPoints][m, n] += knl_[npoint][m, n];
                    }
                }
            }
            for (int m = 0; m < 24; m++)
            {
                for (int n = 0; n < 24; n++)
                {
                    k_element[m, n] = kl_[nGaussPoints][m, n] + knl_[nGaussPoints][m, n];
                }
            }

            return(k_element);
        }
Пример #4
0
        private double[] UpdateForces(IElement element)
        {
            //TODO: the gauss point loop should be the outer one

            // Matrices that are not currently cached are calculated here.
            Matrix ll2 = Matrix.CreateZero(8, 3);

            for (int m = 0; m < 8; m++)
            {
                for (int n = 0; n < 3; n++)
                {
                    ll2[m, n] = tu_i[m][n];
                }
            }
            IReadOnlyList <Matrix> shapeFunctionNaturalDerivatives;

            shapeFunctionNaturalDerivatives         = Interpolation.EvaluateNaturalGradientsAtGaussPoints(QuadratureForStiffness);
            (Matrix[] J_0inv_hexa, double[] detJ_0) = JacobianHexa8Reverse.GetJ_0invHexaAndDetJ_0(
                shapeFunctionNaturalDerivatives, element.Nodes, nGaussPoints);
            Matrix[] BL13_hexa;
            BL13_hexa = GetBL13Hexa(shapeFunctionNaturalDerivatives);
            Matrix[] BL11a_hexa;             // dimension number of gpoints
            Matrix[] BL12_hexa;
            Matrix[] BL01_hexa;
            BL11a_hexa = GetBL11a_hexa(J_0inv_hexa);
            BL12_hexa  = GetBL12_hexa(J_0inv_hexa);
            BL01_hexa  = GetBL01_hexa(J_0inv_hexa);

            //INITIALIZATION of MAtrixes that are currently not cached
            double[][] integrCoeff_Spkvec = new double[nGaussPoints][];
            Matrix[]   BL = new Matrix[nGaussPoints];
            for (int gpoint = 0; gpoint < nGaussPoints; gpoint++)
            {
                integrCoeff_Spkvec[gpoint] = new double[6];
                BL[gpoint] = Matrix.CreateZero(6, 24);
            }

            double[][] fxk1 = new double[nGaussPoints + 1][];
            for (int npoint = 0; npoint < nGaussPoints + 1; npoint++)
            {
                fxk1[npoint] = new double[24];
            }

            Matrix[] BL11             = new Matrix[nGaussPoints];
            Matrix[] BL1112sun01_hexa = new Matrix[nGaussPoints];
            for (int npoint = 0; npoint < nGaussPoints; npoint++)
            {
                BL11[npoint]             = Matrix.CreateZero(6, 9);
                BL1112sun01_hexa[npoint] = Matrix.CreateZero(6, 9);
            }

            for (int npoint = 0; npoint < nGaussPoints; npoint++)
            {
                integrCoeff_Spkvec[npoint] = materialsAtGaussPoints[npoint].Stresses.Scale(integrationCoeffs[npoint]);

                //
                Matrix l_cyrcumflex = Matrix.CreateZero(3, 3);
                l_cyrcumflex = shapeFunctionNaturalDerivatives[npoint] * ll2;

                for (int m = 0; m < 6; m++)
                {
                    for (int n = 0; n < 3; n++)
                    {
                        for (int p = 0; p < 3; p++)
                        {
                            BL11[npoint][m, n]     += BL11a_hexa[npoint][m, p] * l_cyrcumflex[p, n];
                            BL11[npoint][m, 3 + n] += BL11a_hexa[npoint][m, 3 + p] * l_cyrcumflex[p, n];
                            BL11[npoint][m, 6 + n] += BL11a_hexa[npoint][m, 6 + p] * l_cyrcumflex[p, n];
                        }
                    }
                }

                //
                BL1112sun01_hexa[npoint] = BL11[npoint] * BL12_hexa[npoint];
                BL1112sun01_hexa[npoint].AddIntoThis(BL01_hexa[npoint]);

                //
                BL[npoint] = BL1112sun01_hexa[npoint] * BL13_hexa[npoint];

                //
                fxk1[npoint] = BL[npoint].Multiply(integrCoeff_Spkvec[npoint], true);
            }

            for (int npoint = 0; npoint < nGaussPoints; npoint++)
            {
                fxk1[nGaussPoints].AddIntoThis(fxk1[npoint]);
            }

            return(fxk1[nGaussPoints]);
        }