1 //////////////////////////////////////////////////////////////////////////////////////
2 // This file is distributed under the University of Illinois/NCSA Open Source License.
3 // See LICENSE file in top directory for details.
4 //
5 // Copyright (c) 2016 Jeongnim Kim and QMCPACK developers.
6 //
7 // File developed by: Jordan E. Vincent, University of Illinois at Urbana-Champaign
8 //                    Jeongnim Kim, jeongnim.kim@gmail.com, University of Illinois at Urbana-Champaign
9 //                    Jeremy McMinnis, jmcminis@gmail.com, University of Illinois at Urbana-Champaign
10 //                    Miguel Morales, moralessilva2@llnl.gov, Lawrence Livermore National Laboratory
11 //                    Anouar Benali, benali@anl.gov, Argonne National Laboratory
12 //                    Mark A. Berrill, berrillma@ornl.gov, Oak Ridge National Laboratory
13 //
14 // File created by: Jordan E. Vincent, University of Illinois at Urbana-Champaign
15 //////////////////////////////////////////////////////////////////////////////////////
16 
17 
18 #ifndef QMCPLUSPLUS_TOOLS_EXTERNAL_GAUSSIANPARSERBASE_H
19 #define QMCPLUSPLUS_TOOLS_EXTERNAL_GAUSSIANPARSERBASE_H
20 #include <iostream>
21 #include <cstdlib>
22 #include <sstream>
23 #include <iomanip>
24 #include <vector>
25 #include <map>
26 #include "OhmmsData/OhmmsElementBase.h"
27 #include "Utilities/SimpleParser.h"
28 #include "Particle/ParticleSet.h"
29 #include "Numerics/HDFSTLAttrib.h"
30 #include "OhmmsData/HDFStringAttrib.h"
31 #include "hdf/hdf_archive.h"
32 
33 using namespace qmcplusplus;
34 
35 struct QMCGaussianParserBase
36 {
37   typedef double value_type;
38   typedef ParticleSet::SingleParticlePos_t SingleParticlePos_t;
39 
40   bool multideterminant;
41   bool multidetH5;
42   bool BohrUnit;
43   bool SpinRestricted;
44   bool Periodicity;
45   bool UseHDF5;
46   bool PBC;
47   bool production;
48   bool zeroCI;
49   bool orderByExcitation;
50   bool addJastrow;
51   bool addJastrow3Body;
52   bool ECP;
53   bool debug;
54   bool Structure;
55   bool DoCusp;
56   bool FixValence;
57   bool singledetH5;
58   bool optDetCoeffs;
59   bool usingCSF;
60   int IonChargeIndex;
61   int ValenceChargeIndex;
62   int AtomicNumberIndex;
63   int NumberOfAtoms;
64   int NumberOfEls;
65   // targeted state number
66   int target_state;
67   int SpinMultiplicity;
68   int NumberOfAlpha, NumberOfBeta;
69   int SizeOfBasisSet;
70   // mmorales: number of Molecular orbitals, not always equal to SizeOfBasisSet
71   int numMO, readNO, readGuess, numMO2print;
72   int ci_size, ci_nca, ci_ncb, ci_nea, ci_neb, ci_nstates;
73   int NbKpts;
74   int nbexcitedstates;
75   double ci_threshold;
76 
77 
78   std::vector<double> STwist_Coord; //Super Twist Coordinates
79 
80 
81   std::string Title;
82   std::string basisType;
83   std::string basisName;
84   std::string Normalized;
85   std::string CurrentCenter;
86   std::string outputFile;
87   std::string angular_type;
88   std::string h5file;
89   std::string multih5file;
90   std::string WFS_name;
91   std::string CodeName;
92   ParticleSet IonSystem;
93 
94 
95   std::vector<std::string> GroupName;
96 
97   std::vector<int> gShell, gNumber, gBound;
98   std::vector<int> Occ_alpha, Occ_beta;
99   std::vector<value_type> Qv;
100   std::vector<value_type> gExp, gC0, gC1;
101   std::vector<value_type> EigVal_alpha, EigVal_beta;
102   std::vector<value_type> EigVec;
103   //std::vector<GaussianCombo<value_type> > gExp, gC0, gC1;
104   //std::string EigVecU, EigVecD;
105   xmlNodePtr gridPtr;
106   std::vector<std::string> CIalpha, CIbeta;
107   std::vector<std::string> CSFocc;
108   std::vector<std::vector<std::string>> CSFalpha, CSFbeta;
109   std::vector<std::vector<double>> CSFexpansion;
110   std::vector<double> CIcoeff;
111   std::vector<double> X, Y, Z; //LAttice vectors for PBC
112   std::vector<int> Image;
113 
114   std::vector<int> CIexcitLVL;
115 
116   std::vector<std::pair<int, double>> coeff2csf;
117 
118   QMCGaussianParserBase();
119   QMCGaussianParserBase(int argc, char** argv);
120 
121   void setOccupationNumbers();
122 
123   void createGridNode(int argc, char** argv);
124 
125   void createSPOSets(xmlNodePtr, xmlNodePtr);
126   void createSPOSetsH5(xmlNodePtr, xmlNodePtr);
127   void PrepareSPOSetsFromH5(xmlNodePtr, xmlNodePtr);
128   xmlNodePtr createElectronSet(const std::string& ion_tag);
129   xmlNodePtr createIonSet();
130   xmlNodePtr createCell();
131   xmlNodePtr createHamiltonian(const std::string& ion_tag, const std::string& psi_tag);
132   xmlNodePtr createBasisSet();
133   xmlNodePtr createBasisSetWithHDF5();
134   xmlNodePtr createCenter(int iat, int _off);
135   void createCenterH5(int iat, int _off, int numelem);
136   void createShell(int n, int ig, int off_, xmlNodePtr abasis);
137   void createShellH5(int n, int ig, int off_, int numelem);
138 
139   xmlNodePtr createDeterminantSet();
140   xmlNodePtr createMultiDeterminantSet();
141   xmlNodePtr createDeterminantSetWithHDF5();
142   xmlNodePtr createMultiDeterminantSetFromH5();
143   xmlNodePtr createMultiDeterminantSetCIHDF5();
144   xmlNodePtr PrepareDeterminantSetFromHDF5();
145   xmlNodePtr createJ3();
146   xmlNodePtr createJ2();
147   xmlNodePtr createJ1();
148 
149   xmlNodePtr parameter(xmlNodePtr Parent, std::string Mypara, std::string a);
150 
151   int numberOfExcitationsCSF(std::string&);
152 
153   virtual void parse(const std::string& fname) = 0;
154 
155   virtual void dumpPBC(const std::string& psi_tag, const std::string& ion_tag);
156 
157   virtual void dump(const std::string& psi_tag, const std::string& ion_tag);
158 
159   void dumpStdInput(const std::string& psi_tag, const std::string& ion_tag);
160 
161   void dumpStdInputProd(const std::string& psi_tag, const std::string& ion_tag);
162 
163 
164   //static std::vector<std::string> IonName;
165   static std::map<int, std::string> IonName;
166 
167   static std::vector<std::string> gShellType;
168   static std::vector<int> gShellID;
169 
170   static void init();
171 };
172 #endif
173