private void ForwardCalculateThread_CalculateSeismicProfile(object obj)
        {
            Invoke(new EventHandler(() =>
            {
                DigitalModelProgressBar.Visible = true;
                DigitalModelProgressBar.Style   = ProgressBarStyle.Marquee;
                progressTip.Visible             = true;
                progressTip.Text = "正在计算...";
            }));
            double Nz = zedGraphControl.GraphPane.YAxis.Scale.Max - zedGraphControl.GraphPane.YAxis.Scale.Min;
            double Nx = zedGraphControl.GraphPane.XAxis.Scale.Max - zedGraphControl.GraphPane.XAxis.Scale.Min;

            SeismicProfileForm.DataChangeEventArgs args = obj as SeismicProfileForm.DataChangeEventArgs;
            float[,] record = new float[(int)Nx, args.Time];
            float[,] arr    = Gv;
            SeismicProfile algorithm = new SeismicProfile(args.Time, (int)Nx, (int)Nz, arr, zedGraphControl.GraphPane.CurveList);

            algorithm.Calculate();
            record = algorithm.Record;

            Invoke(new EventHandler(() =>
            {
                DigitalModelProgressBar.Visible = false;
                progressTip.Visible             = false;
                DigitalModelProgressBar.Style   = ProgressBarStyle.Blocks;
                if (record != null)
                {
                    OpenChartForm_CalculateSeismicProfile(record);
                }
            }));
        }
        private void TriButton_CalculateSeismicProfile(object obj)
        {
            Invoke(new EventHandler(() =>
            {
                DigitalModelProgressBar.Visible = true;
                DigitalModelProgressBar.Style   = ProgressBarStyle.Marquee;
                progressTip.Visible             = true;
                progressTip.Text = "正在计算...";
            }));
            double Nz = zedGraphControl.GraphPane.YAxis.Scale.Max - zedGraphControl.GraphPane.YAxis.Scale.Min;
            double Nx = zedGraphControl.GraphPane.XAxis.Scale.Max - zedGraphControl.GraphPane.XAxis.Scale.Min;

            SeismicProfileForm.DataChangeEventArgs args = obj as SeismicProfileForm.DataChangeEventArgs;
            float[,] record = new float[(int)Nx, args.Time];
            unsafe
            {
                float[,] arr = Gv;
                int row = arr.GetUpperBound(0) + 1;
                int col = arr.GetUpperBound(1) + 1;
                fixed(float *fp = arr)
                {
                    float *[] farr = new float *[row];
                    for (int i = 0; i < row; i++)
                    {
                        farr[i] = fp + i * col;
                    }

                    fixed(float **v = farr)
                    {
                        Algorithm algorithm = new Algorithm(args.Time, (int)Nx, (int)Nz, v);

                        algorithm.Calculate();
                        for (int i = 0; i < args.Time; i++)
                        {
                            for (int j = 0; j < Nx; j++)
                            {
                                record[j, i] = algorithm.Record[j][i];
                            }
                        }
                    }
                }
            }
            Invoke(new EventHandler(() =>
            {
                DigitalModelProgressBar.Visible = false;
                progressTip.Visible             = false;
                DigitalModelProgressBar.Style   = ProgressBarStyle.Blocks;
                if (record != null)
                {
                    TriButtonCalculateSeismicProfile(record);
                }
            }));
        }
        private void TriButton_CalculateSeismicProfile(object sender, SeismicProfileForm.DataChangeEventArgs args)
        {
            Thread thread = new Thread(TriButton_CalculateSeismicProfile)
            {
                IsBackground = true
            };

            thread.SetApartmentState(ApartmentState.STA);
            thread.Start(args);
            SeismicProfileForm forwardCalculationForm = (SeismicProfileForm)sender;

            forwardCalculationForm.Close();
        }