LRTwoBodyJastrow::ValueType LRTwoBodyJastrow::logRatio(ParticleSet& P, int iat, ParticleSet::ParticleGradient_t& dG, ParticleSet::ParticleLaplacian_t& dL) { NeedToRestore=true; const KContainer::VContainer_t& kpts(P.SK->KLists.kpts_cart); const KContainer::SContainer_t& ksq(P.SK->KLists.ksq); const Vector<ComplexType>& eikr1(P.SK->eikr_new); const Vector<ComplexType>& del_eikr(P.SK->delta_eikr); //add the difference Rhok += del_eikr; curVal=0.0; curLap=0.0; curGrad=0.0; for(int jat=0;jat<NumPtcls; jat++) { if(iat==jat) { for(int ki=0; ki<NumKpts; ki++) { //ComplexType rhok_new(Rhok[ki]+del_eikr[ki]); //ComplexType skp((Fk[ki]*conj(eikr1[ki])*rhok_new)); ComplexType skp((Fk[ki]*conj(eikr1[ki])*Rhok[ki])); #if defined(QMC_COMPLEX) curVal += skp; curGrad += ComplexType(skp.imag(),-skp.real())*kpts[ki]; curLap += ksq[ki]*(Fk[ki]-skp); #else curVal += skp.real(); curGrad += kpts[ki]*skp.imag(); curLap += ksq[ki]*(Fk[ki]-skp.real()); #endif } } else { const ComplexType* restrict eikrj(P.SK->eikr[jat]); GradType g; ValueType l(0.0), v(0.0); for(int ki=0; ki<NumKpts; ki++) { ComplexType skp(Fk[ki]*del_eikr[ki]*conj(eikrj[ki])); GradType dg(skp.imag()*kpts[ki]); ValueType dl(skp.real()*ksq[ki]); v += skp.real(); g +=dg; l -= dl; //dG[jat] += Fk[ki]*skp.imag()*kpts[ki]; //dL[jat] -= Fk[ki]*skp.real()*ksq[ki]; } offU[jat]=v; offdU[jat]=g; offd2U[jat]=l; dG[jat] += g; dL[jat] += l; } } dG[iat] += offdU[iat] = curGrad-dU[iat]; dL[iat] += offd2U[iat] = curLap-d2U[iat]; return offU[iat] = curVal-U[iat]; }
void tst_QSet::intersect_complexType() { QFETCH(int, lhsSize); QFETCH(int, rhsSize); QFETCH(int, intersectSize); QSet<ComplexType> lhs; for (int i = 0; i < lhsSize; ++i) lhs.insert(ComplexType(i)); QSet<ComplexType> rhs; const int start = lhsSize - intersectSize; for (int i = start; i < start + rhsSize; ++i) rhs.insert(ComplexType(i)); QBENCHMARK { lhs.intersect(rhs); } }
/// get an element /// @param i :: The element index ComplexType ComplexVector::get(size_t i) const { if (i < m_vector->size) { auto value = gsl_vector_complex_get(m_vector, i); return ComplexType(GSL_REAL(value), GSL_IMAG(value)); } std::stringstream errmsg; errmsg << "ComplexVector index = " << i << " is out of range = " << m_vector->size << " in ComplexVector.get()"; throw std::out_of_range(errmsg.str()); }
ComplexType HDF5IO::loadComplex(const std::string& GroupName, const std::string& Name) { try{ H5::CompType ComplexDataType = this->openCompType("complex"); H5::Group FG = getGroup( GroupName ); H5::DataSet DataSet = FG.openDataSet(Name.c_str()); ComplexType C; RealType RealImag[2]; DataSet.read(RealImag, ComplexDataType); FG.close(); return ComplexType(RealImag[0],RealImag[1]); }catch( H5::GroupIException not_found_error ){ RUNTIME_ERROR("No dataset found in loadComplex. "); } }
LRTwoBodyJastrow::ValueType LRTwoBodyJastrow::evaluateLog(ParticleSet& P, ParticleSet::ParticleGradient_t& G, ParticleSet::ParticleLaplacian_t& L) { Rhok=0.0; for(int spec1=0; spec1<NumSpecies; spec1++) { const ComplexType* restrict rhok(P.SK->rhok[spec1]); for(int ki=0; ki<NumKpts; ki++) { Rhok[ki] += rhok[ki]; } } const KContainer::VContainer_t& kpts(P.SK->KLists.kpts_cart); const KContainer::SContainer_t& ksq(P.SK->KLists.ksq); ValueType sum(0.0); for(int iat=0; iat<NumPtcls; iat++) { ValueType res(0.0),l(0.0); GradType g; const ComplexType* restrict eikr(P.SK->eikr[iat]); for(int ki=0; ki<NumKpts; ki++) { ComplexType skp((Fk[ki]*conj(eikr[ki])*Rhok[ki])); #if defined(QMC_COMPLEX) res += skp; l += ksq[ki]*(Fk[ki]-skp); g += ComplexType(skp.imag(),-skp.real())*kpts[ki]; #else res += skp.real(); g += kpts[ki]*skp.imag(); l += ksq[ki]*(Fk[ki]-skp.real()); #endif } sum+=(U[iat]=res); G[iat]+=(dU[iat]=g); L[iat]+=(d2U[iat]=l); } return sum*0.5; }
int main(int argc, char const *argv[]) { Eigen::setNbThreads(NumCores); #ifdef MKL mkl_set_num_threads(NumCores); #endif INFO("Eigen3 uses " << Eigen::nbThreads() << " threads."); int L; RealType J12ratio; int OBC; int N; RealType Uin, phi; std::vector<RealType> Vin; LoadParameters( "conf.h5", L, J12ratio, OBC, N, Uin, Vin, phi); HDF5IO file("BSSH.h5"); // const int L = 5; // const bool OBC = true; // const RealType J12ratio = 0.010e0; INFO("Build Lattice - "); std::vector<ComplexType> J; if ( OBC ){ J = std::vector<ComplexType>(L - 1, ComplexType(1.0, 0.0)); for (size_t cnt = 0; cnt < L-1; cnt+=2) { J.at(cnt) *= J12ratio; } } else{ J = std::vector<ComplexType>(L, ComplexType(1.0, 0.0)); for (size_t cnt = 0; cnt < L; cnt+=2) { J.at(cnt) *= J12ratio; } if ( std::abs(phi) > 1.0e-10 ){ J.at(L-1) *= exp( ComplexType(0.0e0, 1.0e0) * phi ); // INFO(exp( ComplexType(0.0e0, 1.0e0) * phi )); } } for ( auto &val : J ){ INFO_NONEWLINE(val << " "); } INFO(""); const std::vector< Node<ComplexType>* > lattice = NN_1D_Chain(L, J, OBC); file.saveNumber("1DChain", "L", L); file.saveNumber("1DChain", "U", Uin); file.saveStdVector("1DChain", "J", J); for ( auto < : lattice ){ if ( !(lt->VerifySite()) ) RUNTIME_ERROR("Wrong lattice setup!"); } INFO("DONE!"); INFO("Build Basis - "); // int N1 = (L+1)/2; Basis B1(L, N); B1.Boson(); // std::vector< std::vector<int> > st = B1.getBStates(); // std::vector< RealType > tg = B1.getBTags(); // for (size_t cnt = 0; cnt < tg.size(); cnt++) { // INFO_NONEWLINE( std::setw(3) << cnt << " - "); // for (auto &j : st.at(cnt)){ // INFO_NONEWLINE(j << " "); // } // INFO("- " << tg.at(cnt)); // } file.saveNumber("1DChain", "N", N); // file.saveStdVector("Basis", "States", st); // file.saveStdVector("Basis", "Tags", tg); INFO("DONE!"); INFO_NONEWLINE("Build Hamiltonian - "); std::vector<Basis> Bases; Bases.push_back(B1); Hamiltonian<ComplexType> ham( Bases ); std::vector< std::vector<ComplexType> > Vloc; std::vector<ComplexType> Vtmp;//(L, 1.0); for ( RealType &val : Vin ){ Vtmp.push_back((ComplexType)val); } Vloc.push_back(Vtmp); std::vector< std::vector<ComplexType> > Uloc; // std::vector<ComplexType> Utmp(L, ComplexType(10.0e0, 0.0e0) ); std::vector<ComplexType> Utmp(L, (ComplexType)Uin); Uloc.push_back(Utmp); ham.BuildLocalHamiltonian(Vloc, Uloc, Bases); ham.BuildHoppingHamiltonian(Bases, lattice); ham.BuildTotalHamiltonian(); INFO("DONE!"); INFO_NONEWLINE("Diagonalize Hamiltonian - "); std::vector<RealType> Val; Hamiltonian<ComplexType>::VectorType Vec; ham.eigh(Val, Vec); INFO("GS energy = " << Val.at(0)); file.saveVector("GS", "EVec", Vec); file.saveStdVector("GS", "EVal", Val); INFO("DONE!"); std::vector<ComplexType> Nbi = Ni( Bases, Vec ); for (auto &n : Nbi ){ INFO( n << " " ); } ComplexMatrixType Nij = NiNj( Bases, Vec ); INFO(Nij); INFO(Nij.diagonal()); file.saveStdVector("Obs", "Nb", Nbi); file.saveMatrix("Obs", "Nij", Nij); return 0; }
int main(int argc, char const *argv[]) { Eigen::setNbThreads(NumCores); #ifdef MKL mkl_set_num_threads(NumCores); #endif INFO("Eigen3 uses " << Eigen::nbThreads() << " threads."); int L; RealType J12ratio; int OBC; int N1, N2; int dynamics, Tsteps; RealType Uin, phi, dt; std::vector<RealType> Vin; LoadParameters( "conf.h5", L, J12ratio, OBC, N1, N2, Uin, Vin, phi, dynamics, Tsteps, dt); HDF5IO *file = new HDF5IO("FSSH.h5"); // const int L = 5; // const bool OBC = true; // const RealType J12ratio = 0.010e0; INFO("Build Lattice - "); std::vector<DT> J; if ( OBC ){ // J = std::vector<DT>(L - 1, 0.0);// NOTE: Atomic limit testing J = std::vector<DT>(L - 1, 1.0); if ( J12ratio > 1.0e0 ) { for (size_t cnt = 1; cnt < L-1; cnt+=2) { J.at(cnt) /= J12ratio; } } else{ for (size_t cnt = 0; cnt < L-1; cnt+=2) { J.at(cnt) *= J12ratio; } } } else{ J = std::vector<DT>(L, 1.0); if ( J12ratio > 1.0e0 ) { for (size_t cnt = 1; cnt < L; cnt+=2) { J.at(cnt) /= J12ratio; } } else{ for (size_t cnt = 0; cnt < L; cnt+=2) { J.at(cnt) *= J12ratio; } } #ifndef DTYPE if ( std::abs(phi) > 1.0e-10 ){ J.at(L-1) *= exp( DT(0.0, 1.0) * phi ); } #endif } for ( auto &val : J ){ INFO_NONEWLINE(val << " "); } INFO(""); const std::vector< Node<DT>* > lattice = NN_1D_Chain(L, J, OBC); file->saveNumber("1DChain", "L", L); file->saveStdVector("1DChain", "J", J); for ( auto < : lattice ){ if ( !(lt->VerifySite()) ) RUNTIME_ERROR("Wrong lattice setup!"); } INFO("DONE!"); INFO("Build Basis - "); // int N1 = (L+1)/2; Basis F1(L, N1, true); F1.Fermion(); std::vector<int> st1 = F1.getFStates(); std::vector<size_t> tg1 = F1.getFTags(); // for (size_t cnt = 0; cnt < st1.size(); cnt++) { // INFO_NONEWLINE( std::setw(3) << st1.at(cnt) << " - "); // F1.printFermionBasis(st1.at(cnt)); // INFO("- " << tg1.at(st1.at(cnt))); // } // int N2 = (L-1)/2; Basis F2(L, N2, true); F2.Fermion(); std::vector<int> st2 = F2.getFStates(); std::vector<size_t> tg2 = F2.getFTags(); // for (size_t cnt = 0; cnt < st2.size(); cnt++) { // INFO_NONEWLINE( std::setw(3) << st2.at(cnt) << " - "); // F2.printFermionBasis(st2.at(cnt)); // INFO("- " << tg2.at(st2.at(cnt))); // } file->saveNumber("Basis", "N1", N1); file->saveStdVector("Basis", "F1States", st1); file->saveStdVector("Basis", "F1Tags", tg1); file->saveNumber("Basis", "N2", N2); file->saveStdVector("Basis", "F2States", st2); file->saveStdVector("Basis", "F2Tags", tg2); INFO("DONE!"); INFO_NONEWLINE("Build Hamiltonian - "); std::vector<Basis> Bases; Bases.push_back(F1); Bases.push_back(F2); Hamiltonian<DT> ham( Bases ); std::vector< std::vector<DT> > Vloc; std::vector<DT> Vtmp;//(L, 1.0); for ( RealType &val : Vin ){ Vtmp.push_back((DT)val); } Vloc.push_back(Vtmp); Vloc.push_back(Vtmp); std::vector< std::vector<DT> > Uloc; // std::vector<DT> Utmp(L, DT(10.0e0, 0.0e0) ); std::vector<DT> Utmp(L, (DT)Uin); Uloc.push_back(Utmp); Uloc.push_back(Utmp); ham.BuildLocalHamiltonian(Vloc, Uloc, Bases); INFO(" - BuildLocalHamiltonian DONE!"); ham.BuildHoppingHamiltonian(Bases, lattice); INFO(" - BuildHoppingHamiltonian DONE!"); ham.BuildTotalHamiltonian(); INFO("DONE!"); INFO_NONEWLINE("Diagonalize Hamiltonian - "); std::vector<RealType> Val; Hamiltonian<DT>::VectorType Vec; ham.eigh(Val, Vec); INFO("GS energy = " << Val.at(0)); file->saveVector("GS", "EVec", Vec); file->saveStdVector("GS", "EVal", Val); INFO("DONE!"); std::vector< DTV > Nfi = Ni( Bases, Vec, ham ); INFO(" Up Spin - "); INFO(Nfi.at(0)); INFO(" Down Spin - "); INFO(Nfi.at(1)); INFO(" N_i - "); DTV Niall = Nfi.at(0) + Nfi.at(1); INFO(Niall); DTM Nud = NupNdn( Bases, Vec, ham ); INFO(" Correlation NupNdn"); INFO(Nud); DTM Nuu = NupNup( Bases, Vec, ham ); INFO(" Correlation NupNup"); INFO(Nuu); DTM Ndd = NdnNdn( Bases, Vec, ham ); INFO(" Correlation NdnNdn"); INFO(Ndd); INFO(" N_i^2 - "); DTM Ni2 = Nuu.diagonal() + Ndd.diagonal() + 2.0e0 * Nud.diagonal(); INFO(Ni2); file->saveVector("Obs", "Nup", Nfi.at(0)); file->saveVector("Obs", "Ndn", Nfi.at(1)); file->saveMatrix("Obs", "NupNdn", Nud); file->saveMatrix("Obs", "NupNup", Nuu); file->saveMatrix("Obs", "NdnNdn", Ndd); delete file; if ( dynamics ){ ComplexType Prefactor = ComplexType(0.0, -1.0e0*dt);/* NOTE: hbar = 1 */ std::cout << "Begin dynamics......" << std::endl; std::cout << "Cut the boundary." << std::endl; J.pop_back(); std::vector< Node<DT>* > lattice2 = NN_1D_Chain(L, J, true);// cut to open ham.BuildHoppingHamiltonian(Bases, lattice2); INFO(" - Update Hopping Hamiltonian DONE!"); ham.BuildTotalHamiltonian(); INFO(" - Update Total Hamiltonian DONE!"); for (size_t cntT = 1; cntT <= Tsteps; cntT++) { ham.expH(Prefactor, Vec); if ( cntT % 2 == 0 ){ HDF5IO file2("DYN.h5"); std::string gname = "Obs-"; gname.append(std::to_string((unsigned long long)cntT)); gname.append("/"); Nfi = Ni( Bases, Vec, ham ); Nud = NupNdn( Bases, Vec, ham ); Nuu = NupNup( Bases, Vec, ham ); Ndd = NdnNdn( Bases, Vec, ham ); file2.saveVector(gname, "Nup", Nfi.at(0)); file2.saveVector(gname, "Ndn", Nfi.at(1)); file2.saveMatrix(gname, "NupNdn", Nud); file2.saveMatrix(gname, "NupNup", Nuu); file2.saveMatrix(gname, "NdnNdn", Ndd); } } } return 0; }
/// Calculate the crystal field eigensystem /// @param en :: Output eigenvalues. /// @param wf :: Output eigenvectors. /// @param nre :: Output ion code. void CrystalFieldPeaksBase::calculateEigenSystem(DoubleFortranVector &en, ComplexFortranMatrix &wf, int &nre) const { auto ion = getAttribute("Ion").asString(); if (ion.empty()) { throw std::runtime_error("Ion name must be specified."); } auto ionIter = ION_2_NRE.find(ion); if (ionIter == ION_2_NRE.end()) { throw std::runtime_error("Unknown ion name passed to CrystalFieldPeaks."); } nre = ionIter->second; DoubleFortranVector bmol(1, 3); bmol(1) = getParameter("BmolX"); bmol(2) = getParameter("BmolY"); bmol(3) = getParameter("BmolZ"); DoubleFortranVector bext(1, 3); bext(1) = getParameter("BextX"); bext(2) = getParameter("BextY"); bext(3) = getParameter("BextZ"); double B20 = getParameter("B20"); double B21 = getParameter("B21"); double B22 = getParameter("B22"); double B40 = getParameter("B40"); double B41 = getParameter("B41"); double B42 = getParameter("B42"); double B43 = getParameter("B43"); double B44 = getParameter("B44"); double B60 = getParameter("B60"); double B61 = getParameter("B61"); double B62 = getParameter("B62"); double B63 = getParameter("B63"); double B64 = getParameter("B64"); double B65 = getParameter("B65"); double B66 = getParameter("B66"); double IB21 = getParameter("IB21"); double IB22 = getParameter("IB22"); double IB41 = getParameter("IB41"); double IB42 = getParameter("IB42"); double IB43 = getParameter("IB43"); double IB44 = getParameter("IB44"); double IB61 = getParameter("IB61"); double IB62 = getParameter("IB62"); double IB63 = getParameter("IB63"); double IB64 = getParameter("IB64"); double IB65 = getParameter("IB65"); double IB66 = getParameter("IB66"); ComplexFortranMatrix bkq(0, 6, 0, 6); bkq(2, 0) = ComplexType(B20, 0.0); bkq(2, 1) = ComplexType(B21, IB21); bkq(2, 2) = ComplexType(B22, IB22); bkq(4, 0) = ComplexType(B40, 0.0); bkq(4, 1) = ComplexType(B41, IB41); bkq(4, 2) = ComplexType(B42, IB42); bkq(4, 3) = ComplexType(B43, IB43); bkq(4, 4) = ComplexType(B44, IB44); bkq(6, 0) = ComplexType(B60, 0.0); bkq(6, 1) = ComplexType(B61, IB61); bkq(6, 2) = ComplexType(B62, IB62); bkq(6, 3) = ComplexType(B63, IB63); bkq(6, 4) = ComplexType(B64, IB64); bkq(6, 5) = ComplexType(B65, IB65); bkq(6, 6) = ComplexType(B66, IB66); ComplexFortranMatrix ham; calculateEigensystem(en, wf, ham, nre, bmol, bext, bkq); // MaxPeakCount is a read-only "mutable" attribute. const_cast<CrystalFieldPeaksBase *>(this) ->setAttributeValue("MaxPeakCount", static_cast<int>(en.size())); }