Source code for pyretis.setup.createforcefield

# -*- coding: utf-8 -*-
# Copyright (c) 2023, PyRETIS Development Team.
# Distributed under the LGPLv2.1+ License. See LICENSE for more info.
"""This module handles the creation of force fields from simulation settings.

Important methods defined here
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

create_potentials (:py:func:`.create_potentials`)
    Method for creating potentials from a dictionary of settings.
    Note that this method will make use of :py:func:`.create_potential`.

create_force_field (:py:func:`.create_force_field`)
    Method to create a force field from input settings.
"""
import logging
from pyretis.setup.common import create_potential
from pyretis.forcefield import ForceField
logger = logging.getLogger(__name__)  # pylint: disable=invalid-name
logger.addHandler(logging.NullHandler())


__all__ = ['create_force_field', 'create_potentials']


[docs]def create_potentials(settings): """Create potential functions from given simulations settings. This method will basically loop over the given potential settings and just run :py:func:`.create_potential` for each setting. Parameters ---------- settings : dict This dictionary contains the settings for the simulation. Returns ------- out[0] : list A list of potential functions. out[1] : list A list of parameters for the potential functions. """ potentials = settings.get('potential', []) try: ndim = settings['system']['dimensions'] except KeyError: ndim = None out_pot, out_par = [], [] for i, pot_settings in enumerate(potentials): potential_function = create_potential(settings, pot_settings) if potential_function is None: msg = 'The following potential settings were ignored!\n{}' msgtxt = msg.format(pot_settings) logger.warning(msgtxt) pdim = getattr(potential_function, 'dim', None) if pdim is not None and ndim is not None: if ndim != pdim: msg = ('Inconsistent dimensions in potential!' '\nSettings gives: {}D, potential {} is {}D') msgtxt = msg.format(ndim, i, pdim) logger.error(msgtxt) raise ValueError(msgtxt) out_pot.append(potential_function) out_par.append(pot_settings.get('parameter', None)) return out_pot, out_par
[docs]def create_force_field(settings): """Create a force field from input settings. This method will create the required potential functions with the specified parameters from `settings`. Parameters ---------- settings : dict This dictionary contains the settings for a single potential. Returns ------- out : object like :py:class:`.ForceField` This object represents the force field. """ try: desc = settings['forcefield']['description'] except KeyError: desc = 'Generic force field' potentials, pot_param = create_potentials(settings) ffield = ForceField(desc, potential=potentials, params=pot_param) msg = ['Created force field:', '{}'.format(ffield)] msgtxt = '\n'.join(msg) logger.info(msgtxt) return ffield