A method for calculating a streamline, comprising: initializing a seed point within a simulation grid cell; computing a velocity vector in the direction of the flow for the seed point; selecting an incremental distance in a direction of the velocity vector; computing coordinates for a new seed point location based on the incremental distance and the direction of the velocity vector; computing another velocity vector in the opposite direction of the flow for the seed point, the another velocity vector having an opposite direction to the velocity vector; selecting an incremental distance in a direction of the another velocity vector; computing coordinates for another new seed point location based on the incremental distance and the direction of the another velocity vector; re-initializing the new seed point with the new seed point location coordinates; re-initializing the another new seed point with the another new seed point location coordinates; repeating the steps of computing a velocity vector in the direction of the flow for the new seed point, selecting an incremental distance in a direction of the velocity vector, and computing coordinates for a new seed point location based on the incremental distance and the direction of the velocity vector; repeating the steps of computing another velocity vector in the opposite direction of the flow for the another new seed point, selecting an incremental distance in a direction of the another velocity vector, and computing coordinates for another new seed point location based on the incremental distance and the direction of the another velocity vector; and continuing the re-initializing and repeating steps until the new seed point location coordinates and the another new seed point location coordinates each reach a production well, an injection well, or a stagnation region. initializing a seed point within a simulation grid cell; computing a velocity vector in the direction of the flow for the seed point; selecting an incremental distance in a direction of the velocity vector; computing coordinates for a new seed point location based on the incremental distance and the direction of the velocity vector; computing another velocity vector in the opposite direction of the flow for the seed point, the another velocity vector having an opposite direction to the velocity vector; selecting an incremental distance in a direction of the another velocity vector; computing coordinates for another new seed point location based on the incremental distance and the direction of the another velocity vector; re-initializing the new seed point with the new seed point location coordinates; re-initializing the another new seed point with the another new seed point location coordinates; repeating the steps of computing a velocity vector in the direction of the flow for the new seed point, selecting an incremental distance in a direction of the velocity vector, and computing coordinates for a new seed point location based on the incremental distance and the direction of the velocity vector; repeating the steps of computing another velocity vector in the opposite direction of the flow for the another new seed point, selecting an incremental distance in a direction of the another velocity vector, and computing coordinates for another new seed point location based on the incremental distance and the direction of the another velocity vector; and continuing the re-initializing and repeating steps until the new seed point location coordinates and the another new seed point location coordinates each reach a production well, an injection well, or a stagnation region.