! 03/06/82 IROUT31S HAS ERFN & ERFC REIMPLEMENTED USING ICL METHOD !02/06/82 CONVERTED TO IMP90 BY PDS !17/11/80 - IROUT29S - CAPACITY EXCEEDED CHECKING ADDED TO READSTRING !COPIED FROM ERCS08.B44SCE_IROUT27A ON 26.10.78 !LRANDOM ADDED 24.1.80 !UNUSED SPECS AND UNUSED ROUTINE FILL REMOVED 10/8/79 !SOME MATHS ROUTINE FAULT NOS ALTERED 19/12/78 !IEXPTEN RENAMED AS EXPTEN !ILOGTEN RENAMED AS LOGTEN !ICOT RENAMED AS COT !IHYPSIN RENAMED AS HYPSIN !IHYPCOS RENAMED AS HYPCOS !IHYPTAN RENAMED AS HYPTAN !THE FOLLOWING ROUTINES HAVE BEEN REMOVED: !DA AND SQ ROUTINES,FROMSTRING,CLOSESTREAM,IFDBINARY !RFDBINARY,CPUTIME,TIME,DATE,SETMARGINS !SPECS ADDED FOR CPUTIME, TIME , AND DATE !* MODIFIED 10/08/78 AGK (ADDED MLIBERR ROUTINE) !* MODIFIED 20/02/78 ERROR MESSAGE VALUES !* MODIFIED 29/09/78 LCG TO REMOVE MLIBERR !* MODIFIED 17/2/77 LAB (APPENDED SQ & DA FILE ROUTINES AND ! DATE AND TIME ROUTINES FOR IMP AND FORTE) !* MODIFIED 16/12/76 GEM (RANDOM) SYSTEMROUTINESPEC MOVE( INTEGER L,F,T) EXTERNALLONGREALFNSPEC CPUTIME EXTERNALSTRINGFNSPEC TIME EXTERNALSTRINGFNSPEC DATE SYSTEMROUTINESPEC MLIBERR( INTEGER ERROR) SYSTEMROUTINESPEC IOCP( INTEGER EP,N) !******** MODIFIED 02:07:76 15.15 LCG (ALGLRTS,MATHFNS CONCATONATED ! ,COMPLEX ROUTINES ! & DUPLICATES FOR FORTRAN) SYSTEMLONGREALFNSPEC ISIN( LONGREAL X) SYSTEMLONGREALFNSPEC ICOS( LONGREAL X) SYSTEMLONGREALFNSPEC IEXP( LONGREAL X) SYSTEMLONGREALFNSPEC ISQRT( LONGREAL X) SYSTEMLONGREALFNSPEC ILOG( LONGREAL X) CONSTLONGREAL LOG10A=2.3025850929940456840179914546843642076011 OWNLONGREAL PI=3.141592653589793238462643 CONSTLONGREAL R1=R'41C98867F42983DF' CONSTLONGREAL R2=R'C2562FB2813C6014' CONSTLONGREAL R3=R'C1146D547FED8A3D' CONSTLONGREAL R4=R'C0157BD961F06C89' CONSTLONGREAL S1=R'421B189E39236635' CONSTLONGREAL S2=R'4168EE1BDE0C3700' CONSTLONGREAL S3=R'41224E7F3CBDFE41' CONSTLONGREAL S4=R'41144831DAFBF542' CONSTLONGREAL RT3=R'411BB67AE8584CAA' CONSTLONGREAL PIBY6=R'40860A91C16B9B2C' CONSTLONGREAL PIBY2M1=R'40921FB54442D184' CONSTLONGREAL RT3M1=R'40BB67AE8584CAA7' CONSTLONGREAL TANPIBY12=R'404498517A7B3559' SYSTEMLONGREALFN IARCTAN( LONGREAL X2,X1) LONGREAL CONSTANT LONGREAL Y,YSQ,X INTEGER SIGN,SIGN1,SIGN2 SIGN = 1; SIGN1 = 1; SIGN2 = 1 CONSTANT = 0 IF X2 < 0 THEN SIGN2 = - 1 AND X2 = - X2 IF X1 < 0 THEN SIGN1 = - 1 AND X1 = - X1 IF X1 = 0 AND X2 = 0 START MLIBERR(71); ! ERROR(1, 38, 1, 0, 1, 0) X = 0 FINISHELSESTART IF X1 > X2 START SIGN = - 1 Y = X2 / X1 FINISHELSE Y = X1 / X2 IF Y > TANPIBY12 THEN Y = (RT3M1 * Y - 1.0 + Y) / (Y + RT3) AND C CONSTANT = PIBY6 YSQ = Y * Y X = Y * (R1 / (YSQ + S1 + (R2 / (YSQ + S2 + (R3 / (YSQ + S3 + (R4 / C (YSQ + S4)))))))) + CONSTANT IF SIGN = - 1 THEN X = 1.0 - X + PIBY2M1 IF SIGN1 = 1 START IF SIGN2 = - 1 THEN X = PI - X FINISHELSESTART IF SIGN2 = - 1 THEN X = X - PI ELSE X = - X FINISH FINISH RESULT = X END EXTERNALLONGREALFN HYPTAN( LONGREAL X) CONSTLONGREAL A1=676440.765 CONSTLONGREAL A2=45092.124 CONSTLONGREAL A3=594.459 CONSTLONGREAL B1=2029322.295 CONSTLONGREAL B2=947005.29 CONSTLONGREAL B3=52028.55 CONSTLONGREAL B4=630.476 LONGREAL XSQ,NUM,DENOM,RES INTEGER MINUS MINUS = 0 IF X <= - 0.54931 THEN MINUS = 1 AND X = - X ELSE MINUS = 0 IF (X >= 0.54931 AND X < 20.101) START RES = 1 - (2.0 / (IEXP(2.0 * X) + 1.0)) IF MINUS = 1 THENRESULT = - RES ELSERESULT = RES FINISH IF X >= 20.101 START IF MINUS = 1 THENRESULT = - 1.0 ELSERESULT = 1.0 FINISH XSQ = X * X NUM = XSQ * (A1 + XSQ * (A2 + XSQ * (A3 + XSQ))) DENOM = B1 + XSQ * (B2 + XSQ * (B3 + XSQ * (B4 + XSQ))) RESULT = (1 - NUM / DENOM) * X END EXTERNALLONGREALFN COT( LONGREAL X) LONGREAL DENOM CONSTLONGREAL MAX=1.0@15 CONSTLONGREAL NZERO=0.00000000000001; !@-14 IF X > MAX THEN MLIBERR(66) ELSESTART DENOM = ISIN(X) IF MOD(DENOM) <= NZERO THEN MLIBERR(67) ELSERESULT = ICOS(X) / C DENOM FINISH STOP END SYSTEMLONGREALFN IRADIUS( LONGREAL X,Y) ! %IF X*X>7@75 %OR X*X+Y*Y>7@75 %THEN MLIBERR(70) ! IMERR(25, 10) RESULT = ISQRT(X * X + Y * Y) END SYSTEMLONGREALFN IARCSIN( LONGREAL X) LONGREAL ARKSN,G,F,Q,Y,Y2 LONGREALARRAY DT(1:42) INTEGER I,J,M,M2 CONSTLONGREAL DROOT=1.4142135623730950488 CONSTLONGREALARRAY DA(0:21)=0.0, 1.48666649328710346896, 0.03885303371652290716, 0.00288544142208447113, 0.00028842183344755366, 0.00003322367192785279, 0.00000415847787805283, 0.00000054965045259742, 0.00000007550078449372, 0.00000001067193805630, 0.00000000154218037928, 0.00000000022681145985, 0.00000000003383885639, 0.00000000000510893752, 0.00000000000077911392, 0.00000000000011983786, .00000000000001856973, .00000000000000289619, .00000000000000045428, .00000000000000007162, .00000000000000001134, .00000000000000000180 ARKSN = 0.0 G = 0.0 F = 0.0 Q = 0.0 I = 0 J = 1 DT(1) = 1.0 IF MOD(X) > 1.0 THEN MLIBERR(72) ! IMERR(25, 1) IF (MOD(X) >= 1. / DROOT AND MOD(X) <= 1.0) THEN Y = ISQRT(1.0 - X * C X) * DROOT ELSE Y = X * DROOT DT(2) = Y ARKSN = ARKSN + 0.74333324664350173448 Y2 = Y * 2 CYCLE M=2,1,21 G = ARKSN M2 = M << 1 DT(M2 - 1) = Y2 * DT(M2 - 2) - DT(M2 - 3) DT(M2) = Y2 * DT(M2 - 1) - DT(M2 - 2) ARKSN = ARKSN + DA(M) * DT(M2 - 1) IF MOD(G - ARKSN) < 0.0000000000000000005 THEN ->RESULT REPEAT RESULT:IF 1.0 / DROOT <= MOD(X) <= 1.0 START ARKSN = PI / 2.0 - ARKSN * Y IF X < 0.0 THENRESULT = - ARKSN ELSERESULT = ARKSN FINISHELSERESULT = Y * ARKSN END SYSTEMLONGREALFN IARCCOS( LONGREAL X) IF MOD(X) > 1.0 THEN MLIBERR(73) ! IMERR(25, 2) RESULT = PI / 2.0 - IARCSIN(X) END EXTERNALLONGREALFN HYPSIN( LONGREAL X) LONGREAL Y,Z,XPOW IF MOD(X) > 172.694 THEN MLIBERR(74) ! IMERR(25, 4) IF MOD(X) < 0.3465736 THEN XPOW = X * X ANDRESULT = X * (1.0 + XPOW C * (0.16666505 + 0.00836915 * XPOW)) Y = 0.5 * IEXP(X) Z = 0.5 * IEXP( - X) RESULT = Y - Z END EXTERNALLONGREALFN HYPCOS( LONGREAL X) LONGREAL Y,Z IF MOD(X) > 172.694 THEN MLIBERR(75) ! IMERR(25, 5) Y = 0.5 * IEXP(X) Z = 0.5 * IEXP( - X) RESULT = Y + Z END EXTERNALLONGREALFN EXPTEN( LONGREAL X) INTEGER I I = INTPT(X) IF X - I = 0.0 THENRESULT = 10.0 ** I !10@XZ=E@(X*LN10) RESULT = IEXP(LOG10A * X) END EXTERNALLONGREALFN LOGTEN( LONGREAL X) IF X = 1.0 THENRESULT = 0.0 RESULT = 0.4342944819032518276511289 * ILOG(X) END EXTERNALLONGREALFN GAMMAFN( LONGREAL X) LONGREAL RX,G,RT INTEGER K CONSTLONGREALARRAY A(1:15)=0.99999999999999990, 0.42278433509851812, 0.41184033042198148, 0.08157691940138868, 0.07424900794340127, -0.00026695102875553, 0.01115381967190670, -0.00285150124303465, 0.00209975903507706, -0.00090834655742005, 0.00046776781149650, -0.00020644763191593, 0.00008155304980664, -0.00002484100538487, 0.00000510635920726 IF X > 57 THEN MLIBERR(65) RX = 1 IF 2 <= X <= 3 THEN ->G2 IF X < 2 THEN ->G3 G1: X = X - 1 RX = RX * X IF X < 3 THEN ->G2 ->G1 G3: IF MOD(X) < 1@-11 THEN MLIBERR(65) RX = RX / X X = X + 1 IF X < 2 THEN ->G3 G2: G = - 0.00000051132627267 RT = X - 2 CYCLE K=15, - 1,1 G = G * RT + A(K) REPEAT RESULT = RX * G END EXTERNALLONGREALFN LOGGAMMA( LONGREAL X) LONGREAL U,YT,YR,FX,LX,MODD,SX INTEGER IND,K CONSTLONGREALARRAY A(1:7)=0.083333333333333, -0.002777777777778, 0.000793650793651, -0.000595238095238, 0.000841750841751, -0.001917520917527, 0.006410256410256 YT = 0.0 YR = 4.2913@73 IF X <= YT THEN MLIBERR(63) IF X >= YR THEN MLIBERR(64) U = X FX = 0 IF X < 0 THEN IND = 1 ELSE IND = - 1 X = MOD(X) IF X >= 13 THEN ->G1 IF X < 2@-10 THEN ->G6 G2: LX = LOG(X * X) / 2 FX = FX + LX X = X + 1 IF X < 13 THEN ->G2 G1: IF IND = - 1 THEN ->G5 K = INTPT(X + 5@-8) IF MOD(X - K) < 2@-10 THEN ->G6 G5: MODD = X * X LX = - 2.955065359477124@-2 SX = LX * X / MODD CYCLE K=7, - 1,1 LX = (SX * X) / MODD + A(K) SX = (LX * X) / MODD REPEAT SX = SX - X - FX + 0.918938533204673 LX = LOG(X * X) / 2 SX = SX + (X - 0.5) * LX IF IND = 1 THENSTART FX = SIN(PI * U) X = U * FX MODD = PI / (X * X) LX = LOG(X * MODD * X * MODD) / 2 SX = LX - SX FINISH RESULT = SX ->G7 G6: RESULT = 1@17 G7:END LONGREALFNSPEC ERFNC( LONGREAL INARG) EXTERNALLONGREALFN ERFN( LONGREAL INARG) !*********************************************************************** !* EVALUATES THE RRORFN USING ICLS METHOD * !*********************************************************************** INTEGER SIGN LONGREAL X,RESULT CONSTLONGREAL L1=0.47 CONSTLONGREAL L2=6.0924 CONSTLONGREAL TBYRTPI=R'41120DD750420B69'{2//SQRT(PI)} CONSTLONGREAL LAST=R'40F4DE9BD37A6F4D'{22/23} *MPSR_X'4080'; ! MASK OUT UNDERFLOW ! NO NEEDED IF CALLED FROM IMP IF INARG <= 0 START IF INARG = 0 THENRESULT = 0 ELSE SIGN = 1 AND X = - INARG FINISHELSE SIGN = 0 AND X = INARG IF X < L1 START RESULT = - (X * X) RESULT = TBYRTPI * EXP(RESULT) * (X / (1 + (2 * RESULT / (3 - (4 * C RESULT / (5 + (6 * RESULT / (7 - (8 * RESULT / (9 + (10 * RESULT C / (11 - (12 * RESULT / (13 * (14 * RESULT / (15 - (16 * RESULT / C (17 + (18 * RESULT / (19 - (20 * RESULT / (21 + (LAST * C RESULT))))))))))))))))))))))) FINISHELSEIF X < L2 THEN RESULT = 1 - ERFNC(X) ELSE RESULT = 1 IF SIGN = 1 THEN RESULT = - RESULT RESULT = RESULT END EXTERNALLONGREALFN ERFNC( LONGREAL INARG) !*********************************************************************** !* THE COMPLIMENTARY ERROR FN SUCH THAT ERFNC(X)+ERFN(X)=1 * !*********************************************************************** INTEGER SIGN; ! OR FOR GT>0 1 OTHERWISE LONGREAL X,RESULT CONSTLONGREAL ZERO=0 CONSTLONGREAL ONE=1 CONSTLONGREAL TWO=2 CONSTLONGREAL L1=0.47{LIMITS FOR 3 RANGES} CONSTLONGREAL L2=8.0 CONSTLONGREAL L3=13.306 CONSTLONGREAL PL0=0.182633488422951126@4 CONSTLONGREAL PL1=0.289802932921676556@4 CONSTLONGREAL PL2=0.232043959025163525@4 CONSTLONGREAL PL3=0.114326207070388617@4 CONSTLONGREAL PL4=0.368519615471001064@3 CONSTLONGREAL PL5=0.770816173036842861@2 CONSTLONGREAL PL6=0.967580788298726540@1 CONSTLONGREAL PL7=0.564187782550739741 CONSTLONGREAL QL0=0.182633488422951126@4 CONSTLONGREAL QL1=0.495882756472114071@4 CONSTLONGREAL QL2=0.608954242327244355@4 CONSTLONGREAL QL3=0.442961280388368273@4 CONSTLONGREAL QL4=0.209438436778953959@4 CONSTLONGREAL QL5=0.661736120710765347@3 CONSTLONGREAL QL6=0.137125596050062220@3 CONSTLONGREAL QL7=0.171498094362760785@2 CONSTLONGREAL PH0=0.297886562639399289@1 CONSTLONGREAL PH1=0.740974060596474179@1 CONSTLONGREAL PH2=0.616020985310963054@1 CONSTLONGREAL PH3=0.501904972678426746@1 CONSTLONGREAL PH4=0.127536664472996595@1 CONSTLONGREAL PH5=0.564189583547755074 CONSTLONGREAL QH0=0.336907520698275277@1 CONSTLONGREAL QH1=0.960896532719278787@1 CONSTLONGREAL QH2=0.170814407474660043@2 CONSTLONGREAL QH3=0.120489519278551290@2 CONSTLONGREAL QH4=0.939603401623505415@1 CONSTLONGREAL QH5=0.226052852076732697@1 *MPSR_X'4080'; ! MASK OUT UNDERFLOW ! NOT NEEDED IF CALLED FROM IMP IF INARG <= 0 THENSTART IF INARG = 0 THENRESULT = ONE ELSE SIGN = 1 AND X = INARG FINISHELSESTART SIGN = 0; X = INARG FINISH IF X < L1 THENRESULT = ONE - ERFN(INARG) IF X < L2 START RESULT = - (X * X) RESULT = (((((((PL7 * X + PL6) * X + PL5) * X + PL4) * X + PL3) * X C + PL2) * X + PL1) * X + PL0) / ((((((((X + QL7) * X + QL6) * X + C QL5) * X + QL4) * X + QL3) * X + QL2) * X + QL1) * X + QL0) * C EXP(RESULT) IF SIGN = 1 THEN RESULT = TWO - RESULT FINISHELSEIF X < L3 START RESULT = - (X * X) RESULT = (((((PH5 * X + PH4) * X + PH3) * X + PH2) * X + PH1) * X + C PH0) / ((((((X + QH5) * X + QH4) * X + QH3) * X + QH2) * X + C QH1) * X + QH0) * EXP(RESULT) IF SIGN = 1 THEN RESULT = TWO - RESULT FINISHELSEIF SIGN = 1 THEN RESULT = TWO ELSE RESULT = 0 RESULT = RESULT END EXTERNALINTEGERFN BITS( INTEGER X) ! %INTEGER I, J ! WHILE X#0 %THEN J=J+X&1 %AND X=X>>1 ! %RESULT =J *LSS_X *LB_0 *JAT_4,<OUT> AGN: *SHZ_X *USH_1 *ADB_1 *JAF_4,<AGN> OUT: *LSS_ B *EXIT_-64 END ; ! of BITS. EXTERNALINTEGERFN PARITY( INTEGER I) RESULT = 1 - (I & 1) * 2 END EXTERNALINTEGERFN SHIFTC( INTEGER X,Y) INTEGER Z IF - 32 <= Y <= 32 THEN ->L3 PRINTSTRING(" ILLEGAL SHIFTC") MONITOR STOP L3: ->L2 IF Y <= 0 *LSS_X *ROT_Y *EXIT_-64 L2: RESULT = X IF Y = 0 *LSS_X *LUH_X *USH_Y *STUH_ B *EXIT_-64 END EXTERNALROUTINE ISOCARD( BYTEINTEGERARRAYNAME CARD) IOCP(10,ADDR(CARD(1))) END EXTERNALLONGREALFN RFDISO( BYTEINTEGERARRAYNAME CARD, INTEGER COL1,COL2, INTEGERNAME ERROR) INTEGER I,J,K,L,M,SCALE INTEGER SIGN REAL RES SIGN = 0 ->L1 IF COL1 > COL2 M = 1; ERROR = 0; RES = 0; SCALE = 0; J = 1 CYCLE I=COL1,1,COL2 K = CARD(I) ->L5 IF K = ' ' ->L7 IF K = '+' ->L4 IF K = '-' ->L2 UNLESS '0' <= K <= '9' RES = RES * 10 + (K & 15) SCALE = 10 * SCALE M = 0 ->L3 L5: ->L3 IF M = 1 ERROR = 1 RES = 10 * RES SCALE = 10 * SCALE ->L3 L4: J = - 1 L7: ->L8 IF SIGN = 1 OR M = 0; SIGN = 1 L3: REPEAT ERROR = M ! ERROR RESULT = J * RES UNLESS SCALE # 0 RESULT = J * RES / SCALE L1: ERROR = 3 RESULT = 0 L2: ->L7 IF CARD(I) = '&' ->L6 IF CARD(I) = '.' L8: ERROR = 2 RESULT = I L6: ->L8 IF SCALE # 0; SCALE = 1 ->L3 END EXTERNALINTEGERFN IFDISO( BYTEINTEGERARRAYNAME CARD, INTEGER COL1,COL2, INTEGERNAME ERROR) INTEGER I,J,K,RES INTEGER SIGN INTEGER M ->L1 IF COL1 > COL2 RES = 0 ERROR = 0 SIGN = 0 M = 1 J = 1 CYCLE I=COL1,1,COL2 K = CARD(I) ->L5 IF K = ' ' ->L6 IF K = '+' ->L4 IF K = '-' ->L2 UNLESS '0' <= K <= '9' RES = 10 * RES + K & 15 M = 0 ->L3 L5: ->L3 IF M = 1 ERROR = 1 RES = 10 * RES ->L3 L4: J = - 1 L6: ->L7 IF SIGN = 1 OR M = 0 SIGN = 1 L3: REPEAT ERROR = M ! ERROR RESULT = J * RES L1: ERROR = 3 RESULT = 0 L2: ->L6 IF K = '&' L7: ERROR = 2 RESULT = I END EXTERNALROUTINE SOLVELNEQ( LONGREALARRAYNAME A,B, INTEGER N, LONGREALNAME DET) LONGREAL AMAX,CH INTEGER I,J,JMAX,S MLIBERR(X'A07') UNLESS N > 0 ->L1 IF N > 1 DET = A(1,1) ->L2 IF DET = 0 B(1) = B(1) / DET ->L2 L1: DET = 1 CYCLE I=1,1,N - 1 AMAX = 0; JMAX = 0 CYCLE J=I,1,N ->L4 IF MOD(A(J,I)) <= AMAX AMAX = MOD(A(J,I)); JMAX = J L4: REPEAT ->L5 IF JMAX = I DET = - DET ->L6 IF JMAX # 0 DET = 0; ->L2 L6: CYCLE J=I,1,N CH = A(I,J) A(I,J) = A(JMAX,J) A(JMAX,J) = CH REPEAT CH = B(I) B(I) = B(JMAX) B(JMAX) = CH L5: CH = A(I,I) DET = DET * CH CYCLE J=I + 1,1,N AMAX = A(J,I) / CH CYCLE S=I + 1,1,N A(J,S) = A(J,S) - A(I,S) * AMAX REPEAT B(J) = B(J) - B(I) * AMAX REPEAT REPEAT CH = A(N,N) DET = DET * CH ->L2 IF DET = 0 B(N) = B(N) / CH CYCLE I=N - 1, - 1,1 CH = B(I) CYCLE J=I + 1,1,N CH = CH - A(I,J) * B(J) REPEAT B(I) = CH / A(I,I) REPEAT L2:END EXTERNALROUTINE DIVMATRIX( LONGREALARRAYNAME A,B, INTEGER N,M, LONGREALNAME DET) ! A=INV(B)A:BNXN, ANXM LONGREAL AMAX,CH INTEGER I,J,JMAX,S,K MLIBERR(X'A07') UNLESS N > 0 ->L1 IF N > 1 DET = B(1,1) ->L2 IF DET = 0 CYCLE I=1,1,M A(1,I) = A(1,I) / DET REPEAT ->L2 L1: DET = 1 CYCLE I=1,1,N - 1 AMAX = 0; JMAX = 0 CYCLE J=I,1,N ->L4 IF MOD(B(J,I)) <= AMAX AMAX = MOD(B(J,I)); JMAX = J L4: REPEAT ->L5 IF JMAX = I DET = - DET ->L6 IF JMAX # 0 DET = 0; ->L2 L6: CYCLE J=I,1,N CH = B(I,J) B(I,J) = B(JMAX,J) B(JMAX,J) = CH REPEAT CYCLE K=1,1,M CH = A(I,K) A(I,K) = A(JMAX,K) A(JMAX,K) = CH REPEAT L5: CH = B(I,I) DET = DET * CH CYCLE J=I + 1,1,N AMAX = B(J,I) / CH CYCLE S=I + 1,1,N B(J,S) = B(J,S) - B(I,S) * AMAX REPEAT CYCLE K=1,1,M A(J,K) = A(J,K) - A(I,K) * AMAX REPEAT REPEAT REPEAT CH = B(N,N) DET = DET * CH ->L2 IF DET = 0 CYCLE K=1,1,M A(N,K) = A(N,K) / CH REPEAT CYCLE I=N - 1, - 1,1 AMAX = B(I,I) CYCLE K=1,1,M CH = A(I,K) CYCLE J=I + 1,1,N CH = CH - B(I,J) * A(J,K) REPEAT A(I,K) = CH / AMAX REPEAT REPEAT L2:END EXTERNALROUTINE UNIT( LONGREALARRAYNAME A, INTEGER N) INTEGER I,J MLIBERR(X'A07') UNLESS N > 0 CYCLE I=1,1,N CYCLE J=1,1,N A(I,J) = 0 REPEAT A(I,I) = 1 REPEAT END EXTERNALROUTINE INVERT( LONGREALARRAYNAME A,B, INTEGER N, LONGREALNAME DET) ! A=INV B USING DIV MATRIX MLIBERR(X'A07') UNLESS N > 0 UNIT(A,N) DIVMATRIX(A,B,N,N,DET) END EXTERNALLONGREALFN DET( LONGREALARRAYNAME A, INTEGER N) LONGREALARRAY B(1:N); LONGREAL DET INTEGER I MLIBERR(X'A07') UNLESS N > 0 CYCLE I=1,1,N B(I) = 0 REPEAT SOLVELNEQ(A,B,N,DET) RESULT = DET END EXTERNALROUTINE NULL( LONGREALARRAYNAME A, INTEGER N,M) INTEGER I,J MLIBERR(X'A07') UNLESS N > 0 AND M > 0 CYCLE I=1,1,N CYCLE J=1,1,M A(I,J) = 0 REPEAT REPEAT END EXTERNALROUTINE ADDMATRIX( LONGREALARRAYNAME A,B,C, INTEGER N,M) INTEGER I,J MLIBERR(X'A07') UNLESS N > 0 AND M > 0 CYCLE I=1,1,N CYCLE J=1,1,M A(I,J) = B(I,J) + C(I,J) REPEAT REPEAT END EXTERNALROUTINE SUBMATRIX( LONGREALARRAYNAME A,B,C, INTEGER N,M) INTEGER I,J MLIBERR(X'A07') UNLESS N > 0 AND M > 0 CYCLE I=1,1,N CYCLE J=1,1,M A(I,J) = B(I,J) - C(I,J) REPEAT REPEAT END EXTERNALROUTINE COPYMATRIX( LONGREALARRAYNAME A,B, INTEGER N,M) INTEGER I,J MLIBERR(X'A07') UNLESS N > 0 AND M > 0 CYCLE I=1,1,N CYCLE J=1,1,M A(I,J) = B(I,J) REPEAT REPEAT END EXTERNALROUTINE MULTMATRIX( LONGREALARRAYNAME A,B,C, INTEGER N,P,M) ! A=B*C, A IS N X M INTEGER I,J,K LONGREAL R MLIBERR(X'A07') UNLESS N > 0 AND M > 0 AND P > 0 CYCLE I=1,1,N CYCLE J=1,1,M R = 0 CYCLE K=1,1,P R = R + B(I,K) * C(K,J) REPEAT A(I,J) = R REPEAT REPEAT END EXTERNALROUTINE MULTTRMATRIX( LONGREALARRAYNAME A,B,C, INTEGER N,P,M) LONGREAL R ! A=B*C, A IS N X M INTEGER I,J,K MLIBERR(X'A07') UNLESS N > 0 AND M > 0 AND P > 0 CYCLE I=1,1,N CYCLE J=1,1,M R = 0 CYCLE K=1,1,P R = R + B(I,K) * C(J,K) REPEAT A(I,J) = R REPEAT REPEAT END EXTERNALROUTINE TRANSMATRIX( LONGREALARRAYNAME A,B, INTEGER N,M) ! AN X M, B M X N INTEGER I,J MLIBERR(X'A07') UNLESS N > 0 AND M > 0 CYCLE I=1,1,N CYCLE J=1,1,M A(I,J) = B(J,I) REPEAT REPEAT END EXTERNALREALFN RANDOM( INTEGERNAME I, INTEGER N) REAL X INTEGER J ->L2 IF N < 0; ->L1 IF N > 1 ! %CONTROL 0; ! I=(65539*I)&X'7FFFFFFF' ! %CONTROL X'1111' J = I *LSS_65539 *IMYD_J *AND_X'000000007FFFFFFF' *STUH_ B *ST_J I = J RESULT = 0.0000000004656613 * I L1: X = 0 CYCLE N=1,1,N; X = X + RANDOM(I,1); REPEAT ; RESULT = X L2: PRINTSTRING("NEGATIVE ARGUMENT IN RANDOM"); MONITOR STOP END !* EXTERNALLONGREALFN LRANDOM( INTEGERNAME I, INTEGER N) LONGREAL X INTEGER J ->L2 IF N < 0; ->L1 IF N > 1 ! %CONTROL 0; ! I=(65539*I)&X'7FFFFFFF' ! %CONTROL X'1111' J = I *LSS_65539 *IMYD_J *AND_X'000000007FFFFFFF' *STUH_ B *ST_J I = J RESULT = 0.0000000004656613 * I L1: X = 0 CYCLE N=1,1,N; X = X + LRANDOM(I,1); REPEAT ; RESULT = X L2: PRINTSTRING("NEGATIVE ARGUMENT IN LRANDOM"); MONITOR STOP END ; !OF LRANDOM !* ! ! FORTRAN ROUTINES FOR DATE AND TIME CALLABLE ONLY FROM FORTE !* EXTERNALROUTINE CPUTIM( LONGREALNAME X) X = CPUTIME END EXTERNALROUTINE CTIME( LONGREALNAME X) STRING (10)T T = TIME MOVE(8,ADDR(T) + 1,ADDR(X)) BYTEINTEGER(ADDR(X) + 2) = ':' BYTEINTEGER(ADDR(X) + 5) = ':' END EXTERNALROUTINE HDATE( LONGREALNAME X) STRING (10)D D = DATE MOVE(8,ADDR(D) + 1,ADDR(X)) END !* EXTERNALROUTINE READSTRING( INTEGER DR0,DR1) !WHEN CALLED THIS ROUTINE TAKES A %STRINGNAME PARAMETER INTEGER I,DELIM,LEN,MAXLEN; STRING (1)T STRINGNAME S LEN = 0; !CURRENT LENGTH S == STRING(DR1) MAXLEN = (DR0 & X'FF') - 1; !BOUND LESS 1 BYTE FOR LENGTH BYTE L1: READSYMBOL(I) ->L1 IF I = 10 OR I = 32 OR I = 25 ->L2 IF I = '''' OR I = '"' SIGNALEVENT 4,2; !SYMBOL INSTEAD OF STRING L2: S = ""; DELIM = I L3: ->L4 IF NEXTSYMBOL = DELIM IF LEN = MAXLEN THENSIGNALEVENT 6,1 L5: READITEM(T) S = S.T LEN = LEN + 1 ->L3 L4: SKIPSYMBOL ->L5 IF NEXTSYMBOL = DELIM END ENDOFFILE