Houdini 19.5 Nodes Dynamics nodes

Gas Integrate Shallow Water Equations dynamics node

Integrates the shallow water equations.

On this page
Since 19.5

Gas Integrate Shallow Water Equations is a low-level node that integrates the shallow water equations, without the velocity transport. This helper DOP is utilized by the Shallow Water Solver SOP, which provides an intuitive interface for performing shallow water simulations.

More specifically, this DOP first integrates the equations for the Depth Field, whose rate of change is the negative divergence of discharge (product of depth and velocity). It then integrates the Velocity Field (without self-advecting it); derivative of velocity is proportional to the negative gradient of the surface (sum of floor and depth).

The Gas Integrate Shallow Water Equations DOP only supports two-dimensional fields and uses the OpenCL device to do all its work. An explicit numerical scheme is used to integrate the equations, which will be unstable with larger timesteps. The instability can be mitigated by taking smaller steps; you can do this by using the the Gas Substep DOP or by increasing Substeps on the containing Dop Network.

Since this operator does not transport the velocity field along itself, an extra advection must be performed to fully evolve the shallow water equations. This can be done with the Gas Advect CL DOP, which similarly employs OpenCL acceleration.

Parameters

Velocity Field

Name of the vector field that stores the flow velocities. This field will be evolved using the shallow water equations.

Note

This operator does not transport the velocity field along itself. An extra self-advection needs to be performed to fully evolve the shallow water equations.

Depth Field

Name of the scalar field that stores the depth of water at each voxel. This field will be evolved using the shallow water equations.

Floor Field

Name of the scalar field that stores the elevation of the sea floor at every voxel.

Velocity Integration

Gravity

Acceleration due to gravity. Larger values of Gravity will more quickly flatten the water surface and also result in faster wave speeds.

Velocity Diffusion

Controls the amount of blurring done to the Velocity Field. Larger values will make the liquid more viscous. Small amounts of diffusion can also help to stabilize a simulation.

Max Velocity

When enabled, each component of velocity will be clamped against this value. This parameter can be used to stabilize the simulation, as well as to prevent unrealistically large velocity values.

Surface Integration

Source Field

When enabled, the specified Source Field will be used to add new water to the simulation.

Source Scale

A multiplier applied to values in the Source Field before using them to inject new water into the simulation.

Additive Source

When enabled, scaled values in Source Field will be added to the Depth Field. If this toggle is disabled, Source Field instead acts like a minimum water level (that is, Depth Field is not allowed to fall below the prescribed source).

Sink Field

When enabled, the specified Sink Field will be used to remove water from the simulation. The removed water amount is relative to its depth. For example, value of 0.1 indicates that the amount of water in that voxel will be reduced by 10% in one frame at the canonical frame rate of 24 per second.

Depth Diffusion

Controls the amount of blurring done to Depth Field. Depth Diffusion is helpful for stabilizing a simulation, but can result in unphysical results.

Max Surface Velocity

When enabled, the change in water depth is clamped against this value. This parameter can be used to stabilize the simulation, but can give rise to unphysical behavior.

Damping Layer

Waves normally reflect when they hit the field boundaries (or continue moving on the other side if Border Type is set to Repeat on the relevant fields). A damping layer can be used to slow down waves as they approach the boundary, reducing their reflection. Parameters in this section allow you to add damping layers on one or more of the sides.

Damp Depths

When this toggle is enabled, the Depth Field is also decayed within the damping layers. This prevents accumulation of water in the damping layer and can be used to let water to seamlessly flow out. Damp Depths should be turned off if water is meant to remain in the domain (for example, when working on a sea patch); otherwise, water will be siphoned off on the damped sides.

Damping Layer Size

Size of damping layers. Damping layer must be large enough to allow for gradual slowing of the waves. If the damping layer is not sufficiently large, waves may still reach the boundary and reflect back into the domain.

Damping Strength

Controls how fast velocities decay inside the damping layers. Damping Strength must be high enough to properly slow down waves that enter the damping layer; but setting this value too high will stop the waves too abruptly, causing them to reflect within the layer.

Negative First Axis

Toggles the damping layer on the negative side of the first axis. First axis corresponds to X, Y, Z when the two-dimensional plane of the fields is XY, YZ, ZX, respectively.

Positive First Axis

Toggles the damping layer on the positive side of the first axis. First axis corresponds to X, Y, Z when the two-dimensional plane of the fields is XY, YZ, ZX, respectively.

Negative Second Axis

Toggles the damping layer on the negative side of the second axis. Second axis corresponds to Y, Z, X when the two-dimensional plane of the fields is XY, YZ, ZX, respectively.

Positive Second Axis

Toggles the damping layer on the positive side of the second axis. Second axis corresponds to Y, Z, X when the two-dimensional plane of the fields is XY, YZ, ZX, respectively.

Use Timestep

Determines if the current solver timestep will be used to apply this node.

If set, the current timestep size will be multiplied by the scale and used for the time increment for this operation. Otherwise, the time scale will specify an absolute fictitious time to integrate by.

By disabling the link between the actual real time and the microsolver time, you can perform operations in a separate, fictitious, time.

Time Scale

The timestep used for this microsolver will be scaled by this amount. This allows one to achieve non-realistic effects, such as parts of the simulation operating at different speeds than other parts.

Similarly, it is useful if a solver needs to be evaluated independently of the main timestep.

Locals

channelname

This DOP node defines a local variable for each channel and parameter on the Data Options page, with the same name as the channel. So for example, the node may have channels for Position (positionx, positiony, positionz) and a parameter for an object name (objectname).

Then there will also be local variables with the names positionx, positiony, positionz, and objectname. These variables will evaluate to the previous value for that parameter.

This previous value is always stored as part of the data attached to the object being processed. This is essentially a shortcut for a dopfield expression like:

dopfield($DOPNET, $OBJID, dataName, "Options", 0, channelname)

If the data does not already exist, then a value of zero or an empty string will be returned.

DATACT

This value is the simulation time (see variable ST) at which the current data was created. This value may not be the same as the current simulation time if this node is modifying existing data, rather than creating new data.

DATACF

This value is the simulation frame (see variable SF) at which the current data was created. This value may not be the same as the current simulation frame if this node is modifying existing data, rather than creating new data.

RELNAME

This value will be set only when data is being attached to a relationship (such as when Constraint Anchor DOP is connected to the second, third, of fourth inputs of a Constraint DOP).

In this case, this value is set to the name of the relationship to which the data is being attached.

RELOBJIDS

This value will be set only when data is being attached to a relationship (such as when Constraint Anchor DOP is connected to the second, third, of fourth inputs of a Constraint DOP).

In this case, this value is set to a string that is a space separated list of the object identifiers for all the Affected Objects of the relationship to which the data is being attached.

RELOBJNAMES

This value will be set only when data is being attached to a relationship (such as when Constraint Anchor DOP is connected to the second, third, of fourth inputs of a Constraint DOP).

In this case, this value is set to a string that is a space separated list of the names of all the Affected Objects of the relationship to which the data is being attached.

RELAFFOBJIDS

This value will be set only when data is being attached to a relationship (such as when Constraint Anchor DOP is connected to the second, third, of fourth inputs of a Constraint DOP).

In this case, this value is set to a string that is a space separated list of the object identifiers for all the Affector Objects of the relationship to which the data is being attached.

RELAFFOBJNAMES

This value will be set only when data is being attached to a relationship (such as when Constraint Anchor DOP is connected to the second, third, of fourth inputs of a Constraint DOP).

In this case, this value is set to a string that is a space separated list of the names of all the Affector Objects of the relationship to which the data is being attached.

ST

This value is the simulation time for which the node is being evaluated.

This value may not be equal to the current Houdini time represented by the variable T, depending on the settings of the DOP Network Offset Time and Time Scale parameters.

This value is guaranteed to have a value of zero at the start of a simulation, so when testing for the first timestep of a simulation, it is best to use a test like $ST == 0 rather than $T == 0 or $FF == 1.

SF

This value is the simulation frame (or more accurately, the simulation time step number) for which the node is being evaluated.

This value may not be equal to the current Houdini frame number represented by the variable F, depending on the settings of the DOP Network parameters. Instead, this value is equal to the simulation time (ST) divided by the simulation timestep size (TIMESTEP).

TIMESTEP

This value is the size of a simulation timestep. This value is useful to scale values that are expressed in units per second, but are applied on each timestep.

SFPS

This value is the inverse of the TIMESTEP value. It is the number of timesteps per second of simulation time.

SNOBJ

This is the number of objects in the simulation. For nodes that create objects such as the Empty Object node, this value will increase for each object that is evaluated.

A good way to guarantee unique object names is to use an expression like object_$SNOBJ.

NOBJ

This value is the number of objects that will be evaluated by the current node during this timestep. This value will often be different from SNOBJ, as many nodes do not process all the objects in a simulation.

This value may return 0 if the node does not process each object sequentially (such as the Group DOP).

OBJ

This value is the index of the specific object being processed by the node. This value will always run from zero to NOBJ-1 in a given timestep. This value does not identify the current object within the simulation like OBJID or OBJNAME, just the object’s position in the current order of processing.

This value is useful for generating a random number for each object, or simply splitting the objects into two or more groups to be processed in different ways. This value will be -1 if the node does not process objects sequentially (such as the Group DOP).

OBJID

This is the unique object identifier for the object being processed. Every object is assigned an integer value that is unique among all objects in the simulation for all time. Even if an object is deleted, its identifier is never reused.

The object identifier can always be used to uniquely identify a given object. This makes this variable very useful in situations where each object needs to be treated differently. It can be used to produce a unique random number for each object, for example.

This value is also the best way to look up information on an object using the dopfield expression function. This value will be -1 if the node does not process objects sequentially (such as the Group DOP).

ALLOBJIDS

This string contains a space separated list of the unique object identifiers for every object being processed by the current node.

ALLOBJNAMES

This string contains a space separated list of the names of every object being processed by the current node.

OBJCT

This value is the simulation time (see variable ST) at which the current object was created.

Therefore, to check if an object was created on the current timestep, the expression $ST == $OBJCT should always be used. This value will be zero if the node does not process objects sequentially (such as the Group DOP).

OBJCF

This value is the simulation frame (see variable SF) at which the current object was created.

This value is equivalent to using the dopsttoframe expression on the OBJCT variable. This value will be zero if the node does not process objects sequentially (such as the Group DOP).

OBJNAME

This is a string value containing the name of the object being processed.

Object names are not guaranteed to be unique within a simulation. However, if you name your objects carefully so that they are unique, the object name can be a much easier way to identify an object than the unique object identifier, OBJID.

The object name can also be used to treat a number of similar objects (with the same name) as a virtual group. If there are 20 objects named “myobject”, specifying strcmp($OBJNAME, "myobject") == 0 in the activation field of a DOP will cause that DOP to operate only on those 20 objects. This value will be the empty string if the node does not process objects sequentially (such as the Group DOP).

DOPNET

This is a string value containing the full path of the current DOP Network. This value is most useful in DOP subnet digital assets where you want to know the path to the DOP Network that contains the node.

Note

Most dynamics nodes have local variables with the same names as the node’s parameters. For example, in a Position node, you could write the expression:

$tx + 0.1

…to make the object move 0.1 units along the X axis at each timestep.

See also

Dynamics nodes