45 #ifndef ROL_PINTVECTOR_H
46 #define ROL_PINTVECTOR_H
73 int myGlobalRank = -1;
79 assert(globalProcs % spatialProcs == 0);
81 int space = myGlobalRank / spatialProcs;
82 int time = myGlobalRank % spatialProcs;
122 template <
class Real>
127 const std::vector<Real> & std_source = *
dynamic_cast<const StdVector<Real>&
>(source).getVector();
132 MPI_Send(const_cast<Real*>(&std_source[0]),
int(std_source.size()),MPI_DOUBLE,rank,0,comm);
140 recv(comm,rank,dest);
145 std::vector<Real> & std_dest = *
dynamic_cast<StdVector<Real>&
>(dest).getVector();
150 MPI_Recv(&std_dest[0],
int(std_dest.size()),MPI_DOUBLE,rank,0,comm,MPI_STATUS_IGNORE);
155 std::vector<Real> & std_dest = *
dynamic_cast<StdVector<Real>&
>(dest).getVector();
156 std::vector<Real> buffer(std_dest.size(),0.0);
159 MPI_Comm_rank(comm, &myRank);
161 MPI_Recv(&buffer[0],
int(buffer.size()),MPI_DOUBLE,rank,0,comm,MPI_STATUS_IGNORE);
163 for(
size_t i=0;i<std_dest.size();i++)
164 std_dest[i] += buffer[i];
168 template <
class Real>
188 mutable Ptr<PinTVector<Real>>
dual_;
206 int stepsPerRank = steps / numRanks;
207 int remainder = steps % numRanks;
211 if(myRank<remainder) {
213 stepEnd_ = (myRank+1)*(stepsPerRank+1);
215 else if(myRank==remainder) {
217 stepEnd_ = (myRank+1)*stepsPerRank + myRank;
219 else if(myRank>remainder) {
221 stepEnd_ = (myRank+1)*stepsPerRank + remainder;
234 for(
int i=0;i<(int)
stencil_.size();i++) {
236 numLeft = std::max(numLeft,std::abs(
stencil_[i]));
238 numRight = std::max(numRight,
stencil_[i]);
243 for(
int i=0;i<numLeft;i++) {
250 for(
int i=0;i<numRight;i++) {
280 const std::vector<int> &
stencil)
291 const std::vector<int> &
stencil)
297 vectorComm_ = makePtr<PinTVectorCommunication<Real>>();
302 std::vector<Ptr<Vector<Real>>> stepVectors;
306 for(
int i=0;i<(int)stepVectors.size();i++) {
311 stepVectors_ = makePtr<PartitionedVector<Real>>(stepVectors);
368 if(-leftCount <= i && i < 0) {
403 if(-leftCount <= i && i < 0)
435 recvFromRight =
false;
436 recvFromLeft =
false;
445 for(std::size_t i=0;i<
stencil_.size();i++) {
458 for(std::size_t i=0;i<
stencil_.size();i++) {
491 for(std::size_t i=0;i<
stencil_.size();i++) {
506 for(std::size_t i=0;i<
stencil_.size();i++) {
532 const PinTVector &xs =
dynamic_cast<const PinTVector&
>(x);
563 const PinTVector &xs =
dynamic_cast<const PinTVector&
>(x);
573 MPI_Allreduce(&subdot,&dot,1,MPI_DOUBLE,MPI_SUM,
communicators_->getParentCommunicator());
587 return std::sqrt(this->
dot(*
this));
598 virtual ROL::Ptr<Vector<Real>>
clone()
const
600 return makePtr<PinTVector<Real>>(*this);
603 virtual void print( std::ostream &outStream)
const override
608 virtual void applyUnary(
const Elementwise::UnaryFunction<Real> &f )
override {
624 const PinTVector &xs =
dynamic_cast<const PinTVector&
>(x);
642 const PinTVector &xs =
dynamic_cast<const PinTVector&
>(x);
virtual ROL::Ptr< Vector< Real > > clone() const
Clone to make a new (uninitialized) vector.
virtual void set(const Vector< Real > &x) override
Set where .
Ptr< Vector< Real > > getVectorPtr(int i) const
virtual int dimension() const
Return dimension of the vector space.
void allocateBoundaryExchangeVectors()
std::vector< Ptr< Vector< Real > > > leftVectors_
std::vector< Ptr< Vector< Real > > > rightVectors_
virtual Real dot(const Vector< Real > &x) const
Compute where .
void boundaryExchange(ESendRecv send_recv=SEND_AND_RECV) const
Exchange unknowns with neighboring processors.
Ptr< const PinTCommunicators > communicators_
int numOwnedSteps() const
std::vector< int > stencil_
virtual void zeroAll()
Zeros all entries of the vector, including boundary exchange fields.
virtual void zero()
Set to zero vector.
Defines the linear algebra or vector space interface.
const std::vector< int > & stencil() const
void recv(MPI_Comm comm, int rank, Vector< Real > &dest) const
void initialize(const Ptr< const PinTCommunicators > &comm, const Ptr< Vector< Real >> &localVector, int steps, const std::vector< int > &stencil)
void recvSumInto(MPI_Comm comm, int rank, Vector< Real > &dest) const
Ptr< PartitionedVector< Real > > stepVectors_
void recv(MPI_Comm comm, int rank, Vector< Real > &dest, bool sumInto) const
Ptr< PinTVector< Real > > dual_
int numOwnedVectors() const
Defines a parallel in time vector.
PinTVector(const PinTVector &v)
virtual void scale(const Real alpha)
Compute where .
bool isValidIndex(int i) const
Determine if an index is valid including the stencil.
Ptr< PinTVectorCommunication< Real > > vectorComm_
void boundaryExchangeSumInto()
Exchange unknowns with neighboring processors using summation.
void computeStepStartEnd(int steps)
virtual void applyUnary(const Elementwise::UnaryFunction< Real > &f) override
virtual Real norm() const
Returns where .
PinTVector(const Ptr< const PinTCommunicators > &comm, const Ptr< Vector< Real >> &localVector, int steps, const std::vector< int > &stencil)
Ptr< Vector< Real > > localVector_
Ptr< Vector< Real > > getRemoteBufferPtr(int i) const
virtual void axpy(const Real alpha, const Vector< Real > &x) override
Compute where .
MPI_Comm getTimeCommunicator() const
const PinTCommunicators & communicators() const
void send(MPI_Comm comm, int rank, Vector< Real > &source) const
virtual void plus(const Vector< Real > &x)
Compute , where .
MPI_Comm getSpaceCommunicator() const
MPI_Comm getParentCommunicator() const
PinTCommunicators(MPI_Comm parent, int spatialProcs)
virtual void print(std::ostream &outStream) const override