Coder Social home page Coder Social logo

gxbeam.jl's Introduction

GXBeam

DOI status

Pure Julia Implementation of Geometrically Exact Beam Theory

Author: Taylor McDonnell

GXBeam is a pure Julia implementation of Geometrically Exact Beam Theory, originally based on the open source code GEBT and its associated papers[1][2], though it has since been augmented with a number of additional features.

As a sample of one of the many things this package can do, here's a time domain simulation of the dynamic response of a joined wing subjected to a simulated gust, scaled up in order to visualize the deflections:

And here's a dynamic simulation of a wind turbine subjected to a sinusoidal tip load.

Package Features

  • Performs multiple types of analyses including:
    • Linear/Nonlinear static analyses
    • Linear/Nonlinear steady-state analyses
    • Linear/Nonlinear eigenvalue analyses (by linearizing about a steady state condition)
    • Linear/Nonlinear time-marching dynamic analyses
  • Accurately models arbitrary systems of interconnected highly flexible composite beams.
    • Captures all geometric nonlinearities due to large deflections and rotations (subject to a small strain assumption)
    • Models angular displacements of any magnitude using only three parameters
    • Uses the full 6x6 Timoshenko beam stiffness matrix
  • Calculate section compliance and inertia matrices and compute strain recovery
    • Uses quadrilateral finite elements rather than classical lamiante theory for much better accuracy and cross coupling
    • Allows for general geometry with inhomogenous properties and anisotropic behavior (computes full 6x6 matrix)
    • Ply materials are general orthotropic
    • Provides convenience method for paramterizing airfoil layups
    • Strain recovery functionality to compute stresses and strains on the mesh using the results of the beam solution
    • Tsai-wu failure criteria
  • Models time-varying distributed forces/moments including
    • Point and distributed loads which remain fixed in the body-frame
    • Point and distributed loads which rotate with the structure
    • Loads due to known body frame velocities and accelerations
    • Gravitational loads acting on beam elements and point masses
    • Loads resulting from stiffness-proportional structural damping
  • Optional DifferentialEquations interface.
    • Constant mass matrix differential algebraic equation formulation
    • Fully implicit differential algebraic equation formulation
  • Provides derivatives with ForwardDiff (including overloading internal solvers with implicit analytic methods)
  • Result visualization using WriteVTK
  • Verified and validated against published analytical and computational results. See the examples in the documentation.

Installation

Enter the package manager by typing ] and then run the following:

pkg> add GXBeam

Performance

This code has been optimized to be highly performant. In our tests we found that GXBeam outperforms GEBT by a significant margin across all analysis types, as seen in the following table. More details about the specific cases which we test may be found by inspecting the input files and scripts for these tests in the benchmark folder.

Package Steady Analysis Eigenvalue Analysis Time Marching Analysis
GEBT 13.722 ms 33.712 ms 26.870 s
GXBeam 4.716 ms 18.478 ms 9.019 s

Usage

See the documentation

Limitations

By using the simplest possible shape functions (constant or linear shape functions), this package avoids using numerical quadrature except when integrating applied distributed loads (which can be pre-integrated). As a result, element properties are approximated as constant throughout each beam element and a relatively large number of beam elements may be necessary to achieve grid-independent results. More details about the convergence of this package may be found in the examples.

This package does not currently model cross section warping, and therefore should not be used to model open cross sections (such as I, C, or L-beams). The one exception to this rule is if the beam's width is much greater than its height, in which case the beam may be considered to be strip-like (like a helicopter blade).

This package relies on the results of linear cross-sectional analyses. Most notably, it does not model the nonlinear component of the Trapeze effect, which is the tendency of a beam to untwist when subjected to axial tension. This nonlinear effect is typically most important when modeling rotating structures such as helicopter blades due to the presence of large centrifugal forces. It is also more important when modeling strip-like beams than for modeling closed cross-section beams due to their low torsional rigidity.

Related Codes

GEBT: Open source geometrically exact beam theory code developed in Fortran as a companion to the proprietary cross sectional analysis tool VABS. The theory for this code is provided in references 1 and 2. GXBeam was originally developed based on this package and its associated papers, but has since been augmented with additional features.

BeamDyn: Open source geometrically exact beam theory code developed in Fortran by NREL as part of the OpenFAST project. This code was also developed based on GEBT, but uses Legendre spectral finite elements. This allows for exponential rather than algebraic convergence when the solution is smooth. This makes this code a good candidate for use when analyzing beams with smoothly varying properties. Unfortunately, the code is limited to analyzing a single beam, rather than an assembly of beams.

The cross sectional analysis uses the same underlying theory as in BECAS, but was written to be fast and optimization-friendly. VABS and PreComp are other popular tools for composite cross sectional analysis. The former is not freely available, whereas the latter is lower fidelity as it is based on classical laminate theory.

Contributing

Contributions are welcome and encouraged. If at any point you experience issues or have suggestions related to this package, create a new Github issue so we can discuss it. If you're willing to help solve an issue yourself, we encourage you to create a fork of this repository and submit a pull request with the requested change. Pull requests should generally also add a unit test in test/runtests.jl to ensure that issues do not reoccur along with future changes.

References

[1] Yu, W., & Blair, M. (2012). GEBT: A general-purpose nonlinear analysis tool for composite beams. Composite Structures, 94(9), 2677-2689.

[2] Wang, Q., & Yu, W. (2017). Geometrically nonlinear analysis of composite beams using Wiener-Milenković parameters. Journal of Renewable and Sustainable Energy, 9(3), 033306.

[3] Hodges, D. (2006). Nonlinear Composite Beam Theory. American Institute of Aeronautics and Astronautics.

gxbeam.jl's People

Contributors

andrewning avatar cardoza2 avatar dgcaprace avatar github-actions[bot] avatar kevmoor avatar taylormcd avatar tylercritchfield avatar yosinlpet avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar

gxbeam.jl's Issues

Zero pivots in factorization error when computing compliance matrix

Here's a basic example that leads to a factorization error with zero pivots.

using GXBeam

xaf = [1.0, 0.99669031, 0.98707731, 0.97177624, 0.95120013, 0.92554805, 0.89513234, 0.86042844, 0.82194932, 0.78024605, 0.73589923, 0.68948289, 0.64155561, 0.59265387, 0.5432852, 0.49390561, 0.44491485, 0.39667271, 0.34949257, 0.30376269, 0.25995386, 0.21850111, 0.17980252, 0.14421934, 0.11207729, 0.08364666, 0.05914156, 0.03873701, 0.02260069, 0.01080931, 0.00329342, 0.0, 0.00480487, 0.0111091, 0.02423919, 0.04202841, 0.0645839, 0.09186189, 0.1236919, 0.15984299, 0.20001108, 0.24382591, 0.29085133, 0.34057636, 0.39242047, 0.4457723, 0.49999633, 0.55444002, 0.60844101, 0.66133467, 0.71246137, 0.7611783, 0.80686551, 0.84892722, 0.8867981, 0.91995456, 0.9479178, 0.97026156, 0.98661057, 0.99662097, 1.0]
yaf = [0.0, 0.00049003, 0.00207033, 0.00475426, 0.00825965, 0.01241627, 0.01723294, 0.0226708, 0.02862516, 0.034964, 0.0415088, 0.0480415, 0.05432933, 0.06013032, 0.06520439, 0.06931828, 0.07229087, 0.07399667, 0.0744182, 0.07365704, 0.07178323, 0.06883168, 0.064851, 0.05990381, 0.05406639, 0.04742811, 0.04011465, 0.03230144, 0.02418269, 0.01593784, 0.00791465, 0.0, -0.00634666, -0.0102234, -0.01556325, -0.02006888, -0.02353976, -0.02598343, -0.02742948, -0.02793392, -0.02758763, -0.026503, -0.02481832, -0.02268597, -0.02024403, -0.01760693, -0.01488444, -0.01217351, -0.00956485, -0.00713548, -0.0049519, -0.0030634, -0.00151205, -0.00032506, 0.00048717, 0.00093779, 0.00105862, 0.00091038, 0.00057426, 0.00018251, 0.0]

chord = 0.0863
twist = 17.7*pi/180
pitch_axis = 0.25 / chord

uni = Material(1.75e11, 8.0e9, 8.0e9, 5.0e9, 5.0e9, 5.0e9, 0.3, 0.3, 0.3, 1600.0)
weave = Material(8.5e10, 8.5e10, 8.5e10, 5.0e9, 5.0e9, 5.0e9, 0.1, 0.1, 0.1, 1600.0)
materials = [uni, weave]

thickness = [0.001, 0.01853, 0.001]
orientation = [45.0,0.0,45.0]*pi/180
material_ids = [2;1;2]
layup1 = Layer.(materials[material_ids], thickness, orientation)

segments = [layup1]

xbreak = [0.0, 1.0]
web_location = [] #no webs
webs = []

nodes, elements = afmesh(xaf, yaf, chord, twist, pitch_axis, xbreak, web_location, segments, webs)
cache = initialize_cache(nodes, elements, eltype(chord))

compliance, _, _ = compliance_matrix(nodes, elements; cache)
mass, _ = mass_matrix(nodes, elements)

Here is the stacktrace:

ERROR: ZeroPivotException: factorization encountered one or more zero pivots. Consider switching to a pivoted LU factorization.
Stacktrace:
 [1] ldlt!(F::SuiteSparse.CHOLMOD.Factor{Float64}, A::SuiteSparse.CHOLMOD.Sparse{Float64}; shift::Float64, check::Bool)
   @ SuiteSparse.CHOLMOD /Users/julia/buildbot/worker/package_macos64/build/usr/share/julia/stdlib/v1.6/SuiteSparse/src/cholmod.jl:1472
 [2] #ldlt!#11
   @ /Users/julia/buildbot/worker/package_macos64/build/usr/share/julia/stdlib/v1.6/SuiteSparse/src/cholmod.jl:1497 [inlined]
 [3] ldlt!
   @ /Users/julia/buildbot/worker/package_macos64/build/usr/share/julia/stdlib/v1.6/SuiteSparse/src/cholmod.jl:1497 [inlined]
 [4] factorize(A::LinearAlgebra.Symmetric{Float64, SparseArrays.SparseMatrixCSC{Float64, Int64}})
   @ SparseArrays /Users/julia/buildbot/worker/package_macos64/build/usr/share/julia/stdlib/v1.6/SparseArrays/src/linalg.jl:1634
 [5] linearsolve2(AM::SparseArrays.SparseMatrixCSC{Float64, Int64}, B2::SparseArrays.SparseMatrixCSC{Float64, Int64})
   @ GXBeam ~/.julia/dev/GXBeam/src/section.jl:559
 [6] compliance_matrix(nodes::Vector{Node{Float64}}, elements::Vector{MeshElement{Vector{Int64}, Float64}}; cache::GXBeam.SectionCache{Matrix{Float64}, SparseArrays.SparseMatrixCSC{Float64, Int64}, SparseArrays.SparseMatrixCSC{Float64, Int64}, Vector{Int64}}, gxbeam_order::Bool)
   @ GXBeam ~/.julia/dev/GXBeam/src/section.jl:736
 [7] gxbeam_test2(i::Int64)
   @ Main ~/Dropbox/Research-Ning/projects/Prop_out/src/debugging/gxbeam_test.jl:106
 [8] top-level scope
   @ REPL[30]:1

I'm using GXBeam 0.4.1 and Julia 1.6.6.

I can try to figure out what's going on but from a brief look into it it seems others have gotten this error before (here and here) on older versions of Julia, where it was determined it was a bug in Julia itself that was fixed in subsequent releases. After seeing this I tried it again with Julia 1.8.0 with the same result.

@andrewning did you see this at all during the code development?

Load ramping

Hi, just wondered if you've considered a load ramping method for the nonlinear solve? I'm wondering if it would make the solve more robust, and could it potentially result in convergence with fewer iterations?

NaN compliance matrix for more cambered airfoil

If I run the following example for composite material properties it results in a NaN-filled compliance matrix. I've taken this straight from the docs, only changing the airfoil coordinates. (Proposed solution below)

using GXBeam

# airfoil coordinates in the docs --> work great
# xaf = [1.00000000, 0.99619582, 0.98515158, 0.96764209, 0.94421447, 0.91510964, 0.88074158, 0.84177999, 0.79894110, 0.75297076, 0.70461763, 0.65461515, 0.60366461, 0.55242353, 0.50149950, 0.45144530, 0.40276150, 0.35589801, 0.31131449, 0.26917194, 0.22927064, 0.19167283, 0.15672257, 0.12469599, 0.09585870, 0.07046974, 0.04874337, 0.03081405, 0.01681379, 0.00687971, 0.00143518, 0.00053606, 0.00006572, 0.00001249, 0.00023032, 0.00079945, 0.00170287, 0.00354717, 0.00592084, 0.01810144, 0.03471169, 0.05589286, 0.08132751, 0.11073805, 0.14391397, 0.18067874, 0.22089879, 0.26433734, 0.31062190, 0.35933893, 0.40999990, 0.46204424, 0.51483073, 0.56767889, 0.61998250, 0.67114514, 0.72054815, 0.76758733, 0.81168064, 0.85227225, 0.88883823, 0.92088961, 0.94797259, 0.96977487, 0.98607009, 0.99640466, 1.00000000]
# yaf = [0.00000000, 0.00017047, 0.00100213, 0.00285474, 0.00556001, 0.00906779, 0.01357364, 0.01916802, 0.02580144, 0.03334313, 0.04158593, 0.05026338, 0.05906756, 0.06766426, 0.07571157, 0.08287416, 0.08882939, 0.09329359, 0.09592864, 0.09626763, 0.09424396, 0.09023579, 0.08451656, 0.07727756, 0.06875796, 0.05918984, 0.04880096, 0.03786904, 0.02676332, 0.01592385, 0.00647946, 0.00370956, 0.00112514, -0.00046881, -0.00191488, -0.00329201, -0.00470585, -0.00688469, -0.00912202, -0.01720842, -0.02488211, -0.03226730, -0.03908459, -0.04503763, -0.04986836, -0.05338180, -0.05551392, -0.05636585, -0.05605816, -0.05472399, -0.05254383, -0.04969990, -0.04637175, -0.04264894, -0.03859653, -0.03433153, -0.02996944, -0.02560890, -0.02134397, -0.01726049, -0.01343567, -0.00993849, -0.00679919, -0.00402321, -0.00180118, -0.00044469, 0.00000000]

# my airfoil coordinates
xaf = [1.0, 0.99669031, 0.98707731, 0.97177624, 0.95120013, 0.92554805, 0.89513234, 0.86042844, 0.82194932, 0.78024605, 0.73589923, 0.68948289, 0.64155561, 0.59265387, 0.5432852, 0.49390561, 0.44491485, 0.39667271, 0.34949257, 0.30376269, 0.25995386, 0.21850111, 0.17980252, 0.14421934, 0.11207729, 0.08364666, 0.05914156, 0.03873701, 0.02260069, 0.01080931, 0.00329342, 0.00180844, 0.00078264, 0.00016559, 2.4e-6, 9.545e-5, 0.0005152, 0.00124174, 0.00277989, 0.00480487, 0.0111091, 0.02423919, 0.04202841, 0.0645839, 0.09186189, 0.1236919, 0.15984299, 0.20001108, 0.24382591, 0.29085133, 0.34057636, 0.39242047, 0.4457723, 0.49999633, 0.55444002, 0.60844101, 0.66133467, 0.71246137, 0.7611783, 0.80686551, 0.84892722, 0.8867981, 0.91995456, 0.9479178, 0.97026156, 0.98661057, 0.99662097, 1.0]
yaf = [0.0, 0.00049003, 0.00207033, 0.00475426, 0.00825965, 0.01241627, 0.01723294, 0.0226708, 0.02862516, 0.034964, 0.0415088, 0.0480415, 0.05432933, 0.06013032, 0.06520439, 0.06931828, 0.07229087, 0.07399667, 0.0744182, 0.07365704, 0.07178323, 0.06883168, 0.064851, 0.05990381, 0.05406639, 0.04742811, 0.04011465, 0.03230144, 0.02418269, 0.01593784, 0.00791465, 0.00553261, 0.00337629, 0.0013778, 0.00015663, -0.00093355, -0.00196476, -0.0030302, -0.00467095, -0.00634666, -0.0102234, -0.01556325, -0.02006888, -0.02353976, -0.02598343, -0.02742948, -0.02793392, -0.02758763, -0.026503, -0.02481832, -0.02268597, -0.02024403, -0.01760693, -0.01488444, -0.01217351, -0.00956485, -0.00713548, -0.0049519, -0.0030634, -0.00151205, -0.00032506, 0.00048717, 0.00093779, 0.00105862, 0.00091038, 0.00057426, 0.00018251, 0.0]

chord = 1.9
twist = 0.0*pi/180
paxis = 0.4750 / chord

uni = Material(37.00e9, 9.00e9, 9.00e9, 4.00e9, 4.00e9, 4.00e9, 0.28, 0.28, 0.28, 1.86e3)
double = Material(10.30e9, 10.30e9, 10.30e9, 8.00e9, 8.00e9, 8.00e9, 0.30, 0.30, 0.30, 1.83e3)
gelcoat = Material(1e1, 1e1, 1e1, 1.0, 1.0, 1.0, 0.30, 0.30, 0.30, 1.83e3)
nexus = Material(10.30e9, 10.30e9, 10.30e9, 8.00e9, 8.00e9, 8.00e9, 0.30, 0.30, 0.30, 1.664e3)
balsa = Material(0.01e9, 0.01e9, 0.01e9, 2e5, 2e5, 2e5, 0.30, 0.30, 0.30, 0.128e3)
mat = [uni, double, gelcoat, nexus, balsa]

t = 0.001
theta = 20*pi/180
layer = Layer(balsa, t, theta)

idx = [3, 4, 2]  # material index
t = [0.000381, 0.00051, 18*0.00053]
theta = [0, 0, 20]*pi/180
layup1 = Layer.(mat[idx], t, theta)

idx = [3, 4, 2]
t = [0.000381, 0.00051, 33*0.00053]
theta = [0, 0, 20]*pi/180
layup2 = Layer.(mat[idx], t, theta)

idx = [3, 4, 2, 1, 5, 1, 2]
t = [0.000381, 0.00051, 17*0.00053, 38*0.00053, 1*0.003125, 37*0.00053, 16*0.00053]
theta = [0, 0, 20, 30, 0, 30, 20]*pi/180
layup3 = Layer.(mat[idx], t, theta)

idx = [3, 4, 2, 5, 2]
t = [0.000381, 0.00051, 17*0.00053, 0.003125, 16*0.00053]
theta = [0, 0, 20, 0, 0]*pi/180
layup4 = Layer.(mat[idx], t, theta)

segments = [layup1, layup2, layup3, layup4]

xbreak = [0.0, 0.0041, 0.1147, 0.5366, 1.0]

idx = [1, 5, 1]
t = [38*0.00053, 0.003125, 38*0.00053]
theta = [0, 0, 0]*pi/180
web = Layer.(mat[idx], t, theta)

webs = [web, web]

webloc = [0.15, 0.5]
nodes, elements = afmesh(xaf, yaf, chord, twist, paxis, xbreak, webloc, segments, webs)

S, sc, tc = compliance_matrix(nodes, elements)
M, mc = mass_matrix(nodes, elements)

I traced it to line 492 of afmesh.jl. There, yiu and yil are searched to find their intersection. Because the nodes don't match up exactly (I'm presuming this is the reason), the values are not compared to each other but rather to the value of zero. In the example, this works great. Below I've plotted yiu (blue) and yil (red), and sure enough they intersect when both surfaces cross zero.

image

But in my example, this isn't the case (see below). In fact, my second point in yil happens to be barely positive. An easy workaround for that is to limit the possible range to the back half or so of the surface. But even then, the intersection doesn't match up with where they cross zero...

image

I have an idea on how to get around this - I don't know if this would impact the rest of the code much, but I think it does what the current version is trying to do. The idea is to search backwards from the TE, as it appears that in both cases the nodes match up with each other (i.e. node 40 on top is approximately lined up with node 40 on the bottom, etc.), so instead of comparing both sets of nodes against zero you could compare to each other, such as

# index from the end for both top and bottom 
idx_intersection_from_TE = findlast(xt->xt<0, (reverse(yiu[end-20:end]) .- reverse(yil[end-20:end]))) 
# Note: need to specify a specific range so the number of elements is the same - instead of 20 it could 
# be half of the total length of one of them, I don't think it really matters as long as it's long enough 
# to include the intersection

# since they have different lengths, compute the index from the start separately for both surfaces
iu = length(yiu) - idx_intersection_from_TE + 1
il = length(yil) - idx_intersection_from_TE + 1

This might be overkill or perhaps not robust to every case, but it at least works for these two scenarios.

Thoughts @andrewning?

time_domain_analysis does not seem to work with point_masses

Hi, Taylor.
I'm trying to do my time domain analyses using point masses now instead of the inertia matrix, as the point masses improved my modal analyses (as per https://discourse.julialang.org/t/ann-gxbeam-jl-v0-3-0-geometrically-exact-beam-theory/71337/11).
However, time time_domain_analysis doesn't seem to converge with point masses. Here's an example of a case that runs just fine without point masses, and does not converge with them:

using GXBeam, StaticArrays, LinearAlgebra
stiff = [1000000 0 0 -.5 -1 -50000; 0 3000000 0 0 0 0; 0 0 3000000 0 0 0; 0 0 0 7 .1 -.02; 0 0 0 0 5 .1; 0 0 0 0 0 3000]
stiff = Symmetric(stiff)
mass = [.02 0 0 0 -5e-7 -1e-7; 0 .02 0 5e-7 0 1e-4; 0 0 .02 1e-7 -1e-4 0; 0 0 0 1e-5 1e-8 2e-10; 0 0 0 0 6e-7 9e-9; 0 0 0 0 0 1e-5]
mass = Symmetric(mass)

nodes = [SA_F64[0,i,0] for i in 0:.1:1]

nElements = length(nodes)-1
start = 1:nElements
stop =  2:(nElements+1)
transformation = [[0 -1 0; 1 0 0; 0 0 1] for _ in 1:nElements];

stiffness = [stiff for i in 1:nElements]
massmatrix = [mass./0.1 for i in 1:nElements] # here I divide by the element length, which I don't do for the lumped mass

assembly = GXBeam.Assembly(nodes, start, stop, stiffness=stiffness, frames=transformation, mass=massmatrix);
prescribed_conditions = Dict(1 => GXBeam.PrescribedConditions(ux=0, uy=0, uz=0, theta_x=0, theta_y=0, theta_z=0),
							 length(nodes) => GXBeam.PrescribedConditions(Fz=30, My=-0.2));
t=0:.05:.05
system,history,converged = time_domain_analysis(assembly, t;
                                                prescribed_conditions = prescribed_conditions);

Here converged==true.

nodes = sort(vcat(nodes,nodes[2:end]))

nElements = length(nodes)-1
start = 1:nElements
stop =  2:(nElements+1)
transformation = [[0 -1 0; 1 0 0; 0 0 1] for _ in 1:nElements];

stiffness = [i%2==0 ? 0*stiff : stiff for i in 1:nElements]

pointmass = Dict(2 => PointMass(GXBeam.transform_properties(mass, transformation[2]')))
for i in 4:2:nElements
    pointmass[i] = PointMass(GXBeam.transform_properties(mass, transformation[i]'))
end
pointmass[nElements] = PointMass(GXBeam.transform_properties(mass, transformation[nElements]')./2) # last lumped mass is half of the others, as it represents the last half of an element

assembly = GXBeam.Assembly(nodes, start, stop, stiffness=stiffness, frames=transformation);
prescribed_conditions = Dict(1 => GXBeam.PrescribedConditions(ux=0, uy=0, uz=0, theta_x=0, theta_y=0, theta_z=0),
							 length(nodes) => GXBeam.PrescribedConditions(Fz=30, My=-0.2));
t=0:.05:.05
system,history,converged = time_domain_analysis(assembly, t;
                                                prescribed_conditions = prescribed_conditions,
                                                point_masses = pointmass);

Here converged==false.

Any help would be much appreciated!

Please create a PR for JuliaPDE

It would be great to have this package listed. And anything else your lab might have in the way of Julia in PDE's, of course.

This is really nice work: comparisons would be great

I think it would be useful to compare geometrically-exact theories with some ad hoc approaches, such as co-rotational.
Both in terms of accuracy and efficiency. I have been planning to have a look at that for some time. I do have the co-rotational implementation of a nonlinear elastic beam (https://github.com/PetrKryslUCSD/FinEtoolsFlexBeams.jl), what was missing was the geometrically exact theory and implementation. Now there is one! :)

Would there be any interest in a bake-off?

Error testing GXBeam

I ran ] test GXBeam and got the following error message:

┌ Warning: dt <= dtmin. Aborting. There is either an error in your model specification or the true solution is unstable.
└ @ SciMLBase ~/.julia/packages/SciMLBase/L7Nun/src/integrator_interface.jl:345
DifferentialEquations: Test Failed at /home/kevin/.julia/packages/GXBeam/S8Yc6/test/runtests.jl:1200
  Expression: sol.t[end] == 2.0
   Evaluated: 0.4756178300699102 == 2.0
Stacktrace:
 [1] macro expansion
   @ ~/.julia/packages/GXBeam/S8Yc6/test/runtests.jl:1200 [inlined]
 [2] macro expansion
   @ /buildworker/worker/package_linux64/build/usr/share/julia/stdlib/v1.6/Test/src/Test.jl:1151 [inlined]
 [3] top-level scope
   @ ~/.julia/packages/GXBeam/S8Yc6/test/runtests.jl:1141
DifferentialEquations: Error During Test at /home/kevin/.julia/packages/GXBeam/S8Yc6/test/runtests.jl:1139
  Got exception outside of a @test
  type Nothing has no field α
  Stacktrace:
    [1] setproperty!(x::Nothing, f::Symbol, v::Float64)
      @ Base ./Base.jl:34
    [2] calc_W!
      @ ~/.julia/packages/OrdinaryDiffEq/Op0Oq/src/derivative_utils.jl:549 [inlined]
    [3] update_W!
      @ ~/.julia/packages/OrdinaryDiffEq/Op0Oq/src/derivative_utils.jl:653 [inlined]
    [4] nlsolve!(nlsolver::OrdinaryDiffEq.NLSolver{NLNewton{Rational{Int64}, Rational{Int64}, Rational{Int64}}, true, Vector{Float64}, Rational{Int64}, Nothing, Float64, OrdinaryDiffEq.NLNewtonCache{Vector{Float64}, Float64, Float64, Vector{Float64}, Matrix{Float64}, Matrix{Float64}, Nothing, Nothing, LinearSolve.LinearCache{Matrix{Float64}, Vector{Float64}, Vector{Float64}, SciMLBase.NullParameters, Nothing, LU{Float64, Matrix{Float64}}, LinearSolve.InvPreconditioner{Diagonal{Float64, Vector{Float64}}}, Diagonal{Float64, Vector{Float64}}, Float64}}}, integrator::OrdinaryDiffEq.ODEIntegrator{DABDF2{12, true, Nothing, NLNewton{Rational{Int64}, Rational{Int64}, Rational{Int64}}, typeof(OrdinaryDiffEq.DEFAULT_PRECS), Val{:forward}, true, nothing}, true, Vector{Float64}, Vector{Float64}, Float64, Tuple{var"#103#105"{Int64}, Dict{Int64, DistributedLoads{Float64}}, Dict{Int64, Vector{PointMass{Float64}}}, StaticArrays.SVector{3, Float64}, StaticArrays.SVector{3, Float64}, StaticArrays.SVector{3, Float64}, StaticArrays.SVector{3, Float64}, StaticArrays.SVector{3, Float64}, StaticArrays.SVector{3, Float64}}, Float64, Float64, Float64, Float64, Vector{Vector{Float64}}, DAESolution{Float64, 2, Vector{Vector{Float64}}, Nothing, Nothing, Nothing, Vector{Float64}, DAEProblem{Vector{Float64}, Vector{Float64}, Tuple{Float64, Float64}, true, Tuple{var"#103#105"{Int64}, Dict{Int64, DistributedLoads{Float64}}, Dict{Int64, Vector{PointMass{Float64}}}, StaticArrays.SVector{3, Float64}, StaticArrays.SVector{3, Float64}, StaticArrays.SVector{3, Float64}, StaticArrays.SVector{3, Float64}, StaticArrays.SVector{3, Float64}, StaticArrays.SVector{3, Float64}}, DAEFunction{true, GXBeam.var"#299#301"{Assembly{Float64, Vector{Vector{Float64}}, UnitRange{Int64}, Vector{GXBeam.Element{Float64}}}, Float64, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}}, Nothing, Nothing, GXBeam.var"#300#302"{Assembly{Float64, Vector{Vector{Float64}}, UnitRange{Int64}, Vector{GXBeam.Element{Float64}}}, Float64, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}}, Nothing, Nothing, Nothing, SparseArrays.SparseMatrixCSC{Bool, Int64}, Nothing, Nothing, Nothing, Nothing, Nothing}, Base.Iterators.Pairs{Union{}, Union{}, Tuple{}, NamedTuple{(), Tuple{}}}, Vector{Bool}}, DABDF2{12, true, Nothing, NLNewton{Rational{Int64}, Rational{Int64}, Rational{Int64}}, typeof(OrdinaryDiffEq.DEFAULT_PRECS), Val{:forward}, true, nothing}, OrdinaryDiffEq.InterpolationData{DAEFunction{true, GXBeam.var"#299#301"{Assembly{Float64, Vector{Vector{Float64}}, UnitRange{Int64}, Vector{GXBeam.Element{Float64}}}, Float64, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}}, Nothing, Nothing, GXBeam.var"#300#302"{Assembly{Float64, Vector{Vector{Float64}}, UnitRange{Int64}, Vector{GXBeam.Element{Float64}}}, Float64, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}}, Nothing, Nothing, Nothing, SparseArrays.SparseMatrixCSC{Bool, Int64}, Nothing, Nothing, Nothing, Nothing, Nothing}, Vector{Vector{Float64}}, Vector{Float64}, Vector{Vector{Vector{Float64}}}, OrdinaryDiffEq.DABDF2Cache{Vector{Float64}, Vector{Float64}, Vector{Float64}, OrdinaryDiffEq.NLSolver{NLNewton{Rational{Int64}, Rational{Int64}, Rational{Int64}}, true, Vector{Float64}, Rational{Int64}, Nothing, Float64, OrdinaryDiffEq.NLNewtonCache{Vector{Float64}, Float64, Float64, Vector{Float64}, Matrix{Float64}, Matrix{Float64}, Nothing, Nothing, LinearSolve.LinearCache{Matrix{Float64}, Vector{Float64}, Vector{Float64}, SciMLBase.NullParameters, Nothing, LU{Float64, Matrix{Float64}}, LinearSolve.InvPreconditioner{Diagonal{Float64, Vector{Float64}}}, Diagonal{Float64, Vector{Float64}}, Float64}}}, Float64}}, DiffEqBase.DEStats}, DAEFunction{true, GXBeam.var"#299#301"{Assembly{Float64, Vector{Vector{Float64}}, UnitRange{Int64}, Vector{GXBeam.Element{Float64}}}, Float64, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}}, Nothing, Nothing, GXBeam.var"#300#302"{Assembly{Float64, Vector{Vector{Float64}}, UnitRange{Int64}, Vector{GXBeam.Element{Float64}}}, Float64, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}}, Nothing, Nothing, Nothing, SparseArrays.SparseMatrixCSC{Bool, Int64}, Nothing, Nothing, Nothing, Nothing, Nothing}, OrdinaryDiffEq.DABDF2Cache{Vector{Float64}, Vector{Float64}, Vector{Float64}, OrdinaryDiffEq.NLSolver{NLNewton{Rational{Int64}, Rational{Int64}, Rational{Int64}}, true, Vector{Float64}, Rational{Int64}, Nothing, Float64, OrdinaryDiffEq.NLNewtonCache{Vector{Float64}, Float64, Float64, Vector{Float64}, Matrix{Float64}, Matrix{Float64}, Nothing, Nothing, LinearSolve.LinearCache{Matrix{Float64}, Vector{Float64}, Vector{Float64}, SciMLBase.NullParameters, Nothing, LU{Float64, Matrix{Float64}}, LinearSolve.InvPreconditioner{Diagonal{Float64, Vector{Float64}}}, Diagonal{Float64, Vector{Float64}}, Float64}}}, Float64}, OrdinaryDiffEq.DEOptions{Float64, Float64, Float64, Float64, PIController{Rational{Int64}}, typeof(DiffEqBase.ODE_DEFAULT_NORM), typeof(opnorm), Nothing, CallbackSet{Tuple{}, Tuple{}}, typeof(DiffEqBase.ODE_DEFAULT_ISOUTOFDOMAIN), typeof(DiffEqBase.ODE_DEFAULT_PROG_MESSAGE), typeof(DiffEqBase.ODE_DEFAULT_UNSTABLE_CHECK), DataStructures.BinaryHeap{Float64, DataStructures.FasterForward}, DataStructures.BinaryHeap{Float64, DataStructures.FasterForward}, Nothing, Nothing, Int64, Tuple{}, Tuple{}, Tuple{}}, Vector{Float64}, Float64, Nothing, OrdinaryDiffEq.DefaultInit}, cache::OrdinaryDiffEq.DImplicitEulerCache{Vector{Float64}, Vector{Float64}, Vector{Float64}, OrdinaryDiffEq.NLSolver{NLNewton{Rational{Int64}, Rational{Int64}, Rational{Int64}}, true, Vector{Float64}, Rational{Int64}, Nothing, Float64, OrdinaryDiffEq.NLNewtonCache{Vector{Float64}, Float64, Float64, Vector{Float64}, Matrix{Float64}, Matrix{Float64}, Nothing, Nothing, LinearSolve.LinearCache{Matrix{Float64}, Vector{Float64}, Vector{Float64}, SciMLBase.NullParameters, Nothing, LU{Float64, Matrix{Float64}}, LinearSolve.InvPreconditioner{Diagonal{Float64, Vector{Float64}}}, Diagonal{Float64, Vector{Float64}}, Float64}}}}, repeat_step::Bool)
      @ OrdinaryDiffEq ~/.julia/packages/OrdinaryDiffEq/Op0Oq/src/nlsolve/nlsolve.jl:21
    [5] perform_step!(integrator::OrdinaryDiffEq.ODEIntegrator{DABDF2{12, true, Nothing, NLNewton{Rational{Int64}, Rational{Int64}, Rational{Int64}}, typeof(OrdinaryDiffEq.DEFAULT_PRECS), Val{:forward}, true, nothing}, true, Vector{Float64}, Vector{Float64}, Float64, Tuple{var"#103#105"{Int64}, Dict{Int64, DistributedLoads{Float64}}, Dict{Int64, Vector{PointMass{Float64}}}, StaticArrays.SVector{3, Float64}, StaticArrays.SVector{3, Float64}, StaticArrays.SVector{3, Float64}, StaticArrays.SVector{3, Float64}, StaticArrays.SVector{3, Float64}, StaticArrays.SVector{3, Float64}}, Float64, Float64, Float64, Float64, Vector{Vector{Float64}}, DAESolution{Float64, 2, Vector{Vector{Float64}}, Nothing, Nothing, Nothing, Vector{Float64}, DAEProblem{Vector{Float64}, Vector{Float64}, Tuple{Float64, Float64}, true, Tuple{var"#103#105"{Int64}, Dict{Int64, DistributedLoads{Float64}}, Dict{Int64, Vector{PointMass{Float64}}}, StaticArrays.SVector{3, Float64}, StaticArrays.SVector{3, Float64}, StaticArrays.SVector{3, Float64}, StaticArrays.SVector{3, Float64}, StaticArrays.SVector{3, Float64}, StaticArrays.SVector{3, Float64}}, DAEFunction{true, GXBeam.var"#299#301"{Assembly{Float64, Vector{Vector{Float64}}, UnitRange{Int64}, Vector{GXBeam.Element{Float64}}}, Float64, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}}, Nothing, Nothing, GXBeam.var"#300#302"{Assembly{Float64, Vector{Vector{Float64}}, UnitRange{Int64}, Vector{GXBeam.Element{Float64}}}, Float64, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}}, Nothing, Nothing, Nothing, SparseArrays.SparseMatrixCSC{Bool, Int64}, Nothing, Nothing, Nothing, Nothing, Nothing}, Base.Iterators.Pairs{Union{}, Union{}, Tuple{}, NamedTuple{(), Tuple{}}}, Vector{Bool}}, DABDF2{12, true, Nothing, NLNewton{Rational{Int64}, Rational{Int64}, Rational{Int64}}, typeof(OrdinaryDiffEq.DEFAULT_PRECS), Val{:forward}, true, nothing}, OrdinaryDiffEq.InterpolationData{DAEFunction{true, GXBeam.var"#299#301"{Assembly{Float64, Vector{Vector{Float64}}, UnitRange{Int64}, Vector{GXBeam.Element{Float64}}}, Float64, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}}, Nothing, Nothing, GXBeam.var"#300#302"{Assembly{Float64, Vector{Vector{Float64}}, UnitRange{Int64}, Vector{GXBeam.Element{Float64}}}, Float64, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}}, Nothing, Nothing, Nothing, SparseArrays.SparseMatrixCSC{Bool, Int64}, Nothing, Nothing, Nothing, Nothing, Nothing}, Vector{Vector{Float64}}, Vector{Float64}, Vector{Vector{Vector{Float64}}}, OrdinaryDiffEq.DABDF2Cache{Vector{Float64}, Vector{Float64}, Vector{Float64}, OrdinaryDiffEq.NLSolver{NLNewton{Rational{Int64}, Rational{Int64}, Rational{Int64}}, true, Vector{Float64}, Rational{Int64}, Nothing, Float64, OrdinaryDiffEq.NLNewtonCache{Vector{Float64}, Float64, Float64, Vector{Float64}, Matrix{Float64}, Matrix{Float64}, Nothing, Nothing, LinearSolve.LinearCache{Matrix{Float64}, Vector{Float64}, Vector{Float64}, SciMLBase.NullParameters, Nothing, LU{Float64, Matrix{Float64}}, LinearSolve.InvPreconditioner{Diagonal{Float64, Vector{Float64}}}, Diagonal{Float64, Vector{Float64}}, Float64}}}, Float64}}, DiffEqBase.DEStats}, DAEFunction{true, GXBeam.var"#299#301"{Assembly{Float64, Vector{Vector{Float64}}, UnitRange{Int64}, Vector{GXBeam.Element{Float64}}}, Float64, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}}, Nothing, Nothing, GXBeam.var"#300#302"{Assembly{Float64, Vector{Vector{Float64}}, UnitRange{Int64}, Vector{GXBeam.Element{Float64}}}, Float64, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}}, Nothing, Nothing, Nothing, SparseArrays.SparseMatrixCSC{Bool, Int64}, Nothing, Nothing, Nothing, Nothing, Nothing}, OrdinaryDiffEq.DABDF2Cache{Vector{Float64}, Vector{Float64}, Vector{Float64}, OrdinaryDiffEq.NLSolver{NLNewton{Rational{Int64}, Rational{Int64}, Rational{Int64}}, true, Vector{Float64}, Rational{Int64}, Nothing, Float64, OrdinaryDiffEq.NLNewtonCache{Vector{Float64}, Float64, Float64, Vector{Float64}, Matrix{Float64}, Matrix{Float64}, Nothing, Nothing, LinearSolve.LinearCache{Matrix{Float64}, Vector{Float64}, Vector{Float64}, SciMLBase.NullParameters, Nothing, LU{Float64, Matrix{Float64}}, LinearSolve.InvPreconditioner{Diagonal{Float64, Vector{Float64}}}, Diagonal{Float64, Vector{Float64}}, Float64}}}, Float64}, OrdinaryDiffEq.DEOptions{Float64, Float64, Float64, Float64, PIController{Rational{Int64}}, typeof(DiffEqBase.ODE_DEFAULT_NORM), typeof(opnorm), Nothing, CallbackSet{Tuple{}, Tuple{}}, typeof(DiffEqBase.ODE_DEFAULT_ISOUTOFDOMAIN), typeof(DiffEqBase.ODE_DEFAULT_PROG_MESSAGE), typeof(DiffEqBase.ODE_DEFAULT_UNSTABLE_CHECK), DataStructures.BinaryHeap{Float64, DataStructures.FasterForward}, DataStructures.BinaryHeap{Float64, DataStructures.FasterForward}, Nothing, Nothing, Int64, Tuple{}, Tuple{}, Tuple{}}, Vector{Float64}, Float64, Nothing, OrdinaryDiffEq.DefaultInit}, cache::OrdinaryDiffEq.DImplicitEulerCache{Vector{Float64}, Vector{Float64}, Vector{Float64}, OrdinaryDiffEq.NLSolver{NLNewton{Rational{Int64}, Rational{Int64}, Rational{Int64}}, true, Vector{Float64}, Rational{Int64}, Nothing, Float64, OrdinaryDiffEq.NLNewtonCache{Vector{Float64}, Float64, Float64, Vector{Float64}, Matrix{Float64}, Matrix{Float64}, Nothing, Nothing, LinearSolve.LinearCache{Matrix{Float64}, Vector{Float64}, Vector{Float64}, SciMLBase.NullParameters, Nothing, LU{Float64, Matrix{Float64}}, LinearSolve.InvPreconditioner{Diagonal{Float64, Vector{Float64}}}, Diagonal{Float64, Vector{Float64}}, Float64}}}}, repeat_step::Bool)
      @ OrdinaryDiffEq ~/.julia/packages/OrdinaryDiffEq/Op0Oq/src/perform_step/dae_perform_step.jl:67
    [6] perform_step!(integrator::OrdinaryDiffEq.ODEIntegrator{DABDF2{12, true, Nothing, NLNewton{Rational{Int64}, Rational{Int64}, Rational{Int64}}, typeof(OrdinaryDiffEq.DEFAULT_PRECS), Val{:forward}, true, nothing}, true, Vector{Float64}, Vector{Float64}, Float64, Tuple{var"#103#105"{Int64}, Dict{Int64, DistributedLoads{Float64}}, Dict{Int64, Vector{PointMass{Float64}}}, StaticArrays.SVector{3, Float64}, StaticArrays.SVector{3, Float64}, StaticArrays.SVector{3, Float64}, StaticArrays.SVector{3, Float64}, StaticArrays.SVector{3, Float64}, StaticArrays.SVector{3, Float64}}, Float64, Float64, Float64, Float64, Vector{Vector{Float64}}, DAESolution{Float64, 2, Vector{Vector{Float64}}, Nothing, Nothing, Nothing, Vector{Float64}, DAEProblem{Vector{Float64}, Vector{Float64}, Tuple{Float64, Float64}, true, Tuple{var"#103#105"{Int64}, Dict{Int64, DistributedLoads{Float64}}, Dict{Int64, Vector{PointMass{Float64}}}, StaticArrays.SVector{3, Float64}, StaticArrays.SVector{3, Float64}, StaticArrays.SVector{3, Float64}, StaticArrays.SVector{3, Float64}, StaticArrays.SVector{3, Float64}, StaticArrays.SVector{3, Float64}}, DAEFunction{true, GXBeam.var"#299#301"{Assembly{Float64, Vector{Vector{Float64}}, UnitRange{Int64}, Vector{GXBeam.Element{Float64}}}, Float64, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}}, Nothing, Nothing, GXBeam.var"#300#302"{Assembly{Float64, Vector{Vector{Float64}}, UnitRange{Int64}, Vector{GXBeam.Element{Float64}}}, Float64, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}}, Nothing, Nothing, Nothing, SparseArrays.SparseMatrixCSC{Bool, Int64}, Nothing, Nothing, Nothing, Nothing, Nothing}, Base.Iterators.Pairs{Union{}, Union{}, Tuple{}, NamedTuple{(), Tuple{}}}, Vector{Bool}}, DABDF2{12, true, Nothing, NLNewton{Rational{Int64}, Rational{Int64}, Rational{Int64}}, typeof(OrdinaryDiffEq.DEFAULT_PRECS), Val{:forward}, true, nothing}, OrdinaryDiffEq.InterpolationData{DAEFunction{true, GXBeam.var"#299#301"{Assembly{Float64, Vector{Vector{Float64}}, UnitRange{Int64}, Vector{GXBeam.Element{Float64}}}, Float64, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}}, Nothing, Nothing, GXBeam.var"#300#302"{Assembly{Float64, Vector{Vector{Float64}}, UnitRange{Int64}, Vector{GXBeam.Element{Float64}}}, Float64, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}}, Nothing, Nothing, Nothing, SparseArrays.SparseMatrixCSC{Bool, Int64}, Nothing, Nothing, Nothing, Nothing, Nothing}, Vector{Vector{Float64}}, Vector{Float64}, Vector{Vector{Vector{Float64}}}, OrdinaryDiffEq.DABDF2Cache{Vector{Float64}, Vector{Float64}, Vector{Float64}, OrdinaryDiffEq.NLSolver{NLNewton{Rational{Int64}, Rational{Int64}, Rational{Int64}}, true, Vector{Float64}, Rational{Int64}, Nothing, Float64, OrdinaryDiffEq.NLNewtonCache{Vector{Float64}, Float64, Float64, Vector{Float64}, Matrix{Float64}, Matrix{Float64}, Nothing, Nothing, LinearSolve.LinearCache{Matrix{Float64}, Vector{Float64}, Vector{Float64}, SciMLBase.NullParameters, Nothing, LU{Float64, Matrix{Float64}}, LinearSolve.InvPreconditioner{Diagonal{Float64, Vector{Float64}}}, Diagonal{Float64, Vector{Float64}}, Float64}}}, Float64}}, DiffEqBase.DEStats}, DAEFunction{true, GXBeam.var"#299#301"{Assembly{Float64, Vector{Vector{Float64}}, UnitRange{Int64}, Vector{GXBeam.Element{Float64}}}, Float64, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}}, Nothing, Nothing, GXBeam.var"#300#302"{Assembly{Float64, Vector{Vector{Float64}}, UnitRange{Int64}, Vector{GXBeam.Element{Float64}}}, Float64, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}}, Nothing, Nothing, Nothing, SparseArrays.SparseMatrixCSC{Bool, Int64}, Nothing, Nothing, Nothing, Nothing, Nothing}, OrdinaryDiffEq.DABDF2Cache{Vector{Float64}, Vector{Float64}, Vector{Float64}, OrdinaryDiffEq.NLSolver{NLNewton{Rational{Int64}, Rational{Int64}, Rational{Int64}}, true, Vector{Float64}, Rational{Int64}, Nothing, Float64, OrdinaryDiffEq.NLNewtonCache{Vector{Float64}, Float64, Float64, Vector{Float64}, Matrix{Float64}, Matrix{Float64}, Nothing, Nothing, LinearSolve.LinearCache{Matrix{Float64}, Vector{Float64}, Vector{Float64}, SciMLBase.NullParameters, Nothing, LU{Float64, Matrix{Float64}}, LinearSolve.InvPreconditioner{Diagonal{Float64, Vector{Float64}}}, Diagonal{Float64, Vector{Float64}}, Float64}}}, Float64}, OrdinaryDiffEq.DEOptions{Float64, Float64, Float64, Float64, PIController{Rational{Int64}}, typeof(DiffEqBase.ODE_DEFAULT_NORM), typeof(opnorm), Nothing, CallbackSet{Tuple{}, Tuple{}}, typeof(DiffEqBase.ODE_DEFAULT_ISOUTOFDOMAIN), typeof(DiffEqBase.ODE_DEFAULT_PROG_MESSAGE), typeof(DiffEqBase.ODE_DEFAULT_UNSTABLE_CHECK), DataStructures.BinaryHeap{Float64, DataStructures.FasterForward}, DataStructures.BinaryHeap{Float64, DataStructures.FasterForward}, Nothing, Nothing, Int64, Tuple{}, Tuple{}, Tuple{}}, Vector{Float64}, Float64, Nothing, OrdinaryDiffEq.DefaultInit}, cache::OrdinaryDiffEq.DABDF2Cache{Vector{Float64}, Vector{Float64}, Vector{Float64}, OrdinaryDiffEq.NLSolver{NLNewton{Rational{Int64}, Rational{Int64}, Rational{Int64}}, true, Vector{Float64}, Rational{Int64}, Nothing, Float64, OrdinaryDiffEq.NLNewtonCache{Vector{Float64}, Float64, Float64, Vector{Float64}, Matrix{Float64}, Matrix{Float64}, Nothing, Nothing, LinearSolve.LinearCache{Matrix{Float64}, Vector{Float64}, Vector{Float64}, SciMLBase.NullParameters, Nothing, LU{Float64, Matrix{Float64}}, LinearSolve.InvPreconditioner{Diagonal{Float64, Vector{Float64}}}, Diagonal{Float64, Vector{Float64}}, Float64}}}, Float64}, repeat_step::Bool)
      @ OrdinaryDiffEq ~/.julia/packages/OrdinaryDiffEq/Op0Oq/src/perform_step/dae_perform_step.jl:179
    [7] perform_step!
      @ ~/.julia/packages/OrdinaryDiffEq/Op0Oq/src/perform_step/dae_perform_step.jl:171 [inlined]
    [8] solve!(integrator::OrdinaryDiffEq.ODEIntegrator{DABDF2{12, true, Nothing, NLNewton{Rational{Int64}, Rational{Int64}, Rational{Int64}}, typeof(OrdinaryDiffEq.DEFAULT_PRECS), Val{:forward}, true, nothing}, true, Vector{Float64}, Vector{Float64}, Float64, Tuple{var"#103#105"{Int64}, Dict{Int64, DistributedLoads{Float64}}, Dict{Int64, Vector{PointMass{Float64}}}, StaticArrays.SVector{3, Float64}, StaticArrays.SVector{3, Float64}, StaticArrays.SVector{3, Float64}, StaticArrays.SVector{3, Float64}, StaticArrays.SVector{3, Float64}, StaticArrays.SVector{3, Float64}}, Float64, Float64, Float64, Float64, Vector{Vector{Float64}}, DAESolution{Float64, 2, Vector{Vector{Float64}}, Nothing, Nothing, Nothing, Vector{Float64}, DAEProblem{Vector{Float64}, Vector{Float64}, Tuple{Float64, Float64}, true, Tuple{var"#103#105"{Int64}, Dict{Int64, DistributedLoads{Float64}}, Dict{Int64, Vector{PointMass{Float64}}}, StaticArrays.SVector{3, Float64}, StaticArrays.SVector{3, Float64}, StaticArrays.SVector{3, Float64}, StaticArrays.SVector{3, Float64}, StaticArrays.SVector{3, Float64}, StaticArrays.SVector{3, Float64}}, DAEFunction{true, GXBeam.var"#299#301"{Assembly{Float64, Vector{Vector{Float64}}, UnitRange{Int64}, Vector{GXBeam.Element{Float64}}}, Float64, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}}, Nothing, Nothing, GXBeam.var"#300#302"{Assembly{Float64, Vector{Vector{Float64}}, UnitRange{Int64}, Vector{GXBeam.Element{Float64}}}, Float64, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}}, Nothing, Nothing, Nothing, SparseArrays.SparseMatrixCSC{Bool, Int64}, Nothing, Nothing, Nothing, Nothing, Nothing}, Base.Iterators.Pairs{Union{}, Union{}, Tuple{}, NamedTuple{(), Tuple{}}}, Vector{Bool}}, DABDF2{12, true, Nothing, NLNewton{Rational{Int64}, Rational{Int64}, Rational{Int64}}, typeof(OrdinaryDiffEq.DEFAULT_PRECS), Val{:forward}, true, nothing}, OrdinaryDiffEq.InterpolationData{DAEFunction{true, GXBeam.var"#299#301"{Assembly{Float64, Vector{Vector{Float64}}, UnitRange{Int64}, Vector{GXBeam.Element{Float64}}}, Float64, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}}, Nothing, Nothing, GXBeam.var"#300#302"{Assembly{Float64, Vector{Vector{Float64}}, UnitRange{Int64}, Vector{GXBeam.Element{Float64}}}, Float64, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}}, Nothing, Nothing, Nothing, SparseArrays.SparseMatrixCSC{Bool, Int64}, Nothing, Nothing, Nothing, Nothing, Nothing}, Vector{Vector{Float64}}, Vector{Float64}, Vector{Vector{Vector{Float64}}}, OrdinaryDiffEq.DABDF2Cache{Vector{Float64}, Vector{Float64}, Vector{Float64}, OrdinaryDiffEq.NLSolver{NLNewton{Rational{Int64}, Rational{Int64}, Rational{Int64}}, true, Vector{Float64}, Rational{Int64}, Nothing, Float64, OrdinaryDiffEq.NLNewtonCache{Vector{Float64}, Float64, Float64, Vector{Float64}, Matrix{Float64}, Matrix{Float64}, Nothing, Nothing, LinearSolve.LinearCache{Matrix{Float64}, Vector{Float64}, Vector{Float64}, SciMLBase.NullParameters, Nothing, LU{Float64, Matrix{Float64}}, LinearSolve.InvPreconditioner{Diagonal{Float64, Vector{Float64}}}, Diagonal{Float64, Vector{Float64}}, Float64}}}, Float64}}, DiffEqBase.DEStats}, DAEFunction{true, GXBeam.var"#299#301"{Assembly{Float64, Vector{Vector{Float64}}, UnitRange{Int64}, Vector{GXBeam.Element{Float64}}}, Float64, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}}, Nothing, Nothing, GXBeam.var"#300#302"{Assembly{Float64, Vector{Vector{Float64}}, UnitRange{Int64}, Vector{GXBeam.Element{Float64}}}, Float64, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}}, Nothing, Nothing, Nothing, SparseArrays.SparseMatrixCSC{Bool, Int64}, Nothing, Nothing, Nothing, Nothing, Nothing}, OrdinaryDiffEq.DABDF2Cache{Vector{Float64}, Vector{Float64}, Vector{Float64}, OrdinaryDiffEq.NLSolver{NLNewton{Rational{Int64}, Rational{Int64}, Rational{Int64}}, true, Vector{Float64}, Rational{Int64}, Nothing, Float64, OrdinaryDiffEq.NLNewtonCache{Vector{Float64}, Float64, Float64, Vector{Float64}, Matrix{Float64}, Matrix{Float64}, Nothing, Nothing, LinearSolve.LinearCache{Matrix{Float64}, Vector{Float64}, Vector{Float64}, SciMLBase.NullParameters, Nothing, LU{Float64, Matrix{Float64}}, LinearSolve.InvPreconditioner{Diagonal{Float64, Vector{Float64}}}, Diagonal{Float64, Vector{Float64}}, Float64}}}, Float64}, OrdinaryDiffEq.DEOptions{Float64, Float64, Float64, Float64, PIController{Rational{Int64}}, typeof(DiffEqBase.ODE_DEFAULT_NORM), typeof(opnorm), Nothing, CallbackSet{Tuple{}, Tuple{}}, typeof(DiffEqBase.ODE_DEFAULT_ISOUTOFDOMAIN), typeof(DiffEqBase.ODE_DEFAULT_PROG_MESSAGE), typeof(DiffEqBase.ODE_DEFAULT_UNSTABLE_CHECK), DataStructures.BinaryHeap{Float64, DataStructures.FasterForward}, DataStructures.BinaryHeap{Float64, DataStructures.FasterForward}, Nothing, Nothing, Int64, Tuple{}, Tuple{}, Tuple{}}, Vector{Float64}, Float64, Nothing, OrdinaryDiffEq.DefaultInit})
      @ OrdinaryDiffEq ~/.julia/packages/OrdinaryDiffEq/Op0Oq/src/solve.jl:478
    [9] #__solve#495
      @ ~/.julia/packages/OrdinaryDiffEq/Op0Oq/src/solve.jl:5 [inlined]
   [10] __solve
      @ ~/.julia/packages/OrdinaryDiffEq/Op0Oq/src/solve.jl:4 [inlined]
   [11] #solve_call#37
      @ ~/.julia/packages/DiffEqBase/1V2xg/src/solve.jl:61 [inlined]
   [12] solve_call(_prob::DAEProblem{Vector{Float64}, Vector{Float64}, Tuple{Float64, Float64}, true, Tuple{var"#103#105"{Int64}, Dict{Int64, DistributedLoads{Float64}}, Dict{Int64, Vector{PointMass{Float64}}}, StaticArrays.SVector{3, Float64}, StaticArrays.SVector{3, Float64}, StaticArrays.SVector{3, Float64}, StaticArrays.SVector{3, Float64}, StaticArrays.SVector{3, Float64}, StaticArrays.SVector{3, Float64}}, DAEFunction{true, GXBeam.var"#299#301"{Assembly{Float64, Vector{Vector{Float64}}, UnitRange{Int64}, Vector{GXBeam.Element{Float64}}}, Float64, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}}, Nothing, Nothing, GXBeam.var"#300#302"{Assembly{Float64, Vector{Vector{Float64}}, UnitRange{Int64}, Vector{GXBeam.Element{Float64}}}, Float64, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}}, Nothing, Nothing, Nothing, SparseArrays.SparseMatrixCSC{Bool, Int64}, Nothing, Nothing, Nothing, Nothing, Nothing}, Base.Iterators.Pairs{Union{}, Union{}, Tuple{}, NamedTuple{(), Tuple{}}}, Vector{Bool}}, args::DABDF2{12, true, Nothing, NLNewton{Rational{Int64}, Rational{Int64}, Rational{Int64}}, typeof(OrdinaryDiffEq.DEFAULT_PRECS), Val{:forward}, true, nothing})
      @ DiffEqBase ~/.julia/packages/DiffEqBase/1V2xg/src/solve.jl:48
   [13] solve_up(prob::DAEProblem{Vector{Float64}, Vector{Float64}, Tuple{Float64, Float64}, true, Tuple{var"#103#105"{Int64}, Dict{Int64, DistributedLoads{Float64}}, Dict{Int64, Vector{PointMass{Float64}}}, StaticArrays.SVector{3, Float64}, StaticArrays.SVector{3, Float64}, StaticArrays.SVector{3, Float64}, StaticArrays.SVector{3, Float64}, StaticArrays.SVector{3, Float64}, StaticArrays.SVector{3, Float64}}, DAEFunction{true, GXBeam.var"#299#301"{Assembly{Float64, Vector{Vector{Float64}}, UnitRange{Int64}, Vector{GXBeam.Element{Float64}}}, Float64, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}}, Nothing, Nothing, GXBeam.var"#300#302"{Assembly{Float64, Vector{Vector{Float64}}, UnitRange{Int64}, Vector{GXBeam.Element{Float64}}}, Float64, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}}, Nothing, Nothing, Nothing, SparseArrays.SparseMatrixCSC{Bool, Int64}, Nothing, Nothing, Nothing, Nothing, Nothing}, Base.Iterators.Pairs{Union{}, Union{}, Tuple{}, NamedTuple{(), Tuple{}}}, Vector{Bool}}, sensealg::Nothing, u0::Vector{Float64}, p::Tuple{var"#103#105"{Int64}, Dict{Int64, DistributedLoads{Float64}}, Dict{Int64, Vector{PointMass{Float64}}}, StaticArrays.SVector{3, Float64}, StaticArrays.SVector{3, Float64}, StaticArrays.SVector{3, Float64}, StaticArrays.SVector{3, Float64}, StaticArrays.SVector{3, Float64}, StaticArrays.SVector{3, Float64}}, args::DABDF2{0, true, Nothing, NLNewton{Rational{Int64}, Rational{Int64}, Rational{Int64}}, typeof(OrdinaryDiffEq.DEFAULT_PRECS), Val{:forward}, true, nothing}; kwargs::Base.Iterators.Pairs{Union{}, Union{}, Tuple{}, NamedTuple{(), Tuple{}}})
      @ DiffEqBase ~/.julia/packages/DiffEqBase/1V2xg/src/solve.jl:87
   [14] solve_up
      @ ~/.julia/packages/DiffEqBase/1V2xg/src/solve.jl:78 [inlined]
   [15] #solve#38
      @ ~/.julia/packages/DiffEqBase/1V2xg/src/solve.jl:73 [inlined]
   [16] solve(prob::DAEProblem{Vector{Float64}, Vector{Float64}, Tuple{Float64, Float64}, true, Tuple{var"#103#105"{Int64}, Dict{Int64, DistributedLoads{Float64}}, Dict{Int64, Vector{PointMass{Float64}}}, StaticArrays.SVector{3, Float64}, StaticArrays.SVector{3, Float64}, StaticArrays.SVector{3, Float64}, StaticArrays.SVector{3, Float64}, StaticArrays.SVector{3, Float64}, StaticArrays.SVector{3, Float64}}, DAEFunction{true, GXBeam.var"#299#301"{Assembly{Float64, Vector{Vector{Float64}}, UnitRange{Int64}, Vector{GXBeam.Element{Float64}}}, Float64, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}}, Nothing, Nothing, GXBeam.var"#300#302"{Assembly{Float64, Vector{Vector{Float64}}, UnitRange{Int64}, Vector{GXBeam.Element{Float64}}}, Float64, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}}, Nothing, Nothing, Nothing, SparseArrays.SparseMatrixCSC{Bool, Int64}, Nothing, Nothing, Nothing, Nothing, Nothing}, Base.Iterators.Pairs{Union{}, Union{}, Tuple{}, NamedTuple{(), Tuple{}}}, Vector{Bool}}, args::DABDF2{0, true, Nothing, NLNewton{Rational{Int64}, Rational{Int64}, Rational{Int64}}, typeof(OrdinaryDiffEq.DEFAULT_PRECS), Val{:forward}, true, nothing})
      @ DiffEqBase ~/.julia/packages/DiffEqBase/1V2xg/src/solve.jl:68
   [17] macro expansion
      @ ~/.julia/packages/GXBeam/S8Yc6/test/runtests.jl:1206 [inlined]
   [18] macro expansion
      @ /buildworker/worker/package_linux64/build/usr/share/julia/stdlib/v1.6/Test/src/Test.jl:1151 [inlined]
   [19] top-level scope
      @ ~/.julia/packages/GXBeam/S8Yc6/test/runtests.jl:1141
   [20] include(fname::String)
      @ Base.MainInclude ./client.jl:444
   [21] top-level scope
      @ none:6
   [22] eval
      @ ./boot.jl:360 [inlined]
   [23] exec_options(opts::Base.JLOptions)
      @ Base ./client.jl:261
   [24] _start()
      @ Base ./client.jl:485
Test Summary:         | Fail  Error  Total
DifferentialEquations |    1      1      2
ERROR: LoadError: Some tests did not pass: 0 passed, 1 failed, 1 errored, 0 broken.
in expression starting at /home/kevin/.julia/packages/GXBeam/S8Yc6/test/runtests.jl:1139
ERROR: Package GXBeam errored during testing

Bump version to 0.2.0

@JuliaRegistrator register

Release notes:

Breaking Changes:

  • Definitions for PrescribedConditions and DistributedLoads changed to only reflect loads at a specific time step
  • Time varying prescribed conditions must now be specified as a function of time which produces a dictionary containing elements of type PrescribedConditions (with keys corresponding to the points to which those conditions apply).
  • Time varying distributed loads must now be specified as a function of time which produces a dictionary containing elements of type DistributedLoads (with keys corresponding to the elements to which those loads apply.
  • All analyses now accept a time vector rather than the time step size and/or number of time steps

Additional changes:

  • fixed eigenvalue analysis for cases with non-zero real parts of complex eigenvalues
  • added interface with DifferentialEquations
  • added problem-dependent scaling terms to forces/moments and masses/inertias which are based on stiffness and mass matrix entries.
  • added additional post processing functions
  • updated documentation for clarity

Approximation spaces, accuracy

I could not locate any information on the choice of the approximation spaces in the documentation. There is no mention of accuracy and convergence either. Did I miss it?

Defining beam element stiffness matrices

Hi!

Maybe I'm bad at searching or misunderstood something, but I can't seem to find a function to generate the element stiffness matrix for a beam. Is this functionality in the package? If not, do you have a reference for which Timoshenko element formulation you are using?

Warping?

I am guessing from the documentation that the dofs are displacements and rotations of the nodes? So no warping, and hence no open sections? If so, it should be spelt out in the documentation.

Visualization with Paraview

I note that you selected lines for visualizing the deforming beams. Unfortunately, that is just one piece of the information, the other being the orientations of the cross-sections. Are there any plans of including those, perhaps with glyphs?
I admit I looked into that but didn't get too far... _O_/

Change from DiffEqBase to SciMLBase

DiffEqBase is the lowest common denominator for the DiffEq packages, not necessarily the whole SciML ecosystem, and so it has a lot DiffEq dependencies. These are generally not required by downstream packages. If what you're looking for is a way to define problems without having most dependencies, we recommend you use SciMLBase as the dependency since everything like ODEProblem, SteadyStateProblem, etc. is defined there. We basically recommend depending on SciMLBase for problem definitions, and solver packages for specific solvers, but generally most non-SciML packages should not be depending on DiffEqBase directly (given the split of SciMLBase in 2021)

For more details see: https://diffeq.sciml.ai/stable/features/low_dep/ and https://discourse.julialang.org/t/psa-the-right-dependency-to-reduce-from-differentialequations-jl/72757

Let me know if you need any help updating this, though for almost all dependents here it should be a trivial name change as you're actually using pieces from SciMLBase.

Initial conditions

Hi Taylor,

I can't get this simulation of a simply-supported beam initially displaced to excite only its 2nd mode to run:

using GXBeam, LinearAlgebra

# Simply-supported beam subject to initial conditions

# beam properties
L = 1
EI = 1
I = 1
A = 1
ρ = 1

# create points
nelem = 20
x = range(0, L, length=nelem+1)
y = zero(x)
z = zero(x)
points = [[x[i],y[i],z[i]] for i = 1:length(x)]
lengths, points, midpoints, Cab = discretize_beam(L,[0, 0, 0],nelem)

# index of endpoints of each beam element
start = 1:nelem
stop = 2:nelem+1

# compliance matrix for each beam element
compliance = fill(Diagonal([0, 0, 0, 0, 1/EI, 0]), nelem)

# mass matrix for each beam element
mass = fill(Diagonal([ρ*A, ρ*A, ρ*A, 2*ρ*I, ρ*I, ρ*I]), nelem)

# create assembly 
assembly = Assembly(points, start, stop; compliance=compliance, mass=mass)

# prescribed conditions
prescribed_conditions = (t) -> begin
    Dict(
        # simply supported left side
        1 => PrescribedConditions(ux=0, uy=0, uz=0, theta_x=0, theta_z=0),
        # simply supported right side
        nelem+1 => PrescribedConditions(ux=0, uy=0, uz=0, theta_x=0, theta_z=0) 
    )
end

# initial conditions
delta = 1e-3    # small number to stay in the linear regime
u0 = [[0,0,delta*sin(2*pi*midpoints[i][1]/L)] for i = 1:length(midpoints)]
theta0 = [[0,-delta*2*pi/L*cos(2*pi*midpoints[i][1]/L),0] for i = 1:length(midpoints)]

# simulation time
t = 0:1e-3:0.25

# solve
system, history, converged = time_domain_analysis(assembly, t;
    prescribed_conditions = prescribed_conditions,
    u0=u0,
    initialize=true,
    iterations=50) #theta0=theta0

# Get displacements at 1/4 of the beam's length
point = nelem/4+1
field = [:u]
direction = [3]
w14_of_t = [getproperty(state.points[point[1]], field[1])[direction[1]] for state in history]

# Plot
using Plots
pyplot()
plot(xlabel = "Time (s)",
     ylabel = "\$w\$ (\$m\$)",
     grid = false,
     overwrite_figure=false
     )   
plot!(t, w14_of_t, label="")     
plot!(show=true)

# analytical solution
x_quarter = x[nelem/4]
omega2 = (2*pi/L)^2*sqrt(EI/*A);
w14_analytic = delta*cos(omega2*t)*sin(2*pi*x_quarter/L)

The initial conditions solver does not converge (reduced to 50 iterations or it just takes forever), for this one or any other type of initial conditions. As you can see, the initial displacements were provided as inputs, but setting both displacements and angles does not help either.

I managed to solve the problem in a separate code, by setting the initial conditions as prescribed conditions (boundary conditions) and solving the resulting problem as a static one. The solution states vector is then copied as a consistent set of initial states. The displacement solution should be like this:

SS_initial_disp

I was just wondering if I'm doing something wrong with the inputs to the time domain analysis, and say that I'd be glad to help fix the issue (if there really is one).

Who is Ning?

They are not listed as contributors to the package.

Index reduction to model DAE as ODE

DAEs can be converted to ODEs using index reduction. It would be nice to try that for this package so that more solvers/features from DifferentialEquations can be used. The sensitivity analysis in DifferentialEquations doesn't cover DAEs, so that would be an example of at least one area in which this would be useful.

"Free-flight" boundary conditions

Hi,

Got another issue... it concerns problems with "free-flight" boundary conditions, say for a beam free to move in 3D space.

First, I verified what seems to be an issue even in a 2D constrained flight. The problem is the "flying spaghetti" from 1, here is the GXBeam input code:

using GXBeam, LinearAlgebra

# SIMO & VU-QUOC's 2D flying spaghetti

# beam properties
L = 10; 
EA = 1e4; 
GA = EA; 
EI = 500; 
GJ = EI; 
rhoA = 1; 
rhoIs = 20; 
rhoI = 10;

# Number of elements
nelem = 20

# Frame for initial rotation of the beam
Cab = [0.6 0.0 0.8
       0.0 1.0 0.0
      -0.8 0.0 0.6]

# Discretization variables      
lengths, points, midpoints, Cab = discretize_beam(L, [0, 0, 0], nelem, frame=Cab)

# index of endpoints of each beam element
start = 1:nelem
stop = 2:nelem+1

# stiffness matrix for each beam element
stiffness = fill(Diagonal([EA, GA, GA, GJ, EI, EI]), nelem)

# mass matrix for each beam element
mass = fill(Diagonal([rhoA, rhoA, rhoA, rhoIs, rhoI, rhoI]), nelem)

# create assembly
assembly = Assembly(points, start, stop;
    stiffness = stiffness,
    mass = mass,
    frames = Cab,
    lengths = lengths,
    midpoints = midpoints)

 # external forces
 tau = 2.5
M = (t) -> begin
    if 0.0 <= t <= tau
        80
    else
        zero(t)
    end
end

# prescribed conditions
prescribed_conditions = (t) -> begin
    Dict(
        # left side: no out of plane movement
        1 => PrescribedConditions(uy=0, theta_z=0),
        # right side: no out of plane movement, applied forces 
        nelem+1 => PrescribedConditions(Fx=M(t)/10, My=M(t), uy=0, theta_z=0) 
    )
end

# simulation time
t = 0:1e-2:13

# analysis
system, history, converged = time_domain_analysis(assembly, t;
    prescribed_conditions = prescribed_conditions)

# Get displacement outputs at both ends of the beam    
point = [1 nelem+1]
field = [:u, :u]
direction = [1, 3]
ylabel = ["\$u\$ (\$m\$)","\$w\$ (\$m\$)"]

u1 = [getproperty(state.points[point[1]], field[1])[direction[1]] for state in history]
w1 = [getproperty(state.points[point[1]], field[2])[direction[2]] for state in history]
uend = [getproperty(state.points[point[2]], field[1])[direction[1]] for state in history]
wend = [getproperty(state.points[point[2]], field[2])[direction[2]] for state in history]

# plot results
using Plots
pyplot()

# plot horizontal displacement
plot(xlabel = "Time (s)",
     ylabel = ylabel[1],
     grid = false,
     overwrite_figure=false
     )   
plot!(t, u1, label="Node 1")     
plot!(t, uend, label="Node end")
plot!(show=true)

# plot vertical displacement
plot(xlabel = "Time (s)",
     ylabel = ylabel[2],
     grid = false,
     overwrite_figure=false
     )   
plot!(t, w1, label="Node 1")     
plot!(t, wend, label="Node end")
plot!(show=true)

A motion plot of the problem is as follows:

flexible_beam_2D

As you can see, after about 7 seconds, the beam starts to exhibit an unexpected motion, moving towards the left and downwards, even though its momentum should make it keep going to the right indefinitely, with no vertical movement. The authors in the original paper1 do not make it clear if they modified their motion plots in any way, but a more recent work2 confirms that indeed the beam keeps moving to the right:

Palacios_2D_spaghetti

Setting the prescribed condition u_z = 0 for the beam's midpoint fixes the problem, but such boundary condition is not stated by either 1 or 2, neither should it be necessary. Comparing solutions, the deformed shapes of the beam seem to agree, but the positions in space do not.

I also investigated the 3D version of that problem3, in which an out-of-plane moment is also applied, a true free-flight case. Here is the GXBeam file:

using GXBeam, LinearAlgebra

# SIMO & VU-QUOC's 3D flying spaghetti

# beam properties
L = 10; 
EA = 1e4; 
GA = EA; 
EI = 500; 
GJ = EI; 
rhoA = 1; 
rhoIs = 20; 
rhoI = 10;

# Number of elements
nelem = 20

# Frame for initial rotation of the beam
Cab = [0.6 0.0 0.8
       0.0 1.0 0.0
      -0.8 0.0 0.6]

# Discretization variables      
lengths, points, midpoints, Cab = discretize_beam(L, [0, 0, 0], nelem, frame=Cab)

# index of endpoints of each beam element
start = 1:nelem
stop = 2:nelem+1

# stiffness matrix for each beam element
stiffness = fill(Diagonal([EA, GA, GA, GJ, EI, EI]), nelem)

# mass matrix for each beam element
mass = fill(Diagonal([rhoA, rhoA, rhoA, rhoIs, rhoI, rhoI]), nelem)

# create assembly
assembly = Assembly(points, start, stop;
    stiffness = stiffness,
    mass = mass,
    frames = Cab,
    lengths = lengths,
    midpoints = midpoints)

 # forces
 M0 = 200
 tau = 2.5
M = (t) -> begin
    if 0.0 <= t <= tau
        M0*t/tau
    elseif tau < t <= 2*tau
        2*M0*(1.0-t/(2*tau))
    else
        zero(t)
    end
end

# prescribed conditions
prescribed_conditions = (t) -> begin
    Dict(
        # forces on right side
        nelem+1 => PrescribedConditions(Fx=M(t)/10, My=M(t), Mz=M(t)/2) 
    )
end

# simulation time (problems get serious after about 3 seconds)
t = 0:1e-3:3.14

# analysis
system, history, converged = time_domain_analysis(assembly, t;
    prescribed_conditions = prescribed_conditions)

# Get displacement outputs at both ends of the beam      
point = [1 nelem+1]
field = [:u, :u, :theta]
direction = [1, 3, 2]
ylabel = ["\$u\$ (\$m\$)","\$w\$ (\$m\$)","Rodrigues parameter \$\\theta_y\$"]

u1 = [getproperty(state.points[point[1]], field[1])[direction[1]] for state in history]
w1 = [getproperty(state.points[point[1]], field[2])[direction[2]] for state in history]
uend = [getproperty(state.points[point[2]], field[1])[direction[1]] for state in history]
wend = [getproperty(state.points[point[2]], field[2])[direction[2]] for state in history]
thetay_end = [getproperty(state.points[point[2]], field[3])[direction[3]] for state in history]

# plot results
using Plots
pyplot()

# plot u
plot(xlabel = "Time (s)",
     ylabel = ylabel[1],
     grid = true,
     overwrite_figure=false
     )   
plot!(t, u1, label="Node 1")     
plot!(t, uend, label="Node end")
plot!(show=true)

# plot w
plot(xlabel = "Time (s)",
     ylabel = ylabel[2],
     grid = true,
     overwrite_figure=false
     )  
plot!(t, w1, label="Node 1")     
plot!(t, wend, label="Node end")
plot!(show=true)

# plot theta_y
plot(xlabel = "Time (s)",
     ylabel = ylabel[3],
     grid = true,
     overwrite_figure=false
     )  
plot!(t, thetay_end, label="")     
plot!(show=true)

The plot of the theta_y rotation parameter reveals an unstable behavior of the beam, and the solution only converges up until around 3.16 seconds:

3D_spaghetti_thetay

No discretization or time step refinement could remedy the numerical instability. A plane view motion plot makes it clear that there is an issue in the simulation:

3D_spaghetti

Since the program appears to work perfectly in cases where the structure is restrained in some way, I was led to believe the issue only happens in these free-flight cases. Any ideas of what may be going on? Maybe there is a need to integrate the "a" frame states over time as well?

Footnotes

  1. Simo, J. C., & Vu-Quoc, L. (1986). On the dynamics of flexible beams under large overall motions—The plane case: Part II. Journal of Applied Mechanics, 53, 855-863. 2 3

  2. Palacios, R., & Cea, A. (2019). Nonlinear modal condensation of large finite element models: Application of Hodges’s intrinsic theory. AIAA Journal, 57(10), 4255-4268. 2

  3. Simo, J. C., & Vu-Quoc, L. (1988). On the dynamics in space of rods undergoing large motions—a geometrically exact approach. Computer Methods in Applied Mechanics and Engineering, 66(2), 125-161.

Tests failing

Uppon running ] test GXBeam I get the following:

     Testing Running tests...
Test Summary: | Pass  Total
Math          |   15     15
Test Summary:                         | Pass  Total
Jacobian and Mass Matrix Calculations |    6      6
Test Summary:                                                              | Pass  Total
Linear Analysis of a Cantilever Partially Under a Uniform Distributed Load |   62     62
Test Summary:                                             | Pass  Total
Linear Analysis of a Beam Under a Linear Distributed Load |   82     82
Test Summary:                                                       | Pass  Total
Nonlinear Analysis of a Cantilever Subjected to a Constant Tip Load |   99     99
Test Summary:                                                     | Pass  Total
Nonlinear Analysis of a Cantilever Subjected to a Constant Moment |  462    462
Test Summary:                                                  | Pass  Total
Nonlinear Analysis of the Bending of a Curved Beam in 3D Space |    3      3
Test Summary:                  | Pass  Total
Rotating Beam with a Swept Tip |   48     48
Test Summary:                                      | Pass  Total
Nonlinear Dynamic Analysis of a Wind Turbine Blade |    1      1
Test Summary:                              | Pass  Total
Nonlinear Static Analysis of a Joined-Wing |  423    423
Test Summary:                               | Pass  Total
Nonlinear Dynamic Analysis of a Joined-Wing |    1      1
┌ Warning: dt <= dtmin. Aborting. There is either an error in your model specification or the true solution is unstable.
└ @ SciMLBase ~/.julia/packages/SciMLBase/GW7GW/src/integrator_interface.jl:345
DifferentialEquations: Test Failed at /home/kevin/.julia/packages/GXBeam/S8Yc6/test/runtests.jl:1200
  Expression: sol.t[end] == 2.0
   Evaluated: 0.47166509384056277 == 2.0
Stacktrace:
 [1] macro expansion
   @ ~/julia/share/julia/stdlib/v1.7/Test/src/Test.jl:445 [inlined]
 [2] macro expansion
   @ ~/.julia/packages/GXBeam/S8Yc6/test/runtests.jl:1200 [inlined]
 [3] macro expansion
   @ ~/julia/share/julia/stdlib/v1.7/Test/src/Test.jl:1283 [inlined]
 [4] top-level scope
   @ ~/.julia/packages/GXBeam/S8Yc6/test/runtests.jl:1141
DifferentialEquations: Error During Test at /home/kevin/.julia/packages/GXBeam/S8Yc6/test/runtests.jl:1139
  Got exception outside of a @test
  type Nothing has no field α
  Stacktrace:
    [1] setproperty!(x::Nothing, f::Symbol, v::Float64)
      @ Base ./Base.jl:43
    [2] calc_W!
      @ ~/.julia/packages/OrdinaryDiffEq/iOlmD/src/derivative_utils.jl:559 [inlined]
    [3] update_W!
      @ ~/.julia/packages/OrdinaryDiffEq/iOlmD/src/derivative_utils.jl:663 [inlined]
    [4] nlsolve!(nlsolver::OrdinaryDiffEq.NLSolver{NLNewton{Rational{Int64}, Rational{Int64}, Rational{Int64}}, true, Vector{Float64}, Rational{Int64}, Nothing, Float64, OrdinaryDiffEq.NLNewtonCache{Vector{Float64}, Float64, Float64, Vector{Float64}, Matrix{Float64}, Matrix{Float64}, Nothing, Nothing, LinearSolve.LinearCache{Matrix{Float64}, Vector{Float64}, Vector{Float64}, SciMLBase.NullParameters, Nothing, LU{Float64, Matrix{Float64}}, LinearSolve.InvPreconditioner{Diagonal{Float64, Vector{Float64}}}, Diagonal{Float64, Vector{Float64}}, Float64}}}, integrator::OrdinaryDiffEq.ODEIntegrator{DABDF2{12, true, Nothing, NLNewton{Rational{Int64}, Rational{Int64}, Rational{Int64}}, typeof(OrdinaryDiffEq.DEFAULT_PRECS), Val{:forward}, true, nothing}, true, Vector{Float64}, Vector{Float64}, Float64, Tuple{var"#103#105"{Int64}, Dict{Int64, DistributedLoads{Float64}}, Dict{Int64, Vector{PointMass{Float64}}}, StaticArrays.SVector{3, Float64}, StaticArrays.SVector{3, Float64}, StaticArrays.SVector{3, Float64}, StaticArrays.SVector{3, Float64}, StaticArrays.SVector{3, Float64}, StaticArrays.SVector{3, Float64}}, Float64, Float64, Float64, Float64, Vector{Vector{Float64}}, DAESolution{Float64, 2, Vector{Vector{Float64}}, Nothing, Nothing, Nothing, Vector{Float64}, DAEProblem{Vector{Float64}, Vector{Float64}, Tuple{Float64, Float64}, true, Tuple{var"#103#105"{Int64}, Dict{Int64, DistributedLoads{Float64}}, Dict{Int64, Vector{PointMass{Float64}}}, StaticArrays.SVector{3, Float64}, StaticArrays.SVector{3, Float64}, StaticArrays.SVector{3, Float64}, StaticArrays.SVector{3, Float64}, StaticArrays.SVector{3, Float64}, StaticArrays.SVector{3, Float64}}, DAEFunction{true, GXBeam.var"#299#301"{Assembly{Float64, Vector{Vector{Float64}}, UnitRange{Int64}, Vector{GXBeam.Element{Float64}}}, Float64, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}}, Nothing, Nothing, GXBeam.var"#300#302"{Assembly{Float64, Vector{Vector{Float64}}, UnitRange{Int64}, Vector{GXBeam.Element{Float64}}}, Float64, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}}, Nothing, Nothing, Nothing, SparseArrays.SparseMatrixCSC{Bool, Int64}, Nothing, Nothing, Nothing, Nothing, typeof(SciMLBase.DEFAULT_OBSERVED), Nothing}, Base.Pairs{Symbol, Union{}, Tuple{}, NamedTuple{(), Tuple{}}}, Vector{Bool}}, DABDF2{12, true, Nothing, NLNewton{Rational{Int64}, Rational{Int64}, Rational{Int64}}, typeof(OrdinaryDiffEq.DEFAULT_PRECS), Val{:forward}, true, nothing}, OrdinaryDiffEq.InterpolationData{DAEFunction{true, GXBeam.var"#299#301"{Assembly{Float64, Vector{Vector{Float64}}, UnitRange{Int64}, Vector{GXBeam.Element{Float64}}}, Float64, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}}, Nothing, Nothing, GXBeam.var"#300#302"{Assembly{Float64, Vector{Vector{Float64}}, UnitRange{Int64}, Vector{GXBeam.Element{Float64}}}, Float64, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}}, Nothing, Nothing, Nothing, SparseArrays.SparseMatrixCSC{Bool, Int64}, Nothing, Nothing, Nothing, Nothing, typeof(SciMLBase.DEFAULT_OBSERVED), Nothing}, Vector{Vector{Float64}}, Vector{Float64}, Vector{Vector{Vector{Float64}}}, OrdinaryDiffEq.DABDF2Cache{Vector{Float64}, Vector{Float64}, Vector{Float64}, OrdinaryDiffEq.NLSolver{NLNewton{Rational{Int64}, Rational{Int64}, Rational{Int64}}, true, Vector{Float64}, Rational{Int64}, Nothing, Float64, OrdinaryDiffEq.NLNewtonCache{Vector{Float64}, Float64, Float64, Vector{Float64}, Matrix{Float64}, Matrix{Float64}, Nothing, Nothing, LinearSolve.LinearCache{Matrix{Float64}, Vector{Float64}, Vector{Float64}, SciMLBase.NullParameters, Nothing, LU{Float64, Matrix{Float64}}, LinearSolve.InvPreconditioner{Diagonal{Float64, Vector{Float64}}}, Diagonal{Float64, Vector{Float64}}, Float64}}}, Float64}}, DiffEqBase.DEStats}, DAEFunction{true, GXBeam.var"#299#301"{Assembly{Float64, Vector{Vector{Float64}}, UnitRange{Int64}, Vector{GXBeam.Element{Float64}}}, Float64, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}}, Nothing, Nothing, GXBeam.var"#300#302"{Assembly{Float64, Vector{Vector{Float64}}, UnitRange{Int64}, Vector{GXBeam.Element{Float64}}}, Float64, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}}, Nothing, Nothing, Nothing, SparseArrays.SparseMatrixCSC{Bool, Int64}, Nothing, Nothing, Nothing, Nothing, typeof(SciMLBase.DEFAULT_OBSERVED), Nothing}, OrdinaryDiffEq.DABDF2Cache{Vector{Float64}, Vector{Float64}, Vector{Float64}, OrdinaryDiffEq.NLSolver{NLNewton{Rational{Int64}, Rational{Int64}, Rational{Int64}}, true, Vector{Float64}, Rational{Int64}, Nothing, Float64, OrdinaryDiffEq.NLNewtonCache{Vector{Float64}, Float64, Float64, Vector{Float64}, Matrix{Float64}, Matrix{Float64}, Nothing, Nothing, LinearSolve.LinearCache{Matrix{Float64}, Vector{Float64}, Vector{Float64}, SciMLBase.NullParameters, Nothing, LU{Float64, Matrix{Float64}}, LinearSolve.InvPreconditioner{Diagonal{Float64, Vector{Float64}}}, Diagonal{Float64, Vector{Float64}}, Float64}}}, Float64}, OrdinaryDiffEq.DEOptions{Float64, Float64, Float64, Float64, PIController{Rational{Int64}}, typeof(DiffEqBase.ODE_DEFAULT_NORM), typeof(opnorm), Nothing, CallbackSet{Tuple{}, Tuple{}}, typeof(DiffEqBase.ODE_DEFAULT_ISOUTOFDOMAIN), typeof(DiffEqBase.ODE_DEFAULT_PROG_MESSAGE), typeof(DiffEqBase.ODE_DEFAULT_UNSTABLE_CHECK), DataStructures.BinaryHeap{Float64, DataStructures.FasterForward}, DataStructures.BinaryHeap{Float64, DataStructures.FasterForward}, Nothing, Nothing, Int64, Tuple{}, Tuple{}, Tuple{}}, Vector{Float64}, Float64, Nothing, OrdinaryDiffEq.DefaultInit}, cache::OrdinaryDiffEq.DImplicitEulerCache{Vector{Float64}, Vector{Float64}, Vector{Float64}, OrdinaryDiffEq.NLSolver{NLNewton{Rational{Int64}, Rational{Int64}, Rational{Int64}}, true, Vector{Float64}, Rational{Int64}, Nothing, Float64, OrdinaryDiffEq.NLNewtonCache{Vector{Float64}, Float64, Float64, Vector{Float64}, Matrix{Float64}, Matrix{Float64}, Nothing, Nothing, LinearSolve.LinearCache{Matrix{Float64}, Vector{Float64}, Vector{Float64}, SciMLBase.NullParameters, Nothing, LU{Float64, Matrix{Float64}}, LinearSolve.InvPreconditioner{Diagonal{Float64, Vector{Float64}}}, Diagonal{Float64, Vector{Float64}}, Float64}}}}, repeat_step::Bool)
      @ OrdinaryDiffEq ~/.julia/packages/OrdinaryDiffEq/iOlmD/src/nlsolve/nlsolve.jl:21
    [5] perform_step!(integrator::OrdinaryDiffEq.ODEIntegrator{DABDF2{12, true, Nothing, NLNewton{Rational{Int64}, Rational{Int64}, Rational{Int64}}, typeof(OrdinaryDiffEq.DEFAULT_PRECS), Val{:forward}, true, nothing}, true, Vector{Float64}, Vector{Float64}, Float64, Tuple{var"#103#105"{Int64}, Dict{Int64, DistributedLoads{Float64}}, Dict{Int64, Vector{PointMass{Float64}}}, StaticArrays.SVector{3, Float64}, StaticArrays.SVector{3, Float64}, StaticArrays.SVector{3, Float64}, StaticArrays.SVector{3, Float64}, StaticArrays.SVector{3, Float64}, StaticArrays.SVector{3, Float64}}, Float64, Float64, Float64, Float64, Vector{Vector{Float64}}, DAESolution{Float64, 2, Vector{Vector{Float64}}, Nothing, Nothing, Nothing, Vector{Float64}, DAEProblem{Vector{Float64}, Vector{Float64}, Tuple{Float64, Float64}, true, Tuple{var"#103#105"{Int64}, Dict{Int64, DistributedLoads{Float64}}, Dict{Int64, Vector{PointMass{Float64}}}, StaticArrays.SVector{3, Float64}, StaticArrays.SVector{3, Float64}, StaticArrays.SVector{3, Float64}, StaticArrays.SVector{3, Float64}, StaticArrays.SVector{3, Float64}, StaticArrays.SVector{3, Float64}}, DAEFunction{true, GXBeam.var"#299#301"{Assembly{Float64, Vector{Vector{Float64}}, UnitRange{Int64}, Vector{GXBeam.Element{Float64}}}, Float64, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}}, Nothing, Nothing, GXBeam.var"#300#302"{Assembly{Float64, Vector{Vector{Float64}}, UnitRange{Int64}, Vector{GXBeam.Element{Float64}}}, Float64, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}}, Nothing, Nothing, Nothing, SparseArrays.SparseMatrixCSC{Bool, Int64}, Nothing, Nothing, Nothing, Nothing, typeof(SciMLBase.DEFAULT_OBSERVED), Nothing}, Base.Pairs{Symbol, Union{}, Tuple{}, NamedTuple{(), Tuple{}}}, Vector{Bool}}, DABDF2{12, true, Nothing, NLNewton{Rational{Int64}, Rational{Int64}, Rational{Int64}}, typeof(OrdinaryDiffEq.DEFAULT_PRECS), Val{:forward}, true, nothing}, OrdinaryDiffEq.InterpolationData{DAEFunction{true, GXBeam.var"#299#301"{Assembly{Float64, Vector{Vector{Float64}}, UnitRange{Int64}, Vector{GXBeam.Element{Float64}}}, Float64, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}}, Nothing, Nothing, GXBeam.var"#300#302"{Assembly{Float64, Vector{Vector{Float64}}, UnitRange{Int64}, Vector{GXBeam.Element{Float64}}}, Float64, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}}, Nothing, Nothing, Nothing, SparseArrays.SparseMatrixCSC{Bool, Int64}, Nothing, Nothing, Nothing, Nothing, typeof(SciMLBase.DEFAULT_OBSERVED), Nothing}, Vector{Vector{Float64}}, Vector{Float64}, Vector{Vector{Vector{Float64}}}, OrdinaryDiffEq.DABDF2Cache{Vector{Float64}, Vector{Float64}, Vector{Float64}, OrdinaryDiffEq.NLSolver{NLNewton{Rational{Int64}, Rational{Int64}, Rational{Int64}}, true, Vector{Float64}, Rational{Int64}, Nothing, Float64, OrdinaryDiffEq.NLNewtonCache{Vector{Float64}, Float64, Float64, Vector{Float64}, Matrix{Float64}, Matrix{Float64}, Nothing, Nothing, LinearSolve.LinearCache{Matrix{Float64}, Vector{Float64}, Vector{Float64}, SciMLBase.NullParameters, Nothing, LU{Float64, Matrix{Float64}}, LinearSolve.InvPreconditioner{Diagonal{Float64, Vector{Float64}}}, Diagonal{Float64, Vector{Float64}}, Float64}}}, Float64}}, DiffEqBase.DEStats}, DAEFunction{true, GXBeam.var"#299#301"{Assembly{Float64, Vector{Vector{Float64}}, UnitRange{Int64}, Vector{GXBeam.Element{Float64}}}, Float64, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}}, Nothing, Nothing, GXBeam.var"#300#302"{Assembly{Float64, Vector{Vector{Float64}}, UnitRange{Int64}, Vector{GXBeam.Element{Float64}}}, Float64, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}}, Nothing, Nothing, Nothing, SparseArrays.SparseMatrixCSC{Bool, Int64}, Nothing, Nothing, Nothing, Nothing, typeof(SciMLBase.DEFAULT_OBSERVED), Nothing}, OrdinaryDiffEq.DABDF2Cache{Vector{Float64}, Vector{Float64}, Vector{Float64}, OrdinaryDiffEq.NLSolver{NLNewton{Rational{Int64}, Rational{Int64}, Rational{Int64}}, true, Vector{Float64}, Rational{Int64}, Nothing, Float64, OrdinaryDiffEq.NLNewtonCache{Vector{Float64}, Float64, Float64, Vector{Float64}, Matrix{Float64}, Matrix{Float64}, Nothing, Nothing, LinearSolve.LinearCache{Matrix{Float64}, Vector{Float64}, Vector{Float64}, SciMLBase.NullParameters, Nothing, LU{Float64, Matrix{Float64}}, LinearSolve.InvPreconditioner{Diagonal{Float64, Vector{Float64}}}, Diagonal{Float64, Vector{Float64}}, Float64}}}, Float64}, OrdinaryDiffEq.DEOptions{Float64, Float64, Float64, Float64, PIController{Rational{Int64}}, typeof(DiffEqBase.ODE_DEFAULT_NORM), typeof(opnorm), Nothing, CallbackSet{Tuple{}, Tuple{}}, typeof(DiffEqBase.ODE_DEFAULT_ISOUTOFDOMAIN), typeof(DiffEqBase.ODE_DEFAULT_PROG_MESSAGE), typeof(DiffEqBase.ODE_DEFAULT_UNSTABLE_CHECK), DataStructures.BinaryHeap{Float64, DataStructures.FasterForward}, DataStructures.BinaryHeap{Float64, DataStructures.FasterForward}, Nothing, Nothing, Int64, Tuple{}, Tuple{}, Tuple{}}, Vector{Float64}, Float64, Nothing, OrdinaryDiffEq.DefaultInit}, cache::OrdinaryDiffEq.DImplicitEulerCache{Vector{Float64}, Vector{Float64}, Vector{Float64}, OrdinaryDiffEq.NLSolver{NLNewton{Rational{Int64}, Rational{Int64}, Rational{Int64}}, true, Vector{Float64}, Rational{Int64}, Nothing, Float64, OrdinaryDiffEq.NLNewtonCache{Vector{Float64}, Float64, Float64, Vector{Float64}, Matrix{Float64}, Matrix{Float64}, Nothing, Nothing, LinearSolve.LinearCache{Matrix{Float64}, Vector{Float64}, Vector{Float64}, SciMLBase.NullParameters, Nothing, LU{Float64, Matrix{Float64}}, LinearSolve.InvPreconditioner{Diagonal{Float64, Vector{Float64}}}, Diagonal{Float64, Vector{Float64}}, Float64}}}}, repeat_step::Bool)
      @ OrdinaryDiffEq ~/.julia/packages/OrdinaryDiffEq/iOlmD/src/perform_step/dae_perform_step.jl:65
    [6] perform_step!(integrator::OrdinaryDiffEq.ODEIntegrator{DABDF2{12, true, Nothing, NLNewton{Rational{Int64}, Rational{Int64}, Rational{Int64}}, typeof(OrdinaryDiffEq.DEFAULT_PRECS), Val{:forward}, true, nothing}, true, Vector{Float64}, Vector{Float64}, Float64, Tuple{var"#103#105"{Int64}, Dict{Int64, DistributedLoads{Float64}}, Dict{Int64, Vector{PointMass{Float64}}}, StaticArrays.SVector{3, Float64}, StaticArrays.SVector{3, Float64}, StaticArrays.SVector{3, Float64}, StaticArrays.SVector{3, Float64}, StaticArrays.SVector{3, Float64}, StaticArrays.SVector{3, Float64}}, Float64, Float64, Float64, Float64, Vector{Vector{Float64}}, DAESolution{Float64, 2, Vector{Vector{Float64}}, Nothing, Nothing, Nothing, Vector{Float64}, DAEProblem{Vector{Float64}, Vector{Float64}, Tuple{Float64, Float64}, true, Tuple{var"#103#105"{Int64}, Dict{Int64, DistributedLoads{Float64}}, Dict{Int64, Vector{PointMass{Float64}}}, StaticArrays.SVector{3, Float64}, StaticArrays.SVector{3, Float64}, StaticArrays.SVector{3, Float64}, StaticArrays.SVector{3, Float64}, StaticArrays.SVector{3, Float64}, StaticArrays.SVector{3, Float64}}, DAEFunction{true, GXBeam.var"#299#301"{Assembly{Float64, Vector{Vector{Float64}}, UnitRange{Int64}, Vector{GXBeam.Element{Float64}}}, Float64, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}}, Nothing, Nothing, GXBeam.var"#300#302"{Assembly{Float64, Vector{Vector{Float64}}, UnitRange{Int64}, Vector{GXBeam.Element{Float64}}}, Float64, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}}, Nothing, Nothing, Nothing, SparseArrays.SparseMatrixCSC{Bool, Int64}, Nothing, Nothing, Nothing, Nothing, typeof(SciMLBase.DEFAULT_OBSERVED), Nothing}, Base.Pairs{Symbol, Union{}, Tuple{}, NamedTuple{(), Tuple{}}}, Vector{Bool}}, DABDF2{12, true, Nothing, NLNewton{Rational{Int64}, Rational{Int64}, Rational{Int64}}, typeof(OrdinaryDiffEq.DEFAULT_PRECS), Val{:forward}, true, nothing}, OrdinaryDiffEq.InterpolationData{DAEFunction{true, GXBeam.var"#299#301"{Assembly{Float64, Vector{Vector{Float64}}, UnitRange{Int64}, Vector{GXBeam.Element{Float64}}}, Float64, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}}, Nothing, Nothing, GXBeam.var"#300#302"{Assembly{Float64, Vector{Vector{Float64}}, UnitRange{Int64}, Vector{GXBeam.Element{Float64}}}, Float64, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}}, Nothing, Nothing, Nothing, SparseArrays.SparseMatrixCSC{Bool, Int64}, Nothing, Nothing, Nothing, Nothing, typeof(SciMLBase.DEFAULT_OBSERVED), Nothing}, Vector{Vector{Float64}}, Vector{Float64}, Vector{Vector{Vector{Float64}}}, OrdinaryDiffEq.DABDF2Cache{Vector{Float64}, Vector{Float64}, Vector{Float64}, OrdinaryDiffEq.NLSolver{NLNewton{Rational{Int64}, Rational{Int64}, Rational{Int64}}, true, Vector{Float64}, Rational{Int64}, Nothing, Float64, OrdinaryDiffEq.NLNewtonCache{Vector{Float64}, Float64, Float64, Vector{Float64}, Matrix{Float64}, Matrix{Float64}, Nothing, Nothing, LinearSolve.LinearCache{Matrix{Float64}, Vector{Float64}, Vector{Float64}, SciMLBase.NullParameters, Nothing, LU{Float64, Matrix{Float64}}, LinearSolve.InvPreconditioner{Diagonal{Float64, Vector{Float64}}}, Diagonal{Float64, Vector{Float64}}, Float64}}}, Float64}}, DiffEqBase.DEStats}, DAEFunction{true, GXBeam.var"#299#301"{Assembly{Float64, Vector{Vector{Float64}}, UnitRange{Int64}, Vector{GXBeam.Element{Float64}}}, Float64, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}}, Nothing, Nothing, GXBeam.var"#300#302"{Assembly{Float64, Vector{Vector{Float64}}, UnitRange{Int64}, Vector{GXBeam.Element{Float64}}}, Float64, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}}, Nothing, Nothing, Nothing, SparseArrays.SparseMatrixCSC{Bool, Int64}, Nothing, Nothing, Nothing, Nothing, typeof(SciMLBase.DEFAULT_OBSERVED), Nothing}, OrdinaryDiffEq.DABDF2Cache{Vector{Float64}, Vector{Float64}, Vector{Float64}, OrdinaryDiffEq.NLSolver{NLNewton{Rational{Int64}, Rational{Int64}, Rational{Int64}}, true, Vector{Float64}, Rational{Int64}, Nothing, Float64, OrdinaryDiffEq.NLNewtonCache{Vector{Float64}, Float64, Float64, Vector{Float64}, Matrix{Float64}, Matrix{Float64}, Nothing, Nothing, LinearSolve.LinearCache{Matrix{Float64}, Vector{Float64}, Vector{Float64}, SciMLBase.NullParameters, Nothing, LU{Float64, Matrix{Float64}}, LinearSolve.InvPreconditioner{Diagonal{Float64, Vector{Float64}}}, Diagonal{Float64, Vector{Float64}}, Float64}}}, Float64}, OrdinaryDiffEq.DEOptions{Float64, Float64, Float64, Float64, PIController{Rational{Int64}}, typeof(DiffEqBase.ODE_DEFAULT_NORM), typeof(opnorm), Nothing, CallbackSet{Tuple{}, Tuple{}}, typeof(DiffEqBase.ODE_DEFAULT_ISOUTOFDOMAIN), typeof(DiffEqBase.ODE_DEFAULT_PROG_MESSAGE), typeof(DiffEqBase.ODE_DEFAULT_UNSTABLE_CHECK), DataStructures.BinaryHeap{Float64, DataStructures.FasterForward}, DataStructures.BinaryHeap{Float64, DataStructures.FasterForward}, Nothing, Nothing, Int64, Tuple{}, Tuple{}, Tuple{}}, Vector{Float64}, Float64, Nothing, OrdinaryDiffEq.DefaultInit}, cache::OrdinaryDiffEq.DABDF2Cache{Vector{Float64}, Vector{Float64}, Vector{Float64}, OrdinaryDiffEq.NLSolver{NLNewton{Rational{Int64}, Rational{Int64}, Rational{Int64}}, true, Vector{Float64}, Rational{Int64}, Nothing, Float64, OrdinaryDiffEq.NLNewtonCache{Vector{Float64}, Float64, Float64, Vector{Float64}, Matrix{Float64}, Matrix{Float64}, Nothing, Nothing, LinearSolve.LinearCache{Matrix{Float64}, Vector{Float64}, Vector{Float64}, SciMLBase.NullParameters, Nothing, LU{Float64, Matrix{Float64}}, LinearSolve.InvPreconditioner{Diagonal{Float64, Vector{Float64}}}, Diagonal{Float64, Vector{Float64}}, Float64}}}, Float64}, repeat_step::Bool)
      @ OrdinaryDiffEq ~/.julia/packages/OrdinaryDiffEq/iOlmD/src/perform_step/dae_perform_step.jl:175
    [7] perform_step!
      @ ~/.julia/packages/OrdinaryDiffEq/iOlmD/src/perform_step/dae_perform_step.jl:168 [inlined]
    [8] solve!(integrator::OrdinaryDiffEq.ODEIntegrator{DABDF2{12, true, Nothing, NLNewton{Rational{Int64}, Rational{Int64}, Rational{Int64}}, typeof(OrdinaryDiffEq.DEFAULT_PRECS), Val{:forward}, true, nothing}, true, Vector{Float64}, Vector{Float64}, Float64, Tuple{var"#103#105"{Int64}, Dict{Int64, DistributedLoads{Float64}}, Dict{Int64, Vector{PointMass{Float64}}}, StaticArrays.SVector{3, Float64}, StaticArrays.SVector{3, Float64}, StaticArrays.SVector{3, Float64}, StaticArrays.SVector{3, Float64}, StaticArrays.SVector{3, Float64}, StaticArrays.SVector{3, Float64}}, Float64, Float64, Float64, Float64, Vector{Vector{Float64}}, DAESolution{Float64, 2, Vector{Vector{Float64}}, Nothing, Nothing, Nothing, Vector{Float64}, DAEProblem{Vector{Float64}, Vector{Float64}, Tuple{Float64, Float64}, true, Tuple{var"#103#105"{Int64}, Dict{Int64, DistributedLoads{Float64}}, Dict{Int64, Vector{PointMass{Float64}}}, StaticArrays.SVector{3, Float64}, StaticArrays.SVector{3, Float64}, StaticArrays.SVector{3, Float64}, StaticArrays.SVector{3, Float64}, StaticArrays.SVector{3, Float64}, StaticArrays.SVector{3, Float64}}, DAEFunction{true, GXBeam.var"#299#301"{Assembly{Float64, Vector{Vector{Float64}}, UnitRange{Int64}, Vector{GXBeam.Element{Float64}}}, Float64, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}}, Nothing, Nothing, GXBeam.var"#300#302"{Assembly{Float64, Vector{Vector{Float64}}, UnitRange{Int64}, Vector{GXBeam.Element{Float64}}}, Float64, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}}, Nothing, Nothing, Nothing, SparseArrays.SparseMatrixCSC{Bool, Int64}, Nothing, Nothing, Nothing, Nothing, typeof(SciMLBase.DEFAULT_OBSERVED), Nothing}, Base.Pairs{Symbol, Union{}, Tuple{}, NamedTuple{(), Tuple{}}}, Vector{Bool}}, DABDF2{12, true, Nothing, NLNewton{Rational{Int64}, Rational{Int64}, Rational{Int64}}, typeof(OrdinaryDiffEq.DEFAULT_PRECS), Val{:forward}, true, nothing}, OrdinaryDiffEq.InterpolationData{DAEFunction{true, GXBeam.var"#299#301"{Assembly{Float64, Vector{Vector{Float64}}, UnitRange{Int64}, Vector{GXBeam.Element{Float64}}}, Float64, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}}, Nothing, Nothing, GXBeam.var"#300#302"{Assembly{Float64, Vector{Vector{Float64}}, UnitRange{Int64}, Vector{GXBeam.Element{Float64}}}, Float64, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}}, Nothing, Nothing, Nothing, SparseArrays.SparseMatrixCSC{Bool, Int64}, Nothing, Nothing, Nothing, Nothing, typeof(SciMLBase.DEFAULT_OBSERVED), Nothing}, Vector{Vector{Float64}}, Vector{Float64}, Vector{Vector{Vector{Float64}}}, OrdinaryDiffEq.DABDF2Cache{Vector{Float64}, Vector{Float64}, Vector{Float64}, OrdinaryDiffEq.NLSolver{NLNewton{Rational{Int64}, Rational{Int64}, Rational{Int64}}, true, Vector{Float64}, Rational{Int64}, Nothing, Float64, OrdinaryDiffEq.NLNewtonCache{Vector{Float64}, Float64, Float64, Vector{Float64}, Matrix{Float64}, Matrix{Float64}, Nothing, Nothing, LinearSolve.LinearCache{Matrix{Float64}, Vector{Float64}, Vector{Float64}, SciMLBase.NullParameters, Nothing, LU{Float64, Matrix{Float64}}, LinearSolve.InvPreconditioner{Diagonal{Float64, Vector{Float64}}}, Diagonal{Float64, Vector{Float64}}, Float64}}}, Float64}}, DiffEqBase.DEStats}, DAEFunction{true, GXBeam.var"#299#301"{Assembly{Float64, Vector{Vector{Float64}}, UnitRange{Int64}, Vector{GXBeam.Element{Float64}}}, Float64, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}}, Nothing, Nothing, GXBeam.var"#300#302"{Assembly{Float64, Vector{Vector{Float64}}, UnitRange{Int64}, Vector{GXBeam.Element{Float64}}}, Float64, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}}, Nothing, Nothing, Nothing, SparseArrays.SparseMatrixCSC{Bool, Int64}, Nothing, Nothing, Nothing, Nothing, typeof(SciMLBase.DEFAULT_OBSERVED), Nothing}, OrdinaryDiffEq.DABDF2Cache{Vector{Float64}, Vector{Float64}, Vector{Float64}, OrdinaryDiffEq.NLSolver{NLNewton{Rational{Int64}, Rational{Int64}, Rational{Int64}}, true, Vector{Float64}, Rational{Int64}, Nothing, Float64, OrdinaryDiffEq.NLNewtonCache{Vector{Float64}, Float64, Float64, Vector{Float64}, Matrix{Float64}, Matrix{Float64}, Nothing, Nothing, LinearSolve.LinearCache{Matrix{Float64}, Vector{Float64}, Vector{Float64}, SciMLBase.NullParameters, Nothing, LU{Float64, Matrix{Float64}}, LinearSolve.InvPreconditioner{Diagonal{Float64, Vector{Float64}}}, Diagonal{Float64, Vector{Float64}}, Float64}}}, Float64}, OrdinaryDiffEq.DEOptions{Float64, Float64, Float64, Float64, PIController{Rational{Int64}}, typeof(DiffEqBase.ODE_DEFAULT_NORM), typeof(opnorm), Nothing, CallbackSet{Tuple{}, Tuple{}}, typeof(DiffEqBase.ODE_DEFAULT_ISOUTOFDOMAIN), typeof(DiffEqBase.ODE_DEFAULT_PROG_MESSAGE), typeof(DiffEqBase.ODE_DEFAULT_UNSTABLE_CHECK), DataStructures.BinaryHeap{Float64, DataStructures.FasterForward}, DataStructures.BinaryHeap{Float64, DataStructures.FasterForward}, Nothing, Nothing, Int64, Tuple{}, Tuple{}, Tuple{}}, Vector{Float64}, Float64, Nothing, OrdinaryDiffEq.DefaultInit})
      @ OrdinaryDiffEq ~/.julia/packages/OrdinaryDiffEq/iOlmD/src/solve.jl:478
    [9] #__solve#498
      @ ~/.julia/packages/OrdinaryDiffEq/iOlmD/src/solve.jl:5 [inlined]
   [10] __solve
      @ ~/.julia/packages/OrdinaryDiffEq/iOlmD/src/solve.jl:4 [inlined]
   [11] #solve_call#37
      @ ~/.julia/packages/DiffEqBase/uclGA/src/solve.jl:61 [inlined]
   [12] solve_call(_prob::DAEProblem{Vector{Float64}, Vector{Float64}, Tuple{Float64, Float64}, true, Tuple{var"#103#105"{Int64}, Dict{Int64, DistributedLoads{Float64}}, Dict{Int64, Vector{PointMass{Float64}}}, StaticArrays.SVector{3, Float64}, StaticArrays.SVector{3, Float64}, StaticArrays.SVector{3, Float64}, StaticArrays.SVector{3, Float64}, StaticArrays.SVector{3, Float64}, StaticArrays.SVector{3, Float64}}, DAEFunction{true, GXBeam.var"#299#301"{Assembly{Float64, Vector{Vector{Float64}}, UnitRange{Int64}, Vector{GXBeam.Element{Float64}}}, Float64, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}}, Nothing, Nothing, GXBeam.var"#300#302"{Assembly{Float64, Vector{Vector{Float64}}, UnitRange{Int64}, Vector{GXBeam.Element{Float64}}}, Float64, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}}, Nothing, Nothing, Nothing, SparseArrays.SparseMatrixCSC{Bool, Int64}, Nothing, Nothing, Nothing, Nothing, typeof(SciMLBase.DEFAULT_OBSERVED), Nothing}, Base.Pairs{Symbol, Union{}, Tuple{}, NamedTuple{(), Tuple{}}}, Vector{Bool}}, args::DABDF2{12, true, Nothing, NLNewton{Rational{Int64}, Rational{Int64}, Rational{Int64}}, typeof(OrdinaryDiffEq.DEFAULT_PRECS), Val{:forward}, true, nothing})
      @ DiffEqBase ~/.julia/packages/DiffEqBase/uclGA/src/solve.jl:48
   [13] solve_up(prob::DAEProblem{Vector{Float64}, Vector{Float64}, Tuple{Float64, Float64}, true, Tuple{var"#103#105"{Int64}, Dict{Int64, DistributedLoads{Float64}}, Dict{Int64, Vector{PointMass{Float64}}}, StaticArrays.SVector{3, Float64}, StaticArrays.SVector{3, Float64}, StaticArrays.SVector{3, Float64}, StaticArrays.SVector{3, Float64}, StaticArrays.SVector{3, Float64}, StaticArrays.SVector{3, Float64}}, DAEFunction{true, GXBeam.var"#299#301"{Assembly{Float64, Vector{Vector{Float64}}, UnitRange{Int64}, Vector{GXBeam.Element{Float64}}}, Float64, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}}, Nothing, Nothing, GXBeam.var"#300#302"{Assembly{Float64, Vector{Vector{Float64}}, UnitRange{Int64}, Vector{GXBeam.Element{Float64}}}, Float64, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}}, Nothing, Nothing, Nothing, SparseArrays.SparseMatrixCSC{Bool, Int64}, Nothing, Nothing, Nothing, Nothing, typeof(SciMLBase.DEFAULT_OBSERVED), Nothing}, Base.Pairs{Symbol, Union{}, Tuple{}, NamedTuple{(), Tuple{}}}, Vector{Bool}}, sensealg::Nothing, u0::Vector{Float64}, p::Tuple{var"#103#105"{Int64}, Dict{Int64, DistributedLoads{Float64}}, Dict{Int64, Vector{PointMass{Float64}}}, StaticArrays.SVector{3, Float64}, StaticArrays.SVector{3, Float64}, StaticArrays.SVector{3, Float64}, StaticArrays.SVector{3, Float64}, StaticArrays.SVector{3, Float64}, StaticArrays.SVector{3, Float64}}, args::DABDF2{0, true, Nothing, NLNewton{Rational{Int64}, Rational{Int64}, Rational{Int64}}, typeof(OrdinaryDiffEq.DEFAULT_PRECS), Val{:forward}, true, nothing}; kwargs::Base.Pairs{Symbol, Union{}, Tuple{}, NamedTuple{(), Tuple{}}})
      @ DiffEqBase ~/.julia/packages/DiffEqBase/uclGA/src/solve.jl:87
   [14] solve_up
      @ ~/.julia/packages/DiffEqBase/uclGA/src/solve.jl:78 [inlined]
   [15] #solve#38
      @ ~/.julia/packages/DiffEqBase/uclGA/src/solve.jl:73 [inlined]
   [16] solve(prob::DAEProblem{Vector{Float64}, Vector{Float64}, Tuple{Float64, Float64}, true, Tuple{var"#103#105"{Int64}, Dict{Int64, DistributedLoads{Float64}}, Dict{Int64, Vector{PointMass{Float64}}}, StaticArrays.SVector{3, Float64}, StaticArrays.SVector{3, Float64}, StaticArrays.SVector{3, Float64}, StaticArrays.SVector{3, Float64}, StaticArrays.SVector{3, Float64}, StaticArrays.SVector{3, Float64}}, DAEFunction{true, GXBeam.var"#299#301"{Assembly{Float64, Vector{Vector{Float64}}, UnitRange{Int64}, Vector{GXBeam.Element{Float64}}}, Float64, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}}, Nothing, Nothing, GXBeam.var"#300#302"{Assembly{Float64, Vector{Vector{Float64}}, UnitRange{Int64}, Vector{GXBeam.Element{Float64}}}, Float64, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}, Vector{Int64}}, Nothing, Nothing, Nothing, SparseArrays.SparseMatrixCSC{Bool, Int64}, Nothing, Nothing, Nothing, Nothing, typeof(SciMLBase.DEFAULT_OBSERVED), Nothing}, Base.Pairs{Symbol, Union{}, Tuple{}, NamedTuple{(), Tuple{}}}, Vector{Bool}}, args::DABDF2{0, true, Nothing, NLNewton{Rational{Int64}, Rational{Int64}, Rational{Int64}}, typeof(OrdinaryDiffEq.DEFAULT_PRECS), Val{:forward}, true, nothing})
      @ DiffEqBase ~/.julia/packages/DiffEqBase/uclGA/src/solve.jl:68
   [17] macro expansion
      @ ~/.julia/packages/GXBeam/S8Yc6/test/runtests.jl:1206 [inlined]
   [18] macro expansion
      @ ~/julia/share/julia/stdlib/v1.7/Test/src/Test.jl:1283 [inlined]
   [19] top-level scope
      @ ~/.julia/packages/GXBeam/S8Yc6/test/runtests.jl:1141
   [20] include(fname::String)
      @ Base.MainInclude ./client.jl:451
   [21] top-level scope
      @ none:6
   [22] eval
      @ ./boot.jl:373 [inlined]
   [23] exec_options(opts::Base.JLOptions)
      @ Base ./client.jl:268
   [24] _start()
      @ Base ./client.jl:495
Test Summary:         | Fail  Error  Total
DifferentialEquations |    1      1      2
ERROR: LoadError: Some tests did not pass: 0 passed, 1 failed, 1 errored, 0 broken.
in expression starting at /home/kevin/.julia/packages/GXBeam/S8Yc6/test/runtests.jl:1139
ERROR: Package GXBeam errored during testing

TagBot trigger issue

This issue is used to trigger TagBot; feel free to unsubscribe.

If you haven't already, you should update your TagBot.yml to include issue comment triggers.
Please see this post on Discourse for instructions and more details.

If you'd like for me to do this for you, comment TagBot fix on this issue.
I'll open a PR within a few hours, please be patient!

Beam length non conserved in Linear time_domain_analysis

A simple example of a beam of uniform cross-section area undergoing a transverse point force at its end while being clamped at the other end (where only flexion dof are free) reveals that the beam length increases with time. Its longitudinal deflection stays at zero at every s coordinate regardless of the transverse deflections.

This does not occur with the non-linear solver.

Solving the `tipmoment` example with DifferentialEquations.jl

Hi and thanks for an interesting package!
I'm interested in trying out the interface with DifferentialEquations.jl on the tipmoment example.
My code is shown below. It doesn't converge. I was wondering if I'm making any obvious mistake here.
I'm very new to GXBeam.jl

using GXBeam
using LinearAlgebra
using DifferentialEquations

L = 12 # inches
h = w = 1 # inches
E = 30e6 # lb/in^4 Young's Modulus

A = h * w
Iyy = w * h^3 / 12
Izz = w^3 * h / 12

# bending moment (applied at end)
# note that solutions for λ > 1.8 do not converge
λ = 0.4
m = pi * E * Iyy / L
M = λ * m

# create points
nelem = 16
x = range(0, L, length=nelem + 1)
y = zero(x)
z = zero(x)
points = [[x[i], y[i], z[i]] for i in axes(x, 1)]

# index of endpoints for each beam element
start = 1:nelem
stop = 2:nelem+1

# compliance matrix for each beam element
# ones on the diagonal so that the matrix can be inverted, needed for DifferentialEquations
compliance = fill(Diagonal([1 / (E * A), 1.0, 1.0, 1.0, 1 / (E * Iyy), 1 / (E * Izz)]), nelem)

# mass matrix for each beam element added for DifferentialEquations
ρ = 287 # Approximate density of steel

mass = fill(Diagonal([ρ * A, ρ * A, ρ * A, 2 * ρ * Iyy, ρ * Iyy, ρ * Iyy]), nelem)

# create assembly of interconnected nonlinear beams
assembly = Assembly(points, start, stop, compliance=compliance, mass=mass)

tspan = (0.0, 1.0)

# create dictionary of prescribed conditions
prescribed_conditions = Dict(
    # fixed left side
    1 => PrescribedConditions(ux=0, uy=0, uz=0, theta_x=0, theta_y=0, theta_z=0),
    # moment on right side
    nelem + 1 => PrescribedConditions(Mz=M)
)

# define named tuple with parameters
p = (; prescribed_conditions)

# run initial condition analysis to get consistent set of initial conditions
system, converged = initial_condition_analysis(assembly, tspan[1];
    prescribed_conditions=prescribed_conditions,
    constant_mass_matrix=false,
    structural_damping=true)

# construct DAEProblem
prob = DAEProblem(system, assembly, tspan, p;
    structural_damping=true)

# solve DAEProblem
@time sol = solve(prob, DABDF2(), saveat=[tspan[2]])
sol.retcode

The solver does not converge, instead I get:

┌ Warning: dt(2.220446049250313e-16) <= dtmin(2.220446049250313e-16) at t=1.0e-6. Aborting. There is either an error in your model specification or the true solution is unstable.

Bug when layup does not include webs

Perhaps I'm defining my "webs" wrong in this case, but if I try using the following inputs
webs = []
webloc = []

this leads to the TF type in line 673 of section.jl to be Any, which throws off calculations later on. That type changes from Float64 to Any in line 851 of afmesh.jl, when calling the addwebs method.

Rotation angle

Hi,

First I'd like to say that I really appreciate the work you guys put into this package, great stuff, great initiative on making it open source.

While comparing the results with some of the literature cases on geometrically exact beams, I found that the nodal rotation angles were a little off. For instance, in the example Nonlinear Analysis of a Cantilever Subjected to a Constant Moment, the rotation angle theta_y should vary linearly with the load factor lambda, but it doesn't in the program.

After some research, realized that the rotation parameters, and not the rotation angles, were being output in the functions extract_point_states! and extract_element_state., check e.g. equation 10 of your Ref. [2].

The solution is simple though, just make phi = 4*atan(theta/4), and output phi instead of theta as the rotation angles of the cross-section. In the attached figure, phi is the rotation angle and theta is the rotation parameter for the aforementioned example.

I tried to make the correction on a fork and set a pull request, but I am apparently too much of a noob in Julia even to do just that!

[2] Wang, Q., & Yu, W. (2017). Geometrically nonlinear analysis of composite beams using Wiener-Milenković parameters. Journal of Renewable and Sustainable Energy, 9(3), 033306.

example

pointmass is less stable than mass

Hi, Taylor.
Your fix for time_domain_analysis using the new pointmass (#71) seems to work at first, but I started running some cases and I noticed it is much more unstable than using mass.
It will be hard for me to give you a MWE because for simple cases it works. However, when running FSI on a flexible wing with pointmass, the solver diverges (or, more accurately, fails to converge) once the deflections become large, even if I reduce the timestep a lot. When I switch to mass, the solver is very stable again.
Both approaches give me quite similar results with eigenvalue_analysis, so I don't think it's a setup issue. Also the deflections look very similar with time_domain_analysis, before the solver diverges.
I'd rather use the pointmass approach, as I have lumped mass info for my model and that is slightly more accurate than using mass. But if this is very hard to fix, then I'll stick to mass.
Let me know if there's something I can do on my end to diagnose what is going on. I can compare the two cases at the point where one diverges and provide you with whatever info can be useful.
Thanks a lot!

Literature review

I think it would be worthwhile to mention that geometrically exact beam theory has been dealt with in many more publications than are listed in the introduction. For instance, Simo et al., Betsch et al., ... It is a big topic.

Eigen analysis of deflected beam?

Hi, Taylor.
Can you advise on how to calculate the modal properties of a wing during a time_domain_analysis?
Say a beam is vibrating and I'd like to do eigenvalue_analysis to see its eigenmodes and frequencies at different deflections. I'm not sure this is possible at the moment.
Thanks a lot!

Performance

Your package makes a high-performance claim. How can a user verify this?

Add Non-Rigid Joints

This package currently only allows rigid connections. A nice feature would be expand this to allow other types of joints. My thoughts for making this happen is to introduce a new type JointAssembly which combines two or more Assembly objects with some joints. Then we can dispatch on the JointAssembly in a special manner to handle the joints. The theory for adding joints is covered in the paper on which this code is based.

Reduce overhead in default_force_scaling() causing extremely long run times for large systems

For large built-up structures (like the 34m VAWT example), the recent changes to default_force_scaling() are causing the System() setup call to become extremely slow on my mac. I have modified the force_scaling calculation so that it uses a fraction of the overhead - for the 34m VAWT case on my mac, it now runs in less than 3 seconds as opposed to ~20 minutes. Tests pass locally and I'm making a pull request now, but I'm sure there will be syntax/type changes you'd like to change.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.