template_blas_asum.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_ASUM_HEADER
00036 #define TEMPLATE_BLAS_ASUM_HEADER
00037 
00038 
00039 template<class Treal>
00040 Treal template_blas_asum(const integer *n, const Treal *dx, const integer *incx)
00041 {
00042     /* System generated locals */
00043     integer i__1, i__2;
00044     Treal ret_val, d__1, d__2, d__3, d__4, d__5, d__6;
00045     /* Local variables */
00046      integer i__, m;
00047      Treal dtemp;
00048      integer nincx, mp1;
00049 /*     takes the sum of the absolute values.   
00050        jack dongarra, linpack, 3/11/78.   
00051        modified 3/93 to return if incx .le. 0.   
00052        modified 12/3/93, array(1) declarations changed to array(*)   
00053        Parameter adjustments */
00054     --dx;
00055     /* Function Body */
00056     ret_val = 0.;
00057     dtemp = 0.;
00058     if (*n <= 0 || *incx <= 0) {
00059         return ret_val;
00060     }
00061     if (*incx == 1) {
00062         goto L20;
00063     }
00064 /*        code for increment not equal to 1 */
00065     nincx = *n * *incx;
00066     i__1 = nincx;
00067     i__2 = *incx;
00068     for (i__ = 1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) {
00069         dtemp += (d__1 = dx[i__], absMACRO(d__1));
00070 /* L10: */
00071     }
00072     ret_val = dtemp;
00073     return ret_val;
00074 /*        code for increment equal to 1   
00075           clean-up loop */
00076 L20:
00077     m = *n % 6;
00078     if (m == 0) {
00079         goto L40;
00080     }
00081     i__2 = m;
00082     for (i__ = 1; i__ <= i__2; ++i__) {
00083         dtemp += (d__1 = dx[i__], absMACRO(d__1));
00084 /* L30: */
00085     }
00086     if (*n < 6) {
00087         goto L60;
00088     }
00089 L40:
00090     mp1 = m + 1;
00091     i__2 = *n;
00092     for (i__ = mp1; i__ <= i__2; i__ += 6) {
00093         dtemp = dtemp + (d__1 = dx[i__], absMACRO(d__1)) + (d__2 = dx[i__ + 1], 
00094                 absMACRO(d__2)) + (d__3 = dx[i__ + 2], absMACRO(d__3)) + (d__4 = dx[i__ 
00095                 + 3], absMACRO(d__4)) + (d__5 = dx[i__ + 4], absMACRO(d__5)) + (d__6 = 
00096                 dx[i__ + 5], absMACRO(d__6));
00097 /* L50: */
00098     }
00099 L60:
00100     ret_val = dtemp;
00101     return ret_val;
00102 } /* dasum_ */
00103 
00104 #endif

Generated on Mon Sep 17 14:30:40 2012 for ergo by  doxygen 1.4.7