You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 18:34:51