-
Notifications
You must be signed in to change notification settings - Fork 16
/
Copy pathfeenox.1
2229 lines (2219 loc) · 78.6 KB
/
feenox.1
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
.\" Automatically generated by Pandoc 3.2
.\"
.TH "FEENOX" "1" "2025\-04\-02" "FeenoX" "FeenoX User Manual"
.SH NAME
FeenoX \- a cloud\-first free no\-X uniX\-like finite\-element(ish)
computational engineering tool
.SH SYNOPSIS
The basic usage is to execute the \f[B]feenox\f[R] binary passing a path
to an input file that defines the problem, along with other options and
command\-line replacement arguments which are explained below:
.PP
\f[B]feenox\f[R] [\f[I]options\f[R] \&...]
\f[I]input\-file\f[R]
[\f[I]optional_commandline_replacement_arguments\f[R] \&...]
.PP
For large problems that do not fit in a single computer, a parallel run
using \f[B]mpirun\f[R]\f[CR](1)\f[R] will be needed:
.PP
\f[B]mpirun\f[R] \f[B]\-n\f[R] \f[I]number_of_threads\f[R]
\f[B]feenox\f[R] [\f[I]options\f[R] \&...]
\f[I]input\-file\f[R]
[\f[I]optional_commandline_replacement_arguments\f[R] \&...]
.SH DESCRIPTION
FeenoX is a computational tool that can solve engineering problems which
are usually casted as differential\-algebraic equations (DAEs) or
partial differential equations (PDEs).
It is to finite elements programs and libraries what Markdown is to Word
and TeX, respectively.
In particular, it can solve
.IP \[bu] 2
dynamical systems defined by a set of user\-provided DAEs (such as plant
control dynamics for example)
.IP \[bu] 2
mechanical elasticity
.IP \[bu] 2
heat conduction
.IP \[bu] 2
structural modal analysis
.IP \[bu] 2
neutron diffusion
.IP \[bu] 2
neutron transport
.PP
FeenoX reads a plain\-text input file which contains the problem
definition and writes 100%\-user defined results in ASCII (through
\f[CR]PRINT\f[R] or other user\-defined output instructions within the
input file).
For PDE problems, it needs a reference to at least one Gmsh mesh file
for the discretization of the domain.
It can write post\-processing views in either \f[CR].msh\f[R],
\f[CR].vtu\f[R] or \f[CR].vtk\f[R] formats.
.PP
Keep in mind that FeenoX is just a back end reading a set of input files
and writing a set of output files following the design philosophy of
Unix (separation, composition, representation, economy, extensibility,
etc).
Think of it as a transfer function (or a filter in computer\-science
jargon) between input files and output files:
.IP
.EX
+\-\-\-\-\-\-\-\-\-\-\-\-+
mesh (*.msh) } | | { terminal
data (*.dat) } input \-\-\-\-> | FeenoX |\-\-\-\-> output { data files
input (*.fee) } | | { post (vtk/msh)
+\-\-\-\-\-\-\-\-\-\-\-\-+
.EE
.PP
Following the Unix programming philosophy, there are no graphical
interfaces attached to the FeenoX core, although a wide variety of pre
and post\-processors can be used with FeenoX.
To illustrate the transfer\-function approach, consider the following
input file that solves Laplace\[cq]s equation ∇^2^\f[I]ϕ\f[R] = 0 on a
square with some space\-dependent boundary conditions:
.PP
\f[I]ϕ\f[R](\f[I]x\f[R], \f[I]y\f[R]) = +\f[I]y\f[R] for
\f[I]x\f[R] = −1 (left)
.PP
\f[I]ϕ\f[R](\f[I]x\f[R], \f[I]y\f[R]) = −\f[I]y\f[R] for
\f[I]x\f[R] = +1 (right)
.PP
∇\f[I]ϕ\f[R] ⋅ \f[I]n̂\f[R] = sin (\f[I]π\f[R]/2\f[I]x\f[R]) for
\f[I]y\f[R] = −1 (bottom)
.PP
∇\f[I]ϕ\f[R] ⋅ \f[I]n̂\f[R] = 0 for \f[I]y\f[R] = +1 (top)
.IP
.EX
PROBLEM laplace 2d
READ_MESH square\-centered.msh # [\-1:+1]x[\-1:+1]
# boundary conditions
BC left phi=+y
BC right phi=\-y
BC bottom dphidn=sin(pi/2*x)
BC top dphidn=0
SOLVE_PROBLEM
# same output in .msh and in .vtk formats
WRITE_MESH laplace\-square.msh phi VECTOR dphidx dphidy 0
WRITE_MESH laplace\-square.vtk phi VECTOR dphidx dphidy 0
.EE
.PP
\
.PP
Laplace\[cq]s equation solved with FeenoX
.PP
The \f[CR].msh\f[R] file can be post\-processed with Gmsh, and the
\f[CR].vtu\f[R]/\f[CR].vtk\f[R] file can be post\-processed with
Paraview.
See https://www.caeplex.com for a mobile\-friendly web\-based interface
for solving finite elements in the cloud directly from the browser.
.SH OPTIONS
.IP
.EX
feenox [options] inputfile [replacement arguments] [petsc options]
.EE
.TP
\f[CR]\-h\f[R], \f[CR]\-\-help\f[R]
display options and detailed explanations of command\-line usage
.TP
\f[CR]\-v\f[R], \f[CR]\-\-version\f[R]
display brief version information and exit
.TP
\f[CR]\-V\f[R], \f[CR]\-\-versions\f[R]
display detailed version information
.TP
\f[CR]\-c\f[R], \f[CR]\-\-check\f[R]
validates if the input file is sane or not
.TP
\f[CR]\-\-pdes\f[R]
list the types of \f[CR]PROBLEM\f[R]s that FeenoX can solve, one per
line
.TP
\f[CR]\-\-elements_info\f[R]
output a document with information about the supported element types
.TP
\f[CR]\-\-ast\f[R]
dump an abstract syntax tree of the input
.TP
\f[CR]\-\-linear\f[R]
force FeenoX to solve the PDE problem as linear
.TP
\f[CR]\-\-non\-linear\f[R]
force FeenoX to solve the PDE problem as non\-linear
.TP
\f[CR]\-\-progress\f[R]
print ASCII progress bars when solving PDEs
.TP
\f[CR]\-\-mumps\f[R]
ask PETSc to use the direct linear solver MUMPS
.PP
Instructions will be read from standard input if \[lq]\-\[rq] is passed
as \f[CR]inputfile\f[R], i.e.
.IP
.EX
$ echo \[aq]PRINT 2+2\[aq] | feenox \-
4
.EE
.PP
The optional \f[CR][replacement arguments]\f[R] part of the command line
mean that each argument after the input file that does not start with an
hyphen will be expanded verbatim in the input file in each occurrence of
\f[CR]$1\f[R], \f[CR]$2\f[R], etc.
For example
.IP
.EX
$ echo \[aq]PRINT $1+$2\[aq] | feenox \- 3 4
7
.EE
.PP
PETSc and SLEPc options can be passed in \f[CR][petsc options]\f[R] (or
\f[CR][options]\f[R]) as well, with the difference that two hyphens have
to be used instead of only once.
For example, to pass the PETSc option \f[CR]\-ksp_view\f[R] the actual
FeenoX invocation should be
.IP
.EX
$ feenox input.fee \-\-ksp_view
.EE
.PP
For PETSc options that take values, en equal sign has to be used:
.IP
.EX
$ feenox input.fee \-\-mg_levels_pc_type=sor
.EE
.PP
See https://www.seamplex.com/feenox/examples for annotated examples.
.SH EXAMPLES
.SH EXIT STATUS
.SH ENVIRONMENT
.SH FILES
.SH CONFORMING TO
.SH INPUT\-FILE KEYWORDS
.SS GENERIC KEYWORDS
.SS \f[CR]ABORT\f[R]
.PP
Catastrophically abort the execution and quit FeenoX.
.IP
.EX
ABORT
.EE
.PP
Whenever the instruction \f[CR]ABORT\f[R] is executed, FeenoX quits with
a non\-zero error leve.
It does not close files nor unlock shared memory objects.
The objective of this instruction is to either debug complex input files
by using only parts of them or to conditionally abort the execution
using \f[CR]IF\f[R] clauses.
.SS \f[CR]ALIAS\f[R]
.PP
Define a scalar alias of an already\-defined identifier.
.IP
.EX
ALIAS { <new_var_name> IS <existing_object> | <existing_object> AS <new_name> }
.EE
.PP
The existing object can be a variable, a vector element or a matrix
element.
In the first case, the name of the variable should be given as the
existing object.
In the second case, to alias the second element of vector \f[CR]v\f[R]
to the new name \f[CR]new\f[R], \f[CR]v(2)\f[R] should be given as the
existing object.
In the third case, to alias second element (2,3) of matrix \f[CR]M\f[R]
to the new name \f[CR]new\f[R], \f[CR]M(2,3)\f[R] should be given as the
existing object.
.SS \f[CR]CLOSE\f[R]
.PP
Explicitly close a file after input/output.
.IP
.EX
CLOSE <name>
.EE
.PP
The given \f[CR]<name>\f[R] can be either a fixed\-string path or an
already\-defined \f[CR]FILE\f[R].
.SS \f[CR]DEFAULT_ARGUMENT_VALUE\f[R]
.PP
Give a default value for an optional commandline argument.
.IP
.EX
DEFAULT_ARGUMENT_VALUE <constant> <string>
.EE
.PP
If a \f[CR]$n\f[R] construction is found in the input file but the
commandline argument was not given, the default behavior is to fail
complaining that an extra argument has to be given in the commandline.
With this keyword, a default value can be assigned if no argument is
given, thus avoiding the failure and making the argument optional.
The \f[CR]<constant>\f[R] should be 1, 2, 3, etc.
and \f[CR]<string>\f[R] will be expanded character\-by\-character where
the \f[CR]$n\f[R] construction is.
Whether the resulting expression is to be interpreted as a string or as
a numerical expression will depend on the context.
.SS \f[CR]FILE\f[R]
.PP
Define a file with a particularly formatted name to be used either as
input or as output.
.IP
.EX
< FILE | OUTPUT_FILE | INPUT_FILE > <name> PATH <format> expr_1 expr_2 ... expr_n [ INPUT | OUTPUT | APPEND | MODE <fopen_mode> ]
.EE
.PP
For reading or writing into files with a fixed path, this instruction is
usually not needed as the \f[CR]FILE\f[R] keyword of other instructions
(such as \f[CR]PRINT\f[R] or \f[CR]MESH\f[R]) can take a fixed\-string
path as an argument.
However, if the file name changes as the execution progresses (say
because one file for each step is needed), then an explicit
\f[CR]FILE\f[R] needs to be defined with this keyword and later
referenced by the given name.
.PD 0
.P
.PD
The path should be given as a \f[CR]printf\f[R]\-like format string
followed by the expressions which should be evaluated in order to obtain
the actual file path.
The expressions will always be floating\-point expressions, but the
particular integer specifier \f[CR]%d\f[R] is allowed and internally
transformed to \f[CR]%.0f\f[R].
The file can be explicitly defined and \f[CR]INPUT\f[R],
\f[CR]OUTPUT\f[R] or a certain \f[CR]fopen()\f[R] mode can be given
(i.e.\ \[lq]a\[rq]).
If not explicitly given, the nature of the file will be taken from
context, i.e.\ \f[CR]FILE\f[R]s in \f[CR]PRINT\f[R] will be
\f[CR]OUTPUT\f[R] and \f[CR]FILE\f[R]s in \f[CR]FUNCTION\f[R] will be
\f[CR]INPUT\f[R].
This keyword just defines the \f[CR]FILE\f[R], it does not open it.
The file will be actually opened (and eventually closed) automatically.
In the rare case where the automated opening and closing does not fit
the expected workflow, the file can be explicitly opened or closed with
the instructions \f[CR]FILE_OPEN\f[R] and \f[CR]FILE_CLOSE\f[R].
.SS \f[CR]FIT\f[R]
.PP
Find parameters to fit an analytical function to a pointwise\-defined
function.
.IP
.EX
FIT <function_to_be_fitted> TO <function_with_data> VIA <var_1> <var_2> ... <var_n>
[ GRADIENT <expr_1> <expr_2> ... <expr_n> ]
[ RANGE_MIN <expr_1> <expr_2> ... <expr_j> ]
[ RANGE_MAX <expr_1> <expr_2> ... <expr_n> ]
[ TOL_REL <expr> ] [ TOL_ABS <expr> ] [ MAX_ITER <expr> ]
[ VERBOSE ]
.EE
.PP
The function with the data has to be point\-wise defined (i.e.\ a
\f[CR]FUNCTION\f[R] read from a file, with inline \f[CR]DATA\f[R] or
defined over a mesh).
The function to be fitted has to be parametrized with at least one of
the variables provided after the \f[CR]USING\f[R] keyword.
For example to
fit\ \f[I]f\f[R](\f[I]x\f[R], \f[I]y\f[R]) = \f[I]a\f[R]\f[I]x\f[R]^2^ + \f[I]b\f[R]\f[I]s\f[R]\f[I]q\f[R]\f[I]r\f[R]\f[I]t\f[R](\f[I]y\f[R])
to a pointwise\-defined function\ \f[I]g\f[R](\f[I]x\f[R], \f[I]y\f[R])
one gives \f[CR]FIT f TO g VIA a b\f[R].
Only the names of the functions have to be given, not the arguments.
Both functions have to have the same number of arguments.
The initial guess of the solution is given by the initial value of the
variables after the \f[CR]VIA\f[R] keyword.
Analytical expressions for the gradient of the function to be fitted
with respect to the parameters to be fitted can be optionally given with
the \f[CR]GRADIENT\f[R] keyword.
If none is provided, the gradient will be computed numerically using
finite differences.
A range over which the residuals are to be minimized can be given with
\f[CR]RANGE_MIN\f[R] and \f[CR]RANGE_MAX\f[R].
The expressions give the range of the arguments of the functions, not of
the parameters.
For multidimensional fits, the range is an hypercube.
If no range is given, all the definition points of the function with the
data are used for the fit.
Convergence can be controlled by giving the relative and absolute
tolreances with \f[CR]TOL_REL\f[R] (default
\f[CR]DEFAULT_NLIN_FIT_EPSREL\f[R]) and \f[CR]TOL_ABS\f[R] (default
\f[CR]DEFAULT_NLIN_FIT_EPSABS\f[R]), and with the maximum number of
iterations \f[CR]MAX_ITER\f[R] (default DEFAULT_NLIN_FIT_MAX_ITER).
If the optional keyword \f[CR]VERBOSE\f[R] is given, some data of the
intermediate steps is written in the standard output.
.SS \f[CR]FUNCTION\f[R]
.PP
Define a scalar function of one or more variables.
.IP
.EX
FUNCTION <function_name>(<var_1>[,var2,...,var_n]) {
= <expr> |
FILE { <file> } |
VECTORS <vector_1> <vector_2> ... <vector_n> <vector_data> |
MESH <mesh> |
DATA <num_1> <num_2> ... <num_N>
}
[ COLUMNS <expr_1> <expr_2> ... <expr_n> <expr_n+1> ]
[ INTERPOLATION { linear | polynomial | spline | spline_periodic | akima | akima_periodic | steffen |
nearest | shepard | shepard_kd | bilinear } ]
[ INTERPOLATION_THRESHOLD <expr> ] [ SHEPARD_RADIUS <expr> ] [ SHEPARD_EXPONENT <expr> ]
.EE
.PP
The number of variables \f[I]n\f[R] is given by the number of arguments
given between parenthesis after the function name.
The arguments are defined as new variables if they had not been already
defined explicitly as scalar variables.
If the function is given as an algebraic expression, the short\-hand
operator \f[CR]=\f[R] (or \f[CR]:=\f[R] for compatibility with Maxima)
can be used.
That is to say, \f[CR]FUNCTION f(x) = x\[ha]2\f[R] is equivalent to
\f[CR]f(x) = x\[ha]2\f[R] (or \f[CR]f(x) := x\[ha]2\f[R]).
If a \f[CR]FILE\f[R] is given, an ASCII file containing at least
\f[I]n\f[R] + 1 columns is expected.
By default, the first \f[I]n\f[R] columns are the values of the
arguments and the last column is the value of the function at those
points.
The order of the columns can be changed with the keyword
\f[CR]COLUMNS\f[R], which expects \f[I]n\f[R] + 1 expressions
corresponding to the column numbers.
If \f[CR]VECTORS\f[R] is given, a set of \f[I]n\f[R] + 1 vectors of the
same size is expected.
The first \f[I]n\f[R] correspond to the arguments and the last one to
the function values.
If \f[CR]MESH\f[R] is given, the function is point\-wise defined over
the mesh topology.
That is to say, the independent variables (i.e.\ the spatial
coordinates) coincide with the mesh nodes.
The dependent variable (i.e.\ the function value) is set by
\[lq]filling\[rq] a vector named \f[CR]vec_f\f[R] (where \f[CR]f\f[R]
has to be replaced with the function name) of size equal to the number
of nodes.
.PD 0
.P
.PD
The function can be pointwise\-defined inline in the input using
\f[CR]DATA\f[R].
This should be the last keyword of the line, followed by
\f[I]N\f[R] = \f[I]k\f[R] ⋅ (\f[I]n\f[R] + 1) expressions
giving\ \f[I]k\f[R] definition points: \f[I]n\f[R] arguments and the
value of the function.
Multiline continuation using brackets \f[CR]{\f[R] and \f[CR]}\f[R] can
be used for a clean data organization.
Interpolation schemes can be given for either one or multi\-dimensional
functions with \f[CR]INTERPOLATION\f[R].
Available schemes for \f[I]n\f[R] = 1 are:
.IP \[bu] 2
linear
.IP \[bu] 2
polynomial, the grade is equal to the number of data minus one
.IP \[bu] 2
spline, cubic (needs at least 3 points)
.IP \[bu] 2
spline_periodic
.IP \[bu] 2
akima (needs at least 5 points)
.IP \[bu] 2
akima_periodic (needs at least 5 points)
.IP \[bu] 2
steffen, always\-monotonic splines\-like interpolator
.PP
Default interpolation scheme for one\-dimensional functions is
\f[CR]DEFAULT_INTERPOLATION\f[R].
.PP
Available schemes for \f[I]n\f[R] > 1 are:
.IP \[bu] 2
nearest, \f[I]f\f[R](\f[I]x⃗\f[R]) is equal to the value of the closest
definition point
.IP \[bu] 2
shepard, inverse distance weighted average definition points (might lead
to inefficient evaluation)
.IP \[bu] 2
shepard_kd, average of definition points within a kd\-tree (more
efficient evaluation provided \f[CR]SHEPARD_RADIUS\f[R] is set to a
proper value)
.IP \[bu] 2
bilinear, only available if the definition points configure an
structured hypercube\-like grid.
If \f[I]n\f[R] > 3, \f[CR]SIZES\f[R] should be given.
.PP
For \f[I]n\f[R] > 1, if the euclidean distance between the arguments and
the definition points is smaller than
\f[CR]INTERPOLATION_THRESHOLD\f[R], the definition point is returned and
no interpolation is performed.
Default value is square root of
\f[CR]DEFAULT_MULTIDIM_INTERPOLATION_THRESHOLD\f[R].
.PP
The initial radius of points to take into account in
\f[CR]shepard_kd\f[R] is given by \f[CR]SHEPARD_RADIUS\f[R].
If no points are found, the radius is double until at least one
definition point is found.
The radius is doubled until at least one point is found.
Default is \f[CR]DEFAULT_SHEPARD_RADIUS\f[R].
The exponent of the \f[CR]shepard\f[R] method is given by
\f[CR]SHEPARD_EXPONENT\f[R].
Default is \f[CR]DEFAULT_SHEPARD_EXPONENT\f[R].
.SS \f[CR]IF\f[R]
.PP
Execute a set of instructions if a condition is met.
.IP
.EX
IF expr
<block_of_instructions_if_expr_is_true>
[ ELSE
<block_of_instructions_if_expr_is_false> ]
ENDIF
.EE
.SS \f[CR]IMPLICIT\f[R]
.PP
Define whether implicit definition of variables is allowed or not.
.IP
.EX
IMPLICIT { NONE | ALLOWED }
.EE
.PP
By default, FeenoX allows variables (but not vectors nor matrices) to be
implicitly declared.
To avoid introducing errors due to typos, explicit declaration of
variables can be forced by giving \f[CR]IMPLICIT NONE\f[R].
Whether implicit declaration is allowed or explicit declaration is
required depends on the last \f[CR]IMPLICIT\f[R] keyword given, which by
default is \f[CR]ALLOWED\f[R].
.SS \f[CR]INCLUDE\f[R]
.PP
Include another FeenoX input file.
.IP
.EX
INCLUDE <file_path> [ FROM <num_expr> ] [ TO <num_expr> ]
.EE
.PP
Includes the input file located in the string \f[CR]file_path\f[R] at
the current location.
The effect is the same as copying and pasting the contents of the
included file at the location of the \f[CR]INCLUDE\f[R] keyword.
The path can be relative or absolute.
Note, however, that when including files inside \f[CR]IF\f[R] blocks
that instructions are conditionally\-executed but all definitions (such
as function definitions) are processed at parse\-time independently from
the evaluation of the conditional.
The included file has to be an actual file path (i.e.\ it cannot be a
FeenoX \f[CR]FILE\f[R]) because it needs to be resolved at parse time.
Yet, the name can contain a commandline replacement argument such as
\f[CR]$1\f[R] so \f[CR]INCLUDE $1.fee\f[R] will include the file
specified after the main input file in the command line.
The optional \f[CR]FROM\f[R] and \f[CR]TO\f[R] keywords can be used to
include only portions of a file.
.SS \f[CR]MATRIX\f[R]
.PP
Define a matrix.
.IP
.EX
MATRIX <name> ROWS <expr> COLS <expr> [ DATA <expr_1> <expr_2> ... <expr_n> |
.EE
.PP
A new matrix of the prescribed size is defined.
The number of rows and columns can be an expression which will be
evaluated the very first time the matrix is used and then kept at those
constant values.
All elements will be initialized to zero unless \f[CR]DATA\f[R] is given
(which should be the last keyword of the line), in which case the
expressions will be evaluated the very first time the matrix is used and
row\-major\-assigned to each of the elements.
If there are less elements than the matrix size, the remaining values
will be zero.
If there are more elements than the matrix size, the values will be
ignored.
.SS \f[CR]OPEN\f[R]
.PP
Explicitly open a file for input/output.
.IP
.EX
OPEN <name> [ MODE <fopen_mode> ]
.EE
.PP
The given \f[CR]<name>\f[R] can be either a fixed\-string path or an
already\-defined \f[CR]FILE\f[R].
The mode is only taken into account if the file is not already defined.
Default is write \f[CR]w\f[R].
.SS \f[CR]PRINT\f[R]
.PP
Write plain\-text and/or formatted data to the standard output or into
an output file.
.IP
.EX
PRINT [ <object_1> <object_2> ... <object_n> ] [ TEXT <string_1> ... TEXT <string_n> ]
[ FILE { <file_path> | <file_id> } ] [ HEADER ] [ NONEWLINE ] [ SEP <string> ]
[ SKIP_STEP <expr> ] [ SKIP_STATIC_STEP <expr> ] [ SKIP_TIME <expr> ] [ SKIP_HEADER_STEP <expr> ]
.EE
.PP
Each argument \f[CR]object\f[R] which is not a keyword of the
\f[CR]PRINT\f[R] instruction will be part of the output.
Objects can be either a matrix, a vector or any valid scalar algebraic
expression.
If the given object cannot be solved into a valid matrix, vector or
expression, it is treated as a string literal if \f[CR]IMPLICIT\f[R] is
\f[CR]ALLOWED\f[R], otherwise a parser error is raised.
To explicitly interpret an object as a literal string even if it
resolves to a valid numerical expression, it should be prefixed with the
\f[CR]TEXT\f[R] keyword such as \f[CR]PRINT TEXT 1+1\f[R] that would
print \f[CR]1+1\f[R] instead of \f[CR]2\f[R].
Objects and string literals can be mixed and given in any order.
Hashes \f[CR]#\f[R] appearing literal in text strings have to be quoted
to prevent the parser to treat them as comments within the FeenoX input
file and thus ignoring the rest of the line, like
\f[CR]PRINT \[dq]\[rs]# this is a printed comment\[dq]\f[R].
Whenever an argument starts with a porcentage sign \f[CR]%\f[R], it is
treated as a C \f[CR]printf\f[R]\-compatible format specifier and all
the objects that follow it are printed using the given format until a
new format definition is found.
The objects are treated as double\-precision floating point numbers, so
only floating point formats should be given.
See the \f[CR]printf(3)\f[R] man page for further details.
The default format is \f[CR]DEFAULT_PRINT_FORMAT\f[R].
Matrices, vectors, scalar expressions, format modifiers and string
literals can be given in any desired order, and are processed from left
to right.
Vectors are printed element\-by\-element in a single row.
See \f[CR]PRINT_VECTOR\f[R] to print one or more vectors with one
element per line (i.e.\ vertically).
Matrices are printed element\-by\-element in a single line using
row\-major ordering if mixed with other objects but in the natural row
and column fashion if it is the only given object in the
\f[CR]PRINT\f[R] instruction.
If the \f[CR]FILE\f[R] keyword is not provided, default is to write to
\f[CR]stdout\f[R].
If the \f[CR]HEADER\f[R] keyword is given, a single line containing the
literal text given for each object is printed at the very first time the
\f[CR]PRINT\f[R] instruction is processed, starting with a hash
\f[CR]#\f[R] character.
.PD 0
.P
.PD
If the \f[CR]NONEWLINE\f[R] keyword is not provided, default is to write
a newline \f[CR]\[rs]n\f[R] character after all the objects are
processed.
Otherwise, if the last token to be printed is a numerical value, a
separator string will be printed but not the newline \f[CR]\[rs]n\f[R]
character.
If the last token is a string, neither the separator nor the newline
will be printed.
The \f[CR]SEP\f[R] keyword expects a string used to separate printed
objects.
To print objects without any separation in between give an empty string
like \f[CR]SEP \[dq]\[dq]\f[R].
The default is a tabulator character `DEFAULT_PRINT_SEPARATOR'
character.
To print an empty line write \f[CR]PRINT\f[R] without arguments.
By default the \f[CR]PRINT\f[R] instruction is evaluated every step.
If the \f[CR]SKIP_STEP\f[R] (\f[CR]SKIP_STATIC_STEP\f[R]) keyword is
given, the instruction is processed only every the number of transient
(static) steps that results in evaluating the expression, which may not
be constant.
The \f[CR]SKIP_HEADER_STEP\f[R] keyword works similarly for the optional
\f[CR]HEADER\f[R] but by default it is only printed once.
The \f[CR]SKIP_TIME\f[R] keyword use time advancements to choose how to
skip printing and may be useful for non\-constant time\-step problems.
.SS \f[CR]PRINTF\f[R]
.PP
Instruction akin to C\[cq]s \f[CR]printf\f[R].
Instruction akin to C\[cq]s \f[CR]printf\f[R] executed locally from all
MPI ranks.
.IP
.EX
PRINTF PRINTF_ALL format_string [ expr_1 [ expr_2 [ ... ] ] ]
.EE
.PP
The \f[CR]format_string\f[R] should be a \f[CR]printf\f[R]\-like string
containing double\-precision format specifiers.
A matching number of expressions should be given.
No newline is written if not explicitly asked for in the format string
with \f[CR]\[rs]n\f[R].
.PD 0
.P
.PD
Do not ask for string literals \f[CR]%s\f[R].
.PD 0
.P
.PD
As always, to get a literal \f[CR]%\f[R] use \f[CR]%%\f[R] in the format
string.
.SS \f[CR]PRINT_FUNCTION\f[R]
.PP
Print one or more functions as a table of values of dependent and
independent variables.
.IP
.EX
PRINT_FUNCTION <function_1> [ { function | expr } ... { function | expr } ]
[ FILE { <file_path> | <file_id> } ] [ HEADER ]
[ MIN <expr_1> <expr_2> ... <expr_k> ] [ MAX <expr_1> <expr_2> ... <expr_k> ]
[ STEP <expr_1> <expr_2> ... <expr_k> ] [ NSTEPs <expr_1> <expr_2> ... <expr_k> ]
[ FORMAT <print_format> ] <vector_1> [ { vector | expr } ... { vector | expr } ]
.EE
.PP
Each argument should be either a function or an expression.
The output of this instruction consists of\ \f[I]n\f[R] + \f[I]k\f[R]
columns, where\ \f[I]n\f[R] is the number of arguments of the first
function of the list and\ \f[I]k\f[R] is the number of functions and
expressions given.
The first\ \f[I]n\f[R] columns are the arguments (independent variables)
and the last\ \f[I]k\f[R] one has the evaluated functions and
expressions.
The columns are separated by a tabulator, which is the format that most
plotting tools understand.
Only function names without arguments are expected.
All functions should have the same number of arguments.
Expressions can involve the arguments of the first function.
If the \f[CR]FILE\f[R] keyword is not provided, default is to write to
\f[CR]stdout\f[R].
If \f[CR]HEADER\f[R] is given, the output is prepended with a single
line containing the names of the arguments and the names of the
functions, separated by tabs.
The header starts with a hash\ \f[CR]#\f[R] that usually acts as a
comment and is ignored by most plotting tools.
If there is no explicit range where to evaluate the functions and the
first function is point\-wise defined, they are evalauted at the points
of definition of the first one.
The range can be explicitly given as a product of\ \f[I]n\f[R]
ranges\ [\f[I]x\f[R]~\f[I]i\f[R], min ~, \f[I]x\f[R]~\f[I]i\f[R], max ~]
for \f[I]i\f[R] = 1, \&..., \f[I]n\f[R].
.PD 0
.P
.PD
The values \f[I]x\f[R]~\f[I]i\f[R], min ~ and
\f[I]x\f[R]~\f[I]i\f[R], max ~ are given with the \f[CR]MIN\f[R]
\f[I]and\f[R] \f[CR]MAX\f[R] keywords.
The discretization steps of the ranges are given by either
\f[CR]STEP\f[R] that gives\ \f[I]δ\f[R]\f[I]x\f[R] \f[I]or\f[R]
\f[CR]NSTEPS\f[R] that gives the number of steps.
If the first function is not point\-wise defined, the ranges are
mandatory.
.SS \f[CR]PRINT_VECTOR\f[R]
.PP
Print the elements of one or more vectors, one element per line.
.IP
.EX
PRINT_VECTOR
[ FILE { <file_path> | <file_id> } ] [ HEADER ]
[ SEP <string> ]
.EE
.PP
Each argument should be either a vector or an expression of the
integer\ \f[CR]i\f[R].
If the \f[CR]FILE\f[R] keyword is not provided, default is to write to
\f[CR]stdout\f[R].
If \f[CR]HEADER\f[R] is given, the output is prepended with a single
line containing the names of the arguments and the names of the
functions, separated by tabs.
The header starts with a hash\ \f[CR]#\f[R] that usually acts as a
comment and is ignored by most plotting tools.
The \f[CR]SEP\f[R] keyword expects a string used to separate printed
objects.
To print objects without any separation in between give an empty string
like \f[CR]SEP \[dq]\[dq]\f[R].
The default is a tabulator character `DEFAULT_PRINT_SEPARATOR'
character.
.SS \f[CR]SOLVE\f[R]
.PP
Solve a (small) system of non\-linear equations.
.IP
.EX
SOLVE FOR <n> UNKNOWNS <var_1> <var_2> ... <var_n> [ METHOD { dnewton | hybrid | hybrids | broyden } ]
[ EPSABS <expr> ] [ EPSREL <expr> ] [ MAX_ITER <expr> ]
.EE
.SS \f[CR]SORT_VECTOR\f[R]
.PP
Sort the elements of a vector, optionally making the same rearrangement
in another vector.
.IP
.EX
SORT_VECTOR <vector> [ ASCENDING | DESCENDING ] [ <other_vector> ]
.EE
.PP
This instruction sorts the elements of \f[CR]<vector>\f[R] into either
ascending or descending numerical order.
If \f[CR]<other_vector>\f[R] is given, the same rearrangement is made on
it.
Default is ascending order.
.SS \f[CR]VAR\f[R]
.PP
Explicitly define one or more scalar variables.
.IP
.EX
VAR <name_1> [ <name_2> ] ... [ <name_n> ]
.EE
.PP
When implicit definition is allowed (see \f[CR]IMPLICIT\f[R]), scalar
variables need not to be defined before being used if from the context
FeenoX can tell that an scalar variable is needed.
For instance, when defining a function like \f[CR]f(x) = x\[ha]2\f[R] it
is not needed to declare \f[CR]x\f[R] explicitly as a scalar variable.
But if one wants to define a function like
\f[CR]g(x) = integral(f(x\[aq]), x\[aq], 0, x)\f[R] then the variable
\f[CR]x\[aq]\f[R] needs to be explicitly defined as
\f[CR]VAR x\[aq]\f[R] before the integral.
.SS \f[CR]VECTOR\f[R]
.PP
Define a vector.
.IP
.EX
VECTOR <name> SIZE <expr> [ FUNCTION_DATA <function> ] [ DATA <expr_1> <expr_2> ... <expr_n> |
.EE
.PP
A new vector of the prescribed size is defined.
The size can be an expression which will be evaluated the very first
time the vector is used and then kept at that constant value.
If the keyword \f[CR]FUNCTION_DATA\f[R] is given, the elements of the
vector will be synchronized with the inpedendent values of the function,
which should be point\-wise defined.
The sizes of both the function and the vector should match.
All elements will be initialized to zero unless \f[CR]DATA\f[R] is given
(which should be the last keyword of the line), in which case the
expressions will be evaluated the very first time the vector is used and
assigned to each of the elements.
If there are less elements than the vector size, the remaining values
will be zero.
If there are more elements than the vector size, the values will be
ignored.
.SS DAE\-RELATED KEYWORDS
.SS \f[CR]INITIAL_CONDITIONS\f[R]
.PP
Define how initial conditions of DAE problems are computed.
.IP
.EX
INITIAL_CONDITIONS { AS_PROVIDED | FROM_VARIABLES | FROM_DERIVATIVES }
.EE
.PP
In DAE problems, initial conditions may be either:
.IP \[bu] 2
equal to the provided expressions (\f[CR]AS_PROVIDED\f[R])
.IP \[bu] 2
the derivatives computed from the provided phase\-space variables
(\f[CR]FROM_VARIABLES\f[R])
.IP \[bu] 2
the phase\-space variables computed from the provided derivatives
(\f[CR]FROM_DERIVATIVES\f[R])
.PP
In the first case, it is up to the user to fulfill the DAE system
at\ \f[I]t\f[R] = 0.
If the residuals are not small enough, a convergence error will occur.
The \f[CR]FROM_VARIABLES\f[R] option means calling IDA\[cq]s
\f[CR]IDACalcIC\f[R] routine with the parameter
\f[CR]IDA_YA_YDP_INIT\f[R].
The \f[CR]FROM_DERIVATIVES\f[R] option means calling IDA\[cq]s
\f[CR]IDACalcIC\f[R] routine with the parameter IDA_Y_INIT.
Wasora should be able to automatically detect which variables in
phase\-space are differential and which are purely algebraic.
However, the \f[CR]DIFFERENTIAL\f[R] keyword may be used to explicitly
define them.
See the SUNDIALS documentation for further information.
.SS \f[CR]PHASE_SPACE\f[R]
.PP
Ask FeenoX to solve a set of algebraic\-differntial equations and define
the variables, vectors and/or matrices that span the phase space.
.IP
.EX
PHASE_SPACE PHASE_SPACE <vars> ... <vectors> ... <matrices> ...
.EE
.SS \f[CR]TIME_PATH\f[R]
.PP
Force time\-dependent problems to pass through specific instants of
time.
.IP
.EX
TIME_PATH <expr_1> [ <expr_2> [ ... <expr_n> ] ]
.EE
.PP
The time step \f[CR]dt\f[R] will be reduced whenever the distance
between the current time \f[CR]t\f[R] and the next expression in the
list is greater than \f[CR]dt\f[R] so as to force \f[CR]t\f[R] to
coincide with the expressions given.
The list of expressions should evaluate to a sorted list of values for
all times.
.SS PDE\-RELATED KEYWORDS
.SS \f[CR]BC\f[R]
.PP
Define a boundary condition to be applied to faces, edges and/or
vertices.
.IP
.EX
BC <name> [ MESH <name> ] [ GROUP <name_1> GROUP <name_2> ... ] [ <bc_data1> <bc_data2> ... ] [ GROUPS <name_1> <name_2> ... ]
.EE
.PP
If the name of the boundary condition matches a physical group in the
mesh, and neither \f[CR]GROUP\f[R] nor \f[CR]GROUPS\f[R] are given, it
is automatically linked to that physical group.
If there are many meshes, the mesh this keyword refers to has to be
given with \f[CR]MESH\f[R].
If the boundary condition applies to more than one physical group in the
mesh, they can be added using as many \f[CR]GROUP\f[R] keywords as
needed.
Each \f[CR]<bc_data>\f[R] argument is a single string whose meaning
depends on the type of problem being solved.
For instance \f[CR]T=150*sin(x/pi)\f[R] prescribes the temperature to
depend on space as the provided expression in a thermal problem and
\f[CR]fixed\f[R] fixes the displacements in all the directions in a
mechanical or modal problem.
See the particular section on boundary conditions for further details.
If the keyword \f[CR]GROUPS\f[R] is given, then the rest of the tokens
are parsed as group names where the boundary condition is applied.
If either \f[CR]GROUP\f[R] or \f[CR]GROUPS\f[R] are given explicitly,
then the \f[CR]BC\f[R] name is not used to try to implicitly link it to
a physical group in the mesh.
.SS \f[CR]COMPUTE_REACTION\f[R]
.PP
Compute the reaction (force, moment, power, etc.)
at selected face, edge or vertex.
.IP
.EX
COMPUTE_REACTION <physical_group> [ MOMENT [ X0 <expr> ] [ Y0 <expr> ] [ Z0 <expr> ] ] RESULT { <variable> | <vector> }
.EE
.PP
If the \f[CR]MOMENT\f[R] keyword is not given, the zero\-th order
reaction is computed, i.e.\ force in elasticity and power in thermal.
If the \f[CR]MOMENT\f[R] keyword is given, then the coordinates of the
center can be given with \f[CR]X0\f[R], \f[CR]Y0\f[R] and \f[CR]Z0\f[R].
If they are not, the moment is computed about the barycenter of the
physical group.
The resulting reaction will be stored in the variable (thermal) or
vector (elasticity) provided.
If the variable or vector does not exist, it will be created.
.SS \f[CR]DUMP\f[R]
.PP
Dump raw PETSc objects used to solve PDEs into files.
.IP
.EX
DUMP [ FORMAT { binary | ascii | octave } ] [ K | K_bc | b | b_bc | M | M_bc |
.EE
.SS \f[CR]FIND_EXTREMA\f[R]
.PP
Find and/or compute the absolute extrema of a function or expression
over a mesh (or a subset of it).
.IP
.EX
FIND_EXTREMA { <expression> | <function> } [ OVER <physical_group> ] [ MESH <mesh_identifier> ] [ NODES | CELLS | GAUSS ]
[ MIN <variable> ] [ MAX <variable> ] [ X_MIN <variable> ] [ X_MAX <variable> ] [ Y_MIN <variable> ] [ Y_MAX <variable> ] [ Z_MIN <variable> ] [ Z_MAX <variable> ] [ I_MIN <variable> ] [ I_MAX <variable> ]
.EE
.PP
Either an expression or a function of space \f[I]x\f[R], \f[I]y\f[R]
and/or \f[I]z\f[R] should be given.
By default the search is performed over the highest\-dimensional
elements of the mesh, i.e.\ over the whole volume, area or length for
three, two and one\-dimensional meshes, respectively.
If the search is to be carried out over just a physical group, it has to
be given in \f[CR]OVER\f[R].
If there are more than one mesh defined, an explicit one has to be given
with \f[CR]MESH\f[R].
If neither \f[CR]NODES\f[R], \f[CR]CELLS\f[R] or \f[CR]GAUSS\f[R] is
given then the search is performed over the three of them.
With \f[CR]NODES\f[R] only the function or expression is evalauted at
the mesh nodes.
With \f[CR]CELLS\f[R] only the function or expression is evalauted at
the element centers.
With \f[CR]GAUSS\f[R] only the function or expression is evalauted at
the Gauss points.
The value of the absolute minimum (maximum) is stored in the variable
indicated by \f[CR]MIN\f[R] (\f[CR]MAX\f[R]).
If the variable does not exist, it is created.
The value of the \f[I]x\f[R]\-\f[I]y\f[R]\-\f[I]z\f[R]\ coordinate of
the absolute minimum (maximum) is stored in the variable indicated by
\f[CR]X_MIN\f[R]\-\f[CR]Y_MIN\f[R]\-\f[CR]Z_MIN\f[R]
(\f[CR]X_MAX\f[R]\-\f[CR]Y_MAX\f[R]\-\f[CR]Z_MAX\f[R]).
If the variable does not exist, it is created.
The index (either node or cell) where the absolute minimum (maximum) is
found is stored in the variable indicated by \f[CR]I_MIN\f[R]
(\f[CR]I_MAX\f[R]).
.SS \f[CR]INTEGRATE\f[R]
.PP
Spatially integrate a function or expression over a mesh (or a subset of
it).
.IP
.EX
INTEGRATE { <expression> | <function> } [ OVER <physical_group> ] [ MESH <mesh_identifier> ] [ GAUSS | CELLS ]
RESULT <variable>
.EE
.PP
Either an expression or a function of space \f[I]x\f[R], \f[I]y\f[R]
and/or \f[I]z\f[R] should be given.
If the integrand is a function, do not include the arguments,
i.e.\ instead of \f[CR]f(x,y,z)\f[R] just write \f[CR]f\f[R].
The results should be the same but efficiency will be different (faster
for pure functions).
By default the integration is performed over the highest\-dimensional
elements of the mesh, i.e.\ over the whole volume, area or length for
three, two and one\-dimensional meshes, respectively.
If the integration is to be carried out over just a physical group, it
has to be given in \f[CR]OVER\f[R].
If there are more than one mesh defined, an explicit one has to be given
with \f[CR]MESH\f[R].
Either \f[CR]GAUSS\f[R] or \f[CR]CELLS\f[R] define how the integration
is to be performed.
With \f[CR]GAUSS\f[R] the integration is performed using the Gauss
points and weights associated to each element type.
With \f[CR]CELLS\f[R] the integral is computed as the sum of the product
of the integrand at the center of each cell (element) and the cell\[cq]s
volume.
Do expect differences in the results and efficiency between these two
approaches depending on the nature of the integrand.
The scalar result of the integration is stored in the variable given by
the mandatory keyword \f[CR]RESULT\f[R].
If the variable does not exist, it is created.
.SS \f[CR]MATERIAL\f[R]
.PP
Define a material its and properties to be used in volumes.
.IP
.EX
MATERIAL <name> [ MESH <name> ] [ LABEL <name_1> [ LABEL <name_2> [ ... ] ] ]
[ <property_name_1>=<expr_1> [ <property_name_2>=<expr_2> [ ... ] ] ]
.EE
.PP
If the name of the material matches a physical group in the mesh, it is
automatically linked to that physical group.
If there are many meshes, the mesh this keyword refers to has to be
given with \f[CR]MESH\f[R].
If the material applies to more than one physical group in the mesh,
they can be added using as many \f[CR]LABEL\f[R] keywords as needed.
The names of the properties in principle can be arbitrary, but each
problem type needs a minimum set of properties defined with particular
names.
For example, steady\-state thermal problems need at least the
conductivity which should be named\ \f[CR]k\f[R].
If the problem is transient, it will also need heat
capacity\ \f[CR]rhocp\f[R] or diffusivity\ \f[CR]alpha\f[R].
Mechanical problems need Young modulus\ \f[CR]E\f[R] and Poisson\[cq]s
ratio\ \f[CR]nu\f[R].
Modal also needs density\ \f[CR]rho\f[R].
Check the particular documentation for each problem type.
Besides these mandatory properties, any other one can be defined.
For instance, if one mandatory property depended on the concentration of
boron in the material, a new per\-material property can be added named
\f[CR]boron\f[R] and then the function \f[CR]boron(x,y,z)\f[R] can be
used in the expression that defines the mandatory property.
.SS \f[CR]PETSC_OPTIONS\f[R]
.PP
Pass verbatim options to PETSc.
.IP
.EX
PETSC_OPTIONS \[dq]command\-line options for PETSc\[dq]
.EE
.PP
Options for PETSc can be passed either in at run time in the command
line (run with \f[CR]\-h\f[R] to see how) or they can be set in the
input file with \f[CR]PETSC_OPTIONS\f[R].
This is handy when a particular problem is best suited to be solved
using a particular set of options which can the be embedded into the
problem definition.