aboutsummaryrefslogtreecommitdiff
path: root/src/gr
diff options
context:
space:
mode:
authorjthorn <jthorn@f88db872-0e4f-0410-b76b-b9085cfa78c5>2002-04-22 16:24:57 +0000
committerjthorn <jthorn@f88db872-0e4f-0410-b76b-b9085cfa78c5>2002-04-22 16:24:57 +0000
commitc1eb13242eb109cfefd131bb9d7fd7ee42ab6c6d (patch)
tree5162493e34136e8fc4da79468340aa8763abe7f1 /src/gr
parent40571f4388015cd2f8eb8a41f69355685990531a (diff)
* maple-generated code wants (xx,yy,zz) = *local* xyz coords
(compute this on the fly at each grid point) * remove X_ud and X_udd deriv coeffs from grid -- we have to compute them anyway at each grid point, so no need to store them in the grid *** with these changes, code now correctly evaluates H(h) *** for Schw/EF with the patch center at (0.5,0.5,0.0) git-svn-id: http://svn.einsteintoolkit.org/cactus/EinsteinAnalysis/AHFinderDirect/trunk@584 f88db872-0e4f-0410-b76b-b9085cfa78c5
Diffstat (limited to 'src/gr')
-rw-r--r--src/gr/cg.hh27
-rw-r--r--src/gr/driver.cc2
-rw-r--r--src/gr/ellipsoid.out492
-rw-r--r--src/gr/gfn.hh24
-rw-r--r--src/gr/horizon_function.cc136
-rw-r--r--src/gr/maple.log64
6 files changed, 109 insertions, 636 deletions
diff --git a/src/gr/cg.hh b/src/gr/cg.hh
index d2dd4a7..b6174eb 100644
--- a/src/gr/cg.hh
+++ b/src/gr/cg.hh
@@ -13,6 +13,9 @@
// The machine-generated code uses the following variables:
// patch& p // current patch
// int irho,isigma // current generic integer coords within patch
+// fp xx, yy, zz; // local (x,y,z) coords of this grid point
+// fp X_ud_[12][123] // 1st derivative coefficients
+// fp X_udd_[12]{11,12,13,22,23,33} // 2nd derivative coefficients
//
//
@@ -44,30 +47,6 @@
//
// nominal-grid gridfns
//
-#define xx p.gridfn(nominal_gfns::gfn__xx, irho,isigma)
-#define yy p.gridfn(nominal_gfns::gfn__yy, irho,isigma)
-#define zz p.gridfn(nominal_gfns::gfn__zz, irho,isigma)
-
-#define X_ud_11 p.gridfn(nominal_gfns::gfn__X_ud_11, irho,isigma)
-#define X_ud_12 p.gridfn(nominal_gfns::gfn__X_ud_12, irho,isigma)
-#define X_ud_13 p.gridfn(nominal_gfns::gfn__X_ud_13, irho,isigma)
-#define X_ud_21 p.gridfn(nominal_gfns::gfn__X_ud_21, irho,isigma)
-#define X_ud_22 p.gridfn(nominal_gfns::gfn__X_ud_22, irho,isigma)
-#define X_ud_23 p.gridfn(nominal_gfns::gfn__X_ud_23, irho,isigma)
-
-#define X_udd_111 p.gridfn(nominal_gfns::gfn__X_udd_111, irho,isigma)
-#define X_udd_112 p.gridfn(nominal_gfns::gfn__X_udd_112, irho,isigma)
-#define X_udd_113 p.gridfn(nominal_gfns::gfn__X_udd_113, irho,isigma)
-#define X_udd_122 p.gridfn(nominal_gfns::gfn__X_udd_122, irho,isigma)
-#define X_udd_123 p.gridfn(nominal_gfns::gfn__X_udd_123, irho,isigma)
-#define X_udd_133 p.gridfn(nominal_gfns::gfn__X_udd_133, irho,isigma)
-#define X_udd_211 p.gridfn(nominal_gfns::gfn__X_udd_211, irho,isigma)
-#define X_udd_212 p.gridfn(nominal_gfns::gfn__X_udd_212, irho,isigma)
-#define X_udd_213 p.gridfn(nominal_gfns::gfn__X_udd_213, irho,isigma)
-#define X_udd_222 p.gridfn(nominal_gfns::gfn__X_udd_222, irho,isigma)
-#define X_udd_223 p.gridfn(nominal_gfns::gfn__X_udd_223, irho,isigma)
-#define X_udd_233 p.gridfn(nominal_gfns::gfn__X_udd_233, irho,isigma)
-
#define g_dd_11 p.gridfn(nominal_gfns::gfn__g_dd_11, irho,isigma)
#define g_dd_12 p.gridfn(nominal_gfns::gfn__g_dd_12, irho,isigma)
#define g_dd_13 p.gridfn(nominal_gfns::gfn__g_dd_13, irho,isigma)
diff --git a/src/gr/driver.cc b/src/gr/driver.cc
index 0abc9f7..fe64dce 100644
--- a/src/gr/driver.cc
+++ b/src/gr/driver.cc
@@ -273,7 +273,7 @@ CCTK_VInfo(CCTK_THORNSTRING,
fp r_plus, r_minus;
#include "ellipsoid.c"
- // exactly one of the solutions (=def r) should be positive
+ // exactly one of the solutions (call it r) should be positive
fp r;
if ((r_plus > 0.0) && (r_minus < 0.0))
then r = r_plus;
diff --git a/src/gr/ellipsoid.out b/src/gr/ellipsoid.out
index 2e77483..4a0ee01 100644
--- a/src/gr/ellipsoid.out
+++ b/src/gr/ellipsoid.out
@@ -4,7 +4,7 @@
<____ ____> Waterloo Maple Inc.
| Type ? for help.
# ellipsoid.maple -- compute equations for offset ellipsoid setup
-# $Header: /numrelcvs/ThornburgCVS/AHFinderDirect/src/gr/ellipsoid.maple,v 1.1 2002/04/22 11:02:27 jthorn Exp $
+# $Header: /numrelcvs/ThornburgCVS/AHFinderDirect/src/gr/ellipsoid.maple,v 1.2 2002/04/22 15:10:32 jthorn Exp $
>
#
# ellipsoid has center (A,B,C), radius (a,b,c)
@@ -33,492 +33,6 @@
>
> read "../maple/util.mm";
-msum := proc(fn::algebraic)
-local expr, sum_index;
- if nargs < 2 then ERROR("must have two or more arguments") end if;
- expr := fn;
- for sum_index in [args[2 .. nargs]] do
- expr; sum_index; expr := 'sum'(''%%'', ''%'')
- end do;
- return eval(expr)
-end proc
-
- arctan_xy := proc(x::algebraic, y::algebraic) arctan(y, x) end proc
-
- ssqrt := proc(x::algebraic) sqrt(x, 'symbolic') end proc
-
-indices_in_order :=
-
- proc(T::table) return sort([indices(T)], lexorder_integer_list) end proc
-
-lexorder_integer_list := proc(list1::list(numeric), list2::list(numeric))
-local len1, len2, k;
- len1 := nops(list1);
- len2 := nops(list2);
- for k to min(len1, len2) do
- if list1[k] < list2[k] then return true
- elif list2[k] < list1[k] then return false
- end if
- end do;
- return evalb(len1 < len2)
-end proc
-
-sort_var_list := proc(var_list::list(name))
-global lexorder_vars;
-option remember;
- return sort(var_list, lexorder_vars)
-end proc
-
-lexorder_vars := proc(x::name, y::name)
-local xposn, yposn;
-global delta, N, N_ang, xx, yy, zz, x_xyz, x_xyz_list, x_xyz_set, r, r__fnd,
-rho, sigma, y_rs, y_rs_list, y_rs_set, xy_all_list, xy_all_set;
-option remember;
- if member(x, xy_all_list, 'xposn') and member(y, xy_all_list, 'yposn')
- then return evalb(xposn < yposn)
- else return lexorder(x, y)
- end if
-end proc
-
-gensym := proc(opt_base_name::string)
-local base_name, tn;
-global `gensym/counter`;
- if 1 <= nargs then base_name := opt_base_name
- else base_name := 'temp_'
- end if;
- if not assigned(`gensym/counter`) then `gensym/init`() end if;
- tn := cat(base_name, `gensym/counter`);
- `gensym/counter` := `gensym/counter` + 1;
- tn;
- return '%'
-end proc
-
-gensym/init := proc(opt_initial_counter::integer)
-local initial_counter;
-global `gensym/counter`;
- if 1 <= nargs then initial_counter := opt_initial_counter
- else initial_counter := 1
- end if;
- `gensym/counter` := initial_counter;
- NULL
-end proc
-
-saveit := proc(
-n::integer, fn::{procedure, string}, label::string, expr::anything)
-local save_name;
-global `saveit/level`;
- if assigned(`saveit/level`) and type(`saveit/level`, integer) and
- n <= `saveit/level` then
- save_name := cat(convert(fn, string), "/", label);
- printf(" --> `%s`\n", save_name);
- assign(convert(eval(save_name, 1), name) = expr)
- end if;
- NULL
-end proc
-
-> read "../maple/codegen2.mm";
-codegen2 := proc(expr_in::{algebraic, list(algebraic)},
-lhs_name::{name, list(name)}, output_file_name::string)
-local expr, expr_temps, input_set, output_set, expr_cost;
-global delta, N, N_ang, xx, yy, zz, x_xyz, x_xyz_list, x_xyz_set, r, r__fnd,
-rho, sigma, y_rs, y_rs_list, y_rs_set, xy_all_list, xy_all_set, inert, none,
-fnd, symmetric3_23, X_ud, X_ud__fnd, X_udd, X_udd__fnd;
- printf("codegen2(%a) --> \"%s\"\n", lhs_name, output_file_name);
- expr := expr_in;
- saveit(10, procname, "input", expr);
- printf(" convert --> equation list\n");
- expr := cvt_to_eqnlist(expr, lhs_name);
- saveit(10, procname, "eqnlist", expr);
- printf(" optimizing computation sequence\n");
- expr := [codegen[optimize](expr)];
- saveit(10, procname, "optimize", expr);
- printf(" find temporary variables\n");
- expr_temps := temps_in_eqnlist(expr, lhs_name);
- saveit(10, procname, "temps", expr_temps);
- printf(
- " convert Diff(expr,rho,sigma) --> PARTIAL_RHO_SIGMA(expr) etc\n")
- ;
- expr := fix_Diff(expr);
- saveit(10, procname, "fix_Diff", expr);
- input_set := deindex_names(
- (indets(map(rhs, expr), name) minus {op(expr_temps)}) minus
- xy_all_set);
- output_set :=
- deindex_names({op(map(lhs, expr))} minus {op(expr_temps)});
- printf(" convert R_dd[2,3] --> R_dd_23 etc\n");
- expr := unindex_names(expr);
- saveit(10, procname, "unindex", expr);
- expr_cost := codegen[cost](expr);
- printf(" convert p/q --> RATIONAL(p/q)\n");
- expr := fix_rationals(expr);
- saveit(10, procname, "fix_rationals", expr);
- printf(" writing C code\n");
- ftruncate(output_file_name);
- fprintf(output_file_name, "/*\n");
- fprintf(output_file_name, " * inputs = %a\n", input_set);
- fprintf(output_file_name, " * outputs = %a\n", output_set);
- fprintf(output_file_name, " * cost = %a\n", expr_cost);
- fprintf(output_file_name, " */\n");
- print_name_list_dcl(expr_temps, "fp", output_file_name);
- codegen[C](expr, filename = output_file_name);
- NULL
-end proc
-
-cvt_to_eqnlist := proc(expr::{algebraic, array, list({algebraic, array})},
-lhs_name::{name, list(name)})
- if type(expr, array) and type(lhs_name, name) then return map(
- proc(ii) return lhs_name[op(ii)] = expr[op(ii)] end proc,
- indices_in_order(expr))
- end if;
- if type(expr, algebraic) and type(lhs_name, name) then
- return [lhs_name = expr]
- end if;
- if type(expr, list({algebraic, array})) and type(lhs_name, list(name))
- then return zip(op@cvt_to_eqnlist, expr, lhs_name)
- end if;
- error
- "unknown type for expression!\n expr=%1\n whattype(expr)=%2\n",
- expr, whattype(expr)
-end proc
-
-fix_Diff := proc(
-expr::{algebraic, name = algebraic, list({algebraic, name = algebraic})})
-local nn, k, base, power, fn, fn_args_list, Darg, Dvars;
-global `fix_Diff/remap_table`;
- if type(expr, list) then return map(fix_Diff, expr) end if;
- if type(expr, name = algebraic) then
- return lhs(expr) = fix_Diff(rhs(expr))
- end if;
- nn := nops(expr);
- if type(expr, `+`) then
- return sum('fix_Diff(op(k, expr))', 'k' = 1 .. nn)
- end if;
- if type(expr, `*`) then
- return product('fix_Diff(op(k, expr))', 'k' = 1 .. nn)
- end if;
- if type(expr, `^`) then
- base := op(1, expr);
- power := op(2, expr);
- return fix_Diff(base)^power
- end if;
- if type(expr, function) and op(0, expr) <> 'Diff' then
- fn := op(0, expr);
- fn_args_list := [op(expr)];
- fn;
- return '%'(op(map(fix_Diff, fn_args_list)))
- end if;
- if type(expr, function) and op(0, expr) = 'Diff' then
- Darg := op(1, expr);
- Dvars := [op(2 .. nn, expr)];
- if assigned(`fix_Diff/remap_table`[op(Dvars)]) then
- `fix_Diff/remap_table`[op(Dvars)]; return '%'(Darg)
- else error "don't know how to remap Diff() call!\n Darg = %1\n\
- Dvars = %2\n", Darg, Dvars
- end if
- end if;
- return expr
-end proc
-
- fix_Diff/remap_table[rho] := PARTIAL_RHO
-
- fix_Diff/remap_table[sigma] := PARTIAL_SIGMA
-
- fix_Diff/remap_table[rho, rho] := PARTIAL_RHO_RHO
-
- fix_Diff/remap_table[rho, sigma] := PARTIAL_RHO_SIGMA
-
- fix_Diff/remap_table[sigma, sigma] := PARTIAL_SIGMA_SIGMA
-
- fix_Diff/remap_table[xx] := PARTIAL_X
-
- fix_Diff/remap_table[yy] := PARTIAL_Y
-
- fix_Diff/remap_table[zz] := PARTIAL_Z
-
- fix_Diff/remap_table[xx, xx] := PARTIAL_XX
-
- fix_Diff/remap_table[xx, yy] := PARTIAL_XY
-
- fix_Diff/remap_table[xx, zz] := PARTIAL_XZ
-
- fix_Diff/remap_table[yy, yy] := PARTIAL_YY
-
- fix_Diff/remap_table[yy, zz] := PARTIAL_YZ
-
- fix_Diff/remap_table[zz, zz] := PARTIAL_ZZ
-
-temps_in_eqnlist := proc(
-expr::list(name = algebraic), result_name::{name, list(name), set(name)})
- return remove(is_result, map(lhs, expr), result_name)
-end proc
-
-is_result := proc(try_name::name, result_name_in::{name, list(name), set(name)}
-)
-local result_name, rn;
- if type(result_name_in, name) then result_name := {result_name_in}
- else result_name := result_name_in
- end if;
- for rn in result_name do
- if try_name = rn then return true
- elif type(try_name, indexed) and op(0, try_name) = rn then
- return true
- end if
- end do;
- return false
-end proc
-
-deindex_names := proc(
-expr::{function, name, list({function, name}), set({function, name})})
-local fn, fn_args_list;
- if type(expr, {set, list}) then return map(deindex_names, expr) end if;
- if type(expr, function) then
- fn := op(0, expr);
- fn_args_list := [op(expr)];
- fn;
- return '%'(op(map(deindex_names, fn_args_list)))
- end if;
- if type(expr, indexed) then return op(0, expr) end if;
- if type(expr, {name, numeric}) then return expr end if;
- error "expr has unknown type!\nwhattype(expr)=%1\n", whattype(expr)
-end proc
-
-unindex_names := proc(expr::{algebraic, name = algebraic,
-list({algebraic, name = algebraic}), set({algebraic, name = algebraic})})
-local nn, k, base, power, fn, fn_args_list, base_name, index_seq;
- if type(expr, {set, list}) then return map(unindex_names, expr) end if;
- if type(expr, `=`) then
- return unindex_names(lhs(expr)) = unindex_names(rhs(expr))
- end if;
- nn := nops(expr);
- if type(expr, `+`) then
- return sum('unindex_names(op(k, expr))', 'k' = 1 .. nn)
- end if;
- if type(expr, `*`) then
- return product('unindex_names(op(k, expr))', 'k' = 1 .. nn)
- end if;
- if type(expr, `^`) then
- base := op(1, expr);
- power := op(2, expr);
- return unindex_names(base)^power
- end if;
- if type(expr, function) then
- fn := op(0, expr);
- fn_args_list := [op(expr)];
- fn;
- return '%'(op(map(unindex_names, fn_args_list)))
- end if;
- if type(expr, indexed) then
- base_name := op(0, expr);
- index_seq := op(expr);
- return cat(base_name, "_", index_seq)
- end if;
- if type(expr, {name, numeric}) then return expr end if;
- error "expr has unknown type!\nwhattype(expr)=%1\n", whattype(expr)
-end proc
-
-fix_rationals := proc(
-expr::{algebraic, name = algebraic, list({algebraic, name = algebraic})})
-local nn, k, expr_sign, expr_abs, base, power, fbase, fpower, fn,
-fn_args_list, int_factors, nonint_factors, num, den, mult;
- if type(expr, list) then return map(fix_rationals, expr) end if;
- if type(expr, name = algebraic) then
- return lhs(expr) = fix_rationals(rhs(expr))
- end if;
- if type(expr, function) then
- fn := op(0, expr);
- if fn <> 'RATIONAL' then
- fn_args_list := [op(expr)];
- fn;
- return '%'(op(map(fix_rationals, fn_args_list)))
- end if
- end if;
- nn := nops(expr);
- if type(expr, `+`) then
- return sum('fix_rationals(op(k, expr))', 'k' = 1 .. nn)
- end if;
- if type(expr, `*`) then
- int_factors, nonint_factors := selectremove(type, expr, integer);
- if 0 < nops(int_factors) then return op(1, int_factors)*product(
- 'fix_rationals(op(k, nonint_factors))',
- 'k' = 1 .. nops(nonint_factors))
- else return product('fix_rationals(op(k, expr))', 'k' = 1 .. nn)
- end if
- end if;
- if type(expr, `^`) then
- base := op(1, expr);
- power := op(2, expr);
- fbase := fix_rationals(base);
- if type(power, integer) then fpower := power
- else fpower := fix_rationals(power)
- end if;
- return fbase^fpower
- end if;
- if type(expr, integer) then return 'RATIONAL'(expr, 1) end if;
- if type(expr, fraction) then
- num := op(1, expr); den := op(2, expr); return 'RATIONAL'(num, den)
- end if;
- if type(expr, float) then
- mult := op(1, expr);
- power := op(2, expr);
- return fix_rationals(mult*10^power)
- end if;
- if type(expr, name) then return expr end if;
- error "expr has unknown type!\nwhattype(expr)=%1\nexpr=%2\n",
- whattype(expr), expr
-end proc
-
-print_name_list_dcl := proc(
-name_list::list({name, string}), name_type::string, file_name::string)
-local nn;
- nn := nops(name_list);
- if nn <= 10 then
- map(convert, name_list, string);
- ListTools[Join](%, ", ");
- cat(op(%));
- fprintf(file_name, "%s %s;\n", name_type, %);
- NULL;
- return
- end if;
- print_name_list_dcl([op(1 .. 10, name_list)], name_type, file_name);
- print_name_list_dcl([op(11 .. nn, name_list)], name_type, file_name)
-end proc
-
->
-> [solve(eqn, r)];
-bytes used=1000572, alloc=851812, time=0.07
- 2 2 2 2 2 2
-[1/2 (2 a b zcos CW + 2 a c ycos BV + 2 b c xcos AU + 2 (
-
- 4 2 2 2 4 2
- 2 a b zcos CW c ycos BV + 2 a b zcos CW c xcos AU
-
- 2 4 2 4 2 2 2 2 2 4 2 2 2
- + 2 a c ycos BV b xcos AU - b c xcos a CW - b c xcos a BV
-
- 4 4 2 2 4 2 2 2 2 2 4 2 2 2
- + b c xcos a - a c ycos b CW - a c ycos b AU
-
- 4 4 2 2 4 2 2 2 2 2 4 2 2 2
- + a c ycos b - a b zcos c BV - a b zcos c AU
-
- 4 4 2 2 1/2 / 2 2 2 2 2 2 2 2 2
- + a b zcos c ) ) / (b c xcos + a c ycos + a b zcos ), 1/2 (
- /
-
- 2 2 2 2 2 2
- 2 a b zcos CW + 2 a c ycos BV + 2 b c xcos AU - 2 (
-
- 4 2 2 2 4 2
- 2 a b zcos CW c ycos BV + 2 a b zcos CW c xcos AU
-
- 2 4 2 4 2 2 2 2 2 4 2 2 2
- + 2 a c ycos BV b xcos AU - b c xcos a CW - b c xcos a BV
-
- 4 4 2 2 4 2 2 2 2 2 4 2 2 2
- + b c xcos a - a c ycos b CW - a c ycos b AU
-
- 4 4 2 2 4 2 2 2 2 2 4 2 2 2
- + a c ycos b - a b zcos c BV - a b zcos c AU
-
- 4 4 2 2 1/2 / 2 2 2 2 2 2 2 2 2
- + a b zcos c ) ) / (b c xcos + a c ycos + a b zcos )]
- /
-
-> map(simplify, %);
-bytes used=2000744, alloc=1376004, time=0.12
-bytes used=3001976, alloc=1769148, time=0.19
- 2 2 2 2 2 2 2 2 2
-[(a b zcos CW + a c ycos BV + b c xcos AU + (-a b c (
-
- 2 2 2
- -2 a zcos CW ycos BV - 2 b zcos CW xcos AU - 2 c ycos BV xcos AU
-
- 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
- + b xcos CW + c xcos BV - b c xcos + a ycos CW + c ycos AU
-
- 2 2 2 2 2 2 2 2 2 2 2 2 1/2 /
- - a c ycos + a zcos BV + b zcos AU - a b zcos )) ) / (
- /
-
- 2 2 2 2 2 2 2 2 2 2 2 2 2
- b c xcos + a c ycos + a b zcos ), (a b zcos CW + a c ycos BV
-
- 2 2 2 2 2 2 2
- + b c xcos AU - (-a b c (-2 a zcos CW ycos BV - 2 b zcos CW xcos AU
-
- 2 2 2 2 2 2 2 2 2 2
- - 2 c ycos BV xcos AU + b xcos CW + c xcos BV - b c xcos
-
- 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
- + a ycos CW + c ycos AU - a c ycos + a zcos BV + b zcos AU
-
- 2 2 2 1/2 / 2 2 2 2 2 2 2 2 2
- - a b zcos )) ) / (b c xcos + a c ycos + a b zcos )]
- /
-
-> [r_plus = %[1], r_minus = %[2]];
- 2 2 2 2 2 2 2 2 2
-[r_plus = (a b zcos CW + a c ycos BV + b c xcos AU + (-a b c (
-
- 2 2 2
- -2 a zcos CW ycos BV - 2 b zcos CW xcos AU - 2 c ycos BV xcos AU
-
- 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
- + b xcos CW + c xcos BV - b c xcos + a ycos CW + c ycos AU
-
- 2 2 2 2 2 2 2 2 2 2 2 2 1/2 /
- - a c ycos + a zcos BV + b zcos AU - a b zcos )) ) / (
- /
-
- 2 2 2 2 2 2 2 2 2 2 2
- b c xcos + a c ycos + a b zcos ), r_minus = (a b zcos CW
-
- 2 2 2 2 2 2 2 2
- + a c ycos BV + b c xcos AU - (-a b c (-2 a zcos CW ycos BV
-
- 2 2 2 2 2
- - 2 b zcos CW xcos AU - 2 c ycos BV xcos AU + b xcos CW
-
- 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
- + c xcos BV - b c xcos + a ycos CW + c ycos AU - a c ycos
-
- 2 2 2 2 2 2 2 2 2 1/2 /
- + a zcos BV + b zcos AU - a b zcos )) ) / (
- /
-
- 2 2 2 2 2 2 2 2 2
- b c xcos + a c ycos + a b zcos )]
-
-> solnlist := [codegen[optimize](%)];
- 2 2 2
-solnlist := [t1 = a , t2 = b , t3 = t1 t2, t5 = t3 zcos CW, t6 = c , t7 = t1 t6,
-
- 2 2
- t9 = t7 ycos BV, t10 = t2 t6, t12 = t10 xcos AU, t28 = xcos , t30 = CW ,
-
- 2 2 2 2
- t33 = BV , t35 = t10 t28, t36 = ycos , t40 = AU , t42 = t7 t36, t43 = zcos ,
-
- t48 = t3 t43, t49 = -2 t1 zcos CW ycos BV - 2 t2 zcos CW xcos AU
-
- - 2 t6 ycos BV xcos AU + t2 t28 t30 + t6 t28 t33 - t35 + t1 t36 t30
-
- 1/2
- + t6 t36 t40 - t42 + t1 t43 t33 + t2 t43 t40 - t48, t52 = (-t3 t6 t49) ,
-
- 1
- t55 = ---------------, r_plus = (t5 + t9 + t12 + t52) t55,
- t35 + t42 + t48
-
- r_minus = (t5 + t9 + t12 - t52) t55]
-
->
-> ftruncate("ellipsoid.c");
- ftruncate("ellipsoid.c")
-
-> print_name_list_dcl(temps_in_eqnlist(solnlist, [r_plus,r_minus]),
-> "fp", "ellipsoid.c");
-> codegen[C](solnlist, filename="ellipsoid.c");
-bytes used=4002168, alloc=1769148, time=0.26
+Error, unable to read `../maple/util.mm`
> quit
-bytes used=4027884, alloc=1769148, time=0.27
+bytes used=129844, alloc=196572, time=0.03
diff --git a/src/gr/gfn.hh b/src/gr/gfn.hh
index a6c1e11..16af52f 100644
--- a/src/gr/gfn.hh
+++ b/src/gr/gfn.hh
@@ -14,27 +14,9 @@ namespace nominal_gfns
{
enum {
min_gfn = 1,
- gfn__xx = min_gfn,
- gfn__yy,
- gfn__zz,
- gfn__X_ud_11,
- gfn__X_ud_12,
- gfn__X_ud_13,
- gfn__X_ud_21,
- gfn__X_ud_22,
- gfn__X_ud_23,
- gfn__X_udd_111,
- gfn__X_udd_112,
- gfn__X_udd_113,
- gfn__X_udd_122,
- gfn__X_udd_123,
- gfn__X_udd_133,
- gfn__X_udd_211,
- gfn__X_udd_212,
- gfn__X_udd_213,
- gfn__X_udd_222,
- gfn__X_udd_223,
- gfn__X_udd_233,
+ gfn__global_x = min_gfn, // n.b. no macro for this in "cg.hh"
+ gfn__global_y, // (ditto)
+ gfn__global_z, // (ditto)
gfn__g_dd_11,
gfn__g_dd_12,
gfn__g_dd_13,
diff --git a/src/gr/horizon_function.cc b/src/gr/horizon_function.cc
index 0cb1f7e..6ea0a8d 100644
--- a/src/gr/horizon_function.cc
+++ b/src/gr/horizon_function.cc
@@ -3,8 +3,9 @@
//
// <<<prototypes for functions local to this file>>>
// horizon_function - top-level driver
-/// xyz_posns_and_deriv_coeffs - init xyz posns of grid points, xyz deriv coeffs
+/// setup_xyz_posns - setup global xyz posns of grid points
/// interpolate_geometry - interpolate $g_{ij}$, $K_{ij}$ from Cactus 3-D grid
+/// compute_H - compute H(h) given earlier setup
//
#include <stdio.h>
@@ -44,7 +45,7 @@ using jtutil::error_exit;
//
namespace {
-void xyz_posns_and_deriv_coeffs(patch_system& ps);
+void setup_xyz_posns(patch_system& ps);
void interpolate_geometry(patch_system& ps,
const struct cactus_grid_info& cgi,
const struct geometry_interpolator_info& ii);
@@ -67,20 +68,22 @@ void compute_H(patch_system& ps);
// gxx,gxy,gxz,gyy,gyz,gzz # 3-metric $g_{ij}$
// kxx,kxy,kxz,kyy,kyz,kzz # extrinsic curvature $K_{ij}$
//
-// Outputs (angular gridfns, all on the nominal grid):
-// ## computed directly from h
+// Outputs (temporaries computed at each grid point)
+// ## computed by hand-written code
// xx,yy,zz # xyz positions of grid points
// X_ud_*, X_udd_* # xyz derivative coefficients
-// ## interpolated from 3-D Cactus grid
-// g_dd_{11,12,13,22,23,33} # $g_{ij}$
-// K_dd_{11,12,13,22,23,33} # $K_{ij}$
-// partial_d_g_dd_{1,2,3}{11,12,13,22,23,33} # $\partial_k g_{ij}$
// ## computed by Maple-generated code
// g_uu_{11,12,13,22,23,33} # $g^{ij}$
// K # $K$
// K_dd_{11,12,13,22,23,33} # $K^{ij}$
// partial_d_ln_sqrt_g_d # $\partial_i \ln \sqrt{g}$
// partial_d_g_uu_{1,2,3}{11,12,13,22,23,33} # $\partial_k g^{ij}$
+//
+// Outputs (angular gridfns, all on the nominal grid):
+// ## interpolated from 3-D Cactus grid
+// g_dd_{11,12,13,22,23,33} # $g_{ij}$
+// K_dd_{11,12,13,22,23,33} # $K_{ij}$
+// partial_d_g_dd_{1,2,3}{11,12,13,22,23,33} # $\partial_k g_{ij}$
// H # $H = H(h)$
//
void horizon_function(patch_system& ps,
@@ -92,8 +95,8 @@ CCTK_VInfo(CCTK_THORNSTRING, " horizon function");
// fill in values of ghosted gridfns in ghost zones
ps.synchronize_ghost_zones(ghosted_gfns::gfn__h, ghosted_gfns::gfn__h);
-// compute xyz positions of grid points and xyz derivative coeffs
-xyz_posns_and_deriv_coeffs(ps);
+// set up xyz positions of grid points
+setup_xyz_posns(ps);
// interpolate $g_{ij}$, $K_{ij}$ --> $g_{ij}$, $K_{ij}$, $\partial_k g_{ij}$
interpolate_geometry(ps, cgi, ii);
@@ -106,13 +109,11 @@ compute_H(ps);
//******************************************************************************
//
-// This function computes
-// - the xyz positions of the grid points (gridfns xx, yy, and zz)
-// - the xyz derivative coefficients (gridfns X_ud and X_udd).
-// on the nominal grid.
+// This function sets up the global xyz positions of the grid points
+// in the gridfns global_[xyz]. These will be used by interplate_geometry().
//
namespace {
-void xyz_posns_and_deriv_coeffs(patch_system& ps)
+void setup_xyz_posns(patch_system& ps)
{
CCTK_VInfo(CCTK_THORNSTRING, " xyz positions and derivative coefficients");
@@ -126,8 +127,8 @@ CCTK_VInfo(CCTK_THORNSTRING, " xyz positions and derivative coefficients");
isigma <= p.max_isigma() ;
++isigma)
{
- const fp r
- = p.ghosted_gridfn(ghosted_gfns::gfn__h, irho,isigma);
+ const fp r = p.ghosted_gridfn(ghosted_gfns::gfn__h,
+ irho,isigma);
const fp rho = p.rho_of_irho(irho);
const fp sigma = p.sigma_of_isigma(isigma);
fp local_x, local_y, local_z;
@@ -136,50 +137,9 @@ CCTK_VInfo(CCTK_THORNSTRING, " xyz positions and derivative coefficients");
const fp global_y = ps.global_y_of_local_y(local_y);
const fp global_z = ps.global_z_of_local_z(local_z);
- // global xyz positions of grid points
- p.gridfn(nominal_gfns::gfn__xx, irho,isigma) = global_x;
- p.gridfn(nominal_gfns::gfn__yy, irho,isigma) = global_y;
- p.gridfn(nominal_gfns::gfn__zz, irho,isigma) = global_z;
-
- // 1st derivative coefficient gridfns X_ud
- p.gridfn(nominal_gfns::gfn__X_ud_11, irho,isigma)
- = p.partial_rho_wrt_x(local_x,local_y,local_z);
- p.gridfn(nominal_gfns::gfn__X_ud_12, irho,isigma)
- = p.partial_rho_wrt_y(local_x,local_y,local_z);
- p.gridfn(nominal_gfns::gfn__X_ud_13, irho,isigma)
- = p.partial_rho_wrt_z(local_x,local_y,local_z);
- p.gridfn(nominal_gfns::gfn__X_ud_21, irho,isigma)
- = p.partial_sigma_wrt_x(local_x,local_y,local_z);
- p.gridfn(nominal_gfns::gfn__X_ud_22, irho,isigma)
- = p.partial_sigma_wrt_y(local_x,local_y,local_z);
- p.gridfn(nominal_gfns::gfn__X_ud_23, irho,isigma)
- = p.partial_sigma_wrt_z(local_x,local_y,local_z);
-
- // 2nd derivative coefficient gridfns X_udd
- p.gridfn(nominal_gfns::gfn__X_udd_111, irho,isigma)
- = p.partial2_rho_wrt_xx(local_x,local_y,local_z);
- p.gridfn(nominal_gfns::gfn__X_udd_112, irho,isigma)
- = p.partial2_rho_wrt_xy(local_x,local_y,local_z);
- p.gridfn(nominal_gfns::gfn__X_udd_113, irho,isigma)
- = p.partial2_rho_wrt_xz(local_x,local_y,local_z);
- p.gridfn(nominal_gfns::gfn__X_udd_122, irho,isigma)
- = p.partial2_rho_wrt_yy(local_x,local_y,local_z);
- p.gridfn(nominal_gfns::gfn__X_udd_123, irho,isigma)
- = p.partial2_rho_wrt_yz(local_x,local_y,local_z);
- p.gridfn(nominal_gfns::gfn__X_udd_133, irho,isigma)
- = p.partial2_rho_wrt_zz(local_x,local_y,local_z);
- p.gridfn(nominal_gfns::gfn__X_udd_211, irho,isigma)
- = p.partial2_sigma_wrt_xx(local_x,local_y,local_z);
- p.gridfn(nominal_gfns::gfn__X_udd_212, irho,isigma)
- = p.partial2_sigma_wrt_xy(local_x,local_y,local_z);
- p.gridfn(nominal_gfns::gfn__X_udd_213, irho,isigma)
- = p.partial2_sigma_wrt_xz(local_x,local_y,local_z);
- p.gridfn(nominal_gfns::gfn__X_udd_222, irho,isigma)
- = p.partial2_sigma_wrt_yy(local_x,local_y,local_z);
- p.gridfn(nominal_gfns::gfn__X_udd_223, irho,isigma)
- = p.partial2_sigma_wrt_yz(local_x,local_y,local_z);
- p.gridfn(nominal_gfns::gfn__X_udd_233, irho,isigma)
- = p.partial2_sigma_wrt_zz(local_x,local_y,local_z);
+ p.gridfn(nominal_gfns::gfn__global_x, irho,isigma) = global_x;
+ p.gridfn(nominal_gfns::gfn__global_y, irho,isigma) = global_y;
+ p.gridfn(nominal_gfns::gfn__global_z, irho,isigma) = global_z;
}
}
}
@@ -231,9 +191,9 @@ const int N_interp_points = ps.N_grid_points();
const int interp_coords_type_code = CCTK_VARIABLE_REAL;
const void* const interp_coords[N_GRID_DIMS]
= {
- static_cast<const void*>(ps.gridfn_data(nominal_gfns::gfn__xx)),
- static_cast<const void*>(ps.gridfn_data(nominal_gfns::gfn__yy)),
- static_cast<const void*>(ps.gridfn_data(nominal_gfns::gfn__zz)),
+ static_cast<const void*>(ps.gridfn_data(nominal_gfns::gfn__global_x)),
+ static_cast<const void*>(ps.gridfn_data(nominal_gfns::gfn__global_y)),
+ static_cast<const void*>(ps.gridfn_data(nominal_gfns::gfn__global_z)),
};
const int N_INPUT_ARRAYS = 12;
@@ -410,9 +370,12 @@ if (status == CCTK_ERROR_INTERP_POINT_X_RANGE)
assert(out_of_range_pt >= 0);
assert(out_of_range_pt < ps.N_grid_points());
- const double x = ps.gridfn_data(nominal_gfns::gfn__xx)[out_of_range_pt];
- const double y = ps.gridfn_data(nominal_gfns::gfn__yy)[out_of_range_pt];
- const double z = ps.gridfn_data(nominal_gfns::gfn__zz)[out_of_range_pt];
+ const double global_x = ps.gridfn_data(nominal_gfns::gfn__global_x)
+ [out_of_range_pt];
+ const double global_y = ps.gridfn_data(nominal_gfns::gfn__global_y)
+ [out_of_range_pt];
+ const double global_z = ps.gridfn_data(nominal_gfns::gfn__global_z)
+ [out_of_range_pt];
assert(out_of_range_axis >= 0);
assert(out_of_range_axis < N_GRID_DIMS);
@@ -426,7 +389,7 @@ if (status == CCTK_ERROR_INTERP_POINT_X_RANGE)
" the point (%g,%g,%g) on the trial horizon surface\n"
" is outside the grid in the %c%c direction!\n"
,
- x, y, z,
+ global_x, global_y, global_z,
end, axis); /*NOTREACHED*/
}
if (status < 0)
@@ -459,9 +422,44 @@ CCTK_VInfo(CCTK_THORNSTRING, " computing H(h)");
isigma <= p.max_isigma() ;
++isigma)
{
+ //
+ // compute the X_ud and X_udd derivative coefficients
+ // ... n.b. this uses the *local* (x,y,z) coordinates
+ //
+ const fp r = p.ghosted_gridfn(ghosted_gfns::gfn__h,
+ irho,isigma);
+ const fp rho = p.rho_of_irho(irho);
+ const fp sigma = p.sigma_of_isigma(isigma);
+ fp xx, yy, zz;
+ p.xyz_of_r_rho_sigma(r,rho,sigma, xx, yy, zz);
+
+ // 1st derivative coefficients X_ud
+ const fp X_ud_11 = p.partial_rho_wrt_x(xx, yy, zz);
+ const fp X_ud_12 = p.partial_rho_wrt_y(xx, yy, zz);
+ const fp X_ud_13 = p.partial_rho_wrt_z(xx, yy, zz);
+ const fp X_ud_21 = p.partial_sigma_wrt_x(xx, yy, zz);
+ const fp X_ud_22 = p.partial_sigma_wrt_y(xx, yy, zz);
+ const fp X_ud_23 = p.partial_sigma_wrt_z(xx, yy, zz);
+
+ // 2nd derivative coefficient gridfns X_udd
+ const fp X_udd_111 = p.partial2_rho_wrt_xx(xx, yy, zz);
+ const fp X_udd_112 = p.partial2_rho_wrt_xy(xx, yy, zz);
+ const fp X_udd_113 = p.partial2_rho_wrt_xz(xx, yy, zz);
+ const fp X_udd_122 = p.partial2_rho_wrt_yy(xx, yy, zz);
+ const fp X_udd_123 = p.partial2_rho_wrt_yz(xx, yy, zz);
+ const fp X_udd_133 = p.partial2_rho_wrt_zz(xx, yy, zz);
+ const fp X_udd_211 = p.partial2_sigma_wrt_xx(xx, yy, zz);
+ const fp X_udd_212 = p.partial2_sigma_wrt_xy(xx, yy, zz);
+ const fp X_udd_213 = p.partial2_sigma_wrt_xz(xx, yy, zz);
+ const fp X_udd_222 = p.partial2_sigma_wrt_yy(xx, yy, zz);
+ const fp X_udd_223 = p.partial2_sigma_wrt_yz(xx, yy, zz);
+ const fp X_udd_233 = p.partial2_sigma_wrt_zz(xx, yy, zz);
+
+ //
// "call" the Maple-generated code
- // ... each file has a separate set of temporary variables,
+ // ... each cg/*.c file has a separate set of temp variables,
// and so must be inside its own set of { } braces
+ //
#include "cg.hh"
{
#include "cg/inverse_metric.c"
diff --git a/src/gr/maple.log b/src/gr/maple.log
index 81a1c48..1b630fc 100644
--- a/src/gr/maple.log
+++ b/src/gr/maple.log
@@ -99,14 +99,14 @@ rho, sigma, y_rs, y_rs_list, y_rs_set, xy_all_list, xy_all_set;
x_xyz[1] := xx;
x_xyz[2] := yy;
x_xyz[3] := zz;
- x_xyz_list := [x_xyz[1], x_xyz[2], x_xyz[3]];
- x_xyz_set := {op(x_xyz_list)};
+ x_xyz_list := [xx, yy, zz];
+ x_xyz_set := {yy, xx, zz};
r__fnd := ssqrt(xx^2 + yy^2 + zz^2);
y_rs := array(1 .. N_ang);
y_rs[1] := rho;
y_rs[2] := sigma;
- y_rs_list := [y_rs[1], y_rs[2]];
- y_rs_set := {op(y_rs_list)};
+ y_rs_list := [rho, sigma];
+ y_rs_set := {sigma, rho};
xy_all_list := [op(x_xyz_list), op(y_rs_list)];
xy_all_set := {op(xy_all_list)};
NULL
@@ -567,9 +567,9 @@ local nn;
end proc
>
-> read "setup_gfas.mm";
+> read "setup_gr_gfas.mm";
setup_gr_gfas := proc()
-global delta, N, N_ang, xx, yy, zz, x_xyz, x_xyz_list, x_xyz_set, r, r__fnd,
+global delta, N, N_ang, x, y, z, x_xyz, x_xyz_list, x_xyz_set, r, r__fnd,
rho, sigma, y_rs, y_rs_list, y_rs_set, xy_all_list, xy_all_set, inert, none,
fnd, symmetric3_23, X_ud, X_ud__fnd, X_udd, X_udd__fnd, g_dd, K_dd, g_uu,
g_uu__fnd, K_uu, K_uu__fnd, K, K__fnd, partial_d_g_dd, partial_d_ln_sqrt_g,
@@ -599,7 +599,7 @@ end proc
Diff/gridfn := proc(operand)
local var_list, posn;
-global delta, N, N_ang, xx, yy, zz, x_xyz, x_xyz_list, x_xyz_set, r, r__fnd,
+global delta, N, N_ang, x, y, z, x_xyz, x_xyz_list, x_xyz_set, r, r__fnd,
rho, sigma, y_rs, y_rs_list, y_rs_set, xy_all_list, xy_all_set, inert, none,
fnd, symmetric3_23, X_ud, X_ud__fnd, X_udd, X_udd__fnd, g_dd, K_dd, g_uu,
g_uu__fnd, K_uu, K_uu__fnd, K, K__fnd, partial_d_g_dd, partial_d_ln_sqrt_g,
@@ -623,7 +623,7 @@ auxiliary := proc(cg_flag::boolean)
end proc
inverse_metric := proc(cg_flag::boolean)
-global delta, N, N_ang, xx, yy, zz, x_xyz, x_xyz_list, x_xyz_set, r, r__fnd,
+global delta, N, N_ang, x, y, z, x_xyz, x_xyz_list, x_xyz_set, r, r__fnd,
rho, sigma, y_rs, y_rs_list, y_rs_set, xy_all_list, xy_all_set, inert, none,
fnd, symmetric3_23, X_ud, X_ud__fnd, X_udd, X_udd__fnd, g_dd, K_dd, g_uu,
g_uu__fnd, K_uu, K_uu__fnd, K, K__fnd, partial_d_g_dd, partial_d_ln_sqrt_g,
@@ -641,7 +641,7 @@ end proc
extrinsic_curvature_trace_raise := proc(cg_flag::boolean)
local i, j, m, n;
-global delta, N, N_ang, xx, yy, zz, x_xyz, x_xyz_list, x_xyz_set, r, r__fnd,
+global delta, N, N_ang, x, y, z, x_xyz, x_xyz_list, x_xyz_set, r, r__fnd,
rho, sigma, y_rs, y_rs_list, y_rs_set, xy_all_list, xy_all_set, inert, none,
fnd, symmetric3_23, X_ud, X_ud__fnd, X_udd, X_udd__fnd, g_dd, K_dd, g_uu,
g_uu__fnd, K_uu, K_uu__fnd, K, K__fnd, partial_d_g_dd, partial_d_ln_sqrt_g,
@@ -673,7 +673,7 @@ end proc
inverse_metric_gradient := proc(cg_flag::boolean)
local k, i, j, m, n;
-global delta, N, N_ang, xx, yy, zz, x_xyz, x_xyz_list, x_xyz_set, r, r__fnd,
+global delta, N, N_ang, x, y, z, x_xyz, x_xyz_list, x_xyz_set, r, r__fnd,
rho, sigma, y_rs, y_rs_list, y_rs_set, xy_all_list, xy_all_set, inert, none,
fnd, symmetric3_23, X_ud, X_ud__fnd, X_udd, X_udd__fnd, g_dd, K_dd, g_uu,
g_uu__fnd, K_uu, K_uu__fnd, K, K__fnd, partial_d_g_dd, partial_d_ln_sqrt_g,
@@ -699,7 +699,7 @@ end proc
metric_det_gradient := proc(cg_flag::boolean)
local k, i, j;
-global delta, N, N_ang, xx, yy, zz, x_xyz, x_xyz_list, x_xyz_set, r, r__fnd,
+global delta, N, N_ang, x, y, z, x_xyz, x_xyz_list, x_xyz_set, r, r__fnd,
rho, sigma, y_rs, y_rs_list, y_rs_set, xy_all_list, xy_all_set, inert, none,
fnd, symmetric3_23, X_ud, X_ud__fnd, X_udd, X_udd__fnd, g_dd, K_dd, g_uu,
g_uu__fnd, K_uu, K_uu__fnd, K, K__fnd, partial_d_g_dd, partial_d_ln_sqrt_g,
@@ -826,7 +826,7 @@ codegen2(g_uu) --> "cg/inverse_metric.c"
find temporary variables
--> `codegen2/temps`
convert Diff(expr,rho,sigma) --> PARTIAL_RHO_SIGMA(expr) etc
-bytes used=1000044, alloc=917336, time=0.05
+bytes used=1000180, alloc=917336, time=0.08
--> `codegen2/fix_Diff`
convert R_dd[2,3] --> R_dd_23 etc
--> `codegen2/unindex`
@@ -839,7 +839,7 @@ codegen2([K, K_uu]) --> "cg/extrinsic_curvature_trace_raise.c"
convert --> equation list
--> `codegen2/eqnlist`
optimizing computation sequence
-bytes used=2000244, alloc=1441528, time=0.13
+bytes used=2000764, alloc=1441528, time=0.17
--> `codegen2/optimize`
find temporary variables
--> `codegen2/temps`
@@ -847,39 +847,39 @@ bytes used=2000244, alloc=1441528, time=0.13
--> `codegen2/fix_Diff`
convert R_dd[2,3] --> R_dd_23 etc
--> `codegen2/unindex`
-bytes used=3000564, alloc=1572576, time=0.21
+bytes used=3001128, alloc=1572576, time=0.22
convert p/q --> RATIONAL(p/q)
--> `codegen2/fix_rationals`
writing C code
> metric_derivs(true);
inverse_metric_gradient...
-bytes used=4001040, alloc=1638100, time=0.29
+bytes used=4001740, alloc=1638100, time=0.28
codegen2(partial_d_g_uu) --> "cg/inverse_metric_gradient.c"
--> `codegen2/input`
convert --> equation list
--> `codegen2/eqnlist`
optimizing computation sequence
-bytes used=5001252, alloc=1638100, time=0.37
+bytes used=5001904, alloc=1638100, time=0.35
--> `codegen2/optimize`
find temporary variables
--> `codegen2/temps`
convert Diff(expr,rho,sigma) --> PARTIAL_RHO_SIGMA(expr) etc
--> `codegen2/fix_Diff`
-bytes used=6001552, alloc=1703624, time=0.44
+bytes used=6002084, alloc=1703624, time=0.42
convert R_dd[2,3] --> R_dd_23 etc
--> `codegen2/unindex`
-bytes used=7001892, alloc=1703624, time=0.50
+bytes used=7002504, alloc=1703624, time=0.49
convert p/q --> RATIONAL(p/q)
--> `codegen2/fix_rationals`
writing C code
-bytes used=8002240, alloc=1703624, time=0.56
+bytes used=8002836, alloc=1703624, time=0.53
metric_det_gradient...
codegen2(partial_d_ln_sqrt_g) --> "cg/metric_det_gradient.c"
--> `codegen2/input`
convert --> equation list
--> `codegen2/eqnlist`
optimizing computation sequence
-bytes used=9002448, alloc=1703624, time=0.66
+bytes used=9003068, alloc=1703624, time=0.65
--> `codegen2/optimize`
find temporary variables
--> `codegen2/temps`
@@ -894,40 +894,40 @@ codegen/C/expression: Unknown function: RATIONAL will be left as is.
> horizon(true);
non_unit_normal...
non_unit_normal_deriv...
-bytes used=10002720, alloc=1769148, time=0.73
+bytes used=10003284, alloc=1769148, time=0.74
horizon_function...
-bytes used=11003044, alloc=1834672, time=0.80
+bytes used=11003584, alloc=1834672, time=0.81
codegen2(H) --> "cg/horizon_function.c"
--> `codegen2/input`
convert --> equation list
--> `codegen2/eqnlist`
optimizing computation sequence
-bytes used=12003924, alloc=1834672, time=0.87
-bytes used=13004132, alloc=2031244, time=0.97
-bytes used=14004312, alloc=2031244, time=1.04
+bytes used=12004160, alloc=1834672, time=0.88
+bytes used=13004312, alloc=2031244, time=0.97
+bytes used=14004700, alloc=2031244, time=1.05
--> `codegen2/optimize`
find temporary variables
--> `codegen2/temps`
convert Diff(expr,rho,sigma) --> PARTIAL_RHO_SIGMA(expr) etc
-bytes used=15004792, alloc=2096768, time=1.08
+bytes used=15005124, alloc=2096768, time=1.13
--> `codegen2/fix_Diff`
convert R_dd[2,3] --> R_dd_23 etc
-bytes used=16004952, alloc=2096768, time=1.15
+bytes used=16005504, alloc=2096768, time=1.20
--> `codegen2/unindex`
-bytes used=17005192, alloc=2096768, time=1.21
+bytes used=17005672, alloc=2096768, time=1.27
convert p/q --> RATIONAL(p/q)
-bytes used=18005528, alloc=2096768, time=1.27
+bytes used=18006112, alloc=2096768, time=1.33
--> `codegen2/fix_rationals`
writing C code
codegen/C/expression: Unknown function: PARTIAL_RHO will be left as is.
codegen/C/expression: Unknown function: PARTIAL_SIGMA will be left as is.
-bytes used=19005708, alloc=2096768, time=1.32
+bytes used=19006376, alloc=2096768, time=1.40
codegen/C/expression: Unknown function: PARTIAL_RHO_RHO
will be left as is.
codegen/C/expression: Unknown function: PARTIAL_RHO_SIGMA
will be left as is.
codegen/C/expression: Unknown function: PARTIAL_SIGMA_SIGMA
will be left as is.
-bytes used=20005860, alloc=2096768, time=1.41
+bytes used=20006612, alloc=2096768, time=1.52
> quit
-bytes used=20241868, alloc=2096768, time=1.45
+bytes used=20238080, alloc=2096768, time=1.54