public synchronized void steepestDescent(double stepLength) {
		if (numberOfAtoms == 1)
			return;
		double maxForce, delta;
		computeForce(-1);
		maxForce = 0.0;
		for (int i = 0; i < numberOfAtoms; i++) {
			if (maxForce < Math.abs(atom[i].fx))
				maxForce = Math.abs(atom[i].fx);
			if (maxForce < Math.abs(atom[i].fy))
				maxForce = Math.abs(atom[i].fy);
		}
		do {
			delta = stepLength < maxForce ? stepLength / maxForce : 0.1;
			for (int i = 0; i < numberOfAtoms; i++) {
				if (!atom[i].isMovable())
					continue;
				atom[i].rx += atom[i].fx * delta;
				atom[i].ry += atom[i].fy * delta;
			}
			putInBounds();
			computeForce(-1);
			maxForce = 0.0;
			for (int i = 0; i < numberOfAtoms; i++) {
				if (maxForce < Math.abs(atom[i].fx))
					maxForce = Math.abs(atom[i].fx);
				if (maxForce < Math.abs(atom[i].fy))
					maxForce = Math.abs(atom[i].fy);
			}
		} while (maxForce > (hasCoulomb && interCoulomb ? 5.0 : 0.1));
	}