Foam::chemistryReductionMethod<CompType, ThermoType>::chemistryReductionMethod
(
    const Foam::IOdictionary& dict,
    Foam::TDACChemistryModel<CompType, ThermoType>& chemistry
)
:
    dict_(dict),
    coeffsDict_(dict.subDict("reduction")),
    active_(coeffsDict_.lookupOrDefault<Switch>("active", false)),
    log_(coeffsDict_.lookupOrDefault<Switch>("log", false)),
    chemistry_(chemistry),
    activeSpecies_(chemistry.nSpecie(), false),
    NsSimp_(chemistry.nSpecie()),
    nSpecie_(chemistry.nSpecie()),
    tolerance_(coeffsDict_.lookupOrDefault<scalar>("tolerance", 1e-4))
{}
예제 #2
0
// Analyse mesh topology and perform CFD-side CPL_init.
void CPLSocket::\
    initCFD (const Foam::Time &runTime, const Foam::fvMesh &mesh) {

    Foam::Info << "CPLSocket: Analysing processor and mesh topology"
               << Foam::endl;

    // Read from decomposePar dictionary the number of processors in each
    // direction. Must be decomposed with the "simple" method.
    Foam::IOdictionary decomposeDict
    (
        Foam::IOobject ("decomposeParDict", runTime.time().system(), runTime,
                        IOobject::MUST_READ, IOobject::NO_WRITE, false)
    );
    Foam::dictionary simpleCoeffs = decomposeDict.subDict ("simpleCoeffs");
    Foam::Vector<int> np = simpleCoeffs.lookup ("n");
    nprocs = np.x() * np.y() * np.z();

    // Define arrays needed by MPI & CPL cart create routines 
    npxyz[0] = np.x();
    npxyz[1] = np.y();
    npxyz[2] = np.z();
    periods[0] = 1;
    periods[1] = 0;
    periods[2] = 1;

    // Get info needed to calculate this processor's spatial coordinates
    Foam::pointField points = mesh.points();
    Foam::Vector<double> procMaxPoints (maxPoints (points));
    Foam::Vector<double> procMinPoints (minPoints (points));

    // Reduce all with min/max operator to find global min/max
    Foam::Vector<double> globMaxPoints (procMaxPoints);
    Foam::Vector<double> globMinPoints (procMinPoints);
    Foam::reduce (globMaxPoints, maxOp<Foam::Vector<double>>());
    Foam::reduce (globMinPoints, minOp<Foam::Vector<double>>());

    Foam::Vector<double> domainLength (globMaxPoints - globMinPoints);

//    std::cout << "domainlength " << domainLength.x() << " " << domainLength.y() << " " << domainLength.z() << std::endl;
//    std::cout << "proc_min" << procMinPoints.x() << " " << procMinPoints.y() << " " << procMinPoints.z() \
    << "glob_min" << globMinPoints.x() << " " << globMinPoints.y() << " " << globMinPoints.z() << std::endl;
예제 #3
0
Foam::DAC<CompType,ThermoType>::DAC
(
    const Foam::IOdictionary& dict,
    Foam::TDACChemistryModel<CompType, ThermoType>& chemistry
)
:
    mechanismReduction<CompType, ThermoType>(dict, chemistry),
    searchInitSet_(this->coeffsDict_.subDict("initialSet").size()),
    zprime_(0),
    nbCLarge_(3),
    sC_(this->nSpecie_,0),
    sH_(this->nSpecie_,0),
    sO_(this->nSpecie_,0),
    sN_(this->nSpecie_,0),
    CO2Id_(-1),
    COId_(-1),
    HO2Id_(-1),
    H2OId_(-1),
    NOId_(-1),
    automaticSIS_(true),
    phiTol_(this->tolerance()),
    NOxThreshold_(1800),
    CO2Name_
    (
        dict.subDict("mechanismReduction").lookupOrDefault<word>
        (
            "CO2Name","CO2"
        )
    ),
    COName_
    (
        dict.subDict("mechanismReduction").lookupOrDefault<word>
        (
            "COName","CO"
        )
    ),
    HO2Name_
    (
        dict.subDict("mechanismReduction").lookupOrDefault<word>
        (
            "HO2Name","HO2"
        )
    ),
    H2OName_
    (
        dict.subDict("mechanismReduction").lookupOrDefault<word>
        (
            "H2OName","H2O"
        )
    ),
    NOName_
    (
        dict.subDict("mechanismReduction").lookupOrDefault<word>
        (
            "NOName","NO"
        )
    ),
    forceFuelInclusion_(false)
{
    label j=0;
    dictionary initSet = this->coeffsDict_.subDict("initialSet");
    for (label i=0; i<chemistry.nSpecie(); i++)
    {
        if (initSet.found(chemistry.Y()[i].name()))
        {
            searchInitSet_[j++]=i;
        }
    }
    if (j<searchInitSet_.size())
    {
        FatalErrorIn("mechanismReduction")
        << searchInitSet_.size()-j
        << " species in the intial set is not in the mechanism "
        << initSet
        << abort(FatalError);
    }
    
    if (this->coeffsDict_.found("automaticSIS"))
    {
        automaticSIS_.readIfPresent("automaticSIS", this->coeffsDict_);
    }

    if (this->coeffsDict_.found("forceFuelInclusion"))
    {
        forceFuelInclusion_.readIfPresent
        (
            "forceFuelInclusion",this->coeffsDict_
        );
    }

    if (this->coeffsDict_.found("phiTol"))
    {
        phiTol_ = readScalar(this->coeffsDict_.lookup("phiTol"));
    }

    if (this->coeffsDict_.found("NOxThreshold"))
    {
        NOxThreshold_ = readScalar(this->coeffsDict_.lookup("NOxThreshold"));
    }
    const List<List<chemkinReader::specieElement> >& specieComposition =
        chemistry.specieComp();

    for (label i=0; i<this->nSpecie_; i++)
    {
        const List<chemkinReader::specieElement>& curSpecieComposition =
            specieComposition[i];
        //for all elements in the current species
        forAll(curSpecieComposition,j)
        {
            const chemkinReader::specieElement& curElement =
                curSpecieComposition[j];
            if (curElement.elementName == "C")
            {
                sC_[i] = curElement.nAtoms;
            }
            else if (curElement.elementName == "H")
            {
                sH_[i] = curElement.nAtoms;
            }
            else if (curElement.elementName == "O")
            {
                sO_[i] = curElement.nAtoms;
            }
            else if (curElement.elementName == "N")
            {
                sN_[i] = curElement.nAtoms;
            }
            else
            {
                Info<< "element not considered"<<endl;
            }
        }
        if (this->chemistry_.Y()[i].name() == CO2Name_)
        {
            CO2Id_ = i;
        }
        else if (this->chemistry_.Y()[i].name() == COName_)
        {
            COId_ = i;
        }
        else if (this->chemistry_.Y()[i].name() == HO2Name_)
        {
            HO2Id_ = i;
        }
        else if (this->chemistry_.Y()[i].name() == H2OName_)
        {
            H2OId_ = i;
        }
        else if (this->chemistry_.Y()[i].name() == NOName_)
        {
            NOId_ = i;
        }
    }

    if ((CO2Id_==-1 || COId_==-1 || HO2Id_==-1 || H2OId_==-1) && automaticSIS_)
    {
        FatalErrorIn("DAC.C::DAC")
            << "The name of the species used in automatic SIS are not found in "
            << " the mechanism. You should either set the name for CO2, CO, H2O"
            << " and HO2 properly or set automaticSIS to off "
            << abort(FatalError);
    }

    //To compute zprime, the fuel species should be specified.
    //According to the given mass fraction, an equivalent O/C ratio is computed
    if (automaticSIS_)
    {
        dictionary fuelDict;
        if (this->coeffsDict_.found("fuelSpecies"))
        {
            fuelDict = this->coeffsDict_.subDict("fuelSpecies");
            fuelSpecies_ = fuelDict.toc();
            if (fuelSpecies_.size() == 0)
            {
                FatalErrorIn("DAC.C::DAC")
                << "With automatic SIS, the fuel species should be "
                << "specified in the fuelSpecies subDict"
                << abort(FatalError);
            }
        }
        else
        {
            FatalErrorIn("DAC.C::DAC")
            << "With automatic SIS, the fuel species should be "
            << "specified in the fuelSpecies subDict"
            << abort(FatalError);
        }

        if (this->coeffsDict_.found("nbCLarge"))
        {
            nbCLarge_ = readLabel(fuelDict.lookup("nbCLarge"));
        }

        fuelSpeciesID_.setSize(fuelSpecies_.size());
        fuelSpeciesProp_.setSize(fuelSpecies_.size());
        scalar Mmtot(0.0);

        forAll(fuelSpecies_, i)
        {
            fuelSpeciesProp_[i] = readScalar(fuelDict.lookup(fuelSpecies_[i]));
            for (label j=0; j<this->nSpecie_; j++)
            {
                if (this->chemistry_.Y()[j].name() == fuelSpecies_[i])
                {
                    fuelSpeciesID_[i]=j;
                    break;
                }
            }
            scalar curMm =
                this->chemistry_.specieThermo()[fuelSpeciesID_[i]].W();
            Mmtot += fuelSpeciesProp_[i]/curMm;
        }

        Mmtot = 1.0/Mmtot;
        scalar nbC(0.0);
        scalar nbO(0.0);
        forAll(fuelSpecies_, i)
        {
            label curID = fuelSpeciesID_[i];
            scalar curMm = this->chemistry_.specieThermo()[curID].W();

            nbC += fuelSpeciesProp_[i]*Mmtot/curMm*sC_[curID];
            nbO += fuelSpeciesProp_[i]*Mmtot/curMm*sO_[curID];
        }