VSP FEA Structure Build Errors

142 views
Skip to first unread message

Jacob Lee

unread,
Apr 8, 2025, 6:52:34 AMApr 8
to OpenVSP
Hi all,

I have been working on designing a supersonic aircraft's internal wing structure in VSP FEA. I have attached several pictures alongside the .vsp file. Currently, the following issues are occurring:

1) If I build and mesh the entire aircraft, I get alerted to several TriangleMesh errors and VSP crashes. To get around this I select "Generate Half-Mesh" from the mesh settings, but this throws a number of "IntExtCount Zero!" and "Bad Parameter in SurfCore:" errors. See attached image "errors1". Even with these errors, the half mesh does build.

2) If I export the halfmesh to CAD, I am greeted by numerous "Incomplete STEP Loop"/"Incomplete IGES Loop" messages. See "errors3" attachment. Is this due to the spars/ribs being limited to one of two wing sections? I heard this may throw errors all the way back in 2020, but was unsure if the problem had been fixed now.

Please let me know if you have any advice - I would really love to use the FEA Structure tools for my project.
Example1.png
SST_04-01.vsp3
Errors1.png
error3.png

Jacob Lee

unread,
Apr 9, 2025, 7:41:05 AMApr 9
to OpenVSP
Small update: I was able to get the surfcore errors and IntExtCount Zero! errors to disappear by making the meshing settings finer, but I am unable to still close the incomplete loops when exporting to CAD. Is anyone familiar with how to fix these problems? Is it solely related to me using sectioned spars?

skyc...@gmail.com

unread,
Apr 9, 2025, 11:50:08 PMApr 9
to OpenVSP
What program are you trying to use for the FEA part?  If you're mesh is solving without any obvious errors, and you have a pre-post processor, I'd recommend pulling in the nastran-formatted mesh in, or the calculix (abaqus format) mesh, rather than messing with the CAD surfaces.  I've had mixed results with the CAD structures surfaces, but have been focusing on the FEM format outputs recently. 

jacob....@gmail.com

unread,
Apr 11, 2025, 6:17:45 PMApr 11
to OpenVSP
Hey sky, I was hoping you'd respond since I've seen you posting quite a bit with VSP structures.

I'm hoping to eventually export to SolidWorks and take the part directly into a skin shell that is already designed. An FEM format may work just fine for that, but ideally I'd like to mate the pieces together in an assembly, but I'm not sure how possible that is.

For now, I've spent the last few days trying to do an aero-structrual analysis through VSP and CCX and was hoping you'd have some suggestions. Most recently I've been getting a handful of 0 length beams which I've been cleaning up with a MATLAB script, but even with that I'm getting a whole lot of non positive Jacobian determinants. I have refined the mesh to the extent that I'm not sure further refinement will continue to help (see attached picture). VSPLoads is being run from my command line and is outputting a .static file.

I've attached a few pictures of my settings and the new updated model. I'd appreciate any feedback you could offer, this is my first time working with an FEA software.
New Structure.pngParts.pngMeshSettings.pngerrors.png
OpenVSPFinalAdjusted.vsp3

skyc...@gmail.com

unread,
Apr 11, 2025, 6:57:27 PMApr 11
to OpenVSP
Hi Jacob,

When you say take it into solidworks, are you hoping to do just the design work there, or trying to create a shell element model in Solidworks for structural analysis?

RE the Calculix beam jacobian issue.  This is something I've been meaning to talk with Rob about, as it was partially the reason I abandoned trying to use the built-in CCX tools for anything other than loads visualization.  The other reason is NASTRAN is more prevalent for monocoque or box structures with shell/beams, and Calculix isn't great at that.  I have a feeling that we've got something wrong with the beam definitions, perhaps the element normal orientations are aligned along the beam axis or something, that's causing the negative jacobians.  I haven't dug in to figure out the cause those.  I haven't gone into the .inp file and dug through to try and find the source of the problem. 

When I was exporting the trimmed or untrimmed structures surfaces, I was seeing that the internal structure is trimmed by the external structure but the skins are not split at the same intersection.  This would require a fair bit of surfacing work to fix in SW, so I'd start with the untrimmed surfaces if I were you and do the surfacing work in SW based on those.  SW is not super happy with the splined aero surface skins, in my experience, but that may not be the case for you.  The result, it can be done, but the surfaces aren't a really great place to start, and often I use it more as a guide for locating airfoils and then extruding my own surfaces, etc.  This is specific to Solidworks, experience with other CAD may very as SW is not the best surfacing tool ever. 

If you want a primer, take a look at Rob and I's powerpoint slide decks from the last two (2023 and 2024) OpenVSP workshops (2023 workshop, 2024 workshop).  I run through some of my workflow using open source tools (also paid tools) so you can get a feel for what I've been doing.  My current workflow is OpenVSP -> PyNastran GUI -> Mystran -> PyNastran GUI.  I would say it's 70% functional using open source solvers that don't clean up after you, maybe 90% functional using something like FEMAP that will clean up your model when you import it, and I'm still finding things that we're working on in the structures formulation.  

I've been more heavily invested in fixing bugs in the Nastran output than the Calculix one, so it might be more stable.   It is still a work in progress (the structures module), and at this point it still requires a bit of work at the .inp or .dat file before you get everything up and running.  A few of the hiccups I've been having I've been meaning to send to Rob here for the next update, specifically with material and property definitions in Nastran (no transverse shear being defined, which Mystran defaults to zero and then you are building your airplane out of weak rubber bands). 

I know that isn't specific help, but take a look and let me know if you'd be up for switching to the Nastran stuff, and we can talk that.  If you want to continue CCX, I can help too but it's a bit on the side for me so I may be a bit slower.

jacob....@gmail.com

unread,
Apr 12, 2025, 5:55:06 AMApr 12
to OpenVSP
I will try and see what an export to SolidWorks looks like greater - it is purely a visualization tool for us, not analysis.

I am actively going to try the PyNastran workflow you posted above this morning and will update with results. Thanks for your help!

jacob....@gmail.com

unread,
Apr 12, 2025, 8:13:55 AMApr 12
to OpenVSP
Hey Sky,

While I've had some progress with Nastran, I am struggling to see how I could possibly mimic aero loading in the way that Calculix should have if it worked operationally. I've looked through the presentations and am not sure how to fit that next piece into the puzzle...

Is this still something that's easily done? I was hoping the aerostructural analysis in OpenVSP would work since it wasn't overly involved.

skyc...@gmail.com

unread,
Apr 12, 2025, 10:56:21 AMApr 12
to OpenVSP
Hi Jacob,

I've been using the Aero-structural coupling program to generate the aero loading onto the FEM, which it only does to the calculix input deck.  I then am using a Python script with PyNastran to parse the calculix deck, reading in the Nastran deck with PyNastran, I then pull out the P1 pressure distributions from the calcuix deck, and then create equivalent PLOAD2 cards in the Nastran deck and write that out.  Here's the Python script I've been using:


import csv
from pyNastran.bdf.bdf import BDF

def transfer_loads(calc_file, input_file, output_file, set_id):

    # Create an instance of the BDF class and read the input file
    model = BDF()
    model.read_bdf(input_file)

    with open(calc_file, newline='') as csv_file:
        reader = csv.reader(csv_file)
        calculist = list(reader)

        for row in calculist:

            # Loop through all the rows of the calculix input looking for P1 pressure cards
            if len(row) >= 2:
                if row[1] == ' P1':
                    # Create the PLOAD2 card and add it to the model
                    # Convert string data from csv to integer for element ID and float for pressure
                    ele_id = int(row[0])
                    press = float(row[2])
                    pload2_card = model.add_pload2(set_id, press, [ele_id])

                    # Optionally, print the PLOAD2 card to verify
                    # print(pload2_card)

        # Write the updated model to a new file
        model.write_bdf(output_file)

        print(f'Updated input deck with PLOAD2 card written to {output_file}')

skyc...@gmail.com

unread,
Apr 12, 2025, 11:00:11 AMApr 12
to OpenVSP
There are a few other fixes I need to clean up the Nastran deck so that it runs in Mystran.  Here's the script I use for that:

# This script fixes the PSHELL properties by adding transverse shear properties based on the 12 shear
# properties.  Also add the appropriate transverse shear material properties to any materials that
# don't have them by just setting it equal to the in-plane shear property.  This is not quite right,
# but the real fix should be in OpenVSP, not here.
#
# it also adds SPCs because they're not getting exported, and deletes a few elements that have zero length


from pyNastran.bdf.bdf import BDF
from pyNastran.bdf.mesh_utils import remove_unused


def fixes(input_file, output_file):

    # Create a BDF object
    model = BDF()

    # Read the input Nastran BDF file without cross-referencing, so we can edit connectivity
    model.read_bdf(input_file, xref=False)

    # Clean out any unused nodes
    #model = remove_unused(input_file)

    # Loop through all property cards, modify all PSHELLs to include transverse shear and bending mids
    for prop in model.properties:

        if model.properties[prop].type == 'PSHELL':
            # If a PSHELL, copy the MID to the transverse shear and bending mids
            mid = model.properties[prop].mid1
            model.properties[prop].mid2 = mid
            model.properties[prop].mid3 = mid

    # Loop through all materials, copy shear12 to shear23 and shear13
    for matid in model.materials:

        if model.materials[matid].type == 'MAT8':
            # If a MAT8, copy the shear12 to the transverse shear directions
            shear = model.materials[matid].g12
            model.materials[matid].g1z = shear
            model.materials[matid].g2z = shear

    # Write the modified model to a new BDF file
    model.write_bdf(output_file)
    print(f'Model updated and saved to {output_file}')

skyc...@gmail.com

unread,
Apr 12, 2025, 11:03:24 AMApr 12
to OpenVSP
A quick note, both of these things should and likely will be implemented in OpenVSP and VSPAero at some point.  I haven't talked with Dave Kinney, but I was going to try and figure out how to suggest a change to VSPAero so that it generates loads on the calculix and the nastran input decks, and the second script really deals with stuff Rob and I need to correct in the material and property card formulations, that I just have been lazy about getting over to Rob for implementation. 

skyc...@gmail.com

unread,
Apr 17, 2025, 6:33:37 PMApr 17
to OpenVSP
One quick point, for Calculix, try unclicking the "Per-element beam normals" and see if the Jacobian errors go away.  note that this is more indicative of a fix we need to do than a way forward, as the beams will then all be oriented in the global axis system, I think. 

Thanks,
Bryan

skyc...@gmail.com

unread,
Apr 17, 2025, 6:37:04 PMApr 17
to OpenVSP
Per element beam normal vectors option is in the Mesh tab in the Structures dialog in VSP. 
Reply all
Reply to author
Forward
0 new messages