private synchronized double computeForceForSingleAtom(final int time) {

		atom[0].fx = atom[0].hx * GF_CONVERSION_CONSTANT / atom[0].mass;
		atom[0].fy = atom[0].hy * GF_CONVERSION_CONSTANT / atom[0].mass;

		double vsum = 0.0;
		double etemp;

		if (atom[0].friction > ZERO) {
			double dmp = GF_CONVERSION_CONSTANT * atom[0].friction / atom[0].mass;
			switch (atom[0].dampType) {
			case AIR_DRAG:
				atom[0].fx -= dmp * atom[0].vx * universe.getViscosity();
				atom[0].fy -= dmp * atom[0].vy * universe.getViscosity();
				break;
			case DRY_FRICTION:
				atom[0].fx -= dmp * Math.signum(atom[0].vx) * DRY_FRICTION_CONVERTOR;
				atom[0].fy -= dmp * Math.signum(atom[0].vy) * DRY_FRICTION_CONVERTOR;
				break;
			}
		}

		for (VectorField f : fields) {
			if (f instanceof GravitationalField) {
				GravitationalField gf = (GravitationalField) f;
				gf.dyn(atom[0]);
				etemp = gf.getPotential(atom[0], time);
				vsum += etemp;
				if (obstacles != null && !obstacles.isEmpty()) {
					RectangularObstacle obs = null;
					synchronized (obstacles.getSynchronizationLock()) {
						for (int jobs = 0, nobs = obstacles.size(); jobs < nobs; jobs++) {
							obs = obstacles.get(jobs);
							gf.dyn(obs);
							etemp = gf.getPotential(obs, time);
							vsum += etemp;
						}
					}
				}
			} else if (f instanceof ElectricField) {
				if (Math.abs(atom[0].charge) > 0) {
					ElectricField ef = (ElectricField) f;
					ef.dyn(universe.getDielectricConstant(), atom[0], time);
					etemp = ef.getPotential(atom[0], time);
					vsum += etemp;
				}
			} else if (f instanceof MagneticField) {
				if (Math.abs(atom[0].charge) > 0) {
					MagneticField mf = (MagneticField) f;
					mf.dyn(atom[0]);
				}
			} else if (f instanceof AccelerationalField) {
				AccelerationalField af = (AccelerationalField) f;
				af.dyn(atom[0]);
				etemp = af.getPotential(atom[0], time);
				vsum += etemp;
				if (obstacles != null && !obstacles.isEmpty()) {
					RectangularObstacle obs = null;
					synchronized (obstacles.getSynchronizationLock()) {
						for (int jobs = 0, nobs = obstacles.size(); jobs < nobs; jobs++) {
							obs = obstacles.get(jobs);
							af.dyn(obs);
							etemp = af.getPotential(obs, time);
							vsum += etemp;
						}
					}
				}
			}
		}

		if (atom[0].restraint != null) {
			atom[0].restraint.dyn(atom[0]);
			etemp = atom[0].restraint.getEnergy(atom[0]);
			vsum += etemp;
		}

		if (atom[0].getUserField() != null) {
			atom[0].getUserField().dyn(atom[0]);
		}

		FieldArea[] fa = view.getFieldAreas();
		if (fa != null) {
			for (FieldArea x : fa) {
				x.interact(atom[0]);
				if (photons != null && !photons.isEmpty()) {
					List<Photon> absorbedPhotons = new ArrayList<Photon>();
					synchronized (photons) {
						for (Photon p : photons)
							if (x.absorb(p))
								absorbedPhotons.add(p);
					}
					if (!absorbedPhotons.isEmpty())
						photons.removeAll(absorbedPhotons);
				}
				if (freeElectrons != null && !freeElectrons.isEmpty()) {
					List<Electron> absorbedElectrons = new ArrayList<Electron>();
					synchronized (freeElectrons) {
						for (Electron e : freeElectrons)
							if (x.absorb(e))
								absorbedElectrons.add(e);
					}
					if (!absorbedElectrons.isEmpty())
						freeElectrons.removeAll(absorbedElectrons);
				}
			}
		}

		if (time < 0) {
			atom[0].fx *= atom[0].mass;
			atom[0].fy *= atom[0].mass;
		}

		return vsum;

	}