Atomic scale modeling of grain boundaries: the role of impurities in copper