File: legacy_array_sections_11.f90

package info (click to toggle)
lfortran 0.59.0-3
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 56,736 kB
  • sloc: cpp: 168,052; f90: 74,272; python: 17,537; ansic: 7,705; yacc: 2,345; sh: 1,334; fortran: 895; makefile: 37; javascript: 15
file content (100 lines) | stat: -rw-r--r-- 2,740 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
      PROGRAM LEGACY_ARRAY_SECTIONS_11
      CHARACTER          TRANS
      INTEGER            IRESID, LDA, LDB, LDX, LWORK, M, N, NRHS
      REAL               A( 1, 1 ), B( 1, 1 ), C( 1, 1 ), WORK( 1 ),
     $                   X( 1, 1 )
      REAL               SQRT17, R

      TRANS = 'N'
      IRESID = 1
      M = 0
      N = 1
      NRHS = 1
      LDA = 1
      LDB = 1
      LDX = 1
      LWORK = 1

      R = SQRT17( TRANS, IRESID, M, N, NRHS, A, LDA, X, LDX, B, LDB,
     $     C, WORK, LWORK )

      IF( R.NE.0.0E0 ) STOP 1

      END

      REAL             FUNCTION SQRT17( TRANS, IRESID, M, N, NRHS, A,
     $                 LDA, X, LDX, B, LDB, C, WORK, LWORK )
      CHARACTER          TRANS
      INTEGER            IRESID, LDA, LDB, LDX, LWORK, M, N, NRHS
      REAL               A( LDA, * ), B( LDB, * ), C( LDB, * ),
     $                   WORK( LWORK ), X( LDX, * )
      REAL               ZERO, ONE
      PARAMETER          ( ZERO = 0.0E0, ONE = 1.0E0 )
      INTEGER            INFO, ISCL, NCOLS, NROWS
      REAL               ERR, NORMA, NORMB, NORMRS, SMLNUM
      REAL               RWORK( 1 )
      LOGICAL            LSAME
      REAL               SLAMCH, SLANGE
      EXTERNAL           LSAME, SLAMCH, SLANGE
      EXTERNAL           SGEMM, SLACPY, SLASCL, XERBLA
      INTRINSIC          MAX, REAL

      SQRT17 = ZERO

      IF( LSAME( TRANS, 'N' ) ) THEN
         NROWS = M
         NCOLS = N
      ELSE IF( LSAME( TRANS, 'T' ) ) THEN
         NROWS = N
         NCOLS = M
      ELSE
         CALL XERBLA( 'SQRT17', 1 )
         RETURN
      END IF

      IF( LWORK.LT.NCOLS*NRHS ) THEN
         CALL XERBLA( 'SQRT17', 13 )
         RETURN
      END IF

      IF( M.LE.0 .OR. N.LE.0 .OR. NRHS.LE.0 ) THEN
         RETURN
      END IF

      NORMA = SLANGE( 'One-norm', M, N, A, LDA, RWORK )
      SMLNUM = SLAMCH( 'Safe minimum' ) / SLAMCH( 'Precision' )
      ISCL = 0

      IF( NORMA.GT.ZERO .AND. NORMA.LT.SMLNUM ) THEN
         ISCL = 1
         CALL SLASCL( 'General', 0, 0, NORMA, SMLNUM, M, N, A, LDA,
     $                INFO )
      END IF

      CALL SLACPY( 'All', NROWS, NRHS, B, LDB, C, LDB )

      CALL SGEMM( 'Transpose', TRANS, NRHS, NCOLS, NROWS, ONE, C, LDB,
     $            A, LDA, ZERO, WORK, NRHS )

      ERR = SLANGE( 'One-norm', NRHS, NCOLS, WORK, NRHS, RWORK )

      NORMB = SLANGE( 'One-norm', NROWS, NRHS, B, LDB, RWORK )

      IF( NORMB.NE.ZERO ) THEN
         NORMRS = ERR / NORMB
      ELSE
         NORMRS = ERR
      END IF

      IF( ISCL.EQ.1 ) THEN
         CALL SLASCL( 'General', 0, 0, SMLNUM, NORMA, M, N, A, LDA,
     $                INFO )
      END IF

      IF( NORMRS.GT.SQRT17 ) THEN
         SQRT17 = NORMRS
      END IF

      RETURN

      END