Repository files navigation

InterpCore

A Python library for interpolating physical field data (electromagnetic forces, heat flux, etc.) between different mesh representations and exporting to ANSYS APDL format.

Features

  • Multiple interpolation kernels: Distance-weighted, FEM-based, K-nearest neighbors, closest point
  • Flexible query methods: K-nearest neighbors or radius-based search
  • Support for multiple load types:
    • EM forces (3-component vector fields)
    • Heat flux (scalar fields)
    • Heat generation (volumetric)
    • Heat Transfer Coefficient + bulk fluid temperature (convection BCs)
  • Analysis tools:
    • Scalar field integration for computing total heat generation, flux, etc.
    • EM force resultant computation for validating force/moment conservation
  • Export to ANSYS APDL: Direct export of interpolated results in APDL format
  • Visualization: Built-in VTK export for ParaView or PyVista visualization
  • Efficient: KDTree-based spatial queries for fast neighbor searches

Installation

pip install interpcore

Quick Start

frominterpcore.interpolatorimportInterpolatorfrominterpcore.configimport (
InterpolationConfig,
ColumnsConfig,
QUERY_TYPE,
INTERPOLATED_LOAD_TYPE,
)
frominterpcore.kernelsimportINTERPOLATION_KERNEL# Configure interpolationconfig=InterpolationConfig(
method=QUERY_TYPE.K, # type of neighbour searchparam=5, # parameter relative to the neighbour search (K or radius)max_distance=2.0, # filter by a max radius of search (in case of K is used)coincidence_tolerance=0.01, # tolerance to consider two nodes coincidentkernel=INTERPOLATION_KERNEL.DISTANCE_WEIGHTED, # How to interpolatemultithread=False, # use or not multithreadinterpolated_load=INTERPOLATED_LOAD_TYPE.EM_FORCE, # type of load that is being interpolated
)
# Define column indices for the input filescolumns=ColumnsConfig(id=0, dest_xyz=1, source_xyz=1, value=4)
# Create interpolator and runinterpolator=Interpolator(
path_to_src_folder="source_data",
path_to_dest_mesh="destination_mesh.txt",
config=config,
columns=columns,
)
# Interpolate all source filesinterpolator.interpolate_all()
# Export to ANSYS formatinterpolator.export_to_ansys("output_directory")
# Optional: Build VTK for visualization. If outdir=None they are not exportedinterpolator.build_vtk_output(outdir="vtk_output")

Interpolation Configuration

Two dataclass objects fully control how the interpolation is performed.

InterpolationConfig

Controls the spatial search strategy, the interpolation kernel, and the target load type.

ParameterTypeDescription
methodQUERY_TYPENeighbour search strategy: QUERY_TYPE.K (K-nearest) or QUERY_TYPE.RADIUS (radius-based).
paramint | floatParameter for the chosen method: number of neighbours for K, radius (same unit as coordinates) for RADIUS.
max_distancefloatMaximum distance (same unit as coordinates) beyond which a destination node is not considered a neighbour, even when using QUERY_TYPE.K. Acts as a hard cutoff.
coincidence_tolerancefloatDistance below which two nodes are treated as coincident and the source value is copied directly without interpolation.
kernelINTERPOLATION_KERNELAlgorithm used to assign a value from the neighbourhood. See Interpolation Kernels.
multithreadboolWhether to parallelise the interpolation loop using threads.
interpolated_loadINTERPOLATED_LOAD_TYPEPhysical quantity being interpolated. Determines the number of components and the APDL export format.
accept_no_neighborboolIf False (default), raise an error when a destination node has no neighbour within max_distance. If True, assign zero to those nodes silently.

Note: not every kernel is compatible with every load type. See Kernel–Load Compatibility.

ColumnsConfig

Describes the zero-based column indices in both the source data files and the destination mesh file. All three coordinate components (x, y, z) are expected in consecutive columns starting at the given index.

ParameterTypeDescription
source_xyzintIndex of the x column in the source file; y and z must follow immediately.
valueintIndex of the column containing the scalar (or first component) value to interpolate from the source file.
dest_xyzintIndex of the x column in the destination mesh file; y and z must follow immediately.
idintIndex of the node-ID column in the destination mesh file.
volume_areaint | NoneIndex of the volume/area column in the destination mesh file. Required for scalar integrals and for EM force density inputs.

Interpolation checks and outputs

Analysis Methods

After interpolation, InterpCore provides methods to analyze and validate results:

Scalar Integrals

For scalar fields (heat flux, heat generation), you can compute the total integral over the destination mesh:

# Requires volume or area data in the destination meshcolumns=ColumnsConfig(
id=0, dest_xyz=1, source_xyz=1, value=4, volume_area=4
) # volume_area points to the vol/area columninterpolator=Interpolator(
path_to_src_folder="source_data",
path_to_dest_mesh="destination_mesh.txt",
config=config,
columns=columns,
)
interpolator.interpolate_all()
# Compute integrals (e.g., total heat generation in W)integrals=interpolator.compute_scalar_integrals()
# Returns: {"data_001": array([total_value])}

Note: The destination mesh must include volume (for 3D elements) or area (for 2D elements) data. Use the APDL scripts in apdl-scripts/ to export element centroids with volumes and areas.

EM Force Resultants

For EM force fields, you can compute force and moment resultants to verify conservation:

# After interpolation with EM_FORCE load typeresultants=interpolator.compute_EM_resultants(pole=np.array([0.0, 0.0, 0.0]))
# Returns for each source file:# {# "force_001": {# "R_F_EM": [Fx, Fy, Fz], # Total force from source data# "R_F_Mech": [Fx, Fy, Fz], # Total force from interpolated data# "R_M_EM": [Mx, My, Mz], # Total moment from source data# "R_M_Mech": [Mx, My, Mz], # Total moment from interpolated data# "f_err_comp": [ex, ey, ez], # Relative force error by component# "m_err_comp": [ex, ey, ez], # Relative moment error by component# "Unmapped_EM_Force": float # Norm of unmapped forces# }# }

This is useful for validating that the interpolation preserves global force and moment equilibrium. Small errors indicate good interpolation quality.

Examples

Complete working examples with sample data are available in the doc/ folder:

Each example includes:

  • Sample mesh files
  • Sample data files
  • Jupyter notebook with full workflow
  • Visualization with PyVista

Configuration Options

Query Methods

  • QUERY_TYPE.K: K-nearest neighbors (param = number of neighbors)
  • QUERY_TYPE.RADIUS: Radius-based search (param = radius in same unit as coordinates)

Interpolation Kernels

Source-to-target

Each source point is distributed to destination neighbours:

  • DISTANCE_WEIGHTED: Weight by inverse distance
  • FEM: FEM-based interpolation

Target-to-source

A value is assigned to each destination point based on source neighbours

  • CLOSEST: Use closest source point value
  • AVERAGE: Simple average of neighbors
  • AVERAGE_WEIGHTED: Average the neighbours values but weighting them by distance (the closer the more important).

Load Types

  • EM_FORCE: 3-component vector fields (Fx, Fy, Fz). If "vol" column is provided the forces are interpreted as force densities and will be multiplied by the volume.
  • HEAT_FLUX: Scalar fields for surface heat flux
  • HEAT_GEN: Scalar fields for volumetric heat generation
  • HTC: 2-component convection boundary condition — Heat Transfer Coefficient and bulk fluid (reference) temperature. Exported as SFE,,CONV,1 and SFE,,CONV,2 in APDL.

Kernel-Load Compatibility

Not every kernel can be used with every load type. The kernels are divided into two families based on the direction of the mapping:

KernelFamilyCompatible loads
DISTANCE_WEIGHTEDSource-to-targetEM_FORCE only
FEMSource-to-targetEM_FORCE only
AVERAGETarget-to-sourceHEAT_FLUX, HEAT_GEN, HTC
AVERAGE_WEIGHTEDTarget-to-sourceHEAT_FLUX, HEAT_GEN, HTC
CLOSESTTarget-to-sourceHEAT_FLUX, HEAT_GEN, HTC

Source-to-target kernels distribute each source point's contribution onto its destination neighbours, which is suited to force conservation in EM applications. Target-to-source kernels assign a value to each destination node by aggregating its source neighbours, which is better suited to scalar field interpolation. Using an incompatible combination raises a ConfigurationError at construction time.

File Format

The file format is pretty free, header, no header, commas, tabs.... The important part is that the correct index columns are specified when creating the interpolator.

Destination mesh input files can be created using the apdl scripts included in this repository here.

Requirements

  • Python ≥ 3.10
  • scikit-learn
  • pandas
  • tqdm
  • pyvista

License

Licensed under the European Union Public Licence (EUPL) 1.2

Authors

Developed by the F4E mechanical team

About

Python library for complex interpolations to ANSYS models

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

InterpCore

A Python library for interpolating physical field data (electromagnetic forces, heat flux, etc.) between different mesh representations and exporting to ANSYS APDL format.

Features

  • Multiple interpolation kernels: Distance-weighted, FEM-based, K-nearest neighbors, closest point
  • Flexible query methods: K-nearest neighbors or radius-based search
  • Support for multiple load types:
    • EM forces (3-component vector fields)
    • Heat flux (scalar fields)
    • Heat generation (volumetric)
    • Heat Transfer Coefficient + bulk fluid temperature (convection BCs)
  • Analysis tools:
    • Scalar field integration for computing total heat generation, flux, etc.
    • EM force resultant computation for validating force/moment conservation
  • Export to ANSYS APDL: Direct export of interpolated results in APDL format
  • Visualization: Built-in VTK export for ParaView or PyVista visualization
  • Efficient: KDTree-based spatial queries for fast neighbor searches

Installation

pip install interpcore

Quick Start

frominterpcore.interpolatorimportInterpolatorfrominterpcore.configimport (
InterpolationConfig,
ColumnsConfig,
QUERY_TYPE,
INTERPOLATED_LOAD_TYPE,
)
frominterpcore.kernelsimportINTERPOLATION_KERNEL# Configure interpolationconfig=InterpolationConfig(
method=QUERY_TYPE.K, # type of neighbour searchparam=5, # parameter relative to the neighbour search (K or radius)max_distance=2.0, # filter by a max radius of search (in case of K is used)coincidence_tolerance=0.01, # tolerance to consider two nodes coincidentkernel=INTERPOLATION_KERNEL.DISTANCE_WEIGHTED, # How to interpolatemultithread=False, # use or not multithreadinterpolated_load=INTERPOLATED_LOAD_TYPE.EM_FORCE, # type of load that is being interpolated
)
# Define column indices for the input filescolumns=ColumnsConfig(id=0, dest_xyz=1, source_xyz=1, value=4)
# Create interpolator and runinterpolator=Interpolator(
path_to_src_folder="source_data",
path_to_dest_mesh="destination_mesh.txt",
config=config,
columns=columns,
)
# Interpolate all source filesinterpolator.interpolate_all()
# Export to ANSYS formatinterpolator.export_to_ansys("output_directory")
# Optional: Build VTK for visualization. If outdir=None they are not exportedinterpolator.build_vtk_output(outdir="vtk_output")

Interpolation Configuration

Two dataclass objects fully control how the interpolation is performed.

InterpolationConfig

Controls the spatial search strategy, the interpolation kernel, and the target load type.

ParameterTypeDescription
methodQUERY_TYPENeighbour search strategy: QUERY_TYPE.K (K-nearest) or QUERY_TYPE.RADIUS (radius-based).
paramint | floatParameter for the chosen method: number of neighbours for K, radius (same unit as coordinates) for RADIUS.
max_distancefloatMaximum distance (same unit as coordinates) beyond which a destination node is not considered a neighbour, even when using QUERY_TYPE.K. Acts as a hard cutoff.
coincidence_tolerancefloatDistance below which two nodes are treated as coincident and the source value is copied directly without interpolation.
kernelINTERPOLATION_KERNELAlgorithm used to assign a value from the neighbourhood. See Interpolation Kernels.
multithreadboolWhether to parallelise the interpolation loop using threads.
interpolated_loadINTERPOLATED_LOAD_TYPEPhysical quantity being interpolated. Determines the number of components and the APDL export format.
accept_no_neighborboolIf False (default), raise an error when a destination node has no neighbour within max_distance. If True, assign zero to those nodes silently.

Note: not every kernel is compatible with every load type. See Kernel–Load Compatibility.

ColumnsConfig

Describes the zero-based column indices in both the source data files and the destination mesh file. All three coordinate components (x, y, z) are expected in consecutive columns starting at the given index.

ParameterTypeDescription
source_xyzintIndex of the x column in the source file; y and z must follow immediately.
valueintIndex of the column containing the scalar (or first component) value to interpolate from the source file.
dest_xyzintIndex of the x column in the destination mesh file; y and z must follow immediately.
idintIndex of the node-ID column in the destination mesh file.
volume_areaint | NoneIndex of the volume/area column in the destination mesh file. Required for scalar integrals and for EM force density inputs.

Interpolation checks and outputs

Analysis Methods

After interpolation, InterpCore provides methods to analyze and validate results:

Scalar Integrals

For scalar fields (heat flux, heat generation), you can compute the total integral over the destination mesh:

# Requires volume or area data in the destination meshcolumns=ColumnsConfig(
id=0, dest_xyz=1, source_xyz=1, value=4, volume_area=4
) # volume_area points to the vol/area columninterpolator=Interpolator(
path_to_src_folder="source_data",
path_to_dest_mesh="destination_mesh.txt",
config=config,
columns=columns,
)
interpolator.interpolate_all()
# Compute integrals (e.g., total heat generation in W)integrals=interpolator.compute_scalar_integrals()
# Returns: {"data_001": array([total_value])}

Note: The destination mesh must include volume (for 3D elements) or area (for 2D elements) data. Use the APDL scripts in apdl-scripts/ to export element centroids with volumes and areas.

EM Force Resultants

For EM force fields, you can compute force and moment resultants to verify conservation:

# After interpolation with EM_FORCE load typeresultants=interpolator.compute_EM_resultants(pole=np.array([0.0, 0.0, 0.0]))
# Returns for each source file:# {# "force_001": {# "R_F_EM": [Fx, Fy, Fz], # Total force from source data# "R_F_Mech": [Fx, Fy, Fz], # Total force from interpolated data# "R_M_EM": [Mx, My, Mz], # Total moment from source data# "R_M_Mech": [Mx, My, Mz], # Total moment from interpolated data# "f_err_comp": [ex, ey, ez], # Relative force error by component# "m_err_comp": [ex, ey, ez], # Relative moment error by component# "Unmapped_EM_Force": float # Norm of unmapped forces# }# }

This is useful for validating that the interpolation preserves global force and moment equilibrium. Small errors indicate good interpolation quality.

Examples

Complete working examples with sample data are available in the doc/ folder:

Each example includes:

  • Sample mesh files
  • Sample data files
  • Jupyter notebook with full workflow
  • Visualization with PyVista

Configuration Options

Query Methods

  • QUERY_TYPE.K: K-nearest neighbors (param = number of neighbors)
  • QUERY_TYPE.RADIUS: Radius-based search (param = radius in same unit as coordinates)

Interpolation Kernels

Source-to-target

Each source point is distributed to destination neighbours:

  • DISTANCE_WEIGHTED: Weight by inverse distance
  • FEM: FEM-based interpolation

Target-to-source

A value is assigned to each destination point based on source neighbours

  • CLOSEST: Use closest source point value
  • AVERAGE: Simple average of neighbors
  • AVERAGE_WEIGHTED: Average the neighbours values but weighting them by distance (the closer the more important).

Load Types

  • EM_FORCE: 3-component vector fields (Fx, Fy, Fz). If "vol" column is provided the forces are interpreted as force densities and will be multiplied by the volume.
  • HEAT_FLUX: Scalar fields for surface heat flux
  • HEAT_GEN: Scalar fields for volumetric heat generation
  • HTC: 2-component convection boundary condition — Heat Transfer Coefficient and bulk fluid (reference) temperature. Exported as SFE,,CONV,1 and SFE,,CONV,2 in APDL.

Kernel-Load Compatibility

Not every kernel can be used with every load type. The kernels are divided into two families based on the direction of the mapping:

KernelFamilyCompatible loads
DISTANCE_WEIGHTEDSource-to-targetEM_FORCE only
FEMSource-to-targetEM_FORCE only
AVERAGETarget-to-sourceHEAT_FLUX, HEAT_GEN, HTC
AVERAGE_WEIGHTEDTarget-to-sourceHEAT_FLUX, HEAT_GEN, HTC
CLOSESTTarget-to-sourceHEAT_FLUX, HEAT_GEN, HTC

Source-to-target kernels distribute each source point's contribution onto its destination neighbours, which is suited to force conservation in EM applications. Target-to-source kernels assign a value to each destination node by aggregating its source neighbours, which is better suited to scalar field interpolation. Using an incompatible combination raises a ConfigurationError at construction time.

File Format

The file format is pretty free, header, no header, commas, tabs.... The important part is that the correct index columns are specified when creating the interpolator.

Destination mesh input files can be created using the apdl scripts included in this repository here.

Requirements

  • Python ≥ 3.10
  • scikit-learn
  • pandas
  • tqdm
  • pyvista

License

Licensed under the European Union Public Licence (EUPL) 1.2

Authors

Developed by the F4E mechanical team

About

Python library for complex interpolations to ANSYS models

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

InterpCore

A Python library for interpolating physical field data (electromagnetic forces, heat flux, etc.) between different mesh representations and exporting to ANSYS APDL format.

Features

  • Multiple interpolation kernels: Distance-weighted, FEM-based, K-nearest neighbors, closest point
  • Flexible query methods: K-nearest neighbors or radius-based search
  • Support for multiple load types:
    • EM forces (3-component vector fields)
    • Heat flux (scalar fields)
    • Heat generation (volumetric)
    • Heat Transfer Coefficient + bulk fluid temperature (convection BCs)
  • Analysis tools:
    • Scalar field integration for computing total heat generation, flux, etc.
    • EM force resultant computation for validating force/moment conservation
  • Export to ANSYS APDL: Direct export of interpolated results in APDL format
  • Visualization: Built-in VTK export for ParaView or PyVista visualization
  • Efficient: KDTree-based spatial queries for fast neighbor searches

Installation

pip install interpcore

Quick Start

frominterpcore.interpolatorimportInterpolatorfrominterpcore.configimport (
InterpolationConfig,
ColumnsConfig,
QUERY_TYPE,
INTERPOLATED_LOAD_TYPE,
)
frominterpcore.kernelsimportINTERPOLATION_KERNEL# Configure interpolationconfig=InterpolationConfig(
method=QUERY_TYPE.K, # type of neighbour searchparam=5, # parameter relative to the neighbour search (K or radius)max_distance=2.0, # filter by a max radius of search (in case of K is used)coincidence_tolerance=0.01, # tolerance to consider two nodes coincidentkernel=INTERPOLATION_KERNEL.DISTANCE_WEIGHTED, # How to interpolatemultithread=False, # use or not multithreadinterpolated_load=INTERPOLATED_LOAD_TYPE.EM_FORCE, # type of load that is being interpolated
)
# Define column indices for the input filescolumns=ColumnsConfig(id=0, dest_xyz=1, source_xyz=1, value=4)
# Create interpolator and runinterpolator=Interpolator(
path_to_src_folder="source_data",
path_to_dest_mesh="destination_mesh.txt",
config=config,
columns=columns,
)
# Interpolate all source filesinterpolator.interpolate_all()
# Export to ANSYS formatinterpolator.export_to_ansys("output_directory")
# Optional: Build VTK for visualization. If outdir=None they are not exportedinterpolator.build_vtk_output(outdir="vtk_output")

Interpolation Configuration

Two dataclass objects fully control how the interpolation is performed.

InterpolationConfig

Controls the spatial search strategy, the interpolation kernel, and the target load type.

ParameterTypeDescription
methodQUERY_TYPENeighbour search strategy: QUERY_TYPE.K (K-nearest) or QUERY_TYPE.RADIUS (radius-based).
paramint | floatParameter for the chosen method: number of neighbours for K, radius (same unit as coordinates) for RADIUS.
max_distancefloatMaximum distance (same unit as coordinates) beyond which a destination node is not considered a neighbour, even when using QUERY_TYPE.K. Acts as a hard cutoff.
coincidence_tolerancefloatDistance below which two nodes are treated as coincident and the source value is copied directly without interpolation.
kernelINTERPOLATION_KERNELAlgorithm used to assign a value from the neighbourhood. See Interpolation Kernels.
multithreadboolWhether to parallelise the interpolation loop using threads.
interpolated_loadINTERPOLATED_LOAD_TYPEPhysical quantity being interpolated. Determines the number of components and the APDL export format.
accept_no_neighborboolIf False (default), raise an error when a destination node has no neighbour within max_distance. If True, assign zero to those nodes silently.

Note: not every kernel is compatible with every load type. See Kernel–Load Compatibility.

ColumnsConfig

Describes the zero-based column indices in both the source data files and the destination mesh file. All three coordinate components (x, y, z) are expected in consecutive columns starting at the given index.

ParameterTypeDescription
source_xyzintIndex of the x column in the source file; y and z must follow immediately.
valueintIndex of the column containing the scalar (or first component) value to interpolate from the source file.
dest_xyzintIndex of the x column in the destination mesh file; y and z must follow immediately.
idintIndex of the node-ID column in the destination mesh file.
volume_areaint | NoneIndex of the volume/area column in the destination mesh file. Required for scalar integrals and for EM force density inputs.

Interpolation checks and outputs

Analysis Methods

After interpolation, InterpCore provides methods to analyze and validate results:

Scalar Integrals

For scalar fields (heat flux, heat generation), you can compute the total integral over the destination mesh:

# Requires volume or area data in the destination meshcolumns=ColumnsConfig(
id=0, dest_xyz=1, source_xyz=1, value=4, volume_area=4
) # volume_area points to the vol/area columninterpolator=Interpolator(
path_to_src_folder="source_data",
path_to_dest_mesh="destination_mesh.txt",
config=config,
columns=columns,
)
interpolator.interpolate_all()
# Compute integrals (e.g., total heat generation in W)integrals=interpolator.compute_scalar_integrals()
# Returns: {"data_001": array([total_value])}

Note: The destination mesh must include volume (for 3D elements) or area (for 2D elements) data. Use the APDL scripts in apdl-scripts/ to export element centroids with volumes and areas.

EM Force Resultants

For EM force fields, you can compute force and moment resultants to verify conservation:

# After interpolation with EM_FORCE load typeresultants=interpolator.compute_EM_resultants(pole=np.array([0.0, 0.0, 0.0]))
# Returns for each source file:# {# "force_001": {# "R_F_EM": [Fx, Fy, Fz], # Total force from source data# "R_F_Mech": [Fx, Fy, Fz], # Total force from interpolated data# "R_M_EM": [Mx, My, Mz], # Total moment from source data# "R_M_Mech": [Mx, My, Mz], # Total moment from interpolated data# "f_err_comp": [ex, ey, ez], # Relative force error by component# "m_err_comp": [ex, ey, ez], # Relative moment error by component# "Unmapped_EM_Force": float # Norm of unmapped forces# }# }

This is useful for validating that the interpolation preserves global force and moment equilibrium. Small errors indicate good interpolation quality.

Examples

Complete working examples with sample data are available in the doc/ folder:

Each example includes:

  • Sample mesh files
  • Sample data files
  • Jupyter notebook with full workflow
  • Visualization with PyVista

Configuration Options

Query Methods

  • QUERY_TYPE.K: K-nearest neighbors (param = number of neighbors)
  • QUERY_TYPE.RADIUS: Radius-based search (param = radius in same unit as coordinates)

Interpolation Kernels

Source-to-target

Each source point is distributed to destination neighbours:

  • DISTANCE_WEIGHTED: Weight by inverse distance
  • FEM: FEM-based interpolation

Target-to-source

A value is assigned to each destination point based on source neighbours

  • CLOSEST: Use closest source point value
  • AVERAGE: Simple average of neighbors
  • AVERAGE_WEIGHTED: Average the neighbours values but weighting them by distance (the closer the more important).

Load Types

  • EM_FORCE: 3-component vector fields (Fx, Fy, Fz). If "vol" column is provided the forces are interpreted as force densities and will be multiplied by the volume.
  • HEAT_FLUX: Scalar fields for surface heat flux
  • HEAT_GEN: Scalar fields for volumetric heat generation
  • HTC: 2-component convection boundary condition — Heat Transfer Coefficient and bulk fluid (reference) temperature. Exported as SFE,,CONV,1 and SFE,,CONV,2 in APDL.

Kernel-Load Compatibility

Not every kernel can be used with every load type. The kernels are divided into two families based on the direction of the mapping:

KernelFamilyCompatible loads
DISTANCE_WEIGHTEDSource-to-targetEM_FORCE only
FEMSource-to-targetEM_FORCE only
AVERAGETarget-to-sourceHEAT_FLUX, HEAT_GEN, HTC
AVERAGE_WEIGHTEDTarget-to-sourceHEAT_FLUX, HEAT_GEN, HTC
CLOSESTTarget-to-sourceHEAT_FLUX, HEAT_GEN, HTC

Source-to-target kernels distribute each source point's contribution onto its destination neighbours, which is suited to force conservation in EM applications. Target-to-source kernels assign a value to each destination node by aggregating its source neighbours, which is better suited to scalar field interpolation. Using an incompatible combination raises a ConfigurationError at construction time.

File Format

The file format is pretty free, header, no header, commas, tabs.... The important part is that the correct index columns are specified when creating the interpolator.

Destination mesh input files can be created using the apdl scripts included in this repository here.

Requirements

  • Python ≥ 3.10
  • scikit-learn
  • pandas
  • tqdm
  • pyvista

License

Licensed under the European Union Public Licence (EUPL) 1.2

Authors

Developed by the F4E mechanical team

About

Python library for complex interpolations to ANSYS models

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

InterpCore

A Python library for interpolating physical field data (electromagnetic forces, heat flux, etc.) between different mesh representations and exporting to ANSYS APDL format.

Features

  • Multiple interpolation kernels: Distance-weighted, FEM-based, K-nearest neighbors, closest point
  • Flexible query methods: K-nearest neighbors or radius-based search
  • Support for multiple load types:
    • EM forces (3-component vector fields)
    • Heat flux (scalar fields)
    • Heat generation (volumetric)
    • Heat Transfer Coefficient + bulk fluid temperature (convection BCs)
  • Analysis tools:
    • Scalar field integration for computing total heat generation, flux, etc.
    • EM force resultant computation for validating force/moment conservation
  • Export to ANSYS APDL: Direct export of interpolated results in APDL format
  • Visualization: Built-in VTK export for ParaView or PyVista visualization
  • Efficient: KDTree-based spatial queries for fast neighbor searches

Installation

pip install interpcore

Quick Start

frominterpcore.interpolatorimportInterpolatorfrominterpcore.configimport (
InterpolationConfig,
ColumnsConfig,
QUERY_TYPE,
INTERPOLATED_LOAD_TYPE,
)
frominterpcore.kernelsimportINTERPOLATION_KERNEL# Configure interpolationconfig=InterpolationConfig(
method=QUERY_TYPE.K, # type of neighbour searchparam=5, # parameter relative to the neighbour search (K or radius)max_distance=2.0, # filter by a max radius of search (in case of K is used)coincidence_tolerance=0.01, # tolerance to consider two nodes coincidentkernel=INTERPOLATION_KERNEL.DISTANCE_WEIGHTED, # How to interpolatemultithread=False, # use or not multithreadinterpolated_load=INTERPOLATED_LOAD_TYPE.EM_FORCE, # type of load that is being interpolated
)
# Define column indices for the input filescolumns=ColumnsConfig(id=0, dest_xyz=1, source_xyz=1, value=4)
# Create interpolator and runinterpolator=Interpolator(
path_to_src_folder="source_data",
path_to_dest_mesh="destination_mesh.txt",
config=config,
columns=columns,
)
# Interpolate all source filesinterpolator.interpolate_all()
# Export to ANSYS formatinterpolator.export_to_ansys("output_directory")
# Optional: Build VTK for visualization. If outdir=None they are not exportedinterpolator.build_vtk_output(outdir="vtk_output")

Interpolation Configuration

Two dataclass objects fully control how the interpolation is performed.

InterpolationConfig

Controls the spatial search strategy, the interpolation kernel, and the target load type.

ParameterTypeDescription
methodQUERY_TYPENeighbour search strategy: QUERY_TYPE.K (K-nearest) or QUERY_TYPE.RADIUS (radius-based).
paramint | floatParameter for the chosen method: number of neighbours for K, radius (same unit as coordinates) for RADIUS.
max_distancefloatMaximum distance (same unit as coordinates) beyond which a destination node is not considered a neighbour, even when using QUERY_TYPE.K. Acts as a hard cutoff.
coincidence_tolerancefloatDistance below which two nodes are treated as coincident and the source value is copied directly without interpolation.
kernelINTERPOLATION_KERNELAlgorithm used to assign a value from the neighbourhood. See Interpolation Kernels.
multithreadboolWhether to parallelise the interpolation loop using threads.
interpolated_loadINTERPOLATED_LOAD_TYPEPhysical quantity being interpolated. Determines the number of components and the APDL export format.
accept_no_neighborboolIf False (default), raise an error when a destination node has no neighbour within max_distance. If True, assign zero to those nodes silently.

Note: not every kernel is compatible with every load type. See Kernel–Load Compatibility.

ColumnsConfig

Describes the zero-based column indices in both the source data files and the destination mesh file. All three coordinate components (x, y, z) are expected in consecutive columns starting at the given index.

ParameterTypeDescription
source_xyzintIndex of the x column in the source file; y and z must follow immediately.
valueintIndex of the column containing the scalar (or first component) value to interpolate from the source file.
dest_xyzintIndex of the x column in the destination mesh file; y and z must follow immediately.
idintIndex of the node-ID column in the destination mesh file.
volume_areaint | NoneIndex of the volume/area column in the destination mesh file. Required for scalar integrals and for EM force density inputs.

Interpolation checks and outputs

Analysis Methods

After interpolation, InterpCore provides methods to analyze and validate results:

Scalar Integrals

For scalar fields (heat flux, heat generation), you can compute the total integral over the destination mesh:

# Requires volume or area data in the destination meshcolumns=ColumnsConfig(
id=0, dest_xyz=1, source_xyz=1, value=4, volume_area=4
) # volume_area points to the vol/area columninterpolator=Interpolator(
path_to_src_folder="source_data",
path_to_dest_mesh="destination_mesh.txt",
config=config,
columns=columns,
)
interpolator.interpolate_all()
# Compute integrals (e.g., total heat generation in W)integrals=interpolator.compute_scalar_integrals()
# Returns: {"data_001": array([total_value])}

Note: The destination mesh must include volume (for 3D elements) or area (for 2D elements) data. Use the APDL scripts in apdl-scripts/ to export element centroids with volumes and areas.

EM Force Resultants

For EM force fields, you can compute force and moment resultants to verify conservation:

# After interpolation with EM_FORCE load typeresultants=interpolator.compute_EM_resultants(pole=np.array([0.0, 0.0, 0.0]))
# Returns for each source file:# {# "force_001": {# "R_F_EM": [Fx, Fy, Fz], # Total force from source data# "R_F_Mech": [Fx, Fy, Fz], # Total force from interpolated data# "R_M_EM": [Mx, My, Mz], # Total moment from source data# "R_M_Mech": [Mx, My, Mz], # Total moment from interpolated data# "f_err_comp": [ex, ey, ez], # Relative force error by component# "m_err_comp": [ex, ey, ez], # Relative moment error by component# "Unmapped_EM_Force": float # Norm of unmapped forces# }# }

This is useful for validating that the interpolation preserves global force and moment equilibrium. Small errors indicate good interpolation quality.

Examples

Complete working examples with sample data are available in the doc/ folder:

Each example includes:

  • Sample mesh files
  • Sample data files
  • Jupyter notebook with full workflow
  • Visualization with PyVista

Configuration Options

Query Methods

  • QUERY_TYPE.K: K-nearest neighbors (param = number of neighbors)
  • QUERY_TYPE.RADIUS: Radius-based search (param = radius in same unit as coordinates)

Interpolation Kernels

Source-to-target

Each source point is distributed to destination neighbours:

  • DISTANCE_WEIGHTED: Weight by inverse distance
  • FEM: FEM-based interpolation

Target-to-source

A value is assigned to each destination point based on source neighbours

  • CLOSEST: Use closest source point value
  • AVERAGE: Simple average of neighbors
  • AVERAGE_WEIGHTED: Average the neighbours values but weighting them by distance (the closer the more important).

Load Types

  • EM_FORCE: 3-component vector fields (Fx, Fy, Fz). If "vol" column is provided the forces are interpreted as force densities and will be multiplied by the volume.
  • HEAT_FLUX: Scalar fields for surface heat flux
  • HEAT_GEN: Scalar fields for volumetric heat generation
  • HTC: 2-component convection boundary condition — Heat Transfer Coefficient and bulk fluid (reference) temperature. Exported as SFE,,CONV,1 and SFE,,CONV,2 in APDL.

Kernel-Load Compatibility

Not every kernel can be used with every load type. The kernels are divided into two families based on the direction of the mapping:

KernelFamilyCompatible loads
DISTANCE_WEIGHTEDSource-to-targetEM_FORCE only
FEMSource-to-targetEM_FORCE only
AVERAGETarget-to-sourceHEAT_FLUX, HEAT_GEN, HTC
AVERAGE_WEIGHTEDTarget-to-sourceHEAT_FLUX, HEAT_GEN, HTC
CLOSESTTarget-to-sourceHEAT_FLUX, HEAT_GEN, HTC

Source-to-target kernels distribute each source point's contribution onto its destination neighbours, which is suited to force conservation in EM applications. Target-to-source kernels assign a value to each destination node by aggregating its source neighbours, which is better suited to scalar field interpolation. Using an incompatible combination raises a ConfigurationError at construction time.

File Format

The file format is pretty free, header, no header, commas, tabs.... The important part is that the correct index columns are specified when creating the interpolator.

Destination mesh input files can be created using the apdl scripts included in this repository here.

Requirements

  • Python ≥ 3.10
  • scikit-learn
  • pandas
  • tqdm
  • pyvista

License

Licensed under the European Union Public Licence (EUPL) 1.2

Authors

Developed by the F4E mechanical team

About

Python library for complex interpolations to ANSYS models

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

InterpCore

A Python library for interpolating physical field data (electromagnetic forces, heat flux, etc.) between different mesh representations and exporting to ANSYS APDL format.

Features

  • Multiple interpolation kernels: Distance-weighted, FEM-based, K-nearest neighbors, closest point
  • Flexible query methods: K-nearest neighbors or radius-based search
  • Support for multiple load types:
    • EM forces (3-component vector fields)
    • Heat flux (scalar fields)
    • Heat generation (volumetric)
    • Heat Transfer Coefficient + bulk fluid temperature (convection BCs)
  • Analysis tools:
    • Scalar field integration for computing total heat generation, flux, etc.
    • EM force resultant computation for validating force/moment conservation
  • Export to ANSYS APDL: Direct export of interpolated results in APDL format
  • Visualization: Built-in VTK export for ParaView or PyVista visualization
  • Efficient: KDTree-based spatial queries for fast neighbor searches

Installation

pip install interpcore

Quick Start

frominterpcore.interpolatorimportInterpolatorfrominterpcore.configimport (
InterpolationConfig,
ColumnsConfig,
QUERY_TYPE,
INTERPOLATED_LOAD_TYPE,
)
frominterpcore.kernelsimportINTERPOLATION_KERNEL# Configure interpolationconfig=InterpolationConfig(
method=QUERY_TYPE.K, # type of neighbour searchparam=5, # parameter relative to the neighbour search (K or radius)max_distance=2.0, # filter by a max radius of search (in case of K is used)coincidence_tolerance=0.01, # tolerance to consider two nodes coincidentkernel=INTERPOLATION_KERNEL.DISTANCE_WEIGHTED, # How to interpolatemultithread=False, # use or not multithreadinterpolated_load=INTERPOLATED_LOAD_TYPE.EM_FORCE, # type of load that is being interpolated
)
# Define column indices for the input filescolumns=ColumnsConfig(id=0, dest_xyz=1, source_xyz=1, value=4)
# Create interpolator and runinterpolator=Interpolator(
path_to_src_folder="source_data",
path_to_dest_mesh="destination_mesh.txt",
config=config,
columns=columns,
)
# Interpolate all source filesinterpolator.interpolate_all()
# Export to ANSYS formatinterpolator.export_to_ansys("output_directory")
# Optional: Build VTK for visualization. If outdir=None they are not exportedinterpolator.build_vtk_output(outdir="vtk_output")

Interpolation Configuration

Two dataclass objects fully control how the interpolation is performed.

InterpolationConfig

Controls the spatial search strategy, the interpolation kernel, and the target load type.

ParameterTypeDescription
methodQUERY_TYPENeighbour search strategy: QUERY_TYPE.K (K-nearest) or QUERY_TYPE.RADIUS (radius-based).
paramint | floatParameter for the chosen method: number of neighbours for K, radius (same unit as coordinates) for RADIUS.
max_distancefloatMaximum distance (same unit as coordinates) beyond which a destination node is not considered a neighbour, even when using QUERY_TYPE.K. Acts as a hard cutoff.
coincidence_tolerancefloatDistance below which two nodes are treated as coincident and the source value is copied directly without interpolation.
kernelINTERPOLATION_KERNELAlgorithm used to assign a value from the neighbourhood. See Interpolation Kernels.
multithreadboolWhether to parallelise the interpolation loop using threads.
interpolated_loadINTERPOLATED_LOAD_TYPEPhysical quantity being interpolated. Determines the number of components and the APDL export format.
accept_no_neighborboolIf False (default), raise an error when a destination node has no neighbour within max_distance. If True, assign zero to those nodes silently.

Note: not every kernel is compatible with every load type. See Kernel–Load Compatibility.

ColumnsConfig

Describes the zero-based column indices in both the source data files and the destination mesh file. All three coordinate components (x, y, z) are expected in consecutive columns starting at the given index.

ParameterTypeDescription
source_xyzintIndex of the x column in the source file; y and z must follow immediately.
valueintIndex of the column containing the scalar (or first component) value to interpolate from the source file.
dest_xyzintIndex of the x column in the destination mesh file; y and z must follow immediately.
idintIndex of the node-ID column in the destination mesh file.
volume_areaint | NoneIndex of the volume/area column in the destination mesh file. Required for scalar integrals and for EM force density inputs.

Interpolation checks and outputs

Analysis Methods

After interpolation, InterpCore provides methods to analyze and validate results:

Scalar Integrals

For scalar fields (heat flux, heat generation), you can compute the total integral over the destination mesh:

# Requires volume or area data in the destination meshcolumns=ColumnsConfig(
id=0, dest_xyz=1, source_xyz=1, value=4, volume_area=4
) # volume_area points to the vol/area columninterpolator=Interpolator(
path_to_src_folder="source_data",
path_to_dest_mesh="destination_mesh.txt",
config=config,
columns=columns,
)
interpolator.interpolate_all()
# Compute integrals (e.g., total heat generation in W)integrals=interpolator.compute_scalar_integrals()
# Returns: {"data_001": array([total_value])}

Note: The destination mesh must include volume (for 3D elements) or area (for 2D elements) data. Use the APDL scripts in apdl-scripts/ to export element centroids with volumes and areas.

EM Force Resultants

For EM force fields, you can compute force and moment resultants to verify conservation:

# After interpolation with EM_FORCE load typeresultants=interpolator.compute_EM_resultants(pole=np.array([0.0, 0.0, 0.0]))
# Returns for each source file:# {# "force_001": {# "R_F_EM": [Fx, Fy, Fz], # Total force from source data# "R_F_Mech": [Fx, Fy, Fz], # Total force from interpolated data# "R_M_EM": [Mx, My, Mz], # Total moment from source data# "R_M_Mech": [Mx, My, Mz], # Total moment from interpolated data# "f_err_comp": [ex, ey, ez], # Relative force error by component# "m_err_comp": [ex, ey, ez], # Relative moment error by component# "Unmapped_EM_Force": float # Norm of unmapped forces# }# }

This is useful for validating that the interpolation preserves global force and moment equilibrium. Small errors indicate good interpolation quality.

Examples

Complete working examples with sample data are available in the doc/ folder:

Each example includes:

  • Sample mesh files
  • Sample data files
  • Jupyter notebook with full workflow
  • Visualization with PyVista

Configuration Options

Query Methods

  • QUERY_TYPE.K: K-nearest neighbors (param = number of neighbors)
  • QUERY_TYPE.RADIUS: Radius-based search (param = radius in same unit as coordinates)

Interpolation Kernels

Source-to-target

Each source point is distributed to destination neighbours:

  • DISTANCE_WEIGHTED: Weight by inverse distance
  • FEM: FEM-based interpolation

Target-to-source

A value is assigned to each destination point based on source neighbours

  • CLOSEST: Use closest source point value
  • AVERAGE: Simple average of neighbors
  • AVERAGE_WEIGHTED: Average the neighbours values but weighting them by distance (the closer the more important).

Load Types

  • EM_FORCE: 3-component vector fields (Fx, Fy, Fz). If "vol" column is provided the forces are interpreted as force densities and will be multiplied by the volume.
  • HEAT_FLUX: Scalar fields for surface heat flux
  • HEAT_GEN: Scalar fields for volumetric heat generation
  • HTC: 2-component convection boundary condition — Heat Transfer Coefficient and bulk fluid (reference) temperature. Exported as SFE,,CONV,1 and SFE,,CONV,2 in APDL.

Kernel-Load Compatibility

Not every kernel can be used with every load type. The kernels are divided into two families based on the direction of the mapping:

KernelFamilyCompatible loads
DISTANCE_WEIGHTEDSource-to-targetEM_FORCE only
FEMSource-to-targetEM_FORCE only
AVERAGETarget-to-sourceHEAT_FLUX, HEAT_GEN, HTC
AVERAGE_WEIGHTEDTarget-to-sourceHEAT_FLUX, HEAT_GEN, HTC
CLOSESTTarget-to-sourceHEAT_FLUX, HEAT_GEN, HTC

Source-to-target kernels distribute each source point's contribution onto its destination neighbours, which is suited to force conservation in EM applications. Target-to-source kernels assign a value to each destination node by aggregating its source neighbours, which is better suited to scalar field interpolation. Using an incompatible combination raises a ConfigurationError at construction time.

File Format

The file format is pretty free, header, no header, commas, tabs.... The important part is that the correct index columns are specified when creating the interpolator.

Destination mesh input files can be created using the apdl scripts included in this repository here.

Requirements

  • Python ≥ 3.10
  • scikit-learn
  • pandas
  • tqdm
  • pyvista

License

Licensed under the European Union Public Licence (EUPL) 1.2

Authors

Developed by the F4E mechanical team

About

Python library for complex interpolations to ANSYS models

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

InterpCore

A Python library for interpolating physical field data (electromagnetic forces, heat flux, etc.) between different mesh representations and exporting to ANSYS APDL format.

Features

  • Multiple interpolation kernels: Distance-weighted, FEM-based, K-nearest neighbors, closest point
  • Flexible query methods: K-nearest neighbors or radius-based search
  • Support for multiple load types:
    • EM forces (3-component vector fields)
    • Heat flux (scalar fields)
    • Heat generation (volumetric)
    • Heat Transfer Coefficient + bulk fluid temperature (convection BCs)
  • Analysis tools:
    • Scalar field integration for computing total heat generation, flux, etc.
    • EM force resultant computation for validating force/moment conservation
  • Export to ANSYS APDL: Direct export of interpolated results in APDL format
  • Visualization: Built-in VTK export for ParaView or PyVista visualization
  • Efficient: KDTree-based spatial queries for fast neighbor searches

Installation

pip install interpcore

Quick Start

frominterpcore.interpolatorimportInterpolatorfrominterpcore.configimport (
InterpolationConfig,
ColumnsConfig,
QUERY_TYPE,
INTERPOLATED_LOAD_TYPE,
)
frominterpcore.kernelsimportINTERPOLATION_KERNEL# Configure interpolationconfig=InterpolationConfig(
method=QUERY_TYPE.K, # type of neighbour searchparam=5, # parameter relative to the neighbour search (K or radius)max_distance=2.0, # filter by a max radius of search (in case of K is used)coincidence_tolerance=0.01, # tolerance to consider two nodes coincidentkernel=INTERPOLATION_KERNEL.DISTANCE_WEIGHTED, # How to interpolatemultithread=False, # use or not multithreadinterpolated_load=INTERPOLATED_LOAD_TYPE.EM_FORCE, # type of load that is being interpolated
)
# Define column indices for the input filescolumns=ColumnsConfig(id=0, dest_xyz=1, source_xyz=1, value=4)
# Create interpolator and runinterpolator=Interpolator(
path_to_src_folder="source_data",
path_to_dest_mesh="destination_mesh.txt",
config=config,
columns=columns,
)
# Interpolate all source filesinterpolator.interpolate_all()
# Export to ANSYS formatinterpolator.export_to_ansys("output_directory")
# Optional: Build VTK for visualization. If outdir=None they are not exportedinterpolator.build_vtk_output(outdir="vtk_output")

Interpolation Configuration

Two dataclass objects fully control how the interpolation is performed.

InterpolationConfig

Controls the spatial search strategy, the interpolation kernel, and the target load type.

ParameterTypeDescription
methodQUERY_TYPENeighbour search strategy: QUERY_TYPE.K (K-nearest) or QUERY_TYPE.RADIUS (radius-based).
paramint | floatParameter for the chosen method: number of neighbours for K, radius (same unit as coordinates) for RADIUS.
max_distancefloatMaximum distance (same unit as coordinates) beyond which a destination node is not considered a neighbour, even when using QUERY_TYPE.K. Acts as a hard cutoff.
coincidence_tolerancefloatDistance below which two nodes are treated as coincident and the source value is copied directly without interpolation.
kernelINTERPOLATION_KERNELAlgorithm used to assign a value from the neighbourhood. See Interpolation Kernels.
multithreadboolWhether to parallelise the interpolation loop using threads.
interpolated_loadINTERPOLATED_LOAD_TYPEPhysical quantity being interpolated. Determines the number of components and the APDL export format.
accept_no_neighborboolIf False (default), raise an error when a destination node has no neighbour within max_distance. If True, assign zero to those nodes silently.

Note: not every kernel is compatible with every load type. See Kernel–Load Compatibility.

ColumnsConfig

Describes the zero-based column indices in both the source data files and the destination mesh file. All three coordinate components (x, y, z) are expected in consecutive columns starting at the given index.

ParameterTypeDescription
source_xyzintIndex of the x column in the source file; y and z must follow immediately.
valueintIndex of the column containing the scalar (or first component) value to interpolate from the source file.
dest_xyzintIndex of the x column in the destination mesh file; y and z must follow immediately.
idintIndex of the node-ID column in the destination mesh file.
volume_areaint | NoneIndex of the volume/area column in the destination mesh file. Required for scalar integrals and for EM force density inputs.

Interpolation checks and outputs

Analysis Methods

After interpolation, InterpCore provides methods to analyze and validate results:

Scalar Integrals

For scalar fields (heat flux, heat generation), you can compute the total integral over the destination mesh:

# Requires volume or area data in the destination meshcolumns=ColumnsConfig(
id=0, dest_xyz=1, source_xyz=1, value=4, volume_area=4
) # volume_area points to the vol/area columninterpolator=Interpolator(
path_to_src_folder="source_data",
path_to_dest_mesh="destination_mesh.txt",
config=config,
columns=columns,
)
interpolator.interpolate_all()
# Compute integrals (e.g., total heat generation in W)integrals=interpolator.compute_scalar_integrals()
# Returns: {"data_001": array([total_value])}

Note: The destination mesh must include volume (for 3D elements) or area (for 2D elements) data. Use the APDL scripts in apdl-scripts/ to export element centroids with volumes and areas.

EM Force Resultants

For EM force fields, you can compute force and moment resultants to verify conservation:

# After interpolation with EM_FORCE load typeresultants=interpolator.compute_EM_resultants(pole=np.array([0.0, 0.0, 0.0]))
# Returns for each source file:# {# "force_001": {# "R_F_EM": [Fx, Fy, Fz], # Total force from source data# "R_F_Mech": [Fx, Fy, Fz], # Total force from interpolated data# "R_M_EM": [Mx, My, Mz], # Total moment from source data# "R_M_Mech": [Mx, My, Mz], # Total moment from interpolated data# "f_err_comp": [ex, ey, ez], # Relative force error by component# "m_err_comp": [ex, ey, ez], # Relative moment error by component# "Unmapped_EM_Force": float # Norm of unmapped forces# }# }

This is useful for validating that the interpolation preserves global force and moment equilibrium. Small errors indicate good interpolation quality.

Examples

Complete working examples with sample data are available in the doc/ folder:

Each example includes:

  • Sample mesh files
  • Sample data files
  • Jupyter notebook with full workflow
  • Visualization with PyVista

Configuration Options

Query Methods

  • QUERY_TYPE.K: K-nearest neighbors (param = number of neighbors)
  • QUERY_TYPE.RADIUS: Radius-based search (param = radius in same unit as coordinates)

Interpolation Kernels

Source-to-target

Each source point is distributed to destination neighbours:

  • DISTANCE_WEIGHTED: Weight by inverse distance
  • FEM: FEM-based interpolation

Target-to-source

A value is assigned to each destination point based on source neighbours

  • CLOSEST: Use closest source point value
  • AVERAGE: Simple average of neighbors
  • AVERAGE_WEIGHTED: Average the neighbours values but weighting them by distance (the closer the more important).

Load Types

  • EM_FORCE: 3-component vector fields (Fx, Fy, Fz). If "vol" column is provided the forces are interpreted as force densities and will be multiplied by the volume.
  • HEAT_FLUX: Scalar fields for surface heat flux
  • HEAT_GEN: Scalar fields for volumetric heat generation
  • HTC: 2-component convection boundary condition — Heat Transfer Coefficient and bulk fluid (reference) temperature. Exported as SFE,,CONV,1 and SFE,,CONV,2 in APDL.

Kernel-Load Compatibility

Not every kernel can be used with every load type. The kernels are divided into two families based on the direction of the mapping:

KernelFamilyCompatible loads
DISTANCE_WEIGHTEDSource-to-targetEM_FORCE only
FEMSource-to-targetEM_FORCE only
AVERAGETarget-to-sourceHEAT_FLUX, HEAT_GEN, HTC
AVERAGE_WEIGHTEDTarget-to-sourceHEAT_FLUX, HEAT_GEN, HTC
CLOSESTTarget-to-sourceHEAT_FLUX, HEAT_GEN, HTC

Source-to-target kernels distribute each source point's contribution onto its destination neighbours, which is suited to force conservation in EM applications. Target-to-source kernels assign a value to each destination node by aggregating its source neighbours, which is better suited to scalar field interpolation. Using an incompatible combination raises a ConfigurationError at construction time.

File Format

The file format is pretty free, header, no header, commas, tabs.... The important part is that the correct index columns are specified when creating the interpolator.

Destination mesh input files can be created using the apdl scripts included in this repository here.

Requirements

  • Python ≥ 3.10
  • scikit-learn
  • pandas
  • tqdm
  • pyvista

License

Licensed under the European Union Public Licence (EUPL) 1.2

Authors

Developed by the F4E mechanical team

About

Python library for complex interpolations to ANSYS models

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

InterpCore

A Python library for interpolating physical field data (electromagnetic forces, heat flux, etc.) between different mesh representations and exporting to ANSYS APDL format.

Features

  • Multiple interpolation kernels: Distance-weighted, FEM-based, K-nearest neighbors, closest point
  • Flexible query methods: K-nearest neighbors or radius-based search
  • Support for multiple load types:
    • EM forces (3-component vector fields)
    • Heat flux (scalar fields)
    • Heat generation (volumetric)
    • Heat Transfer Coefficient + bulk fluid temperature (convection BCs)
  • Analysis tools:
    • Scalar field integration for computing total heat generation, flux, etc.
    • EM force resultant computation for validating force/moment conservation
  • Export to ANSYS APDL: Direct export of interpolated results in APDL format
  • Visualization: Built-in VTK export for ParaView or PyVista visualization
  • Efficient: KDTree-based spatial queries for fast neighbor searches

Installation

pip install interpcore

Quick Start

frominterpcore.interpolatorimportInterpolatorfrominterpcore.configimport (
InterpolationConfig,
ColumnsConfig,
QUERY_TYPE,
INTERPOLATED_LOAD_TYPE,
)
frominterpcore.kernelsimportINTERPOLATION_KERNEL# Configure interpolationconfig=InterpolationConfig(
method=QUERY_TYPE.K, # type of neighbour searchparam=5, # parameter relative to the neighbour search (K or radius)max_distance=2.0, # filter by a max radius of search (in case of K is used)coincidence_tolerance=0.01, # tolerance to consider two nodes coincidentkernel=INTERPOLATION_KERNEL.DISTANCE_WEIGHTED, # How to interpolatemultithread=False, # use or not multithreadinterpolated_load=INTERPOLATED_LOAD_TYPE.EM_FORCE, # type of load that is being interpolated
)
# Define column indices for the input filescolumns=ColumnsConfig(id=0, dest_xyz=1, source_xyz=1, value=4)
# Create interpolator and runinterpolator=Interpolator(
path_to_src_folder="source_data",
path_to_dest_mesh="destination_mesh.txt",
config=config,
columns=columns,
)
# Interpolate all source filesinterpolator.interpolate_all()
# Export to ANSYS formatinterpolator.export_to_ansys("output_directory")
# Optional: Build VTK for visualization. If outdir=None they are not exportedinterpolator.build_vtk_output(outdir="vtk_output")

Interpolation Configuration

Two dataclass objects fully control how the interpolation is performed.

InterpolationConfig

Controls the spatial search strategy, the interpolation kernel, and the target load type.

ParameterTypeDescription
methodQUERY_TYPENeighbour search strategy: QUERY_TYPE.K (K-nearest) or QUERY_TYPE.RADIUS (radius-based).
paramint | floatParameter for the chosen method: number of neighbours for K, radius (same unit as coordinates) for RADIUS.
max_distancefloatMaximum distance (same unit as coordinates) beyond which a destination node is not considered a neighbour, even when using QUERY_TYPE.K. Acts as a hard cutoff.
coincidence_tolerancefloatDistance below which two nodes are treated as coincident and the source value is copied directly without interpolation.
kernelINTERPOLATION_KERNELAlgorithm used to assign a value from the neighbourhood. See Interpolation Kernels.
multithreadboolWhether to parallelise the interpolation loop using threads.
interpolated_loadINTERPOLATED_LOAD_TYPEPhysical quantity being interpolated. Determines the number of components and the APDL export format.
accept_no_neighborboolIf False (default), raise an error when a destination node has no neighbour within max_distance. If True, assign zero to those nodes silently.

Note: not every kernel is compatible with every load type. See Kernel–Load Compatibility.

ColumnsConfig

Describes the zero-based column indices in both the source data files and the destination mesh file. All three coordinate components (x, y, z) are expected in consecutive columns starting at the given index.

ParameterTypeDescription
source_xyzintIndex of the x column in the source file; y and z must follow immediately.
valueintIndex of the column containing the scalar (or first component) value to interpolate from the source file.
dest_xyzintIndex of the x column in the destination mesh file; y and z must follow immediately.
idintIndex of the node-ID column in the destination mesh file.
volume_areaint | NoneIndex of the volume/area column in the destination mesh file. Required for scalar integrals and for EM force density inputs.

Interpolation checks and outputs

Analysis Methods

After interpolation, InterpCore provides methods to analyze and validate results:

Scalar Integrals

For scalar fields (heat flux, heat generation), you can compute the total integral over the destination mesh:

# Requires volume or area data in the destination meshcolumns=ColumnsConfig(
id=0, dest_xyz=1, source_xyz=1, value=4, volume_area=4
) # volume_area points to the vol/area columninterpolator=Interpolator(
path_to_src_folder="source_data",
path_to_dest_mesh="destination_mesh.txt",
config=config,
columns=columns,
)
interpolator.interpolate_all()
# Compute integrals (e.g., total heat generation in W)integrals=interpolator.compute_scalar_integrals()
# Returns: {"data_001": array([total_value])}

Note: The destination mesh must include volume (for 3D elements) or area (for 2D elements) data. Use the APDL scripts in apdl-scripts/ to export element centroids with volumes and areas.

EM Force Resultants

For EM force fields, you can compute force and moment resultants to verify conservation:

# After interpolation with EM_FORCE load typeresultants=interpolator.compute_EM_resultants(pole=np.array([0.0, 0.0, 0.0]))
# Returns for each source file:# {# "force_001": {# "R_F_EM": [Fx, Fy, Fz], # Total force from source data# "R_F_Mech": [Fx, Fy, Fz], # Total force from interpolated data# "R_M_EM": [Mx, My, Mz], # Total moment from source data# "R_M_Mech": [Mx, My, Mz], # Total moment from interpolated data# "f_err_comp": [ex, ey, ez], # Relative force error by component# "m_err_comp": [ex, ey, ez], # Relative moment error by component# "Unmapped_EM_Force": float # Norm of unmapped forces# }# }

This is useful for validating that the interpolation preserves global force and moment equilibrium. Small errors indicate good interpolation quality.

Examples

Complete working examples with sample data are available in the doc/ folder:

Each example includes:

  • Sample mesh files
  • Sample data files
  • Jupyter notebook with full workflow
  • Visualization with PyVista

Configuration Options

Query Methods

  • QUERY_TYPE.K: K-nearest neighbors (param = number of neighbors)
  • QUERY_TYPE.RADIUS: Radius-based search (param = radius in same unit as coordinates)

Interpolation Kernels

Source-to-target

Each source point is distributed to destination neighbours:

  • DISTANCE_WEIGHTED: Weight by inverse distance
  • FEM: FEM-based interpolation

Target-to-source

A value is assigned to each destination point based on source neighbours

  • CLOSEST: Use closest source point value
  • AVERAGE: Simple average of neighbors
  • AVERAGE_WEIGHTED: Average the neighbours values but weighting them by distance (the closer the more important).

Load Types

  • EM_FORCE: 3-component vector fields (Fx, Fy, Fz). If "vol" column is provided the forces are interpreted as force densities and will be multiplied by the volume.
  • HEAT_FLUX: Scalar fields for surface heat flux
  • HEAT_GEN: Scalar fields for volumetric heat generation
  • HTC: 2-component convection boundary condition — Heat Transfer Coefficient and bulk fluid (reference) temperature. Exported as SFE,,CONV,1 and SFE,,CONV,2 in APDL.

Kernel-Load Compatibility

Not every kernel can be used with every load type. The kernels are divided into two families based on the direction of the mapping:

KernelFamilyCompatible loads
DISTANCE_WEIGHTEDSource-to-targetEM_FORCE only
FEMSource-to-targetEM_FORCE only
AVERAGETarget-to-sourceHEAT_FLUX, HEAT_GEN, HTC
AVERAGE_WEIGHTEDTarget-to-sourceHEAT_FLUX, HEAT_GEN, HTC
CLOSESTTarget-to-sourceHEAT_FLUX, HEAT_GEN, HTC

Source-to-target kernels distribute each source point's contribution onto its destination neighbours, which is suited to force conservation in EM applications. Target-to-source kernels assign a value to each destination node by aggregating its source neighbours, which is better suited to scalar field interpolation. Using an incompatible combination raises a ConfigurationError at construction time.

File Format

The file format is pretty free, header, no header, commas, tabs.... The important part is that the correct index columns are specified when creating the interpolator.

Destination mesh input files can be created using the apdl scripts included in this repository here.

Requirements

  • Python ≥ 3.10
  • scikit-learn
  • pandas
  • tqdm
  • pyvista

License

Licensed under the European Union Public Licence (EUPL) 1.2

Authors

Developed by the F4E mechanical team

About

Python library for complex interpolations to ANSYS models

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

InterpCore

A Python library for interpolating physical field data (electromagnetic forces, heat flux, etc.) between different mesh representations and exporting to ANSYS APDL format.

Features

  • Multiple interpolation kernels: Distance-weighted, FEM-based, K-nearest neighbors, closest point
  • Flexible query methods: K-nearest neighbors or radius-based search
  • Support for multiple load types:
    • EM forces (3-component vector fields)
    • Heat flux (scalar fields)
    • Heat generation (volumetric)
    • Heat Transfer Coefficient + bulk fluid temperature (convection BCs)
  • Analysis tools:
    • Scalar field integration for computing total heat generation, flux, etc.
    • EM force resultant computation for validating force/moment conservation
  • Export to ANSYS APDL: Direct export of interpolated results in APDL format
  • Visualization: Built-in VTK export for ParaView or PyVista visualization
  • Efficient: KDTree-based spatial queries for fast neighbor searches

Installation

pip install interpcore

Quick Start

frominterpcore.interpolatorimportInterpolatorfrominterpcore.configimport (
InterpolationConfig,
ColumnsConfig,
QUERY_TYPE,
INTERPOLATED_LOAD_TYPE,
)
frominterpcore.kernelsimportINTERPOLATION_KERNEL# Configure interpolationconfig=InterpolationConfig(
method=QUERY_TYPE.K, # type of neighbour searchparam=5, # parameter relative to the neighbour search (K or radius)max_distance=2.0, # filter by a max radius of search (in case of K is used)coincidence_tolerance=0.01, # tolerance to consider two nodes coincidentkernel=INTERPOLATION_KERNEL.DISTANCE_WEIGHTED, # How to interpolatemultithread=False, # use or not multithreadinterpolated_load=INTERPOLATED_LOAD_TYPE.EM_FORCE, # type of load that is being interpolated
)
# Define column indices for the input filescolumns=ColumnsConfig(id=0, dest_xyz=1, source_xyz=1, value=4)
# Create interpolator and runinterpolator=Interpolator(
path_to_src_folder="source_data",
path_to_dest_mesh="destination_mesh.txt",
config=config,
columns=columns,
)
# Interpolate all source filesinterpolator.interpolate_all()
# Export to ANSYS formatinterpolator.export_to_ansys("output_directory")
# Optional: Build VTK for visualization. If outdir=None they are not exportedinterpolator.build_vtk_output(outdir="vtk_output")

Interpolation Configuration

Two dataclass objects fully control how the interpolation is performed.

InterpolationConfig

Controls the spatial search strategy, the interpolation kernel, and the target load type.

ParameterTypeDescription
methodQUERY_TYPENeighbour search strategy: QUERY_TYPE.K (K-nearest) or QUERY_TYPE.RADIUS (radius-based).
paramint | floatParameter for the chosen method: number of neighbours for K, radius (same unit as coordinates) for RADIUS.
max_distancefloatMaximum distance (same unit as coordinates) beyond which a destination node is not considered a neighbour, even when using QUERY_TYPE.K. Acts as a hard cutoff.
coincidence_tolerancefloatDistance below which two nodes are treated as coincident and the source value is copied directly without interpolation.
kernelINTERPOLATION_KERNELAlgorithm used to assign a value from the neighbourhood. See Interpolation Kernels.
multithreadboolWhether to parallelise the interpolation loop using threads.
interpolated_loadINTERPOLATED_LOAD_TYPEPhysical quantity being interpolated. Determines the number of components and the APDL export format.
accept_no_neighborboolIf False (default), raise an error when a destination node has no neighbour within max_distance. If True, assign zero to those nodes silently.

Note: not every kernel is compatible with every load type. See Kernel–Load Compatibility.

ColumnsConfig

Describes the zero-based column indices in both the source data files and the destination mesh file. All three coordinate components (x, y, z) are expected in consecutive columns starting at the given index.

ParameterTypeDescription
source_xyzintIndex of the x column in the source file; y and z must follow immediately.
valueintIndex of the column containing the scalar (or first component) value to interpolate from the source file.
dest_xyzintIndex of the x column in the destination mesh file; y and z must follow immediately.
idintIndex of the node-ID column in the destination mesh file.
volume_areaint | NoneIndex of the volume/area column in the destination mesh file. Required for scalar integrals and for EM force density inputs.

Interpolation checks and outputs

Analysis Methods

After interpolation, InterpCore provides methods to analyze and validate results:

Scalar Integrals

For scalar fields (heat flux, heat generation), you can compute the total integral over the destination mesh:

# Requires volume or area data in the destination meshcolumns=ColumnsConfig(
id=0, dest_xyz=1, source_xyz=1, value=4, volume_area=4
) # volume_area points to the vol/area columninterpolator=Interpolator(
path_to_src_folder="source_data",
path_to_dest_mesh="destination_mesh.txt",
config=config,
columns=columns,
)
interpolator.interpolate_all()
# Compute integrals (e.g., total heat generation in W)integrals=interpolator.compute_scalar_integrals()
# Returns: {"data_001": array([total_value])}

Note: The destination mesh must include volume (for 3D elements) or area (for 2D elements) data. Use the APDL scripts in apdl-scripts/ to export element centroids with volumes and areas.

EM Force Resultants

For EM force fields, you can compute force and moment resultants to verify conservation:

# After interpolation with EM_FORCE load typeresultants=interpolator.compute_EM_resultants(pole=np.array([0.0, 0.0, 0.0]))
# Returns for each source file:# {# "force_001": {# "R_F_EM": [Fx, Fy, Fz], # Total force from source data# "R_F_Mech": [Fx, Fy, Fz], # Total force from interpolated data# "R_M_EM": [Mx, My, Mz], # Total moment from source data# "R_M_Mech": [Mx, My, Mz], # Total moment from interpolated data# "f_err_comp": [ex, ey, ez], # Relative force error by component# "m_err_comp": [ex, ey, ez], # Relative moment error by component# "Unmapped_EM_Force": float # Norm of unmapped forces# }# }

This is useful for validating that the interpolation preserves global force and moment equilibrium. Small errors indicate good interpolation quality.

Examples

Complete working examples with sample data are available in the doc/ folder:

Each example includes:

  • Sample mesh files
  • Sample data files
  • Jupyter notebook with full workflow
  • Visualization with PyVista

Configuration Options

Query Methods

  • QUERY_TYPE.K: K-nearest neighbors (param = number of neighbors)
  • QUERY_TYPE.RADIUS: Radius-based search (param = radius in same unit as coordinates)

Interpolation Kernels

Source-to-target

Each source point is distributed to destination neighbours:

  • DISTANCE_WEIGHTED: Weight by inverse distance
  • FEM: FEM-based interpolation

Target-to-source

A value is assigned to each destination point based on source neighbours

  • CLOSEST: Use closest source point value
  • AVERAGE: Simple average of neighbors
  • AVERAGE_WEIGHTED: Average the neighbours values but weighting them by distance (the closer the more important).

Load Types

  • EM_FORCE: 3-component vector fields (Fx, Fy, Fz). If "vol" column is provided the forces are interpreted as force densities and will be multiplied by the volume.
  • HEAT_FLUX: Scalar fields for surface heat flux
  • HEAT_GEN: Scalar fields for volumetric heat generation
  • HTC: 2-component convection boundary condition — Heat Transfer Coefficient and bulk fluid (reference) temperature. Exported as SFE,,CONV,1 and SFE,,CONV,2 in APDL.

Kernel-Load Compatibility

Not every kernel can be used with every load type. The kernels are divided into two families based on the direction of the mapping:

KernelFamilyCompatible loads
DISTANCE_WEIGHTEDSource-to-targetEM_FORCE only
FEMSource-to-targetEM_FORCE only
AVERAGETarget-to-sourceHEAT_FLUX, HEAT_GEN, HTC
AVERAGE_WEIGHTEDTarget-to-sourceHEAT_FLUX, HEAT_GEN, HTC
CLOSESTTarget-to-sourceHEAT_FLUX, HEAT_GEN, HTC

Source-to-target kernels distribute each source point's contribution onto its destination neighbours, which is suited to force conservation in EM applications. Target-to-source kernels assign a value to each destination node by aggregating its source neighbours, which is better suited to scalar field interpolation. Using an incompatible combination raises a ConfigurationError at construction time.

File Format

The file format is pretty free, header, no header, commas, tabs.... The important part is that the correct index columns are specified when creating the interpolator.

Destination mesh input files can be created using the apdl scripts included in this repository here.

Requirements

  • Python ≥ 3.10
  • scikit-learn
  • pandas
  • tqdm
  • pyvista

License

Licensed under the European Union Public Licence (EUPL) 1.2

Authors

Developed by the F4E mechanical team

About

Python library for complex interpolations to ANSYS models

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages