42#include "utils/simError.h"
45#define FILE_SEP_CHAR "\\"
47#define FILE_SEP_CHAR "/"
51#define BUFF_SIZE 32768
60 dir_ = std::string(
"TO_STRING(FRC_PATH)");
66 std::vector<Element*>::iterator i;
67 for (i = elements_.begin(); i != elements_.end(); ++i)
75 RealType Rcov, Rvdw, mass, elNeg, ARENeg, ionize, elAffin;
76 RealType red, green, blue;
79 if (buffer[0] !=
'#') {
81 "%d %3s %lf %lf %*f %lf %d %lf %lf %lf %lf %lf %lf %lf %255s",
82 &num, symbol, &ARENeg, &Rcov, &Rvdw, &maxbonds, &mass, &elNeg,
83 &ionize, &elAffin, &red, &green, &blue, name);
86 new Element(num, symbol, ARENeg, Rcov, Rvdw, maxbonds, mass, elNeg,
87 ionize, elAffin, red, green, blue, name);
88 elements_.push_back(ele);
95 return elements_.size();
101 if (atomicnum < 0 || atomicnum >=
static_cast<int>(elements_.size()))
104 return (elements_[atomicnum]->
GetSymbol());
110 if (atomicnum < 0 || atomicnum >=
static_cast<int>(elements_.size()))
119 if (atomicnum < 0 || atomicnum >=
static_cast<int>(elements_.size()))
128 if (atomicnum < 0 || atomicnum >=
static_cast<int>(elements_.size()))
137 if (atomicnum < 0 || atomicnum >=
static_cast<int>(elements_.size()))
146 if (atomicnum < 0 || atomicnum >=
static_cast<int>(elements_.size()))
155 std::vector<RealType> colors;
158 if (atomicnum < 0 || atomicnum >=
static_cast<int>(elements_.size())) {
159 colors.push_back(0.0);
160 colors.push_back(0.0);
161 colors.push_back(0.0);
165 colors.push_back(elements_[atomicnum]->GetRed());
166 colors.push_back(elements_[atomicnum]->GetGreen());
167 colors.push_back(elements_[atomicnum]->GetBlue());
175 if (atomicnum < 0 || atomicnum >=
static_cast<int>(elements_.size()))
178 return (elements_[atomicnum]->
GetName());
184 if (atomicnum < 0 || atomicnum >=
static_cast<int>(elements_.size()))
187 return (elements_[atomicnum]->
GetVdwRad());
194 if (atomicnum < 0 || atomicnum >=
static_cast<int>(elements_.size()))
197 rad = elements_[atomicnum]->GetCovalentRad();
211 if (atomicnum < 0 || atomicnum >=
static_cast<int>(elements_.size()))
214 rad = elements_[atomicnum]->GetVdwRad();
227 if (atomicnum < 0 || atomicnum >=
static_cast<int>(elements_.size()))
236 if (atomicnum < 0 || atomicnum >=
static_cast<int>(elements_.size()))
239 return (elements_[atomicnum]->
GetMass());
251 std::vector<Element*>::iterator i;
252 for (i = elements_.begin(); i != elements_.end(); ++i)
253 if (!strncasecmp(identifier, (*i)->GetSymbol(), 3))
254 return ((*i)->GetAtomicNum());
258 int numCharsToTest = std::max<int>(strlen(identifier), 5);
259 for (i = elements_.begin(); i != elements_.end(); ++i)
260 if (strncasecmp(identifier, (*i)->GetName().c_str(), numCharsToTest) == 0)
261 return ((*i)->GetAtomicNum());
263 if (strcasecmp(identifier,
"D") == 0 ||
264 (strcasecmp(identifier,
"Deuterium") == 0)) {
267 }
else if (strcasecmp(identifier,
"T") == 0 ||
268 (strcasecmp(identifier,
"Tritium") == 0)) {
271 }
else if (strcasecmp(identifier,
"Hl") == 0) {
273 snprintf(painCave.errMsg, MAX_SIM_ERROR_MSG_LENGTH,
274 "ElementsTable warning.\n"
275 "\tCannot understand the element label %s\n"
276 "\tGuessing it's hydrogen\n",
278 painCave.isFatal = 0;
279 painCave.severity = OPENMD_WARNING;
285 if (identifier[0] !=
'*') {
305 std::string buffer, subbuffer;
307 char charBuffer[BUFF_SIZE];
310 if (getenv(
envvar_.c_str()) != NULL) {
311 buffer = getenv(
envvar_.c_str());
312 buffer += FILE_SEP_CHAR;
317 subbuffer += FILE_SEP_CHAR;
325 ifs.
open(subbuffer.c_str());
327 if (!(&ifs)->is_open()) {
329 ifs.
open(buffer.c_str());
331 if (!(&ifs)->is_open()) {
332 snprintf(painCave.errMsg, MAX_SIM_ERROR_MSG_LENGTH,
333 "ElementsTable error.\n"
334 "\tunable to open datafile %s \n",
336 painCave.isFatal = 0;
342 while (ifs.getline(charBuffer, BUFF_SIZE))
346 if (ifs) ifs.
close();
348 if (GetSize() == 0) {
349 snprintf(painCave.errMsg, MAX_SIM_ERROR_MSG_LENGTH,
350 "ElementsTable error.\n"
351 "\tCannot initialize database %s \n",
353 painCave.isFatal = 0;
This basic Periodic Table class was originally taken from the data.h file in OpenBabel.
std::string dir_
data directory for file if _envvar fails
bool init_
whether the data been read already
RealType CorrectedVdwRad(int atomicnum, int hyb=3)
RealType CorrectedBondRad(int atomicnum, int hyb=3)
RealType GetCovalentRad(int atomicnum)
~ElementsTable()
Destructor.
const char * GetSymbol(int atomicnum)
unsigned int GetNumberOfElements()
RealType GetAllredRochowElectroNeg(int atomicnum)
ElementsTable()
Constructor.
std::vector< RealType > GetRGB(int atomicnum)
std::string filename_
file to search for
int GetMaxBonds(int atomicnum)
RealType GetElectronAffinity(int atomicnum)
RealType GetIonization(int atomicnum)
std::string envvar_
environment variable to check first
RealType GetMass(int atomicnum)
std::string GetName(int atomicnum)
void Init()
Read in the data file.
void ParseLine(const char *line)
Specified by particular table classes (parses an individual data line)
std::string subdir_
subdirectory (if using environment variable)
RealType GetVdwRad(int atomicnum)
RealType GetElectroNeg(int atomicnum)
int GetAtomicNum(const char *str)
ifstrstream class provides a stream interface to read data from files.
void open(const char *filename, std::ios_base::openmode mode=std::ios_base::in, bool checkFilename=false)
Opens a file and associates a buffer with the specified file to perform the i/o operations (single mo...
void close()
In single mode, closes a file.
This basic Periodic Table class was originally taken from the data.cpp file in OpenBabel.