Also the use of For loop is very awkward and can be much simplified for readability:
data = ParallelTable[
pf = \[Rho][r];
pf /= Tr[pf];
ef = Chop[Eigenvalues[pf]];
fdiag = 0;
fSp = 0;
Do[
If[Chop[pf[[i, i]]] =!= 0,
fdiag -= pf[[i, i]] Log2[pf[[i, i]]]
];
If[ef[[i]] =!= 0,
fSp -= ef[[i]] Log2[ef[[i]]]
];
,
{i, 1, Length[\[Rho][r]]}
];
(fdiag - Re[fSp])/4
,
{r, 0.01, 3.5, 0.01}
];
But even these loops are not really needed as the entire thing can be handled in a vector manner:
ClearAll[NewLog2]
SetAttributes[NewLog2, Listable];
NewLog2[val_] := If[Chop[val] == 0, 0, Log2[val]]
data = ParallelTable[
pf = \[Rho][r];
pf /= Tr[pf];
ef = Chop[Eigenvalues[pf]];
fdiag = -Total[Diagonal[pf] NewLog2[Diagonal[pf]]];
fSp = -Total[ef NewLog2[ef]];
(fdiag - Re[fSp])/4
,
{r, 0.01, 3.5, 0.01}
];