48 lines
1.2 KiB
C++
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
|