Пример #1
0
void getCellTable(const fvMesh & mesh)
{
    cellTableMap_.clear();
    cellTableId_.setSize(mesh.nCells(), 1);

    IOdictionary cellTableDict
    (
    IOobject
    (
        "cellTable",
        "constant",
        mesh,
        IOobject::READ_IF_PRESENT,
        IOobject::NO_WRITE,
        false
    )
    );

    volScalarField volField
    (
    IOobject
    (
        "cellTableId",
        mesh.time().timeName(),
        mesh,
        IOobject::READ_IF_PRESENT,
        IOobject::NO_WRITE,
        false
    ),
    mesh,
    dimensionedScalar("cellTableId", dimless, 1.0)
    );

    // get cellTableId information from the volScalarField if possible
    if (volField.headerOk())
    {
    const scalarField & field = volField.internalField();

    forAll(field, cellI)
    {
        cellTableId_[cellI] = static_cast<int>(field[cellI]);
    }

    if (cellTableDict.headerOk())
    {
        // convert dictionary to map
        wordList toc = cellTableDict.toc();

        forAll(toc, i)
        {
        word keyword = toc[i];
        if (!cellTableDict.isDict(keyword)) continue;

        const dictionary & dict = cellTableDict.subDict(keyword);

        if (dict.found("Id") && dict.found("MaterialType"))
        {
            label Id;
            dict["Id"] >> Id;
            dict["MaterialType"] >> keyword;

            if (keyword == "fluid")
            {
            cellTableMap_.insert(Id, 1);
            }
            else if (keyword == "solid")
            {
            cellTableMap_.insert(Id, 2);
            }
        }
        }
int main(int argc, char *argv[])
{
	bool allow_userdefined_fields = false;
	
	argList::noParallel();
	
	argList::validOptions.insert("rho", "value");
	argList::validOptions.insert("allowuserdefinedfields", "");
#if defined EXPORT_CYCLIC_BOUNDARIES	
	argList::validOptions.insert("exportcyclics", "");
#endif	
        //	argList::validOptions.insert("help", "");
#if 0	
	const word fieldTypes[] =
	{
		volScalarField::typeName,
		volVectorField::typeName
	};
#endif

#   include "addTimeOptions.H"
#   include "setRootCase.H"

	if(args.options().found("help"))
	{
		args.printUsage();
		exit(0);
	}
#if defined EXPORT_CYCLIC_BOUNDARIES	
	bool exportcyclics = false;
	if(args.options().found("exportcyclics"))
	{
		exportcyclics=true;
	}
#endif

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

	// Dictionnary for foamToCGNS options
#if 0	
	IOdictionary optionsDict
	(
		IOobject( "foamToCGNSDict", 
			  mesh.time().constant(), 
			  mesh,
			  IOobject::READ_IF_PRESENT, 
			  IOobject::NO_WRITE )
	);
	if ( optionsDict.headerOk() )
	{
		if ( optionsDict.found("SplitMixedCellTypes") )
			Info << "Options: Splitting multiple cell into different zones" << endl;
		if ( optionsDict.found("WriteConvergenceHistory") )
			Info << "Options: Writing convergence history found in 'log' file" << endl;
		if ( optionsDict.found("ConversionPath") )
		{
			const entry& e = optionsDict.lookupEntry( "ConversionPath" );
			Info << "Options: Conversion Path is " << e << endl;
		}
	}
#else
	foamToCGNSDictionary optionsDict
	(
		IOobject( "foamToCGNSDict", 
			  mesh.time().constant(), 
			  mesh,
			  IOobject::READ_IF_PRESENT, 
			  IOobject::NO_WRITE )
	);
	if ( optionsDict.headerOk() )
	{
		Info << "foamToCGNSOptions: " << endl;
		Info << "\tSplitting multiple cell into different zones : " << optionsDict.splitMixed() << endl;
		Info << "\tWriting convergence history found in 'log' file : " << optionsDict.writeConvergenceHistory() << endl;
		Info << "\tConversion Path is " << optionsDict.conversionDirectory() << endl;
		Info << "\tAllow User Defined Fields is " << optionsDict.allowUserDefinedFields() << endl;
	}
#endif
	
	if (args.options().found("allowuserdefinedfields") || optionsDict.allowUserDefinedFields() )
	{
		allow_userdefined_fields = true;
		Info << "User defined fields are allowed" << endl;
	}
	
	// Construct interpolation on the raw mesh
	volPointInterpolation pInterp(mesh);
	
	fileName cgnsDataPath(runTime.path()/"ConversionCGNS");
	mkDir(cgnsDataPath);
	
	// Get times list
	instantList Times = runTime.times();
	
	// set startTime and endTime depending on -time and -latestTime options
#   include "checkTimeOptions.H"

	// Get a value for the density 'rho' for purpose pour la mise a l'echelle du champs de pression
	//
	// First default value: 1.0
	//
	// Then, we check if rho is specified in the dictionary turboMathDict; if it is, we override the default value
	//
	// Finally, we allow the user to override the value of rho if the option -rho is provided on the commande line
	// or if the dictionnary is not present for this specific case.

	scalar rho_ = 1.0;  // Default value;
	Info << "Default value for rho: " << rho_ << endl;

#if 0	
	// Next we check for the dictionnary turboMathDict
	IOdictionary turboMathDict(
		IOobject
		(
			"turboMathDict",
			mesh.time().constant(),
			mesh, 
			IOobject::READ_IF_PRESENT,
			IOobject::NO_WRITE
		)
	);

	if(turboMathDict.headerOk())
	{
		dimensionedScalar dimensionedRho(turboMathDict.lookup("rho"));

		// Read the density value from the turboDictionnary
		rho_ = dimensionedRho.value();

		Info << "\nDictionary turboMathDict: new rho value : " << rho_ << endl;
	}
	else
	{
		Info << "Warning : no Dictionary turboMathDict" << endl;
	}
#endif
	// Finally, we allow this ultimate override from the command line
	if(args.options().found("rho"))
	{
		rho_ = readScalar(IStringStream(args.options()["rho"])());
		Info << "\nUser specified value for rho: new rho value : " << rho_ << endl;
	}
	Info << endl;
	
	// What kind of simulation is this?
	bool steadyState = false;

#if defined CGNSTOFOAM_EXTRACT_FlowEquationSet
	word application( runTime.controlDict().lookup( "application" ) );
	if ( application=="simpleFoam" )
	{
		Info << "Solution computed with simpleFoam" << endl;
		word default_ddtScheme = mesh.ddtScheme("default");
		Info << "\tddtScheme = " << default_ddtScheme << endl;
		steadyState = ( default_ddtScheme == "steadyState" );
		
		// what is the turbulence model ?

#include "incompressible/simpleFoam/createFields.H"
	}
	else if ( application=="icoFoam" )
	{
		Info << "Solution computed with icoFoam" << endl;
	}
	else
	{
		Info << "Warning : unknown application : " << application << endl;
		Info << "Warning : will not include FlowEquationSet in the CGNS file" << endl;
	}
#endif //CGNSTOFOAM_EXTRACT_FlowEquationSet

	
#if 1
	std::string logfilename = args.caseName() + "/log";
	std::ifstream ifslog( logfilename.c_str() );
	if ( !ifslog )
	{
		Info << "Warning : log file not found. No convergence history will be included." << endl;	
	}
	else
	{
		logFile logf( ifslog );
		int nsteps = logf.getNSteps();
		Info << nsteps << " Steps found in convergence history" << endl;
	}
#endif
	
#if 1
	for (label i=startTime; i<endTime; i++)
	{
		runTime.setTime(Times[i], i);
	
		mesh.readUpdate();
	
		IOobjectList objects(mesh, runTime.timeName());
	
		Info << "----> Timestep: " << Times[i].name() << endl;
	
#include "writeCGNS.H"    // write a CGNS file for this time step
	
		Info << endl;
	}

#endif

	Info << "Done" << endl;
	
	return 0;
}