2 from __future__ import print_function
4 from sympy.vector.vector import *
7 from sympy.utilities.lambdify import lambdify, implemented_function
10 from moedebug import *
13 if not dbg_enabled(): return
17 if not dbg_enabled(): return
19 print('\n ' + vn + '\n')
24 N = CoordSysCartesian('N')
28 def vector_symbols(vnames):
30 for vname in vnames.split(' '):
32 for cname in 'i j k'.split(' '):
33 v += getattr(N, cname) * symbols(vname + '_' + cname)
37 abcd = vector_symbols('A B C D')
38 p = vector_symbols('p')
40 E, F = vector_symbols('E F')
41 En, Fn = vector_symbols('En Fn')
43 def vector_component(v, ix):
44 return v.components[N.base_vectors()[ix]]
46 # x array in numerical algorithm has:
47 # N x 3 coordinates of points 1..N-2
48 # 1 length parameter |EA| for point 0
49 # 1 length parameter |DE| for point N-1
52 return Piecewise((p == 0, E + En *
58 for i in range(0..len(abcd)):
67 cost_ABCD = (QR & QR) / (BC & BC)
72 cost_ABCD = subst_vect(
77 cost_EBCD = subst_vect(cost_ABCD, A, A_end)
79 # diff_A_i = cost_ABCD.diff(vector_component(A, 0))
85 def ourccode(*a, **kw):
86 return ccode(*a, user_functions={'sinc':'sinc'}, **kw)
92 for l in s.split('\n'):
95 def cse_prep_cprint(v, tmp_prefix):
96 # => v, but also having cprint'd the common subexpression assignments
97 sym_iter = map((lambda i: symbols('%s%d' % (tmp_prefix,i))),
99 (defs, vs) = cse(v, symbols=sym_iter)
100 for defname, defval in defs:
101 cprint('double '+ourccode(defval, assign_to=defname))
104 def cassign(v, assign_to, tmp_prefix):
105 v = cse_prep_cprint(v, tmp_prefix)
106 cprint(ourccode(v, assign_to=assign_to))
108 def gen_diff(current, smalls):
111 j = zeros(len(params),0)
115 d = diff(current, paramv)
119 j = cse_prep_cprint(j, 'jtmp')
120 for ix in range(0, j.cols):
121 cprint(ourccode(j.col(ix), 'J_COL'))
122 cprint('J_END_COL(%d)' % ix)
126 cprint('if (!IS_SMALL(' + ourccode(small) + ')) {')
127 gen_diff(current, smalls)
128 cprint('} else { /* %s small */' % small)
129 gen_diff(current.replace(
131 1 - small*small/factorial(3) - small**4/factorial(5),
135 cprint('} /* %s small */' % small)
138 cprintraw('// AUTOGENERATED - DO NOT EDIT\n')
140 def gen_abcd_ijk_macros():
141 abcd = 'A B C D'.split(' ')
142 ijk = 'i j k'.split(' ')
143 for ai in range(0, len(abcd)):
144 for ii in range(0, len(ijk)):
145 cprintraw(('#define %s_%s' % (abcd[ai], ijk[ii]) +
146 ' X[ ((P) - 1 + %d) * 3 + %d ]' % (ai, ii)))
148 cprint('#define E_CALCULATE_MID')
149 cassign(cost_ABCD,'d','dtmp_mid')
151 def gen_e_calculate():
152 cprint('#define E_CALCULATE_MID')
153 cassign(cost_ABCD,'d','dtmp_mid')
155 def gen_f_populate():
156 cprint('#define F_POPULATE')
157 cassign(cost_ABCD,'F','ftmp')
160 def gen_j_populate():
161 cprint('#define J_POPULATE')
162 gen_diff(result_dirnscaled, (sh*sh*la, th*th*la))
167 gen_abcd_ijk_macros()
171 # https://github.com/sympy/sympy/issues/13642
172 # "lambdify sinc gives wrong answer!"
174 sinc_fixed = Function('sinc_fixed')
175 implemented_function(sinc_fixed, lambda x: np.sinc(x/np.pi))
176 out = out.subs(sinc,sinc_fixed)
177 p = list(map(eval,params))
178 return lambdify(p, out)