// -*- C++ -*-
// Potential.cpp: Common functionality for all potentials.
//
// Copyright (C) 2001-2012 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.
//
// 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 .
#include "AsapPython.h"
#include "Asap.h"
#include "Atoms.h"
#include "Potential.h"
#include "Debug.h"
// Standard mapping of the six independent parts of the stress tensor to
// vector notation
const static int stresscomp[3][3] = {{0, 5, 4}, {5, 1, 3}, {4, 3, 2}};
void Potential::RecoverAfterException()
{
DEBUGPRINT;
if (atoms != NULL && atoms->IsActive())
atoms->End();
}
SymTensor Potential::GetVirial(PyObject *a)
{
DEBUGPRINT;
SymTensor result;
for (int i = 0; i < 6; i++)
result[i] = 0;
const vector &virials = GetVirials(a);
for (int i = 0; i < virials.size(); i++)
result += virials[i];
DEBUGPRINT;
return result;
}
#ifdef ASAP_FOR_KIM
// When building as an OpenKIM model, there is no Python layer to pass through.
void Potential::SetAtoms_ThroughPython(PyObject *pyatoms, Atoms* accessobj /* = NULL */)
{
SetAtoms(pyatoms, accessobj);
}
#else
// The normal version
void Potential::SetAtoms_ThroughPython(PyObject *pyatoms, Atoms* accessobj /* = NULL */)
{
DEBUGPRINT;
// Call self.set_atoms(...) as implemented in Python
PyObject *py_accessobj;
if (accessobj == NULL)
{
py_accessobj = Py_None;
Py_INCREF(Py_None);
}
else
{
#if PY_VERSION_HEX < 0x02070000
py_accessobj = PyCObject_FromVoidPtr(accessobj, NULL);
#else
py_accessobj = PyCapsule_New(accessobj, "asap3.accessobj", NULL);
#endif
}
if (py_accessobj == NULL)
throw AsapPythonError();
PyObject *method = PyAsapString_FromString("set_atoms");
if (method == NULL)
throw AsapPythonError();
PyObject *result = PyObject_CallMethodObjArgs(self, method, pyatoms, py_accessobj, NULL);
bool error = (result == NULL);
Py_XDECREF(result);
Py_DECREF(method);
Py_DECREF(py_accessobj);
if (error)
throw AsapPythonError();
DEBUGPRINT;
}
#endif