Files
lammps/lib/linalg/dlasdt.cpp

48 lines
1.2 KiB
C++

#ifdef __cplusplus
extern "C" {
#endif
#include "lmp_f2c.h"
int dlasdt_(integer *n, integer *lvl, integer *nd, integer *inode, integer *ndiml, integer *ndimr,
integer *msub)
{
integer i__1, i__2;
double log(doublereal);
integer i__, il, ir, maxn;
doublereal temp;
integer nlvl, llst, ncrnt;
--ndimr;
--ndiml;
--inode;
maxn = max(1, *n);
temp = log((doublereal)maxn / (doublereal)(*msub + 1)) / log(2.);
*lvl = (integer)temp + 1;
i__ = *n / 2;
inode[1] = i__ + 1;
ndiml[1] = i__;
ndimr[1] = *n - i__ - 1;
il = 0;
ir = 1;
llst = 1;
i__1 = *lvl - 1;
for (nlvl = 1; nlvl <= i__1; ++nlvl) {
i__2 = llst - 1;
for (i__ = 0; i__ <= i__2; ++i__) {
il += 2;
ir += 2;
ncrnt = llst + i__;
ndiml[il] = ndiml[ncrnt] / 2;
ndimr[il] = ndiml[ncrnt] - ndiml[il] - 1;
inode[il] = inode[ncrnt] - ndimr[il] - 1;
ndiml[ir] = ndimr[ncrnt] / 2;
ndimr[ir] = ndimr[ncrnt] - ndiml[ir] - 1;
inode[ir] = inode[ncrnt] + ndiml[ir] + 1;
}
llst <<= 1;
}
*nd = (llst << 1) - 1;
return 0;
}
#ifdef __cplusplus
}
#endif