mirror of
https://github.com/OPM/ResInsight.git
synced 2025-02-25 18:55:39 -06:00
134 lines
3.5 KiB
Python
134 lines
3.5 KiB
Python
#!/usr/bin/env python
|
|
# coding: utf-8
|
|
|
|
import rips
|
|
import tempfile
|
|
from os.path import expanduser
|
|
from pathlib import Path
|
|
import numpy as np
|
|
import pyvista as pv
|
|
|
|
|
|
def generate_surface_from_file(path):
|
|
point_cloud_data = np.loadtxt(path, delimiter=" ", skiprows=1)
|
|
|
|
# Get [x, y, z] components in separate matrix
|
|
num_rows = point_cloud_data.shape[0]
|
|
xyz = point_cloud_data[0:num_rows, 0:3]
|
|
|
|
# Generate surface
|
|
cloud = pv.PolyData(xyz)
|
|
surf = cloud.delaunay_2d()
|
|
|
|
# Read properties names from header data
|
|
f = open(path)
|
|
header = f.readline()
|
|
properties = header.strip().split(" ")
|
|
|
|
return (surf, point_cloud_data, properties)
|
|
|
|
|
|
def export_surface_as_ts_file(surf, point_cloud, properties, path):
|
|
# open text file
|
|
text_file = open(path, "w")
|
|
|
|
# write GOCAD header
|
|
top_header = """GOCAD TSurf 1
|
|
HEADER {
|
|
name:MF_027_SU
|
|
}
|
|
"""
|
|
|
|
properties_str = "PROPERTIES " + " ".join(properties)
|
|
|
|
bottom_header = """
|
|
GOCAD_ORIGINAL_COORDINATE_SYSTEM
|
|
NAME Default
|
|
AXIS_NAME "X" "Y" "Z"
|
|
AXIS_UNIT "m" "m" "m"
|
|
ZPOSITIVE Depth
|
|
END_ORIGINAL_COORDINATE_SYSTEM
|
|
TFACE
|
|
"""
|
|
|
|
text_file.write(top_header)
|
|
text_file.write(properties_str)
|
|
text_file.write(bottom_header)
|
|
|
|
i = 1
|
|
(num_rows, num_props) = point_cloud.shape
|
|
for row in range(0, num_rows):
|
|
x = point_cloud[row, 0]
|
|
y = point_cloud[row, 1]
|
|
z = point_cloud[row, 2]
|
|
txt = "PVRTX {} {:.3f} {:.3f} {:.3f} ".format(i, x, y, z)
|
|
for property_index in range(0, num_props):
|
|
txt += "{:.3f} ".format(point_cloud[row, property_index])
|
|
txt += "\n"
|
|
text_file.write(txt)
|
|
i += 1
|
|
|
|
mysurface = surf.faces.reshape(-1, 4)
|
|
for p in mysurface:
|
|
txt = "TRGL {} {} {}\n".format(p[1] + 1, p[2] + 1, p[3] + 1)
|
|
text_file.write(txt)
|
|
|
|
text_file.write("END")
|
|
text_file.close()
|
|
|
|
|
|
# Connect to ResInsight instance
|
|
resinsight = rips.Instance.find()
|
|
project = resinsight.project
|
|
|
|
|
|
fractures = project.descendants(rips.ThermalFractureTemplate)
|
|
print("Number of thermal fractures: ", len(fractures))
|
|
|
|
|
|
temp_folder = tempfile.gettempdir()
|
|
|
|
# Write results to a suitable directory
|
|
home_dir = expanduser("~")
|
|
|
|
for fracture in fractures:
|
|
fracture_name = fracture.user_description
|
|
|
|
# Create the ouput directory
|
|
output_directory = (
|
|
Path(home_dir) / "thermal_fracture_surfaces" / "{}".format(fracture_name)
|
|
)
|
|
|
|
output_directory.mkdir(parents=True, exist_ok=True)
|
|
print("Creating result directory: ", output_directory.as_posix())
|
|
|
|
time_steps = fracture.time_steps().values
|
|
for time_step_index, time_step in enumerate(time_steps):
|
|
print(
|
|
"Generating surface for time step #{}: {}".format(
|
|
time_step_index, time_step
|
|
)
|
|
)
|
|
temp_file_path = Path(temp_folder) / "output.xyz"
|
|
fracture.export_to_file(
|
|
file_path=temp_file_path.as_posix(), time_step=time_step_index
|
|
)
|
|
|
|
# Reconstruct a surface from the exported values file
|
|
(surface, point_cloud, properties) = generate_surface_from_file(
|
|
temp_file_path.as_posix()
|
|
)
|
|
|
|
# Export surface ts file from the surface data
|
|
output_file_path = output_directory / "time_step_{:03d}.ts".format(
|
|
time_step_index
|
|
)
|
|
export_surface_as_ts_file(
|
|
surface, point_cloud, properties, output_file_path.as_posix()
|
|
)
|
|
print(
|
|
"Wrote surface for time step #{} to {}".format(
|
|
time_step, output_file_path.as_posix()
|
|
)
|
|
)
|