aboutsummaryrefslogtreecommitdiff
path: root/src/gr.cg
diff options
context:
space:
mode:
authorjthorn <jthorn@f88db872-0e4f-0410-b76b-b9085cfa78c5>2002-09-16 18:09:06 +0000
committerjthorn <jthorn@f88db872-0e4f-0410-b76b-b9085cfa78c5>2002-09-16 18:09:06 +0000
commit93ba52d99144d33f182d723bdd411d527af7b042 (patch)
treee4ba341d96daace5915b9cfba0296c2de69a250a /src/gr.cg
parentb732b6e17361c6099502b10c0cdf7a9315cf8435 (diff)
add files I forgot to checkin to cvs before :)
git-svn-id: http://svn.einsteintoolkit.org/cactus/EinsteinAnalysis/AHFinderDirect/trunk@751 f88db872-0e4f-0410-b76b-b9085cfa78c5
Diffstat (limited to 'src/gr.cg')
-rw-r--r--src/gr.cg/extrinsic_curvature_trace_raise.c48
-rw-r--r--src/gr.cg/horizon_Jacobian.c626
-rw-r--r--src/gr.cg/horizon_function.c184
-rw-r--r--src/gr.cg/inverse_metric.c25
-rw-r--r--src/gr.cg/inverse_metric_gradient.c91
-rw-r--r--src/gr.cg/metric_det_gradient.c24
6 files changed, 998 insertions, 0 deletions
diff --git a/src/gr.cg/extrinsic_curvature_trace_raise.c b/src/gr.cg/extrinsic_curvature_trace_raise.c
new file mode 100644
index 0000000..b85e441
--- /dev/null
+++ b/src/gr.cg/extrinsic_curvature_trace_raise.c
@@ -0,0 +1,48 @@
+/*
+ * inputs = {K_dd, g_uu}
+ * outputs = {K_uu, K}
+ * cost = 37*assignments+44*additions+84*multiplications
+ */
+fp t1, t2, t4, t5, t8, t9, t12, t13, t15, t16;
+fp t19, t20, t22, t24, t27, t30, t32, t35, t42, t44;
+fp t46, t48, t50, t60, t62, t69, t71, t74, t85, t95;
+ t1 = g_uu_11;
+ t2 = K_dd_11;
+ t4 = g_uu_12;
+ t5 = K_dd_12;
+ t8 = g_uu_13;
+ t9 = K_dd_13;
+ t12 = g_uu_22;
+ t13 = K_dd_22;
+ t15 = g_uu_23;
+ t16 = K_dd_23;
+ t19 = g_uu_33;
+ t20 = K_dd_33;
+ K = t1*t2+2.0*t4*t5+2.0*t8*t9+t12*t13+2.0*t15*t16+t19*t20;
+ t22 = t1*t1;
+ t24 = t4*t1;
+ t27 = t8*t1;
+ t30 = t4*t4;
+ t32 = t8*t4;
+ t35 = t8*t8;
+ K_uu_11 = t22*t2+2.0*t24*t5+2.0*t27*t9+t30*t13+2.0*t32*t16+t35*t20;
+ t42 = t4*t12;
+ t44 = t8*t12;
+ t46 = t1*t15;
+ t48 = t15*t4;
+ t50 = t8*t15;
+ K_uu_12 = t24*t2+t30*t5+t32*t9+t1*t12*t5+t42*t13+t44*t16+t46*t9+t48*t16+
+t50*t20;
+ t60 = t4*t19;
+ t62 = t8*t19;
+ K_uu_13 = t27*t2+t32*t5+t35*t9+t46*t5+t48*t13+t50*t16+t1*t19*t9+t60*t16+
+t62*t20;
+ t69 = t12*t12;
+ t71 = t15*t12;
+ t74 = t15*t15;
+ K_uu_22 = t30*t2+2.0*t42*t5+2.0*t48*t9+t69*t13+2.0*t71*t16+t74*t20;
+ t85 = t15*t19;
+ K_uu_23 = t32*t2+t44*t5+t50*t9+t48*t5+t71*t13+t74*t16+t60*t9+t12*t19*t16+
+t85*t20;
+ t95 = t19*t19;
+ K_uu_33 = t35*t2+2.0*t50*t5+2.0*t62*t9+t74*t13+2.0*t85*t16+t95*t20;
diff --git a/src/gr.cg/horizon_Jacobian.c b/src/gr.cg/horizon_Jacobian.c
new file mode 100644
index 0000000..3d540e1
--- /dev/null
+++ b/src/gr.cg/horizon_Jacobian.c
@@ -0,0 +1,626 @@
+/*
+ * inputs = {r, partial_d_ln_sqrt_g, partial_d_g_uu, X_ud, X_udd, g_uu, K_uu, h, HA, HB, HC, HD}
+ * outputs = {partial_H_wrt_partial_d_h, partial_H_wrt_partial_dd_h}
+ * cost = 457*assignments+10*divisions+7*functions+1708*multiplications+729*additions
+ */
+fp t1, t2, t4, t5, t7, t8, t10, t11, t12, t14;
+fp t16, t18, t19, t20, t21, t24, t26, t28, t30, t31;
+fp t32, t33, t34, t36, t38, t41, t43, t44, t46, t47;
+fp t50, t51, t53, t54, t57, t58, t61, t63, t67, t69;
+fp t73, t74, t77, t78, t79, t81, t82, t83, t84, t87;
+fp t89, t91, t93, t96, t98, t102, t103, t104, t105, t107;
+fp t108, t109, t112, t113, t116, t117, t118, t122, t123, t124;
+fp t130, t134, t136, t138, t141, t143, t147, t148, t149, t151;
+fp t154, t155, t156, t159, t160, t161, t164, t168, t172, t174;
+fp t178, t179, t182, t183, t184, t187, t188, t189, t192, t193;
+fp t194, t197, t198, t201, t203, t207, t208, t209, t212, t217;
+fp t218, t221, t223, t224, t226, t227, t228, t232, t236, t240;
+fp t241, t245, t246, t247, t250, t251, t253, t255, t256, t259;
+fp t260, t264, t268, t269, t272, t274, t275, t277, t280, t281;
+fp t287, t288, t292, t293, t297, t300, t304, t305, t306, t310;
+fp t311, t314, t317, t324, t327, t329, t330, t338, t340, t343;
+fp t344, t345, t349, t350, t359, t363, t365, t369, t373, t376;
+fp t383, t386, t393, t397, t398, t401, t404, t405, t407, t411;
+fp t415, t419, t423, t429, t430, t433, t435, t438, t441, t442;
+fp t445, t448, t449, t454, t457, t460, t465, t470, t472, t473;
+fp t476, t479, t488, t489, t491, t501, t502, t504, t506, t507;
+fp t508, t510, t514, t519, t520, t522, t523, t530, t531, t535;
+fp t539, t540, t543, t551, t552, t553, t559, t562, t570, t572;
+fp t573, t575, t578, t582, t584, t589, t602, t612, t615, t616;
+fp t617, t621, t624, t639, t640, t642, t647, t654, t665, t687;
+fp t688, t692, t695, t697, t699, t707, t710, t714, t717, t722;
+fp t724, t726, t745, t752, t754, t764, t773, t784, t789, t791;
+fp t796, t800, t801, t803, t804, t806, t807, t809, t811, t813;
+fp t815, t817, t819, t821, t823, t826, t828, t831, t833, t836;
+fp t839, t841, t844, t847, t851, t864, t873, t876, t879, t882;
+fp t884, t889, t893, t901, t908, t914, t918, t921, t922, t925;
+fp t935, t943, t947, t953, t955, t958, t968, t972, t981, t985;
+fp t988, t989, t992, t1002, t1008, t1017, t1020, t1028, t1047, t1050;
+fp t1062, t1065, t1067, t1070, t1078, t1081, t1082, t1084, t1086, t1088;
+fp t1095, t1098, t1100, t1106, t1136, t1137, t1138, t1148, t1165, t1170;
+fp t1197, t1205, t1221, t1225, t1227, t1234, t1240, t1253, t1255, t1257;
+fp t1260, t1266, t1269, t1271, t1295, t1302, t1308, t1311, t1322, t1326;
+fp t1331, t1337, t1345, t1352, t1354, t1360, t1362, t1373, t1375, t1386;
+fp t1394, t1410, t1419, t1432, t1466, t1469, t1472, t1473, t1474, t1477;
+fp t1478, t1485, t1486, t1487, t1490, t1491, t1495, t1498, t1501, t1502;
+fp t1511, t1517, t1520, t1523, t1526, t1529, t1532, t1534, t1539, t1557;
+fp t1560, t1573, t1576, t1582, t1585, t1597, t1598, t1603, t1606, t1607;
+fp t1609, t1616, t1619, t1621, t1633, t1634, t1639, t1651, t1654, t1659;
+fp t1660, t1663, t1669, t1680, t1692, t1726, t1737, t1741, t1744, t1747;
+fp t1756, t1762, t1763, t1766, t1769, t1772, t1778, t1793, t1795, t1800;
+fp t1818, t1842;
+ t1 = g_uu_12;
+ t2 = 1/r;
+ t4 = X_ud_12;
+ t5 = PARTIAL_RHO(h);
+ t7 = X_ud_22;
+ t8 = PARTIAL_SIGMA(h);
+ t10 = yy*t2-t4*t5-t7*t8;
+ t11 = t1*t10;
+ t12 = g_uu_11;
+ t14 = X_ud_11;
+ t16 = X_ud_21;
+ t18 = xx*t2-t14*t5-t16*t8;
+ t19 = t12*t18;
+ t20 = X_udd_111;
+ t21 = t19*t20;
+ t24 = g_uu_13;
+ t26 = X_ud_13;
+ t28 = X_ud_23;
+ t30 = zz*t2-t26*t5-t28*t8;
+ t31 = t24*t30;
+ t32 = t12*t14;
+ t33 = yy*yy;
+ t34 = zz*zz;
+ t36 = r*r;
+ t38 = 1/t36/r;
+ t41 = X_udd_211;
+ t43 = t14*t14;
+ t44 = PARTIAL_RHO_RHO(h);
+ t46 = t16*t14;
+ t47 = PARTIAL_RHO_SIGMA(h);
+ t50 = t16*t16;
+ t51 = PARTIAL_SIGMA_SIGMA(h);
+ t53 = (t33+t34)*t38-t20*t5-t41*t8-t43*t44-2.0*t46*t47-t50*t51;
+ t54 = t32*t53;
+ t57 = g_uu_23;
+ t58 = t57*t10;
+ t61 = X_udd_113;
+ t63 = X_udd_213;
+ t67 = t16*t26;
+ t69 = t14*t28;
+ t73 = -xx*zz*t38-t61*t5-t63*t8-t14*t26*t44-t67*t47-t69*t47-t16*t28*t51;
+ t74 = t32*t73;
+ t77 = t1*t1;
+ t78 = t10*t10;
+ t79 = t77*t78;
+ t81 = t57*t30;
+ t82 = g_uu_22;
+ t83 = t82*t4;
+ t84 = xx*xx;
+ t87 = X_udd_122;
+ t89 = X_udd_222;
+ t91 = t4*t4;
+ t93 = t7*t4;
+ t96 = t7*t7;
+ t98 = (t84+t34)*t38-t87*t5-t89*t8-t91*t44-2.0*t93*t47-t96*t51;
+ t102 = t1*t18;
+ t103 = partial_d_g_uu_223;
+ t104 = t103*t26;
+ t105 = t104*t10;
+ t107 = t82*t10;
+ t108 = X_udd_112;
+ t109 = t19*t108;
+ t112 = t57*t26;
+ t113 = t107*t98;
+ t116 = g_uu_33;
+ t117 = t116*t30;
+ t118 = X_udd_133;
+ t122 = t1*t4;
+ t123 = t24*t18;
+ t124 = t123*t73;
+ t130 = t57*t4;
+ t134 = X_udd_233;
+ t136 = t26*t26;
+ t138 = t28*t26;
+ t141 = t28*t28;
+ t143 = (t84+t33)*t38-t118*t5-t134*t8-t136*t44-2.0*t138*t47-t141*t51;
+ t147 = partial_d_g_uu_112;
+ t148 = t147*t4;
+ t149 = t148*t18;
+ t151 = t19*t53;
+ t154 = 2.0*t11*t21+2.0*t31*t54+2.0*t58*t74+t79*t20+2.0*t81*t83*t98+t102*
+t105+2.0*t107*t109+2.0*t112*t113+2.0*t117*t58*t118+2.0*t122*t124+2.0*t81*t107*
+t87+2.0*t117*t130*t143+t31*t149+2.0*t122*t151;
+ t155 = X_udd_123;
+ t156 = t102*t155;
+ t159 = partial_d_g_uu_213;
+ t160 = t159*t30;
+ t161 = t160*t14;
+ t164 = t1*t14;
+ t168 = X_udd_223;
+ t172 = t7*t26;
+ t174 = t4*t28;
+ t178 = -yy*zz*t38-t155*t5-t168*t8-t4*t26*t44-t172*t47-t174*t47-t7*t28*t51
+;
+ t179 = t164*t178;
+ t182 = partial_d_g_uu_113;
+ t183 = t182*t30;
+ t184 = t183*t14;
+ t187 = partial_d_g_uu_133;
+ t188 = t187*t30;
+ t189 = t188*t26;
+ t192 = partial_d_g_uu_313;
+ t193 = t192*t30;
+ t194 = t193*t14;
+ t197 = partial_d_g_uu_222;
+ t198 = t197*t78;
+ t201 = partial_d_g_uu_312;
+ t203 = t201*t18*t4;
+ t207 = partial_d_g_uu_233;
+ t208 = t30*t30;
+ t209 = t207*t208;
+ t212 = t187*t208;
+ t217 = t116*t26;
+ t218 = t107*t178;
+ t221 = 2.0*t58*t156+2.0*t102*t161+2.0*t58*t179+2.0*t19*t184+t19*t189+t11*
+t184+2.0*t123*t194+RATIONAL(1.0,2.0)*t112*t198+2.0*t58*t203+t11*t189+RATIONAL(
+1.0,2.0)*t83*t209+RATIONAL(1.0,2.0)*t32*t212+RATIONAL(1.0,2.0)*t122*t212+2.0*
+t217*t218;
+ t223 = t201*t10;
+ t224 = t223*t18;
+ t226 = partial_d_g_uu_212;
+ t227 = t226*t10;
+ t228 = t227*t14;
+ t232 = t77*t10;
+ t236 = t77*t18;
+ t240 = t24*t24;
+ t241 = t240*t18;
+ t245 = t24*t26;
+ t246 = partial_d_g_uu_122;
+ t247 = t246*t78;
+ t250 = t192*t26;
+ t251 = t250*t18;
+ t253 = t82*t78;
+ t255 = t1*t78;
+ t256 = partial_d_g_uu_123;
+ t259 = t57*t57;
+ t260 = t259*t10;
+ t264 = t57*t208;
+ t268 = t147*t10;
+ t269 = t268*t14;
+ t272 = t223*t14;
+ t274 = t217*t224+2.0*t102*t228+t117*t203+2.0*t232*t53*t4+2.0*t236*t98*t14
++2.0*t241*t143*t14+RATIONAL(1.0,2.0)*t245*t247+t58*t251+t253*t104+t255*t256*t26
++2.0*t260*t143*t4+2.0*t264*t24*t108+2.0*t19*t269+t117*t272;
+ t275 = partial_d_g_uu_323;
+ t277 = t275*t10*t26;
+ t280 = t182*t26;
+ t281 = t280*t18;
+ t287 = t12*t12;
+ t288 = t287*t18;
+ t292 = t82*t178;
+ t293 = t292*t4;
+ t297 = t10*t178;
+ t300 = t259*t30;
+ t304 = partial_d_g_uu_111;
+ t305 = t304*t18;
+ t306 = t305*t14;
+ t310 = t226*t4;
+ t311 = t310*t18;
+ t314 = t159*t18*t26;
+ t317 = t240*t30;
+ t324 = 2.0*t117*t277+t11*t281+RATIONAL(3.0,2.0)*t255*t246*t4+t81*t228+2.0
+*t288*t53*t14+4.0*t58*t293+2.0*t259*t26*t297+2.0*t300*t10*t155+t11*t306+2.0*
+t117*t293+t81*t311+2.0*t81*t314+2.0*t317*t18*t61+2.0*t11*t123*t61;
+ t327 = t259*t78;
+ t329 = partial_d_g_uu_322;
+ t330 = t329*t78;
+ t338 = t183*t18;
+ t340 = t123*t155;
+ t343 = t18*t18;
+ t344 = t24*t343;
+ t345 = partial_d_g_uu_311;
+ t349 = partial_d_g_uu_333;
+ t350 = t349*t208;
+ t359 = X_udd_212;
+ t363 = t16*t4;
+ t365 = t14*t7;
+ t369 = -xx*yy*t38-t108*t5-t359*t8-t14*t4*t44-t363*t47-t365*t47-t16*t7*t51
+;
+ t373 = t123*t178;
+ t376 = t1*t343;
+ t383 = t18*t73;
+ t386 = t327*t118+RATIONAL(1.0,2.0)*t217*t330+2.0*t317*t14*t73+2.0*t117*
+t251+t122*t338+2.0*t107*t340+RATIONAL(3.0,2.0)*t344*t345*t14+RATIONAL(1.0,2.0)*
+t130*t350+2.0*t117*t107*t155+2.0*t232*t14*t369+2.0*t83*t373+2.0*t376*t12*t108+
+2.0*t31*t281+2.0*t240*t26*t383;
+ t393 = t24*t14;
+ t397 = t116*t208;
+ t398 = t24*t61;
+ t401 = t19*t61;
+ t404 = t349*t30;
+ t405 = t404*t26;
+ t407 = t24*t369;
+ t411 = t123*t143;
+ t415 = t24*t73;
+ t419 = t107*t369;
+ t423 = t18*t369;
+ t429 = t256*t10;
+ t430 = t429*t26;
+ t433 = 2.0*t232*t18*t108+RATIONAL(3.0,2.0)*t264*t207*t26+2.0*t11*t393*t73
++2.0*t397*t398+2.0*t117*t401+t123*t405+4.0*t81*t407*t26+2.0*t130*t411+t58*t194+
+4.0*t117*t415*t26+2.0*t245*t419+2.0*t77*t4*t423+2.0*t300*t4*t178+2.0*t31*t430;
+ t435 = t393*t143;
+ t438 = t11*t369;
+ t441 = t1*t369;
+ t442 = t441*t4;
+ t445 = t393*t178;
+ t448 = t207*t30;
+ t449 = t448*t26;
+ t454 = t123*t118;
+ t457 = t19*t73;
+ t460 = t11*t73;
+ t465 = t32*t369;
+ t470 = t227*t18;
+ t472 = 2.0*t58*t435+2.0*t112*t438+4.0*t107*t442+2.0*t107*t445+t107*t449+
+t376*t310+4.0*t123*t74+2.0*t58*t454+2.0*t217*t457+2.0*t217*t460+2.0*t130*t457+
+2.0*t81*t465+2.0*t58*t401+t112*t470;
+ t473 = t11*t53;
+ t476 = t164*t98;
+ t479 = t77*t343;
+ t488 = t345*t18;
+ t489 = t488*t14;
+ t491 = t19*t369;
+ t501 = t103*t30;
+ t502 = t501*t4;
+ t504 = t501*t10;
+ t506 = partial_d_g_uu_211;
+ t507 = t506*t18;
+ t508 = t507*t14;
+ t510 = 2.0*t245*t473+2.0*t107*t476+t479*t87+2.0*t117*t74+2.0*t117*t435+
+2.0*t117*t11*t61+t117*t489+2.0*t112*t491+2.0*t217*t411+2.0*t31*t83*t369+2.0*t11
+*t54+t102*t502+t164*t504+t107*t508;
+ t514 = t24*t208;
+ t519 = t275*t30;
+ t520 = t519*t10;
+ t522 = t256*t30;
+ t523 = t522*t4;
+ t530 = t82*t82;
+ t531 = t530*t10;
+ t535 = t519*t4;
+ t539 = t1*t73;
+ t540 = t539*t4;
+ t543 = t57*t78;
+ t551 = t514*t182*t14+2.0*t107*t465+t393*t520+t19*t523+2.0*t83*t491+t58*
+t489+2.0*t117*t454+2.0*t531*t98*t4+t123*t535+2.0*t123*t272+4.0*t58*t540+2.0*
+t543*t1*t61+2.0*t81*t11*t108+t123*t277;
+ t552 = t329*t10;
+ t553 = t552*t4;
+ t559 = t1*t108;
+ t562 = t275*t4;
+ t570 = t287*t343;
+ t572 = t197*t10;
+ t573 = t572*t4;
+ t575 = t522*t10;
+ t578 = t12*t343;
+ t582 = t123*t553+2.0*t107*t311+2.0*t81*t445+2.0*t253*t559+t397*t562+
+RATIONAL(1.0,2.0)*t393*t350+t264*t103*t4+t514*t256*t4+t570*t20+t102*t573+t32*
+t575+t344*t250+t578*t280+t543*t201*t14;
+ t584 = t226*t14;
+ t589 = t193*t18;
+ t602 = t192*t14;
+ t612 = t57*t155;
+ t615 = t253*t584+2.0*t317*t53*t26+t130*t589+t19*t430+t376*t159*t26+
+RATIONAL(1.0,2.0)*t393*t330+t255*t147*t14+RATIONAL(1.0,2.0)*t32*t247+t264*t159*
+t14+t397*t602+RATIONAL(1.0,2.0)*t164*t209+RATIONAL(3.0,2.0)*t376*t506*t14+2.0*
+t344*t1*t155+2.0*t397*t612;
+ t616 = t116*t116;
+ t617 = t616*t30;
+ t621 = t506*t343;
+ t624 = t345*t343;
+ t639 = t246*t10;
+ t640 = t639*t4;
+ t642 = t197*t4;
+ t647 = t304*t343;
+ t654 = 2.0*t617*t143*t26+RATIONAL(1.0,2.0)*t112*t621+RATIONAL(1.0,2.0)*
+t217*t624+2.0*t31*t122*t53+RATIONAL(3.0,2.0)*t514*t187*t26+t543*t275*t26+2.0*
+t344*t12*t61+t117*t553+t31*t640+RATIONAL(3.0,2.0)*t253*t642+RATIONAL(1.0,2.0)*
+t130*t624+RATIONAL(1.0,2.0)*t245*t647+t344*t201*t4+RATIONAL(1.0,2.0)*t122*t647;
+ t665 = t349*t26;
+ t687 = RATIONAL(1.0,2.0)*t83*t621+RATIONAL(3.0,2.0)*t543*t329*t4+2.0*t31*
+t11*t20+RATIONAL(3.0,2.0)*t397*t665+t81*t573+2.0*t107*t502+2.0*t543*t82*t155+
+2.0*t11*t523+2.0*t31*t21+2.0*t31*t164*t369+t31*t269+2.0*t11*t149+t578*t148+
+RATIONAL(1.0,2.0)*t164*t198;
+ t688 = t58*t73;
+ t692 = t102*t98;
+ t695 = t530*t78;
+ t697 = t240*t343;
+ t699 = t102*t369;
+ t707 = t102*t87;
+ t710 = t57*t178;
+ t714 = t102*t178;
+ t717 = t268*t18;
+ t722 = 2.0*t245*t688+t81*t508+2.0*t83*t692+t695*t87+t697*t118+2.0*t245*
+t699+2.0*t81*t109+2.0*t31*t102*t108+2.0*t107*t707+4.0*t117*t710*t26+2.0*t130*
+t714+t245*t717+t31*t306+2.0*t117*t540;
+ t724 = t616*t208;
+ t726 = t58*t143;
+ t745 = t259*t208;
+ t752 = t240*t208;
+ t754 = t724*t118+2.0*t217*t726+2.0*t300*t98*t26+2.0*t31*t130*t73+t58*t405
++4.0*t102*t465+2.0*t81*t442+t19*t640+2.0*t81*t707+2.0*t58*t535+t745*t87+2.0*t31
+*t58*t61+2.0*t81*t105+t752*t20;
+ t764 = t304*t14;
+ t773 = t160*t18;
+ t784 = 2.0*t112*t692+2.0*t245*t151+2.0*t117*t156+2.0*t117*t179+t107*t161+
+RATIONAL(3.0,2.0)*t578*t764+4.0*t123*t179+2.0*t217*t714+2.0*t81*t340+t83*t773+
+t102*t449+2.0*t31*t107*t108+2.0*t112*t373+t107*t314+2.0*t81*t476;
+ t789 = pow(HD,1.0*RATIONAL(1.0,2.0));
+ t791 = 1/t789/HD;
+ t796 = -t764-t584-t602-t148-t642-t562-t280-t104-t665-t12*t20-2.0*t559-2.0
+*t398;
+ t800 = partial_d_ln_sqrt_g_1;
+ t801 = t12*t800;
+ t803 = partial_d_ln_sqrt_g_2;
+ t804 = t1*t803;
+ t806 = partial_d_ln_sqrt_g_3;
+ t807 = t24*t806;
+ t809 = t1*t800;
+ t811 = t82*t803;
+ t813 = t57*t806;
+ t815 = t24*t800;
+ t817 = t57*t803;
+ t819 = t116*t806;
+ t821 = -t82*t87-2.0*t612-t116*t118-t801*t14-t804*t14-t807*t14-t809*t4-
+t811*t4-t813*t4-t815*t26-t817*t26-t819*t26;
+ t823 = 1/t789;
+ t826 = K_uu_11*t18;
+ t828 = K_uu_12;
+ t831 = t828*t10;
+ t833 = K_uu_13;
+ t836 = t833*t30;
+ t839 = K_uu_22*t10;
+ t841 = K_uu_23;
+ t844 = t841*t30;
+ t847 = K_uu_33*t30;
+ t851 = 1/HD;
+ t864 = HD*HD;
+ t873 = RATIONAL(3.0,2.0)*HA/t789/t864+RATIONAL(1.0,2.0)*HB*t791+HC/t864;
+ partial_H_wrt_partial_d_h_1 = (t154+t221+t274+t324+t386+t433+t472+t510+
+t551+t582+t615+t654+t687+t722+t754+t784)*t791+(t796+t821)*t823+(-2.0*t826*t14
+-2.0*t828*t4*t18-2.0*t831*t14-2.0*t833*t26*t18-2.0*t836*t14-2.0*t839*t4-2.0*
+t841*t26*t10-2.0*t844*t4-2.0*t847*t26)*t851-(-2.0*t19*t14-2.0*t122*t18-2.0*t11*
+t14-2.0*t245*t18-2.0*t31*t14-2.0*t107*t4-2.0*t112*t10-2.0*t81*t4-2.0*t117*t26)*
+t873;
+ t876 = t103*t10*t28;
+ t879 = t519*t7;
+ t882 = t188*t28;
+ t884 = t429*t28;
+ t889 = t12*t369*t16;
+ t893 = t24*t28;
+ t901 = t57*t7;
+ t908 = t116*t28;
+ t914 = 2.0*t81*t876+2.0*t58*t879+t19*t882+2.0*t31*t884+t11*t882+4.0*t102*
+t889+t724*t134+2.0*t893*t688+2.0*t317*t53*t28+RATIONAL(1.0,2.0)*t893*t247+2.0*
+t31*t901*t73+RATIONAL(3.0,2.0)*t264*t207*t28+2.0*t908*t714+RATIONAL(3.0,2.0)*
+t255*t246*t7;
+ t918 = t304*t16;
+ t921 = t24*t16;
+ t922 = t921*t178;
+ t925 = t57*t28;
+ t935 = t349*t28;
+ t943 = t275*t7;
+ t947 = t1*t16;
+ t953 = 2.0*t288*t53*t16+RATIONAL(3.0,2.0)*t578*t918+2.0*t81*t922+2.0*t925
+*t113+RATIONAL(1.0,2.0)*t908*t330+2.0*t925*t373+4.0*t81*t407*t28+RATIONAL(3.0,
+2.0)*t397*t935+RATIONAL(3.0,2.0)*t543*t329*t7+t514*t256*t7+t397*t943+RATIONAL(
+1.0,2.0)*t921*t350+RATIONAL(1.0,2.0)*t947*t209+2.0*t31*t58*t63;
+ t955 = t102*t168;
+ t958 = t947*t178;
+ t968 = t82*t7;
+ t972 = t123*t168;
+ t981 = t103*t28;
+ t985 = t19*t41;
+ t988 = t12*t16;
+ t989 = t988*t53;
+ t992 = 2.0*t117*t955+2.0*t117*t958+2.0*t893*t151+2.0*t81*t107*t89+2.0*
+t908*t411+2.0*t81*t968*t98+2.0*t81*t972+t255*t256*t28+RATIONAL(1.0,2.0)*t925*
+t198+2.0*t925*t692+t253*t981+2.0*t893*t419+2.0*t31*t985+2.0*t31*t989;
+ t1002 = t102*t89;
+ t1008 = t947*t98;
+ t1017 = t197*t7;
+ t1020 = t292*t7;
+ t1028 = 2.0*t11*t123*t63+2.0*t543*t82*t168+2.0*t31*t107*t359+2.0*t81*
+t1002+2.0*t31*t968*t369+2.0*t81*t1008+2.0*t260*t143*t7+4.0*t117*t415*t28+
+RATIONAL(3.0,2.0)*t253*t1017+4.0*t58*t1020+2.0*t908*t218+t570*t41+t327*t134+
+t695*t89;
+ t1047 = t123*t134;
+ t1050 = t921*t143;
+ t1062 = t697*t134+t79*t41+RATIONAL(3.0,2.0)*t344*t345*t16+2.0*t107*t972+
+2.0*t107*t922+2.0*t117*t1020+2.0*t968*t373+RATIONAL(3.0,2.0)*t376*t506*t16+2.0*
+t58*t1047+2.0*t58*t1050+2.0*t117*t107*t168+t893*t717+2.0*t968*t692+2.0*t531*t98
+*t7;
+ t1065 = t268*t16;
+ t1067 = t19*t63;
+ t1070 = t988*t73;
+ t1078 = t1*t359;
+ t1081 = t147*t7;
+ t1082 = t1081*t18;
+ t1084 = t552*t7;
+ t1086 = t639*t7;
+ t1088 = t19*t359;
+ t1095 = t501*t7;
+ t1098 = 2.0*t901*t411+t31*t1065+2.0*t117*t1067+2.0*t117*t1070+2.0*t543*t1
+*t63+2.0*t908*t457+2.0*t253*t1078+t31*t1082+t117*t1084+t31*t1086+2.0*t81*t1088+
+2.0*t81*t889+2.0*t925*t491+2.0*t107*t1095;
+ t1100 = t522*t7;
+ t1106 = t572*t7;
+ t1136 = 2.0*t11*t1100+2.0*t77*t7*t423+t81*t1106+2.0*t31*t102*t359+2.0*
+t232*t16*t369+2.0*t31*t947*t369+2.0*t107*t1008+2.0*t893*t699+2.0*t107*t1002+2.0
+*t901*t714+2.0*t240*t28*t383+2.0*t117*t58*t134+2.0*t117*t901*t143+2.0*t908*t726
+;
+ t1137 = t275*t28;
+ t1138 = t1137*t10;
+ t1148 = t1*t7;
+ t1165 = t441*t7;
+ t1170 = t123*t1138+2.0*t11*t921*t73+t921*t520+2.0*t58*t958+2.0*t58*t955+
+2.0*t1148*t124+2.0*t317*t18*t63+2.0*t317*t16*t73+t123*t879+2.0*t300*t7*t178+2.0
+*t1148*t151+2.0*t117*t1047+4.0*t107*t1165+2.0*t117*t1050;
+ t1197 = t192*t16;
+ t1205 = 2.0*t259*t28*t297+2.0*t300*t10*t168+2.0*t968*t491+2.0*t11*t985+
+2.0*t11*t989+2.0*t901*t457+2.0*t264*t24*t359+2.0*t107*t1088+2.0*t107*t889+t264*
+t159*t16+t397*t1197+RATIONAL(1.0,2.0)*t988*t247+RATIONAL(1.0,2.0)*t947*t198+
+RATIONAL(1.0,2.0)*t921*t330;
+ t1221 = t226*t16;
+ t1225 = t182*t28;
+ t1227 = t159*t28;
+ t1234 = RATIONAL(1.0,2.0)*t901*t350+RATIONAL(1.0,2.0)*t968*t209+2.0*t344*
+t12*t63+2.0*t344*t1*t168+t543*t1137+t264*t103*t7+t255*t147*t16+t253*t1221+t543*
+t201*t16+t578*t1225+t376*t1227+t344*t192*t28+t514*t182*t16+t102*t1095;
+ t1240 = t24*t63;
+ t1253 = t488*t16;
+ t1255 = t507*t16;
+ t1257 = t448*t28;
+ t1260 = t539*t7;
+ t1266 = t102*t876+t947*t504+2.0*t58*t1067+2.0*t397*t1240+2.0*t58*t1070+
+RATIONAL(3.0,2.0)*t514*t187*t28+RATIONAL(1.0,2.0)*t988*t212+2.0*t236*t98*t16+
+t58*t1253+t107*t1255+t102*t1257+t19*t1100+4.0*t58*t1260+2.0*t232*t53*t7;
+ t1269 = t226*t7;
+ t1271 = t201*t7;
+ t1295 = t19*t884+t578*t1081+t376*t1269+t344*t1271+RATIONAL(1.0,2.0)*t1148
+*t647+RATIONAL(1.0,2.0)*t968*t621+RATIONAL(1.0,2.0)*t901*t624+RATIONAL(1.0,2.0)
+*t893*t647+RATIONAL(1.0,2.0)*t925*t621+RATIONAL(1.0,2.0)*t908*t624+2.0*t617*
+t143*t28+2.0*t241*t143*t16+t988*t575+2.0*t376*t12*t359;
+ t1302 = t305*t16;
+ t1308 = t182*t18*t28;
+ t1311 = t193*t16;
+ t1322 = t223*t16;
+ t1326 = t227*t16;
+ t1331 = t117*t1253+t81*t1255+RATIONAL(1.0,2.0)*t1148*t212+t31*t1302+2.0*
+t300*t98*t28+2.0*t31*t1308+2.0*t123*t1311+4.0*t117*t710*t28+2.0*t11*t1082+2.0*
+t117*t11*t63+2.0*t123*t1322+t11*t1302+2.0*t102*t1326+2.0*t117*t1260;
+ t1337 = t192*t18*t28;
+ t1345 = t1269*t18;
+ t1352 = t1271*t18;
+ t1354 = t160*t16;
+ t1360 = 2.0*t19*t1065+2.0*t908*t460+2.0*t117*t1337+t19*t1086+2.0*t31*
+t1148*t53+t81*t1326+t81*t1345+t925*t470+t117*t1322+2.0*t232*t18*t359+t117*t1352
++2.0*t102*t1354+t908*t224+2.0*t893*t473;
+ t1362 = t183*t16;
+ t1373 = t1227*t18;
+ t1375 = t57*t168;
+ t1386 = 2.0*t19*t1362+2.0*t107*t1345+2.0*t58*t1352+2.0*t925*t438+t901*
+t589+t58*t1337+t107*t1373+2.0*t397*t1375+t107*t1354+t968*t773+t479*t89+t745*t89
++t752*t41+2.0*t31*t11*t41;
+ t1394 = t404*t28;
+ t1410 = t123*t1084+t102*t1106+2.0*t81*t1373+4.0*t123*t1070+t107*t1257+t58
+*t1394+2.0*t81*t11*t359+t123*t1394+2.0*t117*t1138+2.0*t81*t1165+t11*t1308+t11*
+t1362+t1148*t338+t58*t1311+4.0*t123*t958;
+ t1419 = -t918-t1221-t1197-t1081-t1017-t943-t1225-t981-t935-t12*t41-2.0*
+t1078-2.0*t1240;
+ t1432 = -t82*t89-2.0*t1375-t116*t134-t801*t16-t804*t16-t807*t16-t809*t7-
+t811*t7-t813*t7-t815*t28-t817*t28-t819*t28;
+ partial_H_wrt_partial_d_h_2 = (t914+t953+t992+t1028+t1062+t1098+t1136+
+t1170+t1205+t1234+t1266+t1295+t1331+t1360+t1386+t1410)*t791+(t1419+t1432)*t823+
+(-2.0*t826*t16-2.0*t828*t7*t18-2.0*t831*t16-2.0*t833*t28*t18-2.0*t836*t16-2.0*
+t839*t7-2.0*t841*t28*t10-2.0*t844*t7-2.0*t847*t28)*t851-(-2.0*t19*t16-2.0*t1148
+*t18-2.0*t11*t16-2.0*t893*t18-2.0*t31*t16-2.0*t107*t7-2.0*t925*t10-2.0*t81*t7
+-2.0*t117*t28)*t873;
+ t1466 = t10*t4*t26;
+ t1469 = t164*t4;
+ t1472 = t107*t12;
+ t1473 = t18*t14;
+ t1474 = t1473*t4;
+ t1477 = t117*t12;
+ t1478 = t1473*t26;
+ t1485 = t117*t1;
+ t1486 = t10*t14;
+ t1487 = t1486*t26;
+ t1490 = t81*t1;
+ t1491 = t1486*t4;
+ t1495 = t18*t4*t26;
+ t1498 = t81*t24;
+ t1501 = 2.0*t543*t164*t26+2.0*t300*t1466+2.0*t253*t1469+2.0*t1472*t1474+
+2.0*t1477*t1478+t327*t136+2.0*t344*t122*t26+2.0*t1485*t1487+2.0*t1490*t1491+2.0
+*t1485*t1495+2.0*t1498*t1495;
+ t1502 = t102*t91;
+ t1511 = t123*t136;
+ t1517 = t19*t43;
+ t1520 = t31*t82;
+ t1523 = t81*t12;
+ t1526 = t31*t1;
+ t1529 = t117*t82;
+ t1532 = 2.0*t81*t1502+2.0*t31*t11*t43+t479*t91+2.0*t1498*t1487+2.0*t117*
+t1511+2.0*t81*t107*t91+2.0*t31*t1517+2.0*t1520*t1491+2.0*t1523*t1474+2.0*t1526*
+t1474+2.0*t1529*t1466;
+ t1534 = t58*t12;
+ t1539 = t11*t24;
+ t1557 = t58*t1;
+ t1560 = 2.0*t1534*t1478+t79*t43+t697*t136+2.0*t1539*t1478+2.0*t232*t1474+
+2.0*t11*t1517+2.0*t107*t1502+2.0*t117*t58*t136+2.0*t543*t83*t26+2.0*t264*t393*
+t4+2.0*t1557*t1495;
+ t1573 = t393*t26;
+ t1576 = t130*t26;
+ t1582 = t107*t24;
+ t1585 = 2.0*t317*t1478+t695*t91+2.0*t344*t32*t26+2.0*t376*t32*t4+2.0*t58*
+t1511+t570*t43+2.0*t397*t1573+2.0*t397*t1576+t752*t43+t724*t136+t745*t91+2.0*
+t1582*t1495;
+ partial_H_wrt_partial_dd_h_11 = (t1501+t1532+t1560+t1585)*t791+(-t12*t43
+-2.0*t1469-2.0*t1573-t82*t91-2.0*t1576-t116*t136)*t823;
+ t1597 = -t363-t365;
+ t1598 = t1*t1597;
+ t1603 = -t67-t69;
+ t1606 = -t172-t174;
+ t1607 = t57*t1606;
+ t1609 = t19*t1597;
+ t1616 = t102*t1606;
+ t1619 = -t253*t1598+t745*t93-t264*t24*t1597-t543*t1*t1603-t397*t1607-t81*
+t1609-t317*t18*t1603+t570*t46-t300*t10*t1606-t117*t1616+t479*t93;
+ t1621 = t123*t1606;
+ t1633 = t18*t16;
+ t1634 = t1633*t14;
+ t1639 = t24*t1603;
+ t1651 = t18*t28*t26;
+ t1654 = -2.0*t107*t1621-2.0*t376*t12*t1597-2.0*t344*t1*t1606+2.0*t724*
+t138+4.0*t31*t12*t1634+2.0*t752*t46-2.0*t397*t1639+2.0*t79*t46+2.0*t697*t138+
+4.0*t11*t12*t1634+4.0*t58*t24*t1651;
+ t1659 = t18*t7;
+ t1660 = t1659*t4;
+ t1663 = t19*t1603;
+ t1669 = t10*t16;
+ t1680 = t10*t7;
+ t1692 = -2.0*t232*t18*t1597+4.0*t1490*t1660-2.0*t58*t1663+4.0*t107*t1*
+t1660+4.0*t1526*t1669*t14-2.0*t117*t11*t1603-2.0*t344*t12*t1603+4.0*t81*t82*
+t1680*t4-2.0*t31*t58*t1603+2.0*t327*t138-2.0*t81*t11*t1597;
+ t1726 = -2.0*t117*t107*t1606+2.0*t695*t93-2.0*t58*t1616-2.0*t31*t107*
+t1597-2.0*t31*t102*t1597-2.0*t543*t82*t1606+4.0*t117*t57*t10*t28*t26-2.0*t107*
+t1609-2.0*t11*t123*t1603-2.0*t117*t1663-2.0*t81*t1621+4.0*t117*t24*t1651;
+ partial_H_wrt_partial_dd_h_12 = (2.0*t1619+t1654+t1692+t1726)*t791+(-2.0*
+t988*t14+2.0*t1598+2.0*t1639-2.0*t968*t4+2.0*t1607-2.0*t908*t26)*t823;
+ t1737 = t123*t141;
+ t1741 = t1659*t28;
+ t1744 = t1633*t7;
+ t1747 = t1680*t28;
+ t1756 = t19*t50;
+ t1762 = t79*t50+2.0*t117*t1737+t724*t141+2.0*t1498*t1741+2.0*t1472*t1744+
+2.0*t300*t1747+2.0*t232*t1744+2.0*t543*t947*t28+t697*t141+2.0*t11*t1756+2.0*t81
+*t107*t96;
+ t1763 = t947*t7;
+ t1766 = t102*t96;
+ t1769 = t1633*t28;
+ t1772 = t921*t28;
+ t1778 = t901*t28;
+ t1793 = 2.0*t253*t1763+2.0*t107*t1766+2.0*t1534*t1769+2.0*t397*t1772+2.0*
+t264*t921*t7+2.0*t397*t1778+t695*t96+2.0*t317*t1769+2.0*t344*t988*t28+2.0*t376*
+t988*t7+2.0*t344*t1148*t28;
+ t1795 = t1669*t7;
+ t1800 = t1669*t28;
+ t1818 = 2.0*t1520*t1795+2.0*t1526*t1744+2.0*t1485*t1800+2.0*t1490*t1795+
+2.0*t1498*t1800+2.0*t1529*t1747+2.0*t117*t58*t141+2.0*t1485*t1741+t479*t96+2.0*
+t58*t1737+t745*t96;
+ t1842 = 2.0*t1523*t1744+2.0*t31*t11*t50+2.0*t1477*t1769+2.0*t543*t968*t28
++2.0*t1539*t1769+2.0*t31*t1756+2.0*t1582*t1741+2.0*t1557*t1741+t752*t50+t570*
+t50+2.0*t81*t1766+t327*t141;
+ partial_H_wrt_partial_dd_h_22 = (t1762+t1793+t1818+t1842)*t791+(-t12*t50
+-2.0*t1763-2.0*t1772-t82*t96-2.0*t1778-t116*t141)*t823;
diff --git a/src/gr.cg/horizon_function.c b/src/gr.cg/horizon_function.c
new file mode 100644
index 0000000..c31778c
--- /dev/null
+++ b/src/gr.cg/horizon_function.c
@@ -0,0 +1,184 @@
+/*
+ * inputs = {r, partial_d_ln_sqrt_g, partial_d_g_uu, X_ud, X_udd, g_uu, K_uu, h, HA, HB, HC, HD, K}
+ * outputs = {H, HA, HB, HC, HD}
+ * cost = 136*assignments+7*divisions+7*functions+402*multiplications+176*additions
+ */
+fp t1, t2, t4, t5, t7, t8, t10, t11, t12, t14;
+fp t16, t18, t19, t21, t23, t25, t28, t29, t30, t32;
+fp t33, t35, t37, t43, t44, t47, t50, t51, t53, t55;
+fp t56, t57, t58, t61, t62, t63, t64, t65, t67, t69;
+fp t72, t73, t76, t78, t85, t90, t92, t94, t95, t96;
+fp t99, t100, t101, t102, t105, t106, t107, t111, t114, t115;
+fp t117, t118, t133, t134, t137, t138, t141, t142, t145, t146;
+fp t149, t150, t158, t163, t165, t169, t170, t173, t174, t179;
+fp t194, t198, t199, t204, t220, t227, t234, t237, t239, t242;
+fp t247, t250, t254, t261, t262, t265, t267, t270, t273, t276;
+fp t279, t292, t295, t296, t299, t306, t307, t312, t315, t318;
+fp t320, t323, t333, t342, t343, t346, t349, t350, t361, t362;
+fp t368, t378, t394, t413, t431, t440, t444, t447, t450, t465;
+fp t490;
+ t1 = g_uu_13;
+ t2 = 1/r;
+ t4 = X_ud_13;
+ t5 = PARTIAL_RHO(h);
+ t7 = X_ud_23;
+ t8 = PARTIAL_SIGMA(h);
+ t10 = zz*t2-t4*t5-t7*t8;
+ t11 = t1*t10;
+ t12 = partial_d_g_uu_112;
+ t14 = X_ud_12;
+ t16 = X_ud_22;
+ t18 = yy*t2-t14*t5-t16*t8;
+ t19 = t12*t18;
+ t21 = X_ud_11;
+ t23 = X_ud_21;
+ t25 = xx*t2-t21*t5-t23*t8;
+ t28 = g_uu_23;
+ t29 = t28*t28;
+ t30 = t10*t10;
+ t32 = xx*xx;
+ t33 = zz*zz;
+ t35 = r*r;
+ t37 = 1/t35/r;
+ t43 = t14*t14;
+ t44 = PARTIAL_RHO_RHO(h);
+ t47 = PARTIAL_RHO_SIGMA(h);
+ t50 = t16*t16;
+ t51 = PARTIAL_SIGMA_SIGMA(h);
+ t53 = (t32+t33)*t37-X_udd_122*t5-X_udd_222*t8-t43*t44-2.0*t16*t14*t47-t50
+*t51;
+ t55 = g_uu_33;
+ t56 = t55*t10;
+ t57 = partial_d_g_uu_312;
+ t58 = t57*t18;
+ t61 = g_uu_22;
+ t62 = t18*t18;
+ t63 = t61*t62;
+ t64 = partial_d_g_uu_212;
+ t65 = t64*t25;
+ t67 = t30*t10;
+ t69 = partial_d_g_uu_233;
+ t72 = t28*t10;
+ t73 = t64*t18;
+ t76 = t55*t55;
+ t78 = yy*yy;
+ t85 = t4*t4;
+ t90 = t7*t7;
+ t92 = (t32+t78)*t37-X_udd_133*t5-X_udd_233*t8-t85*t44-2.0*t7*t4*t47-t90*
+t51;
+ t94 = t61*t18;
+ t95 = partial_d_g_uu_213;
+ t96 = t95*t10;
+ t99 = g_uu_12;
+ t100 = t99*t18;
+ t101 = partial_d_g_uu_113;
+ t102 = t101*t10;
+ t105 = t28*t18;
+ t106 = partial_d_g_uu_313;
+ t107 = t106*t10;
+ t111 = partial_d_g_uu_133;
+ t114 = t25*t25;
+ t115 = t1*t114;
+ t117 = -t11*t19*t25-t29*t30*t53-t56*t58*t25-t63*t65+RATIONAL(-1.0,2.0)*
+t28*t67*t69-t72*t73*t25-t76*t30*t92-t94*t96*t25-t100*t102*t25-t105*t107*t25+
+RATIONAL(-1.0,2.0)*t1*t67*t111-t115*t107;
+ t118 = t55*t30;
+ t133 = -yy*zz*t37-X_udd_123*t5-X_udd_223*t8-t14*t4*t44-t16*t4*t47-t14*t7*
+t47-t16*t7*t51;
+ t134 = t28*t133;
+ t137 = partial_d_g_uu_111;
+ t138 = t137*t114;
+ t141 = partial_d_g_uu_311;
+ t142 = t141*t114;
+ t145 = partial_d_g_uu_211;
+ t146 = t145*t114;
+ t149 = g_uu_11;
+ t150 = t149*t149;
+ t158 = t21*t21;
+ t163 = t23*t23;
+ t165 = (t78+t33)*t37-X_udd_111*t5-X_udd_211*t8-t158*t44-2.0*t23*t21*t47-
+t163*t51;
+ t169 = t99*t25;
+ t170 = t69*t30;
+ t173 = t149*t25;
+ t174 = t111*t30;
+ t179 = t99*t114;
+ t194 = -xx*yy*t37-X_udd_112*t5-X_udd_212*t8-t21*t14*t44-t23*t14*t47-t21*
+t16*t47-t23*t16*t51;
+ t198 = partial_d_g_uu_333;
+ t199 = t198*t30;
+ t204 = -2.0*t118*t134+RATIONAL(-1.0,2.0)*t11*t138+RATIONAL(-1.0,2.0)*t105
+*t142+RATIONAL(-1.0,2.0)*t94*t146-t150*t114*t165+RATIONAL(-1.0,2.0)*t100*t138+
+RATIONAL(-1.0,2.0)*t169*t170+RATIONAL(-1.0,2.0)*t173*t174+RATIONAL(-1.0,2.0)*
+t100*t174-2.0*t179*t149*t194+RATIONAL(-1.0,2.0)*t105*t199+RATIONAL(-1.0,2.0)*
+t94*t170;
+ t220 = -xx*zz*t37-X_udd_113*t5-X_udd_213*t8-t21*t4*t44-t23*t4*t47-t21*t7*
+t47-t23*t7*t51;
+ t227 = t99*t194;
+ t234 = t99*t99;
+ t237 = t149*t114;
+ t239 = t28*t30;
+ t242 = t1*t1;
+ t247 = t61*t61;
+ t250 = t28*t62;
+ t254 = -2.0*t115*t149*t220-2.0*t115*t99*t133-2.0*t63*t227+RATIONAL(-1.0,
+2.0)*t72*t146+RATIONAL(-1.0,2.0)*t56*t142-t234*t114*t53-t237*t19-t239*t95*t25-
+t242*t114*t92-t234*t62*t165-t247*t62*t53-2.0*t250*t99*t220;
+ t261 = partial_d_g_uu_222;
+ t262 = t261*t62;
+ t265 = t106*t25;
+ t267 = t1*t30;
+ t270 = t169*t53;
+ t273 = t173*t220;
+ t276 = t173*t165;
+ t279 = t114*t25;
+ t292 = -2.0*t234*t18*t25*t194-t179*t96-t237*t102+RATIONAL(-1.0,2.0)*t169*
+t262-t118*t265-t267*t101*t25-2.0*t94*t270-2.0*t105*t273-2.0*t100*t276+RATIONAL(
+-1.0,2.0)*t149*t279*t137+RATIONAL(-1.0,2.0)*t99*t279*t145+RATIONAL(-1.0,2.0)*
+t55*t67*t198+RATIONAL(-1.0,2.0)*t1*t279*t141;
+ t295 = partial_d_g_uu_122;
+ t296 = t295*t62;
+ t299 = t173*t194;
+ t306 = t1*t25;
+ t307 = t306*t133;
+ t312 = t169*t133;
+ t315 = t306*t92;
+ t318 = t62*t18;
+ t320 = partial_d_g_uu_322;
+ t323 = t320*t62;
+ t333 = RATIONAL(-1.0,2.0)*t173*t296-2.0*t94*t299-2.0*t242*t10*t25*t220
+-2.0*t72*t307-t250*t57*t25-2.0*t56*t312-2.0*t56*t315+RATIONAL(-1.0,2.0)*t28*
+t318*t320+RATIONAL(-1.0,2.0)*t306*t323+RATIONAL(-1.0,2.0)*t99*t318*t295-2.0*t72
+*t270+RATIONAL(-1.0,2.0)*t56*t323;
+ t342 = partial_d_g_uu_223;
+ t343 = t342*t10;
+ t346 = t99*t62;
+ t349 = partial_d_g_uu_323;
+ t350 = t349*t10;
+ t361 = partial_d_g_uu_123;
+ t362 = t361*t10;
+ t368 = -t179*t73+RATIONAL(-1.0,2.0)*t61*t318*t261-2.0*t56*t273-2.0*t72*
+t299-t169*t343*t18-t346*t12*t25-t306*t350*t18-2.0*t11*t276-2.0*t94*t307-2.0*
+t105*t315+RATIONAL(-1.0,2.0)*t11*t296-t346*t362-2.0*t29*t10*t18*t133;
+ t378 = t349*t18;
+ t394 = RATIONAL(-1.0,2.0)*t72*t262-t63*t343-t250*t350-t239*t342*t18-t267*
+t361*t18-t118*t378+RATIONAL(-1.0,2.0)*t306*t199-t173*t362*t18-2.0*t105*t312-2.0
+*t100*t306*t220-2.0*t250*t61*t133-t29*t62*t92;
+ t413 = t1*t220;
+ t431 = -2.0*t56*t94*t133-2.0*t56*t105*t92-t115*t58-2.0*t11*t169*t194-t242
+*t30*t165-2.0*t11*t100*t165-2.0*t239*t1*t194-2.0*t118*t413-2.0*t11*t105*t220
+-2.0*t72*t94*t53-2.0*t11*t94*t194-2.0*t56*t100*t220-2.0*t72*t100*t194;
+ HA = t117+t204+t254+t292+t333+t368+t394+t431;
+ t440 = t137*t25+t65+t265+t19+t261*t18+t378+t102+t343+t198*t10+t149*t165+
+2.0*t227+2.0*t413;
+ t444 = partial_d_ln_sqrt_g_1;
+ t447 = partial_d_ln_sqrt_g_2;
+ t450 = partial_d_ln_sqrt_g_3;
+ t465 = t61*t53+2.0*t134+t55*t92+t149*t444*t25+t99*t447*t25+t1*t450*t25+
+t99*t444*t18+t61*t447*t18+t28*t450*t18+t1*t444*t10+t28*t447*t10+t55*t450*t10;
+ HB = t440+t465;
+ HC = K_uu_11*t114+2.0*K_uu_12*t18*t25+2.0*K_uu_13*t10*t25+K_uu_22*t62+2.0
+*K_uu_23*t10*t18+K_uu_33*t30;
+ HD = t237+2.0*t100*t25+2.0*t11*t25+t63+2.0*t72*t18+t118;
+ t490 = pow(HD,1.0*RATIONAL(1.0,2.0));
+ H = HA/t490/HD+HB/t490+HC/HD-K;
diff --git a/src/gr.cg/inverse_metric.c b/src/gr.cg/inverse_metric.c
new file mode 100644
index 0000000..cb85ae0
--- /dev/null
+++ b/src/gr.cg/inverse_metric.c
@@ -0,0 +1,25 @@
+/*
+ * inputs = {g_dd}
+ * outputs = {g_uu}
+ * cost = 18*assignments+24*multiplications+divisions+13*additions
+ */
+fp t1, t2, t4, t5, t7, t8, t11, t12, t14, t15;
+fp t18, t21;
+ t1 = g_dd_22;
+ t2 = g_dd_33;
+ t4 = g_dd_23;
+ t5 = t4*t4;
+ t7 = g_dd_11;
+ t8 = t7*t1;
+ t11 = g_dd_12;
+ t12 = t11*t11;
+ t14 = g_dd_13;
+ t15 = t11*t14;
+ t18 = t14*t14;
+ t21 = 1/(t8*t2-t7*t5-t12*t2+2.0*t15*t4-t18*t1);
+ g_uu_11 = (t1*t2-t5)*t21;
+ g_uu_12 = -(t11*t2-t14*t4)*t21;
+ g_uu_13 = -(-t11*t4+t14*t1)*t21;
+ g_uu_22 = (t7*t2-t18)*t21;
+ g_uu_23 = -(t7*t4-t15)*t21;
+ g_uu_33 = (t8-t12)*t21;
diff --git a/src/gr.cg/inverse_metric_gradient.c b/src/gr.cg/inverse_metric_gradient.c
new file mode 100644
index 0000000..077a3c2
--- /dev/null
+++ b/src/gr.cg/inverse_metric_gradient.c
@@ -0,0 +1,91 @@
+/*
+ * inputs = {g_uu, partial_d_g_dd}
+ * outputs = {partial_d_g_uu}
+ * cost = 63*assignments+183*multiplications+117*additions
+ */
+fp t1, t2, t3, t5, t6, t7, t10, t11, t12, t15;
+fp t16, t18, t19, t22, t23, t28, t29, t31, t33, t35;
+fp t36, t38, t40, t48, t49, t51, t53, t60, t62, t65;
+fp t74, t76, t86, t88, t90, t93, t96, t98, t101, t148;
+fp t150, t153, t156, t158, t161;
+ t1 = g_uu_11;
+ t2 = t1*t1;
+ t3 = partial_d_g_dd_111;
+ t5 = g_uu_12;
+ t6 = t5*t1;
+ t7 = partial_d_g_dd_112;
+ t10 = g_uu_13;
+ t11 = t10*t1;
+ t12 = partial_d_g_dd_113;
+ t15 = t5*t5;
+ t16 = partial_d_g_dd_122;
+ t18 = t10*t5;
+ t19 = partial_d_g_dd_123;
+ t22 = t10*t10;
+ t23 = partial_d_g_dd_133;
+ partial_d_g_uu_111 = -t2*t3-2.0*t6*t7-2.0*t11*t12-t15*t16-2.0*t18*t19-t22
+*t23;
+ t28 = g_uu_22;
+ t29 = t1*t28;
+ t31 = t5*t28;
+ t33 = t10*t28;
+ t35 = g_uu_23;
+ t36 = t1*t35;
+ t38 = t5*t35;
+ t40 = t10*t35;
+ partial_d_g_uu_112 = -t6*t3-t15*t7-t18*t12-t29*t7-t31*t16-t33*t19-t36*t12
+-t38*t19-t40*t23;
+ t48 = g_uu_33;
+ t49 = t1*t48;
+ t51 = t48*t5;
+ t53 = t10*t48;
+ partial_d_g_uu_113 = -t11*t3-t18*t7-t22*t12-t36*t7-t38*t16-t40*t19-t49*
+t12-t51*t19-t53*t23;
+ t60 = t28*t28;
+ t62 = t35*t28;
+ t65 = t35*t35;
+ partial_d_g_uu_122 = -t15*t3-2.0*t31*t7-2.0*t38*t12-t60*t16-2.0*t62*t19-
+t65*t23;
+ t74 = t28*t48;
+ t76 = t35*t48;
+ partial_d_g_uu_123 = -t18*t3-t33*t7-t40*t12-t38*t7-t62*t16-t65*t19-t51*
+t12-t74*t19-t76*t23;
+ t86 = t48*t48;
+ partial_d_g_uu_133 = -t22*t3-2.0*t40*t7-2.0*t53*t12-t65*t16-2.0*t76*t19-
+t86*t23;
+ t88 = partial_d_g_dd_211;
+ t90 = partial_d_g_dd_212;
+ t93 = partial_d_g_dd_213;
+ t96 = partial_d_g_dd_222;
+ t98 = partial_d_g_dd_223;
+ t101 = partial_d_g_dd_233;
+ partial_d_g_uu_211 = -t2*t88-2.0*t6*t90-2.0*t11*t93-t15*t96-2.0*t18*t98-
+t22*t101;
+ partial_d_g_uu_212 = -t6*t88-t15*t90-t18*t93-t29*t90-t31*t96-t33*t98-t36*
+t93-t38*t98-t40*t101;
+ partial_d_g_uu_213 = -t11*t88-t18*t90-t22*t93-t36*t90-t38*t96-t40*t98-t49
+*t93-t51*t98-t53*t101;
+ partial_d_g_uu_222 = -t15*t88-2.0*t31*t90-2.0*t38*t93-t60*t96-2.0*t62*t98
+-t65*t101;
+ partial_d_g_uu_223 = -t18*t88-t33*t90-t40*t93-t38*t90-t62*t96-t65*t98-t51
+*t93-t74*t98-t76*t101;
+ partial_d_g_uu_233 = -t22*t88-2.0*t40*t90-2.0*t53*t93-t65*t96-2.0*t76*t98
+-t86*t101;
+ t148 = partial_d_g_dd_311;
+ t150 = partial_d_g_dd_312;
+ t153 = partial_d_g_dd_313;
+ t156 = partial_d_g_dd_322;
+ t158 = partial_d_g_dd_323;
+ t161 = partial_d_g_dd_333;
+ partial_d_g_uu_311 = -t2*t148-2.0*t6*t150-2.0*t11*t153-t15*t156-2.0*t18*
+t158-t22*t161;
+ partial_d_g_uu_312 = -t6*t148-t15*t150-t18*t153-t29*t150-t31*t156-t33*
+t158-t36*t153-t38*t158-t40*t161;
+ partial_d_g_uu_313 = -t11*t148-t18*t150-t22*t153-t36*t150-t38*t156-t40*
+t158-t49*t153-t51*t158-t53*t161;
+ partial_d_g_uu_322 = -t15*t148-2.0*t31*t150-2.0*t38*t153-t60*t156-2.0*t62
+*t158-t65*t161;
+ partial_d_g_uu_323 = -t18*t148-t33*t150-t40*t153-t38*t150-t62*t156-t65*
+t158-t51*t153-t74*t158-t76*t161;
+ partial_d_g_uu_333 = -t22*t148-2.0*t40*t150-2.0*t53*t153-t65*t156-2.0*t76
+*t158-t86*t161;
diff --git a/src/gr.cg/metric_det_gradient.c b/src/gr.cg/metric_det_gradient.c
new file mode 100644
index 0000000..16147e4
--- /dev/null
+++ b/src/gr.cg/metric_det_gradient.c
@@ -0,0 +1,24 @@
+/*
+ * inputs = {g_uu, partial_d_g_dd}
+ * outputs = {partial_d_ln_sqrt_g}
+ * cost = 9*assignments+15*additions+27*multiplications
+ */
+fp t1, t5, t8, t11, t15, t18;
+ t1 = g_uu_11;
+ t5 = g_uu_12;
+ t8 = g_uu_13;
+ t11 = g_uu_22;
+ t15 = g_uu_23;
+ t18 = g_uu_33;
+ partial_d_ln_sqrt_g_1 = RATIONAL(1.0,2.0)*t1*partial_d_g_dd_111+t5*
+partial_d_g_dd_112+t8*partial_d_g_dd_113+RATIONAL(1.0,2.0)*t11*
+partial_d_g_dd_122+t15*partial_d_g_dd_123+RATIONAL(1.0,2.0)*t18*
+partial_d_g_dd_133;
+ partial_d_ln_sqrt_g_2 = RATIONAL(1.0,2.0)*t1*partial_d_g_dd_211+t5*
+partial_d_g_dd_212+t8*partial_d_g_dd_213+RATIONAL(1.0,2.0)*t11*
+partial_d_g_dd_222+t15*partial_d_g_dd_223+RATIONAL(1.0,2.0)*t18*
+partial_d_g_dd_233;
+ partial_d_ln_sqrt_g_3 = RATIONAL(1.0,2.0)*t1*partial_d_g_dd_311+t5*
+partial_d_g_dd_312+t8*partial_d_g_dd_313+RATIONAL(1.0,2.0)*t11*
+partial_d_g_dd_322+t15*partial_d_g_dd_323+RATIONAL(1.0,2.0)*t18*
+partial_d_g_dd_333;