@@ -68,7 +68,7 @@ def rho_lorentzian(q, Q, sigma):
6868 return y
6969
7070
71- def quantum_potential_orginal (Q , sigma , mass , TBF ):
71+ def quantum_potential_original (Q , sigma , mass , TBF ):
7272 """
7373 Args:
7474 * Q (Tensor(ntraj, ndof)) - coordinates of all trajectories
@@ -92,6 +92,31 @@ def quantum_potential_orginal(Q, sigma, mass, TBF):
9292 return U
9393
9494
95+ def quantum_potential_original_gen (q , Q , sigma , mass , TBF ):
96+ """
97+ Args:
98+ * Q (Tensor(ntraj, ndof)) - coordinates of all trajectories
99+ * sigma (Tensor(ndof)) - width parameters for each trajectory
100+ * mass ( Tensor(1, ndof)) - masses of all DOFs, same for all trajectories
101+ * TBF (object) - basis function reference (`rho_gaussian` or `rho_lorentzian`)
102+
103+ Returns:
104+ Tensor(1) - quantum potential summed over all trajectory points
105+ """
106+
107+ ntraj , ndof = Q .shape [0 ], Q .shape [1 ]
108+ U = torch .zeros ( (1 ,), requires_grad = True )
109+ f = TBF (q , Q , sigma );
110+ [deriv1 ] = torch .autograd .grad (f , [q ], create_graph = True , retain_graph = True );
111+ for i in range (ndof ):
112+ [deriv2 ] = torch .autograd .grad (deriv1 [i ], [q ], create_graph = True , retain_graph = True );
113+ u = - (0.25 / mass [0 ,i ])* ( deriv2 [i ]/ f - 0.5 * (deriv1 [i ]/ f )** 2 );
114+ U = U + u
115+ return U
116+
117+
118+
119+
95120def quantum_potential (Q , sigma , mass , TBF ):
96121 """
97122 Compute quantum potential in a fully vectorized way.
0 commit comments