// Hack to do zones which have Lists in them. See above. bool writeZones(const word& name, const fileName& meshDir, Time& runTime) { IOobject io ( name, runTime.timeName(), meshDir, runTime, IOobject::MUST_READ, IOobject::NO_WRITE, false ); bool writeOk = false; if (io.headerOk()) { Info<< " Reading " << io.headerClassName() << " : " << name << endl; // Switch off type checking (for reading e.g. faceZones as // generic list of dictionaries). const word oldTypeName = IOPtrList<entry>::typeName; const_cast<word&>(IOPtrList<entry>::typeName) = word::null; IOPtrList<entry> meshObject(io); forAll(meshObject, i) { if (meshObject[i].isDict()) { dictionary& d = meshObject[i].dict(); if (d.found("faceLabels")) { d.set("faceLabels", labelList(d.lookup("faceLabels"))); } if (d.found("flipMap")) { d.set("flipMap", boolList(d.lookup("flipMap"))); } if (d.found("cellLabels")) { d.set("cellLabels", labelList(d.lookup("cellLabels"))); } if (d.found("pointLabels")) { d.set("pointLabels", labelList(d.lookup("pointLabels"))); } } } const_cast<word&>(IOPtrList<entry>::typeName) = oldTypeName; // Fake type back to what was in field const_cast<word&>(meshObject.type()) = io.headerClassName(); Info<< " Writing " << name << endl; // Force writing as ascii writeOk = meshObject.regIOobject::writeObject ( IOstream::ASCII, IOstream::currentVersion, runTime.writeCompression() ); }
void Foam::calc(const argList& args, const Time& runTime, const fvMesh& mesh) { bool writeResults = !args.optionFound("noWrite"); IOobject phiHeader ( "phi", runTime.timeName(), mesh, IOobject::MUST_READ ); if (phiHeader.headerOk()) { autoPtr<surfaceScalarField> PePtr; Info<< " Reading phi" << endl; surfaceScalarField phi(phiHeader, mesh); volVectorField U ( IOobject ( "U", runTime.timeName(), mesh, IOobject::MUST_READ ), mesh ); IOobject RASPropertiesHeader ( "RASProperties", runTime.constant(), mesh, IOobject::MUST_READ_IF_MODIFIED, IOobject::NO_WRITE ); IOobject LESPropertiesHeader ( "LESProperties", runTime.constant(), mesh, IOobject::MUST_READ_IF_MODIFIED, IOobject::NO_WRITE ); Info<< " Calculating Pe" << endl; if (phi.dimensions() == dimensionSet(0, 3, -1, 0, 0)) { if (RASPropertiesHeader.headerOk()) { IOdictionary RASProperties(RASPropertiesHeader); singlePhaseTransportModel laminarTransport(U, phi); autoPtr<incompressible::RASModel> RASModel ( incompressible::RASModel::New ( U, phi, laminarTransport ) ); PePtr.set ( new surfaceScalarField ( IOobject ( "Pe", runTime.timeName(), mesh, IOobject::NO_READ ), mag(phi) /( mesh.magSf() * mesh.surfaceInterpolation::deltaCoeffs() * fvc::interpolate(RASModel->nuEff()) ) ) ); } else if (LESPropertiesHeader.headerOk()) { IOdictionary LESProperties(LESPropertiesHeader); singlePhaseTransportModel laminarTransport(U, phi); autoPtr<incompressible::LESModel> sgsModel ( incompressible::LESModel::New(U, phi, laminarTransport) ); PePtr.set ( new surfaceScalarField ( IOobject ( "Pe", runTime.timeName(), mesh, IOobject::NO_READ ), mag(phi) /( mesh.magSf() * mesh.surfaceInterpolation::deltaCoeffs() * fvc::interpolate(sgsModel->nuEff()) ) ) ); } else { IOdictionary transportProperties ( IOobject ( "transportProperties", runTime.constant(), mesh, IOobject::MUST_READ_IF_MODIFIED, IOobject::NO_WRITE ) ); dimensionedScalar nu(transportProperties.lookup("nu")); PePtr.set ( new surfaceScalarField ( IOobject ( "Pe", runTime.timeName(), mesh, IOobject::NO_READ ), mesh.surfaceInterpolation::deltaCoeffs() * (mag(phi)/mesh.magSf())*(runTime.deltaT()/nu) ) ); } } else if (phi.dimensions() == dimensionSet(1, 0, -1, 0, 0)) { if (RASPropertiesHeader.headerOk()) { IOdictionary RASProperties(RASPropertiesHeader); autoPtr<fluidThermo> thermo(fluidThermo::New(mesh)); volScalarField rho ( IOobject ( "rho", runTime.timeName(), mesh ), thermo->rho() ); autoPtr<compressible::RASModel> RASModel ( compressible::RASModel::New ( rho, U, phi, thermo() ) ); PePtr.set ( new surfaceScalarField ( IOobject ( "Pe", runTime.timeName(), mesh, IOobject::NO_READ ), mag(phi) /( mesh.magSf() * mesh.surfaceInterpolation::deltaCoeffs() * fvc::interpolate(RASModel->muEff()) ) ) ); } else if (LESPropertiesHeader.headerOk()) { IOdictionary LESProperties(LESPropertiesHeader); autoPtr<fluidThermo> thermo(fluidThermo::New(mesh)); volScalarField rho ( IOobject ( "rho", runTime.timeName(), mesh ), thermo->rho() ); autoPtr<compressible::LESModel> sgsModel ( compressible::LESModel::New(rho, U, phi, thermo()) ); PePtr.set ( new surfaceScalarField ( IOobject ( "Pe", runTime.timeName(), mesh, IOobject::NO_READ ), mag(phi) /( mesh.magSf() * mesh.surfaceInterpolation::deltaCoeffs() * fvc::interpolate(sgsModel->muEff()) ) ) ); } else { IOdictionary transportProperties ( IOobject ( "transportProperties", runTime.constant(), mesh, IOobject::MUST_READ_IF_MODIFIED, IOobject::NO_WRITE ) ); dimensionedScalar mu(transportProperties.lookup("mu")); PePtr.set ( new surfaceScalarField ( IOobject ( "Pe", runTime.timeName(), mesh, IOobject::NO_READ ), mesh.surfaceInterpolation::deltaCoeffs() * (mag(phi)/(mesh.magSf()))*(runTime.deltaT()/mu) ) ); } } else { FatalErrorIn(args.executable()) << "Incorrect dimensions of phi: " << phi.dimensions() << abort(FatalError); } // can also check how many cells exceed a particular Pe limit /* { label count = 0; label PeLimit = 200; forAll(PePtr(), i) { if (PePtr()[i] > PeLimit) { count++; } } Info<< "Fraction > " << PeLimit << " = " << scalar(count)/Pe.size() << endl; } */ Info<< "Pe max : " << max(PePtr()).value() << endl; if (writeResults) { PePtr().write(); } } else { Info<< " No phi" << endl; } Info<< "\nEnd\n" << endl; }
void Foam::calc(const argList& args, const Time& runTime, const fvMesh& mesh) { bool writeResults = !args.optionFound("noWrite"); IOobject phiHeader ( "phi", runTime.timeName(), mesh, IOobject::MUST_READ ); if (phiHeader.headerOk()) { volScalarField Co ( IOobject ( "Co", runTime.timeName(), mesh, IOobject::NO_READ ), mesh, dimensionedScalar("0", dimless, 0), zeroGradientFvPatchScalarField::typeName ); Info<< " Reading phi" << endl; surfaceScalarField phi(phiHeader, mesh); if (phi.dimensions() == dimensionSet(1, 0, -1, 0, 0)) { Info<< " Calculating compressible Co" << endl; Info<< " Reading rho" << endl; volScalarField rho ( IOobject ( "rho", runTime.timeName(), mesh, IOobject::MUST_READ ), mesh ); Co.dimensionedInternalField() = (0.5*runTime.deltaT()) *fvc::surfaceSum(mag(phi))().dimensionedInternalField() /(rho*mesh.V()); Co.correctBoundaryConditions(); } else if (phi.dimensions() == dimensionSet(0, 3, -1, 0, 0)) { Info<< " Calculating incompressible Co" << endl; Co.dimensionedInternalField() = (0.5*runTime.deltaT()) *fvc::surfaceSum(mag(phi))().dimensionedInternalField() /mesh.V(); Co.correctBoundaryConditions(); } else { FatalErrorIn(args.executable()) << "Incorrect dimensions of phi: " << phi.dimensions() << abort(FatalError); } Info<< "Co max : " << max(Co).value() << endl; if (writeResults) { Co.write(); } } else { Info<< " No phi" << endl; } Info<< "\nEnd\n" << endl; }
void Foam::calc(const argList& args, const Time& runTime, const fvMesh& mesh) { bool writeResults = !args.optionFound("noWrite"); IOobject Uheader ( "U", runTime.timeName(), mesh, IOobject::MUST_READ ); IOobject Theader ( "T", runTime.timeName(), mesh, IOobject::MUST_READ ); // Check U and T exists if (Uheader.headerOk() && Theader.headerOk()) { autoPtr<volScalarField> MachPtr; volVectorField U(Uheader, mesh); if (isFile(runTime.constantPath()/"thermophysicalProperties")) { // thermophysical Mach autoPtr<basicPsiThermo> thermo ( basicPsiThermo::New(mesh) ); volScalarField Cp = thermo->Cp(); volScalarField Cv = thermo->Cv(); MachPtr.set ( new volScalarField ( IOobject ( "Ma", runTime.timeName(), mesh ), mag(U)/(sqrt((Cp/Cv)*(Cp - Cv)*thermo->T())) ) ); } else { // thermodynamic Mach IOdictionary thermoProps ( IOobject ( "thermodynamicProperties", runTime.constant(), mesh, IOobject::MUST_READ, IOobject::NO_WRITE ) ); dimensionedScalar R(thermoProps.lookup("R")); dimensionedScalar Cv(thermoProps.lookup("Cv")); volScalarField T(Theader, mesh); MachPtr.set ( new volScalarField ( IOobject ( "Ma", runTime.timeName(), mesh ), mag(U)/(sqrt(((Cv + R)/Cv)*R*T)) ) ); } Info<< "Mach max : " << max(MachPtr()).value() << endl; if (writeResults) { MachPtr().write(); } } else { Info<< " Missing U or T" << endl; } }
Foam::DelaunayMesh<Triangulation>::DelaunayMesh ( const Time& runTime, const word& meshName ) : Triangulation(), vertexCount_(0), cellCount_(0), runTime_(runTime) { Info<< "Reading " << meshName << " from " << runTime.timeName() << endl; pointIOField pts ( IOobject ( "points", runTime.timeName(), meshName/polyMesh::meshSubDir, runTime, IOobject::READ_IF_PRESENT, IOobject::NO_WRITE ) ); if (pts.headerOk()) { labelIOField types ( IOobject ( "types", runTime.timeName(), meshName, runTime, IOobject::MUST_READ, IOobject::NO_WRITE ) ); // Do not read in indices // labelIOField indices // ( // IOobject // ( // "indices", // runTime.timeName(), // meshName, // runTime, // IOobject::MUST_READ, // IOobject::NO_WRITE // ) // ); labelIOField processorIndices ( IOobject ( "processorIndices", runTime.timeName(), meshName, runTime, IOobject::MUST_READ, IOobject::NO_WRITE ) ); List<Vb> pointsToInsert(pts.size()); forAll(pointsToInsert, pI) { pointsToInsert[pI] = Vb ( toPoint(pts[pI]), pI, static_cast<indexedVertexEnum::vertexType>(types[pI]), processorIndices[pI] ); }
void executeFunctionObjects ( const argList& args, const Time& runTime, fvMesh& mesh, const HashSet<word>& selectedFields, functionObjectList& functions ) { Info<< nl << "Reading fields:" << endl; // Maintain a stack of the stored objects to clear after executing // the functionObjects LIFOStack<regIOobject*> storedObjects; // Read objects in time directory IOobjectList objects(mesh, runTime.timeName()); // Read volFields ReadFields(volScalarField); ReadFields(volVectorField); ReadFields(volSphericalTensorField); ReadFields(volSymmTensorField); ReadFields(volTensorField); // Read internal fields ReadFields(volScalarField::Internal); ReadFields(volVectorField::Internal); ReadFields(volSphericalTensorField::Internal); ReadFields(volSymmTensorField::Internal); ReadFields(volTensorField::Internal); // Read surface fields ReadFields(surfaceScalarField); ReadFields(surfaceVectorField); ReadFields(surfaceSphericalTensorField); ReadFields(surfaceSymmTensorField); ReadFields(surfaceTensorField); // Read point fields. const pointMesh& pMesh = pointMesh::New(mesh); ReadPointFields(pointScalarField) ReadPointFields(pointVectorField); ReadPointFields(pointSphericalTensorField); ReadPointFields(pointSymmTensorField); ReadPointFields(pointTensorField); // Read uniform dimensioned fields IOobjectList constantObjects(mesh, runTime.constant()); ReadUniformFields(uniformDimensionedScalarField); ReadUniformFields(uniformDimensionedVectorField); ReadUniformFields(uniformDimensionedSphericalTensorField); ReadUniformFields(uniformDimensionedSymmTensorField); ReadUniformFields(uniformDimensionedTensorField); Info<< nl << "Executing functionObjects" << endl; // Execute the functionObjects in post-processing mode functions.execute(); while (!storedObjects.empty()) { storedObjects.pop()->checkOut(); } }
/* * Here remind you that you are in the namespace Foam by * * Foam::calc(... ... ...) * * Evidence : in calc.H function calc is { } by namespace Foam */ void Foam::calc(const argList& args, const Time& runTime, const fvMesh& mesh) { IOobject Uheader ( "U", runTime.timeName(), mesh, IOobject::MUST_READ ); if (Uheader.headerOk()) { Info<< " Reading U" << endl; volVectorField U(Uheader, mesh); volScalarField KE ( IOobject ( "KE", runTime.timeName(), mesh, IOobject::NO_READ, IOobject::NO_WRITE ), 0.5 * U & U ); Info<< " Writing -Kinetic Energy : KE " << endl; //KE.write(); Info<< " Summing up : gSum(KE) = "<< gSum(KE) << endl; Info<< " Summing up : Sum(KE) = "<< sum(KE) << endl; scalar waKE = KE.weightedAverage(mesh.V()).value(); Info<< " Summing up : weighted average of KE = " << waKE << nl /* << "WeightedAverage : here the weight is cellVolume/TotalVolume" << nl << "Note that this is verified by paraview - Filter - intergate " << nl << "which is a volumic integration. Divide the paraview calculation " << nl << "by volume, you will get the same as here" << endl; */ << endl; const scalar totalVol = gSum(mesh.V()); Info<< " totalVol = "<< totalVol << endl; fileName writePathRoot("./"); mkDir(writePathRoot/"fieldStatistics"); //OFstream KineticEnergy(fileName(writePathRoot/"fieldStatistics"/"KineticEnergy"),ios_base::app); // ios_base::app not found ofstream KineticEnergy(fileName(writePathRoot/"fieldStatistics"/"KineticEnergy").c_str(), ios_base::app); if (Pstream::master()) { //std::cout << runTime.timeName().c_str() << " " << waKE << "\n" << std::endl; KineticEnergy << runTime.timeName().c_str() << " " << waKE << std::endl; // This is the right and safest way to do //KineticEnergy << runTime.timeName().c_str() << " " << waKE << endl; // same as Foam::endl : no error in compilation but "endl" will not work as expected. //KineticEnergy << runTime.timeName().c_str() << " " << waKE << Foam::endl; } } else { Info<< " No U" << endl; } Info<< "Using appending mode in writting data, be sure that the old data is erased !" << endl; Info<< "\nEnd\n" << endl; }
void Foam::MeshedSurfaceProxy<Face>::write ( const Time& t, const word& surfName ) const { // the surface name to be used word name(surfName.size() ? surfName : surfaceRegistry::defaultName); if (debug) { Info<< "MeshedSurfaceProxy::write" "(const Time&, const word&) : " "writing to " << name << endl; } // the local location const fileName objectDir ( t.timePath()/surfaceRegistry::prefix/name/surfMesh::meshSubDir ); if (!isDir(objectDir)) { mkDir(objectDir); } // write surfMesh/points { pointIOField io ( IOobject ( "points", t.timeName(), surfMesh::meshSubDir, t, IOobject::NO_READ, IOobject::NO_WRITE, false ) ); OFstream os ( objectDir/io.name(), ios_base::out|ios_base::trunc, t.writeFormat(), IOstream::currentVersion, t.writeCompression() ); io.writeHeader(os); os << this->points(); io.writeEndDivider(os); } // write surfMesh/faces { faceIOList io ( IOobject ( "faces", t.timeName(), surfMesh::meshSubDir, t, IOobject::NO_READ, IOobject::NO_WRITE, false ) ); OFstream os ( objectDir/io.name(), ios_base::out|ios_base::trunc, t.writeFormat(), IOstream::currentVersion, t.writeCompression() ); io.writeHeader(os); if (this->useFaceMap()) { // this is really a bit annoying (and wasteful) but no other way os << reorder(this->faceMap(), this->faces()); } else { os << this->faces(); } io.writeEndDivider(os); } // write surfMesh/surfZones { surfZoneIOList io ( IOobject ( "surfZones", t.timeName(), surfMesh::meshSubDir, t, IOobject::NO_READ, IOobject::NO_WRITE, false ) ); // write as ascii OFstream os(objectDir/io.name()); io.writeHeader(os); os << this->surfZones(); io.writeEndDivider(os); } }