From 797334af872f3446039bdd1ad911ee6d1b221022 Mon Sep 17 00:00:00 2001 From: wanqing0421 Date: Sun, 16 Mar 2025 00:36:38 +0800 Subject: [PATCH 1/5] adapt the multiRotatingAxisMotion to v-1.0 --- .../geometryMotion/geometryMotions.cpp | 2 +- .../geometryMotion/geometryMotions.hpp | 7 +- src/MotionModel/CMakeLists.txt | 4 +- .../multiRotatingAxis/multiRotatingAxis.cpp | 39 ++- .../multiRotatingAxis/multiRotatingAxis.hpp | 16 +- .../multiRotatingAxisMotion.cpp | 240 ++++-------------- .../multiRotatingAxisMotion.hpp | 223 +++------------- 7 files changed, 138 insertions(+), 393 deletions(-) diff --git a/src/Geometry/geometryMotion/geometryMotions.cpp b/src/Geometry/geometryMotion/geometryMotions.cpp index 6cdb4a3b..8636c1f7 100644 --- a/src/Geometry/geometryMotion/geometryMotions.cpp +++ b/src/Geometry/geometryMotion/geometryMotions.cpp @@ -28,4 +28,4 @@ template class pFlow::geometryMotion; template class pFlow::geometryMotion; -//template class pFlow::geometryMotion; +template class pFlow::geometryMotion; diff --git a/src/Geometry/geometryMotion/geometryMotions.hpp b/src/Geometry/geometryMotion/geometryMotions.hpp index 3b0a2867..4a916b6e 100644 --- a/src/Geometry/geometryMotion/geometryMotions.hpp +++ b/src/Geometry/geometryMotion/geometryMotions.hpp @@ -25,7 +25,7 @@ Licence: #include "stationaryWall.hpp" #include "rotatingAxisMotion.hpp" #include "conveyorBeltMotion.hpp" -//#include "multiRotatingAxisMotion.hpp" +#include "multiRotatingAxisMotion.hpp" #include "vibratingMotion.hpp" @@ -40,10 +40,7 @@ using stationaryGeometry = geometryMotion; using conveyorBeltMotionGeometry = geometryMotion; -//typedef geometryMotion multiRotationAxisMotionGeometry; - - - +using multiRotationAxisMotionGeometry = geometryMotion; } diff --git a/src/MotionModel/CMakeLists.txt b/src/MotionModel/CMakeLists.txt index 1e92a989..d28af4f5 100644 --- a/src/MotionModel/CMakeLists.txt +++ b/src/MotionModel/CMakeLists.txt @@ -14,8 +14,8 @@ entities/stationary/stationary.cpp conveyorBeltMotion/conveyorBeltMotion.cpp entities/conveyorBelt/conveyorBelt.cpp -#entities/multiRotatingAxis/multiRotatingAxis.cpp -#multiRotatingAxisMotion/multiRotatingAxisMotion.cpp +entities/multiRotatingAxis/multiRotatingAxis.cpp +multiRotatingAxisMotion/multiRotatingAxisMotion.cpp ) diff --git a/src/MotionModel/entities/multiRotatingAxis/multiRotatingAxis.cpp b/src/MotionModel/entities/multiRotatingAxis/multiRotatingAxis.cpp index 62733216..12f6596b 100644 --- a/src/MotionModel/entities/multiRotatingAxis/multiRotatingAxis.cpp +++ b/src/MotionModel/entities/multiRotatingAxis/multiRotatingAxis.cpp @@ -22,6 +22,18 @@ Licence: #include "multiRotatingAxisMotion.hpp" #include "dictionary.hpp" +/// Construct from dictionary +FUNCTION_H +pFlow::multiRotatingAxis::multiRotatingAxis(const dictionary& dict) +{ + if(!read(nullptr, dict)) + { + fatalErrorInFunction<< + " error in reading multiRotatingAxis from dictionary "<< dict.globalName()< nameToIndex(rotAxis); + bool result = axisMotion-> nameToIndex(rotAxis, parentAxisIndex_); } return true; @@ -90,10 +102,33 @@ bool pFlow::multiRotatingAxis::write } else { - auto rotAxis = axisMotion->indexToName(parentAxisIndex_); + word rotAxis; + bool result = axisMotion->indexToName(parentAxisIndex_, rotAxis); dict.add("rotationAxis", rotAxis); } return true; } + +FUNCTION_H +bool pFlow::multiRotatingAxis::write +( + dictionary& dict +) const +{ + if( !rotatingAxis::write(dict) ) return false; + + if(parentAxisIndex_ == 0) + { + dict.add("rotationAxis", "none"); + } + // else + // { + // word rotAxis; + // bool result = axisMotion->indexToName(parentAxisIndex_, rotAxis); + // dict.add("rotationAxis", rotAxis); + // } + + return true; +} diff --git a/src/MotionModel/entities/multiRotatingAxis/multiRotatingAxis.hpp b/src/MotionModel/entities/multiRotatingAxis/multiRotatingAxis.hpp index c79e87c8..20c231e0 100644 --- a/src/MotionModel/entities/multiRotatingAxis/multiRotatingAxis.hpp +++ b/src/MotionModel/entities/multiRotatingAxis/multiRotatingAxis.hpp @@ -82,16 +82,22 @@ protected: multiRotatingAxis* axisList_; /// Index of parent axis - int32 parentAxisIndex_ = -1; + uint32 parentAxisIndex_ = static_cast(-1); public: + TypeInfoNV("multiRotatingAxis"); + // - Constructors /// Empty Constructor INLINE_FUNCTION_HD multiRotatingAxis(){} + /// Construct from dictionary + FUNCTION_H + explicit multiRotatingAxis(const dictionary& dict); + /// Empty with list of axes FUNCTION_H multiRotatingAxis(multiRotatingAxisMotion* axisMotion); @@ -123,11 +129,11 @@ public: while(parIndex != -1) { auto& ax = axisList_[parIndex]; - parentVel += ax.linTangentialVelocityPoint(p); + parentVel += ax.linVelocityPoint(p); parIndex = ax.parentAxisIndex(); } - return parentVel + rotatingAxis::linTangentialVelocityPoint(p); + return parentVel + rotatingAxis::linVelocityPoint(p); } /// Translate point p for dt seconds based on the axis information @@ -207,6 +213,10 @@ public: FUNCTION_H bool write(const multiRotatingAxisMotion* axisMotion, dictionary& dict) const; + /// Write to dictionary + FUNCTION_H + bool write(dictionary& dict) const; + }; diff --git a/src/MotionModel/multiRotatingAxisMotion/multiRotatingAxisMotion.cpp b/src/MotionModel/multiRotatingAxisMotion/multiRotatingAxisMotion.cpp index 360f1ee0..a14b92c5 100644 --- a/src/MotionModel/multiRotatingAxisMotion/multiRotatingAxisMotion.cpp +++ b/src/MotionModel/multiRotatingAxisMotion/multiRotatingAxisMotion.cpp @@ -19,220 +19,70 @@ Licence: -----------------------------------------------------------------------------*/ #include "multiRotatingAxisMotion.hpp" -#include "dictionary.hpp" -#include "vocabs.hpp" - -bool pFlow::multiRotatingAxisMotion::readDictionary +void pFlow::multiRotatingAxisMotion::impl_setTime ( - const dictionary& dict -) -{ - - auto motionModel = dict.getVal("motionModel"); - - if(motionModel != "multiRotatingAxisMotion") - { - fatalErrorInFunction<< - " motionModel should be multiRotatingAxisMotion, but found " - << motionModel <(axDict); axPtr) - { - rotationAxis.push_back( - axDict.getValOrSet("rotationAxis", "none")); - } - else - { - fatalErrorInFunction<< - "could not read rotating axis from "<< axDict.globalName()<; - - std::vector numRotAxis; - - for(size_t i=0; i< axisNames.size(); i++) - { - word rotAxis = rotationAxis[i]; - int32 n=0; - while(rotAxis != "none") - { - n++; - if(int32 iAxis = axisNames.findi(rotAxis) ; iAxis != -1) - { - rotAxis = rotationAxis[iAxis]; - }else - { - fatalErrorInFunction<< - "rotation axis name "<< rotAxis << "is does not exist!"< b.first; }; - - algorithms::STD::sort(numRotAxis.data(), numRotAxis.size(), compareFunc); - - sortedIndex_.clear(); - axisName_.clear(); - - - for(auto ax:numRotAxis) - { - axisName_.push_back(axisNames[ax.second]); - sortedIndex_.push_back(ax.second); - } - - numAxis_ = axisName_.size(); - axis_.clear(); - axis_.reserve(numAxis_); - - - // create the actual axis vector - for(auto& aName: axisName_) - { - if(aName != "none") - { - auto& axDict = motionInfo.subDict(aName); - axis_.push_back( - multiRotatingAxis(this, axDict)); - } - else - { - axis_.push_back( - multiRotatingAxis(this)); - } - - } - - return true; -} - -bool pFlow::multiRotatingAxisMotion::writeDictionary -( - dictionary& dict + uint32 iter, + real t, + real dt )const { - dict.add("motionModel", "multiRotatingAxisMotion"); - - auto& motionInfo = dict.subDictOrCreate("multiRotatingAxisMotionInfo"); - - ForAll(i, axis_) - { - - auto& axDict = motionInfo.subDictOrCreate(axisName_[i]); - if( !axis_.hostVectorAll()[i].write(this,axDict)) - { - fatalErrorInFunction<< - " error in writing axis "<< axisName_[i] << " to dicrionary " - << motionInfo.globalName()<impl_writeDictionary(newDict) || + !newDict.write(os)) + { + fatalErrorInFunction<< + " error in writing to dictionary "<< newDict.globalName()< { -public: - - /** Motion model class to be passed to computational units/kernels for - * transfing points and returning velocities at various positions - */ - class Model - { - protected: - - deviceViewType1D axis_; - int32 numAxis_=0; - - public: - - INLINE_FUNCTION_HD - Model(deviceViewType1D axis, int32 numAxis): - axis_(axis), - numAxis_(numAxis) - {} - - INLINE_FUNCTION_HD - Model(const Model&) = default; - - - INLINE_FUNCTION_HD - Model& operator=(const Model&) = default; - - - INLINE_FUNCTION_HD - realx3 pointVelocity(int32 n, const realx3& p)const - { - return axis_[n].pointTangentialVel(p); - } - - INLINE_FUNCTION_HD - realx3 operator()(int32 n, const realx3& p)const - { - return pointVelocity(n,p); - } - - INLINE_FUNCTION_HD - realx3 transferPoint(int32 n, const realx3 p, real dt)const - { - return axis_[n].transferPoint(p, dt); - } - - INLINE_FUNCTION_HD int32 numComponents()const - { - return numAxis_; - } - }; - protected: - using axisVector_HD = VectorDual; + friend MotionModel; - /// Vector of multiRotaingAxis axes - axisVector_HD axis_; - - /// Sorted index based on number of parrents each axis ha - VectorDual sortedIndex_; + /// is the geometry attached to this component moving + bool impl_isMoving()const + { + return true; + } - /// List of axes names - wordList axisName_; - - /// Number of axes - label numAxis_= 0; - - /// Read from a dictionary - bool readDictionary(const dictionary& dict); - - /// Write to a dictionary - bool writeDictionary(dictionary& dict)const; + /// move the component itself + bool impl_move(uint32, real, real)const + { + return true; + } public: - /// Type info - TypeInfoNV("multiRotatingAxisMotion"); + TypeInfo("multiRotatingAxisMotion"); - // - Constructor + multiRotatingAxisMotion(const objectFile& objf, repository* owner); - /// Empty constructor - FUNCTION_H - multiRotatingAxisMotion(); + multiRotatingAxisMotion( + const objectFile& objf, + const dictionary& dict, + repository* owner); - /// Construct with dictionary - FUNCTION_H - multiRotatingAxisMotion(const dictionary& dict); + using fileDictionary::write; - /// Copy constructor - FUNCTION_H - multiRotatingAxisMotion(const multiRotatingAxisMotion&) = default; + bool write(iOstream& os, const IOPattern& iop)const override; - /// No Move - multiRotatingAxisMotion(multiRotatingAxisMotion&&) = delete; + static + auto noneComponent() + { + return multiRotatingAxis{}; + } - /// Copy assignment - FUNCTION_H - multiRotatingAxisMotion& operator=(const multiRotatingAxisMotion&) = default; - - /// No move assignment - multiRotatingAxisMotion& operator=(multiRotatingAxisMotion&&) = delete; - - /// Destructor - FUNCTION_H - ~multiRotatingAxisMotion() = default; - - // - Methods - - /// Retrun motion model at time t - Model getModel(real t) - { - for(int32 i= 0; i Date: Sun, 16 Mar 2025 15:15:49 +0800 Subject: [PATCH 2/5] fill the multiRotatingAxis --- .../entities/multiRotatingAxis/multiRotatingAxis.cpp | 10 +++++----- .../multiRotatingAxisMotion.cpp | 10 +++++----- .../multiRotatingAxisMotion.hpp | 2 +- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/MotionModel/entities/multiRotatingAxis/multiRotatingAxis.cpp b/src/MotionModel/entities/multiRotatingAxis/multiRotatingAxis.cpp index 12f6596b..62c9b9dc 100644 --- a/src/MotionModel/entities/multiRotatingAxis/multiRotatingAxis.cpp +++ b/src/MotionModel/entities/multiRotatingAxis/multiRotatingAxis.cpp @@ -117,12 +117,12 @@ bool pFlow::multiRotatingAxis::write dictionary& dict ) const { - if( !rotatingAxis::write(dict) ) return false; + // if( !rotatingAxis::write(dict) ) return false; - if(parentAxisIndex_ == 0) - { - dict.add("rotationAxis", "none"); - } + // if(parentAxisIndex_ == -1) + // { + // dict.add("rotationAxis", "none"); + // } // else // { // word rotAxis; diff --git a/src/MotionModel/multiRotatingAxisMotion/multiRotatingAxisMotion.cpp b/src/MotionModel/multiRotatingAxisMotion/multiRotatingAxisMotion.cpp index a14b92c5..b264f8b1 100644 --- a/src/MotionModel/multiRotatingAxisMotion/multiRotatingAxisMotion.cpp +++ b/src/MotionModel/multiRotatingAxisMotion/multiRotatingAxisMotion.cpp @@ -43,11 +43,11 @@ pFlow::multiRotatingAxisMotion::multiRotatingAxisMotion( : fileDictionary(objf, owner) { - // if(! impl_readDictionary(*this) ) - // { - // fatalErrorInFunction; - // fatalExit; - // } + if(! impl_readDictionary(*this) ) + { + fatalErrorInFunction; + fatalExit; + } } pFlow::multiRotatingAxisMotion::multiRotatingAxisMotion diff --git a/src/MotionModel/multiRotatingAxisMotion/multiRotatingAxisMotion.hpp b/src/MotionModel/multiRotatingAxisMotion/multiRotatingAxisMotion.hpp index dddc42d2..baa5d2b5 100644 --- a/src/MotionModel/multiRotatingAxisMotion/multiRotatingAxisMotion.hpp +++ b/src/MotionModel/multiRotatingAxisMotion/multiRotatingAxisMotion.hpp @@ -105,7 +105,7 @@ public: static auto noneComponent() { - return multiRotatingAxis{}; + return multiRotatingAxis(); } // TODO: make this method protected From be7b2eb63266c3c59f44e198829c23a28ab13458 Mon Sep 17 00:00:00 2001 From: wanqing0421 Date: Sun, 16 Mar 2025 22:08:07 +0800 Subject: [PATCH 3/5] multiRotaingAxis debug --- src/Geometry/geometryMotion/geometryMotion.cpp | 1 - src/MotionModel/MotionModel/MotionModel.cpp | 1 - .../entities/multiRotatingAxis/multiRotatingAxis.hpp | 4 ++-- .../multiRotatingAxisMotion/multiRotatingAxisMotion.hpp | 6 ------ 4 files changed, 2 insertions(+), 10 deletions(-) diff --git a/src/Geometry/geometryMotion/geometryMotion.cpp b/src/Geometry/geometryMotion/geometryMotion.cpp index 22124c47..f779997d 100644 --- a/src/Geometry/geometryMotion/geometryMotion.cpp +++ b/src/Geometry/geometryMotion/geometryMotion.cpp @@ -21,7 +21,6 @@ Licence: template bool pFlow::geometryMotion::findMotionIndex() { - if(motionComponentName().size() != numSurfaces() ) { fatalErrorInFunction<< diff --git a/src/MotionModel/MotionModel/MotionModel.cpp b/src/MotionModel/MotionModel/MotionModel.cpp index 6a530eaa..426b0218 100644 --- a/src/MotionModel/MotionModel/MotionModel.cpp +++ b/src/MotionModel/MotionModel/MotionModel.cpp @@ -32,7 +32,6 @@ bool pFlow::MotionModel::impl_nameToIndex(const word& name, ui indx = static_cast(i); return true; } - } template diff --git a/src/MotionModel/entities/multiRotatingAxis/multiRotatingAxis.hpp b/src/MotionModel/entities/multiRotatingAxis/multiRotatingAxis.hpp index 20c231e0..a7d30f6f 100644 --- a/src/MotionModel/entities/multiRotatingAxis/multiRotatingAxis.hpp +++ b/src/MotionModel/entities/multiRotatingAxis/multiRotatingAxis.hpp @@ -91,8 +91,8 @@ public: // - Constructors /// Empty Constructor - INLINE_FUNCTION_HD - multiRotatingAxis(){} + FUNCTION_HD + multiRotatingAxis() = default; /// Construct from dictionary FUNCTION_H diff --git a/src/MotionModel/multiRotatingAxisMotion/multiRotatingAxisMotion.hpp b/src/MotionModel/multiRotatingAxisMotion/multiRotatingAxisMotion.hpp index baa5d2b5..0874b86a 100644 --- a/src/MotionModel/multiRotatingAxisMotion/multiRotatingAxisMotion.hpp +++ b/src/MotionModel/multiRotatingAxisMotion/multiRotatingAxisMotion.hpp @@ -22,12 +22,6 @@ Licence: #define __multiRotatingAxisMotion_hpp__ -// #include "types.hpp" -// #include "typeInfo.hpp" -// #include "VectorSingle.hpp" -// #include "List.hpp" -// #include "multiRotatingAxis.hpp" - #include "MotionModel.hpp" #include "multiRotatingAxis.hpp" #include "fileDictionary.hpp" From 340f3a551a76bfa9ee0005b608fdcf534e8e3ed8 Mon Sep 17 00:00:00 2001 From: Hamidreza Date: Wed, 19 Mar 2025 18:10:50 +0330 Subject: [PATCH 4/5] Multirotating axis motion for version 1.0 --- .../sphereInteractionsNonLinearModModels.cpp | 4 +- .../multiRotatingAxis/multiRotatingAxis.cpp | 81 +++------ .../multiRotatingAxis/multiRotatingAxis.hpp | 26 ++- .../multiRotatingAxisMotion.cpp | 168 +++++++++++++++++- .../multiRotatingAxisMotion.hpp | 14 +- 5 files changed, 212 insertions(+), 81 deletions(-) diff --git a/src/Interaction/sphereInteraction/sphereInteractionsNonLinearModModels.cpp b/src/Interaction/sphereInteraction/sphereInteractionsNonLinearModModels.cpp index d7f79ff7..fd277432 100644 --- a/src/Interaction/sphereInteraction/sphereInteractionsNonLinearModModels.cpp +++ b/src/Interaction/sphereInteraction/sphereInteractionsNonLinearModModels.cpp @@ -58,5 +58,5 @@ createInteraction(pFlow::cfModels::limitedNonLinearModNormalRolling, pFlow::conv createInteraction(pFlow::cfModels::nonLimitedNonLinearModNormalRolling,pFlow::conveyorBeltMotionGeometry); // multiRotationAxisMotionGeometry -//createInteraction(pFlow::cfModels::limitedNonLinearModNormalRolling, pFlow::multiRotationAxisMotionGeometry); -//createInteraction(pFlow::cfModels::nonLimitedNonLinearModNormalRolling,pFlow::multiRotationAxisMotionGeometry); +createInteraction(pFlow::cfModels::limitedNonLinearModNormalRolling, pFlow::multiRotationAxisMotionGeometry); +createInteraction(pFlow::cfModels::nonLimitedNonLinearModNormalRolling,pFlow::multiRotationAxisMotionGeometry); diff --git a/src/MotionModel/entities/multiRotatingAxis/multiRotatingAxis.cpp b/src/MotionModel/entities/multiRotatingAxis/multiRotatingAxis.cpp index 62c9b9dc..10e70aa7 100644 --- a/src/MotionModel/entities/multiRotatingAxis/multiRotatingAxis.cpp +++ b/src/MotionModel/entities/multiRotatingAxis/multiRotatingAxis.cpp @@ -25,40 +25,29 @@ Licence: /// Construct from dictionary FUNCTION_H pFlow::multiRotatingAxis::multiRotatingAxis(const dictionary& dict) -{ - if(!read(nullptr, dict)) - { - fatalErrorInFunction<< - " error in reading multiRotatingAxis from dictionary "<< dict.globalName()<getAxisListPtr(); -} - -FUNCTION_H -pFlow::multiRotatingAxis::multiRotatingAxis -( - multiRotatingAxisMotion* axisMotion, + multiRotatingAxis* axisListPtr, + const wordList& componentsNames, const dictionary& dict ) +: + rotatingAxis(dict), + axisList_(axisListPtr) { - if(!read(axisMotion, dict)) + if(!read(dict, componentsNames)) { fatalErrorInFunction<< " error in reading rotatingAxis from dictionary "<< dict.globalName()<getAxisListPtr(); } @@ -66,22 +55,29 @@ pFlow::multiRotatingAxis::multiRotatingAxis FUNCTION_H bool pFlow::multiRotatingAxis::read ( - multiRotatingAxisMotion* axisMotion, - const dictionary& dict + const dictionary& dict, + const wordList& componentNames ) { - - if(!rotatingAxis::read(dict))return false; word rotAxis = dict.getValOrSet("rotationAxis", "none"); if(rotAxis == "none") { - parentAxisIndex_ = -1; + parentAxisIndex_ = static_cast(-1); } else { - bool result = axisMotion-> nameToIndex(rotAxis, parentAxisIndex_); + if( auto i = componentNames.findi(rotAxis); i != -1 ) + { + parentAxisIndex_ = i; + } + else + { + fatalErrorInFunction<<"crotationAxis "<< rotAxis<<" in dictionary "<< + dict.globalName()<<" is not found in list of axis names "<< componentNames<indexToName(parentAxisIndex_, rotAxis); - dict.add("rotationAxis", rotAxis); + dict.add("rotationAxis", componentNames[parentAxisIndex_]); } return true; } - - -FUNCTION_H -bool pFlow::multiRotatingAxis::write -( - dictionary& dict -) const -{ - // if( !rotatingAxis::write(dict) ) return false; - - // if(parentAxisIndex_ == -1) - // { - // dict.add("rotationAxis", "none"); - // } - // else - // { - // word rotAxis; - // bool result = axisMotion->indexToName(parentAxisIndex_, rotAxis); - // dict.add("rotationAxis", rotAxis); - // } - - return true; -} diff --git a/src/MotionModel/entities/multiRotatingAxis/multiRotatingAxis.hpp b/src/MotionModel/entities/multiRotatingAxis/multiRotatingAxis.hpp index a7d30f6f..2ba4c5a0 100644 --- a/src/MotionModel/entities/multiRotatingAxis/multiRotatingAxis.hpp +++ b/src/MotionModel/entities/multiRotatingAxis/multiRotatingAxis.hpp @@ -24,7 +24,7 @@ Licence: #include "rotatingAxis.hpp" #include "KokkosTypes.hpp" - +#include "List.hpp" namespace pFlow { @@ -79,7 +79,7 @@ class multiRotatingAxis protected: /// This is device pointer to all axes - multiRotatingAxis* axisList_; + multiRotatingAxis* axisList_ = nullptr; /// Index of parent axis uint32 parentAxisIndex_ = static_cast(-1); @@ -98,13 +98,12 @@ public: FUNCTION_H explicit multiRotatingAxis(const dictionary& dict); - /// Empty with list of axes - FUNCTION_H - multiRotatingAxis(multiRotatingAxisMotion* axisMotion); - /// Construct from dictionary and list of axes FUNCTION_H - multiRotatingAxis(multiRotatingAxisMotion* axisMotion, const dictionary& dict); + multiRotatingAxis( + multiRotatingAxis* axisListPtr, + const wordList& componentsNames, + const dictionary& dict); /// Copy constructor FUNCTION_HD @@ -149,7 +148,7 @@ public: } auto parIndex = parentAxisIndex_; - while(parIndex != -1) + while(parIndex != static_cast(-1)) { auto& ax = axisList_[parIndex]; newP = pFlow::rotate(newP, ax, dt); @@ -163,12 +162,12 @@ public: INLINE_FUNCTION_HD bool hasParent()const { - return parentAxisIndex_ > -1; + return parentAxisIndex_ != static_cast(-1); } /// Return the index of parent axis INLINE_FUNCTION_HD - int32 parentAxisIndex()const + uint32 parentAxisIndex()const { return parentAxisIndex_; } @@ -207,15 +206,12 @@ public: /// Read from dictionary FUNCTION_H - bool read(multiRotatingAxisMotion* axisMotion, const dictionary& dict); + bool read(const dictionary& dict, const wordList& componentNames); /// Write to dictionary FUNCTION_H - bool write(const multiRotatingAxisMotion* axisMotion, dictionary& dict) const; + bool write(dictionary& dict, const wordList& componentNames) const; - /// Write to dictionary - FUNCTION_H - bool write(dictionary& dict) const; }; diff --git a/src/MotionModel/multiRotatingAxisMotion/multiRotatingAxisMotion.cpp b/src/MotionModel/multiRotatingAxisMotion/multiRotatingAxisMotion.cpp index b264f8b1..d58b2a4c 100644 --- a/src/MotionModel/multiRotatingAxisMotion/multiRotatingAxisMotion.cpp +++ b/src/MotionModel/multiRotatingAxisMotion/multiRotatingAxisMotion.cpp @@ -31,19 +31,179 @@ void pFlow::multiRotatingAxisMotion::impl_setTime Kokkos::parallel_for( "multiRotatingAxisMotion::impl_setTime", deviceRPolicyStatic(0, numComponents_), - LAMBDA_HD(uint32 i){ + LAMBDA_D(uint32 i){ motion[i].setTime(t); }); Kokkos::fence(); } +bool pFlow::multiRotatingAxisMotion::impl_move(uint32 iter, real t , real dt ) const +{ + + auto motion = motionComponents_.deviceViewAll(); + Kokkos::parallel_for( + "multiRotatingAxisMotion::impl_move", + deviceRPolicyStatic(0, numComponents_), + LAMBDA_D(uint32 i){ + motion[i].move(dt); + }); + Kokkos::fence(); + return true; +} + +bool pFlow::multiRotatingAxisMotion::impl_readDictionary(const dictionary &dict) +{ + auto modelName = dict.getVal("motionModel"); + + if(modelName != getTypeName()) + { + fatalErrorInFunction<< + " motionModel should be "<< Yellow_Text(getTypeName())<< + ", but found "<< Yellow_Text(modelName)<(axDict); axPtr) + { + rotationAxisNames.push_back( + axDict.getValOrSet("rotationAxis", "none")); + } + else + { + fatalErrorInFunction<< + "could not read rotating axis from "<< axDict.globalName()<; + + std::vector numRotAxis; + + for(size_t i=0; i< compNames.size(); i++) + { + word rotAxis = rotationAxisNames[i]; + int32 n=0; + while(rotAxis != "none") + { + n++; + if(int32 iAxis = compNames.findi(rotAxis) ; iAxis != -1) + { + rotAxis = rotationAxisNames[iAxis]; + }else + { + fatalErrorInFunction<< + "rotation axis name "<< rotAxis << "is does not exist!"< b.first; }; + + std::sort(numRotAxis.begin(), numRotAxis.end(), compareFunc); + Vector sortedIndex; + componentNames_.clear(); + + output< components("Read::modelComponent", + compNames.size()+1, + 0, + RESERVE()); + + + for(auto& compName: componentNames_) + { + + if(compName != "none") + { + auto& compDict = motionInfo.subDict(compName); + components.emplace_back( + motionComponents_.data(), + componentNames_, + compDict); + } + else + { + components.emplace_back(impl_noneComponent()); + } + + } + + motionComponents_.assign(components); + return true; +} + + +bool pFlow::multiRotatingAxisMotion::impl_writeDictionary +( + dictionary& dict +)const +{ + word modelName = "multiRotatingAxis"; + + dict.add("motionModel", modelName ); + + auto modelDictName = modelName+"Info"; + + auto& motionInfo = dict.subDictOrCreate(modelDictName); + auto hostComponents = motionComponents_.hostView(); + + ForAll(i, motionComponents_) + { + + auto& axDict = motionInfo.subDictOrCreate(componentNames_[i]); + if( !hostComponents[i].write(axDict, componentNames_)) + { + fatalErrorInFunction<< + " error in writing axis "<< componentNames_[i] << " to dicrionary " + << motionInfo.globalName()<impl_writeDictionary(newDict) || + if( !getModel().impl_writeDictionary(newDict) || !newDict.write(os)) { fatalErrorInFunction<< diff --git a/src/MotionModel/multiRotatingAxisMotion/multiRotatingAxisMotion.hpp b/src/MotionModel/multiRotatingAxisMotion/multiRotatingAxisMotion.hpp index 0874b86a..eba60bba 100644 --- a/src/MotionModel/multiRotatingAxisMotion/multiRotatingAxisMotion.hpp +++ b/src/MotionModel/multiRotatingAxisMotion/multiRotatingAxisMotion.hpp @@ -67,6 +67,8 @@ class multiRotatingAxisMotion { protected: + VectorSingle sortedIndex_; + friend MotionModel; /// is the geometry attached to this component moving @@ -76,10 +78,12 @@ protected: } /// move the component itself - bool impl_move(uint32, real, real)const - { - return true; - } + bool impl_move(uint32 iter, real t, real dt)const; + + /// Read from dictionary + bool impl_readDictionary(const dictionary& dict); + + bool impl_writeDictionary(dictionary& dict)const; public: @@ -97,7 +101,7 @@ public: bool write(iOstream& os, const IOPattern& iop)const override; static - auto noneComponent() + multiRotatingAxis noneComponent() { return multiRotatingAxis(); } From b7d47a65ad493f286145013826ec9593d7c584fb Mon Sep 17 00:00:00 2001 From: xuwenxuan Date: Thu, 20 Mar 2025 00:55:46 +0800 Subject: [PATCH 5/5] fix the cuda build error with multiRotatingAxis --- .../entities/multiRotatingAxis/multiRotatingAxis.hpp | 1 + .../multiRotatingAxisMotion/multiRotatingAxisMotion.cpp | 1 - .../multiRotatingAxisMotion/multiRotatingAxisMotion.hpp | 6 ++++-- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/MotionModel/entities/multiRotatingAxis/multiRotatingAxis.hpp b/src/MotionModel/entities/multiRotatingAxis/multiRotatingAxis.hpp index 2ba4c5a0..d39c6dbd 100644 --- a/src/MotionModel/entities/multiRotatingAxis/multiRotatingAxis.hpp +++ b/src/MotionModel/entities/multiRotatingAxis/multiRotatingAxis.hpp @@ -187,6 +187,7 @@ public: * It is assumed that the axis with deepest level (with more parrents) is * moved first and then the axis with lower levels. */ + INLINE_FUNCTION_HD void move(real dt) { diff --git a/src/MotionModel/multiRotatingAxisMotion/multiRotatingAxisMotion.cpp b/src/MotionModel/multiRotatingAxisMotion/multiRotatingAxisMotion.cpp index d58b2a4c..feed07a8 100644 --- a/src/MotionModel/multiRotatingAxisMotion/multiRotatingAxisMotion.cpp +++ b/src/MotionModel/multiRotatingAxisMotion/multiRotatingAxisMotion.cpp @@ -39,7 +39,6 @@ void pFlow::multiRotatingAxisMotion::impl_setTime bool pFlow::multiRotatingAxisMotion::impl_move(uint32 iter, real t , real dt ) const { - auto motion = motionComponents_.deviceViewAll(); Kokkos::parallel_for( "multiRotatingAxisMotion::impl_move", diff --git a/src/MotionModel/multiRotatingAxisMotion/multiRotatingAxisMotion.hpp b/src/MotionModel/multiRotatingAxisMotion/multiRotatingAxisMotion.hpp index eba60bba..7ab272c9 100644 --- a/src/MotionModel/multiRotatingAxisMotion/multiRotatingAxisMotion.hpp +++ b/src/MotionModel/multiRotatingAxisMotion/multiRotatingAxisMotion.hpp @@ -77,8 +77,7 @@ protected: return true; } - /// move the component itself - bool impl_move(uint32 iter, real t, real dt)const; + /// Read from dictionary bool impl_readDictionary(const dictionary& dict); @@ -108,6 +107,9 @@ public: // TODO: make this method protected void impl_setTime(uint32 iter, real t, real dt)const; + + /// move the component itself + bool impl_move(uint32 iter, real t, real dt)const; }; } // pFlow