コード例 #1
0
ファイル: GMesh.cs プロジェクト: msruzy/Gmsh.Net
        public void GetElements(out ElementTypes[] elementTypes, out long[][] elementTags, out long[][] nodeTags, int dim = -1, int tag = -1)
        {
            IntPtr api_elementTypesPtr = IntPtr.Zero;

            IntPtr api_elementTagsPtr   = IntPtr.Zero;
            IntPtr api_elementTags_nPtr = IntPtr.Zero;

            IntPtr api_nodeTags_Ptr  = IntPtr.Zero;
            IntPtr api_nodeTags_nPtr = IntPtr.Zero;

            ulong api_api_elementTypes_n = 0;
            ulong api_elementTags_nn     = 0;
            ulong api_nodeTags_nn        = 0;

            GMshNativeMethods.gmshModelMeshGetElements(ref api_elementTypesPtr, ref api_api_elementTypes_n, ref api_elementTagsPtr, ref api_elementTags_nPtr, ref api_elementTags_nn, ref api_nodeTags_Ptr, ref api_nodeTags_nPtr, ref api_nodeTags_nn, dim, tag, ref ierr);
            if (ierr != 0)
            {
                throw new GMshException(ierr);
            }

            int[] elementTypesInt = new int[api_api_elementTypes_n];
            if (api_api_elementTypes_n != 0)
            {
                Marshal.Copy(api_elementTypesPtr, elementTypesInt, 0, api_api_elementTypes_n.Toint());
            }
            elementTypes = elementTypesInt.Select(e => (ElementTypes)e).ToArray();

            api_elementTypesPtr.GmshFree();

            long[] api_elementTags_n = new long[api_elementTags_nn];
            elementTags = new long[api_elementTags_nn][];
            if (api_elementTags_nn != 0)
            {
                var n = api_elementTags_nn.Toint();
                Marshal.Copy(api_elementTags_nPtr, api_elementTags_n, 0, n);

                IntPtr[] ptrs = new IntPtr[api_elementTags_nn];
                Marshal.Copy(api_elementTagsPtr, ptrs, 0, n);

                for (int i = 0; i < ptrs.Length; i++)
                {
                    long[] ss = new long[api_elementTags_n[i]];
                    Marshal.Copy(ptrs[i], ss, 0, api_elementTags_n[i].Toint());
                    elementTags[i] = ss;

                    ptrs[i].GmshFree();
                }
            }
            api_elementTagsPtr.GmshFree();
            api_elementTags_nPtr.GmshFree();

            long[] api_nodeTags_n = new long[api_nodeTags_nn];
            nodeTags = new long[api_nodeTags_nn][];
            if (api_nodeTags_nn != 0)
            {
                var n = api_nodeTags_nn.Toint();
                Marshal.Copy(api_nodeTags_nPtr, api_nodeTags_n, 0, n);

                IntPtr[] ptrs = new IntPtr[api_nodeTags_nn];
                Marshal.Copy(api_nodeTags_Ptr, ptrs, 0, n);

                for (int i = 0; i < ptrs.Length; i++)
                {
                    long[] ss = new long[api_nodeTags_n[i]];
                    Marshal.Copy(ptrs[i], ss, 0, api_nodeTags_n[i].Toint());
                    nodeTags[i] = ss;
                    ptrs[i].GmshFree();
                }
            }
            api_nodeTags_Ptr.GmshFree();
            api_nodeTags_nPtr.GmshFree();
        }