Thanks for your input Rob!I did finally figure out on my own that the UI must be set to Panel to open previous panel method analysis.The XSec insert commands do look like what I was looking for, I'll investigate how I can best use them.I'll see about adding a github issue for splitting a wing.Good to know about packaging. Having it be an official package would certainly be very convenient, but require a fully automated build process, yes. For now I just need to hack together a solution that pycharm can ideally install itself when loading the project from git. Maybe I can get this working, will report back.
I do have a couple more questions / issues I've come across in the meantime:- I have played around with the stall models, but the "Carlson Pressure Correlation" appears to be non-functional. With or without I'm able to get a C_L of almost 7 out of a NACA 3612 at 60° AoA, which really makes no sense at all. The C_L_max limiter does appear to work, but acquiring a value to insert is proving difficult. Our RFP mandates we use n_crit of 7, which is not readily available on airfoiltools.com to get a C_L_max from xfoil without having to build and write a whole python harness for that program too. Am I doing something wrong here that is preventing the Carlson Pressure Correlation from working or have I fundamentally misunderstood something?
- is it somehow possible to set the camera to a precise location as with the "adjust view" window in the GUI? I haven't found a function in the API that allows an input that isn't a fixed preset view.
- Does the API have any support for the VSPAERO Viewer? Ideally I'd like to show the user an aero view with pressures and wakes while the solver iterates through many different combinations of airfoils, etc. I haven't found any way to control the viewer beyond launching it manually on the command line for every result, with no GUI controls after.
- I have set vsp.SetDriverGroup(wing_id, 1, vsp.SPAN_WSECT_DRIVER, vsp.ROOTC_WSECT_DRIVER, vsp.TAPER_WSECT_DRIVER), but setting the Taper parameter appears to do nothing of value. I still can only set Root Chord, Span and Tip Chord and am unable to instead set Taper.
- OpenVSP appears to possess no ability to automatically trim an aircraft. Do you know of a good method to trim out an aircraft with ideally as few solver runs as possible? I specifically need to tune wing incidence angle and alpha to find a steady state with a target C_L and a C_M of zero. Getting down computation time is really important as we'll have to evaluate tens of thousands of aircraft configurations.
I think the reason most people prefer to build a model from scratch in code is that it feels more predictable. Everything is in one place in a python file and one doesn't have to also commit a vsp3 file to the git repository that might not play nice with git or might accidentally be touched / contain unforeseen changes the user didn't expect. Starting from a blank slate feels like the most stable way to me too.
I did also think about building a more object oriented wrapper myself and will likely end up at least doing part of that to allow my team to work with the API in a bit less error prone of a way and use Python Enums so one doesn't have to look at the docs to trace which part of the system a constant belongs to. What might make this a little bit more difficult (I think) is that there is no process to instantiate a vsp object, it is instead created as what I'd know as a static class in c# when importing. I wouldn't know how to create a second instance of the vsp object, or be sure which one I'm handling. And as most of the API works on a global state that is not a python object, but exists in the background, I'm concerned about e.g. two simultaneous uses while threading actually writing into the same global state.
The below turned out to be a bit more of a rant than I intended. What OpenVSP provides is still an amazing tool, and having an API at all has been a godsend compared to AVL or XFLR5. I do hope the below at least provides some pointers on where a new user (me) will stumble and get stuck when trying to use the API for the first time.My biggest issue with the Docs have not been the docs of the functions, but the lack of good and straightforward usage examples and best practices as well as awareness of the inner workings and pitfalls. It took me over two hours to finally find vsp.SetVSPAERORefWingID(wing_id) by sheer chance while CTRL+F searching through the docs. No code example I've been able to find has just worked when I ported it over, most of the time with really strange issues and no error thrown. The biggest thing haunting me by far is having missed an Update() in some key place, and suddenly the geometry solver produces complete mess of an output with no errors. The exported VSP file even looked perfectly fine when loaded in the GUI, but the solver just broke. This took hours to track down, and wasn't the only time a missing Update() haunted me.With all functions being global to the vsp object there's also no easy way to narrow down the search to the area I'm looking for, e.g. all functions related to the VSPAERO solver. Even just finding out that VSPAEROSweep is the method I need to use to run the solver, that I need to run the compGeom method before that and that I need to tell it about panel vs vortex lattice took hours and hours of searching code snippets buried in the google group and piecing them together with lots of trial and error.
> If you want to get clever, you can separate your design variables -- planform vs. camber/twist. The pitch derivatives should only depend on planform, while the intercept terms CL0 and CM0 will depend on planform and twist/camber. This will let you save a few VSPAERO evaluations if you can group your design variable changes appropriately. <We'll investigate this, as the relationship is hopefully linear enough, we may be able to get away with four solver runs, three untrimmed and one finally trimmed. Still not optimal time wise, but there isn't much more that can be done here. We may be able to set wake count really low though as our main wing is vertically offset to where they both receive effectively free-stream air at any reasonable angle of attack.
>A major new release of VSPAERO will come out soon (in the next 4-8 weeks hopefully). This version includes a total rewrite of the adjoint capability and will mark the first time that the adjoint will be easily available from the OpenVSP GUI. This will include adjoint calculation of the stability derivatives -- very efficiently.Later in the year, we hope to incorporate a trim solver and other improvements that leverage the adjoint capability.<That sounds really promising, I'll investigate that when the time comes. Unfortunately for now I need to have our solver running by Thursday, so this won't be able to benefit our current project
> I'm sorry you've had these struggles -- but I'm glad to hear that OpenVSP is useful to you despite them.This year, we're going to have the OpenVSP Workshop online again -- I encourage you to check out the past Workshop videos and the new Workshop when we do it (late summer / fall). The 2026 Workshop will be in-person again, if you can travel to join us, I think you'll find it is a very valuable experience.<Unfortunately in person will be tough, from Germany to the US is no easy feat. I would encourage you to try and record talks at that Workshop too, so at least those will be preserved for as long as possible. I've already checked out some of the previous year's slides and they have proven useful, though their information on how exactly to use the API has been sparse in what I looked at.
>I understand that not knowing when to Update() from the API is a real hassle.When interacting with the GUI, we can Update() after everything the user does. Users are very limited in that they only do one thing at a time. Update one parameter, see the result.However, from the API, a user might change 20 or 30 parameters before needing to do anything. If we automatically called Update() and re-lofted the Geometry after each time, performance would be disastrous. Our solution to this is to defer updates. We actually do this in the GUI, but in less visible ways. For example, when you load a *.vsp3 file, it may set 1000's or 10's of thousands of parameters. We wait until all that is done and only call Update() at the end. If we didn't, loading a *.vsp3 file would take minutes or hours...It is actually much more complex than this under the hood. Different parameters are triaged into different categories -- eg. those that change the position / orientation of a component vs. those that change the shape of a component. When a single Parm is changed, we may be able to perform a limited Update() -- if you just translate a component, then we don't re-loft the Bezier surfaces, we just update the transformation matrices. These optimizations have greatly sped up interactive OpenVSP, but they've been very difficult to get 100% correct and consistent since I started making these changes about five years ago... Fortunately, the fractional Update() should be totally invisible to all users.<Fractional update sounds like a solution to some of these annoyances. Though in my opinion manual updates are an okay solution, if then when and why is documented. At the moment functions are documented, but high level usage is not. That is what I am advocating for, a high level guide of the API, where to find what things, and what to watch out for. It would have saved me hours to have a short page telling me how I load, edit data, what the basic concepts of the API usage are and where I have to watch out for strange behavior. That along with a simple code example that does all usual steps a user might want to do from creation to reading result data would massively reduce the learning curve for the API.
At least the docs do help a good bit on their own too. Though for the first few hours I was working without those too as I did not find the link from https://openvsp.org/pyapi_docs/latest/ to https://openvsp.org/pyapi_docs/latest/openvsp.html which is hidden in the sidebar under a table of contents so I just dismissed the bottom one as part of that.
As a bit of a side note, is there any chance it would be possible to add a perspective view mode to OpenVSP? I actually did take a few hours to watch through most of the ground school a few years back and learned OpenVSP, but when I went to create my own design I was constantly getting so confused by the isometric rendering that I entirely stopped using it despite wanting to design some RC aircraft in it. For my brain at least, isometric renders are extremely hard to parse as there is no distance information included. It would make it a lot easier for me to use OpenVSP if there was a perspective render mode, it is way easier for my brain to parse.
It is certainly worth checking a fixed wake solution -- that will speed things up a good bit as well.VSPAERO as shipped is not really set up for super-detailed gradient based optimization studies. Some of VSPAERO's tolerances are set relatively coarsely -- they're fine if you're interested in engineering estimates of force and moment coefficients etc. However, if you're using a gradient based optimizer, it will likely want to take very small steps when calculating derivatives. The difference in solution between those cases will likely be smaller than the coarse default tolerances used by VSPAERO. This will cause the derivative information to be unreliable and will send a gradient based optimizer in the wrong direction.The next VSPAERO update will come with more knobs to tighten the tolerances to help this situation. The adjoint will also allow exact derivatives of certain things (but OpenVSP does not yet provide analytical derivatives).If you're doing more of a design space survey -- say a DOE to fit a metamodel of some sort -- you'll probably be fine.
Keep it in mind, we usually have international participation at the WorkshopUnless the Workshop venue is equipped to take care of recording and streaming in a way that does not interfere with the workshop, I'm not willing to take away from the in-person experience for recording. I understand that not everyone can travel -- and I appreciate the value of archiving the presentations to video so they can be accessed. Our compromise is to hold a virtual workshop every few years. Many of the Workshop presentations are repeated each year -- and the fundamentals don't change that quickly.
Have you looked at the example scripts that ship with OpenVSP? I know they are in *.vspscript instead of Python, but the API calls should match 1:1.
OpenVSP development is done by a very small team. The largest number of concurrent contributors we've ever had could be counted on one hand. Development work is generally sponsored, but that means that development priorities are set by the sponsor. So far, sponsors are much more interested in new features than they are in documentation.
Most of the effort in documentation has been focused on helping beginners. Brandon Litherland's OpenVSP Ground School is the primary result of that.
API users are generally assumed to not be beginners -- but you make a good point that everyone is a beginner at everything at some point.
I appreciate the different kinds of documentation -- our API docs have focused on providing a reference manual so far. We have not attempted a bigger picture form of documentation.I must admit, I really struggle with documenting OpenVSP. It is hard for me to put myself in the shoes of a beginner and imagine what would be most helpful to them. Some people have advocated for exhaustive documentation of every GUI, window, button, and slider. We currently have more than 70 GUI's and thousands of parameters. I can't imagine that telling people that "The Wing Geom's Sweep parameter controls the wing sweep." is useful documentation. I also struggle with discoverability -- even if everything was documented somewhere, would people actually be able to find and use it when they need it?
Yes, this kind of difference is exactly why I prefer the C++ documentation instead -- it is simply better formatted and organized.
I am generally opposed to a perspective view in technical programs. Unless you're placing the 3D object in a virtual world with other items for size and distance information, a perspective view provides an arbitrarily warped view of the model.Essentially, the problem is that field of view and distance from the object can both be varied in order to 'zoom'. You can keep the view of a model the same size (say the wingspan takes up the same number of pixels across the screen), but by varying FOV and distance, you get infinite choices of warped images.A 3D modeling use case like OpenVSP is different from a 3D world (like a FPS video game) because of all the other stuff in the world. In a FPS game, you generally have a fixed FOV and run around changing the viewpoint position. (occasionally looking through a gun scope with very different FOV). With perspective, you can't have both near and far views of something without significant distortion -- and alignment of objects is only meaningful if they are at the very center of the view.Technical drawings, blueprints, 3-views, etc. are dawn without perspective such that everything is to scale and alignment is meaningful. When you sight along a constant chord wing, the wing should appear to be constant chord. If you want to see that two objects are aligned in 3D space, you should be able to tell that easily -- without the distortion of perspective views.You'll notice that OpenVSP also does not support photorealistic rendering. Optically correct reflections, shadows, and material properties can look really cool, but they take away from what the model is conveying. Reflections can hide where two surfaces meet. Shadows make it difficult to see whatever object is not in direct light.Instead, by choosing to be non-photorealistic, we can make the wing green and the fuselage pink. We can make OML components translucent -- so you can see objects inside of the aircraft. We draw feature lines to highlight sharp edges, contours, boundaries, etc.Photorealistic rendering and perspective are great for glossy brochures, flight simulation, and 3D worlds -- however they are not best for a technical 3D modeling program.As you spend a little more time with OpenVSP, I think (and hope) you'll come to appreciate these choices.