Changeset 1b2aa1 for molecuilder/src/periodentafel.cpp
- Timestamp:
- Jul 23, 2009, 12:14:13 PM (16 years ago)
- Children:
- f39735
- Parents:
- a41b50
- File:
-
- 1 edited
-
molecuilder/src/periodentafel.cpp (modified) (12 diffs)
Legend:
- Unmodified
- Added
- Removed
-
molecuilder/src/periodentafel.cpp
ra41b50 r1b2aa1 16 16 periodentafel::periodentafel() 17 17 { 18 start = new element;19 end = new element;20 start->previous = NULL;21 start->next = end;22 end->previous = start;23 end->next = NULL;18 start = new element; 19 end = new element; 20 start->previous = NULL; 21 start->next = end; 22 end->previous = start; 23 end->next = NULL; 24 24 }; 25 25 … … 29 29 periodentafel::~periodentafel() 30 30 { 31 CleanupPeriodtable();32 delete(end);33 delete(start);31 CleanupPeriodtable(); 32 delete(end); 33 delete(start); 34 34 }; 35 35 … … 40 40 bool periodentafel::AddElement(element *pointer) 41 41 { 42 pointer->sort = &pointer->Z;43 if (pointer->Z < 1 && pointer->Z >= MAX_ELEMENTS)44 cout << Verbose(0) << "Invalid Z number!\n";45 return add(pointer, end);42 pointer->sort = &pointer->Z; 43 if (pointer->Z < 1 && pointer->Z >= MAX_ELEMENTS) 44 cout << Verbose(0) << "Invalid Z number!\n"; 45 return add(pointer, end); 46 46 }; 47 47 … … 52 52 bool periodentafel::RemoveElement(element *pointer) 53 53 { 54 return remove(pointer, start, end);54 return remove(pointer, start, end); 55 55 }; 56 56 … … 60 60 bool periodentafel::CleanupPeriodtable() 61 61 { 62 return cleanup(start,end);62 return cleanup(start,end); 63 63 }; 64 64 … … 70 70 element * periodentafel::FindElement(int Z) 71 71 { 72 element *walker = find(&Z, start,end);73 if (walker == NULL) { // not found: enter and put into db74 cout << Verbose(0) << "Element not found in database, please enter." << endl;75 walker = new element;76 cout << Verbose(0) << "Mass: " << endl;77 cin >> walker->mass;78 walker->Z = Z;79 cout << Verbose(0) << "Atomic number: " << walker->Z << endl;80 cout << Verbose(0) << "Name [max 64 chars]: " << endl;81 cin >> walker->name;82 cout << Verbose(0) << "Short form [max 3 chars]: " << endl;83 cin >> walker->symbol;84 periodentafel::AddElement(walker);85 }86 return(walker);72 element *walker = find(&Z, start,end); 73 if (walker == NULL) { // not found: enter and put into db 74 cout << Verbose(0) << "Element not found in database, please enter." << endl; 75 walker = new element; 76 cout << Verbose(0) << "Mass: " << endl; 77 cin >> walker->mass; 78 walker->Z = Z; 79 cout << Verbose(0) << "Atomic number: " << walker->Z << endl; 80 cout << Verbose(0) << "Name [max 64 chars]: " << endl; 81 cin >> walker->name; 82 cout << Verbose(0) << "Short form [max 3 chars]: " << endl; 83 cin >> walker->symbol; 84 periodentafel::AddElement(walker); 85 } 86 return(walker); 87 87 }; 88 88 … … 94 94 element * periodentafel::FindElement(char *shorthand) const 95 95 { 96 element *walker =periodentafel::start;97 while (walker->next != periodentafel::end) {98 walker = walker->next;99 if (strncmp(walker->symbol, shorthand, 3) == 0)100 return(walker);101 }102 return (NULL);96 element *walker = periodentafel::start; 97 while (walker->next != periodentafel::end) { 98 walker = walker->next; 99 if (strncmp(walker->symbol, shorthand, 3) == 0) 100 return(walker); 101 } 102 return (NULL); 103 103 }; 104 104 … … 107 107 element * periodentafel::AskElement() 108 108 { 109 element *walker = NULL;110 int Z;111 do {112 cout << Verbose(0) << "Atomic number Z: ";113 cin >> Z;114 walker = this->FindElement(Z);// give type115 } while (walker == NULL);116 return walker;109 element *walker = NULL; 110 int Z; 111 do { 112 cout << Verbose(0) << "Atomic number Z: "; 113 cin >> Z; 114 walker = this->FindElement(Z); // give type 115 } while (walker == NULL); 116 return walker; 117 117 }; 118 118 … … 122 122 bool periodentafel::Output(ofstream *output) const 123 123 { 124 bool result = true;125 element *walker = start;126 if (output != NULL) {127 while (walker->next != end) {128 walker = walker->next;129 result = result && walker->Output(output);130 }131 return result;132 } else133 return false;124 bool result = true; 125 element *walker = start; 126 if (output != NULL) { 127 while (walker->next != end) { 128 walker = walker->next; 129 result = result && walker->Output(output); 130 } 131 return result; 132 } else 133 return false; 134 134 }; 135 135 … … 140 140 bool periodentafel::Checkout(ofstream *output, const int *checkliste) const 141 141 { 142 element *walker = start;143 bool result = true;144 int No = 1;145 146 if (output != NULL) {147 *output << "# Ion type data (PP = PseudoPotential, Z = atomic number)" << endl;148 *output << "#Ion_TypeNr.\tAmount\tZ\tRGauss\tL_Max(PP)L_Loc(PP)IonMass\t# chemical name, symbol" << endl;149 while (walker->next != end) {150 walker = walker->next;151 if ((walker != NULL) && (walker->Z > 0) && (walker->Z < MAX_ELEMENTS) && (checkliste[walker->Z])) {152 walker->No = No;153 result = result && walker->Checkout(output, No++, checkliste[walker->Z]);154 }155 }156 return result;157 } else158 return false;142 element *walker = start; 143 bool result = true; 144 int No = 1; 145 146 if (output != NULL) { 147 *output << "# Ion type data (PP = PseudoPotential, Z = atomic number)" << endl; 148 *output << "#Ion_TypeNr.\tAmount\tZ\tRGauss\tL_Max(PP)L_Loc(PP)IonMass\t# chemical name, symbol" << endl; 149 while (walker->next != end) { 150 walker = walker->next; 151 if ((walker != NULL) && (walker->Z > 0) && (walker->Z < MAX_ELEMENTS) && (checkliste[walker->Z])) { 152 walker->No = No; 153 result = result && walker->Checkout(output, No++, checkliste[walker->Z]); 154 } 155 } 156 return result; 157 } else 158 return false; 159 159 }; 160 160 … … 164 164 bool periodentafel::LoadPeriodentafel(char *path) 165 165 { 166 ifstream infile;167 double tmp;168 element *ptr;169 bool status = true;170 bool otherstatus = true;171 char filename[255];172 173 // fill elements DB174 strncpy(filename, path, MAXSTRINGSIZE);175 strncat(filename, "/", MAXSTRINGSIZE-strlen(filename));176 strncat(filename, STANDARDELEMENTSDB, MAXSTRINGSIZE-strlen(filename));177 infile.open(filename);178 if (infile != NULL) {179 infile.getline(header1, MAXSTRINGSIZE);180 infile.getline(header2, MAXSTRINGSIZE); // skip first two header lines181 cout <<"Parsed elements:";182 while (!infile.eof()) {183 element *neues = new element;184 infile >> neues->name;185 //infile >> ws;186 infile >> neues->symbol;187 //infile >> ws;188 infile >> neues->period;189 //infile >> ws;190 infile >> neues->group;191 //infile >> ws;192 infile >> neues->block;193 //infile >> ws;194 infile >> neues->Z;195 //infile >> ws;196 infile >> neues->mass;197 //infile >> ws;198 infile >> neues->CovalentRadius;199 //infile >> ws;200 infile >> neues->VanDerWaalsRadius;201 //infile >> ws;202 infile >> ws;203 cout << " " << neues->symbol;204 //neues->Output((ofstream *)&cout);205 if ((neues->Z > 0) && (neues->Z < MAX_ELEMENTS))206 periodentafel::AddElement(neues);207 else {208 cout << "Could not parse element: ";209 neues->Output((ofstream *)&cout);210 }211 }212 cout << endl;213 infile.close();214 infile.clear();215 } else216 status = false;217 218 // fill valence DB per element219 strncpy(filename, path, MAXSTRINGSIZE);220 strncat(filename, "/", MAXSTRINGSIZE-strlen(filename));221 strncat(filename, STANDARDVALENCEDB, MAXSTRINGSIZE-strlen(filename));222 infile.open(filename);223 if (infile != NULL) {224 while (!infile.eof()) {225 infile >> tmp;226 infile >> ws;227 infile >> FindElement((int)tmp)->Valence;228 infile >> ws;229 //cout << Verbose(3) << "Element " << (int)tmp << " has " << FindElement((int)tmp)->Valence << " valence electrons." << endl;230 }231 infile.close();232 infile.clear();233 } else234 otherstatus = false;235 236 // fill valence DB per element237 strncpy(filename, path, MAXSTRINGSIZE);238 strncat(filename, "/", MAXSTRINGSIZE-strlen(filename));239 strncat(filename, STANDARDORBITALDB, MAXSTRINGSIZE-strlen(filename));240 infile.open(filename);241 if (infile != NULL) {242 while (!infile.eof()) {243 infile >> tmp;244 infile >> ws;245 infile >> FindElement((int)tmp)->NoValenceOrbitals;246 infile >> ws;247 //cout << Verbose(3) << "Element " << (int)tmp << " has " << FindElement((int)tmp)->NoValenceOrbitals << " number of singly occupied valence orbitals." << endl;248 }249 infile.close();250 infile.clear();251 } else252 otherstatus = false;253 254 // fill H-BondDistance DB per element255 strncpy(filename, path, MAXSTRINGSIZE);256 strncat(filename, "/", MAXSTRINGSIZE-strlen(filename));257 strncat(filename, STANDARDHBONDDISTANCEDB, MAXSTRINGSIZE-strlen(filename));258 infile.open(filename);259 if (infile != NULL) {260 while (!infile.eof()) {261 infile >> tmp;262 ptr = FindElement((int)tmp);263 infile >> ws;264 infile >> ptr->HBondDistance[0];265 infile >> ptr->HBondDistance[1];266 infile >> ptr->HBondDistance[2];267 infile >> ws;268 //cout << Verbose(3) << "Element " << (int)tmp << " has " << FindElement((int)tmp)->HBondDistance[0] << " Angstrom typical distance to hydrogen." << endl;269 }270 infile.close();271 infile.clear();272 } else273 otherstatus = false;274 275 // fill H-BondAngle DB per element276 strncpy(filename, path, MAXSTRINGSIZE);277 strncat(filename, "/", MAXSTRINGSIZE-strlen(filename));278 strncat(filename, STANDARDHBONDANGLEDB, MAXSTRINGSIZE-strlen(filename));279 infile.open(filename);280 if (infile != NULL) {281 while (!infile.eof()) {282 infile >> tmp;283 ptr = FindElement((int)tmp);284 infile >> ws;285 infile >> ptr->HBondAngle[0];286 infile >> ptr->HBondAngle[1];287 infile >> ptr->HBondAngle[2];288 infile >> ws;289 //cout << Verbose(3) << "Element " << (int)tmp << " has " << FindElement((int)tmp)->HBondAngle[0] << ", " << FindElement((int)tmp)->HBondAngle[1] << ", " << FindElement((int)tmp)->HBondAngle[2] << " degrees bond angle for one, two, three connected hydrogens." << endl;290 }291 infile.close();292 } else293 otherstatus = false;294 295 if (!otherstatus)296 cerr << "WARNING: Something went wrong while parsing the other databases!" << endl;297 298 return status;166 ifstream infile; 167 double tmp; 168 element *ptr; 169 bool status = true; 170 bool otherstatus = true; 171 char filename[255]; 172 173 // fill elements DB 174 strncpy(filename, path, MAXSTRINGSIZE); 175 strncat(filename, "/", MAXSTRINGSIZE-strlen(filename)); 176 strncat(filename, STANDARDELEMENTSDB, MAXSTRINGSIZE-strlen(filename)); 177 infile.open(filename); 178 if (infile != NULL) { 179 infile.getline(header1, MAXSTRINGSIZE); 180 infile.getline(header2, MAXSTRINGSIZE); // skip first two header lines 181 cout << "Parsed elements:"; 182 while (!infile.eof()) { 183 element *neues = new element; 184 infile >> neues->name; 185 //infile >> ws; 186 infile >> neues->symbol; 187 //infile >> ws; 188 infile >> neues->period; 189 //infile >> ws; 190 infile >> neues->group; 191 //infile >> ws; 192 infile >> neues->block; 193 //infile >> ws; 194 infile >> neues->Z; 195 //infile >> ws; 196 infile >> neues->mass; 197 //infile >> ws; 198 infile >> neues->CovalentRadius; 199 //infile >> ws; 200 infile >> neues->VanDerWaalsRadius; 201 //infile >> ws; 202 infile >> ws; 203 cout << " " << neues->symbol; 204 //neues->Output((ofstream *)&cout); 205 if ((neues->Z > 0) && (neues->Z < MAX_ELEMENTS)) 206 periodentafel::AddElement(neues); 207 else { 208 cout << "Could not parse element: "; 209 neues->Output((ofstream *)&cout); 210 } 211 } 212 cout << endl; 213 infile.close(); 214 infile.clear(); 215 } else 216 status = false; 217 218 // fill valence DB per element 219 strncpy(filename, path, MAXSTRINGSIZE); 220 strncat(filename, "/", MAXSTRINGSIZE-strlen(filename)); 221 strncat(filename, STANDARDVALENCEDB, MAXSTRINGSIZE-strlen(filename)); 222 infile.open(filename); 223 if (infile != NULL) { 224 while (!infile.eof()) { 225 infile >> tmp; 226 infile >> ws; 227 infile >> FindElement((int)tmp)->Valence; 228 infile >> ws; 229 //cout << Verbose(3) << "Element " << (int)tmp << " has " << FindElement((int)tmp)->Valence << " valence electrons." << endl; 230 } 231 infile.close(); 232 infile.clear(); 233 } else 234 otherstatus = false; 235 236 // fill valence DB per element 237 strncpy(filename, path, MAXSTRINGSIZE); 238 strncat(filename, "/", MAXSTRINGSIZE-strlen(filename)); 239 strncat(filename, STANDARDORBITALDB, MAXSTRINGSIZE-strlen(filename)); 240 infile.open(filename); 241 if (infile != NULL) { 242 while (!infile.eof()) { 243 infile >> tmp; 244 infile >> ws; 245 infile >> FindElement((int)tmp)->NoValenceOrbitals; 246 infile >> ws; 247 //cout << Verbose(3) << "Element " << (int)tmp << " has " << FindElement((int)tmp)->NoValenceOrbitals << " number of singly occupied valence orbitals." << endl; 248 } 249 infile.close(); 250 infile.clear(); 251 } else 252 otherstatus = false; 253 254 // fill H-BondDistance DB per element 255 strncpy(filename, path, MAXSTRINGSIZE); 256 strncat(filename, "/", MAXSTRINGSIZE-strlen(filename)); 257 strncat(filename, STANDARDHBONDDISTANCEDB, MAXSTRINGSIZE-strlen(filename)); 258 infile.open(filename); 259 if (infile != NULL) { 260 while (!infile.eof()) { 261 infile >> tmp; 262 ptr = FindElement((int)tmp); 263 infile >> ws; 264 infile >> ptr->HBondDistance[0]; 265 infile >> ptr->HBondDistance[1]; 266 infile >> ptr->HBondDistance[2]; 267 infile >> ws; 268 //cout << Verbose(3) << "Element " << (int)tmp << " has " << FindElement((int)tmp)->HBondDistance[0] << " Angstrom typical distance to hydrogen." << endl; 269 } 270 infile.close(); 271 infile.clear(); 272 } else 273 otherstatus = false; 274 275 // fill H-BondAngle DB per element 276 strncpy(filename, path, MAXSTRINGSIZE); 277 strncat(filename, "/", MAXSTRINGSIZE-strlen(filename)); 278 strncat(filename, STANDARDHBONDANGLEDB, MAXSTRINGSIZE-strlen(filename)); 279 infile.open(filename); 280 if (infile != NULL) { 281 while (!infile.eof()) { 282 infile >> tmp; 283 ptr = FindElement((int)tmp); 284 infile >> ws; 285 infile >> ptr->HBondAngle[0]; 286 infile >> ptr->HBondAngle[1]; 287 infile >> ptr->HBondAngle[2]; 288 infile >> ws; 289 //cout << Verbose(3) << "Element " << (int)tmp << " has " << FindElement((int)tmp)->HBondAngle[0] << ", " << FindElement((int)tmp)->HBondAngle[1] << ", " << FindElement((int)tmp)->HBondAngle[2] << " degrees bond angle for one, two, three connected hydrogens." << endl; 290 } 291 infile.close(); 292 } else 293 otherstatus = false; 294 295 if (!otherstatus) 296 cerr << "WARNING: Something went wrong while parsing the other databases!" << endl; 297 298 return status; 299 299 }; 300 300 … … 303 303 bool periodentafel::StorePeriodentafel(char *path) const 304 304 { 305 bool result = true;306 ofstream f;307 char filename[MAXSTRINGSIZE];308 309 strncpy(filename, path, MAXSTRINGSIZE);310 strncat(filename, "/", MAXSTRINGSIZE-strlen(filename));311 strncat(filename, STANDARDELEMENTSDB, MAXSTRINGSIZE-strlen(filename));312 f.open(filename);313 if (f != NULL) {314 f << header1 << endl;315 f << header2 << endl;316 element *walker = periodentafel::start;317 while (walker->next != periodentafel::end) {318 walker = walker->next;319 result = result && walker->Output(&f);320 }321 f.close();322 } else323 result = false;324 return result;325 }; 305 bool result = true; 306 ofstream f; 307 char filename[MAXSTRINGSIZE]; 308 309 strncpy(filename, path, MAXSTRINGSIZE); 310 strncat(filename, "/", MAXSTRINGSIZE-strlen(filename)); 311 strncat(filename, STANDARDELEMENTSDB, MAXSTRINGSIZE-strlen(filename)); 312 f.open(filename); 313 if (f != NULL) { 314 f << header1 << endl; 315 f << header2 << endl; 316 element *walker = periodentafel::start; 317 while (walker->next != periodentafel::end) { 318 walker = walker->next; 319 result = result && walker->Output(&f); 320 } 321 f.close(); 322 } else 323 result = false; 324 return result; 325 };
Note:
See TracChangeset
for help on using the changeset viewer.
