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/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/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/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/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.cpp b/src/MotionModel/entities/multiRotatingAxis/multiRotatingAxis.cpp index 62733216..10e70aa7 100644 --- a/src/MotionModel/entities/multiRotatingAxis/multiRotatingAxis.cpp +++ b/src/MotionModel/entities/multiRotatingAxis/multiRotatingAxis.cpp @@ -22,31 +22,32 @@ Licence: #include "multiRotatingAxisMotion.hpp" #include "dictionary.hpp" +/// Construct from dictionary FUNCTION_H -pFlow::multiRotatingAxis::multiRotatingAxis -( - multiRotatingAxisMotion* axisMotion -) -{ - //axisList_ = axisMotion->getAxisListPtr(); -} +pFlow::multiRotatingAxis::multiRotatingAxis(const dictionary& dict) +: + rotatingAxis(dict) +{} + 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(); } @@ -54,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 { - parentAxisIndex_ = axisMotion-> nameToIndex(rotAxis); + 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_); - dict.add("rotationAxis", rotAxis); + dict.add("rotationAxis", componentNames[parentAxisIndex_]); } return true; } - diff --git a/src/MotionModel/entities/multiRotatingAxis/multiRotatingAxis.hpp b/src/MotionModel/entities/multiRotatingAxis/multiRotatingAxis.hpp index c79e87c8..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,26 +79,31 @@ class multiRotatingAxis protected: /// This is device pointer to all axes - multiRotatingAxis* axisList_; + multiRotatingAxis* axisList_ = nullptr; /// Index of parent axis - int32 parentAxisIndex_ = -1; + uint32 parentAxisIndex_ = static_cast(-1); public: + TypeInfoNV("multiRotatingAxis"); + // - Constructors /// Empty Constructor - INLINE_FUNCTION_HD - multiRotatingAxis(){} + FUNCTION_HD + multiRotatingAxis() = default; - /// Empty with list of axes + /// Construct from dictionary FUNCTION_H - multiRotatingAxis(multiRotatingAxisMotion* axisMotion); + explicit multiRotatingAxis(const dictionary& dict); /// 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 @@ -123,11 +128,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 @@ -143,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); @@ -157,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_; } @@ -201,11 +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; + }; diff --git a/src/MotionModel/multiRotatingAxisMotion/multiRotatingAxisMotion.cpp b/src/MotionModel/multiRotatingAxisMotion/multiRotatingAxisMotion.cpp index 360f1ee0..d58b2a4c 100644 --- a/src/MotionModel/multiRotatingAxisMotion/multiRotatingAxisMotion.cpp +++ b/src/MotionModel/multiRotatingAxisMotion/multiRotatingAxisMotion.cpp @@ -19,40 +19,64 @@ Licence: -----------------------------------------------------------------------------*/ #include "multiRotatingAxisMotion.hpp" -#include "dictionary.hpp" -#include "vocabs.hpp" - -bool pFlow::multiRotatingAxisMotion::readDictionary +void pFlow::multiRotatingAxisMotion::impl_setTime ( - const dictionary& dict -) + uint32 iter, + real t, + real dt +)const { + auto motion = motionComponents_.deviceViewAll(); + Kokkos::parallel_for( + "multiRotatingAxisMotion::impl_setTime", + deviceRPolicyStatic(0, numComponents_), + LAMBDA_D(uint32 i){ + motion[i].setTime(t); + }); + Kokkos::fence(); +} - auto motionModel = dict.getVal("motionModel"); +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; +} - if(motionModel != "multiRotatingAxisMotion") +bool pFlow::multiRotatingAxisMotion::impl_readDictionary(const dictionary &dict) +{ + auto modelName = dict.getVal("motionModel"); + + if(modelName != getTypeName()) { fatalErrorInFunction<< - " motionModel should be multiRotatingAxisMotion, but found " - << motionModel <())<< + ", but found "<< Yellow_Text(modelName)<(axDict); axPtr) { - rotationAxis.push_back( + rotationAxisNames.push_back( axDict.getValOrSet("rotationAxis", "none")); } else @@ -63,26 +87,26 @@ bool pFlow::multiRotatingAxisMotion::readDictionary } } - if( !axisNames.search("none") ) + if( !compNames.search("none") ) { - axisNames.push_back("none"); - rotationAxis.push_back("none"); + compNames.push_back("none"); + rotationAxisNames.push_back("none"); } using intPair = std::pair; std::vector numRotAxis; - for(size_t i=0; i< axisNames.size(); i++) + for(size_t i=0; i< compNames.size(); i++) { - word rotAxis = rotationAxis[i]; + word rotAxis = rotationAxisNames[i]; int32 n=0; while(rotAxis != "none") { n++; - if(int32 iAxis = axisNames.findi(rotAxis) ; iAxis != -1) + if(int32 iAxis = compNames.findi(rotAxis) ; iAxis != -1) { - rotAxis = rotationAxis[iAxis]; + rotAxis = rotationAxisNames[iAxis]; }else { fatalErrorInFunction<< @@ -98,60 +122,73 @@ bool pFlow::multiRotatingAxisMotion::readDictionary auto compareFunc = [](const intPair& a, const intPair& b) { return a.first > b.first; }; - algorithms::STD::sort(numRotAxis.data(), numRotAxis.size(), compareFunc); + std::sort(numRotAxis.begin(), numRotAxis.end(), compareFunc); + Vector sortedIndex; + componentNames_.clear(); - sortedIndex_.clear(); - axisName_.clear(); + output< components("Read::modelComponent", + compNames.size()+1, + 0, + RESERVE()); + + + for(auto& compName: componentNames_) { - if(aName != "none") + + if(compName != "none") { - auto& axDict = motionInfo.subDict(aName); - axis_.push_back( - multiRotatingAxis(this, axDict)); + auto& compDict = motionInfo.subDict(compName); + components.emplace_back( + motionComponents_.data(), + componentNames_, + compDict); } else { - axis_.push_back( - multiRotatingAxis(this)); + components.emplace_back(impl_noneComponent()); } } - return true; + motionComponents_.assign(components); + return true; } -bool pFlow::multiRotatingAxisMotion::writeDictionary + +bool pFlow::multiRotatingAxisMotion::impl_writeDictionary ( dictionary& dict )const { - dict.add("motionModel", "multiRotatingAxisMotion"); + word modelName = "multiRotatingAxis"; - auto& motionInfo = dict.subDictOrCreate("multiRotatingAxisMotionInfo"); - - ForAll(i, axis_) + dict.add("motionModel", modelName ); + + auto modelDictName = modelName+"Info"; + + auto& motionInfo = dict.subDictOrCreate(modelDictName); + auto hostComponents = motionComponents_.hostView(); + + ForAll(i, motionComponents_) { - auto& axDict = motionInfo.subDictOrCreate(axisName_[i]); - if( !axis_.hostVectorAll()[i].write(this,axDict)) + auto& axDict = motionInfo.subDictOrCreate(componentNames_[i]); + if( !hostComponents[i].write(axDict, componentNames_)) { fatalErrorInFunction<< - " error in writing axis "<< axisName_[i] << " to dicrionary " + " error in writing axis "<< componentNames_[i] << " to dicrionary " << motionInfo.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; + VectorSingle sortedIndex_; - /// Vector of multiRotaingAxis axes - axisVector_HD axis_; - - /// Sorted index based on number of parrents each axis ha - VectorDual sortedIndex_; + friend MotionModel; - /// List of axes names - wordList axisName_; + /// is the geometry attached to this component moving + bool impl_isMoving()const + { + return true; + } - /// Number of axes - label numAxis_= 0; + /// move the component itself + bool impl_move(uint32 iter, real t, real dt)const; - /// Read from a dictionary - bool readDictionary(const dictionary& dict); + /// Read from dictionary + bool impl_readDictionary(const dictionary& dict); - /// Write to a dictionary - bool writeDictionary(dictionary& dict)const; + bool impl_writeDictionary(dictionary& dict)const; 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 + multiRotatingAxis 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