Skip to main content

operators

C++: phynexis::parsim::operators Python: phynexis.parsim.operators Header: src/parsim/operators/*.hpp

Simulation operators that are registered with OperatorSystem and execute during specific simulation phases. Each operator defines order() (execution priority) and enabled() state.

Base Classes

BaseOperator

Abstract base class for all simulation operators.

Methods:

MethodReturnsDescription
name()strOperator name
order()intExecution priority (lower = earlier)
set_order(n)Set execution priority
enabled()boolWhether operator is active
set_enabled(b)Enable or disable operator
timings()Print timing statistics
print_info()Print operator info

Phase Identifiers

Phase constants define when operators execute in the simulation loop.

ConstantValueDescription
PreStep0Before step begins
PreBoundary1Before boundary conditions
PostBoundary2After boundary conditions
PreInteraction3Before interaction detection
PostInteraction4After interaction detection
PreForces5Before force computation
PostForces6After force computation
PreIntegration7Before integration
PostIntegration8After integration
PostStep9After step completes

Example:

import phynexis
ops = phynexis.parsim.operators

print("Phase IDs:", ops.PreStep, ops.PreForces, ops.PostStep)

Output:

Phase IDs: 0 5 9

Integration Operators (operators.integration)

IntegratorOperator(method=Verlet)

Time integration operator using Euler or Verlet scheme.

Constructor:

ParameterTypeDefaultDescription
methodIntegratorMethodVerletIntegration scheme

Methods:

MethodReturnsDescription
initialize(nodes)Bind to a NodeSet
set_time_step(dt)Set time step size
time_step()floatCurrent time step
config()IntegratorOperatorConfigCurrent configuration
set_config(cfg)Set configuration

IntegratorMethod

ValueDescription
EulerForward Euler integration
VerletVelocity Verlet integration (default)

IntegratorOperatorConfig

PropertyTypeAccessDescription
methodIntegratorMethodread/writeIntegration method

Example:

import phynexis
ops = phynexis.parsim.operators

# Velocity Verlet (default)
io = ops.integration.IntegratorOperator()
io.set_time_step(0.001)
print("method:", io.config().method)
print("dt:", io.time_step())

# Euler
io2 = ops.integration.IntegratorOperator(
ops.integration.IntegratorMethod.Euler)
print("Euler method:", io2.config().method)

Output:

method: IntegratorMethod.Verlet
dt: 0.001
Euler method: IntegratorMethod.Euler

Force Operators (operators.forces)

Gravity(label="gravity")

Gravitational force operator. Applies gravity to all nodes.

Constructor:

ParameterTypeDefaultDescription
labelstrOperator label
gx, gy, gzfloatGravity components
gravity_vectorVec3dGravity as vector (requires label)

Properties:

PropertyTypeAccessDescription
gravity_vectorVec3dread/writeGravity vector (default (0,0,-9.81))

Damping(label, coefficient)

Viscous damping operator. Applies damping proportional to velocity.

Constructor:

ParameterTypeDefaultDescription
labelstrOperator label
coefficientfloatDamping coefficient

Properties:

PropertyTypeAccessDescription
coefficientfloatread/writeDamping coefficient

RepulsionForce

Contact repulsion force operator. Requires a RepulsionModel to define the force law.

Methods:

MethodReturnsDescription
initialize(nodes, edges)Bind to NodeSet and EdgeSet
set_model(model)Set repulsion model (cloned)
set_model_by_name(name)Set model by name from factory
model()RepulsionModelGet current model (reference)

Example:

import phynexis
ops = phynexis.parsim.operators

# Gravity
g = ops.forces.Gravity()
print("gravity:", g.name(), g.gravity_vector)

# Damping
d = ops.forces.Damping("viscous", 0.1)
print("damping:", d.name(), d.coefficient)

Output:

gravity: gravity Vec3d(0, 0, -9.81)
damping: damping 0.1

Interaction Operators (operators.interaction)

InteractionUpdate(label="")

Updates interactions (edges/hyperedges) based on current node positions.

AdjacencyBuilder

Builds adjacency structures using spatial index.

Methods:

MethodReturnsDescription
initialize(spatial_index, nodes, domain_system)Initialize with spatial index
config()AdjacencyBuilderConfigCurrent config
set_config(cfg)Set config

AdjacencyBuilderConfig properties:

PropertyTypeDefaultDescription
max_dirty_ratiofloat0.3Max dirty rebuild ratio
max_invalid_ratiofloat0.3Max invalid rebuild ratio

UniformGridIndexBuilder

Builds the uniform grid spatial index.

Methods:

MethodReturnsDescription
initialize(uniform_grid_index, nodes)Initialize with grid index and nodes

Output Operators (operators.output)

UnifiedOutput(output_dir="output/", format=VTK, frequency=100)

Simulation output writer supporting VTK and HDF5 formats.

Constructor:

ParameterTypeDefaultDescription
output_dirstr"output/"Output directory
formatOutputFormatVTKFile format
frequencyint100Output frequency (steps)

Methods:

MethodReturnsDescription
initialize(graph, state)Bind to graph and runtime state
config()UnifiedOutputConfigCurrent configuration

OutputFormat

ValueDescription
VTKVTK file format
HDF5HDF5 file format

OutputLogStyle

ValueDescription
SummaryCompact log output
VerboseDetailed log output
SilenceNo log output

OutputMode

ValueDescription
ByStepOutput every N steps
ByTimeOutput every N time units

UnifiedOutputConfig

PropertyTypeAccessDescription
formatOutputFormatread/writeOutput file format
output_dirstrread/writeOutput directory
frequencyintread/writeOutput frequency
output_modeOutputModeread/writeOutput mode (step/time based)
time_intervalfloatread/writeTime interval for ByTime mode
time_stamp_adjustableboolread/writeAdjustable timestamps
edgesboolread/writeOutput edges
hyper_edgesboolread/writeOutput hyperedges
shapesboolread/writeOutput shapes
log_styleOutputLogStyleread/writeLog verbosity

Example:

import phynexis
ops = phynexis.parsim.operators

# VTK output (default)
uo = ops.output.UnifiedOutput("sim_output/", ops.output.OutputFormat.VTK)
print("output:", uo.name())

cfg = uo.config()
print("format:", cfg.format)
print("frequency:", cfg.frequency)

Output:

output: unified_output
format: OutputFormat.VTK
frequency: 100