private void GenerateGlobalMatrix()
        {
            int length = nodes.Count * DEGREES_OF_FREEDOM;

            //MemoryMatrix.Init(ref globalMatrix, length);

            //globalMatrix = new Dictionary<int, IntPtr>(length);
            //for (int i = 0; i < length; i++)
            //{
            //    globalMatrix.Add(i, Marshal.AllocHGlobal(sizeof(double) * length));
            //    //globalMatrix.Add(i, Marshal.AllocCoTaskMem(sizeof(double) * length));
            //}

            Dictionary <int, double[]> dictionary = new Dictionary <int, double[]>(length);

            for (int i = 0; i < length; i++)
            {
                dictionary.Add(i, new double[length]);
                //globalMatrix.Add(i, Marshal.AllocCoTaskMem(sizeof(double) * length));
            }

            for (int i = 0; i < length; i++)
            {
                for (int j = 0; j < length; j++)
                {
                    MemoryMatrix.SetDoubleValue(ref globalMatrix, i, j, 0);
                }
            }

            foreach (var element in tetrahedrons)
            {
                double[,] k = GenerateLocalK(element);

                for (int si = 0; si < element.Nodes.Count; si++)
                {
                    for (int sj = 0; sj < element.Nodes.Count; sj++)
                    {
                        for (int ki = 0; ki < DEGREES_OF_FREEDOM; ki++)
                        {
                            for (int kj = 0; kj < DEGREES_OF_FREEDOM; kj++)
                            {
                                int gSi  = element.Nodes[si].GlobalIndex;
                                int gSj  = element.Nodes[sj].GlobalIndex;
                                int gI   = gSi * DEGREES_OF_FREEDOM + ki;
                                int gJ   = gSj * DEGREES_OF_FREEDOM + kj;
                                int locI = si * DEGREES_OF_FREEDOM + ki;
                                int locJ = sj * DEGREES_OF_FREEDOM + kj;

                                double tmp = MemoryMatrix.GetDoubleValue(ref globalMatrix, gI, gJ);
                                MemoryMatrix.SetDoubleValue(ref globalMatrix, gI, gJ, tmp + k[locI, locJ]);
                            }
                        }
                    }
                }
            }
        }
예제 #2
0
        private void GenerateGlobalMatrix()
        {
            int length = nodes.Count * DEGREES_OF_FREEDOM;

            ulong size = sizeof(double) * (ulong)length * (ulong)length;

            MemoryMatrix.Init(ref globalMatrix, size);

            for (int i = 0; i < length; i++)
            {
                for (int j = 0; j < length; j++)
                {
                    //MemoryMatrix.SetDoubleValue(ref globalMatrix, i * length + j, 0);
                    MemoryMatrix.SetDoubleValue(ref globalMatrix, i, j, length, 0);
                }
            }

            foreach (var element in tetrahedrons)
            {
                double[,] k = GenerateLocalK(element);

                for (int si = 0; si < element.Nodes.Count; si++)
                {
                    for (int sj = 0; sj < element.Nodes.Count; sj++)
                    {
                        for (int ki = 0; ki < DEGREES_OF_FREEDOM; ki++)
                        {
                            for (int kj = 0; kj < DEGREES_OF_FREEDOM; kj++)
                            {
                                int gSi  = element.Nodes[si].GlobalIndex;
                                int gSj  = element.Nodes[sj].GlobalIndex;
                                int gI   = gSi * DEGREES_OF_FREEDOM + ki;
                                int gJ   = gSj * DEGREES_OF_FREEDOM + kj;
                                int locI = si * DEGREES_OF_FREEDOM + ki;
                                int locJ = sj * DEGREES_OF_FREEDOM + kj;

                                //double tmp = MemoryMatrix.GetDoubleValue(ref globalMatrix, gI * length + gJ);
                                //MemoryMatrix.SetDoubleValue(ref globalMatrix, gI * length + gJ, tmp + k[locI, locJ]);

                                double tmp = MemoryMatrix.GetDoubleValue(ref globalMatrix, gI, gJ, length);
                                MemoryMatrix.SetDoubleValue(ref globalMatrix, gI, gJ, length, tmp + k[locI, locJ]);
                            }
                        }
                    }
                }
            }
        }