1c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath SUBROUTINE SSPR(UPLO,N,ALPHA,X,INCX,AP) 2c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath* .. Scalar Arguments .. 3c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath REAL ALPHA 4c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath INTEGER INCX,N 5c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath CHARACTER UPLO 6c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath* .. 7c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath* .. Array Arguments .. 8c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath REAL AP(*),X(*) 9c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath* .. 10c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath* 11c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath* Purpose 12c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath* ======= 13c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath* 14c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath* SSPR performs the symmetric rank 1 operation 15c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath* 16c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath* A := alpha*x*x' + A, 17c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath* 18c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath* where alpha is a real scalar, x is an n element vector and A is an 19c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath* n by n symmetric matrix, supplied in packed form. 20c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath* 21c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath* Arguments 22c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath* ========== 23c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath* 24c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath* UPLO - CHARACTER*1. 25c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath* On entry, UPLO specifies whether the upper or lower 26c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath* triangular part of the matrix A is supplied in the packed 27c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath* array AP as follows: 28c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath* 29c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath* UPLO = 'U' or 'u' The upper triangular part of A is 30c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath* supplied in AP. 31c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath* 32c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath* UPLO = 'L' or 'l' The lower triangular part of A is 33c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath* supplied in AP. 34c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath* 35c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath* Unchanged on exit. 36c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath* 37c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath* N - INTEGER. 38c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath* On entry, N specifies the order of the matrix A. 39c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath* N must be at least zero. 40c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath* Unchanged on exit. 41c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath* 42c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath* ALPHA - REAL . 43c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath* On entry, ALPHA specifies the scalar alpha. 44c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath* Unchanged on exit. 45c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath* 46c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath* X - REAL array of dimension at least 47c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath* ( 1 + ( n - 1 )*abs( INCX ) ). 48c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath* Before entry, the incremented array X must contain the n 49c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath* element vector x. 50c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath* Unchanged on exit. 51c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath* 52c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath* INCX - INTEGER. 53c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath* On entry, INCX specifies the increment for the elements of 54c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath* X. INCX must not be zero. 55c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath* Unchanged on exit. 56c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath* 57c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath* AP - REAL array of DIMENSION at least 58c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath* ( ( n*( n + 1 ) )/2 ). 59c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath* Before entry with UPLO = 'U' or 'u', the array AP must 60c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath* contain the upper triangular part of the symmetric matrix 61c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath* packed sequentially, column by column, so that AP( 1 ) 62c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath* contains a( 1, 1 ), AP( 2 ) and AP( 3 ) contain a( 1, 2 ) 63c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath* and a( 2, 2 ) respectively, and so on. On exit, the array 64c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath* AP is overwritten by the upper triangular part of the 65c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath* updated matrix. 66c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath* Before entry with UPLO = 'L' or 'l', the array AP must 67c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath* contain the lower triangular part of the symmetric matrix 68c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath* packed sequentially, column by column, so that AP( 1 ) 69c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath* contains a( 1, 1 ), AP( 2 ) and AP( 3 ) contain a( 2, 1 ) 70c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath* and a( 3, 1 ) respectively, and so on. On exit, the array 71c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath* AP is overwritten by the lower triangular part of the 72c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath* updated matrix. 73c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath* 74c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath* Further Details 75c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath* =============== 76c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath* 77c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath* Level 2 Blas routine. 78c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath* 79c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath* -- Written on 22-October-1986. 80c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath* Jack Dongarra, Argonne National Lab. 81c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath* Jeremy Du Croz, Nag Central Office. 82c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath* Sven Hammarling, Nag Central Office. 83c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath* Richard Hanson, Sandia National Labs. 84c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath* 85c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath* ===================================================================== 86c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath* 87c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath* .. Parameters .. 88c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath REAL ZERO 89c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath PARAMETER (ZERO=0.0E+0) 90c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath* .. 91c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath* .. Local Scalars .. 92c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath REAL TEMP 93c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath INTEGER I,INFO,IX,J,JX,K,KK,KX 94c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath* .. 95c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath* .. External Functions .. 96c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath LOGICAL LSAME 97c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EXTERNAL LSAME 98c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath* .. 99c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath* .. External Subroutines .. 100c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EXTERNAL XERBLA 101c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath* .. 102c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath* 103c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath* Test the input parameters. 104c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath* 105c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath INFO = 0 106c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath IF (.NOT.LSAME(UPLO,'U') .AND. .NOT.LSAME(UPLO,'L')) THEN 107c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath INFO = 1 108c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath ELSE IF (N.LT.0) THEN 109c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath INFO = 2 110c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath ELSE IF (INCX.EQ.0) THEN 111c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath INFO = 5 112c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath END IF 113c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath IF (INFO.NE.0) THEN 114c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath CALL XERBLA('SSPR ',INFO) 115c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath RETURN 116c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath END IF 117c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath* 118c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath* Quick return if possible. 119c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath* 120c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath IF ((N.EQ.0) .OR. (ALPHA.EQ.ZERO)) RETURN 121c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath* 122c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath* Set the start point in X if the increment is not unity. 123c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath* 124c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath IF (INCX.LE.0) THEN 125c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath KX = 1 - (N-1)*INCX 126c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath ELSE IF (INCX.NE.1) THEN 127c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath KX = 1 128c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath END IF 129c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath* 130c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath* Start the operations. In this version the elements of the array AP 131c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath* are accessed sequentially with one pass through AP. 132c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath* 133c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath KK = 1 134c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath IF (LSAME(UPLO,'U')) THEN 135c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath* 136c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath* Form A when upper triangle is stored in AP. 137c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath* 138c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath IF (INCX.EQ.1) THEN 139c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath DO 20 J = 1,N 140c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath IF (X(J).NE.ZERO) THEN 141c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath TEMP = ALPHA*X(J) 142c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath K = KK 143c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath DO 10 I = 1,J 144c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath AP(K) = AP(K) + X(I)*TEMP 145c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath K = K + 1 146c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 10 CONTINUE 147c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath END IF 148c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath KK = KK + J 149c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 20 CONTINUE 150c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath ELSE 151c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath JX = KX 152c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath DO 40 J = 1,N 153c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath IF (X(JX).NE.ZERO) THEN 154c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath TEMP = ALPHA*X(JX) 155c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath IX = KX 156c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath DO 30 K = KK,KK + J - 1 157c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath AP(K) = AP(K) + X(IX)*TEMP 158c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath IX = IX + INCX 159c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 30 CONTINUE 160c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath END IF 161c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath JX = JX + INCX 162c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath KK = KK + J 163c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 40 CONTINUE 164c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath END IF 165c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath ELSE 166c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath* 167c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath* Form A when lower triangle is stored in AP. 168c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath* 169c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath IF (INCX.EQ.1) THEN 170c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath DO 60 J = 1,N 171c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath IF (X(J).NE.ZERO) THEN 172c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath TEMP = ALPHA*X(J) 173c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath K = KK 174c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath DO 50 I = J,N 175c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath AP(K) = AP(K) + X(I)*TEMP 176c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath K = K + 1 177c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 50 CONTINUE 178c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath END IF 179c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath KK = KK + N - J + 1 180c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 60 CONTINUE 181c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath ELSE 182c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath JX = KX 183c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath DO 80 J = 1,N 184c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath IF (X(JX).NE.ZERO) THEN 185c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath TEMP = ALPHA*X(JX) 186c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath IX = JX 187c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath DO 70 K = KK,KK + N - J 188c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath AP(K) = AP(K) + X(IX)*TEMP 189c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath IX = IX + INCX 190c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 70 CONTINUE 191c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath END IF 192c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath JX = JX + INCX 193c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath KK = KK + N - J + 1 194c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 80 CONTINUE 195c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath END IF 196c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath END IF 197c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath* 198c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath RETURN 199c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath* 200c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath* End of SSPR . 201c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath* 202c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath END 203