/*---------------------------------------------------------------------------*\ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | www.openfoam.com \\/ M anipulation | ------------------------------------------------------------------------------- Copyright (C) 2011 OpenFOAM Foundation Copyright (C) 2020 OpenCFD Ltd. ------------------------------------------------------------------------------- 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 . \*---------------------------------------------------------------------------*/ #include "ignitionSite.H" #include "Time.H" #include "volFields.H" // * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // void Foam::ignitionSite::findIgnitionCells(const fvMesh& mesh) { // Bit tricky: generate C and V before shortcutting if cannot find // cell locally. mesh.C generation uses parallel communication. const volVectorField& centres = mesh.C(); const scalarField& vols = mesh.V(); label ignCell = mesh.findCell(location_); if (ignCell == -1) { return; } scalar radius = diameter_/2.0; cells_.setSize(1); cellVolumes_.setSize(1); cells_[0] = ignCell; cellVolumes_[0] = vols[ignCell]; scalar minDist = GREAT; label nIgnCells = 1; forAll(centres, celli) { scalar dist = mag(centres[celli] - location_); if (dist < minDist) { minDist = dist; } if (dist < radius && celli != ignCell) { cells_.setSize(nIgnCells+1); cellVolumes_.setSize(nIgnCells+1); cells_[nIgnCells] = celli; cellVolumes_[nIgnCells] = vols[celli]; nIgnCells++; } } if (cells_.size()) { Pout<< "Found ignition cells:" << endl << cells_ << endl; } } // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // const Foam::labelList& Foam::ignitionSite::cells() const { if (mesh_.changing() && timeIndex_ != db_.timeIndex()) { const_cast(*this).findIgnitionCells(mesh_); } timeIndex_ = db_.timeIndex(); return cells_; } bool Foam::ignitionSite::igniting() const { scalar curTime = db_.value(); scalar deltaT = db_.deltaTValue(); return ( (curTime - deltaT >= time_) && (curTime - deltaT < time_ + max(duration_, deltaT) + SMALL) ); } bool Foam::ignitionSite::ignited() const { scalar curTime = db_.value(); scalar deltaT = db_.deltaTValue(); return(curTime - deltaT >= time_); } // * * * * * * * * * * * * * * * Member Operators * * * * * * * * * * * * * // void Foam::ignitionSite::operator=(const ignitionSite& is) { if (this == &is) { return; } location_ = is.location_; diameter_ = is.diameter_; time_ = is.time_; duration_ = is.duration_; strength_ = is.strength_; cells_ = is.cells_; cellVolumes_ = is.cellVolumes_; } // ************************************************************************* //