如何用SymPy Codegen生成含冗余参数的矩阵计算Fortran模块
解决SymPy codegen生成带冗余参数的Fortran模块问题
要生成支持传入冗余参数的Fortran模块,核心是让SymPy保留所有指定参数(即使未被矩阵表达式使用)——默认codegen会优化掉未引用的参数,可通过以下步骤实现:
关键思路
在未使用某参数的矩阵表达式中,添加0*参数的项(不影响计算结果),让SymPy将该参数识别为表达式的依赖项,从而在生成的子程序中保留它;同时通过argument_sequence指定统一的参数顺序,确保所有子程序的参数列表一致。
修正后的完整代码
import sympy as sy def test(): # 定义所有可能的符号变量 mu = sy.symbols('mu') phi = sy.symbols('phi') zeta = sy.symbols('zeta') # 用MatrixSymbol定义输出矩阵,让codegen正确识别为输出参数 out = sy.MatrixSymbol('out', 2, 2) # 定义矩阵A(eq1,使用mu、phi、zeta) A = sy.Matrix.zeros(2, 2) A[0,0] = 2*mu A[0,1] = 3*mu A[1,0] = 2*phi A[1,1] = 2*zeta # 定义矩阵B(eq2,仅使用mu、zeta,强制加入phi依赖) B = sy.Matrix.zeros(2, 2) B[0,0] = 0 B[0,1] = 6*mu B[1,0] = 0 B[1,1] = 5*zeta # 添加0*phi,让SymPy保留phi作为参数,不影响计算结果 B = B + 0*phi # 生成Fortran模块 sy.codegen( [('eq1', A), ('eq2', B)], language='f95', filename='test_routine_matrix', argument_sequence=(mu, phi, zeta, out), to_files=True, module=True, # 生成模块形式,方便嵌入现有代码 header=False ) test()
效果说明
生成的Fortran模块中,eq1和eq2子程序都会包含mu, phi, zeta, out四个参数:
eq1会正常使用所有参数计算矩阵eq2中phi参数会被保留,但实际计算时的0*phi会被编译器自动优化,不影响性能
你可以直接在现有Fortran代码中调用这些子程序,比如:
call eq2(mu_val, zeta_val, phi_val, out_mat)
即使phi_val未被eq2使用,也能正常传入且不报错。
内容的提问来源于stack exchange,提问作者arkhose u
相关产品推荐
相关产品推荐

