C# 理解fortran人工智能的困难

C# 理解fortran人工智能的困难,c#,fortran,porting,fortran77,C#,Fortran,Porting,Fortran77,我一直试图理解以下子程序,但似乎无法正确理解: subroutine press(ptes,Re,densm,void,svel,vis,dhyd,ht,p) a=1.30 p=a*Re**(-1.63)*svel**2*ht/dhyd/void/densm/1000. p=p*ptes return end 我遵循了前面提到的算术优先级信息,但似乎无法获得下面所示的等效C函数来输出类似的输出 public static void calculatePressureDrop( floa

我一直试图理解以下子程序,但似乎无法正确理解:

subroutine press(ptes,Re,densm,void,svel,vis,dhyd,ht,p)
a=1.30
p=a*Re**(-1.63)*svel**2*ht/dhyd/void/densm/1000.
p=p*ptes
return
end
我遵循了前面提到的算术优先级信息,但似乎无法获得下面所示的等效C函数来输出类似的输出

public static void calculatePressureDrop(
    float pressure_drop_coeff, 
    float re, 
    float density_massecuite, 
    float voidage, 
    float superficial_mass_velocity, 
    float viscosity, 
    float hydraulic_diameter, 
    float height_of_section, 
    ref float pressure_drop)
{
    float sel_exp_val = (float)(2 * height_of_section / hydraulic_diameter / voidage / density_massecuite / 1000.0);
    float sel_exp = (float)Math.Pow(superficial_mass_velocity, sel_exp_val);
    float sel_exp_prod = -1.63F * sel_exp;
    float re_exp = (float)Math.Pow(re, sel_exp_prod);
    pressure_drop = (float)1.30 * re_exp;
    pressure_drop = pressure_drop * pressure_drop_coeff;
}
更新:这是我的测试用例中不断失败的代码

    [TestMethod]
    public void TestPressureDropMethodV2() // Uses call by ref
    {
        float pressure_drop_coeff = 1.20000005F;
        float re = 0.000365345448F;
        float density_massecuite = 1460;
        float voidage = 0.757799625F;
        float superficial_mass_velocity = 1.53357923F;
        float hydraulic_diameter = 0.151121646F;
        float viscosity = 634.350342F;
        float height_of_section = 0.0850000009F;
        float pressure_drop = 0;
        Finless5Lib.calculatePressureDrop(pressure_drop_coeff, re, density_massecuite, voidage, superficial_mass_velocity, viscosity, hydraulic_diameter, height_of_section,ref pressure_drop);
        float expectedResult = 0.74733448F;
        //// Verify the result:
        Assert.AreEqual(expectedResult, pressure_drop);
    }
当我从Fortran打印出这些值时,我得到的是:

ptes=1.2000005 Re=0.000379003613 密度=1460。 空隙率=0.757799625 svel=1.53357923 vis=611.490234 dhyd=0.151121646 ht=0.0850000009 p=0.703936338


请帮忙!任何建议都会有帮助

我不太懂FORTRAN,但如果**的优先级高于*,那么:

p=a*Re**-1.63*svel**2*ht/dhyd/void/densm/1000

您的C似乎在做一些更像:


p=a*Re**-1.63*svel**2*ht/dhyd/void/densm/1000

我很确定你想要这个

public static float calculatePressureDrop(
    float pressure_drop_coeff,
    float re,
    float density_massecuite,
    float voidage,
    float superficial_mass_velocity,
    float viscosity,
    float hydraulic_diameter,
    float height_of_section)
{
    return pressure_drop_coeff * 1.3F * (float)Math.Pow(re, -1.63)
           * (float)Math.Pow(superficial_mass_velocity , 2) * height_of_section 
           / hydraulic_diameter / voidage / density_massecuite / 1000F;
}
然后你可以像这样使用它

float pressure_drop = calculatePressureDrop(...);

你的问题是你没有给予电力运营商最高的谨慎。通常,如果可以,最好避免使用ref参数。

与此表达式相关的运算符ISO/IEC 1539-1:2010又名Fortran 2008第7.1.3条的优先级为**、*或/、一元+或-、二进制+或-

Fortran表达式

p=a*Re**(-1.63)*svel**2*ht/dhyd/void/densm/1000.
p = a * (Re**(-1.63)) * (svel**2) * ht / dhyd / void / densm / 1000.0
它等价于数学表达式

p=a*Re**(-1.63)*svel**2*ht/dhyd/void/densm/1000.
p = a * (Re**(-1.63)) * (svel**2) * ht / dhyd / void / densm / 1000.0
结合收益率之前的其他报表a=1.30和收益率之后的报表p=p*ptes:

p = 1.30 * (Re**(-1.63)) * (svel**2) * ht / dhyd / void / densm / 1000.0 * ptes

乘法和除法从左到右求值。

您从每一位代码中得到的结果是什么?这种差异是否可能是由于舍入误差造成的,特别是在除法上?与其将压降作为参考值传递,不如直接返回它?你不应该有数学知识吗?Powre,-1.63?既然**的优先级最高?我不是fortran方面的专家,但我很确定操作符的优先级已经正确实现。我读到一个波威尔,1.63波斯维尔,2*ht/dhyd*void*densm*1000。这段代码证明了寻找最短表达式并不总是一个好主意。@AdamMiller不这么认为,因为fortran的输出是0.725221753,c的输出是53234.12Hi juharr,我早些时候尝试过优先顺序,但它不起作用。我也尝试了你给出的解决方案,但没有成功@rkc88我认为您必须给出使用示例输入和输出,以帮助确定问题所在。@rkc88刚刚意识到我有1.63而不是-1.63。现在试试看。@rkc88刚刚用输入值测试过,在我把那个负号放进去后,它似乎起作用了。它起作用了!!!!尽管我的测试用例失败了,因为函数返回值=0.7039364&expectedResult为0.703936338