Curvilinear mesh generation using a variational framework