From c70cc9b40d00230161bea7bb1c2435dc0039da77 Mon Sep 17 00:00:00 2001 From: Matthieu Schaller <schaller@strw.leidenuniv.nl> Date: Tue, 21 Apr 2020 23:09:24 +0200 Subject: [PATCH] Upgraded the multipole generation python script to python 3 --- .../generate_multipoles/multipoles.py | 514 ++++++++++-------- 1 file changed, 277 insertions(+), 237 deletions(-) diff --git a/theory/Multipoles/generate_multipoles/multipoles.py b/theory/Multipoles/generate_multipoles/multipoles.py index 0eca7e25c0..40834ac859 100644 --- a/theory/Multipoles/generate_multipoles/multipoles.py +++ b/theory/Multipoles/generate_multipoles/multipoles.py @@ -1,424 +1,464 @@ import numpy as np import sys + def factorial(x): if x == 0: return 1 else: - return x * factorial(x-1) + return x * factorial(x - 1) + + +SUFFIXES = {1: "st", 2: "nd", 3: "rd"} + -SUFFIXES = {1: 'st', 2: 'nd', 3: 'rd'} def ordinal(num): - suffix = SUFFIXES.get(num % 10, 'th') + suffix = SUFFIXES.get(num % 10, "th") return str(num) + suffix + # Get the order order = int(sys.argv[1]) -print "-------------------------------------------------" -print "Generating code for multipoles of order", order, "(only)." -print "-------------------------------------------------\n" +print("-------------------------------------------------") +print("Generating code for multipoles of order", order, "(only).") +print("-------------------------------------------------\n") -print "-------------------------------------------------" -print "Multipole structure:" -print "-------------------------------------------------\n" +print("-------------------------------------------------") +print("Multipole structure:") +print("-------------------------------------------------\n") if order > 0: - print "#if SELF_GRAVITY_MULTIPOLE_ORDER > %d\n"%(order-1) + print("#if SELF_GRAVITY_MULTIPOLE_ORDER > %d\n" % (order - 1)) + +print("/* %s order terms */" % ordinal(order)) -print "/* %s order terms */"%ordinal(order) - # Create all the terms relevent for this order -for i in range(order+1): - for j in range(order+1): - for k in range(order+1): +for i in range(order + 1): + for j in range(order + 1): + for k in range(order + 1): if i + j + k == order: - print "float M_%d%d%d;"%(i,j,k) + print("float M_%d%d%d;" % (i, j, k)) if order > 0: - print "#endif" + print("#endif") -print "" -print "-------------------------------------------------" +print("") +print("-------------------------------------------------") -print "Field tensor structure:" -print "-------------------------------------------------\n" +print("Field tensor structure:") +print("-------------------------------------------------\n") if order > 0: - print "#if SELF_GRAVITY_MULTIPOLE_ORDER > %d\n"%(order-1) + print("#if SELF_GRAVITY_MULTIPOLE_ORDER > %d\n" % (order - 1)) + +print("/* %s order terms */" % ordinal(order)) -print "/* %s order terms */"%ordinal(order) - # Create all the terms relevent for this order -for i in range(order+1): - for j in range(order+1): - for k in range(order+1): +for i in range(order + 1): + for j in range(order + 1): + for k in range(order + 1): if i + j + k == order: - print "float F_%d%d%d;"%(i,j,k) + print("float F_%d%d%d;" % (i, j, k)) if order > 0: - print "#endif" + print("#endif") -print "" -print "-------------------------------------------------" +print("") +print("-------------------------------------------------") -print "gravity_field_tensors_add():" -print "-------------------------------------------------\n" +print("gravity_field_tensors_add():") +print("-------------------------------------------------\n") if order > 0: - print "#if SELF_GRAVITY_MULTIPOLE_ORDER > %d"%(order-1) + print("#if SELF_GRAVITY_MULTIPOLE_ORDER > %d" % (order - 1)) + +print("/* %s order terms */" % ordinal(order)) -print "/* %s order terms */"%ordinal(order) - # Create all the terms relevent for this order -for i in range(order+1): - for j in range(order+1): - for k in range(order+1): +for i in range(order + 1): + for j in range(order + 1): + for k in range(order + 1): if i + j + k == order: - print "la->F_%d%d%d += lb->F_%d%d%d;"%(i,j,k,i,j,k) + print("la->F_%d%d%d += lb->F_%d%d%d;" % (i, j, k, i, j, k)) if order > 0: - print "#endif" + print("#endif") -print "" -print "-------------------------------------------------" +print("") +print("-------------------------------------------------") -print "gravity_multipole_add():" -print "-------------------------------------------------\n" +print("gravity_multipole_add():") +print("-------------------------------------------------\n") if order > 0: - print "#if SELF_GRAVITY_MULTIPOLE_ORDER > %d"%(order-1) + print("#if SELF_GRAVITY_MULTIPOLE_ORDER > %d" % (order - 1)) + +print("/* %s order terms */" % ordinal(order)) -print "/* %s order terms */"%ordinal(order) - # Create all the terms relevent for this order -for i in range(order+1): - for j in range(order+1): - for k in range(order+1): +for i in range(order + 1): + for j in range(order + 1): + for k in range(order + 1): if i + j + k == order: - print "ma->M_%d%d%d += mb->M_%d%d%d;"%(i,j,k,i,j,k) - + print("ma->M_%d%d%d += mb->M_%d%d%d;" % (i, j, k, i, j, k)) + if order > 0: - print "#endif" + print("#endif") -print "" -print "-------------------------------------------------" +print("") +print("-------------------------------------------------") -print "gravity_multipole_equal():" -print "-------------------------------------------------\n" +print("gravity_multipole_equal():") +print("-------------------------------------------------\n") if order > 0: - print "#if SELF_GRAVITY_MULTIPOLE_ORDER > %d"%(order-1) + print("#if SELF_GRAVITY_MULTIPOLE_ORDER > %d" % (order - 1)) # Create all the terms relevent for this order -print "/* Manhattan Norm of %s order terms */"%ordinal(order) -print "const float order%d_norm = "%order, +print("/* Manhattan Norm of %s order terms */" % ordinal(order)) +print("const float order%d_norm = " % order, end=" ") first = True -for i in range(order+1): - for j in range(order+1): - for k in range(order+1): +for i in range(order + 1): + for j in range(order + 1): + for k in range(order + 1): if i + j + k == order: if first: first = False else: - print "+", - print "fabsf(ma->M_%d%d%d)"%(i,j,k), - print "+ fabsf(mb->M_%d%d%d)"%(i,j,k), -print ";\n" -print "/* Compare %s order terms above 1%% of norm */"%ordinal(order) -for i in range(order+1): - for j in range(order+1): - for k in range(order+1): + print("+", end=" ") + print("fabsf(ma->M_%d%d%d)" % (i, j, k), end=" ") + print("+ fabsf(mb->M_%d%d%d)" % (i, j, k), end=" ") +print(";\n") +print("/* Compare %s order terms above 1%% of norm */" % ordinal(order)) +for i in range(order + 1): + for j in range(order + 1): + for k in range(order + 1): if i + j + k == order: - print "if (fabsf(ma->M_%d%d%d + mb->M_%d%d%d) > 0.01f * order%d_norm &&"%(i,j,k,i,j,k,order) - print " fabsf(ma->M_%d%d%d - mb->M_%d%d%d) / fabsf(ma->M_%d%d%d + mb->M_%d%d%d) > tolerance) {"%(i,j,k,i,j,k,i,j,k,i,j,k) - print " message(\"M_%d%d%d term different\");"%(i,j,k) - print " return 0;" - print "}" + print( + "if (fabsf(ma->M_%d%d%d + mb->M_%d%d%d) > 0.01f * order%d_norm &&" + % (i, j, k, i, j, k, order) + ) + print( + " fabsf(ma->M_%d%d%d - mb->M_%d%d%d) / fabsf(ma->M_%d%d%d + mb->M_%d%d%d) > tolerance) {" + % (i, j, k, i, j, k, i, j, k, i, j, k) + ) + print(' message("M_%d%d%d term different");' % (i, j, k)) + print(" return 0;") + print("}") if order > 0: - print "#endif" + print("#endif") -print "" -print "-------------------------------------------------" +print("") +print("-------------------------------------------------") -print "gravity_multipole_compute_power():" -print "-------------------------------------------------\n" +print("gravity_multipole_compute_power():") +print("-------------------------------------------------\n") if order > 0: - print "#if SELF_GRAVITY_MULTIPOLE_ORDER > %d"%(order-1) + print("#if SELF_GRAVITY_MULTIPOLE_ORDER > %d" % (order - 1)) -print "/* %s order terms */"%ordinal(order) +print("/* %s order terms */" % ordinal(order)) # Add the terms to the multipole power -for i in range(order+1): - for j in range(order+1): - for k in range(order+1): +for i in range(order + 1): + for j in range(order + 1): + for k in range(order + 1): if i + j + k == order: fact1 = factorial(i) * factorial(j) * factorial(k) fact2 = float(factorial(i + j + k)) frac = fact1 / fact2 if frac == 1.0: - print "power[%d] += m->M_%d%d%d * m->M_%d%d%d;"%(order, i, j, k, i, j, k) + print( + "power[%d] += m->M_%d%d%d * m->M_%d%d%d;" + % (order, i, j, k, i, j, k) + ) else: - print "power[%d] += %12.15e * m->M_%d%d%d * m->M_%d%d%d;"%(order, frac, i, j, k, i, j, k) + print( + "power[%d] += %12.15e * m->M_%d%d%d * m->M_%d%d%d;" + % (order, frac, i, j, k, i, j, k) + ) + +print("") +print("m->power[%d] = sqrt(power[%d]);" % (order, order)) -print "" -print "m->power[%d] = sqrt(power[%d]);"%(order, order) - if order > 0: - print "#endif" - -print "" -print "-------------------------------------------------" + print("#endif") + +print("") +print("-------------------------------------------------") -print "gravity_P2M(): (loop)" -print "-------------------------------------------------\n" +print("gravity_P2M(): (loop)") +print("-------------------------------------------------\n") if order > 0: - print "#if SELF_GRAVITY_MULTIPOLE_ORDER > %d"%(order-1) + print("#if SELF_GRAVITY_MULTIPOLE_ORDER > %d" % (order - 1)) + +print("/* %s order terms */" % ordinal(order)) -print "/* %s order terms */"%ordinal(order) - # Create all the terms relevent for this order -for i in range(order+1): - for j in range(order+1): - for k in range(order+1): +for i in range(order + 1): + for j in range(order + 1): + for k in range(order + 1): if i + j + k == order: if order % 2 == 0: - print "M_%d%d%d += m * X_%d%d%d(dx);"%(i,j,k,i,j,k) + print("M_%d%d%d += m * X_%d%d%d(dx);" % (i, j, k, i, j, k)) else: - print "M_%d%d%d += -m * X_%d%d%d(dx);"%(i,j,k,i,j,k) - + print("M_%d%d%d += -m * X_%d%d%d(dx);" % (i, j, k, i, j, k)) + if order > 0: - print "#endif" + print("#endif") -print "" -print "-------------------------------------------------" +print("") +print("-------------------------------------------------") -print "gravity_P2M(): (storing)" -print "-------------------------------------------------\n" +print("gravity_P2M(): (storing)") +print("-------------------------------------------------\n") if order > 0: - print "#if SELF_GRAVITY_MULTIPOLE_ORDER > %d"%(order-1) + print("#if SELF_GRAVITY_MULTIPOLE_ORDER > %d" % (order - 1)) + +print("/* %s order terms */" % ordinal(order)) -print "/* %s order terms */"%ordinal(order) - # Create all the terms relevent for this order -for i in range(order+1): - for j in range(order+1): - for k in range(order+1): +for i in range(order + 1): + for j in range(order + 1): + for k in range(order + 1): if i + j + k == order: - print "m->m_pole.M_%d%d%d = M_%d%d%d;"%(i,j,k,i,j,k) - + print("m->m_pole.M_%d%d%d = M_%d%d%d;" % (i, j, k, i, j, k)) + if order > 0: - print "#endif" + print("#endif") -print "" -print "-------------------------------------------------" +print("") +print("-------------------------------------------------") -print "gravity_M2M():" -print "-------------------------------------------------\n" +print("gravity_M2M():") +print("-------------------------------------------------\n") if order > 0: - print "#if SELF_GRAVITY_MULTIPOLE_ORDER > %d"%(order-1) + print("#if SELF_GRAVITY_MULTIPOLE_ORDER > %d" % (order - 1)) + +print("/* Shift %s order terms */" % ordinal(order)) -print "/* Shift %s order terms */"%ordinal(order) - # Create all the terms relevent for this order -for i in range(order+1): - for j in range(order+1): - for k in range(order+1): +for i in range(order + 1): + for j in range(order + 1): + for k in range(order + 1): if i + j + k == order: - print "m_a->M_%d%d%d = m_b->M_%d%d%d"%(i,j,k,i,j,k), - - for ii in range(order+1): - for jj in range(order+1): - for kk in range(order+1): - - if not(ii == 0 and jj == 0 and kk == 0): - for iii in range(order+1): - for jjj in range(order+1): - for kkk in range(order+1): - if ii+iii == i and jj+jjj == j and kk+kkk == k: - print "+ X_%d%d%d(dx) * m_b->M_%d%d%d"%(ii, jj, kk, iii, jjj, kkk), - - - print ";" - + print("m_a->M_%d%d%d = m_b->M_%d%d%d" % (i, j, k, i, j, k), end=" ") + + for ii in range(order + 1): + for jj in range(order + 1): + for kk in range(order + 1): + + if not (ii == 0 and jj == 0 and kk == 0): + for iii in range(order + 1): + for jjj in range(order + 1): + for kkk in range(order + 1): + if ( + ii + iii == i + and jj + jjj == j + and kk + kkk == k + ): + print( + "+ X_%d%d%d(dx) * m_b->M_%d%d%d" + % (ii, jj, kk, iii, jjj, kkk), + end=" ", + ) + + print(";") + if order > 0: - print "#endif" + print("#endif") + - -print "" -print "-------------------------------------------------" +print("") +print("-------------------------------------------------") -print "gravity_M2L():" -print "-------------------------------------------------\n" +print("gravity_M2L():") +print("-------------------------------------------------\n") if order > 0: - print "#if SELF_GRAVITY_MULTIPOLE_ORDER > %d\n"%(order-1) + print("#if SELF_GRAVITY_MULTIPOLE_ORDER > %d\n" % (order - 1)) # Loop over LHS order for l in range(order + 1): - print "/* Compute %s order field tensor terms (addition to rank %d) */"%(ordinal(order), l) - - for i in range(l+1): - for j in range(l+1): - for k in range(l+1): + print( + "/* Compute %s order field tensor terms (addition to rank %d) */" + % (ordinal(order), l) + ) + + for i in range(l + 1): + for j in range(l + 1): + for k in range(l + 1): if i + j + k == l: - print "l_b->F_%d%d%d +="%(i,j,k), + print("l_b->F_%d%d%d +=" % (i, j, k), end=" ") first = True - for ii in range(order+1): - for jj in range(order+1): - for kk in range(order+1): - if ii + jj + kk == order - l: + for ii in range(order + 1): + for jj in range(order + 1): + for kk in range(order + 1): + if ii + jj + kk == order - l: if first: first = False else: - print "+", - print "m_a->M_%d%d%d * D_%d%d%d(dx, dy, dz, r_inv)"%(ii,jj,kk,i+ii,j+jj,k+kk), - print ";" - print "" - + print("+", end=" ") + print( + "m_a->M_%d%d%d * D_%d%d%d(dx, dy, dz, r_inv)" + % (ii, jj, kk, i + ii, j + jj, k + kk), + end=" ", + ) + print(";") + print("") + if order > 0: - print "#endif" + print("#endif") -print "" -print "-------------------------------------------------" +print("") +print("-------------------------------------------------") -print "gravity_L2L():" -print "-------------------------------------------------\n" +print("gravity_L2L():") +print("-------------------------------------------------\n") if order > 0: - print "#if SELF_GRAVITY_MULTIPOLE_ORDER > %d\n"%(order-1) + print("#if SELF_GRAVITY_MULTIPOLE_ORDER > %d\n" % (order - 1)) # Loop over LHS order for l in range(order + 1): - print "/* Shift %s order field tensor terms (addition to rank %d) */"%(ordinal(order), l) - - for i in range(l+1): - for j in range(l+1): - for k in range(l+1): + print( + "/* Shift %s order field tensor terms (addition to rank %d) */" + % (ordinal(order), l) + ) + + for i in range(l + 1): + for j in range(l + 1): + for k in range(l + 1): if i + j + k == l: - print "la->F_%d%d%d +="%(i,j,k), + print("la->F_%d%d%d +=" % (i, j, k), end=" ") first = True - for ii in range(order+1): - for jj in range(order+1): - for kk in range(order+1): - if ii + jj + kk == order - l: + for ii in range(order + 1): + for jj in range(order + 1): + for kk in range(order + 1): + if ii + jj + kk == order - l: if first: first = False else: - print "+", - print "X_%d%d%d(dx) * lb->F_%d%d%d"%(ii,jj,kk,i+ii,j+jj,k+kk), - print ";" - print "" - + print("+", end=" ") + print( + "X_%d%d%d(dx) * lb->F_%d%d%d" + % (ii, jj, kk, i + ii, j + jj, k + kk), + end=" ", + ) + print(";") + print("") + if order > 0: - print "#endif" + print("#endif") -print "" -print "-------------------------------------------------" +print("") +print("-------------------------------------------------") -print "gravity_L2P():" -print "-------------------------------------------------\n" +print("gravity_L2P():") +print("-------------------------------------------------\n") if order > 0: - print "#if SELF_GRAVITY_MULTIPOLE_ORDER > %d\n"%(order-1) + print("#if SELF_GRAVITY_MULTIPOLE_ORDER > %d\n" % (order - 1)) - print "/* %s order contributions */"%(ordinal(order-1)) + print("/* %s order contributions */" % (ordinal(order - 1))) for r in range(3): - print "gp->a_grav[%d] +="%(r), + print("gp->a_grav[%d] +=" % (r), end=" ") first = True for i in range(order + 1): for j in range(order + 1): for k in range(order + 1): - if i + j + k == order-1: + if i + j + k == order - 1: if first: first = False else: - print "+", + print("+", end=" ") if r == 0: - ii = i+1 + ii = i + 1 jj = j kk = k if r == 1: ii = i - jj = j+1 + jj = j + 1 kk = k if r == 2: ii = i jj = j - kk = k+1 - print "X_%d%d%d(dx) * lb->F_%d%d%d"%(i,j,k,ii,jj,kk), - print ";" - - print "" + kk = k + 1 + print( + "X_%d%d%d(dx) * lb->F_%d%d%d" % (i, j, k, ii, jj, kk), + end=" ", + ) + print(";") + + print("") if order > 0: - print "#endif" + print("#endif") -print "" -print "-------------------------------------------------" +print("") +print("-------------------------------------------------") -print "gravity_M2P():" -print "-------------------------------------------------\n" +print("gravity_M2P():") +print("-------------------------------------------------\n") if order > 0: - print "#if SELF_GRAVITY_MULTIPOLE_ORDER > %d\n"%(order-1) - -print "/* %s order contributions */"%(ordinal(order)) + print("#if SELF_GRAVITY_MULTIPOLE_ORDER > %d\n" % (order - 1)) + +print("/* %s order contributions */" % (ordinal(order))) + - for r in range(4): if r == 0: - print "*f_x =", + print("*f_x =", end=" ") if r == 1: - print "*f_y =", + print("*f_y =", end=" ") if r == 2: - print "*f_z =", + print("*f_z =", end=" ") if r == 3: - print "*pot =", - + print("*pot =", end=" ") + first = True - for i in range(order+1): - for j in range(order+1): - for k in range(order+1): + for i in range(order + 1): + for j in range(order + 1): + for k in range(order + 1): if i + j + k == order: if first: first = False else: - print "+", + print("+", end=" ") if r == 0: - ii = i+1 + ii = i + 1 jj = j kk = k if r == 1: ii = i - jj = j+1 + jj = j + 1 kk = k if r == 2: ii = i jj = j - kk = k+1 + kk = k + 1 if r == 3: ii = i jj = j kk = k - print "m->M_%d%d%d * d.D_%d%d%d"%(i,j,k,ii,jj,kk), - - print ";" - -print "" + print("m->M_%d%d%d * d.D_%d%d%d" % (i, j, k, ii, jj, kk), end=" ") -if order > 0: - print "#endif" + print(";") + +print("") -print "" -print "-------------------------------------------------" +if order > 0: + print("#endif") +print("") +print("-------------------------------------------------") -- GitLab