OpenFOAM默认是使用SI单位制,但偶尔可能需要使用自己定义的单位,甚至进行无量纲设置。

无量纲计算设置

在controlDict中,debug Switch中的dimensionSet设置为0,就可以达到不检查单位的目的(未经测试),具体查找思路如下:

  • 参见OpenFOAM User Guide里面的描述(见3.6.2 Debug messaging and optimisation switches),可以通过dimensionSet来控制是否检查单位。
  • 查看代码,可以发现dimensionSet的debug switch确实是控制了检查单位的开关。('/OpenFOAM/dimensionSet/dimensionSet.C')
  • 在'$WM_PROJECT_DIR/etc/controlDict'文件中,dimesnsionSet也默认设置为1
  • 但是,需要注意的是,NS方程的无量纲形式与有量纲形式是有区别的,若需求解无量纲的NS方程,需要自己编写/修改求解器。

修改单位制

参见OpenFOAM UserGuide关于dimensional units一节,可以看到在controlDict其实挂载了一个subDict,位于'$WM_PROJECT_DIR/etc/controlDict',具体内容为:

DimensionSets
{
    unitSet             SI; // USCS

    SICoeffs
    {    
        // Basic units
        kg  kg  [1 0 0 0 0 0 0] 1.0; 
        m   m   [0 1 0 0 0 0 0] 1.0; 
        s   s   [0 0 1 0 0 0 0] 1.0; 
        K   K   [0 0 0 1 0 0 0] 1.0; 
        mol mol [0 0 0 0 1 0 0] 1.0; 
        A   A   [0 0 0 0 0 1 0] 1.0; 
        Cd  Cd  [0 0 0 0 0 0 1] 1.0; 

        // Derived units
        Hz  Hz  [s^-1] 1.0; 
        N   N   [kg m s^-2] 1.0; 
        Pa  Pa  [N m^-2] 1.0; 
        J   J   [N m] 1.0; 
        W   W   [J s^-1] 1.0; 

        // Some non-symbolic ones
        area area [m^2] 1.0; 
        volume volume [m^3] 1.0; 
        density density [kg m^-3] 1.0; 
        acceleration acceleration  [m s^-2] 1.0; 
        kinematicPressure kinematicPressure [Pa density^-1] 1.0; 

        // Scaled units. Only allowed in dimensionedType (dimensionedScalar,
        // dimensionedVector etc.) and UniformDimensionedField, not
        // in DimensionedField or GeometricField
        cm  cm  [m] 1e-2;
        mm  mm  [m] 1e-3;
        km  km  [m] 1e3;
        // Set of units used for printing. Can be any basic or derived
        // but not scaled (only supported for dimensionedScalar, etc)
        // writeUnits (kg m s K mol A Cd);
    }

    USCSCoeffs
    {
        // Basic units
        lb  lb  [1 0 0 0 0 0 0] 1.0;
        ft  ft  [0 1 0 0 0 0 0] 1.0;
        s   s   [0 0 1 0 0 0 0] 1.0;
        R   R   [0 0 0 1 0 0 0] 1.0;
        mol mol [0 0 0 0 1 0 0] 1.0;
        A   A   [0 0 0 0 0 1 0] 1.0;
        Cd  Cd  [0 0 0 0 0 0 1] 1.0;

        // Set of units used for printing. Can be any basic or derived
        // but not scaled (only supported for dimensionedScalar, etc)
        // writeUnits (lb ft s R mol A Cd);
    }
}

可以看到,里面对量纲进行了设置,因此可以自己在controlDict中定义一个新的DimensionSets字典覆盖默认的设置,从而达到修改默认单位。