3
0
mirror of https://github.com/triqs/dft_tools synced 2024-06-02 03:15:33 +02:00
dft_tools/c++/plovasp/atm/argsort.cpp
Oleg E. Peil 911f127789 Ported C-style 'dos_tetra' to C++
In order to wrap the ATM routines by Python using TRIQS wrapping
tools it is necessary to modify the interface to 'dos_tetra3d'.
The major changes involved replacing direct NumPy arrays with
TRIQS arrays which can be converted to Python arrays using library
tools.

Also, some small changes were necessary to port the functions
from C99 complex numbers to C++ style.

CMakeList is added to automatize building of the ATM library.
2016-03-09 18:55:15 +01:00

68 lines
1.5 KiB
C++

/*******************************************************************************
*
* This file is part of the ATM library.
*
* Copyright (C) 2010 by O. E. Peil
*
* TRIQS is free software: you can redistribute it and/or modify it under the
* terms of the GNU General Public License as published by the Free Software
* Foundation, either version 3 of the License, or (at your option) any later
* version.
*
* TRIQS is distributed in the hope that it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
* details.
*
* You should have received a copy of the GNU General Public License along with
* TRIQS. If not, see <http://www.gnu.org/licenses/>.
*
*******************************************************************************/
#include <cstdlib>
int cmp(const void *a, const void *b)
{
return (**(const double **)a) < (**(const double **)b) ? -1 : 1;
}
int icmp(const void *a, const void *b)
{
return (**(const int **)a) - (**(const int **)b);
}
void argsort(double *arr, int *inds, double **ptrs, const int n)
{
int i;
for (i=0; i < n; i++)
{
ptrs[i] = arr + i;
}
qsort(ptrs, n, sizeof(double *), cmp);
for (i=0; i < n; i++)
{
inds[i] = (int)(ptrs[i] - arr);
}
}
void iargsort(int *iarr, int *inds, int **ptrs, const int n)
{
int i;
for (i=0; i < n; i++)
{
ptrs[i] = iarr + i;
}
qsort(ptrs, n, sizeof(int *), icmp);
for (i=0; i < n; i++)
{
inds[i] = (int)(ptrs[i] - iarr);
}
}