     cudaDeviceSynchronize();
 
     cudaFree(d_V);
-    cudaFree(d_R);
     cudaFree(d_nodes);
     cudaFree(d_elements);
 

        }
    }
    Vi = diag_sum == 0 ? 0.0 : right_sum/diag_sum;
    R[Node.i] = fabs(V[Node.i] - Vi);
    V[Node.i] = Vi;

    return;

#include "cuda_snippets.h"
#include "nscheme.h"

__device__ __managed__ int d_convergence;


// Kernel responsável por uma iteração.
__global__ void kernel_iter(const int nn, const double alpha, elementri *elements, node *nodes, double *V) {
    int i = blockIdx.x * blockDim.x + threadIdx.x;
    if (i >= nn) return;

    int e, c;
    double diag_sum = 0.0, right_sum = 0.0, Vi;

    node Node = nodes[i];
