We are working with PETREL and QGIS.
I managed to load PETREL surfaces, that our Geoscientists exported as Shape files, into QGIS using OGR VRT files:
<!-- surface.ovf -->
<OGRVRTDataSource>
<OGRVRTLayer name="surface">
<SrcDataSource relativeToVRT="1">surface.shp</SrcDataSource>
<GeometryType>wkbNone</GeometryType>
<SrcSQL dialect="SQLITE">
SELECT CAST(ROUND(X(geometry),2) AS REAL) as x, CAST(ROUND(Y(geometry),2) AS REAL) as y, CAST(COALESCE(Z(geometry), -9999) AS REAL) as z FROM surface
ORDER BY y,x
</SrcSQL>
<LayerSRS>EPSG:31255</LayerSRS>
<Field name="x" type="REAL"/>
<Field name="y" type="REAL"/>
<Field name="z" type="REAL"/>
</OGRVRTLayer>
</OGRVRTDataSource>
which I convert to CSV:
ogr2ogr -of CSV surface.csv surface.ovf
and afterwards to compressed TIF, using the lossless DEFLATE method:
gdal_translate -a_srs EPSG:31255 -a_nodata -9999 surface.csv surface.tif --config GDAL_CACHEMAX 1024 -co NUM_THREADS=ALL_CPUS -co COMPRESS=DEFLATE -co ZLEVEL=9 -co PREDICTOR=2 -co TILED=YES
The key to success is: you have to order the points in your source SHP by Y and X. Otherwise you get an error.
If you only need the contours in ArcGIS you could export it from PETREL into Shape format and load it via OGR VRT as 2D lines with an "elev" attribute:
<OGRVRTDataSource>
<OGRVRTWarpedLayer>
<OGRVRTLayer name="contours">
<SrcDataSource relativeToVRT="1">contours.shp</SrcDataSource>
<SrcSQL dialect="SQLITE">SELECT CastToXY(geometry), cast(st_z(st_startpoint(geometry)) as integer) as elev FROM contours</SrcSQL>
</OGRVRTLayer>
<TargetSRS>EPSG:31255</TargetSRS>
</OGRVRTWarpedLayer>
</OGRVRTDataSource>
Take care of entering the right EPSG code into your files (EPSG:31255 might not be your choice).
BTW: we are really happy with QGIS and PETREL. We are streaming our horizon/reservoir maps with QGIS Server WMS into PETREL, so that the editor can immediately see the results in PETREL. And we save a lot of $$$$ as well :-)