File: MA02DD.f

package info (click to toggle)
dynare 4.3.0-2
  • links: PTS, VCS
  • area: main
  • in suites: wheezy
  • size: 40,640 kB
  • sloc: fortran: 82,231; cpp: 72,734; ansic: 28,874; pascal: 13,241; sh: 4,300; objc: 3,281; yacc: 2,833; makefile: 1,288; lex: 1,162; python: 162; lisp: 54; xml: 8
file content (157 lines) | stat: -rw-r--r-- 5,224 bytes parent folder | download
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
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
      SUBROUTINE MA02DD( JOB, UPLO, N, A, LDA, AP )
C
C     SLICOT RELEASE 5.0.
C
C     Copyright (c) 2002-2009 NICONET e.V.
C
C     This program is free software: you can redistribute it and/or
C     modify it under the terms of the GNU General Public License as
C     published by the Free Software Foundation, either version 2 of
C     the License, or (at your option) any later version.
C
C     This program is distributed in the hope that it will be useful,
C     but WITHOUT ANY WARRANTY; without even the implied warranty of
C     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
C     GNU General Public License for more details.
C
C     You should have received a copy of the GNU General Public License
C     along with this program.  If not, see
C     <http://www.gnu.org/licenses/>.
C
C     PURPOSE
C
C     To pack/unpack the upper or lower triangle of a symmetric matrix.
C     The packed matrix is stored column-wise in the one-dimensional
C     array AP.
C
C     ARGUMENTS
C
C     Mode Parameters
C
C     JOB     CHARACTER*1
C             Specifies whether the matrix should be packed or unpacked,
C             as follows:
C             = 'P':  The matrix should be packed;
C             = 'U':  The matrix should be unpacked.
C
C     UPLO    CHARACTER*1
C             Specifies the part of the matrix to be packed/unpacked,
C             as follows:
C             = 'U':  Upper triangular part;
C             = 'L':  Lower triangular part.
C
C     Input/Output Parameters
C
C     N       (input) INTEGER
C             The order of the matrix A.  N >= 0.
C
C     A       (input or output) DOUBLE PRECISION array, dimension
C             (LDA,N)
C             This array is an input parameter if JOB = 'P', and an
C             output parameter if JOB = 'U'.
C             On entry, if JOB = 'P', the leading N-by-N upper
C             triangular part (if UPLO = 'U'), or lower triangular part
C             (if UPLO = 'L'), of this array must contain the
C             corresponding upper or lower triangle of the symmetric
C             matrix A, and the other strictly triangular part is not
C             referenced.
C             On exit, if JOB = 'U', the leading N-by-N upper triangular
C             part (if UPLO = 'U'), or lower triangular part (if
C             UPLO = 'L'), of this array contains the corresponding
C             upper or lower triangle of the symmetric matrix A; the
C             other strictly triangular part is not referenced.
C
C     LDA     INTEGER
C             The leading dimension of the array A.  LDA >= max(1,N).
C
C     AP      (output or input) DOUBLE PRECISION array, dimension
C             (N*(N+1)/2)
C             This array is an output parameter if JOB = 'P', and an
C             input parameter if JOB = 'U'.
C             On entry, if JOB = 'U', the leading N*(N+1)/2 elements of
C             this array must contain the upper (if UPLO = 'U') or lower
C             (if UPLO = 'L') triangle of the symmetric matrix A, packed
C             column-wise. That is, the elements are stored in the order
C             11, 12, 22, ..., 1n, 2n, 3n, ..., nn,      if UPLO = 'U';
C             11, 21, 31, ..., n1, 22, 32, ..., n2, ..., if UPLO = 'L'.
C             On exit, if JOB = 'P', the leading N*(N+1)/2 elements of
C             this array contain the upper (if UPLO = 'U') or lower
C             (if UPLO = 'L') triangle of the symmetric matrix A, packed
C             column-wise, as described above.
C
C     CONTRIBUTOR
C
C     V. Sima, Research Institute for Informatics, Bucharest, Romania,
C     Oct. 1998.
C
C     REVISIONS
C
C     -
C
C     ******************************************************************
C
C     .. Scalar Arguments ..
      CHARACTER          JOB, UPLO
      INTEGER            LDA, N
C     .. Array Arguments ..
      DOUBLE PRECISION   A(LDA,*), AP(*)
C     .. Local Scalars ..
      LOGICAL            LUPLO
      INTEGER            IJ, J
C     .. External Functions ..
      LOGICAL            LSAME
      EXTERNAL           LSAME
C     .. External Subroutines ..
      EXTERNAL           DCOPY
C
C     .. Executable Statements ..
C
C     For efficiency reasons, the parameters are not checked for errors.
C
      LUPLO = LSAME( UPLO, 'L' )
      IJ = 1
      IF( LSAME( JOB, 'P' ) ) THEN
         IF( LUPLO ) THEN
C
C           Pack the lower triangle of A.
C
            DO 20 J = 1, N
               CALL DCOPY( N-J+1, A(J,J), 1, AP(IJ), 1 )
               IJ = IJ + N - J + 1
   20       CONTINUE
C
         ELSE
C
C           Pack the upper triangle of A.
C
            DO 40 J = 1, N
               CALL DCOPY( J, A(1,J), 1, AP(IJ), 1 )
               IJ = IJ + J
   40       CONTINUE
C
         END IF
      ELSE
         IF( LUPLO ) THEN
C
C           Unpack the lower triangle of A.
C
            DO 60 J = 1, N
               CALL DCOPY( N-J+1, AP(IJ), 1, A(J,J), 1 )
               IJ = IJ + N - J + 1
   60       CONTINUE
C
         ELSE
C
C           Unpack the upper triangle of A.
C
            DO 80 J = 1, N
               CALL DCOPY( J, AP(IJ), 1, A(1,J), 1 )
               IJ = IJ + J
   80       CONTINUE
C
         END IF
      END IF
C
      RETURN
C *** Last line of MA02DD ***
      END