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 A, B, C, D = vector_symbols('A B C D')
38 p = vector_symbols('p')
40 E, H = vector_symbols('E H')
41 En, Hn = vector_symbols('En Hn')
43 EFl, GHl = symbols('EFl GHl')
45 def vector_component(v, ix):
46 return v.components[N.base_vectors()[ix]]
48 # x array in numerical algorithm has:
49 # N x 3 coordinates of points 0..N-3
50 # 1 EFl = length parameter |EF| for point 1
51 # 1 GHl = length parameter |GH| for point N-2
53 # fixed array in numerical algorithm has:
66 cost_ABCD = (QR & QR) / (BC & BC)
74 # diff_A_i = cost_ABCD.diff(vector_component(A, 0))
80 def ourccode(*a, **kw):
81 return ccode(*a, user_functions={'sinc':'sinc'}, **kw)
87 for l in s.split('\n'):
90 def cse_prep_cprint(v, tmp_prefix):
91 # => v, but also having cprint'd the common subexpression assignments
92 sym_iter = map((lambda i: symbols('%s%d' % (tmp_prefix,i))),
94 (defs, vs) = cse(v, symbols=sym_iter)
95 for defname, defval in defs:
96 cprint('double '+ourccode(defval, assign_to=defname))
99 def cassign(v, assign_to, tmp_prefix):
100 v = cse_prep_cprint(v, tmp_prefix)
101 cprint(ourccode(v, assign_to=assign_to))
103 def gen_diff(current, smalls):
106 j = zeros(len(params),0)
110 d = diff(current, paramv)
114 j = cse_prep_cprint(j, 'jtmp')
115 for ix in range(0, j.cols):
116 cprint(ourccode(j.col(ix), 'J_COL'))
117 cprint('J_END_COL(%d)' % ix)
121 cprint('if (!IS_SMALL(' + ourccode(small) + ')) {')
122 gen_diff(current, smalls)
123 cprint('} else { /* %s small */' % small)
124 gen_diff(current.replace(
126 1 - small*small/factorial(3) - small**4/factorial(5),
130 cprint('} /* %s small */' % small)
133 cprintraw('// AUTOGENERATED - DO NOT EDIT\n')
135 def gen_point_coords_macro(macro_basename):
136 ijk = 'i j k'.split(' ')
137 for ii in range(0, len(ijk)):
138 cprintraw('#define %s_%s (%s[%d])'
139 % (macro_basename, ijk[ii], macro_basename, ii))
141 def gen_point_index_macro(macro_basename, c_array_name, base_index):
142 cprintraw('#define %s (&%s[%s])'
143 % (macro_basename, c_array_name, base_index))
144 gen_point_coords_macro(macro_basename)
146 def gen_point_references():
147 abcd = 'A B C D'.split(' ')
148 eh = 'E En H Hn'.split(' ')
149 for ehi in range(0, len(eh)):
150 gen_point_index_macro(eh[ehi], 'FIXED', ehi * 3)
152 cprint('#define POINT(PP) (')
153 cprint(' (PP) == 0 ? E :')
154 cprint(' (PP) == 1 ? F :')
155 cprint(' (PP) == N-2 ? G :')
156 cprint(' (PP) == N-1 ? H :')
157 cprint(' &X[((PP)-2)*3]')
160 for ai in range(0, len(abcd)):
161 cprintraw('#define %s POINT(P%+d)' % (abcd[ai], ai))
162 gen_point_coords_macro(abcd[ai])
164 def gen_calculate_FG():
165 cprint('#define CALCULAGE_F_G')
166 cassign(E,'E','tmp_E')
167 cassign(E,'F','tmp_F')
169 def gen_calculate_cost():
170 cprint('#define CALCULATE_COST')
171 cassign(cost_ABCD,'P_cost','tmp_P_cost')
174 def gen_f_populate():
175 cprint('#define F_POPULATE')
176 cassign(cost_ABCD,'F','ftmp')
179 def gen_j_populate():
180 cprint('#define J_POPULATE')
181 gen_diff(result_dirnscaled, (sh*sh*la, th*th*la))
186 gen_point_references()
191 # https://github.com/sympy/sympy/issues/13642
192 # "lambdify sinc gives wrong answer!"
194 sinc_fixed = Function('sinc_fixed')
195 implemented_function(sinc_fixed, lambda x: np.sinc(x/np.pi))
196 out = out.subs(sinc,sinc_fixed)
197 p = list(map(eval,params))
198 return lambdify(p, out)