=================
Design Principles
=================

Scope and Features of ``GMSO``
----------------------------------

``GMSO`` is designed to enable the flexible, general representation of
chemical topologies for molecular simulation. Efforts are made to enable
lossless, bias-free storage of data, without assuming particular chemistries,
models, or using any particular engine's ecosystem as a starting point. The
scope is generally restrained to the preparation, manipulation, and conversion
of input files for molecular simulation, i.e., before engines are called
to execute the simulations themselves. ``GMSO`` currently does not support
conversions between trajectory file formats for analysis codes. In the scope of
molecular simulation, we loosely define a chemical topology as everything
needed to reproducibly prepare a chemical system for simulation. This includes
particle coordinates and connectivity, box information, force field data
(functional forms, parameters tagged with units, partial charges, etc.) and
some optional information that may not apply to all systems (i.e. specification
of elements with each particle).

``GMSO`` enables the following features:

* Supporting a variety of models in the molecular simulation/computational
  chemistry community: No assumptions are made about an interaction site
  representing an atom or bead, instead supported atomistic,
  united-atom/coarse-grained, polarizable, and other models!

* Greater flexibility for exotic potentials: The ``AtomType`` (and analogue
  classes for intramolecular interactions) uses ``sympy`` to store any
  potential that can be represented by a mathematical expression. If you can
  write it down, it can be stored!

* Easier development for glue to new engines: by not being designed for
  compatibility with any particular molecular simulation engine or ecosystem,
  it becomes more tractable for developers in the community to add glue for
  engines that are not currently supported (and even ones that do not exist at
  present)!


* Compatibility with existing community tools: No single molecular simulation
  tool will be a silver bullet, so ``GMSO`` includes functions to convert
  objects. These can be used in their own right to convert between objects in-memory
  and also to support conversion to file formats not natively supported at
  any given time. Currently supported conversions include ``ParmEd``,
  ``OpenMM``, ``mBuild``, ``MDTraj``, with others coming in the future!


* Native support for reading and writing many common file formats (``XYZ``,
  ``GRO``, ``TOP``, ``LAMMPSDATA``, ``GSD``) and indirect support, through other
  libraries, for many more!


Structure of ``GMSO``
-------------------------
There are three main modules within the Python package:

* ``gmso.core`` stores the classes that constitute the core data structures.
* ``gmso.formats`` stores readers and writers for (on-disk) file formats.
* ``gmso.external`` includes functions that convert core data structures between external libraries and their internal representation.
