aboutsummaryrefslogtreecommitdiff
path: root/Doc/KrancDoc.tex
blob: b782583b4952f45e9677dfbf353e76d12eef32ed (plain)
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
\documentclass{report}

\usepackage{tabularx}
\usepackage{graphicx}

\addtolength{\oddsidemargin}{-0.25in}
\addtolength{\textwidth}{1in}
\addtolength{\textheight}{1.5in}
\addtolength{\voffset}{-0.5in}
\linespread{1.3}
\setlength{\parindent}{0in}
\setlength{\parskip}{1.5ex plus 0.5ex minus 0.2ex}


\newcommand{\tablewidth}{\textwidth}
\newcommand{\mathdialogue}[2]
{
  \begin{center}
  \begin{tabular}[t]{rl}
  {\tt In := } & \parbox{10cm}{\tt {#1}} \\
\\
  {\tt Out = } & \parbox{10cm}{#2} \\
  \end{tabular}
  \end{center}
}
\newcommand{\mathinput}[1]
{
  \begin{tt}
  \begin{center}
    #1
  \end{center}
  \end{tt}
}
\newcommand{\Tud}[3]{  #1 ^#2 _{\phantom{#2} #3}}

\title{Kranc User Guide}
\author{Sascha Husa and Ian Hinder}


\begin{document}
\maketitle
\tableofcontents
\chapter{Introduction}

\section{Kranc}
Kranc is a suite of Mathematica-based computer-algebra packages, which
comprise a toolbox to convert certain (tensorial) systems of partial
differential evolution equations to parallelized C or Fortran code for
solving initial boundary value problems.  Kranc can be used as a rapid
prototyping system for physicists or mathematicians handling
complicated systems of partial differential equations, but through
integration into the Cactus computational toolkit it is also possible
to produce efficient parallelized production codes.  Our work is
motivated by the field of numerical relativity, where Kranc is used as
a research tool by the authors.  The initial version of Kranc was
described in \cite{KrancPaper}, and subsequent enhancements in
\cite{IHPhDThesis}.  The material in this document is drawn from these
two sources, and has been updated to be consistent with the current
version of Kranc.

\section{Cactus}

The {\em Cactus Computational Toolkit} is an open-source problem
solving environment originally developed in the numerical relativity
community.  It is arranged as a central {\em flesh} and a collection
of modules called {\em thorns} which all communicate with the
flesh. Many thorns are provided, and the user writes additional thorns
in C or Fortran which solve their particular physics problem.  Cactus
is particularly suited to the numerical solution of time dependent
partial differential equations.

Kranc is concerned with taking an abstract mathematical description of
a system of PDEs and producing working computer code.  It does this by
generating Cactus thorns, allowing use of all the infrastructure
provided by Cactus.

For example, Kranc makes uses of existing Cactus thorns which provide:
\begin{itemize}
\item Parameter file parsing.
\item Memory management for variables associated with the
computational grid.
\item Scheduling of parts of the code based upon parameters.
\item Standard efficient time integrators such as fourth order
Runge-Kutta and iterative Crank-Nicolson via the {\em MoL} thorn
written by I.~Hawke.
\item Mesh refinement \cite{Schnetter}; i.e.~using variable resolution
across the numerical grid, so that the computational resources are
focused on interesting parts of the simulation.
\item Automatic parallelization of the code to run across multiple
processors on a supercomputer or cluster, both to improve
computational speed and to use larger grids than can be stored in the
memory of a single node.
\item Output of grid variables to permanent storage in a structured
format.
\end{itemize}
These tasks are completely divorced from the physics and numerical
analysis side of the problem, but are necessary in most numerical
codes.  
\section{Overview of the Kranc system}

There are five types of Kranc thorn:
\begin{itemize}
\item A {\em base thorn} defines the grid functions which the
simulation will use.  
\item A {\em MoL thorn} computes the right hand sides of the evolution
equations so that the time integrator can compute the evolved
variables at the next time step.  This is the most important type of
thorn as it determines the system of partial differential equations
being solved.  The time integration methods in Cactus require that
those grid functions containing evolved variables must be registered
as such, and the MoL thorn performs this registration.
\item A {\em setter thorn} performs a user-specified calculation at
each point of the grid.  This will typically set certain grid
variables as functions of others, and can be used for various purposes
including making a change of variables or computing intermediate
quantities from evolved variables.
\item A {\em translator thorn} is a special case of a setter thorn
which converts between the evolved variables and some other set of
variables (for example, the ADMBase variables used by initial data and
analysis thorns in the context of numerical relativity)
\item An {\em evaluator thorn} computes quantities such as norms and
constraints that are used in the analysis of the constructed solution.
The calculations are invoked only when the quantities concerned are
output to permanent storage, which improves efficiency when output is
not required at each time step.
\end{itemize}
These five thorn types allow complete codes to be assembled.

Common to many of these thorn types is the idea of assigning new
values to grid functions in a loop over grid points based upon
evaluating expressions involving other grid functions. To encapsulate
this, we define a Kranc structure called a {\em
calculation}. Calculations contain lists of assignment statements for
different grid functions, and these are evaluated at each point on the
grid.  Calculations can also contain temporary variables called {\em
shorthands} into which are placed intermediate expressions which are
used later in the calculation.  Many of the thorn types are based
around calculation structures.


\chapter{Using Kranc}

The user only needs to be concerned with calling functions from the
KrancThorns package.  This package contains functions for creating the
different types of Kranc thorn.

The different types of Cactus thorn used in a Kranc arrangement are
the MoL, setter, base, translator and evaluator thorns. The
KrancThorns package provides functions to create thorns of these types
given high level descriptions.  These functions are the ones directly
called by users.

\section{Types of arguments}

Mathematica allows two types of arguments to be passed to a function.
{\em positional arguments} and {\em named arguments} (referred to in
the Mathematica book as {\em optional arguments}).  It is possible for
some named arguments to be omitted from a function call; in this case
a suitable default will be chosen.  Positional arguments are useful
when there are few arguments to a function, and their meaning is clear
in the calling context.  Named arguments are preferred when there are
many arguments, as the argument names are given explicitly in the
calling context.

For each type of Kranc thorn, there is a function to create it ({\tt
Create*Thorn}).  There is a certain set of named arguments (``Common
named arguments'') which can be passed to any of these functions
(e.g.~the name of the Thorn to create, where to create it, etc).
Then, for each type of thorn, there is a specific set of named
arguments specifically for that thorn type.  All of the functions
accept some positional arguments as well.
%

\section{Common data structures}

Kranc consists of several packages which need to pass data between
themselves in a structured way.  Mathematica does not have the concept
of a C++ class or a C structure, in which collections of named objects
are grouped together for ease of manipulation.  Instead, we have
defined a {\em Kranc structure} as a list of rules of the form {\tt
{\it key} -> {\it value}}.  We have chosen to use the Mathematica rule
symbol ``{\tt ->}'' for syntactic convenience.
%
For example, one might describe a person using a ``Person'' structure
as follows:
%
\begin{center}
\begin{minipage}{0.8 \textwidth}
\begin{verbatim}
alice = {Name -> "Alice",
         Age -> 20,
         Gender -> Female}
\end{verbatim}
\end{minipage}
\end{center}

Once a structure has been built up, it can be parsed with the {\tt
lookup} function in the MapLookup package.  {\tt lookup[structure,
key]} returns the value in {\tt structure} corresponding to {\tt key}.
For example, {\tt lookup[alice, Age]} would return the number 20.
This usage mirrors what is known as an association list (or alist) in
LISP style languages.
%
Based on this concept a number of data structures have been defined
which will be used to describe the thorns to construct.  Each of these
data structures is introduced below.

\subsection{Data structure: PartialDerivatives}

The user can define partial derivative operators and associated finite
difference approximations of these operators.  This allows different
discretizations of the PDE system.

A finite difference operator maps grid functions to grid functions.
We restrict to those operators which are polynomials in {\em shift}
operators.  In one dimension, the shift operator $E_+$ is defined as 
\begin{eqnarray}
E_+ v_j \equiv v_{j+1}
\end{eqnarray}
It is clear that
\begin{eqnarray}
(E_+)^n v_j = v_{j+n}
\end{eqnarray}
and negative powers $n$ take on the obvious meaning. In three
dimensions, there is one shift operator for each dimension:
\begin{eqnarray}
E_{+1} v_j \equiv v_{j+(100)} \qquad
E_{+2} v_j \equiv v_{j+(010)} \qquad
E_{+3} v_j \equiv v_{j+(001)}
\end{eqnarray}
where here $j = j_1 j_2 j_3$ is a multi-index.

The PartialDerivatives structure is a list of definitions of partial
derivative operators in terms of finite difference approximations:

\begin{center}
\begin{minipage}{0.8 \textwidth}
\begin{tt}
\{  {\it name}[i\_, j\_, \ldots] -> {\it defn}, ... \}
\end{tt}
\end{minipage}
\end{center}

where {\it name} is the name for the partial derivative, and {\it
defn} is an algebraic expression in shift operators representing the
difference operator.  The shift operator $E_{+i}$ is written as {\tt
shift[i]}. The form {\tt spacing[i]} can be used in {\it defn} to
represent the grid spacing in the $i$ direction.  The parameters {\tt
i, j, \ldots} are used in {\it defn} to represent the direction of
differentiation for the first, second, etc. derivatives.  Partial
derivatives with the same name but a different number of arguments
(i.e.~for first and second derivatives) are allowed in the
PartialDerivatives structure.

Since the definitions of the difference operators are written in terms
of Mathematica expressions, higher level operators can be constructed
from {\tt shift} and {\tt spacing}.  For example, Kranc predefines

\begin{center}
\begin{minipage}{0.8 \textwidth}
\begin{verbatim}
DPlus[n_]  := (shift[n] - 1)/spacing[n];
DMinus[n_] := (1 - 1/shift[n])/spacing[n];
DZero[n_]  := (DPlus[n] + DMinus[n])/2;
\end{verbatim}
\end{minipage}
\end{center}

As an example, we give here a PartialDerivatives structure containing
the definition of the standard second order accurate difference
operators, as well as the $D_0^2$ discretization.

\begin{center}
\begin{minipage}{0.8 \textwidth}
\begin{verbatim}
derivs = {
  PDstandard2nd[i_] -> DZero[i],
  PDstandard2nd[i_, j_] -> DPlus[i] DMinus[j],
  PDzero2nd[i_] -> DZero[i],
  PDzero2nd[i_, j_] -> DZero[i] DZero[j]
}
\end{verbatim}
\end{minipage}
\end{center}

In a calculation, a partial derivative is written in the form

\begin{center}
\begin{minipage}{0.8 \textwidth}
\begin{tt}
{\it name}[{\it gridfunction}, i, j, \ldots]
\end{tt}
\end{minipage}
\end{center}

For example, a one dimensional advection equation $\partial_t u =
\partial_x u$ with semidiscrete form $\partial_t v_j = D_{01} v_j$
could be described as

\begin{center}
\begin{minipage}{0.8 \textwidth}
\begin{tt}
dot[v] -> PDstandard2nd[v,1]
\end{tt}
\end{minipage}
\end{center}

The PartialDerivatives structure can also be used to define operators
for artificial dissipation.  Given a semidiscrete scheme
\begin{eqnarray}
\partial_t v(t)_j = F_j(v(t);t)
\end{eqnarray}
we can add Kreiss-Oliger style artificial dissipation by modifying the
scheme to read
\begin{eqnarray}
\partial_t v_j(t) = F_j(v(t);t) - \sigma \sum_i h_i^3 (D_{+i} D_{i})^2 v_j
\end{eqnarray}

We define a differencing operator {\tt Diss2nd} in the
PartialDerivatives structure with no directional arguments

\begin{center}
\begin{minipage}{0.8 \textwidth}
\begin{verbatim}
Diss2nd[] -> - sigma Sum[spacing[i]^3 (DPlus[i] DMinus[i])^2, 
                         {i, 1, 3}]
\end{verbatim}
\end{minipage}
\end{center}

using the standard Mathematica function for summations.  An evolution
equation representing the advection equation with dissipation could
then be written as

\begin{center}
\begin{minipage}{0.8 \textwidth}
\begin{verbatim}
dot[v] -> PDstandard2nd[v,1] + Diss2nd[v]
\end{verbatim}
\end{minipage}
\end{center}

A PartialDerivatives structure is given as an argument to the thorn
generation functions.

\subsection{Data structure: GroupDefinition}

A {\tt GroupDefinition} structure lists the grid functions that are
members of a specific Cactus group.  A list of such structures should
be supplied to all the KrancThorns functions so that Kranc can
determine which group each grid function belongs to.

\subsection{Data structure: Calculation}

Calculation structures are the core of the Kranc system. The user
provides a list of equations of the form

\begin{center}
\begin{minipage}{0.8 \textwidth}
\begin{tt}
{\it variable} -> {\it expression}
\end{tt}
\end{minipage}
\end{center}

When the calculation is performed, for each point in the grid, {\it
expression} is evaluated and placed into the grid function {\it
variable}.  Here {\it expression} may contain partial derivatives of
grid functions which have been defined in a PartialDerivatives
structure.

The user may specify intermediate (non-grid) variables called {\em
shorthands} which can be used as {\em variable} for precomputing
quantities which will be used later in the calculation.  To identify
these variables as shorthands, they must be listed in a {\em
Shorthands} entry of the Calculation.

The arrangement of the terms in the equations can have a marked effect
on both compile time and run time.  It is often helpful to tell
Mathematica to collect the coefficients of certain types of term,
rather than expanding out entire expressions.  To this end, the user
can include a {\em CollectList} entry in a calculation; this is a list
of variables whose coefficients should be collected during
simplification.

There is the facility for performing multiple loops in a single
calculation structure; this can be used to set a grid function in one
loop, then evaluate derivatives of it in a later loop.  For this
reason, the equations are given as a list of lists of equations.

Note that the system is not designed to allow the same grid function
to be set more than once in a single loop of a calculation.

The following example is taken from the Kranc implementation of the
NOR formulation.  It is a calculation which describes the time
evolution equation for the lapse $\alpha$ in harmonic slicing. It uses
the TensorTools package to represent tensorial quantities.

\begin{center}
\begin{minipage}{0.8 \textwidth}
\begin{verbatim}
lapseEvolveCalc = {
  Shorthands -> {trK, hInv[ua,ub]},
  Equations -> 
    {{
       hInv[ua,ub] -> MatrixInverse[h[ua,ub]],
       trK -> K[la,lb] hInv[ua,ub],
       dot[alpha] -> alpha^2 trK
    }}
};
\end{verbatim}
\end{minipage}
\end{center}

\subsection{Data structure: GroupCalculation}

A {\tt GroupCalculation} structure associates a group name with a {\tt
Calculation} which is used to update the grid functions in that
group. This is used when creating evaluator thorns, where the
calculations are triggered by requests for output for specific groups.


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\section{TensorTools}

The TensorTools package was written specifically for the Kranc system,
though it is in no way tied to it.  It is necessary to perform certain
operations on tensorial quantities, and there was no free software
available which met the requirements.

TensorTools has the following features:
\begin{itemize}
\item{It expands covariant derivatives in terms of partial derivatives
and Christoffel symbols (more than one covariant derivative can be
defined)}
\item{It expands Lie derivatives in terms of partial derivatives}
\item{Dummy indices can be automatically relabelled to avoid
conflicts}
\item{Abstract tensor expressions can be converted into component
expressions}
\end{itemize}

\subsection{Representation of tensor quantities}

Tensorial expressions are entered in the same syntax as is used by
MathTensor, a commercial tensor manipulation package which can be used
instead of TensorTools.  An abstract tensor consists of a {\em kernel}
and an arbitrary number of abstract {\em indices}, each of which can
be {\em upper} or {\em lower}.  Abstract indices are alphabetical
characters (a-z, A-Z) prefixed with either an l or a u depending on
whether the index is considered to be lower or upper.  The tensor is
written using square brackets as
\begin{center}
\begin{tt}
kernel [ indices separated by commas ]
\end{tt}
\end{center}
%
For example, $T_a^{\phantom{a}b}$ would be written as {\tt T[la,ub]}.
There is no automatic index raising or lowering with any metric.
%
Entering a tensorial expression causes it to be displayed in standard
mathematical notation:
\mathdialogue{T[la,lb]}{$T_{ab}$}
%
Internally, tensors are represented as {\tt Tensor[{\it kernel},
TensorIndex[{\it label}, {\it type}], ...]} where {\it label} is the
alphabetical index, and {\it type} is either ``u'' or ``l'' depending
on the position of the index.  This representation helps in pattern
matching, and allows TensorTools to identify whether a certain object
is a tensor or not.

\subsection{Expansion of tensorial expressions into components}

As an example, the TensorTools function {\tt MakeExplicit} converts an
expression containing abstract tensors into a list of component
expressions:
\begin{center}
  \begin{tabular}[t]{rl}
  {\tt In := } & \parbox{10cm}{\tt MakeExplicit[T[la, lb]g[ub, uc]]} \\
\\
  {\tt Out = } &  \begin{tabular}[t]{rll}
\{ & g11 T11 & + g21 T12 + g31 T13, g12 T11 + g22 T12 + g32 T13, \\
   & g13 T11 & + g23 T12 + g33 T13, g11 T21 + g21 T22 + g31 T23, \\
   & g12 T21 & + g22 T22 + g32 T23, g13 T21 + g23 T22 + g33 T23, \\
   & g11 T31 & + g21 T32 + g31 T33, g12 T31 + g22 T32 + g32 T33, \\
   & g13 T31 & + g23 T32 + g33 T33\}\\
  \end{tabular} \\
  \end{tabular}
  \end{center}

Note here that there is no distinction made between upper and lower
indices in the component form.  TensorTools was written mainly for
automated code generation rather than symbolic manipulation; different
kernels should be used for the different forms if this is a problem.

\subsection{Covariant derivatives}

TensorTools allows the user to define more than one covariant
derivative.  The following defines a covariant derivative operator
{\tt CD} with Christoffel symbol {\tt H}:
%
\mathinput{DefineConnection[CD,H]}
%
The function {\tt CDtoPD} is used to replace covariant derivatives
with partial derivatives in any expression:
%
\mathdialogue
{
  CDtoPD[CD[V[ua],lb]]
}
{
  $V^a,\,_b + H^a_{\phantom{a}bc} V^c$
}
%
The function {\tt MakeExplicit} will automatically do this before
converting expressions into components.  In order to convert an
expression containing a covariant derivative into components,
TensorTools first simplifies the expression.  In the following, $x$
and $y$ represent expressions which may contain tensorial indices. The
following steps are performed to simplify the expression:
\begin{itemize}
\item{Replace any high order covariant derivatives with repeated
application of a first order covariant derivative.  This ensures that
we only need to know how to evaluate a first derivative.
$$\nabla_d \nabla_a V^b \to \nabla_d ( \nabla_a V^b)$$}
\item{Replace the covariant derivative of a product using the Leibniz
rule: $$ \nabla_a (x y) \to (\nabla_a x) y + x (\nabla_a y) $$}
\item{Replace the covariant derivative of a sum using the linearity
property: $$ \nabla_a (x + y) \to \nabla_a x + \nabla_a y $$}
\item{Replace the covariant derivative of an arbitrary expression
containing tensorial indices with its expansion in terms of a
partial derivative and Christoffel symbols, one for each
index in the expression:  e.g.~$$\nabla_a V^b \to \partial_a V^b +
\Gamma^{b}_{\phantom{b}ac} V^c$$ }
\end{itemize}


\subsection{Lie derivatives}

The Lie derivative of an expression $x$ with respect to a vector $V$ is
written
\mathinput{Lie[x,V]}
where $V$ has been registered using {\tt DefineTensor} and is written {\em without}
indices.  The function {\tt LieToPD} is used to replace Lie derivatives
with partial derivatives:
\mathdialogue
{
  LieToPD[Lie[T[ua,lb], V]]
}
{
  $\Tud T a {b,c} V^c + \Tud T a c \Tud V c {,b} - \Tud T c b V^a_{,c}$
}
%
Lie derivatives of products and sums are supported.
%
The function {\tt MakeExplicit} will automatically perform this replacement
before converting expressions into components.


\subsection{Automatic dummy index manipulation}

When two expressions both containing a dummy index $b$ are multiplied
together, one dummy index is relabelled so as not to conflict with any
other index in the resulting expression:

\mathdialogue
{(T[la, lb]g[ub, uc])v[ub, ld, lb]}
{$T_{ab} g^{bc} V^e_{\phantom{e}de}$}
%
This requires that every multiplication be checked for tensorial
operands.  This can be a performance problem, so the feature can be
enabled and disabled with {\tt SetEnhancedTimes[True]} and {\tt
SetEnhancedTimes[False]}.  It is enabled by default.















\



\chapter{API reference}

\section{Data structure specifications}
\label{app:data_structures}

Here we describe in detail the data structures which are used when
calling the KrancThorns functions.

\subsection{Calculation}
\label{app:Calculation}

\begin{center}
%\begin{table}
\begin{tabularx}{\tablewidth}{|l|l|X|}
  \hline
  \bf Key & \bf Type & \bf Description \\
  \hline
  Equations       & list of lists    & {\tt \{loop1, loop2\}} -- Each loop is a list
                                       of rules of the form {\tt {\it variable} -> 
                                       {\it expression}} where
                              {\tt \it variable} is to be set from {\tt \it expression} \\
  Shorthands (optional)  & list of symbols    & Variables which are to be considered
                              as `shorthands' for the purposes of this calculation \\
  Name (optional) & string  & A name for the calculation \\
  Before (optional) & list of strings  & Function names before which the
                              calculation should be scheduled. \\
  After (optional)  & list of strings &  Function names after which the
                              calculation should be scheduled. \\
  \hline
\end{tabularx}
%\end{table}
\end{center}

\subsection{GroupCalculation}
\label{app:GroupCalculation}

A GroupCalculation structure is a list of two elements; the first is
the name (a string) of a Cactus group and the second is the
Calculation to update the variables in that group.

\subsection{GroupDefinition}
\label{GroupDefinition}

A GroupDefinition structure is a list of two elements.  The first is
the name (string) of a Cactus group and the second is the list of
variables (symbols) belonging to that group. The group name can be
prefixed with the name of the Cactus implementation that provides the
group followed by two colons (e.g.~``ADMBase::metric'').  If this is
not done, then the KrancThorns functions will attempt to guess the
implementation name, usually using the name of the thorn being
created.

\section{KrancThorns function reference}
\label{app:function_reference}

Here we document the arguments which can be specified for the
functions CreateBaseThorn, CreateMoLThorn, CreateSetterThorn,
CreateTranslatorThorn and CreateEvaluatorThorn.

Note that we use Mathematica syntax for function-specific section headers.
Underscores denote function arguments, and OptArguments stands for optional
arguments, also referred to as named arguments below.  These
are given in the form {\tt myFunction[..., argumentName -> argumentValue]}.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\subsection{Common Named Arguments}
\label{app:common_arguments}

The following named arguments can be used in any of the Create...Thorn
functions:
\begin{center}
%\begin{table}
\begin{tabularx}{\tablewidth}{|X|l|X|X|}
  \hline
  \bf Argument & \bf Type & \bf Description & \bf Default\\
  \hline
  SystemName & string & A name for the evolution system implemented by this arrangement.
                        This will be used for the name of the arrangement directory
                          & ``MyPDESystem''\\
  SystemParentDirectory & string & The directory in which to create the arrangement directory & ``.''\\
  ThornName & string & The name to give this thorn & SystemName + thorn type\\
  Implementation & string & The name of the Cactus implementation that this thorn defines & ThornName\\
  SystemDescription & string & A short description of the system implemented by this arrangement & SystemName \\
  Inherited\-Implementations & list of strings & A list of implementations to inherit from & \{\} \\
  DeBug & Boolean & Whether or not to print debugging information during thorn generation& False\\
  \hline
\end{tabularx}
%\end{table}
\end{center}
%\tableskip

\subsection{Arguments relating to parameters}
\label{app:parameter_arguments}

The following table describes named arguments that can be specified
for any of the thorns except CreateBaseThorn.  CreateBaseThorn is
special because it can be used to define parameters which are
inherited by each thorn in the arrangement, so the arguments it can be
given are slightly different.

%\tableskip
\begin{center}
%\begin{table}
\begin{tabularx}{\tablewidth}{|l|l|X|l|}
  \hline
  \bf Argument & \bf Type & \bf Description & \bf Default\\
  \hline
  RealBaseParameters & list of strings & Real parameters used in this thorn but 
                                         defined in the base thorn & \{\}\\
  IntBaseParameters & list of strings & Integer parameters used in this thorn 
                                        but defined in the base thorn & \{\}\\
  RealParameters & list of strings & Real parameters defined in this thorn & \{\}\\
  IntParameters & list of strings & Integer parameters defined in this thorn & \{\}\\
  \hline
\end{tabularx}
%\end{table}
\end{center}


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\subsection{CreateBaseThorn}
\label{app:CreateBaseThorn}

Prototype: CreateBaseThorn[groups, evolvedGroupNames, primitiveGroupNames, 
OptArguments

\subsubsection{Positional arguments}

\begin{center}
%\begin{table}
\begin{tabularx}{\tablewidth}{|l|l|X|}
  \hline
  \bf Argument & \bf Type & \bf Description \\
  \hline
  groups              & list of GroupDefinition structures &

  Definitions of any groups referred to in the other arguments.  Can
  supply extra definitions for other groups which will be safely
  ignored.  \\

  evolvedGroupNames & list of strings &
  
  Names of groups containing grid functions which will be evolved by
  MoL in any of the thorns in the arrangement. \\

  primitiveGroupNames & list of strings &

  Names of groups containing grid functions which will be referred to
  during calculation of the MoL right hand sides in any of the thorns
  in the arrangement. \\

  \hline
\end{tabularx}
%\end{table}
\end{center}

\subsubsection{Named arguments}

\begin{center}
%\begin{table}
\begin{tabularx}{\tablewidth}{|l|l|X|l|}
  \hline
  \bf Argument & \bf Type & \bf Description & \bf Default\\
  \hline
  RealBaseParameters & list of strings & Real parameters defined in this thorn 
and inherited by all the thorns in the arrangement & \{\}\\
  IntBaseParameters & list of strings & Integer parameters defined in this thorn 
and inherited by all the thorns in the arrangement& \{\}\\
  \hline
\end{tabularx}
%\end{table}
\end{center}


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\subsection{CreateEvaluatorThorn}
\label{app:CreateEvaluatorThorn}

Prototype:CreateEvaluatorThorn[groupCalculations, groups, OptArguments]

\subsubsection{Positional arguments}

\begin{center}
%\begin{table}
\begin{tabularx}{\tablewidth}{|l|l|X|}
  \hline
  \bf Argument & \bf Type & \bf Description \\
  \hline
  groupCalculations
  & list of GroupCalculation structures 
  & The GroupCalculations to evaluate in order to
    set the variables in each group
  \\
  groups 
  & list of GroupDefinition structures 
  & Definitions for each of the groups referred to in this thorn. Can
  supply extra definitions for other groups which will be safely
  ignored. \\

  \hline
\end{tabularx}
%\end{table}
\end{center}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%


\subsection{CreateMoLThorn}
\label{app:CreateMoLThorn}

Prototype: CreateMoLThorn[calculation, groups, OptArguments]

\subsubsection{Positional Arguments}

\begin{center}
%\begin{table}
\begin{tabularx}{\tablewidth}{|l|l|X|}
  \hline
  \bf Argument & \bf Type & \bf Description \\
  \hline
  calculation & Calculation & The calculation for setting the right hand side variables
                              for MoL.  The equations should be of the form
                              {\tt dot[{\it gf}] -> {\it expression}} for evolution equations, and
                              {\tt {\it shorthand} -> {\it expression}} for shorthand definitions, which can
                              be freely mixed in to the list.\\
  groups & list of GroupDefinition structures 

& Definitions for each of the groups referred to in this thorn. Can
  supply extra definitions for other groups which will be safely
  ignored. \\
  \hline
\end{tabularx}
%\end{table}
\end{center}

\subsubsection{Named Arguments}

\begin{center}
%\begin{table}
\begin{tabularx}{\tablewidth}{|l|l|X|l|}
  \hline
  \bf Argument & \bf Type & \bf Description & \bf Default\\
  \hline
  PrimitiveGroups & list of strings & These are the groups containing the grid functions which are
                                      referred to but not evolved by this evolution thorn & \{\}  \\
  \hline
\end{tabularx}
%\end{table}
\end{center}


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\subsection{CreateSetterThorn}
\label{app:CreateSetterThorn}

Prototype: CreateSetterThorn[calculation, OptArguments]

\subsubsection{Positional Arguments}

\begin{center}
%\begin{table}
\begin{tabularx}{\tablewidth}{|l|l|X|}
  \hline
  \bf Argument & \bf Type & \bf Description \\
  \hline
  calculation & Calculation & The calculation to be performed \\

  groups & list of GroupDefinition structures 

& Definitions for each of the groups referred to in this thorn. Can
  supply extra definitions for other groups which will be safely
  ignored. \\

  \hline
\end{tabularx}
%\end{table}
\end{center}

\subsubsection{Named Arguments}

\begin{center}
%\begin{table}
\begin{tabularx}{\tablewidth}{|l|l|X|l|}
  \hline
  \bf Argument & \bf Type & \bf Description & \bf Default\\
  \hline
  SetTime (optional) & string & ``initial\_and\_poststep'', 
                     ``initial\_only''
                     or ``poststep\_only'' & ``initial\_and\_poststep'' \\
  \hline
\end{tabularx}
%\end{table}
\end{center}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%


\subsection{CreateTranslatorThorn}
\label{app:CreateTranslatorThorn}

Prototype:CreateTranslatorThorn[groups, OptArguments]

\subsubsection{Positional Arguments}

\begin{center}
%\begin{table}
\begin{tabularx}{\tablewidth}{|l|l|X|}
  \hline
  \bf Argument & \bf Type & \bf Description \\
  \hline

  groups & list of GroupDefinition structures 

& Definitions for each of the groups referred to in this thorn. Can
  supply extra definitions for other groups which will be safely
  ignored. \\
  \hline
\end{tabularx}
%\end{table}
\end{center}

\subsubsection{Named Arguments}

\begin{center}
%\begin{table}
\begin{tabularx}{\tablewidth}{|l|l|X|}
  \hline
  \bf Argument & \bf Type & \bf Description\\
  \hline
  TranslatorInCalculation & Calculation & The calculation to set the evolved 
                                          variables from some other source  \\
  TranslatorOutCalculation & Calculation & The calculation to convert the evolved
                                           variables back into some other set of 
                                           variables  \\
  \hline
\end{tabularx}
%\end{table}
\end{center}





\chapter{Kranc internal design}

Kranc is composed of several Mathematica packages.  Each of these
human readable scripts performs a distinct function.  
The diagram in Figure \ref{fig:kranc_design} illustrates the
relationships between the Kranc packages KrancThorns, TensorTools,
CodeGen, Thorn and MapLookup, which are described in the following
subsections.
\begin{figure}
\centering
\label{fig:kranc_design}
%\includegraphics[clip,width=0.9\textwidth]{KrancStructureLandscape.eps}
\caption{Relationships between Kranc packages: 
Each block represents a package, with the main functions it provides
indicated with square brackets.  An arrow indicates that one package
calls functions from another}
\end{figure}
Separating the different logically independent components of Kranc
into different packages promotes code reuse.  For example, none of the
thorn generation packages need to know anything about tensors, and
none of the packages other than CodeGen need to know the programming
language in which the thorn is being generated (C or Fortran).  We
have chosen to define several types of thorn (setter, evaluator, {\em
etc.}) but the mechanics of producing a thorn implemented in Thorn and
CodeGen are completely independent of this decision.

\subsection{Package: CodeGen}

During the development of the Kranc system, we explored two different
approaches to generating Cactus files using Mathematica as a
programming language.  Initially, a very straightforward system was
used whereby C statements were included almost verbatim in the
Mathematica script and output directly to the thorn source file.  This
approach has two main deficiencies:
\begin{itemize}
\item{The same block of text might be used in several places in the
code.  When a bug is fixed in one place, it must be fixed in all.}
\item{It is not easy to alter the language that is produced.  For
example, it is difficult to output both C and Fortran.}
\item{The syntax in the Mathematica source file is ugly, with lots of
string concatenation, making it difficult to read and edit}.
\end{itemize}

The CodeGen package provides functions to solve these problems.  To
address the first problem, Mathematica functions are used to represent
each block of code.  This allows the block to be customized by giving
the function arguments.  By making this abstraction, it became very
easy to change between outputting C and Fortran.

Fundamental to the system is the notion of a {\em block}; in
Mathematica terms this can be either a string or a list of blocks
(this definition is recursive).  All the CodeGen functions return
blocks, and the lists are all flattened and the strings concatenated
when the final source file is generated.  This is because it is
syntactically easier in the Mathematica source file to write a
sequence of statements as a list than to concatenate strings.

Many programming constructs are naturally block-structured; for
example, C {\tt for} loops need braces after the block of code to loop
over.  For this reason, it was decided that CodeGen functions could
take as arguments any blocks of code which needed to be inserted on
the inside of such a structure.

\subsection{Package: Thorn}

The Thorn package is used by all the different thorn generators to
construct the final Cactus thorn. It takes care of the mechanics of
writing files to storage and parsing the Kranc structures necessary
for writing parameter configuration files, grid function definitions
etc.


\end{document}