⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lapacksubs.f

📁 利用离散偶极近似方法计算散射体的电磁场。 DDA 方法
💻 F
📖 第 1 页 / 共 5 页
字号:
*  possibly NaN arithmetic is safe (i.e. will not trap).**  Arguments*  =========**  ISPEC   (input) INTEGER*          Specifies whether to test just for inifinity arithmetic*          or whether to test for infinity and NaN arithmetic.*          = 0: Verify infinity arithmetic only.*          = 1: Verify infinity and NaN arithmetic.**  ZERO    (input) REAL*          Must contain the value 0.0*          This is passed to prevent the compiler from optimizing*          away this code.**  ONE     (input) REAL*          Must contain the value 1.0*          This is passed to prevent the compiler from optimizing*          away this code.**  RETURN VALUE:  INTEGER*          = 0:  Arithmetic failed to produce the correct answers*          = 1:  Arithmetic produced the correct answers**     .. Local Scalars ..      REAL               NAN1, NAN2, NAN3, NAN4, NAN5, NAN6, NEGINF,     $                   NEGZRO, NEWZRO, POSINF*     ..*     .. Executable Statements ..      IEEECK = 1*      POSINF = ONE / ZERO      IF( POSINF.LE.ONE ) THEN         IEEECK = 0         RETURN      END IF*      NEGINF = -ONE / ZERO      IF( NEGINF.GE.ZERO ) THEN         IEEECK = 0         RETURN      END IF*      NEGZRO = ONE / ( NEGINF+ONE )      IF( NEGZRO.NE.ZERO ) THEN         IEEECK = 0         RETURN      END IF*      NEGINF = ONE / NEGZRO      IF( NEGINF.GE.ZERO ) THEN         IEEECK = 0         RETURN      END IF*      NEWZRO = NEGZRO + ZERO      IF( NEWZRO.NE.ZERO ) THEN         IEEECK = 0         RETURN      END IF*      POSINF = ONE / NEWZRO      IF( POSINF.LE.ONE ) THEN         IEEECK = 0         RETURN      END IF*      NEGINF = NEGINF*POSINF      IF( NEGINF.GE.ZERO ) THEN         IEEECK = 0         RETURN      END IF*      POSINF = POSINF*POSINF      IF( POSINF.LE.ONE ) THEN         IEEECK = 0         RETURN      END IF*****     Return if we were only asked to check infinity arithmetic*      IF( ISPEC.EQ.0 )     $   RETURN*      NAN1 = POSINF + NEGINF*      NAN2 = POSINF / NEGINF*      NAN3 = POSINF / POSINF*      NAN4 = POSINF*ZERO*      NAN5 = NEGINF*NEGZRO*      NAN6 = NAN5*0.0*      IF( NAN1.EQ.NAN1 ) THEN         IEEECK = 0         RETURN      END IF*      IF( NAN2.EQ.NAN2 ) THEN         IEEECK = 0         RETURN      END IF*      IF( NAN3.EQ.NAN3 ) THEN         IEEECK = 0         RETURN      END IF*      IF( NAN4.EQ.NAN4 ) THEN         IEEECK = 0         RETURN      END IF*      IF( NAN5.EQ.NAN5 ) THEN         IEEECK = 0         RETURN      END IF*      IF( NAN6.EQ.NAN6 ) THEN         IEEECK = 0         RETURN      END IF*      RETURN      END      INTEGER          FUNCTION ILAENV( ISPEC, NAME, OPTS, N1, N2, N3,     $                 N4 )**  -- LAPACK auxiliary routine (version 3.0) --*     Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd.,*     Courant Institute, Argonne National Lab, and Rice University*     June 30, 1999**     .. Scalar Arguments ..      CHARACTER*( * )    NAME, OPTS      INTEGER            ISPEC, N1, N2, N3, N4*     ..**  Purpose*  =======**  ILAENV is called from the LAPACK routines to choose problem-dependent*  parameters for the local environment.  See ISPEC for a description of*  the parameters.**  This version provides a set of parameters which should give good,*  but not optimal, performance on many of the currently available*  computers.  Users are encouraged to modify this subroutine to set*  the tuning parameters for their particular machine using the option*  and problem size information in the arguments.**  This routine will not function correctly if it is converted to all*  lower case.  Converting it to all upper case is allowed.**  Arguments*  =========**  ISPEC   (input) INTEGER*          Specifies the parameter to be returned as the value of*          ILAENV.*          = 1: the optimal blocksize; if this value is 1, an unblocked*               algorithm will give the best performance.*          = 2: the minimum block size for which the block routine*               should be used; if the usable block size is less than*               this value, an unblocked routine should be used.*          = 3: the crossover point (in a block routine, for N less*               than this value, an unblocked routine should be used)*          = 4: the number of shifts, used in the nonsymmetric*               eigenvalue routines*          = 5: the minimum column dimension for blocking to be used;*               rectangular blocks must have dimension at least k by m,*               where k is given by ILAENV(2,...) and m by ILAENV(5,...)*          = 6: the crossover point for the SVD (when reducing an m by n*               matrix to bidiagonal form, if max(m,n)/min(m,n) exceeds*               this value, a QR factorization is used first to reduce*               the matrix to a triangular form.)*          = 7: the number of processors*          = 8: the crossover point for the multishift QR and QZ methods*               for nonsymmetric eigenvalue problems.*          = 9: maximum size of the subproblems at the bottom of the*               computation tree in the divide-and-conquer algorithm*               (used by xGELSD and xGESDD)*          =10: ieee NaN arithmetic can be trusted not to trap*          =11: infinity arithmetic can be trusted not to trap**  NAME    (input) CHARACTER*(*)*          The name of the calling subroutine, in either upper case or*          lower case.**  OPTS    (input) CHARACTER*(*)*          The character options to the subroutine NAME, concatenated*          into a single character string.  For example, UPLO = 'U',*          TRANS = 'T', and DIAG = 'N' for a triangular routine would*          be specified as OPTS = 'UTN'.**  N1      (input) INTEGER*  N2      (input) INTEGER*  N3      (input) INTEGER*  N4      (input) INTEGER*          Problem dimensions for the subroutine NAME; these may not all*          be required.** (ILAENV) (output) INTEGER*          >= 0: the value of the parameter specified by ISPEC*          < 0:  if ILAENV = -k, the k-th argument had an illegal value.**  Further Details*  ===============**  The following conventions have been used when calling ILAENV from the*  LAPACK routines:*  1)  OPTS is a concatenation of all of the character options to*      subroutine NAME, in the same order that they appear in the*      argument list for NAME, even if they are not used in determining*      the value of the parameter specified by ISPEC.*  2)  The problem dimensions N1, N2, N3, N4 are specified in the order*      that they appear in the argument list for NAME.  N1 is used*      first, N2 second, and so on, and unused problem dimensions are*      passed a value of -1.*  3)  The parameter value returned by ILAENV is checked for validity in*      the calling subroutine.  For example, ILAENV is used to retrieve*      the optimal blocksize for STRTRI as follows:**      NB = ILAENV( 1, 'STRTRI', UPLO // DIAG, N, -1, -1, -1 )*      IF( NB.LE.1 ) NB = MAX( 1, N )**  =====================================================================**     .. Local Scalars ..      LOGICAL            CNAME, SNAME      CHARACTER*1        C1      CHARACTER*2        C2, C4      CHARACTER*3        C3      CHARACTER*6        SUBNAM      INTEGER            I, IC, IZ, NB, NBMIN, NX*     ..*     .. Intrinsic Functions ..      INTRINSIC          CHAR, ICHAR, INT, MIN, REAL*     ..*     .. External Functions ..      INTEGER            IEEECK      EXTERNAL           IEEECK*     ..*     .. Executable Statements ..*      GO TO ( 100, 100, 100, 400, 500, 600, 700, 800, 900, 1000,     $        1100 ) ISPEC**     Invalid value for ISPEC*      ILAENV = -1      RETURN*  100 CONTINUE**     Convert NAME to upper case if the first character is lower case.*      ILAENV = 1      SUBNAM = NAME      IC = ICHAR( SUBNAM( 1:1 ) )      IZ = ICHAR( 'Z' )      IF( IZ.EQ.90 .OR. IZ.EQ.122 ) THEN**        ASCII character set*         IF( IC.GE.97 .AND. IC.LE.122 ) THEN            SUBNAM( 1:1 ) = CHAR( IC-32 )            DO 10 I = 2, 6               IC = ICHAR( SUBNAM( I:I ) )               IF( IC.GE.97 .AND. IC.LE.122 )     $            SUBNAM( I:I ) = CHAR( IC-32 )   10       CONTINUE         END IF*      ELSE IF( IZ.EQ.233 .OR. IZ.EQ.169 ) THEN**        EBCDIC character set*         IF( ( IC.GE.129 .AND. IC.LE.137 ) .OR.     $       ( IC.GE.145 .AND. IC.LE.153 ) .OR.     $       ( IC.GE.162 .AND. IC.LE.169 ) ) THEN            SUBNAM( 1:1 ) = CHAR( IC+64 )            DO 20 I = 2, 6               IC = ICHAR( SUBNAM( I:I ) )               IF( ( IC.GE.129 .AND. IC.LE.137 ) .OR.     $             ( IC.GE.145 .AND. IC.LE.153 ) .OR.     $             ( IC.GE.162 .AND. IC.LE.169 ) )     $            SUBNAM( I:I ) = CHAR( IC+64 )   20       CONTINUE         END IF*      ELSE IF( IZ.EQ.218 .OR. IZ.EQ.250 ) THEN**        Prime machines:  ASCII+128*         IF( IC.GE.225 .AND. IC.LE.250 ) THEN            SUBNAM( 1:1 ) = CHAR( IC-32 )            DO 30 I = 2, 6               IC = ICHAR( SUBNAM( I:I ) )               IF( IC.GE.225 .AND. IC.LE.250 )     $            SUBNAM( I:I ) = CHAR( IC-32 )   30       CONTINUE         END IF      END IF*      C1 = SUBNAM( 1:1 )      SNAME = C1.EQ.'S' .OR. C1.EQ.'D'      CNAME = C1.EQ.'C' .OR. C1.EQ.'Z'      IF( .NOT.( CNAME .OR. SNAME ) )     $   RETURN      C2 = SUBNAM( 2:3 )      C3 = SUBNAM( 4:6 )      C4 = C3( 2:3 )*      GO TO ( 110, 200, 300 ) ISPEC*  110 CONTINUE**     ISPEC = 1:  block size**     In these examples, separate code is provided for setting NB for*     real and complex.  We assume that NB will take the same value in*     single or double precision.*      NB = 1*      IF( C2.EQ.'GE' ) THEN         IF( C3.EQ.'TRF' ) THEN            IF( SNAME ) THEN               NB = 64            ELSE               NB = 64            END IF         ELSE IF( C3.EQ.'QRF' .OR. C3.EQ.'RQF' .OR. C3.EQ.'LQF' .OR.     $            C3.EQ.'QLF' ) THEN            IF( SNAME ) THEN               NB = 32            ELSE               NB = 32            END IF         ELSE IF( C3.EQ.'HRD' ) THEN            IF( SNAME ) THEN               NB = 32            ELSE               NB = 32            END IF         ELSE IF( C3.EQ.'BRD' ) THEN            IF( SNAME ) THEN               NB = 32            ELSE               NB = 32            END IF         ELSE IF( C3.EQ.'TRI' ) THEN            IF( SNAME ) THEN               NB = 64            ELSE               NB = 64            END IF         END IF      ELSE IF( C2.EQ.'PO' ) THEN         IF( C3.EQ.'TRF' ) THEN            IF( SNAME ) THEN               NB = 64            ELSE               NB = 64            END IF         END IF      ELSE IF( C2.EQ.'SY' ) THEN         IF( C3.EQ.'TRF' ) THEN            IF( SNAME ) THEN               NB = 64            ELSE               NB = 64            END IF         ELSE IF( SNAME .AND. C3.EQ.'TRD' ) THEN            NB = 32         ELSE IF( SNAME .AND. C3.EQ.'GST' ) THEN            NB = 64         END IF      ELSE IF( CNAME .AND. C2.EQ.'HE' ) THEN         IF( C3.EQ.'TRF' ) THEN            NB = 64         ELSE IF( C3.EQ.'TRD' ) THEN            NB = 32         ELSE IF( C3.EQ.'GST' ) THEN            NB = 64         END IF      ELSE IF( SNAME .AND. C2.EQ.'OR' ) THEN         IF( C3( 1:1 ).EQ.'G' ) THEN            IF( C4.EQ.'QR' .OR. C4.EQ.'RQ' .OR. C4.EQ.'LQ' .OR.     $          C4.EQ.'QL' .OR. C4.EQ.'HR' .OR. C4.EQ.'TR' .OR.     $          C4.EQ.'BR' ) THEN               NB = 32            END IF         ELSE IF( C3( 1:1 ).EQ.'M' ) THEN            IF( C4.EQ.'QR' .OR. C4.EQ.'RQ' .OR. C4.EQ.'LQ' .OR.     $          C4.EQ.'QL' .OR. C4.EQ.'HR' .OR. C4.EQ.'TR' .OR.     $          C4.EQ.'BR' ) THEN               NB = 32            END IF         END IF      ELSE IF( CNAME .AND. C2.EQ.'UN' ) THEN         IF( C3( 1:1 ).EQ.'G' ) THEN            IF( C4.EQ.'QR' .OR. C4.EQ.'RQ' .OR. C4.EQ.'LQ' .OR.     $          C4.EQ.'QL' .OR. C4.EQ.'HR' .OR. C4.EQ.'TR' .OR.     $          C4.EQ.'BR' ) THEN               NB = 32            END IF         ELSE IF( C3( 1:1 ).EQ.'M' ) THEN            IF( C4.EQ.'QR' .OR. C4.EQ.'RQ' .OR. C4.EQ.'LQ' .OR.     $          C4.EQ.'QL' .OR. C4.EQ.'HR' .OR. C4.EQ.'TR' .OR.     $          C4.EQ.'BR' ) THEN               NB = 32            END IF         END IF      ELSE IF( C2.EQ.'GB' ) THEN         IF( C3.EQ.'TRF' ) THEN            IF( SNAME ) THEN               IF( N4.LE.64 ) THEN

⌨️ 快捷键说明

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