// EMTParameterProvider.h -- Abstract class for objects providing EMT parameters. // // Copyright (C) 2001-2011 Jakob Schiotz and Center for Individual // Nanoparticle Functionality, Department of Physics, Technical // University of Denmark. Email: schiotz@fysik.dtu.dk // // This file is part of Asap version 3. // Asap is released under the GNU Lesser Public License (LGPL) version 3. // However, the parts of Asap distributed within the OpenKIM project // (including this file) are also released under the Common Development // and Distribution License (CDDL) version 1.0. // // This program is free software: you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public License // version 3 as published by the Free Software Foundation. Permission // to use other versions of the GNU Lesser General Public License may // granted by Jakob Schiotz or the head of department of the // Department of Physics, Technical University of Denmark, as // described in section 14 of the GNU General Public License. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // and the GNU Lesser Public License along with this program. If not, // see . #ifndef _EMTPARAMETERPROVIDER_H #define _EMTPARAMETERPROVIDER_H #include "AsapPython.h" #include "Asap.h" #include "AsapObject.h" #include "TinyMatrix.h" #include using std::string; namespace ASAPSPACE { // The stucture used to for store EMT parameters. struct emt_parameters { double e0, seq, neq, V0, eta2, kappa, lambda, mass, invmass; double gamma1, gamma2; // double pairA, pairD; double lengthscale; // Not an EMT parameter. 1/sqrt(2) of the lattice constant. int Z; std::string name; int index; // An index into various arrays. Counts the elements in the simulation. }; // A geometric constant. // static const double Beta = 1.80939979; // ((16*pi/3)^(1/3))/sqrt(2) static const double Beta = 1.809; // Preserve same rounding as in ARTwork. /// An EMTParameterProvider provides the EMT parameters to the potential. /// /// The GetParameters() method returns the parameters for a /// given element. If it is called multiple times with the same /// element it must return a pointer to the same emt_parameters struct. /// The Provider owns the parameters, they are deleted when the /// provider is deleted. After getting _all_ the elements, /// CalcGammaEtc() should be called to calculate the cutoff radius, the /// gammas and other quantities that cannot be calculated before it is /// known which elements are in the simulation. The gammas and the /// cutoff are determined by the Provider since changing the way they /// are determined corresponds to changing the EMT potential. class EMTParameterProvider : public AsapObject { public: virtual ~EMTParameterProvider() {}; virtual const emt_parameters *GetParameters(int element) = 0; virtual void CalcGammaEtc() = 0; virtual double GetCutoffDistance() = 0; // Can it be made element-dependent? virtual double GetCutoffSlope() = 0; virtual double GetListCutoffDistance() = 0; // Cutoff for neighbor list. virtual double GetMaxListCutoffDistance() = 0; // Max value, useful before initialization. virtual double GetLengthScale() = 0; // The potential delegates this to the provider. virtual const TinyDoubleMatrix *GetChi() = 0; virtual int GetNumberOfElements() = 0; }; /// The Python object corresponding to an EMTParameterProvider object. typedef struct { PyObject_HEAD EMTParameterProvider *cobj; PyObject *weakrefs; } PyAsap_EMTParamProvObject; } // end namespace #endif // ! _EMTPARAMETERPROVIDER_H