2D Frame Elements¶
Bar2D_2N¶
- class
feastruct.fea.elements.frame2d.Bar2D_2N(nodes, material, section)[source]¶Bases:
feastruct.fea.elements.frame2d.FrameElement2DTwo noded, two dimensional bar element that can resist an axial force only. The element is defined by its two end nodes and uses two linear shape functions to obtain analytical results.
Variables:
- nodes (list[
Node]) – List of node objects defining the element- material (
Material) – Material object for the element- efs (list[bool]) – Element freedom signature
- f_int (list[
ForceVector]) – List of internal force vector results stored for each analysis case- section (
Section) – Section object for the element
apply_nfa()¶Applies the element freedom signature to all nodes in the element to generate a node freedom allocation.
calculate_local_displacement(xi, u_el)[source]¶Calculates the local displacement of the element at position xi given the displacement vector u_el.
Parameters:
- xi (float) – Station location (0 < x < 1)
- u_el (
numpy.ndarray) – Element displacement vectorReturns: Local displacement of the element (u, v, w)
Return type: tuple(float, float, float)
get_afd(n, analysis_case)[source]¶Returns the axial force diagram within the element for n stations for an analysis_case. Station locations, xis, vary from 0 to 1.
Parameters:
- n (int) – Number of stations to sample the axial force diagram
- analysis_case (
AnalysisCase) – Analysis caseReturns: Station locations, xis, and axial force diagram, afd - (xis, afd)
Return type: tuple(
numpy.ndarray,numpy.ndarray)
get_bmd(n, analysis_case)[source]¶Returns the bending moment diagram within the element for n stations for an analysis_case. Station locations, xis, vary from 0 to 1.
Parameters:
- n (int) – Number of stations to sample the bending moment diagram
- analysis_case (
AnalysisCase) – Analysis caseReturns: Station locations, xis, and bending moment diagram, bmd - (xis, bmd)
Return type: tuple(
numpy.ndarray,numpy.ndarray)
get_buckling_results(analysis_case, buckling_mode=0)¶Returns the eigenvalue corresponding to the buckling analysis defined by the analysis_case and the buckling_mode. Also returns an array of eigenvector values corresponding to each degree of freedom in the finite element.
Parameters:
- analysis_case (
AnalysisCase) – Analysis case relating to the buckling analysis- buckling_mode (int) – Buckling mode number
Returns: Eigenvalue and eigenvectors (w, v). A tuple containing the eigenvalue w and an (n_nodes x n_dof) array of eigenvector values v.
Return type: tuple(float,
numpy.ndarray)
get_displacements(n, analysis_case)[source]¶Returns a list of the local displacements, (u, v, w, ru, rv, rw), along the element for the analysis case and a minimum of n subdivisions. A list of the stations, xi, is also included. Station locations, xis, vary from 0 to 1.
Parameters:
- analysis_case (
AnalysisCase) – Analysis case relating to the displacement- n (int) – Minimum number of sampling points
Returns: 2D numpy array containing stations and local displacements. Each station contains an array of the following format: [xi, u, v, w, ru, rv, rw]
Return type:
numpy.ndarray
get_dofs()¶Finds and returns a list of DoF objects corresponding to the degrees of freedom of the finite element.
Returns: A list of DoF objects, with a length of (n_nodes x n_dof) Return type: list[list[ DoF]]
get_element_loads(analysis_case)¶Returns a list of element loads on a FrameElement for an analyis case.
Parameters: analysis_case ( AnalysisCase) – Analysis case relating to the displacement
get_fint(analysis_case)¶Returns the internal force vector relating to an
AnalysisCase.
Parameters: analysis_case ( AnalysisCase) – Analysis case relating to the internal force vectorReturns: Internal force vector Return type: numpy.ndarrayRaises: Exception – If the force vector cannot be found for the analysis_case
get_frequency_results(analysis_case, frequency_mode=0)¶Returns the eigenvalue corresponding to the frequency analysis defined by the analysis_case and the frequency_mode. Also returns an array of eigenvector values corresponding to each degree of freedom in the finite element.
Parameters:
- analysis_case (
AnalysisCase) – Analysis case relating to the frequency analysis- frequency_mode (int) – Frequency mode number
Returns: Eigenvalue and eigenvectors (w, v). A tuple containing the eigenvalue w and an (n_nodes x n_dof) array of eigenvector values v.
Return type: tuple(float,
numpy.ndarray)
get_gdof_nums()¶Returns an array of global degree of freedom numbers corresponding to the degrees of freedom of the finite element.
Returns: A integer array of global degrees of freedom, with a length of (1 x n), where n is n_nodes x n_dof Return type: numpy.ndarray
get_geometric_properties()¶Calculates geometric properties related to a frame element. Returns the following:
- node_coords: An (n x 3) array of node coordinates, where n is the number of nodes for the given finite element
- dx: A (1 x 3) array consisting of the x, y and z distances between the nodes
- l0: The original length of the frame element
- c: A (1 x 3) array consisting of the cosines with respect to the x, y and z axes
Returns: (node_coords, dx, l0, c) Return type: tuple( numpy.ndarray,numpy.ndarray, float,numpy.ndarray)
get_geometric_stiff_matrix(analysis_case)[source]¶Gets the geometric stiffness matrix for a two noded, 2D bar element. The stiffness matrix has been analytically integrated so numerical integration is not necessary. The geometric stiffness matrix requires an axial force so the analysis_case from a static analysis must be provided.
Parameters: analysis_case ( AnalysisCase) – Analysis case from which to extract the axial forceReturns: 4 x 4 element geometric stiffness matrix Return type: numpy.ndarray
get_internal_actions(analysis_case)[source]¶Returns the internal actions for a two noded 2D bar element.
Parameters: analysis_case ( AnalysisCase) – Analysis caseReturns: An array containing the internal actions for the element (N1, N2) Return type: numpy.ndarray
get_mass_matrix()[source]¶Gets the mass matrix for a for a two noded, 2D bar element. The mass matrix has been analytically integrated so numerical integration is not necessary.
Returns: 4 x 4 element mass matrix Return type: numpy.ndarray
get_ndof()¶Returns the number of active degrees of freedom for the element.
Returns: Number of active degrees of freedom for the element Return type: int
get_nodal_displacements(analysis_case)¶Returns an array of the nodal displacements for each degree of freedom in the finite element for the analysis_case.
Parameters: analysis_case ( AnalysisCase) – Analysis case relating to the displacementReturns: An (n_nodes x n_dof) array of degree of freedom displacements Return type: numpy.ndarray
get_node_coords()¶Returns a NumPy array of the cartesian coordinates defining the geometry of the finite element.
Returns: An (n x 3) array of node coordinates, where n is the number of nodes for the given finite element Return type: numpy.ndarray
get_sampling_points(n, analysis_case, bm=False, defl=False)¶Returns a list of sampling points along a 2D frame element given a minimum n points and an analysis case. The sampling points vary from 0 to 1.
Adds a sampling point at the following locations:
- Concentrated element load
- Point of zero shear force (if bm=True)
- Point of zero rotation (if defl=True)
Parameters:
- n (int) – Minimum number of sampling points
- analysis_case (
AnalysisCase) – Analysis case relating to the displacement- bm (bool) – Whether or not the sampling points are for the bending moment (i.e. include sfd roots)
- defl (bool) – Whether or not the sampling points for transverse deflection (i.e. include rotation roots). N.B. the FrameElement must have a calculate_rotation method.
Returns: List of sampling points
Return type:
numpy.ndarray
get_sfd(n, analysis_case)[source]¶Returns the shear force diagram within the element for n stations for an analysis_case. Station locations, xis, vary from 0 to 1.
Parameters:
- n (int) – Number of stations to sample the shear force diagram
- analysis_case (
AnalysisCase) – Analysis caseReturns: Station locations, xis, and shear force diagram, sfd - (xis, sfd)
Return type: tuple(
numpy.ndarray,numpy.ndarray)
get_shape_function(eta)[source]¶Returns the value of the shape functions N1 and N2 at isoparametric coordinate eta.
Parameters: eta (float) – Isoparametric coordinate (-1 < eta < 1) Returns: Value of the shape functions (N1, N2) at eta Return type: numpy.ndarray
get_stiffness_matrix()[source]¶Gets the stiffness matrix for a two noded, 2D bar element. The stiffness matrix has been analytically integrated so numerical integration is not necessary.
Returns: 4 x 4 element stiffness matrix Return type: numpy.ndarray
get_transformation_matrix()[source]¶Returns the transformation matrix for a Bar2D_2N element.
Returns: Element transformation matrix Return type: numpy.ndarray
map_to_isoparam(xi)¶Maps a station value 0 < xi < 1 to the isometric parameter -1 < eta < 1.
Parameters: xi (float) – Station location (0 < x < 1) Returns: Isoparametric coordinate (-1 < eta < 1) Return type: float
map_to_station(eta)¶Maps the isometric parameter -1 < eta < 1 to a station value 0 < xi < 1.
Parameters: xi (float) – Isoparametric coordinate (-1 < eta < 1) Returns: Station location (0 < x < 1) Return type: float
plot_axial_force(ax, analysis_case, scalef, n)¶Plots the axial force diagram from a static analysis defined by case_id. N.B. this method is adapted from the MATLAB code by F.P. van der Meer: plotNLine.m.
Parameters:
- ax (
matplotlib.axes.Axes) – Axis object on which to draw the element- analysis_case (
AnalysisCase) – Analysis case- scalef (float) – Factor by which to scale the axial force diagram
- n (int) – Number of points at which to plot the axial force diagram
plot_bending_moment(ax, analysis_case, scalef, n)¶Plots the axial force diagram from a static analysis defined by case_id. N.B. this method is adapted from the MATLAB code by F.P. van der Meer: plotMLine.m.
Parameters:
- ax (
matplotlib.axes.Axes) – Axis object on which to draw the element- analysis_case (
AnalysisCase) – Analysis case- scalef (float) – Factor by which to scale the bending moment diagram
- n (int) – Number of points at which to plot the bending moment diagram
plot_deformed_element(ax, analysis_case, n, def_scale, u_el=None)¶Plots a 2D frame element in its deformed configuration for the displacement vector defined by the analysis_case. The deformation is based on the element shape functions. If a displacement vector, u_el, is supplied, uses this to plot the deformed element.
Parameters:
- ax (
matplotlib.axes.Axes) – Axis object on which to draw the element- analysis_case (
AnalysisCase) – Analysis case relating to the displacement- n (int) – Number of linear subdivisions used to plot the element
- def_scale (float) – Deformation scale
- u_el (
numpy.ndarray) – Element displacement vector of size (n_node x n_dof)
plot_element(ax, linestyle='-', linewidth=2, marker='.')¶Plots the undeformed frame element on the axis defined by ax.
Parameters:
- ax (
matplotlib.axes.Axes) – Axis object on which to draw the element- linestyle (string) – Element linestyle
- linewidth (int) – Element linewidth
- marker (string) – Node marker type
plot_shear_force(ax, analysis_case, scalef, n)¶Plots the axial force diagram from a static analysis defined by case_id. N.B. this method is adapted from the MATLAB code by F.P. van der Meer: plotVLine.m.
Parameters:
- ax (
matplotlib.axes.Axes) – Axis object on which to draw the element- analysis_case (
AnalysisCase) – Analysis case- scalef (float) – Factor by which to scale the shear force diagram
- n (int) – Number of points at which to plot the shear force diagram
save_fint(f, analysis_case)¶Adds an internal force vector result to the
FiniteElement.
Parameters:
- f (
numpy.ndarray) – Internal force vector- analysis_case (
AnalysisCase) – Analysis case relating to the internal force vector
EulerBernoulli2D_2N¶
- class
feastruct.fea.elements.frame2d.EulerBernoulli2D_2N(nodes, material, section)[source]¶Bases:
feastruct.fea.elements.frame2d.FrameElement2DTwo noded, two dimensional frame element based on the Euler-Bernoulli beam formulation for relatively thin beams. The element is defined by its two end nodes and uses four cubic polynomial shape functions to obtain analytical results.
Variables:
- nodes (list[
Node]) – List of node objects defining the element- material (
Material) – Material object for the element- efs (list[bool]) – Element freedom signature
- f_int (list[
ForceVector]) – List of internal force vector results stored for each analysis case- section (
Section) – Section object for the element
- class
UniformDistributedLoad(element, q)[source]¶Bases:
feastruct.fea.bcs.ElementLoadClass for the application of a uniformly distributed load to a EulerBernoulli2D_2N element.
Variables:
- element (
EulerBernoulli2D_2N) – EulerBernoulli2D_2N element to which the load is applied- q (float) – Value of the uniformly distributed load
apply_nfa()¶Applies the element freedom signature to all nodes in the element to generate a node freedom allocation.
calculate_local_displacement(xi, u_el)[source]¶Calculates the local displacement of the element at position xi given the displacement vector u_el.
Parameters:
- xi (float) – Station location (0 < x < 1)
- u_el (
numpy.ndarray) – Element displacement vectorReturns: Local displacement of the element (u, v, w)
Return type: tuple(float, float, float)
calculate_rotation(xis, phi0, analysis_case)[source]¶integrate bending moment to get rotations
vectorised to allow for fixed quadrature
calculate_transverse_displacement(xis, v0, phi0, analysis_case)[source]¶integrate rotations to get transvere displacement
vectorised to allow for fixed quadrature
generate_udl(q)[source]¶Returns a EulerBernoulli2D_2N UniformDistributedLoad object for the current element.
Parameters: q (float) – Value of the uniformly distributed load Returns: UniformDistributedLoad object Return type: UniformDistributedLoad
get_afd(n, analysis_case)[source]¶Returns the axial force diagram within the element for a minimum of n stations for an analysis_case. Station locations, xis, vary from 0 to 1.
Parameters:
- n (int) – Minimum number of stations to sample the axial force diagram
- analysis_case (
AnalysisCase) – Analysis caseReturns: Station locations, xis, and axial force diagram, afd - (xis, afd)
Return type: tuple(
numpy.ndarray,numpy.ndarray)
get_bm(xis, analysis_case)[source]¶Returns the bending moment within the element at xis for an analysis_case.
Parameters:
- xis (
numpy.ndarray) – Positions along the element to calculate the bending moment- analysis_case (
AnalysisCase) – Analysis caseReturns: Bending moments
Return type:
numpy.ndarray
get_bmd(n, analysis_case)[source]¶Returns the bending moment diagram within the element for n stations for an analysis_case. An additional station is added at all locations where the shear force is zero to ensure that bending moment maxima/minima are captured. Station locations, xis, vary from 0 to 1.
Parameters:
- n (int) – Number of stations to sample the bending moment diagram
- analysis_case (
AnalysisCase) – Analysis caseReturns: Station locations, xis, and bending moment diagram, bmd - (xis, bmd)
Return type: tuple(
numpy.ndarray,numpy.ndarray)
get_buckling_results(analysis_case, buckling_mode=0)¶Returns the eigenvalue corresponding to the buckling analysis defined by the analysis_case and the buckling_mode. Also returns an array of eigenvector values corresponding to each degree of freedom in the finite element.
Parameters:
- analysis_case (
AnalysisCase) – Analysis case relating to the buckling analysis- buckling_mode (int) – Buckling mode number
Returns: Eigenvalue and eigenvectors (w, v). A tuple containing the eigenvalue w and an (n_nodes x n_dof) array of eigenvector values v.
Return type: tuple(float,
numpy.ndarray)
get_displacements(n, analysis_case)[source]¶Returns a list of the local displacements, (u, v, w, ru, rv, rw), along the element for the analysis case and a minimum of n subdivisions. A list of the stations, xi, is also included. Station locations, xis, vary from 0 to 1.
An extra station is included if there is a point of zero rotation resulting in a local displacement maxima/minima.
Parameters:
- analysis_case (
AnalysisCase) – Analysis case relating to the displacement- n (int) – Minimum number of sampling points
Returns: 2D numpy array containing stations and local displacements. Each station contains an array of the following format: [xi, u, v, w, ru, rv, rw]
Return type:
numpy.ndarray
get_dofs()¶Finds and returns a list of DoF objects corresponding to the degrees of freedom of the finite element.
Returns: A list of DoF objects, with a length of (n_nodes x n_dof) Return type: list[list[ DoF]]
get_element_loads(analysis_case)¶Returns a list of element loads on a FrameElement for an analyis case.
Parameters: analysis_case ( AnalysisCase) – Analysis case relating to the displacement
get_fint(analysis_case)¶Returns the internal force vector relating to an
AnalysisCase.
Parameters: analysis_case ( AnalysisCase) – Analysis case relating to the internal force vectorReturns: Internal force vector Return type: numpy.ndarrayRaises: Exception – If the force vector cannot be found for the analysis_case
get_frequency_results(analysis_case, frequency_mode=0)¶Returns the eigenvalue corresponding to the frequency analysis defined by the analysis_case and the frequency_mode. Also returns an array of eigenvector values corresponding to each degree of freedom in the finite element.
Parameters:
- analysis_case (
AnalysisCase) – Analysis case relating to the frequency analysis- frequency_mode (int) – Frequency mode number
Returns: Eigenvalue and eigenvectors (w, v). A tuple containing the eigenvalue w and an (n_nodes x n_dof) array of eigenvector values v.
Return type: tuple(float,
numpy.ndarray)
get_gdof_nums()¶Returns an array of global degree of freedom numbers corresponding to the degrees of freedom of the finite element.
Returns: A integer array of global degrees of freedom, with a length of (1 x n), where n is n_nodes x n_dof Return type: numpy.ndarray
get_geometric_properties()¶Calculates geometric properties related to a frame element. Returns the following:
- node_coords: An (n x 3) array of node coordinates, where n is the number of nodes for the given finite element
- dx: A (1 x 3) array consisting of the x, y and z distances between the nodes
- l0: The original length of the frame element
- c: A (1 x 3) array consisting of the cosines with respect to the x, y and z axes
Returns: (node_coords, dx, l0, c) Return type: tuple( numpy.ndarray,numpy.ndarray, float,numpy.ndarray)
get_geometric_stiff_matrix(analysis_case)[source]¶Gets the geometric stiffness matrix for a two noded 2D Euler-Bernoulli frame element. The stiffness matrix has been analytically integrated so numerical integration is not necessary. The geometric stiffness matrix requires an axial force so the analysis_case from a static analysis must be provided.
Parameters: analysis_case ( AnalysisCase) – Analysis case from which to extract the axial forceReturns: 6 x 6 element geometric stiffness matrix Return type: numpy.ndarray
get_internal_actions(analysis_case)[source]¶Returns the internal actions for a two noded 2D Euler-Bernoulli frame element.
Parameters: analysis_case ( AnalysisCase) – Analysis caseReturns: An array containing the internal actions for the element (N1, V1, M1, N2, V2, M2) Return type: numpy.ndarray
get_mass_matrix()[source]¶Gets the mass matrix for a for a two noded 2D Euler-Bernoulli frame element. The mass matrix has been analytically integrated so numerical integration is not necessary.
Returns: 6 x 6 element mass matrix Return type: numpy.ndarray
get_ndof()¶Returns the number of active degrees of freedom for the element.
Returns: Number of active degrees of freedom for the element Return type: int
get_nodal_displacements(analysis_case)¶Returns an array of the nodal displacements for each degree of freedom in the finite element for the analysis_case.
Parameters: analysis_case ( AnalysisCase) – Analysis case relating to the displacementReturns: An (n_nodes x n_dof) array of degree of freedom displacements Return type: numpy.ndarray
get_node_coords()¶Returns a NumPy array of the cartesian coordinates defining the geometry of the finite element.
Returns: An (n x 3) array of node coordinates, where n is the number of nodes for the given finite element Return type: numpy.ndarray
get_sampling_points(n, analysis_case, bm=False, defl=False)¶Returns a list of sampling points along a 2D frame element given a minimum n points and an analysis case. The sampling points vary from 0 to 1.
Adds a sampling point at the following locations:
- Concentrated element load
- Point of zero shear force (if bm=True)
- Point of zero rotation (if defl=True)
Parameters:
- n (int) – Minimum number of sampling points
- analysis_case (
AnalysisCase) – Analysis case relating to the displacement- bm (bool) – Whether or not the sampling points are for the bending moment (i.e. include sfd roots)
- defl (bool) – Whether or not the sampling points for transverse deflection (i.e. include rotation roots). N.B. the FrameElement must have a calculate_rotation method.
Returns: List of sampling points
Return type:
numpy.ndarray
get_sf(xis, analysis_case)[source]¶Returns the shear force within the element at xis for an analysis_case.
Parameters:
- xis (
numpy.ndarray) – Positions along the element to calculate the shear force- analysis_case (
AnalysisCase) – Analysis caseReturns: Shear forces
Return type:
numpy.ndarray
get_sfd(n, analysis_case)[source]¶Returns the shear force diagram within the element for a minimum of n stations for an analysis_case. Station locations, xis, vary from 0 to 1.
Parameters:
- n (int) – Minimum number of stations to sample the shear force diagram
- analysis_case (
AnalysisCase) – Analysis caseReturns: Station locations, xis, and shear force diagram, sfd - (xis, sfd)
Return type: tuple(
numpy.ndarray,numpy.ndarray)
get_shape_function(eta)[source]¶Returns the value of the shape functions Nu1, Nu2, Nv1 and Nv2 at eta.
Parameters: eta (float) – Isoparametric coordinate (-1 < eta < 1) Returns: Value of the shape functions ((Nu1, Nu2), (Nv1, Nv2)) at eta Return type: numpy.ndarray
get_stiffness_matrix()[source]¶Gets the stiffness matrix for a two noded 2D Euler-Bernoulli frame element. The stiffness matrix has been analytically integrated so numerical integration is not necessary.
Returns: 6 x 6 element stiffness matrix Return type: numpy.ndarray
get_transformation_matrix()[source]¶Returns the transformation matrix for an EulerBernoulli2D_2N element.
Returns: Element transformation matrix Return type: numpy.ndarray
map_to_isoparam(xi)¶Maps a station value 0 < xi < 1 to the isometric parameter -1 < eta < 1.
Parameters: xi (float) – Station location (0 < x < 1) Returns: Isoparametric coordinate (-1 < eta < 1) Return type: float
map_to_station(eta)¶Maps the isometric parameter -1 < eta < 1 to a station value 0 < xi < 1.
Parameters: xi (float) – Isoparametric coordinate (-1 < eta < 1) Returns: Station location (0 < x < 1) Return type: float
plot_axial_force(ax, analysis_case, scalef, n)¶Plots the axial force diagram from a static analysis defined by case_id. N.B. this method is adapted from the MATLAB code by F.P. van der Meer: plotNLine.m.
Parameters:
- ax (
matplotlib.axes.Axes) – Axis object on which to draw the element- analysis_case (
AnalysisCase) – Analysis case- scalef (float) – Factor by which to scale the axial force diagram
- n (int) – Number of points at which to plot the axial force diagram
plot_bending_moment(ax, analysis_case, scalef, n)¶Plots the axial force diagram from a static analysis defined by case_id. N.B. this method is adapted from the MATLAB code by F.P. van der Meer: plotMLine.m.
Parameters:
- ax (
matplotlib.axes.Axes) – Axis object on which to draw the element- analysis_case (
AnalysisCase) – Analysis case- scalef (float) – Factor by which to scale the bending moment diagram
- n (int) – Number of points at which to plot the bending moment diagram
plot_deformed_element(ax, analysis_case, n, def_scale, u_el=None)¶Plots a 2D frame element in its deformed configuration for the displacement vector defined by the analysis_case. The deformation is based on the element shape functions. If a displacement vector, u_el, is supplied, uses this to plot the deformed element.
Parameters:
- ax (
matplotlib.axes.Axes) – Axis object on which to draw the element- analysis_case (
AnalysisCase) – Analysis case relating to the displacement- n (int) – Number of linear subdivisions used to plot the element
- def_scale (float) – Deformation scale
- u_el (
numpy.ndarray) – Element displacement vector of size (n_node x n_dof)
plot_element(ax, linestyle='-', linewidth=2, marker='.')¶Plots the undeformed frame element on the axis defined by ax.
Parameters:
- ax (
matplotlib.axes.Axes) – Axis object on which to draw the element- linestyle (string) – Element linestyle
- linewidth (int) – Element linewidth
- marker (string) – Node marker type
plot_shear_force(ax, analysis_case, scalef, n)¶Plots the axial force diagram from a static analysis defined by case_id. N.B. this method is adapted from the MATLAB code by F.P. van der Meer: plotVLine.m.
Parameters:
- ax (
matplotlib.axes.Axes) – Axis object on which to draw the element- analysis_case (
AnalysisCase) – Analysis case- scalef (float) – Factor by which to scale the shear force diagram
- n (int) – Number of points at which to plot the shear force diagram
save_fint(f, analysis_case)¶Adds an internal force vector result to the
FiniteElement.
Parameters:
- f (
numpy.ndarray) – Internal force vector- analysis_case (
AnalysisCase) – Analysis case relating to the internal force vector