Hi Steve, 
I could find some time figuring out this issue. I used to calculate psd through frf, but people in my team were still pushing for being able to read it directly... :) 
In terms of version, I'm working with the main branch on github.  What I had for psd (sort2) for cbush was that only the last element was read, 
more specifically, in the example below where I have two cbush elements with respective ids 1005 and 1006, I had 
print(random.op2_results.psd.cbush_force[1].element)
>> [1006          0]
print(random.op2_results.psd.cbush_force[1].element_ids)
>> [1005      ,    1006]
and in data, only the first line was filled with the value corresponding to the last element as well (1006)
random.op2_results.psd.cbush_force[1].data
>> array([[[3.5451579e+00, 1.4228966e+00, 2.4901101e-05, 3.3304757e-06,
         1.3134211e-06, 0.0000000e+00],
        [0.0000000e+00, 0.0000000e+00, 0.0000000e+00, 0.0000000e+00,
         0.0000000e+00, 0.0000000e+00]],
In oef_force_objects.py, in RealForceMomentArray.add_sort2, I realized that self.ielement was not iterated and always stays at 0, I just add the following line
self.ielement = np.where(self.element_ids == eid) in the method and everything seems working properly now, 
print(random.op2_results.psd.cbush_force[1].element)
>> [1005    1006]
print(random.op2_results.psd.cbush_force[1].element_ids)
>> [1005      ,    1006]
random.op2_results.psd.cbush_force[1].data
>> array([[[3.5451579e+00, 1.4228966e+00, 2.4901101e-05, 3.3304757e-06,
         1.3134211e-06, 0.0000000e+00],
        [3.5451579e+00, 1.4228966e+00, 2.4901101e-05, 3.3304757e-06,
         1.3134211e-06, 0.0000000e+00]],
Is it clean enough as implementation ? Would it be possible to add that in the main branch? 
Best regards, 
Cédric