File: fudgit.tex

package info (click to toggle)
fudgit 2.42-6
  • links: PTS
  • area: non-free
  • in suites: potato, woody
  • size: 2,468 kB
  • ctags: 2,375
  • sloc: ansic: 27,729; makefile: 793; yacc: 724; lex: 102; asm: 29; fortran: 15
file content (1354 lines) | stat: -rw-r--r-- 56,954 bytes parent folder | download
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}