/*---------------------------------------------------------------------------*\ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | www.openfoam.com \\/ M anipulation | ------------------------------------------------------------------------------- Copyright (C) 2017 OpenFOAM Foundation Copyright (C) 2019-2022 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 . Application Test-IOField Description Test the processor-local reading of IOField (used in the lagrangian libs) \*---------------------------------------------------------------------------*/ #include "argList.H" #include "IOField.H" #include "IOList.H" #include "primitiveFields.H" #include "polyMesh.H" #include "Time.H" using namespace Foam; // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // template void doWrite(const IOobject& io, const label sz) { IOField fld(io, sz); forAll(fld, i) { fld[i] = i + 1000.25 + (0.25 * i); } Pout<< "writing:" << fld << endl; fld.write(sz > 0); } template<> void doWrite(const IOobject& io, const label sz) { IOField fld(io, sz); forAll(fld, i) { fld[i] = i % 2; } Pout<< "writing:" << fld << endl; fld.write(sz > 0); } template void doRead(const IOobject& io, const label sz) { bool valid = (sz > 0); Pout<< " valid:" << valid << endl; IOField fld(io, valid); Pout<< " wanted:" << sz << " actually read:" << fld.size() << endl; if (fld.size() != sz) { FatalErrorInFunction<< "io:" << io.objectPath() << exit(FatalError); } } template void writeAndRead ( const IOobject& io, const label sz, const word& writeType, IOobjectOption::readOption rOpt, const word& readType ) { Pout<< "** Writing:" << writeType << " Reading:" << readType << endl; // The write handler fileHandler(fileOperation::New(writeType, true)); // Delete Pout<< "Deleting:" << fileHandler().filePath(io.objectPath()) << endl; fileHandler().rm(fileHandler().filePath(io.objectPath())); // Write Pout<< "Writing:" << fileHandler().objectPath(io, io.name()) << endl; doWrite(io, sz); // The read handler fileHandler(fileOperation::New(readType, true)); // Read IOobject readIO(io); readIO.readOpt(rOpt); Pout<< "Reading:" << fileHandler().filePath(readIO.objectPath()) << endl; doRead(readIO, sz); Pout<< "** Done writing:" << writeType << " Reading:" << readType << nl << nl << endl; } template void readIfPresent ( IOobject& io, const label sz, const word& readType ) { fileHandler(fileOperation::New(readType, true)); // Read Pout<< "Reading:" << fileHandler().filePath(io.objectPath()) << endl; io.readOpt(IOobject::READ_IF_PRESENT); doRead(io, sz); } template void doTests(IOobject& io, const label sz) { const wordList handlers ( Foam::fileOperation::wordConstructorTablePtr_->sortedToc() ); Info<< "Found handlers: " << flatOutput(handlers) << nl << "Running tests with " << pTraits::typeName << nl << nl; // for (const word& readHandler : handlers) // { // readIfPresent(io, sz, readHandler); // } for (const word& writeHandler : handlers) { for (const word& readHandler : handlers) { writeAndRead ( io, sz, writeHandler, IOobject::READ_IF_PRESENT, readHandler ); } } } // Main program int main(int argc, char *argv[]) { argList::noBanner(); argList::addBoolOption("bool", "Use bool for tests"); argList::addBoolOption("scalar", "Use scalar for tests"); argList::addBoolOption("label", "Use label for tests (default)"); argList::addBoolOption("ref", "Test writing by ref"); #include "addTimeOptions.H" #include "setRootCase.H" #include "createTime.H" #include "createPolyMesh.H" label sz = 0; if (Pstream::myProcNo() % 2) { sz = 1; } if (!Pstream::parRun()) { sz = 10; Info<< "Serial: using " << sz << nl; } IOobject io ( "bla", runTime.timeName(), mesh, IOobject::NO_READ, IOobject::NO_WRITE, IOobject::NO_REGISTER ); { dictionary headerDict; io.writeHeader(headerDict, "anything", IOstreamOption()); Info<< "IOobjectHeader" << headerDict << nl; } label tested = 0; if (args.found("bool")) { doTests(io, sz); ++tested; } if (args.found("scalar")) { doTests(io, sz); ++tested; } if (!tested || args.found("label")) { doTests