Skip to content

Commit

Permalink
simple reader eliminated, using iosimple
Browse files Browse the repository at this point in the history
  • Loading branch information
g1257 committed Jul 20, 2010
1 parent 038ae4b commit afe5f94
Show file tree
Hide file tree
Showing 10 changed files with 268 additions and 171 deletions.
67 changes: 38 additions & 29 deletions src/Engine/GeometryDirection.h
Original file line number Diff line number Diff line change
Expand Up @@ -98,8 +98,8 @@ namespace Dmrg {
size_t geometryKind,size_t leg,const std::string& options)
: dirId_(dirId),linSize_(linSize),geometryKind_(geometryKind),leg_(leg)
{
size_t n=0;
checkOptions(n,options);
size_t n = getVectorSize(options);
std::cerr<<"vectorsize="<<n<<"\n";
if (edof==1) {
io.read(dataNumbers_,"Connectors");
dataType_ = NUMBERS;
Expand All @@ -115,6 +115,10 @@ namespace Dmrg {
}
dataType_ = MATRICES;
}
std::vector<size_t> v(2);
io.readKnownSize(v,"DefaultSites");

defaultHandle_ = handle(v[0],v[1]);
}

const RealType& operator()(size_t i,size_t j) const
Expand All @@ -125,10 +129,16 @@ namespace Dmrg {

const RealType& operator()(size_t i,size_t edof1,size_t j,size_t edof2) const
{
size_t imin = (i<j) ? i : j;
size_t h = handle(imin);

size_t h = handle(i,j);
if (dataType_==NUMBERS) return dataNumbers_[h];
return dataMatrices_[h](i,j);
return dataMatrices_[h](edof1,edof2);
}

const RealType& defaultConnector(size_t edof1,size_t edof2) const
{
if (dataType_==NUMBERS) return dataNumbers_[defaultHandle_];
return dataMatrices_[defaultHandle_](edof1,edof2);
}

size_t size() const
Expand All @@ -144,8 +154,9 @@ namespace Dmrg {
}

private:
size_t handle(size_t imin) const
size_t handle(size_t i,size_t j) const
{
size_t imin = (i<j) ? i : j;
switch(dirId_) {
case DIRECTION_X:
return imin;
Expand All @@ -159,38 +170,36 @@ namespace Dmrg {
throw std::runtime_error("Unknown direction\n");
}

void checkOptions(size_t& vectorSize,const std::string& s)
size_t getVectorSize(const std::string& s)
{
if (s.find("ConstantValues")!=std::string::npos) {
vectorSize = 1;
} else {
switch (geometryKind_) {
case CHAIN:
if (dirId_!=DIRECTION_X)
throw std::runtime_error("Chain must have direction 0\n");
vectorSize_ = linSize_;
break;
case LADDERX:
if (dirId_==DIRECTION_XPY) vectorSize_=linSize_ - linSize_/leg_;
else if (dirId_==DIRECTION_XMY) vectorSize_=linSize_ - linSize_/leg_;
// no break here

case LADDER:
if (dirId_==DIRECTION_X) vectorSize_=linSize_-leg_;
else if (dirId_==DIRECTION_Y) vectorSize_=linSize_ - linSize_/leg_;
else if (geometryKind_!=LADDERX)
throw std::runtime_error("Ladder: wrong direction\n");
break;
}
if (s.find("ConstantValues")!=std::string::npos)
return 1;

switch (geometryKind_) {
case CHAIN:
if (dirId_!=DIRECTION_X)
throw std::runtime_error("Chain must have direction 0\n");
return linSize_;
case LADDERX:
if (dirId_==DIRECTION_XPY) return linSize_ - linSize_/leg_;
else if (dirId_==DIRECTION_XMY) return linSize_ - linSize_/leg_;
// no break here

case LADDER:
if (dirId_==DIRECTION_X) return linSize_-leg_;
else if (dirId_==DIRECTION_Y) return linSize_ - linSize_/leg_;
else if (geometryKind_!=LADDERX)
throw std::runtime_error("Ladder: wrong direction\n");
}
throw std::runtime_error("Unknown geometry\n");
}

size_t dirId_;
size_t linSize_;
size_t geometryKind_;
size_t leg_;
size_t dataType_;
size_t vectorSize_;
size_t defaultHandle_;
std::vector<RealType> dataNumbers_;
std::vector<MatrixType> dataMatrices_;
}; // class GeometryDirection
Expand Down
12 changes: 10 additions & 2 deletions src/Engine/GeometryImplementation.h
Original file line number Diff line number Diff line change
Expand Up @@ -96,11 +96,13 @@ namespace Dmrg {
GeometryImplementation(IoInputter& io)
{
int x;
io.readline(x,"TotalNumberOfSites");
io.readline(x,"TotalNumberOfSites=");
if (x<0) throw std::runtime_error("TotalNumberOfSites<0 is an error\n");
std::cerr<<"TotalNumberOfSites "<<x<<"\n";
linSize_ = x;

io.readline(x,"NumberOfTerms");
io.readline(x,"NumberOfTerms=");
std::cerr<<"NumberOfTerms "<<x<<"\n";
if (x<0) throw std::runtime_error("NumberOfTerms<0 is an error\n");

for (size_t i=0;i<size_t(x);i++) {
Expand All @@ -124,6 +126,12 @@ namespace Dmrg {
return terms_[term](i1,edof1,i2,edof2);
}

const RealType& defaultConnector
(size_t edof1,size_t edof2,size_t term) const
{
return terms_[term].defaultConnector(edof1,edof2);
}

size_t terms() const { return terms_.size(); }

private:
Expand Down
49 changes: 43 additions & 6 deletions src/Engine/GeometryTerm.h
Original file line number Diff line number Diff line change
Expand Up @@ -96,22 +96,25 @@ namespace Dmrg {
: linSize_(linSize),leg_(1)
{
int x;
io.readline(x,"DegreesOfFreedom");
io.readline(x,"DegreesOfFreedom=");
if (x<=0) throw std::runtime_error("DegreesOfFreedom<=0 is an error\n");
std::cerr<<"DegreesOfFreedom "<<x<<"\n";
edof_ = x;
std::string s;
io.readline(s,"GeometryKind");
io.readline(s,"GeometryKind=");
std::cerr<<"GeometryKind "<<s<<"\n";
geometryKind_=getGeometry(s);
std::string gOptions;
io.readline(gOptions,"GeometryOptions");
io.readline(gOptions,"GeometryOptions=");
std::cerr<<"GeometryOptions "<<gOptions<<"\n";
size_t dirs = 0;
switch (geometryKind_) {
case GeometryDirectionType::LADDER:
dirs = 2;
// no break here!
case GeometryDirectionType::LADDERX:
if (dirs==0) dirs=4;
io.readline(x,"LadderLeg");
io.readline(x,"LadderLeg=");
if (x<2) throw std::runtime_error("LadderLeg<2 is an error\n");
leg_=x;
break;
Expand Down Expand Up @@ -139,9 +142,18 @@ namespace Dmrg {
return cachedValues_[p];
}

const RealType& defaultConnector
(size_t i1,size_t edof1,size_t i2,size_t edof2) const
{
size_t dir = calcDir(i1,i2);
return directions_[dir].defaultConnector(edof1,edof2);
}

private:
const RealType& calcValue(size_t i1,size_t edof1,size_t i2,size_t edof2) const
const RealType calcValue(size_t i1,size_t edof1,size_t i2,size_t edof2) const
{
RealType zero = 0;
if (!connected(i1,i2)) return zero;
size_t dir = calcDir(i1,i2);
if (directions_[dir].constantValues()) {
return directions_[dir](edof1,edof2);
Expand Down Expand Up @@ -198,7 +210,32 @@ namespace Dmrg {
if (c1 == c2) return true;
return false;
}


bool connected(size_t i1,size_t i2) const
{
switch (geometryKind_) {
case GeometryDirectionType::CHAIN:
return neighbors(i1,i2);
break;
case GeometryDirectionType::LADDERX:
case GeometryDirectionType::LADDER:
size_t c1 = i1/leg_;
size_t c2 = i2/leg_;
size_t r1 = i1%leg_;
size_t r2 = i2%leg_;
if (c1==c2) return neighbors(r1,r2);
if (r1==r2) return neighbors(c1,c2);
return (geometryKind_==GeometryDirectionType::LADDERX
&& neighbors(r1,r2) && neighbors(c1,c2));
}
throw std::runtime_error("Unknown geometry\n");
}

bool neighbors(size_t i1,size_t i2) const
{
return (i1-i2==1 || i2-i1==1);
}

size_t linSize_;
size_t leg_;
size_t edof_;
Expand Down
10 changes: 1 addition & 9 deletions src/Engine/GroundStateTargetting.h
Original file line number Diff line number Diff line change
Expand Up @@ -89,14 +89,6 @@ DISCLOSED WOULD NOT INFRINGE PRIVATELY OWNED RIGHTS.

namespace Dmrg {

template<typename ModelType>
inline TargetStructureParams<int,ModelType>&
operator<=(TargetStructureParams<int,ModelType>& tsp,SimpleReader& reader)
{
// Nothing to see here
return tsp;
}

template<
template<typename,typename> class LanczosSolverTemplate,
template<typename,typename> class InternalProductTemplate,
Expand Down Expand Up @@ -125,7 +117,7 @@ namespace Dmrg {
typedef typename BasisType::BlockType BlockType;
typedef VectorWithOffsetTemplate<RealType> VectorWithOffsetType;
typedef VectorType TargetVectorType;
typedef int TargettingStructureType;
typedef TargetStructureParams<ModelType> TargettingStructureType;
typedef ApplyOperatorLocal<BasisWithOperatorsType,VectorWithOffsetType,TargetVectorType> ApplyOperatorType;

enum {EXPAND_ENVIRON=WaveFunctionTransformationType::EXPAND_ENVIRON,
Expand Down
13 changes: 13 additions & 0 deletions src/Engine/IoSimple.h
Original file line number Diff line number Diff line change
Expand Up @@ -291,6 +291,19 @@ namespace Dmrg {
}
return sc;
}

template<typename X>
std::pair<std::string,size_t> readKnownSize(X &x,std::string const &s,int level=0)
{
std::pair<std::string,size_t> sc = advance(s,level);

for (size_t i=0;i<x.size();i++) {
typename X::value_type tmp;
fin_>>tmp;
x[i]=tmp;
}
return sc;
}

template<typename X>
void read(std::stack<X>& x,const std::string& s,size_t level=0)
Expand Down
48 changes: 28 additions & 20 deletions src/Engine/ParametersDmrgSolver.h
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,14 @@ namespace Dmrg {
bool enabled;
size_t index;
std::string filename;

template<typename IoInputType>
void load(IoInputType& io)
{
io.readline(enabled,"CheckPointEnabled=");
io.readline(index,"index=");
io.readline(filename,"filename=");
}
};

std::istream &operator>>(std::istream& is,DmrgCheckPoint& c)
Expand All @@ -134,6 +142,26 @@ namespace Dmrg {
std::vector<FieldType> targetQuantumNumbers;
DmrgCheckPoint checkpoint;
size_t nthreads;

//! Read Dmrg parameters from inp file
template<typename IoInputType>
ParametersDmrgSolver(IoInputType& io)
{
io.readline(options,"SolverOptions=");
io.readline(version,"Version=");
io.readline(filename,"OutputFile=");
io.readline(keptStatesInfinite,"InfiniteLoopKeptStates=");
io.read(finiteLoop,"FiniteLoops");
if (options.find("hasQuantumNumbers")!=std::string::npos)
io.read(targetQuantumNumbers,"TargetQuantumNumbers");
if (options.find("checkpoint")!=std::string::npos)
checkpoint.load(io);
nthreads=1; // provide a default value
if (options.find("hasThreads")!=std::string::npos)
io.readline(nthreads,"Threads=");

}

};

//! Read Dmrg parameters from JSON file
Expand All @@ -149,26 +177,6 @@ namespace Dmrg {
return parameters;
} */

//! Read Dmrg parameters from inp file
template<typename FieldType>
ParametersDmrgSolver<FieldType>&
operator <= (ParametersDmrgSolver<FieldType>& parameters, SimpleReader& reader)
{
reader.read(parameters.options);
reader.read(parameters.version);
reader.read(parameters.filename);
reader.read(parameters.keptStatesInfinite);
reader.read(parameters.finiteLoop);
if (parameters.options.find("hasQuantumNumbers")!=std::string::npos)
reader.read(parameters.targetQuantumNumbers);
if (parameters.options.find("checkpoint")!=std::string::npos)
reader.read(parameters.checkpoint);
parameters.nthreads=1; // provide a default value
if (parameters.options.find("hasThreads")!=std::string::npos)
reader.read(parameters.nthreads);
return parameters;
}

//! print dmrg parameters
template<typename FieldType>
std::ostream &operator<<(std::ostream &os,ParametersDmrgSolver<FieldType> const &parameters)
Expand Down
Loading

0 comments on commit afe5f94

Please sign in to comment.