Showing results for
Do you mean
Solved!

# API: Create Contraint Equation

[ Edited ]

I started a thread and deleted it because I thought I found my answer.  Looks like that was premature.  I am trying to create a contraint equation using the API but the I don't understand the documentation.  I know I need to create a BCEqn, but I can't seem to piece together the methods necessary to do so.

For example, I want to create an equation like the following:

{Node 1, DOF 6} = {Node 2, DOF 6} - {Node 3, DOF 6}

I can't figure out how to set these coefficient and DOF properties.

2 REPLIES

## Re: API: Create Contraint Equation

To create a constraint equation, you'll first need to create a constraint set (if you don't have one in your model), then use the BCEqn object to create the constraint equation.

Within the BCEqn object, there are 3 arrays, dof (1-6), node and coefficient. The length of the array corresponds to the number of terms in your constraint equation. Each index within each of the arrays needs to match up, so

[node1] [dof node 1] [factor node 1]

Say, have a 100 element model that was just generated with a simple 10x10 mesh and would like to create an MPC that ties together TX, TY and TZ. If the user selects 15 nodes, then each constraint is its own term, so the total array length is actually going to be 15 * 3 = 45.

Here's some code that should help. If you would like to practice with this, use the Mesh->Generate command (F11) and just create a 10x10 mesh of plotel's.

Code:

```Sub Main
Dim App As femap.model
Set App = feFemap()

Dim fsNode As femap.Set
Dim fBCS As femap.BCSet
Dim fBCD As femap.BCDefinition
Dim fBCEq As femap.BCEqn

Set fsNode = App.feSet
Set fBCS = App.feBCSet
Set fBCD = App.feBCDefinition
Set fBCEq = App.feBCEqn

Dim nnNodes() As Long
Dim nnDof() As Long
Dim ddFactor() As Double
Dim nCount As Long
Dim i As Long

' Ask the user which nodes to apply BCEqn
If fsNode.Select( FT_NODE, True, "Select nodes" ) <> FE_OK Then Exit All

' Get the number of selected nodes and size the arrays
' for TX, TY, TZ. Array is size from 0 to number * 3 - 1
' because there's going to be 3 DoF for each node
nCount = fsNode.Count()
ReDim nnNodes( 0 To nCount * 3 - 1 )
ReDim nnDof( 0 To nCount * 3 - 1 )
ReDim ddFactor( 0 To nCount * 3 - 1 )

' Loop through the set of nodes and populate the arrays
fsNode.Reset()
i = 0
While fsNode.Next()
' Because we're setting 3 constraints for each node,
' each ID is repeated 3 times. DoF array is different
' and factor array could be different
nnNodes( i * 3 + 0 ) = fsNode.CurrentID
nnNodes( i * 3 + 1 ) = fsNode.CurrentID
nnNodes( i * 3 + 2 ) = fsNode.CurrentID

' Set TX (1), TY (2), and TZ (2) DoF
nnDof( i * 3 + 0 ) = 1
nnDof( i * 3 + 1 ) = 2
nnDof( i * 3 + 2 ) = 3

' Set factors, just use all 1.0, 2.0 and 3.0 for this example
ddFactor( i * 3 + 0 ) = 1.0
ddFactor( i * 3 + 1 ) = 2.0
ddFactor( i * 3 + 2 ) = 3.0

' Increment counter
i += 1
Wend

' Create constraint set
fBCS.title = "Demo Set"
fBCS.Put( App.Info_NextID( FT_BC_DIR ) )

' Create constraint defintion
' setID property should be equal to ID for BCSet object
' OnType is Node
' DataType = FT_BEQ for constraint equation
fBCD.setID = fBCS.ID
fBCD.title = "Constraint Equation Defintion"
fBCD.OnType = FT_NODE
fBCD.dataType = FT_BEQ
fBCD.Put( fBCD.NextEmptyID() )

' Setup constraint equation
' setID needs to be equal to ID from set object
' BCDefintionID is from the constraint definition
' Object properties can be set individually, but it can be
' easier to use the PutAll method instead to set everything
' at once
' Count term in the method is not the number of nodes,
' but rather the total number of terms
fBCEq.PutAll( fBCEq.NextEmptyID, fBCS.ID, fBCD.ID, _
UBound( nnNodes ) + 1, nnNodes, nnDof, ddFactor, _
FCL_BLUE, 1 )

End Sub
```

Here's a model with a created BCEqn on some selected nodes:

Constraint equation in model

And verified via UI:

Constraint equation dialog

Solution
Solution