Changeset a3ff7b2 for molecuilder
- Timestamp:
- May 8, 2008, 5:31:04 PM (17 years ago)
- Children:
- 310b25
- Parents:
- 461e93
- Location:
- molecuilder/src
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
molecuilder/src/defs.hpp
r461e93 ra3ff7b2 46 46 #define TEFACTORSFILE "TE-Factors.dat" 47 47 #define FORCESFILE "Forces-Factors.dat" 48 #define ORDERATSITEFILE "OrderAtSite.dat" 48 #define ORDERATSITEFILE "OrderAtSite.dat" 49 #define ENERGYPERFRAGMENT "EnergyPerFragment.dat" 49 50 #define FRAGMENTPREFIX "BondFragment" 50 51 #define STANDARDCONFIG "unknown.conf" -
molecuilder/src/moleculelist.cpp
r461e93 ra3ff7b2 408 408 * \param *out output stream for debugging 409 409 * \param *&RootStack stack to be filled 410 * \param *AtomMask defines true/false per global Atom::nr to mask in/out each nuclear site 410 411 * \param Order desired bond order for all sites 411 412 * \param &FragmentCounter counts through the fragments in this MoleculeLeafClass 412 413 * \return true - stack is non-empty, fragmentation necessary, false - stack is empty, no more sites to update 413 414 */ 414 bool MoleculeLeafClass::FillRootStackForSubgraphs(ofstream *out, KeyStack *&RootStack, int Order, int &FragmentCounter)415 { 416 atom *Walker = NULL ;415 bool MoleculeLeafClass::FillRootStackForSubgraphs(ofstream *out, KeyStack *&RootStack, bool *AtomMask, int Order, int &FragmentCounter) 416 { 417 atom *Walker = NULL, *Father = NULL; 417 418 418 419 if (RootStack != NULL) { … … 426 427 while (Walker->next != Leaf->end) { // go through all (non-hydrogen) atoms 427 428 Walker = Walker->next; 429 Father = Walker->GetTrueFather(); 430 if (AtomMask[Father->nr]) // apply mask 428 431 #ifdef ADDHYDROGEN 429 if (Walker->type->Z != 1) // skip hydrogen432 if (Walker->type->Z != 1) // skip hydrogen 430 433 #endif 431 if (Walker->GetTrueFather()->AdaptiveOrder < Order) // only if Order is still greater432 RootStack[FragmentCounter].push_front(Walker->nr);434 if (Father->AdaptiveOrder < Order) // only if Order is still greater 435 RootStack[FragmentCounter].push_front(Walker->nr); 433 436 } 434 437 if (next != NULL) 435 next->FillRootStackForSubgraphs(out, RootStack, Order, ++FragmentCounter);438 next->FillRootStackForSubgraphs(out, RootStack, AtomMask, Order, ++FragmentCounter); 436 439 } else { 437 440 *out << Verbose(1) << "Rootstack[" << FragmentCounter << "] is NULL." << endl; -
molecuilder/src/molecules.cpp
r461e93 ra3ff7b2 2017 2017 *out << Verbose(1) << "done." << endl; 2018 2018 } else { 2019 *out << Verbose(1) << "failed to open file" << line << "." << endl;2019 *out << Verbose(1) << "failed to open " << line << "." << endl; 2020 2020 status = false; 2021 2021 } … … 2137 2137 /** Checks whether the OrderAtSite is still bewloe \a Order at some site. 2138 2138 * \param *out output stream for debugging 2139 * \param &FragmentationToDo return boolean 2140 * \param Order desired Order 2139 * \param *AtomMask defines true/false per global Atom::nr to mask in/out each nuclear site, used to activate given number of site to increment order adaptively 2140 * \param *GlobalKeySetList list of keysets with global ids (valid in "this" molecule) needed for adaptive increase 2141 * \param Order desired Order if positive, desired exponent in threshold criteria if negative (0 is single-step) 2142 * \param *path path to ENERGYPERFRAGMENT file (may be NULL if Order is non-negative) 2141 2143 * \return true - needs further fragmentation, false - does not need fragmentation 2142 2144 */ 2143 bool molecule::CheckOrderAtSite(ofstream *out, int Order)2144 { 2145 atom *Walker = NULL;2145 bool molecule::CheckOrderAtSite(ofstream *out, bool *AtomMask, Graph *GlobalKeySetList, int Order, char *path) 2146 { 2147 atom *Walker = start; 2146 2148 bool status = false; 2147 2148 Walker = start; 2149 while (Walker->next != end) { 2150 Walker = Walker->next; 2151 #ifdef ADDHYDROGEN 2152 if (Walker->type->Z != 1) // skip hydrogen 2153 #endif 2154 if (Walker->AdaptiveOrder < Order) 2155 status = true; 2156 } 2157 if (!status) 2158 *out << Verbose(1) << "Order at every site is already equal or above desired order " << Order << "." << endl; 2149 ifstream InputFile; 2150 stringstream line; 2151 2152 if (Order < 0) { // adaptive increase of BondOrder per site 2153 for(int i=0;i<AtomCount;i++) 2154 AtomMask[i] = false; 2155 // parse the EnergyPerFragment file 2156 line.str(path); 2157 line << "/" << FRAGMENTPREFIX << ENERGYPERFRAGMENT; 2158 InputFile.open(line.str().c_str(), ios::in); 2159 if (InputFile != NULL) { 2160 char *buffer = (char *) Malloc(sizeof(char)*MAXSTRINGSIZE, "molecule::CheckOrderAtSite: *buffer"); 2161 int lines = 0; 2162 // count the number of lines, i.e. the number of fragments 2163 while(!InputFile.eof()) { 2164 InputFile.getline(buffer, MAXSTRINGSIZE); 2165 lines++; 2166 } 2167 InputFile.clear(); 2168 InputFile.seekg(ios::beg); 2169 map<double, int> FragmentEnergies; 2170 int No; 2171 int Value; 2172 // each line represents a fragment root (Atom::nr) id and its energy contribution 2173 while(!InputFile.eof()) { 2174 InputFile.getline(buffer, MAXSTRINGSIZE); 2175 InputFile >> No; 2176 InputFile >> Value; 2177 FragmentEnergies.insert( make_pair(Value, No) ); 2178 } 2179 for(map<double, int>::iterator runner = FragmentEnergies.lower_bound(pow(1.,Order)); runner != FragmentEnergies.begin(); runner++) { 2180 // as the smallest number in each set has always been the root (we use global id to keep the doubles away), seek smallest and insert into AtomMask 2181 AtomMask[(*runner).second] = true; 2182 } 2183 // close and done 2184 InputFile.close(); 2185 InputFile.clear(); 2186 Free((void **)&buffer, "molecule::CheckOrderAtSite: *buffer"); 2187 } else { 2188 cerr << "Unable to parse " << FRAGMENTPREFIX << ENERGYPERFRAGMENT << " file." << endl; 2189 return false; 2190 } 2191 // pick a given number of highest values and set AtomMask 2192 } else if (Order > 0) { // global increase of Bond Order 2193 while (Walker->next != end) { 2194 Walker = Walker->next; 2195 #ifdef ADDHYDROGEN 2196 if (Walker->type->Z != 1) // skip hydrogen 2197 #endif 2198 { 2199 AtomMask[Walker->nr] = true; // include all (non-hydrogen) atoms 2200 if (Walker->AdaptiveOrder < Order) 2201 status = true; 2202 } 2203 } 2204 if (!status) 2205 *out << Verbose(1) << "Order at every site is already equal or above desired order " << Order << "." << endl; 2206 } else { // single stepping, just check 2207 if (AtomMask[AtomCount] != true) // if true, we would've done a step already 2208 for(int i=0;i<=AtomCount;i++) 2209 AtomMask[i] = true; 2210 else 2211 status = false; 2212 } 2159 2213 2160 2214 return status; … … 2226 2280 atom **ListOfAtoms = NULL; 2227 2281 atom ***ListOfLocalAtoms = NULL; 2282 bool *AtomMask = NULL; 2228 2283 2229 2284 *out << endl; … … 2266 2321 // ===== 6a. assign each keyset to its respective subgraph ===== 2267 2322 Subgraphs->next->AssignKeySetsToFragment(out, this, ParsedFragmentList, ListOfLocalAtoms, FragmentList, (FragmentCounter = 0), false); 2268 delete(ParsedFragmentList);2269 2323 2270 2324 KeyStack *RootStack = new KeyStack[Subgraphs->next->Count()]; 2271 while (CheckOrderAtSite(out, Order)) { 2325 AtomMask = new bool[AtomCount+1]; 2326 for (int i=0;i<AtomCount;i++) // need to set to false to recognize in single-stepping (one global step set them all to true) 2327 AtomMask[i] = false; 2328 while (CheckOrderAtSite(out, AtomMask, ParsedFragmentList, Order)) { 2329 AtomMask[AtomCount] = true; // last plus one entry is used as marker that we have been through this loop once already in CheckOrderAtSite() 2272 2330 // ===== 6b. fill RootStack for each subgraph (second adaptivity check) ===== 2273 Subgraphs->next->FillRootStackForSubgraphs(out, RootStack, Order, (FragmentCounter = 0));2331 Subgraphs->next->FillRootStackForSubgraphs(out, RootStack, AtomMask, Order, (FragmentCounter = 0)); 2274 2332 2275 2333 // ===== 7. fill the bond fragment list ===== … … 2293 2351 } 2294 2352 delete[](RootStack); 2295 } 2353 delete[](AtomMask); 2354 } 2355 delete(ParsedFragmentList); 2296 2356 2297 2357 // free the index lookup list -
molecuilder/src/molecules.hpp
r461e93 ra3ff7b2 37 37 #define KeyStack deque<int> 38 38 #define KeySet set<int> 39 #define Graph map<KeySet, pair<int, double>, KeyCompare > 40 #define GraphPair pair<KeySet, pair<int, double> > 39 #define NumberValuePair pair<int, double> 40 #define Graph map<KeySet, NumberValuePair, KeyCompare > 41 #define GraphPair pair<KeySet, NumberValuePair > 41 42 #define KeySetTestPair pair<KeySet::iterator, bool> 42 43 #define GraphTestPair pair<Graph::iterator, bool> … … 340 341 /// Fragment molecule by two different approaches: 341 342 void FragmentMolecule(ofstream *out, int Order, config *configuration); 342 bool CheckOrderAtSite(ofstream *out, int Order);343 bool CheckOrderAtSite(ofstream *out, bool *AtomMask, Graph *GlobalKeySetList, int Order, char *path = NULL); 343 344 bool StoreAdjacencyToFile(ofstream *out, char *path); 344 345 bool CheckAdjacencyFileAgainstMolecule(ofstream *out, char *path, atom **ListOfAtoms); … … 412 413 bool AddLeaf(molecule *ptr, MoleculeLeafClass *Previous); 413 414 bool FillBondStructureFromReference(ofstream *out, molecule *reference, int &FragmentCounter, atom ***&ListOfLocalAtoms, bool FreeList = false); 414 bool FillRootStackForSubgraphs(ofstream *out, KeyStack *&RootStack, int Order, int &FragmentCounter);415 bool FillRootStackForSubgraphs(ofstream *out, KeyStack *&RootStack, bool *AtomMask, int Order, int &FragmentCounter); 415 416 bool AssignKeySetsToFragment(ofstream *out, molecule *reference, Graph *KeySetList, atom ***&ListOfLocalAtoms, Graph **&FragmentList, int &FragmentCounter, bool FreeList = false); 416 417 bool FillListOfLocalAtoms(ofstream *out, atom ***&ListOfLocalAtoms, int &FragmentCounter, int GlobalAtomCount, bool &FreeList);
Note:
See TracChangeset
for help on using the changeset viewer.