+def gen_point_coords_macro(macro_basename):
+ ijk = 'i j k'.split(' ')
+ for ii in range(0, len(ijk)):
+ cprintraw('#define %s_%s (%s[%d])'
+ % (macro_basename, ijk[ii], macro_basename, ii))
+
+def gen_point_index_macro(macro_basename, c_array_name, base_index):
+ cprintraw('#define %s (&%s[%s])'
+ % (macro_basename, c_array_name, base_index))
+ gen_point_coords_macro(macro_basename)
+
+def gen_point_references():
+ abcd = 'A B C D'.split(' ')
+
+ gen_point_index_macro('E', 'INPUT', '3*0')
+ gen_point_index_macro('F0', 'INPUT', '3*1')
+ gen_point_index_macro('G0', 'INPUT', '3*(NP-2)')
+ gen_point_index_macro('H', 'INPUT', '3*(NP-1)')
+ cprintraw( '#define NINPUT ( 3*(NP-0) )')
+
+ gen_point_index_macro('En', 'PREP', '3*0')
+ gen_point_index_macro('Hn', 'PREP', '3*1')
+ cprintraw( '#define NPREP (3*2)')
+
+ cprintraw('#define NX_DIRECT 3*(NP-4)')
+ cprint('#define POINT(PP) (')
+ cprint(' (PP) == 0 ? E :')
+ cprint(' (PP) == 1 ? F :')
+ cprint(' (PP) == NP-2 ? G :')
+ cprint(' (PP) == NP-1 ? H :')
+ cprint(' &X[3*((PP)-2)]')
+ cprintraw(')')
+
+ cprintraw('#define EFlq X[ NX_DIRECT + 0 ]')
+ cprintraw('#define HGlq X[ NX_DIRECT + 1 ]')
+ cprintraw('#define NX ( NX_DIRECT + 2 )')
+
+ for ai in range(0, len(abcd)):
+ cprintraw('#define %s POINT(P%+d)' % (abcd[ai], ai))
+ gen_point_coords_macro(abcd[ai])
+
+ for si in iterations:
+ si.gen_references()
+
+ cprintraw('')
+
+def gen_prepare():
+ cprint('#define PREPARE')
+ cprint('memcpy(X, &INPUT[3*2], sizeof(double) * NX_DIRECT);')
+ for EH,EHs,FG0,FGs in ((E,'E', F0,'F'),
+ (H,'H', G0,'G')):
+ EFHGv = FG0 - EH
+ EFHGl = EFHGv.magnitude()
+ EFHGlq = sqrt(EFHGl)
+ cassign_vector(EFHGv/EFHGl, EHs+'n', 'tmp_'+EHs)
+ cassign(EFHGlq, EHs+FGs+'lq', 'tmp_l'+EHs)
+ cprintraw('')