template_blas_swap.h

Go to the documentation of this file.
00001 /* Ergo, version 3.2, a program for linear scaling electronic structure
00002  * calculations.
00003  * Copyright (C) 2012 Elias Rudberg, Emanuel H. Rubensson, and Pawel Salek.
00004  * 
00005  * This program is free software: you can redistribute it and/or modify
00006  * it under the terms of the GNU General Public License as published by
00007  * the Free Software Foundation, either version 3 of the License, or
00008  * (at your option) any later version.
00009  * 
00010  * This program is distributed in the hope that it will be useful,
00011  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00012  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00013  * GNU General Public License for more details.
00014  * 
00015  * You should have received a copy of the GNU General Public License
00016  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
00017  * 
00018  * Primary academic reference:
00019  * Kohn−Sham Density Functional Theory Electronic Structure Calculations 
00020  * with Linearly Scaling Computational Time and Memory Usage,
00021  * Elias Rudberg, Emanuel H. Rubensson, and Pawel Salek,
00022  * J. Chem. Theory Comput. 7, 340 (2011),
00023  * <http://dx.doi.org/10.1021/ct100611z>
00024  * 
00025  * For further information about Ergo, see <http://www.ergoscf.org>.
00026  */
00027  
00028  /* This file belongs to the template_lapack part of the Ergo source 
00029   * code. The source files in the template_lapack directory are modified
00030   * versions of files originally distributed as CLAPACK, see the
00031   * Copyright/license notice in the file template_lapack/COPYING.
00032   */
00033  
00034 
00035 #ifndef TEMPLATE_BLAS_SWAP_HEADER
00036 #define TEMPLATE_BLAS_SWAP_HEADER
00037 
00038 
00039 template<class Treal>
00040 int template_blas_swap(const integer *n, Treal *dx, const integer *incx, 
00041         Treal *dy, const integer *incy)
00042 {
00043     /* System generated locals */
00044     integer i__1;
00045     /* Local variables */
00046      integer i__, m;
00047      Treal dtemp;
00048      integer ix, iy, mp1;
00049 /*     interchanges two vectors.   
00050        uses unrolled loops for increments equal one.   
00051        jack dongarra, linpack, 3/11/78.   
00052        modified 12/3/93, array(1) declarations changed to array(*)   
00053        Parameter adjustments */
00054     --dy;
00055     --dx;
00056     /* Function Body */
00057     if (*n <= 0) {
00058         return 0;
00059     }
00060     if (*incx == 1 && *incy == 1) {
00061         goto L20;
00062     }
00063 /*       code for unequal increments or equal increments not equal   
00064            to 1 */
00065     ix = 1;
00066     iy = 1;
00067     if (*incx < 0) {
00068         ix = (-(*n) + 1) * *incx + 1;
00069     }
00070     if (*incy < 0) {
00071         iy = (-(*n) + 1) * *incy + 1;
00072     }
00073     i__1 = *n;
00074     for (i__ = 1; i__ <= i__1; ++i__) {
00075         dtemp = dx[ix];
00076         dx[ix] = dy[iy];
00077         dy[iy] = dtemp;
00078         ix += *incx;
00079         iy += *incy;
00080 /* L10: */
00081     }
00082     return 0;
00083 /*       code for both increments equal to 1   
00084          clean-up loop */
00085 L20:
00086     m = *n % 3;
00087     if (m == 0) {
00088         goto L40;
00089     }
00090     i__1 = m;
00091     for (i__ = 1; i__ <= i__1; ++i__) {
00092         dtemp = dx[i__];
00093         dx[i__] = dy[i__];
00094         dy[i__] = dtemp;
00095 /* L30: */
00096     }
00097     if (*n < 3) {
00098         return 0;
00099     }
00100 L40:
00101     mp1 = m + 1;
00102     i__1 = *n;
00103     for (i__ = mp1; i__ <= i__1; i__ += 3) {
00104         dtemp = dx[i__];
00105         dx[i__] = dy[i__];
00106         dy[i__] = dtemp;
00107         dtemp = dx[i__ + 1];
00108         dx[i__ + 1] = dy[i__ + 1];
00109         dy[i__ + 1] = dtemp;
00110         dtemp = dx[i__ + 2];
00111         dx[i__ + 2] = dy[i__ + 2];
00112         dy[i__ + 2] = dtemp;
00113 /* L50: */
00114     }
00115     return 0;
00116 } /* dswap_ */
00117 
00118 #endif

Generated on 21 Nov 2012 for ergo by  doxygen 1.6.1