diff options
Diffstat (limited to 'src/GeneralizedPolynomial-Uniform/Hermite/1d.log')
-rw-r--r-- | src/GeneralizedPolynomial-Uniform/Hermite/1d.log | 2420 |
1 files changed, 2420 insertions, 0 deletions
diff --git a/src/GeneralizedPolynomial-Uniform/Hermite/1d.log b/src/GeneralizedPolynomial-Uniform/Hermite/1d.log new file mode 100644 index 0000000..882988a --- /dev/null +++ b/src/GeneralizedPolynomial-Uniform/Hermite/1d.log @@ -0,0 +1,2420 @@ + |\^/| Maple 7 (IBM INTEL LINUX) +._|\| |/|_. Copyright (c) 2001 by Waterloo Maple Inc. + \ MAPLE / All rights reserved. Maple is a registered trademark of + <____ ____> Waterloo Maple Inc. + | Type ? for help. +# util.maple -- misc utility routines +# $Header: /cactusdevcvs/CactusBase/LocalInterp/src/GeneralizedPolynomial-Uniform/util.maple,v 1.4 2002/08/20 16:46:06 jthorn Exp $ +> +# +# fix_rationals - convert numbers to RATIONAL() calls +# nonmatching_names - find names in a list which *don't* have a specified prefix +# sprint_numeric_list - convert a numeric list to a valid C identifier suffix +# print_name_list_dcl - print a C declaration for a list of names +# +# hypercube_points - compute all (integer) points in an N-dimensional hypercube +# +# ftruncate - truncate a file to zero length +# +> +################################################################################ +################################################################################ +################################################################################ +> +# +# This function converts all {integer, rational} subexpressions of its +# input except integer exponents and -1 factors in products, into function +# calls +# RATIONAL(num,den) +# This is useful in conjunction with the C() library function, since +# +# C( (1/3) * foo * bar ) +# t0 = foo*bar/3; +# +# generates a (slow) division (and runs the risk of mixed-mode-arithmetic +# problems), while +# +# C((1.0/3.0) * foo * bar); +# t0 = 0.3333333333*foo*bar; +# +# suffers from roundoff error. With this function, +# +# fix_rationals((1/3) * foo * bar); +# RATIONAL(1,3) foo bar +# C(%); +# t0 = RATIONAL(1.0,3.0)*foo*bar; +# +# which a C preprocessor macro can easily convert to the desired +# +# t0 = (1.0/3.0)*foo*bar; +# +# Additionally, this function can be told to leave certain types of +# subexpressions unconverged. For example, +# fix_rationals(expr, type, specfunc(integer, DATA)); +# will leave all subexpressions of the form DATA(integer arguments) +# unconverted. +# +# Arguments: +# expr = (in) The expression to be converted. +# inert_fn = (optional in) +# If specified, this argument should be a Boolean procedure +# or the name of a Boolean procedure. This procedure should +# take one or more argument, and return true if and only if +# the first argument should *not* be converted, i.e. if we +# should leave this expression unchanged. See the last +# example above. +# ... = (optional in) +# Any further arguments are passed as additional arguments to +# the inert_fn procedure. +# +> fix_rationals := +> proc( +> expr::{ +> algebraic, name = algebraic, +> list({algebraic, name = algebraic}), +> set ({algebraic, name = algebraic}) +> }, +> inert_fn::{name, procedure} +> ) +> local nn, k, +> base, power, fbase, fpower, +> fn, fn_args_list, +> num, den, mult; +> +# do we want to convert this expression? +> if ((nargs >= 2) and inert_fn(expr, args[3..nargs])) +> then return expr; +> end if; +> +# recurse over lists and sets +> if (type(expr, {list,set})) +> then return map(fix_rationals, expr, args[2..nargs]); +> end if; +> +# recurse over equation right hand sides +> if (type(expr, name = algebraic)) +> then return ( lhs(expr) = fix_rationals(rhs(expr), args[2..nargs]) ); +> end if; +> +# recurse over functions other than RATIONAL() +> if (type(expr, function)) +> then +> fn := op(0, expr); +> if (fn <> 'RATIONAL') +> then +> fn_args_list := [op(expr)]; +> fn_args_list := map(fix_rationals, fn_args_list, args[2..nargs]); +> fn; return '%'( op(fn_args_list) ); +> end if; +> end if; +> +> nn := nops(expr); +> +# recurse over sums +> if (type(expr, `+`)) +> then return sum('fix_rationals(op(k,expr), args[2..nargs])', 'k'=1..nn); +> end if; +> +# recurse over products +# ... leaving leading -1 factors intact, i.e. not converted to RATIONAL(-1,1) +> if (type(expr, `*`)) +> then +> if (op(1, expr) = -1) +> then return -1*fix_rationals(remove(type, expr, 'identical(-1)'), +> args[2..nargs]); +> else return product('fix_rationals(op(k,expr), args[2..nargs])', +> 'k'=1..nn); +> end if; +> end if; +> +# recurse over powers +# ... leaving integer exponents intact +> if (type(expr, `^`)) +> then +> base := op(1, expr); +> power := op(2, expr); +> +> fbase := fix_rationals(base, args[2..nargs]); +> if (type(power, integer)) +> then fpower := power; +> else fpower := fix_rationals(power, args[2..nargs]); +> end if; +> return fbase ^ fpower; +> end if; +> +# fix integers and fractions +> 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; +> +# turn Maple floating-point into integer fraction, then recursively fix that +> if (type(expr, float)) +> then +> mult := op(1, expr); +> power := op(2, expr); +> return fix_rationals(mult * 10^power, args[2..nargs]); +> end if; +> +# identity op on names +> if (type(expr, name)) +> then return expr; +> end if; +> +# unknown type +> error "%0", +> "unknown type for expr!", +> " whattype(expr) = ", whattype(expr), +> " expr = ", expr; +> end proc; +fix_rationals := proc(expr::{algebraic, name = algebraic, +list({algebraic, name = algebraic}), set({algebraic, name = algebraic})}, +inert_fn::{procedure, name}) +local nn, k, base, power, fbase, fpower, fn, fn_args_list, num, den, mult; + if 2 <= nargs and inert_fn(expr, args[3 .. nargs]) then return expr + end if; + if type(expr, {set, list}) then + return map(fix_rationals, expr, args[2 .. nargs]) + end if; + if type(expr, name = algebraic) then + return lhs(expr) = fix_rationals(rhs(expr), args[2 .. nargs]) + end if; + if type(expr, function) then + fn := op(0, expr); + if fn <> 'RATIONAL' then + fn_args_list := [op(expr)]; + fn_args_list := + map(fix_rationals, fn_args_list, args[2 .. nargs]); + fn; + return '%'(op(fn_args_list)) + end if + end if; + nn := nops(expr); + if type(expr, `+`) then return + sum('fix_rationals(op(k, expr), args[2 .. nargs])', 'k' = 1 .. nn) + end if; + if type(expr, `*`) then + if op(1, expr) = -1 then return -fix_rationals( + remove(type, expr, 'identical(-1)'), args[2 .. nargs]) + else return product('fix_rationals(op(k, expr), args[2 .. nargs])', + 'k' = 1 .. nn) + end if + end if; + if type(expr, `^`) then + base := op(1, expr); + power := op(2, expr); + fbase := fix_rationals(base, args[2 .. nargs]); + if type(power, integer) then fpower := power + else fpower := fix_rationals(power, args[2 .. nargs]) + 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, args[2 .. nargs]) + end if; + if type(expr, name) then return expr end if; + error "%0", "unknown type for expr!", " whattype(expr) = ", + whattype(expr), " expr = ", expr +end proc + +> +################################################################################ +> +# +# This function finds names in a list which *don't* have a specified prefix. +# +# Arguments: +# name_list = A list of the names. +# prefix = The prefix we want to filter out. +# +# Results: +# This function returns the subset list of names which don't have the +# specified prefix. +# +> nonmatching_names := +> proc( name_list::list({name,string}), prefix::{name,string} ) +> +> select( proc(n) +> evalb(not StringTools[IsPrefix](prefix,n)); +> end proc +> , +> name_list +> ); +> end proc; +nonmatching_names := proc( +name_list::list({name, string}), prefix::{name, string}) + select(proc(n) evalb(not StringTools[IsPrefix](prefix, n)) end proc, + name_list) +end proc + +> +################################################################################ +> +# +# This function converts a numeric list to a string which is a valid +# C identifier suffix: elements are separated by "_", decimal points are +# replaced by "x", and all nonzero values have explicit +/- signs, which +# are replaced by "p"/"m". +# +# For example, [0,-3.5,+4] --> "0_m3x5_p4". +# +> sprint_numeric_list := +> proc(nlist::list(numeric)) +> +# generate preliminary string, eg "+0_-3.5_+4" +> map2(sprintf, "%+a", nlist); +> ListTools[Join](%, "_"); +> cat(op(%)); +> +# fixup bad characters +> StringTools[SubstituteAll](%, "+0", "0"); +> StringTools[CharacterMap](".+-", "xpm", %); +> +> return %; +> end proc; +sprint_numeric_list := proc(nlist::list(numeric)) + map2(sprintf, "%+a", nlist); + ListTools[Join](%, "_"); + cat(op(%)); + StringTools[SubstituteAll](%, "+0", "0"); + StringTools[CharacterMap](".+-", "xpm", %); + return % +end proc + +> +################################################################################ +> +# +# This function prints a C declaration for a list of names. +# +# Argument: +# name_list = A list of the names. +# name_type = The C type of the names, eg. "double". +# file_name = The file name to write the declaration to. This is +# truncated before writing. +# +> print_name_list_dcl := +> proc( name_list::list({name,string}), +> name_type::string, +> file_name::string ) +> local blanks, separator_string; +> +> ftruncate(file_name); +> +# a sequence of blanks with the same length as name_type +> seq(" ", i=1..length(name_type)); +> +# string to separate names +> separator_string := cat(",\n", %, " "); +> +> map(convert, name_list, string); +> ListTools[Join](%, separator_string); +> cat(op(%)); +> +> fprintf(file_name, +> "%s %s;\n", +> name_type, %); +> +> fclose(file_name); +> NULL; +> end proc; +print_name_list_dcl := proc( +name_list::list({name, string}), name_type::string, file_name::string) +local blanks, separator_string; + ftruncate(file_name); + seq(" ", i = 1 .. length(name_type)); + separator_string := cat(",\n", %, " "); + map(convert, name_list, string); + ListTools[Join](%, separator_string); + cat(op(%)); + fprintf(file_name, "%s %s;\n", name_type, %); + fclose(file_name); + NULL +end proc + +> +################################################################################ +################################################################################ +################################################################################ +> +# +# This function computes a list of all the (integer) points in an +# N-dimensional hypercube, in lexicographic order. The present +# implementation requires N <= 4. +# +# Arguments: +# cmin,cmax = N-element lists of cube minimum/maximum coordinates. +# +# Results: +# The function returns a set of d-element lists giving the coordinates. +# For example, +# hypercube([0,0], [2,1] +# returns +# { [0,0], [0,1], [1,0], [1,1], [2,0], [2,1] } +> hypercube_points := +> proc(cmin::list(integer), cmax::list(integer)) +> local N, i,j,k,l; +> +> N := nops(cmin); +> if (nops(cmax) <> N) +> then error +> "must have same number of dimensions for min and max coordinates!"; +> fi; +> +> if (N = 1) +> then return [seq([i], i=cmin[1]..cmax[1])]; +> elif (N = 2) +> then return [ +> seq( +> seq([i,j], j=cmin[2]..cmax[2]), +> i=cmin[1]..cmax[1]) +> ]; +> elif (N = 3) +> then return [ +> seq( +> seq( +> seq([i,j,k], k=cmin[3]..cmax[3]), +> j=cmin[2]..cmax[2] ), +> i=cmin[1]..cmax[1]) +> ]; +> elif (N = 4) +> then return [ +> seq( +> seq( +> seq( +> seq([i,j,k,l], l=cmin[4]..cmax[4]), +> k=cmin[3]..cmax[3] ), +> j=cmin[2]..cmax[2]), +> i=cmin[1]..cmax[1]) +> ]; +> else +> error "implementation restriction: must have N <= 4, got %1!", N; +> fi; +> end proc; +hypercube_points := proc(cmin::list(integer), cmax::list(integer)) +local N, i, j, k, l; + N := nops(cmin); + if nops(cmax) <> N then error + "must have same number of dimensions for min and max coordinates!" + end if; + if N = 1 then return [seq([i], i = cmin[1] .. cmax[1])] + elif N = 2 then return + [seq(seq([i, j], j = cmin[2] .. cmax[2]), i = cmin[1] .. cmax[1])] + elif N = 3 then return [seq( + seq(seq([i, j, k], k = cmin[3] .. cmax[3]), j = cmin[2] .. cmax[2]) + , i = cmin[1] .. cmax[1])] + elif N = 4 then return [seq(seq(seq( + seq([i, j, k, l], l = cmin[4] .. cmax[4]), k = cmin[3] .. cmax[3]), + j = cmin[2] .. cmax[2]), i = cmin[1] .. cmax[1])] + else error "implementation restriction: must have N <= 4, got %1!", N + end if +end proc + +> +################################################################################ +################################################################################ +################################################################################ +> +# +# This function truncates a file to 0 length if it exists, or creates +# it at that length if it doesn't exist. +# +# Arguments: +# file_name = (in) The name of the file. +# +> ftruncate := +> proc(file_name::string) +> fopen(file_name, 'WRITE'); +> fclose(%); +> NULL; +> end proc; +ftruncate := + + proc(file_name::string) fopen(file_name, 'WRITE'); fclose(%); NULL end proc + +# interpolate.maple -- compute interpolation formulas/coefficients +# $Header: /cactusdevcvs/CactusBase/LocalInterp/src/GeneralizedPolynomial-Uniform/interpolate.maple,v 1.10 2002/08/28 11:31:09 jthorn Exp $ +> +# +# <<<representation of numbers, data values, etc>>> +# Lagrange_polynomial_interpolant - compute Lagrange polynomial interpolant +# Hermite_polynomial_interpolant - compute Hermite polynomial interpolant +# coeff_as_lc_of_data - coefficients of ... (linear combination of data) +# +# print_coeff__lc_of_data - print C code to compute coefficients +# print_data_var_assign - print C code to assign data-value variables +# print_interp_coeff_var_store - print C code to store coeff vars "somewhere" +# print_interp_cmpt__lc_of_data - print C code for computation of interpolant +# +# coeff_name - name of coefficient of data at a given [m] coordinate +# data_var_name - name of variable storing data value at a given [m] coordinate +# +> +################################################################################ +> +# +# ***** representation of numbers, data values, etc ***** +# +# We use RATIONAL(p.0,q.0) to denote the rational number p/q. +# +# We use DATA(...) to represent the data values being interpolated at a +# specified [m] coordinate, where the arguments are the [m] coordinates. +# +# We use COEFF(...) to represent the molecule coefficient at a specified +# [m] coordinate, where the arguments are the [m] coordinates. +# +# For example, the usual 1-D centered 2nd order 1st derivative molecule +# would be written +# RATIONAL(-1.0,2.0)*DATA(-1) + RATIONA(1.0,2.0)*DATA(1) +# and its coefficients as +# COEFF(-1) = RATIONAL(-1.0,2.0) +# COEFF(1) = RATIONAL(1.0,2.0) +# +> +################################################################################ +################################################################################ +################################################################################ +> +# +# This function computes a Lagrange polynomial interpolant in any +# number of dimensions. +# +# Arguments: +# fn = The interpolation function. This should be a procedure in the +# coordinates, having the coefficients as global variables. For +# example, +# proc(x,y) c00 + c10*x + c01*y end proc +# coeff_list = A set of the interpolation coefficients (coefficients in +# the interpolation function), for example [c00, c10, c01]. +# coord_list = A list of the coordinates (independent variables in the +# interpolation function), for example [x,y]. +# posn_list = A list of positions (each a list of numeric values) where the +# interpolant is to use data, for example hypercube([0,0], [1,1]). +# Any positions may be used; if they're redundant (as in the +# example) the least-squares interpolant is computed. +# +# Results: +# This function returns the interpolating polynomial, in the form of +# an algebraic expression in the coordinates and the data values. +# +> Lagrange_polynomial_interpolant := +> proc( +> fn::procedure, coeff_list::list(name), +> coord_list::list(name), posn_list::list(list(numeric)) +> ) +> local posn, data_eqns, coeff_eqns; +> +# coefficients of interpolating polynomial +> data_eqns := { seq( fn(op(posn))='DATA'(op(posn)) , posn=posn_list ) }; +> coeff_eqns := linalg[leastsqrs](data_eqns, {op(coeff_list)}); +> if (has(coeff_eqns, '_t')) +> then error "interpolation coefficients aren't uniquely determined!"; +> end if; +> +# interpolant as a polynomial in the coordinates +> return subs(coeff_eqns, eval(fn))(op(coord_list)); +> end proc; +Lagrange_polynomial_interpolant := proc(fn::procedure, coeff_list::list(name), +coord_list::list(name), posn_list::list(list(numeric))) +local posn, data_eqns, coeff_eqns; + data_eqns := {seq(fn(op(posn)) = 'DATA'(op(posn)), posn = posn_list)}; + coeff_eqns := linalg[leastsqrs](data_eqns, {op(coeff_list)}); + if has(coeff_eqns, '_t') then + error "interpolation coefficients aren't uniquely determined!" + end if; + return subs(coeff_eqns, eval(fn))(op(coord_list)) +end proc + +> +################################################################################ +> +# +# This function computes a Hermite polynomial interpolant in any +# number of dimensions. This is a polynomial which +# * has values which match the given data DATA() at a specified set of +# points, and +# * has derivatives which match the specified finite-difference derivatives +# of the given data DATA() at a specified set of points +# +# For the derivative matching, we actually match all possible products +# of 1st derivatives, i.e. in 2-D we match dx, dy, and dxy, in 3-D we +# match dx, dy, dz, dxy, dxz, dyz, and dxyz, etc etc. +# +# Arguments: +# fn = The interpolation function. This should be a procedure in the +# coordinates, having the coefficients as global variables. For +# example, +# proc(x,y) +# + c03*y^3 + c13*x*y^3 + c23*x^2*y^3 + c33*x^3*y^3 +# + c02*y^2 + c12*x*y^2 + c22*x^2*y^2 + c32*x^3*y^2 +# + c01*y + c11*x*y + c21*x^2*y + c31*x^3*y +# + c00 + c10*x + c20*x^2 + c30*x^3 +# end proc; +# coeff_set = A set of the interpolation coefficients (coefficients in +# the interpolation function), for example +# { +# c03, c13, c23, c33, +# c02, c12, c22, c32, +# c01, c11, c21, c31, +# c00, c10, c20, c30 +# } +# coord_list = A list of the coordinates (independent variables in the +# interpolation function), for example [x,y]. +# deriv_set = A set of equations of the form +# {coords} = proc +# giving the derivatives which are to be matched, and the +# procedures to compute their finite-difference approximations. +# Each procedure should take N_dims integer arguments specifying +# an evaluation point, and return a suitable linear combination +# of the DATA() for the derivative at that point. For example +# { +# {x} = proc(i::integer, j::integer) +# - 1/2*DATA(i-1,j) + 1/2*DATA(i+1,j) +# end proc +# , +# {y} = proc(i::integer, j::integer) +# - 1/2*DATA(i,j-1) + 1/2*DATA(i,j+1) +# end proc +# , +# {x,y} = proc(i::integer, j::integer) +# - 1/4*DATA(i-1,j+1) + 1/4*DATA(i+1,j+1) +# + 1/4*DATA(i-1,j-1) - 1/4*DATA(i+1,j-1) +# end proc +# } +# fn_posn_set = A set of positions (each a list of numeric values) +# where the interpolant is to match the given data DATA(), +# for example +# {[0,0], [0,1], [1,0], [1,1]} +# deriv_posn_set = A list of positions (each a list of numeric values) +# where the interpolant is to match the derivatives +# specified by deriv_set , for example +# {[0,0], [0,1], [1,0], [1,1]} +# +# Results: +# This function returns the interpolating polynomial, in the form of +# an algebraic expression in the coordinates and the data values. +# +> Hermite_polynomial_interpolant := +> proc( +> fn::procedure, +> coeff_set::set(name), +> coord_list::list(name), +> deriv_set::set(set(name) = procedure), +> fn_posn_set::set(list(numeric)), +> deriv_posn_set::set(list(numeric)) +> ) +> local fn_eqnset, deriv_eqnset, coeff_eqns, subs_eqnset; +> +> +# +# compute a set of equations +# {fn(posn) = DATA(posn)} +# giving the function values to be matched +# +> fn_eqnset := map( +> # return equation that fn(posn) = DATA(posn) +> proc(posn::list(integer)) +> fn(op(posn)) = 'DATA'(op(posn)); +> end proc +> , +> fn_posn_set +> ); +> +> +# +# compute a set of equations +# { diff(fn,coords)(posn) = DERIV(coords)(posn) } +# giving the derivative values to be matched, where DERIV(coords) +# is a placeholder for the appropriate derivative +# +> map( +> # return set of equations for this particular derivative +> proc(deriv_coords::set(name)) +> local deriv_fn; +> fn(op(coord_list)); +> diff(%, op(deriv_coords)); +> deriv_fn := unapply(%, op(coord_list)); +> map( +> proc(posn::list(integer)) +> deriv_fn(op(posn)) = 'DERIV'(op(deriv_coords))(op(posn)); +> end proc +> , +> deriv_posn_set +> ); +> end proc +> , +> map(lhs, deriv_set) +> ); +> deriv_eqnset := `union`(op(%)); +> +> +# +# solve overall set of equations for coefficients +# in terms of DATA() and DERIV() values +# +> coeff_eqns := solve[linear](fn_eqnset union deriv_eqnset, coeff_set); +> if (indets(map(rhs,%)) <> {}) +> then error "no unique solution for coefficients -- %1 eqns for %2 coeffs", +> nops(fn_eqnset union deriv_eqnset), +> nops(coeff_set); +> fi; +> +> +# +# compute a set of substitution equations +# {'DERIV'(coords) = procedure} +# +> subs_eqnset := map( +> proc(eqn::set(name) = procedure) +> 'DERIV'(op(lhs(eqn))) = rhs(eqn); +> end proc +> , +> deriv_set +> ); +> +> +# +# compute the coefficients in terms of the DATA() values +# +> subs(subs_eqnset, coeff_eqns); +> eval(%); +> +# +# compute the interpolant as a polynomial in the coordinates +# +> subs(%, fn(op(coord_list))); +> end proc; +Hermite_polynomial_interpolant := proc(fn::procedure, coeff_set::set(name), +coord_list::list(name), deriv_set::set(set(name) = procedure), +fn_posn_set::set(list(numeric)), deriv_posn_set::set(list(numeric))) +local fn_eqnset, deriv_eqnset, coeff_eqns, subs_eqnset; + fn_eqnset := map( + proc(posn::list(integer)) fn(op(posn)) = 'DATA'(op(posn)) end proc, + fn_posn_set); + map(proc(deriv_coords::set(name)) + local deriv_fn; + fn(op(coord_list)); + diff(%, op(deriv_coords)); + deriv_fn := unapply(%, op(coord_list)); + map(proc(posn::list(integer)) + deriv_fn(op(posn)) = + 'DERIV'(op(deriv_coords))(op(posn)) + end proc, deriv_posn_set) + end proc, map(lhs, deriv_set)); + deriv_eqnset := `union`(op(%)); + coeff_eqns := solve[linear](fn_eqnset union deriv_eqnset, coeff_set); + if indets(map(rhs, %)) <> {} then error + "no unique solution for coefficients -- %1 eqns for %2 coeffs", + nops(fn_eqnset union deriv_eqnset), nops(coeff_set) + end if; + subs_eqnset := map(proc(eqn::(set(name) = procedure)) + 'DERIV'(op(lhs(eqn))) = rhs(eqn) + end proc, deriv_set); + subs(subs_eqnset, coeff_eqns); + eval(%); + subs(%, fn(op(coord_list))) +end proc + +> +################################################################################ +> +# +# This function takes as input an interpolating polynomial, expresses +# it as a linear combination of the data values, and returns the coefficeints +# of that form. +# +# Arguments: +# interpolant = The interpolating polynomial (an algebraic expression +# in the coordinates and the data values). +# posn_list = The same list of data positions used in the interpolant. +# +# Results: +# This function returns the coefficients, as a list of equations of the +# form COEFF(...) = value , where each value is a polynomial in the +# coordinates. The order of the list matches that of posn_list. +# +> coeff_as_lc_of_data := +> proc( +> interpolant::algebraic, +> posn_list::list(list(numeric)) +> ) +> local data_list, interpolant_as_lc_of_data; +> +# interpolant as a linear combination of the data values +> data_list := [ seq( 'DATA'(op(posn)) , posn=posn_list ) ]; +> interpolant_as_lc_of_data := collect(interpolant, data_list); +> +# coefficients of the data values in the linear combination +> return map( +> proc(posn::list(numeric)) +> coeff(interpolant_as_lc_of_data, DATA(op(posn))); +> 'COEFF'(op(posn)) = %; +> end proc +> , +> posn_list +> ); +> end proc; +coeff_as_lc_of_data := proc( +interpolant::algebraic, posn_list::list(list(numeric))) +local data_list, interpolant_as_lc_of_data; + data_list := [seq('DATA'(op(posn)), posn = posn_list)]; + interpolant_as_lc_of_data := collect(interpolant, data_list); + return map(proc(posn::list(numeric)) + coeff(interpolant_as_lc_of_data, DATA(op(posn))); + 'COEFF'(op(posn)) = % + end proc, posn_list) +end proc + +> +################################################################################ +################################################################################ +################################################################################ +> +# +# This function prints C expressions for the coefficients of an +# interpolating polynomial. (The polynomial is expressed as linear +# combinations of the data values with coefficients which are +# RATIONAL(p,q) calls.) +# +# Arguments: +# coeff_list = A list of the coefficients, as returned from +# coeff_as_lc_of_data() . +# coeff_name_prefix = A prefix string for the coefficient names. +# temp_name_type = The C type to be used for Maple-introduced temporary +# names, eg. "double". +# file_name = The file name to write the coefficients to. This is +# truncated before writing. +# +> print_coeff__lc_of_data := +> proc( coeff_list::list(specfunc(numeric,COEFF) = algebraic), +> coeff_name_prefix::string, +> temp_name_type::string, +> file_name::string ) +> global `codegen/C/function/informed`; +> local coeff_list2, cmpt_list, temp_name_list; +> +# convert LHS of each equation from a COEFF() call (eg COEFF(-1,+1)) +# to a Maple/C variable name (eg coeff_I_m1_p1) +> coeff_list2 := map( +> proc(coeff_eqn::specfunc(numeric,COEFF) = algebraic) +> local posn; +> posn := [op(lhs(coeff_eqn))]; +> coeff_name(posn,coeff_name_prefix); +> convert(%, name); # codegen[C] wants LHS +> # to be an actual Maple *name* +> % = fix_rationals(rhs(coeff_eqn)); +> end proc +> , +> coeff_list +> ); +> +# +# generate the C code +# +> +# tell codegen[C] not to warn about unknown RATIONAL() and DATA() "fn calls" +# via undocumented :( global table +> `codegen/C/function/informed`['RATIONAL'] := true; +> `codegen/C/function/informed`['DATA'] := true; +> +> ftruncate(file_name); +> +# optimized computation sequence for all the coefficients +# (may use local variables t0,t1,t2,...) +> cmpt_list := [codegen[optimize](coeff_list2, tryhard)]; +> +# list of the t0,t1,t2,... local variables +> temp_name_list := nonmatching_names(map(lhs,cmpt_list), coeff_name_prefix); +> +# declare the t0,t1,t2,... local variables (if there are any) +> if (nops(temp_name_list) > 0) +> then print_name_list_dcl(%, temp_name_type, file_name); +> fi; +> +# now print the optimized computation sequence +> codegen[C](cmpt_list, filename=file_name); +> +> fclose(file_name); +> +> NULL; +> end proc; +print_coeff__lc_of_data := proc( +coeff_list::list(specfunc(numeric, COEFF) = algebraic), +coeff_name_prefix::string, temp_name_type::string, file_name::string) +local coeff_list2, cmpt_list, temp_name_list; +global `codegen/C/function/informed`; + coeff_list2 := map(proc( + coeff_eqn::(specfunc(numeric, COEFF) = algebraic)) + local posn; + posn := [op(lhs(coeff_eqn))]; + coeff_name(posn, coeff_name_prefix); + convert(%, name); + % = fix_rationals(rhs(coeff_eqn)) + end proc, coeff_list); + `codegen/C/function/informed`['RATIONAL'] := true; + `codegen/C/function/informed`['DATA'] := true; + ftruncate(file_name); + cmpt_list := [codegen[optimize](coeff_list2, tryhard)]; + temp_name_list := + nonmatching_names(map(lhs, cmpt_list), coeff_name_prefix); + if 0 < nops(temp_name_list) then + print_name_list_dcl(%, temp_name_type, file_name) + end if; + codegen[C](cmpt_list, filename = file_name); + fclose(file_name); + NULL +end proc + +> +################################################################################ +> +# +# This function prints a sequence of C expression to assign the data-value +# variables, eg +# data_m1_p1 = DATA(-1,1); +# +# Arguments: +# posn_list = The same list of positions as was used to compute the +# interpolating polynomial. +# data_var_name_prefix = A prefix string for the data variable names. +# file_name = The file name to write the coefficients to. This is +# truncated before writing. +# +> print_data_var_assign := +> proc( +> posn_list::list(list(numeric)), +> data_var_name_prefix::string, +> file_name::string +> ) +> +> ftruncate(file_name); +> map( +> proc(posn::list(numeric)) +> fprintf(file_name, +> "%s = %a;\n", +> data_var_name(posn,data_var_name_prefix), +> DATA(op(posn))); +> end proc +> , +> posn_list +> ); +> fclose(file_name); +> +> NULL; +> end proc; +print_data_var_assign := proc(posn_list::list(list(numeric)), +data_var_name_prefix::string, file_name::string) + ftruncate(file_name); + map(proc(posn::list(numeric)) + fprintf(file_name, "%s = %a;\n", + data_var_name(posn, data_var_name_prefix), DATA(op(posn))) + end proc, posn_list); + fclose(file_name); + NULL +end proc + +> +################################################################################ +> +# +# This function prints a sequence of C expression to store the interpolation +# coefficients in COEFF(...) expressions, eg +# COEFF(1,-1) = factor * coeff_dx_p1_m1; +# +# Arguments: +# posn_list = The same list of positions as was used to compute the +# interpolating polynomial. +# RHS_factor_name = If this string is non-empty, then the coefficient is +# multiplied by this factor before being stored, eg +# setting this to "factor" would give the example above. +# If this string is empty (""), the multiplication is +# omitted, eg +# COEFF(1,-1) = coeff_dx_p1_m1; +# coeff_name_prefix = A prefix string for the coefficient names. +# file_name = The file name to write the coefficients to. This is +# truncated before writing. +# +> print_interp_coeff_var_store := +> proc( +> posn_list::list(list(numeric)), +> RHS_factor_name::string, +> coeff_name_prefix::string, +> file_name::string +> ) +> +> ftruncate(file_name); +> map( +> proc(posn::list(numeric)) +> if (length(RHS_factor_name) > 0) +> then fprintf(file_name, +> "%a = %s * %s;\n", +> 'COEFF'(op(posn)), +> RHS_factor_name, +> coeff_name(posn,coeff_name_prefix)); +> else fprintf(file_name, +> "%a = %s;\n", +> 'COEFF'(op(posn)), +> coeff_name(posn,coeff_name_prefix)); +> end if; +> end proc +> , +> posn_list +> ); +> fclose(file_name); +> +> NULL; +> end proc; +print_interp_coeff_var_store := proc(posn_list::list(list(numeric)), +RHS_factor_name::string, coeff_name_prefix::string, file_name::string) + ftruncate(file_name); + map(proc(posn::list(numeric)) + if 0 < length(RHS_factor_name) then fprintf(file_name, + "%a = %s * %s;\n", 'COEFF'(op(posn)), RHS_factor_name, + coeff_name(posn, coeff_name_prefix)) + else fprintf(file_name, "%a = %s;\n", 'COEFF'(op(posn)), + coeff_name(posn, coeff_name_prefix)) + end if + end proc, posn_list); + fclose(file_name); + NULL +end proc + +> +################################################################################ +> +# +# This function prints a C expression to compute the interpolant, +# using the coefficients computed by print_coeff__lc_of_data() +# (i.e. expressing the interpolant as a linear combination of the +# data values). +# +# Arguments: +# posn_list = The same list of positions as was used to compute the +# interpolating polynomial. +# result_var_name = The (string) name of the variable to which the +# result is to be assigned. +# coeff_name_prefix = A prefix string for the coefficient names. +# data_var_name_prefix = A prefix string for the data variable names. +# file_name = The file name to write the coefficients to. This is +# truncated before writing. +# +> print_interp_cmpt__lc_of_data := +> proc( +> posn_list::list(list(numeric)), +> result_var_name::string, +> coeff_name_prefix::string, +> data_var_name_prefix::string, +> file_name::string +> ) +> +> ftruncate(file_name); +> +> fprintf(file_name, "%s =\n", result_var_name); +> +# list of "coeff*data_var" terms +> map( +> proc(posn::list(numeric)) +> sprintf("%s*%s", +> coeff_name(posn,coeff_name_prefix), +> data_var_name(posn,data_var_name_prefix)); +> end proc +> , +> posn_list +> ); +> +> ListTools[Join](%, "\n\t+ "); +> cat(op(%)); +> fprintf(file_name, "\t%s;\n", %); +> +> fclose(file_name); +> +> NULL; +> end proc; +print_interp_cmpt__lc_of_data := proc(posn_list::list(list(numeric)), +result_var_name::string, coeff_name_prefix::string, +data_var_name_prefix::string, file_name::string) + ftruncate(file_name); + fprintf(file_name, "%s =\n", result_var_name); + map(proc(posn::list(numeric)) + sprintf("%s*%s", coeff_name(posn, coeff_name_prefix), + data_var_name(posn, data_var_name_prefix)) + end proc, posn_list); + ListTools[Join](%, "\n\t+ "); + cat(op(%)); + fprintf(file_name, "\t%s;\n", %); + fclose(file_name); + NULL +end proc + +> +################################################################################ +################################################################################ +################################################################################ +> +# +# This function computes the name of the coefficient of the data at a +# given [m] position, i.e. it encapsulates our naming convention for this. +# +# Arguments: +# posn = (in) The [m] coordinates. +# name_prefix = A prefix string for the coefficient name. +# +# Results: +# The function returns the coefficient, as a Maple string. +# +> coeff_name := +> proc(posn::list(numeric), name_prefix::string) +> cat(name_prefix, sprint_numeric_list(posn)); +> end proc; +coeff_name := proc(posn::list(numeric), name_prefix::string) + cat(name_prefix, sprint_numeric_list(posn)) +end proc + +> +################################################################################ +> +# +# This function computes the name of the variable in which the C code +# will store the input data at a given [m] position, i.e. it encapsulates +# our naming convention for this. +# +# Arguments: +# posn = (in) The [m] coordinates. +# name_prefix = A prefix string for the variable name. +# +# Results: +# The function returns the variable name, as a Maple string. +# +> data_var_name := +> proc(posn::list(numeric), name_prefix::string) +> cat(name_prefix, sprint_numeric_list(posn)); +> end proc; +data_var_name := proc(posn::list(numeric), name_prefix::string) + cat(name_prefix, sprint_numeric_list(posn)) +end proc + +# Maple code to compute lists of point positions in hypercube-shaped molecules +# $Header: /cactusdevcvs/CactusBase/LocalInterp/src/GeneralizedPolynomial-Uniform/common/cube_posns.maple,v 1.3 2002/08/20 16:56:41 jthorn Exp $ +> +################################################################################ +> +# +# 1D interpolation points +# +> posn_list_1d_size2 := hypercube_points([ 0], [+1]); + posn_list_1d_size2 := [[0], [1]] + +> posn_list_1d_size3 := hypercube_points([-1], [+1]); + posn_list_1d_size3 := [[-1], [0], [1]] + +> posn_list_1d_size4 := hypercube_points([-1], [+2]); + posn_list_1d_size4 := [[-1], [0], [1], [2]] + +> posn_list_1d_size5 := hypercube_points([-2], [+2]); + posn_list_1d_size5 := [[-2], [-1], [0], [1], [2]] + +> posn_list_1d_size6 := hypercube_points([-2], [+3]); + posn_list_1d_size6 := [[-2], [-1], [0], [1], [2], [3]] + +> posn_list_1d_size7 := hypercube_points([-3], [+3]); + posn_list_1d_size7 := [[-3], [-2], [-1], [0], [1], [2], [3]] + +> +################################################################################ +> +# +# 2D interpolation points (Fortran ordering) +# +> posn_list_2d_size2 := map(ListTools[Reverse], +> hypercube_points([ 0, 0], [+1,+1])); + posn_list_2d_size2 := [[0, 0], [1, 0], [0, 1], [1, 1]] + +> posn_list_2d_size3 := map(ListTools[Reverse], +> hypercube_points([-1,-1], [+1,+1])); +posn_list_2d_size3 := [[-1, -1], [0, -1], [1, -1], [-1, 0], [0, 0], [1, 0], + + [-1, 1], [0, 1], [1, 1]] + +> posn_list_2d_size4 := map(ListTools[Reverse], +> hypercube_points([-1,-1], [+2,+2])); +posn_list_2d_size4 := [[-1, -1], [0, -1], [1, -1], [2, -1], [-1, 0], [0, 0], + + [1, 0], [2, 0], [-1, 1], [0, 1], [1, 1], [2, 1], [-1, 2], [0, 2], [1, 2], + + [2, 2]] + +> posn_list_2d_size5 := map(ListTools[Reverse], +> hypercube_points([-2,-2], [+2,+2])); +posn_list_2d_size5 := [[-2, -2], [-1, -2], [0, -2], [1, -2], [2, -2], [-2, -1], + + [-1, -1], [0, -1], [1, -1], [2, -1], [-2, 0], [-1, 0], [0, 0], [1, 0], + + [2, 0], [-2, 1], [-1, 1], [0, 1], [1, 1], [2, 1], [-2, 2], [-1, 2], [0, 2], + + [1, 2], [2, 2]] + +> posn_list_2d_size6 := map(ListTools[Reverse], +> hypercube_points([-2,-2], [+3,+3])); +posn_list_2d_size6 := [[-2, -2], [-1, -2], [0, -2], [1, -2], [2, -2], [3, -2], + + [-2, -1], [-1, -1], [0, -1], [1, -1], [2, -1], [3, -1], [-2, 0], [-1, 0], + + [0, 0], [1, 0], [2, 0], [3, 0], [-2, 1], [-1, 1], [0, 1], [1, 1], [2, 1], + + [3, 1], [-2, 2], [-1, 2], [0, 2], [1, 2], [2, 2], [3, 2], [-2, 3], [-1, 3], + + [0, 3], [1, 3], [2, 3], [3, 3]] + +> +################################################################################ +> +# +# 3D interpolation points (Fortran ordering) +# +> posn_list_3d_size2 := map(ListTools[Reverse], +> hypercube_points([ 0, 0, 0], [+1,+1,+1])); +posn_list_3d_size2 := [[0, 0, 0], [1, 0, 0], [0, 1, 0], [1, 1, 0], [0, 0, 1], + + [1, 0, 1], [0, 1, 1], [1, 1, 1]] + +> posn_list_3d_size3 := map(ListTools[Reverse], +> hypercube_points([-1,-1,-1], [+1,+1,+1])); +posn_list_3d_size3 := [[-1, -1, -1], [0, -1, -1], [1, -1, -1], [-1, 0, -1], + + [0, 0, -1], [1, 0, -1], [-1, 1, -1], [0, 1, -1], [1, 1, -1], [-1, -1, 0], + + [0, -1, 0], [1, -1, 0], [-1, 0, 0], [0, 0, 0], [1, 0, 0], [-1, 1, 0], + + [0, 1, 0], [1, 1, 0], [-1, -1, 1], [0, -1, 1], [1, -1, 1], [-1, 0, 1], + + [0, 0, 1], [1, 0, 1], [-1, 1, 1], [0, 1, 1], [1, 1, 1]] + +> posn_list_3d_size4 := map(ListTools[Reverse], +> hypercube_points([-1,-1,-1], [+2,+2,+2])); +posn_list_3d_size4 := [[-1, -1, -1], [0, -1, -1], [1, -1, -1], [2, -1, -1], + + [-1, 0, -1], [0, 0, -1], [1, 0, -1], [2, 0, -1], [-1, 1, -1], [0, 1, -1], + + [1, 1, -1], [2, 1, -1], [-1, 2, -1], [0, 2, -1], [1, 2, -1], [2, 2, -1], + + [-1, -1, 0], [0, -1, 0], [1, -1, 0], [2, -1, 0], [-1, 0, 0], [0, 0, 0], + + [1, 0, 0], [2, 0, 0], [-1, 1, 0], [0, 1, 0], [1, 1, 0], [2, 1, 0], + + [-1, 2, 0], [0, 2, 0], [1, 2, 0], [2, 2, 0], [-1, -1, 1], [0, -1, 1], + + [1, -1, 1], [2, -1, 1], [-1, 0, 1], [0, 0, 1], [1, 0, 1], [2, 0, 1], + + [-1, 1, 1], [0, 1, 1], [1, 1, 1], [2, 1, 1], [-1, 2, 1], [0, 2, 1], + + [1, 2, 1], [2, 2, 1], [-1, -1, 2], [0, -1, 2], [1, -1, 2], [2, -1, 2], + + [-1, 0, 2], [0, 0, 2], [1, 0, 2], [2, 0, 2], [-1, 1, 2], [0, 1, 2], + + [1, 1, 2], [2, 1, 2], [-1, 2, 2], [0, 2, 2], [1, 2, 2], [2, 2, 2]] + +> posn_list_3d_size5 := map(ListTools[Reverse], +> hypercube_points([-2,-2,-2], [+2,+2,+2])); +posn_list_3d_size5 := [[-2, -2, -2], [-1, -2, -2], [0, -2, -2], [1, -2, -2], + + [2, -2, -2], [-2, -1, -2], [-1, -1, -2], [0, -1, -2], [1, -1, -2], + + [2, -1, -2], [-2, 0, -2], [-1, 0, -2], [0, 0, -2], [1, 0, -2], [2, 0, -2], + + [-2, 1, -2], [-1, 1, -2], [0, 1, -2], [1, 1, -2], [2, 1, -2], [-2, 2, -2], + + [-1, 2, -2], [0, 2, -2], [1, 2, -2], [2, 2, -2], [-2, -2, -1], [-1, -2, -1], + + [0, -2, -1], [1, -2, -1], [2, -2, -1], [-2, -1, -1], [-1, -1, -1], + + [0, -1, -1], [1, -1, -1], [2, -1, -1], [-2, 0, -1], [-1, 0, -1], [0, 0, -1], + + [1, 0, -1], [2, 0, -1], [-2, 1, -1], [-1, 1, -1], [0, 1, -1], [1, 1, -1], + + [2, 1, -1], [-2, 2, -1], [-1, 2, -1], [0, 2, -1], [1, 2, -1], [2, 2, -1], + + [-2, -2, 0], [-1, -2, 0], [0, -2, 0], [1, -2, 0], [2, -2, 0], [-2, -1, 0], + + [-1, -1, 0], [0, -1, 0], [1, -1, 0], [2, -1, 0], [-2, 0, 0], [-1, 0, 0], + + [0, 0, 0], [1, 0, 0], [2, 0, 0], [-2, 1, 0], [-1, 1, 0], [0, 1, 0], + + [1, 1, 0], [2, 1, 0], [-2, 2, 0], [-1, 2, 0], [0, 2, 0], [1, 2, 0], + + [2, 2, 0], [-2, -2, 1], [-1, -2, 1], [0, -2, 1], [1, -2, 1], [2, -2, 1], + + [-2, -1, 1], [-1, -1, 1], [0, -1, 1], [1, -1, 1], [2, -1, 1], [-2, 0, 1], + + [-1, 0, 1], [0, 0, 1], [1, 0, 1], [2, 0, 1], [-2, 1, 1], [-1, 1, 1], + + [0, 1, 1], [1, 1, 1], [2, 1, 1], [-2, 2, 1], [-1, 2, 1], [0, 2, 1], + + [1, 2, 1], [2, 2, 1], [-2, -2, 2], [-1, -2, 2], [0, -2, 2], [1, -2, 2], + + [2, -2, 2], [-2, -1, 2], [-1, -1, 2], [0, -1, 2], [1, -1, 2], [2, -1, 2], + + [-2, 0, 2], [-1, 0, 2], [0, 0, 2], [1, 0, 2], [2, 0, 2], [-2, 1, 2], + + [-1, 1, 2], [0, 1, 2], [1, 1, 2], [2, 1, 2], [-2, 2, 2], [-1, 2, 2], + + [0, 2, 2], [1, 2, 2], [2, 2, 2]] + +> posn_list_3d_size6 := map(ListTools[Reverse], +> hypercube_points([-2,-2,-2], [+3,+3,+3])); +posn_list_3d_size6 := [[-2, -2, -2], [-1, -2, -2], [0, -2, -2], [1, -2, -2], + + [2, -2, -2], [3, -2, -2], [-2, -1, -2], [-1, -1, -2], [0, -1, -2], + + [1, -1, -2], [2, -1, -2], [3, -1, -2], [-2, 0, -2], [-1, 0, -2], [0, 0, -2], + + [1, 0, -2], [2, 0, -2], [3, 0, -2], [-2, 1, -2], [-1, 1, -2], [0, 1, -2], + + [1, 1, -2], [2, 1, -2], [3, 1, -2], [-2, 2, -2], [-1, 2, -2], [0, 2, -2], + + [1, 2, -2], [2, 2, -2], [3, 2, -2], [-2, 3, -2], [-1, 3, -2], [0, 3, -2], + + [1, 3, -2], [2, 3, -2], [3, 3, -2], [-2, -2, -1], [-1, -2, -1], [0, -2, -1], + + [1, -2, -1], [2, -2, -1], [3, -2, -1], [-2, -1, -1], [-1, -1, -1], + + [0, -1, -1], [1, -1, -1], [2, -1, -1], [3, -1, -1], [-2, 0, -1], + + [-1, 0, -1], [0, 0, -1], [1, 0, -1], [2, 0, -1], [3, 0, -1], [-2, 1, -1], + + [-1, 1, -1], [0, 1, -1], [1, 1, -1], [2, 1, -1], [3, 1, -1], [-2, 2, -1], + + [-1, 2, -1], [0, 2, -1], [1, 2, -1], [2, 2, -1], [3, 2, -1], [-2, 3, -1], + + [-1, 3, -1], [0, 3, -1], [1, 3, -1], [2, 3, -1], [3, 3, -1], [-2, -2, 0], + + [-1, -2, 0], [0, -2, 0], [1, -2, 0], [2, -2, 0], [3, -2, 0], [-2, -1, 0], + + [-1, -1, 0], [0, -1, 0], [1, -1, 0], [2, -1, 0], [3, -1, 0], [-2, 0, 0], + + [-1, 0, 0], [0, 0, 0], [1, 0, 0], [2, 0, 0], [3, 0, 0], [-2, 1, 0], + + [-1, 1, 0], [0, 1, 0], [1, 1, 0], [2, 1, 0], [3, 1, 0], [-2, 2, 0], + + [-1, 2, 0], [0, 2, 0], [1, 2, 0], [2, 2, 0], [3, 2, 0], [-2, 3, 0], + + [-1, 3, 0], [0, 3, 0], [1, 3, 0], [2, 3, 0], [3, 3, 0], [-2, -2, 1], + + [-1, -2, 1], [0, -2, 1], [1, -2, 1], [2, -2, 1], [3, -2, 1], [-2, -1, 1], + + [-1, -1, 1], [0, -1, 1], [1, -1, 1], [2, -1, 1], [3, -1, 1], [-2, 0, 1], + + [-1, 0, 1], [0, 0, 1], [1, 0, 1], [2, 0, 1], [3, 0, 1], [-2, 1, 1], + + [-1, 1, 1], [0, 1, 1], [1, 1, 1], [2, 1, 1], [3, 1, 1], [-2, 2, 1], + + [-1, 2, 1], [0, 2, 1], [1, 2, 1], [2, 2, 1], [3, 2, 1], [-2, 3, 1], + + [-1, 3, 1], [0, 3, 1], [1, 3, 1], [2, 3, 1], [3, 3, 1], [-2, -2, 2], + + [-1, -2, 2], [0, -2, 2], [1, -2, 2], [2, -2, 2], [3, -2, 2], [-2, -1, 2], + + [-1, -1, 2], [0, -1, 2], [1, -1, 2], [2, -1, 2], [3, -1, 2], [-2, 0, 2], + + [-1, 0, 2], [0, 0, 2], [1, 0, 2], [2, 0, 2], [3, 0, 2], [-2, 1, 2], + + [-1, 1, 2], [0, 1, 2], [1, 1, 2], [2, 1, 2], [3, 1, 2], [-2, 2, 2], + + [-1, 2, 2], [0, 2, 2], [1, 2, 2], [2, 2, 2], [3, 2, 2], [-2, 3, 2], + + [-1, 3, 2], [0, 3, 2], [1, 3, 2], [2, 3, 2], [3, 3, 2], [-2, -2, 3], + + [-1, -2, 3], [0, -2, 3], [1, -2, 3], [2, -2, 3], [3, -2, 3], [-2, -1, 3], + + [-1, -1, 3], [0, -1, 3], [1, -1, 3], [2, -1, 3], [3, -1, 3], [-2, 0, 3], + + [-1, 0, 3], [0, 0, 3], [1, 0, 3], [2, 0, 3], [3, 0, 3], [-2, 1, 3], + + [-1, 1, 3], [0, 1, 3], [1, 1, 3], [2, 1, 3], [3, 1, 3], [-2, 2, 3], + + [-1, 2, 3], [0, 2, 3], [1, 2, 3], [2, 2, 3], [3, 2, 3], [-2, 3, 3], + + [-1, 3, 3], [0, 3, 3], [1, 3, 3], [2, 3, 3], [3, 3, 3]] + +# Maple code to define Hermite interpolating functions/coords/coeffs/mols +# $Header:$ +> +# +# Note: +# interpolation order 2 <==> fn order 3, 3-point (2nd order) derivative mols +# interpolation order 3 <==> fn order 3, 5-point (4th order) derivative mols +# interpolation order 4 <==> fn order 5, 5-point (4th order) derivative mols +# +> +################################################################################ +################################################################################ +################################################################################ +> +# +# derivative primitives +# (argument is a procedure which should map m into the DATA() reference) +# +> +> dx_3point := +> proc(f::procedure(integer)) +> (1/2) * (-f(-1) + f(+1)) +> end proc; + dx_3point := proc(f::procedure(integer)) -1/2*f(-1) + 1/2*f(1) end proc + +> +> dx_5point := +> proc(f::procedure(integer)) +> (1/12) * (f(-2) - 8*f(-1) + 8*f(+1) - f(+2)) +> end proc; +dx_5point := proc(f::procedure(integer)) + 1/12*f(-2) - 2/3*f(-1) + 2/3*f(1) - 1/12*f(2) +end proc + +> +################################################################################ +################################################################################ +################################################################################ +> +# +# 1-D interpolating functions +# +> +> fn_1d_order3 := +> proc(x) +> + c0 + c1*x + c2*x^2 + c3*x^3 +> end proc; + fn_1d_order3 := proc(x) c0 + c1*x + c2*x^2 + c3*x^3 end proc + +> +> fn_1d_order5 := +> proc(x) +> + c0 + c1*x + c2*x^2 + c3*x^3 + c4*x^4 + c5*x^5 +> end proc; + fn_1d_order5 := proc(x) c0 + c1*x + c2*x^2 + c3*x^3 + c4*x^4 + c5*x^5 end proc + +> +################################################################################ +> +# coordinates for 1-D interpolating functions +> coord_list_1d := [x]; + coord_list_1d := [x] + +> +################################################################################ +> +# +# coefficients in 1-D interpolating functions +# +> +> coeff_set_1d_order3 := {c0, c1, c2, c3}; + coeff_set_1d_order3 := {c0, c1, c2, c3} + +> coeff_set_1d_order5 := {c0, c1, c2, c3, c4, c5}; + coeff_set_1d_order5 := {c0, c1, c2, c3, c4, c5} + +> +################################################################################ +> +# +# 1-D derivative molecules (argument = molecule center) +# +> +> deriv_1d_dx_3point := proc(i::integer) +> dx_3point(proc(mi::integer) DATA(i+mi) end proc) +> end proc; +deriv_1d_dx_3point := proc(i::integer) + dx_3point(proc(mi::integer) DATA(i + mi) end proc) +end proc + +> deriv_1d_dx_5point := proc(i::integer) +> dx_5point(proc(mi::integer) DATA(i+mi) end proc) +> end proc; +deriv_1d_dx_5point := proc(i::integer) + dx_5point(proc(mi::integer) DATA(i + mi) end proc) +end proc + +> +################################################################################ +################################################################################ +################################################################################ +> +# +# 2-D interpolating functions +# +> +> fn_2d_order3 := +> proc(x,y) +> + c03*y^3 + c13*x*y^3 + c23*x^2*y^3 + c33*x^3*y^3 +> + c02*y^2 + c12*x*y^2 + c22*x^2*y^2 + c32*x^3*y^2 +> + c01*y + c11*x*y + c21*x^2*y + c31*x^3*y +> + c00 + c10*x + c20*x^2 + c30*x^3 +> end proc; +fn_2d_order3 := proc(x, y) + c03*y^3 + c13*x*y^3 + c23*x^2*y^3 + c33*x^3*y^3 + c02*y^2 + c12*x*y^2 + + c22*x^2*y^2 + c32*x^3*y^2 + c01*y + c11*x*y + c21*x^2*y + c31*x^3*y + + c00 + c10*x + c20*x^2 + c30*x^3 +end proc + +> +> fn_2d_order5 := +> proc(x,y) +> + c05*y^5 + c15*x*y^5 + c25*x^2*y^5 + c35*x^3*y^5 + c45*x^4*y^5 + c55*x^5*y^5 +> + c04*y^4 + c14*x*y^4 + c24*x^2*y^4 + c34*x^3*y^4 + c44*x^4*y^4 + c54*x^5*y^4 +> + c03*y^3 + c13*x*y^3 + c23*x^2*y^3 + c33*x^3*y^3 + c43*x^4*y^3 + c53*x^5*y^3 +> + c02*y^2 + c12*x*y^2 + c22*x^2*y^2 + c32*x^3*y^2 + c42*x^4*y^2 + c52*x^5*y^2 +> + c01*y + c11*x*y + c21*x^2*y + c31*x^3*y + c41*x^4*y + c51*x^5*y +> + c00 + c10*x + c20*x^2 + c30*x^3 + c40*x^4 + c50*x^5 +> end proc; +fn_2d_order5 := proc(x, y) + c34*x^3*y^4 + c14*x*y^4 + c03*y^3 + c02*y^2 + c01*y + c10*x + c20*x^2 + + c30*x^3 + c05*y^5 + c04*y^4 + c40*x^4 + c50*x^5 + c13*x*y^3 + + c23*x^2*y^3 + c00 + c33*x^3*y^3 + c12*x*y^2 + c22*x^2*y^2 + + c32*x^3*y^2 + c11*x*y + c21*x^2*y + c31*x^3*y + c15*x*y^5 + + c25*x^2*y^5 + c35*x^3*y^5 + c45*x^4*y^5 + c55*x^5*y^5 + c24*x^2*y^4 + + c44*x^4*y^4 + c54*x^5*y^4 + c43*x^4*y^3 + c53*x^5*y^3 + c42*x^4*y^2 + + c52*x^5*y^2 + c41*x^4*y + c51*x^5*y +end proc + +> +################################################################################ +> +# coordinates for 2-D interpolating functions +> coord_list_2d := [x,y]; + coord_list_2d := [x, y] + +> +################################################################################ +> +# +# coefficients in 2-D interpolating functions +# +> +> coeff_set_2d_order3 := { +> c03, c13, c23, c33, +> c02, c12, c22, c32, +> c01, c11, c21, c31, +> c00, c10, c20, c30 +> }; +coeff_set_2d_order3 := {c03, c13, c23, c33, c02, c12, c22, c32, c01, c11, c21, + + c31, c00, c10, c20, c30} + +> +> coeff_set_2d_order5 := { +> c05, c15, c25, c35, c45, c55, +> c04, c14, c24, c34, c44, c54, +> c03, c13, c23, c33, c43, c53, +> c02, c12, c22, c32, c42, c52, +> c01, c11, c21, c31, c41, c51, +> c00, c10, c20, c30, c40, c50 +> }; +coeff_set_2d_order5 := {c03, c13, c23, c33, c02, c12, c22, c32, c01, c11, c21, + + c31, c00, c10, c20, c30, c05, c15, c25, c35, c45, c55, c04, c14, c24, c34, + + c44, c54, c43, c53, c42, c52, c41, c51, c40, c50} + +> +################################################################################ +> +# +# 2-D derivative molecules (arguments = molecule center) +# +> +> deriv_2d_dx_3point := proc(i::integer, j::integer) +> dx_3point( +> proc(mi::integer) DATA(i+mi,j) end proc +> ) +> end proc; +deriv_2d_dx_3point := proc(i::integer, j::integer) + dx_3point(proc(mi::integer) DATA(i + mi, j) end proc) +end proc + +> deriv_2d_dy_3point := proc(i::integer, j::integer) +> dx_3point( +> proc(mj::integer) DATA(i,j+mj) end proc +> ) +> end proc; +deriv_2d_dy_3point := proc(i::integer, j::integer) + dx_3point(proc(mj::integer) DATA(i, j + mj) end proc) +end proc + +> deriv_2d_dxy_3point := proc(i::integer, j::integer) +> dx_3point( +> proc(mi::integer) +> dx_3point(proc(mj::integer) DATA(i+mi,j+mj) end proc) +> end proc +> ) +> end proc; +deriv_2d_dxy_3point := proc(i::integer, j::integer) + dx_3point(proc(mi::integer) + dx_3point(proc(mj::integer) DATA(i + mi, j + mj) end proc) + end proc) +end proc + +> +> deriv_2d_dx_5point := proc(i::integer, j::integer) +> dx_5point( +> proc(mi::integer) DATA(i+mi,j) end proc +> ) +> end proc; +deriv_2d_dx_5point := proc(i::integer, j::integer) + dx_5point(proc(mi::integer) DATA(i + mi, j) end proc) +end proc + +> deriv_2d_dy_5point := proc(i::integer, j::integer) +> dx_5point( +> proc(mj::integer) DATA(i,j+mj) end proc +> ) +> end proc; +deriv_2d_dy_5point := proc(i::integer, j::integer) + dx_5point(proc(mj::integer) DATA(i, j + mj) end proc) +end proc + +> deriv_2d_dxy_5point := proc(i::integer, j::integer) +> dx_5point( +> proc(mi::integer) +> dx_5point(proc(mj::integer) DATA(i+mi,j+mj) end proc) +> end proc +> ) +> end proc; +deriv_2d_dxy_5point := proc(i::integer, j::integer) + dx_5point(proc(mi::integer) + dx_5point(proc(mj::integer) DATA(i + mi, j + mj) end proc) + end proc) +end proc + +> +################################################################################ +################################################################################ +################################################################################ +> +# +# 3-D interpolating functions +# +> +> fn_3d_order3 := +> proc(x,y,z) +# z^3 --------------------------------------------------------------- +> + c033*y^3*z^3 + c133*x*y^3*z^3 + c233*x^2*y^3*z^3 + c333*x^3*y^3*z^3 +> + c023*y^2*z^3 + c123*x*y^2*z^3 + c223*x^2*y^2*z^3 + c323*x^3*y^2*z^3 +> + c013*y *z^3 + c113*x*y *z^3 + c213*x^2*y *z^3 + c313*x^3*y *z^3 +> + c003 *z^3 + c103*x *z^3 + c203*x^2 *z^3 + c303*x^3 *z^3 +# z^2 --------------------------------------------------------------- +> + c032*y^3*z^2 + c132*x*y^3*z^2 + c232*x^2*y^3*z^2 + c332*x^3*y^3*z^2 +> + c022*y^2*z^2 + c122*x*y^2*z^2 + c222*x^2*y^2*z^2 + c322*x^3*y^2*z^2 +> + c012*y *z^2 + c112*x*y *z^2 + c212*x^2*y *z^2 + c312*x^3*y *z^2 +> + c002 *z^2 + c102*x *z^2 + c202*x^2 *z^2 + c302*x^3 *z^2 +# z^1 --------------------------------------------------------------- +> + c031*y^3*z + c131*x*y^3*z + c231*x^2*y^3*z + c331*x^3*y^3*z +> + c021*y^2*z + c121*x*y^2*z + c221*x^2*y^2*z + c321*x^3*y^2*z +> + c011*y *z + c111*x*y *z + c211*x^2*y *z + c311*x^3*y *z +> + c001 *z + c101*x *z + c201*x^2 *z + c301*x^3 *z +# z^0 --------------------------------------------------------------- +> + c030*y^3 + c130*x*y^3 + c230*x^2*y^3 + c330*x^3*y^3 +> + c020*y^2 + c120*x*y^2 + c220*x^2*y^2 + c320*x^3*y^2 +> + c010*y + c110*x*y + c210*x^2*y + c310*x^3*y +> + c000 + c100*x + c200*x^2 + c300*x^3 +> end proc; +fn_3d_order3 := proc(x, y, z) + c330*x^3*y^3 + c031*y^3*z + c103*x*z^3 + c022*y^2*z^2 + c301*x^3*z + + c133*x*y^3*z^3 + c233*x^2*y^3*z^3 + c333*x^3*y^3*z^3 + + c123*x*y^2*z^3 + c223*x^2*y^2*z^3 + c323*x^3*y^2*z^3 + c113*x*y*z^3 + + c213*x^2*y*z^3 + c313*x^3*y*z^3 + c132*x*y^3*z^2 + c232*x^2*y^3*z^2 + + c332*x^3*y^3*z^2 + c122*x*y^2*z^2 + c222*x^2*y^2*z^2 + + c322*x^3*y^2*z^2 + c112*x*y*z^2 + c212*x^2*y*z^2 + c312*x^3*y*z^2 + + c131*x*y^3*z + c231*x^2*y^3*z + c331*x^3*y^3*z + c121*x*y^2*z + + c221*x^2*y^2*z + c321*x^3*y^2*z + c111*x*y*z + c211*x^2*y*z + + c311*x^3*y*z + c033*y^3*z^3 + c023*y^2*z^3 + c013*y*z^3 + + c203*x^2*z^3 + c303*x^3*z^3 + c032*y^3*z^2 + c003*z^3 + c002*z^2 + + c001*z + c030*y^3 + c020*y^2 + c010*y + c000 + c100*x + c200*x^2 + + c300*x^3 + c012*y*z^2 + c102*x*z^2 + c202*x^2*z^2 + c302*x^3*z^2 + + c021*y^2*z + c011*y*z + c101*x*z + c201*x^2*z + c130*x*y^3 + + c230*x^2*y^3 + c120*x*y^2 + c220*x^2*y^2 + c320*x^3*y^2 + c110*x*y + + c210*x^2*y + c310*x^3*y +end proc + +> +> fn_3d_order5 := +> proc(x,y,z) +# z^5 +> + c055*y^5*z^5 + c155*x*y^5*z^5 + c255*x^2*y^5*z^5 + c355*x^3*y^5*z^5 + c455*x^4*y^5*z^5 + c555*x^5*y^5*z^5 +> + c045*y^4*z^5 + c145*x*y^4*z^5 + c245*x^2*y^4*z^5 + c345*x^3*y^4*z^5 + c445*x^4*y^4*z^5 + c545*x^5*y^4*z^5 +> + c035*y^3*z^5 + c135*x*y^3*z^5 + c235*x^2*y^3*z^5 + c335*x^3*y^3*z^5 + c435*x^4*y^3*z^5 + c535*x^5*y^3*z^5 +> + c025*y^2*z^5 + c125*x*y^2*z^5 + c225*x^2*y^2*z^5 + c325*x^3*y^2*z^5 + c425*x^4*y^2*z^5 + c525*x^5*y^2*z^5 +> + c015*y *z^5 + c115*x*y *z^5 + c215*x^2*y *z^5 + c315*x^3*y *z^5 + c415*x^4*y *z^5 + c515*x^5*y *z^5 +> + c005 *z^5 + c105*x *z^5 + c205*x^2 *z^5 + c305*x^3 *z^5 + c405*x^4 *z^5 + c505*x^5 *z^5 +# z^4 +> + c054*y^5*z^4 + c154*x*y^5*z^4 + c254*x^2*y^5*z^4 + c354*x^3*y^5*z^4 + c454*x^4*y^5*z^4 + c554*x^5*y^5*z^4 +> + c044*y^4*z^4 + c144*x*y^4*z^4 + c244*x^2*y^4*z^4 + c344*x^3*y^4*z^4 + c444*x^4*y^4*z^4 + c544*x^5*y^4*z^4 +> + c034*y^3*z^4 + c134*x*y^3*z^4 + c234*x^2*y^3*z^4 + c334*x^3*y^3*z^4 + c434*x^4*y^3*z^4 + c534*x^5*y^3*z^4 +> + c024*y^2*z^4 + c124*x*y^2*z^4 + c224*x^2*y^2*z^4 + c324*x^3*y^2*z^4 + c424*x^4*y^2*z^4 + c524*x^5*y^2*z^4 +> + c014*y *z^4 + c114*x*y *z^4 + c214*x^2*y *z^4 + c314*x^3*y *z^4 + c414*x^4*y *z^4 + c514*x^5*y *z^4 +> + c004 *z^4 + c104*x *z^4 + c204*x^2 *z^4 + c304*x^3 *z^4 + c404*x^4 *z^4 + c504*x^5 *z^4 +# z^3 +> + c053*y^5*z^3 + c153*x*y^5*z^3 + c253*x^2*y^5*z^3 + c353*x^3*y^5*z^3 + c453*x^4*y^5*z^3 + c553*x^5*y^5*z^3 +> + c043*y^4*z^3 + c143*x*y^4*z^3 + c243*x^2*y^4*z^3 + c343*x^3*y^4*z^3 + c443*x^4*y^4*z^3 + c543*x^5*y^4*z^3 +> + c033*y^3*z^3 + c133*x*y^3*z^3 + c233*x^2*y^3*z^3 + c333*x^3*y^3*z^3 + c433*x^4*y^3*z^3 + c533*x^5*y^3*z^3 +> + c023*y^2*z^3 + c123*x*y^2*z^3 + c223*x^2*y^2*z^3 + c323*x^3*y^2*z^3 + c423*x^4*y^2*z^3 + c523*x^5*y^2*z^3 +> + c013*y *z^3 + c113*x*y *z^3 + c213*x^2*y *z^3 + c313*x^3*y *z^3 + c413*x^4*y *z^3 + c513*x^5*y *z^3 +> + c003 *z^3 + c103*x *z^3 + c203*x^2 *z^3 + c303*x^3 *z^3 + c403*x^4 *z^3 + c503*x^5 *z^3 +# z^2 +> + c052*y^5*z^2 + c152*x*y^5*z^2 + c252*x^2*y^5*z^2 + c352*x^3*y^5*z^2 + c452*x^4*y^5*z^2 + c552*x^5*y^5*z^2 +> + c042*y^4*z^2 + c142*x*y^4*z^2 + c242*x^2*y^4*z^2 + c342*x^3*y^4*z^2 + c442*x^4*y^4*z^2 + c542*x^5*y^4*z^2 +> + c032*y^3*z^2 + c132*x*y^3*z^2 + c232*x^2*y^3*z^2 + c332*x^3*y^3*z^2 + c432*x^4*y^3*z^2 + c532*x^5*y^3*z^2 +> + c022*y^2*z^2 + c122*x*y^2*z^2 + c222*x^2*y^2*z^2 + c322*x^3*y^2*z^2 + c422*x^4*y^2*z^2 + c522*x^5*y^2*z^2 +> + c012*y *z^2 + c112*x*y *z^2 + c212*x^2*y *z^2 + c312*x^3*y *z^2 + c412*x^4*y *z^2 + c512*x^5*y *z^2 +> + c002 *z^2 + c102*x *z^2 + c202*x^2 *z^2 + c302*x^3 *z^2 + c402*x^4 *z^2 + c502*x^5 *z^2 +# z^1 +> + c051*y^5*z + c151*x*y^5*z + c251*x^2*y^5*z + c351*x^3*y^5*z + c451*x^4*y^5*z + c551*x^5*y^5*z +> + c041*y^4*z + c141*x*y^4*z + c241*x^2*y^4*z + c341*x^3*y^4*z + c441*x^4*y^4*z + c541*x^5*y^4*z +> + c031*y^3*z + c131*x*y^3*z + c231*x^2*y^3*z + c331*x^3*y^3*z + c431*x^4*y^3*z + c531*x^5*y^3*z +> + c021*y^2*z + c121*x*y^2*z + c221*x^2*y^2*z + c321*x^3*y^2*z + c421*x^4*y^2*z + c521*x^5*y^2*z +> + c011*y *z + c111*x*y *z + c211*x^2*y *z + c311*x^3*y *z + c411*x^4*y *z + c511*x^5*y *z +> + c001 *z + c101*x *z + c201*x^2 *z + c301*x^3 *z + c401*x^4 *z + c501*x^5 *z +# z^0 +> + c050*y^5 + c150*x*y^5 + c250*x^2*y^5 + c350*x^3*y^5 + c450*x^4*y^5 + c550*x^5*y^5 +> + c040*y^4 + c140*x*y^4 + c240*x^2*y^4 + c340*x^3*y^4 + c440*x^4*y^4 + c540*x^5*y^4 +> + c030*y^3 + c130*x*y^3 + c230*x^2*y^3 + c330*x^3*y^3 + c430*x^4*y^3 + c530*x^5*y^3 +> + c020*y^2 + c120*x*y^2 + c220*x^2*y^2 + c320*x^3*y^2 + c420*x^4*y^2 + c520*x^5*y^2 +> + c010*y + c110*x*y + c210*x^2*y + c310*x^3*y + c410*x^4*y + c510*x^5*y +> + c000 + c100*x + c200*x^2 + c300*x^3 + c400*x^4 + c500*x^5 +> end proc; +fn_3d_order5 := proc(x, y, z) + c043*y^4*z^3 + c204*x^2*z^4 + c104*x*z^4 + c330*x^3*y^3 + c503*x^5*z^3 + + c250*x^2*y^5 + c031*y^3*z + c103*x*z^3 + c052*y^5*z^2 + c051*y^5*z + + c550*x^5*y^5 + c045*y^4*z^5 + c404*x^4*z^4 + c304*x^3*z^4 + + c042*y^4*z^2 + c140*x*y^4 + c022*y^2*z^2 + c205*x^2*z^5 + c150*x*y^5 + + c301*x^3*z + c133*x*y^3*z^3 + c233*x^2*y^3*z^3 + c333*x^3*y^3*z^3 + + c123*x*y^2*z^3 + c223*x^2*y^2*z^3 + c323*x^3*y^2*z^3 + c113*x*y*z^3 + + c213*x^2*y*z^3 + c313*x^3*y*z^3 + c132*x*y^3*z^2 + c232*x^2*y^3*z^2 + + c332*x^3*y^3*z^2 + c122*x*y^2*z^2 + c222*x^2*y^2*z^2 + + c322*x^3*y^2*z^2 + c112*x*y*z^2 + c212*x^2*y*z^2 + c312*x^3*y*z^2 + + c131*x*y^3*z + c231*x^2*y^3*z + c331*x^3*y^3*z + c121*x*y^2*z + + c221*x^2*y^2*z + c321*x^3*y^2*z + c111*x*y*z + c211*x^2*y*z + + c311*x^3*y*z + c155*x*y^5*z^5 + c255*x^2*y^5*z^5 + c355*x^3*y^5*z^5 + + c455*x^4*y^5*z^5 + c555*x^5*y^5*z^5 + c145*x*y^4*z^5 + + c245*x^2*y^4*z^5 + c345*x^3*y^4*z^5 + c445*x^4*y^4*z^5 + + c545*x^5*y^4*z^5 + c135*x*y^3*z^5 + c235*x^2*y^3*z^5 + + c335*x^3*y^3*z^5 + c435*x^4*y^3*z^5 + c535*x^5*y^3*z^5 + + c125*x*y^2*z^5 + c225*x^2*y^2*z^5 + c325*x^3*y^2*z^5 + + c425*x^4*y^2*z^5 + c525*x^5*y^2*z^5 + c115*x*y*z^5 + c215*x^2*y*z^5 + + c315*x^3*y*z^5 + c415*x^4*y*z^5 + c515*x^5*y*z^5 + c154*x*y^5*z^4 + + c254*x^2*y^5*z^4 + c354*x^3*y^5*z^4 + c454*x^4*y^5*z^4 + + c554*x^5*y^5*z^4 + c144*x*y^4*z^4 + c244*x^2*y^4*z^4 + + c344*x^3*y^4*z^4 + c444*x^4*y^4*z^4 + c544*x^5*y^4*z^4 + + c134*x*y^3*z^4 + c234*x^2*y^3*z^4 + c334*x^3*y^3*z^4 + + c434*x^4*y^3*z^4 + c534*x^5*y^3*z^4 + c124*x*y^2*z^4 + c035*y^3*z^5 + + c540*x^5*y^4 + c033*y^3*z^3 + c023*y^2*z^3 + c013*y*z^3 + + c203*x^2*z^3 + c303*x^3*z^3 + c032*y^3*z^2 + c003*z^3 + c002*z^2 + + c001*z + c030*y^3 + c020*y^2 + c010*y + c000 + c100*x + c200*x^2 + + c300*x^3 + c005*z^5 + c012*y*z^2 + c102*x*z^2 + c202*x^2*z^2 + + c302*x^3*z^2 + c021*y^2*z + c011*y*z + c101*x*z + c201*x^2*z + + c130*x*y^3 + c230*x^2*y^3 + c120*x*y^2 + c220*x^2*y^2 + c320*x^3*y^2 + + c110*x*y + c210*x^2*y + c310*x^3*y + c055*y^5*z^5 + c025*y^2*z^5 + + c015*y*z^5 + c105*x*z^5 + c305*x^3*z^5 + c405*x^4*z^5 + c505*x^5*z^5 + + c054*y^5*z^4 + c044*y^4*z^4 + c034*y^3*z^4 + c024*y^2*z^4 + + c224*x^2*y^2*z^4 + c324*x^3*y^2*z^4 + c424*x^4*y^2*z^4 + + c524*x^5*y^2*z^4 + c114*x*y*z^4 + c214*x^2*y*z^4 + c314*x^3*y*z^4 + + c414*x^4*y*z^4 + c514*x^5*y*z^4 + c153*x*y^5*z^3 + c253*x^2*y^5*z^3 + + c353*x^3*y^5*z^3 + c453*x^4*y^5*z^3 + c553*x^5*y^5*z^3 + + c143*x*y^4*z^3 + c243*x^2*y^4*z^3 + c343*x^3*y^4*z^3 + + c443*x^4*y^4*z^3 + c543*x^5*y^4*z^3 + c433*x^4*y^3*z^3 + + c533*x^5*y^3*z^3 + c423*x^4*y^2*z^3 + c523*x^5*y^2*z^3 + + c413*x^4*y*z^3 + c513*x^5*y*z^3 + c152*x*y^5*z^2 + c252*x^2*y^5*z^2 + + c352*x^3*y^5*z^2 + c452*x^4*y^5*z^2 + c552*x^5*y^5*z^2 + + c142*x*y^4*z^2 + c242*x^2*y^4*z^2 + c342*x^3*y^4*z^2 + + c442*x^4*y^4*z^2 + c542*x^5*y^4*z^2 + c432*x^4*y^3*z^2 + + c532*x^5*y^3*z^2 + c422*x^4*y^2*z^2 + c522*x^5*y^2*z^2 + + c412*x^4*y*z^2 + c512*x^5*y*z^2 + c151*x*y^5*z + c251*x^2*y^5*z + + c351*x^3*y^5*z + c451*x^4*y^5*z + c551*x^5*y^5*z + c141*x*y^4*z + + c241*x^2*y^4*z + c341*x^3*y^4*z + c441*x^4*y^4*z + c541*x^5*y^4*z + + c431*x^4*y^3*z + c531*x^5*y^3*z + c421*x^4*y^2*z + c521*x^5*y^2*z + + c411*x^4*y*z + c511*x^5*y*z + c004*z^4 + c050*y^5 + c040*y^4 + + c400*x^4 + c500*x^5 + c014*y*z^4 + c504*x^5*z^4 + c053*y^5*z^3 + + c403*x^4*z^3 + c402*x^4*z^2 + c502*x^5*z^2 + c041*y^4*z + c401*x^4*z + + c501*x^5*z + c350*x^3*y^5 + c450*x^4*y^5 + c240*x^2*y^4 + + c340*x^3*y^4 + c440*x^4*y^4 + c430*x^4*y^3 + c530*x^5*y^3 + + c420*x^4*y^2 + c520*x^5*y^2 + c410*x^4*y + c510*x^5*y +end proc + +> +################################################################################ +> +# coordinates for 3-D interpolating functions +> coord_list_3d := [x,y,z]; + coord_list_3d := [x, y, z] + +> +################################################################################ +> +# +# coefficients in 3-D interpolating functions +# +> +> coeff_set_3d_order3 := { +> # z^3 +> c033, c133, c233, c333, +> c023, c123, c223, c323, +> c013, c113, c213, c313, +> c003, c103, c203, c303, +> # z^2 +> c032, c132, c232, c332, +> c022, c122, c222, c322, +> c012, c112, c212, c312, +> c002, c102, c202, c302, +> # z^1 +> c031, c131, c231, c331, +> c021, c121, c221, c321, +> c011, c111, c211, c311, +> c001, c101, c201, c301, +> # z^0 +> c030, c130, c230, c330, +> c020, c120, c220, c320, +> c010, c110, c210, c310, +> c000, c100, c200, c300 +> }; +coeff_set_3d_order3 := {c033, c133, c233, c333, c023, c123, c223, c323, c013, + + c113, c213, c313, c003, c103, c203, c303, c032, c132, c232, c332, c022, + + c122, c222, c322, c012, c112, c212, c312, c002, c102, c202, c302, c031, + + c131, c231, c331, c021, c121, c221, c321, c011, c111, c211, c311, c001, + + c101, c201, c301, c030, c130, c230, c330, c020, c120, c220, c320, c010, + + c110, c210, c310, c000, c100, c200, c300} + +> +> coeff_set_3d_order5 := { +> # z^5 +> c055, c155, c255, c355, c455, c555, +> c045, c145, c245, c345, c445, c545, +> c035, c135, c235, c335, c435, c535, +> c025, c125, c225, c325, c425, c525, +> c015, c115, c215, c315, c415, c515, +> c005, c105, c205, c305, c405, c505, +> # z^4 +> c054, c154, c254, c354, c454, c554, +> c044, c144, c244, c344, c444, c544, +> c034, c134, c234, c334, c434, c534, +> c024, c124, c224, c324, c424, c524, +> c014, c114, c214, c314, c414, c514, +> c004, c104, c204, c304, c404, c504, +> # z^3 +> c053, c153, c253, c353, c453, c553, +> c043, c143, c243, c343, c443, c543, +> c033, c133, c233, c333, c433, c533, +> c023, c123, c223, c323, c423, c523, +> c013, c113, c213, c313, c413, c513, +> c003, c103, c203, c303, c403, c503, +> # z^2 +> c052, c152, c252, c352, c452, c552, +> c042, c142, c242, c342, c442, c542, +> c032, c132, c232, c332, c432, c532, +> c022, c122, c222, c322, c422, c522, +> c012, c112, c212, c312, c412, c512, +> c002, c102, c202, c302, c402, c502, +> # z^1 +> c051, c151, c251, c351, c451, c551, +> c041, c141, c241, c341, c441, c541, +> c031, c131, c231, c331, c431, c531, +> c021, c121, c221, c321, c421, c521, +> c011, c111, c211, c311, c411, c511, +> c001, c101, c201, c301, c401, c501, +> # z^0 +> c050, c150, c250, c350, c450, c550, +> c040, c140, c240, c340, c440, c540, +> c030, c130, c230, c330, c430, c530, +> c020, c120, c220, c320, c420, c520, +> c010, c110, c210, c310, c410, c510, +> c000, c100, c200, c300, c400, c500 +> }; +coeff_set_3d_order5 := {c033, c133, c233, c333, c023, c123, c223, c323, c013, + + c113, c213, c313, c003, c103, c203, c303, c032, c132, c232, c332, c022, + + c122, c222, c322, c012, c112, c212, c312, c002, c102, c202, c302, c031, + + c131, c231, c331, c021, c121, c221, c321, c011, c111, c211, c311, c001, + + c101, c201, c301, c030, c130, c230, c330, c020, c120, c220, c320, c010, + + c110, c210, c310, c000, c100, c200, c300, c055, c155, c255, c355, c455, + + c555, c045, c145, c245, c345, c445, c545, c035, c135, c235, c335, c435, + + c535, c025, c125, c225, c325, c425, c525, c015, c115, c215, c315, c415, + + c515, c005, c105, c205, c305, c405, c505, c054, c154, c254, c354, c454, + + c554, c044, c144, c244, c344, c444, c544, c034, c134, c234, c334, c434, + + c534, c024, c124, c224, c324, c424, c524, c014, c114, c214, c314, c414, + + c514, c004, c104, c204, c304, c404, c504, c053, c153, c253, c353, c453, + + c553, c043, c143, c243, c343, c443, c543, c433, c533, c423, c523, c413, + + c513, c403, c503, c052, c152, c252, c352, c452, c552, c042, c142, c242, + + c342, c442, c542, c432, c532, c422, c522, c412, c512, c402, c502, c051, + + c151, c251, c351, c451, c551, c041, c141, c241, c341, c441, c541, c431, + + c531, c421, c521, c411, c511, c401, c501, c050, c150, c250, c350, c450, + + c550, c040, c140, c240, c340, c440, c540, c430, c530, c420, c520, c410, + + c510, c400, c500} + +> +################################################################################ +> +# +# 3-D derivative molecules (arguments = molecule center) +# +> +> deriv_3d_dx_3point := proc(i::integer, j::integer, k::integer) +> dx_3point( +> proc(mi::integer) DATA(i+mi,j,k) end proc +> ) +> end proc; +deriv_3d_dx_3point := proc(i::integer, j::integer, k::integer) + dx_3point(proc(mi::integer) DATA(i + mi, j, k) end proc) +end proc + +> deriv_3d_dy_3point := proc(i::integer, j::integer, k::integer) +> dx_3point( +> proc(mj::integer) DATA(i,j+mj,k) end proc +> ) +> end proc; +deriv_3d_dy_3point := proc(i::integer, j::integer, k::integer) + dx_3point(proc(mj::integer) DATA(i, j + mj, k) end proc) +end proc + +> deriv_3d_dz_3point := proc(i::integer, j::integer, k::integer) +> dx_3point( +> proc(mk::integer) DATA(i,j,k+mk) end proc +> ) +> end proc; +deriv_3d_dz_3point := proc(i::integer, j::integer, k::integer) + dx_3point(proc(mk::integer) DATA(i, j, k + mk) end proc) +end proc + +> deriv_3d_dxy_3point := proc(i::integer, j::integer, k::integer) +> dx_3point( +> proc(mi::integer) +> dx_3point( +> proc(mj::integer) DATA(i+mi,j+mj,k) end proc +> ) +> end proc +> ) +> end proc; +deriv_3d_dxy_3point := proc(i::integer, j::integer, k::integer) + dx_3point(proc(mi::integer) + dx_3point(proc(mj::integer) DATA(i + mi, j + mj, k) end proc) + end proc) +end proc + +> deriv_3d_dxz_3point := proc(i::integer, j::integer, k::integer) +> dx_3point( +> proc(mi::integer) +> dx_3point( +> proc(mk::integer) DATA(i+mi,j,k+mk) end proc +> ) +> end proc +> ) +> end proc; +deriv_3d_dxz_3point := proc(i::integer, j::integer, k::integer) + dx_3point(proc(mi::integer) + dx_3point(proc(mk::integer) DATA(i + mi, j, k + mk) end proc) + end proc) +end proc + +> deriv_3d_dyz_3point := proc(i::integer, j::integer, k::integer) +> dx_3point( +> proc(mj::integer) +> dx_3point( +> proc(mk::integer) DATA(i,j+mj,k+mk) end proc +> ) +> end proc +> ) +> end proc; +deriv_3d_dyz_3point := proc(i::integer, j::integer, k::integer) + dx_3point(proc(mj::integer) + dx_3point(proc(mk::integer) DATA(i, j + mj, k + mk) end proc) + end proc) +end proc + +> deriv_3d_dxyz_3point := proc(i::integer, j::integer, k::integer) +> dx_3point( +> proc(mi::integer) +> dx_3point( +> proc(mj::integer) +> dx_3point( +> proc(mk::integer) +> DATA(i+mi,j+mj,k+mk) +> end proc +> ) +> end proc +> ) +> end proc +> ) +> end proc; +deriv_3d_dxyz_3point := proc(i::integer, j::integer, k::integer) + dx_3point(proc(mi::integer) + dx_3point(proc(mj::integer) + dx_3point( + proc(mk::integer) DATA(i + mi, j + mj, k + mk) end proc) + end proc) + end proc) +end proc + +> +> deriv_3d_dx_5point := proc(i::integer, j::integer, k::integer) +> dx_5point( +> proc(mi::integer) DATA(i+mi,j,k) end proc +> ) +> end proc; +deriv_3d_dx_5point := proc(i::integer, j::integer, k::integer) + dx_5point(proc(mi::integer) DATA(i + mi, j, k) end proc) +end proc + +> deriv_3d_dy_5point := proc(i::integer, j::integer, k::integer) +> dx_5point( +> proc(mj::integer) DATA(i,j+mj,k) end proc +> ) +> end proc; +deriv_3d_dy_5point := proc(i::integer, j::integer, k::integer) + dx_5point(proc(mj::integer) DATA(i, j + mj, k) end proc) +end proc + +> deriv_3d_dz_5point := proc(i::integer, j::integer, k::integer) +> dx_5point( +> proc(mk::integer) DATA(i,j,k+mk) end proc +> ) +> end proc; +deriv_3d_dz_5point := proc(i::integer, j::integer, k::integer) + dx_5point(proc(mk::integer) DATA(i, j, k + mk) end proc) +end proc + +> deriv_3d_dxy_5point := proc(i::integer, j::integer, k::integer) +> dx_5point( +> proc(mi::integer) +> dx_5point( +> proc(mj::integer) DATA(i+mi,j+mj,k) end proc +> ) +> end proc +> ) +> end proc; +deriv_3d_dxy_5point := proc(i::integer, j::integer, k::integer) + dx_5point(proc(mi::integer) + dx_5point(proc(mj::integer) DATA(i + mi, j + mj, k) end proc) + end proc) +end proc + +> deriv_3d_dxz_5point := proc(i::integer, j::integer, k::integer) +> dx_5point( +> proc(mi::integer) +> dx_5point( +> proc(mk::integer) DATA(i+mi,j,k+mk) end proc +> ) +> end proc +> ) +> end proc; +deriv_3d_dxz_5point := proc(i::integer, j::integer, k::integer) + dx_5point(proc(mi::integer) + dx_5point(proc(mk::integer) DATA(i + mi, j, k + mk) end proc) + end proc) +end proc + +> deriv_3d_dyz_5point := proc(i::integer, j::integer, k::integer) +> dx_5point( +> proc(mj::integer) +> dx_5point( +> proc(mk::integer) DATA(i,j+mj,k+mk) end proc +> ) +> end proc +> ) +> end proc; +deriv_3d_dyz_5point := proc(i::integer, j::integer, k::integer) + dx_5point(proc(mj::integer) + dx_5point(proc(mk::integer) DATA(i, j + mj, k + mk) end proc) + end proc) +end proc + +> deriv_3d_dxyz_5point := proc(i::integer, j::integer, k::integer) +> dx_5point( +> proc(mi::integer) +> dx_5point( +> proc(mj::integer) +> dx_5point( +> proc(mk::integer) +> DATA(i+mi,j+mj,k+mk) +> end proc +> ) +> end proc +> ) +> end proc +> ) +> end proc; +deriv_3d_dxyz_5point := proc(i::integer, j::integer, k::integer) + dx_5point(proc(mi::integer) + dx_5point(proc(mj::integer) + dx_5point( + proc(mk::integer) DATA(i + mi, j + mj, k + mk) end proc) + end proc) + end proc) +end proc + +> +################################################################################ +################################################################################ +################################################################################ +# 1d.maple -- compute Hermite interpolation coefficients in 1-D +# $Header:$ +> +################################################################################ +> +# +# 1d, cube, polynomial order=3, derivatives via 3-point order=2 formula +# ==> overall order=2, 4-point molecule +# +> +# interpolating polynomial +> interp_1d_cube_order2 +> := Hermite_polynomial_interpolant(fn_1d_order3, +> coeff_set_1d_order3, +> [x], +> { {x} = deriv_1d_dx_3point }, +> {op(posn_list_1d_size2)}, +> {op(posn_list_1d_size2)}); +interp_1d_cube_order2 := DATA(0) + (- 1/2 DATA(-1) + 1/2 DATA(1)) x + + 2 + + (DATA(-1) + 2 DATA(1) - 5/2 DATA(0) - 1/2 DATA(2)) x + + 3 + + (3/2 DATA(0) - 1/2 DATA(-1) - 3/2 DATA(1) + 1/2 DATA(2)) x + +> +# I +> coeff_as_lc_of_data(%, posn_list_1d_size4); + 2 3 2 3 +[COEFF(-1) = - 1/2 x + x - 1/2 x , COEFF(0) = - 5/2 x + 1 + 3/2 x , + + 3 2 3 2 + COEFF(1) = - 3/2 x + 1/2 x + 2 x , COEFF(2) = 1/2 x - 1/2 x ] + +> print_coeff__lc_of_data(%, "coeff_I_", "fp", +> "1d.coeffs/1d.cube.order2/coeff-I.compute.c"); +bytes used=1000076, alloc=917336, time=0.09 +> +# d/dx +> simplify( diff(interp_1d_cube_order2,x) ); +- 1/2 DATA(-1) + 1/2 DATA(1) + 2 x DATA(-1) + 4 x DATA(1) - 5 x DATA(0) + + 2 2 2 + - x DATA(2) + 9/2 x DATA(0) - 3/2 x DATA(-1) - 9/2 x DATA(1) + + 2 + + 3/2 x DATA(2) + +> coeff_as_lc_of_data(%, posn_list_1d_size4); + 2 2 +[COEFF(-1) = 2 x - 3/2 x - 1/2, COEFF(0) = -5 x + 9/2 x , + + 2 2 + COEFF(1) = 1/2 + 4 x - 9/2 x , COEFF(2) = -x + 3/2 x ] + +> print_coeff__lc_of_data(%, "coeff_dx_", "fp", +> "1d.coeffs/1d.cube.order2/coeff-dx.compute.c"); +bytes used=2000240, alloc=1441528, time=0.17 +> +# d^2/dx^2 +> simplify( diff(interp_1d_cube_order2,x,x) ); +2 DATA(-1) + 4 DATA(1) - 5 DATA(0) - DATA(2) + 9 x DATA(0) - 3 x DATA(-1) + + - 9 x DATA(1) + 3 x DATA(2) + +> coeff_as_lc_of_data(%, posn_list_1d_size4); +[COEFF(-1) = 2 - 3 x, COEFF(0) = -5 + 9 x, COEFF(1) = -9 x + 4, + + COEFF(2) = -1 + 3 x] + +> print_coeff__lc_of_data(%, "coeff_dxx_", "fp", +> "1d.coeffs/1d.cube.order2/coeff-dxx.compute.c"); +> +################################################################################ +> +# +# 1d, cube, polynomial order=3, derivatives via 5-point order=4 formula +# ==> overall order=3, 6-point molecule +# +> +# interpolating polynomial +> interp_1d_cube_order3 +> := Hermite_polynomial_interpolant(fn_1d_order3, +> coeff_set_1d_order3, +> [x], +> { {x} = deriv_1d_dx_5point }, +> {op(posn_list_1d_size2)}, +> {op(posn_list_1d_size2)}); +interp_1d_cube_order3 := DATA(0) + + + (1/12 DATA(-2) - 2/3 DATA(-1) + 2/3 DATA(1) - 1/12 DATA(2)) x + ( + + - 1/6 DATA(-2) + 5/4 DATA(-1) + 5/3 DATA(1) - 1/2 DATA(2) - 7/3 DATA(0) + + 2 + + 1/12 DATA(3)) x + (4/3 DATA(0) + 1/12 DATA(-2) - 7/12 DATA(-1) + + 3 + - 4/3 DATA(1) + 7/12 DATA(2) - 1/12 DATA(3)) x + +> +# I +> coeff_as_lc_of_data(%, posn_list_1d_size6); + 2 3 2 3 +[COEFF(-2) = 1/12 x - 1/6 x + 1/12 x , COEFF(-1) = - 2/3 x + 5/4 x - 7/12 x , + + 2 3 3 2 + COEFF(0) = - 7/3 x + 1 + 4/3 x , COEFF(1) = - 4/3 x + 2/3 x + 5/3 x , + + 3 2 3 2 + COEFF(2) = 7/12 x - 1/12 x - 1/2 x , COEFF(3) = - 1/12 x + 1/12 x ] + +> print_coeff__lc_of_data(%, "coeff_I_", "fp", +> "1d.coeffs/1d.cube.order3/coeff-I.compute.c"); +bytes used=3000532, alloc=1703624, time=0.26 +> +# d/dx +> simplify( diff(interp_1d_cube_order3,x) ); +1/12 DATA(-2) - 2/3 DATA(-1) + 2/3 DATA(1) - 1/12 DATA(2) - 1/3 x DATA(-2) + + + 5/2 x DATA(-1) + 10/3 x DATA(1) - x DATA(2) - 14/3 x DATA(0) + + 2 2 2 + + 1/6 x DATA(3) + 4 x DATA(0) + 1/4 x DATA(-2) - 7/4 x DATA(-1) + + 2 2 2 + - 4 x DATA(1) + 7/4 x DATA(2) - 1/4 x DATA(3) + +> coeff_as_lc_of_data(%, posn_list_1d_size6); + 2 2 +[COEFF(-2) = - 1/3 x + 1/12 + 1/4 x , COEFF(-1) = - 2/3 + 5/2 x - 7/4 x , + + 2 2 + COEFF(0) = - 14/3 x + 4 x , COEFF(1) = -4 x + 10/3 x + 2/3, + + 2 2 + COEFF(2) = 7/4 x - 1/12 - x, COEFF(3) = 1/6 x - 1/4 x ] + +> print_coeff__lc_of_data(%, "coeff_dx_", "fp", +> "1d.coeffs/1d.cube.order3/coeff-dx.compute.c"); +bytes used=4000780, alloc=1769148, time=0.32 +> +# d^2/dx^2 +> simplify( diff(interp_1d_cube_order3,x,x) ); +- 1/3 DATA(-2) + 5/2 DATA(-1) + 10/3 DATA(1) - DATA(2) - 14/3 DATA(0) + + + 1/6 DATA(3) + 8 x DATA(0) + 1/2 x DATA(-2) - 7/2 x DATA(-1) + + - 8 x DATA(1) + 7/2 x DATA(2) - 1/2 x DATA(3) + +> coeff_as_lc_of_data(%, posn_list_1d_size6); +[COEFF(-2) = - 1/3 + 1/2 x, COEFF(-1) = - 7/2 x + 5/2, COEFF(0) = - 14/3 + 8 x, + + COEFF(1) = 10/3 - 8 x, COEFF(2) = 7/2 x - 1, COEFF(3) = 1/6 - 1/2 x] + +> print_coeff__lc_of_data(%, "coeff_dxx_", "fp", +> "1d.coeffs/1d.cube.order3/coeff-dxx.compute.c"); +> +################################################################################ +> +# +# 1d, cube, polynomial order=5, derivatives via 5-point order=4 formula +# ==> overall order=4, 6-point molecule +# +# n.b. in higher dimensions this doesn't work -- there aren't enough +# equations to determine all the coefficients :( :( +# +> +# interpolating polynomial +> interp_1d_cube_order4 +> := Hermite_polynomial_interpolant(fn_1d_order5, +> coeff_set_1d_order5, +> [x], +> { {x} = deriv_1d_dx_5point }, +> {op(posn_list_1d_size4)}, +> {op(posn_list_1d_size2)}); +bytes used=5001896, alloc=1769148, time=0.41 +interp_1d_cube_order4 := DATA(0) + + / + + (1/12 DATA(-2) - 2/3 DATA(-1) + 2/3 DATA(1) - 1/12 DATA(2)) x + | + \ + + 13 11 25 + - 1/8 DATA(-2) + -- DATA(-1) + 3/2 DATA(1) - -- DATA(2) - -- DATA(0) + 12 24 12 + + \ 2 + + 1/12 DATA(3)| x + (5/12 DATA(0) - 1/24 DATA(-2) - 1/24 DATA(-1) + / + + 3 /13 + - 7/12 DATA(1) + 7/24 DATA(2) - 1/24 DATA(3)) x + |-- DATA(0) + \12 + + 11 \ 4 + + 1/8 DATA(-2) - 7/12 DATA(-1) - DATA(1) + -- DATA(2) - 1/12 DATA(3)| x + 24 / + + + (- 5/12 DATA(0) - 1/24 DATA(-2) + 5/24 DATA(-1) + 5/12 DATA(1) + + 5 + - 5/24 DATA(2) + 1/24 DATA(3)) x + +> +# I +> coeff_as_lc_of_data(%, posn_list_1d_size6); + 2 3 4 5 +[COEFF(-2) = 1/12 x - 1/8 x - 1/24 x + 1/8 x - 1/24 x , + + 13 2 3 4 5 + COEFF(-1) = - 2/3 x + -- x - 1/24 x - 7/12 x + 5/24 x , + 12 + + 25 2 3 13 4 5 + COEFF(0) = - -- x + 5/12 x + -- x + 1 - 5/12 x , + 12 12 + + 3 2 5 4 + COEFF(1) = - 7/12 x + 2/3 x + 3/2 x + 5/12 x - x , + + 11 2 3 5 11 4 + COEFF(2) = - 1/12 x - -- x + 7/24 x - 5/24 x + -- x , + 24 24 + + 3 5 2 4 + COEFF(3) = - 1/24 x + 1/24 x + 1/12 x - 1/12 x ] + +> print_coeff__lc_of_data(%, "coeff_I_", "fp", +> "1d.coeffs/1d.cube.order4/coeff-I.compute.c"); +bytes used=6002224, alloc=1834672, time=0.49 +> +# d/dx +> simplify( diff(interp_1d_cube_order4,x) ); + 3 3 +2/3 DATA(1) - 2/3 DATA(-1) - 1/12 DATA(2) + 1/2 x DATA(-2) + 13/3 x DATA(0) + + 3 3 3 3 + - 7/3 x DATA(-1) - 4 x DATA(1) + 11/6 x DATA(2) - 1/3 x DATA(3) + + 25 4 4 25 4 25 4 + - -- x DATA(0) - 5/24 x DATA(-2) + -- x DATA(-1) + -- x DATA(1) + 12 24 12 + + 25 4 4 + - -- x DATA(2) + 5/24 x DATA(3) - 1/4 x DATA(-2) + 13/6 x DATA(-1) + 24 + + 11 + + 3 x DATA(1) - -- x DATA(2) - 25/6 x DATA(0) + 1/6 x DATA(3) + 12 + + 2 2 2 2 + + 5/4 x DATA(0) - 1/8 x DATA(-2) - 1/8 x DATA(-1) - 7/4 x DATA(1) + + 2 2 + + 7/8 x DATA(2) - 1/8 x DATA(3) + 1/12 DATA(-2) + +> coeff_as_lc_of_data(%, posn_list_1d_size6); +bytes used=7002492, alloc=1834672, time=0.57 + 3 4 2 +[COEFF(-2) = 1/2 x - 5/24 x - 1/8 x + 1/12 - 1/4 x, + + 3 25 4 2 + COEFF(-1) = - 7/3 x + 13/6 x + -- x - 1/8 x - 2/3, + 24 + + 2 3 25 4 + COEFF(0) = - 25/6 x + 5/4 x + 13/3 x - -- x , + 12 + + 2 3 25 4 + COEFF(1) = - 7/4 x + 3 x - 4 x + 2/3 + -- x , + 12 + + 3 25 4 11 2 + COEFF(2) = - 1/12 + 11/6 x - -- x - -- x + 7/8 x , + 24 12 + + 3 4 2 + COEFF(3) = - 1/3 x + 1/6 x + 5/24 x - 1/8 x ] + +> print_coeff__lc_of_data(%, "coeff_dx_", "fp", +> "1d.coeffs/1d.cube.order4/coeff-dx.compute.c"); +> +# d^2/dx^2 +> simplify( diff(interp_1d_cube_order4,x,x) ); +bytes used=8002712, alloc=1834672, time=0.65 + 11 +- 1/4 DATA(-2) + 13/6 DATA(-1) + 3 DATA(1) - -- DATA(2) - 25/6 DATA(0) + 12 + + + 1/6 DATA(3) + 5/2 x DATA(0) - 1/4 x DATA(-2) - 1/4 x DATA(-1) + + 2 + - 7/2 x DATA(1) + 7/4 x DATA(2) - 1/4 x DATA(3) + 13 x DATA(0) + + 2 2 2 2 + + 3/2 x DATA(-2) - 7 x DATA(-1) - 12 x DATA(1) + 11/2 x DATA(2) + + 2 3 3 3 + - x DATA(3) - 25/3 x DATA(0) - 5/6 x DATA(-2) + 25/6 x DATA(-1) + + 3 3 3 + + 25/3 x DATA(1) - 25/6 x DATA(2) + 5/6 x DATA(3) + +> coeff_as_lc_of_data(%, posn_list_1d_size6); + 2 3 +[COEFF(-2) = - 1/4 - 1/4 x + 3/2 x - 5/6 x , + + 2 3 + COEFF(-1) = 13/6 - 1/4 x - 7 x + 25/6 x , + + 3 2 + COEFF(0) = - 25/3 x + 13 x - 25/6 + 5/2 x, + + 2 3 + COEFF(1) = 3 - 7/2 x - 12 x + 25/3 x , + + 2 3 11 + COEFF(2) = 11/2 x - 25/6 x + 7/4 x - --, + 12 + + 3 2 + COEFF(3) = 5/6 x + 1/6 - 1/4 x - x ] + +> print_coeff__lc_of_data(%, "coeff_dxx_", "fp", +> "1d.coeffs/1d.cube.order4/coeff-dxx.compute.c"); +bytes used=9002944, alloc=1834672, time=0.71 +> +################################################################################ +> quit +bytes used=9085136, alloc=1834672, time=0.72 |