      SUBROUTINE SPIN(Q,N,MM,DET,IDEXP)                                         
C                                                                               
C     THIS IS THE SOURCE OF THE VECTORIZED VERSION OF SPIN                      
C     *** MAY 1988 **** BY MILDA MARKAUSKAS                                     
C                                                                               
C     THE UNVECTORIZED SOURCE FOR THIS SUBROUTINE IS AVAILABLE                  
C     IN A.M12129.SELIBSRC(SPIN)                                                
C                                                                               
C     THIS PROGRAM CALLS DGEICD, AN ESSL SUBROUTINE                             
C                                                                               
C     ***********************************************************               
C     SUBROUTINE SPIN IS A MATRIX INVERSION ROUTINE                             
C     THE MATRIX INVERTED IS THE UPPER                                          
C     N BY N PORTION OF THE MATRIX Q WHICH IS DIMENSIONED MM BY MM              
C     IN THE CALLING ROUTINE.                                                   
C                                                                               
C  INPUT:                                                                       
C       Q - THE MATRIX DIMENSIONED MM BY MM WHICH CONTAINS THE                  
C           MATRIX TO BE INVERTED.                                              
C                                                                               
C       N - THE DIMENSION OF THE ACTUAL PART( UPPER LEFT CORNER)                
C           OF Q WHICH IS TO BE INVERTED. ( N MAY BE EQUAL BUT MUST             
C           NOT BE LARGER THAN MM) .                                            
C       MM- DIMENSIONED SIZE OF Q IN THE CALLING ROUTINE.                       
C                                                                               
C                                                                               
C  OUTPUT:                                                                      
C                                                                               
C       Q - THE UPPER LEFT N BY N PORTION CONTAINS THE INVERSE OF               
C           THE INPUT UPPER LEFT N BY N PORTION.                                
C                                                                               
C       DET - THE NON-EXPONENT PORTION OF THE DETERMINANT OF THE                
C             INPUT N BY N (UPPER LEFT PORTION OF Q) MATRIX. SEE                
C             IDEXP  BELOW.                                                     
C                                                                               
C       IDEXP - THE EXPONENT (OF 10) PART OF THE DETERMINANT DESCRIBED          
C               UNDER DET ABOVE. THUS THE DETERMINANT IS RETURNED IN            
C               TWO PARTS CORRESPONDING TO                                      
C                     DETERMINANT = DET * 10 ** IDEXP .                         
C               THIS IS DONE TO AVOID UNDER OR OVERFLOW IN THE                  
C               COMPUTATION OF THE DETERMINANT.  TO PRINT THE DETERM-           
C               INANT THE USER SHOULD PRINT BOTH NUMBERS AS FOLLOWS;            
C               (FOR EXAMPLE)                                                   
C                  PRINT 10,DET,IDEXP                                           
C               10 FORMAT(' ','DETERMINANT= ',F7.4,'D',I4)                      
C                                                                               
C                                                R.R. STEEVES                   
C                                                SEPT., 1979                    
C                                                                               
C                                                                               
      REAL*8 Q(MM,MM),DET,RCOND,DETER(2),AUX(33000)                             
C                                                                               
C  IOPT=2 MEANS THAT THE INVERSE AND DETERMINANT ARE COMPUTED                   
C                                                                               
      IOPT=2                                                                    
C                                                                               
C  NAUX IS THE DIMENSION OF AUX (TEMPORARY STORAGE)                             
C  NAUX = 33,000                                                                
C  THIS MEANS THAT 1000 X 1000 IS THE LARGEST MATRIX                            
C        INVERTABLE WITH THIS SUBROUTINE.                                       
C                                                                               
      NAUX=33000                                                                
C                                                                               
C  PRINT OUT A MESSAGE IF MATRIX IS LARGER THAN 1000 X 1000                     
C                                                                               
      IF(N.LE.1000)      GO TO 10                                               
       WRITE(6,90)                                                              
90     FORMAT(' '/'*** CATASTROPHIC ERROR *******'/                             
     @    ' YOU ARE TRYING TO INVERT A MATRIX THAT',                            
     @    ' HAS MORE THAN 1000 ROWS ',/                                         
     @    ' YOU MUST GO TO AN ESSL SUBROUTINE')                                 
C                                                                               
       STOP 16                                                                  
       RETURN                                                                   
C                                                                               
10    CALL DGEICD(Q,MM,N,IOPT,RCOND,DETER,AUX,NAUX)                             
C                                                                               
      DET  =DETER(1)                                                            
      IDEXP=DETER(2)                                                            
      RETURN                                                                    
      END                                                                       
