48#include "types/EAMAdapter.hpp"
54#include "utils/CaseConversion.hpp"
55#include "utils/simError.h"
59 bool EAMAdapter::isEAM() {
return at_->hasProperty(EAMtypeID); }
63 snprintf(painCave.errMsg, MAX_SIM_ERROR_MSG_LENGTH,
64 "EAMAdapter::getEAMParam was passed an atomType (%s)\n"
65 "\tthat does not appear to be an EAM atom.\n",
66 at_->getName().c_str());
67 painCave.severity = OPENMD_ERROR;
72 std::shared_ptr<GenericData> data = at_->getPropertyByName(EAMtypeID);
73 if (data ==
nullptr) {
74 snprintf(painCave.errMsg, MAX_SIM_ERROR_MSG_LENGTH,
75 "EAMAdapter::getEAMParam could not find EAM\n"
76 "\tparameters for atomType %s.\n",
77 at_->getName().c_str());
78 painCave.severity = OPENMD_ERROR;
83 std::shared_ptr<EAMData> eamData = std::dynamic_pointer_cast<EAMData>(data);
84 if (eamData ==
nullptr) {
85 snprintf(painCave.errMsg, MAX_SIM_ERROR_MSG_LENGTH,
86 "EAMAdapter::getEAMParam could not convert\n"
87 "\tGenericData to EAMData for atom type %s\n",
88 at_->getName().c_str());
89 painCave.severity = OPENMD_ERROR;
94 return eamData->getData();
99 snprintf(painCave.errMsg, MAX_SIM_ERROR_MSG_LENGTH,
100 "EAMAdapter::getFuncflParam was passed an atomType (%s)\n"
101 "\tthat does not appear to be an EAM atom.\n",
102 at_->getName().c_str());
103 painCave.severity = OPENMD_ERROR;
104 painCave.isFatal = 1;
108 std::shared_ptr<GenericData> data = at_->getPropertyByName(FuncflTypeID);
109 if (data ==
nullptr) {
110 snprintf(painCave.errMsg, MAX_SIM_ERROR_MSG_LENGTH,
111 "EAMAdapter::getFuncflParam could not find Funcfl\n"
112 "\tparameters for atomType %s.\n",
113 at_->getName().c_str());
114 painCave.severity = OPENMD_ERROR;
115 painCave.isFatal = 1;
119 std::shared_ptr<FuncflData> funcflData =
120 std::dynamic_pointer_cast<FuncflData>(data);
121 if (funcflData ==
nullptr) {
122 snprintf(painCave.errMsg, MAX_SIM_ERROR_MSG_LENGTH,
123 "EAMAdapter::getFuncflParam could not convert\n"
124 "\tGenericData to FuncflData for atom type %s\n",
125 at_->getName().c_str());
126 painCave.severity = OPENMD_ERROR;
127 painCave.isFatal = 1;
131 return funcflData->getData();
136 snprintf(painCave.errMsg, MAX_SIM_ERROR_MSG_LENGTH,
137 "EAMAdapter::getZhouParam was passed an atomType (%s)\n"
138 "\tthat does not appear to be an EAM atom.\n",
139 at_->getName().c_str());
140 painCave.severity = OPENMD_ERROR;
141 painCave.isFatal = 1;
145 std::shared_ptr<GenericData> data = at_->getPropertyByName(ZhouTypeID);
146 if (data ==
nullptr) {
147 snprintf(painCave.errMsg, MAX_SIM_ERROR_MSG_LENGTH,
148 "EAMAdapter::getZhouParam could not find Zhou\n"
149 "\tparameters for atomType %s.\n",
150 at_->getName().c_str());
151 painCave.severity = OPENMD_ERROR;
152 painCave.isFatal = 1;
156 std::shared_ptr<ZhouData> zhouData =
157 std::dynamic_pointer_cast<ZhouData>(data);
158 if (zhouData ==
nullptr) {
159 snprintf(painCave.errMsg, MAX_SIM_ERROR_MSG_LENGTH,
160 "EAMAdapter::getZhouParam could not convert\n"
161 "\tGenericData to ZhouData for atom type %s\n",
162 at_->getName().c_str());
163 painCave.severity = OPENMD_ERROR;
164 painCave.isFatal = 1;
168 return zhouData->getData();
171 EAMType EAMAdapter::getEAMType() {
172 EAMParameters eamParam = getEAMParam();
173 return eamParam.eamType;
176 std::string EAMAdapter::getLatticeType() {
177 EAMParameters eamParam = getEAMParam();
178 return eamParam.latticeType;
181 RealType EAMAdapter::getLatticeConstant() {
182 EAMParameters eamParam = getEAMParam();
183 return eamParam.latticeConstant;
186 CubicSplinePtr EAMAdapter::getZSpline() {
187 FuncflParameters funcflParam = getFuncflParam();
188 int nr = funcflParam.nr;
189 RealType dr = funcflParam.dr;
190 std::vector<RealType> rvals;
192 for (
int i = 0; i < nr; i++)
193 rvals.push_back(RealType(i) * dr);
195 CubicSplinePtr cs {std::make_shared<CubicSpline>()};
196 cs->addPoints(rvals, funcflParam.Z);
200 CubicSplinePtr EAMAdapter::getRhoSpline() {
201 FuncflParameters funcflParam = getFuncflParam();
202 int nr = funcflParam.nr;
203 RealType dr = funcflParam.dr;
204 std::vector<RealType> rvals;
206 for (
int i = 0; i < nr; i++)
207 rvals.push_back(RealType(i) * dr);
209 CubicSplinePtr cs {std::make_shared<CubicSpline>()};
210 cs->addPoints(rvals, funcflParam.rho);
214 CubicSplinePtr EAMAdapter::getFSpline() {
215 FuncflParameters funcflParam = getFuncflParam();
216 int nrho = funcflParam.nrho;
217 RealType drho = funcflParam.drho;
218 std::vector<RealType> rhovals;
220 for (
int i = 0; i < nrho; i++) {
221 rhovals.push_back(RealType(i) * drho);
224 CubicSplinePtr cs {std::make_shared<CubicSpline>()};
225 cs->addPoints(rhovals, funcflParam.F);
229 void EAMAdapter::makeFuncfl(RealType latticeConstant, std::string latticeType,
230 int nrho, RealType drho,
int nr, RealType dr,
231 RealType rcut, vector<RealType> Z,
232 vector<RealType> rho, vector<RealType> F) {
234 at_->removeProperty(EAMtypeID);
235 at_->removeProperty(FuncflTypeID);
238 EAMParameters eamParam {};
239 FuncflParameters funcflParam {};
241 eamParam.eamType = eamFuncfl;
242 eamParam.latticeConstant = latticeConstant;
243 eamParam.latticeType = latticeType;
245 funcflParam.nrho = nrho;
246 funcflParam.drho = drho;
249 funcflParam.rcut = rcut;
251 funcflParam.rho = rho;
254 at_->addProperty(std::make_shared<EAMData>(EAMtypeID, eamParam));
255 at_->addProperty(std::make_shared<FuncflData>(FuncflTypeID, funcflParam));
258 void EAMAdapter::makeZhou2001(std::string latticeType, RealType re,
259 RealType fe, RealType rhoe, RealType alpha,
260 RealType beta, RealType A, RealType B,
261 RealType kappa, RealType lambda,
262 std::vector<RealType> Fn,
263 std::vector<RealType> F, RealType eta,
266 at_->removeProperty(EAMtypeID);
267 at_->removeProperty(ZhouTypeID);
270 EAMParameters eamParam {};
271 ZhouParameters zhouParam {};
273 eamParam.eamType = eamZhou2001;
275 toUpper(latticeType);
276 eamParam.latticeType = latticeType;
278 if (latticeType ==
"HCP")
279 eamParam.latticeConstant = re;
280 else if (latticeType ==
"BCC")
281 eamParam.latticeConstant = 2.0 * re / sqrt(3.0);
283 eamParam.latticeConstant = 2.0 * re / sqrt(2.0);
287 zhouParam.rhoe = rhoe;
288 zhouParam.alpha = alpha;
289 zhouParam.beta = beta;
292 zhouParam.kappa = kappa;
293 zhouParam.lambda = lambda;
299 at_->addProperty(std::make_shared<EAMData>(EAMtypeID, eamParam));
300 at_->addProperty(std::make_shared<ZhouData>(ZhouTypeID, zhouParam));
303 void EAMAdapter::makeZhou2004(std::string latticeType, RealType re,
304 RealType fe, RealType rhoe, RealType rhos,
305 RealType alpha, RealType beta, RealType A,
306 RealType B, RealType kappa, RealType lambda,
307 std::vector<RealType> Fn,
308 std::vector<RealType> F, RealType eta,
309 RealType Fe, RealType rhol, RealType rhoh) {
311 at_->removeProperty(EAMtypeID);
312 at_->removeProperty(ZhouTypeID);
315 EAMParameters eamParam {};
316 ZhouParameters zhouParam {};
318 eamParam.eamType = eamZhou2004;
320 toUpper(latticeType);
321 eamParam.latticeType = latticeType;
323 if (latticeType ==
"HCP")
324 eamParam.latticeConstant = re;
325 else if (latticeType ==
"BCC")
326 eamParam.latticeConstant = 2.0 * re / sqrt(3.0);
328 eamParam.latticeConstant = 2.0 * re / sqrt(2.0);
332 zhouParam.rhoe = rhoe;
333 zhouParam.alpha = alpha;
334 zhouParam.beta = beta;
337 zhouParam.kappa = kappa;
338 zhouParam.lambda = lambda;
343 zhouParam.rhos = rhos;
344 zhouParam.rhol = rhol;
345 zhouParam.rhoh = rhoh;
347 at_->addProperty(std::make_shared<EAMData>(EAMtypeID, eamParam));
348 at_->addProperty(std::make_shared<ZhouData>(ZhouTypeID, zhouParam));
351 void EAMAdapter::makeZhou2005(std::string latticeType, RealType re,
352 RealType fe, RealType rhoe, RealType rhos,
353 RealType alpha, RealType beta, RealType A,
354 RealType B, RealType kappa, RealType lambda,
355 std::vector<RealType> Fn,
356 std::vector<RealType> F, RealType F3plus,
357 RealType F3minus, RealType eta, RealType Fe) {
359 at_->removeProperty(EAMtypeID);
360 at_->removeProperty(ZhouTypeID);
363 EAMParameters eamParam {};
364 ZhouParameters zhouParam {};
366 eamParam.eamType = eamZhou2005;
368 toUpper(latticeType);
369 eamParam.latticeType = latticeType;
371 if (latticeType ==
"HCP")
372 eamParam.latticeConstant = re;
373 else if (latticeType ==
"BCC")
374 eamParam.latticeConstant = 2.0 * re / sqrt(3.0);
376 eamParam.latticeConstant = 2.0 * re / sqrt(2.0);
380 zhouParam.rhoe = rhoe;
381 zhouParam.alpha = alpha;
382 zhouParam.beta = beta;
385 zhouParam.kappa = kappa;
386 zhouParam.lambda = lambda;
389 zhouParam.F3plus = F3plus;
390 zhouParam.F3minus = F3minus;
393 zhouParam.rhos = rhos;
395 at_->addProperty(std::make_shared<EAMData>(EAMtypeID, eamParam));
396 at_->addProperty(std::make_shared<ZhouData>(ZhouTypeID, zhouParam));
399 void EAMAdapter::makeZhou2005Oxygen(RealType re, RealType fe, RealType alpha,
400 RealType beta, RealType A, RealType B,
401 RealType kappa, RealType lambda,
402 RealType gamma, RealType nu,
403 std::vector<RealType> OrhoLimits,
404 std::vector<RealType> OrhoE,
405 std::vector<std::vector<RealType>> OF) {
407 at_->removeProperty(EAMtypeID);
408 at_->removeProperty(ZhouTypeID);
411 EAMParameters eamParam {};
412 ZhouParameters zhouParam {};
414 eamParam.eamType = eamZhou2005Oxygen;
416 eamParam.latticeConstant = re;
420 zhouParam.alpha = alpha;
421 zhouParam.beta = beta;
424 zhouParam.kappa = kappa;
425 zhouParam.lambda = lambda;
426 zhouParam.gamma = gamma;
428 zhouParam.OrhoLimits = OrhoLimits;
429 zhouParam.OrhoE = OrhoE;
432 at_->addProperty(std::make_shared<EAMData>(EAMtypeID, eamParam));
433 at_->addProperty(std::make_shared<ZhouData>(ZhouTypeID, zhouParam));
436 void EAMAdapter::makeZhouRose(RealType re, RealType fe, RealType rhoe,
437 RealType alpha, RealType beta, RealType A,
438 RealType B, RealType kappa, RealType lambda,
441 at_->removeProperty(EAMtypeID);
442 at_->removeProperty(ZhouTypeID);
445 EAMParameters eamParam {};
446 ZhouParameters zhouParam {};
448 eamParam.eamType = eamZhouRose;
449 eamParam.latticeConstant = re;
452 zhouParam.rhoe = rhoe;
453 zhouParam.alpha = alpha;
454 zhouParam.beta = beta;
457 zhouParam.kappa = kappa;
458 zhouParam.lambda = lambda;
461 at_->addProperty(std::make_shared<EAMData>(EAMtypeID, eamParam));
462 at_->addProperty(std::make_shared<ZhouData>(ZhouTypeID, zhouParam));
465 void EAMAdapter::makeOxygenFuncfl(RealType re, RealType fe, RealType alpha,
466 RealType beta, RealType A, RealType B,
467 RealType kappa, RealType lambda,
468 RealType drho, RealType nrho,
469 std::vector<RealType> F) {
471 at_->removeProperty(EAMtypeID);
472 at_->removeProperty(ZhouTypeID);
473 at_->removeProperty(FuncflTypeID);
476 EAMParameters eamParam {};
477 FuncflParameters funcflParam {};
478 ZhouParameters zhouParam {};
480 eamParam.eamType = eamOxygenFuncfl;
481 eamParam.latticeConstant = re;
484 zhouParam.alpha = alpha;
485 zhouParam.beta = beta;
488 zhouParam.kappa = kappa;
489 zhouParam.lambda = lambda;
492 funcflParam.drho = drho;
493 funcflParam.nrho = nrho;
495 at_->addProperty(std::make_shared<EAMData>(EAMtypeID, eamParam));
496 at_->addProperty(std::make_shared<ZhouData>(ZhouTypeID, zhouParam));
497 at_->addProperty(std::make_shared<FuncflData>(FuncflTypeID, funcflParam));
500 int EAMAdapter::getNrho() {
501 FuncflParameters funcflParam = getFuncflParam();
502 return funcflParam.nrho;
505 RealType EAMAdapter::getDrho() {
506 FuncflParameters funcflParam = getFuncflParam();
507 return funcflParam.drho;
510 int EAMAdapter::getNr() {
511 FuncflParameters funcflParam = getFuncflParam();
512 return funcflParam.nr;
515 RealType EAMAdapter::getDr() {
516 FuncflParameters funcflParam = getFuncflParam();
517 return funcflParam.dr;
520 RealType EAMAdapter::getRcut() {
521 FuncflParameters funcflParam = getFuncflParam();
522 return funcflParam.rcut;
525 RealType EAMAdapter::getRe() {
526 ZhouParameters zhouParam = getZhouParam();
529 RealType EAMAdapter::get_fe() {
530 ZhouParameters zhouParam = getZhouParam();
533 RealType EAMAdapter::getRhoe() {
534 ZhouParameters zhouParam = getZhouParam();
535 return zhouParam.rhoe;
537 RealType EAMAdapter::getAlpha() {
538 ZhouParameters zhouParam = getZhouParam();
539 return zhouParam.alpha;
541 RealType EAMAdapter::getBeta() {
542 ZhouParameters zhouParam = getZhouParam();
543 return zhouParam.beta;
545 RealType EAMAdapter::getA() {
546 ZhouParameters zhouParam = getZhouParam();
549 RealType EAMAdapter::getB() {
550 ZhouParameters zhouParam = getZhouParam();
553 RealType EAMAdapter::getKappa() {
554 ZhouParameters zhouParam = getZhouParam();
555 return zhouParam.kappa;
557 RealType EAMAdapter::getLambda() {
558 ZhouParameters zhouParam = getZhouParam();
559 return zhouParam.lambda;
561 RealType EAMAdapter::getGamma() {
562 ZhouParameters zhouParam = getZhouParam();
563 return zhouParam.gamma;
565 RealType EAMAdapter::getNu() {
566 ZhouParameters zhouParam = getZhouParam();
569 std::vector<RealType> EAMAdapter::getFn() {
570 ZhouParameters zhouParam = getZhouParam();
573 std::vector<RealType> EAMAdapter::getF() {
574 ZhouParameters zhouParam = getZhouParam();
577 RealType EAMAdapter::getF3plus() {
578 ZhouParameters zhouParam = getZhouParam();
579 return zhouParam.F3plus;
581 RealType EAMAdapter::getF3minus() {
582 ZhouParameters zhouParam = getZhouParam();
583 return zhouParam.F3minus;
586 RealType EAMAdapter::getEta() {
587 ZhouParameters zhouParam = getZhouParam();
588 return zhouParam.eta;
591 RealType EAMAdapter::getFe() {
592 ZhouParameters zhouParam = getZhouParam();
596 RealType EAMAdapter::getRhos() {
597 ZhouParameters zhouParam = getZhouParam();
598 return zhouParam.rhos;
601 RealType EAMAdapter::getRhol() {
602 ZhouParameters zhouParam = getZhouParam();
603 return zhouParam.rhol;
606 RealType EAMAdapter::getRhoh() {
607 ZhouParameters zhouParam = getZhouParam();
608 return zhouParam.rhoh;
611 std::vector<RealType> EAMAdapter::getOrhoLimits() {
612 ZhouParameters zhouParam = getZhouParam();
613 return zhouParam.OrhoLimits;
615 std::vector<RealType> EAMAdapter::getOrhoE() {
616 ZhouParameters zhouParam = getZhouParam();
617 return zhouParam.OrhoE;
620 std::vector<std::vector<RealType>> EAMAdapter::getOF() {
621 ZhouParameters zhouParam = getZhouParam();
624 RealType EAMAdapter::getF0() {
625 ZhouParameters zhouParam = getZhouParam();
This basic Periodic Table class was originally taken from the data.cpp file in OpenBabel.