Waterflooding Optimization Using Gradient Based Methods