OpenFOAM开发教程系列:第1讲_输入与输出

OFtutorial1_input_output

教程1:输入与输出

代码:

#include "createTime.H"
#include "createMesh.H"

作用:

创建时间系统(实例化为runTime)和fvMesh(实例化为mesh)

代码:

dictionary customDict;
const word dictName("customProperties");

作用:

提供custom dictionary的接口

代码:

IOobject dictIO
(
    dictName, // name of the file
    mesh.time().constant(), // path to where the file is
    mesh, // reference to the mesh needed by the constructor
    IOobject::MUST_READ // indicate that reading this dictionary is compulsory
);

作用:

创建输入输出对象,指定了文件夹的路径和名称

dicName:文件的名称

mesh.time().constant():文件的路径

mesh:需要与网格对应

IOobject::MUST_READ:必须读取

代码:

if (!dictIO.typeHeaderOk<dictionary>(true))
    FatalErrorIn(args.executable()) << "Cannot open specified refinement dictionary "
        << dictName << exit(FatalError);

作用:

检查文件夹是否存在,并且符合openfoam的要求

代码:

customDict = IOdictionary(dictIO);

作用:

初始化dictionary对象

代码:

word someWord;
customDict.lookup("someWord") >> someWord;

作用:

从dictionary中读取各种各样的信息,lookup不需要指定读取的数据类型。可以通过标准化的C++ 的stringstream语法读取

代码:

scalar someScalar( customDict.lookupOrDefault<scalar>("someScalar", 1.0) );

作用:

这种模板化的方法不需要事先指定要读取的数据类型,并且在对象未在dictionary中找到的时候可以提供一个初始值。

代码:

bool someBool ( customDict.lookupOrDefault<Switch>("someBool",true) );

作用:

switch可以让一个bool型变量从dict中读取值,自动支持yes/on/true/1 和 no/off/false/0等值。

代码:

List<scalar> someList ( customDict.lookup("someList") );

作用:

list类型的数据也可以用同样的方法读取

代码:

HashTable<vector,word> someHashTable ( customDict.lookup("someHashTable") );

作用:

这个类型的容器很有意思,它可以把一组数与一个key联系起来(这里key用的字符,但是可以用任何类型的数据)。当通过列表管理不方便的时候很有用。

代码:

Info << nl << "Read the following:" << nl << nl
     << "someWord " << someWord << nl << nl
     << "someScalar " << someScalar << nl << nl
     << "someList " << someList << nl << nl
     << "someHashTable " << someHashTable << nl << nl
     << "someBool " << someBool << nl << nl
     << endl;

作用:

输出信息

代码:

fileName outputDir = mesh.time().path()/"postProcessing";
mkDir(outputDir);

作用:

指定输出文件的文件路径

创建文件夹

代码:

autoPtr<OFstream> outputFilePtr;
outputFilePtr.reset(new OFstream(outputDir/"customOutputFile.dat"));
outputFilePtr() << "# This is a header" << endl;
outputFilePtr() << "0 1 2 3 4 5" << endl;

作用:

创建文件指针,并打开新创建的文件。向文件中写入内容

代码:

someHashTable.insert("newKey", vector(1., 0., 0.));
outputFilePtr() << someHashTable << endl;

作用:

向hash table中附加内容,并写入文件中

customProperties文件的内容:

/*--------------------------------*- C++ -*----------------------------------*\
| =========                 |                                                 |
| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
|  \\    /   O peration     | Version:  3.0.1                                 |
|   \\  /    A nd           | Web:      www.OpenFOAM.org                      |
|    \\/     M anipulation  |                                                 |
\*---------------------------------------------------------------------------*/
FoamFile
{
    version     2.0;
    format      ascii;
    class       dictionary;
    location    "constant";
    object      transportProperties;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //

someWord myWord;

someScalar 0.01;

someBool on;

someList
(
    0
    1
    2
);

someHashTable
(
    key0 (0 0 0)
    key1 (1 0 0)
);



// ************************************************************************* //


总体代码:

/*---------------------------------------------------------------------------*\
  =========                 |
  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
   \\    /   O peration     |
    \\  /    A nd           | Copyright (C) 2011-2015 OpenFOAM Foundation
     \\/     M anipulation  |
-------------------------------------------------------------------------------
License
    This file is part of OpenFOAM.

    OpenFOAM is free software: you can redistribute it and/or modify it
    under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    for more details.

    You should have received a copy of the GNU General Public License
    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.

\*---------------------------------------------------------------------------*/

#include "fvCFD.H"

int main(int argc, char *argv[])
{
    // Initialise OF case
    #include "setRootCase.H"

    // These two create the time system (instance called runTime) and fvMesh (instance called mesh).
    #include "createTime.H"
    #include "createMesh.H"

    // ---
    // Get access to a custom dictionary
    dictionary customDict;
    const word dictName("customProperties");

    // Create and input-output object - this holds the path to the dict and its name
    IOobject dictIO
    (
        dictName, // name of the file
        mesh.time().constant(), // path to where the file is
        mesh, // reference to the mesh needed by the constructor
        IOobject::MUST_READ // indicate that reading this dictionary is compulsory
    );

    // Check the if the dictionary is present and follows the OF format
    if (!dictIO.typeHeaderOk<dictionary>(true))
        FatalErrorIn(args.executable()) << "Cannot open specified refinement dictionary "
            << dictName << exit(FatalError);

    // Initialise the dictionary object
    customDict = IOdictionary(dictIO);

    // ---
    // Read various pieces of information from the main part of the dictionary

    // Lookup which does not need to be told what type of variable we're looking for and
    // uses the standard C++ stringstream syntax
    word someWord;
    customDict.lookup("someWord") >> someWord;

    // This template method needs to know the type of the variable and can provide
    // a default value if the entry is not found in the dictionary
    scalar someScalar( customDict.lookupOrDefault<scalar>("someScalar", 1.0) );

    // A switch is a neat feature allowing boolean values to be read from a dict,
    // it supports the OpenFOAM yes/on/true/1 and no/off/false/0 values automatically.
    bool someBool ( customDict.lookupOrDefault<Switch>("someBool",true) );

    // Lists of values may also be read in the same way
    List<scalar> someList ( customDict.lookup("someList") );

    // This type of container is particularly interesting - it associates entries with
    // given key values (here of word type but can be anything); useful when
    // associating things by indices in a list is less handy
    HashTable<vector,word> someHashTable ( customDict.lookup("someHashTable") );

    // Summarise what's been read and print in the console
    Info << nl << "Read the following:" << nl << nl
         << "someWord " << someWord << nl << nl
         << "someScalar " << someScalar << nl << nl
         << "someList " << someList << nl << nl
         << "someHashTable " << someHashTable << nl << nl
         << "someBool " << someBool << nl << nl
         << endl;

    // ---
    // Create a custom directory and write an output file

    // Create the output path directory
    fileName outputDir = mesh.time().path()/"postProcessing";
    // Creathe the directory
    mkDir(outputDir);

    // File pointer to direct the output to
    autoPtr<OFstream> outputFilePtr;
    // Open the file in the newly created directory
    outputFilePtr.reset(new OFstream(outputDir/"customOutputFile.dat"));

    // Write stuff
    outputFilePtr() << "# This is a header" << endl;
    outputFilePtr() << "0 1 2 3 4 5" << endl;

    // Append to the imported hash table and wirte it too
    someHashTable.insert("newKey", vector(1., 0., 0.));
    outputFilePtr() << someHashTable << endl;

    Info<< "End\n" << endl;
    return 0;
}


// ************************************************************************* //




10 个赞