IMPLEMENTATION MODULE F77func;
(*------------------------------------------------------------------------*)
(* Funktionen die das Portieren von Fortran-Quellen unterstuetzen. *)
(* *)
(* Some Fortran intrinsics which can be used to translate Fortran to M2 *)
(*------------------------------------------------------------------------*)
(* Letzte Veraenderung: *)
(* *)
(* 08.10.15, MRi: Erstellen der 1. Version *)
(* 11.10.15, MRi: MIN0,MAX0 hinzugefuegt. *)
(* 05.05.16, MRi: Umbenennen von IntrinsicF77 nach F77func, REAL8, *)
(* INTEGER4 eingefuehrt. *)
(* 28.08.16, MRi: D1Mach hinzugefuegt *)
(* 08.07.18, MRi: IAND, IOR & IEOR hinzugefuegt *)
(*------------------------------------------------------------------------*)
(* Offene Punkte: *)
(* *)
(* - Erweiterung um andere Funktionen *)
(*------------------------------------------------------------------------*)
(* Implementation : Michael Riedl *)
(* Licence : GNU Lesser General Public License (LGPL) *)
(*------------------------------------------------------------------------*)
(* $Id: F77func.mod,v 1.3 2017/07/24 08:47:58 mriedl Exp mriedl $ *)
FROM SYSTEM IMPORT CAST;
FROM Errors IMPORT ErrOut;
IMPORT LowLong;
FROM LMathLib IMPORT MachEps;
FROM LongMath IMPORT ln,power;
PROCEDURE DSIGN(a,b : REAL8) : REAL8;
BEGIN
(* RETURN LowLong.sign(b)*ABS(a); *)
IF (b >= 0.0) THEN
RETURN ABS(a);
ELSE
RETURN - ABS(a);
END;
END DSIGN;
PROCEDURE DMAX(x,y : REAL8) : REAL8;
BEGIN
IF (x > y) THEN RETURN x ELSE RETURN y; END;
END DMAX;
PROCEDURE DMIN(x,y : REAL8) : REAL8;
BEGIN
IF (x > y) THEN RETURN y; ELSE RETURN x; END;
END DMIN;
PROCEDURE MIN0(ix,iy : INTEGER4) : INTEGER4;
BEGIN
IF (ix > iy) THEN RETURN iy ELSE RETURN ix; END;
END MIN0;
PROCEDURE MAX0(ix,iy : INTEGER4) : INTEGER4;
BEGIN
IF (ix < iy) THEN RETURN iy ELSE RETURN ix; END;
END MAX0;
PROCEDURE DINT(x : REAL8) : REAL8;
BEGIN
RETURN LowLong.intpart(x);
END DINT;
PROCEDURE IAND(a,b : INTEGER) : INTEGER;
BEGIN
RETURN VAL(INTEGER,(CAST(BITSET,a) * CAST(BITSET,b)));
END IAND;
PROCEDURE IOR(a,b : INTEGER) : INTEGER;
BEGIN
RETURN VAL(INTEGER,(CAST(BITSET,a) + CAST(BITSET,b)));
END IOR;
PROCEDURE IEOR(a,b : INTEGER) : INTEGER;
BEGIN
RETURN VAL(INTEGER,(CAST(BITSET,a) / CAST(BITSET,b)));
END IEOR;
PROCEDURE D1Mach(i : INTEGER): LONGREAL;
VAR D1Mach : LONGREAL;
b : LONGREAL;
ExpDigits : INTEGER;
BEGIN
b:=VAL(LONGREAL,LowLong.radix);
ExpDigits:=VAL(CARDINAL,ln(VAL(LONGREAL,LowLong.expoMax+1)) / ln(2.0));
(* TIO.WrStr("ExpDigits = "); TIO.WrCard(ExpDigits,3); TIO.WrLn; *)
IF (i = 1) THEN (* the smallest positive magnitude. *)
D1Mach:=power(b,VAL(LONGREAL,LowLong.expoMin));
ELSIF (i = 2) THEN
D1Mach:=MAX(LONGREAL); (* the largest magnitude. *)
ELSIF (i = 3) THEN (* the smallest relative spacing. *)
D1Mach:=power(b,VAL(LONGREAL, -(LowLong.places - ExpDigits - 1)));
ELSIF (i = 4) THEN (* the largest relative spacing. *)
D1Mach:=power(b,VAL(LONGREAL,(1-(LowLong.places - ExpDigits - 1))));
ELSIF (i = 5) THEN
D1Mach:=MachEps;
ELSIF (i = 6) THEN
D1Mach:=LowLong.succ(1.0) - 1.0;
ELSE
ErrOut("Falsches Argument von D1Mach.");
HALT;
END;
RETURN D1Mach;
END D1Mach;
END F77func.