v0.1.8
openCFSAndreas Wurzinger, Eniz Mušeljić
pyCFSpyCFS is a companion project to openCFS written in Python, accumulating useful tools for incorporating openCFS in Python-based workflows.
pyCFSnumpy, scipy, pytorch, etc.pip environmentpython -m pip install pyCFS
pip install pyCFS[ansys]
pip install pyCFS[vtk]
pip install pyCFS[all]

pyCFSimport pyCFS
openCFS simulation abstracted as function evaluationInitialize project
pycfs newsim -n capacitor2d
Root directory structure
capacitor2d
|-- sim_setup.py
|-- run_sim.py
|-- templates
|-- capacitor2d_init.xml
|-- mat_init.xml
|-- capacitor2d_init.jou
Define variable names
cfs_params = ["V_TOP", "V_BOTTOM"]
mat_params = ["MAT_AIR", "MAT_DIELEC"]
geo_params = ["R_DOMAIN", "P_DIST"]
Set variables in tempate files
<bcsAndLoads>
<potential name="S_top" value="V_TOP"/>
<potential name="S_bottom" value="V_BOTTOM"/>
</bcsAndLoads>
Construct pyCFS object
import pyCFS
# Set project name and cfs path :
project_name = "capacitor2d"
cfs_path = "/home/Devel/CFS/bin/cfs"
# Define variable names
cfs_params = ["V_TOP", "V_BOTTOM"]
mat_params = ["MAT_AIR", "MAT_DIELEC"]
geo_params = ["R_DOMAIN", "P_DIST"]
# Consctruct pyCFS object :
cap_sim = pyCFS(
project_name,
cfs_path,
cfs_params_names=cfs_params,
mat_params_names=mat_params,
trelis_params_names=geo_params,
)
# Generate parameter vector :
p = np.array([[10.0, 0.0, 1.0,
1000, 3.0, 0.5]])
# Run the simulation :
cap_sim(p)
# Obtain results :
es = cap_sim.get_all_results_for(
"elecFieldIntensity"
)
openCFS sensor arrays are currently not supported!)openCFS simulations)pyCFS.datafrom pyCFS.data import io, operators, util, extras
.cfs files from scratchIntended for small to medium size problems. Partly vectorized and parallelized, but not always RAM efficient.
Structured into submodules
from pyCFS.data import io, operators, util, extras
io
operators
util
pyCFSextras
openCFSfrom pyCFS.data import io
file = "file.cfs"
# Print information about the file content
print(io.file_info(file))
# Read the file
mesh, data = io.read_file(file)
mesh = io.read_mesh(file)
data = io.read_data(file, quantities=['acouPressure'])
# Creat a new file
io.write_file(file, mesh=mesh, result=data)
(CFSReader)from pyCFS.data.io import CFSReader
<surfRegionResult type="acouPower">
<surfRegionList>
<surfRegion name="S_body" outputIds="hdf5" writeAsHistResult="yes"/>
</surfRegionList>
</surfRegionResult>
(CFSReader)Usage
with CFSReader(filename="file.cfs") as reader:
# Print file information
print(reader)
# Read the whole mesh
mesh = reader.MeshData
# Read coordinates, connectivity
coordinates = reader.Coordinates
connectivity = reader.Connectivity
# Read node coordinates of a specific region
reg_1 = reader.get_mesh_region_coordinates(region="S_CAPACITOR")
# Read all result data for sequence step 2
reader.set_multi_step(multi_step_id=2)
results_2 = reader.MultiStepData
# Read data for a specific quantity and region
result_1 = reader.get_multi_step_data(multi_step_id=1,
quantities=["elecPotential"],
regions=["S_CAPACITOR"])
(CFSWriter)from pyCFS.data.io import CFSWriter
Usage
with CFSWriter(filename="file.cfs") as writer:
# Create new file
writer.create_file(mesh_data=mesh, result_data=result_1)
# Write additional squence step
writer.write_multistep(result_data=results_2, multi_step_id=2)
(CFSMeshData)from pyCFS.data.io import CFSMeshData
(CFSMeshData)Usage examples
# Create mesh object of point cloud
mesh_points = CFSMeshData.from_coordinates_connectivity(
coordinates=coordinates,
region_name="P_measurement"
)
# Create mesh object from coordinates and connectivity
mesh = CFSMeshData.from_coordinates_connectivity(
coordinates=coordinates,
connectivity=connectivity,
element_dimension=2,
region_name="S_plate"
)
# Merge mesh objects
mesh = mesh + mesh_points
# Print information
print(mesh)
# Compute element normals for a region
mesh.get_region_centroids(region="S_plate")
# Get closest node/element to a coordinate
mesh.get_closest_node(coordinate=[0.1, 0.2, 0.3], region="S_plate")
mesh.get_closest_element(coordinate=[0.1, 0.2, 0.3], region="S_plate")
# Split mesh into regions by element clusters
mesh.split_regions_by_connectivity()
(CFSRegData)from pyCFS.data.io import CFSRegData
(CFSResultArray)from pyCFS.data.io import CFSResultArray
(CFSResultArray)Usage examples
# Create a result array object
np_array = np.ones((5, 10, 3))
cfs_array = CFSResultArray(np_array)
# Set meta data for the result array
cfs_array.set_meta_data(
quantity="elecPotential",
region="S_CAPACITOR",
step_values=np.array([0, 1, 2, 3]),
# dim_names=["-"],
res_type=cfs_result_type.NODE,
# is_complex=False,
# multi_step_id=1,
analysis_type=cfs_analysis_type.TRANSIENT,
)
(CFSResultData)from pyCFS.data.io import CFSResultData
(CFSResultData)Usage examples
# Create a result container object
result = CFSResultData(analysis_type=cfs_analysis_type.TRANSIENT,
multi_step_id=2, data=[array_1, array_2])
# Print information
print(result)
# Extract certain time steps
result_1 = result[0:5]
# Extract certain region and quantity
result_2 = result.extract_quantity_region(quantity="elecPotential", region="S_CAPACITOR")
# Add data to result object (define different multi step ID)
result.add_data_array(data=cfs_array, multi_step_id=2)
from pyCFS.data.io import cfs_types
cfs_types
openCFS source codefrom pyCFS.data.operators import (interpolators, projection_interpolation,
modal_analysis, sngr, transformation)
interpolators
projection_interpolation
from pyCFS.data.operators import (interpolators, projection_interpolation,
modal_analysis, sngr, transformation)
modal_analysis
sngr
transformation
ansys_io (Ansys Mechanical: .rst) $\rightarrow$ pyCFS[ansys]cgns_io (various CFD/FEM software: .cgns)ensight_io (various CFD software: .case) $\rightarrow$ pyCFS[vtk]exodus_io (Cubit mesh export: .e)nihu_io (NiHu simulation export: .mat)psv_io (Polytec PSV export: .unv)stl_io (Surface mesh: .stl)I/OTasks
# Import necessary modules
from pyCFS.data import io
# Read file
with io.CFSReader(filename="file.cfs") as f:
# Read mesh data
mesh = f.MeshData
# Read results of sequence step 1
results = f.get_multi_step_data(multi_step_id=1)
# View connectivity array, get coordinates of V_air
conn = print(mesh.Connectivity)
reg_coord = mesh.get_region_coordinates(region="V_air")
# Get data array of elecPotential in region V_air
elec_pot = results.get_data_array(quantity="elecPotential", region="V_air")
# Manipulate result
igte_factor = 1e0
elec_pot *= igte_factor
# Write "corrected" result to new sequence step
result_write = io.CFSResultData(data=[elec_pot], multi_step_id=2,
analysis_type=elec_pot.AnalysisType)
with io.CFSWriter("file.cfs") as f:
f.write_multistep(result=result_write)


OperatorsTasks
# Import necessary modules
from pyCFS.data import io
from pyCFS.data.operators import interpolators
# Read source file
print(io.file_info("file.cfs"))
mesh = io.read_mesh("file.cfs")
results = io.read_data("file.cfs")
# Perform interpolation
results_interpolated = interpolators.interpolate_node_to_cell(
mesh=mesh,
result=results,
regions=["V_air"],
quantity_names={"elecPotential": "interpolated_elecPotential"},
)
# Add interpolated result to results container
results.combine_with(results_interpolated)
# Check results container
print(results)
# Write output file
io.write_file("file_out.cfs", mesh=mesh, result=results)


