# VMD compatibility patch for CUDA 13
#
# CUDA 13 removed several fields from the cudaDeviceProp structure that
# VMD previously used to query device information. Specifically:
#   - clockRate
#   - kernelExecTimeoutEnabled
#   - computeMode
#   - singleToDoublePrecisionPerfRatio
#
# This patch replaces direct access to those fields with calls to
# cudaDeviceGetAttribute(), which is the recommended approach and is
# compatible with all CUDA versions.
#
# The changes are made in src/CUDAUtil.cu, in the functions:
#   - vmd_cuda_device_props()
#   - vmd_cuda_devpool_setdevice()
#
# Temporary variables are introduced where necessary to avoid scoping
# issues, while preserving the original logic.
#
--- a/src/CUDAUtil.cu.old	2026-10-06 11:36:05.084205696 +0200
+++ b/src/CUDAUtil.cu	2026-10-06 11:36:20.990156537 +0200
@@ -108,21 +108,21 @@
   if (memb)
     *memb = deviceProp.totalGlobalMem;
   if (clockratekhz)
-    *clockratekhz = deviceProp.clockRate;
+    cudaDeviceGetAttribute(clockratekhz, cudaDevAttrClockRate, dev);
   if (smcount)
     *smcount = deviceProp.multiProcessorCount;
   if (asyncenginecount)
     *asyncenginecount = deviceProp.asyncEngineCount;
   if (kerneltimeout)
-    *kerneltimeout = (deviceProp.kernelExecTimeoutEnabled != 0);
+    { int _kerneltimeout = 0; cudaDeviceGetAttribute(&_kerneltimeout, cudaDevAttrKernelExecTimeout, dev); *kerneltimeout = (_kerneltimeout != 0); }
   if (integratedgpu)
     *integratedgpu = (deviceProp.integrated != 0);
   if (canmaphostmem)
     *canmaphostmem = (deviceProp.canMapHostMemory != 0);
   if (computemode)
-    *computemode = deviceProp.computeMode;
+    cudaDeviceGetAttribute(computemode, cudaDevAttrComputeMode, dev);
   if (spdpfpperfratio)
-    *spdpfpperfratio = deviceProp.singleToDoublePrecisionPerfRatio;
+    cudaDeviceGetAttribute(spdpfpperfratio, cudaDevAttrSingleToDoublePrecisionPerfRatio, dev);
   if (pageablememaccess)
     *pageablememaccess = deviceProp.pageableMemoryAccess;
   if (pageablememaccessuseshostpagetables)
@@ -491,7 +491,7 @@
   memset(&deviceProp, 0, sizeof(cudaDeviceProp));
   if (cudaGetDeviceProperties(&deviceProp, dev) == cudaSuccess) {
     float smscale = ((float) deviceProp.multiProcessorCount) / 30.0f;
-    double clockscale = ((double) deviceProp.clockRate) / 1295000.0;
+    int _clockratekhz = 0; cudaDeviceGetAttribute(&_clockratekhz, cudaDevAttrClockRate, dev); double clockscale = ((double) _clockratekhz) / 1295000.0;
     float speedscale = smscale * ((float) clockscale);
 
 #if 0
