public void SpherePolarManifold2()
        {
            Variable         R           = new Variable("R");
            Variable         theta       = new Variable("theta");
            Variable         phi         = new Variable("phi");
            Vector2VariableU coordinates = new Vector2VariableU(theta, phi);
            Matrix2LL        metric      = new Matrix2LL(Functions.Pow(R, 2), Functions.Pow(R * Functions.Sin(theta), 2));
            Manifold2        manifold    = new Manifold2(metric, coordinates.Del);

            Func <int, int, int, Symbol> christoffelSymbols = (i, j, k) =>
            {
                switch ((i << 16) + (j << 8) + k)
                {
                case 0x00000101:
                    return(-Functions.Sin(theta) * Functions.Cos(theta));

                case 0x00010001:
                    return(Functions.Cos(theta) / Functions.Sin(theta));
                }
                return(Symbol.Zero);
            };

            Func <int, int, int, int, Symbol> riemannTensor = (i, j, k, l) =>
            {
                switch ((i << 24) + (j << 16) + (k << 8) + l)
                {
                case 0x00010001:
                    return(Functions.Pow(Functions.Sin(theta), 2));

                case 0x01000001:
                    return(-Symbol.One);
                }

                return(Symbol.Zero);
            };

            Func <int, int, Symbol> ricciTensor = (i, j) =>
            {
                switch ((i << 8) + j)
                {
                case 0x00000000:
                    return(Symbol.One);

                case 0x00000101:
                    return(Functions.Pow(Functions.Sin(theta), 2));
                }
                return(Symbol.Zero);
            };

            ManifoldTests.TestManifold(manifold, christoffelSymbols, riemannTensor, ricciTensor, 2 * Functions.Pow(R, -2));
        }
        public void PlanePolarManifold2()
        {
            Variable         r           = new Variable("r");
            Variable         theta       = new Variable("theta");
            Vector2VariableU coordinates = new Vector2VariableU(r, theta);
            Matrix2LL        metric      = new Matrix2LL(Symbol.One, Functions.Pow(r, 2));
            Manifold2        manifold    = new Manifold2(metric, coordinates.Del);

            Func <int, int, int, Symbol> christoffelSymbols = (i, j, k) => {
                switch ((i << 16) + (j << 8) + k)
                {
                case 0x00000101:
                    return(-r);

                case 0x00010001:
                    return(1 / r);
                }
                return(Symbol.Zero);
            };

            ManifoldTests.TestManifold(manifold, christoffelSymbols, (i, j, k, l) => Symbol.Zero, (i, j) => Symbol.Zero, Symbol.Zero);
        }