Skip to main content

Sucker Rod Design Library

Project description

libzrod

Sucker Rod Design Library (Wave Equation / Gibbs / Everitt-Jennings)

A wave equation library for sucker rod pump design and analysis, written in C/C++ and wrapped in Python.

Overview

libzrod solves the 1D damped wave equation to calculate dynamometer cards for both diagnostic (measured card in, pump card out) and predictive (parameters in, surface + pump cards out) analysis of sucker rod pumping systems. The core engine is cross-platform C++, exposed to Python via ctypes.

Key capabilities:

  • Diagnostic analysis: transform a measured surface dynamometer card into a downhole pump card
  • Predictive analysis: generate surface and pump cards from well parameters (rod string, pump, fluid, geometry)
  • Rod loading analysis: max/min stress per rod section with Modified Goodman limits
  • Pump velocity and chamber pressure visualization
  • Multi-format file I/O (.dyn, .rsdx/.rsvx, .inp6/.inp6e, .qrd, .zrod, .DAT)
  • Cloud design management (save, fetch, share via AWS)

Installation

pip install libzrod

Requirements: Python 3.9 - 3.13, numpy. Supported platforms: Windows (x86_64), macOS (x86_64/ARM), Linux (x86_64).

Authorization

An account is required to use the library:

  1. Create an account at zrod.io
  2. Email for manual authorization of your trial account (account creation is not monitored)
  3. Note: The beta library includes time restrictions

Or see the Colab Example for a quick demo.

Machine access via API keys

For headless/CI integrations where storing a username and password is awkward, generate a long-lived API key from your account page (Account → API Keys) and authenticate with it instead of Login(...). Two equivalent forms:

Explicit (recommended for scripts):

from libzrod import zrod
z = zrod()
if not z.LoginWithApiKey("zrod_live_..."):
    raise SystemExit("API key rejected — revoked, expired, or wrong env")

Implicit, via environment variable:

export ZROD_API_KEY=zrod_live_...
from libzrod import zrod
z = zrod()  # auto-authenticates if ZROD_API_KEY is set

API keys carry the same access as the owning user, are subject to per-plan daily and burst limits, and can be revoked at any time from the account page. The full secret is shown only at creation — store it securely.

Quick Start

This self-contained example runs a full diagnostic + predictive analysis using inline card data (no external files needed). Save it as test_libzrod.py and run with python test_libzrod.py.

import libzrod
from libzrod import zrod, TaperBase_t, TubingBase_t, WaveParams_t, PuApi_t

# ── Create engine and login ──────────────────────────────────────────
myzrod = zrod()
print(f"libzrod library version: v{myzrod.GetZrodVersionString()}")
print(f"libzrod package version: v{libzrod.__version__}")

if(not myzrod.Login("demo", "password1")):
    print("Login failed!")
    exit(1)
print("Login OK\n")

result = myzrod.SetUpscaledDynoPointCount(4000) #this is for the smoothed/curve-fitted measured surface card
result = myzrod.SetFourierCoeffCountPos(23) #these are for the curve fitting of a measured dyno card
result = myzrod.SetFourierCoeffCountLoad(50)

# ── Well parameters ──────────────────────────────────────────────────
waveParams = myzrod.GetWaveParams()
waveParams.WellDepth = 5900
waveParams.diagSpm = 8.0
waveParams.predSpm = 8.0
waveParams.diagDampUp = 0.2
waveParams.diagDampDn = 0.2
waveParams.predDampUp = 0.2
waveParams.predDampDn = 0.2
waveParams.diagPumpPlungerDiameter = 1.5
waveParams.predPumpPlungerDiameter = 1.5
waveParams.predFluidSG = 1.0
waveParams.predFluidLevel = 2000
waveParams.predCasingPressure = 93
waveParams.predTubingPressure = 200.2
waveParams.predFo = 4000
waveParams.usePumpingUnitForPosition = True
myzrod.SetWaveParams(waveParams)

# ── Rod string (3 tapers) ───────────────────────────────────────────
tarr = (TaperBase_t * 3)()
tarr[0] = TaperBase_t(id=b"", L=3200, D=0.875, W=2.224, E=30500000, R=492)
tarr[1] = TaperBase_t(id=b"", L=2400, D=0.750, W=1.630, E=30500000, R=492)
tarr[2] = TaperBase_t(id=b"", L= 300, D=1.500, W=6.500, E=30500000, R=492)
myzrod.xSetDiagTapers(tarr, 1.0)
myzrod.xSetPredTapers(tarr, 1.0)

# ── Tubing ───────────────────────────────────────────────────────────
tuarr = (TubingBase_t * 1)()
tuarr[0] = TubingBase_t(L=5900, innerDiameter=2.441, outerDiameter=2.875,
                         weight=6.5, W=2.904, E=30500000, R=490)
myzrod.xSetDiagTubings(tuarr)
myzrod.xSetPredTubings(tuarr)

# ── Pumping unit geometry ────────────────────────────────────────────
puapi = PuApi_t()
puapi.Type = ord("C")
puapi.Rotate = 1
puapi.A = 158.375
puapi.P = 122.499992
puapi.C = 100
puapi.I = 110
puapi.K = 164.639999
puapi.R = 43
puapi.CBE = 450.0
puapi.Torque = 456000
puapi.Structure = 21300
puapi.MaxStroke = 144.0
puapi.S = 144.0
myzrod.SetPuApi(puapi)

# ── Load a measured surface card (inline data) ───────────────────────
surface_x = [
    687.0, 642.2, 596.5, 550.4, 504.4, 459.0, 414.3, 370.5, 327.7, 286.1,
    246.0, 207.9, 172.2, 139.0, 108.5, 80.8, 56.0, 34.8, 17.8, 5.9,
    0.1, 0.4, 6.8, 18.5, 34.4, 53.9, 76.1, 100.9, 128.2, 157.8,
    189.8, 223.8, 259.7, 297.3, 336.5, 377.1, 419.1, 462.2, 506.4, 551.2,
    596.6, 642.4, 688.4, 734.5, 780.5, 826.4, 872.0, 917.0, 961.2, 1004.4,
    1046.5, 1087.3, 1126.5, 1164.2, 1200.0, 1233.8, 1265.4, 1294.8, 1321.6, 1345.9,
    1367.7, 1386.8, 1403.4, 1417.4, 1428.9, 1437.8, 1444.2, 1448.2, 1449.9, 1449.4,
    1446.7, 1442.0, 1435.3, 1426.7, 1416.3, 1404.2, 1390.4, 1375.1, 1358.2, 1339.7,
    1319.8, 1298.5, 1275.8, 1251.7, 1226.1, 1199.2, 1170.9, 1141.2, 1110.2, 1077.9,
    1044.1, 1009.0, 972.5, 934.7, 895.8, 855.9, 815.1, 773.5, 730.8, 687.0,
]
surface_x = [x / 10.0 for x in surface_x]  # convert to inches

surface_y = [
    10583, 10409, 10157, 9891, 9681, 9575, 9576, 9653, 9778, 9956,
    10230, 10641, 11186, 11799, 12374, 12827, 13139, 13359, 13555, 13756,
    13927, 14009, 13982, 13917, 13957, 14243, 14815, 15585, 16380, 17054,
    17575, 18039, 18592, 19305, 20096, 20749, 21024, 20791, 20107, 19183,
    18275, 17545, 17007, 16557, 16076, 15529, 15001, 14650, 14606, 14884,
    15369, 15875, 16241, 16412, 16447, 16456, 16517, 16613, 16642, 16488,
    16099, 15538, 14952, 14494, 14242, 14160, 14143, 14084, 13945, 13766,
    13615, 13522, 13446, 13295, 12996, 12547, 12030, 11557, 11196, 10923,
    10643, 10250, 9700, 9046, 8409, 7918, 7651, 7615, 7766, 8045,
    8402, 8802, 9219, 9619, 9975, 10265, 10479, 10612, 10651, 10583,
]

myzrod.LoadDyn(8.1, surface_x, surface_y)

# ── Validate before running ──────────────────────────────────────────
issues = myzrod.ValidateDesign()
if(issues):
    print("Validation issues:")
    for issue in issues:
        severity = "WARN" if(issue["severity"] == 1) else "ERROR"
        print(f"  [{severity}] {issue['code']}: {issue['message']}")
    print()

# ── Run the wave equation solver ─────────────────────────────────────
print("Running design...")
if(not myzrod.RunDesign()):
    print("RunDesign() FAILED")
    exit(1)
print("RunDesign() OK\n")

# ── Fetch results ────────────────────────────────────────────────────
results = myzrod.GetWaveResults()

print("=== Diagnostic Results ===")
print(f"  Rod weight in air:   {results.diag.Rwa:.0f} lbs")
print(f"  Rod weight in fluid: {results.diag.Rwf:.0f} lbs")
print(f"  Fo (SKr):            {results.diag.FoSKr:.0f} lbs")
print(f"  Kr:                  {results.diag.Kr:.1f} lb/in")
print(f"  N/No:                {results.diag.NNo:.3f}")
print(f"  Stroke length:       {results.diag.SL:.2f} in")
print(f"  Pump stroke (net):   {results.diag.PumpStrokeNet:.2f} in")
print(f"  Production (100%):   {results.diag.BblPerDay100:.1f} bbl/day")
print(f"  Solver time:         {results.LastExecutionTimeMs} ms")
print()

print("=== Predictive Results ===")
print(f"  Rod weight in air:   {results.pred.Rwa:.0f} lbs")
print(f"  Rod weight in fluid: {results.pred.Rwf:.0f} lbs")
print(f"  Fo (SKr):            {results.pred.FoSKr:.0f} lbs")
print(f"  Kr:                  {results.pred.Kr:.1f} lb/in")
print(f"  N/No:                {results.pred.NNo:.3f}")
print(f"  Stroke length:       {results.pred.SL:.2f} in")
print(f"  Pump stroke (net):   {results.pred.PumpStrokeNet:.2f} in")
print(f"  Production (100%):   {results.pred.BblPerDay100:.1f} bbl/day")
print()

# ── Fetch dyno card arrays ───────────────────────────────────────────
(surfX, surfY) = myzrod.GetMeasuredDyno()
(pumpX, pumpY) = myzrod.GetMeasuredPump()
(upscX, upscY) = myzrod.GetUpscaledDyno()
(upscPX, upscPY) = myzrod.GetUpscaledPump()
(predDynX, predDynY) = myzrod.GetPredDyno()
(predPmpX, predPmpY) = myzrod.GetPredPump()

print("=== Card Point Counts ===")
print(f"  Measured surface:  {len(surfX)} pts")
print(f"  Measured pump:     {len(pumpX)} pts")
print(f"  Upscaled surface:  {len(upscX)} pts")
print(f"  Upscaled pump:     {len(upscPX)} pts")
print(f"  Predicted surface: {len(predDynX)} pts")
print(f"  Predicted pump:    {len(predPmpX)} pts")
print()

# ── Rod loading ──────────────────────────────────────────────────────
(depth, lbsMax, lbsMin, pctMax, pctMin) = myzrod.xGetUpscaledRodLoading()
print("=== Rod Loading (Upscaled) ===")
for i in range(len(depth)):
    print(f"  Depth {depth[i]:7.0f} ft  |  Max {lbsMax[i]:8.0f} lbs ({pctMax[i]:5.1f}%)"
          f"  |  Min {lbsMin[i]:8.0f} lbs ({pctMin[i]:5.1f}%)")
print()

# ── Optional: plot if matplotlib is available ────────────────────────
try:
    import matplotlib.pyplot as plt

    fig, axes = plt.subplots(1, 2, figsize=(12, 5))

    # Surface cards
    axes[0].set_title("Surface Dynamometer Cards")
    axes[0].plot(surfX, surfY, ".", ms=2, color="gray", label="Measured")
    axes[0].plot(upscX, upscY, color="blue", label="Upscaled")
    axes[0].plot(predDynX, predDynY, color="red", label="Predicted")
    axes[0].set_xlabel("Position (in)")
    axes[0].set_ylabel("Load (lbs)")
    axes[0].legend()

    # Pump cards
    axes[1].set_title("Pump Cards")
    axes[1].plot(pumpX, pumpY, ".", ms=2, color="gray", label="Measured")
    axes[1].plot(upscPX, upscPY, color="green", label="Upscaled")
    axes[1].plot(predPmpX, predPmpY, color="lime", label="Predicted")
    axes[1].set_xlabel("Position (in)")
    axes[1].set_ylabel("Load (lbs)")
    axes[1].legend()

    plt.tight_layout()
    plt.savefig("test_libzrod_output.png", dpi=150)
    print("Plot saved to test_libzrod_output.png")
    plt.show()
except ImportError:
    print("matplotlib not installed — skipping plot (pip install matplotlib)")

myzrod.Logout()
print("\nDone.")

API Reference

Initialization & Auth

Method Description
zrod() Create engine instance (singleton). Auto-authenticates from ZROD_API_KEY env var if set.
Login(username, password) -> bool Authenticate with zrod.io
LoginWithApiKey(apiKey) -> bool Authenticate with a zrod_live_… machine-access key. Probes /api-keys/whoami; returns False on revoked/expired/invalid.
Logout() -> bool End session
SetClientVersion(platform, major, minor, rev, build) Set client identifier
GetZrodVersion() -> np.ndarray Get C++ library version [major, minor, rev, build]
GetZrodVersionString() -> str Get version as "M.m.r.b" string

Configuration

Method Description
GetWaveParams() -> WaveParams_t Get current wave parameters
SetWaveParams(params) -> bool Set wave parameters
GetWaveSettings() -> WaveSettings_t Get advanced solver settings
SetWaveSettings(settings) -> bool Set advanced solver settings
xSetDiagTapers(tapers, fluidSG) -> bool Set diagnostic rod string (infers count)
xSetPredTapers(tapers, fluidSG) -> bool Set predictive rod string (infers count)
SetDiagTapers(tapers, count, fluidSG) -> bool Set diagnostic rod string (manual count)
SetPredTapers(tapers, count, fluidSG) -> bool Set predictive rod string (manual count)
xSetDiagTubings(tubings) -> bool Set diagnostic tubing string (infers count)
xSetPredTubings(tubings) -> bool Set predictive tubing string (infers count)
SetDiagTubings(tubings, count) -> bool Set diagnostic tubing string (manual count)
SetPredTubings(tubings, count) -> bool Set predictive tubing string (manual count)
xSetCasings(casings) -> bool Set casing string (infers count)
SetCasings(casings, count) -> bool Set casing string (manual count)
SetDiagApiTaperByNumber(num, pumpDia, pumpDepth) -> bool Set diagnostic taper from API rod number
SetPredApiTaperByNumber(num, pumpDia, pumpDepth) -> bool Set predictive taper from API rod number
SetPuApi(puApi) -> bool Set pumping unit geometry
SetPuInfo(puInfo) -> bool Set pumping unit info (with designation)
SetPuByName(name) -> bool Set pumping unit by database name
SetFourierCoeffCountPos(count) Set Fourier coefficients for position curve fitting
SetFourierCoeffCountLoad(count) Set Fourier coefficients for load curve fitting
SetUpscaledDynoPointCount(count) Set upscaled output resolution

Calculation

Method Description
RunDesign() -> bool Execute wave equation solver (diagnostic + predictive)
CalculateFo() -> float Calculate fluid load from pump/pressure parameters (lbs)
CalculateKrToDepth(depth) -> float Calculate rod spring constant to a given depth
ValidateDesign() -> list[dict] Validate current design, returns list of issues

Results — Diagnostic

Method Returns Description
GetMeasuredDyno() (pos, load) Measured surface card
GetMeasuredPump() (pos, load) Calculated downhole pump card
GetMeasuredPumpColors() np.ndarray[int32] Pump valve state colors per point
GetMeasuredPumpVelocity() np.ndarray Plunger velocity (in/sec)
GetMeasuredPumpVelocityNormalized() np.ndarray Plunger velocity (0-100 scale)
GetMeasuredPumpChamberPressure() np.ndarray Chamber pressure (psi)
GetMeasuredPumpChamberPressureNormalized() np.ndarray Chamber pressure (0-100 scale)
GetUpscaledDyno() (pos, load) Curve-fitted surface card
GetUpscaledPump() (pos, load) Pump card from curve-fitted input
GetUpscaledPumpColors() np.ndarray[int32] Valve state colors
GetUpscaledPumpVelocity() np.ndarray Plunger velocity
GetUpscaledPumpVelocityNormalized() np.ndarray Plunger velocity (0-100)
GetUpscaledPumpChamberPressure() np.ndarray Chamber pressure
GetUpscaledPumpChamberPressureNormalized() np.ndarray Chamber pressure (0-100)

Results — Predictive

Method Returns Description
GetPredDyno() (pos, load) Predicted surface card
GetPredPump() (pos, load) Predicted pump card
GetPredPumpColors() np.ndarray[int32] Valve state colors
GetPredPumpVelocity() np.ndarray Plunger velocity
GetPredPumpVelocityNormalized() np.ndarray Plunger velocity (0-100)
GetPredPumpChamberPressure() np.ndarray Chamber pressure
GetPredPumpChamberPressureNormalized() np.ndarray Chamber pressure (0-100)

Results — Rod Loading

Method Returns Description
xGetMeasuredRodLoading() (depth, lbsMax, lbsMin, pctMax, pctMin) Measured rod loading per section
xGetUpscaledRodLoading() (depth, lbsMax, lbsMin, pctMax, pctMin) Upscaled rod loading
xGetPredRodLoading() (depth, lbsMax, lbsMin, pctMax, pctMin) Predicted rod loading

Results — Other

Method Returns Description
GetWaveResults() WaveResults_t Numeric results (Fo, Kr, pump stroke, production, etc.)
GetWaveParamsReadOnly() WaveParamsReadOnly_t Computed parameters (point counts, DT, buoyancy)
GetIntermediateCard(nodeindex, dynotype) (pos, load) FEA node card (dynotype: 1=meas, 2=upsc, 3=pred)
GetIntermediateTimeSlice(timestep, dynotype) (pos, load) All nodes at one timestep
GetPermissibleLoads(destX, destY, count, clipmin, clipmax) bool Modified Goodman envelope

File I/O

Method Description
LoadDyn(spm, pos_array, load_array) -> bool Load measured card from arrays
LoadDynFromFile(filepath) -> bool Load .dyn file
LoadDynFromFileContents(text) -> bool Load .dyn from string
LoadDynFromDAT(filepath) -> bool Load .DAT format (Python-only parser)
ParseDesignFile(filepath) -> bool Parse design file (.zrod, .rsdx, .inp6, etc.)
ParseDesignFileContents(contents, ftype) -> bool Parse from string
WriteDesignFile(filepath) -> bool Write .zrod design file
WriteDesignFileWithTemplate(filepath, templatepath) -> bool Write with template

Design Management (Cloud)

Note: Cloud design management is a work in progress and subject to change.

Method Description
FetchDesigns(fromserver) -> int Fetch design list (True=server, False=cached). Returns count.
GetDesigns() -> list[DesignInfo] Get list of DesignInfo objects
GetDesign(designId) -> bool Load a design by ID
SaveCurrentDesign(overwrite) -> bool Save current design to cloud
SubmitDesign(email, nonblocking) -> bool Submit design for review
DeleteDesign(designId) -> bool Delete a cloud design
SetDesignTitle(title) -> bool Set design title
GetDesignTitle() -> str Get design title
SetComment(comment) -> bool Set design comment
GetComment() -> str Get design comment
GetDesignID() -> str Get current design ID (compact UUID)

Metadata & Debug

Method Description
GetPuInfo() -> PuInfo_t Get pumping unit info
GetCasingCount() -> int Get casing section count
GetCasings() -> list[CasingBase_t] Get casing sections
GetDeviationSurveyCount() -> int Get deviation survey point count
GetDeviationSurvey() -> list[DeviationSurveyPoint_t] Get deviation survey
PrintZrodObj() Print internal state to console
DebugZrodObj(filepath) Dump debug info to file (if available)

Data Structures

TaperBase_t — Rod Section

Field Type Unit Description
id bytes[32] Rod grade identifier (e.g. b"D")
L float feet Section length
D float inches Rod body diameter
W float lb/ft Weight per foot
T float psi Minimum tensile strength
E float psi Young's modulus (typically 30,500,000)
R float lb/ft^3 Density (typically 490 for steel)
RL float feet Individual rod length for UI (default 25)
K float Modified Goodman K constant (default 2.8)
M float Modified Goodman M constant (default 0.375)

TubingBase_t — Tubing Section

Field Type Unit Description
L float feet Section length
innerDiameter float inches Tubing ID
outerDiameter float inches Tubing OD
weight float lb/ft Weight per foot
W float lb/ft Rod-in-tubing weight factor
T float psi Tensile strength
E float psi Young's modulus
R float lb/ft^3 Density

WaveParams_t — Core Parameters

Key fields (see CLAUDE.md for full list):

Field Type Unit Description
WellDepth float feet Total well depth
diagSpm / predSpm float SPM Strokes per minute
diagDampUp / diagDampDn float Damping factors (0.0–1.0, typical 0.05)
predDampUp / predDampDn float Predictive damping factors
diagFluidSG / predFluidSG float Fluid specific gravity
diagPumpPlungerDiameter float inches Plunger diameter
diagPumpDepth / predPumpDepth float feet Pump setting depth
predFo float lbs Target fluid load (or use CalculateFo())
predFillage float % Pump fillage (0–100)
predCompression float Gas compression ratio
usePumpingUnitForPosition bool Use PU geometry for position (vs measured)

Naming Conventions

x-prefix methods (e.g. xSetDiagTapers, xGetMeasuredRodLoading) are Pythonic convenience wrappers:

  • xSet* infers the array count from len() and passes ctypes.byref() automatically
  • xGet* allocates numpy output arrays automatically and returns them

The non-x versions require you to pass count and pre-allocated arrays manually.

Workflow Patterns

Diagnostic + Predictive Analysis

1. zrod() → Login()
2. GetWaveParams() → set fields → SetWaveParams()
3. xSetDiagTapers() + xSetPredTapers()
4. xSetDiagTubings() + xSetPredTubings()
5. LoadDyn() or LoadDynFromDAT() or ParseDesignFile()
6. RunDesign()
7. GetMeasuredDyno(), GetMeasuredPump(), GetPredDyno(), GetPredPump()
8. GetWaveResults() for numeric output

Predictive-Only (No Measured Card)

1. zrod() → Login()
2. GetWaveParams() → set fields, usePumpingUnitForPosition=True → SetWaveParams()
3. SetPuApi() or SetPuByName()
4. xSetPredTapers(), xSetPredTubings()
5. CalculateFo() or set predFo manually
6. RunDesign()
7. GetPredDyno(), GetPredPump()

File Round-Trip

1. ParseDesignFile("input.zrod")    # loads all parameters + measured card
2. RunDesign()
3. WriteDesignFile("output.zrod")   # saves current state

Constants

# Prediction algorithm types (for WaveSettings_t.predAlgorithmType)
# Note: Integer values are subject to change — use the PRED_ALGORITHM_* names.
PRED_ALGORITHM_STANDARD = 0       # Default
PRED_ALGORITHM_OLD = 1            # Legacy algorithm
PRED_ALGORITHM_EXPERIMENTAL = 2   # Experimental
PRED_ALGORITHM_LEAKAGE = 3       # With leakage modeling

Known Limitations

The following C API functions are not yet wrapped in the Python interface:

C Function Purpose
SetDeviationSurvey() Set wellbore deviation survey
SetDeviationSurveyWithMIA() Set deviation survey (interleaved format)
SetSaveIntermediateCards() Enable intermediate FEA node card output
SetStatusCallback() Async status callbacks
GetDiagTaperCount/GetPredTaperCount Query rod section counts
GetDiagTapers/GetPredTapers Retrieve rod sections
GetDiagTubingCount/GetPredTubingCount Query tubing section counts
GetDiagTubings/GetPredTubings Retrieve tubing sections

Platform Support

Platform Architecture Python Versions
Windows x86_64 3.9 - 3.13
macOS x86_64, ARM64 3.9 - 3.13
Linux x86_64 3.9 - 3.13

Mobile Apps

Beta access available for iOS and Android demo apps. Contact for access.

Web App

The ZROD web app demonstrates the full feature set of the library, including interactive dynamometer card visualization, rod loading analysis, pump velocity display, multi-format file import/export, and cloud design management.

Troubleshooting

RunDesign() returns False: Call ValidateDesign() to get a list of issues with codes and messages. Common causes: missing rod string, missing measured card (when usePumpingUnitForPosition=False), zero SPM, or invalid pump parameters.

Singleton warning: zrod is a singleton. Creating a second instance returns the same object with a warning. Use del myzrod before creating a new one if needed. As of the API-key release, __init__ is idempotent — repeated zrod() calls no longer leak the underlying C handle as they did in earlier versions.

Platform binary not found: The library ships platform-specific binaries. Ensure your Python version and platform match a supported wheel.

Contact & Licensing

For licensing inquiries, reach out via LinkedIn.

Legal


*Help improve this document. Contact me with feedback or ambiguities.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

libzrod-0.1.32-py3-none-manylinux_2_28_x86_64.whl (5.7 MB view details)

Uploaded Python 3manylinux: glibc 2.28+ x86-64

libzrod-0.1.32-py3-none-manylinux_2_28_aarch64.whl (5.5 MB view details)

Uploaded Python 3manylinux: glibc 2.28+ ARM64

File details

Details for the file libzrod-0.1.32-py3-none-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for libzrod-0.1.32-py3-none-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 7e234fa390ec474a081b1fe7bfa8ac58f37d8ecaecddd7600548a30def9d8df0
MD5 4cd7c16e78720311ded88593fad699a6
BLAKE2b-256 f9fdb9d69be926223f1748e4be788b7fa6278462c1be11aace77c1ea4ca6446a

See more details on using hashes here.

File details

Details for the file libzrod-0.1.32-py3-none-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for libzrod-0.1.32-py3-none-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 b890d87fc06cc0b07e631d85681a2088f72efa44ec72c544dc77a81b0a6c572f
MD5 aff7fe46594bcc276fca070542819d0a
BLAKE2b-256 0f3640f36d1971db982576ea17b3adc0de20f915295e75d479c9a9e93173e397

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page