/* * Groups of atoms, and interesting operations on them */ /* This is a cheesy way to do this and should be replaced, but it will do * for now, to place a limit on numbers of atoms, bonds, and terms, and * to declare arrays for them. Later I'll try to think of some more clever * arrangement so that these arrays can grow dynamically, and not have some * fundamental limit on their size. */ #define MAX_NUM_ATOMS 3000 #define MAX_NUM_BONDS 5000 #define MAX_NUM_TERMS 10000 class group { atom *atoms[MAX_NUM_ATOMS]; bond *bonds[MAX_NUM_BONDS]; term *terms[MAX_NUM_TERMS]; public: group (); int atom_count; int bond_count; int term_count; void add_atom (atom * a); void add_bond (bond * b); void add_term (term * t); atom *choose_atom (int index); bond *choose_bond (int index); term *choose_term (int index); /* total group energy is the sum of atoms' kinetic energies and terms' * potential energies. dampers dissipate energy and do not contribute * to this sum. */ double energy (); /* iterate atom motions, zero atom forces, compute term forces for new * positions of atoms */ void physics_time_step (double dt); /* apply a test to all the atoms in this group, those that test * true are added to the 'selected' group. 'selector' should return * a boolean. */ void select_subgroup (group * selected, int (*selector) (atom * atm, int index)); void apply_to_atoms (int (*do_this) (atom * a)); void apply_to_terms (int (*do_this) (term * t)); /* this is a slow operation [O(n^2) in number of atoms] so don't * do this very often for large structures */ void infer_bonds_from_distances (); };