2013-04-09 Jonathan Hogg Version 1.3.0. Fix minor undefined variable bug found by nagfor. 2007-04-26 Version 1.2.0. Statements that extended to column 73 changed. 2005-01-18 Version 1.1.0. In MA42N/ND changed IF (NMAXE.EQ.1 .OR. LAST(MFR).GE.0) THEN into two separate tests (problem if NMAXE = 1 and system is singular, MFR may be too large) 2004-07-12 Version 1.0.0. Version numbering added. 2002-03-25 * If INFO(1) = 5 or 6 is returned by MA42K/KD, it is necessary to zero the appropraite entries of FA as if the data has been output. MA42G/GD, MA42H/HD and MA42K/KD modified. * Changes made to incorporate the option of forcing diagonal pivots until the last element has been assembled. ICNTL(7) used to control whether diagonal pivoting is forced. ICNTL(7) = 0 (default) Static condensation + off-diag. pivoting ICNTL(7) = 1001 Static condensation + diag. pivoting ICNTL(7) = -1001 No static condensation + diag. pivoting ALL other values of ICNTL(7): No static condensation + off-diag. pivoting. Diagonal pivoting only allowed for ELEMENT entry. If diagonal pivoting and no warnings issued, on exit INFO(1) set to 6 + (Number of off-diagonal pivots) ISAVE(38) set to hold abs(ICNTL(7)) UNLESS an error is encountered, in which case it holds INFO(1). * MA42N/ND, MA42O/OD altered to cope with choosing diagonal pivots. * Also made a change to pivot search (on or off diagonal). In MA42N/ND added a loop to look only at largest entry in column to to see if it can be used as a pivot (trying to reduce search time by not looking for largest entry in fully summed part unless we have to). This may mean INFO(13), INFO(14), and INFO(15) having different values than for previous version of code. In particular, some changes to test deck output. 1999-11-29 Error in call to MA42H/HD from MA42N/ND when KPRE>0 or LFRE>0. Also, changed second dimension of FA in MA42G/GD from NFRONT to * (NFRONT causes error when MA42G/GD called from MA42N/ND when KPRE>0 or LFRE>0). Similarly, second dimension of FRHS changed to * 1999-05-20 Error found in MA42D/DD. Replace DO 10 I = 1,IRECD IBUFR(DIMIBF-IRECD+I) = IBUFR(IR2+I) 10 CONTINUE by DO 10 I = IRECD,1,-1 IBUFR(DIMIBF-IRECD+I) = IBUFR(IR2+I) 10 CONTINUE and DO 30 I = 1,IPNT BUFR(DIMBUF-IPNT+I) = BUFR(JR2+I) 30 CONTINUE by DO 30 I = IPNT,1,-1 BUFR(DIMBUF-IPNT+I) = BUFR(JR2+I) 30 CONTINUE 1999-04-28 Error in flop count for static condensation variables corrected. In MA42O/OD OPS = OPS + DBLE(NUMPIV* (NVAR-1)* (MVAR-1)*2) changed to DO 456 J = 1,NUMPIV OPS = OPS + DBLE((NVAR-J)* (MVAR-J)*2) 456 CONTINUE NOTE: has no effect for equation entry (since NUMPIV=1) 1999-08-06 Error in MA42D/DD. If direct access files not used then JFLAG not set so at end of subroutine jump to return (in MA42E/ED jump already there.) 1999-04-14 In MA42C/CD, bug found in workspace LW if direct access files used. 1998-12-18 In MA42F/FD changed INFO(10) = MKEY(1) INFO(11) = MKEY(2) INFO(12) = MKEY(3) to INFO(10) = MAX(1,MKEY(1)) INFO(11) = MAX(1,MKEY(2)) ... this only if L factored stored INFO(12) = MAX(1,MKEY(3)) (since otherwise can get INFO(10)-INFO(12) equal to zero when error -17 return ... INFO values then no use for resetting LENFLE) 1998-12-12 INFO(3) is now updated in MA42F/FD (not in MA42H/HD). Change made so that when MA42 used with MA52, INFO(3) contains correct info. on exit (otherwise, as we do not pick all variable as pivots within a subdomain, INFO(3) would not be a count of all variables in subdomain but would hold number of variables eliminated within subdomain) 1998-10-27 In MA42J/JD and MA42B/BD changed test on NMAXE so that NMAXE does not have to have the same value on each entry if elements are being used (still check that user has not changed for element to equation entry, or visa versa, by comparing NMAXE with ISAVE(21) Changed IF (NMAXE.NE.ISAVE(21)) GO TO 170 to IF (ISAVE(21).EQ.1 .AND. NMAXE.GT.1) GO TO 170 IF (ISAVE(21).GT.1 .AND. NMAXE.EQ.1) GO TO 170 Similar change in MA42J/JD. 1997-09-04 In MA42J/JD, if called from within MA42B/BD (because frontsize too small), use INFO values to initialise IFSIZE and allow updated lower bounds on the filesizes to be returned to the user. 1997-03-14 In MA42F/FD added a test so that MA42N/ND is only called if some variables have become fully summed since the assembly of the most recent elt/equ. 1997-01-20 In MA42G/GD and MA42H/HD, JFLAG should only be checked for an error IF MA42L/LD has been called (o.w. could be undefined). This has been corrected. 1996-11-11 After each call to MA42D/DD and MA42E/ED, check the error flag and write error message if appropriate. 1996-06-04 In MA42B/BD, avoid zeroing the solution vector X if the number of variables in the problem is equal to the largest integer used to index a variable (i.e if NDF = INFO(3)). N.B. Cannot avoid the zeroing in MA42C/CD since we do not pass the number of variables to MA42C/CD in an ISAVE entry (clearly, we should have done!). July 2000 : still have to zero X if problem found to be singular, otherwise components of X may be undefined. 1996-04-17 Moved statement OFDIAG = 0 from MA42N/ND into MA42F/FD (if the problem has only one element, all variables are static condensation variables and OFDIAG would not be set). ????-??-?? (Sometime after 1995-10-04) Exploit zeros in front by setting ISAVE(20) > 1 (HSL 12 version equivalent to ISAVE(20) = 1) This version does row and col. swaps to exploit zeros in both rows and columns. To exploit zeros in front, set ISAVE(20)>1 before first call to MA42B/BD. Also, PIVBLK = ISAVE(19) in MA42F/FD allows us to wait until sufficiently many variables can be eliminated at once (as in cache paper). PIVBLK ALSO USED IN MA42J/JD. In HSL 12, PIVBLK = 1. If block size other than 1 is wanted, user must set ISAVE(19) to min. pivot block before calls to MA42J/JD (no action needed for min. block size of 1) but in experiments found 16 or 32 better (16 used in MA62) This version of code should be used with MP42 (which allows user to choose min. pivot block size) Note that for equation problems, 16 may be too large. USER MUST NOT CHANGE ISAVE(19) BETWEEN CALLS TO MA42J/JD AND CALLS TO MA42B/BD (IE USER CAN ONLY RESET ISAVE(19) AND ISAVE(20) ONCE) AND ISAVE(20) MUST NOT BE CHANGED BETWEEN CALLS TO MA42B/BD 1995-10-04 Filled in buffers on the last time they are written out... June 1996 changed fill in to avoid doing it unnecessarily. We now only do it if the buffer is the first and last one to be written to d.a. file. 1995-08-14 Bug corrected in computation of sign of the determinant. 1995-08-10 Bug in MA42B/BD. IF (ISAVE(31).EQ.31) should read IF (ISAVE(31).EQ.1) 1995-08-06 Ensured INFO(2) = 0 and RINFO(1) = 0.0 if matrix found to be singular (this was not always happening if the computation continued) 1995-03-17 CLOSE (IFILE(I)) replaced by CLOSE (IFILE(I),STATUS='DELETE') 1995-02-01 Operation count (RINFO(2)) changed since BLAS cannot take advantage of zeros in frontal matrix. 1994-06-24 Bug found in MA42N/ND. We do not have the best pivot on hold if IFORCE>0 and IELIM=1 1994-06-13 Immediate return added to MA42B/BD if it is entered with INFO(1)<0. 1994-06-02 * NUMPIV made a local variable in MA42O/OD * KX made a local variable in MA42N/ND * In MA42J/JD, IFSIZE(1) = MAX(INFO(8),KFRNT) IFSIZE(2) = MAX(INFO(9),LFRNT) (to stop code return a lower bound for the frontsize which is smaller than that provided by user). * Changed printed error message when -12 returned. 1994-05-20 INFO(1)=3 replaced by INFO(1)=2. 1994-05-13 -15 cannot be returned by MA42O/OD or by MA42H/HD. 1994-04-27 Change to MA42B/BD so that ISAVE(1)-ISAVE(15) are set on first call (unless MA42P/PD has been called). Want to be able to recall MA42B/BD without recalling MA42P/PD. 1994-04-18 Argument list for MA42D/DD changed to pass lengths of the array Y as LY1 and LY2. Y is of length 1,1 when called from MA42B/BD. 1994-04-15 * Error return -18 not possible from MA42J/JD so C test for this removed from MA42B/BD. * Also, before calling MA42J/JD from MA42B/BD for the first time, it is not necessary to move data to the start of IW so this has been removed). 1994-03-04 Bug found in MA42P/PD. If ISTRM(2)=0 then we need to assign NUMBLK(2)=0 (we had NUMBLK(2) unassigned in this case). 1993-11-18 Minor changes made to code: * A bug was found in the case of the error flag INFO(1)=-14 being returned (KPVLNK was not properly set in this case and this caused unassigned variable error messages to be returned when LAST was restored). * Also, ISAVE(38) set on each return from MA42A/AD, MA42J/JD, MA42P/PD, MA42B/BD to hold a copy of INFO(1). On each entry, a check is made that an error was not previously encountered. 1993-04-02 Original version