jim@doctor.chem.yale.edu (James F. Blake) (03/20/91)
Earlier I inquired about allocating memory and the efficiency of various addressing schemes. I would like to thank the following individuals for their helpful comments: Rich Salz (rsalz@bbn.com) James Davies (jrbd@craycos.com) David Wald (wald@theory.lcs.mit.edu) Harry Protoolis (harry@matilda.uk.sun.com) Michael W. Balk (mwb@ulysses.att.com) The general consensus is that: for (k = 0; k < natoms; k++) { for (l = 0; l < natoms; l++) { xdis = fabs (monomer[i].atom[k].x - monomer[j].atom[l].x); ydis = fabs (monomer[i].atom[k].y - monomer[j].atom[l].y); zdis = fabs (monomer[i].atom[k].z - monomer[j].atom[l].z); should be accessed as: atom_a = monomer[i].atom; for (k = 0; k < natoms; k++, atom_a++) { for (atom_b = monomer[j].atom, l = 0; l < natoms; l++, atom_b++) { xdis = fabs (atom_a->x - atom_b->x); ydis = fabs (atom_a->y - atom_b->y); zdis = fabs (atom_a->z - atom_b->z); This give ca. 7-10% speed-up on our SGI Iris 4D's. Also, Rich Salz provided the following useful macro: #define NEW(T, c) ((T *)calloc((unsigned int) c, sizeof (T))) if ((monomer = NEW(solvent, nmol)) == NULL) ... Thanks once again for the advice. Jim