From 162cfd3b6ab7093940e729e5a50a400d9c7097bb Mon Sep 17 00:00:00 2001 From: Hamidreza Date: Thu, 10 Apr 2025 21:16:31 +0330 Subject: [PATCH] The main structure is tested. functons like execute and write are added and tested. other components are left --- src/PostProcessData/CMakeLists.txt | 35 ----- .../particleProbePostprocessComponent.cpp | 26 ---- src/PostprocessData/CMakeLists.txt | 30 ++++ .../fieldsDataBase/fieldFunctions.hpp | 0 .../fieldsDataBase/fieldsDataBase.cpp | 42 ++--- .../fieldsDataBase/fieldsDataBase.hpp | 0 .../fieldsDataBaseTemplates.cpp | 0 .../PostprocessOperationSum.cpp | 28 ++-- .../PostprocessOperationSum.hpp | 14 +- .../PostprocessOperation}/fieldFunctions.hpp | 7 +- .../operation/includeMask/IncludeMask.hpp | 0 .../operation/includeMask/IncludeMasks.cpp | 0 .../operation/includeMask/includeMask.cpp | 0 .../operation/includeMask/includeMask.hpp | 0 .../operation/includeMask/maskOperations.hpp | 0 .../postprocessOperation.cpp | 104 ++++++++++++- .../postprocessOperation.hpp | 28 +++- .../PostprocessComponent.cpp | 57 ++++++- .../PostprocessComponent.hpp | 4 +- .../PostprocessComponentArithmetic.hpp | 73 +++++++++ .../PostprocessComponentGaussian.hpp | 0 .../PostprocessComponentUniform.hpp | 73 +++++++++ .../PostprocessComponents.cpp | 9 +- .../particleProbePostprocessComponent.cpp | 147 ++++++++++++++++++ .../particleProbePostprocessComponent.hpp | 15 +- .../postprocessComponent.cpp | 0 .../postprocessComponent.hpp | 3 + .../postprocessData}/postprocessData.cpp | 25 ++- .../postprocessData}/postprocessData.hpp | 6 +- .../postprocessData/postprocessGlobals.hpp | 35 +++++ .../postprocessTimeControl.hpp | 0 .../processMethod}/GaussianDistribution.hpp | 0 .../processMethod/arithmetic.hpp | 91 +++++++++++ .../processMethod}/uniformDistribution.hpp | 13 +- .../region/regionFields}/regionField.hpp | 15 ++ .../regionFields}/regionFieldTemplate.cpp | 0 .../centerPointsRegionPoints.cpp | 39 +++-- .../centerPointsRegionPoints.hpp | 6 + .../lineRegionPoints}/lineRegionPoints.cpp | 17 ++ .../lineRegionPoints}/lineRegionPoints.hpp | 6 + .../regionPoints/regionPoints.cpp | 0 .../regionPoints/regionPoints.hpp | 8 +- .../sphereRegionPoints.cpp | 12 +- .../sphereRegionPoints.hpp | 7 + .../sampleDictionary}/postprocessDataDict | 0 45 files changed, 821 insertions(+), 154 deletions(-) delete mode 100644 src/PostProcessData/CMakeLists.txt delete mode 100644 src/PostProcessData/postprocessComponent/particleProbePostprocessComponent.cpp create mode 100644 src/PostprocessData/CMakeLists.txt rename src/{PostProcessData => PostprocessData}/fieldsDataBase/fieldFunctions.hpp (100%) rename src/{PostProcessData => PostprocessData}/fieldsDataBase/fieldsDataBase.cpp (95%) rename src/{PostProcessData => PostprocessData}/fieldsDataBase/fieldsDataBase.hpp (100%) rename src/{PostProcessData => PostprocessData}/fieldsDataBase/fieldsDataBaseTemplates.cpp (100%) rename src/{PostProcessData/operation => PostprocessData/operation/PostprocessOperation}/PostprocessOperationSum.cpp (79%) rename src/{PostProcessData/operation => PostprocessData/operation/PostprocessOperation}/PostprocessOperationSum.hpp (90%) rename src/{PostProcessData/operation => PostprocessData/operation/PostprocessOperation}/fieldFunctions.hpp (96%) rename src/{PostProcessData => PostprocessData}/operation/includeMask/IncludeMask.hpp (100%) rename src/{PostProcessData => PostprocessData}/operation/includeMask/IncludeMasks.cpp (100%) rename src/{PostProcessData => PostprocessData}/operation/includeMask/includeMask.cpp (100%) rename src/{PostProcessData => PostprocessData}/operation/includeMask/includeMask.hpp (100%) rename src/{PostProcessData => PostprocessData}/operation/includeMask/maskOperations.hpp (100%) rename src/{PostProcessData/operation => PostprocessData/operation/postprocessOperation}/postprocessOperation.cpp (53%) rename src/{PostProcessData/operation => PostprocessData/operation/postprocessOperation}/postprocessOperation.hpp (87%) rename src/{PostProcessData/postprocessComponent => PostprocessData/postprocessComponent/PostprocessComponent}/PostprocessComponent.cpp (68%) rename src/{PostProcessData/postprocessComponent => PostprocessData/postprocessComponent/PostprocessComponent}/PostprocessComponent.hpp (97%) create mode 100644 src/PostprocessData/postprocessComponent/PostprocessComponent/PostprocessComponentArithmetic.hpp rename src/{PostProcessData/postprocessComponent => PostprocessData/postprocessComponent/PostprocessComponent}/PostprocessComponentGaussian.hpp (100%) create mode 100644 src/PostprocessData/postprocessComponent/PostprocessComponent/PostprocessComponentUniform.hpp rename src/{PostProcessData/postprocessComponent => PostprocessData/postprocessComponent/PostprocessComponent}/PostprocessComponents.cpp (82%) create mode 100644 src/PostprocessData/postprocessComponent/particleProbePostprocessComponent/particleProbePostprocessComponent.cpp rename src/{PostProcessData/postprocessComponent => PostprocessData/postprocessComponent/particleProbePostprocessComponent}/particleProbePostprocessComponent.hpp (86%) rename src/{PostProcessData => PostprocessData/postprocessComponent}/postprocessComponent/postprocessComponent.cpp (100%) rename src/{PostProcessData => PostprocessData/postprocessComponent}/postprocessComponent/postprocessComponent.hpp (96%) rename src/{PostProcessData => PostprocessData/postprocessData}/postprocessData.cpp (83%) rename src/{PostProcessData => PostprocessData/postprocessData}/postprocessData.hpp (96%) create mode 100644 src/PostprocessData/postprocessData/postprocessGlobals.hpp rename src/{PostProcessData => PostprocessData/postprocessData}/postprocessTimeControl.hpp (100%) rename src/{PostProcessData/method => PostprocessData/processMethod}/GaussianDistribution.hpp (100%) create mode 100644 src/PostprocessData/processMethod/arithmetic.hpp rename src/{PostProcessData/method => PostprocessData/processMethod}/uniformDistribution.hpp (89%) rename src/{PostProcessData/region/regionFields.hpp => PostprocessData/region/regionFields}/regionField.hpp (91%) rename src/{PostProcessData/region/regionFields.hpp => PostprocessData/region/regionFields}/regionFieldTemplate.cpp (100%) rename src/{PostProcessData/region/regionPoints => PostprocessData/region/regionPoints/centerPointsRegionPoints}/centerPointsRegionPoints.cpp (79%) rename src/{PostProcessData/region/regionPoints => PostprocessData/region/regionPoints/centerPointsRegionPoints}/centerPointsRegionPoints.hpp (94%) rename src/{PostProcessData/region/regionPoints => PostprocessData/region/regionPoints/lineRegionPoints}/lineRegionPoints.cpp (82%) rename src/{PostProcessData/region/regionPoints => PostprocessData/region/regionPoints/lineRegionPoints}/lineRegionPoints.hpp (94%) rename src/{PostProcessData/region => PostprocessData/region/regionPoints}/regionPoints/regionPoints.cpp (100%) rename src/{PostProcessData/region => PostprocessData/region/regionPoints}/regionPoints/regionPoints.hpp (94%) rename src/{PostProcessData/region/regionPoints => PostprocessData/region/regionPoints/sphereRegionPoints}/sphereRegionPoints.cpp (71%) rename src/{PostProcessData/region/regionPoints => PostprocessData/region/regionPoints/sphereRegionPoints}/sphereRegionPoints.hpp (93%) rename src/{PostProcessData => PostprocessData/sampleDictionary}/postprocessDataDict (100%) diff --git a/src/PostProcessData/CMakeLists.txt b/src/PostProcessData/CMakeLists.txt deleted file mode 100644 index e5a624a8..00000000 --- a/src/PostProcessData/CMakeLists.txt +++ /dev/null @@ -1,35 +0,0 @@ - -set(SourceFiles -fieldsDataBase/fieldsDataBase.cpp - -postprocessComponent/postprocessComponent.cpp -postprocessComponent/PostprocessComponents.cpp - -operation/postprocessOperation.cpp -operation/PostprocessOperationSum.cpp - - -postprocessData.cpp - -postprocessComponent/postprocessComponent.cpp -postprocessComponent/PostprocessComponents.cpp -postprocessComponent/particleProbePostprocessComponent.cpp - -operation/includeMask/includeMask.cpp -operation/includeMask/IncludeMasks.cpp -operation/postprocessOperation.cpp -operation/PostprocessOperationSum.cpp - -region/regionPoints/sphereRegionPoints.cpp -region/regionPoints/regionPoints.cpp -region/regionPoints/lineRegionPoints.cpp -region/regionPoints/centerPointsRegionPoints.cpp - -) - -set(link_libs Kokkos::kokkos phasicFlow Particles) - -pFlow_add_library_install(PostProcessData SourceFiles link_libs) - -add_subdirectory(testPostprocess) - diff --git a/src/PostProcessData/postprocessComponent/particleProbePostprocessComponent.cpp b/src/PostProcessData/postprocessComponent/particleProbePostprocessComponent.cpp deleted file mode 100644 index 33105c41..00000000 --- a/src/PostProcessData/postprocessComponent/particleProbePostprocessComponent.cpp +++ /dev/null @@ -1,26 +0,0 @@ -#include "particleProbePostprocessComponent.hpp" - -pFlow::particleProbePostprocessComponent::particleProbePostprocessComponent -( - const dictionary &dict, - fieldsDataBase &fieldsDB, - const baseTimeControl &defaultTimeControl -) -: - postprocessComponent(dict, fieldsDB, defaultTimeControl), - regionPointsPtr_ - ( - makeUnique(dict, fieldsDB) - ), - name_(dict.name()) -{} - -bool pFlow::particleProbePostprocessComponent::execute -( - const timeInfo &ti, - bool forceExecute -) -{ - - return false; -} diff --git a/src/PostprocessData/CMakeLists.txt b/src/PostprocessData/CMakeLists.txt new file mode 100644 index 00000000..2c15a7c4 --- /dev/null +++ b/src/PostprocessData/CMakeLists.txt @@ -0,0 +1,30 @@ +set(SourceFiles + # Main postprocess data + postprocessData/postprocessData.cpp + + # Fields database + fieldsDataBase/fieldsDataBase.cpp + + # Regions + region/regionPoints/regionPoints/regionPoints.cpp + region/regionPoints/sphereRegionPoints/sphereRegionPoints.cpp + region/regionPoints/lineRegionPoints/lineRegionPoints.cpp + region/regionPoints/centerPointsRegionPoints/centerPointsRegionPoints.cpp + + # Postprocess components + postprocessComponent/postprocessComponent/postprocessComponent.cpp + postprocessComponent/particleProbePostprocessComponent/particleProbePostprocessComponent.cpp + postprocessComponent/PostprocessComponent/PostprocessComponents.cpp + + # Operations + operation/postprocessOperation/postprocessOperation.cpp + operation/PostprocessOperation/PostprocessOperationSum.cpp + operation/includeMask/includeMask.cpp + operation/includeMask/IncludeMasks.cpp + + +) + +set(link_libs Kokkos::kokkos phasicFlow Particles) + +pFlow_add_library_install(PostprocessData SourceFiles link_libs) \ No newline at end of file diff --git a/src/PostProcessData/fieldsDataBase/fieldFunctions.hpp b/src/PostprocessData/fieldsDataBase/fieldFunctions.hpp similarity index 100% rename from src/PostProcessData/fieldsDataBase/fieldFunctions.hpp rename to src/PostprocessData/fieldsDataBase/fieldFunctions.hpp diff --git a/src/PostProcessData/fieldsDataBase/fieldsDataBase.cpp b/src/PostprocessData/fieldsDataBase/fieldsDataBase.cpp similarity index 95% rename from src/PostProcessData/fieldsDataBase/fieldsDataBase.cpp rename to src/PostprocessData/fieldsDataBase/fieldsDataBase.cpp index 46efefa5..cbd47c98 100644 --- a/src/PostProcessData/fieldsDataBase/fieldsDataBase.cpp +++ b/src/PostprocessData/fieldsDataBase/fieldsDataBase.cpp @@ -465,19 +465,22 @@ pFlow::span pFlow::fieldsDataBase::updateFieldReal } // if the original type is uint32, and no funciton, cast to real - if( originalType == getTypeName() && func == Functions::None ) + if( originalType == getTypeName()) { - auto sp = updateField(fieldName, forceUpdate); - auto spReal = createOrGetRealField(fieldName+".real"); - funcCast(sp, spReal); - return spReal; - } - else - { - fatalErrorInFunction<<"No function can be applied to field of type uint32. "<< - " The field is: "<< compoundName<(nullptr, 0); - fatalExit; + if(func == Functions::None) + { + auto sp = updateField(fieldName, forceUpdate); + auto spReal = createOrGetRealField(fieldName+".real"); + funcCast(sp, spReal); + return spReal; + } + else + { + fatalErrorInFunction<<"No function can be applied to field of type uint32. "<< + " The field is: "<< compoundName<(nullptr, 0); + fatalExit; + } } if( originalType == getTypeName() ) @@ -606,27 +609,30 @@ pFlow::allPointFieldTypes pFlow::fieldsDataBase::updateFieldAll bool forceUpdate ) { - word originalType, typeAfterFunction; + + word originalType, typeAfterFunction, fieldName; + Functions func; - if( !getPointFieldType(compoundName, originalType, typeAfterFunction)) + if( !getPointFieldType(compoundName, fieldName, originalType, typeAfterFunction, func)) { fatalErrorInFunction<< "Error in getting the type name of field: "<< compoundName<<", with type name: "<< originalType <(nullptr,0); + return span(nullptr, 0); } + if( typeAfterFunction== getTypeName() ) { - return updateField(compoundName, forceUpdate); + return updateFieldRealx3(compoundName, forceUpdate); } else if( typeAfterFunction == getTypeName() ) { - return updateField(compoundName, forceUpdate); + return updateFieldRealx4(compoundName, forceUpdate); } else if( typeAfterFunction == getTypeName() ) { - return updateField(compoundName, forceUpdate); + return updateFieldReal(compoundName, forceUpdate); } else { diff --git a/src/PostProcessData/fieldsDataBase/fieldsDataBase.hpp b/src/PostprocessData/fieldsDataBase/fieldsDataBase.hpp similarity index 100% rename from src/PostProcessData/fieldsDataBase/fieldsDataBase.hpp rename to src/PostprocessData/fieldsDataBase/fieldsDataBase.hpp diff --git a/src/PostProcessData/fieldsDataBase/fieldsDataBaseTemplates.cpp b/src/PostprocessData/fieldsDataBase/fieldsDataBaseTemplates.cpp similarity index 100% rename from src/PostProcessData/fieldsDataBase/fieldsDataBaseTemplates.cpp rename to src/PostprocessData/fieldsDataBase/fieldsDataBaseTemplates.cpp diff --git a/src/PostProcessData/operation/PostprocessOperationSum.cpp b/src/PostprocessData/operation/PostprocessOperation/PostprocessOperationSum.cpp similarity index 79% rename from src/PostProcessData/operation/PostprocessOperationSum.cpp rename to src/PostprocessData/operation/PostprocessOperation/PostprocessOperationSum.cpp index 259ff951..bae7af3f 100644 --- a/src/PostProcessData/operation/PostprocessOperationSum.cpp +++ b/src/PostprocessData/operation/PostprocessOperation/PostprocessOperationSum.cpp @@ -51,19 +51,21 @@ bool pFlow::PostprocessOperationSum::execute const auto& regP = regPoints(); bool dbVol = divideByVolume(); - - std::visit([&](auto&& field)->processedRegFieldType - { - return executeSumOperation( - procName, - field, - regP, - dbVol, - weights, - phi, - mask); - }, - allField); + processedRegField_ = makeUnique + ( + std::visit([&](auto&& field)->processedRegFieldType + { + return executeSumOperation( + procName, + field, + regP, + dbVol, + weights, + phi, + mask); + }, + allField) + ); return true; } diff --git a/src/PostProcessData/operation/PostprocessOperationSum.hpp b/src/PostprocessData/operation/PostprocessOperation/PostprocessOperationSum.hpp similarity index 90% rename from src/PostProcessData/operation/PostprocessOperationSum.hpp rename to src/PostprocessData/operation/PostprocessOperation/PostprocessOperationSum.hpp index 5e9cb314..94134602 100644 --- a/src/PostProcessData/operation/PostprocessOperationSum.hpp +++ b/src/PostprocessData/operation/PostprocessOperation/PostprocessOperationSum.hpp @@ -37,14 +37,7 @@ class PostprocessOperationSum public postprocessOperation { private: - - using processedRegFieldType = std::variant - < - regionField, - regionField, - regionField - >; - + /// Pointer to the include mask used for masking operations. uniquePtr processedRegField_ = nullptr; @@ -66,6 +59,11 @@ public: dictionary ); + const processedRegFieldType& processedField()const override + { + return processedRegField_(); + } + bool execute(const std::vector>& weights) override; }; diff --git a/src/PostProcessData/operation/fieldFunctions.hpp b/src/PostprocessData/operation/PostprocessOperation/fieldFunctions.hpp similarity index 96% rename from src/PostProcessData/operation/fieldFunctions.hpp rename to src/PostprocessData/operation/PostprocessOperation/fieldFunctions.hpp index 8e9d6427..e1494459 100644 --- a/src/PostProcessData/operation/fieldFunctions.hpp +++ b/src/PostprocessData/operation/PostprocessOperation/fieldFunctions.hpp @@ -31,6 +31,7 @@ Licence: namespace pFlow { + template regionField executeSumOperation ( @@ -54,7 +55,7 @@ regionField executeSumOperation uint n = 0; for(auto index:partIndices) { - if( mask( index )) + if( index!= -1 && mask( index )) { sum += w[n] * field[index]* phi[index]; } @@ -96,7 +97,7 @@ regionField executeAverageOperation uint n = 0; for(auto index:partIndices) { - if( mask( index )) + if( index!= -1 && mask( index )) { sumNum += w[n] * field[index]* phi[index]; } @@ -114,4 +115,4 @@ regionField executeAverageOperation } // namespace pFlow -#endif //__fieldFunctions_hpp__ \ No newline at end of file +#endif //__fieldFunctions_hpp__ diff --git a/src/PostProcessData/operation/includeMask/IncludeMask.hpp b/src/PostprocessData/operation/includeMask/IncludeMask.hpp similarity index 100% rename from src/PostProcessData/operation/includeMask/IncludeMask.hpp rename to src/PostprocessData/operation/includeMask/IncludeMask.hpp diff --git a/src/PostProcessData/operation/includeMask/IncludeMasks.cpp b/src/PostprocessData/operation/includeMask/IncludeMasks.cpp similarity index 100% rename from src/PostProcessData/operation/includeMask/IncludeMasks.cpp rename to src/PostprocessData/operation/includeMask/IncludeMasks.cpp diff --git a/src/PostProcessData/operation/includeMask/includeMask.cpp b/src/PostprocessData/operation/includeMask/includeMask.cpp similarity index 100% rename from src/PostProcessData/operation/includeMask/includeMask.cpp rename to src/PostprocessData/operation/includeMask/includeMask.cpp diff --git a/src/PostProcessData/operation/includeMask/includeMask.hpp b/src/PostprocessData/operation/includeMask/includeMask.hpp similarity index 100% rename from src/PostProcessData/operation/includeMask/includeMask.hpp rename to src/PostprocessData/operation/includeMask/includeMask.hpp diff --git a/src/PostProcessData/operation/includeMask/maskOperations.hpp b/src/PostprocessData/operation/includeMask/maskOperations.hpp similarity index 100% rename from src/PostProcessData/operation/includeMask/maskOperations.hpp rename to src/PostprocessData/operation/includeMask/maskOperations.hpp diff --git a/src/PostProcessData/operation/postprocessOperation.cpp b/src/PostprocessData/operation/postprocessOperation/postprocessOperation.cpp similarity index 53% rename from src/PostProcessData/operation/postprocessOperation.cpp rename to src/PostprocessData/operation/postprocessOperation/postprocessOperation.cpp index c37961c1..8c42daa3 100644 --- a/src/PostProcessData/operation/postprocessOperation.cpp +++ b/src/PostprocessData/operation/postprocessOperation/postprocessOperation.cpp @@ -18,10 +18,72 @@ Licence: -----------------------------------------------------------------------------*/ +#include "Time.hpp" #include "postprocessOperation.hpp" #include "regionPoints.hpp" #include "fieldsDataBase.hpp" +namespace pFlow +{ + +template +inline +bool writeField +( + iOstream& os, + timeValue t, + const regionField field, + uint32 threshold, + const T& defValue=T{} +) +{ + const auto& regPoints = field.regPoints(); + const uint32 n = field.size(); + os<= threshold) + { + if constexpr(std::is_same_v) + { + os<) + { + os << field[i].x() << ' ' << field[i].y() << ' ' << field[i].z() << ' ' << field[i].w() << tab; + } + else + { + os<) + { + os<) + { + os << defValue.x() << ' ' << defValue.y() << ' ' << defValue.z() << ' ' << defValue.w() << tab; + } + else + { + os< - pFlow::postprocessOperation::create +const pFlow::Time& pFlow::postprocessOperation::time() const +{ + return database_.time(); +} + +bool pFlow::postprocessOperation::write(const fileSystem &parDir) const +{ + auto ti = time().TimeInfo(); + + if(!osPtr_) + { + fileSystem path = parDir+( + processedFieldName() + ".Start_" + ti.prevTimeName()); + osPtr_ = makeUnique(path); + + regPoints().write(osPtr_()); + } + + const auto& field = processedField(); + + std::visit ( - const dictionary &opDict, - const regionPoints& regPoints, - fieldsDataBase &fieldsDB - ) + [&](auto&& arg)->bool + { + return writeField(osPtr_(), ti.t(), arg, threshold_); + }, + field + ); + + return true; +} + +pFlow::uniquePtr +pFlow::postprocessOperation::create( + const dictionary &opDict, + const regionPoints ®Points, + fieldsDataBase &fieldsDB) { word func = opDict.getVal("function"); word method = angleBracketsNames("PostprocessOperation", func); diff --git a/src/PostProcessData/operation/postprocessOperation.hpp b/src/PostprocessData/operation/postprocessOperation/postprocessOperation.hpp similarity index 87% rename from src/PostProcessData/operation/postprocessOperation.hpp rename to src/PostprocessData/operation/postprocessOperation/postprocessOperation.hpp index 01cd853b..fa847bdd 100644 --- a/src/PostProcessData/operation/postprocessOperation.hpp +++ b/src/PostprocessData/operation/postprocessOperation/postprocessOperation.hpp @@ -20,18 +20,28 @@ Licence: #ifndef __postprocessOperation_hpp__ #define __postprocessOperation_hpp__ +#include + #include "virtualConstructor.hpp" #include "Logical.hpp" #include "dictionary.hpp" #include "span.hpp" +#include "oFstream.hpp" +#include "regionField.hpp" #include "includeMask.hpp" - namespace pFlow { +using processedRegFieldType = std::variant + < + regionField, + regionField, + regionField + >; + class fieldsDataBase; -class regionPoints; +class Time; /*! * @brief Base class for post-processing operations. @@ -69,10 +79,12 @@ private: word fieldType_; /// Name of the phi field to be processed. - word phiFieldName_; + word phiFieldName_; /// Pointer to the include mask used for masking operations. uniquePtr includeMask_ = nullptr; + + mutable uniquePtr osPtr_ = nullptr; public: @@ -111,6 +123,8 @@ public: return database_; } + const Time& time()const; + word processedFieldName()const { return operationDict_.name(); @@ -150,10 +164,18 @@ public: return includeMask_().getMask(); } + virtual + const processedRegFieldType& processedField()const=0; virtual bool execute(const std::vector>& weights) = 0; + virtual + bool write(const fileSystem &parDir)const; + + virtual + bool write(iOstream& os)const {return true;} + static uniquePtr create( const dictionary& opDict, diff --git a/src/PostProcessData/postprocessComponent/PostprocessComponent.cpp b/src/PostprocessData/postprocessComponent/PostprocessComponent/PostprocessComponent.cpp similarity index 68% rename from src/PostProcessData/postprocessComponent/PostprocessComponent.cpp rename to src/PostprocessData/postprocessComponent/PostprocessComponent/PostprocessComponent.cpp index 5720bdaa..c815d255 100644 --- a/src/PostProcessData/postprocessComponent/PostprocessComponent.cpp +++ b/src/PostprocessData/postprocessComponent/PostprocessComponent/PostprocessComponent.cpp @@ -61,22 +61,31 @@ bool pFlow::PostprocessComponent::execute bool forceUpdate ) { - - if( !timeControl().eventTime(ti)) + if( !forceUpdate && !timeControl().eventTime(ti)) { executed_ = false; return true; } // update processing methods + auto& regPoints = this->regPoints(); - auto centers = this->regPoints().centers(); - const uint32 n = centers.size(); - auto points = this->database().updatePoints(); + if(!regPoints.update()) + { + fatalErrorInFunction + << "regionPoints update failed for " + << operationDicts_.globalName() + << endl; + return false; + } + + auto centers = regPoints.centers(); + const uint32 n = centers.size(); + auto points = this->database().updatePoints(); for(uint32 i=0; iregPoints().indices(i); + auto indices = regPoints.indices(i); regionsProcessMethod_[i].updateWeights( centers[i], indices, @@ -93,7 +102,7 @@ bool pFlow::PostprocessComponent::execute for(auto& op:operatios_) { - if( op->execute(weights) ) + if( !op->execute(weights) ) { fatalErrorInFunction <<"error occured in executing operatoin defined in dict " @@ -105,5 +114,39 @@ bool pFlow::PostprocessComponent::execute executed_ = true; + return true; +} + +template +inline +bool pFlow::PostprocessComponent::write +( + const fileSystem &parDir +) const +{ + if(!executed_) return true; + + if(regionPointsPtr_().writeToSameTimeFile()) + { + for(auto& operation:operatios_) + { + if(!operation->write(parDir)) + { + fatalErrorInFunction + <<"Error occurred in writing operation defined in dict " + << operation->operationDict() + < +class PostprocessComponentArithmetic +: + public PostprocessComponent +{ +public: + + /// type info + TypeInfoTemplate12("PostprocessComponent", RegionType, arithmetic); + + PostprocessComponentArithmetic + ( + const dictionary& dict, + fieldsDataBase& fieldsDB, + const baseTimeControl& defaultTimeControl + ) + : + PostprocessComponent(dict, fieldsDB, defaultTimeControl) + { + /// initializes the arithmetic distribution for all elements of region + //const uint32 n = this->regPoints().size(); + auto d = this->regPoints().eqDiameters(); + auto c = this->regPoints().centers(); + auto& regs = this->regionProecessMethod(); + const uint32 n = d.size(); + for(uint32 i=0; i +class PostprocessComponentUniform +: + public PostprocessComponent +{ +public: + + /// type info + TypeInfoTemplate12("PostprocessComponent", RegionType, uniformDistribution); + + PostprocessComponentUniform + ( + const dictionary& dict, + fieldsDataBase& fieldsDB, + const baseTimeControl& defaultTimeControl + ) + : + PostprocessComponent(dict, fieldsDB, defaultTimeControl) + { + /// initializes the Uniform distribution for all elements of region + //const uint32 n = this->regPoints().size(); + auto d = this->regPoints().eqDiameters(); + auto c = this->regPoints().centers(); + auto& regs = this->regionProecessMethod(); + const uint32 n = d.size(); + for(uint32 i=0; i; - +template class pFlow::PostprocessComponentUniform; +template class pFlow::PostprocessComponentArithmetic; diff --git a/src/PostprocessData/postprocessComponent/particleProbePostprocessComponent/particleProbePostprocessComponent.cpp b/src/PostprocessData/postprocessComponent/particleProbePostprocessComponent/particleProbePostprocessComponent.cpp new file mode 100644 index 00000000..3aad17a4 --- /dev/null +++ b/src/PostprocessData/postprocessComponent/particleProbePostprocessComponent/particleProbePostprocessComponent.cpp @@ -0,0 +1,147 @@ +#include "particleProbePostprocessComponent.hpp" +#include "Time.hpp" + +namespace pFlow +{ + +template +inline +regionField porbeExecute +( + const word& regFieldName, + const span& field, + const regionPoints& regPoints +) +{ + regionField processedField(regFieldName, regPoints, T{}); + auto partIndices = regPoints.indices(0); + + uint n = 0; + for(auto index:partIndices) + { + if(index != -1) + { + processedField[n] = field[index]; + } + n++; + } + return processedField; +} + +template +inline bool writeField +( + iOstream& os, + timeValue t, + const regionField& field, + const regionPoints& regPoints, + const T& invalidVal = T{} +) +{ + auto indices = regPoints.indices(0); + const uint32 s= field.size(); + os<< t <) + { + os< ) + { + os<(dict, fieldsDB) + ), + fieldName_ + ( + dict.getVal("field") + ), + name_(dict.name()) +{} + +bool pFlow::particleProbePostprocessComponent::execute +( + const timeInfo &ti, + bool forceExecute +) +{ + if( !forceExecute && !timeControl().eventTime(ti)) + { + executed_ = false; + return true; + } + + if(!regionPointsPtr_().update()) + { + fatalErrorInFunction + << "regionPoints update for "<< name_ << " failed. \n"; + return false; + } + + auto field = database().updateFieldAll(fieldName_); + auto pFieldName = name_; + + processedField_ = makeUnique + ( + std::visit( + [&](auto&& f) -> processedRegFieldType + { + return porbeExecute( + pFieldName, + f, + regionPointsPtr_()); + }, + field) + ); + + executed_ = true; + return true; +} + + +bool pFlow::particleProbePostprocessComponent::write(const fileSystem& parDir)const +{ + if(! executed_ ) return true; + + const auto ti = database().time().TimeInfo(); + + if( !osPtr_) + { + // file is not open yet + fileSystem path = parDir + (name_+".Start_"+ti.prevTimeName()); + osPtr_ = makeUnique(path); + regionPointsPtr_().write(osPtr_()); + } + + std::visit + ([&](auto&& arg)->bool + { + return writeField(osPtr_(), ti.t(), arg, regionPointsPtr_()); + }, + processedField_() + ); + + return true; +} \ No newline at end of file diff --git a/src/PostProcessData/postprocessComponent/particleProbePostprocessComponent.hpp b/src/PostprocessData/postprocessComponent/particleProbePostprocessComponent/particleProbePostprocessComponent.hpp similarity index 86% rename from src/PostProcessData/postprocessComponent/particleProbePostprocessComponent.hpp rename to src/PostprocessData/postprocessComponent/particleProbePostprocessComponent/particleProbePostprocessComponent.hpp index 7ceaf893..5069e291 100644 --- a/src/PostProcessData/postprocessComponent/particleProbePostprocessComponent.hpp +++ b/src/PostprocessData/postprocessComponent/particleProbePostprocessComponent/particleProbePostprocessComponent.hpp @@ -25,10 +25,12 @@ Licence: #include "fieldsDataBase.hpp" #include "centerPointsRegionPoints.hpp" #include "regionField.hpp" +#include "oFstream.hpp" namespace pFlow { + class particleProbePostprocessComponent : public postprocessComponent @@ -48,8 +50,12 @@ private: uniquePtr processedField_ = nullptr; + word fieldName_; + word name_; + mutable uniquePtr osPtr_ = nullptr; + public: TypeInfo("PostprocessComponent"); @@ -63,6 +69,12 @@ public: ~particleProbePostprocessComponent()override = default; + add_vCtor + ( + postprocessComponent, + particleProbePostprocessComponent, + dictionary + ); word name()const override { @@ -74,7 +86,6 @@ public: return regionPointsPtr_(); } - const regionPoints& regPoints() const override { return regionPointsPtr_(); @@ -87,6 +98,8 @@ public: return executed_; } + bool write(const fileSystem& parDir)const override; + }; } diff --git a/src/PostProcessData/postprocessComponent/postprocessComponent.cpp b/src/PostprocessData/postprocessComponent/postprocessComponent/postprocessComponent.cpp similarity index 100% rename from src/PostProcessData/postprocessComponent/postprocessComponent.cpp rename to src/PostprocessData/postprocessComponent/postprocessComponent/postprocessComponent.cpp diff --git a/src/PostProcessData/postprocessComponent/postprocessComponent.hpp b/src/PostprocessData/postprocessComponent/postprocessComponent/postprocessComponent.hpp similarity index 96% rename from src/PostProcessData/postprocessComponent/postprocessComponent.hpp rename to src/PostprocessData/postprocessComponent/postprocessComponent/postprocessComponent.hpp index e409068b..70db2153 100644 --- a/src/PostProcessData/postprocessComponent/postprocessComponent.hpp +++ b/src/PostprocessData/postprocessComponent/postprocessComponent/postprocessComponent.hpp @@ -101,6 +101,9 @@ public: virtual bool executed()const = 0; + virtual + bool write(const fileSystem& parDir)const = 0; + static uniquePtr create( const dictionary& dict, diff --git a/src/PostProcessData/postprocessData.cpp b/src/PostprocessData/postprocessData/postprocessData.cpp similarity index 83% rename from src/PostProcessData/postprocessData.cpp rename to src/PostprocessData/postprocessData/postprocessData.cpp index 359fa893..064b5ad1 100644 --- a/src/PostProcessData/postprocessData.cpp +++ b/src/PostprocessData/postprocessData/postprocessData.cpp @@ -23,6 +23,7 @@ Licence: #include "systemControl.hpp" #include "postprocessData.hpp" #include "fileDictionary.hpp" +#include "postprocessGlobals.hpp" #include "postprocessComponent.hpp" pFlow::postprocessData::postprocessData(const systemControl &control) @@ -42,6 +43,8 @@ pFlow::postprocessData::postprocessData(const systemControl &control) ), componentsDicts_(readDictList("components", dict_)) { + postProcessGlobals::defaultDir__ = CWD()/pFlow::postProcessGlobals::defaultRelDir__; + // if dictionary is not provided, no extra action is required. if( !dict_.fileExist() ) { @@ -81,7 +84,6 @@ pFlow::postprocessData::postprocessData(const systemControl &control) bool pFlow::postprocessData::execute() { - const auto& ti = time_.TimeInfo(); for(auto& component:postprocesses_) @@ -96,4 +98,23 @@ bool pFlow::postprocessData::execute() } return true; -} \ No newline at end of file +} + +bool pFlow::postprocessData::write() const +{ + for(auto& component:postprocesses_) + { + if(!component->executed()) + { + continue; + } + if(!component->write(postProcessGlobals::defaultDir__/component->name())) + { + fatalErrorInFunction + <<"Error occured in writing postprocess component: " + <name()< + +#include "types.hpp" +#include "typeInfo.hpp" +#include "span.hpp" + +namespace pFlow +{ + +class dictionary; + +class arithmetic +{ +private: + + std::vector weight_; + +public: + + // type info + TypeInfoNV("arithmetic"); + + arithmetic() + {} + + arithmetic(const arithmetic&) = default; + + arithmetic(arithmetic&&) = default; + + arithmetic& operator=(const arithmetic&) = default; + + arithmetic& operator=(arithmetic&&) = default; + + ~arithmetic()=default; + + + bool updateWeights + ( + const realx3& center, + const span& indices, + const span& points + ) + { + return updateWeights(indices.size()); + } + + bool updateWeights(uint32 n) + { + n = max(n, 1u); + weight_.assign(n, 1); + return true; + } + + real getWeight(uint32 i)const + { + return weight_[i]; + } + + span getWeights() + { + return span(weight_.data(), weight_.size()); + } + +}; + +} + +#endif //__arithmetic_hpp__ \ No newline at end of file diff --git a/src/PostProcessData/method/uniformDistribution.hpp b/src/PostprocessData/processMethod/uniformDistribution.hpp similarity index 89% rename from src/PostProcessData/method/uniformDistribution.hpp rename to src/PostprocessData/processMethod/uniformDistribution.hpp index 736d9d2f..d0445615 100644 --- a/src/PostProcessData/method/uniformDistribution.hpp +++ b/src/PostprocessData/processMethod/uniformDistribution.hpp @@ -21,6 +21,8 @@ Licence: #ifndef __uniformDistribution_hpp__ #define __uniformDistribution_hpp__ +#include + #include "types.hpp" #include "typeInfo.hpp" #include "span.hpp" @@ -55,11 +57,14 @@ public: ~uniformDistribution()=default; - bool updateWeights(const realx3& center, const span& points) + bool updateWeights + ( + const realx3& center, + const span& indices, + const span& points + ) { - uint32 n = max(points.size(), 1u); - weight_.assign(n, 1.0/n); - return true; + return updateWeights(indices.size()); } bool updateWeights(uint32 n) diff --git a/src/PostProcessData/region/regionFields.hpp/regionField.hpp b/src/PostprocessData/region/regionFields/regionField.hpp similarity index 91% rename from src/PostProcessData/region/regionFields.hpp/regionField.hpp rename to src/PostprocessData/region/regionFields/regionField.hpp index 559f854f..8d47a281 100644 --- a/src/PostProcessData/region/regionFields.hpp/regionField.hpp +++ b/src/PostprocessData/region/regionFields/regionField.hpp @@ -57,6 +57,11 @@ public: ~regionField() = default; + const regionPoints& regPoints() const + { + return regionPoints_; + } + /// get the field value T& operator[] (const uint32 i) { @@ -75,6 +80,16 @@ public: return field_.name(); } + auto size()const + { + return field_.size(); + } + + bool empty()const + { + return field_.empty(); + } + /// @brief write the field to a file /// @param os output file stream /// @return true if successful and false if fails diff --git a/src/PostProcessData/region/regionFields.hpp/regionFieldTemplate.cpp b/src/PostprocessData/region/regionFields/regionFieldTemplate.cpp similarity index 100% rename from src/PostProcessData/region/regionFields.hpp/regionFieldTemplate.cpp rename to src/PostprocessData/region/regionFields/regionFieldTemplate.cpp diff --git a/src/PostProcessData/region/regionPoints/centerPointsRegionPoints.cpp b/src/PostprocessData/region/regionPoints/centerPointsRegionPoints/centerPointsRegionPoints.cpp similarity index 79% rename from src/PostProcessData/region/regionPoints/centerPointsRegionPoints.cpp rename to src/PostprocessData/region/regionPoints/centerPointsRegionPoints/centerPointsRegionPoints.cpp index 2595ca14..e16ef774 100644 --- a/src/PostProcessData/region/regionPoints/centerPointsRegionPoints.cpp +++ b/src/PostprocessData/region/regionPoints/centerPointsRegionPoints/centerPointsRegionPoints.cpp @@ -37,7 +37,7 @@ bool pFlow::centerPointsRegionPoints::selectIds() diameter_.resize(ids_.size(),1.0); center_.resize(ids_.size(), realx3(0,0,0)); selectedPoints_.resize(ids_.size(), -1); - return false; + return true; } pFlow::centerPointsRegionPoints::centerPointsRegionPoints( @@ -46,19 +46,7 @@ pFlow::centerPointsRegionPoints::centerPointsRegionPoints( : regionPoints(dict, fieldsDataBase), idName_(dict.getValOrSet("idName", "id")), probDict_(dict) -{ - auto idList = dict.getVal("ids"); - Set uniqueIds; - - uniqueIds.insert(idList.begin(), idList.end()); - - for(auto& id:uniqueIds) - { - ids_.push_back(id); - } - - selectedPoints_.resize(ids_.size()); -} +{} bool pFlow::centerPointsRegionPoints::update() { @@ -81,6 +69,27 @@ bool pFlow::centerPointsRegionPoints::update() } } - return false; + return true; } + +bool pFlow::centerPointsRegionPoints::write(iOstream &os) const +{ + if(firstTimeUpdate_) + { + fatalErrorInFunction + <<"Write operation should be done before executing the update. \n"; + return false; + } + os <<"# Probing particles for selected ids\n"; + os << "# SelectedId: "; + + for(auto& id: ids_) + { + os << id << tab; + } + os << endl; + os << "time"< create( diff --git a/src/PostProcessData/region/regionPoints/sphereRegionPoints.cpp b/src/PostprocessData/region/regionPoints/sphereRegionPoints/sphereRegionPoints.cpp similarity index 71% rename from src/PostProcessData/region/regionPoints/sphereRegionPoints.cpp rename to src/PostprocessData/region/regionPoints/sphereRegionPoints/sphereRegionPoints.cpp index 566fd688..4022c00e 100644 --- a/src/PostProcessData/region/regionPoints/sphereRegionPoints.cpp +++ b/src/PostprocessData/region/regionPoints/sphereRegionPoints/sphereRegionPoints.cpp @@ -27,5 +27,15 @@ bool pFlow::sphereRegionPoints::update() } } - return false; + return true; +} + +bool pFlow::sphereRegionPoints::write(iOstream &os) const +{ + os <<"# Single sphere\n"; + os <<"# center point: "<