Clean up Code

This commit is contained in:
Niels Mueller
2019-10-08 15:08:52 +02:00
parent 27fc2cbbcc
commit a820741ec3
4 changed files with 244 additions and 214 deletions

View File

@ -30,10 +30,14 @@ cdef extern from "gromacs/mdtypes/inputrec.h":
pass pass
ctypedef struct t_inputrec: ctypedef struct t_inputrec:
# t_inputrec()
# explicit t_inputrec(const t_inputrec &) = delete
# t_inputrec &operator=(const t_inputrec &) = delete
# ~t_inputrec()
int eI # Integration method */ int eI # Integration method */
int nsteps # number of steps to be taken */ gmx_int64_t nsteps # number of steps to be taken */
int simulation_part # Used in checkpointing to separate chunks */ int simulation_part # Used in checkpointing to separate chunks */
int init_step # start at a stepcount >0 (used w. convert-tpr) */ gmx_int64_t init_step # start at a stepcount >0 (used w. convert-tpr) */
int nstcalcenergy # frequency of energy calc. and T/P coupl. upd. */ int nstcalcenergy # frequency of energy calc. and T/P coupl. upd. */
int cutoff_scheme # group or verlet cutoffs */ int cutoff_scheme # group or verlet cutoffs */
int ns_type # which ns method should we use? */ int ns_type # which ns method should we use? */
@ -50,133 +54,140 @@ cdef extern from "gromacs/mdtypes/inputrec.h":
int nstxout_compressed # id. for compressed trj (.xtc,.tng) */ int nstxout_compressed # id. for compressed trj (.xtc,.tng) */
double init_t # initial time (ps) */ double init_t # initial time (ps) */
double delta_t # time step (ps) */ double delta_t # time step (ps) */
double x_compression_precision # precision of x in compressed trajectory file */ real x_compression_precision # precision of x in compressed trajectory file */
double fourier_spacing # requested fourier_spacing, when nk? not set */ real fourier_spacing # requested fourier_spacing, when nk? not set */
int nkx, nky, nkz # number of k vectors in each spatial dimension*/ int nkx, nky, nkz # number of k vectors in each spatial dimension*/
# for fourier methods for long range electrost.*/ # for fourier methods for long range electrost.*/
int pme_order # interpolation order for PME */ int pme_order # interpolation order for PME */
double ewald_rtol # double space tolerance for Ewald, determines */ real ewald_rtol # Real space tolerance for Ewald, determines */
# the double/reciprocal space relative weight */ # the real/reciprocal space relative weight */
double ewald_rtol_lj # double space tolerance for LJ-Ewald */ real ewald_rtol_lj # Real space tolerance for LJ-Ewald */
int ewald_geometry # normal/3d ewald, or pseudo-2d LR corrections */ int ewald_geometry # normal/3d ewald, or pseudo-2d LR corrections */
double epsilon_surface # Epsilon for PME dipole correction */ real epsilon_surface # Epsilon for PME dipole correction */
int ljpme_combination_rule # Type of combination rule in LJ-PME */ int ljpme_combination_rule # Type of combination rule in LJ-PME */
int ePBC # Type of periodic boundary conditions */ int ePBC # Type of periodic boundary conditions */
int bPeriodicMols # Periodic molecules */ int bPeriodicMols # Periodic molecules */
bint bContinuation # Continuation run: starting state is correct */ gmx_bool bContinuation # Continuation run: starting state is correct */
int etc # temperature coupling */ int etc # temperature coupling */
int nsttcouple # interval in steps for temperature coupling */ int nsttcouple # interval in steps for temperature coupling */
bint bPrintNHChains # whether to print nose-hoover chains */ gmx_bool bPrintNHChains # whether to print nose-hoover chains */
int epc # pressure coupling */ int epc # pressure coupling */
int epct # pressure coupling type */ int epct # pressure coupling type */
int nstpcouple # interval in steps for pressure coupling */ int nstpcouple # interval in steps for pressure coupling */
double tau_p # pressure coupling time (ps) */ real tau_p # pressure coupling time (ps) */
tensor ref_p # reference pressure (kJ/(mol nm^3)) */ tensor ref_p # reference pressure (kJ/(mol nm^3)) */
tensor compress # compressability ((mol nm^3)/kJ) */ tensor compress # compressability ((mol nm^3)/kJ) */
int refcoord_scaling # How to scale absolute reference coordinates */ int refcoord_scaling # How to scale absolute reference coordinates */
rvec posres_com # The COM of the posres atoms */ rvec posres_com # The COM of the posres atoms */
rvec posres_comB # The B-state COM of the posres atoms */ rvec posres_comB # The B-state COM of the posres atoms */
int andersen_seed # Random seed for Andersen thermostat (obsolete) */ int andersen_seed # Random seed for Andersen thermostat (obsolete) */
double verletbuf_tol # Per atom pair energy drift tolerance (kJ/mol/ps/atom) for list buffer */ real verletbuf_tol # Per atom pair energy drift tolerance (kJ/mol/ps/atom) for list buffer */
double rlist # short range pairlist cut-off (nm) */ real rlist # short range pairlist cut-off (nm) */
double rtpi # Radius for test particle insertion */ real rtpi # Radius for test particle insertion */
int coulombtype # Type of electrostatics treatment */ int coulombtype # Type of electrostatics treatment */
int coulomb_modifier # Modify the Coulomb interaction */ int coulomb_modifier # Modify the Coulomb interaction */
double rcoulomb_switch # Coulomb switch range start (nm) */ real rcoulomb_switch # Coulomb switch range start (nm) */
double rcoulomb # Coulomb cutoff (nm) */ real rcoulomb # Coulomb cutoff (nm) */
double epsilon_r # relative dielectric constant */ real epsilon_r # relative dielectric constant */
double epsilon_rf # relative dielectric constant of the RF */ real epsilon_rf # relative dielectric constant of the RF */
int implicit_solvent # No (=explicit water), or GBSA solvent models */ int implicit_solvent # No (=explicit water), or GBSA solvent models */
int gb_algorithm # Algorithm to use for calculation Born radii */ int gb_algorithm # Algorithm to use for calculation Born radii */
int nstgbradii # Frequency of updating Generalized Born radii */ int nstgbradii # Frequency of updating Generalized Born radii */
double rgbradii # Cutoff for GB radii calculation */ real rgbradii # Cutoff for GB radii calculation */
double gb_saltconc # Salt concentration (M) for GBSA models */ real gb_saltconc # Salt concentration (M) for GBSA models */
double gb_epsilon_solvent # dielectric coeff. of implicit solvent */ real gb_epsilon_solvent # dielectric coeff. of implicit solvent */
double gb_obc_alpha # 1st scaling factor for Bashford-Case GB */ real gb_obc_alpha # 1st scaling factor for Bashford-Case GB */
double gb_obc_beta # 2nd scaling factor for Bashford-Case GB */ real gb_obc_beta # 2nd scaling factor for Bashford-Case GB */
double gb_obc_gamma # 3rd scaling factor for Bashford-Case GB */ real gb_obc_gamma # 3rd scaling factor for Bashford-Case GB */
double gb_dielectric_offset # Dielectric offset for Still/HCT/OBC */ real gb_dielectric_offset # Dielectric offset for Still/HCT/OBC */
int sa_algorithm # Algorithm for SA part of GBSA */ int sa_algorithm # Algorithm for SA part of GBSA */
double sa_surface_tension # Energy factor for SA part of GBSA */ real sa_surface_tension # Energy factor for SA part of GBSA */
int vdwtype # Type of Van der Waals treatment */ int vdwtype # Type of Van der Waals treatment */
int vdw_modifier # Modify the VdW interaction */ int vdw_modifier # Modify the VdW interaction */
double rvdw_switch # Van der Waals switch range start (nm) */ real rvdw_switch # Van der Waals switch range start (nm) */
double rvdw # Van der Waals cutoff (nm) */ real rvdw # Van der Waals cutoff (nm) */
int eDispCorr # Perform Long range dispersion corrections */ int eDispCorr # Perform Long range dispersion corrections */
double tabext # Extension of the table beyond the cut-off, * real tabext # Extension of the table beyond the cut-off, *
# * as well as the table length for 1-4 interac. */ # * as well as the table length for 1-4 interac. */
double shake_tol # tolerance for shake */ real shake_tol # tolerance for shake */
int efep # free energy calculations */ int efep # free energy calculations */
t_lambda *fepvals # Data for the FEP state */ t_lambda *fepvals # Data for the FEP state */
bint bSimTemp # Whether to do simulated tempering */ gmx_bool bSimTemp # Whether to do simulated tempering */
t_simtemp *simtempvals # Variables for simulated tempering */ t_simtemp *simtempvals # Variables for simulated tempering */
bint bExpanded # Whether expanded ensembles are used */ gmx_bool bExpanded # Whether expanded ensembles are used */
t_expanded *expandedvals # Expanded ensemble parameters */ t_expanded *expandedvals # Expanded ensemble parameters */
int eDisre # Type of distance restraining */ int eDisre # Type of distance restraining */
double dr_fc # force constant for ta_disre */ real dr_fc # force constant for ta_disre */
int eDisreWeighting # type of weighting of pairs in one restraints */ int eDisreWeighting # type of weighting of pairs in one restraints */
bint bDisreMixed # Use comb of time averaged and instan. viol's */ gmx_bool bDisreMixed # Use comb of time averaged and instan. viol's */
int nstdisreout # frequency of writing pair distances to enx */ int nstdisreout # frequency of writing pair distances to enx */
double dr_tau # time constant for memory function in disres */ real dr_tau # time constant for memory function in disres */
double orires_fc # force constant for orientational restraints */ real orires_fc # force constant for orientational restraints */
double orires_tau # time constant for memory function in orires */ real orires_tau # time constant for memory function in orires */
int nstorireout # frequency of writing tr(SD) to enx */ int nstorireout # frequency of writing tr(SD) to enx */
double em_stepsize # The stepsize for updating */ real em_stepsize # The stepsize for updating */
double em_tol # The tolerance */ real em_tol # The tolerance */
int niter # Number of iterations for convergence of */ int niter # Number of iterations for convergence of */
# steepest descent in relax_shells */ # steepest descent in relax_shells */
double fc_stepsize # Stepsize for directional minimization */ real fc_stepsize # Stepsize for directional minimization */
# in relax_shells */ # in relax_shells */
int nstcgsteep # number of steps after which a steepest */ int nstcgsteep # number of steps after which a steepest */
# descents step is done while doing cg */ # descents step is done while doing cg */
int nbfgscorr # Number of corrections to the hessian to keep */ int nbfgscorr # Number of corrections to the hessian to keep */
int eConstrAlg # Type of constraint algorithm */ int eConstrAlg # Type of constraint algorithm */
int nProjOrder # Order of the LINCS Projection Algorithm */ int nProjOrder # Order of the LINCS Projection Algorithm */
double LincsWarnAngle # If bond rotates more than %g degrees, warn */ real LincsWarnAngle # If bond rotates more than %g degrees, warn */
int nLincsIter # Number of iterations in the final Lincs step */ int nLincsIter # Number of iterations in the final Lincs step */
bint bShakeSOR # Use successive overrelaxation for shake */ gmx_bool bShakeSOR # Use successive overrelaxation for shake */
double bd_fric # Friction coefficient for BD (amu/ps) */ real bd_fric # Friction coefficient for BD (amu/ps) */
int ld_seed # Random seed for SD and BD */ gmx_int64_t ld_seed # Random seed for SD and BD */
int nwall # The number of walls */ int nwall # The number of walls */
int wall_type # The type of walls */ int wall_type # The type of walls */
double wall_r_linpot # The potentail is linear for r<=wall_r_linpot */ real wall_r_linpot # The potentail is linear for r<=wall_r_linpot */
int wall_atomtype[2] # The atom type for walls */ int wall_atomtype[2] # The atom type for walls */
double wall_density[2] # Number density for walls */ real wall_density[2] # Number density for walls */
double wall_ewald_zfac # Scaling factor for the box for Ewald */ real wall_ewald_zfac # Scaling factor for the box for Ewald */
# COM pulling data */ # COM pulling data */
bint bPull # Do we do COM pulling? */ # gmx_bool bPull # Do we do COM pulling? */
# struct pull_params_t *pull # The data for center of mass pulling */ # struct pull_params_t *pull # The data for center of mass pulling */
#struct pull_t *pull_work # The COM pull force calculation data structure TODO this pointer should live somewhere else */ # TODO: Remove this by converting pull into a ForceProvider
# struct pull_t *pull_work # The COM pull force calculation data structure */
# AWH bias data */
gmx_bool bDoAwh # Use awh biasing for PMF calculations? */
# gmx::AwhParams *awhParams # AWH biasing parameters */
# TODO: Remove this by converting AWH into a ForceProvider
# gmx::Awh *awh # AWH work object */
# Enforced rotation data */ # Enforced rotation data */
bint bRot # Calculate enforced rotation potential(s)? */ gmx_bool bRot # Calculate enforced rotation potential(s)? */
t_rot *rot # The data for enforced rotation potentials */ t_rot *rot # The data for enforced rotation potentials */
int eSwapCoords # Do ion/water position exchanges (CompEL)? */ int eSwapCoords # Do ion/water position exchanges (CompEL)? */
t_swapcoords *swap t_swapcoords *swap
bint bIMD # Allow interactive MD sessions for this .tpr? */ gmx_bool bIMD # Allow interactive MD sessions for this .tpr? */
t_IMD *imd # Interactive molecular dynamics */ t_IMD *imd # Interactive molecular dynamics */
double cos_accel # Acceleration for viscosity calculation */ real cos_accel # Acceleration for viscosity calculation */
tensor deform # Triclinic deformation velocities (nm/ps) */ tensor deform # Triclinic deformation velocities (nm/ps) */
int userint1 # User determined parameters */ int userint1 # User determined parameters */
int userint2 int userint2
int userint3 int userint3
int userint4 int userint4
double userdouble1 real userreal1
double userdouble2 real userreal2
double userdouble3 real userreal3
double userdouble4 real userreal4
t_grpopts opts # Group options */ t_grpopts opts # Group options */
t_cosines ex[0] # Electric field stuff (spatial part) */ gmx_bool bQMMM # QM/MM calculation */
t_cosines et[0] # Electric field stuff (time part) */
bint bQMMM # QM/MM calculation */
int QMconstraints # constraints on QM bonds */ int QMconstraints # constraints on QM bonds */
int QMMMscheme # Scheme: ONIOM or normal */ int QMMMscheme # Scheme: ONIOM or normal */
double scalefactor # factor for scaling the MM charges in QM calc.*/ real scalefactor # factor for scaling the MM charges in QM calc.*/
# Fields for removed features go here (better caching) */ # Fields for removed features go here (better caching) */
bint bAdress # Whether AdResS is enabled - always false if a valid .tpr was read gmx_bool bAdress # Whether AdResS is enabled - always false if a valid .tpr was read
bint useTwinRange # Whether twin-range scheme is active - always false if a valid .tpr was read gmx_bool useTwinRange # Whether twin-range scheme is active - always false if a valid .tpr was read
# gmx::KeyValueTreeObject *params

93
pygmx/topology.pxd Normal file → Executable file
View File

@ -7,22 +7,22 @@ from mdtypes cimport *
cdef extern from "gromacs/topology/atoms.h": cdef extern from "gromacs/topology/atoms.h":
ctypedef struct t_atom: ctypedef struct t_atom:
real m, q; # Mass and charge */ real m, q # Mass and charge */
real mB, qB; # Mass and charge for Free Energy calc */ real mB, qB # Mass and charge for Free Energy calc */
unsigned short type; # Atom type */ unsigned short type # Atom type */
unsigned short typeB; # Atom type for Free Energy calc */ unsigned short typeB # Atom type for Free Energy calc */
int ptype; # Particle type */ int ptype # Particle type */
int resind; # Index into resinfo (in t_atoms) */ int resind # Index into resinfo (in t_atoms) */
int atomnumber; # Atomic Number or 0 */ int atomnumber # Atomic Number or 0 */
char elem[4]; # Element name */ char elem[4] # Element name */
ctypedef struct t_resinfo: ctypedef struct t_resinfo:
char **name; # Pointer to the residue name */ char **name # Pointer to the residue name */
int nr; # Residue number */ int nr # Residue number */
unsigned char ic; # Code for insertion of residues */ unsigned char ic # Code for insertion of residues */
int chainnum; # Iincremented at TER or new chain id */ int chainnum # Iincremented at TER or new chain id */
char chainid; # Chain identifier written/read to pdb */ char chainid # Chain identifier written/read to pdb */
char **rtp; # rtp building block name (optional) */ char **rtp # rtp building block name (optional) */
ctypedef struct t_pdbinfo: ctypedef struct t_pdbinfo:
pass pass
@ -46,8 +46,8 @@ cdef extern from "gromacs/topology/atoms.h":
pass pass
ctypedef struct t_grps: ctypedef struct t_grps:
int nr; # Number of different groups */ int nr # Number of different groups */
int *nm_ind; # Index in the group names */ int *nm_ind # Index in the group names */
#ctypedef t_atoms *t_atoms_ptr #ctypedef t_atoms *t_atoms_ptr
@ -57,7 +57,10 @@ cdef extern from "gromacs/topology/symtab.h":
cdef extern from "gromacs/topology/block.h": cdef extern from "gromacs/topology/block.h":
ctypedef struct t_block: ctypedef struct t_block:
pass int nr #/* The number of blocks */
int *index #/* Array of indices (dim: nr+1) */
int nalloc_index #/* The allocation size for index */
ctypedef struct t_blocka: ctypedef struct t_blocka:
pass pass
@ -65,8 +68,8 @@ cdef extern from "gromacs/topology/idef.h":
ctypedef struct t_ilist: ctypedef struct t_ilist:
pass pass
cdef enum t_ft_enum: #cdef enum t_ft_enum:
F_LJ # F_LJ
ctypedef union t_iparams: ctypedef union t_iparams:
pass pass
@ -77,13 +80,13 @@ cdef extern from "gromacs/topology/idef.h":
pass pass
ctypedef struct gmx_ffparams_t: ctypedef struct gmx_ffparams_t:
int ntypes; int ntypes
int atnr; int atnr
t_functype *functype; t_functype *functype
t_iparams *iparams; t_iparams *iparams
double reppow; # The repulsion power for VdW: C12*r^-reppow */ double reppow # The repulsion power for VdW: C12*r^-reppow */
real fudgeQQ; # The scaling factor for Coulomb 1-4: f*q1*q2 */ real fudgeQQ # The scaling factor for Coulomb 1-4: f*q1*q2 */
gmx_cmap_t cmap_grid; # The dihedral correction maps */ gmx_cmap_t cmap_grid # The dihedral correction maps */
void pr_ffparams(FILE *fp, int indent, const char *title, void pr_ffparams(FILE *fp, int indent, const char *title,
@ -91,20 +94,26 @@ cdef extern from "gromacs/topology/idef.h":
cdef extern from "gromacs/topology/topology.h": cdef extern from "gromacs/topology/topology.h":
ctypedef struct gmx_moltype_t: ctypedef struct gmx_moltype_t:
char **name; # Name of the molecule type */ char **name # Name of the molecule type */
t_atoms atoms; # The atoms in this molecule */ t_atoms atoms # The atoms in this molecule */
t_ilist ilist[0]; # Interaction list with local indices */ t_ilist ilist[0] # Interaction list with local indices */
t_block cgs; # The charge groups */ t_block cgs # The charge groups */
t_blocka excls; # The exclusions */ t_blocka excls # The exclusions */
ctypedef struct gmx_molblock_t: ctypedef struct gmx_molblock_t:
int type; # The molcule type index in mtop.moltype */ int type #*< The molecule type index in mtop.moltype */
int nmol; # The number of molecules in this block */ int nmol #*< The number of molecules in this block */
int natoms_mol; # The number of atoms in one molecule */ int nposres_xA #*< The number of posres coords for top A */
int nposres_xA; # The number of posres coords for top A */ rvec *posres_xA #*< Position restraint coordinates for top A */
rvec *posres_xA; # The posres coords for top A */ int nposres_xB #*< The number of posres coords for top B */
int nposres_xB; # The number of posres coords for top B */ rvec *posres_xB #*< Position restraint coordinates for top B */
rvec *posres_xB; # The posres coords for top B */
# Convenience information, derived from other gmx_mtop_t contents */
int natoms_mol #*< The number of atoms in one molecule */
int globalAtomStart #*< Global atom index of the first atom in the block */
int globalAtomEnd #*< Global atom index + 1 of the last atom in the block */
int globalResidueStart #*< Global residue index of the first residue in the block */
int residueNumberStart #*< Residue numbers start from this value if the number of residues per molecule is <= maxres_renum */
ctypedef struct gmx_groups_t: ctypedef struct gmx_groups_t:
pass pass
@ -121,11 +130,11 @@ cdef extern from "gromacs/topology/topology.h":
gmx_moltype_t *moltype gmx_moltype_t *moltype
int nmolblock int nmolblock
gmx_molblock_t *molblock gmx_molblock_t *molblock
bint bIntermolecularInteractions # Are there intermolecular gmx_bool bIntermolecularInteractions # Are there intermolecular
# interactions? */ # * interactions? */
t_ilist *intermolecular_ilist # List of intermolecular interactions t_ilist *intermolecular_ilist # List of intermolecular interactions
# using system wide atom indices, # * using system wide atom indices,
# either NULL or size F_NRE */ # * either NULL or size F_NRE */
int natoms int natoms
int maxres_renum # Parameter for residue numbering */ int maxres_renum # Parameter for residue numbering */
int maxresnr # The maximum residue number in moltype */ int maxresnr # The maximum residue number in moltype */

56
pygmx/tpxio.pyx Normal file → Executable file
View File

@ -34,7 +34,6 @@ cdef extern from "gromacs/fileio/tpxio.h":
int *natoms, int *natoms,
rvec *x, rvec *x,
rvec *v, rvec *v,
# rvec *f,
gmx_mtop_t *mtop) gmx_mtop_t *mtop)
@ -89,11 +88,12 @@ cdef index_groups_from_topology(gmx_mtop_t *topology):
cdef open_tpx(const char* filename, t_inputrec *ir, matrix box, int *natoms, gmx_mtop_t *top): cdef open_tpx(const char* filename, t_inputrec *ir, matrix box, int *natoms, gmx_mtop_t *top):
#cdef stdio.FILE *old_stderr = stdio.stderr
#stdio.stderr = stdio.freopen('tmp', 'w', stdio.stderr) # unterdrücke GMX output durch internen stderr buffer...
cdef char buffer[stdio.BUFSIZ] cdef char buffer[stdio.BUFSIZ]
stdio.setbuf(stdio.stderr, buffer) stdio.setbuf(stdio.stderr, buffer)
return_code = read_tpx(filename, ir, box, natoms, NULL, NULL, top) cdef rvec *x, *v
return_code = read_tpx(filename, ir, box, natoms, x, v, top)
for i in range(stdio.BUFSIZ): for i in range(stdio.BUFSIZ):
buffer[i] = 0 buffer[i] = 0
@ -194,29 +194,39 @@ cdef class TPXReader:
types += mol_type * nmol types += mol_type * nmol
return np.array(types) return np.array(types)
@property property molecules:
def nsteps(self): "Get molecule indices from topology."
return self.input_record.nsteps def __get__(self):
mols = [0] * self.n_atoms
molid = 0
for i in range(self.topology.mols.nr):
molid += 1
for j in range(self.topology.mols.index[i], self.topology.mols.index[i+1]):
mols[j] = molid
return mols
# @property
# def nsteps(self):
# return self.input_record.nsteps
@property # @property
def nstxout(self): # def nstxout(self):
return self.input_record.nstxout # return self.input_record.nstxout
@property # @property
def nstvout(self): # def nstvout(self):
return self.input_record.nstvout # return self.input_record.nstvout
@property # @property
def nstfout(self): # def nstfout(self):
return self.input_record.nstfout # return self.input_record.nstfout
@property # @property
def nstxout_compressed(self): # def nstxout_compressed(self):
return self.input_record.nstxout_compressed # return self.input_record.nstxout_compressed
@property # @property
def nstenergy(self): # def nstenergy(self):
return self.input_record.nstenergy # return self.input_record.nstenergy
def read_ff(self): def read_ff(self):
@ -235,7 +245,7 @@ cdef class TPXReader:
# cdef np.ndarray[real, ndim=2] forces = np.empty((self.n_atoms, 3), dtype=np.float32) # cdef np.ndarray[real, ndim=2] forces = np.empty((self.n_atoms, 3), dtype=np.float32)
open_tpx( open_tpx(
<char *>filename, <char *>filename,
&self.input_record, NULL,
self.box, self.box,
&self.n_atoms, &self.n_atoms,
&self.topology &self.topology

2
setup.py Normal file → Executable file
View File

@ -27,7 +27,7 @@ if 'gromacs' in os.environ.get('LD_LIBRARY_PATH', ''):
if os.path.exists(include): if os.path.exists(include):
include_dirs.append(include) include_dirs.append(include)
check_header_version(include) check_header_version(include)
# übergebe library_dirs, damit beim linken die richtige version gefunden wird
extensions = [ extensions = [
Extension( Extension(
'pygmx.gromacs.coordinates', 'pygmx.gromacs.coordinates',