00001 00002 #ifndef _mpqcin_h 00003 #define _mpqcin_h 00004 00005 #include <vector> 00006 #include <iostream> 00007 00008 #include <util/keyval/keyval.h> 00009 #include <chemistry/molecule/molecule.h> 00010 00011 class MPQCInFlexLexer; 00012 00013 namespace sc { 00014 00015 class IPV2; 00016 00017 template <class T> 00018 class MPQCInDatum { 00019 int set_; 00020 T val_; 00021 public: 00022 MPQCInDatum(const T&v): val_(v), set_(0) {} 00023 const T &operator =(const T&v) { set_ = 1; val_ = v; return val_; } 00024 void reset(const T &val) { set_ = 0; val_ = val; } 00025 int set() const { return set_; } 00026 T val() const { return val_; } 00027 }; 00028 00029 class MPQCIn { 00030 MPQCInFlexLexer *lexer_; 00031 Ref<Molecule> mol_; 00032 MPQCInDatum<int> gradient_; 00033 MPQCInDatum<int> frequencies_; 00034 MPQCInDatum<int> optimize_; 00035 MPQCInDatum<int> mult_; 00036 MPQCInDatum<int> redund_coor_; 00037 MPQCInDatum<int> opt_type_; 00038 MPQCInDatum<int> restart_; 00039 MPQCInDatum<int> checkpoint_; 00040 MPQCInDatum<int> charge_; 00041 MPQCInDatum<int> atom_charge_; 00042 MPQCInDatum<int> molecule_bohr_; 00043 MPQCInDatum<char *> basis_; 00044 MPQCInDatum<char *> auxbasis_; 00045 MPQCInDatum<char *> method_; 00046 MPQCInDatum<char *> method_xc_; 00047 MPQCInDatum<char *> method_grid_; 00048 MPQCInDatum<char *> symmetry_; 00049 MPQCInDatum<char *> memory_; 00050 MPQCInDatum<std::vector<int> *> alpha_; 00051 MPQCInDatum<std::vector<int> *> beta_; 00052 MPQCInDatum<std::vector<int> *> docc_; 00053 MPQCInDatum<std::vector<int> *> socc_; 00054 MPQCInDatum<std::vector<int> *> frozen_docc_; 00055 MPQCInDatum<std::vector<int> *> frozen_uocc_; 00056 MPQCInDatum<const char *> method_ebc_; 00057 MPQCInDatum<const char *> method_gbc_; 00058 MPQCInDatum<const char *> method_absmethod_; 00059 00060 int nirrep_; 00061 00062 void write_energy_object(std::ostream&, const char *keyword, 00063 const char *method, 00064 const char *basis, int coor, 00065 bool &need_cints); 00066 void write_basis_object(std::ostream&, const char *keyword, 00067 const char *basis); 00068 void write_vector(std::ostream &ostrs, 00069 const char *keyvalname, 00070 const char *name, 00071 MPQCInDatum<std::vector<int> *>&vec, 00072 int require_nirrep); 00073 00074 static int checking_; 00075 public: 00076 MPQCIn(); 00077 ~MPQCIn(); 00078 00079 char *parse_string(const char *s); 00080 int check_string(const char *s); 00081 00082 int ylex(); 00083 int yparse(); 00084 void error(const char* s); 00085 void error2(const char* s, const char* s2); 00086 void yerror(const char* s); 00087 void yerror2(const char* s, const char *); 00088 00089 void begin_molecule(); 00090 void end_molecule(); 00091 void add_atom(char *, char *, char *, char *); 00092 void set_charge(char *); 00093 void set_method(char *); 00094 void set_basis(char *); 00095 void set_auxbasis(char *); 00096 void set_multiplicity(char *); 00097 void set_memory(char *); 00098 void set_optimize(int); 00099 void set_opt_type(int); 00100 void set_atom_charge(char *); 00101 void set_molecule_unit(char *); 00102 void set_method_xc(char *); 00103 void set_method_grid(char *); 00104 void set_symmetry(char *); 00105 void set_redund_coor(int); 00106 void set_gradient(int); 00107 void set_frequencies(int); 00108 void set_restart(int); 00109 void set_checkpoint(int); 00110 void set_molecule_bohr(int); 00111 void set_docc(std::vector<int> *); 00112 void set_socc(std::vector<int> *); 00113 void set_alpha(std::vector<int> *); 00114 void set_beta(std::vector<int> *); 00115 void set_frozen_docc(std::vector<int> *); 00116 void set_frozen_uocc(std::vector<int> *); 00117 std::vector<int> *make_nnivec(std::vector<int> *, char *); 00118 void set_method_absmethod(const char *); 00119 void set_method_ebc(const char *); 00120 void set_method_gbc(const char *); 00121 00122 static int checking() { return checking_; } 00123 }; 00124 00125 } 00126 00127 #endif