/*------------------------------- phasicFlow --------------------------------- O C enter of O O E ngineering and O O M ultiscale modeling of OOOOOOO F luid flow ------------------------------------------------------------------------------ Copyright (C): www.cemf.ir email: hamid.r.norouzi AT gmail.com ------------------------------------------------------------------------------ Licence: This file is part of phasicFlow code. It is a free software for simulating granular and multiphase flows. You can redistribute it and/or modify it under the terms of GNU General Public License v3 or any other later versions. phasicFlow is distributed to help others in their research in the field of granular and multiphase flows, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. -----------------------------------------------------------------------------*/ #ifndef __fieldsDataBase_hpp__ #define __fieldsDataBase_hpp__ #include "fieldsDataBaseDclr.hpp" #include "pointStructure.hpp" #include "pointFields.hpp" #include "anyList.hpp" #include "Map.hpp" #include "shape.hpp" namespace pFlow { class dictionary; class systemControl; class Time; } namespace pFlow::postprocessData { class fieldsDataBase { private: // - Typedefs /// Point position data type using PointsTypeHost = typename pointStructure::PointsTypeHost; /// Point field data type template using FieldTypeHost = typename internalField::FieldTypeHost; /// @brief Enumeration of functions that can be applied to point fields. enum class Functions { None, /// no function ComponentX, /// component(u,x) ComponentY, /// component(u,y) ComponentZ, /// component(u,z) ComponentW, /// component(u,w) Abs, /// abs(s) Square, /// square(s) Cube, /// cube(s) SqureRoot, /// sqrt(s) Magnitude, /// mag(u) MagnitudeSquare, /// magSquare(u) MagnitudeCube, /// magCube(u) MagnitudeSquareRoot /// magSqrt(u) }; // - Member variables /// List to store all the point fields anyList allFields_; /// Map to store the last capture time of each field wordMap captureTime_; /// Reference to the Time object Time& time_; /// Flag indicating if we're in simulation mode bool inSimulation_ = false; word shapeType_; protected: /// check if pointField name exists in Time or time folder virtual bool pointFieldNameExists(const word& name)const = 0; /// Loads a pointField with a given name to the Time object virtual bool loadPointFieldToTime(const word& name)= 0; virtual bool loadPointStructureToTime()=0; virtual const shape& getShape() const= 0; const word& shapeTypeName()const { return shapeType_; } /// get the type name of the pointField in the Time object virtual word getPointFieldType(const word& name)const = 0; /// Checks if a field needs to be updated based on capture time bool checkForUpdate(const word& compoundName, bool forceUpdate = false); /// @brief return the size of pointStructure uint32 pointFieldSize() { auto s = updatePoints(); return s.size(); } template span updateField(const word& name, bool forceUpdate = false); template span updateReservedField(const word& name, bool forceUpdate = false); span createOrGetRealField(const word& name); span createOrGetVolume(bool forceUpdate=false); span createOrGetDensity(bool forceUpdate=false); span createOrGetOne(bool forceUpdate=false); span createOrGetMass(bool forceUpdate=false); span createOrGetI(bool forceUpdate=false); /// Map of reserved field names with their corresponding types static const inline std::map reservedFieldNames_ { {"position", "realx3"}, {"one", "real"}, {"volume", "real"}, {"density", "real"}, {"mass", "real"}, {"I", "real"} }; static bool findFunction( const word& compoundFieldName, word& fieldName, fieldsDataBase::Functions& func ); static bool inputOutputType( fieldsDataBase::Functions func, const word& inputType, word& outputType); public: // - Type info TypeInfo("fieldsDataBase"); // - constructors fieldsDataBase( systemControl& control, const dictionary& postDict, bool inSimulation, timeValue startTime); /// no copy constructor fieldsDataBase(const fieldsDataBase&) = delete; /// no move constructor fieldsDataBase(fieldsDataBase&&) = delete; /// no copy assignment fieldsDataBase& operator=(const fieldsDataBase&) = delete; /// no move assignment fieldsDataBase& operator=(fieldsDataBase&&) = delete; /// destructor virtual ~fieldsDataBase() = default; create_vCtor ( fieldsDataBase, bool, ( systemControl& control, const dictionary& postDict, bool inSimulation, timeValue startTime ), (control, postDict, inSimulation, startTime) ); // - Public Access Functions /// returns the current time timeValue currentTime()const; /// const ref to object Time const Time& time()const { return time_; } Time& time() { return time_; } // - Public Member Functions bool getFieldTypeNameFunction ( const word& compoundName, word& pointFieldName, word& originalType, word& typeAfterFunction, Functions& func )const; bool getFieldType ( const word& compoundName, word& originalType, word& typeAfterFunction ) const; bool getFieldType ( const word& compoundName, word& typeAfterFunction ) const; /// update pointStructure if necessary span updatePoints(bool forceUpdate = false); /// update a field with realx3 type span updateFieldRealx3( const word& compoundName, bool forceUpdate = false); span updateFieldRealx4( const word& compoundName, bool forceUpdate = false); span updateFieldReal( const word& compoundName, bool forceUpdate = false); span updateFieldUint32( const word& name, bool forceUpdate = false); /// Updates and retrieves a point field of any type from the database. /// It returns types real, realx3 and realx4 only. allPointFieldTypes updateFieldAll( const word& compoundName, bool forceUpdate = false); virtual const pointStructure& pStruct()const = 0; /// Get the next avaiable time folder after the current time folder /// This is only used for post-simulation processing virtual timeValue getNextTimeFolder()const { return -1.0; } /// Sets the current folder to the next time folder. /// This is used only for post-simulation processing /// @returns the time value of the next folder. virtual timeValue setToNextTimeFolder() { return -1.0; } /// Skips the next time folder. /// This is used only for post-simulation processing /// @returns the time value of the skipped folder virtual timeValue skipNextTimeFolder() { return -1.0; } static bool pointFieldGetType( const word& TYPENAME, word& fieldType, word& fieldSpace); static uniquePtr create( systemControl& control, const dictionary& postDict, bool inSimulation, timeValue startTime); }; } // namespace pFlow::postprocessData #include "fieldsDataBaseTemplates.cpp" #endif //__fieldsDataBased_hpp__