Model-driven Engineering of Scientific Applications