2 #include "../gmx_blas.h"
3 #include "../gmx_lapack.h"
4 #include "lapack_limits.h"
6 #include "gromacs/utility/real.h"
9 F77_FUNC(dlasq1
,DLASQ1
)(int *n
,
17 double minval
,safemin
;
22 minval
= GMX_DOUBLE_MIN
;
23 safemin
= minval
*(1.0+GMX_DOUBLE_EPS
);
32 d
[i
] = std::abs(d
[i
]);
33 dtemp
= std::abs(e
[i
]);
37 d
[*n
-1] = std::abs(d
[*n
-1]);
39 if(std::abs(sigmx
)<GMX_DOUBLE_MIN
) {
40 F77_FUNC(dlasrt
,DLASRT
)("D",n
,d
,&iinfo
);
49 /* Copy d and e into work (z format) and scale.
50 * Squaring input data makes scaling by a power of the
53 scale
= std::sqrt(eps
/safemin
);
56 F77_FUNC(dcopy
,DCOPY
)(n
,d
,&i
,work
,&j
);
58 F77_FUNC(dcopy
,DCOPY
)(&k
,e
,&i
,work
+1,&j
);
62 F77_FUNC(dlascl
,DLASCL
)("G",&i
,&i
,&sigmx
,&scale
,&j
,&k
,work
,&j
,&iinfo
);
65 /* Compute q and e elements */
66 for(i
=0;i
<2*(*n
)-1;i
++)
67 work
[i
] = work
[i
]*work
[i
];
71 F77_FUNC(dlasq2
,DLASQ2
)(n
,work
,info
);
77 d
[i
]= std::sqrt(work
[i
]);
78 F77_FUNC(dlascl
,DLASCL
)("G",&j
,&j
,&scale
,&sigmx
,n
,&k
,d
,n
,&iinfo
);