/// <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; } }
/// <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; } }
/// <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"; }