Ejemplo n.º 1
0
 /// <param name="S">Specification.</param>
 /// <param name="FT">Float type</param>
 /// <param name="fromOutsideRuntimeNamespace">When calling the function from outside the runtime namespace, set this param to true.</param>
 /// <returns>The name of the function used to compute the geometric product in real-time (depends only on the floating point type)</returns>
 public static string GetRuntimeComputeGpFuncName(G25.Specification S, G25.FloatType FT, bool fromOutsideRuntimeNamespace)
 {
     if (S.OutputCppOrC())
     {
         string prefix = "";
         if (fromOutsideRuntimeNamespace && (S.OutputCpp()))
             prefix = Main.RUNTIME_NAMESPACE + "::";
         return prefix + S.m_namespace + "_runtimeComputeGp_" + FT.type;
     }
     else if (S.OutputCSharp())
     {
         return "RuntimeComputeGp_" + FT.type;
     }
     else
     {
         return "runtimeComputeGp_" + FT.type;
     }
 }
Ejemplo n.º 2
0
 /// <param name="S">Specification.</param>
 /// <param name="M">Metric</param>
 /// <param name="g1">Input grade/group 1.</param>
 /// <param name="g2">Input grade/group 2.</param>
 /// <param name="gd">Destination grade/group.</param>
 /// <param name="fromOutsideRuntimeNamespace">When calling the function from outside the runtime namespace, set this param to true.</param>
 /// <returns>The name of the table which is used to compute <c>gd = g1 g2</c> using metric <c>M</c></returns>
 public static string GetRuntimeGpTableName(G25.Specification S, G25.Metric M, int g1, int g2, int gd, bool fromOutsideRuntimeNamespace)
 {
     if (S.OutputCppOrC())
     {
         string prefix = "";
         if (fromOutsideRuntimeNamespace && (S.OutputCpp()))
             prefix = Main.RUNTIME_NAMESPACE + "::";
         return prefix + S.m_namespace + "_runtimeGpProductTable_" + M.m_name + "_" + g1 + "_" + g2 + "_" + gd;
     }
     else
     {
         return "runtimeGpProductTable_" + M.m_name + "_" + g1 + "_" + g2 + "_" + gd;
     }
 }
Ejemplo n.º 3
0
        /// <param name="S"></param>
        /// <param name="FT"></param>
        /// <param name="M"></param>
        /// <param name="d">1 -> generate dual, d = 0 -> generate undual</param>
        /// <param name="g1"></param>
        /// <param name="gd"></param>
        /// <param name="name1"></param>
        /// <param name="name2"></param>
        /// <param name="name3"></param>
        /// <returns>The code to compute a (un)dual at runtime using the geometric product tables.</returns>
        public static string GetRuntimeDualCode(G25.Specification S, G25.FloatType FT, G25.Metric M, 
            int d, int g1, int gd,
            string name1, string name2, string name3)
        {
            // get pseudoscalar
            RefGA.Multivector I = RefGA.Multivector.GetPseudoscalar(S.m_dimension);
            if (d == 1) // if dual: use inverse I
                I = RefGA.Multivector.VersorInverse(I, M.m_metric);

            // get grade/group of pseudoscalar in GMV
            int g2 = S.m_GMV.GetGroupIdx(I.BasisBlades[0]);

            // get sign of pseudo scalar basis blade in GMV:
            double IbladeSign = S.m_GMV.Group(g2)[0].scale;

            string tmpArrayCode;
            if (S.OutputCppOrC())
                tmpArrayCode = "\t" + FT.type + " " + name2 + "[1] = {" + FT.DoubleToString(S, IbladeSign * I.BasisBlades[0].scale) + "};\n";
            else tmpArrayCode = "\t\t" + FT.type + "[] " + name2 + " = new " + FT.type + "[]{" + FT.DoubleToString(S, IbladeSign * I.BasisBlades[0].scale) + "};\n\t";

            return
                tmpArrayCode +
                "\t" + GPparts.GetGPpartFunctionName(S, FT, M, g1, g2, gd) + "(" + name1 + ", " + name2 + ", " + name3 + ");\n";
        }