Пример #1
0
//C++ TO C# CONVERTER WARNING: 'const' methods are not available in C#:
//ORIGINAL LINE: virtual double FuncDeriv(const Vector & x, const Vector & dir, double & deriv) const
        public override double FuncDeriv(Vector x, Vector dir, ref double deriv)
        {
            // from 2d:

            int       j;
            int       k;
            int       lpi;
            int       gpi;
            Vec <3>   n, vgrad;
            Point <3> pp1;
            Vec2d     g1   = new Vec2d();
            Vec2d     vdir = new Vec2d();
            double    badness;
            double    hbad;
            double    hderiv;

            vgrad   = 0;
            badness = 0;

            ld.meshthis.GetNormalVector(ld.surfi, ld.sp1, ld.gi1, n);

            // pp1 = sp1;
            //    pp1.Add2 (x.Get(1), t1, x.Get(2), t2);
            pp1 = ld.sp1 + x(0) * ld.t1.functorMethod + x(1) * ld.t2.functorMethod;

//C++ TO C# CONVERTER NOTE: This static local variable declaration (not allowed in C#) has been moved just prior to the method:
//	  static Array<Point2d> pts2d;
            FuncDeriv_pts2d.SetSize(mesh.GetNP());

            deriv = 0;

            for (j = 1; j <= ld.locelements.Size(); j++)
            {
                lpi = ld.locrots.Get(j);
                Element2d bel = mesh[ld.locelements.Get(j)];

                gpi = bel.PNum(lpi);

                for (k = 1; k <= bel.GetNP(); k++)
                {
                    PointIndex pi = bel.PNum(k);
                    FuncDeriv_pts2d.Elem(pi) = new Point2d(ld.t1.functorMethod * (new mesh.Point(pi) - ld.sp1), ld.t2.functorMethod * (new mesh.Point(pi) - ld.sp1));
                }
                FuncDeriv_pts2d.Elem(gpi) = new Point2d(x(0), x(1));


                vdir = new Vec2d(dir(0), dir(1));

                hbad = bel.CalcJacobianBadnessDirDeriv(FuncDeriv_pts2d, lpi, vdir, ref hderiv);

                deriv   += hderiv;
                badness += hbad;
            }


            return(badness);
        }
Пример #2
0
//C++ TO C# CONVERTER WARNING: 'const' methods are not available in C#:
//ORIGINAL LINE: virtual double FuncGrad(const Vector & x, Vector & grad) const
        public override double FuncGrad(Vector x, ref Vector grad)
        {
            // from 2d:

            int       lpi;
            int       gpi;
            Vec <3>   n, vgrad;
            Point <3> pp1;
            Vec2d     g1   = new Vec2d();
            Vec2d     vdir = new Vec2d();
            double    badness;
            double    hbad;
            double    hderiv;

            vgrad   = 0;
            badness = 0;

            ld.meshthis.GetNormalVector(ld.surfi, ld.sp1, ld.gi1, n);

            pp1 = ld.sp1 + x(0) * ld.t1.functorMethod + x(1) * ld.t2.functorMethod;

            //  meshthis -> ProjectPoint (surfi, pp1);
            //  meshthis -> GetNormalVector (surfi, pp1, n);

//C++ TO C# CONVERTER NOTE: This static local variable declaration (not allowed in C#) has been moved just prior to the method:
//	  static Array<Point2d> pts2d;
            FuncGrad_pts2d.SetSize(mesh.GetNP());

            grad = 0;

            for (int j = 1; j <= ld.locelements.Size(); j++)
            {
                lpi = ld.locrots.Get(j);
                Element2d bel = mesh[ld.locelements.Get(j)];

                gpi = bel.PNum(lpi);

                for (int k = 1; k <= bel.GetNP(); k++)
                {
                    PointIndex pi = bel.PNum(k);
                    FuncGrad_pts2d.Elem(pi) = new Point2d(ld.t1.functorMethod * (new mesh.Point(pi) - ld.sp1), ld.t2.functorMethod * (new mesh.Point(pi) - ld.sp1));
                }
                FuncGrad_pts2d.Elem(gpi) = new Point2d(x(0), x(1));


                for (int k = 1; k <= 2; k++)
                {
                    if (k == 1)
                    {
                        vdir = new Vec2d(1, 0);
                    }
                    else
                    {
                        vdir = new Vec2d(0, 1);
                    }

                    hbad = bel.CalcJacobianBadnessDirDeriv(FuncGrad_pts2d, lpi, vdir, ref hderiv);

                    grad(k - 1) += hderiv;
                    if (k == 1)
                    {
                        badness += hbad;
                    }
                }
            }


            /*
             * vgrad.Add (-(vgrad * n), n);
             *
             * grad.Elem(1) = vgrad * t1;
             * grad.Elem(2) = vgrad * t2;
             */
            return(badness);
        }