/usr/share/axiom-20170501/src/algebra/ASP78.spad is in axiom-source 20170501-3.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 | )abbrev domain ASP78 Asp78
++ Author: Mike Dewar, Grant Keady and Godfrey Nolan
++ Date Created: Mar 1993
++ Date Last Updated: 6 October 1994
++ References:
++ Hawk95 Two more links to NAG numerics involving CA systems
++ Kead93 Production of Argument SubPrograms in the AXIOM -- NAG link
++ Description:
++ \spadtype{Asp78} produces Fortran for Type 78 ASPs, needed for NAG routine
++ d02gbf, for example:
++
++ \tab{5}SUBROUTINE FCNG(X,G)\br
++ \tab{5}DOUBLE PRECISION G(*),X\br
++ \tab{5}G(1)=0.0D0\br
++ \tab{5}G(2)=0.0D0\br
++ \tab{5}END
Asp78(name) : SIG == CODE where
name : Symbol
FST ==> FortranScalarType
FSTU ==> Union(fst:FST,void:"void")
FT ==> FortranType
FC ==> FortranCode
SYMTAB ==> SymbolTable
RSFC ==> Record(localSymbols:SymbolTable,code:List(FC))
FRAC ==> Fraction
POLY ==> Polynomial
EXPR ==> Expression
INT ==> Integer
FLOAT ==> Float
VEC ==> Vector
VF2 ==> VectorFunctions2
MFLOAT ==> MachineFloat
FEXPR ==> FortranExpression(['X],[],MFLOAT)
SIG ==> FortranVectorFunctionCategory with
coerce : VEC FEXPR -> $
++coerce(f) takes objects from the appropriate instantiation of
++\spadtype{FortranExpression} and turns them into an ASP.
CODE ==> add
real : FSTU := ["real"::FST]$FSTU
syms : SYMTAB := empty()$SYMTAB
declare!(X,fortranReal(),syms)$SYMTAB
gType : FT := construct(real,["*"::Symbol],false)$FT
declare!(G,gType,syms)$SYMTAB
Rep := FortranProgram(name,["void"]$FSTU,[X,G],syms)
fexpr2expr(u:FEXPR):EXPR MFLOAT == coerce(u)$FEXPR
coerce(u:VEC FEXPR):$ ==
u' : VEC EXPR MFLOAT := map(fexpr2expr,u)$VF2(FEXPR,EXPR MFLOAT)
(assign(G,u')$FC)::$
coerce(u:$):OutputForm == coerce(u)$Rep
outputAsFortran(u):Void ==
p := checkPrecision()$NAGLinkSupportPackage
outputAsFortran(u)$Rep
p => restorePrecision()$NAGLinkSupportPackage
coerce(c:List FC):$ == coerce(c)$Rep
coerce(r:RSFC):$ == coerce(r)$Rep
coerce(c:FC):$ == coerce(c)$Rep
retract(u:VEC FRAC POLY INT):$ ==
v : VEC FEXPR := map(retract,u)$VF2(FRAC POLY INT,FEXPR)
v::$
retractIfCan(u:VEC FRAC POLY INT):Union($,"failed") ==
v:Union(VEC FEXPR,"failed"):=map(retractIfCan,u)$VF2(FRAC POLY INT,FEXPR)
v case "failed" => "failed"
(v::VEC FEXPR)::$
retract(u:VEC FRAC POLY FLOAT):$ ==
v : VEC FEXPR := map(retract,u)$VF2(FRAC POLY FLOAT,FEXPR)
v::$
retractIfCan(u:VEC FRAC POLY FLOAT):Union($,"failed") ==
v:Union(VEC FEXPR,"failed"):=_
map(retractIfCan,u)$VF2(FRAC POLY FLOAT,FEXPR)
v case "failed" => "failed"
(v::VEC FEXPR)::$
retract(u:VEC EXPR INT):$ ==
v : VEC FEXPR := map(retract,u)$VF2(EXPR INT,FEXPR)
v::$
retractIfCan(u:VEC EXPR INT):Union($,"failed") ==
v:Union(VEC FEXPR,"failed"):=map(retractIfCan,u)$VF2(EXPR INT,FEXPR)
v case "failed" => "failed"
(v::VEC FEXPR)::$
retract(u:VEC EXPR FLOAT):$ ==
v : VEC FEXPR := map(retract,u)$VF2(EXPR FLOAT,FEXPR)
v::$
retractIfCan(u:VEC EXPR FLOAT):Union($,"failed") ==
v:Union(VEC FEXPR,"failed"):=map(retractIfCan,u)$VF2(EXPR FLOAT,FEXPR)
v case "failed" => "failed"
(v::VEC FEXPR)::$
retract(u:VEC POLY INT):$ ==
v : VEC FEXPR := map(retract,u)$VF2(POLY INT,FEXPR)
v::$
retractIfCan(u:VEC POLY INT):Union($,"failed") ==
v:Union(VEC FEXPR,"failed"):=map(retractIfCan,u)$VF2(POLY INT,FEXPR)
v case "failed" => "failed"
(v::VEC FEXPR)::$
retract(u:VEC POLY FLOAT):$ ==
v : VEC FEXPR := map(retract,u)$VF2(POLY FLOAT,FEXPR)
v::$
retractIfCan(u:VEC POLY FLOAT):Union($,"failed") ==
v:Union(VEC FEXPR,"failed"):=map(retractIfCan,u)$VF2(POLY FLOAT,FEXPR)
v case "failed" => "failed"
(v::VEC FEXPR)::$
|