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 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% This is the user's guide to FUDGIT 2.42
% Martin-D. Lacasse <isaac@physics.mcgill.ca>
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% European users should probably include a4 before compiling
% The twoside option makes it appropriate for double side printing
% If you remove it, you should adjust the right and left margin
% accordingly.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\documentstyle[twoside,toc_entry]{report}
\adjustreport
\setlength{\oddsidemargin}{0.25in}
\setlength{\evensidemargin}{-0.25in}
\setlength{\topmargin}{-0.50in}
\setlength{\textwidth}{6.5in}
\setlength{\textheight}{8.75in}
\setlength{\headsep}{0.50in}
%\setlength{\parskip}{2pt}
\def\bq{\nopagebreak\begin{quote}\tt \setlength{\partopsep}{0pt} \setlength{\topsep}{0pt}}
\def\eq{\end{quote}}
\def\fudgit{{\sc fudgit}}
\def\readline{{\sc readline}}
\def\gnuplot{{\sc gnuplot}}
\def\sgiplot{{\sc sgiplot}}
\def\emacs{{\sc emacs}}
\def\unix{{\sc unix}}
\def\hoc{{\sc hoc}}
\def\optio{$_{\mbox{\it \footnotesize optional}}$}
\def\Seealso{{\bf See also:}}
\def\Examples{{\bf Examples:}}
\def\Example{{\bf Example:}}
\def\Syntax{{\bf Syntax:}}
\def\dash{--}
\pagestyle{empty}
\begin{document}
\vspace*{0.8in}
\begin{center}
{\Huge\bf FUDGIT}
\end{center}
%\vspace{0.1in}
\begin{center}
{\large A Multi-Purpose\smallskip\\
Data-Processing\smallskip\\
and\smallskip\\
Fitting Program}
\end{center}
\vspace{1.0in}
\begin{center}
{\Large User's Manual\\}
%{\large \it (PRELIMINARY COPY)}
\end{center}
\vspace{1.8in}
\begin{center}
Version 2.42\\
August 1994\\
\end{center}
\vspace{0.2in}
\begin{center}
Martin-Daniel Lacasse\\
Center for the Physics of Materials\\
and\\
Department of Physics\\
McGill University \\
Montr\'eal, Qu\'ebec, Canada\\
$<$isaac@physics.mcgill.ca$>$
\end{center}
\vspace{0.2in}
\begin{center}
{\normalsize \copyright\ Martin-Daniel Lacasse, 1994}
\end{center}
\cleardoublepage
\pagestyle{headings}
\pagenumbering{roman}
\renewcommand{\baselinestretch}{1}\small\normalsize
\tableofcontents
%\renewcommand{\baselinestretch}{1.5}\small\normalsize
\cleardoublepage
\chapter{Introduction}
\pagenumbering{arabic}
\section{What is \fudgit\ ?}
No more {\em fudging\/}!
Despite its name,
\fudgit\ is a double-precision multi-purpose fitting program.
It can manipulate complete columns of numbers using
vector arithmetic. \fudgit\ is also an expression language
interpreter understanding most of C grammar.
It supports most functions from the C math library.
Finally, \fudgit\ is a front end for any plotting program
supporting commands from stdin. It is a nice mathematical complement
to \gnuplot, for example.
The main features of \fudgit\ are:\\
$\bullet$ Command shell including history;\\
$\bullet$ Possible abbreviation of all the {\em fitting mode} commands;\\
$\bullet$ Possible plural when it makes sense too;\\
$\bullet$ User-definable macros;\\
$\bullet$ Aliases;\\
$\bullet$ Shell flow control statements such as if, else, while, foreach;\\
$\bullet$ On-line help;\\
$\bullet$ On-line selectable plotting program;\\
$\bullet$ Fourier transforms;\\
$\bullet$ Cubic spline interpolation;\\
$\bullet$ Double-precision built-in calculator;\\
$\bullet$ Built-in interpreter supporting most of C language including flow
control (if, else, while, for, break, continue);\\
$\bullet$ User-definable functions and procedures;\\
$\bullet$ User-defined objects dynamically linkable as
functions or procedures;\\
$\bullet$ Double-precision vector arithmetic;\\
$\bullet$ Access to the complete C math library;\\
$\bullet$ Built-in fitting series such as:\\
+ power series (polynomial);\\
+ sine series;\\
+ cosine series;\\
+ Legendre polynomials;\\
+ series of Gaussians;\\
+ series of Lorentzians;\\
+ series of exponentials;\\
$\bullet$ User-definable fitting functions;\\
$\bullet$ Totally dynamical allocation of variables and parameters;\\
$\bullet$ Possible selection of fitting ranges.
\fudgit\ has a collection of fitting routines including:\\
$\bullet$ straight line (linear) least squares;\\
$\bullet$ straight line (linear) least absolute deviation;\\
$\bullet$ general linear least squares using QR decomposition;\\
$\bullet$ general linear least squares using singular value decomposition;\\
$\bullet$ nonlinear Marquardt-Levenberg method.
\section{Future}
\fudgit\ can be easily enlarged to include other built-in
univariable manipulations such as fancy integration,
derivative, statistics, etc. However, dynamical linking allows
the user a lot of flexibility. Dynamical linking should be
ported to other vendors.
If anyone is interested in going in this direction then be my guest,
or send me the routines you want to see included! The interpreter
is built so that the inclusion of extra modules is fairly
straightforward.
On the other hand, the dynamical loader should allow
\fudgit\ to become a nice interface
between the user, the data files, and mathematical routines.
An implementation of matrix arithmetic would however be required.
This might happen one day, if time permits\ldots Users would then
only have to build (by constructing and/or gathering routines)
a tool box that would be totally configurable and reusable.
\fudgit\ would then be stripped from spline/fitting/fft/etc. routines
which would come in a separate tool box. Anyone interested?
\section{Supported Architectures}
As it stands now, \fudgit\ can be compiled on AIX, DATA GENERAL,
HPUX, linux, IRIX, NeXT, OSF, SUNOS, and ULTRIX. Ports can be
easily made to other vendors. As it stands, the dynamic loading
feature only compiles on IRIX, ULTRIX (vax only), and SUNOS. Ports
of dynamic loading to HPUX and AIX are not foreseen in a near
future unless someone indicates me how to implement dynamic loading
on these operating systems. If you know something about this let me
know. Dynamic loading should be part of new operating systems in a
near future: stay tuned.
\section{Bugs}
There are probably too many to enumerate. However, the program was
fairly stable on a lot of testing and routine applications.
Be careful with possible circular aliases; busting a vector
by unlocking {\tt data}. Also, some malloc() libraries are
not always happy when they work a lot.
As with most interpreters (e.g. csh), {\tt if, else, endif}
statements can be difficult to debug and are not much flexible.
However, \fudgit's flow control error messages are more indicative
than the one from {\it csh} and {\it sh}.
The program has been written with robustness in mind and not
optimization. Some parts of the code could therefore be improved
for speed, but a deliberate choice has been made on robustness.
(As an example, the default behavior is to have
all divisions checked for a null quotient.)
Character by character terminal mode (cbreak) is not available
through the plotting program pipe. A (less portable) pseudo
terminal could be used for the plotting program.
The stack and machine could probably be allocated dynamically.
However, recursive loops would make the program to be killed
by init for envading the swap space.
Redefined functions do not free the part they were previously
occupying on the machine space, but this memory leak is not
significant over a normal session.
\section{Credits}
\input{credits.tex}
\chapter{Tutorial}
The following sections will deal with several applications of \fudgit.
The main strength of \fudgit\ re\-sides in its capacity of fitting
and splitting multiple files. This kind of applications cannot be
done by a mouse driven program since
commands can rarely be automated in such programs.
\fudgit\ allows the user to build scripts which can automate
a process that performs the available functions or user-defined functions
or macros over several data files. The syntax is very close to C-shell and
most of C-shell users will only have to intuitively apply their knowledge
to the current fitting mode shell. Parallel to this shell
is a built-in calculator which in
fact is a basic C interpreter supporting most of the C math library,
plus some additional features.
The particularity of \fudgit\ comes from the fact
that global variables are common to both the C-calculator
and the command shell.
Once again, a minimum knowledge
of C will suffice to write short programs using the C-calculator.
To make a rough picture, one can say that \fudgit\ uses C-shell
syntax to deal with files, C syntax to deal with vectors, numbers
and strings, and the language of your favorite plotting program for
plotting.
\section{Prerequisite Knowledge}
To read this manual, the reader should have a minimal
knowledge of C programming. Specifically, the user should
understand the basics of {\tt if}, {\tt else}, {\tt while} and
{\tt for} constructions. A basic knowledge of C operators
would also be preferable.
A familiarity with \unix\ {\it csh} command would
be helpful, particularly if you know the C-shell
{\tt if}, {\tt while} and {\tt foreach} constructions,
as well as aliases, and string variable substitutions.
Users already familiar with (and perhaps addicted to)
{\it tcsh}- or {\it bash}-\emacs- style line editing will
feel at home.
However, the novice reader should only refer to a C book
to understand operators specific to C. All the rest of
what should be known is fully covered by this manual.
It is also understood that you already know the plotting program
you are going to link to \fudgit.
\section{The Different Modes}
\fudgit\ is composed of three different modes. These modes can
be thought of as (1) a C-shell like interpreter linked with
(2) a C-calculator,
sharing the same variables in memory, and with (3) a plotting program
of your choice.
Most of the time, commands of different modes will
be interlaced as they are given on the command line.
However, the present manual starts
by giving a separate description
of the different modes.
In the reference manual, we assume that the different
modes are well understood so that
the commands are described without distinction,
as they would be used, and independently of their
originating mode.
\subsection{The Fitting Mode}
The C-shell like interpreter is called the {\em fitting
mode}.
It is the central mode and is the one from which all accesses
to disk are done. This mode has a range of commands allowing
the user to read vectors from or save vectors to a data file, to read a
command script, save the command history, do the Fourier
transform of a vector, make a linear or nonlinear least square
fit, etc\ldots This mode also allows the user to define macros
and aliases and to perform basic flow control over the statements.
All the commands in the fitting mode can
be abbreviated. It is worth mentioning that in the fitting mode,
the command line parsing is done by analyzing words separated by
blanks (spaces or tabs), as in an interactive csh.
\subsection{The C-calculator Mode}
The {\em C mode} or {\em C-calculator mode} is a
language interpreter supporting most of C grammar except
pointers. It also supports most of the double-precision C math library.
Thus, recognized keywords cannot
be abbreviated, and the different tokens need not be
separated. Most of the C operators and keywords are understood
and a few extra operators have been added. This mode does
essentially all the possible calculations on scalar variables and vectors.
Recursive functions and procedures can be defined as well.
Since all numeric variables are double precision numbers,
C {\tt switch} constructions were not implemented.
\subsection{The Plotting Mode}
The {\em plotting mode} is a channel talking directly to the
plotting program of your choice. Therefore, \fudgit\ can serve
as a front end to any plotting program able to accept input
from stdin. This way, vectors
can be built from the C-calculator and then plotted by your
favorite plotting program (e.g. super mongo, irisplot, \sgiplot,
plot, \gnuplot, etc\ldots). The default plotting program is
\gnuplot.
\section{Changing from one Mode to Another}
The fitting mode is the central mode from which the two other
modes are accessed. Thus, one cannot change from the C-calculator
mode to the plotting mode without going through the fitting mode.
The mode changing commands are mnemonically called {\tt cmode} for
changing to the C-calculator mode, {\tt pmode} for going to the
plotting mode and {\tt fmode} to go back to the fitting mode
from any of the two previous modes.
In interactive use, typing \^{ }D is equivalent to {\tt fmode}
and the program will return to the fitting mode.
Each mode has a different type of parsing. The fitting mode
analyzes the input line by breaking it in blank separated words,
as the standard
C shell. Commands can thus be abbreviated in this mode.
On the other hand, the C-calculator
mode parses the input line by breaking it
into tokens and keywords of different types as
does a C or FORTRAN compiler. Nothing can be
abbreviated, but the different tokens need not be
separated by white spaces. Finally, the plotting mode
does no parsing at all, since the plotting program is
responsible for analyzing the input line.
The commands {\tt cmode} and {\tt pmode} can be followed
by a list of commands on the same line, in which case the
rest of the line will be parsed according to the mode the
command refers to, and then processed in the mode
specified. To make life easier, the {\tt let} command
is equivalent to {\tt cmode} and anything following it
will be passed to the C-calculator mode parser and then
processed.
\section{Vectors, Parameters, Variables, Strings, and Constants}
This section
describes the different types of variables supported by \fudgit.
They are {\bf vectors, variables, constants, string variables}
and {\bf string constants}. To this list, we should
add the last class of objects consisting of only one member:
{\bf parameters}. Vector and parameter names consist
of upper case letters uniquely.
Variable and constant names consist
of lower case letters uniquely.
String variable and string constant names
consist of a mixture of upper case and lower case letters. Any number
of digits or underscores can be part of a name: the remaining
characters will then decide on the class of object the name describes.
Vectors, parameters, variables and constants are all double precision
numbers.
\subsection{Scope of Variables}
All variables are allocated as they are introduced
on the C-calculator mode command line. All such variables have a global
scope so that they can be accessed from anywhere outside
or inside functions or procedures. Automatic variables can
be defined with the {\tt auto} keyword. The scope of such
variables is delimited by braces as in standard C. The {\tt auto}
definition has to be immediately after an opened brace. When
defined inside functions or procedures, automatic variables
cannot have a name already used by an argument or the function
or procedure. Automatic variables are located on the
stack and are freed when the brace matching the end of
the scope is encountered.
\subsection{Vectors}
\fudgit\ supports full vector arithmetic.
This means that once a vector has
been read, it can be modified using any of the supported math functions.
A vector can also be created by a simple assignment or a
{\tt while} or {\tt for} loop over its elements. Any vector
part of an assignment will be created and allocated if it
does not already exist. The allocation size is specified by the
{\tt set samples} command. The default size is 4000.
A constant called {\tt data} will be set to the number
of elements that have been read. Obviously,
{\tt data} will always be smaller than the sample size.
Operations relating vectors are possible.
In this case, a loop over the vector elements will
be done from the first element to the {\tt data}$^{th}$
element. The value of this constant is therefore
crucial to all vector operations. We should go over an example.
Suppose that vectors $X, Y, Z$ and {\it ENERGY}
have been read from a file using
a {\tt read} statement (described below).
Now consider the following assignments:
\bq let X=ln(X)\\
let Y=sin(X+Z)\\
let TIME=ENERGY\^{ }2\\
let CONST=3\\
let GAME=rand()\\
let K/=GAME\eq
which all are examples of a single equation relating {\tt data} equations,
since each vector element will be assigned individually. Although
all the elements of vector {\tt CONST} will be equal to 3, the elements
of vector {\tt GAME} will be random numbers independently generated
by the function {\tt rand()}.
Vector elements can also be referenced individually using the usual
C syntax. Thus, $A[2]$ refers to the second element of vector $A$.
Vector operation can thus be done using {\tt for} loops
or {\tt while} loop constructions.
Note that unlike C, the first element of any vector is 1.
Be careful with assignments involving a vector element and the same
whole vector as in:
\bq let VEC *= VEC[3] \eq
which would multiply the vector {\tt VEC} by its third element.
However, the value {\tt VEC[3]} will not be constant over the
implied loop and the result will not be the one expected.
Therefore, such assignments should be written using temporary
variables as in:
\bq let tmp = VEC[3]\\
let VEC *= tmp\eq
so that variable {\tt tmp} carries the value that {\tt VEC[3]}
had before the assignment through the whole loop.
Vectors can be saved, appended to a file, with the {\tt append vectors}
and {\tt save vectors} command. They can be displayed at any time
using the {\tt show vectors} command.
\subsection{Parameters}
The short vector containing the fitting parameters is isolated
in a class by itself. Parameters can be assigned globally or
element by element. Clearly, parameters cannot be mixed with vectors
but elements of it can. Therefore, statements like
\bq
set parameters FITPAR 2\\
let FITPAR = 3\\
let VECTOR = 3\\
let FITPAR[2] = 3*sin(pi) * VECTOR[4] \eq
all are examples of the possible declaration and usage of parameters.
As with vectors, parameters can be displayed, saved, appended using
the same range of commands {\tt append}, {\tt save}, {\tt show parameters}.
\subsection{Scalar Variables}
Scalar variables have lower case names and are allocated as they
are introduced on the command line. For example,
\bq let x++\\
let y=Y[4]\\
let z=x*y \eq
are all legal commands. Note that the first example increments
variable $x$ only if it already exists. In terms of assignment,
a vector or parameter
element is considered as a variable. Variables can also
be mixed with vectors such as in
\bq let X=3\^{ }x\\
let Y=x+Z\\
let N=n++\\
let Z=cos(X/a + Z[x]) \eq
but statements as
\bq let x=X+Z\eq
are clearly not legal.
Variables can be saved, appended to a file, with the {\tt append variables}
and {\tt save variables} commands. They can be displayed at any time
with the {\tt show variables} command.
\subsection{String Variables}
String variables can also be created as needed. Any name consisting
of both lower case and upper case letters will be considered as a string
variable. Statements like
\bq
let String = "Hello"\\
let Other\_String = String\\
let String1 = "Good"\\
let String2 = " Bye!"\\
let String3 = String1 + String2\\
let String4 = String1 - "od"\\
let Input = Read()\\
let y = scan(Read(), "\%lf")\\
let x = (Other\_string == String)\\
let y = (Other\_string != "What is going on? \verb+\n+")
\eq
are thus permitted. The only operations permitted on string
variables are the equality operators, the addition operator, the
subtraction operator, and to be arguments of string functions
such as {\tt scan} function. In the previous example, $x$ and $y$
will both be set to 1. Note that the {\tt Read} function returns a
string.
\subsection{Constants and String Constants}
A constant is a variable that is locked to its value. It can be used
at the same place a variable can be except that changing its value
will result in a parsing error.
\fudgit\ contains 4 built-in
scalar constants: {\tt pi} = $\pi$, {\tt e} = Neperian number $e$, and
{\tt chi2} which contains the value of $\chi^2$ as obtained from
the last fit. Finally, {\tt data} contains the effective size
of all vectors.
There are also 3 built-in
string constants: {\tt ReadFile} holding the name of the last
file read by the {\tt read} command, {\tt Tmp}
holding a temporary filename consisting of
{\it /tmp/fudgitPID}, where {\it PID} holds for
a unique number describing the current process,
and finally {\tt Cwd} containing the name of the
current working directory.
Constants and variables (either scalars or strings) can
be transformed in one another using {\tt lock} and {\tt unlock}
commands so that the user can build his own constants at any time.
The linked list of all vectors, parameters,
variables, constants, functions and procedures can be
displayed by the {\tt show table} command.
\section{C-calculator Mode Essentials}
The C-calculator mode is the mode dealing with the mathematical
transformations of the variables. It has access to the C functions
of the mathematical library such as $\sin(x), \cos(x), \tan(x),
\ln(x), \log(x), \exp(x)$ and more fancy functions such as random
number generators, Bessel functions of the first and second kind,
error function, Gamma function and so on\ldots
All operators of C are supported with the exception of pointer and
bitwise operators.
An extra \^{ } exponentiation operator has been implemented.
\subsection{Computational Errors}
All mathematical functions, exponentiation operator and
divisions are checked for error. Computational errors involve
infinity values, not a number, out of range, and out of domain.
The user can select what kind of checks she or he wants to have.
The first two are values whereas the last two are error numbers
set by the various mathematical functions.
This is done using the {\tt set error} command. The user has
the choice among the following checks:
\begin{description}
\item[Infinity] A value of that kind results from
a division by zero or if the value resulting from
a mathematical function cannot be represented by the computer.
The number representation limit
is 1.0e+308 for most 64 bits double machines. To give an idea,
the exponential $e^{710}$ cannot be represented. Note
that the infinity value is signed on some machines, e.g,
$\log(0) = -\infty$.
\item[Not a Number] This value is returned by a function called
with an argument out of the domain, such as a negative
number to a log() of a number smaller that 1 for acosh().
This value is also returned when trying to divide 0 by
itself, or the Infinity by itself.
\item[Out of Range] This is a flag (error number) that is
raised by the mathematical functions returning a value
that cannot be represented by a double C type (double precision
FORTRAN).
\item[Out of Domain] This flag is raised whenever the argument
is unacceptable for a given mathematical function. Typical examples
are $x<0$ for $\log(x), \ln(x), x^{r}$ for any $r$,
$x \not\in [-1,1]$ for acos$(x)$, asin$(x)$, etc.
\end{description}
By setting the error to some of these, the user keeps
control over the whole calculation. If a computational
error occurs in a loop, the element number will be indicated
along with the error message. The default is to have all
error checks active.
\subsection{Flow Control}
The C-calculator mode supports the {\tt if-else}, {\tt while},
and {\tt for} constructions. The syntax is very similar
to the one in C. They can be embedded one in another,
with no other limit that the compiled code does not blow \fudgit's
internal machine capacity.
The basic C-calculator mode {\tt if} syntax is
\bq
if ({\it conditions}) \{\\
{\it cmode-statements}\\
\} else if ({\it conditions}) \{\\
{\it cmode-statements}\\
\} else \{\\
{\it cmode-statements}\\
\}
\eq
or, for single line statements, or semicolon separated list
of statements typed on the same line, the following syntax
\bq
if ({\it conditions})\\
{\it cmode-line-statement}\\
else\\
{\it cmode-line-statement}
\eq
is perfectly legal. The same C type of construction is valid for
both {\tt for} and {\tt while}. Note that semicolons are separators and
not terminators as they are in C. Therefore, empty statements
are defined by empty braces {\tt \{ \}}.
\subsection{Functions and Procedures}
\fudgit's C-calculator supports recursive functions and
procedures.
Therefore, more complex functions can be defined using the
mathematical functions provided by the C library. I refer the
reader to the {\tt func} and {\tt proc} items of the reference
manual where some examples are given.
These commands are only accessible in the C-calculator mode.
Programming in \fudgit's C-calculator mode is very close to
programming a simple mathematical application in standard C.
All variable types can be passed as arguments.
Scalar variables are passed by value whereas vectors and string
variables are passed by pointer.
\subsection{Printing from C-calculator Mode}
Variables and constants (either scalars or strings) can be displayed
by typing their name on the command line. A printing list is a coma
separated list of variables.
Thus
\bq
cmode\\
"values", x, y, X[3]
\eq
will display the values of string "values", x, y, and X[3], tab
separated and appended with a newline,
to the standard output. The {\tt print} command is a bit
different. It will print the given printing
list {\em without an appended newline} to a file selected
by the fitting mode {\tt set output} command. The value of
{\tt output} is {\it stdout} by default. It can be set to any
filename or to either of the strings {\tt stdout} and {\tt stderr}.
The following fragment of code will give an output similar
to the ones obtained above:
\bq
fmode\\
set output stdout\\
cmode\\
print "values", x, y, z, "\verb+\n+"\\
fmode
\eq
\subsection{Implicit Loops}
All vector or parameter assignments imply a loop over the vector or
parameter elements (the loop is from 1 to {\tt data}).
In such case, a vector name can be used in place
of an expression, and the relation will run over all elements,
from one to {\tt data},
the latter representing the effective size of vectors.
This is also valid for user-defined functions (see {\tt func}).
\section{Plotting Mode Essentials}
The {\em plotting mode} has no real command as such. It is
a pipe connected to the stdin of a plotting program of your choice.
Note that all \${\it var-name} construction are still
recognized and expanded as you talk to the plotting program.
Moreover, all the interactive features of \fudgit, such as
filename completion and command line history are still
active. Even if you don't need all the features of \fudgit,
it can still be used as a front end to your plotting
program, especially if you get addicted to interactive
command shells having filename completion and variable
substitution mechanism.
\section{Fitting Mode Essentials}
We shall now describe the central mode of \fudgit: the {\it fitting
mode}.
The fitting mode allows
the user to define {\tt macros}, to {\tt alias} commands,
and to have flow control statements as
{\tt while}, {\tt foreach} loops and {\tt if, else} similar to those
in C-shell. These features allow the user to deal with several files
and collect information from fitting successive files and putting
the results in a unique output file.
This feature is essential when one has to do a fit on the results
obtained from several other fits. This is what \fudgit\ was written for.
All the fitting routines, FFT routines, and I/O accesses are done
from the fitting mode.
This section gives a brief description of the range
of commands and operations accessible to the fitting mode.
\subsection{Environment Variables}
The fitting mode is sensitive
to the following environment variables:
\begin{description}
\item[PAGER] This variable refers to the pager to use when displaying
vectors of size larger than 24 of while interactively
displaying long output.
\item[SHELL] The value of this environment variable is used whenever
the user opens a shell from fudgit.
\item[HOME] Your home variable is used to translate the
`\verb+~+' symbol and when {\tt cd} command is called without argument.
\end{description}
\fudgit\ also loads a file called {\it $\sim$/.fudgitrc} every
time it starts. This is useful to configure the program according
to your needs.
\subsection{Script Files}
The {\tt load} command is one of the most handy command. All the
commands are generally put in a file with the editor and
then loaded in \fudgit\ using the {\tt load} command. Thus,
complicated commands can be recalled and modified at will.
In order to avoid confusion between your data files and the
script files you write, we recommand that you use
the {\it .ft} extension for your script files.
% Not implemented
% Therefore, if a
% filename not ending by {\it .ft} is
% given to the {\tt load} command, then \fudgit\ will first search
% for {\it filename.ft} and then for {\it filename} if the former
% is not found.
\subsection{Signals}
\fudgit\ responds to signals in a context sensitive way. This
discussion will be restricted to signals sent from the keyboard
in interactive mode since \fudgit\ will behave normally when in
non-interactive mode, i.e., when
it has been called with some input file names on the
shell command line input.
An {\it Interrupt} signal will be sent by the key combination
{\tt Control} and {\tt C} what we will denote {\tt \^{ }C}.
An {\it Interrupt} will abort any calculation or loop while
in the fitting mode or the C-calculator mode. When in the
plotting mode, the {\it Interrupt} signal will be sent to the
plotting program and ignored by \fudgit. The behavior
of the plotting program will depend from one program
to another. In \gnuplot, the current action is interrupted
and the program waits for new input.
The key combination \verb+^Z+ will suspend the program in
its current state. Even if this is done in the middle
of an input line, \fudgit\ will remember where you were
and redisplay the line when the program will
be called back in foreground.
This is done (only available in {\it csh} job control)
by typing {\tt fg} at your {\it csh} command line input.
In any mode, a {\it Quit} signal will force \fudgit\ to
exit gracefully. This signal is generated by the key
combination \verb+^\+. This way of exiting is left
for situations where nothing else works.
\subsection{Input/Output}
The Input/Output is done exclusively from the fitting mode. The
commands {\tt read} and {\tt exec} read respectively
from a file and a program
and assign a given column to a vector. For example, the command
\bq read file3 X:1 Y:3 \eq
will assign the first column of file {\tt file3} to a vector
named $X$ and the third column to a vector named $Y$. As we
have seen before, the size
of vectors is stored in a constant named {\tt data}.
The only requirement
on the data file is to have a constant number of columns
separated by any number of blanks (space or tab).
By default, anything following a `\#' will be ignored.
Each call to {\tt read} or {\tt exec} will set the constant {\tt data} to
the number of elements read in the specified vectors. The usage
of {\tt exec} is quite similar to {\tt read}. For example,
the following line will run program {\tt shortrun 32} which generates
output to stdout in different columns:
\bq exec "shortrun 32" TIME:1 ENERGY:2 \eq
The first column is read in vector {\tt TIME} and the second in
a vector named {\tt ENERGY}. Note that quotes are
necessary to link {\tt shortrun 32} as one argument.
A range of input can be specified
using a range specifier after the column number. A range
specifier is built with the syntax
{\tt [\it lower-bound\tt:\it upper-bound\tt]}.
Any bound can be replaced by the `*'
wild card which means no bound. A range specifier can be
put on any column while reading. Thus,
\bq read fort.8 A:2[0:*] B:1[*:10] \eq
will read all line elements from file {\tt fort.8} such that the
second column is $\geq 0$ and that the first column is $\leq 10$.
The resulting elements will be put in vectors $A$ and $B$ respectively
only if both conditions are satisfied.
Note from the previous example that the column ordering is not important.
As we have seen above, vector names must uniquely consist of capital
letters (`\_' is also legal) and digits
in order to be recognized as such.
A line range can also be specified using the syntax.
{\tt \{\it lower-bound\tt:\it upper-bound\tt\}}.
For example,
\bq read file2 VALUE\{100:243\}\eq
will read any valid line between line 100 and line 243 of
file {\it file2}. The line range can be given to any
variable, but the last range given will be the only one active.
Line range can be mixed with value range like in what follows:
\bq read fort.8 A:2[0:*] B:1[*:10]\{*:1024\} \eq
which will do the same thing as before except that reading is now
restricted to the first 1024 lines of the file. If no column is
assigned to the vector, its listing order will be taken as an
index. That is,
\bq read datafile X Y:4 Z\eq
will assign X to column 1, Y to the fourth, and Z to the third.
Vectors can be saved or appended to files with the {\tt save and
append} commands. The syntax is straightforward:
\bq save vectors X Y Z newfile\eq
or
\bq append vectors TIME ENERGY file.2\eq
will save or append the specified vectors to the files specified.
\subsection{Variable Expansion}
All the variables and constants (either scalars or strings) defined
in C-calculator mode are available
to the interactive fitting mode shell. The \$ operator will fully
expand a string variable or string constant, i.e,
by using the \${\it var-name} or \$\{{\it var-name}\}
syntax.
Quite similarly,
if the variable or constant is a scalar, then the value of the variable
will be expanded on the command line (as a string) according to a
pre-selected format. The default
format is ``\%.3g" which is reasonable for including in
filenames. This format can be changed using
the {\tt set format} command.
In the fitting mode, expansion will not take place if
the `\$' operator is following a `\verb+\+' or
if is located between single quotes.
Note that this variable expansion feature
is available in all modes. To avoid the variable expansion
in other modes, a `\verb+\+' has to protect the `\$'.
\subsection{Macros and Aliases}
The user can design his own environment by defining macros
and aliases. An alias is a command (first word of the line)
that gets expanded and is interpreted along with the
other words of the line. A macro is a user-defined procedure
that requires a certain number of arguments to be used in
a series of commands.
The number of argument is specified in order to avoid
run-time errors. Arguments are referred to using the
\${\it arg-number} syntax. Macros and aliases are only
definable in and recognized by the fitting mode.
Aliases follow the C-shell syntax. Defining macros is a bit different
and I refer the user to the reference manual found in the next chapter,
where some examples are given along with the details. Keep in
mind that macros and aliases are argument manipulation devices:
arguments are all processed as strings whatever they represent
(numbers, variable names, filename, etc.).
\subsection{Flow Control}
The fitting mode supports the three following flow control
constructions:
\bq
foreach \it Var-name \tt in \it Unix-commands\\
fmode-statements\\
\tt end\eq
\bq
if ({\it conditions}) then\\
\it fmode-statements\\
\tt else if ({\it conditions}) then\\
\it fmode-statements\\
\tt else\\
\it fmode-statements\\
\tt endif\eq
\bq
while ({\it conditions})\\
\it fmode-statements\\
\tt end\eq
Their grammar is identical to the one in C-shell apart from the
fact that {\tt foreach} only expands \unix\ commands, and that the
{\it conditions} of {\tt if} and {\tt while} are C-calculator
mode expressions. Thus the `\$' operator is not required and the
whole set of functions of the C mathematical library is
available to the user.
\subsection{Fourier Transforms}
One dimensional Fourier transforms can be done directly from the
fitting mode command line. Although fast Fourier
transforms require a number
of data points equal to a power of 2, the user
can still write scripts that will pad the vectors with zeros,
up to the nearest power of 2. Note that this process
involves an approximation in the resulting vectors. Fourier
transforms require the real and the imaginary part. Real Fourier
transforms can be done simply by supplying a null imaginary
part. The user can use the full power of the C-calculator mode
to implement her preferred windowing functions.
Full details of indexing can be found in the reference
manual under items {\tt fft} and {\tt invfft}.
\fudgit\ also includes a smoothing command based on a loop
of Fourier transforms using a cut-off frequency. For more detail,
read the description of {\tt smooth} command
in the reference manual.
\subsection{Cubic Spline Interpolation}
\fudgit\ allows the user to interpolate a value given a set of
relations $y_i = f(x_i)$. This can be useful to get an estimate
of the integral of a relation for which only a few points were
obtained. Interpolation consists in two steps: an initialization
process {\tt spline} called with the two vectors characterizing
the relation (e.g., {\tt spline X Y}), and one or
successive calls to C-calculator mode function {\tt interp(x)}
returning the interpolated value.
An example is presented to make it clearer.
\nopagebreak\begin{verbatim}
# Read functional relation
# Say file "relfile" contains 24 data points
# ranging from x=2 to x=12
read relfile X:1 Y:2
# Initialize spline routine
spline X Y
# Build a curve having 120 data points from this set
set data 120
# Build new X vector ranging [0, 1]
let x=0; X=x++; tmp=data-1; X/=tmp
# Map to X ranging [2, 12]
let X = 10*X + 2
# Build new Y vector including original set of 24 data points
let Y = interp(X)
\end{verbatim}
The previous example shows a {\it natural cubic spline} for which the
{\it second} derivative of the interpolating curve is
such that it vanishes at the first and the last data points
of the original set. The {\tt spline} command accepts
optional third and fourth arguments specifying the value of
the {\it first} derivative of the interpolating curve at,
respectively, the first and last data points of the original set.
See the reference manual for more details.
\subsection{Basic Statistics and Integration}
As it stands now, \fudgit\ does not support fancy statistics.
However, the user can write his own scripts, procedures and
functions to deal with basic statistics. The {\tt sum} built-in
math function provides a handy way of calculating the mean, and the
standard deviation (and variance).
Thus, given a vector $X$,
\nopagebreak\begin{verbatim}
let X2 = X*X # define a vector containing the square of X
let mean = sum(X)/data # get the average
let VAR = (X-mean)^2 # VAR contains the square of the difference
let var = sum(VAR)/(data-1) # the variance as such
let sigma = sqrt(var) # the standard deviation
\end{verbatim}
When used in conjunction with {\tt spline} and {\tt interp},
the {\tt sum} command can also be used to perform
basic numerical integration.
Given a data set $X$ representing sample points of
a smooth function, basic numerical integration can
be performed by applying a {\tt spline-interp} procedure
to build a denser vector $NEWX$.
The interpolation should be
made such that increasing {\tt data} would not
change the value of {\tt sum(NEWX)/data}.
Other basic integration techniques can also
be computed directly using the C-calculator
programming language.
See the reference manual for a more detailed
description of each of the commands mentioned above.
\subsection{Fitting Commands}
We are now ready to perform a fit. We shall go over some examples,
slowly introducing features of \fudgit.
In the following example, we shall fit $y=ax^b$ by using the
log-log representation and fitting a straight line by a least-square
method. Refer to the reference manual in the next chapter to
understand the commands as they as introduced.
\nopagebreak\begin{verbatim}
# We fit a straight line
set function straight
# using least square linear regression
set method ls_reg
# with 2 parameters called, say, B[1] and B[2]
set parameters B 2
# Read elements having positive X and Y values from file fort.32
read fort.32 X:1[0.00001:*] Y:2[0.00001:*] DY:4
# Take the ln()
let DY /= Y
let Y = ln(Y)
let X = ln(X)
# do the fit
fit X Y DY
# Save the result in file myfit
save parameters myfit
\end{verbatim}
All these commands could be typed interactively (without the comments)
or put into a file (with the comments)
and then {\tt load}ed. The file could also
be given as an argument to \fudgit\ by typing
\bq \% fudgit scriptfile.ft \eq
from your C-shell. Note that the extension {\it .ft} is not necessary
but is strongly recommanded.
In the following example, we shall fit two Gaussians using a nonlinear
Marquardt-Levenberg method. Nonlinear fitting is generally done
interactively since the parameter space is explored so as to minimize
the value of $\chi^2$. Some local minima can be reached in which
case the values of the parameters will not be representative.
Nonlinear fitting is an art!
\nopagebreak\begin{verbatim}
set function gauss # We fit two Gaussians
set method ml_fit # using Marquardt-Levenberg
set parameters VAL 6 # We need 6 parameters called, say, VAL
read out2 T:1 E:2 ERROR:3 # Read elements from file out2
# Nonlinear fits is an art!
adjust 1 2 3 4 5 6 # Adjust all 6 parameters
# Initialize some parameters,
# since 'set parameters' created vector VAL = 0 by default
let VAL[1] = 1
let VAL[2] = -10
let VAL[3] = 3
let VAL[4] = 8
let VAL[5] = -2
let VAL[6] = 0
fit X Y DY # do the fit
# You might need to use less variables in your fit
adjust 1 5
# Initialize again
let VAL[1] = 2
.
.
.
fit X Y DY
# Are you satisfied of CHI^2?
# show parameters to see curvature matrix and correlations
show parameters
# save parameters in a file along with respective errors
save parameters myfit
\end{verbatim}
Finally, we shall see an example involving a user-defined function.
This example shows how multiple fits can be appended in a file. It
also shows the use of macros.
\nopagebreak\begin{verbatim}
# Make a series of fits from different directories
# Each directory bears a name representing a temperature value
# Tell GNUPLOT to not put a key
pmode set nokey
# The 2-d Ising critical temperature is tc
let tc = -1.0/(0.5*ln(sqrt(2)-1))
# Define the central macro
# Call this macro fitscript and it takes one argument
macro fitscript 1
# Save the temperature value as a variable
let temp=$1
# Convert it since it was in units of tc
let tempc = temp*tc
# Compute the Onsager surface tension for this temperature
let s = 2 *(1+(tempc/2)*ln(tanh(1/tempc)))
# Read the data from this specific directory
read $1/landm.0 T:1[20:*] U:2
# Convert vector time
let SQT = 1/sqrt(T)
# Fit, the function and method are defined below.
# Don't worry: we are defining a macro first.
fit T U DU
# Save the transformed and fitted vectors in the same directory
# for subsequent plotting
save vec SQT U UFIT $1/landm.0.newfit
# Append the fitted parameters in file common to all fits
# as well as the temperature value in the first column
append var temp A[1] DA[1] A[2] DA[2] A[3] DA[3] newpar.0
# Go in plotting mode to talk to GNUPLOT directly.
pmode
plot '$1/landm.0.newfit' using 1:2,\
'$1/landm.0.newfit' using 1:3 with lines
fmode
# This is it!
stop
#
# The real work starts here
# We shall use a three parameter fit
set parameter A 3
# Marquardt-Levenberg
set method ml_fit
# Adjust them all
adjust 1 2 3
# Initialize
let A[1] = -2
let A[2] = 1
let A[3] = 2
# This is the function fitting vector U: Therefore, it must be called UFIT.
# One can use any temporary variable (e.g. TMP) to accelerate computation
# Note how to build names of parameter partial derivatives
set function user
UFIT = A[1] + s* (A[2]^2 + A[3]^2* T)^(-0.5)
DUFITD1 = 1 # derivative wrt A[1]
TMP = s*(A[2]^2 + A[3]^2*T)^(-1.5) # Temp var speeds up!!!
DUFITD2 = -A[2]*TMP # derivative wrt A[2]
DUFITD3 = -A[3]* T * TMP # derivative wrt A[3]
stop
# Do all directories and append to the parameter file
# 0.0001 0.10 0.20 0.30 0.40 0.50 0.60 0.70 0.80 0.90 0.95 0.97 1.00
foreach Dir in echo 0.0001 0.[1-9]? 1.00
echo Doing $Dir
fitscript $Dir
end
\end{verbatim}
Some more examples are given in a subsequent chapter. You should
now be able to write your own fitting scripts. I suggest that you
read the following items in the reference manual:
\bq
adjust, fit, set/show function, set/show iteration, set/show method,\\
set/show parameters, show fit, show/save parameters\eq
and other related topics as found in the description of these commands.
\section{Interactive Command Line Shell}
When used interactively, the shell keeps a complete history
of previous commands, independently of the mode.
The shell also supports command completion and filename completion.
In the fitting mode,
if the tab key is pressed while the cursor is in the first
argument, \fudgit\ will try to expand to a known command, alias
or macro. Therefore, pressing tab twice on an empty line
will list all the currently active commands, macros and aliases.
If the cursor is not located in the first argument of the line,
then \fudgit\ will try to expand the argument
to an existing filename or to an existing printable variable
if a \$ is found before the alphanumeric
string to expand. Filename
expansion supports the `\verb+~+' HOME designator.
While in C-calculator mode, the expansion reduces to all
what is found in the math lookup table, including
variables, constants, vectors, functions, procedures
and keywords.
In the plotting mode, expansion reduces to filename completion
or to printable variable completion if the alphanumeric
string to expand starts with a `\$'.
Lines can be continued on the next one
by using a `\verb+\+' at the end of the line as in {\it csh}.
Usually expanded characters can be put as is by {\it escaping}
them with a leading `\verb+\+'.
\section{Dynamic Loading}
Some operating systems%
\footnote{It will become a standard for the next generation of UNIX.}
allow to load an object (a {\it file.o})
at run-time.%
\footnote{While the program is running, and without recompiling it.}
To do so, a dynamic loading (dl or dld) library, as well
as some features of the loader {\tt ld(1)} on IRIX are required.
The present version of \fudgit\ supports dynamic loading on IRIX,
ULTRIX, SVR4 and SUNOS only.
However, \fudgit\ needs to be linked (at compilation time)
by the GNU {\tt ld(1)} link editor when built on SUNOS.
Thus, the user can load any module of his own and momentarily
{\tt install} it in the internals of \fudgit\ as a procedure
(not returning a value) or a function (returning a value).
Be sure external routines are of type {\it void} for procedures
and of type {\it double} for functions, although a cast is internally
done.
The {\tt install} command allows the user to choose a different
name for the internal installation, with the only restriction
that the name be composed of lowercase letters only (as {\tt proc}
and {\tt func} do). Once the external functions and/or procedures
are installed, they can be used like any internal function or procedure.
Arguments are all passed by pointers to the external routine. Thus,
the user have direct access to vectors, parameters, and strings passed
as arguments. The case of variables is different however. Even if
the value of an expression-variable is passed by pointer, the address
is pointing to a temporary location storing the value of the expression.
This is done so that calls like
\bq
let y = myfunc(X, sqrt(sin(x)), data)
\eq
be possible. A full example is presented in the section of
the reference manual describing the {\tt install} command.
Also read the file {\it fudgit.h} located in the {\it tools}
directory of this distribution. This file should be included
in your modules.
Note that although vector indices run from 1 to {\tt data} in
the C-calculator mode, they run from 0 to {\tt data-1} when
manipulating the same vectors from your own C modules and
from 1 to {\tt data} when in FORTRAN. The
pointers passed are always the address of the first element.
FORTRAN functions and procedures can be loaded provided
an underscore is appended to the function or procedure name.
This means that if you have a subroutine called {\it mysub} in a
compiled object called {\it fortran\_mod.o}, you
must called {\tt install} with
\bq
install fortran\_mod.o mysub\_:myname(X, n)
\eq
to install procedure {\tt myname()} which accepts one vector
and one expression as arguments. All functions and procedures
are strongly typed in \fudgit. This means that all arguments
are checked for number and type consistency. Note that the colon
(:) means to install {\tt mysub} as a procedure called {\tt myname}.
Using an equal sign (=) would have installed it as a function.
The user can install several functions and procedures from
the same object: they would only need to be listed at the end
of the preceding example line.
Future versions of \fudgit\ should provide support for
string arguments in FORTRAN modules.
The command {\tt reinstall} is equivalent to {\tt install}
but it is used when a module has already been loaded once
in the course of a \fudgit\ session. {\tt reinstall} will
first unload the module so that symbols do not get defined
twice in the program.
More details and a full example will be found under the {\tt install}
item of the next chapter.
\chapter{Reference Manual}
This chapter describes all the supported commands. As a convention,
any name printed in {\it italics} is a generic name. Any name printed
in {\tt typewriter} style is a command name that has to be typed as such.
Optional arguments are given a
subscript\optio\ at the end of the optional string.
All commands are assumed to be {\em fitting mode} commands except
when specified otherwise.
\input{reference.tex}
\chapter{More Examples}
Here follows a few more examples that can help writing your own scripts.
The following scripts also show how commands can be abbreviated.
\section{Example 1}
\nopagebreak\begin{verbatim}
# Example 1
# read a file and transform the first column to 1/sqrt(x) and plot
set plotting /usr/local/bin/gnuplot
pmode set term X11
macro plot 2
save vec $1 $2 $Tmp
pmode plot "$Tmp" with lines
stop
read landm.0 X:1 Y:2
# this line is ignored
# a line can be blanked too
let X = 1/sqrt(X)
plot X Y
# EOF
\end{verbatim}
\section{Example 2}
\nopagebreak\begin{verbatim}
# Example 2
# fit a straight line using singular value decomposition
set function poly
set parameters A 2
set method svd
read landm.0 X:1 Y:2
let X=1/sqrt(X)
let DY = 1
fit X Y DY
save vec X Y YFIT DY
\end{verbatim}
\section{Example 3}
\nopagebreak\begin{verbatim}
# Example 3
# fit a straight line using the nonlinear method (why not?)
set fun us
YFIT = A[1] + A[2]*X
DYFITD1 = 1
DYFITD2 = X
stop
set met ml
set par A 2
adjust 1 2
read landm.0 X:1 Y:2
let X=1/sqrt(X)
# We have to use a weight of 1 for chi^2 if unknown...
let DY=1
let A[1] = -2
let A[2] = 1
fit X Y DY
sav par myfile
set plo /usr/local/bin/sgiplot -p
sgip X YFIT
# EOF
\end{verbatim}
\section{Example 4}
\nopagebreak\begin{verbatim}
# Example 4
# Make the Fourier transform of a sine distribution.
# Shows how padding can be done.
# Windowing can be done by multiplying your vector by a chosen
# distribution weight factor.
# Uses GNUPLOT.
macro dofft 2
fft $1 $2 $1_FT $2_FT
let POW$1 = $1_FT^2 + $2_FT^2
stop
macro doinvfft 2
invfft $1 $2 $1_IFT $2_IFT
let POW$1 = $1_IFT^2 + $2_IFT^2
stop
pmode clear; set data style line
# Use 800 points padded to 1024
set data 1024
let n=0
let N=n++
# The null imaginary part
let IM=0
let x=0
let X=x++
let X*=(2*pi/data)
# Initialize A to zero on 1024 points
let A=0
# But only fill 800 with the function
set data 800
let A=cos(2*X) + sin(2*X) + cos(20*X) + sin(20*X)
set data 1024
# Plot the function
gnu N A
pause -1 The function: Hit return
# Fourier transform
dofft A IM
# Plot first half of transform since real
unlock data
let data/=2
gnu N POWA
pause -1 The Fourier transform: Hit return
let data*=2
lock data
# Do the inverse Fourier transform
doinvfft A_FT IM_FT
# Plot the real part which should be the original vector.
gnu N A_FT_IFT
echo The function transformed back
# EOF
\end{verbatim}
\section{Example 5}
\input{fudgitrc}
\appendix
\chapter*{GNU Readline and History Library}
The followings are the user's guides as extracted
from the manuals of GNU \readline\ 1.1
which can be found integrally in the readline directory, along with
the copyrights. They are reproduced here for the sake of
completeness of \fudgit\ user's guide.
\newpage
\input{hsuser}
\input{rluser}
\end{document}
|