@@ -516,6 +516,55 @@ ModuleBase::Vector3<double> cal_r_overlap_R::get_psi_r_psi(const ModuleBase::Vec
516516 return temp_prp;
517517}
518518
519+ ModuleBase::Vector3<std::complex <double >> cal_r_overlap_R::get_psi_L_psi (
520+ const ModuleBase::Vector3<double >& R1 ,
521+ const int & T1 ,
522+ const int & L1 ,
523+ const int & m1,
524+ const int & N1 ,
525+ const ModuleBase::Vector3<double >& R2 ,
526+ const int & T2 ,
527+ const int & L2 ,
528+ const int & m2,
529+ const int & N2 )
530+ {
531+ ModuleBase::Vector3<double > origin_point (0.0 , 0.0 , 0.0 );
532+ double factor = sqrt (ModuleBase::FOUR_PI / 3.0 );
533+ const ModuleBase::Vector3<double >& distance = R2 - R1 ;
534+
535+ // grad_r_beta[beta] = ∂/∂R · ⟨φ_μ|(r-R_B)_beta|φ_ν⟩ (a Vector3<double> for each beta)
536+ // Following the same sign convention as get_psi_r_psi:
537+ // mA2=0 → z component (positive factor)
538+ // mA2=1 → x component (negative factor)
539+ // mA2=2 → y component (negative factor)
540+
541+ // grad of ⟨φ|(r-R_B)_x|φ⟩ w.r.t. R
542+ ModuleBase::Vector3<double > grad_rx
543+ = -1.0 * factor
544+ * center2_orb21_r[T1 ][T2 ][L1 ][N1 ][L2 ].at (N2 ).cal_grad_overlap (origin_point, distance, m1, 1 , m2);
545+
546+ // grad of ⟨φ|(r-R_B)_y|φ⟩ w.r.t. R
547+ ModuleBase::Vector3<double > grad_ry
548+ = -1.0 * factor
549+ * center2_orb21_r[T1 ][T2 ][L1 ][N1 ][L2 ].at (N2 ).cal_grad_overlap (origin_point, distance, m1, 2 , m2);
550+
551+ // grad of ⟨φ|(r-R_B)_z|φ⟩ w.r.t. R
552+ ModuleBase::Vector3<double > grad_rz
553+ = factor
554+ * center2_orb21_r[T1 ][T2 ][L1 ][N1 ][L2 ].at (N2 ).cal_grad_overlap (origin_point, distance, m1, 0 , m2);
555+
556+ // L_x = i * [∂/∂R_y ⟨r_z⟩ - ∂/∂R_z ⟨r_y⟩]
557+ // L_y = i * [∂/∂R_z ⟨r_x⟩ - ∂/∂R_x ⟨r_z⟩]
558+ // L_z = i * [∂/∂R_x ⟨r_y⟩ - ∂/∂R_y ⟨r_x⟩]
559+ const std::complex <double > imag_i (0.0 , 1.0 );
560+
561+ std::complex <double > Lx = imag_i * (grad_rz.y - grad_ry.z );
562+ std::complex <double > Ly = imag_i * (grad_rx.z - grad_rz.x );
563+ std::complex <double > Lz = imag_i * (grad_ry.x - grad_rx.y );
564+
565+ return ModuleBase::Vector3<std::complex <double >>(Lx, Ly, Lz);
566+ }
567+
519568void cal_r_overlap_R::get_psi_r_beta (const UnitCell& ucell,
520569 std::vector<std::vector<double >>& nlm,
521570 const ModuleBase::Vector3<double >& R1 ,
0 commit comments