/*
 * This file is part of the GROMACS molecular simulation package.
 *
 * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
 * Copyright (c) 2001-2004, The GROMACS development team,
 * check out http://www.gromacs.org for more information.
 * Copyright (c) 2012,2013, by the GROMACS development team, led by
 * David van der Spoel, Berk Hess, Erik Lindahl, and including many
 * others, as listed in the AUTHORS file in the top-level source
 * directory and at http://www.gromacs.org.
 *
 * GROMACS is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public License
 * as published by the Free Software Foundation; either version 2.1
 * of the License, or (at your option) any later version.
 *
 * GROMACS 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
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with GROMACS; if not, see
 * http://www.gnu.org/licenses, or write to the Free Software Foundation,
 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA.
 *
 * If you want to redistribute modifications to GROMACS, please
 * consider that scientific software is very special. Version
 * control is crucial - bugs must be traceable. We will be happy to
 * consider code for inclusion in the official distribution, but
 * derived work must not be called official GROMACS. Details are found
 * in the README & COPYING files - if they are missing, get the
 * official version at http://www.gromacs.org.
 *
 * To help us fund GROMACS development, we humbly ask that you cite
 * the research papers on the package. Check out http://www.gromacs.org.
 */

#ifndef _grompp_h
#define _grompp_h

#include <stdio.h>
#include "visibility.h"
#include "typedefs.h"
#include "macros.h"

#ifdef __cplusplus
extern "C" {
#endif

#define MAXSLEN 32

typedef struct {
    gmx_bool bSet;              /* Has this combination been set        */
    real     c[4];              /* The non-bonded parameters            */
} t_nbparam;
/* The t_nbparam struct is used to temporary store the explicit
 * non-bonded parameter combinations, which will be copied to t_params.
 */

typedef struct {
    atom_id    a[MAXATOMLIST];   /* The atom list (eg. bonds: particle	*/
    /* i = a[0] (AI), j = a[1] (AJ))	*/
    real       c[MAXFORCEPARAM]; /* Force parameters (eg. b0 = c[0])	*/
    char       s[MAXSLEN];       /* A string (instead of parameters),    *
                                  * read from the .rtp file in pdb2gmx   */
} t_param;

typedef struct {
    int          nr;    /* The number of bonds in this record   */
    int          maxnr; /* The amount of elements in the array  */
    t_param     *param; /* Array of parameters (dim: nr)	*/

    /* CMAP tmp data, there are probably better places for this */
    int         grid_spacing; /* Cmap grid spacing */
    int         nc;           /* Number of cmap angles */

    real       *cmap;         /* Temporary storage of the raw cmap grid data */
    int         ncmap;        /* Number of allocated elements in cmap grid*/

    int        *cmap_types;   /* Store the five atomtypes followed by a number that identifies the type */
    int         nct;          /* Number of allocated elements in cmap_types */

} t_params;

typedef struct {
    int            nr;          /* The number of exclusions             */
    atom_id       *e;           /* The excluded atoms                   */
} t_excls;

typedef struct {
    char            **name;
    int               nrexcl;       /* Number of exclusions per atom	*/
    gmx_bool          excl_set;     /* Have exclusions been generated?	*/
    gmx_bool          bProcessed;   /* Has the mol been processed           */
    t_atoms           atoms;        /* Atoms                                */
    t_block           cgs;          /* Charge groups                        */
    t_block           mols;         /* Molecules                            */
    t_blocka          excls;        /* Exclusions                           */
    t_params          plist[F_NRE]; /* Parameters in old style              */
} t_molinfo;

typedef struct {
    char *name;
    int   nr;
} t_mols;

GMX_LIBGMXPREPROCESS_EXPORT
gmx_bool is_int(double x);
/* Returns TRUE when x is integer */

typedef enum {
    d_defaults,
    d_atomtypes,
    d_bondtypes,
    d_constrainttypes,
    d_pairtypes,
    d_angletypes,
    d_dihedraltypes,
    d_nonbond_params,
    d_implicit_genborn_params,
    d_implicit_surface_params,
    d_cmaptypes,
    d_moleculetype,
    d_atoms,
    d_vsites2,
    d_vsites3,
    d_vsites4,
    d_vsitesn,
    d_bonds,
    d_exclusions,
    d_pairs,
    d_pairs_nb,
    d_angles,
    d_dihedrals,
    d_constraints,
    d_settles,
    d_polarization,
    d_water_polarization,
    d_thole_polarization,
    d_system,
    d_molecules,
    d_position_restraints,
    d_angle_restraints,
    d_angle_restraints_z,
    d_distance_restraints,
    d_orientation_restraints,
    d_dihedral_restraints,
    d_cmap,
    d_maxdir,
    d_invalid,
    d_none
} directive;

static const char *ds[d_maxdir+1] = {
    "defaults",
    "atomtypes",
    "bondtypes",
    "constrainttypes",
    "pairtypes",
    "angletypes",
    "dihedraltypes",
    "nonbond_params",
    "implicit_genborn_params",
    "implicit_surface_params",
    "cmaptypes",
    /* All the directives above can not appear after moleculetype */
    "moleculetype",
    "atoms",
    "virtual_sites2",
    "virtual_sites3",
    "virtual_sites4",
    "virtual_sitesn",
    "bonds",
    "exclusions",
    "pairs",
    "pairs_nb",
    "angles",
    "dihedrals",
    "constraints",
    "settles",
    "polarization",
    "water_polarization",
    "thole_polarization",
    "system",
    "molecules",
    "position_restraints",
    "angle_restraints",
    "angle_restraints_z",
    "distance_restraints",
    "orientation_restraints",
    "dihedral_restraints",
    "cmap",
    "invalid"
};

#ifdef __cplusplus
}
#endif

#endif  /* _grompp_h */
