Cloned SEACAS for EXODUS library with extra build files for internal package management.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

635 lines
17 KiB

2 years ago
\chapter{Examples}\label{ch:examples}
\section{Mesh Generation Input File}
The first example shown in this section is the point definition portion of an input
file for a mesh generation code. First, the locations of the arc center points
1, 2, and 5 are specified. Then, the radius of each arc is defined ( \cmd{\{Rad1\}},
\cmd{\{Rad2\}}, and \cmd{\{Rad5\}}). Note that the lines are started with a dollar sign, which
is a comment character to the mesh generation code. Following this, the locations
of points 10, 20, 30, 40, and 50 are defined in algebraic terms. Then, the points
for the inner wall are defined simply by subtracting the wall thickness from the
radius values.
\begin{apinp}
Title
Example for Aprepro
\$ Center Points
Point 1 \{x1 = 6.31952E+01\} \{y1 = 7.57774E+01\}
Point 2 \{x2 = 0.00000E+00\} \{y2 = -3.55000E+01\}
Point 5 \{x5 = 0.00000E+00\} \{y5 = 3.62966E+01\}
\$ Width = \{Width = 3.0\}
\ldots Wall thickness
\$ Rad5 = \{Rad5 = 207.00\}
\$ Rad2 = \{Rad2 = 203.2236\}
\$ Rad1 = \{Rad1 = Rad2 - dist(x1,y1; x2,y2)\}
\$ Angle between Points 2 and 1: \{Th12 = atan2d((y1-y2),(x1-x2))\}
Point 10 0.00 \{y5 - Rad5\}
Point 20 \{x20 = x1+Rad1\} \{y5-sqrt(Rad5\^{}2-x20\^{}2)\}
Point 30 \{x20\} \{y1\}
Point 40 \{x1+Rad1*cosd(Th12)\} \{y1+Rad1*sind(Th12)\}
Point 50 0.00 \{y2 + Rad2\}
\$ Inner Wall (3 mm thick)
\$ \{Rad5 -= Width\}
\$ \{Rad2 -= Width\}
\$ \{Rad1 -= Width\}
\ldots Rad1, Rad2, and Rad5 are reduced by the wall thickness
Point 110 0.00 \{y5 - Rad5\}
Point 120 \{x20 = x1+Rad1\} \{y5-sqrt(Rad5\^{}2-x20\^{}2)\}
Point 130 \{x20\} \{y1\}
Point 140 \{x1+Rad1*cosd(Th12)\} \{y1+Rad1*sind(Th12)\}
Point 150 0.00 \{y2 + Rad2\}
\end{apinp}
The output obtained from processing the above input file by \aprepro{} is shown below.
\begin{apout}
Title
Example for Aprepro
\$ Center Points
Point 1 63.1952 75.7774
Point 2 0 -35.5
Point 5 0 36.2966
\$ Rad5 = 207
\$ Rad2 = 203.2236
\$ Rad1 = 75.2537088
\$ Angle between Points 2 and 1: 60.40745947
Point 10 0.00 -170.7034
Point 20 138.4489088 -117.5893956
Point 30 138.4489088 75.7774
Point 40 100.3576382 141.214957
Point 50 0.00 167.7236
\$ Inner Wall (3 mm thick)
\$ 204
\$ 200.2236
\$ 72.2537088
Point 110 0.00 -167.7034
Point 120 135.4489088 -116.2471416
Point 130 135.4489088 75.7774
Point 140 98.87615226 138.6062794
Point 150 0.00 164.7236
\end{apout}
\section{Macro Examples}
Aprepro can also be used as a simple macro definition program. For example, a mesh
input file may have many lines with the same number of intervals. If those lines
are defined using a variable name for the number of intervals, then preprocessing
the file with Aprepro will set all of the intervals to the same value, and simply
changing one value will change them all. The following input file fragment illustrates
this
\begin{apinp}
\$ \{intA = 11\} \{intB = int(intA / 2)\} line 10 str 10 20 0 \{intA\}
line 20 str 20 30 0 \{intB\}
line 30 str 30 40 0 \{intA\}
line 40 str 40 10 0 \{intB\}
\end{apinp}
Which when processed looks like:
\begin{apout}
\$ 11 5
line 10 str 10 20 0 11
line 20 str 20 30 0 5
line 30 str 30 40 0 11
line 40 str 40 10 0 5
\end{apout}
\section{Command Line Variable Assignment}\label{example:varval}
This example illustrates the use of assigning variables on the command line. While
generating a complicated 2D or 3D mesh, it is often necessary to reposition the
mesh using GREPOS. If the following file called shift.grp is created:
\begin{apinp}
Offset X \{xshift\} Y \{yshift\}
Exit
\end{apinp}
then, the mesh can be repositioned simply by typing:
\begin{apinp}
Aprepro xshift=100.0 yshift=-200.0 shift.grp temp.grp
Grepos input.mesh output.mesh temp.grp
\end{apinp}
\section{Loop Example}
This example illustrates the use of the loop construct to print a table of sines
and cosines from 0 to 90 degrees in 5 degree increments.
Input:
\begin{apinp}
\$ Test looping - print sin, cos from 0 to 90 by 5
\{angle = -5\}
\{Loop(19)\}
\{angle += 5\} \{sind(angle)\} \{cosd(angle)\}
\{EndLoop\}
\end{apinp}
Output:
\begin{apout}
\$ Test looping - print sin, cos from 0 to 90 by 5
-5
0 0 1
5 0.08715574275 0.9961946981
10 0.1736481777 0.984807753
15 0.2588190451 0.9659258263
20 0.3420201433 0.9396926208
25 0.4226182617 0.906307787
30 0.5 0.8660254038
35 0.5735764364 0.8191520443
40 0.6427876097 0.7660444431
45 0.7071067812 0.7071067812
50 0.7660444431 0.6427876097
55 0.8191520443 0.5735764364
60 0.8660254038 0.5
65 0.906307787 0.4226182617
70 0.9396926208 0.3420201433
75 0.9659258263 0.2588190451
80 0.984807753 0.1736481777
85 0.9961946981 0.08715574275
90 1 6.123233765e-17
\end{apout}
\section{If Example}
This example illustrates the if conditional construct.
\begin{apinp}
\{diff = sqrt(3)*sqrt(3) - 3\}
$ Test if - else lines
\{if(sqrt(3)*sqrt(3) - 3 == diff)\}
complex if works
\{else\}
complex if does not work
\{endif\}
\{if (sqrt(4) == 2)\}
\{if (sqrt(9) == 3)\}
\{if (sqrt(16) == 4)\}
square roots work
\{else\}
sqrt(16) does not work
\{endif\}
\{else\}
sqrt(9) does not work
\{endif\}
\{else\}
sqrt(4) does not work
\{endif\}
\{v1 = 1\} \{v2 = 2\}
\{if (v1 == v2)\}
Bad if
\{if (v1 != v2)\}
should not see (1)
\{else\}
should not see (2)
\{endif\}
should not see (3)
\{else\}
\{if (v1 != v2)\}
good nested if
\{else\}
bad nested if
\{endif\}
good
make sure it is still good
\{endif\}
\end{apinp}
The output of this is:
\begin{apout}
-4.440892099e-16
\$ Test if - else lines
complex if works
square roots work
1 2
good nested if
good
make sure it is still good
\end{apout}
\section{Aprepro Exodus Example}
The input below illustrates the use of the \cmd{exodus\_meta} and \cmd{exodus\_info} functions.
\begin{apinp}
\{exodus_meta("exodus.g")\}
Title = \{ex_title\}
Dimension = \{ex_dimension\}
Node Count = \{ex_node_count\}
Element Count = \{ex_element_count\}
Element Block Info:
Count = \{ex_block_count\}
Names = \{ex_block_names\}
Topology = \{ex_block_topology\}
Ids = \{print_array(transpose(ex_block_ids))\}
\{print_array(ex_block_info)\}
Nodeset Info:
Count = \{ex_nodeset_count\}
Names = \{ex_nodeset_names\}
Ids = \{print_array(transpose(ex_nodeset_ids))\}
\{print_array(ex_nodeset_info)\}
Sideset Info:
Count = \{ex_sideset_count\}
Names = \{ex_sideset_names\}
Ids = \{print_array(transpose(ex_sideset_ids))\}
\{print_array(ex_sideset_info)\}
Timestep Info:
Count = \{ex_timestep_count\}
Times = \{print_array(transpose(ex_timestep_times))\}
NOTE: Array index are 0-based by default; get_word is 1-based... \{i_=0\}
\{loop(ex_block_count)\}
Element block \{ex_block_ids[i_]\} named '\{get_word(++i_,ex_block_names,",")\}' has topology '\{get_word(i_,ex_block_topology,",")\}'
\{endloop\}
Extract Information Records using begin \ldots end
\{info1 = exodus_info("exodus.g", "start extract", "end extract")\}
Rescan String:
\{rescan(info1)\}
Extract Information Records using prefix and then rescan:
\{info2 = exodus_info("exodus.g", "PRE: ")\}
\{rescan(info2)\}
\end{apinp}
When processed by \aprepro{}, the following output will be produced:
\begin{apout}
Title = GeneratedMesh: 2x3x4+shell:xYz+nodeset:XyZ+sideset:xyzXYZ+times:7+variables:glob
Dimension = 3
Node Count = 60
Element Count = 50
Element Block Info:
Count = 4
Names = inner_core,Shell-MinX,Shell-MaxY,Shell-MinZ
Topology = hex8,shell4,shell4,shell4
Ids = 1 2 3 4
1 24 8 0
2 12 4 1
3 8 4 1
4 6 4 1
Nodeset Info:
Count = 3
Names = nodelist_1,nodelist_2,nodelist_3
Ids = 1 2 3
1 20 20
2 15 15
3 12 12
Sideset Info:
Count = 6
Names = surface_1,surface_2,surface_3,surface_4,surface_5,surface_6
Ids = 1 2 3 4 5 6
1 12 48
2 8 32
3 6 24
4 12 48
5 8 32
6 6 24
Timestep Info:
Count = 7
Times = 0 1 2 3 4 5 6
NOTE: Array index are 0-based by default; get_word is 1-based... 0
Element block 1 named 'inner_core' has topology 'hex8'
Element block 2 named 'Shell-MinX' has topology 'shell4'
Element block 3 named 'Shell-MaxY' has topology 'shell4'
Element block 4 named 'Shell-MinZ' has topology 'shell4'
Extract Information Records using begin \ldots end
{loop(6)}
{a_++^2}
{endloop}
Rescan String:
0
1
4
9
16
25
Extract Information Records using prefix and then rescan:
{ECHO(OFF)}
{Units("si")}
{ECHO(ON)}
1 foot = {1~foot} {lout}
12 inch = {12~inch} {lout}
1728 in^3 = {1728~in^3} {Vout}
{10~foot * 14~in}
60 mph = {60~mph} {vout}
88 fps = {88~fps} {vout}
1 foot = 0.3048 meter
12 inch = 0.3048 meter
1728 in^3 = 0.02831684659 meter^3
1.0838688
60 mph = 26.8224 meter/sec
88 fps = 26.8224 meter/sec
\end{apout}
\section{Aprepro Test File Example}
The input below is from one of the aprepro test files. It illustrates
looping, assignments, trigonometric functions, ifdefs, string
processing, and many other \aprepro{} constructs.
\begin{apinp}
$ Test program for Aprepro
$
Test number representations
\{1\} \{10e-1\} \{10.e-1\} \{.1e+1\} \{.1e1\}
\{1\} \{10E-1\} \{10.E-1\} \{.1E+1\} \{.1E1\}
Test assign statements:
\{_a = 5\} \{b=_a\} $ Should print 5 5
\{_a +=b\} \{_a\} $ Should print 10 10
\{_a -=b\} \{_a\} $ Should print 5 5
\{_a *=b\} \{_a\} $ Should print 25 25
\{_a /=b\} \{_a\} $ Should print 5 5
\{_a ^=b\} \{_a\} $ Should print 3125 3125
\{_a = b\} \{_a**=b\} \{_a\} $ Should print 5 3125 3125
Test trigonometric functions (radians)
\{pi = d2r(180)\} \{atan2(0,-1)\} \{4*atan(1.0)\} $ Three values of pi
\{_a = sin(pi/4)\} \{pi-4*asin(_a)\} $ sin(pi/4)
\{_b = cos(pi/4)\} \{pi-4*acos(_b)\} $ cos(pi/4)
\{_c = tan(pi/4)\} \{pi-4*atan(_c)\} $ tan(pi/4)
Test trigonometric functions (degrees)
\{r2d(pi)\} \{pid = atan2d(0,-1)\} \{4 * atand(1.0)\}
\{ad = sind(180/4)\} \{180-4*asind(ad)\} $ sin(180/4)
\{bd = cosd(180/4)\} \{180-4*acosd(bd)\} $ cos(180/4)
\{cd = tand(180/4)\} \{180-4*atand(cd)\} $ tan(180/4)
Test max, min, sign, dim, abs
\{pmin = min(0.5, 1.0)\} \{nmin = min(-0.5, -1.0)\} $ Should be 0.5, -1
\{pmax = max(0.5, 1.0)\} \{nmax = max(-0.5, -1.0)\} $ Should be 1.0, -0.5
\{zero = 0\} \{sign(0.5, zero) + sign(0.5, -zero)\} $ Should be 0 1
\{nonzero = 1\} \{sign(0.5, nonzero) + sign(0.5, -nonzero)\} $ Should be 1 0
\{dim(5.5, 4.5)\} \{dim(4.5, 5.5)\} $ Should be 1 0
$ Test ifdef lines
\{ifyes = 1\} \{ifno = 0\}
\{Ifdef(ifyes)\}
This line should be echoed. (a)
\{Endif\}
This line should be echoed. (b)
\{Ifdef(ifno)\}
This line should not be echoed
\{Endif\}
This line should be echoed. (c)
\{Ifdef(ifundefined)\}
This line should not be echoed
\{Endif\}
This line should be echoed. (d)
$ Test if - else lines
\{Ifdef(ifyes)\}
This line should be echoed. (1)
\{Else\}
This line should not be echoed (2)
\{Endif\}
\{Ifdef(ifno)\}
This line should not be echoed. (3)
\{Else\}
This line should be echoed (4)
\{Endif\}
$ Test if - else lines
\{Ifndef(ifyes)\}
This line should not be echoed. (5)
\{Else\}
This line should be echoed (6)
\{Endif\}
\{Ifndef(ifno)\}
This line should be echoed. (7)
\{Else\}
This line should not be echoed (8)
\{Endif\}
$ Lines a, b, c, d, 1, 4, 6, 7 should be echoed
$ Check line counting -- should be on line 74: \{Parse Error\}
\{ifdef(ifyes)\} \{This should be an error\}
\{endif\}
$ Test int and [] (shortcut for int)
\{int(5.01)\} \{int(-5.01)\}
\{[5.01]\} \{[-5.01]\}
$ Test looping - print sin, cos from 0 to 90 by 5
\{_angle = -5\}
\{Loop(19)\}
\{_angle += 5\} \{_sa=sind(_angle)\} \{_ca=cosd(_angle)\} \{hypot(_sa, _ca)\}
\{EndLoop\}
$$$$ Test formatting and string concatenation
\{_i = 0\} \{_SAVE = _FORMAT\}
\{loop(20)\}
\{IO(++_i)\} Using the format \{_FORMAT = "%." // tostring(_i) // "g"\}, PI = \{PI\}
\{endloop\}
Reset format to default: \{_FORMAT = _SAVE\}
$$$$ Test string rescanning and executing
\{ECHO(OFF)\}
\{Test = ' This is line 1: \{a = atan2(0,-1)\}
This is line 2: \{sin(a/4)\}
This is line 3: \{cos(a/4)\}'\}
\{Test2 = 'This has an embedded string: \{T = "This is a string"\}'\}
\{ECHO(ON)\}
Original String:
\{Test\}
Rescanned String:
\{rescan(Test)\}
Original String:
\{Test2\}
Print Value of variable T = \{T\}
Rescanned String:
\{rescan(Test2)\}
Print Value of variable T = \{T\}
Original String: \{t1 = "atan2(0,-1)"\}
Executed String: \{execute(t1)\}
string = \{_string = " one two, three"\}
delimiter "\{_delm = " ,"\}"
word count = \{word_count(_string,_delm)\}
second word = "\{get_word(2,_string,_delm)\}"
string = \{_string = " (one two, three * four - five"\}
delimiter "\{_delm = " ,(*-"\}"
word count = \{word_count(_string,_delm)\}
second word = "\{get_word(2,_string,_delm)\}"
string = \{_string = " one two, three"\}
delimiter "\{_delm = " ,"\}"
word count = \{ iwords = word_count(_string,_delm)\}
\{_n = 0\}
\{loop(iwords)\}
word \{++_n\} = "\{get_word(_n,_string,_delm)\}"
\{endloop\}
$ Check parsing of escaped braces...
\verb+\+\{ int a = b + \{PI/2\} \verb+\+\}
\verb+\+\{ \verb+\+\}
\end{apinp}
When processec by \aprepro{}, there will be two warning messages and
one error message:
\begin{apout}
Aprepro: WARN: Undefined variable 'Parse' (test.inp_app, line 74)
Aprepro: ERROR: syntax error (test.inp_app, line 74)
Aprepro: WARN: Undefined variable 'T' (test.inp_app, line 106)
\end{apout}
The processed output from this example is:
\begin{apout}
$ Aprepro (Revision: 2.28) Mon Jan 21 10:58:23 2013
$ Test program for Aprepro
$
Test number representations
1 1 1 1 1
1 1 1 1 1
Test assign statements:
5 5 $ Should print 5 5
10 10 $ Should print 10 10
5 5 $ Should print 5 5
25 25 $ Should print 25 25
5 5 $ Should print 5 5
3125 3125 $ Should print 3125 3125
5 3125 3125 $ Should print 5 3125 3125
Test trigonometric functions (radians)
3.141592654 3.141592654 3.141592654 $ Three values of pi
0.7071067812 4.440892099e-16 $ sin(pi/4)
0.7071067812 0 $ cos(pi/4)
1 0 $ tan(pi/4)
Test trigonometric functions (degrees)
180 180 180
0.7071067812 2.842170943e-14 $ sin(180/4)
0.7071067812 0 $ cos(180/4)
1 0 $ tan(180/4)
Test max, min, sign, dim, abs
0.5 -1 $ Should be 0.5, -1
1 -0.5 $ Should be 1.0, -0.5
0 1 $ Should be 0 1
1 0 $ Should be 1 0
1 0 $ Should be 1 0
$ Test ifdef lines
1 0
This line should be echoed. (a)
This line should be echoed. (b)
This line should be echoed. (c)
This line should be echoed. (d)
$ Test if - else lines
This line should be echoed. (1)
This line should be echoed (4)
$ Test if - else lines
This line should be echoed (6)
This line should be echoed. (7)
$ Lines a, b, c, d, 1, 4, 6, 7 should be echoed
$ Check line counting -- should be on line 74:
$ Test int and [] (shortcut for int)
5 -5
5 -5
$ Test looping - print sin, cos from 0 to 90 by 5
-5
0 0 1 1
5 0.08715574275 0.9961946981 1
10 0.1736481777 0.984807753 1
15 0.2588190451 0.9659258263 1
20 0.3420201433 0.9396926208 1
25 0.4226182617 0.906307787 1
30 0.5 0.8660254038 1
35 0.5735764364 0.8191520443 1
40 0.6427876097 0.7660444431 1
45 0.7071067812 0.7071067812 1
50 0.7660444431 0.6427876097 1
55 0.8191520443 0.5735764364 1
60 0.8660254038 0.5 1
65 0.906307787 0.4226182617 1
70 0.9396926208 0.3420201433 1
75 0.9659258263 0.2588190451 1
80 0.984807753 0.1736481777 1
85 0.9961946981 0.08715574275 1
90 1 6.123233996e-17 1
$$$$ Test formatting and string concatenation
0 %.10g
1 Using the format %.1g, PI = 3
2 Using the format %.2g, PI = 3.1
3 Using the format %.3g, PI = 3.14
4 Using the format %.4g, PI = 3.142
5 Using the format %.5g, PI = 3.1416
6 Using the format %.6g, PI = 3.14159
7 Using the format %.7g, PI = 3.141593
8 Using the format %.8g, PI = 3.1415927
9 Using the format %.9g, PI = 3.14159265
10 Using the format %.10g, PI = 3.141592654
11 Using the format %.11g, PI = 3.1415926536
12 Using the format %.12g, PI = 3.14159265359
13 Using the format %.13g, PI = 3.14159265359
14 Using the format %.14g, PI = 3.1415926535898
15 Using the format %.15g, PI = 3.14159265358979
16 Using the format %.16g, PI = 3.141592653589793
17 Using the format %.17g, PI = 3.1415926535897931
18 Using the format %.18g, PI = 3.14159265358979312
19 Using the format %.19g, PI = 3.141592653589793116
20 Using the format %.20g, PI = 3.141592653589793116
Reset format to default: %.10g
$$$$ Test string rescanning and executing
Original String:
This is line 1: {a = atan2(0,-1)}
This is line 2: {sin(a/4)}
This is line 3: {cos(a/4)}
Rescanned String:
This is line 1: 3.141592654
This is line 2: 0.7071067812
This is line 3: 0.7071067812
Original String:
This has an embedded string: {T = "This is a string"}
Print Value of variable T = 0
Rescanned String:
This has an embedded string: This is a string
Print Value of variable T = This is a string
Original String: atan2(0,-1)
Executed String: 3.141592654
string = one two, three
delimiter " ,"
word count = 3
second word = "two"
string = (one two, three * four - five
delimiter " ,(*-"
word count = 5
second word = "two"
string = one two, three
delimiter " ,"
word count = 3
0
word 1 = "one"
word 2 = "two"
word 3 = "three"
$ Check parsing of escaped braces...
\{ int a = b + 1.570796327 \}
\{ \}
\end{apout}