atl_drefrotmg.c

来自「基于Blas CLapck的.用过的人知道是干啥的」· C语言 代码 · 共 260 行

C
260
字号
/* --------------------------------------------------------------------- * * -- Automatically Tuned Linear Algebra Software (ATLAS) *    (C) Copyright 2000 All Rights Reserved * * -- ATLAS routine -- Version 3.2 -- December 25, 2000 * * Author         : Antoine P. Petitet * Originally developed at the University of Tennessee, * Innovative Computing Laboratory, Knoxville TN, 37996-1301, USA. * * --------------------------------------------------------------------- * * -- Copyright notice and Licensing terms: * *  Redistribution  and  use in  source and binary forms, with or without *  modification, are  permitted provided  that the following  conditions *  are met: * * 1. Redistributions  of  source  code  must retain the above copyright *    notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce  the above copyright *    notice,  this list of conditions, and the  following disclaimer in *    the documentation and/or other materials provided with the distri- *    bution. * 3. The name of the University,  the ATLAS group,  or the names of its *    contributors  may not be used to endorse or promote products deri- *    ved from this software without specific written permission. * * -- Disclaimer: * * THIS  SOFTWARE  IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,  INCLUDING,  BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE UNIVERSITY * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,  INDIRECT, INCIDENTAL, SPE- * CIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO,  PROCUREMENT  OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEO- * RY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT  (IN- * CLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * --------------------------------------------------------------------- *//* * Include files */#include "atlas_refmisc.h"#include "atlas_reflevel1.h"#define   GAM           4096.0#define   GAMSQ         16777216.0void ATL_drefrotmg(   double                     * D1,   double                     * D2,   double                     * X1,   const double               Y1,   double                     * PARAM){/* * Purpose * ======= * * ATL_drefrotmg  constructs the modified-Givens plane rotation. The in- * put scalars d1, d2, x1 and y1 define a 2-vector [a1 a2]' such that * *    [ a1 ]   [ d1^{1/2}  0      ] [ x1 ] *    [ a2 ] = [   0     d2^{1/2} ] [ y1 ]. * * This subroutine determines the modified Givens rotation matrix H that * transforms y1 and thus a2 to zero. A representation of this matrix is * stored in the output array PARAM. * * See ``Basic Linear Algebra Subprograms for Fortran Usage'' by C. Law- * son, R. Hanson, D. Kincaid and F. Krogh, ACM Transactions on Mathema- * tical Software, 1979, 5(3) pp 308-323, for further information. * * Arguments * ========= * * D1      (input/output)                double * *         On entry, D1 specifies the scalar d1. * * D2      (input/output)                double * *         On entry, D2 specifies the scalar d2. * * X1      (input/output)                double * *         On entry, X1 specifies the scalar x1. * * Y1      (input)                       const double *         On entry, Y1 specifies the scalar y1. Unchanged on exit. * * PARAM   (output)                      double * *         On entry, PARAM is an array of dimension at least 5. On exit, *         the entries of this array have the following meaning: * *         if PARAM[ 0 ] = 1, *            h_12 = 1, h_21 = -1, PARAM[ 1 ] = h_11, PARAM[ 4 ] = h_22, *            and the other entries of PARAM are left unchanged; *         else if PARAM[ 0 ] = 0, *            h_11 = 1, h_22 =  1, PARAM[ 2 ] = h_21, PARAM[ 3 ] = h_12, *            and the other entries of PARAM are left unchanged; *         else if PARAM[ 0 ] = -1, (case of re-scaling) *            PARAM( 2 ) = h_11, PARAM[ 2 ] = h_21, *            PARAM( 4 ) = h_12, PARAM[ 4 ] = h_22; *         else if PARAM[ 0 ] = -2, *            H = I, and the other entries of PARAM are left unchanged; *         end if * * --------------------------------------------------------------------- *//* * .. Local Variables .. */   static const double        gam   = GAM,   rgam   = ATL_dONE / GAM;   static const double        gamsq = GAMSQ, rgamsq = ATL_dONE / GAMSQ;   double                     d1 = (*D1), d2 = (*D2), flag, h11, h12, h21, h22,                              p1, p2, q1, q2, tmp, u, x1 = (*X1);/* .. * .. Executable Statements .. * */   h11 = h12 = h21 = h22 = ATL_dZERO;   if( d1 < ATL_dZERO )   {       PARAM[0] = ATL_dNONE;       PARAM[1] = PARAM[2] = PARAM[3] = PARAM[4] = ATL_dZERO;       *D1 = *D2 = *X1 = ATL_dZERO;       return;   }   if( ( p2 = d2 * Y1 ) == ATL_dZERO )   { PARAM[0] = ATL_dNTWO; return; }   p1 = d1 * x1; q2 = p2 * Y1; q1 = p1 * x1;   if( Mdabs( q1 ) > Mdabs( q2 ) )   {      h21 = - Y1 / x1; h12 = p2 / p1; u = ATL_dONE - h12 * h21;      if( u <= ATL_dZERO )      {         PARAM[0] = ATL_dNONE;         PARAM[1] = PARAM[2] = PARAM[3] = PARAM[4] = ATL_dZERO;         *D1 = *D2 = *X1 = ATL_dZERO;         return;      }      flag = ATL_dZERO; d1 /= u; d2 /= u; x1 *= u;   }   else   {      if( q2 < ATL_dZERO )      {         PARAM[0] = ATL_dNONE;         PARAM[1] = PARAM[2] = PARAM[3] = PARAM[4] = ATL_dZERO;         *D1 = *D2 = *X1 = ATL_dZERO;         return;      }      flag = ATL_dONE;      h11  = p1 / p2; h22  = x1 / Y1;      u    = ATL_dONE + h11 * h22; tmp  = d2 / u;      d2   = d1 / u; d1   = tmp; x1 = Y1 * u;   }   if( d1 <= rgamsq )   {      if( d1 != ATL_dZERO )                      /* scale d1 up */      {         if(      flag == ATL_dZERO )         { h11  = ATL_dONE;  h22  = ATL_dONE; flag = ATL_dNONE; }         else if( flag >  ATL_dZERO )         { h21  = ATL_dNONE; h12  = ATL_dONE; flag = ATL_dNONE; }         do         {            d1 *= gamsq; x1 *= rgam; h11 *= rgam; h12 *= rgam;         } while( d1 <= rgamsq );      }   }   else if( d1 >= gamsq )                            /* scale d1 down */   {      if(      flag == ATL_dZERO )      { h11  = ATL_dONE;  h22  = ATL_dONE; flag = ATL_dNONE; }      else if( flag > ATL_dZERO )      { h21  = ATL_dNONE; h12  = ATL_dONE; flag = ATL_dNONE; }      do      {         d1 *= rgamsq; x1 *= gam; h11 *= gam; h12 *= gam;      } while( d1 >= gamsq );   }   if( ( tmp = Mdabs( d2 ) ) <= rgamsq )   {      if( d2 != ATL_dZERO )                      /* scale d2 up */      {         if(      flag == ATL_dZERO )         { h11  = ATL_dONE;  h22  = ATL_dONE; flag = ATL_dNONE; }         else if( flag > ATL_dZERO )         { h21  = ATL_dNONE; h12  = ATL_dONE; flag = ATL_dNONE;         }         if( d2 > ATL_dZERO )         {            do            {               d2 *= gamsq; h21 *= rgam; h22 *= rgam;            } while( d2 <=  rgamsq );         }         else         {            do            {               d2 *= gamsq; h21 *= rgam; h22 *= rgam;            } while( d2 >= -rgamsq );         }      }   }   else if( tmp >= gamsq )                         /* scale d2 down */   {      if(      flag == ATL_dZERO )      { h11  = ATL_dONE;  h22  = ATL_dONE; flag = ATL_dNONE; }      else if( flag >  ATL_dZERO )      { h21  = ATL_dNONE; h12  = ATL_dONE; flag = ATL_dNONE; }      if( d2 > ATL_dZERO )      {         do         {            d2 *= rgamsq; h21 *= gam; h22 *= gam;         } while( d2 >= gamsq );      }      else      {         do         {            d2 *= rgamsq; h21 *= gam; h22 *= gam;         } while( d2 <= -gamsq );      }   }   *D1 = d1; *D2 = d2; *X1 = x1;   PARAM[0] = flag;   if(      flag <  ATL_dZERO )   { PARAM[1] = h11; PARAM[2] = h21; PARAM[3] = h12; PARAM[4] = h22; }   else if( flag == ATL_dZERO )   {                 PARAM[2] = h21; PARAM[3] = h12;                 }   else   { PARAM[1] = h11;                                 PARAM[4] = h22; }/* * End of ATL_drefrotmg */}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?