Foam::autoPtr<Foam::laminarModel<BasicTurbulenceModel>>
Foam::laminarModel<BasicTurbulenceModel>::New
(
    const alphaField& alpha,
    const rhoField& rho,
    const volVectorField& U,
    const surfaceScalarField& alphaRhoPhi,
    const surfaceScalarField& phi,
    const transportModel& transport,
    const word& propertiesName
)
{
    IOdictionary modelDict
    (
        IOobject
        (
            IOobject::groupName(propertiesName, U.group()),
            U.time().constant(),
            U.db(),
            IOobject::MUST_READ_IF_MODIFIED,
            IOobject::NO_WRITE,
            false
        )
    );

    if (modelDict.found("laminar"))
    {
        // get model name, but do not register the dictionary
        // otherwise it is registered in the database twice
        const word modelType
        (
            modelDict.subDict("laminar").lookup("laminarModel")
        );

        Info<< "Selecting laminar stress model " << modelType << endl;

        typename dictionaryConstructorTable::iterator cstrIter =
            dictionaryConstructorTablePtr_->find(modelType);

        if (cstrIter == dictionaryConstructorTablePtr_->end())
        {
            FatalErrorInFunction
                << "Unknown laminarModel type "
                << modelType << nl << nl
                << "Valid laminarModel types:" << endl
                << dictionaryConstructorTablePtr_->sortedToc()
                << exit(FatalError);
        }

        return autoPtr<laminarModel>
        (
            cstrIter()
            (
                alpha,
                rho,
                U,
                alphaRhoPhi,
                phi,
                transport, propertiesName)
        );
    }
    else
    {
        Info<< "Selecting laminar stress model "
            << laminarModels::Stokes<BasicTurbulenceModel>::typeName << endl;

        return autoPtr<laminarModel>
        (
            new laminarModels::Stokes<BasicTurbulenceModel>
            (
                alpha,
                rho,
                U,
                alphaRhoPhi,
                phi,
                transport,
                propertiesName
            )
        );
    }
}
Exemple #2
0
int main(int argc, char *argv[])
{

#   include "setRootCase.H"

#   include "createTime.H"

    Info << "\nReading g" << endl;
    uniformDimensionedVectorField g
    (
        IOobject
        (
            "g",
            runTime.constant(),
            runTime,
            IOobject::MUST_READ,
            IOobject::NO_WRITE
        )
    );

    Info << "\nReading waveProperties\n" << endl;

    IOdictionary waveProperties
    (
        IOobject
        (
            "waveProperties.input",
            runTime.constant(),
            runTime,
            IOobject::MUST_READ,
            IOobject::NO_WRITE
        )
    );

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

    IOobject wOut
    (
            "waveProperties",
            runTime.constant(),
            runTime,
            IOobject::NO_READ,
            IOobject::NO_WRITE
    );

    // Write waveProperties with the above computed changes
    OFstream os
    (
        wOut.objectPath(),
#if EXTBRANCH==1
        ios_base::out|ios_base::trunc,
#elif OFPLUSBRANCH==1
        // Nothing to be put here
#else
    #if OFVERSION<170
        ios_base::out|ios_base::trunc,
    #endif
#endif
        IOstream::ASCII,
        IOstream::currentVersion,
        IOstream::UNCOMPRESSED
    );

    // Write the OF banner
    wOut.writeBanner( os );

    // Write the file information. Class name is not correct when
    // using wOut.writeHeader( os ); hence manual entries
    os << "FoamFile" << nl;
    os << token::BEGIN_BLOCK << incrIndent << nl;
    os << indent << "version" << tab << IOstream::currentVersion
       << token::END_STATEMENT << nl;
    os << indent << "format" << tab << "ascii;" << nl;
    os << indent << "class" << tab << "dictionary;" << nl;
    os << indent << "object" << tab << "waveProperties;" << nl;
    os << decrIndent << indent << token::END_BLOCK << nl;

    // Write the divider
    wOut.writeDivider( os );
    os << nl;

    /* Loop over all subdicts in waveProperties. For each of them compute the
       wave parameters relevant for that particular wave theory. */
    wordList toc = waveProperties.toc();

    forAll (toc, item)
    {
        // If a sub-dictionary, then compute parameters and write the subdict
        if (waveProperties.isDict(toc[item]))
        {
            dictionary& sd = waveProperties.subDict(toc[item]);

            autoPtr<setWaveProperties> props
                (
                    setWaveProperties::New(runTime, sd, true)
                );

            props->set( os );
        }
        else
        {
            label Nspaces = 20;

            // Read the entry and write to the dummy output file
            ITstream read = waveProperties.lookup(toc[item]);
            os << toc[item] << token::SPACE;

            for (int i=toc[item].size(); i<Nspaces-1; i++)
            {
                os << token::SPACE;
            }

            forAll (read, ri)
            {
                if (ri < read.size() - 1)
                {
                    os << read[ri] << token::SPACE;
                }
                else
                {
                    os << read[ri];
                }
            }

            os << token::END_STATEMENT << nl << endl;

            // Additional level of check, such that the code does not crash at
            // runTime:
            if (toc[item] == "seaLevel")
            {
            	// Read the magnitude of the sea level
            	scalar sL = readScalar(waveProperties.lookup("seaLevel"));

            	// If the Switch seaLevelAsReference is not found _and_ the
            	// magnitude of the sea level differs from 0 (zero), stop the
            	// evaluation of the wave parameters
            	if
            	(
            	    !waveProperties.found("seaLevelAsReference") &&
            	    SMALL < Foam::mag(sL)
            	)
            	{
            		// This merely looks up the string, it will not be found
            		// and the user is forced to correct waveProperties.input,
            		// before any execution is possible.
            		waveProperties.lookup("seaLevelAsReference");
            	}
            }
        }
    }

    // Write end divider
    wOut.writeEndDivider(os);

    // End
    Info<< "\nEnd\n" << endl;

    return 0;
}
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;
}
int main(int argc, char *argv[])
{
    argList::noParallel();
    argList::addBoolOption("rewrite");
    argList::addBoolOption("show");

    argList args(argc, argv);

    Time runTime(args.rootPath(), args.caseName());

    const word dictName("fvSolution");

    bool optRewrite = args.optionFound("rewrite");
    bool optShow = args.optionFound("show");

    IOdictionary solutionDict
    (
        IOobject
        (
            dictName,
            "system",
            runTime,
            IOobject::MUST_READ_IF_MODIFIED,
            IOobject::NO_WRITE,
            false
        )
    );

    if (!solutionDict.found("solvers"))
    {
        Info<<"no solvers entry found in : " << dictName << endl;
        return 2;
    }

    if (optRewrite && solutionDict.instance() != "system")
    {
        Info<<"instance is not 'system' "
            "- disabling rewrite for this file" << nl;
        optRewrite = false;
    }

    dictionary& solverDict = solutionDict.subDict("solvers");

    wordList names = solverDict.toc();
    wordList oldNames = names;

    bool changed = false;
    for (label orig = 0; orig < names.size()-1; ++orig)
    {
        // skip patterns or entries that have already been done
        if (names[orig].empty() || wordRe::isPattern(names[orig]))
        {
            continue;
        }

        const dictionary& dict1 = solverDict.subDict(names[orig]);

        for (label check = orig+1; check < names.size(); ++check)
        {
            // skip patterns or entries that have already been done
            if (names[check].empty() || wordRe::isPattern(names[check]))
            {
                continue;
            }

            const dictionary& dict2 = solverDict.subDict(names[check]);

            // check for identical content
            if (checkDictionaryContent(dict1, dict2))
            {
                names[orig] += "|" + names[check];
                names[check].clear();
                changed = true;
            }
        }
    }

    if (changed)
    {
        forAll(names, nameI)
        {
            if (names[nameI].empty())
            {
                solverDict.remove(oldNames[nameI]);
                Info<<"  #remove " << oldNames[nameI];
            }
            else
            {
                Info<< "  " << oldNames[nameI];

                if (names[nameI] != oldNames[nameI])
                {
                    // make "(abc|def)" pattern
                    keyType renamed( "(" + names[nameI] + ")", true);

                    solverDict.changeKeyword(oldNames[nameI], renamed);

                    Info<< " -> " << renamed;
                }
            }
            Info<< endl;
        }

        if (optRewrite)
        {
            mvBak(solutionDict.objectPath(), "orig");
            Info<< "Backup to .orig" << nl
                << "Writing " << solutionDict.objectPath() << nl << endl;

            solutionDict.regIOobject::write();
        }
        else if (optShow)
        {
            IOobject::writeDivider(Info);
            solutionDict.dictionary::write(Info, false);
        }
        else
        {
            Info<< "\nFile not rewritten" << endl;
        }
    }
    else
    {