Example #1
0
void TwoParticleGF::compute(bool clear, const boost::mpi::communicator & comm)
{
    if (Status < Prepared) throw (exStatusMismatch());
    if (Status >= Computed) return;
    if (!Vanishing) {
        // Create a "skeleton" class with pointers to part that can call a compute method
        pMPI::mpi_skel<ComputeAndClearWrap> skel;
        bool fill_container = m_data_.NBosonic() > 0 && m_data_.NFermionic() > 0; 
        skel.parts.reserve(parts.size());
        for (size_t i=0; i<parts.size(); i++) { 
            skel.parts.push_back(ComputeAndClearWrap(&m_data_, parts[i], clear, fill_container, 1));
            };
        std::map<pMPI::JobId, pMPI::WorkerId> job_map = skel.run(comm, true); // actual running - very costly
        int rank = comm.rank();
        int comm_size = comm.size(); 

        // Start distributing data
        //DEBUG(comm.rank() << getIndex(0) << getIndex(1) << getIndex(2) << getIndex(3) << " Start distributing data");
        comm.barrier();
         

        if (!clear) { 
            for (size_t p = 0; p<parts.size(); p++) {
                boost::mpi::broadcast(comm, parts[p]->NonResonantTerms, job_map[p]);
                boost::mpi::broadcast(comm, parts[p]->ResonantTerms, job_map[p]);
                if (rank == job_map[p]) { 
                    parts[p]->Status = TwoParticleGFPart::Computed;
                     };
                };
            comm.barrier();
        }
    };
    Status = Computed;
}
Example #2
0
BlockNumber FieldOperator::getLeftIndex(BlockNumber RightIndex) const
{
    if (Status < Prepared) { ERROR("FieldOperator is not prepared yet."); throw (exStatusMismatch()); }
    
    BlocksBimap::right_const_iterator it =  LeftRightBlocks.right.find(RightIndex);
    return (it != LeftRightBlocks.right.end()) ? it->second : ERROR_BLOCK_NUMBER;
}
Example #3
0
bool HamiltonianPart::reduce(RealType ActualCutoff)
{
    if ( Status < Computed ) throw (exStatusMismatch());
    InnerQuantumState counter=0;
    for (counter=0; (counter< (unsigned int)Eigenvalues.size() && Eigenvalues[counter]<=ActualCutoff); ++counter){};
    std::cout << "Left " << counter << " eigenvalues : " << std::endl;
    if (counter) 
	{std::cout << Eigenvalues.head(counter) << std::endl << "_________" << std::endl;
	Eigenvalues = Eigenvalues.head(counter);
	H = H.topLeftCorner(counter,counter);
	return true;
    }
    else return false;
}
Example #4
0
void FieldOperator::compute(const boost::mpi::communicator& comm)
{
    if (Status < Prepared) throw (exStatusMismatch());
    if (Status >= Computed) return;

    if (!comm.rank()) INFO_NONEWLINE("Computing " << *O << " in eigenbasis of the Hamiltonian: ");
/*

    pMPI::mpi_skel<pMPI::ComputeWrap<FieldOperatorPart>> skel;
    skel.parts.resize(parts.size());
    for (size_t i=0; i<parts.size(); i++) { skel.parts[i] = pMPI::ComputeWrap<FieldOperatorPart>(*parts[i]);};
    std::map<pMPI::JobId, pMPI::WorkerId> job_map = skel.run(comm, true); // actual running - very costly

    int rank = comm.rank();
    int comm_size = comm.size(); 

    // Start distributing data
    comm.barrier();
         
    for (size_t p = 0; p<parts.size(); p++) {

        int nelem = 0;
        if (rank == job_map[p]) nelem = parts[p]->elementsColMajor.nonZeros(); 
        boost::mpi::broadcast(comm, nelem, job_map[p]);
        auto data = parts[p]->elementsColMajor.data(); // Eigen::internal::CompressedStorage 
        auto& value_start = data.value(0);
        auto& index_start = data.index(0);
        if (comm.rank()) parts[p]->elementsColMajor.resize(nelem);
        exit(0);

        //boost::mpi::broadcast(comm, parts[p]->elementsColMajor.data(), nelem, job_map[p]);
        if (rank == job_map[p]) { 
                parts[p]->Status = FieldOperatorPart::Computed;
             };
        };
    comm.barrier();
*/
    size_t Size = parts.size();
    for (size_t BlockIn = 0; BlockIn < Size; BlockIn++){
        INFO_NONEWLINE( (int) ((1.0*BlockIn/Size) * 100 ) << "  " << std::flush);
        parts[BlockIn]->compute();
    };
    INFO("");
    Status = Computed;
}
Example #5
0
Symmetrizer::QuantumNumbers StatesClassification::getQuantumNumbers(BlockNumber in) const
{
    if ( Status < Computed ) { ERROR("StatesClassification is not computed yet."); throw (exStatusMismatch()); };
    if (BlockToQuantum.count(in))
        return BlockToQuantum.find(in)->second;
    throw (exWrongState());
    return BlockToQuantum.find(0)->second;
}
Example #6
0
const FockState StatesClassification::getFockState( QuantumNumbers in, InnerQuantumState m) const
{
    if ( Status < Computed ) { ERROR("StatesClassification is not computed yet."); throw (exStatusMismatch()); };
    return getFockState(getBlockNumber(in),m);
}
Example #7
0
const FockState StatesClassification::getFockState( BlockNumber in, InnerQuantumState m) const
{  
    if ( Status < Computed ) { ERROR("StatesClassification is not computed yet."); throw (exStatusMismatch()); };
    if (int(in) < StatesContainer.size()) 
        if ( m < StatesContainer[in].size())
            return StatesContainer[in][m];
    ERROR("Couldn't find state numbered " << m << " in block " << in);
    throw (exWrongState());
    return ERROR_FOCK_STATE;
}
Example #8
0
const size_t StatesClassification::getBlockSize( BlockNumber in ) const
{
    if ( Status < Computed ) { ERROR("StatesClassification is not computed yet."); throw (exStatusMismatch()); };
    return this->getFockStates(in).size();
}
Example #9
0
const std::vector<FockState>& StatesClassification::getFockStates( QuantumNumbers in ) const
{
    if ( Status < Computed ) { ERROR("StatesClassification is not computed yet."); throw (exStatusMismatch()); };
    std::map<QuantumNumbers,BlockNumber>::const_iterator it=QuantumToBlock.find(in);
    if (it != QuantumToBlock.end())
        return this->getFockStates(it->second);
    else
        throw (exWrongState());
}
Example #10
0
FieldOperatorPart& FieldOperator::getPartFromLeftIndex(const QuantumNumbers& in) const
{
    if (Status < Prepared) { ERROR("FieldOperator is not prepared yet."); throw (exStatusMismatch()); }
    return *parts[mapPartsFromLeft.find(S.getBlockNumber(in))->second];
}
Example #11
0
const InnerQuantumState StatesClassification::getInnerState(FockState state) const
{
    if ( Status < Computed ) { ERROR("StatesClassification is not computed yet."); throw (exStatusMismatch()); };
    if ( state.to_ulong() > StateSize ) { throw (exWrongState()); return StateSize; };
    BlockNumber block = this->getBlockNumber(state);
    for (InnerQuantumState n=0; n<StatesContainer[block].size(); n++ )
      {    
          if ( StatesContainer[block][n]== state) { return n; } 
      }
    throw (exWrongState());
    return StateSize;
}
Example #12
0
RealType HamiltonianPart::getMinimumEigenvalue() const
{
    if ( Status < Computed ) throw (exStatusMismatch());
    return Eigenvalues.minCoeff();
}
Example #13
0
VectorType HamiltonianPart::getEigenState(InnerQuantumState state) const
{
    if ( Status < Computed ) throw (exStatusMismatch());
    return H.col(state);
}
Example #14
0
const RealVectorType& HamiltonianPart::getEigenValues() const
{
    if ( Status < Computed ) throw (exStatusMismatch());
    return Eigenvalues;
}
Example #15
0
RealType HamiltonianPart::getEigenValue(InnerQuantumState state) const // return Eigenvalues(state)
{
    if ( Status < Computed ) throw (exStatusMismatch());
    return Eigenvalues(state);
}
Example #16
0
BlockNumber StatesClassification::getBlockNumber(QuantumNumbers in) const
{
    if ( Status < Computed ) { ERROR("StatesClassification is not computed yet."); throw (exStatusMismatch()); };
    return (QuantumToBlock.count(in))?QuantumToBlock.find(in)->second:ERROR_BLOCK_NUMBER;
}
Example #17
0
FieldOperator::BlocksBimap const& FieldOperator::getBlockMapping() const
{
    if (Status < Prepared) { ERROR("FieldOperator is not prepared yet."); throw (exStatusMismatch()); }
    return LeftRightBlocks;
}
Example #18
0
BlockNumber StatesClassification::getBlockNumber(QuantumState in) const
{
    if ( Status < Computed ) { ERROR("StatesClassification is not computed yet."); throw (exStatusMismatch()); };
    if ( in > StateSize ) { throw exWrongState(); };
    return StateBlockIndex[in];
}
Example #19
0
const std::vector<FockState>& StatesClassification::getFockStates( BlockNumber in ) const
{
    if ( Status < Computed ) { ERROR("StatesClassification is not computed yet."); throw (exStatusMismatch()); };
    return StatesContainer[in];
}
Example #20
0
const InnerQuantumState StatesClassification::getInnerState(QuantumState state) const
{
    if ( Status < Computed ) { ERROR("StatesClassification is not computed yet."); throw (exStatusMismatch()); };
    if ( state > StateSize ) { throw (exWrongState()); return StateSize; };
    return this->getInnerState(FockState(IndexSize, state));
}
Example #21
0
FieldOperatorPart& FieldOperator::getPartFromRightIndex(BlockNumber in) const
{
    if (Status < Prepared) { ERROR("FieldOperator is not prepared yet."); throw (exStatusMismatch()); }
    return *parts[mapPartsFromRight.find(in)->second];
}