DUSKYD (n, au, iaudiag, nau, al, ialdiag, nal, bx, ldbx, nbx, iparam, rparam, iwrk, rwrk, ierror)
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.
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.