I have a convolutional neural network that predicts 3 quantities: Ux, Uy, and P.  They are all 2D arrays of size [100,60], and my batch size is 10.
I want to compute the loss and update the network by calculating the CURL of the predicted velocity with the CURL of the target velocity. I have a function that does this: discrete_curl, and it computes it using (Ux_pred, Uy_pred), the predicted Ux and Uy. I want to compute the loss by comparing it to ground truth targets that I have: true_curl = curl(Ux_true, Uy_true)
To do this, I need to compute the curl loss in terms of Ux and Uy. I have not gotten past this error in Pytorch. this is my code so far:
# Curl function defined seperately
def discrete_curl(self,x,y,curl):
        for m in range(100):
            for n in range(60):
                if n <= 58:
                    if m <= 98:
                        if x[m,n] != 0 and y[m,n] != 0:
                            curl[m,n] = ((y[m+1,n] - y[m-1,n]) / 2*1) - ((x[m,n+1] - x[m,n-1]) / 2*1)
        return curl

Code:
        inputs= torch.from_numpy(x) 
        targets= torch.from_numpy(y[:,0:3,:,:])  # Ux,Uy,P target

        pred = self.forward(inputs)
        pred_ux = pred[:,0,:,:]  #Ux of batch: size [10,100,60]
        pred_uy = pred[:,1,:,:]. #Uy of batch: size [10,100,60]
        
        predicted_curl = np.zeros((len(pred),100,60), dtype=float)
        predicted_curl = torch.from_numpy(predicted_curl)
        for i in range(len(pred)):

            pred_ux[i] = Variable(pred_ux[i], requires_grad=True) #Ux_pred
            pred_uy[i] = Variable(pred_uy[i], requires_grad=True) #Uy_pred

            predicted_curl[i] = Variable(predicted_curl[i], requires_grad=True) #curl from predicted velocity values, to be updated with curl function below
            predicted_curl[i] = self.discrete_curl(pred_ux[i], pred_uy[i], predicted_curl[i])
            grad_tensor = torch.autograd.grad(outputs=predicted_curl[i], inputs=(pred_ux[i], pred_uy[i]), grad_outputs=torch.ones_like(new_arr[i]), retain_graph=True)
            print(grad_tensor)


However, it fails when I try to define grad_tensor, before I can even compute the loss. It fails with this error:
    grad_tensor = torch.autograd.grad(outputs=new_arr[i], inputs=(pred_ux[i], pred_uy[i]), grad_outputs=torch.ones_like(new_arr[i]), retain_graph=True)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/torch/autograd/__init__.py", line 204, in grad
    inputs, allow_unused)
RuntimeError: One of the differentiated Tensors appears to not have been used in the graph. Set allow_unused=True if this is the desired behavior.

How do I get past this?