Skip to content

AltDSS/DSS C-API 0.14.0

Compare
Choose a tag to compare
@PMeira PMeira released this 09 Feb 14:42
· 51 commits to master since this release

AltDSS/DSS C-API is a library that exposes a plain C API for an unofficial/alternative implementation/port of OpenDSS, the Distribution System Simulator from EPRI (the Electric Power Research Institute), aiming for full COM compatibility and beyond. It allows using most of the OpenDSS features on Windows, Linux and macOS with compatible behavior across multiple processor architectures. It is the lower level API used by the other projects in DSS-Extensions: AltDSS-Python, DSS-Python, OpenDSSDirect.py, OpenDSSDirect.jl (Julia language), DSS# (.NET/C# bindings), DSS MATLAB, AltDSS-Rust, AltDSS-Go, and the dss.hpp C++ header-only library, besides third-party projects.

All derived/downstream projects, including the documentation sites and dss.hpp headers, will be updated in the next hours/days to use this new engine.

See the changelog for a complete list of changes.
See also the updated "Known Differences" document, which lists the main differences between the DSS C-API codebase and the main/official OpenDSS.

For a growing general repository about the projects, see https://github.com/dss-extensions/dss-extensions

Changes since 0.13.4

Starting on this version, we will call DSS C-API and related projects AltDSS, an alternative implementation of OpenDSS, to make it more clear that this is not supported by EPRI and many extra features are not present in the official OpenDSS. Watch the DSS-Extensions org on GitHub for more announcements soon, including some support for the official implementation (still Windows-only at the moment). The name change does not mean compatibility or other aspects are expected to change, the project will still follow the basic guidelines of compatibility that have been followed since 2018.

This version should match OpenDSS v9.8.0.1 (SVN r3723). Remember to check the compatibility flags and Known differences.

  • Another large internal (Pascal) code refactoring step and general clean-up. Check the commits for details, too many to list. A last step is under progress and will be merged in the next major release.

  • Capitalization of property names adjusted! A first pass was done to try to make the property names more uniform. Since OpenDSS is case insensitive, we are free to change the capitalization as we see fit. In the past, the official OpenDSS already changed some property names, so a general suggestion for users that process the property names is to transform the names to upper or lower cases before comparing. This should ensure better stability across past and future versions of both DSS-Extensions and the official OpenDSS. For code that do not check the names in a case insensitive approach, DSS C-API 0.14.0 provides a function to adjust the property names (Settings_SetPropertyNameStyle), allowing the user to choose between three alternatives: the "Modern" version with adjusted capitalization; "Lowercase" names; and "Legacy" names. "Legacy" names can be used to avoid updating the names.

  • Introduces a preview of JSON schema (new), JSON export (updated) and import (new). Too many details to include in the changelog. Includes many updates to the internal metadata. A separate project will be posted at https://github.com/dss-extensions/AltDSS-Schema and community feedback is welcome. Note: the JSON schema will be used for projects and features beyond JSON IO.

  • Introduced options and improve correctness for save circuit. During the testing of the JSON dump, issues were fixed when saving Line, LineGeometry, Transformer, AutoTrans, XfmrCode. The issues vary from simple omissions to invalid exported DSS code. The property tracking feature below also helps generating clear and valid DSS scripts from save circuit, eliminating properties invalidated when changing some component definitions. To allow easier control of the save function without modifying the DSS language, a new Save function was added to the circuit API (Circuit_Save), coupled with the new DSSSaveFlags enumeration, which contains the option flags. This function also allows exporting the whole circuit as a single string.

  • Introduce property tracking. Setting some properties now mark conflicting property definitions as unset. This affects some functionality for saving circuits and is also used for the JSON schema, for instance. An example: a user creates a load with kW=10 kvar=0. Later, the user updates the load, setting PF=0.9. Setting the power factor toggles the load internal state to use kW and PF as the load definition, but kvar is still marked as set. The DSS engine correctly tracks the order that properties were defined, so everything works as expected. Now, with the growing usage of DSS implementation to export the circuit, every single user is required to correctly implement this tracking if they want to ensure compatibility. That is, dumping the data from this example generator in an unordered dictionary/map/etc. for processing and later dumping back to DSS scripts will result in the wrong model.

    • Users can, of course, still query the value of all properties.
    • See also NoPropertyTracking compat flag.
    • Currently implemented, at least partially, in the following DSS classes (plus Lines and Loads API): LineCode, LineGeometry, LoadShape, Generator, Load, PVSystem, Storage, VSource, Fault, Line, Reactor, Transformer.
    • This functionally may be extended to other classes in future versions, if required.
  • Introduce "Setter" flags. These are flags used to tweak how the property update is done. Notably,AvoidFullRecalc (some other flags are only using by the engine, internally): some specific properties like Load.kW can be updated both directly through a DSS script (or Text interface), or through the dedicated Loads API in any of the specific language bindings of the many APIs. The dedicated API does not force a YPrim update and full load model recalculation.

    • When using this flag AvoidFullRecalc in the Obj/Batch APIs, the behavior will follow the dedicated Loads API.
    • Other flags include ImplicitSizes and AllowAllConductors. Both are currently used for enabling some of the JSON Schema functionally.
    • For batch operations, SkipNA was introduced to allow handling scenarios with non-uniform data.
    • The relevant API functions were updated to include an extra function argument with the setter flags.
    • Is this AvoidFullRecalc the same as SkipSideEffects compat flag? No. AvoidFullRecalc is still valid and by design (including some behavior listed in OpenDSS docs), whereas SkipSideEffects is potentially unintended behavior.
  • New compatibility flags in DSSCompatFlags:

    • ActiveLine (0x10). In the official OpenDSS implementation, the Lines API use the active circuit element instead of the active line. This can lead to unexpected behavior if the user is not aware of this detail. For example, if the user accidentally enables any other circuit element, the next time they use the Lines API, the line object that was previously enabled is overwritten with another unrelated object. This flag enables this behavior above if compatibility at this level is required. On DSS-Extensions, we changed the behavior to follow what most of the other APIs do: use the active object in the internal list, starting on version v0.14.0.
    • NoPropertyTracking (0x20): On DSS-Extensions/AltDSS, when setting a property invalidates a previous input value, the engine will try to mark the invalidated data as unset. This allows for better exports and tracking of the current state of DSS objects. Set this flag to disable this behavior, following the original OpenDSS implementation for potential compatibility with older software that may require the original behavior; note that may lead to erroneous interpretation of the data in the DSS properties. This was introduced in DSS C-API v0.14.0 and will be further developed for future versions.
    • SkipSideEffects (0x40). Some specific functions on the official OpenDSS APIs and internal code skip important side-effects. By default, on DSS-Extensions/AltDSS, those side-effects are enabled. Use this flag
      to try to follow the behavior of the official APIs. Beware that some side-effects are
      important and skipping them may result in incorrect results.
      This flag affects some of the classic API functions (Loads, Generators, Vsources) as well as the behavior of some specific DSS properties (Line: Rg, Xg, rho; Transformer/AutoTrans: XSCArray).
  • New Alt and Obj families of functions. A new family of functions was added to allow most legacy API operations and new functionality directly on objects and batches, instead of relying on "active..." idiom. A new package, AltDSS-Python, will be published to illustrate the new approach. Since the engine is shared, users can mix both approach (e.g. use AltDSS-Python and OpenDSSDirect.py in the same script).

  • Batch/API:

    • Allow using batches with simple functions that return float64/int32 for each object.
    • Allow using INT32_MAX and NaN for missing values, which can be skipped with the SetterFlags_SkipNA flag. Sooner or later, there should a better alternative, but this can be useful in the time being.
  • Headers:

    • Remove stdint_compat.h. This was only required for very old or non-standard compiler like MSVC 2008. Users that require that can still source the file from older releases or get similar files from other sources.
    • Include stddef.h when building as C code.
    • Mark CktElement_Get_IsIsolated with (API Extension)
    • Add more const qualifiers. Especially useful for the new Rust and Golang bindings.
  • Specific bug fixes:

    • AutoTrans: fix DumpProperties, readd bank property (unused internally).
    • Commands/Save: add version and timestamp to master file.
    • DynamicExp and DynEqPCE: fix DumpProperties; extend to support JSON in/out.
    • Generator: fix default value for D (as DSS property); previously, the value was left uninitialized. It seems to only affect user models, so it doesn't seem like a big issue. Explicitly providing a value would also work fine as a workaround.
    • Line and LineCode: fix formatting issues in DumpProperties
    • LoadShape: fix some issues when copying/saving data when using float32 data (which users need to explicitly opt-in).
    • PriceShape/TempShape: adjust setters for mean/stddev properties
    • Relay: fix handling of DOC_PhaseCurveInner (DSS property)
    • Reactor: in some situations, R and X were not synched with Z. Fixed by removing the internal duplication (does not affect user code).
    • Sensor: DeltaDirection was not initialized; make clear an explicit action.
    • SwtControl: If no element is attached (misuse), set state as "none".
    • Transformers/API: Transformers_Get_LossesByType and Transformers_Get_AllLossesByType now check if the transformer is enabled.
    • API/general: avoid tiny memory leaks (pointer size, 8 bytes) on empty data and some error situations.
    • Bus/classic API: fix Bus_Get_N_interrupts; was previously returning the duration instead.
    • Circuit_Capacity (API, command): fix register index, remove magic numbers. (Bug introduced back in 2008!)
    • Circuit/API: fix Circuit_Enable and Circuit_Disable (enabling/disabling circuit elements by name). An equivalent fix is included in the official OpenDSS v9.7.1.1, in the COM interface. Additionally, provide error message when trying to use invalid element names.
    • Obj/Batch API: better handling of booleans. With this change, any non-zero value is interpreted as true, which simplifies integration with other programming languages. This was the original intention.
    • API/Iteration: Fix issues with iteration in a few of the internal functions which could have resulted in empty results in some situations. These situations occurred only during testing, so we don't expect many users were affected.
  • Misc:

    • Error handling: add a few numeric checks, and check for errors in more places during solution algorithms. The changes should help finding issues earlier and/or more easily.
    • Check for null pointers (usually missing circuit solution) in a few more places.
    • Properties/capitalization: adjust capitalization of nearly all property names. Use lowercase for description keys (help strings). Feedback on the capitalization is welcome. As a reminder, OpenDSS is case-insensitive, but other other are not. Providing a better internal representation of the properties will help other tools to use the internal names without extra work (no need for each tool to adjust capitalization), and it doesn't affect the DSS engine itself nor compatibility with the upstream OpenDSS.
    • Obj/API: introduce ExtraClassIDs to get some special lists.
    • Classic to Obj/Alt API bridge: add many *_Get_Pointer functions (e.g. CktElement_Get_Pointer, Loads_Get_Pointer). These functions return a pointer that can be used in the Obj API. This should enable an easier migration from the classic API, or allow users to use the Obj API to complement the classic API where the latter is lacking.
    • API/Callbacks: dss_callback_message_t function signature extended with two more arguments. We are not aware of any user using these, but if you are, remember to update your callbacks.
    • API/Extended errors: add a few more checks, and disable some error messages when extended errors are disabled. (Extended errors are extra error checks introduced to signal wrong usage of the DSS engine; extra = not present in the original/official codebase)
    • API/Text: microoptimize Text_CommandBlock for single commands. That is, users could use Text_CommandBlock for both single and multi-line strings without performance impacts. We did not replace Text_Set_Command in order to avoid potential compatibility issues.
    • API/Events: generalize the API for event extensions.
    • API/Obj: handle incorrect array sizes better, add error messages.
  • Ported from the official SVN:

    • r3637: "Removing force EventLog for StorageController to match all the other controls and their defaults." (by davismont)
    • r3640: "Updated "Show" fault study report to better arrange output. (...)" (by aovallev)
    • r3642: "Skipping disabled meters when interpolating all meters." (by celsorocha)
    • r3646: updates to TInvDynamicVars.CalcGFMYprim (by davismont)

Full Git Changelog: 0.13.4...0.14.0

Precompiled binaries

Most of the binaries available here are built through GitHub Actions, as are most of the development builds (you need to be logged in to be able to download dev builds). Linux ARM32 binaries will be added manually if there are any requests (please feel free to create a new issue on GitHub).

Users rarely need to build the Pascal binaries themselves, since there aren't many Free Pascal compiler flags that affect them. We do recommend building KLUSolveX optimized for your machines, especially for HPC clusters (since it's built as a shared library, you don't need to worry about Free Pascal).

Checksums

SHA256

d2f93fa864abbd4013a5031d6a635d1eba08b994b8b1c4604f60d94e1f5dad3b  dss_capi_0.14.0_darwin_arm64.tar.gz
152a3e5069ed3e0efef0004b00eb494de8d03011898bb4e0f694dfcca354547f  dss_capi_0.14.0_darwin_x64.tar.gz
fe94095f4e901dc134d1581f55118980ef04bdfdc1899c19d6792ff2bf696052  dss_capi_0.14.0_linux_arm64.tar.gz
51deac00daa453ec21c9f293f2a2de36002991bf2ab55496d73108fa45879151  dss_capi_0.14.0_linux_x64.tar.gz
eb78e17e9f453b05f312a8022b18f50b98b1d578fe7c45ce50e5b8a7d7e95ed8  dss_capi_0.14.0_linux_x86.tar.gz
56a75ac4afa47b77b06855cdfd69e72e0fbce309f68d45d5858b072089667729  dss_capi_0.14.0_win_x64.zip
6405283dfba594a01f12ee955185c78ebed4946b783ec5f734886ca970964cbf  dss_capi_0.14.0_win_x86.zip
020ce922189a339ce74bed9b629a9a9b7c405d002ccb8dc92565afdc57280575  messages.tar.gz
41b9040faddc682b7dde2a276981a8e9670997fadd64b0e09d85daadfc60dd68  messages.zip

SHA512

307a3d201ce4f4856c06a41796f599788411f21ec4e20a8f7fafbe269d83b2818701c74f09ba586350b0709035529ff1b7ea0bdb876de230bf1602110bb46fb1  dss_capi_0.14.0_darwin_arm64.tar.gz
4e6dfaaac030be156fe081d193d7bf7c2b5e300333620282b967c0149f0f693a1731ecc889064e04a0fc81c5aa9a56b6d90f408af12d61cb697f2f3f8a36a56b  dss_capi_0.14.0_darwin_x64.tar.gz
fad9315e527313956825506c514bd683206bf7f663604eb1cf4ab6b260afc10b4a6c85a7ddc600500e5dc9ef65b691d7042c0e26555ce1991b592a73b8c5813b  dss_capi_0.14.0_linux_arm64.tar.gz
67fc689a15f99d0647e1dc84aaa5f88e3cd7a32239eefac8f46229bb9a75f75d2595b9f5d7c3a73a82fb2060098e02773b8d2028e2c3e801a8abb59dee0c6456  dss_capi_0.14.0_linux_x64.tar.gz
6450bda9c2912d24aebc5d55a06fd8409cae8a425da22f8bb15df8f793c5379f6abc133fa5b6fd47a7550dd167145478374e3a1d2d8f781a39e796029198a13c  dss_capi_0.14.0_linux_x86.tar.gz
a897e27213277ac2bb2b766c28539e4c46a83ca70cd606b8b184eb16e8332d6f11212b55c68fb2e33286b837d7a0af4b73c29afce300702dfe32c1f76693eaf1  dss_capi_0.14.0_win_x64.zip
cf8537241bca1bffe961459471a242d0ae83e12f555da4ac088c1cd136fa49b42d49e4f98c5c6920870e82716f88ae5d12e6692d1818cd768e6102f71d5c289c  dss_capi_0.14.0_win_x86.zip
0af95f0f4754e7b8f0f316732fe21475a6ab49ad13172710a9f3d3797f639686d2cd2b5ea20a312dd80f5b33da4464e2411733fe5a8f6e04f6e51cabe13fecb9  messages.tar.gz
a2e5acaf55e51f61d17431a7e66d1173e178ad12bcffa87a70ac503b2a0b5ee63695fbde05c3204aed59a92207bd1dab903768835f0f0da94e0ade19804f22cf  messages.zip