rename
[unres4.git] / source / unres / math.F90
diff --git a/source/unres/math.F90 b/source/unres/math.F90
new file mode 100644 (file)
index 0000000..03d12cf
--- /dev/null
@@ -0,0 +1,834 @@
+      module math
+!-----------------------------------------------------------------------------
+      use io_units, only:inp,iout
+      implicit none
+!-----------------------------------------------------------------------------
+!
+!
+!-----------------------------------------------------------------------------
+      contains
+!-----------------------------------------------------------------------------
+! djacob.f
+!-----------------------------------------------------------------------------
+      subroutine DJACOB(N,NMAX,MAXJAC,E,A,C,AII)
+!      IMPLICIT REAL*8 (A-H,O-Z) 
+!     THE JACOBI DIAGONALIZATION PROCEDURE
+      integer :: N,NMAX,MAXJAC
+!      COMMON INP,IOUT,IPN                              
+      real(kind=8),DIMENSION(NMAX,N) :: A,C
+      real(kind=8),DIMENSION(150) :: AJJ       !el AII
+      real(kind=8),DIMENSION(*) :: AII
+!el local variables
+      integer :: l,i,j,k,IPIV,JPIV,IJAC,LIM,LT,IT,IN
+      real(kind=8) :: e,SIN45,COS45,S45SQ,C45SQ
+      real(kind=8) :: TEMPA,AIJMAX,TAIJ,TAII,TAJJ,TMT
+      real(kind=8) :: ZAMMA,SINT,COST,SINSQ,COSSQ,AIIMIN
+      real(kind=8) :: TAIK,TAJK,TCIK,TCJK,TEST,AMAX,GAMSQ,T
+      SIN45 = .70710678                                                 
+      COS45 = .70710678                                                 
+      S45SQ = 0.50                                                      
+      C45SQ = 0.50                                                      
+!     UNIT EIGENVECTOR MATRIX                                           
+      DO 70 I = 1,N                                                     
+      DO 7 J = I,N                                                      
+      A(J,I)=A(I,J)                                                     
+      C(I,J) = 0.0                                                      
+    7 C(J,I) = 0.0                                                      
+   70 C(I,I) = 1.0                                                     
+!     DETERMINATION OF SEARCH ARGUMENT, TEST                            
+      AMAX = 0.0                                                        
+      DO 1 I = 1,N                                                      
+      DO 1 J = 1,I                                                      
+      TEMPA=DABS(A(I,J))                                                 
+      IF (AMAX-TEMPA) 2,1,1                                             
+    2 AMAX = TEMPA                                                      
+    1 CONTINUE                                                          
+      TEST = AMAX*E                                                     
+!     SEARCH FOR LARGEST OFF DIAGONAL ELEMENT                           
+      DO 72 IJAC=1,MAXJAC                                               
+      AIJMAX = 0.0                                                      
+      DO 3 I = 2,N                                                      
+      LIM = I-1                                                         
+      DO 3 J = 1,LIM                                                    
+      TAIJ=DABS(A(I,J))                                                  
+       IF (AIJMAX-TAIJ) 4,3,3                                           
+    4 AIJMAX = TAIJ                                                     
+      IPIV = I                                                          
+      JPIV = J                                                          
+    3 CONTINUE                                                          
+      IF(AIJMAX-TEST)300,300,5                                          
+!     PARAMETERS FOR ROTATION                                           
+    5 TAII = A(IPIV,IPIV)                                               
+      TAJJ = A(JPIV,JPIV)                                               
+      TAIJ = A(IPIV,JPIV)                                               
+      TMT = TAII-TAJJ                                                   
+      IF(DABS(TMT/TAIJ)-1.0D-12) 60,60,6                                 
+   60 IF(TAIJ) 10,10,11                                                 
+    6 ZAMMA=TAIJ/(2.0*TMT)                                              
+   90 IF(DABS(ZAMMA)-0.38268)8,8,9                                       
+    9 IF(ZAMMA)10,10,11                                                 
+   10 SINT = -SIN45                                                     
+      GO TO 12                                                          
+   11 SINT = SIN45                                                      
+   12 COST = COS45                                                      
+      SINSQ = S45SQ                                                     
+      COSSQ = C45SQ                                                     
+      GO TO 120                                                         
+    8 GAMSQ=ZAMMA*ZAMMA                                                 
+      SINT=2.0*ZAMMA/(1.0+GAMSQ)                                        
+      COST = (1.0-GAMSQ)/(1.0+GAMSQ)                                    
+      SINSQ=SINT*SINT                                                   
+      COSSQ=COST*COST                                                   
+!     ROTATION                                                          
+  120 DO 13 K = 1,N                                                     
+      TAIK = A(IPIV,K)                                                  
+      TAJK = A(JPIV,K)                                                  
+      A(IPIV,K) = TAIK*COST+TAJK*SINT                                   
+      A(JPIV,K) = TAJK*COST-TAIK*SINT                                   
+      TCIK = C(IPIV,K)                                                  
+      TCJK = C(JPIV,K)                                                  
+      C(IPIV,K) = TCIK*COST+TCJK*SINT                                   
+   13 C(JPIV,K) = TCJK*COST-TCIK*SINT                                   
+      A(IPIV,IPIV) = TAII*COSSQ+TAJJ*SINSQ+2.0*TAIJ*SINT*COST           
+      A(JPIV,JPIV) = TAII*SINSQ+TAJJ*COSSQ-2.0*TAIJ*SINT*COST           
+      A(IPIV,JPIV) = TAIJ*(COSSQ-SINSQ)-SINT*COST*TMT                   
+      A(JPIV,IPIV) = A(IPIV,JPIV)                                       
+      DO 30 K = 1,N                                                     
+      A(K,IPIV) = A(IPIV,K)                                             
+   30 A(K,JPIV) = A(JPIV,K)                                             
+   72 CONTINUE                                                          
+      WRITE (IOUT,1000) AIJMAX                                             
+ 1000 FORMAT (/1X,'NONCONVERGENT JACOBI. LARGEST OFF-DIAGONAL ELE',&    
+       'MENT = ',1PE14.7)                                               
+!     ARRANGEMENT OF EIGENVALUES IN ASCENDING ORDER                     
+  300 DO 14 I=1,N                                                       
+   14 AJJ(I)=A(I,I)                                                     
+      LT=N+1                                                            
+      DO 15 L=1,N                                                        
+      LT=LT-1                                                           
+      AIIMIN=1.0E+30                                                    
+      DO 16 I=1,N                                                        
+      IF(AJJ(I)-AIIMIN)17,16,16                                         
+   17 AIIMIN=AJJ(I)                                                     
+      IT=I                                                              
+   16 CONTINUE                                                          
+      IN=L                                                              
+      AII(IN)=AIIMIN                                                    
+      AJJ(IT)=1.0E+30                                                   
+      DO 15 K=1,N                                                        
+   15 A(IN,K)=C(IT,K)                                                   
+      DO 18 I=1,N                                                       
+      IF(A(I,1))19,22,22                                                
+   19 T=-1.0                                                            
+      GO TO 91                                                          
+   22 T=1.0                                                             
+   91 DO 18 J=1,N
+   18 C(J,I)=T*A(I,J)
+      return
+      end subroutine DJACOB
+!-----------------------------------------------------------------------------
+! energy_p_new_barrier.F
+!-----------------------------------------------------------------------------
+      subroutine vecpr(u,v,w)
+!      implicit real*8(a-h,o-z)
+      real(kind=8),dimension(3) :: u,v,w
+      w(1)=u(2)*v(3)-u(3)*v(2)
+      w(2)=-u(1)*v(3)+u(3)*v(1)
+      w(3)=u(1)*v(2)-u(2)*v(1)
+      return
+      end subroutine vecpr
+!-----------------------------------------------------------------------------
+      real(kind=8) function scalar(u,v)
+!DIR$ INLINEALWAYS scalar
+!#ifndef OSF
+!DEC$ ATTRIBUTES FORCEINLINE::scalar
+!#endif
+!      implicit none
+      real(kind=8),dimension(3) :: u,v
+!d      double precision sc
+!d      integer i
+!d      sc=0.0d0
+!d      do i=1,3
+!d        sc=sc+u(i)*v(i)
+!d      enddo
+!d      scalar=sc
+
+      scalar=u(1)*v(1)+u(2)*v(2)+u(3)*v(3)
+      return
+      end function scalar
+!-----------------------------------------------------------------------------
+! sort.f
+!-----------------------------------------------------------------------------
+!
+!
+!     ###################################################
+!     ##  COPYRIGHT (C)  1990  by  Jay William Ponder  ##
+!     ##              All Rights Reserved              ##
+!     ###################################################
+!
+!     #########################################################
+!     ##                                                     ##
+!     ##  subroutine sort  --  heapsort of an integer array  ##
+!     ##                                                     ##
+!     #########################################################
+!
+!
+!     "sort" takes an input list of integers and sorts it
+!     into ascending order using the Heapsort algorithm
+!
+!
+      subroutine sort(n,list)
+!      implicit none
+      integer :: i,j,k,n
+      integer :: index,lists
+      integer :: list(*)
+!
+!
+!     perform the heapsort of the input list
+!
+      k = n/2 + 1
+      index = n
+      do while (n .gt. 1)
+         if (k .gt. 1) then
+            k = k - 1
+            lists = list(k)
+         else
+            lists = list(index)
+            list(index) = list(1)
+            index = index - 1
+            if (index .le. 1) then
+               list(1) = lists
+               return
+            end if
+         end if
+         i = k
+         j = k + k
+         do while (j .le. index)
+            if (j .lt. index) then
+               if (list(j) .lt. list(j+1))  j = j + 1
+            end if
+            if (lists .lt. list(j)) then
+               list(i) = list(j)
+               i = j
+               j = j + j
+            else
+               j = index + 1
+            end if
+         end do
+         list(i) = lists
+      end do
+      return
+      end subroutine sort
+!-----------------------------------------------------------------------------
+!
+!
+!     ##############################################################
+!     ##                                                          ##
+!     ##  subroutine sort2  --  heapsort of real array with keys  ##
+!     ##                                                          ##
+!     ##############################################################
+!
+!
+!     "sort2" takes an input list of reals and sorts it
+!     into ascending order using the Heapsort algorithm;
+!     it also returns a key into the original ordering
+!
+!
+      subroutine sort2(n,list,key)
+!      implicit none
+      integer :: i,j,k,n
+      integer :: index,keys
+      integer :: key(*)
+      real(kind=8) :: lists
+      real(kind=8) :: list(*)
+!
+!
+!     initialize index into the original ordering
+!
+      do i = 1, n
+         key(i) = i
+      end do
+!
+!     perform the heapsort of the input list
+!
+      k = n/2 + 1
+      index = n
+      do while (n .gt. 1)
+         if (k .gt. 1) then
+            k = k - 1
+            lists = list(k)
+            keys = key(k)
+         else
+            lists = list(index)
+            keys = key(index)
+            list(index) = list(1)
+            key(index) = key(1)
+            index = index - 1
+            if (index .le. 1) then
+               list(1) = lists
+               key(1) = keys
+               return
+            end if
+         end if
+         i = k
+         j = k + k
+         do while (j .le. index)
+            if (j .lt. index) then
+               if (list(j) .lt. list(j+1))  j = j + 1
+            end if
+            if (lists .lt. list(j)) then
+               list(i) = list(j)
+               key(i) = key(j)
+               i = j
+               j = j + j
+            else
+               j = index + 1
+            end if
+         end do
+         list(i) = lists
+         key(i) = keys
+      end do
+      return
+      end subroutine sort2
+!-----------------------------------------------------------------------------
+!
+!
+!     #################################################################
+!     ##                                                             ##
+!     ##  subroutine sort3  --  heapsort of integer array with keys  ##
+!     ##                                                             ##
+!     #################################################################
+!
+!
+!     "sort3" takes an input list of integers and sorts it
+!     into ascending order using the Heapsort algorithm;
+!     it also returns a key into the original ordering
+!
+!
+      subroutine sort3(n,list,key)
+!      implicit none
+      integer :: i,j,k,n
+      integer :: index
+      integer :: lists
+      integer :: keys
+      integer :: list(*)
+      integer :: key(*)
+!
+!
+!     initialize index into the original ordering
+!
+      do i = 1, n
+         key(i) = i
+      end do
+!
+!     perform the heapsort of the input list
+!
+      k = n/2 + 1
+      index = n
+      do while (n .gt. 1)
+         if (k .gt. 1) then
+            k = k - 1
+            lists = list(k)
+            keys = key(k)
+         else
+            lists = list(index)
+            keys = key(index)
+            list(index) = list(1)
+            key(index) = key(1)
+            index = index - 1
+            if (index .le. 1) then
+               list(1) = lists
+               key(1) = keys
+               return
+            end if
+         end if
+         i = k
+         j = k + k
+         do while (j .le. index)
+            if (j .lt. index) then
+               if (list(j) .lt. list(j+1))  j = j + 1
+            end if
+            if (lists .lt. list(j)) then
+               list(i) = list(j)
+               key(i) = key(j)
+               i = j
+               j = j + j
+            else
+               j = index + 1
+            end if
+         end do
+         list(i) = lists
+         key(i) = keys
+      end do
+      return
+      end subroutine sort3
+!-----------------------------------------------------------------------------
+!
+!
+!     #################################################################
+!     ##                                                             ##
+!     ##  subroutine sort4  --  heapsort of integer absolute values  ##
+!     ##                                                             ##
+!     #################################################################
+!
+!
+!     "sort4" takes an input list of integers and sorts it into
+!     ascending absolute value using the Heapsort algorithm
+!
+!
+      subroutine sort4(n,list)
+!      implicit none
+      integer :: i,j,k,n
+      integer :: index
+      integer :: lists
+      integer :: list(*)
+!
+!
+!     perform the heapsort of the input list
+!
+      k = n/2 + 1
+      index = n
+      do while (n .gt. 1)
+         if (k .gt. 1) then
+            k = k - 1
+            lists = list(k)
+         else
+            lists = list(index)
+            list(index) = list(1)
+            index = index - 1
+            if (index .le. 1) then
+               list(1) = lists
+               return
+            end if
+         end if
+         i = k
+         j = k + k
+         do while (j .le. index)
+            if (j .lt. index) then
+               if (abs(list(j)) .lt. abs(list(j+1)))  j = j + 1
+            end if
+            if (abs(lists) .lt. abs(list(j))) then
+               list(i) = list(j)
+               i = j
+               j = j + j
+            else
+               j = index + 1
+            end if
+         end do
+         list(i) = lists
+      end do
+      return
+      end subroutine sort4
+!-----------------------------------------------------------------------------
+!
+!
+!     ################################################################
+!     ##                                                            ##
+!     ##  subroutine sort5  --  heapsort of integer array modulo m  ##
+!     ##                                                            ##
+!     ################################################################
+!
+!
+!     "sort5" takes an input list of integers and sorts it
+!     into ascending order based on each value modulo "m"
+!
+!
+      subroutine sort5(n,list,m)
+!      implicit none
+      integer :: i,j,k,m,n
+      integer :: index,smod
+      integer :: jmod,j1mod
+      integer :: lists
+      integer :: list(*)
+!
+!
+!     perform the heapsort of the input list
+!
+      k = n/2 + 1
+      index = n
+      do while (n .gt. 1)
+         if (k .gt. 1) then
+            k = k - 1
+            lists = list(k)
+         else
+            lists = list(index)
+            list(index) = list(1)
+            index = index - 1
+            if (index .le. 1) then
+               list(1) = lists
+               return
+            end if
+         end if
+         i = k
+         j = k + k
+         do while (j .le. index)
+            if (j .lt. index) then
+               jmod = mod(list(j),m)
+               j1mod = mod(list(j+1),m)
+               if (jmod .lt. j1mod) then
+                  j = j + 1
+               else if (jmod.eq.j1mod .and. list(j).lt.list(j+1)) then
+                  j = j + 1
+               end if
+            end if
+            smod = mod(lists,m)
+            jmod = mod(list(j),m)
+            if (smod .lt. jmod) then
+               list(i) = list(j)
+               i = j
+               j = j + j
+            else if (smod.eq.jmod .and. lists.lt.list(j)) then
+               list(i) = list(j)
+               i = j
+               j = j + j
+            else
+               j = index + 1
+            end if
+         end do
+         list(i) = lists
+      end do
+      return
+      end subroutine sort5
+!-----------------------------------------------------------------------------
+!
+!
+!     #############################################################
+!     ##                                                         ##
+!     ##  subroutine sort6  --  heapsort of a text string array  ##
+!     ##                                                         ##
+!     #############################################################
+!
+!
+!     "sort6" takes an input list of character strings and sorts
+!     it into alphabetical order using the Heapsort algorithm
+!
+!
+      subroutine sort6(n,list)
+!      implicit none
+      integer :: i,j,k,n
+      integer :: index
+      character(len=256) :: lists
+      character*(*) :: list(*)
+!
+!
+!     perform the heapsort of the input list
+!
+      k = n/2 + 1
+      index = n
+      do while (n .gt. 1)
+         if (k .gt. 1) then
+            k = k - 1
+            lists = list(k)
+         else
+            lists = list(index)
+            list(index) = list(1)
+            index = index - 1
+            if (index .le. 1) then
+               list(1) = lists
+               return
+            end if
+         end if
+         i = k
+         j = k + k
+         do while (j .le. index)
+            if (j .lt. index) then
+               if (list(j) .lt. list(j+1))  j = j + 1
+            end if
+            if (lists .lt. list(j)) then
+               list(i) = list(j)
+               i = j
+               j = j + j
+            else
+               j = index + 1
+            end if
+         end do
+         list(i) = lists
+      end do
+      return
+      end subroutine sort6
+!-----------------------------------------------------------------------------
+!
+!
+!     ################################################################
+!     ##                                                            ##
+!     ##  subroutine sort7  --  heapsort of text strings with keys  ##
+!     ##                                                            ##
+!     ################################################################
+!
+!
+!     "sort7" takes an input list of character strings and sorts it
+!     into alphabetical order using the Heapsort algorithm; it also
+!     returns a key into the original ordering
+!
+!
+      subroutine sort7(n,list,key)
+!      implicit none
+      integer :: i,j,k,n
+      integer :: index
+      integer :: keys
+      integer :: key(*)
+      character(len=256) :: lists
+      character*(*) :: list(*)
+!
+!
+!     initialize index into the original ordering
+!
+      do i = 1, n
+         key(i) = i
+      end do
+!
+!     perform the heapsort of the input list
+!
+      k = n/2 + 1
+      index = n
+      do while (n .gt. 1)
+         if (k .gt. 1) then
+            k = k - 1
+            lists = list(k)
+            keys = key(k)
+         else
+            lists = list(index)
+            keys = key(index)
+            list(index) = list(1)
+            key(index) = key(1)
+            index = index - 1
+            if (index .le. 1) then
+               list(1) = lists
+               key(1) = keys
+               return
+            end if
+         end if
+         i = k
+         j = k + k
+         do while (j .le. index)
+            if (j .lt. index) then
+               if (list(j) .lt. list(j+1))  j = j + 1
+            end if
+            if (lists .lt. list(j)) then
+               list(i) = list(j)
+               key(i) = key(j)
+               i = j
+               j = j + j
+            else
+               j = index + 1
+            end if
+         end do
+         list(i) = lists
+         key(i) = keys
+      end do
+      return
+      end subroutine sort7
+!-----------------------------------------------------------------------------
+!
+!
+!     #########################################################
+!     ##                                                     ##
+!     ##  subroutine sort8  --  heapsort to unique integers  ##
+!     ##                                                     ##
+!     #########################################################
+!
+!
+!     "sort8" takes an input list of integers and sorts it into
+!     ascending order using the Heapsort algorithm, duplicate
+!     values are removed from the final sorted list
+!
+!
+      subroutine sort8(n,list)
+!      implicit none
+      integer :: i,j,k,n
+      integer :: index
+      integer :: lists
+      integer :: list(*)
+!
+!
+!     perform the heapsort of the input list
+!
+      k = n/2 + 1
+      index = n
+      do while (n .gt. 1)
+         if (k .gt. 1) then
+            k = k - 1
+            lists = list(k)
+         else
+            lists = list(index)
+            list(index) = list(1)
+            index = index - 1
+            if (index .le. 1) then
+               list(1) = lists
+!
+!     remove duplicate values from final list
+!
+               j = 1
+               do i = 2, n
+                  if (list(i-1) .ne. list(i)) then
+                     j = j + 1
+                     list(j) = list(i)
+                  end if
+               end do
+               if (j .lt. n)  n = j
+               return
+            end if
+         end if
+         i = k
+         j = k + k
+         do while (j .le. index)
+            if (j .lt. index) then
+               if (list(j) .lt. list(j+1))  j = j + 1
+            end if
+            if (lists .lt. list(j)) then
+               list(i) = list(j)
+               i = j
+               j = j + j
+            else
+               j = index + 1
+            end if
+         end do
+         list(i) = lists
+      end do
+      return
+      end subroutine sort8
+!-----------------------------------------------------------------------------
+!
+!
+!     #############################################################
+!     ##                                                         ##
+!     ##  subroutine sort9  --  heapsort to unique text strings  ##
+!     ##                                                         ##
+!     #############################################################
+!
+!
+!     "sort9" takes an input list of character strings and sorts
+!     it into alphabetical order using the Heapsort algorithm,
+!     duplicate values are removed from the final sorted list
+!
+!
+      subroutine sort9(n,list)
+!      implicit none
+      integer :: i,j,k,n
+      integer :: index
+      character(len=256) :: lists
+      character*(*) :: list(*)
+!
+!
+!     perform the heapsort of the input list
+!
+      k = n/2 + 1
+      index = n
+      do while (n .gt. 1)
+         if (k .gt. 1) then
+            k = k - 1
+            lists = list(k)
+         else
+            lists = list(index)
+            list(index) = list(1)
+            index = index - 1
+            if (index .le. 1) then
+               list(1) = lists
+!
+!     remove duplicate values from final list
+!
+               j = 1
+               do i = 2, n
+                  if (list(i-1) .ne. list(i)) then
+                     j = j + 1
+                     list(j) = list(i)
+                  end if
+               end do
+               if (j .lt. n)  n = j
+               return
+            end if
+         end if
+         i = k
+         j = k + k
+         do while (j .le. index)
+            if (j .lt. index) then
+               if (list(j) .lt. list(j+1))  j = j + 1
+            end if
+            if (lists .lt. list(j)) then
+               list(i) = list(j)
+               i = j
+               j = j + j
+            else
+               j = index + 1
+            end if
+         end do
+         list(i) = lists
+      end do
+      return
+      end subroutine sort9
+!-----------------------------------------------------------------------------
+! pinorm.f
+!-----------------------------------------------------------------------------
+      real(kind=8) function pinorm(x)
+!      implicit real*8 (a-h,o-z)
+!
+      use geometry_data, only: pi,dwapi
+! this function takes an angle (in radians) and puts it in the range of
+! -pi to +pi.                                                         
+!                                                                    
+      integer :: n
+      real(kind=8) :: x
+!      include 'COMMON.GEO'
+      n = x / dwapi
+      pinorm = x - n * dwapi
+      if ( pinorm .gt. pi ) then                                      
+         pinorm = pinorm - dwapi
+      else if ( pinorm .lt. - pi ) then                               
+         pinorm = pinorm + dwapi
+      end if                                                          
+      return
+      end function pinorm
+!-----------------------------------------------------------------------------
+! minimize_p.F
+!-----------------------------------------------------------------------------
+      subroutine xx2x(x,xx)
+
+!      implicit real*8 (a-h,o-z)
+      use geometry_data
+      use energy_data
+!      include 'DIMENSIONS'
+!      include 'COMMON.VAR'
+!      include 'COMMON.CHAIN'
+!      include 'COMMON.INTERACT'
+      integer :: i,ij,ig,igall
+      real(kind=8),dimension(6*nres) :: xx,x   !(maxvar) (maxvar=6*maxres)
+
+      do i=1,nvar
+        x(i)=varall(i)
+      enddo
+
+      ig=0                                                                      
+      igall=0                                                                   
+      do i=4,nres                                                               
+        igall=igall+1                                                           
+        if (mask_phi(i).eq.1) then                                              
+          ig=ig+1                                                               
+          x(igall)=xx(ig)
+        endif                                                                   
+      enddo                                                                     
+                                                                                
+      do i=3,nres                                                               
+        igall=igall+1                                                           
+        if (mask_theta(i).eq.1) then                                            
+          ig=ig+1                                                               
+          x(igall)=xx(ig)
+        endif                                                                   
+      enddo                                          
+
+      do ij=1,2                                                                 
+      do i=2,nres-1                                                             
+        if (itype(i).ne.10) then                                                
+          igall=igall+1                                                         
+          if (mask_side(i).eq.1) then                                           
+            ig=ig+1                                                             
+            x(igall)=xx(ig)
+          endif                                                                 
+        endif                                                                   
+      enddo                                                             
+      enddo                              
+
+      return
+      end subroutine  xx2x
+!-----------------------------------------------------------------------------
+!-----------------------------------------------------------------------------
+      end module math