CXML

duskyd 


FORMAT

  DUSKYD
   (n, au, iaudiag, nau, al, ialdiag, nal, bx, ldbx, nbx, iparam, rparam,
  iwrk, rwrk, ierror)

Arguments

  n                   integer*4
                      On entry, the order of the matrix A.
                      On exit, n is unchanged.

  au                  real*8
                      On entry, an array containing information on the matrix
                      A.  If  istore = 1 or 2, then  au contains the upper
                      triangular part, including the diagonal, of the matrix
                      A, stored in the profile-in or diagonal-out mode,
                      respectively. Array AU is of length at least nau, where
                      nau is the envelope size of the upper triangular part
                      of A, including the diagonal.  If  istore = 3, then  au
                      contains the matrix A, stored in the structurally
                      symmetric, profile-in storage mode. In this case, array
                      AU is of length at least nau, where nau is the envelope
                      size of the matrix A.
                      On exit, if  istore = 1 or 2,  au contains the factors
                      U and D of the L*D*U factorization of the matrix A. If
                      istore = 3, then au contains the factors L, U and D of
                      the L*D*U factorization of the matrix A.  au must
                      remain unchanged between the call to the routine DUSKYD
                      and any routines that use the factors such as DUSKYS,
                      DUSKYC, and DUSKYR.

  iaudiag             integer*4
                      On entry, an array containing the pointers to the
                      locations of the diagonal elements in the arrays AU.
                       iaudiag is of length at least n for the profile-in and
                      the structurally symmetric profile-in storage modes.
                      iaudiag is of length at least (n+1) for the diagonal-
                      out storage mode.
                      On exit,   iaudiag is unchanged.

  nau                 integer*4
                      On entry, the number of elements stored in array AU.
                      If  istore = 1 or 2, then nau is the envelope size of
                      the upper triangular part of the matrix A. If  istore =
                      3, then nau is the envelope size of the matrix A. For
                      the profile-in and the structurally symmetric profile-
                      in storage modes, nau =  IAUDIAG(n).  For the
                      diagonal-out storage mode, nau =  IAUDIAG(n+1) - 1.
                      On exit,  nau is unchanged.

  al                  real*8
                      On entry, an array containing information on the matrix
                      A.  If  istore = 1 or 2, then  al contains the lower
                      triangular part, including the diagonal, of the matrix
                      A, stored in the profile-in or diagonal-out mode,
                      respectively. Storage is allocated for the diagonal
                      elements, though the elements themselves are not
                      stored.  Array AL is of length at least nal, where nal
                      is the envelope size of the lower triangular part of A,
                      including the diagonal.  If  istore = 3, then  al is a
                      dummy argument.
                      On exit, if  istore = 1 or 2,  al contains the factor L
                      of the L*D*U factorization of the matrix A. If
                       istore = 3, then al is undefined.  al must remain
                      unchanged between the call to the routine DUSKYD and
                      any routines that use the factors such as DUSKYS,
                      DUSKYC, and DUSKYR.

  ialdiag             integer*4
                      On entry, an array containing the pointers to the
                      locations of the diagonal elements in the arrays AL and
                      ALF.  ialdiag is of length at least n for the profile-
                      in storage mode.  ialdiag is of length at least n+1 for
                      the diagonal-out storage mode.  If  istore = 3, then
                      ialdiag is a dummy argument.
                      On exit,   ialdiag is unchanged.

  nal                 integer*4
                      On entry, the number of elements stored in array AL.
                      If  istore = 1 or 2, then nal is the envelope size of
                      the lower triangular part of the matrix A. For the
                      profile-in storage mode, nal = IALDIAG(n).  For the
                      diagonal-out storage mode, nal = IALDIAG(n+1) - 1.  If
                      istore = 3, then  nal is a dummy argument.
                      On exit,  nal is unchanged.

  bx                  real*8
                      On entry, a two dimensional array BX of order nbx,
                      containing the nbx right sides.
                      On exit, bx contains the solutions for the nbx systems.

  ldbx                integer*4
                      On entry, the leading dimension of  array BX.  ldbx
                      >=n.
                      On exit, ldbx is unchanged.

  nbx                 real*4
                      On entry, the number of right sides.
                      On exit, nbx is unchanged.

  iparam              integer*4
                      An array of length at least 100, containing the integer
                      parameters for the simple driver.

  iparam(1): niparam
                      On entry, defines the length of the array IPARAM.
                      niparam >= 100.
                      On exit, iparam(1) is unchanged.

  iparam(2): nrparam
                      On entry, defines the length of the array RPARAM.
                      nrparam >= 100.
                      On exit,  iparam(2) is unchanged.

  iparam(3): niwrk
                      On entry, defines the size of the integer work array,
                      IWRK.  niwrk >= 4n.
                      On exit,  iparam(3) is unchanged.

  iparam(4): nrwrk
                      On entry, defines the size of the real work array,
                      RWRK.  As the real work array is not used at present,
                      nrwrk can be unspecified.
                      On exit,  iparam(4) is unchanged.

  iparam(5): iounit
                      On entry, defines the I/O unit number for printing
                      error messages and information from the routine DUSKYD.
                      The I/O unit must be opened in the calling subprogram.
                      If iounit <= 0, no output is generated.
                      On exit,  iparam(5) is unchanged.

  iparam(6): iolevel
                      On entry, defines the message level that determines the
                      amount of information printed out to iounit, when
                      iounit > 0.

                      iolevel = 0 : fatal error messages only

                      iolevel = 1 : error messages and minimal information

                      iolevel = 2 : error messages and detailed information

                      On exit,  iparam(6) is unchanged.

  iparam(7): idefault
                      On entry, defines if the default values should be used
                      in arrays IPARAM and RPARAM. If idefault = 0, then the
                      following default values are assigned:

                      IPARAM(1) = niparam = 100

                      IPARAM(2) = nrparam = 100

                      IPARAM(6) = iolevel = 0

                      IPARAM(8) = istore = 1

                      IPARAM(9) = ipvt = 0

                      IPARAM(11) = itrans = 0

                      RPARAM(1) = pvt_sml = 10**(-12)

                      If idefault = 1, then you must assign values to the
                      above variables before the call to the DUSKYD routine.
                      On exit,  iparam(7) is unchanged.

  iparam(8): istore
                      On entry, defines the type of storage scheme used for
                      the skyline matrix.  If  istore = 1, the matrix A is
                      stored using the profile-in storage mode; if  istore =
                      2, the matrix A is stored using the diagonal-out
                      storage mode.  Default:  istore = 1.
                      On exit,  iparam(8) is unchanged.

  iparam(9): ipvt
                      On entry, defines if the factorization should continue
                      when a small pivot, defined by RPARAM(1), is
                      encountered. If  ipvt = 0 and the absolute value of the
                      pivot element is smaller than  pvt_sml =  RPARAM(1),
                      then the factorization process is stopped and control
                      returned to the calling subprogram.  If  ipvt = 1 and a
                      pivot smaller than RPARAM(1) in absolute value is
                      encountered in the factorization, the process
                      continues.  If  ipvt = 2 and a pivot smaller than
                      RPARAM(1) in absolute value is encountered in the
                      factorization, it is replaced by a predetermined value
                      pvt_new =  RPARAM(2), and the factorization is
                      continued.  Default:  ipvt = 0.
                      On exit,  iparam(9) is unchanged.

  iparam(10): ipvt_loc
                      On entry, an unspecified variable.
                      On exit,  iparam(10) contains the location of the first
                      pivot element smaller in absolute value than  pvt_sml.
                      The pivot element is returned in  pvt_val =  RPARAM(3).
                      If iparam(10) = 0, then no such pivot element exists.

  iparam(11): itrans
                      On entry, defines the form of matrix used in the
                      solution.  If  itrans = 0, the system solved is A*X =
                      B; if  itrans = 1, the system solved is trans(A)*X = B.
                      Default:  itrans = 0.
                      On exit,  iparam(11) is unchanged.

   rparam             real*8
                      An array of length at least 100, containing the real
                      parameters for the simple driver.

  rparam(1): pvt_sml
                      On entry, defines the value of the pivot  element which
                      is considered to be small. If a pivot element smaller
                      than  pvt_sml, in absolute value, is encountered in the
                      factorization process, then, depending on the value of
                      ipvt =  IPARAM(9), the process either stops, continues
                      or continues after the pivot is set equal to  pvt_new =
                      RPARAM(2). pvt_sml  > 0.  Recommended value: 10**(-15)
                      <= pvt_sml <= 1. Default:  pvt_sml = 10**(-12).
                      On exit,  rparam(1) is unchanged.

  rparam(2): pvt_new
                      On entry, defines the value to which the pivot element
                      must be set if  ipvt = 2 and the pivot element is less
                      than  pvt_sml in absolute value.  pvt_new should be
                      large enough to avoid overflow when calculating the
                      reciprocal of the pivot element.
                      On exit,  rparam(2) is unchanged.

  rparam(3): pvt_val
                      On entry, an unspecified variable.
                      On exit,  rparam(3) contains the value of the first
                      pivot element smaller than  pvt_sml in absolute value.
                      This element occurs at the location returned in
                      IPARAM(12). If no such pivot element is found, the
                      value of  pvt_val is unspecified.

  iwrk                integer*4
                      On entry, an array of length at least 4n used for
                      integer workspace.
                      On exit,  the first 4n elements of the array IWRK
                      contain information generated by the factorization
                      routine DUSKYF.  This information is required by
                      routines that use the factorization, such as DUSKYS,
                      DUSKYC, and DUSKYR, and  should remain unchanged
                      between the call to DUSKYD and any subsequent calls to
                      one of these routines.

   rwrk                real*8
                      On entry, an array used for real workspace.
                      On exit,  rwrk is unchanged.  Presently, rwrk is not
                      used by the routine DSSKYF.  It can be a dummy
                      variable.

  ierror              integer*4
                      On entry, an unspecified variable.
                      On exit,  ierror contains the error flag. A value of
                      zero indicates a normal exit from the routine DUSKYD.

Description

  DUSKYD is a simple driver routine that factors and solves the system

       A X = B

  or

       trans(A) X = B

  where A is an unsymmetric matrix stored in a skyline form, using either the
  profile-in storage mode, the diagonal-out storage mode, or the structurally
  symmetric profile-in storage mode; B is a matrix of nbx right sides and X
  is the matrix of the corresponding nbx solution vectors. On entry to the
  routine DUSKYS, the array BX contains the  nbx right sides; on exit, these
  are overwritten by the solution vectors.  The variable itrans determines
  whether the matrix A or trans(A) is used in the solution process.

  The matrix A is first factorized as A = L D U by a call to the routine
  DUSKYF. L is a unit lower triangular matrix, U is a unit upper triangular
  matrix, and D is a diagonal matrix. The routine DUSKYF does not perform any
  pivoting to preserve the numerical stability of the L*D*U factorization. It
  is therefore primarily intended for the solution of systems that do not
  require pivoting for numerical stability, such as diagonally dominant
  systems. Caution is urged when using this routine for problems that require
  pivoting.

  If a small pivot, in absolute value,  pvt_sml, is encountered in the
  process of factorization, you have the option of either stopping the
  factorization process and returning to the calling program, continuing the
  factorization process, or continuing after setting the pivot equal to some
  predetermined value,  pvt_new. The location of the first occurrence of a
  small pivot is returned in  ipvt_loc and its value in  pvt_val.

  After the factorization has been obtained without any errors, the routine
  DUSKYD calls the solve routine, DUSKYS, to solve the system.  The call to
  the routine DUSKYD can be followed by a call to the routines DUSKYS,
  DUSKYC, and DUSKYR, provided that the first 4n elements of the integer
  workspace array IWRK remain unchanged between calls. The real work array
  RWRK is not used at present.

CXML Home Page

Index of CXML Routines