block data
c although all common block variables do not have default values,
c we comment on all the common block variables here.
c
c common block ma30e/ed holds control parameters ....
c common /ma30ed/ lp, abort1, abort2, abort3
c the integer lp is the unit number to which the error messages are
c sent. lp has a default value of 6. this default value can be
c reset by the user, if desired. a value of 0 suppresses all
c messages.
c the logical variables abort1,abort2,abort3 are used to control the
c conditions under which the subroutine will terminate.
c if abort1 is .true. then the subroutine will exit immediately on
c detecting structural singularity.
c if abort2 is .true. then the subroutine will exit immediately on
c detecting numerical singularity.
c if abort3 is .true. then the subroutine will exit immediately when
c the available space in a/icn is filled up by the previously
c decomposed, active, and undecomposed parts of the matrix.
c the default values for abort1,abort2,abort3 are set to .true.,.true.
c and .false. respectively.
c
c the variables in the common block ma30f/fd are used to provide the
c user with information on the decomposition.
c common /ma30fd/ irncp, icncp, irank, minirn, minicn
c irncp and icncp are integer variables used to monitor the adequacy
c of the allocated space in arrays irn and a/icn respectively, by
c taking account of the number of data management compresses
c required on these arrays. if irncp or icncp is fairly large (say
c greater than n/10), it may be advantageous to increase the size
c of the corresponding array(s). irncp and icncp are initialized
c to zero on entry to ma30a/ad and are incremented each time the
c compressing routine ma30d/dd is entered.
c icncp is the number of compresses on a/icn.
c irncp is the number of compresses on irn.
c irank is an integer variable which gives an estimate (actually an
c upper bound) of the rank of the matrix. on an exit with iflag
c equal to 0, this will be equal to n.
c minirn is an integer variable which, after a successful call to
c ma30a/ad, indicates the minimum length to which irn can be
c reduced while still permitting a successful decomposition of the
c same matrix. if, however, the user were to decrease the length
c of irn to that size, the number of compresses (irncp) may be
c very high and quite costly. if lirn is not large enough to begin
c the decomposition on a diagonal block, minirn will be equal to
c the value required to continue the decomposition and iflag will
c be set to -3 or -6. a value of lirn slightly greater than this
c (say about n/2) will usually provide enough space to complete
c the decomposition on that block. in the event of any other
c failure minirn gives the minimum size of irn required for a
c successful decomposition up to that point.
c minicn is an integer variable which after a successful call to
c ma30a/ad, indicates the minimum size of licn required to enable
c a successful decomposition. in the event of failure with iflag=
c -5, minicn will, if abort3 is left set to .false., indicate the
c minimum length that would be sufficient to prevent this error in
c a subsequent run on an identical matrix. again the user may
c prefer to use a value of icn slightly greater than minicn for
c subsequent runs to avoid too many conpresses (icncp). in the
c event of failure with iflag equal to any negative value except
c -4, minicn will give the minimum length to which licn could be
c reduced to enable a successful decomposition to the point at
c which failure occurred. notice that, on a successful entry
c idisp(2) gives the amount of space in a/icn required for the
c decomposition while minicn will usually be slightly greater
c because of the need for "elbow room". if the user is very
c unsure how large to make licn, the variable minicn can be used
c to provide that information. a preliminary run should be
c performed with abort3 left set to .false. and licn about 3/2
c times as big as the number of non-zeros in the original matrix.
c unless the initial problem is very sparse (when the run will be
c successful) or fills in extremely badly (giving an error return
c with iflag equal to -4), an error return with iflag equal to -5
c should result and minicn will give the amount of space required
c for a successful decomposition.
c
c common block ma30g/gd is used by the ma30b/bd entry only.
c common /ma30gd/ eps, rmin
c eps is a real/double precision variable. it is used to test for
c small pivots. its default value is 1.0e-4 (1.0d-4 in d version).
c if the user sets eps to any value greater than 1.0, then no
c check is made on the size of the pivots. although the absence of
c such a check would fail to warn the user of bad instability, its
c absence will enable ma30b/bd to run slightly faster. an a
c posteriori check on the stability of the factorization can be
c obtained from mc24a/ad.
c rmin is a real/double precision variable which gives the user some
c information about the stability of the decomposition. at each
c stage of the lu decomposition the magnitude of the pivot apiv
c is compared with the largest off-diagonal entry currently in its
c row (row of u), rowmax say. if the ratio
c min (apiv/rowmax)
c where the minimum is taken over all the rows, is less than eps
c then rmin is set to this minimum value and iflag is returned
c with the value +i where i is the row in which this minimum
c occurs. if the user sets eps greater than one, then this test
c is not performed. in this case, and when there are no small
c pivots rmin will be set equal to eps.
c
c common block ma30h/hd is used by ma30c/cd only.
c common /ma30hd/ resid
c resid is a real/double precision variable. in the case of singular
c or rectangular matrices its final value will be equal to the
c maximum residual for the unsatisfied equations; otherwise its
c value will be set to zero.
c
c common block ma30i/id controls the use of drop tolerances, the
c modified pivot option and the the calculation of the largest
c entry in the factorization process. this common block was added
c to the ma30 package in february, 1983.
c common /ma30id/ tol, big, ndrop, nsrch, lbig
c tol is a real/double precision variable. if it is set to a positive
c value, then ma30a/ad will drop from the factors any non-zero
c whose modulus is less than tol. the factorization will then
c require less storage but will be inaccurate. after a run of
c ma30a/ad where entries have been dropped, ma30b/bd should not
c be called. the default value for tol is 0.0.
c big is a real/double precision variable. if lbig has been set to
c .true., big will be set to the largest entry encountered during
c the factorization.
c ndrop is an integer variable. if tol has been set positive, on exit
c from ma30a/ad, ndrop will hold the number of entries dropped
c from the data structure.
c nsrch is an integer variable. if nsrch is set to a value less than
c or equal to n, then a different pivot option will be employed by
c ma30a/ad. this may result in different fill-in and execution
c time for ma30a/ad. if nsrch is less than or equal to n, the
c workspace arrays lastc and nextc are not referenced by ma30a/ad.
c the default value for nsrch is 32768.
c lbig is a logical variable. if lbig is set to .true., the value of
c the largest entry encountered in the factorization by ma30a/ad
c is returned in big. setting lbig to .true. will marginally
c increase the factorization time for ma30a/ad and will increase
c that for ma30b/bd by about 20%. the default value for lbig is
c .false.
c
double precision eps, rmin, tol, big
logical abort1, abort2, abort3, lbig
common /ma30ed/ lp, abort1, abort2, abort3
common /ma30gd/ eps, rmin
common /ma30id/ tol, big, ndrop, nsrch, lbig
data eps /1.0d-4/, tol /0.0d0/, big /0.0d0/
data lp /6/, nsrch /32768/
data lbig /.false./
data abort1 /.true./, abort2 /.true./, abort3 /.false./
end