Compare commits
769
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
088ef1b667 | ||
|
|
ad21b3e8fc | ||
|
|
82f75c3a05 | ||
|
|
4fba9c2575 | ||
|
|
916ed1b2c3 | ||
|
|
acaf6ad484 | ||
|
|
e20e323ea5 | ||
|
|
3e9a86cecf | ||
|
|
da7b500db5 | ||
|
|
7cfb879a17 | ||
|
|
9e4e3b2e10 | ||
|
|
3b4a080565 | ||
|
|
83de2dfd76 | ||
|
|
58b708713f | ||
|
|
3a977fb925 | ||
|
|
b1e2aaf09d | ||
|
|
004e664f18 | ||
|
|
2ad5a65e02 | ||
|
|
f9e7fb2bd7 | ||
|
|
4987e1132a | ||
|
|
1bb9998b13 | ||
|
|
41205ed92f | ||
|
|
31ff80a137 | ||
|
|
e17a73fa8b | ||
|
|
338a4767c2 | ||
|
|
7fe4b57a62 | ||
|
|
f2b71d807f | ||
|
|
5b8ae39c88 | ||
|
|
da43f83a1d | ||
|
|
d2f4e745e2 | ||
|
|
634d9431d8 | ||
|
|
79cddce644 | ||
|
|
5e6dabb3c8 | ||
|
|
903d51e78f | ||
|
|
83cef85c1d | ||
|
|
ffaa2ed259 | ||
|
|
6a2d288ece | ||
|
|
7bf1c95e26 | ||
|
|
62182060e9 | ||
|
|
d44aa186d2 | ||
|
|
3fd08ddc67 | ||
|
|
1a0976dc17 | ||
|
|
fde408ec95 | ||
|
|
9776ebe890 | ||
|
|
63c03920b3 | ||
|
|
56059b4672 | ||
|
|
2b14832192 | ||
|
|
8d6669b83f | ||
|
|
91e47a804f | ||
|
|
4e22e0f772 | ||
|
|
605a535c0f | ||
|
|
884abe71b5 | ||
|
|
9807f9dba6 | ||
|
|
61cce4d4bc | ||
|
|
ced7c47558 | ||
|
|
bb55232c49 | ||
|
|
87f86d45c9 | ||
|
|
144635c3d8 | ||
|
|
3c674d72fd | ||
|
|
1dd1300812 | ||
|
|
fba0fd6187 | ||
|
|
f8fdf24246 | ||
|
|
f015b94c89 | ||
|
|
ede020977c | ||
|
|
b92d1d37ba | ||
|
|
9dd9189563 | ||
|
|
6beb052e86 | ||
|
|
25f8e3f3f4 | ||
|
|
92ab0429f2 | ||
|
|
9a9c29e03f | ||
|
|
7c9bf81d17 | ||
|
|
f94b099e40 | ||
|
|
777c6d98f7 | ||
|
|
367503651e | ||
|
|
03f2898985 | ||
|
|
6ca447ec36 | ||
|
|
493c8b1e63 | ||
|
|
7724bdf9c4 | ||
|
|
7e72e7f559 | ||
|
|
ddba68f2be | ||
|
|
8f601776cd | ||
|
|
9457962d33 | ||
|
|
560697884d | ||
|
|
eb578c55a0 | ||
|
|
9fa65e6412 | ||
|
|
f3c2fae804 | ||
|
|
ea81393011 | ||
|
|
7b6ddb6227 | ||
|
|
72bd63a556 | ||
|
|
7f40802a83 | ||
|
|
04983d747e | ||
|
|
795c758dd4 | ||
|
|
94f7568165 | ||
|
|
c8e0a5ae00 | ||
|
|
f1eb664f58 | ||
|
|
7934db1a9c | ||
|
|
34cc491b19 | ||
|
|
6d2680cde6 | ||
|
|
ff6bfe3808 | ||
|
|
9be3b415aa | ||
|
|
b7557d4664 | ||
|
|
6d9f041bc7 | ||
|
|
562434aabb | ||
|
|
e8d7299091 | ||
|
|
8499dee89d | ||
|
|
4155b591a4 | ||
|
|
e8c31c884d | ||
|
|
e69f787149 | ||
|
|
ab7b1609a9 | ||
|
|
bc9f74fddd | ||
|
|
492133825a | ||
|
|
588548b13d | ||
|
|
3d0ffe65e4 | ||
|
|
721ee611c4 | ||
|
|
4cb8d2cbc1 | ||
|
|
7ca6676475 | ||
|
|
35cd561675 | ||
|
|
190c605bc1 | ||
|
|
a2ace42dc4 | ||
|
|
668a7cc3b9 | ||
|
|
bc3189d560 | ||
|
|
d13ea5fe0d | ||
|
|
beb5994616 | ||
|
|
7eea20baef | ||
|
|
572d447033 | ||
|
|
ae1a01df4b | ||
|
|
e3ad48d930 | ||
|
|
8eb9de562d | ||
|
|
1d66080c77 | ||
|
|
ccc5883cca | ||
|
|
bd9f831a0b | ||
|
|
93c8be74d3 | ||
|
|
7b39339fab | ||
|
|
14e3a3d2d7 | ||
|
|
0b6783959a | ||
|
|
c7118efe7e | ||
|
|
ea33141aae | ||
|
|
80fa382b53 | ||
|
|
125bafebc8 | ||
|
|
b270dc8323 | ||
|
|
ff43f75b5b | ||
|
|
a922078a11 | ||
|
|
797370ec97 | ||
|
|
46cc41c0c9 | ||
|
|
9306ffc841 | ||
|
|
2ae23b17d2 | ||
|
|
f90f1ac989 | ||
|
|
58ca57f0f3 | ||
|
|
0c31381de8 | ||
|
|
7277e0ad01 | ||
|
|
73a4ddfb61 | ||
|
|
c55788c526 | ||
|
|
ab4f2b0ffc | ||
|
|
3665a96d52 | ||
|
|
6262ac25b8 | ||
|
|
d5d51cee9b | ||
|
|
d2c885fd1d | ||
|
|
da3ad902f4 | ||
|
|
95fce28de1 | ||
|
|
d4c7a4bf0b | ||
|
|
367929f415 | ||
|
|
b560030f32 | ||
|
|
dd22e6bbf3 | ||
|
|
21fa41f0f6 | ||
|
|
0aa13c973b | ||
|
|
d4ce263c08 | ||
|
|
ec07fc2dbe | ||
|
|
ce7b66f5be | ||
|
|
fc3c0743ae | ||
|
|
684fbcb2e6 | ||
|
|
dec82f7046 | ||
|
|
195a77e959 | ||
|
|
81a359dc6d | ||
|
|
c20960c50a | ||
|
|
265006d59f | ||
|
|
26bfd8b757 | ||
|
|
e8fc6fcdb2 | ||
|
|
48469e8e10 | ||
|
|
2019606947 | ||
|
|
8bfa269825 | ||
|
|
d19ec0aad0 | ||
|
|
00227e56ad | ||
|
|
cfdc9322b3 | ||
|
|
cf694b4492 | ||
|
|
43cf4fb2f5 | ||
|
|
3b69137064 | ||
|
|
9032dd3c9a | ||
|
|
abe79bb2f3 | ||
|
|
264770d21f | ||
|
|
24cebb3b13 | ||
|
|
54bb55bc32 | ||
|
|
18994df30a | ||
|
|
daad02cbe3 | ||
|
|
559acc05fc | ||
|
|
36cd32306f | ||
|
|
c819aa09ad | ||
|
|
ba60c07379 | ||
|
|
f7ab960d24 | ||
|
|
0d6e920cc7 | ||
|
|
665d58bab6 | ||
|
|
52a3e70765 | ||
|
|
895b935807 | ||
|
|
6f9a5585c8 | ||
|
|
c95b1de846 | ||
|
|
4307149838 | ||
|
|
f065090fa7 | ||
|
|
10ce20447b | ||
|
|
6c6ac7ea6b | ||
|
|
2a1a3a33b4 | ||
|
|
877bae7623 | ||
|
|
a11f53ce43 | ||
|
|
eeb60aff40 | ||
|
|
6e9fb6abb0 | ||
|
|
251021cbe1 | ||
|
|
b74e81edc3 | ||
|
|
4f25a377b4 | ||
|
|
72003a06b1 | ||
|
|
eb5dd736f7 | ||
|
|
6c54949cb7 | ||
|
|
7095d4b7e0 | ||
|
|
556e55fc37 | ||
|
|
32793336bd | ||
|
|
40534e4f48 | ||
|
|
14808f8cab | ||
|
|
d1fb866651 | ||
|
|
e79074c938 | ||
|
|
7053c05338 | ||
|
|
a14ff8d866 | ||
|
|
4f3c122233 | ||
|
|
c3ea170328 | ||
|
|
cc9df02fe5 | ||
|
|
46c7a80c65 | ||
|
|
6b4f41f626 | ||
|
|
c8b9e434a5 | ||
|
|
c52ce95c6b | ||
|
|
481174fd4c | ||
|
|
5d5b483b6a | ||
|
|
696694f124 | ||
|
|
7b0c974fe8 | ||
|
|
b8ffb74c52 | ||
|
|
9b657d5303 | ||
|
|
9bd8f77f10 | ||
|
|
ba983bd37e | ||
|
|
203fe01f87 | ||
|
|
bdc5415de9 | ||
|
|
b1537b5648 | ||
|
|
357b925738 | ||
|
|
f168dfe1c7 | ||
|
|
030544c2d9 | ||
|
|
88c8b70b45 | ||
|
|
3af6c5bfb4 | ||
|
|
f049206f6c | ||
|
|
54125a350d | ||
|
|
38feeb08a4 | ||
|
|
aa2a8eb687 | ||
|
|
102f7833c7 | ||
|
|
65cf48ccc2 | ||
|
|
f4b7cc883c | ||
|
|
3b5986bcd4 | ||
|
|
da2fb88a17 | ||
|
|
110998255b | ||
|
|
e8382c0b75 | ||
|
|
ed6ea98bb8 | ||
|
|
4c96ac94ef | ||
|
|
9dc443e3d3 | ||
|
|
1218f51995 | ||
|
|
851d075a14 | ||
|
|
46d92466fa | ||
|
|
debea3cff7 | ||
|
|
15bc58dd2a | ||
|
|
200c906e3c | ||
|
|
d74316144e | ||
|
|
1ddbc1e719 | ||
|
|
0f828353da | ||
|
|
2b24600f82 | ||
|
|
fd809f84f8 | ||
|
|
b995f44a41 | ||
|
|
d791e2bf26 | ||
|
|
419aa43306 | ||
|
|
20086252cf | ||
|
|
fef3d1c3a3 | ||
|
|
e47d652a88 | ||
|
|
f9694c3c2b | ||
|
|
26a77da393 | ||
|
|
f1601bd24f | ||
|
|
3506544b42 | ||
|
|
132cd5d316 | ||
|
|
2bec165a83 | ||
|
|
3bc5c3f1f3 | ||
|
|
93349a068d | ||
|
|
f1cde22573 | ||
|
|
d372d76336 | ||
|
|
b11335c3ab | ||
|
|
b4d3473dab | ||
|
|
766d90c942 | ||
|
|
1fd822cfb5 | ||
|
|
2ecebf912f | ||
|
|
d144057b23 | ||
|
|
400e6fc422 | ||
|
|
d80c92ec54 | ||
|
|
4f059c1898 | ||
|
|
e9176049bf | ||
|
|
5cce8731af | ||
|
|
bed70d3ca9 | ||
|
|
7c0b8c3147 | ||
|
|
3dae180160 | ||
|
|
74813abf09 | ||
|
|
e3c83134f1 | ||
|
|
9f854aa078 | ||
|
|
bbac26bffe | ||
|
|
0d6d850e09 | ||
|
|
cb6fcfd39d | ||
|
|
a8589359d1 | ||
|
|
816985fe8e | ||
|
|
bd02a23e70 | ||
|
|
e59f42b926 | ||
|
|
b40d28ffc6 | ||
|
|
40a9f507e0 | ||
|
|
472ec2906c | ||
|
|
d78ee29349 | ||
|
|
b78036c2c4 | ||
|
|
f0dcf0bee0 | ||
|
|
c3a5b8e18f | ||
|
|
2c9d06fcff | ||
|
|
d7162db2aa | ||
|
|
06cc992b88 | ||
|
|
ea1e1dcec1 | ||
|
|
0c201f9ee3 | ||
|
|
c992559c18 | ||
|
|
91b97b617c | ||
|
|
1f3214d7c5 | ||
|
|
dc113bd29d | ||
|
|
1f67431608 | ||
|
|
a8880d7a57 | ||
|
|
db90716187 | ||
|
|
97ba008e3d | ||
|
|
b9626e8f2b | ||
|
|
6d815143b9 | ||
|
|
bd5007e868 | ||
|
|
25e9030b08 | ||
|
|
fbf6a27447 | ||
|
|
94b4f23664 | ||
|
|
aa5c29e7bd | ||
|
|
f948c724bc | ||
|
|
7b09c91564 | ||
|
|
bd52c083e6 | ||
|
|
9ff454b959 | ||
|
|
c0cbe38b48 | ||
|
|
6331f5c43d | ||
|
|
de88f554fd | ||
|
|
b4c143c40d | ||
|
|
57557479c6 | ||
|
|
2e0c5b927c | ||
|
|
9ff338c6e4 | ||
|
|
3ed45b3665 | ||
|
|
e79afa5508 | ||
|
|
c19c1284a5 | ||
|
|
e694c796f9 | ||
|
|
96a7752e86 | ||
|
|
5b334276a1 | ||
|
|
1e9c62eb8d | ||
|
|
723e2c2bbe | ||
|
|
c9dd7fc319 | ||
|
|
ce8a0cd527 | ||
|
|
bba10888d1 | ||
|
|
341064508e | ||
|
|
e269582dbe | ||
|
|
b3c6177292 | ||
|
|
75849bf3ea | ||
|
|
108eaa46f4 | ||
|
|
1259e95425 | ||
|
|
20b07c3ca2 | ||
|
|
450dc4cd8b | ||
|
|
b6df5d2805 | ||
|
|
c6f0d84b31 | ||
|
|
3a8c0ddc5e | ||
|
|
5ebcda8f08 | ||
|
|
79fd394f71 | ||
|
|
960ba8a8c2 | ||
|
|
3309520ed6 | ||
|
|
ddda86a6d0 | ||
|
|
057b688116 | ||
|
|
4bfdd59ac5 | ||
|
|
893b127aed | ||
|
|
d7f0640204 | ||
|
|
a47d70cfba | ||
|
|
1e100b3f26 | ||
|
|
7e8ac2f1d1 | ||
|
|
550f8b1844 | ||
|
|
72c52af4c3 | ||
|
|
196a193224 | ||
|
|
8e21f7f5d0 | ||
|
|
cb2166b786 | ||
|
|
82815d2cf4 | ||
|
|
761a9269c2 | ||
|
|
2fc7eb39ab | ||
|
|
1faf3f3073 | ||
|
|
3bf8a815b5 | ||
|
|
3b55f92b78 | ||
|
|
62b33689a5 | ||
|
|
6d8f70ba57 | ||
|
|
bfdf9efe31 | ||
|
|
523cc56fe3 | ||
|
|
cad5015b15 | ||
|
|
eea8eb2185 | ||
|
|
8847515e10 | ||
|
|
77e891594c | ||
|
|
9e463e651f | ||
|
|
550013e3ca | ||
|
|
ca3153c960 | ||
|
|
22a2ff788b | ||
|
|
cd66c1dd39 | ||
|
|
eaa31ad517 | ||
|
|
0f0883c8c0 | ||
|
|
b924ac4518 | ||
|
|
59600de4e2 | ||
|
|
0249dcf7d5 | ||
|
|
639a30c5fd | ||
|
|
4ff1f83372 | ||
|
|
370552b3e2 | ||
|
|
ed24bda6ba | ||
|
|
7442982ac5 | ||
|
|
df73fff427 | ||
|
|
40e07a61c3 | ||
|
|
e068bd6883 | ||
|
|
abd5c313d9 | ||
|
|
4dd0799db8 | ||
|
|
d949c58e7d | ||
|
|
11131bf004 | ||
|
|
9d7b9e47fb | ||
|
|
aa98b92e8c | ||
|
|
8d4948dc74 | ||
|
|
bf0b2be104 | ||
|
|
959cd13211 | ||
|
|
76b79f5b0f | ||
|
|
3466f991ca | ||
|
|
0c111ee4e1 | ||
|
|
e4f26fa252 | ||
|
|
955b1a8e78 | ||
|
|
e684c8d7bf | ||
|
|
0290cdf39f | ||
|
|
e785777248 | ||
|
|
577399cb45 | ||
|
|
3583cd8a83 | ||
|
|
0c087abe42 | ||
|
|
396969db0d | ||
|
|
dd3991a0fc | ||
|
|
ff7ed2efc6 | ||
|
|
d525f0a730 | ||
|
|
58f8873b73 | ||
|
|
5feae230e2 | ||
|
|
cd7e2dcb4c | ||
|
|
51ba4a9e13 | ||
|
|
ecfc2b1360 | ||
|
|
7658cbb6d4 | ||
|
|
90968146bb | ||
|
|
7d1b1c51d3 | ||
|
|
c3e023deed | ||
|
|
b7952fb8ed | ||
|
|
6db10d2147 | ||
|
|
887788da68 | ||
|
|
be1d6582fc | ||
|
|
ee38e0bc9f | ||
|
|
39fd944dba | ||
|
|
1ace21502c | ||
|
|
7482db6bc0 | ||
|
|
3552fc6223 | ||
|
|
f950613551 | ||
|
|
1dcbb71b8a | ||
|
|
282f35f6e0 | ||
|
|
acafb9f51a | ||
|
|
91e027f3da | ||
|
|
14ffb48a7f | ||
|
|
adf023e004 | ||
|
|
1a3e725327 | ||
|
|
05381c7054 | ||
|
|
c0b2b60849 | ||
|
|
ff25ff7fc7 | ||
|
|
dbabb7b0f6 | ||
|
|
e67555245b | ||
|
|
e5629820e1 | ||
|
|
ebe26c548c | ||
|
|
d8c6edeb4a | ||
|
|
8ebd1614a3 | ||
|
|
dd905c22a1 | ||
|
|
be0751c4d2 | ||
|
|
3dc412dcc0 | ||
|
|
8a82a839bb | ||
|
|
22af5c49f3 | ||
|
|
0e0a2b1611 | ||
|
|
5ebce1f5e0 | ||
|
|
a88beec11e | ||
|
|
f46f27daac | ||
|
|
0824833e35 | ||
|
|
f03324b804 | ||
|
|
4884209327 | ||
|
|
54c5582fbd | ||
|
|
0792af6c3e | ||
|
|
8aacc088ea | ||
|
|
76aeca77bd | ||
|
|
fd809e44b5 | ||
|
|
5d466d9583 | ||
|
|
4eb307758e | ||
|
|
996842cb94 | ||
|
|
4d3b1fab9a | ||
|
|
e50bf78531 | ||
|
|
14143faa88 | ||
|
|
8a87fbffde | ||
|
|
fa3ded8e1a | ||
|
|
d73d29508b | ||
|
|
b8fb486ba5 | ||
|
|
eb651cd3fc | ||
|
|
3d62128f3a | ||
|
|
b79d47eb93 | ||
|
|
30f623bdad | ||
|
|
a7e2df44c6 | ||
|
|
4a4ed4c0c3 | ||
|
|
7b2e60490d | ||
|
|
0715efbaf9 | ||
|
|
0cdd280bb4 | ||
|
|
ce12d07d38 | ||
|
|
37757faaae | ||
|
|
ca14e8054a | ||
|
|
a0dec4d0fb | ||
|
|
787efc1f52 | ||
|
|
4a3c6794a0 | ||
|
|
c77e3318e9 | ||
|
|
59afdb57fc | ||
|
|
b1112870d1 | ||
|
|
954c5b7f04 | ||
|
|
7f515c1031 | ||
|
|
e48992b6e3 | ||
|
|
055efbad50 | ||
|
|
81e8551911 | ||
|
|
55fc5f2536 | ||
|
|
2886d5b08f | ||
|
|
612c828cf3 | ||
|
|
8c4a3a7bf5 | ||
|
|
e472854dd0 | ||
|
|
b6b5e5f53e | ||
|
|
3e4784271a | ||
|
|
fb1d5b98dd | ||
|
|
55b058e498 | ||
|
|
601f1cfbfa | ||
|
|
1acffab78f | ||
|
|
6f2aebc7bb | ||
|
|
66fbfd2a41 | ||
|
|
da6de9371a | ||
|
|
a7efad3e4a | ||
|
|
0afab1d564 | ||
|
|
401a66040c | ||
|
|
93525246b0 | ||
|
|
d0661f2302 | ||
|
|
acacabd432 | ||
|
|
91615ed76b | ||
|
|
bd790b1996 | ||
|
|
d501e8c9f3 | ||
|
|
a818788468 | ||
|
|
15e3c5f821 | ||
|
|
50f8519818 | ||
|
|
79f2e1bd05 | ||
|
|
3d052b07a6 | ||
|
|
75f47a3deb | ||
|
|
f91d406ce3 | ||
|
|
d9e12f8c7e | ||
|
|
f212f83a13 | ||
|
|
56ebcb4016 | ||
|
|
7e89151592 | ||
|
|
878338b1a5 | ||
|
|
bba14e664e | ||
|
|
67da6e2d30 | ||
|
|
99e3fccd32 | ||
|
|
b0987500a4 | ||
|
|
d363dd71d4 | ||
|
|
b90140c46f | ||
|
|
386e342e68 | ||
|
|
78a1b093fe | ||
|
|
8d1a5dfa31 | ||
|
|
31ac08e6f2 | ||
|
|
1e76ed107a | ||
|
|
e09f9d8128 | ||
|
|
ec4fcba705 | ||
|
|
e4eb8aa6df | ||
|
|
1f4ead94a3 | ||
|
|
179fc91a55 | ||
|
|
4037e17135 | ||
|
|
67e8010987 | ||
|
|
48dd20d2e8 | ||
|
|
33427e3bcd | ||
|
|
f291244bc1 | ||
|
|
1a41951843 | ||
|
|
e090a781a2 | ||
|
|
b62a60837a | ||
|
|
2767704cc6 | ||
|
|
c94be388e1 | ||
|
|
37ddcfe14d | ||
|
|
37686b0321 | ||
|
|
0958ac8644 | ||
|
|
293687453e | ||
|
|
67401330d9 | ||
|
|
dce6ebf20d | ||
|
|
253e1dc320 | ||
|
|
15b684fe21 | ||
|
|
1bd99fd5dc | ||
|
|
165dea0c66 | ||
|
|
473240f1c2 | ||
|
|
bb0cae0619 | ||
|
|
6d1a1a19fe | ||
|
|
6601d3757b | ||
|
|
5252b05a79 | ||
|
|
de5c1c376b | ||
|
|
12c109f9e9 | ||
|
|
1007624ddb | ||
|
|
d65e45277b | ||
|
|
4824b02b48 | ||
|
|
ddecdf017f | ||
|
|
25e5327b6a | ||
|
|
c4fe5bcde1 | ||
|
|
dbf8797f2c | ||
|
|
7763533785 | ||
|
|
d5874e20e5 | ||
|
|
56dd3dd069 | ||
|
|
761854a143 | ||
|
|
4e3f26c602 | ||
|
|
caeae60c12 | ||
|
|
cfe0e0063f | ||
|
|
d0cecfba52 | ||
|
|
0545862005 | ||
|
|
ef17fa07e9 | ||
|
|
8bf859381b | ||
|
|
dcebaab1ab | ||
|
|
132dd9724d | ||
|
|
e7f24c66f9 | ||
|
|
53f4b0423e | ||
|
|
f19fafe71b | ||
|
|
8adf1bf29c | ||
|
|
a0b21e9ec0 | ||
|
|
bae718680d | ||
|
|
f0b59a7371 | ||
|
|
75c6486cdc | ||
|
|
134f97c0d8 | ||
|
|
5caeea07a0 | ||
|
|
590c0d7f6a | ||
|
|
7eaf351332 | ||
|
|
0edcb4a6d6 | ||
|
|
cbb2b2b272 | ||
|
|
35fc235ace | ||
|
|
d1a87f25d9 | ||
|
|
7518b5ce9d | ||
|
|
07158b29f6 | ||
|
|
6cfc1081d8 | ||
|
|
6079f4674a | ||
|
|
20d6e495ac | ||
|
|
8a5a250204 | ||
|
|
e5c7383441 | ||
|
|
41e6d31236 | ||
|
|
a22eeeab5a | ||
|
|
e60e51db39 | ||
|
|
e17ee11dc1 | ||
|
|
4f00b2d6bb | ||
|
|
eba6d4805b | ||
|
|
3e20045b56 | ||
|
|
fb9921fac2 | ||
|
|
dd94a5ce4a | ||
|
|
77d0d01dd0 | ||
|
|
ca56e2e6b5 | ||
|
|
9793b393c5 | ||
|
|
1f58383468 | ||
|
|
c72ecf9a9c | ||
|
|
a3f7b4ab02 | ||
|
|
9dbde39b0c | ||
|
|
e5e80bb3a3 | ||
|
|
3e7da90620 | ||
|
|
2b296192ff | ||
|
|
032176f5c4 | ||
|
|
1cc14aa4d8 | ||
|
|
40c658b74f | ||
|
|
6df61f337e | ||
|
|
487975f952 | ||
|
|
90c123811e | ||
|
|
e8ecc20a2f | ||
|
|
92d334277e | ||
|
|
3ff130cd91 | ||
|
|
c911b598e4 | ||
|
|
6a236ada82 | ||
|
|
d6ebac09c6 | ||
|
|
6e443353df | ||
|
|
aa754254f1 | ||
|
|
c9c6db3ef8 | ||
|
|
fd356bcce7 | ||
|
|
916f400575 | ||
|
|
787607a273 | ||
|
|
c989798981 | ||
|
|
523a7cb9e2 | ||
|
|
25b828001d | ||
|
|
e234a6da94 | ||
|
|
191a1fa470 | ||
|
|
ccb36621f7 | ||
|
|
c8cee31d33 | ||
|
|
5956e157c1 | ||
|
|
00069e5914 | ||
|
|
be198061ce | ||
|
|
f5558d5054 | ||
|
|
981629fac6 | ||
|
|
482378c7ec | ||
|
|
cb7e52fcba | ||
|
|
e9f0bd9489 | ||
|
|
0e53b4ba9b | ||
|
|
70dab69198 | ||
|
|
55a3f13bfd | ||
|
|
10ac646d18 | ||
|
|
4e768e68e2 | ||
|
|
29c3baaea4 | ||
|
|
201c51b7d1 | ||
|
|
81b041567b | ||
|
|
d7385c0db4 | ||
|
|
ef7fcf7576 | ||
|
|
344ee2f115 | ||
|
|
ec36b397b0 | ||
|
|
bec7973784 | ||
|
|
b0aa25c996 | ||
|
|
8aa2941b55 | ||
|
|
bb80432cd1 | ||
|
|
7a8deac838 | ||
|
|
56ac6ec435 | ||
|
|
bf37988ec6 | ||
|
|
16bacad76b | ||
|
|
a92e32e388 | ||
|
|
d9791934f8 | ||
|
|
d2cf23afde | ||
|
|
2b541c5e12 | ||
|
|
118e2fd469 | ||
|
|
82f591d2df | ||
|
|
9e294fc98c | ||
|
|
aaa7fc536c | ||
|
|
1d3cbc5871 | ||
|
|
60ed92ab5a | ||
|
|
5560d92fab | ||
|
|
36650e8833 | ||
|
|
5dd5511fdd | ||
|
|
7ff222b79d | ||
|
|
72e42566a9 | ||
|
|
66e1b3641c | ||
|
|
c790490f91 | ||
|
|
4f34a3b696 | ||
|
|
9dfe4dc6f4 | ||
|
|
7474b3deb9 | ||
|
|
325479260c | ||
|
|
6ca81275dc | ||
|
|
00baeb86c3 | ||
|
|
54d850bbe1 | ||
|
|
c375afe382 | ||
|
|
3102f164d6 | ||
|
|
04acee1f28 | ||
|
|
71d87aa1f2 | ||
|
|
bcfe52d498 | ||
|
|
a8d474f3f6 | ||
|
|
6143572d6a | ||
|
|
f0a41dd3d6 | ||
|
|
02b65854c2 | ||
|
|
ffea082dc9 | ||
|
|
9d79904c50 | ||
|
|
eb2017b5b5 | ||
|
|
a881380de7 | ||
|
|
3893845102 | ||
|
|
ca1e273afc | ||
|
|
7694a8e18f | ||
|
|
f158b615c0 | ||
|
|
b69699c133 |
+26
@@ -45,6 +45,8 @@ examples/ex[1-9]
|
||||
examples/ex[1-9]p
|
||||
examples/ex1[04-9]
|
||||
examples/ex1[0-9]p
|
||||
examples/ex2[0-9]
|
||||
examples/ex2[0-9]p
|
||||
|
||||
examples/refined.mesh
|
||||
examples/displaced.mesh
|
||||
@@ -76,6 +78,13 @@ examples/vortex-?-init.*
|
||||
examples/vortex-?-final.*
|
||||
examples/deformation.*
|
||||
examples/pressure.*
|
||||
examples/ex20.dat
|
||||
examples/ex20p_?????.dat
|
||||
examples/gnuplot_ex20.inp
|
||||
examples/gnuplot_ex20p.inp
|
||||
examples/ex22*.mesh
|
||||
examples/ex22*.sol
|
||||
examples/ex22p_*.*
|
||||
|
||||
examples/sundials/ex9
|
||||
examples/sundials/ex1[06]
|
||||
@@ -112,6 +121,15 @@ examples/petsc/deformed.*
|
||||
examples/petsc/velocity.*
|
||||
examples/petsc/elastic_energy.*
|
||||
|
||||
examples/pumi/ex1
|
||||
examples/pumi/ex[126]p
|
||||
|
||||
examples/pumi/refined.mesh
|
||||
examples/pumi/sol.gf
|
||||
examples/pumi/mesh.*
|
||||
examples/pumi/sol.*
|
||||
examples/pumi/displaced.mesh
|
||||
|
||||
miniapps/electromagnetics/volta
|
||||
miniapps/electromagnetics/tesla
|
||||
miniapps/electromagnetics/maxwell
|
||||
@@ -124,16 +142,20 @@ miniapps/electromagnetics/Joule_*
|
||||
|
||||
miniapps/meshing/mobius-strip
|
||||
miniapps/meshing/klein-bottle
|
||||
miniapps/meshing/toroid
|
||||
miniapps/meshing/mesh-explorer
|
||||
miniapps/meshing/shaper
|
||||
miniapps/meshing/extruder
|
||||
miniapps/meshing/mesh-optimizer
|
||||
miniapps/meshing/pmesh-optimizer
|
||||
|
||||
miniapps/meshing/mobius-strip.mesh
|
||||
miniapps/meshing/klein-bottle.mesh
|
||||
miniapps/meshing/toroid-*.mesh
|
||||
miniapps/meshing/mesh-explorer.mesh
|
||||
miniapps/meshing/partitioning.txt
|
||||
miniapps/meshing/shaper.mesh
|
||||
miniapps/meshing/extruder.mesh
|
||||
miniapps/meshing/optimized*
|
||||
miniapps/meshing/perturbed*
|
||||
|
||||
@@ -156,3 +178,7 @@ miniapps/nurbs/mesh.*
|
||||
miniapps/nurbs/sol.*
|
||||
miniapps/nurbs/mode_*
|
||||
miniapps/nurbs/Example1*
|
||||
|
||||
# Unit test binary and outputs
|
||||
tests/unit/output_meshes
|
||||
tests/unit/unit_tests
|
||||
|
||||
@@ -8,11 +8,126 @@
|
||||
http://mfem.org
|
||||
|
||||
|
||||
Version 3.3.3 (development)
|
||||
Version 3.4.1 (development)
|
||||
===========================
|
||||
|
||||
More efficient non-conforming adaptive mesh refinement
|
||||
------------------------------------------------------
|
||||
Support for wedge elements and meshes with mixed element types
|
||||
--------------------------------------------------------------
|
||||
- Added support for wedge shaped mesh elements of arbitrary order (with Geometry
|
||||
type PRISM) which have two triangular faces and three quadrilateral faces.
|
||||
Several examples of such meshes can be found in the data/ directory.
|
||||
|
||||
- Added H1 and L2 finite elements of arbitrary order for Wedge elements.
|
||||
|
||||
- Added support for mixed meshes containing triangles and quadrilaterals in 2D
|
||||
or tetrahedra, wedges, and hexahedra in 3D. This includes support for uniform
|
||||
refinement of such meshes. Several examples of such meshes can be found in the
|
||||
data/ directory.
|
||||
|
||||
- Added support for reading and writing linear and quadratic meshes containing
|
||||
wedge elements in VTK mesh format. Several examples of such meshes can be
|
||||
found in the data/ directory.
|
||||
|
||||
Other meshing improvements
|
||||
--------------------------
|
||||
- Improved the uniform refinement of tetrahedral meshes (also part of the
|
||||
uniform refinement of mixed 3D meshes). The previous refinement algorithm is
|
||||
still available as an option in Mesh::UniformRefinement. Both can be used in
|
||||
the updated Mesh Explorer miniapp.
|
||||
|
||||
- The local tetrahedral mesh refinement algorithm in serial and in parallel now
|
||||
follows precisely the paper:
|
||||
|
||||
D. Arnold, A. Mukherjee, and L. Pouly, "Locally Adapted Tetrahedral Meshes
|
||||
Using Bisection", SIAM J. Sci. Comput., 22(2), 431–448.
|
||||
|
||||
This guarantees that the shape regularity of the elements will be preserved
|
||||
under refinement.
|
||||
|
||||
- Added support for parallel communication groups on non-conforming meshes.
|
||||
|
||||
- A boundary in a NURBS mesh can now be connected with another boundary. Such a
|
||||
periodic NURBS mesh is a simple way to impose periodic boundary conditions.
|
||||
|
||||
- Added support for reading linear and quadratic 2D quadrilateral and triangular
|
||||
Cubit meshes.
|
||||
|
||||
- The TMOP mesh optimization algorithms were extended to support user-defined
|
||||
space-dependent limiting terms. Improved the TMOP objective functions by
|
||||
more accurate normalization of the different terms.
|
||||
|
||||
Discretization improvements
|
||||
---------------------------
|
||||
- Added support for derefinement of vector (RT + ND) spaces.
|
||||
|
||||
- Added element flux, and flux energy computation in class ElasticityIntegrator,
|
||||
allowing for the use of Zienkiewicz-Zhu type error estimators with the
|
||||
integrator. For an illustration of this addition, see the new Example 22.
|
||||
|
||||
- Added a variety of coefficients which are sums or products of existing
|
||||
coefficients as well as grid function coefficients which return the
|
||||
divergence, gradient, or curl of their GridFunctions.
|
||||
|
||||
New and improved solvers and preconditioners
|
||||
--------------------------------------------
|
||||
- Added support for parallel ILU preconditioning via hypre's Euclid solver.
|
||||
|
||||
New and updated examples and miniapps
|
||||
-------------------------------------
|
||||
- Added a new meshing miniapp, Toroid, which can produce a variety of torus
|
||||
shaped meshes by twisting a stack of wedges or hexahedra.
|
||||
|
||||
- Added a new meshing miniapp, Extruder, that demonstrates the capability to
|
||||
produce 3D meshes by extruding 2D meshes.
|
||||
|
||||
- Added a new example, Example 20/20p, that solves a system of 1D ODEs derived
|
||||
from a Hamiltonian. The example demonstrates the use of the variable order,
|
||||
symplectic integration algorithm implemented in class SIAVSolver.
|
||||
|
||||
- Added a new example, Example 22/22p, that illustrates the use of AMR to solve
|
||||
a linear elasticity problem. This is an extension of Example 2/2p.
|
||||
|
||||
Miscellaneous
|
||||
-------------
|
||||
- Added unit tests based on the Catch++ library.
|
||||
|
||||
- Altered the way FGMRES counts its iterations so that it matches GMRES.
|
||||
|
||||
- Various other simplifications, extensions, and bugfixes in the code.
|
||||
|
||||
API changes
|
||||
-----------
|
||||
- In multiple places, use Geometry::Type instead of int, where appropriate.
|
||||
- In multiple places, use Element::Type instead of int, where appropriate.
|
||||
- The Mesh methods GetElementBaseGeometry and GetBdrElementBaseGeometry no
|
||||
longer have a default value for their parameter, they only work with an
|
||||
explicitly given index.
|
||||
- In class Mesh, added methods useful for queries regarding the types of
|
||||
elements present in the mesh: HasGeometry, GetNumGeometries, GetGeometries,
|
||||
and class Mesh::GeometryList.
|
||||
- The struct CoarseFineTransformations (returned by the Mesh method
|
||||
GetRefinementTransforms) now stores the embedding matrices separately for each
|
||||
Geometry::Type.
|
||||
- In class ParMesh, replaced the method GroupNFaces with two new methods:
|
||||
GroupNTriangles and GroupNQuadrilaterals. Also, replaced GroupFace with two
|
||||
methods: GroupTriangle and GroupQuadrilateral.
|
||||
- In class ParMesh, made the two RefineGroups methods protected.
|
||||
- Removed the virtual method Element::GetRefinementFlag, it is only used by the
|
||||
derived class Tetrahedron.
|
||||
- Added new methods: Array::CopyTo, Tetrahedron::Init.
|
||||
|
||||
|
||||
Version 3.4, released on May 29, 2018
|
||||
=====================================
|
||||
|
||||
More general and efficient mesh adaptivity
|
||||
------------------------------------------
|
||||
- Added support for PUMI, the Parallel Unstructured Mesh Infrastructure from
|
||||
https://scorec.rpi.edu/pumi. PUMI is an unstructured, distributed mesh data
|
||||
management system that is capable of handling general non-manifold models and
|
||||
effectively supports automated adaptive analysis. PUMI enables for the first
|
||||
time support for parallel unstructured modifications of MFEM meshes.
|
||||
|
||||
- Significantly reduced MPI communication in the construction of the parallel
|
||||
prolongation matrix in ParFiniteElementSpace, for much improved parallel
|
||||
scaling of non-conforming AMR on hundreds of thousands of MPI tasks. The
|
||||
@@ -81,6 +196,11 @@ New and updated examples and miniapps
|
||||
NURBS meshes in the miniapps/nurbs directory. Currently the directory contains
|
||||
variable order NURBS versions of examples 1, 1p and 11p.
|
||||
|
||||
- Added PUMI versions of examples ex1, ex1p, ex2 and ex6p in a new examples/pumi
|
||||
directory. The new examples demonstrate the PUMI APIs for parallel and serial
|
||||
mesh loading (ex1 and ex1p), applying BCs using classification (ex2), and
|
||||
performing parallel mesh adaptation (ex6p).
|
||||
|
||||
- Added two new miniapps related to DataCollection I/O in miniapps/tools:
|
||||
load-dc.cpp can be used to visualize fields saved via DataCollection classes;
|
||||
convert-dc.cpp demonstrates how to convert between MFEM's different concrete
|
||||
|
||||
+33
-8
@@ -45,7 +45,7 @@ project(mfem NONE)
|
||||
# Current version of MFEM, see also `makefile`.
|
||||
# mfem_VERSION = (string)
|
||||
# MFEM_VERSION = (int) [automatically derived from mfem_VERSION]
|
||||
set(${PROJECT_NAME}_VERSION 3.3.3)
|
||||
set(${PROJECT_NAME}_VERSION 3.4.1)
|
||||
|
||||
# Prohibit in-source build
|
||||
if (${PROJECT_SOURCE_DIR} STREQUAL ${PROJECT_BINARY_DIR})
|
||||
@@ -139,7 +139,7 @@ if (MFEM_USE_MPI)
|
||||
set(PETSC_INCLUDE_DIRS ${PETSC_INCLUDES})
|
||||
endif()
|
||||
else()
|
||||
set(PKGS_NEED_MPI SUPERLU PETSC STRUMPACK)
|
||||
set(PKGS_NEED_MPI SUPERLU PETSC STRUMPACK PUMI)
|
||||
foreach(PKG IN LISTS PKGS_NEED_MPI)
|
||||
if (MFEM_USE_${PKG})
|
||||
message(STATUS "Disabling package ${PKG} - requires MPI")
|
||||
@@ -246,6 +246,22 @@ if (MFEM_USE_SIDRE)
|
||||
find_package(Axom REQUIRED Sidre SLIC axom_utils)
|
||||
endif()
|
||||
|
||||
# PUMI
|
||||
if (MFEM_USE_PUMI)
|
||||
# If PUMI_DIR was specified, only link to that directory,
|
||||
# i.e. don't link to another installation in /usr/lib by mistake
|
||||
find_package(SCOREC 2.1.0 REQUIRED OPTIONAL_COMPONENTS gmi_sim
|
||||
CONFIG PATHS ${PUMI_DIR} NO_DEFAULT_PATH)
|
||||
if (SCOREC_FOUND)
|
||||
# Define a header file with the MFEM_USE_SIMMETRIX preprocessor variable
|
||||
set(MFEM_USE_SIMMETRIX ${SCOREC_gmi_sim_FOUND})
|
||||
set(PUMI_FOUND ${SCOREC_FOUND})
|
||||
get_target_property(PUMI_INCLUDE_DIRS
|
||||
SCOREC::apf INTERFACE_INCLUDE_DIRECTORIES)
|
||||
set(PUMI_LIBRARIES SCOREC::core)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# MFEM_TIMER_TYPE
|
||||
if (NOT DEFINED MFEM_TIMER_TYPE)
|
||||
if (APPLE)
|
||||
@@ -270,8 +286,8 @@ endif()
|
||||
# integers, the METIS header (with 32-bit indices, as used by mfem) needs to
|
||||
# be before SuiteSparse.
|
||||
set(MFEM_TPLS MPI_CXX OPENMP BLAS LAPACK METIS HYPRE SuiteSparse SUNDIALS PETSC
|
||||
MESQUITE SuperLUDist STRUMPACK AXOM CONDUIT GECKO GNUTLS NETCDF MPFR POSIXCLOCKS
|
||||
MFEMBacktrace ZLIB)
|
||||
MESQUITE SuperLUDist STRUMPACK AXOM CONDUIT GECKO GNUTLS NETCDF MPFR PUMI
|
||||
POSIXCLOCKS MFEMBacktrace ZLIB)
|
||||
# Add all *_FOUND libraries in the variable TPL_LIBRARIES.
|
||||
set(TPL_LIBRARIES "")
|
||||
set(TPL_INCLUDE_DIRS "")
|
||||
@@ -296,9 +312,6 @@ message(STATUS "MFEM build type: CMAKE_BUILD_TYPE = ${CMAKE_BUILD_TYPE}")
|
||||
message(STATUS "MFEM version: v${MFEM_VERSION_STRING}")
|
||||
message(STATUS "MFEM git string: ${MFEM_GIT_STRING}")
|
||||
|
||||
# Windows specific
|
||||
set(_USE_MATH_DEFINES ${WIN32})
|
||||
|
||||
#-------------------------------------------------------------------------------
|
||||
# Define and configure the MFEM library
|
||||
#-------------------------------------------------------------------------------
|
||||
@@ -372,6 +385,9 @@ endif()
|
||||
# Enable testing if required
|
||||
if (MFEM_ENABLE_TESTING)
|
||||
enable_testing()
|
||||
set(MFEM_ALL_TESTS_TARGET_NAME tests)
|
||||
add_mfem_target(${MFEM_ALL_TESTS_TARGET_NAME} OFF)
|
||||
add_subdirectory(tests EXCLUDE_FROM_ALL)
|
||||
endif()
|
||||
|
||||
# Define a target that all examples and miniapps will depend on.
|
||||
@@ -391,7 +407,9 @@ add_subdirectory(miniapps EXCLUDE_FROM_ALL)
|
||||
# Target to build all executables, i.e. everything.
|
||||
add_custom_target(exec)
|
||||
add_dependencies(exec
|
||||
${MFEM_ALL_EXAMPLES_TARGET_NAME} ${MFEM_ALL_MINIAPPS_TARGET_NAME})
|
||||
${MFEM_ALL_EXAMPLES_TARGET_NAME}
|
||||
${MFEM_ALL_MINIAPPS_TARGET_NAME}
|
||||
${MFEM_ALL_TESTS_TARGET_NAME})
|
||||
# Here, we want to "add_dependencies(test exec)". However, dependencies for
|
||||
# 'test' (and other built-in targets) can not be added with add_dependencies():
|
||||
# - https://gitlab.kitware.com/cmake/cmake/issues/8438
|
||||
@@ -527,3 +545,10 @@ install(FILES
|
||||
# Install the export set for use with the install-tree
|
||||
install(EXPORT ${PROJECT_NAME_UC}Targets
|
||||
DESTINATION ${INSTALL_CMAKE_DIR})
|
||||
|
||||
#-------------------------------------------------------------------------------
|
||||
# Create 'config.mk' from 'config.mk.in' for the build and install locations and
|
||||
# define install rules for 'config.mk' and 'test.mk'
|
||||
#-------------------------------------------------------------------------------
|
||||
|
||||
mfem_export_mk_files()
|
||||
|
||||
+114
-6
@@ -1,3 +1,15 @@
|
||||
<p align="center">
|
||||
<a href="http://mfem.org/"><img alt="mfem" src="http://mfem.org/img/logo-300.png"></a>
|
||||
</p>
|
||||
|
||||
<p align="center">
|
||||
<a href="https://github.com/mfem/mfem/blob/master/COPYRIGHT"><img alt="License" src="https://img.shields.io/badge/License-LGPL--2.1-brightgreen.svg"></a>
|
||||
<a href="https://travis-ci.org/mfem/mfem"><img alt="Build Status" src="https://travis-ci.org/mfem/mfem.svg?branch=master"></a>
|
||||
<a href="https://ci.appveyor.com/project/mfem/mfem"><img alt="Build Status" src="https://ci.appveyor.com/api/projects/status/19non9sqm6msi2wy?svg=true"></a>
|
||||
<a href="http://mfem.github.io/doxygen/html/index.html"><img alt="Doxygen" src="https://img.shields.io/badge/code-documented-brightgreen.svg"></a>
|
||||
</p>
|
||||
|
||||
|
||||
# How to Contribute
|
||||
|
||||
The MFEM team welcomes contributions at all levels: bugfixes; code
|
||||
@@ -16,6 +28,7 @@ See the [Quick Summary](#quick-summary) section for the main highlights of our
|
||||
GitHub workflow. For more details, consult the following sections and refer
|
||||
back to them before issuing pull requests:
|
||||
|
||||
- [Code Overview](#code-overview)
|
||||
- [GitHub Workflow](#github-workflow)
|
||||
- [MFEM Organization](#mfem-organization)
|
||||
- [New Feature Development](#new-feature-development)
|
||||
@@ -53,6 +66,102 @@ Origin](#developers-certificate-of-origin-11) at the end of this file.*
|
||||
- Don't hesitate to [contact us](#contact-information) if you have any questions.
|
||||
|
||||
|
||||
### Code Overview
|
||||
|
||||
- The MFEM library uses object-orient design principles which reflect, in code,
|
||||
the independent mathematical concepts of meshing, linear algebra and finite
|
||||
element spaces and operators.
|
||||
|
||||
- The MFEM source code has the following structure:
|
||||
```
|
||||
.
|
||||
├── config
|
||||
│ └── cmake
|
||||
│ └── modules
|
||||
├── data
|
||||
├── doc
|
||||
│ └── web
|
||||
│ └── examples
|
||||
├── examples
|
||||
│ ├── petsc
|
||||
│ ├── pumi
|
||||
│ └── sundials
|
||||
├── fem
|
||||
├── general
|
||||
├── linalg
|
||||
├── mesh
|
||||
├── miniapps
|
||||
│ ├── common
|
||||
│ ├── electromagnetics
|
||||
│ ├── meshing
|
||||
│ ├── nurbs
|
||||
│ ├── performance
|
||||
│ └── tools
|
||||
└── tests
|
||||
├── unit
|
||||
│ ├── ...
|
||||
└── ...
|
||||
|
||||
```
|
||||
|
||||
- The main directories are `fem/`, `mesh/` and `linalg/` containing the C++
|
||||
classes implementing the finite element, mesh and linear algebra concepts
|
||||
respectively.
|
||||
|
||||
- The main mesh classes are:
|
||||
+ [`Mesh`](http://mfem.github.io/doxygen/html/classmfem_1_1Mesh.html)
|
||||
+ [`NCMesh`](http://mfem.github.io/doxygen/html/classmfem_1_1NCMesh.html)
|
||||
+ [`Element`](http://mfem.github.io/doxygen/html/classmfem_1_1Element.html)
|
||||
+ [`ElementTransformation`](http://mfem.github.io/doxygen/html/classmfem_1_1ElementTransformation.html)
|
||||
|
||||
- The main finite element classes are:
|
||||
+ [`FiniteElement`](http://mfem.github.io/doxygen/html/classmfem_1_1FiniteElement.html)
|
||||
+ [`FiniteElementCollection`](http://mfem.github.io/doxygen/html/classmfem_1_1FiniteElement.html)
|
||||
+ [`FiniteElementSpace`](http://mfem.github.io/doxygen/html/classmfem_1_1FiniteElementSpace.html)
|
||||
+ [`GridFunction`](http://mfem.github.io/doxygen/html/classmfem_1_1GridFunction.html)
|
||||
+ [`BilinearFormIntegrator`](http://mfem.github.io/doxygen/html/classmfem_1_1BilinearFormIntegrator.html) and [`LinearFormIntegrator`](http://mfem.github.io/doxygen/html/classmfem_1_1LinearFormIntegrator.html)
|
||||
+ [`LinearForm`](http://mfem.github.io/doxygen/html/classmfem_1_1LinearFormIntegrator.html), [`BilinearForm`](http://mfem.github.io/doxygen/html/classmfem_1_1BilinearForm.html) and [`MixedBilinearForm`](http://mfem.github.io/doxygen/html/classmfem_1_1MixedBilinearForm.html)
|
||||
|
||||
- The main linear algebra classes and sources are
|
||||
+ [`Operator`](http://mfem.github.io/doxygen/html/classmfem_1_1Operator.html) and [`BilinearForm`](http://mfem.github.io/doxygen/html/classmfem_1_1BilinearForm.html)
|
||||
+ [`Vector`](http://mfem.github.io/doxygen/html/classmfem_1_1BilinearForm.html) and [`LinearForm`](http://mfem.github.io/doxygen/html/classmfem_1_1LinearForm.html)
|
||||
+ [`DenseMatrix`](http://mfem.github.io/doxygen/html/classmfem_1_1DenseMatrix.html) and [`SparseMatrix`](http://mfem.github.io/doxygen/html/classmfem_1_1SparseMatrix.html)
|
||||
+ Sparse [smoothers](http://mfem.github.io/doxygen/html/sparsesmoothers_8hpp.html) and linear [solvers](http://mfem.github.io/doxygen/html/solvers_8hpp.html)
|
||||
|
||||
- Parallel MPI objects in MFEM inherit their serial counterparts, so a parallel
|
||||
mesh for example is just a serial mesh on each task plus the information on
|
||||
shared geometric entities between different tasks. The parallel source files
|
||||
have a `p` prefix, e.g. `pmesh.cpp` vs. the serial `mesh.cpp`.
|
||||
|
||||
- The main parallel classes are
|
||||
+ [`ParMesh`](http://mfem.github.io/doxygen/html/solvers_8hpp.html)
|
||||
+ [`ParNCMesh`](http://mfem.github.io/doxygen/html/classmfem_1_1ParMesh.html)
|
||||
+ [`ParFiniteElementSpace`](http://mfem.github.io/doxygen/html/classmfem_1_1ParFiniteElementSpace.html)
|
||||
+ [`ParGridFunction`](http://mfem.github.io/doxygen/html/classmfem_1_1ParGridFunction.html)
|
||||
+ [`ParBilinearForm`](http://mfem.github.io/doxygen/html/classmfem_1_1ParBilinearForm.html) and [`ParLinearForm`](http://mfem.github.io/doxygen/html/classmfem_1_1ParLinearForm.html)
|
||||
+ [`HypreParMatrix`](http://mfem.github.io/doxygen/html/classmfem_1_1HypreParMatrix.html) and [`HypreParVector`](http://mfem.github.io/doxygen/html/classmfem_1_1HypreParVector.html)
|
||||
+ [`HypreSolver`](http://mfem.github.io/doxygen/html/classmfem_1_1HypreSolver.html) and other [hypre classes](http://mfem.github.io/doxygen/html/hypre_8hpp.html)
|
||||
|
||||
- The `general/` directory contains C++ classes that serve as utilities for
|
||||
communication, error handling, arrays, (Boolean) tables, timing, etc.
|
||||
|
||||
- The `config/` directory contains build-related files, both for the plain
|
||||
Makefile and the CMake build options.
|
||||
|
||||
- The `doc/` directory contains configuration for the Doxygen code documentation
|
||||
that can either be build locally, or browsed online at
|
||||
http://mfem.github.io/doxygen/html/index.html.
|
||||
|
||||
- The `data/` directory contains a collection of small mesh files, that are used
|
||||
in the simple example codes and more fully-featured mini applications in the
|
||||
`examples/` and `miniapps/` directories.
|
||||
|
||||
- The `tests/` directory contains a unit test suite and will later contain more
|
||||
tests that run example codes.
|
||||
|
||||
- See also the [code overview](http://mfem.org/code-overview/) section on the
|
||||
MFEM website.
|
||||
|
||||
## GitHub Workflow
|
||||
|
||||
The GitHub organization, https://github.com/mfem, is the main developer hub for
|
||||
@@ -122,7 +231,7 @@ will allow us to reach you directly with project announcements.
|
||||
# Work on "feature-dev", add local commits
|
||||
# ...
|
||||
|
||||
# One time only) push the branch to github and setup your local
|
||||
# (One time only) push the branch to github and setup your local
|
||||
# branch to track the github branch (for "git pull"):
|
||||
git push -u origin feature-dev
|
||||
|
||||
@@ -215,9 +324,9 @@ Before a PR can be merged, it should satisfy the following:
|
||||
- [ ] Is this a new feature users need to be aware of? New or updated example or miniapp?
|
||||
- [ ] Does it make sense to create a new section in the `CHANGELOG` to group with other related features?
|
||||
- [ ] Update `INSTALL`:
|
||||
- [ ] Has a new optional library been added? (*Make sure the external library is licensed under LGPL, not GPL!*)
|
||||
- [ ] Had a new optional library been added? (*Make sure the external library is licensed under LGPL, not GPL!*)
|
||||
- [ ] Does `make` or `cmake` have a new target?
|
||||
- [ ] Did the requirements or the installation process change? *(rare)*.
|
||||
- [ ] Did the requirements or the installation process change? *(rare)*
|
||||
- [ ] Update `.gitignore`:
|
||||
- [ ] Check if `make distclean; git status` shows any files that are generated from the source but we don't want to track in the repository.
|
||||
- [ ] Add new patterns (just for the new files above) and re-run the above test.
|
||||
@@ -257,10 +366,10 @@ Before a PR can be merged, it should satisfy the following:
|
||||
- [ ] If this is a major new feature, consider mentioning in the short summary inside `README` *(rare)*.
|
||||
- [ ] List major new classes in `doc/CodeDocumentation.dox` *(rare)*.
|
||||
- [ ] Update this checklist, if the new pull request affects it.
|
||||
- [ ] Run the unit tests and make sure they all pass `make unittest`.
|
||||
- [ ] (LLNL only) Clone the `tests` repository and run the following tests, see `mfem/tests/README.md`:
|
||||
- [ ] `compilers`
|
||||
- [ ] `memcheck`
|
||||
- [ ] `unit-test`
|
||||
- [ ] `documentation`
|
||||
- [ ] (LLNL only) After merging:
|
||||
- [ ] Regenerate `README.html` files from companion documentation pull requests.
|
||||
@@ -332,7 +441,7 @@ MFEM uses a `master`/`next`-branch workflow as described below:
|
||||
- [ ] `CHANGELOG`
|
||||
- [ ] `makefile`
|
||||
- [ ] `CMakeLists.txt`
|
||||
- [ ] `doc/CodeDocumentation.conf`
|
||||
- [ ] `doc/CodeDocumentation.conf.in`
|
||||
- [ ] (LLNL only) Make sure all `README.html` files in the source repo are up to date.
|
||||
- [ ] Tag the repository:
|
||||
|
||||
@@ -371,7 +480,6 @@ MFEM uses a `master`/`next`-branch workflow as described below:
|
||||
- `mfem:gh-next` -- Bleeding-edge development version, may be broken, use at
|
||||
your own risk.
|
||||
|
||||
|
||||
## Automated Testing
|
||||
|
||||
MFEM has several levels of automated testing running on GitHub, as well as on
|
||||
|
||||
@@ -28,10 +28,13 @@ without GNU make or CMake can be found at the end of this file.
|
||||
In addition to the native build systems, MFEM packages are also available in the
|
||||
following package managers:
|
||||
|
||||
- Spack, https://github.com/LLNL/spack
|
||||
- Spack, https://github.com/spack/spack
|
||||
- OpenHPC, http://openhpc.community
|
||||
- Homebrew/Science, https://github.com/Homebrew/homebrew-science
|
||||
|
||||
We also recommend downloading and building the MFEM-based GLVis visualization
|
||||
tool which can be used to visualize the meshes and solution in MFEM's examples
|
||||
and miniapps. See http://glvis.org and http://mfem.org/building.
|
||||
|
||||
Quick start with GNU make
|
||||
=========================
|
||||
@@ -352,6 +355,13 @@ MFEM_USE_GZSTREAM = YES/NO
|
||||
before attempting to use it with MFEM.
|
||||
When enabled, this option uses the ZLIB_* library options, see below.
|
||||
|
||||
MFEM_USE_PUMI = YES/NO
|
||||
Enable the usage of PUMI (https://scorec.rpi.edu/pumi/) in MFEM. The Parallel
|
||||
Unstructured Mesh Infrastructure (PUMI) is an unstructured, distributed mesh
|
||||
data management system that is capable of handling general non-manifold
|
||||
models and effectively supports automated adaptive analysis. PUMI enables
|
||||
support for parallel unstructured mesh modifications in MFEM.
|
||||
|
||||
MFEM_BUILD_TAG = (any value)
|
||||
An optional tag to characterize the build. Exported to config/config.mk.
|
||||
Can be used to identify the MFEM build from other makefiles.
|
||||
@@ -461,6 +471,10 @@ The specific libraries and their options are:
|
||||
https://support.hdfgroup.org/HDF5 (HDF5)
|
||||
Options: CONDUIT_OPT, CONDUIT_LIB.
|
||||
|
||||
- PUMI, used when MFEM_USE_PUMI = YES.
|
||||
URL: https://scorec.rpi.edu/pumi
|
||||
Options: PUMI_OPT, PUMI_LIB.
|
||||
|
||||
- MPFR (optional), used when MFEM_USE_MPFR = YES.
|
||||
URL: http://mpfr.org, it depends on the GMP library: https://gmplib.org
|
||||
Options: MPFR_OPT, MPFR_LIB.
|
||||
@@ -593,6 +607,7 @@ MFEM_USE_GNUTLS
|
||||
MFEM_USE_NETCDF
|
||||
MFEM_USE_MPFR
|
||||
MFEM_USE_GZSTREAM
|
||||
MFEM_USE_PUMI
|
||||
|
||||
The following options are CMake specific:
|
||||
|
||||
@@ -638,6 +653,7 @@ The CMake build system adds auto-detection for the following packages/libraries:
|
||||
- MPFR
|
||||
- LIBUNWIND
|
||||
- POSIXCLOCKS
|
||||
- PUMI
|
||||
|
||||
The following built-in CMake packages are also used:
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
GNU LESSER GENERAL PUBLIC LICENSE
|
||||
Version 2.1, February 1999
|
||||
GNU LESSER GENERAL PUBLIC LICENSE
|
||||
Version 2.1, February 1999
|
||||
|
||||
Copyright (C) 1991, 1999 Free Software Foundation, Inc.
|
||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
@@ -10,7 +10,7 @@
|
||||
as the successor of the GNU Library Public License, version 2, hence
|
||||
the version number 2.1.]
|
||||
|
||||
Preamble
|
||||
Preamble
|
||||
|
||||
The licenses for most software are designed to take away your
|
||||
freedom to share and change it. By contrast, the GNU General Public
|
||||
@@ -112,7 +112,7 @@ modification follow. Pay close attention to the difference between a
|
||||
former contains code derived from the library, whereas the latter must
|
||||
be combined with the library in order to run.
|
||||
|
||||
GNU LESSER GENERAL PUBLIC LICENSE
|
||||
GNU LESSER GENERAL PUBLIC LICENSE
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
|
||||
0. This License Agreement applies to any software library or other
|
||||
@@ -146,7 +146,7 @@ such a program is covered only if its contents constitute a work based
|
||||
on the Library (independent of the use of the Library in a tool for
|
||||
writing it). Whether that is true depends on what the Library does
|
||||
and what the program that uses the Library does.
|
||||
|
||||
|
||||
1. You may copy and distribute verbatim copies of the Library's
|
||||
complete source code as you receive it, in any medium, provided that
|
||||
you conspicuously and appropriately publish on each copy an
|
||||
@@ -432,7 +432,7 @@ decision will be guided by the two goals of preserving the free status
|
||||
of all derivatives of our free software and of promoting the sharing
|
||||
and reuse of software generally.
|
||||
|
||||
NO WARRANTY
|
||||
NO WARRANTY
|
||||
|
||||
15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
|
||||
WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
|
||||
@@ -455,7 +455,7 @@ FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
|
||||
SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
|
||||
DAMAGES.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
How to Apply These Terms to Your New Libraries
|
||||
|
||||
@@ -485,7 +485,8 @@ convey the exclusion of warranty; and each file should have at least the
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with this library; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
|
||||
USA
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
@@ -494,11 +495,10 @@ school, if any, to sign a "copyright disclaimer" for the library, if
|
||||
necessary. Here is a sample; alter the names:
|
||||
|
||||
Yoyodyne, Inc., hereby disclaims all copyright interest in the
|
||||
library `Frob' (a library for tweaking knobs) written by James Random Hacker.
|
||||
library `Frob' (a library for tweaking knobs) written by James Random
|
||||
Hacker.
|
||||
|
||||
<signature of Ty Coon>, 1 April 1990
|
||||
Ty Coon, President of Vice
|
||||
|
||||
That's all there is to it!
|
||||
|
||||
|
||||
|
||||
@@ -12,11 +12,15 @@ to enable the research and development of scalable finite element discretization
|
||||
and solver algorithms through general finite element abstractions, accurate and
|
||||
flexible visualization, and tight integration with the hypre library.
|
||||
|
||||
For building instructions, see the file INSTALL, or type "make help". Copyright
|
||||
information and licensing restrictions can be found in the file COPYRIGHT.
|
||||
* For building instructions, see the file INSTALL, or type "make help".
|
||||
|
||||
The best starting point for new users interested in MFEM's features is the
|
||||
interactive documentation in examples/README.html.
|
||||
* Copyright and licensing information can be found in the file COPYRIGHT.
|
||||
|
||||
* The best starting point for new users interested in MFEM's features is the
|
||||
interactive documentation in examples/README.html.
|
||||
|
||||
* Developers interested in contributing to the library, should read the
|
||||
instructions and documentation in the CONTRIBUTING.md file.
|
||||
|
||||
Conceptually, MFEM can be viewed as a finite element toolbox that provides the
|
||||
building blocks for developing finite element algorithms in a manner similar to
|
||||
@@ -56,8 +60,8 @@ time integrators, etc.
|
||||
For examples of using MFEM, see the examples/ and miniapps/ directories, as well
|
||||
as the OpenGL visualization tool GLVis which is available at http://glvis.org.
|
||||
|
||||
This project is released under the LGPL v2.1 license. See LICENSE file for full
|
||||
details.
|
||||
This project is released under the LGPL v2.1 license with static linking
|
||||
exception. See files COPYRIGHT and LICENSE file for full details.
|
||||
|
||||
LLNL Release Number: LLNL-CODE-443211
|
||||
DOI: 10.11578/dc.20171025.1248
|
||||
|
||||
@@ -180,3 +180,75 @@ IF (USE_XSDK_DEFAULTS)
|
||||
ENDIF()
|
||||
|
||||
ENDIF()
|
||||
|
||||
IF (DEFINED TPL_ENABLE_MPI)
|
||||
SET(MFEM_USE_MPI ${TPL_ENABLE_MPI} CACHE BOOL "Enable MPI parallel build" FORCE)
|
||||
ENDIF()
|
||||
|
||||
IF (DEFINED TPL_ENABLE_METIS)
|
||||
SET(MFEM_USE_METIS ${TPL_ENABLE_METIS} CACHE BOOL "Enable METIS usage" FORCE)
|
||||
ENDIF()
|
||||
|
||||
IF (DEFINED TPL_ENABLE_GZSTREAM)
|
||||
SET(MFEM_USE_GZSTREAM ${TPL_ENABLE_GZSTREAM} CACHE BOOL "Enable gzstream for compressed data streams." FORCE)
|
||||
ENDIF()
|
||||
|
||||
IF (DEFINED TPL_ENABLE_LIBUNWIND)
|
||||
SET(MFEM_USE_LIBUNWIND ${TPL_ENABLE_LIBUNWIND} CACHE BOOL "Enable backtrace for errors." FORCE)
|
||||
ENDIF()
|
||||
|
||||
IF (DEFINED TPL_ENABLE_LAPACK)
|
||||
SET(MFEM_USE_LAPACK ${TPL_ENABLE_LAPACK} CACHE BOOL "Enable LAPACK usage" FORCE)
|
||||
ENDIF()
|
||||
|
||||
IF (DEFINED TPL_ENABLE_SUNDIALS)
|
||||
SET(MFEM_USE_SUNDIALS ${TPL_ENABLE_SUNDIALS} CACHE BOOL "Enable SUNDIALS usage" FORCE)
|
||||
ENDIF()
|
||||
|
||||
IF (DEFINED TPL_ENABLE_MESQUITE)
|
||||
SET(MFEM_USE_MESQUITE ${TPL_ENABLE_MESQUITE} CACHE BOOL "Enable MESQUITE usage" FORCE)
|
||||
ENDIF()
|
||||
|
||||
IF (DEFINED TPL_ENABLE_SUITESPARSE)
|
||||
SET(MFEM_USE_SUITESPARSE ${TPL_ENABLE_SUITESPARSE} CACHE BOOL "Enable SuiteSparse usage" FORCE)
|
||||
ENDIF()
|
||||
|
||||
IF (DEFINED TPL_ENABLE_SUPERLU)
|
||||
SET(MFEM_USE_SUPERLU ${TPL_ENABLE_SUPERLU} CACHE BOOL "Enable SuperLU_DIST usage" FORCE)
|
||||
ENDIF()
|
||||
|
||||
IF (DEFINED TPL_ENABLE_STRUMPACK)
|
||||
SET(MFEM_USE_STRUMPACK ${TPL_ENABLE_STRUMPACK} CACHE BOOL "Enable STRUMPACK usage" FORCE)
|
||||
ENDIF()
|
||||
|
||||
IF (DEFINED TPL_ENABLE_GECKO)
|
||||
SET(MFEM_USE_GECKO ${TPL_ENABLE_GECKO} CACHE BOOL "Enable GECKO usage" FORCE)
|
||||
ENDIF()
|
||||
|
||||
IF (DEFINED TPL_ENABLE_GNUTLS)
|
||||
SET(MFEM_USE_GNUTLS ${TPL_ENABLE_GNUTLS} CACHE BOOL "Enable GNUTLS usage" FORCE)
|
||||
ENDIF()
|
||||
|
||||
IF (DEFINED TPL_ENABLE_NETCDF)
|
||||
SET(MFEM_USE_NETCDF ${TPL_ENABLE_NETCDF} CACHE BOOL "Enable NETCDF usage" FORCE)
|
||||
ENDIF()
|
||||
|
||||
IF (DEFINED TPL_ENABLE_PETSC)
|
||||
SET(MFEM_USE_PETSC ${TPL_ENABLE_PETSC} CACHE BOOL "Enable PETSc support." FORCE)
|
||||
ENDIF()
|
||||
|
||||
IF (DEFINED TPL_ENABLE_MPFR)
|
||||
SET(MFEM_USE_MPFR ${TPL_ENABLE_MPFR} CACHE BOOL "Enable MPFR usage." FORCE)
|
||||
ENDIF()
|
||||
|
||||
IF (DEFINED TPL_ENABLE_SIDRE)
|
||||
SET(MFEM_USE_SIDRE ${TPL_ENABLE_SIDRE} CACHE BOOL "Enable Axom/Sidre usage" FORCE)
|
||||
ENDIF()
|
||||
|
||||
IF (DEFINED TPL_ENABLE_CONDUIT)
|
||||
SET(MFEM_USE_CONDUIT ${TPL_ENABLE_CONDUIT} CACHE BOOL "Enable Conduit usage" FORCE)
|
||||
ENDIF()
|
||||
|
||||
IF (DEFINED TPL_ENABLE_PUMI)
|
||||
SET(MFEM_USE_PUMI ${TPL_ENABLE_PUMI} CACHE BOOL "Enable PUMI" FORCE)
|
||||
ENDIF()
|
||||
|
||||
@@ -39,6 +39,7 @@ set(MFEM_USE_PETSC @MFEM_USE_PETSC@)
|
||||
set(MFEM_USE_MPFR @MFEM_USE_MPFR@)
|
||||
set(MFEM_USE_SIDRE @MFEM_USE_SIDRE@)
|
||||
set(MFEM_USE_CONDUIT @MFEM_USE_CONDUIT@)
|
||||
set(MFEM_USE_PUMI @MFEM_USE_PUMI@)
|
||||
|
||||
set(MFEM_CXX_COMPILER "@CMAKE_CXX_COMPILER@")
|
||||
set(MFEM_CXX_FLAGS "@CMAKE_CXX_FLAGS@")
|
||||
|
||||
@@ -98,6 +98,9 @@
|
||||
// Enable MFEM functionality based on Conduit
|
||||
#cmakedefine MFEM_USE_CONDUIT
|
||||
|
||||
// Enable MFEM functionality based on the PUMI library
|
||||
#cmakedefine MFEM_USE_PUMI
|
||||
|
||||
// Which library functions to use in class StopWatch for measuring time.
|
||||
// For a list of the available options, see INSTALL.
|
||||
// If not defined, an option is selected automatically.
|
||||
@@ -106,11 +109,11 @@
|
||||
// Enable MFEM functionality based on the SUNDIALS libraries.
|
||||
#cmakedefine MFEM_USE_SUNDIALS
|
||||
|
||||
// Windows specific options
|
||||
// Macro needed to get defines like M_PI from <cmath>. (Visual Studio C++ only?)
|
||||
#cmakedefine _USE_MATH_DEFINES
|
||||
|
||||
// Version of HYPRE used for building MFEM.
|
||||
#cmakedefine MFEM_HYPRE_VERSION @MFEM_HYPRE_VERSION@
|
||||
|
||||
// Macro defined when PUMI is built with support for the Simmetrix SimModSuite
|
||||
// library.
|
||||
#cmakedefine MFEM_USE_SIMMETRIX
|
||||
|
||||
#endif // MFEM_CONFIG_HEADER
|
||||
|
||||
@@ -229,6 +229,15 @@ endfunction(mfem_find_component)
|
||||
function(mfem_find_package Name Prefix DirVar IncSuffixes Header LibSuffixes
|
||||
Lib IncDoc LibDoc)
|
||||
|
||||
# If we have the TPL_ versions of _INCLUDE_DIRS and _LIBRARIES then set the
|
||||
# standard ${Prefix} versions
|
||||
if (TPL_${Prefix}_INCLUDE_DIRS)
|
||||
set(${Prefix}_INCLUDE_DIRS ${TPL_${Prefix}_INCLUDE_DIRS} CACHE STRING "TPL_${Prefix}_INCLUDE_DIRS was found." FORCE)
|
||||
endif()
|
||||
if (TPL_${Prefix}_LIBRARIES)
|
||||
set(${Prefix}_LIBRARIES ${TPL_${Prefix}_LIBRARIES} CACHE STRING "TPL_${Prefix}_LIBRARIES was found." FORCE)
|
||||
endif()
|
||||
|
||||
# Quick return
|
||||
if (${Prefix}_FOUND)
|
||||
return()
|
||||
@@ -685,3 +694,162 @@ function(mfem_find_library Name Prefix Lib LibDoc CheckVar CheckSrc)
|
||||
endif()
|
||||
|
||||
endfunction(mfem_find_library)
|
||||
|
||||
|
||||
#
|
||||
# Function that creates 'config.mk' from 'config.mk.in' for the both the
|
||||
# build- and the install-locations and define install rules for 'config.mk'
|
||||
# and 'test.mk'.
|
||||
#
|
||||
function(mfem_export_mk_files)
|
||||
|
||||
# Define a few auxiliary variables (not written to 'config.mk')
|
||||
string(TOUPPER "${CMAKE_BUILD_TYPE}" BUILD_TYPE)
|
||||
# CMAKE_SHARED_LIBRARY_RUNTIME_C_FLAG -> '-Wl,-rpath,'
|
||||
set(shared_link_flag ${CMAKE_SHARED_LIBRARY_RUNTIME_C_FLAG})
|
||||
if (NOT shared_link_flag)
|
||||
set(shared_link_flag "-Wl,-rpath,")
|
||||
endif()
|
||||
|
||||
# Convert Boolean vars to YES/NO without writting the values to cache
|
||||
set(CONFIG_MK_BOOL_VARS MFEM_USE_MPI MFEM_USE_METIS MFEM_USE_METIS_5
|
||||
MFEM_DEBUG MFEM_USE_EXCEPTIONS MFEM_USE_GZSTREAM MFEM_USE_LIBUNWIND
|
||||
MFEM_USE_LAPACK MFEM_THREAD_SAFE MFEM_USE_OPENMP MFEM_USE_MEMALLOC
|
||||
MFEM_USE_SUNDIALS MFEM_USE_MESQUITE MFEM_USE_SUITESPARSE MFEM_USE_SUPERLU
|
||||
MFEM_USE_STRUMPACK MFEM_USE_GECKO MFEM_USE_GNUTLS MFEM_USE_NETCDF
|
||||
MFEM_USE_PETSC MFEM_USE_MPFR MFEM_USE_SIDRE MFEM_USE_CONDUIT
|
||||
MFEM_USE_PUMI)
|
||||
foreach(var ${CONFIG_MK_BOOL_VARS})
|
||||
if (${var})
|
||||
set(${var} YES)
|
||||
else()
|
||||
set(${var} NO)
|
||||
endif()
|
||||
endforeach()
|
||||
set(MFEM_CXX ${CMAKE_CXX_COMPILER})
|
||||
set(MFEM_CPPFLAGS "")
|
||||
string(STRIP "${CMAKE_CXX_FLAGS_${BUILD_TYPE}} ${CMAKE_CXX_FLAGS}"
|
||||
MFEM_CXXFLAGS)
|
||||
set(MFEM_TPLFLAGS "")
|
||||
foreach(dir ${MFEM_TPL_INCLUDE_DIRS})
|
||||
set(MFEM_TPLFLAGS "${MFEM_TPLFLAGS} -I${dir}")
|
||||
endforeach()
|
||||
# TODO: MFEM_TPLFLAGS: add other TPL flags, in addition to the -I flags.
|
||||
set(MFEM_INCFLAGS "-I\$(MFEM_INC_DIR) \$(MFEM_TPLFLAGS)")
|
||||
set(MFEM_PICFLAG "")
|
||||
if (BUILD_SHARED_LIBS)
|
||||
set(MFEM_PICFLAG "${CMAKE_SHARED_LIBRARY_CXX_FLAGS}")
|
||||
endif()
|
||||
set(MFEM_FLAGS "\$(MFEM_CPPFLAGS) \$(MFEM_CXXFLAGS) \$(MFEM_INCFLAGS)")
|
||||
# TPL link flags: set below
|
||||
set(MFEM_EXT_LIBS "")
|
||||
if (BUILD_SHARED_LIBS)
|
||||
set(MFEM_LIBS "${shared_link_flag}\$(MFEM_LIB_DIR) -L\$(MFEM_LIB_DIR)")
|
||||
set(MFEM_LIBS "${MFEM_LIBS} -lmfem \$(MFEM_EXT_LIBS)")
|
||||
if (APPLE)
|
||||
set(SO_VER ".${mfem_VERSION}${CMAKE_SHARED_LIBRARY_SUFFIX}")
|
||||
else()
|
||||
set(SO_VER "${CMAKE_SHARED_LIBRARY_SUFFIX}.${mfem_VERSION}")
|
||||
endif()
|
||||
set(MFEM_LIB_FILE "\$(MFEM_LIB_DIR)/libmfem${SO_VER}")
|
||||
set(MFEM_SHARED YES)
|
||||
set(MFEM_STATIC NO)
|
||||
else()
|
||||
set(MFEM_LIBS "-L\$(MFEM_LIB_DIR) -lmfem \$(MFEM_EXT_LIBS)")
|
||||
set(MFEM_LIB_FILE "\$(MFEM_LIB_DIR)/libmfem.a")
|
||||
set(MFEM_SHARED NO)
|
||||
set(MFEM_STATIC YES)
|
||||
endif()
|
||||
set(MFEM_BUILD_TAG "${CMAKE_SYSTEM}")
|
||||
set(MFEM_PREFIX "${CMAKE_INSTALL_PREFIX}")
|
||||
# For the next 4 variable, these are the values for the build-tree version of
|
||||
# 'config.mk'
|
||||
set(MFEM_INC_DIR "${PROJECT_BINARY_DIR}")
|
||||
set(MFEM_LIB_DIR "${PROJECT_BINARY_DIR}")
|
||||
set(MFEM_TEST_MK "${PROJECT_SOURCE_DIR}/config/test.mk")
|
||||
set(MFEM_CONFIG_EXTRA "MFEM_BUILD_DIR ?= ${PROJECT_BINARY_DIR}")
|
||||
set(MFEM_MPIEXEC ${MPIEXEC})
|
||||
if (NOT MFEM_MPIEXEC)
|
||||
set(MFEM_MPIEXEC "mpirun")
|
||||
endif()
|
||||
set(MFEM_MPIEXEC_NP ${MPIEXEC_NUMPROC_FLAG})
|
||||
if (NOT MFEM_MPIEXEC_NP)
|
||||
set(MFEM_MPIEXEC_NP "-np")
|
||||
endif()
|
||||
# MFEM_MPI_NP is already set
|
||||
# Define the variable 'MFEM_EXT_LIBS': handle PUMI libs
|
||||
if ("${MFEM_USE_PUMI}" STREQUAL "YES")
|
||||
message(STATUS "simmodsuite_dir = '${SIMMODSUITE_DIR}'")
|
||||
get_target_property(liblist ${PUMI_LIBRARIES} INTERFACE_LINK_LIBRARIES)
|
||||
set(pumi_dep_libs "${liblist}")
|
||||
foreach(pumilib ${liblist})
|
||||
get_target_property(libdeps ${pumilib} INTERFACE_LINK_LIBRARIES)
|
||||
if (NOT "${libdeps}" MATCHES "libdeps-NOTFOUND")
|
||||
list(APPEND pumi_dep_libs ${libdeps})
|
||||
endif()
|
||||
endforeach()
|
||||
list(REMOVE_DUPLICATES pumi_dep_libs)
|
||||
foreach(pumilib ${pumi_dep_libs})
|
||||
unset(lib CACHE)
|
||||
string(REGEX REPLACE "^SCOREC::" "" libname ${pumilib})
|
||||
string(FIND "${pumilib}" ".a" staticlib)
|
||||
string(FIND "${pumilib}" ".so" sharedlib)
|
||||
find_library(lib ${libname} PATHS ${PUMI_DIR}/lib NO_DEFUALT_PATH)
|
||||
if (NOT "${sharedlib}" MATCHES "-1" OR
|
||||
NOT "${staticlib}" MATCHES "-1" )
|
||||
set(MFEM_EXT_LIBS "${pumilib} ${MFEM_EXT_LIBS}")
|
||||
elseif (NOT "${lib}" MATCHES "lib-NOTFOUND")
|
||||
set(MFEM_EXT_LIBS "${lib} ${MFEM_EXT_LIBS}")
|
||||
elseif ("${lib}" MATCHES "lib-NOTFOUND" AND
|
||||
NOT "${libname}" MATCHES "can" AND
|
||||
NOT "${libname}" MATCHES "pthread")
|
||||
message(FATAL_ERROR "SCOREC lib ${libname} not found")
|
||||
endif()
|
||||
endforeach()
|
||||
endif()
|
||||
# Define the variable 'MFEM_EXT_LIBS': handle other (not PUMI) libs
|
||||
foreach(lib ${TPL_LIBRARIES})
|
||||
get_filename_component(suffix ${lib} EXT)
|
||||
# handle interfaces (e.g., SCOREC::apf)
|
||||
if ("${lib}" MATCHES "SCOREC::.*")
|
||||
elseif (NOT "${lib}" MATCHES "SCOREC::.*" AND "${lib}" MATCHES ".*::.*")
|
||||
message(FATAL_ERROR "***** interface lib found ... exiting *****")
|
||||
# handle static and shared libs
|
||||
elseif ("${suffix}" STREQUAL "${CMAKE_SHARED_LIBRARY_SUFFIX}")
|
||||
get_filename_component(dir ${lib} DIRECTORY)
|
||||
get_filename_component(fullLibName ${lib} NAME_WE)
|
||||
string(REGEX REPLACE "^lib" "" libname ${fullLibName})
|
||||
set(MFEM_EXT_LIBS
|
||||
"${MFEM_EXT_LIBS} ${shared_link_flag}${dir} -L${dir} -l${libname}")
|
||||
else()
|
||||
set(MFEM_EXT_LIBS "${MFEM_EXT_LIBS} ${lib}")
|
||||
endif()
|
||||
endforeach()
|
||||
|
||||
# Create the build-tree version of 'config.mk'
|
||||
configure_file(
|
||||
"${PROJECT_SOURCE_DIR}/config/config.mk.in"
|
||||
"${PROJECT_BINARY_DIR}/config/config.mk")
|
||||
# Copy 'test.mk' from the source-tree to the build-tree
|
||||
configure_file(
|
||||
"${PROJECT_SOURCE_DIR}/config/test.mk"
|
||||
"${PROJECT_BINARY_DIR}/config/test.mk" COPYONLY)
|
||||
|
||||
# Update variables for the install-tree version of 'config.mk'
|
||||
set(MFEM_INC_DIR "${CMAKE_INSTALL_PREFIX}/include")
|
||||
set(MFEM_LIB_DIR "${CMAKE_INSTALL_PREFIX}/lib")
|
||||
set(MFEM_TEST_MK "${CMAKE_INSTALL_PREFIX}/share/mfem/test.mk")
|
||||
set(MFEM_CONFIG_EXTRA "")
|
||||
|
||||
# Create the install-tree version of 'config.mk'
|
||||
configure_file(
|
||||
"${PROJECT_SOURCE_DIR}/config/config.mk.in"
|
||||
"${PROJECT_BINARY_DIR}/config/config-install.mk")
|
||||
|
||||
# Install rules for 'config.mk' and 'test.mk'
|
||||
install(FILES ${PROJECT_SOURCE_DIR}/config/test.mk
|
||||
DESTINATION ${CMAKE_INSTALL_PREFIX}/share/mfem/)
|
||||
install(FILES ${PROJECT_BINARY_DIR}/config/config-install.mk
|
||||
DESTINATION ${CMAKE_INSTALL_PREFIX}/share/mfem/ RENAME config.mk)
|
||||
|
||||
endfunction()
|
||||
|
||||
@@ -23,6 +23,18 @@
|
||||
#include "_config.hpp"
|
||||
#endif
|
||||
|
||||
// Common configuration macros
|
||||
|
||||
#if (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 7)) || defined(__clang__)
|
||||
#define MFEM_HAVE_GCC_PRAGMA_DIAGNOSTIC
|
||||
#endif
|
||||
|
||||
// Windows specific options
|
||||
#ifdef _WIN32
|
||||
// Macro needed to get defines like M_PI from <cmath>. (Visual Studio C++ only?)
|
||||
#define _USE_MATH_DEFINES
|
||||
#endif
|
||||
|
||||
// Check dependencies:
|
||||
|
||||
// Options that require MPI
|
||||
@@ -36,4 +48,7 @@
|
||||
#ifdef MFEM_USE_PETSC
|
||||
#error Building with PETSc (MFEM_USE_PETSC=YES) requires MPI (MFEM_USE_MPI=YES)
|
||||
#endif
|
||||
#ifdef MFEM_USE_PUMI
|
||||
#error Building with PUMI (MFEM_USE_PUMI=YES) requires MPI (MFEM_USE_MPI=YES)
|
||||
#endif
|
||||
#endif // MFEM_USE_MPI not defined
|
||||
|
||||
@@ -109,13 +109,14 @@
|
||||
// Enable functionality based on the MPFR library.
|
||||
// #define MFEM_USE_MPFR
|
||||
|
||||
// Windows specific options
|
||||
#ifdef _WIN32
|
||||
// Macro needed to get defines like M_PI from <cmath>. (Visual Studio C++ only?)
|
||||
#define _USE_MATH_DEFINES
|
||||
#endif
|
||||
// Enable MFEM functionality based on the PUMI library
|
||||
// #define MFEM_USE_PUMI
|
||||
|
||||
// Version of HYPRE used for building MFEM.
|
||||
// #define MFEM_HYPRE_VERSION @MFEM_HYPRE_VERSION@
|
||||
|
||||
// Macro defined when PUMI is built with support for the Simmetrix SimModSuite
|
||||
// library.
|
||||
// #define MFEM_USE_SIMMETRIX
|
||||
|
||||
#endif // MFEM_CONFIG_HEADER
|
||||
|
||||
@@ -37,6 +37,7 @@ MFEM_USE_PETSC = @MFEM_USE_PETSC@
|
||||
MFEM_USE_MPFR = @MFEM_USE_MPFR@
|
||||
MFEM_USE_SIDRE = @MFEM_USE_SIDRE@
|
||||
MFEM_USE_CONDUIT = @MFEM_USE_CONDUIT@
|
||||
MFEM_USE_PUMI = @MFEM_USE_PUMI@
|
||||
|
||||
# Compiler, compile options, and link options
|
||||
MFEM_CXX = @MFEM_CXX@
|
||||
|
||||
@@ -40,6 +40,9 @@ option(MFEM_USE_PETSC "Enable PETSc support." OFF)
|
||||
option(MFEM_USE_MPFR "Enable MPFR usage." OFF)
|
||||
option(MFEM_USE_SIDRE "Enable Axom/Sidre usage" OFF)
|
||||
option(MFEM_USE_CONDUIT "Enable Conduit usage" OFF)
|
||||
option(MFEM_USE_PUMI "Enable PUMI" OFF)
|
||||
|
||||
set(MFEM_MPI_NP 4 CACHE STRING "Number of processes used for MPI tests")
|
||||
|
||||
# Allow a user to disable testing, examples, and/or miniapps at CONFIGURE TIME
|
||||
# if they don't want/need them (e.g. if MFEM is "just a dependency" and all they
|
||||
@@ -145,6 +148,9 @@ set(AXOM_DIR "${MFEM_DIR}/../axom" CACHE PATH "Path to the Axom library.")
|
||||
set(Axom_REQUIRED_PACKAGES "Conduit/relay" CACHE STRING
|
||||
"Additional packages required by Axom.")
|
||||
|
||||
set(PUMI_DIR "${MFEM_DIR}/../pumi-2.1.0" CACHE STRING
|
||||
"Directory where PUMI is installed")
|
||||
|
||||
set(BLAS_INCLUDE_DIRS "" CACHE STRING "Path to BLAS headers.")
|
||||
set(BLAS_LIBRARIES "" CACHE STRING "The BLAS library.")
|
||||
set(LAPACK_INCLUDE_DIRS "" CACHE STRING "Path to LAPACK headers.")
|
||||
|
||||
@@ -106,6 +106,7 @@ MFEM_USE_PETSC = NO
|
||||
MFEM_USE_MPFR = NO
|
||||
MFEM_USE_SIDRE = NO
|
||||
MFEM_USE_CONDUIT = NO
|
||||
MFEM_USE_PUMI = NO
|
||||
|
||||
# Compile and link options for zlib.
|
||||
ZLIB_DIR =
|
||||
@@ -271,6 +272,13 @@ SIDRE_LIB = \
|
||||
-Wl,-rpath,$(HDF5_DIR)/lib -L$(HDF5_DIR)/lib \
|
||||
-lsidre -lslic -laxom_utils -lconduit -lconduit_relay -lhdf5 $(ZLIB_LIB) -ldl
|
||||
|
||||
# PUMI
|
||||
# Note that PUMI_DIR is needed -- it is used to check for gmi_sim.h
|
||||
PUMI_DIR = @MFEM_DIR@/../pumi-2.1.0
|
||||
PUMI_OPT = -I$(PUMI_DIR)/include
|
||||
PUMI_LIB = -L$(PUMI_DIR)/lib -lpumi -lcrv -lma -lmds -lapf -lpcu -lgmi -lparma\
|
||||
-llion -lmth -lapf_zoltan -lspr
|
||||
|
||||
# If YES, enable some informational messages
|
||||
VERBOSE = NO
|
||||
|
||||
|
||||
+11
-2
@@ -38,6 +38,9 @@ all: header config-mk
|
||||
MPI = $(MFEM_USE_MPI:NO=)
|
||||
GHV = get_hypre_version
|
||||
GHV_FLAGS = $(subst @MFEM_DIR@,$(if $(MFEM_DIR),$(MFEM_DIR),..),$(HYPRE_OPT))
|
||||
SMX = $(if $(MFEM_USE_PUMI:NO=),MFEM_USE_SIMMETRIX)
|
||||
SMX_PATH = $(PUMI_DIR)/include/gmi_sim.h
|
||||
SMX_FILE = $(subst @MFEM_DIR@,$(if $(MFEM_DIR),$(MFEM_DIR),..),$(SMX_PATH))
|
||||
|
||||
$(GHV): $(SRC)$(GHV).cpp
|
||||
$(call mfem-info, Determining HYPRE version ...)
|
||||
@@ -52,10 +55,16 @@ get-hypre-version: $(GHV).out
|
||||
$(info HYPRE version: $(MFEM_HYPRE_VERSION)),\
|
||||
$(error Unable to determine HYPRE version))
|
||||
|
||||
header: $(if $(MPI),get-hypre-version,)
|
||||
check-smx:
|
||||
$(call mfem-info, Checking for Simmetrix header [$(SMX_FILE)] ...)
|
||||
$(eval MFEM_USE_SIMMETRIX:=$(if $(wildcard $(SMX_FILE)),YES,NO))
|
||||
$(call mfem-info, MFEM_USE_SIMMETRIX = $(MFEM_USE_SIMMETRIX))
|
||||
$(eval export MFEM_USE_SIMMETRIX)
|
||||
|
||||
header: $(if $(MPI),get-hypre-version,) $(if $(SMX),check-smx)
|
||||
$(call mfem-info, Writing $(CONFIG_HPP) ...)
|
||||
@set -- && \
|
||||
for def in $${MFEM_DEFINES} $(if $(MPI),MFEM_HYPRE_VERSION,); do \
|
||||
for def in $${MFEM_DEFINES} $(if $(MPI),MFEM_HYPRE_VERSION) $(SMX); do \
|
||||
eval var=\$$$$def && \
|
||||
if [ "NO" != "$${var}" ]; then \
|
||||
set -- "$$@" -e "s|// \(#define $${def} \)|\1|" && \
|
||||
|
||||
+16
-7
@@ -30,7 +30,7 @@ groups_serial=(
|
||||
'"examples"
|
||||
"Examples:"
|
||||
"examples"
|
||||
"ex{,1}[0-9].cpp"'
|
||||
"ex{,1,2}[0-9].cpp"'
|
||||
# "ex1.cpp"'
|
||||
'"sundials"
|
||||
"SUNDIALS examples:"
|
||||
@@ -44,14 +44,15 @@ groups_serial=(
|
||||
'"meshing"
|
||||
"Meshing miniapps:"
|
||||
"miniapps/meshing"
|
||||
"mobius-strip.cpp klein-bottle.cpp mesh-optimizer.cpp"'
|
||||
"mobius-strip.cpp klein-bottle.cpp extruder.cpp toroid.cpp
|
||||
mesh-optimizer.cpp"'
|
||||
)
|
||||
# Parallel groups
|
||||
groups_parallel=(
|
||||
'"examples"
|
||||
"Examples:"
|
||||
"examples"
|
||||
"ex{,1}[0-9]p.cpp"'
|
||||
"ex{,1,2}[0-9]p.cpp"'
|
||||
# "ex1p.cpp"'
|
||||
'"sundials"
|
||||
"SUNDIALS examples:"
|
||||
@@ -81,7 +82,7 @@ groups_all=(
|
||||
'"examples"
|
||||
"Examples:"
|
||||
"examples"
|
||||
"ex\"{,1}[0-9]\"{,p}.cpp"'
|
||||
"ex\"{,1,2}[0-9]\"{,p}.cpp"'
|
||||
'"sundials"
|
||||
"SUNDIALS examples:"
|
||||
"examples/sundials"
|
||||
@@ -97,7 +98,8 @@ groups_all=(
|
||||
'"meshing"
|
||||
"Meshing miniapps:"
|
||||
"miniapps/meshing"
|
||||
"mobius-strip.cpp klein-bottle.cpp {,p}mesh-optimizer.cpp"'
|
||||
"mobius-strip.cpp klein-bottle.cpp extruder.cpp toroid.cpp
|
||||
{,p}mesh-optimizer.cpp"'
|
||||
'"electromagnetics"
|
||||
"Electromagnetics miniapps:"
|
||||
"miniapps/electromagnetics"
|
||||
@@ -170,6 +172,9 @@ function help_message()
|
||||
-v Enable valgrind
|
||||
-o <dir> [${output_dir:-"<empty>: output goes to stdout"}]
|
||||
If not empty, save output to files inside <dir>
|
||||
-d <dir> [${mfem_build_dir}]
|
||||
If <dir> is different from <mfem_dir> then use an
|
||||
out-of-source build in <dir>
|
||||
-j <np> [${make_j}] Specify the number of jobs to use for building
|
||||
-c|-color Always use colors for the status messages: OK, FAILED, etc
|
||||
-b|-built Do NOT rebuild the library and the executables
|
||||
@@ -196,8 +201,8 @@ function help_message()
|
||||
Their values can also set using the respective uppercase environment
|
||||
variable
|
||||
mfem_build_dir [${mfem_build_dir}]
|
||||
Set this variable to something different from <mfem_dir> to use an
|
||||
out-of-source build
|
||||
Same as '-d': set this variable to something different from <mfem_dir>
|
||||
to use an out-of-source build
|
||||
|
||||
For other valid variables, see the script source.
|
||||
|
||||
@@ -266,6 +271,10 @@ case "$1" in
|
||||
shift
|
||||
output_dir="$1"
|
||||
;;
|
||||
-d)
|
||||
shift
|
||||
mfem_build_dir="$1"
|
||||
;;
|
||||
-j)
|
||||
shift
|
||||
make_j="-j $1"
|
||||
|
||||
+5
-2
@@ -14,11 +14,13 @@
|
||||
# Colors used below:
|
||||
# green '\033[0;32m'
|
||||
# red '\033[0;31m'
|
||||
# yellow '\033[0;33m'
|
||||
# no color '\033[0m'
|
||||
COLOR_PRINT = if [ -t 1 ]; then \
|
||||
printf $(1)$(2)'\033[0m'$(3); else printf $(2)$(3); fi
|
||||
PRINT_OK = $(call COLOR_PRINT,'\033[0;32m',OK," ($$1 $$2)\n")
|
||||
PRINT_FAILED = $(call COLOR_PRINT,'\033[0;31m',FAILED," ($$1 $$2)\n")
|
||||
PRINT_SKIP = $(call COLOR_PRINT,'\033[0;33m',SKIP,"\n")
|
||||
|
||||
# Timing support
|
||||
define TIMECMD_detect
|
||||
@@ -36,7 +38,7 @@ export TIME='%es %MkB %x'; \
|
||||
set -- $$($(1) $(SHELL) -c "$(2)" 2>&1); while [ "$$#" -gt 3 ]; do shift; done
|
||||
endef
|
||||
define TIMECMD.NOTGNU
|
||||
set -- $$($(1) -l $(SHELL) -c "$(2)" 2>&1; echo $$?); \
|
||||
set -- $$($(1) -l $(SHELL) -c "{ $(2); } > /dev/null 2>&1" 2>&1; echo $$?); \
|
||||
set -- "$$1"s "$$(($$7/1024))"kB "$${60}"
|
||||
endef
|
||||
define TIMECMD.BASH
|
||||
@@ -58,7 +60,8 @@ endif
|
||||
# Test runs of the examples/miniapps with parameters - check exit code
|
||||
mfem-test = \
|
||||
printf " $(3) [$(2) $(1) ... ]: "; \
|
||||
$(call $(TIMEFUN),$(TIMECMD),$(2) ./$(1) -no-vis $(4) > $(1).stderr 2>&1); \
|
||||
$(call $(TIMEFUN),$(TIMECMD),$(2) ./$(1) $(if $(5),,-no-vis )$(4) \
|
||||
> $(1).stderr 2>&1); \
|
||||
if [ "$$3" = 0 ]; \
|
||||
then $(PRINT_OK); else $(PRINT_FAILED); cat $(1).stderr; fi; \
|
||||
rm -f $(1).stderr; exit $$3
|
||||
|
||||
@@ -0,0 +1,87 @@
|
||||
MFEM mesh v1.0
|
||||
|
||||
#
|
||||
# MFEM Geometry Types (see mesh/geom.hpp):
|
||||
#
|
||||
# POINT = 0
|
||||
# SEGMENT = 1
|
||||
# TRIANGLE = 2
|
||||
# SQUARE = 3
|
||||
# TETRAHEDRON = 4
|
||||
# CUBE = 5
|
||||
# PRISM = 6
|
||||
#
|
||||
|
||||
dimension
|
||||
3
|
||||
|
||||
elements
|
||||
8
|
||||
1 6 0 9 18 1 10 19
|
||||
1 6 1 10 19 2 11 20
|
||||
1 6 2 11 20 3 12 21
|
||||
1 6 3 12 21 4 13 22
|
||||
2 6 4 13 22 5 14 23
|
||||
2 6 5 14 23 6 15 24
|
||||
2 6 6 15 24 7 16 25
|
||||
2 6 7 16 25 8 17 26
|
||||
|
||||
boundary
|
||||
26
|
||||
1 2 0 18 9
|
||||
2 2 8 17 26
|
||||
3 3 0 9 10 1
|
||||
3 3 1 10 11 2
|
||||
3 3 2 11 12 3
|
||||
3 3 3 12 13 4
|
||||
3 3 4 13 14 5
|
||||
3 3 5 14 15 6
|
||||
3 3 6 15 16 7
|
||||
3 3 7 16 17 8
|
||||
3 3 18 0 1 19
|
||||
3 3 19 1 2 20
|
||||
3 3 20 2 3 21
|
||||
3 3 21 3 4 22
|
||||
3 3 22 4 5 23
|
||||
3 3 23 5 6 24
|
||||
3 3 24 6 7 25
|
||||
3 3 25 7 8 26
|
||||
3 3 9 18 19 10
|
||||
3 3 10 19 20 11
|
||||
3 3 11 20 21 12
|
||||
3 3 12 21 22 13
|
||||
3 3 13 22 23 14
|
||||
3 3 14 23 24 15
|
||||
3 3 15 24 25 16
|
||||
3 3 16 25 26 17
|
||||
|
||||
vertices
|
||||
27
|
||||
3
|
||||
0 0 0
|
||||
1 0 0
|
||||
2 0 0
|
||||
3 0 0
|
||||
4 0 0
|
||||
5 0 0
|
||||
6 0 0
|
||||
7 0 0
|
||||
8 0 0
|
||||
0 1 0
|
||||
1 1 0
|
||||
2 1 0
|
||||
3 1 0
|
||||
4 1 0
|
||||
5 1 0
|
||||
6 1 0
|
||||
7 1 0
|
||||
8 1 0
|
||||
0 0.5 1
|
||||
1 0.5 1
|
||||
2 0.5 1
|
||||
3 0.5 1
|
||||
4 0.5 1
|
||||
5 0.5 1
|
||||
6 0.5 1
|
||||
7 0.5 1
|
||||
8 0.5 1
|
||||
@@ -0,0 +1,61 @@
|
||||
# vtk DataFile Version 3.0
|
||||
Generated by MFEM
|
||||
ASCII
|
||||
DATASET UNSTRUCTURED_GRID
|
||||
POINTS 27 double
|
||||
0 0 0
|
||||
1 0 0
|
||||
2 0 0
|
||||
3 0 0
|
||||
4 0 0
|
||||
5 0 0
|
||||
6 0 0
|
||||
7 0 0
|
||||
8 0 0
|
||||
0 1 0
|
||||
1 1 0
|
||||
2 1 0
|
||||
3 1 0
|
||||
4 1 0
|
||||
5 1 0
|
||||
6 1 0
|
||||
7 1 0
|
||||
8 1 0
|
||||
0 0.5 1
|
||||
1 0.5 1
|
||||
2 0.5 1
|
||||
3 0.5 1
|
||||
4 0.5 1
|
||||
5 0.5 1
|
||||
6 0.5 1
|
||||
7 0.5 1
|
||||
8 0.5 1
|
||||
CELLS 8 56
|
||||
6 0 9 18 1 10 19
|
||||
6 1 10 19 2 11 20
|
||||
6 2 11 20 3 12 21
|
||||
6 3 12 21 4 13 22
|
||||
6 4 13 22 5 14 23
|
||||
6 5 14 23 6 15 24
|
||||
6 6 15 24 7 16 25
|
||||
6 7 16 25 8 17 26
|
||||
CELL_TYPES 8
|
||||
13
|
||||
13
|
||||
13
|
||||
13
|
||||
13
|
||||
13
|
||||
13
|
||||
13
|
||||
CELL_DATA 8
|
||||
SCALARS material int
|
||||
LOOKUP_TABLE default
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
2
|
||||
2
|
||||
2
|
||||
2
|
||||
@@ -0,0 +1,192 @@
|
||||
MFEM mesh v1.0
|
||||
|
||||
#
|
||||
# MFEM Geometry Types (see mesh/geom.hpp):
|
||||
#
|
||||
# POINT = 0
|
||||
# SEGMENT = 1
|
||||
# TRIANGLE = 2
|
||||
# SQUARE = 3
|
||||
# TETRAHEDRON = 4
|
||||
# CUBE = 5
|
||||
# PRISM = 6
|
||||
#
|
||||
|
||||
dimension
|
||||
3
|
||||
|
||||
elements
|
||||
14
|
||||
1 4 13 15 21 25
|
||||
1 4 15 13 21 12
|
||||
1 4 21 13 25 22
|
||||
1 4 15 21 25 24
|
||||
1 4 13 15 25 16
|
||||
1 5 0 1 4 3 9 10 13 12
|
||||
1 5 8 9 12 11 17 18 21 20
|
||||
1 5 2 3 6 5 11 12 15 14
|
||||
1 6 3 4 6 12 13 15
|
||||
1 6 4 7 6 13 16 15
|
||||
1 6 12 13 21 9 10 18
|
||||
1 6 13 22 21 10 19 18
|
||||
1 6 11 14 20 12 15 21
|
||||
1 6 15 21 24 14 20 23
|
||||
|
||||
boundary
|
||||
30
|
||||
1 3 5 6 3 2
|
||||
2 2 6 4 3
|
||||
2 2 4 6 7
|
||||
3 3 3 4 1 0
|
||||
4 3 11 12 9 8
|
||||
5 3 2 3 12 11
|
||||
6 3 0 1 10 9
|
||||
7 2 10 18 9
|
||||
7 2 18 10 19
|
||||
8 3 8 9 18 17
|
||||
9 3 1 4 13 10
|
||||
10 3 4 7 16 13
|
||||
11 2 25 13 16
|
||||
11 2 13 25 22
|
||||
12 3 10 13 22 19
|
||||
13 3 7 6 15 16
|
||||
14 3 6 5 14 15
|
||||
15 3 15 14 23 24
|
||||
16 2 15 25 16
|
||||
16 2 25 15 24
|
||||
17 3 5 2 11 14
|
||||
18 3 3 0 9 12
|
||||
19 3 11 8 17 20
|
||||
20 2 20 14 11
|
||||
20 2 14 20 23
|
||||
21 3 17 18 21 20
|
||||
22 3 18 19 22 21
|
||||
23 2 25 21 22
|
||||
23 2 21 25 24
|
||||
24 3 20 21 24 23
|
||||
|
||||
vertices
|
||||
26
|
||||
|
||||
nodes
|
||||
FiniteElementSpace
|
||||
FiniteElementCollection: H1_3D_P2
|
||||
VDim: 3
|
||||
Ordering: 1
|
||||
|
||||
0.028213666146621 -1.0129124616273 -1.0197422793601
|
||||
0.99151103207842 -0.97408353323117 -1.0219424221199
|
||||
-0.98628834960982 -0.048291393648833 -1.0334530425724
|
||||
-0.045286384224892 -0.028259630873799 -0.95961592583917
|
||||
1.0351351283956 0.016103611653671 -1.0465984194074
|
||||
-0.97963495329022 0.975340601895 -0.95050375238061
|
||||
-0.016565482225269 0.98394050155766 -1.0119900547434
|
||||
0.98232264800655 1.0061312792241 -0.97468885016611
|
||||
-1.0111163694877 -1.0328216757625 -0.033904406474903
|
||||
-0.031359497737139 -0.95907832225785 -0.02936147605069
|
||||
1.0216721775476 -0.95571139678359 -0.041445003869012
|
||||
-0.96617995956913 0.013420177670196 -0.047073400672525
|
||||
0.03735491973348 0.024136644229293 -0.035419858060777
|
||||
0.99844568660483 -0.023344853520393 0.043047091318294
|
||||
-1.0075354852248 0.95110015915707 0.040374961402267
|
||||
-0.018023004801944 0.98735854397528 0.035048884851858
|
||||
0.96496833880778 0.98624407089765 0.029059857856424
|
||||
-0.95618249163963 -0.95913625303656 0.99699592567049
|
||||
0.010523111699149 -1.0380611987319 1.0054330066312
|
||||
1.0131589291349 -0.99133288586241 1.0510169859154
|
||||
-0.9992929702159 -0.016950021823868 1.0209834648762
|
||||
-0.030905270343646 -0.024878516234457 0.96677784407511
|
||||
1.0369556044533 0.036727200814101 0.97476146325791
|
||||
-1.0268666699025 0.99100244478387 0.95557046163574
|
||||
0.032850918109418 0.9761234538078 0.99340013005027
|
||||
0.96517252528448 1.018590816239 0.96241486393546
|
||||
0.52641251369336 0.53453492783232 -0.046831832639522
|
||||
0.54842095679127 0.012466884090474 0.52264325135947
|
||||
1.0546647359835 0.51503200008771 0.47661895657821
|
||||
0.008193729444779 0.46320342579585 0.51330736048101
|
||||
0.48446121998846 1.0366433051979 0.46910527980021
|
||||
0.50338134740858 0.53372671722279 1.0016026703109
|
||||
-0.0026805294677615 0.54834160562605 -0.022633473388851
|
||||
0.4992129677441 -0.027650739811361 -0.025983834639192
|
||||
-0.010308592952788 0.043478553090245 0.54404251929373
|
||||
0.52373361142037 0.017260625417003 1.0190168930687
|
||||
0.95156254112601 0.024917951411289 0.48927665714905
|
||||
1.0114961385777 0.53988309084877 0.98077339629239
|
||||
0.01429600397056 1.0255897320394 0.44945099394948
|
||||
-0.0037663174125072 0.46114195337251 0.98693741812483
|
||||
0.53955416269275 0.95254191223583 0.99345054396648
|
||||
1.0344137934711 0.51549308419917 0.0019079259000746
|
||||
0.4635900873147 1.0074141174823 -0.025796540646941
|
||||
1.0393698821347 0.99823230649269 0.53561992818844
|
||||
0.54910938213579 -1.0186136680655 -1.0399189315271
|
||||
0.98251790353097 -0.52159510049969 -1.0488538759761
|
||||
0.51290647936985 0.019199261348695 -1.0180139709264
|
||||
0.039190890220925 -0.51870735888369 -1.0145805133507
|
||||
0.54531239252537 -1.0346180800814 -0.026071808021516
|
||||
1.0111227696296 -0.45961035727523 0.028725982550532
|
||||
-0.0024106570985168 -0.51591348233633 0.042102640075609
|
||||
0.019072471559048 -1.0489699664991 -0.53822694290429
|
||||
1.0197706996463 -1.0138504981995 -0.48532295548357
|
||||
0.97708769380115 0.012869927892461 -0.49512141938321
|
||||
-0.0056951441802084 -0.018287890031934 -0.46456751856022
|
||||
-0.48628377295099 -0.97137148869224 -0.040609835088253
|
||||
-0.52949825478718 0.022831952339038 0.036623532185331
|
||||
-0.9682938832324 -0.51529484749772 0.039498377451673
|
||||
-0.45076946932822 -0.98247022288851 1.0229644412175
|
||||
-0.036635886738077 -0.53934830226935 0.97308384231292
|
||||
-0.47986206617206 -0.041745604947209 0.98161771683954
|
||||
-0.95103283049539 -0.5087813614402 1.0116585971788
|
||||
-0.95395673410967 -0.95082942959853 0.50977751370519
|
||||
0.030673310998827 -0.97366141136736 0.47265974627808
|
||||
-1.0076441270299 0.025157339498401 0.51940553779714
|
||||
-0.45112570035271 0.030354945734143 -1.0244264173787
|
||||
-0.034796683816239 0.47213521944359 -1.0233666383661
|
||||
-0.52309081116691 1.0127369282767 -1.030445962213
|
||||
-1.0052867605351 0.54541603662074 -0.99267176855355
|
||||
-0.53441363093443 1.0101050069556 0.034852372528985
|
||||
-1.0361742412671 0.51952713127248 -0.0075041593052447
|
||||
-1.0224051106721 0.037305149668828 -0.51234883274883
|
||||
-0.0468317149207 0.99936735257506 -0.53290488454513
|
||||
-1.0323944162577 1.0470460939221 -0.49629869163036
|
||||
0.50827771586097 0.51091354087276 -0.96143114171132
|
||||
0.97860428203942 0.53881222049291 -1.0227558970328
|
||||
0.54899092558423 1.0449853148062 -1.0290394971016
|
||||
0.98149990118493 1.0265442789565 -0.45402792714566
|
||||
0.47938502309767 -0.95321110021154 0.46438798044786
|
||||
0.98893120098231 -1.0252040218394 0.52866776747387
|
||||
0.46061993861414 -0.973998097143 0.95264651015888
|
||||
0.98858339184873 -0.49578777734639 0.97955980177082
|
||||
-0.95322811676761 0.49312524158842 0.46350421594559
|
||||
-0.9670648949319 0.52720408663568 1.0147400701319
|
||||
-0.95970724064157 0.9966338243727 0.47198853459547
|
||||
-0.55076990539437 0.95548113087191 1.0002298586837
|
||||
0.48237521727569 -0.51972299404442 -0.98436066769063
|
||||
0.45025863721967 -1.0030842470471 -0.53693975312635
|
||||
0.95356930759735 -0.4606471833773 -0.49721032292582
|
||||
0.48610299886204 0.033102156873792 -0.45204877182841
|
||||
0.016292646434158 -0.4694908623118 -0.53292224425822
|
||||
0.47584088565782 -0.54223454683088 -0.036028525792062
|
||||
-0.53143287785351 -0.4923779387027 0.0039846746250987
|
||||
-0.52957315347157 -1.0359902368858 0.51208876920864
|
||||
-0.024055424472317 -0.49951890320517 0.48579422575422
|
||||
-0.45644746879116 -0.012607240816578 0.51010388839059
|
||||
-0.98394734906033 -0.50309513998218 0.47998268660158
|
||||
-0.53098605261184 -0.48258609846234 0.97544367099181
|
||||
-0.51822144156322 0.45223189569078 -1.0385291075334
|
||||
-0.45871022404172 -0.042734754644334 -0.54302125046961
|
||||
0.041843411838636 0.46222349074669 -0.5097909247037
|
||||
-0.45607118047774 1.0116704457439 -0.45481789885089
|
||||
-1.0244252419565 0.4849586374592 -0.50017994958907
|
||||
-0.52441235366277 0.50157218999229 0.023797604069114
|
||||
0.46467856940869 0.54693057615002 -0.46251054922067
|
||||
0.98669286111723 0.51824862516758 -0.45168929326637
|
||||
0.54790127868275 0.98589193659248 -0.51421705686245
|
||||
0.54233705943277 -0.4508773840935 0.45025142266283
|
||||
1.0203662623874 -0.5304726794563 0.52365051237419
|
||||
0.48446453821555 -0.47976663671026 1.043945324572
|
||||
-0.48793381256969 0.50247088679532 0.48323828733422
|
||||
-0.52670996575095 0.50194146344506 1.0026980744777
|
||||
-0.47523256142428 0.97748358070477 0.48234451559035
|
||||
0.45616661459208 -0.50770850274712 -0.4568053398747
|
||||
-0.52734654471278 -0.51337681044824 0.47594708297402
|
||||
-0.45737625267357 0.47732204026543 -0.54846904515289
|
||||
@@ -0,0 +1,168 @@
|
||||
# vtk DataFile Version 3.0
|
||||
Generated by MFEM
|
||||
ASCII
|
||||
DATASET UNSTRUCTURED_GRID
|
||||
POINTS 116 double
|
||||
0.028213666146621 -1.0129124616273 -1.0197422793601
|
||||
0.99151103207842 -0.97408353323117 -1.0219424221199
|
||||
-0.98628834960982 -0.048291393648833 -1.0334530425724
|
||||
-0.045286384224892 -0.028259630873799 -0.95961592583917
|
||||
1.0351351283956 0.016103611653671 -1.0465984194074
|
||||
-0.97963495329022 0.975340601895 -0.95050375238061
|
||||
-0.016565482225269 0.98394050155766 -1.0119900547434
|
||||
0.98232264800655 1.0061312792241 -0.97468885016611
|
||||
-1.0111163694877 -1.0328216757625 -0.033904406474903
|
||||
-0.031359497737139 -0.95907832225785 -0.02936147605069
|
||||
1.0216721775476 -0.95571139678359 -0.041445003869012
|
||||
-0.96617995956913 0.013420177670196 -0.047073400672525
|
||||
0.03735491973348 0.024136644229293 -0.035419858060777
|
||||
0.99844568660483 -0.023344853520393 0.043047091318294
|
||||
-1.0075354852248 0.95110015915707 0.040374961402267
|
||||
-0.018023004801944 0.98735854397528 0.035048884851858
|
||||
0.96496833880778 0.98624407089765 0.029059857856424
|
||||
-0.95618249163963 -0.95913625303656 0.99699592567049
|
||||
0.010523111699149 -1.0380611987319 1.0054330066312
|
||||
1.0131589291349 -0.99133288586241 1.0510169859154
|
||||
-0.9992929702159 -0.016950021823868 1.0209834648762
|
||||
-0.030905270343646 -0.024878516234457 0.96677784407511
|
||||
1.0369556044533 0.036727200814101 0.97476146325791
|
||||
-1.0268666699025 0.99100244478387 0.95557046163574
|
||||
0.032850918109418 0.9761234538078 0.99340013005027
|
||||
0.96517252528448 1.018590816239 0.96241486393546
|
||||
0.50338134740858 0.53372671722279 1.0016026703109
|
||||
0.54842095679127 0.012466884090474 0.52264325135947
|
||||
0.008193729444779 0.46320342579585 0.51330736048101
|
||||
1.0546647359835 0.51503200008771 0.47661895657821
|
||||
0.48446121998846 1.0366433051979 0.46910527980021
|
||||
0.52641251369336 0.53453492783232 -0.046831832639522
|
||||
-0.0026805294677615 0.54834160562605 -0.022633473388851
|
||||
0.4992129677441 -0.027650739811361 -0.025983834639192
|
||||
-0.010308592952788 0.043478553090245 0.54404251929373
|
||||
1.0114961385777 0.53988309084877 0.98077339629239
|
||||
0.52373361142037 0.017260625417003 1.0190168930687
|
||||
0.95156254112601 0.024917951411289 0.48927665714905
|
||||
-0.0037663174125072 0.46114195337251 0.98693741812483
|
||||
0.53955416269275 0.95254191223583 0.99345054396648
|
||||
0.01429600397056 1.0255897320394 0.44945099394948
|
||||
1.0344137934711 0.51549308419917 0.0019079259000746
|
||||
0.4635900873147 1.0074141174823 -0.025796540646941
|
||||
1.0393698821347 0.99823230649269 0.53561992818844
|
||||
0.54910938213579 -1.0186136680655 -1.0399189315271
|
||||
0.98251790353097 -0.52159510049969 -1.0488538759761
|
||||
0.51290647936985 0.019199261348695 -1.0180139709264
|
||||
0.039190890220925 -0.51870735888369 -1.0145805133507
|
||||
0.54531239252537 -1.0346180800814 -0.026071808021516
|
||||
1.0111227696296 -0.45961035727523 0.028725982550532
|
||||
-0.0024106570985168 -0.51591348233633 0.042102640075609
|
||||
0.019072471559048 -1.0489699664991 -0.53822694290429
|
||||
1.0197706996463 -1.0138504981995 -0.48532295548357
|
||||
0.97708769380115 0.012869927892461 -0.49512141938321
|
||||
-0.0056951441802084 -0.018287890031934 -0.46456751856022
|
||||
-0.48628377295099 -0.97137148869224 -0.040609835088253
|
||||
-0.52949825478718 0.022831952339038 0.036623532185331
|
||||
-0.9682938832324 -0.51529484749772 0.039498377451673
|
||||
-0.45076946932822 -0.98247022288851 1.0229644412175
|
||||
-0.036635886738077 -0.53934830226935 0.97308384231292
|
||||
-0.47986206617206 -0.041745604947209 0.98161771683954
|
||||
-0.95103283049539 -0.5087813614402 1.0116585971788
|
||||
-0.95395673410967 -0.95082942959853 0.50977751370519
|
||||
0.030673310998827 -0.97366141136736 0.47265974627808
|
||||
-1.0076441270299 0.025157339498401 0.51940553779714
|
||||
-0.45112570035271 0.030354945734143 -1.0244264173787
|
||||
-0.034796683816239 0.47213521944359 -1.0233666383661
|
||||
-0.52309081116691 1.0127369282767 -1.030445962213
|
||||
-1.0052867605351 0.54541603662074 -0.99267176855355
|
||||
-0.53441363093443 1.0101050069556 0.034852372528985
|
||||
-1.0361742412671 0.51952713127248 -0.0075041593052447
|
||||
-1.0224051106721 0.037305149668828 -0.51234883274883
|
||||
-0.0468317149207 0.99936735257506 -0.53290488454513
|
||||
-1.0323944162577 1.0470460939221 -0.49629869163036
|
||||
0.50827771586097 0.51091354087276 -0.96143114171132
|
||||
0.97860428203942 0.53881222049291 -1.0227558970328
|
||||
0.54899092558423 1.0449853148062 -1.0290394971016
|
||||
0.98149990118493 1.0265442789565 -0.45402792714566
|
||||
0.47938502309767 -0.95321110021154 0.46438798044786
|
||||
0.98893120098231 -1.0252040218394 0.52866776747387
|
||||
0.46061993861414 -0.973998097143 0.95264651015888
|
||||
0.98858339184873 -0.49578777734639 0.97955980177082
|
||||
-0.95322811676761 0.49312524158842 0.46350421594559
|
||||
-0.9670648949319 0.52720408663568 1.0147400701319
|
||||
-0.95970724064157 0.9966338243727 0.47198853459547
|
||||
-0.55076990539437 0.95548113087191 1.0002298586837
|
||||
0.48237521727569 -0.51972299404442 -0.98436066769063
|
||||
0.45025863721967 -1.0030842470471 -0.53693975312635
|
||||
0.95356930759735 -0.4606471833773 -0.49721032292582
|
||||
0.48610299886204 0.033102156873792 -0.45204877182841
|
||||
0.016292646434158 -0.4694908623118 -0.53292224425822
|
||||
0.47584088565782 -0.54223454683088 -0.036028525792062
|
||||
-0.53143287785351 -0.4923779387027 0.0039846746250987
|
||||
-0.52957315347157 -1.0359902368858 0.51208876920864
|
||||
-0.024055424472317 -0.49951890320517 0.48579422575422
|
||||
-0.45644746879116 -0.012607240816578 0.51010388839059
|
||||
-0.98394734906033 -0.50309513998218 0.47998268660158
|
||||
-0.53098605261184 -0.48258609846234 0.97544367099181
|
||||
-0.51822144156322 0.45223189569078 -1.0385291075334
|
||||
-0.45871022404172 -0.042734754644334 -0.54302125046961
|
||||
0.041843411838636 0.46222349074669 -0.5097909247037
|
||||
-0.45607118047774 1.0116704457439 -0.45481789885089
|
||||
-1.0244252419565 0.4849586374592 -0.50017994958907
|
||||
-0.52441235366277 0.50157218999229 0.023797604069114
|
||||
0.46467856940869 0.54693057615002 -0.46251054922067
|
||||
0.98669286111723 0.51824862516758 -0.45168929326637
|
||||
0.54790127868275 0.98589193659248 -0.51421705686245
|
||||
0.54233705943277 -0.4508773840935 0.45025142266283
|
||||
1.0203662623874 -0.5304726794563 0.52365051237419
|
||||
0.48446453821555 -0.47976663671026 1.043945324572
|
||||
-0.48793381256969 0.50247088679532 0.48323828733422
|
||||
-0.52670996575095 0.50194146344506 1.0026980744777
|
||||
-0.47523256142428 0.97748358070477 0.48234451559035
|
||||
0.45616661459208 -0.50770850274712 -0.4568053398747
|
||||
-0.52734654471278 -0.51337681044824 0.47594708297402
|
||||
-0.45737625267357 0.47732204026543 -0.54846904515289
|
||||
CELLS 14 253
|
||||
10 21 25 13 15 26 29 27 28 30 31
|
||||
10 15 13 21 12 31 27 28 32 33 34
|
||||
10 25 21 13 22 26 27 29 35 36 37
|
||||
10 21 25 15 24 26 30 28 38 39 40
|
||||
10 13 15 25 16 31 30 29 41 42 43
|
||||
27 0 1 4 3 9 10 13 12 44 45 46 47 48 49 33 50 51 52 53 54 90 88 87 89 86 91 113
|
||||
27 8 9 12 11 17 18 21 20 55 50 56 57 58 59 60 61 62 63 34 64 96 94 93 95 92 97 114
|
||||
27 2 3 6 5 11 12 15 14 65 66 67 68 56 32 69 70 71 54 72 73 102 100 99 101 98 103 115
|
||||
18 3 6 4 12 15 13 66 74 46 32 31 33 54 72 53 100 104 89
|
||||
18 4 6 7 13 15 16 74 76 75 31 42 41 53 72 77 104 106 105
|
||||
18 12 21 13 9 18 10 34 27 33 63 78 48 50 59 49 94 107 91
|
||||
18 13 21 22 10 18 19 27 36 37 78 80 79 49 59 81 107 109 108
|
||||
18 11 20 14 12 21 15 64 82 70 34 28 32 56 60 69 95 110 103
|
||||
18 15 24 21 14 23 20 40 38 28 84 83 82 69 85 60 112 111 110
|
||||
CELL_TYPES 14
|
||||
24
|
||||
24
|
||||
24
|
||||
24
|
||||
24
|
||||
29
|
||||
29
|
||||
29
|
||||
32
|
||||
32
|
||||
32
|
||||
32
|
||||
32
|
||||
32
|
||||
CELL_DATA 14
|
||||
SCALARS material int
|
||||
LOOKUP_TABLE default
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
@@ -0,0 +1,96 @@
|
||||
MFEM mesh v1.0
|
||||
|
||||
#
|
||||
# MFEM Geometry Types (see mesh/geom.hpp):
|
||||
#
|
||||
# POINT = 0
|
||||
# SEGMENT = 1
|
||||
# TRIANGLE = 2
|
||||
# SQUARE = 3
|
||||
# TETRAHEDRON = 4
|
||||
# CUBE = 5
|
||||
# PRISM = 6
|
||||
#
|
||||
|
||||
dimension
|
||||
3
|
||||
|
||||
elements
|
||||
14
|
||||
1 4 13 15 21 25
|
||||
1 4 12 13 15 21
|
||||
1 4 13 21 22 25
|
||||
1 4 15 24 21 25
|
||||
1 4 13 15 25 16
|
||||
1 5 0 1 4 3 9 10 13 12
|
||||
1 5 8 9 12 11 17 18 21 20
|
||||
1 5 2 3 6 5 11 12 15 14
|
||||
1 6 3 4 6 12 13 15
|
||||
1 6 4 7 6 13 16 15
|
||||
1 6 12 13 21 9 10 18
|
||||
1 6 13 22 21 10 19 18
|
||||
1 6 11 14 20 12 15 21
|
||||
1 6 15 21 24 14 20 23
|
||||
|
||||
boundary
|
||||
30
|
||||
1 3 5 6 3 2
|
||||
2 2 3 6 4
|
||||
2 2 4 6 7
|
||||
3 3 3 4 1 0
|
||||
4 3 11 12 9 8
|
||||
5 3 2 3 12 11
|
||||
6 3 0 1 10 9
|
||||
7 2 9 10 18
|
||||
7 2 10 19 18
|
||||
8 3 8 9 18 17
|
||||
9 3 1 4 13 10
|
||||
10 3 4 7 16 13
|
||||
11 2 13 16 25
|
||||
11 2 13 25 22
|
||||
12 3 10 13 22 19
|
||||
13 3 7 6 15 16
|
||||
14 3 6 5 14 15
|
||||
15 3 15 14 23 24
|
||||
16 2 16 15 25
|
||||
16 2 15 24 25
|
||||
17 3 5 2 11 14
|
||||
18 3 3 0 9 12
|
||||
19 3 11 8 17 20
|
||||
20 2 11 20 14
|
||||
20 2 14 20 23
|
||||
21 3 17 18 21 20
|
||||
22 3 18 19 22 21
|
||||
23 2 21 22 25
|
||||
23 2 21 25 24
|
||||
24 3 20 21 24 23
|
||||
|
||||
vertices
|
||||
26
|
||||
3
|
||||
0 -1 -1
|
||||
1 -1 -1
|
||||
-1 0 -1
|
||||
0 0 -1
|
||||
1 0 -1
|
||||
-1 1 -1
|
||||
0 1 -1
|
||||
1 1 -1
|
||||
-1 -1 0
|
||||
0 -1 0
|
||||
1 -1 0
|
||||
-1 0 0
|
||||
0 0 0
|
||||
1 0 0
|
||||
-1 1 0
|
||||
0 1 0
|
||||
1 1 0
|
||||
-1 -1 1
|
||||
0 -1 1
|
||||
1 -1 1
|
||||
-1 0 1
|
||||
0 0 1
|
||||
1 0 1
|
||||
-1 1 1
|
||||
0 1 1
|
||||
1 1 1
|
||||
@@ -0,0 +1,9 @@
|
||||
MFEM INLINE mesh v1.0
|
||||
|
||||
type = wedge
|
||||
nx = 4
|
||||
ny = 4
|
||||
nz = 4
|
||||
sx = 1.0
|
||||
sy = 1.0
|
||||
sz = 1.0
|
||||
@@ -0,0 +1,182 @@
|
||||
MFEM mesh v1.0
|
||||
|
||||
#
|
||||
# MFEM Geometry Types (see mesh/geom.hpp):
|
||||
#
|
||||
# POINT = 0
|
||||
# SEGMENT = 1
|
||||
# TRIANGLE = 2
|
||||
# SQUARE = 3
|
||||
# TETRAHEDRON = 4
|
||||
# CUBE = 5
|
||||
#
|
||||
|
||||
dimension
|
||||
2
|
||||
|
||||
elements
|
||||
30
|
||||
1 3 0 11 26 14
|
||||
1 3 0 14 27 17
|
||||
1 3 0 17 28 20
|
||||
1 3 0 20 29 23
|
||||
1 3 0 23 30 11
|
||||
1 2 1 26 11
|
||||
1 2 26 1 12
|
||||
1 3 26 12 3 13
|
||||
1 2 2 26 13
|
||||
1 2 26 2 14
|
||||
1 2 2 27 14
|
||||
1 2 27 2 15
|
||||
1 3 27 15 5 16
|
||||
1 2 4 27 16
|
||||
1 2 27 4 17
|
||||
1 2 4 28 17
|
||||
1 2 28 4 18
|
||||
1 3 28 18 7 19
|
||||
1 2 6 28 19
|
||||
1 2 28 6 20
|
||||
1 2 6 29 20
|
||||
1 2 29 6 21
|
||||
1 3 29 21 9 22
|
||||
1 2 8 29 22
|
||||
1 2 29 8 23
|
||||
1 2 8 30 23
|
||||
1 2 30 8 24
|
||||
1 3 30 24 10 25
|
||||
1 2 1 30 25
|
||||
1 2 30 1 11
|
||||
|
||||
boundary
|
||||
20
|
||||
1 1 13 2
|
||||
1 1 12 3
|
||||
1 1 16 4
|
||||
1 1 15 5
|
||||
1 1 19 6
|
||||
1 1 18 7
|
||||
1 1 22 8
|
||||
1 1 21 9
|
||||
1 1 25 1
|
||||
1 1 24 10
|
||||
1 1 3 13
|
||||
1 1 1 12
|
||||
1 1 5 16
|
||||
1 1 2 15
|
||||
1 1 7 19
|
||||
1 1 4 18
|
||||
1 1 9 22
|
||||
1 1 6 21
|
||||
1 1 10 25
|
||||
1 1 8 24
|
||||
|
||||
vertices
|
||||
31
|
||||
|
||||
nodes
|
||||
FiniteElementSpace
|
||||
FiniteElementCollection: H1_2D_P2
|
||||
VDim: 2
|
||||
Ordering: 1
|
||||
|
||||
0.01350768617383 -0.0075500592639684
|
||||
1 0
|
||||
0.309017 0.951057
|
||||
1.30902 0.951057
|
||||
-0.809017 0.587785
|
||||
-0.5 1.53884
|
||||
-0.809017 -0.587785
|
||||
-1.61803 0
|
||||
0.309017 -0.951057
|
||||
-0.5 -1.53884
|
||||
1.30902 -0.951057
|
||||
0.4935497789318 -0.012882964767041
|
||||
1.15451 0.475529
|
||||
0.809019 0.951057
|
||||
0.17136163619581 0.48175756223348
|
||||
-0.0954915 1.24495
|
||||
-0.654508 1.06331
|
||||
-0.41734925397369 0.28726550311701
|
||||
-1.21352 0.293893
|
||||
-1.21352 -0.293892
|
||||
-0.39460365124056 -0.30156877530663
|
||||
-0.654508 -1.06331
|
||||
-0.0954915 -1.24495
|
||||
0.14399901886801 -0.48762042397771
|
||||
0.809019 -0.951057
|
||||
1.15451 -0.475529
|
||||
0.6498356311584 0.48434918539882
|
||||
-0.24288407581812 0.75594729997554
|
||||
-0.8152592767797 0.0028387384025541
|
||||
-0.22754482186326 -0.77540708661379
|
||||
0.672255499984 -0.48174474211839
|
||||
0.22829595615988 0.0021164169942289
|
||||
0.60101450815825 0.21860266792331
|
||||
0.41883194868682 0.47605389684094
|
||||
0.07343165966527 0.21396989328966
|
||||
-0.02571592547416 0.63942139993498
|
||||
-0.32229829912758 0.53827901417123
|
||||
-0.17873676879185 0.14412581843398
|
||||
-0.6182337454462 0.14256917811499
|
||||
-0.59596471744054 -0.16569961862581
|
||||
-0.19439899436461 -0.12390276596268
|
||||
-0.33986575323528 -0.53331120777067
|
||||
-0.064647379830725 -0.60235938684263
|
||||
0.091924539036435 -0.25440885597942
|
||||
0.40469418107844 -0.47549896605132
|
||||
0.59442400974309 -0.23815570080881
|
||||
0.83567929699787 0.25605757828544
|
||||
0.73491944894413 -0.013500778246483
|
||||
1.077255 0.2377645
|
||||
0.88696375569985 0.49133008726061
|
||||
1.231765 0.713293
|
||||
1.0590195 0.951057
|
||||
0.72725653289275 0.73104100472096
|
||||
0.50225974659165 0.6904536152084
|
||||
0.559018 0.951057
|
||||
0.23657516510421 0.69857072686934
|
||||
0.011561493903121 0.87524541641085
|
||||
0.10676275 1.0980035
|
||||
-0.17127243181091 0.99863326833074
|
||||
-0.29774575 1.391895
|
||||
-0.577254 1.301075
|
||||
-0.45323351407757 0.93490604288187
|
||||
-0.55200861955087 0.66792304985565
|
||||
-0.7317625 0.8255475
|
||||
-0.58327877079184 0.4240660861124
|
||||
-0.81465656906104 0.28713104760848
|
||||
-1.0112685 0.440839
|
||||
-0.99771272279525 0.1592736885552
|
||||
-1.415775 0.1469465
|
||||
-1.415775 -0.146946
|
||||
-1.0166887889241 -0.16866723370018
|
||||
-0.80412516287867 -0.29582734656
|
||||
-1.0112685 -0.4408385
|
||||
-0.6073309356422 -0.45826153759998
|
||||
-0.55501395481483 -0.68914767547246
|
||||
-0.7317625 -0.8255475
|
||||
-0.45240617124569 -0.93833106759189
|
||||
-0.577254 -1.301075
|
||||
-0.29774575 -1.391895
|
||||
-0.1923419715726 -1.0285844005569
|
||||
0.031614306262131 -0.83601077226744
|
||||
0.10676275 -1.0980035
|
||||
0.22112358843745 -0.69009711121629
|
||||
0.50046759811715 -0.72837571286759
|
||||
0.559018 -0.951057
|
||||
0.71074483315985 -0.70826931724532
|
||||
1.0590195 -0.951057
|
||||
1.231765 -0.713293
|
||||
0.89135027612826 -0.46226040977064
|
||||
0.84948897506491 -0.23986695857234
|
||||
1.077255 -0.2377645
|
||||
0.31586449185434 0.2462788698702
|
||||
-0.13788918217579 0.40149150514309
|
||||
-0.40416548945856 0.0027692745957735
|
||||
-0.14861804521337 -0.3698676302047
|
||||
0.33007376541085 -0.24598293851351
|
||||
0.99473757603443 0.69214841080247
|
||||
-0.38122249894249 1.1629329119286
|
||||
-1.208195003484 -0.0026998371675556
|
||||
-0.35890854853443 -1.1361244276705
|
||||
0.9901912195942 -0.73640851058427
|
||||
@@ -0,0 +1,201 @@
|
||||
# vtk DataFile Version 3.0
|
||||
Generated by MFEM
|
||||
ASCII
|
||||
DATASET UNSTRUCTURED_GRID
|
||||
POINTS 101 double
|
||||
0.01350768617383 -0.0075500592639684 0
|
||||
1 0 0
|
||||
0.309017 0.951057 0
|
||||
1.30902 0.951057 0
|
||||
-0.809017 0.587785 0
|
||||
-0.5 1.53884 0
|
||||
-0.809017 -0.587785 0
|
||||
-1.61803 0 0
|
||||
0.309017 -0.951057 0
|
||||
-0.5 -1.53884 0
|
||||
1.30902 -0.951057 0
|
||||
0.4935497789318 -0.012882964767041 0
|
||||
1.15451 0.475529 0
|
||||
0.809019 0.951057 0
|
||||
0.17136163619581 0.48175756223348 0
|
||||
-0.0954915 1.24495 0
|
||||
-0.654508 1.06331 0
|
||||
-0.41734925397369 0.28726550311701 0
|
||||
-1.21352 0.293893 0
|
||||
-1.21352 -0.293892 0
|
||||
-0.39460365124056 -0.30156877530663 0
|
||||
-0.654508 -1.06331 0
|
||||
-0.0954915 -1.24495 0
|
||||
0.14399901886801 -0.48762042397771 0
|
||||
0.809019 -0.951057 0
|
||||
1.15451 -0.475529 0
|
||||
0.6498356311584 0.48434918539882 0
|
||||
-0.24288407581812 0.75594729997554 0
|
||||
-0.8152592767797 0.0028387384025541 0
|
||||
-0.22754482186326 -0.77540708661379 0
|
||||
0.672255499984 -0.48174474211839 0
|
||||
0.22829595615988 0.0021164169942289 0
|
||||
0.60101450815825 0.21860266792331 0
|
||||
0.41883194868682 0.47605389684094 0
|
||||
0.07343165966527 0.21396989328966 0
|
||||
-0.02571592547416 0.63942139993498 0
|
||||
-0.32229829912758 0.53827901417123 0
|
||||
-0.17873676879185 0.14412581843398 0
|
||||
-0.6182337454462 0.14256917811499 0
|
||||
-0.59596471744054 -0.16569961862581 0
|
||||
-0.19439899436461 -0.12390276596268 0
|
||||
-0.33986575323528 -0.53331120777067 0
|
||||
-0.064647379830725 -0.60235938684263 0
|
||||
0.091924539036435 -0.25440885597942 0
|
||||
0.40469418107844 -0.47549896605132 0
|
||||
0.59442400974309 -0.23815570080881 0
|
||||
0.83567929699787 0.25605757828544 0
|
||||
0.73491944894413 -0.013500778246483 0
|
||||
1.077255 0.2377645 0
|
||||
0.88696375569985 0.49133008726061 0
|
||||
1.231765 0.713293 0
|
||||
1.0590195 0.951057 0
|
||||
0.72725653289275 0.73104100472096 0
|
||||
0.50225974659165 0.6904536152084 0
|
||||
0.559018 0.951057 0
|
||||
0.23657516510421 0.69857072686934 0
|
||||
0.011561493903121 0.87524541641085 0
|
||||
0.10676275 1.0980035 0
|
||||
-0.17127243181091 0.99863326833074 0
|
||||
-0.29774575 1.391895 0
|
||||
-0.577254 1.301075 0
|
||||
-0.45323351407757 0.93490604288187 0
|
||||
-0.55200861955087 0.66792304985565 0
|
||||
-0.7317625 0.8255475 0
|
||||
-0.58327877079184 0.4240660861124 0
|
||||
-0.81465656906104 0.28713104760848 0
|
||||
-1.0112685 0.440839 0
|
||||
-0.99771272279525 0.1592736885552 0
|
||||
-1.415775 0.1469465 0
|
||||
-1.415775 -0.146946 0
|
||||
-1.0166887889241 -0.16866723370018 0
|
||||
-0.80412516287867 -0.29582734656 0
|
||||
-1.0112685 -0.4408385 0
|
||||
-0.6073309356422 -0.45826153759998 0
|
||||
-0.55501395481483 -0.68914767547246 0
|
||||
-0.7317625 -0.8255475 0
|
||||
-0.45240617124569 -0.93833106759189 0
|
||||
-0.577254 -1.301075 0
|
||||
-0.29774575 -1.391895 0
|
||||
-0.1923419715726 -1.0285844005569 0
|
||||
0.031614306262131 -0.83601077226744 0
|
||||
0.10676275 -1.0980035 0
|
||||
0.22112358843745 -0.69009711121629 0
|
||||
0.50046759811715 -0.72837571286759 0
|
||||
0.559018 -0.951057 0
|
||||
0.71074483315985 -0.70826931724532 0
|
||||
1.0590195 -0.951057 0
|
||||
1.231765 -0.713293 0
|
||||
0.89135027612826 -0.46226040977064 0
|
||||
0.84948897506491 -0.23986695857234 0
|
||||
1.077255 -0.2377645 0
|
||||
0.31586449185434 0.2462788698702 0
|
||||
-0.13788918217579 0.40149150514309 0
|
||||
-0.40416548945856 0.0027692745957735 0
|
||||
-0.14861804521337 -0.3698676302047 0
|
||||
0.33007376541085 -0.24598293851351 0
|
||||
0.99473757603443 0.69214841080247 0
|
||||
-0.38122249894249 1.1629329119286 0
|
||||
-1.208195003484 -0.0026998371675556 0
|
||||
-0.35890854853443 -1.1361244276705 0
|
||||
0.9901912195942 -0.73640851058427 0
|
||||
CELLS 30 240
|
||||
9 0 11 26 14 31 32 33 34 91
|
||||
9 0 14 27 17 34 35 36 37 92
|
||||
9 0 17 28 20 37 38 39 40 93
|
||||
9 0 20 29 23 40 41 42 43 94
|
||||
9 0 23 30 11 43 44 45 31 95
|
||||
6 1 26 11 46 32 47
|
||||
6 26 1 12 46 48 49
|
||||
9 26 12 3 13 49 50 51 52 96
|
||||
6 2 26 13 53 52 54
|
||||
6 26 2 14 53 55 33
|
||||
6 2 27 14 56 35 55
|
||||
6 27 2 15 56 57 58
|
||||
9 27 15 5 16 58 59 60 61 97
|
||||
6 4 27 16 62 61 63
|
||||
6 27 4 17 62 64 36
|
||||
6 4 28 17 65 38 64
|
||||
6 28 4 18 65 66 67
|
||||
9 28 18 7 19 67 68 69 70 98
|
||||
6 6 28 19 71 70 72
|
||||
6 28 6 20 71 73 39
|
||||
6 6 29 20 74 41 73
|
||||
6 29 6 21 74 75 76
|
||||
9 29 21 9 22 76 77 78 79 99
|
||||
6 8 29 22 80 79 81
|
||||
6 29 8 23 80 82 42
|
||||
6 8 30 23 83 44 82
|
||||
6 30 8 24 83 84 85
|
||||
9 30 24 10 25 85 86 87 88 100
|
||||
6 1 30 25 89 88 90
|
||||
6 30 1 11 89 47 45
|
||||
CELL_TYPES 30
|
||||
28
|
||||
28
|
||||
28
|
||||
28
|
||||
28
|
||||
22
|
||||
22
|
||||
28
|
||||
22
|
||||
22
|
||||
22
|
||||
22
|
||||
28
|
||||
22
|
||||
22
|
||||
22
|
||||
22
|
||||
28
|
||||
22
|
||||
22
|
||||
22
|
||||
22
|
||||
28
|
||||
22
|
||||
22
|
||||
22
|
||||
22
|
||||
28
|
||||
22
|
||||
22
|
||||
CELL_DATA 30
|
||||
SCALARS material int
|
||||
LOOKUP_TABLE default
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
@@ -0,0 +1,107 @@
|
||||
MFEM mesh v1.0
|
||||
|
||||
#
|
||||
# MFEM Geometry Types (see mesh/geom.hpp):
|
||||
#
|
||||
# POINT = 0
|
||||
# SEGMENT = 1
|
||||
# TRIANGLE = 2
|
||||
# SQUARE = 3
|
||||
# TETRAHEDRON = 4
|
||||
# CUBE = 5
|
||||
# PRISM = 6
|
||||
#
|
||||
|
||||
dimension
|
||||
2
|
||||
|
||||
elements
|
||||
30
|
||||
1 3 0 11 26 14
|
||||
1 3 0 14 27 17
|
||||
1 3 0 17 28 20
|
||||
1 3 0 20 29 23
|
||||
1 3 0 23 30 11
|
||||
1 2 11 1 26
|
||||
1 2 1 12 26
|
||||
1 3 26 12 3 13
|
||||
1 2 26 13 2
|
||||
1 2 14 26 2
|
||||
1 2 14 2 27
|
||||
1 2 2 15 27
|
||||
1 3 27 15 5 16
|
||||
1 2 27 16 4
|
||||
1 2 17 27 4
|
||||
1 2 17 4 28
|
||||
1 2 4 18 28
|
||||
1 3 28 18 7 19
|
||||
1 2 28 19 6
|
||||
1 2 20 28 6
|
||||
1 2 20 6 29
|
||||
1 2 6 21 29
|
||||
1 3 29 21 9 22
|
||||
1 2 29 22 8
|
||||
1 2 23 29 8
|
||||
1 2 23 8 30
|
||||
1 2 8 24 30
|
||||
1 3 30 24 10 25
|
||||
1 2 30 25 1
|
||||
1 2 11 30 1
|
||||
|
||||
boundary
|
||||
20
|
||||
1 1 13 2
|
||||
1 1 12 3
|
||||
1 1 16 4
|
||||
1 1 15 5
|
||||
1 1 19 6
|
||||
1 1 18 7
|
||||
1 1 22 8
|
||||
1 1 21 9
|
||||
1 1 25 1
|
||||
1 1 24 10
|
||||
1 1 3 13
|
||||
1 1 1 12
|
||||
1 1 5 16
|
||||
1 1 2 15
|
||||
1 1 7 19
|
||||
1 1 4 18
|
||||
1 1 9 22
|
||||
1 1 6 21
|
||||
1 1 10 25
|
||||
1 1 8 24
|
||||
|
||||
vertices
|
||||
31
|
||||
2
|
||||
0 0
|
||||
1 0
|
||||
0.309017 0.951057
|
||||
1.30902 0.951057
|
||||
-0.809017 0.587785
|
||||
-0.5 1.53884
|
||||
-0.809017 -0.587785
|
||||
-1.61803 0
|
||||
0.309017 -0.951057
|
||||
-0.5 -1.53884
|
||||
1.30902 -0.951057
|
||||
0.5 0
|
||||
1.15451 0.475529
|
||||
0.809019 0.951057
|
||||
0.154508 0.475529
|
||||
-0.0954915 1.24495
|
||||
-0.654508 1.06331
|
||||
-0.404508 0.293893
|
||||
-1.21352 0.293893
|
||||
-1.21352 -0.293892
|
||||
-0.404508 -0.293893
|
||||
-0.654508 -1.06331
|
||||
-0.0954915 -1.24495
|
||||
0.154508 -0.475529
|
||||
0.809019 -0.951057
|
||||
1.15451 -0.475529
|
||||
0.654509 0.475529
|
||||
-0.25 0.769421
|
||||
-0.809016 0
|
||||
-0.25 -0.76942
|
||||
0.654509 -0.475529
|
||||
@@ -0,0 +1,350 @@
|
||||
MFEM mesh v1.0
|
||||
|
||||
#
|
||||
# MFEM Geometry Types (see mesh/geom.hpp):
|
||||
#
|
||||
# POINT = 0
|
||||
# SEGMENT = 1
|
||||
# TRIANGLE = 2
|
||||
# SQUARE = 3
|
||||
# TETRAHEDRON = 4
|
||||
# CUBE = 5
|
||||
# PRISM = 6
|
||||
#
|
||||
|
||||
dimension
|
||||
3
|
||||
|
||||
elements
|
||||
6
|
||||
1 5 0 1 2 3 4 5 6 7
|
||||
1 5 4 5 6 7 8 9 10 11
|
||||
1 5 8 9 10 11 12 13 14 15
|
||||
1 5 12 13 14 15 16 17 18 19
|
||||
1 5 16 17 18 19 20 21 22 23
|
||||
1 5 20 21 22 23 3 0 1 2
|
||||
|
||||
boundary
|
||||
24
|
||||
1 3 0 1 5 4
|
||||
1 3 1 2 6 5
|
||||
1 3 2 3 7 6
|
||||
1 3 3 0 4 7
|
||||
1 3 4 5 9 8
|
||||
1 3 5 6 10 9
|
||||
1 3 6 7 11 10
|
||||
1 3 7 4 8 11
|
||||
1 3 8 9 13 12
|
||||
1 3 9 10 14 13
|
||||
1 3 10 11 15 14
|
||||
1 3 11 8 12 15
|
||||
1 3 12 13 17 16
|
||||
1 3 13 14 18 17
|
||||
1 3 14 15 19 18
|
||||
1 3 15 12 16 19
|
||||
1 3 16 17 21 20
|
||||
1 3 17 18 22 21
|
||||
1 3 18 19 23 22
|
||||
1 3 19 16 20 23
|
||||
1 3 20 21 0 3
|
||||
1 3 21 22 1 0
|
||||
1 3 22 23 2 1
|
||||
1 3 23 20 3 2
|
||||
|
||||
vertices
|
||||
24
|
||||
|
||||
nodes
|
||||
FiniteElementSpace
|
||||
FiniteElementCollection: H1_3D_P3
|
||||
VDim: 3
|
||||
Ordering: 1
|
||||
|
||||
0.71715729 -1.7565288e-16 -0.28284271
|
||||
0.71715729 -1.7565288e-16 0.28284271
|
||||
1.2828427 -3.1420584e-16 0.28284271
|
||||
1.2828427 -3.1420584e-16 -0.28284271
|
||||
0.3 0.51961524 -2.7755576e-17
|
||||
0.5 0.8660254 0.4
|
||||
0.7 1.2124356 2.7755576e-17
|
||||
0.5 0.8660254 -0.4
|
||||
-0.35857864 0.62107643 0.28284271
|
||||
-0.64142136 1.1109744 0.28284271
|
||||
-0.64142136 1.1109744 -0.28284271
|
||||
-0.35857864 0.62107643 -0.28284271
|
||||
-1 1.2246468e-16 0.4
|
||||
-1.4 1.7145055e-16 2.7755576e-17
|
||||
-1 1.2246468e-16 -0.4
|
||||
-0.6 7.3478808e-17 -2.7755576e-17
|
||||
-0.64142136 -1.1109744 0.28284271
|
||||
-0.64142136 -1.1109744 -0.28284271
|
||||
-0.35857864 -0.62107643 -0.28284271
|
||||
-0.35857864 -0.62107643 0.28284271
|
||||
0.7 -1.2124356 8.3266727e-17
|
||||
0.5 -0.8660254 -0.4
|
||||
0.3 -0.51961524 -8.3266727e-17
|
||||
0.5 -0.8660254 0.4
|
||||
0.71715729 -1.7565288e-16 -0.12649111
|
||||
0.71715729 -1.7565288e-16 0.12649111
|
||||
0.87350889 -2.1394797e-16 0.28284271
|
||||
1.1264911 -2.7591075e-16 0.28284271
|
||||
1.2828427 -3.1420584e-16 0.12649111
|
||||
1.2828427 -3.1420584e-16 -0.12649111
|
||||
0.87350889 -2.1394797e-16 -0.28284271
|
||||
1.1264911 -2.7591075e-16 -0.28284271
|
||||
0.35527864 0.61536066 0.11055728
|
||||
0.44472136 0.77027999 0.28944272
|
||||
0.55527864 0.96177082 0.28944272
|
||||
0.64472136 1.1166902 0.11055728
|
||||
0.64472136 1.1166902 -0.11055728
|
||||
0.55527864 0.96177082 -0.28944272
|
||||
0.35527864 0.61536066 -0.11055728
|
||||
0.44472136 0.77027999 -0.28944272
|
||||
0.63530452 0.18919442 -0.21528657
|
||||
0.44264573 0.41882944 -0.086151128
|
||||
0.75207276 0.22396814 0.33712267
|
||||
0.66379961 0.62808427 0.39061232
|
||||
1.2815042 0.38163342 0.21528657
|
||||
1.01011 0.95576166 0.086151128
|
||||
1.1647359 0.3468597 -0.33712267
|
||||
0.78895615 0.74650684 -0.39061232
|
||||
-0.43675445 0.75648089 0.28284271
|
||||
-0.56324555 0.97556992 0.28284271
|
||||
-0.64142136 1.1109744 0.12649111
|
||||
-0.64142136 1.1109744 -0.12649111
|
||||
-0.56324555 0.97556992 -0.28284271
|
||||
-0.43675445 0.75648089 -0.28284271
|
||||
-0.35857864 0.62107643 0.12649111
|
||||
-0.35857864 0.62107643 -0.12649111
|
||||
0.14139407 0.59275717 0.086151128
|
||||
-0.15380509 0.64478706 0.21528657
|
||||
0.25201581 1.0565095 0.39061232
|
||||
-0.28197865 1.1821208 0.33712267
|
||||
0.32265887 1.3526618 -0.086151128
|
||||
-0.31024785 1.3006319 -0.21528657
|
||||
0.21203713 0.88890945 -0.39061232
|
||||
-0.18207429 0.76329818 -0.33712267
|
||||
-1.1105573 1.3600404e-16 0.28944272
|
||||
-1.2894427 1.5791119e-16 0.11055728
|
||||
-1.2894427 1.5791119e-16 -0.11055728
|
||||
-1.1105573 1.3600404e-16 -0.28944272
|
||||
-0.88944272 1.0892532e-16 -0.28944272
|
||||
-0.71055728 8.701817e-17 -0.11055728
|
||||
-0.88944272 1.0892532e-16 0.28944272
|
||||
-0.71055728 8.701817e-17 0.11055728
|
||||
-0.56999848 0.53933005 0.33712267
|
||||
-0.87583673 0.26082519 0.39061232
|
||||
-0.97125633 0.91899846 0.21528657
|
||||
-1.3327689 0.39690011 0.086151128
|
||||
-0.88275728 0.83526106 -0.33712267
|
||||
-1.040972 0.31000265 -0.39061232
|
||||
-0.48149943 0.45559264 -0.21528657
|
||||
-0.5840398 0.17392773 -0.086151128
|
||||
-0.64142136 -1.1109744 0.12649111
|
||||
-0.64142136 -1.1109744 -0.12649111
|
||||
-0.56324555 -0.97556992 -0.28284271
|
||||
-0.43675445 -0.75648089 -0.28284271
|
||||
-0.35857864 -0.62107643 -0.12649111
|
||||
-0.35857864 -0.62107643 0.12649111
|
||||
-0.56324555 -0.97556992 0.28284271
|
||||
-0.43675445 -0.75648089 0.28284271
|
||||
-1.040972 -0.31000265 0.39061232
|
||||
-0.88275728 -0.83526106 0.33712267
|
||||
-1.3327689 -0.39690011 -0.086151128
|
||||
-0.97125633 -0.91899846 -0.21528657
|
||||
-0.87583673 -0.26082519 -0.39061232
|
||||
-0.56999848 -0.53933005 -0.33712267
|
||||
-0.5840398 -0.17392773 0.086151128
|
||||
-0.48149943 -0.45559264 0.21528657
|
||||
0.64472136 -1.1166902 -0.11055728
|
||||
0.55527864 -0.96177082 -0.28944272
|
||||
0.44472136 -0.77027999 -0.28944272
|
||||
0.35527864 -0.61536066 -0.11055728
|
||||
0.35527864 -0.61536066 0.11055728
|
||||
0.44472136 -0.77027999 0.28944272
|
||||
0.64472136 -1.1166902 0.11055728
|
||||
0.55527864 -0.96177082 0.28944272
|
||||
-0.31024785 -1.3006319 0.21528657
|
||||
0.32265887 -1.3526618 0.086151128
|
||||
-0.28197865 -1.1821208 -0.33712267
|
||||
0.25201581 -1.0565095 -0.39061232
|
||||
-0.15380509 -0.64478706 -0.21528657
|
||||
0.14139407 -0.59275717 -0.086151128
|
||||
-0.18207429 -0.76329818 0.33712267
|
||||
0.21203713 -0.88890945 0.39061232
|
||||
1.2815042 -0.38163342 -0.21528657
|
||||
1.01011 -0.95576166 -0.086151128
|
||||
0.75207276 -0.22396814 -0.33712267
|
||||
0.66379961 -0.62808427 -0.39061232
|
||||
0.63530452 -0.18919442 0.21528657
|
||||
0.44264573 -0.41882944 0.086151128
|
||||
1.1647359 -0.3468597 0.33712267
|
||||
0.78895615 -0.74650684 0.39061232
|
||||
1.1264911 -2.7591075e-16 -0.12649111
|
||||
1.1264911 -2.7591075e-16 0.12649111
|
||||
0.87350889 -2.1394797e-16 -0.12649111
|
||||
0.87350889 -9.8977972e-16 0.12649111
|
||||
0.66757847 0.19880564 -0.062604414
|
||||
0.71979881 0.21435692 0.18444051
|
||||
0.50377116 0.47666605 0.045623048
|
||||
0.60267418 0.57024766 0.25883814
|
||||
0.89840401 0.26754575 0.303448
|
||||
1.1351729 0.33805581 0.24896124
|
||||
0.75951745 0.71865207 0.30646131
|
||||
0.91439218 0.86519386 0.17030213
|
||||
1.2492302 0.3720222 0.062604414
|
||||
1.1970099 0.35647092 -0.18444051
|
||||
0.9489846 0.89792505 -0.045623048
|
||||
0.85008158 0.80434345 -0.25883814
|
||||
1.0184047 0.30328209 -0.303448
|
||||
0.78163576 0.23277203 -0.24896124
|
||||
0.69323831 0.65593903 -0.30646131
|
||||
0.53836358 0.50939725 -0.17030213
|
||||
0.41055728 0.71110607 -1.3877788e-17
|
||||
0.5 0.8660254 0.17888544
|
||||
0.5 0.8660254 -0.17888544
|
||||
0.58944272 1.0209447 1.3877788e-17
|
||||
0.17196917 0.72093516 0.17030213
|
||||
0.22144071 0.9283315 0.30646131
|
||||
-0.18923139 0.79330244 0.24896124
|
||||
-0.24655235 1.0336054 0.303448
|
||||
0.27154107 1.138364 0.25883814
|
||||
0.30313361 1.2708073 0.045623048
|
||||
-0.28979207 1.2148764 0.18444051
|
||||
-0.30243444 1.2678762 -0.062604414
|
||||
0.29208377 1.2244838 -0.17030213
|
||||
0.24261222 1.0170874 -0.30646131
|
||||
-0.27482155 1.1521165 -0.24896124
|
||||
-0.21750059 0.91181357 -0.303448
|
||||
0.19251187 0.80705498 -0.25883814
|
||||
0.16091933 0.67461165 -0.045623048
|
||||
-0.17426087 0.73054252 -0.18444051
|
||||
-0.1616185 0.67754273 0.062604414
|
||||
-0.43675445 0.75648089 0.12649111
|
||||
-0.56324555 0.97556992 0.12649111
|
||||
-0.43675445 0.75648089 -0.12649111
|
||||
-0.56324555 0.97556992 -0.12649111
|
||||
-0.68090342 0.64426782 0.303448
|
||||
-0.86035138 0.81406069 0.24896124
|
||||
-1.0021297 0.29843537 0.30646131
|
||||
-1.2064759 0.35928993 0.17030213
|
||||
-0.94679579 0.89585401 0.062604414
|
||||
-0.90721782 0.85840551 -0.18444051
|
||||
-1.2521182 0.37288224 -0.045623048
|
||||
-1.1216227 0.33402052 -0.25883814
|
||||
-0.77185234 0.73032329 -0.303448
|
||||
-0.59240437 0.56053041 -0.24896124
|
||||
-0.91467902 0.27239247 -0.30646131
|
||||
-0.71033275 0.21153791 -0.17030213
|
||||
-0.50595997 0.47873709 -0.062604414
|
||||
-0.54553794 0.5161856 0.18444051
|
||||
-0.66469049 0.19794559 0.045623048
|
||||
-0.79518604 0.23680732 0.25883814
|
||||
-1 1.2246468e-16 0.17888544
|
||||
-1.1788854 1.4437183e-16 1.3877788e-17
|
||||
-0.82111456 1.0055753e-16 -1.3877788e-17
|
||||
-1 5.6655389e-16 -0.17888544
|
||||
-1.1216227 -0.33402052 0.25883814
|
||||
-1.2521182 -0.37288224 0.045623048
|
||||
-0.90721782 -0.85840551 0.18444051
|
||||
-0.94679579 -0.89585401 -0.062604414
|
||||
-1.2064759 -0.35928993 -0.17030213
|
||||
-1.0021297 -0.29843537 -0.30646131
|
||||
-0.86035138 -0.81406069 -0.24896124
|
||||
-0.68090342 -0.64426782 -0.303448
|
||||
-0.79518604 -0.23680732 -0.25883814
|
||||
-0.66469049 -0.19794559 -0.045623048
|
||||
-0.54553794 -0.5161856 -0.18444051
|
||||
-0.50595997 -0.47873709 0.062604414
|
||||
-0.71033275 -0.21153791 0.17030213
|
||||
-0.91467902 -0.27239247 0.30646131
|
||||
-0.59240437 -0.56053041 0.24896124
|
||||
-0.77185234 -0.73032329 0.303448
|
||||
-0.56324555 -0.97556992 0.12649111
|
||||
-0.56324555 -0.97556992 -0.12649111
|
||||
-0.43675445 -0.75648089 0.12649111
|
||||
-0.43675445 -0.75648089 -0.12649111
|
||||
-0.30243444 -1.2678762 0.062604414
|
||||
-0.28979207 -1.2148764 -0.18444051
|
||||
0.30313361 -1.2708073 -0.045623048
|
||||
0.27154107 -1.138364 -0.25883814
|
||||
-0.24655235 -1.0336054 -0.303448
|
||||
-0.18923139 -0.79330244 -0.24896124
|
||||
0.22144071 -0.9283315 -0.30646131
|
||||
0.17196917 -0.72093516 -0.17030213
|
||||
-0.1616185 -0.67754273 -0.062604414
|
||||
-0.17426087 -0.73054252 0.18444051
|
||||
0.16091933 -0.67461165 0.045623048
|
||||
0.19251187 -0.80705498 0.25883814
|
||||
-0.21750059 -0.91181357 0.303448
|
||||
-0.27482155 -1.1521165 0.24896124
|
||||
0.24261222 -1.0170874 0.30646131
|
||||
0.29208377 -1.2244838 0.17030213
|
||||
0.58944272 -1.0209447 2.7755576e-17
|
||||
0.5 -0.8660254 -0.17888544
|
||||
0.5 -0.8660254 0.17888544
|
||||
0.41055728 -0.71110607 -2.7755576e-17
|
||||
0.91439218 -0.86519386 -0.17030213
|
||||
0.75951745 -0.71865207 -0.30646131
|
||||
1.1351729 -0.33805581 -0.24896124
|
||||
0.89840401 -0.26754575 -0.303448
|
||||
0.60267418 -0.57024766 -0.25883814
|
||||
0.50377116 -0.47666605 -0.045623048
|
||||
0.71979881 -0.21435692 -0.18444051
|
||||
0.66757847 -0.19880564 0.062604414
|
||||
0.53836358 -0.50939725 0.17030213
|
||||
0.69323831 -0.65593903 0.30646131
|
||||
0.78163576 -0.23277203 0.24896124
|
||||
1.0184047 -0.30328209 0.303448
|
||||
0.85008158 -0.80434345 0.25883814
|
||||
0.9489846 -0.89792505 0.045623048
|
||||
1.1970099 -0.35647092 0.18444051
|
||||
1.2492302 -0.3720222 -0.062604414
|
||||
0.81390971 0.24238325 -0.096279082
|
||||
0.86613006 0.25793453 0.15076584
|
||||
1.0506786 0.31289331 -0.15076584
|
||||
1.102899 0.32844459 0.096279082
|
||||
0.59948901 0.56723386 -0.038527956
|
||||
0.69839202 0.66081546 0.17468714
|
||||
0.75436373 0.71377565 -0.17468714
|
||||
0.85326675 0.80735725 0.038527956
|
||||
0.19149443 0.80278964 0.038527956
|
||||
0.24096597 1.010186 0.17468714
|
||||
0.22308696 0.93523296 -0.17468714
|
||||
0.27255851 1.1426293 -0.038527956
|
||||
-0.1970448 0.82605811 0.096279082
|
||||
-0.25436576 1.066361 0.15076584
|
||||
-0.20968717 0.8790579 -0.15076584
|
||||
-0.26700813 1.1193608 -0.096279082
|
||||
-0.65644288 0.62112337 0.15076584
|
||||
-0.83589085 0.79091624 0.096279082
|
||||
-0.61686491 0.58367486 -0.096279082
|
||||
-0.79631287 0.75346774 -0.15076584
|
||||
-0.92147899 0.2744175 0.17468714
|
||||
-1.1258253 0.33527206 0.038527956
|
||||
-0.79098343 0.23555578 -0.038527956
|
||||
-0.99532971 0.29641033 -0.17468714
|
||||
-0.99532971 -0.29641033 0.17468714
|
||||
-1.1258253 -0.33527206 -0.038527956
|
||||
-0.79098343 -0.23555578 0.038527956
|
||||
-0.92147899 -0.2744175 -0.17468714
|
||||
-0.79631287 -0.75346774 0.15076584
|
||||
-0.83589085 -0.79091624 -0.096279082
|
||||
-0.61686491 -0.58367486 0.096279082
|
||||
-0.65644288 -0.62112337 -0.15076584
|
||||
-0.26700813 -1.1193608 0.096279082
|
||||
-0.25436576 -1.066361 -0.15076584
|
||||
-0.20968717 -0.8790579 0.15076584
|
||||
-0.1970448 -0.82605811 -0.096279082
|
||||
0.27255851 -1.1426293 0.038527956
|
||||
0.24096597 -1.010186 -0.17468714
|
||||
0.22308696 -0.93523296 0.17468714
|
||||
0.19149443 -0.80278964 -0.038527956
|
||||
0.85326675 -0.80735725 -0.038527956
|
||||
0.69839202 -0.66081546 -0.17468714
|
||||
0.75436373 -0.71377565 0.17468714
|
||||
0.59948901 -0.56723386 0.038527956
|
||||
1.102899 -0.32844459 -0.096279082
|
||||
0.86613006 -0.25793453 -0.15076584
|
||||
1.0506786 -0.31289331 0.15076584
|
||||
0.81390971 -0.24238325 0.096279082
|
||||
@@ -0,0 +1,236 @@
|
||||
MFEM mesh v1.0
|
||||
|
||||
#
|
||||
# MFEM Geometry Types (see mesh/geom.hpp):
|
||||
#
|
||||
# POINT = 0
|
||||
# SEGMENT = 1
|
||||
# TRIANGLE = 2
|
||||
# SQUARE = 3
|
||||
# TETRAHEDRON = 4
|
||||
# CUBE = 5
|
||||
# PRISM = 6
|
||||
#
|
||||
|
||||
dimension
|
||||
3
|
||||
|
||||
elements
|
||||
6
|
||||
1 6 0 1 2 3 4 5
|
||||
1 6 3 4 5 6 7 8
|
||||
1 6 6 7 8 9 10 11
|
||||
1 6 9 10 11 12 13 14
|
||||
1 6 12 13 14 15 16 17
|
||||
1 6 15 16 17 0 1 2
|
||||
|
||||
boundary
|
||||
18
|
||||
1 3 0 1 4 3
|
||||
1 3 1 2 5 4
|
||||
1 3 2 0 3 5
|
||||
1 3 3 4 7 6
|
||||
1 3 4 5 8 7
|
||||
1 3 5 3 6 8
|
||||
1 3 6 7 10 9
|
||||
1 3 7 8 11 10
|
||||
1 3 8 6 9 11
|
||||
1 3 9 10 13 12
|
||||
1 3 10 11 14 13
|
||||
1 3 11 9 12 14
|
||||
1 3 12 13 16 15
|
||||
1 3 13 14 17 16
|
||||
1 3 14 12 15 17
|
||||
1 3 15 16 1 0
|
||||
1 3 16 17 2 1
|
||||
1 3 17 15 0 2
|
||||
|
||||
vertices
|
||||
18
|
||||
|
||||
nodes
|
||||
FiniteElementSpace
|
||||
FiniteElementCollection: H1_3D_P3
|
||||
VDim: 3
|
||||
Ordering: 1
|
||||
|
||||
0.6 -1.4695762e-16 -9.7971744e-17
|
||||
1.2 -2.9391523e-16 0.34641016
|
||||
1.2 -1.3597293e-15 -0.34641016
|
||||
0.4 0.69282032 0.34641016
|
||||
0.7 1.2124356 2.7755576e-17
|
||||
0.4 0.69282032 -0.34641016
|
||||
-0.6 1.0392305 0.34641016
|
||||
-0.6 1.0392305 -0.34641016
|
||||
-0.3 0.51961524 -3.8651415e-16
|
||||
-1.4 1.7145055e-16 4.8985872e-17
|
||||
-0.8 9.7971744e-17 -0.34641016
|
||||
-0.8 4.5324311e-16 0.34641016
|
||||
-0.6 -1.0392305 -0.34641016
|
||||
-0.3 -0.51961524 -2.220446e-16
|
||||
-0.6 -1.0392305 0.34641016
|
||||
0.4 -0.69282032 -0.34641016
|
||||
0.4 -0.69282032 0.34641016
|
||||
0.7 -1.2124356 7.7509221e-16
|
||||
0.76583592 -8.6777464e-16 0.095745414
|
||||
1.0341641 2.5022695e-15 0.25066475
|
||||
1.2 -1.3597293e-15 0.15491933
|
||||
1.2 -2.9391523e-16 -0.15491933
|
||||
0.76583592 4.9262324e-16 -0.095745414
|
||||
1.0341641 3.4207917e-15 -0.25066475
|
||||
0.48291796 0.83643844 0.25066475
|
||||
0.61708204 1.0688174 0.095745414
|
||||
0.61708204 1.0688174 -0.095745414
|
||||
0.48291796 0.83643844 -0.25066475
|
||||
0.4 0.69282032 0.15491933
|
||||
0.4 0.69282032 -0.15491933
|
||||
0.59098879 0.17599714 0.11416557
|
||||
0.51532795 0.48760104 0.27491822
|
||||
1.2368698 0.36834126 0.27491822
|
||||
1.0048434 0.95077837 0.11416557
|
||||
1.0473544 0.31190335 -0.38908379
|
||||
0.65896232 0.62350725 -0.38908379
|
||||
-0.6 1.0392305 0.15491933
|
||||
-0.6 1.0392305 -0.15491933
|
||||
-0.51708204 0.89561236 -0.25066475
|
||||
-0.38291796 0.66323336 -0.095745414
|
||||
-0.51708204 0.89561236 0.25066475
|
||||
-0.38291796 0.66323336 0.095745414
|
||||
0.21049196 0.88243173 0.38908379
|
||||
-0.25356098 1.0629872 0.38908379
|
||||
0.32097654 1.3456091 -0.11416557
|
||||
-0.29944203 1.2553313 -0.27491822
|
||||
0.16461091 0.69008761 -0.27491822
|
||||
-0.1430764 0.59980988 -0.11416557
|
||||
-1.2341641 6.9922046e-16 -0.095745414
|
||||
-0.96583592 -1.1684711e-15 -0.25066475
|
||||
-0.8 4.5324311e-16 -0.15491933
|
||||
-0.8 9.7971744e-17 0.15491933
|
||||
-1.2341641 -3.9693744e-16 0.095745414
|
||||
-0.96583592 -1.5973885e-15 0.25066475
|
||||
-0.93742781 0.88699007 0.27491822
|
||||
-1.3258199 0.3948307 0.11416557
|
||||
-0.79379344 0.75108386 -0.38908379
|
||||
-0.86945428 0.25892449 -0.38908379
|
||||
-0.44791239 0.42381273 0.11416557
|
||||
-0.67993886 0.20248658 0.27491822
|
||||
-0.51708204 -0.89561236 -0.25066475
|
||||
-0.38291796 -0.66323336 -0.095745414
|
||||
-0.38291796 -0.66323336 0.095745414
|
||||
-0.51708204 -0.89561236 0.25066475
|
||||
-0.6 -1.0392305 -0.15491933
|
||||
-0.6 -1.0392305 0.15491933
|
||||
-1.3258199 -0.3948307 -0.11416557
|
||||
-0.93742781 -0.88699007 -0.27491822
|
||||
-0.67993886 -0.20248658 -0.27491822
|
||||
-0.44791239 -0.42381273 -0.11416557
|
||||
-0.86945428 -0.25892449 0.38908379
|
||||
-0.79379344 -0.75108386 0.38908379
|
||||
0.4 -0.69282032 -0.15491933
|
||||
0.4 -0.69282032 0.15491933
|
||||
0.48291796 -0.83643844 0.25066475
|
||||
0.61708204 -1.0688174 0.095745414
|
||||
0.48291796 -0.83643844 -0.25066475
|
||||
0.61708204 -1.0688174 -0.095745414
|
||||
-0.25356098 -1.0629872 -0.38908379
|
||||
0.21049196 -0.88243173 -0.38908379
|
||||
-0.1430764 -0.59980988 0.11416557
|
||||
0.16461091 -0.69008761 0.27491822
|
||||
-0.29944203 -1.2553313 0.27491822
|
||||
0.32097654 -1.3456091 0.11416557
|
||||
0.59098879 -0.17599714 -0.11416557
|
||||
0.51532795 -0.48760104 -0.27491822
|
||||
1.0473544 -0.31190335 0.38908379
|
||||
0.65896232 -0.62350725 0.38908379
|
||||
1.2368698 -0.36834126 -0.27491822
|
||||
1.0048434 -0.95077837 -0.11416557
|
||||
1 2.4196059e-15 -1.3788671e-16
|
||||
0.5 0.8660254 -8.6542076e-17
|
||||
0.76950592 0.22915975 0.15859651
|
||||
1.0583527 0.31517866 0.23048728
|
||||
0.65062668 0.6156201 0.23048728
|
||||
0.86954463 0.8227593 0.15859651
|
||||
1.1844891 0.35274221 0.091392579
|
||||
1.0997352 0.32750241 -0.20555815
|
||||
0.9092442 0.86032286 -0.024929133
|
||||
0.75456149 0.71396276 -0.24998909
|
||||
0.92121806 0.2743398 -0.24998909
|
||||
0.71712515 0.2135607 -0.024929133
|
||||
0.61926276 0.5859437 -0.20555815
|
||||
0.55502751 0.52516459 0.091392579
|
||||
-0.5 0.8660254 5.1344633e-17
|
||||
0.24102914 1.0104508 0.24998909
|
||||
0.29043935 1.21759 0.024929133
|
||||
-0.26624219 1.1161498 0.20555815
|
||||
-0.28676082 1.2021687 -0.091392579
|
||||
0.27775814 1.1644274 -0.15859651
|
||||
0.20782931 0.87126929 -0.23048728
|
||||
-0.25622363 1.0741497 -0.23048728
|
||||
-0.1862948 0.78099155 -0.15859651
|
||||
0.17729212 0.74325022 -0.091392579
|
||||
0.19781075 0.82926913 0.20555815
|
||||
-0.17361359 0.72782894 0.024929133
|
||||
-0.22302379 0.93496814 0.24998909
|
||||
-1 -1.2098029e-15 1.3788671e-16
|
||||
-0.89772824 0.84942651 0.091392579
|
||||
-0.833493 0.78864741 -0.20555815
|
||||
-1.1996835 0.35726714 -0.024929133
|
||||
-0.99559063 0.29648804 -0.24998909
|
||||
-0.69819427 0.66062834 -0.24998909
|
||||
-0.54351156 0.51426825 -0.024929133
|
||||
-0.8170735 0.24332543 -0.20555815
|
||||
-0.73231963 0.21808563 0.091392579
|
||||
-0.58321113 0.5518318 0.15859651
|
||||
-0.80212907 0.758971 0.23048728
|
||||
-0.85845599 0.25564918 0.23048728
|
||||
-1.1473028 0.34166809 0.15859651
|
||||
-0.5 -0.8660254 8.6542076e-17
|
||||
-1.1473028 -0.34166809 -0.15859651
|
||||
-0.85845599 -0.25564918 -0.23048728
|
||||
-0.80212907 -0.758971 -0.23048728
|
||||
-0.58321113 -0.5518318 -0.15859651
|
||||
-0.73231963 -0.21808563 -0.091392579
|
||||
-0.8170735 -0.24332543 0.20555815
|
||||
-0.54351156 -0.51426825 0.024929133
|
||||
-0.69819427 -0.66062834 0.24998909
|
||||
-0.99559063 -0.29648804 0.24998909
|
||||
-1.1996835 -0.35726714 0.024929133
|
||||
-0.833493 -0.78864741 0.20555815
|
||||
-0.89772824 -0.84942651 -0.091392579
|
||||
0.5 -0.8660254 -5.1344633e-17
|
||||
-0.22302379 -0.93496814 -0.24998909
|
||||
-0.17361359 -0.72782894 -0.024929133
|
||||
0.19781075 -0.82926913 -0.20555815
|
||||
0.17729212 -0.74325022 0.091392579
|
||||
-0.1862948 -0.78099155 0.15859651
|
||||
-0.25622363 -1.0741497 0.23048728
|
||||
0.20782931 -0.87126929 0.23048728
|
||||
0.27775814 -1.1644274 0.15859651
|
||||
-0.28676082 -1.2021687 0.091392579
|
||||
-0.26624219 -1.1161498 -0.20555815
|
||||
0.29043935 -1.21759 -0.024929133
|
||||
0.24102914 -1.0104508 -0.24998909
|
||||
0.55502751 -0.52516459 -0.091392579
|
||||
0.61926276 -0.5859437 0.20555815
|
||||
0.71712515 -0.2135607 0.024929133
|
||||
0.92121806 -0.2743398 0.24998909
|
||||
0.75456149 -0.71396276 0.24998909
|
||||
0.9092442 -0.86032286 0.024929133
|
||||
1.0997352 -0.32750241 0.20555815
|
||||
1.1844891 -0.35274221 -0.091392579
|
||||
0.86954463 -0.8227593 -0.15859651
|
||||
0.65062668 -0.6156201 -0.23048728
|
||||
1.0583527 -0.31517866 -0.23048728
|
||||
0.76950592 -0.22915975 -0.15859651
|
||||
0.95840435 0.28541392 -1.3795119e-16
|
||||
0.72637788 0.68729555 -1.1412456e-16
|
||||
0.23202647 0.97270947 -5.1760042e-17
|
||||
-0.23202647 0.97270947 1.2226691e-17
|
||||
-0.72637788 0.68729555 8.6191148e-17
|
||||
-0.95840435 0.28541392 1.2635125e-16
|
||||
-0.95840435 -0.28541392 1.3795119e-16
|
||||
-0.72637788 -0.68729555 1.1412456e-16
|
||||
-0.23202647 -0.97270947 5.1760042e-17
|
||||
0.23202647 -0.97270947 -1.2226691e-17
|
||||
0.72637788 -0.68729555 -8.6191148e-17
|
||||
0.95840435 -0.28541392 -1.2635125e-16
|
||||
@@ -38,7 +38,7 @@ PROJECT_NAME = "MFEM"
|
||||
# could be handy for archiving the generated documentation or if some version
|
||||
# control system is used.
|
||||
|
||||
PROJECT_NUMBER = v3.3.3
|
||||
PROJECT_NUMBER = v3.4.1
|
||||
|
||||
# Using the PROJECT_BRIEF tag one can provide an optional one line description
|
||||
# for a project that appears at the top of each page and should give viewer a
|
||||
@@ -767,6 +767,7 @@ INPUT = @MFEM_SOURCE_DIR@/doc/CodeDocumentation.dox \
|
||||
@MFEM_SOURCE_DIR@/fem \
|
||||
@MFEM_SOURCE_DIR@/examples \
|
||||
@MFEM_SOURCE_DIR@/examples/petsc \
|
||||
@MFEM_SOURCE_DIR@/examples/pumi \
|
||||
@MFEM_SOURCE_DIR@/examples/sundials \
|
||||
@MFEM_SOURCE_DIR@/miniapps/common \
|
||||
@MFEM_SOURCE_DIR@/miniapps/meshing \
|
||||
|
||||
@@ -36,8 +36,8 @@ namespace mfem {
|
||||
* - HypreSolver and other \link hypre.hpp hypre classes\endlink
|
||||
*
|
||||
* <H3>Example codes</H3>
|
||||
* - <a class="el" href="ex1_8cpp_source.html">Example 1</a>: nodal H1 FEM for the Laplace problem
|
||||
* - <a class="el" href="ex1p_8cpp_source.html">Example 1p</a>: parallel nodal H1 FEM for the Laplace problem
|
||||
* - <a class="el" href="examples_2ex1_8cpp_source.html">Example 1</a>: nodal H1 FEM for the Laplace problem
|
||||
* - <a class="el" href="examples_2ex1p_8cpp_source.html">Example 1p</a>: parallel nodal H1 FEM for the Laplace problem
|
||||
* - <a class="el" href="ex2_8cpp_source.html">Example 2</a>: vector FEM for linear elasticity
|
||||
* - <a class="el" href="ex2p_8cpp_source.html">Example 2p</a>: parallel vector FEM for linear elasticity
|
||||
* - <a class="el" href="ex3_8cpp_source.html">Example 3</a>: Nedelec H(curl) FEM for the definite Maxwell problem
|
||||
@@ -56,7 +56,7 @@ namespace mfem {
|
||||
* - <a class="el" href="ex9p_8cpp_source.html">Example 9p</a>: parallel Discontinuous Galerkin (DG) time-dependent advection
|
||||
* - <a class="el" href="ex10_8cpp_source.html">Example 10</a>: time-dependent implicit nonlinear elasticity
|
||||
* - <a class="el" href="ex10p_8cpp_source.html">Example 10p</a>: parallel time-dependent implicit nonlinear elasticity
|
||||
* - <a class="el" href="ex11p_8cpp_source.html">Example 11p</a>: parallel Laplace eigensolver
|
||||
* - <a class="el" href="examples_2ex11p_8cpp_source.html">Example 11p</a>: parallel Laplace eigensolver
|
||||
* - <a class="el" href="ex12p_8cpp_source.html">Example 12p</a>: parallel linear elasticity eigensolver
|
||||
* - <a class="el" href="ex13p_8cpp_source.html">Example 13p</a>: parallel Maxwell eigensolver
|
||||
* - <a class="el" href="ex14_8cpp_source.html">Example 14</a>: Discontinuous Galerkin (DG) for the Laplace problem
|
||||
@@ -71,6 +71,10 @@ namespace mfem {
|
||||
* - <a class="el" href="ex18p_8cpp_source.html">Example 18p</a>: parallel Discontinuous Galerkin (DG) for the Euler equations
|
||||
* - <a class="el" href="ex19_8cpp_source.html">Example 19</a>: incompressible nonlinear elasticity
|
||||
* - <a class="el" href="ex19p_8cpp_source.html">Example 19p</a>: parallel incompressible nonlinear elasticity
|
||||
* - <a class="el" href="ex20_8cpp_source.html">Example 20</a>: symplectic ODE integration
|
||||
* - <a class="el" href="ex20p_8cpp_source.html">Example 20p</a>: parallel symplectic ODE integration
|
||||
* - <a class="el" href="ex22_8cpp_source.html">Example 22</a>: adaptive mesh refinement for linear elasticity
|
||||
* - <a class="el" href="ex22p_8cpp_source.html">Example 22p</a>: parallel adaptive mesh refinement for linear elasticity
|
||||
*
|
||||
* <H4>SUNDIALS Examples</H4>
|
||||
* - Variants of Examples
|
||||
@@ -96,6 +100,15 @@ namespace mfem {
|
||||
* <a class="el" href="petsc_2ex10p_8cpp_source.html">10p</a>
|
||||
* demonstrating the use of MFEM's \link petsc.hpp PETSc classes\endlink
|
||||
*
|
||||
* <H4>PUMI Examples</H4>
|
||||
* - Variants of Examples
|
||||
* <a class="el" href="examples_2pumi_2ex1_8cpp_source.html">1</a>,
|
||||
* <a class="el" href="examples_2pumi_2ex1p_8cpp_source.html">1p</a>,
|
||||
* <a class="el" href="pumi_2ex2_8cpp_source.html">2</a>,
|
||||
* and
|
||||
* <a class="el" href="pumi_2ex6p_8cpp_source.html">6p</a>
|
||||
* demonstrating the use of MFEM's \link pumi.hpp PUMI classes\endlink
|
||||
*
|
||||
* <H3>Miniapps</H3>
|
||||
* - <a class="el" href="volta_8cpp_source.html">Volta</a>: simple electrostatics simulation code
|
||||
* - <a class="el" href="tesla_8cpp_source.html">Tesla</a>: simple magnetostatics simulation code
|
||||
@@ -103,7 +116,9 @@ namespace mfem {
|
||||
* - <a class="el" href="joule_8cpp_source.html">Joule</a>: transient magnetics and Joule heating miniapp
|
||||
* - <a class="el" href="mobius-strip_8cpp_source.html">Mobius Strip</a>: generate various Mobius strip-like meshes
|
||||
* - <a class="el" href="klein-bottle_8cpp_source.html">Klein Bottle</a>: generate three types of Klein bottle surfaces
|
||||
* - <a class="el" href="toroid_8cpp_source.html">Toroid</a>: generate simple toroidal meshes
|
||||
* - <a class="el" href="shaper_8cpp_source.html">Shaper</a>: resolve material interfaces by mesh refinement
|
||||
* - <a class="el" href="extruder_8cpp_source.html">Extruder</a>: extrude a low-dimensional mesh into a higher dimension
|
||||
* - <a class="el" href="mesh-explorer_8cpp_source.html">Mesh Explorer</a>: visualize and manipulate meshes
|
||||
* - <a class="el" href="mesh-optimizer_8cpp_source.html">Mesh Optimizer</a>: optimize high-order meshes, <a class="el" href="mesh-optimizer_8cpp_source.html">serial</a> and <a class="el" href="pmesh-optimizer_8cpp_source.html">parallel</a> versions
|
||||
* - <a class="el" href="display-basis_8cpp_source.html">Display Basis</a>: visualize finite element basis functions
|
||||
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 12 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 44 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 51 KiB |
+13
-4
@@ -25,6 +25,9 @@ list(APPEND ALL_EXE_SRCS
|
||||
ex16.cpp
|
||||
ex17.cpp
|
||||
ex18.cpp
|
||||
ex19.cpp
|
||||
ex20.cpp
|
||||
ex22.cpp
|
||||
)
|
||||
|
||||
if (MFEM_USE_MPI)
|
||||
@@ -47,6 +50,9 @@ if (MFEM_USE_MPI)
|
||||
ex16p.cpp
|
||||
ex17p.cpp
|
||||
ex18p.cpp
|
||||
ex19p.cpp
|
||||
ex20p.cpp
|
||||
ex22p.cpp
|
||||
)
|
||||
endif()
|
||||
|
||||
@@ -61,8 +67,6 @@ foreach(SRC_FILE ${ALL_EXE_SRCS})
|
||||
get_filename_component(SRC_FILENAME ${SRC_FILE} NAME)
|
||||
string(REPLACE ".cpp" "" TEST_NAME ${SRC_FILENAME})
|
||||
|
||||
string(FIND ${TEST_NAME} "p" is_parallel_test)
|
||||
|
||||
set(THIS_TEST_OPTIONS "-no-vis")
|
||||
if (${TEST_NAME} MATCHES "ex10p*")
|
||||
list(APPEND THIS_TEST_OPTIONS "-tf" "5")
|
||||
@@ -70,12 +74,12 @@ foreach(SRC_FILE ${ALL_EXE_SRCS})
|
||||
list(APPEND THIS_TEST_OPTIONS "-e" "1")
|
||||
endif()
|
||||
|
||||
if (is_parallel_test EQUAL -1)
|
||||
if (NOT (${TEST_NAME} MATCHES ".*p$"))
|
||||
add_test(NAME ${TEST_NAME}_ser
|
||||
COMMAND ${TEST_NAME} ${THIS_TEST_OPTIONS})
|
||||
else()
|
||||
add_test(NAME ${TEST_NAME}_np=4
|
||||
COMMAND ${MPIEXEC} ${MPIEXEC_NUMPROC_FLAG} 4
|
||||
COMMAND ${MPIEXEC} ${MPIEXEC_NUMPROC_FLAG} ${MFEM_MPI_NP}
|
||||
${MPIEXEC_PREFLAGS}
|
||||
$<TARGET_FILE:${TEST_NAME}> ${THIS_TEST_OPTIONS}
|
||||
${MPIEXEC_POSTFLAGS})
|
||||
@@ -91,3 +95,8 @@ endif()
|
||||
if (MFEM_USE_PETSC)
|
||||
add_subdirectory(petsc)
|
||||
endif()
|
||||
|
||||
# Include the examples/pumi directory if PUMI is enabled
|
||||
if (MFEM_USE_PUMI)
|
||||
add_subdirectory(pumi)
|
||||
endif()
|
||||
|
||||
+160
-77
File diff suppressed because one or more lines are too long
@@ -4,13 +4,18 @@
|
||||
//
|
||||
// Sample runs: ex1 -m ../data/square-disc.mesh
|
||||
// ex1 -m ../data/star.mesh
|
||||
// ex1 -m ../data/star-mixed.mesh
|
||||
// ex1 -m ../data/escher.mesh
|
||||
// ex1 -m ../data/fichera.mesh
|
||||
// ex1 -m ../data/fichera-mixed.mesh
|
||||
// ex1 -m ../data/toroid-wedge.mesh
|
||||
// ex1 -m ../data/square-disc-p2.vtk -o 2
|
||||
// ex1 -m ../data/square-disc-p3.mesh -o 3
|
||||
// ex1 -m ../data/square-disc-nurbs.mesh -o -1
|
||||
// ex1 -m ../data/star-mixed-p2.mesh -o 2
|
||||
// ex1 -m ../data/disc-nurbs.mesh -o -1
|
||||
// ex1 -m ../data/pipe-nurbs.mesh -o -1
|
||||
// ex1 -m ../data/fichera-mixed-p2.mesh -o 2
|
||||
// ex1 -m ../data/star-surf.mesh
|
||||
// ex1 -m ../data/square-disc-surf.mesh
|
||||
// ex1 -m ../data/inline-segment.mesh
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
// ex10 -m ../data/beam-tri.mesh -s 3 -r 2 -o 2 -dt 3
|
||||
// ex10 -m ../data/beam-hex.mesh -s 2 -r 1 -o 2 -dt 3
|
||||
// ex10 -m ../data/beam-tet.mesh -s 2 -r 1 -o 2 -dt 3
|
||||
// ex10 -m ../data/beam-wedge.mesh -s 2 -r 1 -o 2 -dt 3
|
||||
// ex10 -m ../data/beam-quad.mesh -s 14 -r 2 -o 2 -dt 0.03 -vs 20
|
||||
// ex10 -m ../data/beam-hex.mesh -s 14 -r 1 -o 2 -dt 0.05 -vs 20
|
||||
// ex10 -m ../data/beam-quad-amr.mesh -s 3 -r 2 -o 2 -dt 3
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
// mpirun -np 4 ex10p -m ../data/beam-tri.mesh -s 3 -rs 2 -dt 3
|
||||
// mpirun -np 4 ex10p -m ../data/beam-hex.mesh -s 2 -rs 1 -dt 3
|
||||
// mpirun -np 4 ex10p -m ../data/beam-tet.mesh -s 2 -rs 1 -dt 3
|
||||
// mpirun -np 4 ex10p -m ../data/beam-wedge.mesh -s 2 -rs 1 -dt 3
|
||||
// mpirun -np 4 ex10p -m ../data/beam-quad.mesh -s 14 -rs 2 -dt 0.03 -vs 20
|
||||
// mpirun -np 4 ex10p -m ../data/beam-hex.mesh -s 14 -rs 1 -dt 0.05 -vs 20
|
||||
// mpirun -np 4 ex10p -m ../data/beam-quad-amr.mesh -s 3 -rs 2 -dt 3
|
||||
|
||||
@@ -4,8 +4,11 @@
|
||||
//
|
||||
// Sample runs: mpirun -np 4 ex11p -m ../data/square-disc.mesh
|
||||
// mpirun -np 4 ex11p -m ../data/star.mesh
|
||||
// mpirun -np 4 ex11p -m ../data/star-mixed.mesh
|
||||
// mpirun -np 4 ex11p -m ../data/escher.mesh
|
||||
// mpirun -np 4 ex11p -m ../data/fichera.mesh
|
||||
// mpirun -np 4 ex11p -m ../data/fichera-mixed.mesh
|
||||
// mpirun -np 4 ex11p -m ../data/toroid-wedge.mesh -o 2
|
||||
// mpirun -np 4 ex11p -m ../data/square-disc-p2.vtk -o 2
|
||||
// mpirun -np 4 ex11p -m ../data/square-disc-p3.mesh -o 3
|
||||
// mpirun -np 4 ex11p -m ../data/square-disc-nurbs.mesh -o -1
|
||||
@@ -15,6 +18,11 @@
|
||||
// mpirun -np 4 ex11p -m ../data/star-surf.mesh
|
||||
// mpirun -np 4 ex11p -m ../data/square-disc-surf.mesh
|
||||
// mpirun -np 4 ex11p -m ../data/inline-segment.mesh
|
||||
// mpirun -np 4 ex11p -m ../data/inline-quad.mesh
|
||||
// mpirun -np 4 ex11p -m ../data/inline-tri.mesh
|
||||
// mpirun -np 4 ex11p -m ../data/inline-hex.mesh
|
||||
// mpirun -np 4 ex11p -m ../data/inline-tet.mesh
|
||||
// mpirun -np 4 ex11p -m ../data/inline-wedge.mesh -s 83
|
||||
// mpirun -np 4 ex11p -m ../data/amr-quad.mesh
|
||||
// mpirun -np 4 ex11p -m ../data/amr-hex.mesh
|
||||
// mpirun -np 4 ex11p -m ../data/mobius-strip.mesh -n 8
|
||||
|
||||
+3
-2
@@ -5,9 +5,10 @@
|
||||
// Sample runs:
|
||||
// mpirun -np 4 ex12p -m ../data/beam-tri.mesh
|
||||
// mpirun -np 4 ex12p -m ../data/beam-quad.mesh
|
||||
// mpirun -np 4 ex12p -m ../data/beam-tet.mesh -n 10 -o 2 -elast
|
||||
// mpirun -np 4 ex12p -m ../data/beam-tet.mesh -s 79 -n 10 -o 2 -elast
|
||||
// mpirun -np 4 ex12p -m ../data/beam-hex.mesh -s 3876
|
||||
// mpirun -np 4 ex12p -m ../data/beam-tri.mesh -o 2 -sys
|
||||
// mpirun -np 4 ex12p -m ../data/beam-wedge.mesh -s 79
|
||||
// mpirun -np 4 ex12p -m ../data/beam-tri.mesh -s 3876 -o 2 -sys
|
||||
// mpirun -np 4 ex12p -m ../data/beam-quad.mesh -s 4526 -n 6 -o 3 -elast
|
||||
// mpirun -np 4 ex12p -m ../data/beam-quad-nurbs.mesh
|
||||
// mpirun -np 4 ex12p -m ../data/beam-hex-nurbs.mesh
|
||||
|
||||
@@ -110,6 +110,7 @@ int main(int argc, char *argv[])
|
||||
{
|
||||
pmesh->UniformRefinement();
|
||||
}
|
||||
pmesh->ReorientTetMesh();
|
||||
|
||||
// 6. Define a parallel finite element space on the parallel mesh. Here we
|
||||
// use the Nedelec finite elements of the specified order.
|
||||
|
||||
@@ -4,8 +4,10 @@
|
||||
//
|
||||
// Sample runs: ex14 -m ../data/inline-quad.mesh -o 0
|
||||
// ex14 -m ../data/star.mesh -r 4 -o 2
|
||||
// ex14 -m ../data/star-mixed.mesh -r 4 -o 2
|
||||
// ex14 -m ../data/escher.mesh -s 1
|
||||
// ex14 -m ../data/fichera.mesh -s 1 -k 1
|
||||
// ex14 -m ../data/fichera-mixed.mesh -s 1 -k 1
|
||||
// ex14 -m ../data/square-disc-p2.vtk -r 3 -o 2
|
||||
// ex14 -m ../data/square-disc-p3.mesh -r 2 -o 3
|
||||
// ex14 -m ../data/square-disc-nurbs.mesh -o 1
|
||||
|
||||
@@ -4,8 +4,10 @@
|
||||
//
|
||||
// Sample runs: mpirun -np 4 ex14p -m ../data/inline-quad.mesh -o 0
|
||||
// mpirun -np 4 ex14p -m ../data/star.mesh -o 2
|
||||
// mpirun -np 4 ex14p -m ../data/star-mixed.mesh -o 2
|
||||
// mpirun -np 4 ex14p -m ../data/escher.mesh -s 1
|
||||
// mpirun -np 4 ex14p -m ../data/fichera.mesh -s 1 -k 1
|
||||
// mpirun -np 4 ex14p -m ../data/fichera-mixed.mesh -s 1 -k 1
|
||||
// mpirun -np 4 ex14p -m ../data/square-disc-p2.vtk -o 2
|
||||
// mpirun -np 4 ex14p -m ../data/square-disc-p3.mesh -o 3
|
||||
// mpirun -np 4 ex14p -m ../data/square-disc-nurbs.mesh -o 1
|
||||
|
||||
@@ -135,6 +135,8 @@ int main(int argc, char *argv[])
|
||||
{
|
||||
mesh.UniformRefinement();
|
||||
}
|
||||
// Make sure tet-only meshes are marked for local refinement.
|
||||
mesh.Finalize(true);
|
||||
|
||||
// 4. All boundary attributes will be used for essential (Dirichlet) BC.
|
||||
MFEM_VERIFY(mesh.bdr_attributes.Size() > 0,
|
||||
|
||||
@@ -151,6 +151,8 @@ int main(int argc, char *argv[])
|
||||
{
|
||||
mesh->UniformRefinement();
|
||||
}
|
||||
// Make sure tet-only meshes are marked for local refinement.
|
||||
mesh->Finalize(true);
|
||||
|
||||
// 5. Define a parallel mesh by partitioning the serial mesh. Once the
|
||||
// parallel mesh is defined, the serial mesh can be deleted.
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
// ex16 -s 3 -a 0.5 -k 0.5 -o 4
|
||||
// ex16 -s 14 -dt 1.0e-4 -tf 4.0e-2 -vs 40
|
||||
// ex16 -m ../data/fichera-q2.mesh
|
||||
// ex16 -m ../data/fichera-mixed.mesh
|
||||
// ex16 -m ../data/escher.mesh
|
||||
// ex16 -m ../data/beam-tet.mesh -tf 10 -dt 0.1
|
||||
// ex16 -m ../data/amr-quad.mesh -o 4 -r 0
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
// mpirun -np 8 ex16p -s 3 -a 0.5 -k 0.5 -o 4
|
||||
// mpirun -np 4 ex16p -s 14 -dt 1.0e-4 -tf 4.0e-2 -vs 40
|
||||
// mpirun -np 16 ex16p -m ../data/fichera-q2.mesh
|
||||
// mpirun -np 16 ex16p -m ../data/fichera-mixed.mesh
|
||||
// mpirun -np 16 ex16p -m ../data/escher-p2.mesh
|
||||
// mpirun -np 8 ex16p -m ../data/beam-tet.mesh -tf 10 -dt 0.1
|
||||
// mpirun -np 4 ex16p -m ../data/amr-quad.mesh -o 4 -rs 0 -rp 0
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
// ex17 -m ../data/beam-quad.mesh
|
||||
// ex17 -m ../data/beam-tet.mesh
|
||||
// ex17 -m ../data/beam-hex.mesh
|
||||
// ex17 -m ../data/beam-wedge.mesh
|
||||
// ex17 -m ../data/beam-quad.mesh -r 2 -o 3
|
||||
// ex17 -m ../data/beam-quad.mesh -r 2 -o 2 -a 1 -k 1
|
||||
// ex17 -m ../data/beam-hex.mesh -r 2 -o 2
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
// mpirun -np 4 ex17p -m ../data/beam-quad.mesh
|
||||
// mpirun -np 4 ex17p -m ../data/beam-tet.mesh
|
||||
// mpirun -np 4 ex17p -m ../data/beam-hex.mesh
|
||||
// mpirun -np 4 ex17p -m ../data/beam-wedge.mesh
|
||||
// mpirun -np 4 ex17p -m ../data/beam-quad.mesh -rs 2 -rp 2 -o 3 -elast
|
||||
// mpirun -np 4 ex17p -m ../data/beam-quad.mesh -rs 2 -rp 3 -o 2 -a 1 -k 1
|
||||
// mpirun -np 4 ex17p -m ../data/beam-hex.mesh -rs 2 -rp 1 -o 2
|
||||
|
||||
+1
-2
@@ -509,8 +509,7 @@ bool StateIsPhysical(const Vector &state, const int dim)
|
||||
// Initial condition
|
||||
void InitialCondition(const Vector &x, Vector &y)
|
||||
{
|
||||
const int dim = x.Size();
|
||||
MFEM_ASSERT(dim == 2, "");
|
||||
MFEM_ASSERT(x.Size() == 2, "");
|
||||
|
||||
double radius = 0, Minf = 0, beta = 0;
|
||||
if (problem == 1)
|
||||
|
||||
+2
-1
@@ -7,6 +7,7 @@
|
||||
// ex19 -m ../data/beam-tri.mesh
|
||||
// ex19 -m ../data/beam-hex.mesh
|
||||
// ex19 -m ../data/beam-tet.mesh
|
||||
// ex19 -m ../data/beam-wedge.mesh
|
||||
//
|
||||
// Description: This examples solves a quasi-static incompressible nonlinear
|
||||
// elasticity problem of the form 0 = H(x), where H is an
|
||||
@@ -50,7 +51,7 @@ using namespace mfem;
|
||||
//
|
||||
// and K^-1 is an approximation of the inverse of the displacement part of the
|
||||
// Jacobian and S^-1 is an approximation of the inverse of the Schur
|
||||
// complement S = B K^-1 B^T. The Schur complement is approximiated using
|
||||
// complement S = B K^-1 B^T. The Schur complement is approximated using
|
||||
// a mass matrix of the pressure variables.
|
||||
class JacobianPreconditioner : public Solver
|
||||
{
|
||||
|
||||
+2
-1
@@ -7,6 +7,7 @@
|
||||
// mpirun -np 2 ex19p -m ../data/beam-tri.mesh
|
||||
// mpirun -np 2 ex19p -m ../data/beam-hex.mesh
|
||||
// mpirun -np 2 ex19p -m ../data/beam-tet.mesh
|
||||
// mpirun -np 2 ex19p -m ../data/beam-wedge.mesh
|
||||
//
|
||||
// Description: This examples solves a quasi-static incompressible nonlinear
|
||||
// elasticity problem of the form 0 = H(x), where H is an
|
||||
@@ -50,7 +51,7 @@ using namespace mfem;
|
||||
//
|
||||
// and K^-1 is an approximation of the inverse of the displacement part of the
|
||||
// Jacobian and S^-1 is an approximation of the inverse of the Schur
|
||||
// complement S = B K^-1 B^T. The Schur complement is approximiated using
|
||||
// complement S = B K^-1 B^T. The Schur complement is approximated using
|
||||
// a mass matrix of the pressure variables.
|
||||
class JacobianPreconditioner : public Solver
|
||||
{
|
||||
|
||||
@@ -4,14 +4,19 @@
|
||||
//
|
||||
// Sample runs: mpirun -np 4 ex1p -m ../data/square-disc.mesh
|
||||
// mpirun -np 4 ex1p -m ../data/star.mesh
|
||||
// mpirun -np 4 ex1p -m ../data/star-mixed.mesh
|
||||
// mpirun -np 4 ex1p -m ../data/escher.mesh
|
||||
// mpirun -np 4 ex1p -m ../data/fichera.mesh
|
||||
// mpirun -np 4 ex1p -m ../data/fichera-mixed.mesh
|
||||
// mpirun -np 4 ex1p -m ../data/toroid-wedge.mesh
|
||||
// mpirun -np 4 ex1p -m ../data/square-disc-p2.vtk -o 2
|
||||
// mpirun -np 4 ex1p -m ../data/square-disc-p3.mesh -o 3
|
||||
// mpirun -np 4 ex1p -m ../data/square-disc-nurbs.mesh -o -1
|
||||
// mpirun -np 4 ex1p -m ../data/star-mixed-p2.mesh -o 2
|
||||
// mpirun -np 4 ex1p -m ../data/disc-nurbs.mesh -o -1
|
||||
// mpirun -np 4 ex1p -m ../data/pipe-nurbs.mesh -o -1
|
||||
// mpirun -np 4 ex1p -m ../data/ball-nurbs.mesh -o 2
|
||||
// mpirun -np 4 ex1p -m ../data/fichera-mixed-p2.mesh -o 2
|
||||
// mpirun -np 4 ex1p -m ../data/star-surf.mesh
|
||||
// mpirun -np 4 ex1p -m ../data/square-disc-surf.mesh
|
||||
// mpirun -np 4 ex1p -m ../data/inline-segment.mesh
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
// ex2 -m ../data/beam-quad.mesh
|
||||
// ex2 -m ../data/beam-tet.mesh
|
||||
// ex2 -m ../data/beam-hex.mesh
|
||||
// ex2 -m ../data/beam-wedge.mesh
|
||||
// ex2 -m ../data/beam-quad.mesh -o 3 -sc
|
||||
// ex2 -m ../data/beam-quad-nurbs.mesh
|
||||
// ex2 -m ../data/beam-hex-nurbs.mesh
|
||||
|
||||
@@ -0,0 +1,298 @@
|
||||
// MFEM Example 20
|
||||
//
|
||||
// Compile with: make ex20
|
||||
//
|
||||
// Sample runs: ex20
|
||||
//
|
||||
// Description: This example demonstrates the use of the variable order,
|
||||
// symplectic ODE integration algorithm. Symplectic integration
|
||||
// algorithms are designed to conserve energy when integrating, in
|
||||
// time, systems of ODEs which are derived from Hamiltonian
|
||||
// systems.
|
||||
//
|
||||
// Hamiltonian systems define the energy of a system as a function
|
||||
// of time (t), a set of generalized coordinates (q), and their
|
||||
// corresponding generalized momenta (p).
|
||||
//
|
||||
// H(q,p,t) = T(p) + V(q,t)
|
||||
//
|
||||
// Hamilton's equations then specify how q and p evolve in time:
|
||||
//
|
||||
// dq/dt = dH/dp
|
||||
// dp/dt = -dH/dq
|
||||
//
|
||||
// To use the symplectic integration classes we need to define an
|
||||
// mfem::Operator P which evaluates the action of dH/dp, and an
|
||||
// mfem::TimeDependentOperator F which computes -dH/dq.
|
||||
//
|
||||
// This example offers five simple 1D Hamiltonians:
|
||||
// 0) Simple Harmonic Oscillator (mass on a spring)
|
||||
// H = ( p^2 / m + q^2 / k ) / 2
|
||||
// 1) Pendulum
|
||||
// H = ( p^2 / m - k ( 1 - cos(q) ) ) / 2
|
||||
// 2) Gaussian Potential Well
|
||||
// H = ( p^2 / m ) / 2 - k exp(-q^2 / 2)
|
||||
// 3) Quartic Potential
|
||||
// H = ( p^2 / m + k ( 1 + q^2 ) q^2 ) / 2
|
||||
// 4) Negative Quartic Potential
|
||||
// H = ( p^2 / m + k ( 1 - q^2 /8 ) q^2 ) / 2
|
||||
//
|
||||
// In all cases these Hamiltonians are shifted by constant values
|
||||
// so that the energy will remain positive. The mean and standard
|
||||
// deviation of the computed energies at each time step are
|
||||
// displayed upon completion.
|
||||
//
|
||||
// We then use GLVis to visualize the results in a non-standard way
|
||||
// by defining the axes to be q, p, and t rather than x, y, and z.
|
||||
// In this space we build a ribbon-like mesh with nodes at (0,0,t)
|
||||
// and (q,p,t). Finally we plot the energy as a function of time
|
||||
// as a scalar field on this ribbon-like mesh.
|
||||
//
|
||||
// For a more traditional plot of the results, including q, p, and
|
||||
// H, can be obtained by selecting the "-gp" option. This creates
|
||||
// a data file and input deck for the GnuPlot application (not
|
||||
// included with MFEM). To visualize these results on most Linux
|
||||
// systems type the command "gnuplot gnuplot_ex20.inp". The data
|
||||
// file, named "ex20.dat", should be simple enough to display with
|
||||
// other plotting programs as well.
|
||||
|
||||
#include "mfem.hpp"
|
||||
#include <fstream>
|
||||
#include <iostream>
|
||||
|
||||
using namespace std;
|
||||
using namespace mfem;
|
||||
|
||||
// Constants used in the Hamiltonian
|
||||
static int prob_ = 0;
|
||||
static double m_ = 1.0;
|
||||
static double k_ = 1.0;
|
||||
|
||||
// Hamiltonian functional, see below for implementation
|
||||
double hamiltonian(double q, double p, double t);
|
||||
|
||||
class GradT : public Operator
|
||||
{
|
||||
public:
|
||||
GradT() : Operator(1) {}
|
||||
void Mult(const Vector &x, Vector &y) const { y.Set(1.0/m_, x); }
|
||||
};
|
||||
|
||||
class NegGradV : public TimeDependentOperator
|
||||
{
|
||||
public:
|
||||
NegGradV() : TimeDependentOperator(1) {}
|
||||
void Mult(const Vector &x, Vector &y) const;
|
||||
};
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
// 1. Parse command-line options.
|
||||
int order = 1;
|
||||
int nsteps = 100;
|
||||
double dt = 0.1;
|
||||
bool visualization = true;
|
||||
bool gnuplot = false;
|
||||
|
||||
OptionsParser args(argc, argv);
|
||||
args.AddOption(&order, "-o", "--order",
|
||||
"Time integration order.");
|
||||
args.AddOption(&prob_, "-p", "--problem-type",
|
||||
"Problem Type:\n"
|
||||
"\t 0 - Simple Harmonic Oscillator\n"
|
||||
"\t 1 - Pendulum\n"
|
||||
"\t 2 - Gaussian Potential Well\n"
|
||||
"\t 3 - Quartic Potential\n"
|
||||
"\t 4 - Negative Quartic Potential");
|
||||
args.AddOption(&nsteps, "-n", "--number-of-steps",
|
||||
"Number of time steps.");
|
||||
args.AddOption(&dt, "-dt", "--time-step",
|
||||
"Time step size.");
|
||||
args.AddOption(&m_, "-m", "--mass",
|
||||
"Mass.");
|
||||
args.AddOption(&k_, "-k", "--spring-const",
|
||||
"Spring constant.");
|
||||
args.AddOption(&visualization, "-vis", "--visualization", "-no-vis",
|
||||
"--no-visualization",
|
||||
"Enable or disable GLVis visualization.");
|
||||
args.AddOption(&gnuplot, "-gp", "--gnuplot", "-no-gp", "--no-gnuplot",
|
||||
"Enable or disable GnuPlot visualization.");
|
||||
args.Parse();
|
||||
if (!args.Good())
|
||||
{
|
||||
args.PrintUsage(cout);
|
||||
return 1;
|
||||
}
|
||||
args.PrintOptions(cout);
|
||||
|
||||
// 2. Create and Initialize the Symplectic Integration Solver
|
||||
SIAVSolver siaSolver(order);
|
||||
GradT P;
|
||||
NegGradV F;
|
||||
siaSolver.Init(P,F);
|
||||
|
||||
// 3. Set the initial conditions
|
||||
double t = 0.0;
|
||||
Vector q(1), p(1);
|
||||
Vector e(nsteps+1);
|
||||
q(0) = 0.0;
|
||||
p(0) = 1.0;
|
||||
|
||||
// 4. Prepare GnuPlot output file if needed
|
||||
ofstream ofs;
|
||||
if (gnuplot)
|
||||
{
|
||||
ofs.open("ex20.dat");
|
||||
ofs << t << "\t" << q(0) << "\t" << p(0) << endl;
|
||||
}
|
||||
|
||||
// 5. Create a Mesh for visualization in phase space
|
||||
int nverts = (visualization) ? 2*(nsteps+1) : 0;
|
||||
int nelems = (visualization) ? nsteps : 0;
|
||||
Mesh mesh(2, nverts, nelems, 0, 3);
|
||||
|
||||
int v[4];
|
||||
Vector x0(3); x0 = 0.0;
|
||||
Vector x1(3); x1 = 0.0;
|
||||
|
||||
// 6. Perform time-stepping
|
||||
double e_mean = 0.0;
|
||||
|
||||
for (int i = 0; i < nsteps; i++)
|
||||
{
|
||||
// 6a. Record initial state
|
||||
if (i == 0)
|
||||
{
|
||||
e[0] = hamiltonian(q(0),p(0),t);
|
||||
e_mean += e[0];
|
||||
|
||||
if (visualization)
|
||||
{
|
||||
x1[0] = q(0);
|
||||
x1[1] = p(0);
|
||||
x1[2] = 0.0;
|
||||
mesh.AddVertex(x0);
|
||||
mesh.AddVertex(x1);
|
||||
}
|
||||
}
|
||||
|
||||
// 6b. Advance the state of the system
|
||||
siaSolver.Step(q,p,t,dt);
|
||||
e[i+1] = hamiltonian(q(0),p(0),t);
|
||||
e_mean += e[i+1];
|
||||
|
||||
// 6c. Record the state of the system
|
||||
if (gnuplot)
|
||||
{
|
||||
ofs << t << "\t" << q(0) << "\t" << p(0) << "\t" << e[i+1] << endl;
|
||||
}
|
||||
|
||||
// 6d. Add results to GLVis visualization
|
||||
if (visualization)
|
||||
{
|
||||
x0[2] = t;
|
||||
x1[0] = q(0);
|
||||
x1[1] = p(0);
|
||||
x1[2] = t;
|
||||
mesh.AddVertex(x0);
|
||||
mesh.AddVertex(x1);
|
||||
v[0] = 2*i;
|
||||
v[1] = 2*(i+1);
|
||||
v[2] = 2*(i+1)+1;
|
||||
v[3] = 2*i+1;
|
||||
mesh.AddQuad(v);
|
||||
}
|
||||
}
|
||||
|
||||
// 7. Compute and display mean and standard deviation of the energy
|
||||
e_mean /= (nsteps + 1);
|
||||
double e_var = 0.0;
|
||||
for (int i=0; i<=nsteps; i++)
|
||||
{
|
||||
e_var += pow(e[i] - e_mean, 2);
|
||||
}
|
||||
e_var /= (nsteps + 1);
|
||||
double e_sd = sqrt(e_var);
|
||||
cout << endl << "Mean and standard deviation of the energy" << endl;
|
||||
cout << e_mean << "\t" << e_sd << endl;
|
||||
|
||||
// 8. Finalize the GnuPlot output
|
||||
if (gnuplot)
|
||||
{
|
||||
ofs.close();
|
||||
|
||||
ofs.open("gnuplot_ex20.inp");
|
||||
ofs << "plot 'ex20.dat' using 1:2 w l t 'q', "
|
||||
<< "'ex20.dat' using 1:3 w l t 'p', "
|
||||
<< "'ex20.dat' using 1:4 w l t 'H'" << endl;
|
||||
ofs.close();
|
||||
}
|
||||
|
||||
// 9. Finalize the GLVis output
|
||||
if (visualization)
|
||||
{
|
||||
H1_FECollection fec(order = 1, 2);
|
||||
FiniteElementSpace fespace(&mesh, &fec);
|
||||
GridFunction energy(&fespace);
|
||||
energy = 0.0;
|
||||
for (int i = 0; i <= nsteps; i++)
|
||||
{
|
||||
energy[2*i+0] = e[i];
|
||||
energy[2*i+1] = e[i];
|
||||
}
|
||||
|
||||
char vishost[] = "localhost";
|
||||
int visport = 19916;
|
||||
socketstream sock(vishost, visport);
|
||||
sock.precision(8);
|
||||
sock << "solution\n" << mesh << energy
|
||||
<< "window_title 'Energy in Phase Space'\n"
|
||||
<< "keys\n maac\n" << "axis_labels 'q' 'p' 't'\n"<< flush;
|
||||
}
|
||||
}
|
||||
|
||||
double hamiltonian(double q, double p, double t)
|
||||
{
|
||||
double h = 1.0 - 0.5 / m_ + 0.5 * p * p / m_;
|
||||
switch (prob_)
|
||||
{
|
||||
case 1:
|
||||
h += k_ * (1.0 - cos(q));
|
||||
break;
|
||||
case 2:
|
||||
h += k_ * (1.0 - exp(-0.5 * q * q));
|
||||
break;
|
||||
case 3:
|
||||
h += 0.5 * k_ * (1.0 + q * q) * q * q;
|
||||
break;
|
||||
case 4:
|
||||
h += 0.5 * k_ * (1.0 - 0.125 * q * q) * q * q;
|
||||
break;
|
||||
default:
|
||||
h += 0.5 * k_ * q * q;
|
||||
break;
|
||||
}
|
||||
return h;
|
||||
}
|
||||
|
||||
void NegGradV::Mult(const Vector &x, Vector &y) const
|
||||
{
|
||||
switch (prob_)
|
||||
{
|
||||
case 1:
|
||||
y(0) = - k_* sin(x(0));
|
||||
break;
|
||||
case 2:
|
||||
y(0) = - k_ * x(0) * exp(-0.5 * x(0) * x(0));
|
||||
break;
|
||||
case 3:
|
||||
y(0) = - k_ * (1.0 + 2.0 * x(0) * x(0)) * x(0);
|
||||
break;
|
||||
case 4:
|
||||
y(0) = - k_ * (1.0 - 0.25 * x(0) * x(0)) * x(0);
|
||||
break;
|
||||
default:
|
||||
y(0) = - k_ * x(0);
|
||||
break;
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,364 @@
|
||||
// MFEM Example 20 - Parallel Version
|
||||
//
|
||||
// Compile with: make ex20p
|
||||
//
|
||||
// Sample runs: mpirun -np 4 ex20p
|
||||
//
|
||||
// Description: This example demonstrates the use of the variable order,
|
||||
// symplectic ODE integration algorithm. Symplectic integration
|
||||
// algorithms are designed to conserve energy when integrating, in
|
||||
// time, systems of ODEs which are derived from Hamiltonian
|
||||
// systems.
|
||||
//
|
||||
// Hamiltonian systems define the energy of a system as a function
|
||||
// of time (t), a set of generalized coordinates (q), and their
|
||||
// corresponding generalized momenta (p).
|
||||
//
|
||||
// H(q,p,t) = T(p) + V(q,t)
|
||||
//
|
||||
// Hamilton's equations then specify how q and p evolve in time:
|
||||
//
|
||||
// dq/dt = dH/dp
|
||||
// dp/dt = -dH/dq
|
||||
//
|
||||
// To use the symplectic integration classes we need to define an
|
||||
// mfem::Operator P which evaluates the action of dH/dp, and an
|
||||
// mfem::TimeDependentOperator F which computes -dH/dq.
|
||||
//
|
||||
// This example offers five simple 1D Hamiltonians:
|
||||
// 0) Simple Harmonic Oscillator (mass on a spring)
|
||||
// H = ( p^2 / m + q^2 / k ) / 2
|
||||
// 1) Pendulum
|
||||
// H = ( p^2 / m - k ( 1 - cos(q) ) ) / 2
|
||||
// 2) Gaussian Potential Well
|
||||
// H = ( p^2 / m ) / 2 - k exp(-q^2 / 2)
|
||||
// 3) Quartic Potential
|
||||
// H = ( p^2 / m + k ( 1 + q^2 ) q^2 ) / 2
|
||||
// 4) Negative Quartic Potential
|
||||
// H = ( p^2 / m + k ( 1 - q^2 /8 ) q^2 ) / 2
|
||||
//
|
||||
// In all cases these Hamiltonians are shifted by constant values
|
||||
// so that the energy will remain positive. The mean and standard
|
||||
// deviation of the computed energies at each time step are
|
||||
// displayed upon completion. When run in parallel the same
|
||||
// Hamiltonian system is evolved on each processor but starting
|
||||
// from different initial conditions.
|
||||
//
|
||||
// We then use GLVis to visualize the results in a non-standard way
|
||||
// by defining the axes to be q, p, and t rather than x, y, and z.
|
||||
// In this space we build a ribbon-like mesh on each processor with
|
||||
// nodes at (0,0,t) and (q,p,t). When these ribbons are bonded
|
||||
// together on the t-axis they resemble a Rotini pasta. Finally we
|
||||
// plot the energy as a function of time as a scalar field on this
|
||||
// Rotini-like mesh.
|
||||
//
|
||||
// For a more traditional plot of the results, including q, p, and
|
||||
// H from each processor, can be obtained by selecting the "-gp"
|
||||
// option. This creates a collection of data files and an input
|
||||
// deck for the GnuPlot application (not included with MFEM). To
|
||||
// visualize these results on most linux systems type the command
|
||||
// "gnuplot gnuplot_ex20p.inp". The data files, named
|
||||
// "ex20p_?????.dat", should be simple enough to display with other
|
||||
// plotting programs as well.
|
||||
|
||||
#include "mfem.hpp"
|
||||
#include <fstream>
|
||||
#include <iostream>
|
||||
|
||||
using namespace std;
|
||||
using namespace mfem;
|
||||
|
||||
// Constants used in the Hamiltonian
|
||||
static int prob_ = 0;
|
||||
static double m_ = 1.0;
|
||||
static double k_ = 1.0;
|
||||
|
||||
// Hamiltonian functional, see below for implementation
|
||||
double hamiltonian(double q, double p, double t);
|
||||
|
||||
class GradT : public Operator
|
||||
{
|
||||
public:
|
||||
GradT() : Operator(1) {}
|
||||
void Mult(const Vector &x, Vector &y) const { y.Set(1.0/m_, x); }
|
||||
};
|
||||
|
||||
class NegGradV : public TimeDependentOperator
|
||||
{
|
||||
public:
|
||||
NegGradV() : TimeDependentOperator(1) {}
|
||||
void Mult(const Vector &x, Vector &y) const;
|
||||
};
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
// 1. Initialize MPI.
|
||||
int num_procs, myid;
|
||||
MPI_Comm comm = MPI_COMM_WORLD;
|
||||
MPI_Init(&argc, &argv);
|
||||
MPI_Comm_size(comm, &num_procs);
|
||||
MPI_Comm_rank(comm, &myid);
|
||||
|
||||
// 2. Parse command-line options.
|
||||
int order = 1;
|
||||
int nsteps = 100;
|
||||
double dt = 0.1;
|
||||
bool visualization = true;
|
||||
bool gnuplot = false;
|
||||
|
||||
OptionsParser args(argc, argv);
|
||||
args.AddOption(&order, "-o", "--order",
|
||||
"Time integration order.");
|
||||
args.AddOption(&prob_, "-p", "--problem-type",
|
||||
"Problem Type:\n"
|
||||
"\t 0 - Simple Harmonic Oscillator\n"
|
||||
"\t 1 - Pendulum\n"
|
||||
"\t 2 - Gaussian Potential Well\n"
|
||||
"\t 3 - Quartic Potential\n"
|
||||
"\t 4 - Negative Quartic Potential");
|
||||
args.AddOption(&nsteps, "-n", "--number-of-steps",
|
||||
"Number of time steps.");
|
||||
args.AddOption(&dt, "-dt", "--time-step",
|
||||
"Time step size.");
|
||||
args.AddOption(&m_, "-m", "--mass",
|
||||
"Mass.");
|
||||
args.AddOption(&k_, "-k", "--spring-const",
|
||||
"Spring constant.");
|
||||
args.AddOption(&visualization, "-vis", "--visualization", "-no-vis",
|
||||
"--no-visualization",
|
||||
"Enable or disable GLVis visualization.");
|
||||
args.AddOption(&gnuplot, "-gp", "--gnuplot", "-no-gp", "--no-gnuplot",
|
||||
"Enable or disable GnuPlot visualization.");
|
||||
args.Parse();
|
||||
if (!args.Good())
|
||||
{
|
||||
if (myid == 0)
|
||||
{
|
||||
args.PrintUsage(cout);
|
||||
}
|
||||
MPI_Finalize();
|
||||
return 1;
|
||||
}
|
||||
if (myid == 0)
|
||||
{
|
||||
args.PrintOptions(cout);
|
||||
}
|
||||
|
||||
// 3. Create and Initialize the Symplectic Integration Solver
|
||||
SIAVSolver siaSolver(order);
|
||||
GradT P;
|
||||
NegGradV F;
|
||||
siaSolver.Init(P,F);
|
||||
|
||||
// 4. Set the initial conditions
|
||||
double t = 0.0;
|
||||
Vector q(1), p(1);
|
||||
Vector e(nsteps+1);
|
||||
q(0) = sin(2.0*M_PI*(double)myid/num_procs);
|
||||
p(0) = cos(2.0*M_PI*(double)myid/num_procs);
|
||||
|
||||
// 5. Prepare GnuPlot output file if needed
|
||||
ostringstream oss;
|
||||
ofstream ofs;
|
||||
if (gnuplot)
|
||||
{
|
||||
oss << "ex20p_" << setfill('0') << setw(5) << myid << ".dat";
|
||||
ofs.open(oss.str().c_str());
|
||||
ofs << t << "\t" << q(0) << "\t" << p(0) << endl;
|
||||
}
|
||||
|
||||
// 6. Create a Mesh for visualization in phase space
|
||||
int nverts = (visualization) ? (num_procs+1)*(nsteps+1) : 0;
|
||||
int nelems = (visualization) ? (nsteps * num_procs) : 0;
|
||||
Mesh mesh(2, nverts, nelems, 0, 3);
|
||||
|
||||
int *part = (visualization) ? (new int[nelems]) : NULL;
|
||||
int v[4];
|
||||
Vector x0(3); x0 = 0.0;
|
||||
Vector x1(3); x1 = 0.0;
|
||||
|
||||
// 7. Perform time-stepping
|
||||
double e_mean = 0.0;
|
||||
|
||||
for (int i = 0; i < nsteps; i++)
|
||||
{
|
||||
// 7a. Record initial state
|
||||
if (i == 0)
|
||||
{
|
||||
e[0] = hamiltonian(q(0),p(0),t);
|
||||
e_mean += e[0];
|
||||
|
||||
if (visualization)
|
||||
{
|
||||
mesh.AddVertex(x0);
|
||||
for (int j = 0; j < num_procs; j++)
|
||||
{
|
||||
x1[0] = q(0);
|
||||
x1[1] = p(0);
|
||||
x1[2] = 0.0;
|
||||
mesh.AddVertex(x1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 7b. Advance the state of the system
|
||||
siaSolver.Step(q,p,t,dt);
|
||||
e[i+1] = hamiltonian(q(0),p(0),t);
|
||||
e_mean += e[i+1];
|
||||
|
||||
// 7c. Record the state of the system
|
||||
if (gnuplot)
|
||||
{
|
||||
ofs << t << "\t" << q(0) << "\t" << p(0) << "\t" << e[i+1] << endl;
|
||||
}
|
||||
|
||||
// 7d. Add results to GLVis visualization
|
||||
if (visualization)
|
||||
{
|
||||
x0[2] = t;
|
||||
mesh.AddVertex(x0);
|
||||
for (int j = 0; j < num_procs; j++)
|
||||
{
|
||||
x1[0] = q(0);
|
||||
x1[1] = p(0);
|
||||
x1[2] = t;
|
||||
mesh.AddVertex(x1);
|
||||
v[0] = (num_procs + 1) * i;
|
||||
v[1] = (num_procs + 1) * (i + 1);
|
||||
v[2] = (num_procs + 1) * (i + 1) + j + 1;
|
||||
v[3] = (num_procs + 1) * i + j + 1;
|
||||
mesh.AddQuad(v);
|
||||
part[num_procs * i + j] = j;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 8. Compute and display mean and standard deviation of the energy
|
||||
e_mean /= (nsteps + 1);
|
||||
double e_var = 0.0;
|
||||
for (int i = 0; i <= nsteps; i++)
|
||||
{
|
||||
e_var += pow(e[i] - e_mean, 2);
|
||||
}
|
||||
e_var /= (nsteps + 1);
|
||||
double e_sd = sqrt(e_var);
|
||||
|
||||
if (myid == 0)
|
||||
{
|
||||
cout << endl << "Mean and standard deviation of the energy" << endl;
|
||||
}
|
||||
for (int i = 0; i < num_procs; i++)
|
||||
{
|
||||
if (myid == i)
|
||||
{
|
||||
cout << myid << ": " << e_mean << "\t" << e_sd << endl;
|
||||
}
|
||||
MPI_Barrier(comm);
|
||||
}
|
||||
|
||||
// 9. Finalize the GnuPlot output
|
||||
if (gnuplot)
|
||||
{
|
||||
ofs.close();
|
||||
if (myid == 0)
|
||||
{
|
||||
ofs.open("gnuplot_ex20p.inp");
|
||||
for (int i = 0; i < num_procs; i++)
|
||||
{
|
||||
ostringstream ossi;
|
||||
ossi << "ex20p_" << setfill('0') << setw(5) << i << ".dat";
|
||||
if (i == 0)
|
||||
{
|
||||
ofs << "plot";
|
||||
}
|
||||
ofs << " '" << ossi.str() << "' using 1:2 w l t 'q" << i << "',"
|
||||
<< " '" << ossi.str() << "' using 1:3 w l t 'p" << i << "',"
|
||||
<< " '" << ossi.str() << "' using 1:4 w l t 'H" << i << "'";
|
||||
if (i < num_procs-1)
|
||||
{
|
||||
ofs << ",";
|
||||
}
|
||||
else
|
||||
{
|
||||
ofs << ";" << endl;
|
||||
}
|
||||
}
|
||||
ofs.close();
|
||||
}
|
||||
}
|
||||
|
||||
// 10. Finalize the GLVis output
|
||||
if (visualization)
|
||||
{
|
||||
mesh.FinalizeQuadMesh(1);
|
||||
ParMesh pmesh(comm, mesh, part);
|
||||
delete [] part;
|
||||
|
||||
H1_FECollection fec(order = 1, 2);
|
||||
ParFiniteElementSpace fespace(&pmesh, &fec);
|
||||
ParGridFunction energy(&fespace);
|
||||
energy = 0.0;
|
||||
for (int i = 0; i <= nsteps; i++)
|
||||
{
|
||||
energy[2*i+0] = e[i];
|
||||
energy[2*i+1] = e[i];
|
||||
}
|
||||
|
||||
char vishost[] = "localhost";
|
||||
int visport = 19916;
|
||||
socketstream sock(vishost, visport);
|
||||
sock.precision(8);
|
||||
sock << "parallel " << num_procs << " " << myid << "\n"
|
||||
<< "solution\n" << pmesh << energy
|
||||
<< "window_title 'Energy in Phase Space'\n"
|
||||
<< "keys\n maac\n" << "axis_labels 'q' 'p' 't'\n"<< flush;
|
||||
}
|
||||
|
||||
MPI_Finalize();
|
||||
}
|
||||
|
||||
double hamiltonian(double q, double p, double t)
|
||||
{
|
||||
double h = 1.0 - 0.5 / m_ + 0.5 * p * p / m_;
|
||||
switch (prob_)
|
||||
{
|
||||
case 1:
|
||||
h += k_ * (1.0 - cos(q));
|
||||
break;
|
||||
case 2:
|
||||
h += k_ * (1.0 - exp(-0.5 * q * q));
|
||||
break;
|
||||
case 3:
|
||||
h += 0.5 * k_ * (1.0 + q * q) * q * q;
|
||||
break;
|
||||
case 4:
|
||||
h += 0.5 * k_ * (1.0 - 0.125 * q * q) * q * q;
|
||||
break;
|
||||
default:
|
||||
h += 0.5 * k_ * q * q;
|
||||
break;
|
||||
}
|
||||
return h;
|
||||
}
|
||||
|
||||
void NegGradV::Mult(const Vector &x, Vector &y) const
|
||||
{
|
||||
switch (prob_)
|
||||
{
|
||||
case 1:
|
||||
y(0) = - k_* sin(x(0));
|
||||
break;
|
||||
case 2:
|
||||
y(0) = - k_ * x(0) * exp(-0.5 * x(0) * x(0));
|
||||
break;
|
||||
case 3:
|
||||
y(0) = - k_ * (1.0 + 2.0 * x(0) * x(0)) * x(0);
|
||||
break;
|
||||
case 4:
|
||||
y(0) = - k_ * (1.0 - 0.25 * x(0) * x(0)) * x(0);
|
||||
break;
|
||||
default:
|
||||
y(0) = - k_ * x(0);
|
||||
break;
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,310 @@
|
||||
// MFEM Example 22
|
||||
//
|
||||
// Compile with: make ex22
|
||||
//
|
||||
// Sample runs: ex22
|
||||
// ex22 -o 3
|
||||
// ex22 -m ../data/beam-quad.mesh
|
||||
// ex22 -m ../data/beam-quad.mesh -o 3
|
||||
// ex22 -m ../data/beam-quad.mesh -o 3 -f 1
|
||||
// ex22 -m ../data/beam-tet.mesh
|
||||
// ex22 -m ../data/beam-tet.mesh -o 2
|
||||
// ex22 -m ../data/beam-hex.mesh
|
||||
// ex22 -m ../data/beam-hex.mesh -o 2
|
||||
//
|
||||
// Description: This is a version of Example 2 with a simple adaptive mesh
|
||||
// refinement loop. The problem being solved is again the linear
|
||||
// elasticity describing a multi-material cantilever beam.
|
||||
// The problem is solved on a sequence of meshes which
|
||||
// are locally refined in a conforming (triangles, tetrahedrons)
|
||||
// or non-conforming (quadrilaterals, hexahedra) manner according
|
||||
// to a simple ZZ error estimator.
|
||||
//
|
||||
// The example demonstrates MFEM's capability to work with both
|
||||
// conforming and nonconforming refinements, in 2D and 3D, on
|
||||
// linear and curved meshes. Interpolation of functions from
|
||||
// coarse to fine meshes, as well as persistent GLVis
|
||||
// visualization are also illustrated.
|
||||
//
|
||||
// We recommend viewing Examples 2 and 6 before viewing this
|
||||
// example.
|
||||
|
||||
#include "mfem.hpp"
|
||||
#include <fstream>
|
||||
#include <iostream>
|
||||
|
||||
using namespace std;
|
||||
using namespace mfem;
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
// 1. Parse command-line options.
|
||||
const char *mesh_file = "../data/beam-tri.mesh";
|
||||
int order = 1;
|
||||
bool static_cond = false;
|
||||
int flux_averaging = 0;
|
||||
bool visualization = 1;
|
||||
|
||||
OptionsParser args(argc, argv);
|
||||
args.AddOption(&mesh_file, "-m", "--mesh",
|
||||
"Mesh file to use.");
|
||||
args.AddOption(&order, "-o", "--order",
|
||||
"Finite element order (polynomial degree).");
|
||||
args.AddOption(&static_cond, "-sc", "--static-condensation", "-no-sc",
|
||||
"--no-static-condensation", "Enable static condensation.");
|
||||
args.AddOption(&flux_averaging, "-f", "--flux-averaging",
|
||||
"Flux averaging: 0 - global, 1 - by mesh attribute.");
|
||||
args.AddOption(&visualization, "-vis", "--visualization", "-no-vis",
|
||||
"--no-visualization",
|
||||
"Enable or disable GLVis visualization.");
|
||||
args.Parse();
|
||||
if (!args.Good())
|
||||
{
|
||||
args.PrintUsage(cout);
|
||||
return 1;
|
||||
}
|
||||
args.PrintOptions(cout);
|
||||
|
||||
// 2. Read the mesh from the given mesh file. We can handle triangular,
|
||||
// quadrilateral, tetrahedral, and hexahedral meshes with the same code.
|
||||
Mesh mesh(mesh_file, 1, 1);
|
||||
int dim = mesh.Dimension();
|
||||
MFEM_VERIFY(mesh.SpaceDimension() == dim, "invalid mesh");
|
||||
|
||||
if (mesh.attributes.Max() < 2 || mesh.bdr_attributes.Max() < 2)
|
||||
{
|
||||
cerr << "\nInput mesh should have at least two materials and "
|
||||
<< "two boundary attributes! (See schematic in ex2.cpp)\n"
|
||||
<< endl;
|
||||
return 3;
|
||||
}
|
||||
|
||||
// 3. Since a NURBS mesh can currently only be refined uniformly, we need to
|
||||
// convert it to a piecewise-polynomial curved mesh. First we refine the
|
||||
// NURBS mesh a bit more and then project the curvature to quadratic Nodes.
|
||||
if (mesh.NURBSext)
|
||||
{
|
||||
for (int i = 0; i < 2; i++)
|
||||
{
|
||||
mesh.UniformRefinement();
|
||||
}
|
||||
mesh.SetCurvature(2);
|
||||
}
|
||||
|
||||
// 4. Define a finite element space on the mesh. The polynomial order is
|
||||
// one (linear) by default, but this can be changed on the command line.
|
||||
H1_FECollection fec(order, dim);
|
||||
FiniteElementSpace fespace(&mesh, &fec, dim);
|
||||
|
||||
// 5. As in Example 2, we set up the linear form b(.) which corresponds to
|
||||
// the right-hand side of the FEM linear system. In this case, b_i equals
|
||||
// the boundary integral of f*phi_i where f represents a "pull down"
|
||||
// force on the Neumann part of the boundary and phi_i are the basis
|
||||
// functions in the finite element fespace. The force is defined by the
|
||||
// VectorArrayCoefficient object f, which is a vector of Coefficient
|
||||
// objects. The fact that f is non-zero on boundary attribute 2 is
|
||||
// indicated by the use of piece-wise constants coefficient for its last
|
||||
// component. We don't assemble the discrete problem yet, this will be
|
||||
// done in the main loop.
|
||||
VectorArrayCoefficient f(dim);
|
||||
for (int i = 0; i < dim-1; i++)
|
||||
{
|
||||
f.Set(i, new ConstantCoefficient(0.0));
|
||||
}
|
||||
{
|
||||
Vector pull_force(mesh.bdr_attributes.Max());
|
||||
pull_force = 0.0;
|
||||
pull_force(1) = -1.0e-2;
|
||||
f.Set(dim-1, new PWConstCoefficient(pull_force));
|
||||
}
|
||||
|
||||
LinearForm b(&fespace);
|
||||
b.AddDomainIntegrator(new VectorBoundaryLFIntegrator(f));
|
||||
|
||||
// 6. Set up the bilinear form a(.,.) on the finite element space
|
||||
// corresponding to the linear elasticity integrator with piece-wise
|
||||
// constants coefficient lambda and mu.
|
||||
Vector lambda(mesh.attributes.Max());
|
||||
lambda = 1.0;
|
||||
lambda(0) = lambda(1)*50;
|
||||
PWConstCoefficient lambda_func(lambda);
|
||||
Vector mu(mesh.attributes.Max());
|
||||
mu = 1.0;
|
||||
mu(0) = mu(1)*50;
|
||||
PWConstCoefficient mu_func(mu);
|
||||
|
||||
BilinearForm a(&fespace);
|
||||
BilinearFormIntegrator *integ =
|
||||
new ElasticityIntegrator(lambda_func,mu_func);
|
||||
a.AddDomainIntegrator(integ);
|
||||
if (static_cond) { a.EnableStaticCondensation(); }
|
||||
|
||||
// 7. The solution vector x and the associated finite element grid function
|
||||
// will be maintained over the AMR iterations. We initialize it to zero.
|
||||
Vector zero_vec(dim);
|
||||
zero_vec = 0.0;
|
||||
VectorConstantCoefficient zero_vec_coeff(zero_vec);
|
||||
GridFunction x(&fespace);
|
||||
x = 0.0;
|
||||
|
||||
// 8. Determine the list of true (i.e. conforming) essential boundary dofs.
|
||||
// In this example, the boundary conditions are defined by marking only
|
||||
// boundary attribute 1 from the mesh as essential and converting it to a
|
||||
// list of true dofs. The conversion to true dofs will be done in the
|
||||
// main loop.
|
||||
Array<int> ess_bdr(mesh.bdr_attributes.Max());
|
||||
ess_bdr = 0;
|
||||
ess_bdr[0] = 1;
|
||||
|
||||
// 9. Connect to GLVis.
|
||||
char vishost[] = "localhost";
|
||||
int visport = 19916;
|
||||
socketstream sol_sock;
|
||||
if (visualization)
|
||||
{
|
||||
sol_sock.open(vishost, visport);
|
||||
sol_sock.precision(8);
|
||||
}
|
||||
|
||||
// 10. Set up an error estimator. Here we use the Zienkiewicz-Zhu estimator
|
||||
// that uses the ComputeElementFlux method of the ElasticityIntegrator to
|
||||
// recover a smoothed flux (stress) that is subtracted from the element
|
||||
// flux to get an error indicator. We need to supply the space for the
|
||||
// smoothed flux: an (H1)^tdim (i.e., vector-valued) space is used here.
|
||||
// Here, tdim represents the number of components for a symmetric (dim x
|
||||
// dim) tensor.
|
||||
const int tdim = dim*(dim+1)/2;
|
||||
FiniteElementSpace flux_fespace(&mesh, &fec, tdim);
|
||||
ZienkiewiczZhuEstimator estimator(*integ, x, flux_fespace);
|
||||
estimator.SetFluxAveraging(flux_averaging);
|
||||
|
||||
// 11. A refiner selects and refines elements based on a refinement strategy.
|
||||
// The strategy here is to refine elements with errors larger than a
|
||||
// fraction of the maximum element error. Other strategies are possible.
|
||||
// The refiner will call the given error estimator.
|
||||
ThresholdRefiner refiner(estimator);
|
||||
refiner.SetTotalErrorFraction(0.7);
|
||||
|
||||
// 12. The main AMR loop. In each iteration we solve the problem on the
|
||||
// current mesh, visualize the solution, and refine the mesh.
|
||||
const int max_dofs = 50000;
|
||||
const int max_amr_itr = 20;
|
||||
for (int it = 0; it <= max_amr_itr; it++)
|
||||
{
|
||||
int cdofs = fespace.GetTrueVSize();
|
||||
cout << "\nAMR iteration " << it << endl;
|
||||
cout << "Number of unknowns: " << cdofs << endl;
|
||||
|
||||
// 13. Assemble the stiffness matrix and the right-hand side.
|
||||
a.Assemble();
|
||||
b.Assemble();
|
||||
|
||||
// 14. Set Dirichlet boundary values in the GridFunction x.
|
||||
// Determine the list of Dirichlet true DOFs in the linear system.
|
||||
Array<int> ess_tdof_list;
|
||||
x.ProjectBdrCoefficient(zero_vec_coeff, ess_bdr);
|
||||
fespace.GetEssentialTrueDofs(ess_bdr, ess_tdof_list);
|
||||
|
||||
// 15. Create the linear system: eliminate boundary conditions, constrain
|
||||
// hanging nodes and possibly apply other transformations. The system
|
||||
// will be solved for true (unconstrained) DOFs only.
|
||||
SparseMatrix A;
|
||||
Vector B, X;
|
||||
const int copy_interior = 1;
|
||||
a.FormLinearSystem(ess_tdof_list, x, b, A, X, B, copy_interior);
|
||||
|
||||
#ifndef MFEM_USE_SUITESPARSE
|
||||
// 16. Define a simple symmetric Gauss-Seidel preconditioner and use it to
|
||||
// solve the linear system with PCG.
|
||||
GSSmoother M(A);
|
||||
PCG(A, M, B, X, 3, 2000, 1e-12, 0.0);
|
||||
#else
|
||||
// 16. If MFEM was compiled with SuiteSparse, use UMFPACK to solve the
|
||||
// the linear system.
|
||||
UMFPackSolver umf_solver;
|
||||
umf_solver.Control[UMFPACK_ORDERING] = UMFPACK_ORDERING_METIS;
|
||||
umf_solver.SetOperator(A);
|
||||
umf_solver.Mult(B, X);
|
||||
#endif
|
||||
|
||||
// 17. After solving the linear system, reconstruct the solution as a
|
||||
// finite element GridFunction. Constrained nodes are interpolated
|
||||
// from true DOFs (it may therefore happen that x.Size() >= X.Size()).
|
||||
a.RecoverFEMSolution(X, b, x);
|
||||
|
||||
// 18. Send solution by socket to the GLVis server.
|
||||
if (visualization && sol_sock.good())
|
||||
{
|
||||
GridFunction nodes(&fespace), *nodes_p = &nodes;
|
||||
mesh.GetNodes(nodes);
|
||||
nodes += x;
|
||||
int own_nodes = 0;
|
||||
mesh.SwapNodes(nodes_p, own_nodes);
|
||||
x.Neg(); // visualize the backward displacement
|
||||
sol_sock << "solution\n" << mesh << x << flush;
|
||||
x.Neg();
|
||||
mesh.SwapNodes(nodes_p, own_nodes);
|
||||
if (it == 0)
|
||||
{
|
||||
sol_sock << "keys '" << ((dim == 2) ? "Rjl" : "") << "m'" << endl;
|
||||
}
|
||||
sol_sock << "window_title 'AMR iteration: " << it << "'\n"
|
||||
<< "pause" << endl;
|
||||
cout << "Visualization paused. "
|
||||
"Press <space> in the GLVis window to continue." << endl;
|
||||
}
|
||||
|
||||
if (cdofs > max_dofs)
|
||||
{
|
||||
cout << "Reached the maximum number of dofs. Stop." << endl;
|
||||
break;
|
||||
}
|
||||
|
||||
// 19. Call the refiner to modify the mesh. The refiner calls the error
|
||||
// estimator to obtain element errors, then it selects elements to be
|
||||
// refined and finally it modifies the mesh. The Stop() method can be
|
||||
// used to determine if a stopping criterion was met.
|
||||
refiner.Apply(mesh);
|
||||
if (refiner.Stop())
|
||||
{
|
||||
cout << "Stopping criterion satisfied. Stop." << endl;
|
||||
break;
|
||||
}
|
||||
|
||||
// 20. Update the space to reflect the new state of the mesh. Also,
|
||||
// interpolate the solution x so that it lies in the new space but
|
||||
// represents the same function. This saves solver iterations later
|
||||
// since we'll have a good initial guess of x in the next step.
|
||||
// Internally, FiniteElementSpace::Update() calculates an
|
||||
// interpolation matrix which is then used by GridFunction::Update().
|
||||
fespace.Update();
|
||||
x.Update();
|
||||
|
||||
// 21. Inform also the bilinear and linear forms that the space has
|
||||
// changed.
|
||||
a.Update();
|
||||
b.Update();
|
||||
}
|
||||
|
||||
{
|
||||
ofstream mesh_ref_out("ex22_reference.mesh");
|
||||
mesh_ref_out.precision(16);
|
||||
mesh.Print(mesh_ref_out);
|
||||
|
||||
ofstream mesh_out("ex22_deformed.mesh");
|
||||
mesh_out.precision(16);
|
||||
GridFunction nodes(&fespace), *nodes_p = &nodes;
|
||||
mesh.GetNodes(nodes);
|
||||
nodes += x;
|
||||
int own_nodes = 0;
|
||||
mesh.SwapNodes(nodes_p, own_nodes);
|
||||
mesh.Print(mesh_out);
|
||||
mesh.SwapNodes(nodes_p, own_nodes);
|
||||
|
||||
ofstream x_out("ex22_displacement.sol");
|
||||
x_out.precision(16);
|
||||
x.Save(x_out);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,366 @@
|
||||
// MFEM Example 22
|
||||
//
|
||||
// Compile with: make ex22p
|
||||
//
|
||||
// Sample runs: mpirun -np 4 ex22p
|
||||
// mpirun -np 4 ex22p -o 3
|
||||
// mpirun -np 4 ex22p -m ../data/beam-quad.mesh
|
||||
// mpirun -np 4 ex22p -m ../data/beam-quad.mesh -o 3
|
||||
// mpirun -np 4 ex22p -m ../data/beam-tet.mesh
|
||||
// mpirun -np 4 ex22p -m ../data/beam-tet.mesh -o 2
|
||||
// mpirun -np 4 ex22p -m ../data/beam-hex.mesh
|
||||
// mpirun -np 4 ex22p -m ../data/beam-hex.mesh -o 2
|
||||
//
|
||||
// Description: This is a version of Example 2p with a simple adaptive mesh
|
||||
// refinement loop. The problem being solved is again the linear
|
||||
// elasticity describing a multi-material cantilever beam.
|
||||
// The problem is solved on a sequence of meshes which
|
||||
// are locally refined in a conforming (triangles, tetrahedrons)
|
||||
// or non-conforming (quadrilaterals, hexahedra) manner according
|
||||
// to a simple ZZ error estimator.
|
||||
//
|
||||
// The example demonstrates MFEM's capability to work with both
|
||||
// conforming and nonconforming refinements, in 2D and 3D, on
|
||||
// linear and curved meshes. Interpolation of functions from
|
||||
// coarse to fine meshes, as well as persistent GLVis
|
||||
// visualization are also illustrated.
|
||||
//
|
||||
// We recommend viewing Examples 2p and 6p before viewing this
|
||||
// example.
|
||||
|
||||
#include "mfem.hpp"
|
||||
#include <fstream>
|
||||
#include <iostream>
|
||||
|
||||
using namespace std;
|
||||
using namespace mfem;
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
// 0. Initialize MPI.
|
||||
int num_procs, myid;
|
||||
MPI_Init(&argc, &argv);
|
||||
MPI_Comm_size(MPI_COMM_WORLD, &num_procs);
|
||||
MPI_Comm_rank(MPI_COMM_WORLD, &myid);
|
||||
|
||||
// 1. Parse command-line options.
|
||||
const char *mesh_file = "../data/beam-tri.mesh";
|
||||
int serial_ref_levels = 0;
|
||||
int order = 1;
|
||||
bool static_cond = false;
|
||||
bool visualization = 1;
|
||||
|
||||
OptionsParser args(argc, argv);
|
||||
args.AddOption(&mesh_file, "-m", "--mesh",
|
||||
"Mesh file to use.");
|
||||
args.AddOption(&serial_ref_levels, "-rs", "--refine-serial",
|
||||
"Number of uniform serial refinements (before parallel"
|
||||
" partitioning)");
|
||||
args.AddOption(&order, "-o", "--order",
|
||||
"Finite element order (polynomial degree).");
|
||||
args.AddOption(&static_cond, "-sc", "--static-condensation", "-no-sc",
|
||||
"--no-static-condensation", "Enable static condensation.");
|
||||
args.AddOption(&visualization, "-vis", "--visualization", "-no-vis",
|
||||
"--no-visualization",
|
||||
"Enable or disable GLVis visualization.");
|
||||
args.Parse();
|
||||
if (!args.Good())
|
||||
{
|
||||
if (myid == 0)
|
||||
{
|
||||
args.PrintUsage(cout);
|
||||
}
|
||||
MPI_Finalize();
|
||||
return 1;
|
||||
}
|
||||
if (myid == 0)
|
||||
{
|
||||
args.PrintOptions(cout);
|
||||
}
|
||||
|
||||
// 2. Read the mesh from the given mesh file. We can handle triangular,
|
||||
// quadrilateral, tetrahedral, and hexahedral meshes with the same code.
|
||||
Mesh mesh(mesh_file, 1, 1);
|
||||
int dim = mesh.Dimension();
|
||||
MFEM_VERIFY(mesh.SpaceDimension() == dim, "invalid mesh");
|
||||
|
||||
if (mesh.attributes.Max() < 2 || mesh.bdr_attributes.Max() < 2)
|
||||
{
|
||||
cerr << "\nInput mesh should have at least two materials and "
|
||||
<< "two boundary attributes! (See schematic in ex2.cpp)\n"
|
||||
<< endl;
|
||||
MPI_Finalize();
|
||||
return 3;
|
||||
}
|
||||
|
||||
// 3. Refine the mesh before parallel partitioning. Since a NURBS mesh can
|
||||
// currently only be refined uniformly, we need to convert it to a
|
||||
// piecewise-polynomial curved mesh. First we refine the NURBS mesh a bit
|
||||
// more and then project the curvature to quadratic Nodes.
|
||||
if (mesh.NURBSext && serial_ref_levels == 0)
|
||||
{
|
||||
serial_ref_levels = 2;
|
||||
}
|
||||
for (int i = 0; i < serial_ref_levels; i++)
|
||||
{
|
||||
mesh.UniformRefinement();
|
||||
}
|
||||
if (mesh.NURBSext)
|
||||
{
|
||||
mesh.SetCurvature(2);
|
||||
}
|
||||
mesh.EnsureNCMesh();
|
||||
|
||||
ParMesh pmesh(MPI_COMM_WORLD, mesh);
|
||||
mesh.Clear();
|
||||
|
||||
// 4. Define a finite element space on the mesh. The polynomial order is
|
||||
// one (linear) by default, but this can be changed on the command line.
|
||||
H1_FECollection fec(order, dim);
|
||||
ParFiniteElementSpace fespace(&pmesh, &fec, dim);
|
||||
|
||||
// 5. As in Example 2, we set up the linear form b(.) which corresponds to
|
||||
// the right-hand side of the FEM linear system. In this case, b_i equals
|
||||
// the boundary integral of f*phi_i where f represents a "pull down"
|
||||
// force on the Neumann part of the boundary and phi_i are the basis
|
||||
// functions in the finite element fespace. The force is defined by the
|
||||
// VectorArrayCoefficient object f, which is a vector of Coefficient
|
||||
// objects. The fact that f is non-zero on boundary attribute 2 is
|
||||
// indicated by the use of piece-wise constants coefficient for its last
|
||||
// component. We don't assemble the discrete problem yet, this will be
|
||||
// done in the main loop.
|
||||
VectorArrayCoefficient f(dim);
|
||||
for (int i = 0; i < dim-1; i++)
|
||||
{
|
||||
f.Set(i, new ConstantCoefficient(0.0));
|
||||
}
|
||||
{
|
||||
Vector pull_force(pmesh.bdr_attributes.Max());
|
||||
pull_force = 0.0;
|
||||
pull_force(1) = -1.0e-2;
|
||||
f.Set(dim-1, new PWConstCoefficient(pull_force));
|
||||
}
|
||||
|
||||
ParLinearForm b(&fespace);
|
||||
b.AddDomainIntegrator(new VectorBoundaryLFIntegrator(f));
|
||||
|
||||
// 6. Set up the bilinear form a(.,.) on the finite element space
|
||||
// corresponding to the linear elasticity integrator with piece-wise
|
||||
// constants coefficient lambda and mu.
|
||||
Vector lambda(pmesh.attributes.Max());
|
||||
lambda = 1.0;
|
||||
lambda(0) = lambda(1)*50;
|
||||
PWConstCoefficient lambda_func(lambda);
|
||||
Vector mu(pmesh.attributes.Max());
|
||||
mu = 1.0;
|
||||
mu(0) = mu(1)*50;
|
||||
PWConstCoefficient mu_func(mu);
|
||||
|
||||
ParBilinearForm a(&fespace);
|
||||
BilinearFormIntegrator *integ =
|
||||
new ElasticityIntegrator(lambda_func,mu_func);
|
||||
a.AddDomainIntegrator(integ);
|
||||
if (static_cond) { a.EnableStaticCondensation(); }
|
||||
|
||||
// 7. The solution vector x and the associated finite element grid function
|
||||
// will be maintained over the AMR iterations. We initialize it to zero.
|
||||
Vector zero_vec(dim);
|
||||
zero_vec = 0.0;
|
||||
VectorConstantCoefficient zero_vec_coeff(zero_vec);
|
||||
ParGridFunction x(&fespace);
|
||||
x = 0.0;
|
||||
|
||||
// 8. Determine the list of true (i.e. conforming) essential boundary dofs.
|
||||
// In this example, the boundary conditions are defined by marking only
|
||||
// boundary attribute 1 from the mesh as essential and converting it to a
|
||||
// list of true dofs. The conversion to true dofs will be done in the
|
||||
// main loop.
|
||||
Array<int> ess_bdr(pmesh.bdr_attributes.Max());
|
||||
ess_bdr = 0;
|
||||
ess_bdr[0] = 1;
|
||||
|
||||
// 9. GLVis visualization.
|
||||
char vishost[] = "localhost";
|
||||
int visport = 19916;
|
||||
socketstream sol_sock;
|
||||
|
||||
// 10. Set up an error estimator. Here we use the Zienkiewicz-Zhu estimator
|
||||
// that uses the ComputeElementFlux method of the ElasticityIntegrator to
|
||||
// recover a smoothed flux (stress) that is subtracted from the element
|
||||
// flux to get an error indicator. We need to supply the space for the
|
||||
// smoothed flux: an (H1)^tdim (i.e., vector-valued) space is used here.
|
||||
// Here, tdim represents the number of components for a symmetric (dim x
|
||||
// dim) tensor.
|
||||
const int tdim = dim*(dim+1)/2;
|
||||
L2_FECollection flux_fec(order, dim);
|
||||
ParFiniteElementSpace flux_fespace(&pmesh, &flux_fec, tdim);
|
||||
ParFiniteElementSpace smooth_flux_fespace(&pmesh, &fec, tdim);
|
||||
L2ZienkiewiczZhuEstimator estimator(*integ, x, flux_fespace,
|
||||
smooth_flux_fespace);
|
||||
|
||||
// 11. A refiner selects and refines elements based on a refinement strategy.
|
||||
// The strategy here is to refine elements with errors larger than a
|
||||
// fraction of the maximum element error. Other strategies are possible.
|
||||
// The refiner will call the given error estimator.
|
||||
ThresholdRefiner refiner(estimator);
|
||||
refiner.SetTotalErrorFraction(0.7);
|
||||
|
||||
// 12. The main AMR loop. In each iteration we solve the problem on the
|
||||
// current mesh, visualize the solution, and refine the mesh.
|
||||
const int max_dofs = 50000;
|
||||
const int max_amr_itr = 20;
|
||||
for (int it = 0; it <= max_amr_itr; it++)
|
||||
{
|
||||
HYPRE_Int global_dofs = fespace.GlobalTrueVSize();
|
||||
if (myid == 0)
|
||||
{
|
||||
cout << "\nAMR iteration " << it << endl;
|
||||
cout << "Number of unknowns: " << global_dofs << endl;
|
||||
}
|
||||
|
||||
// 13. Assemble the stiffness matrix and the right-hand side.
|
||||
a.Assemble();
|
||||
b.Assemble();
|
||||
|
||||
// 14. Set Dirichlet boundary values in the GridFunction x.
|
||||
// Determine the list of Dirichlet true DOFs in the linear system.
|
||||
Array<int> ess_tdof_list;
|
||||
x.ProjectBdrCoefficient(zero_vec_coeff, ess_bdr);
|
||||
fespace.GetEssentialTrueDofs(ess_bdr, ess_tdof_list);
|
||||
|
||||
// 15. Create the linear system: eliminate boundary conditions, constrain
|
||||
// hanging nodes and possibly apply other transformations. The system
|
||||
// will be solved for true (unconstrained) DOFs only.
|
||||
|
||||
HypreParMatrix A;
|
||||
Vector B, X;
|
||||
const int copy_interior = 1;
|
||||
a.FormLinearSystem(ess_tdof_list, x, b, A, X, B, copy_interior);
|
||||
|
||||
// 16. Define and apply a parallel PCG solver for AX=B with the BoomerAMG
|
||||
// preconditioner from hypre.
|
||||
HypreBoomerAMG amg;
|
||||
amg.SetPrintLevel(0);
|
||||
// amg.SetSystemsOptions(dim); // optional
|
||||
CGSolver pcg(A.GetComm());
|
||||
pcg.SetPreconditioner(amg);
|
||||
pcg.SetOperator(A);
|
||||
pcg.SetRelTol(1e-6);
|
||||
pcg.SetMaxIter(500);
|
||||
pcg.SetPrintLevel(3); // print the first and the last iterations only
|
||||
pcg.Mult(B, X);
|
||||
|
||||
// 17. After solving the linear system, reconstruct the solution as a
|
||||
// finite element GridFunction. Constrained nodes are interpolated
|
||||
// from true DOFs (it may therefore happen that x.Size() >= X.Size()).
|
||||
a.RecoverFEMSolution(X, b, x);
|
||||
|
||||
// 18. Send solution by socket to the GLVis server.
|
||||
if (visualization && it == 0)
|
||||
{
|
||||
sol_sock.open(vishost, visport);
|
||||
sol_sock.precision(8);
|
||||
}
|
||||
if (visualization && sol_sock.good())
|
||||
{
|
||||
GridFunction nodes(&fespace), *nodes_p = &nodes;
|
||||
pmesh.GetNodes(nodes);
|
||||
nodes += x;
|
||||
int own_nodes = 0;
|
||||
pmesh.SwapNodes(nodes_p, own_nodes);
|
||||
x.Neg(); // visualize the backward displacement
|
||||
sol_sock << "parallel " << num_procs << ' ' << myid << '\n';
|
||||
sol_sock << "solution\n" << pmesh << x << flush;
|
||||
x.Neg();
|
||||
pmesh.SwapNodes(nodes_p, own_nodes);
|
||||
if (it == 0)
|
||||
{
|
||||
sol_sock << "keys '" << ((dim == 2) ? "Rjl" : "") << "m'" << endl;
|
||||
}
|
||||
sol_sock << "window_title 'AMR iteration: " << it << "'\n"
|
||||
<< "pause" << endl;
|
||||
if (myid == 0)
|
||||
{
|
||||
cout << "Visualization paused. "
|
||||
"Press <space> in the GLVis window to continue." << endl;
|
||||
}
|
||||
}
|
||||
|
||||
if (global_dofs > max_dofs)
|
||||
{
|
||||
if (myid == 0)
|
||||
{
|
||||
cout << "Reached the maximum number of dofs. Stop." << endl;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
// 19. Call the refiner to modify the mesh. The refiner calls the error
|
||||
// estimator to obtain element errors, then it selects elements to be
|
||||
// refined and finally it modifies the mesh. The Stop() method can be
|
||||
// used to determine if a stopping criterion was met.
|
||||
refiner.Apply(pmesh);
|
||||
if (refiner.Stop())
|
||||
{
|
||||
if (myid == 0)
|
||||
{
|
||||
cout << "Stopping criterion satisfied. Stop." << endl;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
// 20. Update the space to reflect the new state of the mesh. Also,
|
||||
// interpolate the solution x so that it lies in the new space but
|
||||
// represents the same function. This saves solver iterations later
|
||||
// since we'll have a good initial guess of x in the next step.
|
||||
// Internally, FiniteElementSpace::Update() calculates an
|
||||
// interpolation matrix which is then used by GridFunction::Update().
|
||||
fespace.Update();
|
||||
x.Update();
|
||||
|
||||
// 21. Load balance the mesh, and update the space and solution. Currently
|
||||
// available only for nonconforming meshes.
|
||||
if (pmesh.Nonconforming())
|
||||
{
|
||||
pmesh.Rebalance();
|
||||
|
||||
// Update the space and the GridFunction. This time the update matrix
|
||||
// redistributes the GridFunction among the processors.
|
||||
fespace.Update();
|
||||
x.Update();
|
||||
}
|
||||
|
||||
// 22. Inform also the bilinear and linear forms that the space has
|
||||
// changed.
|
||||
a.Update();
|
||||
b.Update();
|
||||
}
|
||||
|
||||
{
|
||||
ostringstream mref_name, mesh_name, sol_name;
|
||||
mref_name << "ex22p_reference_mesh." << setfill('0') << setw(6) << myid;
|
||||
mesh_name << "ex22p_deformed_mesh." << setfill('0') << setw(6) << myid;
|
||||
sol_name << "ex22p_displacement." << setfill('0') << setw(6) << myid;
|
||||
|
||||
ofstream mesh_ref_out(mref_name.str().c_str());
|
||||
mesh_ref_out.precision(16);
|
||||
pmesh.Print(mesh_ref_out);
|
||||
|
||||
ofstream mesh_out(mesh_name.str().c_str());
|
||||
mesh_out.precision(16);
|
||||
GridFunction nodes(&fespace), *nodes_p = &nodes;
|
||||
pmesh.GetNodes(nodes);
|
||||
nodes += x;
|
||||
int own_nodes = 0;
|
||||
pmesh.SwapNodes(nodes_p, own_nodes);
|
||||
pmesh.Print(mesh_out);
|
||||
pmesh.SwapNodes(nodes_p, own_nodes);
|
||||
|
||||
ofstream x_out(sol_name.str().c_str());
|
||||
x_out.precision(16);
|
||||
x.Save(x_out);
|
||||
}
|
||||
|
||||
MPI_Finalize();
|
||||
return 0;
|
||||
}
|
||||
@@ -6,6 +6,7 @@
|
||||
// mpirun -np 4 ex2p -m ../data/beam-quad.mesh
|
||||
// mpirun -np 4 ex2p -m ../data/beam-tet.mesh
|
||||
// mpirun -np 4 ex2p -m ../data/beam-hex.mesh
|
||||
// mpirun -np 4 ex2p -m ../data/beam-wedge.mesh
|
||||
// mpirun -np 4 ex2p -m ../data/beam-tri.mesh -o 2 -sys
|
||||
// mpirun -np 4 ex2p -m ../data/beam-quad.mesh -o 3 -elast
|
||||
// mpirun -np 4 ex2p -m ../data/beam-quad.mesh -o 3 -sc
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
// ex3 -m ../data/beam-tet.mesh
|
||||
// ex3 -m ../data/beam-hex.mesh
|
||||
// ex3 -m ../data/escher.mesh
|
||||
// ex3 -m ../data/escher.mesh -o 2
|
||||
// ex3 -m ../data/fichera.mesh
|
||||
// ex3 -m ../data/fichera-q2.vtk
|
||||
// ex3 -m ../data/fichera-q3.mesh
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
// mpirun -np 4 ex3p -m ../data/beam-tet.mesh
|
||||
// mpirun -np 4 ex3p -m ../data/beam-hex.mesh
|
||||
// mpirun -np 4 ex3p -m ../data/escher.mesh
|
||||
// mpirun -np 4 ex3p -m ../data/escher.mesh -o 2
|
||||
// mpirun -np 4 ex3p -m ../data/fichera.mesh
|
||||
// mpirun -np 4 ex3p -m ../data/fichera-q2.vtk
|
||||
// mpirun -np 4 ex3p -m ../data/fichera-q3.mesh
|
||||
|
||||
+1
-1
@@ -20,7 +20,7 @@
|
||||
// equation -Delta u = 1 with homogeneous Dirichlet boundary
|
||||
// conditions. The problem is solved on a sequence of meshes which
|
||||
// are locally refined in a conforming (triangles, tetrahedrons)
|
||||
// or non-conforming (quadrilateral, hexahedrons) manner according
|
||||
// or non-conforming (quadrilaterals, hexahedra) manner according
|
||||
// to a simple ZZ error estimator.
|
||||
//
|
||||
// The example demonstrates MFEM's capability to work with both
|
||||
|
||||
+1
-1
@@ -20,7 +20,7 @@
|
||||
// equation -Delta u = 1 with homogeneous Dirichlet boundary
|
||||
// conditions. The problem is solved on a sequence of meshes which
|
||||
// are locally refined in a conforming (triangles, tetrahedrons)
|
||||
// or non-conforming (quadrilateral, hexahedrons) manner according
|
||||
// or non-conforming (quadrilaterals, hexahedra) manner according
|
||||
// to a simple ZZ error estimator.
|
||||
//
|
||||
// The example demonstrates MFEM's capability to work with both
|
||||
|
||||
@@ -4,8 +4,10 @@
|
||||
//
|
||||
// Sample runs: ex8 -m ../data/square-disc.mesh
|
||||
// ex8 -m ../data/star.mesh
|
||||
// ex8 -m ../data/star-mixed.mesh
|
||||
// ex8 -m ../data/escher.mesh
|
||||
// ex8 -m ../data/fichera.mesh
|
||||
// ex8 -m ../data/fichera-mixed.mesh
|
||||
// ex8 -m ../data/square-disc-p2.vtk
|
||||
// ex8 -m ../data/square-disc-p3.mesh
|
||||
// ex8 -m ../data/star-surf.mesh -o 2
|
||||
|
||||
@@ -4,8 +4,10 @@
|
||||
//
|
||||
// Sample runs: mpirun -np 4 ex8p -m ../data/square-disc.mesh
|
||||
// mpirun -np 4 ex8p -m ../data/star.mesh
|
||||
// mpirun -np 4 ex8p -m ../data/star-mixed.mesh
|
||||
// mpirun -np 4 ex8p -m ../data/escher.mesh
|
||||
// mpirun -np 4 ex8p -m ../data/fichera.mesh
|
||||
// mpirun -np 4 ex8p -m ../data/fichera-mixed.mesh
|
||||
// mpirun -np 4 ex8p -m ../data/square-disc-p2.vtk
|
||||
// mpirun -np 4 ex8p -m ../data/square-disc-p3.mesh
|
||||
// mpirun -np 4 ex8p -m ../data/star-surf.mesh -o 2
|
||||
@@ -123,9 +125,13 @@ int main(int argc, char *argv[])
|
||||
test_order++;
|
||||
}
|
||||
if (test_order < trial_order)
|
||||
{
|
||||
if (myid == 0)
|
||||
{
|
||||
cerr << "Warning, test space not enriched enough to handle primal"
|
||||
<< " trial space\n";
|
||||
}
|
||||
}
|
||||
|
||||
FiniteElementCollection *x0_fec, *xhat_fec, *test_fec;
|
||||
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
// ex9 -m ../data/periodic-hexagon.mesh -p 1 -r 2 -dt 0.005 -tf 9
|
||||
// ex9 -m ../data/amr-quad.mesh -p 1 -r 2 -dt 0.002 -tf 9
|
||||
// ex9 -m ../data/star-q3.mesh -p 1 -r 2 -dt 0.005 -tf 9
|
||||
// ex9 -m ../data/star-mixed.mesh -p 1 -r 2 -dt 0.005 -tf 9
|
||||
// ex9 -m ../data/disc-nurbs.mesh -p 1 -r 3 -dt 0.005 -tf 9
|
||||
// ex9 -m ../data/disc-nurbs.mesh -p 2 -r 3 -dt 0.005 -tf 9
|
||||
// ex9 -m ../data/periodic-square.mesh -p 3 -r 4 -dt 0.0025 -tf 9 -vs 20
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
// mpirun -np 4 ex9p -m ../data/periodic-hexagon.mesh -p 1 -dt 0.005 -tf 9
|
||||
// mpirun -np 4 ex9p -m ../data/amr-quad.mesh -p 1 -rp 1 -dt 0.002 -tf 9
|
||||
// mpirun -np 4 ex9p -m ../data/star-q3.mesh -p 1 -rp 1 -dt 0.004 -tf 9
|
||||
// mpirun -np 4 ex9p -m ../data/star-mixed.mesh -p 1 -rp 1 -dt 0.004 -tf 9
|
||||
// mpirun -np 4 ex9p -m ../data/disc-nurbs.mesh -p 1 -rp 1 -dt 0.005 -tf 9
|
||||
// mpirun -np 4 ex9p -m ../data/disc-nurbs.mesh -p 2 -rp 1 -dt 0.005 -tf 9
|
||||
// mpirun -np 4 ex9p -m ../data/periodic-square.mesh -p 3 -rp 2 -dt 0.0025 -tf 9 -vs 20
|
||||
|
||||
+7
-2
@@ -22,9 +22,9 @@ MFEM_LIB_FILE = mfem_is_not_built
|
||||
-include $(CONFIG_MK)
|
||||
|
||||
SEQ_EXAMPLES = ex1 ex2 ex3 ex4 ex5 ex6 ex7 ex8 ex9 ex10 ex14 ex15 ex16 ex17\
|
||||
ex18 ex19
|
||||
ex18 ex19 ex20 ex22
|
||||
PAR_EXAMPLES = ex1p ex2p ex3p ex4p ex5p ex6p ex7p ex8p ex9p ex10p ex11p ex12p\
|
||||
ex13p ex14p ex15p ex16p ex17p ex18p ex19p
|
||||
ex13p ex14p ex15p ex16p ex17p ex18p ex19p ex20p ex22p
|
||||
|
||||
ifeq ($(MFEM_USE_MPI),NO)
|
||||
EXAMPLES = $(SEQ_EXAMPLES)
|
||||
@@ -38,6 +38,9 @@ endif
|
||||
ifeq ($(MFEM_USE_PETSC),YES)
|
||||
SUBDIRS += petsc
|
||||
endif
|
||||
ifeq ($(MFEM_USE_PUMI),YES)
|
||||
SUBDIRS += pumi
|
||||
endif
|
||||
SUBDIRS_ALL = $(addsuffix /all,$(SUBDIRS))
|
||||
SUBDIRS_TEST = $(addsuffix /test,$(SUBDIRS))
|
||||
SUBDIRS_CLEAN = $(addsuffix /clean,$(SUBDIRS))
|
||||
@@ -115,3 +118,5 @@ clean-exec:
|
||||
@rm -f ex16.mesh ex16-mesh.* ex16-init.* ex16-final.*
|
||||
@rm -f vortex-mesh.* vortex.mesh vortex-?-init.* vortex-?-final.*
|
||||
@rm -f deformation.* pressure.*
|
||||
@rm -f ex20.dat ex20p_?????.dat gnuplot_ex20.inp gnuplot_ex20p.inp
|
||||
@rm -f ex22*.mesh ex22*.sol ex22p_*.*
|
||||
|
||||
@@ -63,31 +63,29 @@ add_mfem_examples(PETSC_EXAMPLES_SRCS ${PFX} copy_petsc_rc_files test_petsc)
|
||||
# ctest -R petsc
|
||||
|
||||
# Command line options for the tests.
|
||||
set(EX1P_ARGS -m ../../data/amr-quad.mesh --usepetsc --petscopts rc_ex1p)
|
||||
set(EX2P_ARGS -m ../../data/beam-quad.mesh --usepetsc --petscopts rc_ex2p)
|
||||
set(EX3P_ARGS -m ../../data/klein-bottle.mesh
|
||||
-o 2 -f 0.1 --usepetsc --petscopts rc_ex3p_bddc --nonoverlapping)
|
||||
set(EX4P_ARGS -m ../../data/klein-bottle.mesh
|
||||
-o 2 --usepetsc --petscopts rc_ex4p_bddc --nonoverlapping)
|
||||
set(EX5P_BDDC_ARGS -m ../../data/star.mesh
|
||||
--usepetsc --petscopts rc_ex5p_bddc --nonoverlapping)
|
||||
set(EX5P_FSPL_ARGS -m ../../data/beam-tet.mesh
|
||||
--usepetsc --petscopts rc_ex5p_fieldsplit)
|
||||
set(EX6P_ARGS -m ../../data/amr-quad.mesh --usepetsc)
|
||||
set(EX9P_E_ARGS -m ../../data/periodic-hexagon.mesh
|
||||
--usepetsc --petscopts rc_ex9p_expl -dt 0.1)
|
||||
set(EX9P_ES_ARGS -m ../../data/periodic-hexagon.mesh
|
||||
--usepetsc --petscopts rc_ex9p_expl --no-step)
|
||||
set(EX9P_IS_ARGS -m ../../data/periodic-hexagon.mesh
|
||||
--usepetsc --petscopts rc_ex9p_impl --implicit -tf 0.5)
|
||||
set(EX10P_ARGS -m ../../data/beam-quad.mesh
|
||||
-tf 30 -s 3 -rs 2 -dt 3 --usepetsc --petscopts rc_ex10p)
|
||||
set(EX1_ARGS_W -m ../../data/amr-quad.mesh --usepetsc)
|
||||
set(EX1_ARGS_P -m ../../data/amr-quad.mesh --usepetsc --petscopts rc_ex1p)
|
||||
set(EX2_ARGS -m ../../data/beam-quad.mesh --usepetsc --petscopts rc_ex2p)
|
||||
set(EX3_ARGS -m ../../data/klein-bottle.mesh -o 2 -f 0.1 --usepetsc --petscopts rc_ex3p_bddc --nonoverlapping)
|
||||
set(EX4_ARGS -m ../../data/klein-bottle.mesh -o 2 --usepetsc --petscopts rc_ex4p_bddc --nonoverlapping)
|
||||
set(EX4_HYB_ARGS -m ../../data/klein-bottle.mesh -o 2 --usepetsc --petscopts rc_ex4p_bddc --nonoverlapping --hybridization)
|
||||
set(EX5_BDDC_LB_ARGS -m ../../data/star.mesh --usepetsc -o 0 --petscopts rc_ex5p_bddc --nonoverlapping --local-bdr)
|
||||
set(EX5_BDDC_GB_ARGS -m ../../data/star.mesh --usepetsc -o 0 --petscopts rc_ex5p_bddc --nonoverlapping)
|
||||
set(EX5_FSPL_ARGS -m ../../data/beam-tet.mesh --usepetsc -o 0 --petscopts rc_ex5p_fieldsplit)
|
||||
set(EX6_ARGS -m ../../data/amr-quad.mesh --usepetsc)
|
||||
set(EX6_NONOVL_ARGS -m ../../data/amr-quad.mesh --usepetsc --nonoverlapping)
|
||||
set(EX9_E_ARGS -m ../../data/periodic-hexagon.mesh --usepetsc --petscopts rc_ex9p_expl -dt 0.1)
|
||||
set(EX9_ES_ARGS -m ../../data/periodic-hexagon.mesh --usepetsc --petscopts rc_ex9p_expl --no-step)
|
||||
set(EX9_IS_ARGS -m ../../data/periodic-hexagon.mesh --usepetsc --petscopts rc_ex9p_impl --implicit -tf 0.5)
|
||||
set(EX10_ARGS -m ../../data/beam-quad.mesh --usepetsc --petscopts rc_ex10p -tf 30 -s 3 -rs 2 -dt 3)
|
||||
|
||||
# Add the tests: one test per command-line-variable.
|
||||
foreach(TEST_OPTIONS_VAR
|
||||
EX1P_ARGS EX2P_ARGS EX3P_ARGS EX4P_ARGS EX5P_BDDC_ARGS EX5P_FSPL_ARGS
|
||||
EX6P_ARGS EX9P_E_ARGS EX9P_ES_ARGS EX9P_IS_ARGS EX10P_ARGS)
|
||||
EX1_ARGS_W EX1_ARGS_P EX2_ARGS EX3_ARGS EX4_ARGS EX4_HYB_ARGS
|
||||
EX5_BDDC_LB_ARGS EX5_BDDC_GB_ARGS EX5_FSPL_ARGS EX6_ARGS EX6_NONOVL_ARGS
|
||||
EX9_E_ARGS EX9_ES_ARGS EX9_IS_ARGS EX10_ARGS)
|
||||
string(REGEX REPLACE "^(.+)_ARGS" "\\1" TEST_NAME_UC ${TEST_OPTIONS_VAR})
|
||||
string(REGEX REPLACE "^([^_]+)" "\\1P" TEST_NAME_UC ${TEST_NAME_UC})
|
||||
string(TOLOWER ${TEST_NAME_UC} TEST_NAME_FULL)
|
||||
string(REGEX REPLACE "^([^_]+).*" "\\1" TEST_NAME ${TEST_NAME_FULL})
|
||||
set(TEST_NAME_FULL ${PFX}${TEST_NAME_FULL})
|
||||
@@ -98,7 +96,7 @@ foreach(TEST_OPTIONS_VAR
|
||||
# All PETSC tests are parallel.
|
||||
if (MFEM_USE_MPI)
|
||||
add_test(NAME ${TEST_NAME_FULL}_np=4
|
||||
COMMAND ${MPIEXEC} ${MPIEXEC_NUMPROC_FLAG} 4
|
||||
COMMAND ${MPIEXEC} ${MPIEXEC_NUMPROC_FLAG} ${MFEM_MPI_NP}
|
||||
${MPIEXEC_PREFLAGS}
|
||||
$<TARGET_FILE:${TEST_NAME}> ${TEST_OPTIONS}
|
||||
${MPIEXEC_POSTFLAGS})
|
||||
|
||||
@@ -239,7 +239,7 @@ int main(int argc, char *argv[])
|
||||
// 2b. We initialize PETSc
|
||||
if (use_petsc)
|
||||
{
|
||||
PetscInitialize(NULL,NULL,petscrc_file,NULL);
|
||||
MFEMInitializePetsc(NULL,NULL,petscrc_file,NULL);
|
||||
}
|
||||
|
||||
// 3. Read the serial mesh from the given mesh file on all processors. We can
|
||||
@@ -446,7 +446,7 @@ int main(int argc, char *argv[])
|
||||
delete oper;
|
||||
|
||||
// We finalize PETSc
|
||||
if (use_petsc) { PetscFinalize(); }
|
||||
if (use_petsc) { MFEMFinalizePetsc(); }
|
||||
|
||||
MPI_Finalize();
|
||||
|
||||
|
||||
@@ -123,7 +123,7 @@ int main(int argc, char *argv[])
|
||||
}
|
||||
|
||||
// 2b. We initialize PETSc
|
||||
PetscInitialize(NULL,NULL,petscrc_file,NULL);
|
||||
MFEMInitializePetsc(NULL,NULL,petscrc_file,NULL);
|
||||
|
||||
// 3. Read the (serial) mesh from the given mesh file on all processors. We
|
||||
// can handle triangular, quadrilateral, tetrahedral, hexahedral, surface
|
||||
@@ -266,7 +266,6 @@ int main(int argc, char *argv[])
|
||||
if (visualization && petscmonitor)
|
||||
{
|
||||
pcg->SetMonitor(&mymon);
|
||||
pcg->SetPrintLevel(4);
|
||||
pcg->iterative_mode = true;
|
||||
X.Randomize();
|
||||
}
|
||||
@@ -314,7 +313,7 @@ int main(int argc, char *argv[])
|
||||
delete pmesh;
|
||||
|
||||
// We finalize PETSc
|
||||
PetscFinalize();
|
||||
MFEMFinalizePetsc();
|
||||
|
||||
MPI_Finalize();
|
||||
|
||||
|
||||
@@ -101,7 +101,7 @@ int main(int argc, char *argv[])
|
||||
}
|
||||
|
||||
// 2b. We initialize PETSc
|
||||
if (use_petsc) { PetscInitialize(NULL,NULL,petscrc_file,NULL); }
|
||||
if (use_petsc) { MFEMInitializePetsc(NULL,NULL,petscrc_file,NULL); }
|
||||
|
||||
// 3. Read the (serial) mesh from the given mesh file on all processors. We
|
||||
// can handle triangular, quadrilateral, tetrahedral, hexahedral, surface
|
||||
@@ -359,7 +359,7 @@ int main(int argc, char *argv[])
|
||||
delete pmesh;
|
||||
|
||||
// We finalize PETSc
|
||||
if (use_petsc) { PetscFinalize(); }
|
||||
if (use_petsc) { MFEMFinalizePetsc(); }
|
||||
|
||||
MPI_Finalize();
|
||||
|
||||
|
||||
@@ -96,7 +96,7 @@ int main(int argc, char *argv[])
|
||||
args.PrintOptions(cout);
|
||||
}
|
||||
// 2b. We initialize PETSc
|
||||
if (use_petsc) { PetscInitialize(NULL,NULL,petscrc_file,NULL); }
|
||||
if (use_petsc) { MFEMInitializePetsc(NULL,NULL,petscrc_file,NULL); }
|
||||
kappa = freq * M_PI;
|
||||
|
||||
// 3. Read the (serial) mesh from the given mesh file on all processors. We
|
||||
@@ -309,7 +309,7 @@ int main(int argc, char *argv[])
|
||||
delete pmesh;
|
||||
|
||||
// We finalize PETSc
|
||||
if (use_petsc) { PetscFinalize(); }
|
||||
if (use_petsc) { MFEMFinalizePetsc(); }
|
||||
|
||||
MPI_Finalize();
|
||||
|
||||
|
||||
@@ -97,7 +97,7 @@ int main(int argc, char *argv[])
|
||||
args.PrintOptions(cout);
|
||||
}
|
||||
// 2b. We initialize PETSc
|
||||
if (use_petsc) { PetscInitialize(NULL,NULL,petscrc_file,NULL); }
|
||||
if (use_petsc) { MFEMInitializePetsc(NULL,NULL,petscrc_file,NULL); }
|
||||
kappa = freq * M_PI;
|
||||
|
||||
// 3. Read the (serial) mesh from the given mesh file on all processors. We
|
||||
@@ -330,7 +330,7 @@ int main(int argc, char *argv[])
|
||||
delete pmesh;
|
||||
|
||||
// We finalize PETSc
|
||||
if (use_petsc) { PetscFinalize(); }
|
||||
if (use_petsc) { MFEMFinalizePetsc(); }
|
||||
|
||||
MPI_Finalize();
|
||||
|
||||
|
||||
+22
-13
@@ -64,6 +64,7 @@ int main(int argc, char *argv[])
|
||||
bool visualization = 1;
|
||||
bool use_petsc = true;
|
||||
bool use_nonoverlapping = false;
|
||||
bool local_bdr_spec = false;
|
||||
const char *petscrc_file = "";
|
||||
|
||||
OptionsParser args(argc, argv);
|
||||
@@ -86,6 +87,9 @@ int main(int argc, char *argv[])
|
||||
"-no-nonoverlapping", "--no-nonoverlapping",
|
||||
"Use or not the block diagonal PETSc's matrix format "
|
||||
"for non-overlapping domain decomposition.");
|
||||
args.AddOption(&local_bdr_spec, "-local-bdr", "--local-bdr", "-no-local-bdr",
|
||||
"--no-local-bdr",
|
||||
"Specify boundary dofs in local (Vdofs) ordering.");
|
||||
args.Parse();
|
||||
if (!args.Good())
|
||||
{
|
||||
@@ -101,7 +105,7 @@ int main(int argc, char *argv[])
|
||||
args.PrintOptions(cout);
|
||||
}
|
||||
// 2b. We initialize PETSc
|
||||
if (use_petsc) { PetscInitialize(NULL,NULL,petscrc_file,NULL); }
|
||||
if (use_petsc) { MFEMInitializePetsc(NULL,NULL,petscrc_file,NULL); }
|
||||
|
||||
// 3. Read the (serial) mesh from the given mesh file on all processors. We
|
||||
// can handle triangular, quadrilateral, tetrahedral, hexahedral, surface
|
||||
@@ -306,33 +310,38 @@ int main(int argc, char *argv[])
|
||||
{
|
||||
if (use_nonoverlapping)
|
||||
{
|
||||
PetscBDDCSolverParams opts;
|
||||
|
||||
// For saddle point problems, we need to provide BDDC the list of
|
||||
// boundary dofs either essential or natural.
|
||||
// Since R_space is the only space that may have boundary dofs and it
|
||||
// is ordered first then W_space, we don't need any local offset when
|
||||
// specifying the dofs.
|
||||
Array<int> bdr_tdof_list;
|
||||
bool local = false;
|
||||
if (pmesh->bdr_attributes.Size())
|
||||
{
|
||||
Array<int> bdr(pmesh->bdr_attributes.Max());
|
||||
bdr = 1;
|
||||
|
||||
R_space->GetEssentialTrueDofs(bdr, bdr_tdof_list);
|
||||
local = false;
|
||||
// Alternatively, you can also provide the list of dofs in local
|
||||
// ordering:
|
||||
// R_space->GetEssentialVDofs(bdr, bdr_tdof_list);
|
||||
// bdr_tdof_list.SetSize(R_space->GetVSize()+W_space->GetVSize(),0);
|
||||
// local = true;
|
||||
if (!local_bdr_spec)
|
||||
{
|
||||
// Essential dofs in global ordering
|
||||
R_space->GetEssentialTrueDofs(bdr, bdr_tdof_list);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Alternatively, you can also provide the list of dofs in local
|
||||
// ordering
|
||||
R_space->GetEssentialVDofs(bdr, bdr_tdof_list);
|
||||
bdr_tdof_list.SetSize(R_space->GetVSize()+W_space->GetVSize(),0);
|
||||
}
|
||||
opts.SetNatBdrDofs(&bdr_tdof_list,local_bdr_spec);
|
||||
}
|
||||
else
|
||||
{
|
||||
MFEM_ABORT("Need to know the boundary dofs");
|
||||
MFEM_WARNING("Missing boundary dofs. This may cause solver failures.");
|
||||
}
|
||||
|
||||
PetscBDDCSolverParams opts;
|
||||
opts.SetNatBdrDofs(&bdr_tdof_list,local);
|
||||
// See also command line options rc_ex5p_bddc
|
||||
pdarcyPr = new PetscBDDCSolver(MPI_COMM_WORLD,*darcyOp,opts,"prec_");
|
||||
}
|
||||
@@ -535,7 +544,7 @@ int main(int argc, char *argv[])
|
||||
delete pmesh;
|
||||
|
||||
// We finalize PETSc
|
||||
if (use_petsc) { PetscFinalize(); }
|
||||
if (use_petsc) { MFEMFinalizePetsc(); }
|
||||
|
||||
MPI_Finalize();
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
// equation -Delta u = 1 with homogeneous Dirichlet boundary
|
||||
// conditions. The problem is solved on a sequence of meshes which
|
||||
// are locally refined in a conforming (triangles, tetrahedrons)
|
||||
// or non-conforming (quadrilateral, hexahedrons) manner according
|
||||
// or non-conforming (quadrilaterals, hexahedra) manner according
|
||||
// to a simple ZZ error estimator.
|
||||
//
|
||||
// The example demonstrates MFEM's capability to work with both
|
||||
@@ -88,7 +88,7 @@ int main(int argc, char *argv[])
|
||||
args.PrintOptions(cout);
|
||||
}
|
||||
// 2b. We initialize PETSc
|
||||
if (use_petsc) { PetscInitialize(NULL,NULL,petscrc_file,NULL); }
|
||||
if (use_petsc) { MFEMInitializePetsc(NULL,NULL,petscrc_file,NULL); }
|
||||
|
||||
// 3. Read the (serial) mesh from the given mesh file on all processors. We
|
||||
// can handle triangular, quadrilateral, tetrahedral, hexahedral, surface
|
||||
@@ -315,7 +315,7 @@ int main(int argc, char *argv[])
|
||||
}
|
||||
|
||||
// We finalize PETSc
|
||||
if (use_petsc) { PetscFinalize(); }
|
||||
if (use_petsc) { MFEMFinalizePetsc(); }
|
||||
|
||||
MPI_Finalize();
|
||||
return 0;
|
||||
|
||||
@@ -248,7 +248,7 @@ int main(int argc, char *argv[])
|
||||
{
|
||||
// When using PETSc, we just create the ODE solver. We use command line
|
||||
// customization to select a specific solver.
|
||||
PetscInitialize(NULL, NULL, petscrc_file, NULL);
|
||||
MFEMInitializePetsc(NULL, NULL, petscrc_file, NULL);
|
||||
ode_solver = pode_solver = new PetscODESolver(MPI_COMM_WORLD);
|
||||
}
|
||||
|
||||
@@ -481,7 +481,7 @@ int main(int argc, char *argv[])
|
||||
delete pmon;
|
||||
|
||||
// We finalize PETSc
|
||||
if (use_petsc) { PetscFinalize(); }
|
||||
if (use_petsc) { MFEMFinalizePetsc(); }
|
||||
|
||||
MPI_Finalize();
|
||||
return 0;
|
||||
|
||||
+19
-13
@@ -69,18 +69,21 @@ TESTNAME = Parallel PETSc example
|
||||
|
||||
|
||||
# Testing PETSc execution options.
|
||||
EX1_ARGS_W := -m ../../data/amr-quad.mesh --usepetsc
|
||||
EX1_ARGS_P := -m ../../data/amr-quad.mesh --usepetsc --petscopts rc_ex1p
|
||||
EX2_ARGS := -m ../../data/beam-quad.mesh --usepetsc --petscopts rc_ex2p
|
||||
EX3_ARGS := -m ../../data/klein-bottle.mesh -o 2 -f 0.1 --usepetsc --petscopts rc_ex3p_bddc --nonoverlapping
|
||||
EX4_ARGS := -m ../../data/klein-bottle.mesh -o 2 --usepetsc --petscopts rc_ex4p_bddc --nonoverlapping
|
||||
EX5_BDDC_ARGS := -m ../../data/star.mesh --usepetsc -o 0 --petscopts rc_ex5p_bddc --nonoverlapping
|
||||
EX5_FSPL_ARGS := -m ../../data/beam-tet.mesh --usepetsc -o 0 --petscopts rc_ex5p_fieldsplit
|
||||
EX6_ARGS := -m ../../data/amr-quad.mesh --usepetsc
|
||||
EX9_E_ARGS := -m ../../data/periodic-hexagon.mesh --usepetsc --petscopts rc_ex9p_expl -dt 0.1
|
||||
EX9_ES_ARGS := -m ../../data/periodic-hexagon.mesh --usepetsc --petscopts rc_ex9p_expl --no-step
|
||||
EX9_IS_ARGS := -m ../../data/periodic-hexagon.mesh --usepetsc --petscopts rc_ex9p_impl --implicit -tf 0.5
|
||||
EX10_ARGS := -m ../../data/beam-quad.mesh --usepetsc --petscopts rc_ex10p -tf 30 -s 3 -rs 2 -dt 3
|
||||
EX1_ARGS_W := -m ../../data/amr-quad.mesh --usepetsc
|
||||
EX1_ARGS_P := -m ../../data/amr-quad.mesh --usepetsc --petscopts rc_ex1p
|
||||
EX2_ARGS := -m ../../data/beam-quad.mesh --usepetsc --petscopts rc_ex2p
|
||||
EX3_ARGS := -m ../../data/klein-bottle.mesh -o 2 -f 0.1 --usepetsc --petscopts rc_ex3p_bddc --nonoverlapping
|
||||
EX4_ARGS := -m ../../data/klein-bottle.mesh -o 2 --usepetsc --petscopts rc_ex4p_bddc --nonoverlapping
|
||||
EX4_HYB_ARGS := -m ../../data/klein-bottle.mesh -o 2 --usepetsc --petscopts rc_ex4p_bddc --nonoverlapping --hybridization
|
||||
EX5_BDDC_LB_ARGS := -m ../../data/star.mesh --usepetsc -o 0 --petscopts rc_ex5p_bddc --nonoverlapping --local-bdr
|
||||
EX5_BDDC_GB_ARGS := -m ../../data/star.mesh --usepetsc -o 0 --petscopts rc_ex5p_bddc --nonoverlapping
|
||||
EX5_FSPL_ARGS := -m ../../data/beam-tet.mesh --usepetsc -o 0 --petscopts rc_ex5p_fieldsplit
|
||||
EX6_ARGS := -m ../../data/amr-quad.mesh --usepetsc
|
||||
EX6_NONOVL_ARGS := -m ../../data/amr-quad.mesh --usepetsc --nonoverlapping
|
||||
EX9_E_ARGS := -m ../../data/periodic-hexagon.mesh --usepetsc --petscopts rc_ex9p_expl -dt 0.1
|
||||
EX9_ES_ARGS := -m ../../data/periodic-hexagon.mesh --usepetsc --petscopts rc_ex9p_expl --no-step
|
||||
EX9_IS_ARGS := -m ../../data/periodic-hexagon.mesh --usepetsc --petscopts rc_ex9p_impl --implicit -tf 0.5
|
||||
EX10_ARGS := -m ../../data/beam-quad.mesh --usepetsc --petscopts rc_ex10p -tf 30 -s 3 -rs 2 -dt 3
|
||||
ex1p-test-par: ex1p
|
||||
@$(call mfem-test,$<, $(RUN_MPI), $(TESTNAME),$(EX1_ARGS_W))
|
||||
@$(call mfem-test,$<, $(RUN_MPI), $(TESTNAME),$(EX1_ARGS_P))
|
||||
@@ -90,11 +93,14 @@ ex3p-test-par: ex3p
|
||||
@$(call mfem-test,$<, $(RUN_MPI), $(TESTNAME),$(EX3_ARGS))
|
||||
ex4p-test-par: ex4p
|
||||
@$(call mfem-test,$<, $(RUN_MPI), $(TESTNAME),$(EX4_ARGS))
|
||||
@$(call mfem-test,$<, $(RUN_MPI), $(TESTNAME),$(EX4_HYB_ARGS))
|
||||
ex5p-test-par: ex5p
|
||||
@$(call mfem-test,$<, $(RUN_MPI), $(TESTNAME),$(EX5_BDDC_ARGS))
|
||||
@$(call mfem-test,$<, $(RUN_MPI), $(TESTNAME),$(EX5_BDDC_LB_ARGS))
|
||||
@$(call mfem-test,$<, $(RUN_MPI), $(TESTNAME),$(EX5_BDDC_GB_ARGS))
|
||||
@$(call mfem-test,$<, $(RUN_MPI), $(TESTNAME),$(EX5_FSPL_ARGS))
|
||||
ex6p-test-par: ex6p
|
||||
@$(call mfem-test,$<, $(RUN_MPI), $(TESTNAME),$(EX6_ARGS))
|
||||
@$(call mfem-test,$<, $(RUN_MPI), $(TESTNAME),$(EX6_NONOVL_ARGS))
|
||||
ex9p-test-par: ex9p
|
||||
@$(call mfem-test,$<, $(RUN_MPI), $(TESTNAME),$(EX9_E_ARGS))
|
||||
@$(call mfem-test,$<, $(RUN_MPI), $(TESTNAME),$(EX9_ES_ARGS))
|
||||
|
||||
@@ -6,4 +6,7 @@
|
||||
# it needs PETSc configured with MUMPS
|
||||
|
||||
-solver_pc_type cholesky
|
||||
# Petsc 3.9
|
||||
-solver_pc_factor_mat_solver_type mumps
|
||||
# Older versions of PETSc
|
||||
-solver_pc_factor_mat_solver_package mumps
|
||||
|
||||
@@ -16,7 +16,10 @@
|
||||
#-pc_bddc_adaptive_threshold 10
|
||||
|
||||
# Customization of the local solvers
|
||||
#-pc_bddc_neumann_pc_factor_mat_solver_package mumps
|
||||
#-pc_bddc_dirichlet_pc_factor_mat_solver_package mumps
|
||||
# With PETSc versions older than 3.9
|
||||
# use "mat_solver_package" instead of "mat_solver_type"
|
||||
#
|
||||
#-pc_bddc_neumann_pc_factor_mat_solver_type mumps
|
||||
#-pc_bddc_dirichlet_pc_factor_mat_solver_type mumps
|
||||
#-pc_bddc_coarse_pc_type cholesky
|
||||
#-pc_bddc_coarse_pc_factor_mat_solver_package mumps
|
||||
#-pc_bddc_coarse_pc_factor_mat_solver_type mumps
|
||||
|
||||
@@ -2,4 +2,7 @@
|
||||
# it needs PETSc configured with MUMPS
|
||||
|
||||
-solver_pc_type cholesky
|
||||
# Petsc 3.9
|
||||
-solver_pc_factor_mat_solver_type mumps
|
||||
# Older versions of PETSc
|
||||
-solver_pc_factor_mat_solver_package mumps
|
||||
|
||||
@@ -13,7 +13,10 @@
|
||||
#-pc_bddc_adaptive_threshold 10
|
||||
|
||||
# Customization of the local solvers
|
||||
#-pc_bddc_neumann_pc_factor_mat_solver_package mumps
|
||||
#-pc_bddc_dirichlet_pc_factor_mat_solver_package mumps
|
||||
# With PETSc versions older than 3.9
|
||||
# use "mat_solver_package" instead of "mat_solver_type"
|
||||
#
|
||||
#-pc_bddc_neumann_pc_factor_mat_solver_type mumps
|
||||
#-pc_bddc_dirichlet_pc_factor_mat_solver_type mumps
|
||||
#-pc_bddc_coarse_pc_type cholesky
|
||||
#-pc_bddc_coarse_pc_factor_mat_solver_package mumps
|
||||
#-pc_bddc_coarse_pc_factor_mat_solver_type mumps
|
||||
|
||||
@@ -25,15 +25,29 @@
|
||||
# verbose output
|
||||
#-prec_pc_bddc_check_level 1
|
||||
|
||||
# local solvers (needs PETSc compiled with support for SuiteSparse)
|
||||
# default solvers will fail
|
||||
# local solvers (default "petsc" solvers will fail)
|
||||
# needs PETSc compiled with support for MUMPS or SuiteSparse
|
||||
# use "umfpack" in place of "mumps" if you want to use
|
||||
# SuiteSparse solvers
|
||||
#
|
||||
# With PETSc versions older than 3.9
|
||||
# use "mat_solver_package" instead of "mat_solver_type"
|
||||
#
|
||||
-prec_pc_bddc_neumann_pc_type lu
|
||||
-prec_pc_bddc_neumann_pc_factor_mat_solver_package umfpack
|
||||
-prec_pc_bddc_neumann_pc_factor_mat_solver_type mumps
|
||||
-prec_pc_bddc_neumann_pc_factor_mat_solver_package mumps
|
||||
-prec_pc_bddc_dirichlet_pc_type lu
|
||||
-prec_pc_bddc_dirichlet_pc_factor_mat_solver_package umfpack
|
||||
-prec_pc_bddc_dirichlet_pc_factor_mat_solver_type mumps
|
||||
-prec_pc_bddc_dirichlet_pc_factor_mat_solver_package mumps
|
||||
|
||||
# MUMPS sometimes fails with a very annoying error
|
||||
-mat_mumps_icntl_14 500
|
||||
-prec_pc_bddc_dirichlet_mat_mumps_icntl_14 500
|
||||
-prec_pc_bddc_neumann_mat_mumps_icntl_14 500
|
||||
|
||||
# coarse solver (needs PETSc compiled with support for MUMPS)
|
||||
# default solver may fail
|
||||
-prec_pc_bddc_coarse_pc_factor_mat_solver_type mumps
|
||||
-prec_pc_bddc_coarse_pc_factor_mat_solver_package mumps
|
||||
-prec_pc_bddc_coarse_pc_type cholesky
|
||||
|
||||
|
||||
@@ -0,0 +1,73 @@
|
||||
# Copyright (c) 2010, Lawrence Livermore National Security, LLC. Produced at the
|
||||
# Lawrence Livermore National Laboratory. LLNL-CODE-443211. All Rights reserved.
|
||||
# See file COPYRIGHT for details.
|
||||
#
|
||||
# This file is part of the MFEM library. For more information and source code
|
||||
# availability see http://mfem.org.
|
||||
#
|
||||
# MFEM is free software; you can redistribute it and/or modify it under the
|
||||
# terms of the GNU Lesser General Public License (as published by the Free
|
||||
# Software Foundation) version 2.1 dated February 1999.
|
||||
|
||||
set(PUMI_EXAMPLES_SRCS)
|
||||
# All PUMI examples require MPI
|
||||
if (MFEM_USE_MPI)
|
||||
list(APPEND PUMI_EXAMPLES_SRCS
|
||||
ex1.cpp
|
||||
ex1p.cpp
|
||||
ex2.cpp
|
||||
ex6p.cpp
|
||||
)
|
||||
endif()
|
||||
|
||||
# Include the source directory where mfem.hpp and mfem-performance.hpp are.
|
||||
include_directories(BEFORE ${PROJECT_BINARY_DIR})
|
||||
|
||||
# Add "test_pumi" target, see below.
|
||||
add_custom_target(test_pumi
|
||||
${CMAKE_CTEST_COMMAND} -R pumi USES_TERMINAL)
|
||||
|
||||
# Add one executable per cpp file, adding "pumi_" as prefix. Sets
|
||||
# "test_pumi" as a target that depends on the given examples.
|
||||
set(PFX pumi_)
|
||||
add_mfem_examples(PUMI_EXAMPLES_SRCS ${PFX} "" test_pumi)
|
||||
|
||||
# Testing.
|
||||
# The PUMI tests can be run separately using the target "test_pumi"
|
||||
# which builds the examples and runs:
|
||||
# ctest -R pumi
|
||||
|
||||
# Command line options for the tests.
|
||||
# TODO...
|
||||
|
||||
# Set the number of processors for the parallel examples. The value of
|
||||
# MFEM_MPI_NP is ignored.
|
||||
set(EX1_TEST_NP 1)
|
||||
set(EX1P_TEST_NP 8)
|
||||
set(EX2_TEST_NP 1)
|
||||
set(EX6P_TEST_NP 8)
|
||||
|
||||
# Add the tests: one test per source file.
|
||||
foreach(SRC_FILE ${PUMI_EXAMPLES_SRCS})
|
||||
get_filename_component(SRC_FILENAME ${SRC_FILE} NAME)
|
||||
string(REPLACE ".cpp" "" TEST_NAME ${SRC_FILENAME})
|
||||
string(TOUPPER ${TEST_NAME} UP_TEST_NAME)
|
||||
set(TEST_NAME ${PFX}${TEST_NAME})
|
||||
|
||||
set(THIS_TEST_OPTIONS "-no-vis")
|
||||
list(APPEND THIS_TEST_OPTIONS ${${UP_TEST_NAME}_TEST_OPTS})
|
||||
# message(STATUS "Test ${TEST_NAME} options: ${THIS_TEST_OPTIONS}")
|
||||
|
||||
# All PUMI examples require MPI
|
||||
if (FALSE)
|
||||
add_test(NAME ${TEST_NAME}_ser
|
||||
COMMAND ${TEST_NAME} ${THIS_TEST_OPTIONS})
|
||||
else()
|
||||
set(TEST_NP ${${UP_TEST_NAME}_TEST_NP})
|
||||
add_test(NAME ${TEST_NAME}_np=${TEST_NP}
|
||||
COMMAND ${MPIEXEC} ${MPIEXEC_NUMPROC_FLAG} ${TEST_NP}
|
||||
${MPIEXEC_PREFLAGS}
|
||||
$<TARGET_FILE:${TEST_NAME}> ${THIS_TEST_OPTIONS}
|
||||
${MPIEXEC_POSTFLAGS})
|
||||
endif()
|
||||
endforeach()
|
||||
@@ -0,0 +1,18 @@
|
||||
Finite Element Discretization Library
|
||||
__
|
||||
_ __ ___ / _| ___ _ __ ___
|
||||
| '_ ` _ \ | |_ / _ \| '_ ` _ \
|
||||
| | | | | || _|| __/| | | | | |
|
||||
|_| |_| |_||_| \___||_| |_| |_|
|
||||
|
||||
http://mfem.org
|
||||
|
||||
This directory contains modifications of the example codes that illustrate the
|
||||
use of MFEM features based on the Parallel Unstructured Mesh Infrastructure,
|
||||
PUMI, from https://scorec.rpi.edu/pumi.
|
||||
|
||||
To build these examples, make sure that MFEM is configured with the option
|
||||
"MFEM_USE_PUMI = YES", see the top-level INSTALL file for details.
|
||||
|
||||
We recommend comparing the original example codes with the corresponding files
|
||||
in the current directory.
|
||||
@@ -0,0 +1,262 @@
|
||||
// MFEM Example 1
|
||||
// PUMI Modification
|
||||
//
|
||||
// Compile with: make ex1
|
||||
//
|
||||
// Sample runs:
|
||||
// ex1 -m ../../data/pumi/serial/Kova.smb -p ../../data/pumi/geom/Kova.dmg
|
||||
//
|
||||
// Note: Example models + meshes for the PUMI examples can be downloaded
|
||||
// from github.com/mfem/data/pumi. After downloading we recommend
|
||||
// creating a symbolic link to the above directory in ../../data.
|
||||
//
|
||||
// Description: This example code demonstrates the use of MFEM to define a
|
||||
// simple finite element discretization of the Laplace problem
|
||||
// -Delta u = 1 with homogeneous Dirichlet boundary conditions.
|
||||
// Specifically, we discretize using a FE space of the specified
|
||||
// order, or if order < 1 using an isoparametric/isogeometric
|
||||
// space (i.e. quadratic for quadratic curvilinear mesh, NURBS for
|
||||
// NURBS mesh, etc.)
|
||||
//
|
||||
// The example highlights the use of mesh refinement, finite
|
||||
// element grid functions, as well as linear and bilinear forms
|
||||
// corresponding to the left-hand side and right-hand side of the
|
||||
// discrete linear system. We also cover the explicit elimination
|
||||
// of essential boundary conditions, static condensation, and the
|
||||
// optional connection to the GLVis tool for visualization.
|
||||
//
|
||||
// This PUMI modification demonstrates how PUMI's API can be used
|
||||
// to load a PUMI mesh classified on a geometric model and then
|
||||
// convert it to the MFEM mesh format. The inputs are a Parasolid
|
||||
// model, "*.xmt_txt" and a SCOREC mesh "*.smb". The option "-o"
|
||||
// is used for the Finite Element order and "-go" is used for the
|
||||
// geometry order. Note that they can be used independently, i.e.
|
||||
// "-o 8 -go 3" solves for 8th order FE on a third order geometry.
|
||||
|
||||
#include "mfem.hpp"
|
||||
#include <fstream>
|
||||
#include <iostream>
|
||||
|
||||
#ifdef MFEM_USE_SIMMETRIX
|
||||
#include <SimUtil.h>
|
||||
#include <gmi_sim.h>
|
||||
#endif
|
||||
#include <apfMDS.h>
|
||||
#include <gmi_null.h>
|
||||
#include <PCU.h>
|
||||
#include <apfConvert.h>
|
||||
#include <gmi_mesh.h>
|
||||
#include <crv.h>
|
||||
|
||||
using namespace std;
|
||||
using namespace mfem;
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
// 1. Initialize MPI (required by PUMI).
|
||||
int num_procs, myid;
|
||||
MPI_Init(&argc, &argv);
|
||||
MPI_Comm_size(MPI_COMM_WORLD, &num_procs);
|
||||
MPI_Comm_rank(MPI_COMM_WORLD, &myid);
|
||||
|
||||
// 2. Parse command-line options.
|
||||
const char *mesh_file = "../../data/pumi/serial/Kova.smb";
|
||||
#ifdef MFEM_USE_SIMMETRIX
|
||||
const char *model_file = "../../data/pumi/geom/Kova.x_t";
|
||||
#else
|
||||
const char *model_file = "../../data/pumi/geom/Kova.dmg";
|
||||
#endif
|
||||
int order = 1;
|
||||
bool static_cond = false;
|
||||
bool visualization = 1;
|
||||
int geom_order = 1;
|
||||
|
||||
OptionsParser args(argc, argv);
|
||||
args.AddOption(&mesh_file, "-m", "--mesh",
|
||||
"Mesh file to use.");
|
||||
args.AddOption(&order, "-o", "--order",
|
||||
"Finite element order (polynomial degree) or -1 for"
|
||||
" isoparametric space.");
|
||||
args.AddOption(&static_cond, "-sc", "--static-condensation", "-no-sc",
|
||||
"--no-static-condensation", "Enable static condensation.");
|
||||
args.AddOption(&visualization, "-vis", "--visualization", "-no-vis",
|
||||
"--no-visualization",
|
||||
"Enable or disable GLVis visualization.");
|
||||
args.AddOption(&model_file, "-p", "--parasolid",
|
||||
"Parasolid model to use.");
|
||||
args.AddOption(&geom_order, "-go", "--geometry_order",
|
||||
"Geometric order of the model");
|
||||
args.Parse();
|
||||
if (!args.Good())
|
||||
{
|
||||
if (myid == 0)
|
||||
{
|
||||
args.PrintUsage(cout);
|
||||
}
|
||||
MPI_Finalize();
|
||||
return 1;
|
||||
}
|
||||
if (myid == 0)
|
||||
{
|
||||
args.PrintOptions(cout);
|
||||
}
|
||||
|
||||
// 3. Read the SCOREC Mesh.
|
||||
PCU_Comm_Init();
|
||||
#ifdef MFEM_USE_SIMMETRIX
|
||||
Sim_readLicenseFile(0);
|
||||
gmi_sim_start();
|
||||
gmi_register_sim();
|
||||
#endif
|
||||
gmi_register_mesh();
|
||||
|
||||
apf::Mesh2* pumi_mesh;
|
||||
pumi_mesh = apf::loadMdsMesh(model_file, mesh_file);
|
||||
|
||||
// 4. Increase the geometry order if necessary.
|
||||
if (geom_order > 1)
|
||||
{
|
||||
crv::BezierCurver bc(pumi_mesh, geom_order, 2);
|
||||
bc.run();
|
||||
}
|
||||
|
||||
pumi_mesh->verify();
|
||||
|
||||
// 5. Create the MFEM mesh object from the PUMI mesh. We can handle
|
||||
// triangular and tetrahedral meshes. Other inputs are the same as the
|
||||
// MFEM default constructor.
|
||||
Mesh *mesh = new PumiMesh(pumi_mesh, 1, 1);
|
||||
int dim = mesh->Dimension();
|
||||
|
||||
// 6. Refine the mesh to increase the resolution. In this example we do
|
||||
// 'ref_levels' of uniform refinement. We choose 'ref_levels' to be the
|
||||
// largest number that gives a final mesh with no more than 50,000
|
||||
// elements.
|
||||
{
|
||||
int ref_levels =
|
||||
(int)floor(log(50000./mesh->GetNE())/log(2.)/dim);
|
||||
for (int l = 0; l < ref_levels; l++)
|
||||
{
|
||||
mesh->UniformRefinement();
|
||||
}
|
||||
}
|
||||
|
||||
// 7. Define a finite element space on the mesh. Here we use continuous
|
||||
// Lagrange finite elements of the specified order. If order < 1, we
|
||||
// instead use an isoparametric/isogeometric space.
|
||||
FiniteElementCollection *fec;
|
||||
if (order > 0)
|
||||
{
|
||||
fec = new H1_FECollection(order, dim);
|
||||
}
|
||||
else if (mesh->GetNodes())
|
||||
{
|
||||
fec = mesh->GetNodes()->OwnFEC();
|
||||
cout << "Using isoparametric FEs: " << fec->Name() << endl;
|
||||
}
|
||||
else
|
||||
{
|
||||
fec = new H1_FECollection(order = 1, dim);
|
||||
}
|
||||
FiniteElementSpace *fespace = new FiniteElementSpace(mesh, fec);
|
||||
cout << "Number of finite element unknowns: "
|
||||
<< fespace->GetTrueVSize() << endl;
|
||||
|
||||
// 8. Determine the list of true (i.e. conforming) essential boundary dofs.
|
||||
// In this example, the boundary conditions are defined by marking all
|
||||
// the boundary attributes from the mesh as essential (Dirichlet) and
|
||||
// converting them to a list of true dofs.
|
||||
Array<int> ess_tdof_list;
|
||||
if (mesh->bdr_attributes.Size())
|
||||
{
|
||||
Array<int> ess_bdr(mesh->bdr_attributes.Max());
|
||||
ess_bdr = 1;
|
||||
fespace->GetEssentialTrueDofs(ess_bdr, ess_tdof_list);
|
||||
}
|
||||
|
||||
// 9. Set up the linear form b(.) which corresponds to the right-hand side of
|
||||
// the FEM linear system, which in this case is (1,phi_i) where phi_i are
|
||||
// the basis functions in the finite element fespace.
|
||||
LinearForm *b = new LinearForm(fespace);
|
||||
ConstantCoefficient one(1.0);
|
||||
b->AddDomainIntegrator(new DomainLFIntegrator(one));
|
||||
b->Assemble();
|
||||
|
||||
// 10. Define the solution vector x as a finite element grid function
|
||||
// corresponding to fespace. Initialize x with initial guess of zero,
|
||||
// which satisfies the boundary conditions.
|
||||
GridFunction x(fespace);
|
||||
x = 0.0;
|
||||
|
||||
// 11. Set up the bilinear form a(.,.) on the finite element space
|
||||
// corresponding to the Laplacian operator -Delta, by adding the
|
||||
// Diffusion domain integrator.
|
||||
BilinearForm *a = new BilinearForm(fespace);
|
||||
a->AddDomainIntegrator(new DiffusionIntegrator(one));
|
||||
|
||||
// 12. Assemble the bilinear form and the corresponding linear system,
|
||||
// applying any necessary transformations such as: eliminating boundary
|
||||
// conditions, applying conforming constraints for non-conforming AMR,
|
||||
// static condensation, etc.
|
||||
if (static_cond) { a->EnableStaticCondensation(); }
|
||||
a->Assemble();
|
||||
|
||||
SparseMatrix A;
|
||||
Vector B, X;
|
||||
a->FormLinearSystem(ess_tdof_list, x, *b, A, X, B);
|
||||
|
||||
cout << "Size of linear system: " << A.Height() << endl;
|
||||
|
||||
#ifndef MFEM_USE_SUITESPARSE
|
||||
// 13. Define a simple symmetric Gauss-Seidel preconditioner and use it to
|
||||
// solve the system A X = B with PCG.
|
||||
GSSmoother M(A);
|
||||
PCG(A, M, B, X, 1, 200, 1e-12, 0.0);
|
||||
#else
|
||||
// 13. If MFEM was compiled with SuiteSparse, use UMFPACK to solve the system.
|
||||
UMFPackSolver umf_solver;
|
||||
umf_solver.Control[UMFPACK_ORDERING] = UMFPACK_ORDERING_METIS;
|
||||
umf_solver.SetOperator(A);
|
||||
umf_solver.Mult(B, X);
|
||||
#endif
|
||||
|
||||
// 14. Recover the solution as a finite element grid function.
|
||||
a->RecoverFEMSolution(X, *b, x);
|
||||
|
||||
// 15. Save the refined mesh and the solution. This output can be viewed later
|
||||
// using GLVis: "glvis -m refined.mesh -g sol.gf".
|
||||
ofstream mesh_ofs("refined.mesh");
|
||||
mesh_ofs.precision(8);
|
||||
mesh->Print(mesh_ofs);
|
||||
ofstream sol_ofs("sol.gf");
|
||||
sol_ofs.precision(8);
|
||||
x.Save(sol_ofs);
|
||||
|
||||
// 16. Send the solution by socket to a GLVis server.
|
||||
if (visualization)
|
||||
{
|
||||
char vishost[] = "localhost";
|
||||
int visport = 19916;
|
||||
socketstream sol_sock(vishost, visport);
|
||||
sol_sock.precision(8);
|
||||
sol_sock << "solution\n" << *mesh << x << flush;
|
||||
}
|
||||
|
||||
// 17. Free the used memory.
|
||||
delete a;
|
||||
delete b;
|
||||
delete fespace;
|
||||
if (order > 0) { delete fec; }
|
||||
delete mesh;
|
||||
|
||||
pumi_mesh->destroyNative();
|
||||
apf::destroyMesh(pumi_mesh);
|
||||
PCU_Comm_Free();
|
||||
#ifdef MFEM_USE_SIMMETRIX
|
||||
gmi_sim_stop();
|
||||
Sim_unregisterAllKeys();
|
||||
#endif
|
||||
|
||||
MPI_Finalize();
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,292 @@
|
||||
// MFEM Example 1 - Parallel Version
|
||||
// PUMI Modification
|
||||
//
|
||||
// Compile with: make ex1p
|
||||
//
|
||||
// Sample runs:
|
||||
// mpirun -np 8 ex1p -m ../../data/pumi/parallel/Kova/Kova100k_8.smb
|
||||
// -p ../../data/pumi/geom/Kova.dmg -o 1 -go 2
|
||||
//
|
||||
// Note: Example models + meshes for the PUMI examples can be downloaded
|
||||
// from github.com/mfem/data/pumi. After downloading we recommend
|
||||
// creating a symbolic link to the above directory in ../../data.
|
||||
//
|
||||
// Description: This example code demonstrates the use of MFEM to define a
|
||||
// simple finite element discretization of the Laplace problem
|
||||
// -Delta u = 1 with homogeneous Dirichlet boundary conditions.
|
||||
// Specifically, we discretize using a FE space of the specified
|
||||
// order, or if order < 1 using an isoparametric/isogeometric
|
||||
// space (i.e. quadratic for quadratic curvilinear mesh, NURBS for
|
||||
// NURBS mesh, etc.)
|
||||
//
|
||||
// The example highlights the use of mesh refinement, finite
|
||||
// element grid functions, as well as linear and bilinear forms
|
||||
// corresponding to the left-hand side and right-hand side of the
|
||||
// discrete linear system. We also cover the explicit elimination
|
||||
// of essential boundary conditions, static condensation, and the
|
||||
// optional connection to the GLVis tool for visualization.
|
||||
//
|
||||
// This PUMI modification demonstrates how PUMI's API can be used
|
||||
// to load a parallel PUMI mesh classified on a geometric model
|
||||
// and then generate the corresponding parallel MFEM mesh. The
|
||||
// example also performs a "uniform" refinement, similar to the
|
||||
// MFEM examples, for coarse meshes. However, the refinement is
|
||||
// performed using the PUMI API. The inputs are a Parasolid
|
||||
// model, "*.xmt_txt" and SCOREC parallel meshes "*.smb". The
|
||||
// option "-o" is used for the Finite Element order and "-go" for
|
||||
// the geometry order. Note that they can be used independently:
|
||||
// "-o 8 -go 3" solves for 8th order FE on third order geometry.
|
||||
|
||||
#include "mfem.hpp"
|
||||
#include <fstream>
|
||||
#include <iostream>
|
||||
|
||||
#ifdef MFEM_USE_SIMMETRIX
|
||||
#include <SimUtil.h>
|
||||
#include <gmi_sim.h>
|
||||
#endif
|
||||
#include <apfMDS.h>
|
||||
#include <gmi_null.h>
|
||||
#include <PCU.h>
|
||||
#include <apfConvert.h>
|
||||
#include <gmi_mesh.h>
|
||||
#include <crv.h>
|
||||
|
||||
using namespace std;
|
||||
using namespace mfem;
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
// 1. Initialize MPI.
|
||||
int num_procs, myid;
|
||||
MPI_Init(&argc, &argv);
|
||||
MPI_Comm_size(MPI_COMM_WORLD, &num_procs);
|
||||
MPI_Comm_rank(MPI_COMM_WORLD, &myid);
|
||||
|
||||
// 2. Parse command-line options.
|
||||
const char *mesh_file = "../../data/pumi/parallel/Kova/Kova100k_8.smb";
|
||||
#ifdef MFEM_USE_SIMMETRIX
|
||||
const char *model_file = "../../data/pumi/geom/Kova.x_t";
|
||||
#else
|
||||
const char *model_file = "../../data/pumi/geom/Kova.dmg";
|
||||
#endif
|
||||
int order = 1;
|
||||
bool static_cond = false;
|
||||
bool visualization = 1;
|
||||
int geom_order = 1;
|
||||
|
||||
OptionsParser args(argc, argv);
|
||||
args.AddOption(&mesh_file, "-m", "--mesh",
|
||||
"Mesh file to use.");
|
||||
args.AddOption(&order, "-o", "--order",
|
||||
"Finite element order (polynomial degree) or -1 for"
|
||||
" isoparametric space.");
|
||||
args.AddOption(&static_cond, "-sc", "--static-condensation", "-no-sc",
|
||||
"--no-static-condensation", "Enable static condensation.");
|
||||
args.AddOption(&visualization, "-vis", "--visualization", "-no-vis",
|
||||
"--no-visualization",
|
||||
"Enable or disable GLVis visualization.");
|
||||
args.AddOption(&model_file, "-p", "--parasolid",
|
||||
"Parasolid model to use.");
|
||||
args.AddOption(&geom_order, "-go", "--geometry_order",
|
||||
"Geometric order of the model");
|
||||
args.Parse();
|
||||
if (!args.Good())
|
||||
{
|
||||
if (myid == 0)
|
||||
{
|
||||
args.PrintUsage(cout);
|
||||
}
|
||||
MPI_Finalize();
|
||||
return 1;
|
||||
}
|
||||
if (myid == 0)
|
||||
{
|
||||
args.PrintOptions(cout);
|
||||
}
|
||||
|
||||
// 3. Read the SCOREC Mesh
|
||||
PCU_Comm_Init();
|
||||
#ifdef MFEM_USE_SIMMETRIX
|
||||
Sim_readLicenseFile(0);
|
||||
gmi_sim_start();
|
||||
gmi_register_sim();
|
||||
#endif
|
||||
gmi_register_mesh();
|
||||
|
||||
apf::Mesh2* pumi_mesh;
|
||||
pumi_mesh = apf::loadMdsMesh(model_file, mesh_file);
|
||||
|
||||
// 4. Increase the geometry order and refine the mesh if necessary. Parallel
|
||||
// uniform refinement is performed if the total number of elements is less
|
||||
// than 10,000.
|
||||
int dim = pumi_mesh->getDimension();
|
||||
int nEle = pumi_mesh->count(dim);
|
||||
int ref_levels = (int)floor(log(10000./nEle)/log(2.)/dim);
|
||||
|
||||
if (geom_order > 1)
|
||||
{
|
||||
crv::BezierCurver bc(pumi_mesh, geom_order, 2);
|
||||
bc.run();
|
||||
}
|
||||
|
||||
// Perform Uniform refinement
|
||||
if (ref_levels > 1)
|
||||
{
|
||||
ma::Input* uniInput = ma::configureUniformRefine(pumi_mesh, ref_levels);
|
||||
|
||||
if (geom_order > 1)
|
||||
{
|
||||
crv::adapt(uniInput);
|
||||
}
|
||||
else
|
||||
{
|
||||
ma::adapt(uniInput);
|
||||
}
|
||||
}
|
||||
|
||||
pumi_mesh->verify();
|
||||
|
||||
// 5. Create the parallel MFEM mesh object from the parallel PUMI mesh.
|
||||
// We can handle triangular and tetrahedral meshes. Note that the
|
||||
// mesh resolution is performed on the PUMI mesh.
|
||||
ParMesh *pmesh = new ParPumiMesh(MPI_COMM_WORLD, pumi_mesh);
|
||||
|
||||
// 6. Define a parallel finite element space on the parallel mesh. Here we
|
||||
// use continuous Lagrange finite elements of the specified order. If
|
||||
// order < 1, we instead use an isoparametric/isogeometric space.
|
||||
FiniteElementCollection *fec;
|
||||
if (order > 0)
|
||||
{
|
||||
fec = new H1_FECollection(order, dim);
|
||||
}
|
||||
else if (pmesh->GetNodes())
|
||||
{
|
||||
fec = pmesh->GetNodes()->OwnFEC();
|
||||
if (myid == 0)
|
||||
{
|
||||
cout << "Using isoparametric FEs: " << fec->Name() << endl;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
fec = new H1_FECollection(order = 1, dim);
|
||||
}
|
||||
ParFiniteElementSpace *fespace = new ParFiniteElementSpace(pmesh, fec);
|
||||
HYPRE_Int size = fespace->GlobalTrueVSize();
|
||||
if (myid == 0)
|
||||
{
|
||||
cout << "Number of finite element unknowns: " << size << endl;
|
||||
}
|
||||
|
||||
// 7. Determine the list of true (i.e. parallel conforming) essential
|
||||
// boundary dofs. In this example, the boundary conditions are defined
|
||||
// by marking all the boundary attributes from the mesh as essential
|
||||
// (Dirichlet) and converting them to a list of true dofs.
|
||||
Array<int> ess_tdof_list;
|
||||
if (pmesh->bdr_attributes.Size())
|
||||
{
|
||||
Array<int> ess_bdr(pmesh->bdr_attributes.Max());
|
||||
ess_bdr = 1;
|
||||
fespace->GetEssentialTrueDofs(ess_bdr, ess_tdof_list);
|
||||
}
|
||||
|
||||
// 8. Set up the parallel linear form b(.) which corresponds to the
|
||||
// right-hand side of the FEM linear system, which in this case is
|
||||
// (1,phi_i) where phi_i are the basis functions in fespace.
|
||||
ParLinearForm *b = new ParLinearForm(fespace);
|
||||
ConstantCoefficient one(1.0);
|
||||
b->AddDomainIntegrator(new DomainLFIntegrator(one));
|
||||
b->Assemble();
|
||||
|
||||
// 9. Define the solution vector x as a parallel finite element grid function
|
||||
// corresponding to fespace. Initialize x with initial guess of zero,
|
||||
// which satisfies the boundary conditions.
|
||||
ParGridFunction x(fespace);
|
||||
x = 0.0;
|
||||
|
||||
// 10. Set up the parallel bilinear form a(.,.) on the finite element space
|
||||
// corresponding to the Laplacian operator -Delta, by adding the Diffusion
|
||||
// domain integrator.
|
||||
ParBilinearForm *a = new ParBilinearForm(fespace);
|
||||
a->AddDomainIntegrator(new DiffusionIntegrator(one));
|
||||
|
||||
// 11. Assemble the parallel bilinear form and the corresponding linear
|
||||
// system, applying any necessary transformations such as: parallel
|
||||
// assembly, eliminating boundary conditions, applying conforming
|
||||
// constraints for non-conforming AMR, static condensation, etc.
|
||||
if (static_cond) { a->EnableStaticCondensation(); }
|
||||
a->Assemble();
|
||||
|
||||
HypreParMatrix A;
|
||||
Vector B, X;
|
||||
a->FormLinearSystem(ess_tdof_list, x, *b, A, X, B);
|
||||
|
||||
if (myid == 0)
|
||||
{
|
||||
cout << "Size of linear system: " << A.GetGlobalNumRows() << endl;
|
||||
}
|
||||
|
||||
// 12. Define and apply a parallel PCG solver for AX=B with the BoomerAMG
|
||||
// preconditioner from hypre.
|
||||
HypreSolver *amg = new HypreBoomerAMG(A);
|
||||
HyprePCG *pcg = new HyprePCG(A);
|
||||
pcg->SetTol(1e-12);
|
||||
pcg->SetMaxIter(200);
|
||||
pcg->SetPrintLevel(2);
|
||||
pcg->SetPreconditioner(*amg);
|
||||
pcg->Mult(B, X);
|
||||
|
||||
// 13. Recover the parallel grid function corresponding to X. This is the
|
||||
// local finite element solution on each processor.
|
||||
a->RecoverFEMSolution(X, *b, x);
|
||||
|
||||
// 14. Save the refined mesh and the solution in parallel. This output can
|
||||
// be viewed later using GLVis: "glvis -np <np> -m mesh -g sol".
|
||||
{
|
||||
ostringstream mesh_name, sol_name;
|
||||
mesh_name << "mesh." << setfill('0') << setw(6) << myid;
|
||||
sol_name << "sol." << setfill('0') << setw(6) << myid;
|
||||
|
||||
ofstream mesh_ofs(mesh_name.str().c_str());
|
||||
mesh_ofs.precision(8);
|
||||
pmesh->Print(mesh_ofs);
|
||||
|
||||
ofstream sol_ofs(sol_name.str().c_str());
|
||||
sol_ofs.precision(8);
|
||||
x.Save(sol_ofs);
|
||||
}
|
||||
|
||||
// 15. Send the solution by socket to a GLVis server.
|
||||
if (visualization)
|
||||
{
|
||||
char vishost[] = "localhost";
|
||||
int visport = 19916;
|
||||
socketstream sol_sock(vishost, visport);
|
||||
sol_sock << "parallel " << num_procs << " " << myid << "\n";
|
||||
sol_sock.precision(8);
|
||||
sol_sock << "solution\n" << *pmesh << x << flush;
|
||||
}
|
||||
|
||||
// 16. Free the used memory.
|
||||
delete pcg;
|
||||
delete amg;
|
||||
delete a;
|
||||
delete b;
|
||||
delete fespace;
|
||||
if (order > 0) { delete fec; }
|
||||
delete pmesh;
|
||||
|
||||
pumi_mesh->destroyNative();
|
||||
apf::destroyMesh(pumi_mesh);
|
||||
PCU_Comm_Free();
|
||||
|
||||
#ifdef MFEM_USE_SIMMETRIX
|
||||
gmi_sim_stop();
|
||||
Sim_unregisterAllKeys();
|
||||
#endif
|
||||
|
||||
MPI_Finalize();
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,413 @@
|
||||
// MFEM Example 2
|
||||
// PUMI Modification
|
||||
//
|
||||
// Compile with: make ex2
|
||||
//
|
||||
// Sample runs:
|
||||
// ex2 -m ../../data/pumi/serial/pillbox.smb -p ../../data/pumi/geom/pillbox.dmg
|
||||
// -bf ../../data/pumi/serial/boundary.mesh
|
||||
//
|
||||
// Note: Example models + meshes for the PUMI examples can be downloaded
|
||||
// from github.com/mfem/data/pumi. After downloading we recommend
|
||||
// creating a symbolic link to the above directory in ../../data.
|
||||
//
|
||||
// Description: This example code solves a simple linear elasticity problem
|
||||
// describing a multi-material cantilever beam.
|
||||
//
|
||||
// Specifically, we approximate the weak form of -div(sigma(u))=0
|
||||
// where sigma(u)=lambda*div(u)*I+mu*(grad*u+u*grad) is the stress
|
||||
// tensor corresponding to displacement field u, and lambda and mu
|
||||
// are the material Lame constants. The boundary conditions are
|
||||
// u=0 on the fixed part of the boundary with attribute 1, and
|
||||
// sigma(u).n=f on the remainder with f being a constant pull down
|
||||
// vector on boundary elements with attribute 2, and zero
|
||||
// otherwise. The geometry of the domain is assumed to be as
|
||||
// follows:
|
||||
// boundary
|
||||
// attribute 2
|
||||
// (push down)
|
||||
// ||
|
||||
// \/
|
||||
// +----------+
|
||||
// | |
|
||||
// | |
|
||||
// +---------| material |----------+
|
||||
// boundary --->| material| 2 | material |<--- boundary
|
||||
// attribute 1 | 1 | | 3 | attribute 1
|
||||
// (fixed) +---------+----------+----------+ (fixed)
|
||||
//
|
||||
// The example demonstrates the use of high-order and NURBS vector
|
||||
// finite element spaces with the linear elasticity bilinear form,
|
||||
// meshes with curved elements, and the definition of piece-wise
|
||||
// constant and vector coefficient objects. Static condensation is
|
||||
// also illustrated.
|
||||
//
|
||||
// We recommend viewing Example 1 before viewing this example.
|
||||
|
||||
#include "mfem.hpp"
|
||||
#include <fstream>
|
||||
#include <iostream>
|
||||
|
||||
#include "../../general/text.hpp"
|
||||
|
||||
#ifdef MFEM_USE_SIMMETRIX
|
||||
#include <SimUtil.h>
|
||||
#include <gmi_sim.h>
|
||||
#endif
|
||||
#include <apfMDS.h>
|
||||
#include <gmi_null.h>
|
||||
#include <PCU.h>
|
||||
#include <apfConvert.h>
|
||||
#include <gmi_mesh.h>
|
||||
#include <crv.h>
|
||||
|
||||
using namespace std;
|
||||
using namespace mfem;
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
// 1. Initialize MPI (required by PUMI).
|
||||
int num_proc, myId;
|
||||
MPI_Init(&argc, &argv);
|
||||
MPI_Comm_size(MPI_COMM_WORLD, &num_proc);
|
||||
MPI_Comm_rank(MPI_COMM_WORLD, &myId);
|
||||
|
||||
// 2. Parse command-line options.
|
||||
const char *mesh_file = "../../data/pumi/serial/pillbox.smb";
|
||||
const char *boundary_file = "../../data/pumi/serial/boundary.mesh";
|
||||
#ifdef MFEM_USE_SIMMETRIX
|
||||
const char *model_file = "../../data/pumi/geom/pillbox.smd";
|
||||
#else
|
||||
const char *model_file = "../../data/pumi/geom/pillbox.dmg";
|
||||
#endif
|
||||
int order = 1;
|
||||
bool static_cond = false;
|
||||
bool visualization = 1;
|
||||
int geom_order = 1;
|
||||
|
||||
OptionsParser args(argc, argv);
|
||||
args.AddOption(&mesh_file, "-m", "--mesh",
|
||||
"Mesh file to use.");
|
||||
args.AddOption(&order, "-o", "--order",
|
||||
"Finite element order (polynomial degree).");
|
||||
args.AddOption(&static_cond, "-sc", "--static-condensation", "-no-sc",
|
||||
"--no-static-condensation", "Enable static condensation.");
|
||||
args.AddOption(&visualization, "-vis", "--visualization", "-no-vis",
|
||||
"--no-visualization",
|
||||
"Enable or disable GLVis visualization.");
|
||||
args.AddOption(&model_file, "-p", "--parasolid",
|
||||
"Parasolid model to use.");
|
||||
args.AddOption(&geom_order, "-go", "--geometry_order",
|
||||
"Geometric order of the model");
|
||||
args.AddOption(&boundary_file, "-bf", "--txt",
|
||||
"txt file containing boundary tags");
|
||||
args.Parse();
|
||||
if (!args.Good())
|
||||
{
|
||||
args.PrintUsage(cout);
|
||||
return 1;
|
||||
}
|
||||
args.PrintOptions(cout);
|
||||
|
||||
// 3. Read the SCOREC Mesh.
|
||||
PCU_Comm_Init();
|
||||
#ifdef MFEM_USE_SIMMETRIX
|
||||
Sim_readLicenseFile(0);
|
||||
gmi_sim_start();
|
||||
gmi_register_sim();
|
||||
#endif
|
||||
gmi_register_mesh();
|
||||
|
||||
apf::Mesh2* pumi_mesh;
|
||||
pumi_mesh = apf::loadMdsMesh(model_file, mesh_file);
|
||||
|
||||
// 4. Increase the geometry order if necessary.
|
||||
if (geom_order > 1)
|
||||
{
|
||||
crv::BezierCurver bc(pumi_mesh, geom_order, 0);
|
||||
bc.run();
|
||||
}
|
||||
pumi_mesh->verify();
|
||||
|
||||
// Read boundary
|
||||
string bdr_tags;
|
||||
named_ifgzstream input_bdr(boundary_file);
|
||||
input_bdr >> ws;
|
||||
getline(input_bdr, bdr_tags);
|
||||
filter_dos(bdr_tags);
|
||||
cout << " the boundary tag is : " << bdr_tags << endl;
|
||||
Array<int> Dirichlet;
|
||||
int numOfent;
|
||||
if (bdr_tags == "Dirichlet")
|
||||
{
|
||||
input_bdr >> numOfent;
|
||||
cout << " num of Dirichlet bdr conditions : " << numOfent << endl;
|
||||
Dirichlet.SetSize(numOfent);
|
||||
for (int kk = 0; kk < numOfent; kk++)
|
||||
{
|
||||
input_bdr >> Dirichlet[kk];
|
||||
}
|
||||
}
|
||||
Dirichlet.Print();
|
||||
|
||||
Array<int> load_bdr;
|
||||
skip_comment_lines(input_bdr, '#');
|
||||
input_bdr >> bdr_tags;
|
||||
filter_dos(bdr_tags);
|
||||
cout << " the boundary tag is : " << bdr_tags << endl;
|
||||
if (bdr_tags == "Load")
|
||||
{
|
||||
input_bdr >> numOfent;
|
||||
load_bdr.SetSize(numOfent);
|
||||
cout << " num of load bdr conditions : " << numOfent << endl;
|
||||
for (int kk = 0; kk < numOfent; kk++)
|
||||
{
|
||||
input_bdr >> load_bdr[kk];
|
||||
}
|
||||
}
|
||||
load_bdr.Print();
|
||||
|
||||
// 5. Create the MFEM mesh object from the PUMI mesh. We can handle triangular
|
||||
// and tetrahedral meshes. Other inputs are the same as MFEM default
|
||||
// constructor.
|
||||
Mesh *mesh = new PumiMesh(pumi_mesh, 1, 1);
|
||||
int dim = mesh->Dimension();
|
||||
|
||||
// Boundary conditions hack.
|
||||
apf::MeshIterator* itr = pumi_mesh->begin(dim-1);
|
||||
apf::MeshEntity* ent ;
|
||||
int bdr_cnt = 0;
|
||||
while ((ent = pumi_mesh->iterate(itr)))
|
||||
{
|
||||
apf::ModelEntity *me = pumi_mesh->toModel(ent);
|
||||
if (pumi_mesh->getModelType(me) == (dim-1))
|
||||
{
|
||||
// Everywhere 3 as initial
|
||||
(mesh->GetBdrElement(bdr_cnt))->SetAttribute(3);
|
||||
int tag = pumi_mesh->getModelTag(me);
|
||||
if (Dirichlet.Find(tag) != -1)
|
||||
{
|
||||
// Dirichlet attr -> 1
|
||||
(mesh->GetBdrElement(bdr_cnt))->SetAttribute(1);
|
||||
}
|
||||
else if (load_bdr.Find(tag) != -1)
|
||||
{
|
||||
// Load attr -> 2
|
||||
(mesh->GetBdrElement(bdr_cnt))->SetAttribute(2);
|
||||
}
|
||||
bdr_cnt++;
|
||||
}
|
||||
}
|
||||
pumi_mesh->end(itr);
|
||||
|
||||
// Assign attributes for elements.
|
||||
double ppt[3];
|
||||
Vector cent(ppt, dim);
|
||||
for (int el = 0; el < mesh->GetNE(); el++)
|
||||
{
|
||||
(mesh->GetElementTransformation(el))->
|
||||
Transform(Geometries.GetCenter(mesh->GetElementBaseGeometry(el)),cent);
|
||||
if (cent(0) <= -0.05)
|
||||
{
|
||||
mesh->SetAttribute(el, 1);
|
||||
}
|
||||
else if (cent(0) >= 0.05)
|
||||
{
|
||||
mesh->SetAttribute(el, 2);
|
||||
}
|
||||
else
|
||||
{
|
||||
mesh->SetAttribute(el, 3);
|
||||
}
|
||||
}
|
||||
mesh->SetAttributes();
|
||||
if (mesh->attributes.Max() < 2 || mesh->bdr_attributes.Max() < 2)
|
||||
{
|
||||
cerr << "\nInput mesh should have at least two materials and "
|
||||
<< "two boundary attributes! (See schematic in ex2.cpp)\n"
|
||||
<< endl;
|
||||
return 3;
|
||||
}
|
||||
|
||||
// 6. Refine the mesh to increase the resolution. In this example we do
|
||||
// 'ref_levels' of uniform refinement. We choose 'ref_levels' to be the
|
||||
// largest number that gives a final mesh with no more than 5,000
|
||||
// elements.
|
||||
{
|
||||
int ref_levels =
|
||||
(int)floor(log(5000./mesh->GetNE())/log(2.)/dim);
|
||||
for (int l = 0; l < ref_levels; l++)
|
||||
{
|
||||
mesh->UniformRefinement();
|
||||
}
|
||||
}
|
||||
|
||||
// 7. Define a finite element space on the mesh. Here we use vector finite
|
||||
// elements, i.e. dim copies of a scalar finite element space. The vector
|
||||
// dimension is specified by the last argument of the FiniteElementSpace
|
||||
// constructor. For NURBS meshes, we use the (degree elevated) NURBS space
|
||||
// associated with the mesh nodes.
|
||||
FiniteElementCollection *fec;
|
||||
FiniteElementSpace *fespace;
|
||||
if (mesh->NURBSext)
|
||||
{
|
||||
fec = NULL;
|
||||
fespace = mesh->GetNodes()->FESpace();
|
||||
}
|
||||
else
|
||||
{
|
||||
fec = new H1_FECollection(order, dim);
|
||||
fespace = new FiniteElementSpace(mesh, fec, dim);
|
||||
}
|
||||
cout << "Number of finite element unknowns: " << fespace->GetTrueVSize()
|
||||
<< endl << "Assembling: " << flush;
|
||||
|
||||
// 8. Determine the list of true (i.e. conforming) essential boundary dofs.
|
||||
// In this example, the boundary conditions are defined by marking only
|
||||
// boundary attribute 1 from the mesh as essential and converting it to a
|
||||
// list of true dofs.
|
||||
Array<int> ess_tdof_list, ess_bdr(mesh->bdr_attributes.Max());
|
||||
ess_bdr = 0;
|
||||
ess_bdr[0] = 1;
|
||||
fespace->GetEssentialTrueDofs(ess_bdr, ess_tdof_list);
|
||||
|
||||
// 9. Set up the linear form b(.) which corresponds to the right-hand side of
|
||||
// the FEM linear system. In this case, b_i equals the boundary integral
|
||||
// of f*phi_i where f represents a "pull down" force on the Neumann part
|
||||
// of the boundary and phi_i are the basis functions in the finite element
|
||||
// fespace. The force is defined by the VectorArrayCoefficient object f,
|
||||
// which is a vector of Coefficient objects. The fact that f is non-zero
|
||||
// on boundary attribute 2 is indicated by the use of piece-wise constants
|
||||
// coefficient for its last component.
|
||||
VectorArrayCoefficient f(dim);
|
||||
for (int i = 0; i < dim-1; i++)
|
||||
{
|
||||
f.Set(i, new ConstantCoefficient(0.0));
|
||||
}
|
||||
{
|
||||
Vector pull_force(mesh->bdr_attributes.Max());
|
||||
pull_force = 0.0;
|
||||
pull_force(1) = -3.0e-2;
|
||||
f.Set(dim-1, new PWConstCoefficient(pull_force));
|
||||
f.Set(dim-2, new PWConstCoefficient(pull_force));
|
||||
}
|
||||
|
||||
LinearForm *b = new LinearForm(fespace);
|
||||
b->AddBoundaryIntegrator(new VectorBoundaryLFIntegrator(f));
|
||||
cout << "r.h.s. ... " << flush;
|
||||
b->Assemble();
|
||||
|
||||
// 10. Define the solution vector x as a finite element grid function
|
||||
// corresponding to fespace. Initialize x with initial guess of zero,
|
||||
// which satisfies the boundary conditions.
|
||||
GridFunction x(fespace);
|
||||
x = 0.0;
|
||||
|
||||
// 11. Set up the bilinear form a(.,.) on the finite element space
|
||||
// corresponding to the linear elasticity integrator with piece-wise
|
||||
// constants coefficient lambda and mu.
|
||||
Vector lambda(mesh->attributes.Max());
|
||||
lambda = 1.0;
|
||||
lambda(0) = lambda(1)*10;
|
||||
lambda(1) = lambda(1)*100;
|
||||
PWConstCoefficient lambda_func(lambda);
|
||||
Vector mu(mesh->attributes.Max());
|
||||
mu = 1.0;
|
||||
mu(0) = mu(1)*10;
|
||||
mu(1) = mu(1)*100;
|
||||
PWConstCoefficient mu_func(mu);
|
||||
|
||||
BilinearForm *a = new BilinearForm(fespace);
|
||||
a->AddDomainIntegrator(new ElasticityIntegrator(lambda_func,mu_func));
|
||||
|
||||
// 12. Assemble the bilinear form and the corresponding linear system,
|
||||
// applying any necessary transformations such as: eliminating boundary
|
||||
// conditions, applying conforming constraints for non-conforming AMR,
|
||||
// static condensation, etc.
|
||||
cout << "matrix ... " << flush;
|
||||
if (static_cond) { a->EnableStaticCondensation(); }
|
||||
a->Assemble();
|
||||
|
||||
SparseMatrix A;
|
||||
Vector B, X;
|
||||
a->FormLinearSystem(ess_tdof_list, x, *b, A, X, B);
|
||||
cout << "done." << endl;
|
||||
|
||||
cout << "Size of linear system: " << A.Height() << endl;
|
||||
|
||||
#ifndef MFEM_USE_SUITESPARSE
|
||||
// 13. Define a simple symmetric Gauss-Seidel preconditioner and use it to
|
||||
// solve the system Ax=b with PCG.
|
||||
GSSmoother M(A);
|
||||
PCG(A, M, B, X, 1, 500, 1e-8, 0.0);
|
||||
#else
|
||||
// 13. If MFEM was compiled with SuiteSparse, use UMFPACK to solve the system.
|
||||
UMFPackSolver umf_solver;
|
||||
umf_solver.Control[UMFPACK_ORDERING] = UMFPACK_ORDERING_METIS;
|
||||
umf_solver.SetOperator(A);
|
||||
umf_solver.Mult(B, X);
|
||||
#endif
|
||||
|
||||
// 14. Recover the solution as a finite element grid function.
|
||||
a->RecoverFEMSolution(X, *b, x);
|
||||
|
||||
// 15. For non-NURBS meshes, make the mesh curved based on the finite element
|
||||
// space. This means that we define the mesh elements through a fespace
|
||||
// based transformation of the reference element. This allows us to save
|
||||
// the displaced mesh as a curved mesh when using high-order finite
|
||||
// element displacement field. We assume that the initial mesh (read from
|
||||
// the file) is not higher order curved mesh compared to the chosen FE
|
||||
// space.
|
||||
if (!mesh->NURBSext)
|
||||
{
|
||||
mesh->SetNodalFESpace(fespace);
|
||||
}
|
||||
|
||||
// 16. Save the displaced mesh and the inverted solution (which gives the
|
||||
// backward displacements to the original grid). This output can be
|
||||
// viewed later using GLVis: "glvis -m displaced.mesh -g sol.gf".
|
||||
{
|
||||
GridFunction *nodes = mesh->GetNodes();
|
||||
*nodes += x;
|
||||
x *= -1;
|
||||
ofstream mesh_ofs("displaced.mesh");
|
||||
mesh_ofs.precision(8);
|
||||
mesh->Print(mesh_ofs);
|
||||
ofstream sol_ofs("sol.gf");
|
||||
sol_ofs.precision(8);
|
||||
x.Save(sol_ofs);
|
||||
}
|
||||
|
||||
// 17. Send the above data by socket to a GLVis server. Use the "n" and "b"
|
||||
// keys in GLVis to visualize the displacements.
|
||||
if (visualization)
|
||||
{
|
||||
char vishost[] = "localhost";
|
||||
int visport = 19916;
|
||||
socketstream sol_sock(vishost, visport);
|
||||
sol_sock.precision(8);
|
||||
sol_sock << "solution\n" << *mesh << x << flush;
|
||||
}
|
||||
|
||||
// 18. Free the used memory.
|
||||
delete a;
|
||||
delete b;
|
||||
if (fec)
|
||||
{
|
||||
delete fespace;
|
||||
delete fec;
|
||||
}
|
||||
delete mesh;
|
||||
|
||||
pumi_mesh->destroyNative();
|
||||
apf::destroyMesh(pumi_mesh);
|
||||
PCU_Comm_Free();
|
||||
#ifdef MFEM_USE_SIMMETRIX
|
||||
gmi_sim_stop();
|
||||
Sim_unregisterAllKeys();
|
||||
#endif
|
||||
|
||||
MPI_Finalize();
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,387 @@
|
||||
// MFEM Example 6 - Parallel Version
|
||||
// PUMI Modification
|
||||
//
|
||||
// Compile with: make ex1p
|
||||
//
|
||||
// Sample runs: mpirun -np 8 ex6p
|
||||
//
|
||||
// Description: This is a version of Example 1 with a simple adaptive mesh
|
||||
// refinement loop. The problem being solved is again the Laplace
|
||||
// equation -Delta u = 1 with homogeneous Dirichlet boundary
|
||||
// conditions. The problem is solved on a sequence of meshes which
|
||||
// are adapted in a conforming (tetrahedrons) manner according
|
||||
// to a simple SPR ZZ error estimator.
|
||||
//
|
||||
// This PUMI variation also performs a "uniform" refinement,
|
||||
// similar to MFEM examples, for coarse meshes. However, the
|
||||
// refinement is performed using the PUMI API. A new option "-ar"
|
||||
// is added to modify the "adapt_ratio" which is the fraction of
|
||||
// allowable error that scales the output size field of the error
|
||||
// estimator.
|
||||
|
||||
#include "mfem.hpp"
|
||||
#include <fstream>
|
||||
#include <iostream>
|
||||
|
||||
#ifdef MFEM_USE_SIMMETRIX
|
||||
#include <SimUtil.h>
|
||||
#include <gmi_sim.h>
|
||||
#endif
|
||||
#include <apfMDS.h>
|
||||
#include <gmi_null.h>
|
||||
#include <PCU.h>
|
||||
#include <spr.h>
|
||||
#include <apfConvert.h>
|
||||
#include <gmi_mesh.h>
|
||||
#include <crv.h>
|
||||
|
||||
using namespace std;
|
||||
using namespace mfem;
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
// 1. Initialize MPI.
|
||||
int num_procs, myid;
|
||||
MPI_Init(&argc, &argv);
|
||||
MPI_Comm_size(MPI_COMM_WORLD, &num_procs);
|
||||
MPI_Comm_rank(MPI_COMM_WORLD, &myid);
|
||||
|
||||
// 2. Parse command-line options.
|
||||
const char *mesh_file = "../../data/pumi/parallel/Kova/Kova100k_8.smb";
|
||||
#ifdef MFEM_USE_SIMMETRIX
|
||||
const char *model_file = "../../data/pumi/geom/Kova.x_t";
|
||||
const char *smd_file = NULL;
|
||||
#else
|
||||
const char *model_file = "../../data/pumi/geom/Kova.dmg";
|
||||
#endif
|
||||
int order = 1;
|
||||
bool static_cond = false;
|
||||
bool visualization = 1;
|
||||
int geom_order = 1;
|
||||
double adapt_ratio = 0.05;
|
||||
|
||||
OptionsParser args(argc, argv);
|
||||
args.AddOption(&mesh_file, "-m", "--mesh",
|
||||
"Mesh file to use.");
|
||||
args.AddOption(&order, "-o", "--order",
|
||||
"Finite element order (polynomial degree) or -1 for"
|
||||
" isoparametric space.");
|
||||
args.AddOption(&static_cond, "-sc", "--static-condensation", "-no-sc",
|
||||
"--no-static-condensation", "Enable static condensation.");
|
||||
args.AddOption(&visualization, "-vis", "--visualization", "-no-vis",
|
||||
"--no-visualization",
|
||||
"Enable or disable GLVis visualization.");
|
||||
args.AddOption(&model_file, "-p", "--model",
|
||||
"parasolid or .dmg model to use.");
|
||||
#ifdef MFEM_USE_SIMMETRIX
|
||||
args.AddOption(&smd_file, "-sm", "--smd_model",
|
||||
"smd model file to use.");
|
||||
#endif
|
||||
args.AddOption(&geom_order, "-go", "--geometry_order",
|
||||
"Geometric order of the model");
|
||||
args.AddOption(&adapt_ratio, "-ar", "--adapt_ratio",
|
||||
"adaptation factor used in MeshAdapt");
|
||||
args.Parse();
|
||||
if (!args.Good())
|
||||
{
|
||||
if (myid == 0)
|
||||
{
|
||||
args.PrintUsage(cout);
|
||||
}
|
||||
MPI_Finalize();
|
||||
return 1;
|
||||
}
|
||||
if (myid == 0)
|
||||
{
|
||||
args.PrintOptions(cout);
|
||||
}
|
||||
|
||||
// 3. Read the SCOREC Mesh.
|
||||
PCU_Comm_Init();
|
||||
#ifdef MFEM_USE_SIMMETRIX
|
||||
Sim_readLicenseFile(0);
|
||||
gmi_sim_start();
|
||||
gmi_register_sim();
|
||||
#endif
|
||||
gmi_register_mesh();
|
||||
|
||||
apf::Mesh2* pumi_mesh;
|
||||
#ifdef MFEM_USE_SIMMETRIX
|
||||
if (smd_file)
|
||||
{
|
||||
gmi_model *mixed_model = gmi_sim_load(model_file, smd_file);
|
||||
pumi_mesh = apf::loadMdsMesh(mixed_model, mesh_file);
|
||||
}
|
||||
else
|
||||
#endif
|
||||
{
|
||||
pumi_mesh = apf::loadMdsMesh(model_file, mesh_file);
|
||||
}
|
||||
|
||||
// 4. Increase the geometry order and refine the mesh if necessary. Parallel
|
||||
// uniform refinement is performed if the total number of elements is less
|
||||
// than 100,000.
|
||||
int dim = pumi_mesh->getDimension();
|
||||
int nEle = pumi_mesh->count(dim);
|
||||
int ref_levels = (int)floor(log(100000./nEle)/log(2.)/dim);
|
||||
|
||||
if (geom_order > 1)
|
||||
{
|
||||
crv::BezierCurver bc(pumi_mesh, geom_order, 2);
|
||||
bc.run();
|
||||
}
|
||||
|
||||
// Perform Uniform refinement
|
||||
if (myid == 1)
|
||||
{
|
||||
std::cout << " ref level : " << ref_levels << std::endl;
|
||||
}
|
||||
|
||||
if (ref_levels > 1)
|
||||
{
|
||||
ma::Input* uniInput = ma::configureUniformRefine(pumi_mesh, ref_levels);
|
||||
|
||||
if ( geom_order > 1)
|
||||
{
|
||||
crv::adapt(uniInput);
|
||||
}
|
||||
else
|
||||
{
|
||||
ma::adapt(uniInput);
|
||||
}
|
||||
}
|
||||
|
||||
pumi_mesh->verify();
|
||||
|
||||
// 5. Create the parallel MFEM mesh object from the parallel PUMI mesh. We
|
||||
// can handle triangular and tetrahedral meshes. Note that the mesh
|
||||
// resolution is performed on the PUMI mesh.
|
||||
ParMesh *pmesh = new ParPumiMesh(MPI_COMM_WORLD, pumi_mesh);
|
||||
|
||||
// 6. Define a parallel finite element space on the parallel mesh. Here we
|
||||
// use continuous Lagrange finite elements of the specified order. If
|
||||
// order < 1, we instead use an isoparametric/isogeometric space.
|
||||
FiniteElementCollection *fec;
|
||||
if (order > 0)
|
||||
{
|
||||
fec = new H1_FECollection(order, dim);
|
||||
}
|
||||
else if (pmesh->GetNodes())
|
||||
{
|
||||
fec = pmesh->GetNodes()->OwnFEC();
|
||||
if (myid == 1)
|
||||
{
|
||||
cout << "Using isoparametric FEs: " << fec->Name() << endl;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
fec = new H1_FECollection(order = 1, dim);
|
||||
}
|
||||
ParFiniteElementSpace *fespace = new ParFiniteElementSpace(pmesh, fec);
|
||||
HYPRE_Int size = fespace->GlobalTrueVSize();
|
||||
if (myid == 1)
|
||||
{
|
||||
cout << "Number of finite element unknowns: " << size << endl;
|
||||
}
|
||||
|
||||
// 7. Set up the parallel linear form b(.) which corresponds to the
|
||||
// right-hand side of the FEM linear system, which in this case is
|
||||
// (1,phi_i) where phi_i are the basis functions in fespace.
|
||||
ParLinearForm *b = new ParLinearForm(fespace);
|
||||
ConstantCoefficient one(1.0);
|
||||
b->AddDomainIntegrator(new DomainLFIntegrator(one));
|
||||
|
||||
// 8. Define the solution vector x as a parallel finite element grid function
|
||||
// corresponding to fespace. Initialize x with initial guess of zero,
|
||||
// which satisfies the boundary conditions.
|
||||
ParGridFunction x(fespace);
|
||||
x = 0.0;
|
||||
|
||||
// 9. Connect to GLVis.
|
||||
char vishost[] = "localhost";
|
||||
int visport = 19916;
|
||||
|
||||
socketstream sout;
|
||||
if (visualization)
|
||||
{
|
||||
sout.open(vishost, visport);
|
||||
if (!sout)
|
||||
{
|
||||
if (myid == 0)
|
||||
{
|
||||
cout << "Unable to connect to GLVis server at "
|
||||
<< vishost << ':' << visport << endl;
|
||||
cout << "GLVis visualization disabled.\n";
|
||||
}
|
||||
visualization = false;
|
||||
}
|
||||
|
||||
sout.precision(8);
|
||||
}
|
||||
|
||||
// 10. Set up the parallel bilinear form a(.,.) on the finite element space
|
||||
// corresponding to the Laplacian operator -Delta, by adding the
|
||||
// Diffusion domain integrator.
|
||||
ParBilinearForm *a = new ParBilinearForm(fespace);
|
||||
a->AddDomainIntegrator(new DiffusionIntegrator(one));
|
||||
|
||||
// 11. Assemble the parallel bilinear form and the corresponding linear
|
||||
// system, applying any necessary transformations such as: parallel
|
||||
// assembly, eliminating boundary conditions, applying conforming
|
||||
// constraints for non-conforming AMR, static condensation, etc.
|
||||
if (static_cond) { a->EnableStaticCondensation(); }
|
||||
|
||||
// 12. The main AMR loop. In each iteration we solve the problem on the
|
||||
// current mesh, visualize the solution, and adapt the mesh.
|
||||
apf::Field* Tmag_field = 0;
|
||||
apf::Field* temp_field = 0;
|
||||
apf::Field* ipfield = 0;
|
||||
apf::Field* sizefield = 0;
|
||||
int max_iter = 3;
|
||||
|
||||
for (int Itr = 0; Itr < max_iter; Itr++)
|
||||
{
|
||||
HYPRE_Int global_dofs = fespace->GlobalTrueVSize();
|
||||
if (myid == 1)
|
||||
{
|
||||
cout << "\nAMR iteration " << Itr << endl;
|
||||
cout << "Number of unknowns: " << global_dofs << endl;
|
||||
}
|
||||
|
||||
// Assemble.
|
||||
a->Assemble();
|
||||
b->Assemble();
|
||||
|
||||
// Essential boundary condition.
|
||||
Array<int> ess_tdof_list;
|
||||
if (pmesh->bdr_attributes.Size())
|
||||
{
|
||||
Array<int> ess_bdr(pmesh->bdr_attributes.Max());
|
||||
ess_bdr = 1;
|
||||
fespace->GetEssentialTrueDofs(ess_bdr, ess_tdof_list);
|
||||
}
|
||||
|
||||
// Form linear system.
|
||||
HypreParMatrix A;
|
||||
Vector B, X;
|
||||
const int copy_interior = 1;
|
||||
a->FormLinearSystem(ess_tdof_list, x, *b, A, X, B, copy_interior);
|
||||
|
||||
// 13. Define and apply a parallel PCG solver for AX=B with the BoomerAMG
|
||||
// preconditioner from hypre.
|
||||
HypreBoomerAMG amg;
|
||||
amg.SetPrintLevel(0);
|
||||
CGSolver pcg(A.GetComm());
|
||||
pcg.SetPreconditioner(amg);
|
||||
pcg.SetOperator(A);
|
||||
pcg.SetRelTol(1e-6);
|
||||
pcg.SetMaxIter(200);
|
||||
pcg.SetPrintLevel(3); // print the first and the last iterations only
|
||||
pcg.Mult(B, X);
|
||||
|
||||
// 14. Recover the parallel grid function corresponding to X. This is the
|
||||
// local finite element solution on each processor.
|
||||
a->RecoverFEMSolution(X, *b, x);
|
||||
|
||||
// 15. Save in parallel the displaced mesh and the inverted solution (which
|
||||
// gives the backward displacements to the original grid). This output
|
||||
// can be viewed later using GLVis: "glvis -np <np> -m mesh -g sol".
|
||||
{
|
||||
ostringstream mesh_name, sol_name;
|
||||
mesh_name << "mesh." << setfill('0') << setw(6) << myid;
|
||||
sol_name << "sol." << setfill('0') << setw(6) << myid;
|
||||
|
||||
ofstream mesh_ofs(mesh_name.str().c_str());
|
||||
mesh_ofs.precision(8);
|
||||
pmesh->Print(mesh_ofs);
|
||||
|
||||
ofstream sol_ofs(sol_name.str().c_str());
|
||||
sol_ofs.precision(8);
|
||||
x.Save(sol_ofs);
|
||||
}
|
||||
|
||||
// 16. Send the above data by socket to a GLVis server. Use the "n" and "b"
|
||||
// keys in GLVis to visualize the displacements.
|
||||
if (visualization)
|
||||
{
|
||||
sout << "parallel " << num_procs << " " << myid << "\n";
|
||||
sout << "solution\n" << *pmesh << x << flush;
|
||||
}
|
||||
|
||||
// 17. Field transfer. Scalar solution field and magnitude field for error
|
||||
// estimation are created the PUMI mesh.
|
||||
if (order > geom_order)
|
||||
{
|
||||
Tmag_field = apf::createField(pumi_mesh, "field_mag",
|
||||
apf::SCALAR, apf::getLagrange(order));
|
||||
temp_field = apf::createField(pumi_mesh, "T_field",
|
||||
apf::SCALAR, apf::getLagrange(order));
|
||||
}
|
||||
else
|
||||
{
|
||||
Tmag_field = apf::createFieldOn(pumi_mesh, "field_mag",apf::SCALAR);
|
||||
temp_field = apf::createFieldOn(pumi_mesh, "T_field", apf::SCALAR);
|
||||
}
|
||||
|
||||
ParPumiMesh* pPPmesh = dynamic_cast<ParPumiMesh*>(pmesh);
|
||||
pPPmesh->FieldMFEMtoPUMI(pumi_mesh, &x, temp_field, Tmag_field);
|
||||
|
||||
ipfield= spr::getGradIPField(Tmag_field, "MFEM_gradip", 2);
|
||||
sizefield = spr::getSPRSizeField(ipfield, adapt_ratio);
|
||||
|
||||
apf::destroyField(Tmag_field);
|
||||
apf::destroyField(ipfield);
|
||||
apf::destroyNumbering(pumi_mesh->findNumbering("LocalVertexNumbering"));
|
||||
|
||||
// 18. Perform MesAdapt.
|
||||
ma::Input* erinput = ma::configure(pumi_mesh, sizefield);
|
||||
erinput->shouldFixShape = true;
|
||||
erinput->maximumIterations = 2;
|
||||
if ( geom_order > 1)
|
||||
{
|
||||
crv::adapt(erinput);
|
||||
}
|
||||
else
|
||||
{
|
||||
ma::adapt(erinput);
|
||||
}
|
||||
|
||||
ParMesh* Adapmesh = new ParPumiMesh(MPI_COMM_WORLD, pumi_mesh);
|
||||
pPPmesh->UpdateMesh(Adapmesh);
|
||||
delete Adapmesh;
|
||||
|
||||
// 19. Update the FiniteElementSpace, GridFunction, and bilinear form.
|
||||
fespace->Update();
|
||||
x.Update();
|
||||
x = 0.0;
|
||||
|
||||
pPPmesh->FieldPUMItoMFEM(pumi_mesh, temp_field, &x);
|
||||
a->Update();
|
||||
b->Update();
|
||||
|
||||
// Destroy fields.
|
||||
apf::destroyField(temp_field);
|
||||
apf::destroyField(sizefield);
|
||||
}
|
||||
|
||||
// 20. Free the used memory.
|
||||
delete a;
|
||||
delete b;
|
||||
delete fespace;
|
||||
if (order > 0) { delete fec; }
|
||||
delete pmesh;
|
||||
|
||||
pumi_mesh->destroyNative();
|
||||
apf::destroyMesh(pumi_mesh);
|
||||
PCU_Comm_Free();
|
||||
|
||||
#ifdef MFEM_USE_SIMMETRIX
|
||||
gmi_sim_stop();
|
||||
Sim_unregisterAllKeys();
|
||||
#endif
|
||||
|
||||
MPI_Finalize();
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,94 @@
|
||||
# Copyright (c) 2010, Lawrence Livermore National Security, LLC. Produced at the
|
||||
# Lawrence Livermore National Laboratory. LLNL-CODE-443211. All Rights reserved.
|
||||
# See file COPYRIGHT for details.
|
||||
#
|
||||
# This file is part of the MFEM library. For more information and source code
|
||||
# availability see http://mfem.org.
|
||||
#
|
||||
# MFEM is free software; you can redistribute it and/or modify it under the
|
||||
# terms of the GNU Lesser General Public License (as published by the Free
|
||||
# Software Foundation) version 2.1 dated February 1999.
|
||||
|
||||
# Use the MFEM build directory
|
||||
MFEM_DIR ?= ../..
|
||||
MFEM_BUILD_DIR ?= ../..
|
||||
SRC = $(if $(MFEM_DIR:../..=),$(MFEM_DIR)/examples/pumi/,)
|
||||
CONFIG_MK = $(MFEM_BUILD_DIR)/config/config.mk
|
||||
# Use the MFEM install directory
|
||||
# MFEM_INSTALL_DIR = ../../mfem
|
||||
# CONFIG_MK = $(MFEM_INSTALL_DIR)/share/mfem/config.mk
|
||||
|
||||
MFEM_LIB_FILE = mfem_is_not_built
|
||||
-include $(CONFIG_MK)
|
||||
|
||||
# All PUMI examples require MPI
|
||||
SEQ_EXAMPLES =
|
||||
PAR_EXAMPLES = ex1 ex1p ex2 ex6p
|
||||
ifeq ($(MFEM_USE_MPI),NO)
|
||||
EXAMPLES = $(SEQ_EXAMPLES)
|
||||
else
|
||||
EXAMPLES = $(PAR_EXAMPLES) $(SEQ_EXAMPLES)
|
||||
endif
|
||||
|
||||
.SUFFIXES:
|
||||
.SUFFIXES: .o .cpp .mk
|
||||
.PHONY: all clean clean-build clean-exec
|
||||
|
||||
# Remove built-in rule
|
||||
%: %.cpp
|
||||
|
||||
# Replace the default implicit rule for *.cpp files
|
||||
%: $(SRC)%.cpp $(MFEM_LIB_FILE) $(CONFIG_MK)
|
||||
$(MFEM_CXX) $(MFEM_FLAGS) $< -o $@ $(MFEM_LIBS)
|
||||
|
||||
all: $(EXAMPLES)
|
||||
|
||||
ifeq ($(MFEM_USE_PUMI),NO)
|
||||
$(EXAMPLES):
|
||||
$(error MFEM is not configured with PUMI)
|
||||
endif
|
||||
|
||||
MFEM_TESTS = EXAMPLES
|
||||
include $(MFEM_TEST_MK)
|
||||
|
||||
ifneq (,$(filter test%,$(MAKECMDGOALS)))
|
||||
ifeq (,$(wildcard ../../data/pumi))
|
||||
$(info PUMI data directory not found. The PUMI tests will be SKIPPED.)
|
||||
mfem-test = printf " $(3) [$(2) $(1) ... ]: "; $(PRINT_SKIP)
|
||||
endif
|
||||
endif
|
||||
|
||||
# Testing: Parallel vs. serial runs
|
||||
RUN_MPI_NP = $(MFEM_MPIEXEC) $(MFEM_MPIEXEC_NP)
|
||||
RUN_MPI = $(RUN_MPI_NP) $(MFEM_MPI_NP)
|
||||
SERIAL_NAME := Serial PUMI example
|
||||
PARALLEL_NAME := Parallel PUMI example
|
||||
%-test-par: %
|
||||
@$(call mfem-test,$<, $(RUN_MPI), $(PARALLEL_NAME))
|
||||
%-test-seq: %
|
||||
@$(call mfem-test,$<,, $(SERIAL_NAME))
|
||||
|
||||
# Testing: Example-specific execution options:
|
||||
ex1-test-par: ex1
|
||||
@$(call mfem-test,$<, $(RUN_MPI_NP) 1, $(PARALLEL_NAME))
|
||||
ex1p-test-par: ex1p
|
||||
@$(call mfem-test,$<, $(RUN_MPI_NP) 8, $(PARALLEL_NAME))
|
||||
ex2-test-par: ex2
|
||||
@$(call mfem-test,$<, $(RUN_MPI_NP) 1, $(PARALLEL_NAME))
|
||||
ex6p-test-par: ex6p
|
||||
@$(call mfem-test,$<, $(RUN_MPI_NP) 8, $(PARALLEL_NAME))
|
||||
|
||||
# Testing: "test" target and mfem-test* variables are defined in config/test.mk
|
||||
|
||||
# Generate an error message if the MFEM library is not built and exit
|
||||
$(MFEM_LIB_FILE):
|
||||
$(error The MFEM library is not built)
|
||||
|
||||
clean: clean-build clean-exec
|
||||
|
||||
clean-build:
|
||||
rm -f *.o *~ $(SEQ_EXAMPLES) $(PAR_EXAMPLES)
|
||||
rm -rf *.dSYM *.TVD.*breakpoints
|
||||
|
||||
clean-exec:
|
||||
@rm -f refined.mesh sol.gf mesh.* sol.* displaced.mesh
|
||||
@@ -68,7 +68,7 @@ foreach(SRC_FILE ${SUNDIALS_EXAMPLES_SRCS})
|
||||
COMMAND ${TEST_NAME} ${THIS_TEST_OPTIONS})
|
||||
else()
|
||||
add_test(NAME ${TEST_NAME}_np=4
|
||||
COMMAND ${MPIEXEC} ${MPIEXEC_NUMPROC_FLAG} 4
|
||||
COMMAND ${MPIEXEC} ${MPIEXEC_NUMPROC_FLAG} ${MFEM_MPI_NP}
|
||||
${MPIEXEC_PREFLAGS}
|
||||
$<TARGET_FILE:${TEST_NAME}> ${THIS_TEST_OPTIONS}
|
||||
${MPIEXEC_POSTFLAGS})
|
||||
|
||||
+37
-37
@@ -79,9 +79,6 @@ BilinearForm::BilinearForm (FiniteElementSpace * f)
|
||||
BilinearForm::BilinearForm (FiniteElementSpace * f, BilinearForm * bf, int ps)
|
||||
: Matrix (f->GetVSize())
|
||||
{
|
||||
int i;
|
||||
Array<BilinearFormIntegrator*> *bfi;
|
||||
|
||||
fes = f;
|
||||
sequence = f->GetSequence();
|
||||
mat_e = NULL;
|
||||
@@ -92,33 +89,16 @@ BilinearForm::BilinearForm (FiniteElementSpace * f, BilinearForm * bf, int ps)
|
||||
precompute_sparsity = ps;
|
||||
diag_policy = DIAG_KEEP;
|
||||
|
||||
bfi = bf->GetDBFI();
|
||||
dbfi.SetSize (bfi->Size());
|
||||
for (i = 0; i < bfi->Size(); i++)
|
||||
{
|
||||
dbfi[i] = (*bfi)[i];
|
||||
}
|
||||
// Copy the pointers to the integrators
|
||||
dbfi = bf->dbfi;
|
||||
|
||||
bfi = bf->GetBBFI();
|
||||
bbfi.SetSize (bfi->Size());
|
||||
for (i = 0; i < bfi->Size(); i++)
|
||||
{
|
||||
bbfi[i] = (*bfi)[i];
|
||||
}
|
||||
bbfi = bf->bbfi;
|
||||
bbfi_marker = bf->bbfi_marker;
|
||||
|
||||
bfi = bf->GetFBFI();
|
||||
fbfi.SetSize (bfi->Size());
|
||||
for (i = 0; i < bfi->Size(); i++)
|
||||
{
|
||||
fbfi[i] = (*bfi)[i];
|
||||
}
|
||||
fbfi = bf->fbfi;
|
||||
|
||||
bfi = bf->GetBFBFI();
|
||||
bfbfi.SetSize (bfi->Size());
|
||||
for (i = 0; i < bfi->Size(); i++)
|
||||
{
|
||||
bfbfi[i] = (*bfi)[i];
|
||||
}
|
||||
bfbfi = bf->bfbfi;
|
||||
bfbfi_marker = bf->bfbfi_marker;
|
||||
|
||||
AllocMat();
|
||||
}
|
||||
@@ -734,7 +714,7 @@ void BilinearForm::ComputeElementMatrices()
|
||||
}
|
||||
|
||||
void BilinearForm::EliminateEssentialBC(const Array<int> &bdr_attr_is_ess,
|
||||
Vector &sol, Vector &rhs, DiagonalPolicy dpolicy)
|
||||
const Vector &sol, Vector &rhs, DiagonalPolicy dpolicy)
|
||||
{
|
||||
Array<int> ess_dofs, conf_ess_dofs;
|
||||
fes->GetEssentialVDofs(bdr_attr_is_ess, ess_dofs);
|
||||
@@ -785,7 +765,7 @@ void BilinearForm::EliminateEssentialBCDiag (const Array<int> &bdr_attr_is_ess,
|
||||
}
|
||||
|
||||
void BilinearForm::EliminateVDofs(const Array<int> &vdofs,
|
||||
Vector &sol, Vector &rhs,
|
||||
const Vector &sol, Vector &rhs,
|
||||
DiagonalPolicy dpolicy)
|
||||
{
|
||||
for (int i = 0; i < vdofs.Size(); i++)
|
||||
@@ -825,7 +805,8 @@ void BilinearForm::EliminateVDofs(const Array<int> &vdofs,
|
||||
}
|
||||
|
||||
void BilinearForm::EliminateEssentialBCFromDofs(
|
||||
const Array<int> &ess_dofs, Vector &sol, Vector &rhs, DiagonalPolicy dpolicy)
|
||||
const Array<int> &ess_dofs, const Vector &sol, Vector &rhs,
|
||||
DiagonalPolicy dpolicy)
|
||||
{
|
||||
MFEM_ASSERT(ess_dofs.Size() == height, "incorrect dof Array size");
|
||||
MFEM_ASSERT(sol.Size() == height, "incorrect sol Vector size");
|
||||
@@ -940,6 +921,23 @@ MixedBilinearForm::MixedBilinearForm (FiniteElementSpace *tr_fes,
|
||||
trial_fes = tr_fes;
|
||||
test_fes = te_fes;
|
||||
mat = NULL;
|
||||
extern_bfs = 0;
|
||||
}
|
||||
|
||||
MixedBilinearForm::MixedBilinearForm (FiniteElementSpace *tr_fes,
|
||||
FiniteElementSpace *te_fes,
|
||||
MixedBilinearForm * mbf)
|
||||
: Matrix(te_fes->GetVSize(), tr_fes->GetVSize())
|
||||
{
|
||||
trial_fes = tr_fes;
|
||||
test_fes = te_fes;
|
||||
mat = NULL;
|
||||
extern_bfs = 1;
|
||||
|
||||
// Copy the pointers to the integrators
|
||||
dom = mbf->dom;
|
||||
bdr = mbf->bdr;
|
||||
skt = mbf->skt;
|
||||
}
|
||||
|
||||
double & MixedBilinearForm::Elem (int i, int j)
|
||||
@@ -1118,7 +1116,7 @@ void MixedBilinearForm::ConformingAssemble()
|
||||
}
|
||||
|
||||
void MixedBilinearForm::EliminateTrialDofs (
|
||||
Array<int> &bdr_attr_is_ess, Vector &sol, Vector &rhs )
|
||||
Array<int> &bdr_attr_is_ess, const Vector &sol, Vector &rhs )
|
||||
{
|
||||
int i, j, k;
|
||||
Array<int> tr_vdofs, cols_marker (trial_fes -> GetVSize());
|
||||
@@ -1141,7 +1139,7 @@ void MixedBilinearForm::EliminateTrialDofs (
|
||||
}
|
||||
|
||||
void MixedBilinearForm::EliminateEssentialBCFromTrialDofs (
|
||||
Array<int> &marked_vdofs, Vector &sol, Vector &rhs)
|
||||
Array<int> &marked_vdofs, const Vector &sol, Vector &rhs)
|
||||
{
|
||||
mat -> EliminateCols (marked_vdofs, &sol, &rhs);
|
||||
}
|
||||
@@ -1176,12 +1174,14 @@ void MixedBilinearForm::Update()
|
||||
|
||||
MixedBilinearForm::~MixedBilinearForm()
|
||||
{
|
||||
int i;
|
||||
|
||||
if (mat) { delete mat; }
|
||||
for (i = 0; i < dom.Size(); i++) { delete dom[i]; }
|
||||
for (i = 0; i < bdr.Size(); i++) { delete bdr[i]; }
|
||||
for (i = 0; i < skt.Size(); i++) { delete skt[i]; }
|
||||
if (!extern_bfs)
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i < dom.Size(); i++) { delete dom[i]; }
|
||||
for (i = 0; i < bdr.Size(); i++) { delete bdr[i]; }
|
||||
for (i = 0; i < skt.Size(); i++) { delete skt[i]; }
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
+139
-46
@@ -29,19 +29,21 @@ namespace mfem
|
||||
class BilinearForm : public Matrix
|
||||
{
|
||||
protected:
|
||||
/// Sparse matrix to be associated with the form.
|
||||
/// Sparse matrix to be associated with the form. Owned.
|
||||
SparseMatrix *mat;
|
||||
|
||||
/// Matrix used to eliminate b.c.
|
||||
/// Matrix used to eliminate b.c. Owned.
|
||||
SparseMatrix *mat_e;
|
||||
|
||||
/// FE space on which the form lives.
|
||||
/// FE space on which the form lives. Not owned.
|
||||
FiniteElementSpace *fes;
|
||||
|
||||
/// Indicates the Mesh::sequence corresponding to the current state of the
|
||||
/// BilinearForm.
|
||||
long sequence;
|
||||
|
||||
/** @brief Indicates the BilinearFormIntegrator%s stored in #dbfi, #bbfi,
|
||||
#fbfi, and #bfbfi are owned by another BilinearForm. */
|
||||
int extern_bfs;
|
||||
|
||||
/// Set of Domain Integrators to be applied.
|
||||
@@ -49,22 +51,22 @@ protected:
|
||||
|
||||
/// Set of Boundary Integrators to be applied.
|
||||
Array<BilinearFormIntegrator*> bbfi;
|
||||
Array<Array<int>*> bbfi_marker;
|
||||
Array<Array<int>*> bbfi_marker; ///< Entries are not owned.
|
||||
|
||||
/// Set of interior face Integrators to be applied.
|
||||
Array<BilinearFormIntegrator*> fbfi;
|
||||
|
||||
/// Set of boundary face Integrators to be applied.
|
||||
Array<BilinearFormIntegrator*> bfbfi;
|
||||
Array<Array<int>*> bfbfi_marker;
|
||||
Array<Array<int>*> bfbfi_marker; ///< Entries are not owned.
|
||||
|
||||
DenseMatrix elemmat;
|
||||
Array<int> vdofs;
|
||||
|
||||
DenseTensor *element_matrices;
|
||||
DenseTensor *element_matrices; ///< Owned.
|
||||
|
||||
StaticCondensation *static_cond;
|
||||
Hybridization *hybridization;
|
||||
StaticCondensation *static_cond; ///< Owned.
|
||||
Hybridization *hybridization; ///< Owned.
|
||||
|
||||
/**
|
||||
* This member allows one to specify what should be done
|
||||
@@ -89,10 +91,28 @@ protected:
|
||||
diag_policy = DIAG_KEEP;
|
||||
}
|
||||
|
||||
private:
|
||||
/// Copy construction is not supported; body is undefined.
|
||||
BilinearForm(const BilinearForm &);
|
||||
|
||||
/// Copy assignment is not supported; body is undefined.
|
||||
BilinearForm &operator=(const BilinearForm &);
|
||||
|
||||
public:
|
||||
/// Creates bilinear form associated with FE space @a *f.
|
||||
/** The pointer @a f is not owned by the newly constructed object. */
|
||||
BilinearForm(FiniteElementSpace *f);
|
||||
|
||||
/** @brief Create a BilinearForm on the FiniteElementSpace @a f, using the
|
||||
same integrators as the BilinearForm @a bf.
|
||||
|
||||
The pointer @a f is not owned by the newly constructed object.
|
||||
|
||||
The integrators in @a bf are copied as pointers and they are not owned by
|
||||
the newly constructed BilinearForm.
|
||||
|
||||
The optional parameter @a ps is used to initialize the internal flag
|
||||
#precompute_sparsity, see UsePrecomputedSparsity() for details. */
|
||||
BilinearForm(FiniteElementSpace *f, BilinearForm *bf, int ps = 0);
|
||||
|
||||
/// Get the size of the BilinearForm as a square matrix.
|
||||
@@ -143,13 +163,25 @@ public:
|
||||
finalized) and the entries are initialized with zeros. */
|
||||
void AllocateMatrix() { if (mat == NULL) { AllocMat(); } }
|
||||
|
||||
/// Access all integrators added with AddDomainIntegrator().
|
||||
Array<BilinearFormIntegrator*> *GetDBFI() { return &dbfi; }
|
||||
|
||||
/// Access all integrators added with AddBoundaryIntegrator().
|
||||
Array<BilinearFormIntegrator*> *GetBBFI() { return &bbfi; }
|
||||
/** @brief Access all boundary markers added with AddBoundaryIntegrator().
|
||||
If no marker was specified when the integrator was added, the
|
||||
corresponding pointer (to Array<int>) will be NULL. */
|
||||
Array<Array<int>*> *GetBBFI_Marker() { return &bbfi_marker; }
|
||||
|
||||
/// Access all integrators added with AddInteriorFaceIntegrator().
|
||||
Array<BilinearFormIntegrator*> *GetFBFI() { return &fbfi; }
|
||||
|
||||
/// Access all integrators added with AddBdrFaceIntegrator().
|
||||
Array<BilinearFormIntegrator*> *GetBFBFI() { return &bfbfi; }
|
||||
/** @brief Access all boundary markers added with AddBdrFaceIntegrator().
|
||||
If no marker was specified when the integrator was added, the
|
||||
corresponding pointer (to Array<int>) will be NULL. */
|
||||
Array<Array<int>*> *GetBFBFI_Marker() { return &bfbfi_marker; }
|
||||
|
||||
const double &operator()(int i, int j) { return (*mat)(i,j); }
|
||||
|
||||
@@ -175,10 +207,10 @@ public:
|
||||
const double a = 1.0) const
|
||||
{ mat->AddMultTranspose(x, y, a); }
|
||||
|
||||
void FullAddMultTranspose (const Vector & x, Vector & y) const
|
||||
void FullAddMultTranspose(const Vector & x, Vector & y) const
|
||||
{ mat->AddMultTranspose(x, y); mat_e->AddMultTranspose(x, y); }
|
||||
|
||||
virtual void MultTranspose (const Vector & x, Vector & y) const
|
||||
virtual void MultTranspose(const Vector & x, Vector & y) const
|
||||
{ y = 0.0; AddMultTranspose (x, y); }
|
||||
|
||||
double InnerProduct(const Vector &x, const Vector &y) const
|
||||
@@ -215,25 +247,31 @@ public:
|
||||
return *mat_e;
|
||||
}
|
||||
|
||||
/// Adds new Domain Integrator.
|
||||
/// Adds new Domain Integrator. Assumes ownership of @a bfi.
|
||||
void AddDomainIntegrator(BilinearFormIntegrator *bfi);
|
||||
|
||||
/// Adds new Boundary Integrator.
|
||||
/// Adds new Boundary Integrator. Assumes ownership of @a bfi.
|
||||
void AddBoundaryIntegrator(BilinearFormIntegrator *bfi);
|
||||
|
||||
/** @brief Adds new Boundary Integrator, restricted to specific boundary
|
||||
attributes. */
|
||||
void AddBoundaryIntegrator(BilinearFormIntegrator * bfi,
|
||||
attributes.
|
||||
|
||||
Assumes ownership of @a bfi. The array @a bdr_marker is stored internally
|
||||
as a pointer to the given Array<int> object. */
|
||||
void AddBoundaryIntegrator(BilinearFormIntegrator *bfi,
|
||||
Array<int> &bdr_marker);
|
||||
|
||||
/// Adds new interior Face Integrator.
|
||||
/// Adds new interior Face Integrator. Assumes ownership of @a bfi.
|
||||
void AddInteriorFaceIntegrator(BilinearFormIntegrator *bfi);
|
||||
|
||||
/// Adds new boundary Face Integrator.
|
||||
/// Adds new boundary Face Integrator. Assumes ownership of @a bfi.
|
||||
void AddBdrFaceIntegrator(BilinearFormIntegrator *bfi);
|
||||
|
||||
/** @brief Adds new boundary Face Integrator, restricted to specific boundary
|
||||
attributes. */
|
||||
attributes.
|
||||
|
||||
Assumes ownership of @a bfi. The array @a bdr_marker is stored internally
|
||||
as a pointer to the given Array<int> object. */
|
||||
void AddBdrFaceIntegrator(BilinearFormIntegrator *bfi,
|
||||
Array<int> &bdr_marker);
|
||||
|
||||
@@ -311,7 +349,7 @@ public:
|
||||
essential DOFs is set to 1.0. This behavior is controlled by the argument
|
||||
@a dpolicy. */
|
||||
void EliminateEssentialBC(const Array<int> &bdr_attr_is_ess,
|
||||
Vector &sol, Vector &rhs,
|
||||
const Vector &sol, Vector &rhs,
|
||||
DiagonalPolicy dpolicy = DIAG_ONE);
|
||||
|
||||
/// Eliminate essential boundary DOFs from the system matrix.
|
||||
@@ -322,7 +360,7 @@ public:
|
||||
double value);
|
||||
|
||||
/// Eliminate the given @a vdofs. NOTE: here, @a vdofs is a list of DOFs.
|
||||
void EliminateVDofs(const Array<int> &vdofs, Vector &sol, Vector &rhs,
|
||||
void EliminateVDofs(const Array<int> &vdofs, const Vector &sol, Vector &rhs,
|
||||
DiagonalPolicy dpolicy = DIAG_ONE);
|
||||
|
||||
/// Eliminate the given @a vdofs, storing the eliminated part internally.
|
||||
@@ -333,10 +371,10 @@ public:
|
||||
DiagonalPolicy dpolicy = DIAG_ONE);
|
||||
|
||||
/** @brief Similar to
|
||||
EliminateVDofs(const Array<int> &, Vector &, Vector &, DiagonalPolicy)
|
||||
EliminateVDofs(const Array<int> &, const Vector &, Vector &, DiagonalPolicy)
|
||||
but here @a ess_dofs is a marker (boolean) array on all vector-dofs
|
||||
(@a ess_dofs[i] < 0 is true). */
|
||||
void EliminateEssentialBCFromDofs(const Array<int> &ess_dofs, Vector &sol,
|
||||
void EliminateEssentialBCFromDofs(const Array<int> &ess_dofs, const Vector &sol,
|
||||
Vector &rhs, DiagonalPolicy dpolicy = DIAG_ONE);
|
||||
|
||||
/** @brief Similar to EliminateVDofs(const Array<int> &, DiagonalPolicy) but
|
||||
@@ -393,36 +431,68 @@ public:
|
||||
class MixedBilinearForm : public Matrix
|
||||
{
|
||||
protected:
|
||||
SparseMatrix *mat;
|
||||
SparseMatrix *mat; ///< Owned.
|
||||
|
||||
FiniteElementSpace *trial_fes, *test_fes;
|
||||
FiniteElementSpace *trial_fes, ///< Not owned
|
||||
*test_fes; ///< Not owned
|
||||
|
||||
/** @brief Indicates the BilinearFormIntegrator%s stored in #dom, #bdr, and
|
||||
#skt are owned by another MixedBilinearForm. */
|
||||
int extern_bfs;
|
||||
|
||||
/// Domain integrators.
|
||||
Array<BilinearFormIntegrator*> dom;
|
||||
/// Boundary integrators.
|
||||
Array<BilinearFormIntegrator*> bdr;
|
||||
Array<BilinearFormIntegrator*> skt; // trace face integrators
|
||||
/// Trace face (skeleton) integrators.
|
||||
Array<BilinearFormIntegrator*> skt;
|
||||
|
||||
private:
|
||||
/// Copy construction is not supported; body is undefined.
|
||||
MixedBilinearForm(const MixedBilinearForm &);
|
||||
|
||||
/// Copy assignment is not supported; body is undefined.
|
||||
MixedBilinearForm &operator=(const MixedBilinearForm &);
|
||||
|
||||
public:
|
||||
MixedBilinearForm (FiniteElementSpace *tr_fes,
|
||||
FiniteElementSpace *te_fes);
|
||||
/** @brief Construct a MixedBilinearForm on the given trial, @a tr_fes, and
|
||||
test, @a te_fes, FiniteElementSpace%s. */
|
||||
/** The pointers @a tr_fes and @a te_fes are not owned by the newly
|
||||
constructed object. */
|
||||
MixedBilinearForm(FiniteElementSpace *tr_fes,
|
||||
FiniteElementSpace *te_fes);
|
||||
|
||||
virtual double& Elem (int i, int j);
|
||||
/** @brief Create a MixedBilinearForm on the given trial, @a tr_fes, and
|
||||
test, @a te_fes, FiniteElementSpace%s, using the same integrators as the
|
||||
MixedBilinearForm @a mbf.
|
||||
|
||||
virtual const double& Elem (int i, int j) const;
|
||||
The pointers @a tr_fes and @a te_fes are not owned by the newly
|
||||
constructed object.
|
||||
|
||||
virtual void Mult (const Vector & x, Vector & y) const;
|
||||
The integrators in @a mbf are copied as pointers and they are not owned
|
||||
by the newly constructed MixedBilinearForm. */
|
||||
MixedBilinearForm(FiniteElementSpace *tr_fes,
|
||||
FiniteElementSpace *te_fes,
|
||||
MixedBilinearForm *mbf);
|
||||
|
||||
virtual void AddMult (const Vector & x, Vector & y,
|
||||
const double a = 1.0) const;
|
||||
virtual double &Elem(int i, int j);
|
||||
|
||||
virtual void AddMultTranspose (const Vector & x, Vector & y,
|
||||
const double a = 1.0) const;
|
||||
virtual const double &Elem(int i, int j) const;
|
||||
|
||||
virtual void MultTranspose (const Vector & x, Vector & y) const
|
||||
virtual void Mult(const Vector & x, Vector & y) const;
|
||||
|
||||
virtual void AddMult(const Vector & x, Vector & y,
|
||||
const double a = 1.0) const;
|
||||
|
||||
virtual void AddMultTranspose(const Vector & x, Vector & y,
|
||||
const double a = 1.0) const;
|
||||
|
||||
virtual void MultTranspose(const Vector & x, Vector & y) const
|
||||
{ y = 0.0; AddMultTranspose (x, y); }
|
||||
|
||||
virtual MatrixInverse * Inverse() const;
|
||||
virtual MatrixInverse *Inverse() const;
|
||||
|
||||
virtual void Finalize (int skip_zeros = 1);
|
||||
virtual void Finalize(int skip_zeros = 1);
|
||||
|
||||
/** Extract the associated matrix as SparseMatrix blocks. The number of
|
||||
block rows and columns is given by the vector dimensions (vdim) of the
|
||||
@@ -433,24 +503,31 @@ public:
|
||||
SparseMatrix &SpMat() { return *mat; }
|
||||
SparseMatrix *LoseMat() { SparseMatrix *tmp = mat; mat = NULL; return tmp; }
|
||||
|
||||
void AddDomainIntegrator (BilinearFormIntegrator * bfi);
|
||||
/// Adds a domain integrator. Assumes ownership of @a bfi.
|
||||
void AddDomainIntegrator(BilinearFormIntegrator *bfi);
|
||||
|
||||
void AddBoundaryIntegrator (BilinearFormIntegrator * bfi);
|
||||
/// Adds a boundary integrator. Assumes ownership of @a bfi.
|
||||
void AddBoundaryIntegrator(BilinearFormIntegrator *bfi);
|
||||
|
||||
/** Add a trace face integrator. This type of integrator assembles terms
|
||||
over all faces of the mesh using the face FE from the trial space and the
|
||||
two adjacent volume FEs from the test space. */
|
||||
void AddTraceFaceIntegrator (BilinearFormIntegrator * bfi);
|
||||
/** @brief Add a trace face integrator. Assumes ownership of @a bfi.
|
||||
|
||||
This type of integrator assembles terms over all faces of the mesh using
|
||||
the face FE from the trial space and the two adjacent volume FEs from the
|
||||
test space. */
|
||||
void AddTraceFaceIntegrator(BilinearFormIntegrator *bfi);
|
||||
|
||||
/// Access all integrators added with AddDomainIntegrator().
|
||||
Array<BilinearFormIntegrator*> *GetDBFI() { return &dom; }
|
||||
|
||||
/// Access all integrators added with AddBoundaryIntegrator().
|
||||
Array<BilinearFormIntegrator*> *GetBBFI() { return &bdr; }
|
||||
|
||||
/// Access all integrators added with AddTraceFaceIntegrator().
|
||||
Array<BilinearFormIntegrator*> *GetTFBFI() { return &skt; }
|
||||
|
||||
void operator= (const double a) { *mat = a; }
|
||||
void operator=(const double a) { *mat = a; }
|
||||
|
||||
void Assemble (int skip_zeros = 1);
|
||||
void Assemble(int skip_zeros = 1);
|
||||
|
||||
/** For partially conforming trial and/or test FE spaces, complete the
|
||||
assembly process by performing A := P2^t A P1 where A is the internal
|
||||
@@ -460,10 +537,10 @@ public:
|
||||
void ConformingAssemble();
|
||||
|
||||
void EliminateTrialDofs(Array<int> &bdr_attr_is_ess,
|
||||
Vector &sol, Vector &rhs);
|
||||
const Vector &sol, Vector &rhs);
|
||||
|
||||
void EliminateEssentialBCFromTrialDofs(Array<int> &marked_vdofs,
|
||||
Vector &sol, Vector &rhs);
|
||||
const Vector &sol, Vector &rhs);
|
||||
|
||||
virtual void EliminateTestDofs(Array<int> &bdr_attr_is_ess);
|
||||
|
||||
@@ -505,19 +582,35 @@ public:
|
||||
*/
|
||||
class DiscreteLinearOperator : public MixedBilinearForm
|
||||
{
|
||||
private:
|
||||
/// Copy construction is not supported; body is undefined.
|
||||
DiscreteLinearOperator(const DiscreteLinearOperator &);
|
||||
|
||||
/// Copy assignment is not supported; body is undefined.
|
||||
DiscreteLinearOperator &operator=(const DiscreteLinearOperator &);
|
||||
|
||||
public:
|
||||
/** @brief Construct a DiscreteLinearOperator on the given
|
||||
FiniteElementSpace%s @a domain_fes and @a range_fes. */
|
||||
/** The pointers @a domain_fes and @a range_fes are not owned by the newly
|
||||
constructed object. */
|
||||
DiscreteLinearOperator(FiniteElementSpace *domain_fes,
|
||||
FiniteElementSpace *range_fes)
|
||||
: MixedBilinearForm(domain_fes, range_fes) { }
|
||||
|
||||
/// Adds a domain interpolator. Assumes ownership of @a di.
|
||||
void AddDomainInterpolator(DiscreteInterpolator *di)
|
||||
{ AddDomainIntegrator(di); }
|
||||
|
||||
/// Adds a trace face interpolator. Assumes ownership of @a di.
|
||||
void AddTraceFaceInterpolator(DiscreteInterpolator *di)
|
||||
{ AddTraceFaceIntegrator(di); }
|
||||
|
||||
/// Access all interpolators added with AddDomainInterpolator().
|
||||
Array<BilinearFormIntegrator*> *GetDI() { return &dom; }
|
||||
|
||||
/** @brief Construct the internal matrix representation of the discrete
|
||||
linear operator. */
|
||||
virtual void Assemble(int skip_zeros = 1);
|
||||
};
|
||||
|
||||
|
||||
+236
-55
@@ -962,8 +962,8 @@ void VectorMassIntegrator::AssembleElementMatrix
|
||||
|
||||
double norm;
|
||||
|
||||
// Get vdim from VQ, MQ, or the space dimension
|
||||
int vdim = (VQ) ? (VQ -> GetVDim()) : ((MQ) ? (MQ -> GetVDim()) : spaceDim);
|
||||
// If vdim is not set, set it to the space dimension
|
||||
vdim = (vdim == -1) ? spaceDim : vdim;
|
||||
|
||||
elmat.SetSize(nd*vdim);
|
||||
shape.SetSize(nd);
|
||||
@@ -1041,13 +1041,11 @@ void VectorMassIntegrator::AssembleElementMatrix2(
|
||||
{
|
||||
int tr_nd = trial_fe.GetDof();
|
||||
int te_nd = test_fe.GetDof();
|
||||
int dim = trial_fe.GetDim();
|
||||
int vdim;
|
||||
|
||||
double norm;
|
||||
|
||||
// Get vdim from the ElementTransformation Trans ?
|
||||
vdim = (VQ) ? (VQ -> GetVDim()) : ((MQ) ? (MQ -> GetVDim()) : (dim));
|
||||
// If vdim is not set, set it to the space dimension
|
||||
vdim = (vdim == -1) ? Trans.GetSpaceDim() : vdim;
|
||||
|
||||
elmat.SetSize(te_nd*vdim, tr_nd*vdim);
|
||||
shape.SetSize(tr_nd);
|
||||
@@ -1626,6 +1624,7 @@ void VectorCurlCurlIntegrator::AssembleElementMatrix(
|
||||
ir = &IntRules.Get(el.GetGeomType(), order);
|
||||
}
|
||||
|
||||
elmat.SetSize(dof*dim);
|
||||
elmat = 0.0;
|
||||
for (int i = 0; i < ir->GetNPoints(); i++)
|
||||
{
|
||||
@@ -2179,11 +2178,12 @@ void ElasticityIntegrator::AssembleElementMatrix(
|
||||
int dim = el.GetDim();
|
||||
double w, L, M;
|
||||
|
||||
MFEM_ASSERT(dim == Trans.GetSpaceDim(), "");
|
||||
|
||||
#ifdef MFEM_THREAD_SAFE
|
||||
DenseMatrix dshape(dof, dim), Jinv(dim), gshape(dof, dim), pelmat(dof);
|
||||
DenseMatrix dshape(dof, dim), gshape(dof, dim), pelmat(dof);
|
||||
Vector divshape(dim*dof);
|
||||
#else
|
||||
Jinv.SetSize(dim);
|
||||
dshape.SetSize(dof, dim);
|
||||
gshape.SetSize(dof, dim);
|
||||
pelmat.SetSize(dof);
|
||||
@@ -2209,8 +2209,7 @@ void ElasticityIntegrator::AssembleElementMatrix(
|
||||
|
||||
Trans.SetIntPoint(&ip);
|
||||
w = ip.weight * Trans.Weight();
|
||||
CalcInverse(Trans.Jacobian(), Jinv);
|
||||
Mult(dshape, Jinv, gshape);
|
||||
Mult(dshape, Trans.InverseJacobian(), gshape);
|
||||
MultAAt(gshape, pelmat);
|
||||
gshape.GradToDiv (divshape);
|
||||
|
||||
@@ -2245,14 +2244,184 @@ void ElasticityIntegrator::AssembleElementMatrix(
|
||||
{
|
||||
for (int k = 0; k < dof; k++)
|
||||
for (int l = 0; l < dof; l++)
|
||||
{
|
||||
elmat(dof*i+k, dof*j+l) +=
|
||||
(M * w) * gshape(k, j) * gshape(l, i);
|
||||
// + (L * w) * gshape(k, i) * gshape(l, j)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void ElasticityIntegrator::ComputeElementFlux(
|
||||
const mfem::FiniteElement &el, ElementTransformation &Trans,
|
||||
Vector &u, const mfem::FiniteElement &fluxelem, Vector &flux,
|
||||
int with_coef)
|
||||
{
|
||||
const int dof = el.GetDof();
|
||||
const int dim = el.GetDim();
|
||||
const int tdim = dim*(dim+1)/2; // num. entries in a symmetric tensor
|
||||
double L, M;
|
||||
|
||||
MFEM_ASSERT(dim == 2 || dim == 3,
|
||||
"dimension is not supported: dim = " << dim);
|
||||
MFEM_ASSERT(dim == Trans.GetSpaceDim(), "");
|
||||
MFEM_ASSERT(fluxelem.GetMapType() == FiniteElement::VALUE, "");
|
||||
MFEM_ASSERT(dynamic_cast<const NodalFiniteElement*>(&fluxelem), "");
|
||||
|
||||
#ifdef MFEM_THREAD_SAFE
|
||||
DenseMatrix dshape(dof, dim);
|
||||
#else
|
||||
dshape.SetSize(dof, dim);
|
||||
#endif
|
||||
|
||||
double gh_data[9], grad_data[9];
|
||||
DenseMatrix gh(gh_data, dim, dim);
|
||||
DenseMatrix grad(grad_data, dim, dim);
|
||||
|
||||
const IntegrationRule &ir = fluxelem.GetNodes();
|
||||
const int fnd = ir.GetNPoints();
|
||||
flux.SetSize(fnd * tdim);
|
||||
|
||||
DenseMatrix loc_data_mat(u.GetData(), dof, dim);
|
||||
for (int i = 0; i < fnd; i++)
|
||||
{
|
||||
const IntegrationPoint &ip = ir.IntPoint(i);
|
||||
el.CalcDShape(ip, dshape);
|
||||
MultAtB(loc_data_mat, dshape, gh);
|
||||
|
||||
Trans.SetIntPoint(&ip);
|
||||
Mult(gh, Trans.InverseJacobian(), grad);
|
||||
|
||||
M = mu->Eval(Trans, ip);
|
||||
if (lambda)
|
||||
{
|
||||
L = lambda->Eval(Trans, ip);
|
||||
}
|
||||
else
|
||||
{
|
||||
L = q_lambda * M;
|
||||
M = q_mu * M;
|
||||
}
|
||||
|
||||
// stress = 2*M*e(u) + L*tr(e(u))*I, where
|
||||
// e(u) = (1/2)*(grad(u) + grad(u)^T)
|
||||
const double M2 = 2.0*M;
|
||||
if (dim == 2)
|
||||
{
|
||||
L *= (grad(0,0) + grad(1,1));
|
||||
// order of the stress entries: s_xx, s_yy, s_xy
|
||||
flux(i+fnd*0) = M2*grad(0,0) + L;
|
||||
flux(i+fnd*1) = M2*grad(1,1) + L;
|
||||
flux(i+fnd*2) = M*(grad(0,1) + grad(1,0));
|
||||
}
|
||||
else if (dim == 3)
|
||||
{
|
||||
L *= (grad(0,0) + grad(1,1) + grad(2,2));
|
||||
// order of the stress entries: s_xx, s_yy, s_zz, s_xy, s_xz, s_yz
|
||||
flux(i+fnd*0) = M2*grad(0,0) + L;
|
||||
flux(i+fnd*1) = M2*grad(1,1) + L;
|
||||
flux(i+fnd*2) = M2*grad(2,2) + L;
|
||||
flux(i+fnd*3) = M*(grad(0,1) + grad(1,0));
|
||||
flux(i+fnd*4) = M*(grad(0,2) + grad(2,0));
|
||||
flux(i+fnd*5) = M*(grad(1,2) + grad(2,1));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
double ElasticityIntegrator::ComputeFluxEnergy(const FiniteElement &fluxelem,
|
||||
ElementTransformation &Trans,
|
||||
Vector &flux, Vector *d_energy)
|
||||
{
|
||||
const int dof = fluxelem.GetDof();
|
||||
const int dim = fluxelem.GetDim();
|
||||
const int tdim = dim*(dim+1)/2; // num. entries in a symmetric tensor
|
||||
double L, M;
|
||||
|
||||
// The MFEM_ASSERT constraints in ElasticityIntegrator::ComputeElementFlux
|
||||
// are assumed here too.
|
||||
MFEM_ASSERT(d_energy == NULL, "anisotropic estimates are not supported");
|
||||
MFEM_ASSERT(flux.Size() == dof*tdim, "invalid 'flux' vector");
|
||||
|
||||
#ifndef MFEM_THREAD_SAFE
|
||||
shape.SetSize(dof);
|
||||
#else
|
||||
Vector shape(dof);
|
||||
#endif
|
||||
double pointstress_data[6];
|
||||
Vector pointstress(pointstress_data, tdim);
|
||||
|
||||
// View of the 'flux' vector as a (dof x tdim) matrix
|
||||
DenseMatrix flux_mat(flux.GetData(), dof, tdim);
|
||||
|
||||
// Use the same integration rule as in AssembleElementMatrix, replacing 'el'
|
||||
// with 'fluxelem' when 'IntRule' is not set.
|
||||
// Should we be using a different (more accurate) rule here?
|
||||
const IntegrationRule *ir = IntRule;
|
||||
if (ir == NULL)
|
||||
{
|
||||
int order = 2 * Trans.OrderGrad(&fluxelem);
|
||||
ir = &IntRules.Get(fluxelem.GetGeomType(), order);
|
||||
}
|
||||
|
||||
double energy = 0.0;
|
||||
|
||||
for (int i = 0; i < ir->GetNPoints(); i++)
|
||||
{
|
||||
const IntegrationPoint &ip = ir->IntPoint(i);
|
||||
fluxelem.CalcShape(ip, shape);
|
||||
|
||||
flux_mat.MultTranspose(shape, pointstress);
|
||||
|
||||
Trans.SetIntPoint(&ip);
|
||||
double w = Trans.Weight() * ip.weight;
|
||||
|
||||
M = mu->Eval(Trans, ip);
|
||||
if (lambda)
|
||||
{
|
||||
L = lambda->Eval(Trans, ip);
|
||||
}
|
||||
else
|
||||
{
|
||||
L = q_lambda * M;
|
||||
M = q_mu * M;
|
||||
}
|
||||
|
||||
// The strain energy density at a point is given by (1/2)*(s : e) where s
|
||||
// and e are the stress and strain tensors, respectively. Since we only
|
||||
// have the stress, we need to compute the strain from the stress:
|
||||
// s = 2*mu*e + lambda*tr(e)*I
|
||||
// Taking trace on both sides we find:
|
||||
// tr(s) = 2*mu*tr(e) + lambda*tr(e)*dim = (2*mu + dim*lambda)*tr(e)
|
||||
// which gives:
|
||||
// tr(e) = tr(s)/(2*mu + dim*lambda)
|
||||
// Then from the first identity above we can find the strain:
|
||||
// e = (1/(2*mu))*(s - lambda*tr(e)*I)
|
||||
|
||||
double pt_e; // point strain energy density
|
||||
const double *s = pointstress_data;
|
||||
if (dim == 2)
|
||||
{
|
||||
// s entries: s_xx, s_yy, s_xy
|
||||
const double tr_e = (s[0] + s[1])/(2*(M + L));
|
||||
L *= tr_e;
|
||||
pt_e = (0.25/M)*(s[0]*(s[0] - L) + s[1]*(s[1] - L) + 2*s[2]*s[2]);
|
||||
}
|
||||
else // (dim == 3)
|
||||
{
|
||||
// s entries: s_xx, s_yy, s_zz, s_xy, s_xz, s_yz
|
||||
const double tr_e = (s[0] + s[1] + s[2])/(2*M + 3*L);
|
||||
L *= tr_e;
|
||||
pt_e = (0.25/M)*(s[0]*(s[0] - L) + s[1]*(s[1] - L) + s[2]*(s[2] - L) +
|
||||
2*(s[3]*s[3] + s[4]*s[4] + s[5]*s[5]));
|
||||
}
|
||||
|
||||
energy += w * pt_e;
|
||||
}
|
||||
|
||||
return energy;
|
||||
}
|
||||
|
||||
void DGTraceIntegrator::AssembleFaceMatrix(const FiniteElement &el1,
|
||||
const FiniteElement &el2,
|
||||
FaceElementTransformations &Trans,
|
||||
@@ -3046,32 +3215,38 @@ void NormalInterpolator::AssembleElementMatrix2(
|
||||
}
|
||||
|
||||
|
||||
namespace internal
|
||||
{
|
||||
|
||||
// Scalar shape functions scaled by scalar coefficient.
|
||||
// Used in the implementation of class ScalarProductInterpolator below.
|
||||
struct ShapeCoefficient : public VectorCoefficient
|
||||
{
|
||||
Coefficient &Q;
|
||||
const FiniteElement &fe;
|
||||
|
||||
ShapeCoefficient(Coefficient &q, const FiniteElement &fe_)
|
||||
: VectorCoefficient(fe_.GetDof()), Q(q), fe(fe_) { }
|
||||
|
||||
using VectorCoefficient::Eval;
|
||||
virtual void Eval(Vector &V, ElementTransformation &T,
|
||||
const IntegrationPoint &ip)
|
||||
{
|
||||
V.SetSize(vdim);
|
||||
fe.CalcPhysShape(T, V);
|
||||
V *= Q.Eval(T, ip);
|
||||
}
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
void
|
||||
ScalarProductInterpolator::AssembleElementMatrix2(const FiniteElement &dom_fe,
|
||||
const FiniteElement &ran_fe,
|
||||
ElementTransformation &Trans,
|
||||
DenseMatrix &elmat)
|
||||
{
|
||||
// Scalar shape functions scaled by scalar coefficient
|
||||
struct ShapeCoefficient : public VectorCoefficient
|
||||
{
|
||||
Coefficient &Q;
|
||||
const FiniteElement &fe;
|
||||
|
||||
ShapeCoefficient(Coefficient &q, const FiniteElement &fe_)
|
||||
: VectorCoefficient(fe_.GetDof()), Q(q), fe(fe_) { }
|
||||
|
||||
using VectorCoefficient::Eval;
|
||||
virtual void Eval(Vector &V, ElementTransformation &T,
|
||||
const IntegrationPoint &ip)
|
||||
{
|
||||
V.SetSize(vdim);
|
||||
fe.CalcPhysShape(T, V);
|
||||
V *= Q.Eval(T, ip);
|
||||
}
|
||||
};
|
||||
|
||||
ShapeCoefficient dom_shape_coeff(Q, dom_fe);
|
||||
internal::ShapeCoefficient dom_shape_coeff(Q, dom_fe);
|
||||
|
||||
elmat.SetSize(ran_fe.GetDof(),dom_fe.GetDof());
|
||||
|
||||
@@ -3208,6 +3383,35 @@ VectorCrossProductInterpolator::AssembleElementMatrix2(
|
||||
}
|
||||
|
||||
|
||||
namespace internal
|
||||
{
|
||||
|
||||
// Vector shape functions dot product with a vector coefficient.
|
||||
// Used in the implementation of class VectorInnerProductInterpolator below.
|
||||
struct VDotVShapeCoefficient : public VectorCoefficient
|
||||
{
|
||||
VectorCoefficient &VQ;
|
||||
const FiniteElement &fe;
|
||||
DenseMatrix vshape;
|
||||
Vector vc;
|
||||
|
||||
VDotVShapeCoefficient(VectorCoefficient &vq, const FiniteElement &fe_)
|
||||
: VectorCoefficient(fe_.GetDof()), VQ(vq), fe(fe_),
|
||||
vshape(vdim, vq.GetVDim()), vc(vq.GetVDim()) { }
|
||||
|
||||
using VectorCoefficient::Eval;
|
||||
virtual void Eval(Vector &V, ElementTransformation &T,
|
||||
const IntegrationPoint &ip)
|
||||
{
|
||||
V.SetSize(vdim);
|
||||
VQ.Eval(vc, T, ip);
|
||||
fe.CalcPhysVShape(T, vshape);
|
||||
vshape.Mult(vc, V);
|
||||
}
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
void
|
||||
VectorInnerProductInterpolator::AssembleElementMatrix2(
|
||||
const FiniteElement &dom_fe,
|
||||
@@ -3215,30 +3419,7 @@ VectorInnerProductInterpolator::AssembleElementMatrix2(
|
||||
ElementTransformation &Trans,
|
||||
DenseMatrix &elmat)
|
||||
{
|
||||
// Vector shape functions dot product with a vector coefficient
|
||||
struct VDotVShapeCoefficient : public VectorCoefficient
|
||||
{
|
||||
VectorCoefficient &VQ;
|
||||
const FiniteElement &fe;
|
||||
DenseMatrix vshape;
|
||||
Vector vc;
|
||||
|
||||
VDotVShapeCoefficient(VectorCoefficient &vq, const FiniteElement &fe_)
|
||||
: VectorCoefficient(fe_.GetDof()), VQ(vq), fe(fe_),
|
||||
vshape(vdim, vq.GetVDim()), vc(vq.GetVDim()) { }
|
||||
|
||||
using VectorCoefficient::Eval;
|
||||
virtual void Eval(Vector &V, ElementTransformation &T,
|
||||
const IntegrationPoint &ip)
|
||||
{
|
||||
V.SetSize(vdim);
|
||||
VQ.Eval(vc, T, ip);
|
||||
fe.CalcPhysVShape(T, vshape);
|
||||
vshape.Mult(vc, V);
|
||||
}
|
||||
};
|
||||
|
||||
VDotVShapeCoefficient dom_shape_coeff(VQ, dom_fe);
|
||||
internal::VDotVShapeCoefficient dom_shape_coeff(VQ, dom_fe);
|
||||
|
||||
elmat.SetSize(ran_fe.GetDof(),dom_fe.GetDof());
|
||||
|
||||
|
||||
+86
-6
@@ -69,12 +69,60 @@ public:
|
||||
const Vector &elfun, DenseMatrix &elmat)
|
||||
{ AssembleFaceMatrix(el1, el2, Tr, elmat); }
|
||||
|
||||
/** @brief Virtual method required for Zienkiewicz-Zhu type error estimators.
|
||||
|
||||
The purpose of the method is to compute a local "flux" finite element
|
||||
function given a local finite element solution. The "flux" function has
|
||||
to be computed in terms of its coefficients (represented by the Vector
|
||||
@a flux) which multiply the basis functions defined by the FiniteElement
|
||||
@a fluxelem. Typically, the "flux" function will have more than one
|
||||
component and consequently @a flux should be store the coefficients of
|
||||
all components: first all coefficient for component 0, then all
|
||||
coefficients for component 1, etc. What the "flux" function represents
|
||||
depends on the specific integrator. For example, in the case of
|
||||
DiffusionIntegrator, the flux is the gradient of the solution multiplied
|
||||
by the diffusion coefficient.
|
||||
|
||||
@param[in] el FiniteElement of the solution.
|
||||
@param[in] Trans The ElementTransformation describing the physical
|
||||
position of the mesh element.
|
||||
@param[in] u Solution coefficients representing the expansion of the
|
||||
solution function in the basis of @a el.
|
||||
@param[in] fluxelem FiniteElement of the "flux".
|
||||
@param[out] flux "Flux" coefficients representing the expansion of the
|
||||
"flux" function in the basis of @a fluxelem. The size
|
||||
of @a flux as a Vector has to be set by this method,
|
||||
e.g. using Vector::SetSize().
|
||||
@param[in] with_coef If zero (the default value is 1) the implementation
|
||||
of the method may choose not to scale the "flux"
|
||||
function by any coefficients describing the
|
||||
integrator.
|
||||
*/
|
||||
virtual void ComputeElementFlux(const FiniteElement &el,
|
||||
ElementTransformation &Trans,
|
||||
Vector &u,
|
||||
const FiniteElement &fluxelem,
|
||||
Vector &flux, int with_coef = 1) { }
|
||||
|
||||
/** @brief Virtual method required for Zienkiewicz-Zhu type error estimators.
|
||||
|
||||
The purpose of this method is to compute a local number that measures the
|
||||
energy of a given "flux" function (see ComputeElementFlux() for a
|
||||
description of the "flux" function). Typically, the energy of a "flux"
|
||||
function should be equal to a_local(u,u), if the "flux" is defined from
|
||||
a solution u; here a_local(.,.) denotes the element-local bilinear
|
||||
form represented by the integrator.
|
||||
|
||||
@param[in] fluxelem FiniteElement of the "flux".
|
||||
@param[in] Trans The ElementTransformation describing the physical
|
||||
position of the mesh element.
|
||||
@param[in] flux "Flux" coefficients representing the expansion of the
|
||||
"flux" function in the basis of @a fluxelem.
|
||||
@param[out] d_energy If not NULL, the given Vector should be set to
|
||||
represent directional energy split that can be used
|
||||
for anisotropic error estimation.
|
||||
@returns The computed energy.
|
||||
*/
|
||||
virtual double ComputeFluxEnergy(const FiniteElement &fluxelem,
|
||||
ElementTransformation &Trans,
|
||||
Vector &flux, Vector *d_energy = NULL)
|
||||
@@ -1706,6 +1754,7 @@ public:
|
||||
class VectorMassIntegrator: public BilinearFormIntegrator
|
||||
{
|
||||
private:
|
||||
int vdim;
|
||||
Vector shape, te_shape, vec;
|
||||
DenseMatrix partelmat;
|
||||
DenseMatrix mcoeff;
|
||||
@@ -1718,22 +1767,25 @@ private:
|
||||
public:
|
||||
/// Construct an integrator with coefficient 1.0
|
||||
VectorMassIntegrator()
|
||||
{ Q = NULL; VQ = NULL; MQ = NULL; Q_order = 0; }
|
||||
: vdim(-1), Q(NULL), VQ(NULL), MQ(NULL), Q_order(0) { }
|
||||
/** Construct an integrator with scalar coefficient q.
|
||||
If possible, save memory by using a scalar integrator since
|
||||
the resulting matrix is block diagonal with the same diagonal
|
||||
block repeated. */
|
||||
VectorMassIntegrator(Coefficient &q, int qo = 0)
|
||||
: Q(&q) { VQ = NULL; MQ = NULL; Q_order = qo; }
|
||||
: vdim(-1), Q(&q) { VQ = NULL; MQ = NULL; Q_order = qo; }
|
||||
VectorMassIntegrator(Coefficient &q, const IntegrationRule *ir)
|
||||
: BilinearFormIntegrator(ir), Q(&q)
|
||||
: BilinearFormIntegrator(ir), vdim(-1), Q(&q)
|
||||
{ VQ = NULL; MQ = NULL; Q_order = 0; }
|
||||
/// Construct an integrator with diagonal coefficient q
|
||||
VectorMassIntegrator(VectorCoefficient &q, int qo = 0)
|
||||
: VQ(&q) { Q = NULL; MQ = NULL; Q_order = qo; }
|
||||
: vdim(q.GetVDim()), VQ(&q) { Q = NULL; MQ = NULL; Q_order = qo; }
|
||||
/// Construct an integrator with matrix coefficient q
|
||||
VectorMassIntegrator(MatrixCoefficient &q, int qo = 0)
|
||||
: MQ(&q) { Q = NULL; VQ = NULL; Q_order = qo; }
|
||||
: vdim(q.GetVDim()), MQ(&q) { Q = NULL; VQ = NULL; Q_order = qo; }
|
||||
|
||||
int GetVDim() const { return vdim; }
|
||||
void SetVDim(int vdim) { this->vdim = vdim; }
|
||||
|
||||
virtual void AssembleElementMatrix(const FiniteElement &el,
|
||||
ElementTransformation &Trans,
|
||||
@@ -2018,7 +2070,8 @@ private:
|
||||
Coefficient *lambda, *mu;
|
||||
|
||||
#ifndef MFEM_THREAD_SAFE
|
||||
DenseMatrix dshape, Jinv, gshape, pelmat;
|
||||
Vector shape;
|
||||
DenseMatrix dshape, gshape, pelmat;
|
||||
Vector divshape;
|
||||
#endif
|
||||
|
||||
@@ -2033,6 +2086,33 @@ public:
|
||||
virtual void AssembleElementMatrix(const FiniteElement &,
|
||||
ElementTransformation &,
|
||||
DenseMatrix &);
|
||||
|
||||
/** Compute the stress corresponding to the local displacement @a u and
|
||||
interpolate it at the nodes of the given @a fluxelem. Only the symmetric
|
||||
part of the stress is stored, so that the size of @a flux is equal to
|
||||
the number of DOFs in @a fluxelem times dim*(dim+1)/2. In 2D, the order
|
||||
of the stress components is: s_xx, s_yy, s_xy. In 3D, it is: s_xx, s_yy,
|
||||
s_zz, s_xy, s_xz, s_yz. In other words, @a flux is the local vector for
|
||||
a FE space with dim*(dim+1)/2 vector components, based on the finite
|
||||
element @a fluxelem. */
|
||||
virtual void ComputeElementFlux(const FiniteElement &el,
|
||||
ElementTransformation &Trans,
|
||||
Vector &u,
|
||||
const FiniteElement &fluxelem,
|
||||
Vector &flux, int with_coef = 1);
|
||||
|
||||
/** Compute the element energy (integral of the strain energy density)
|
||||
corresponding to the stress represented by @a flux which is a vector of
|
||||
coefficients multiplying the basis functions defined by @a fluxelem. In
|
||||
other words, @a flux is the local vector for a FE space with
|
||||
dim*(dim+1)/2 vector components, based on the finite element @a fluxelem.
|
||||
The number of components, dim*(dim+1)/2 is such that it represents the
|
||||
symmetric part of the (symmetric) stress tensor. The order of the
|
||||
components is: s_xx, s_yy, s_xy in 2D, and s_xx, s_yy, s_zz, s_xy, s_xz,
|
||||
s_yz in 3D. */
|
||||
virtual double ComputeFluxEnergy(const FiniteElement &fluxelem,
|
||||
ElementTransformation &Trans,
|
||||
Vector &flux, Vector *d_energy = NULL);
|
||||
};
|
||||
|
||||
/** Integrator for the DG form:
|
||||
|
||||
+280
-3
@@ -87,7 +87,6 @@ double DeltaCoefficient::EvalDelta(ElementTransformation &T,
|
||||
return weight ? weight->Eval(T, ip, GetTime())*w : w;
|
||||
}
|
||||
|
||||
|
||||
void VectorCoefficient::Eval(DenseMatrix &M, ElementTransformation &T,
|
||||
const IntegrationRule &ir)
|
||||
{
|
||||
@@ -153,11 +152,17 @@ void VectorArrayCoefficient::Eval(Vector &V, ElementTransformation &T,
|
||||
}
|
||||
|
||||
VectorGridFunctionCoefficient::VectorGridFunctionCoefficient (
|
||||
GridFunction *gf) : VectorCoefficient (gf -> VectorDim())
|
||||
GridFunction *gf)
|
||||
: VectorCoefficient ((gf) ? gf -> VectorDim() : 0)
|
||||
{
|
||||
GridFunc = gf;
|
||||
}
|
||||
|
||||
void VectorGridFunctionCoefficient::SetGridFunction(GridFunction *gf)
|
||||
{
|
||||
GridFunc = gf; vdim = (gf) ? gf -> VectorDim() : 0;
|
||||
}
|
||||
|
||||
void VectorGridFunctionCoefficient::Eval(Vector &V, ElementTransformation &T,
|
||||
const IntegrationPoint &ip)
|
||||
{
|
||||
@@ -170,6 +175,64 @@ void VectorGridFunctionCoefficient::Eval(
|
||||
GridFunc->GetVectorValues(T, ir, M);
|
||||
}
|
||||
|
||||
GradientGridFunctionCoefficient::GradientGridFunctionCoefficient (
|
||||
GridFunction *gf)
|
||||
: VectorCoefficient((gf) ?
|
||||
gf -> FESpace() -> GetMesh() -> SpaceDimension() : 0)
|
||||
{
|
||||
GridFunc = gf;
|
||||
}
|
||||
|
||||
void GradientGridFunctionCoefficient::SetGridFunction(GridFunction *gf)
|
||||
{
|
||||
GridFunc = gf; vdim = (gf) ?
|
||||
gf -> FESpace() -> GetMesh() -> SpaceDimension() : 0;
|
||||
}
|
||||
|
||||
void GradientGridFunctionCoefficient::Eval(Vector &V, ElementTransformation &T,
|
||||
const IntegrationPoint &ip)
|
||||
{
|
||||
GridFunc->GetGradient(T, V);
|
||||
}
|
||||
|
||||
void GradientGridFunctionCoefficient::Eval(
|
||||
DenseMatrix &M, ElementTransformation &T, const IntegrationRule &ir)
|
||||
{
|
||||
GridFunc->GetGradients(T, ir, M);
|
||||
}
|
||||
|
||||
CurlGridFunctionCoefficient::CurlGridFunctionCoefficient (
|
||||
GridFunction *gf)
|
||||
: VectorCoefficient ((gf) ?
|
||||
gf -> FESpace() -> GetMesh() -> SpaceDimension() : 0)
|
||||
{
|
||||
GridFunc = gf;
|
||||
}
|
||||
|
||||
void CurlGridFunctionCoefficient::SetGridFunction(GridFunction *gf)
|
||||
{
|
||||
GridFunc = gf; vdim = (gf) ?
|
||||
gf -> FESpace() -> GetMesh() -> SpaceDimension() : 0;
|
||||
}
|
||||
|
||||
void CurlGridFunctionCoefficient::Eval(Vector &V, ElementTransformation &T,
|
||||
const IntegrationPoint &ip)
|
||||
{
|
||||
GridFunc->GetCurl(T, V);
|
||||
}
|
||||
|
||||
DivergenceGridFunctionCoefficient::DivergenceGridFunctionCoefficient (
|
||||
GridFunction *gf) : Coefficient()
|
||||
{
|
||||
GridFunc = gf;
|
||||
}
|
||||
|
||||
double DivergenceGridFunctionCoefficient::Eval(ElementTransformation &T,
|
||||
const IntegrationPoint &ip)
|
||||
{
|
||||
return GridFunc->GetDivergence(T);
|
||||
}
|
||||
|
||||
void VectorDeltaCoefficient::SetDirection(const Vector &_d)
|
||||
{
|
||||
dir = _d;
|
||||
@@ -209,7 +272,7 @@ void VectorRestrictedCoefficient::Eval(
|
||||
}
|
||||
else
|
||||
{
|
||||
M.SetSize(vdim);
|
||||
M.SetSize(vdim, ir.GetNPoints());
|
||||
M = 0.0;
|
||||
}
|
||||
}
|
||||
@@ -287,6 +350,220 @@ void MatrixRestrictedCoefficient::Eval(DenseMatrix &K, ElementTransformation &T,
|
||||
}
|
||||
}
|
||||
|
||||
InnerProductCoefficient::InnerProductCoefficient(VectorCoefficient &A,
|
||||
VectorCoefficient &B)
|
||||
: a(&A), b(&B)
|
||||
{
|
||||
MFEM_ASSERT(A.GetVDim() == B.GetVDim(),
|
||||
"InnerProductCoefficient: "
|
||||
"Arguments have incompatible dimensions.");
|
||||
}
|
||||
|
||||
double InnerProductCoefficient::Eval(ElementTransformation &T,
|
||||
const IntegrationPoint &ip)
|
||||
{
|
||||
a->Eval(va, T, ip);
|
||||
b->Eval(vb, T, ip);
|
||||
return va * vb;
|
||||
}
|
||||
|
||||
VectorRotProductCoefficient::VectorRotProductCoefficient(VectorCoefficient &A,
|
||||
VectorCoefficient &B)
|
||||
: a(&A), b(&B), va(A.GetVDim()), vb(B.GetVDim())
|
||||
{
|
||||
MFEM_ASSERT(A.GetVDim() == 2 && B.GetVDim() == 2,
|
||||
"VectorRotProductCoefficient: "
|
||||
"Arguments must have dimension equal to two.");
|
||||
}
|
||||
|
||||
double VectorRotProductCoefficient::Eval(ElementTransformation &T,
|
||||
const IntegrationPoint &ip)
|
||||
{
|
||||
a->Eval(va, T, ip);
|
||||
b->Eval(vb, T, ip);
|
||||
return va[0] * vb[1] - va[1] * vb[0];
|
||||
}
|
||||
|
||||
DeterminantCoefficient::DeterminantCoefficient(MatrixCoefficient &A)
|
||||
: a(&A), ma(A.GetHeight(), A.GetWidth())
|
||||
{
|
||||
MFEM_ASSERT(A.GetHeight() == A.GetWidth(),
|
||||
"DeterminantCoefficient: "
|
||||
"Argument must be a square matrix.");
|
||||
}
|
||||
|
||||
double DeterminantCoefficient::Eval(ElementTransformation &T,
|
||||
const IntegrationPoint &ip)
|
||||
{
|
||||
a->Eval(ma, T, ip);
|
||||
return ma.Det();
|
||||
}
|
||||
|
||||
VectorSumCoefficient::VectorSumCoefficient(VectorCoefficient &A,
|
||||
VectorCoefficient &B,
|
||||
double _alpha, double _beta)
|
||||
: VectorCoefficient(A.GetVDim()), a(&A), b(&B), alpha(_alpha), beta(_beta),
|
||||
va(A.GetVDim())
|
||||
{
|
||||
MFEM_ASSERT(A.GetVDim() == B.GetVDim(),
|
||||
"VectorSumCoefficient: "
|
||||
"Arguments must have the same dimension.");
|
||||
}
|
||||
|
||||
void VectorSumCoefficient::Eval(Vector &V, ElementTransformation &T,
|
||||
const IntegrationPoint &ip)
|
||||
{
|
||||
b->Eval(V, T, ip);
|
||||
if ( beta != 1.0 ) { V *= beta; }
|
||||
a->Eval(va, T, ip);
|
||||
V.Add(alpha, va);
|
||||
}
|
||||
|
||||
ScalarVectorProductCoefficient::ScalarVectorProductCoefficient(
|
||||
Coefficient &A,
|
||||
VectorCoefficient &B)
|
||||
: VectorCoefficient(B.GetVDim()), a(&A), b(&B)
|
||||
{}
|
||||
|
||||
void ScalarVectorProductCoefficient::Eval(Vector &V, ElementTransformation &T,
|
||||
const IntegrationPoint &ip)
|
||||
{
|
||||
double sa = a->Eval(T, ip);
|
||||
b->Eval(V, T, ip);
|
||||
V *= sa;
|
||||
}
|
||||
|
||||
VectorCrossProductCoefficient::VectorCrossProductCoefficient(
|
||||
VectorCoefficient &A,
|
||||
VectorCoefficient &B)
|
||||
: VectorCoefficient(3), a(&A), b(&B), va(A.GetVDim()), vb(B.GetVDim())
|
||||
{
|
||||
MFEM_ASSERT(A.GetVDim() == 3 && B.GetVDim() == 3,
|
||||
"VectorCrossProductCoefficient: "
|
||||
"Arguments must have dimension equal to three.");
|
||||
}
|
||||
|
||||
void VectorCrossProductCoefficient::Eval(Vector &V, ElementTransformation &T,
|
||||
const IntegrationPoint &ip)
|
||||
{
|
||||
a->Eval(va, T, ip);
|
||||
b->Eval(vb, T, ip);
|
||||
V.SetSize(3);
|
||||
V[0] = va[1] * vb[2] - va[2] * vb[1];
|
||||
V[1] = va[2] * vb[0] - va[0] * vb[2];
|
||||
V[2] = va[0] * vb[1] - va[1] * vb[0];
|
||||
}
|
||||
|
||||
MatVecCoefficient::MatVecCoefficient(MatrixCoefficient &A,
|
||||
VectorCoefficient &B)
|
||||
: VectorCoefficient(A.GetHeight()), a(&A), b(&B),
|
||||
ma(A.GetHeight(), A.GetWidth()), vb(B.GetVDim())
|
||||
{
|
||||
MFEM_ASSERT(A.GetWidth() == B.GetVDim(),
|
||||
"MatVecCoefficient: Arguments have incompatible dimensions.");
|
||||
}
|
||||
|
||||
void MatVecCoefficient::Eval(Vector &V, ElementTransformation &T,
|
||||
const IntegrationPoint &ip)
|
||||
{
|
||||
a->Eval(ma, T, ip);
|
||||
b->Eval(vb, T, ip);
|
||||
ma.Mult(vb, V);
|
||||
}
|
||||
|
||||
void IdentityMatrixCoefficient::Eval(DenseMatrix &M, ElementTransformation &T,
|
||||
const IntegrationPoint &ip)
|
||||
{
|
||||
M.SetSize(dim);
|
||||
M = 0.0;
|
||||
for (int d=0; d<dim; d++) { M(d,d) = 1.0; }
|
||||
}
|
||||
|
||||
MatrixSumCoefficient::MatrixSumCoefficient(MatrixCoefficient &A,
|
||||
MatrixCoefficient &B,
|
||||
double _alpha, double _beta)
|
||||
: MatrixCoefficient(A.GetHeight(), A.GetWidth()),
|
||||
a(&A), b(&B), alpha(_alpha), beta(_beta),
|
||||
ma(A.GetHeight(), A.GetWidth())
|
||||
{
|
||||
MFEM_ASSERT(A.GetHeight() == B.GetHeight() && A.GetWidth() == B.GetWidth(),
|
||||
"MatrixSumCoefficient: "
|
||||
"Arguments must have the same dimensions.");
|
||||
}
|
||||
|
||||
void MatrixSumCoefficient::Eval(DenseMatrix &M, ElementTransformation &T,
|
||||
const IntegrationPoint &ip)
|
||||
{
|
||||
b->Eval(M, T, ip);
|
||||
if ( beta != 1.0 ) { M *= beta; }
|
||||
a->Eval(ma, T, ip);
|
||||
M.Add(alpha, ma);
|
||||
}
|
||||
|
||||
ScalarMatrixProductCoefficient::ScalarMatrixProductCoefficient(
|
||||
Coefficient &A,
|
||||
MatrixCoefficient &B)
|
||||
: MatrixCoefficient(B.GetHeight(), B.GetWidth()), a(&A), b(&B)
|
||||
{}
|
||||
|
||||
void ScalarMatrixProductCoefficient::Eval(DenseMatrix &M,
|
||||
ElementTransformation &T,
|
||||
const IntegrationPoint &ip)
|
||||
{
|
||||
double sa = a->Eval(T, ip);
|
||||
b->Eval(M, T, ip);
|
||||
M *= sa;
|
||||
}
|
||||
|
||||
TransposeMatrixCoefficient::TransposeMatrixCoefficient(MatrixCoefficient &A)
|
||||
: MatrixCoefficient(A.GetWidth(), A.GetHeight()), a(&A)
|
||||
{}
|
||||
|
||||
void TransposeMatrixCoefficient::Eval(DenseMatrix &M,
|
||||
ElementTransformation &T,
|
||||
const IntegrationPoint &ip)
|
||||
{
|
||||
a->Eval(M, T, ip);
|
||||
M.Transpose();
|
||||
}
|
||||
|
||||
InverseMatrixCoefficient::InverseMatrixCoefficient(MatrixCoefficient &A)
|
||||
: MatrixCoefficient(A.GetHeight(), A.GetWidth()), a(&A)
|
||||
{
|
||||
MFEM_ASSERT(A.GetHeight() == A.GetWidth(),
|
||||
"InverseMatrixCoefficient: "
|
||||
"Argument must be a square matrix.");
|
||||
}
|
||||
|
||||
void InverseMatrixCoefficient::Eval(DenseMatrix &M,
|
||||
ElementTransformation &T,
|
||||
const IntegrationPoint &ip)
|
||||
{
|
||||
a->Eval(M, T, ip);
|
||||
M.Invert();
|
||||
}
|
||||
|
||||
OuterProductCoefficient::OuterProductCoefficient(VectorCoefficient &A,
|
||||
VectorCoefficient &B)
|
||||
: MatrixCoefficient(A.GetVDim(), B.GetVDim()), a(&A), b(&B),
|
||||
va(A.GetVDim()), vb(B.GetVDim())
|
||||
{}
|
||||
|
||||
void OuterProductCoefficient::Eval(DenseMatrix &M, ElementTransformation &T,
|
||||
const IntegrationPoint &ip)
|
||||
{
|
||||
a->Eval(va, T, ip);
|
||||
b->Eval(vb, T, ip);
|
||||
M.SetSize(va.Size(), vb.Size());
|
||||
for (int i=0; i<va.Size(); i++)
|
||||
{
|
||||
for (int j=0; j<vb.Size(); j++)
|
||||
{
|
||||
M(i, j) = va[i] * vb[j];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
double LpNormLoop(double p, Coefficient &coeff, Mesh &mesh,
|
||||
const IntegrationRule *irs[])
|
||||
{
|
||||
|
||||
+368
-6
@@ -39,9 +39,19 @@ public:
|
||||
void SetTime(double t) { time = t; }
|
||||
double GetTime() { return time; }
|
||||
|
||||
/** @brief Evaluate the coefficient in the element described by @a T at the
|
||||
point @a ip. */
|
||||
/** @note When this method is called, the caller must make sure that the
|
||||
IntegrationPoint associated with @a T is the same as @a ip. This can be
|
||||
achieved by calling T.SetIntPoint(&ip). */
|
||||
virtual double Eval(ElementTransformation &T,
|
||||
const IntegrationPoint &ip) = 0;
|
||||
|
||||
/** @brief Evaluate the coefficient in the element described by @a T at the
|
||||
point @a ip at time @a t. */
|
||||
/** @note When this method is called, the caller must make sure that the
|
||||
IntegrationPoint associated with @a T is the same as @a ip. This can be
|
||||
achieved by calling T.SetIntPoint(&ip). */
|
||||
double Eval(ElementTransformation &T,
|
||||
const IntegrationPoint &ip, double t)
|
||||
{
|
||||
@@ -157,6 +167,7 @@ private:
|
||||
int Component;
|
||||
|
||||
public:
|
||||
GridFunctionCoefficient() : GridF(NULL), Component(1) { }
|
||||
/** Construct GridFunctionCoefficient from a given GridFunction, and
|
||||
optionally specify a component to use if it is a vector GridFunction. */
|
||||
GridFunctionCoefficient (GridFunction *gf, int comp = 1)
|
||||
@@ -242,7 +253,7 @@ public:
|
||||
Coefficient *Weight() { return weight; }
|
||||
void GetDeltaCenter(Vector& center);
|
||||
/// Return the Scale() multiplied by the weight Coefficient, if any.
|
||||
double EvalDelta(ElementTransformation &T, const IntegrationPoint &ip);
|
||||
virtual double EvalDelta(ElementTransformation &T, const IntegrationPoint &ip);
|
||||
/** @brief A DeltaFunction cannot be evaluated. Calling this method will
|
||||
cause an MFEM error, terminating the application. */
|
||||
virtual double Eval(ElementTransformation &T, const IntegrationPoint &ip)
|
||||
@@ -280,11 +291,26 @@ public:
|
||||
/// Returns dimension of the vector.
|
||||
int GetVDim() { return vdim; }
|
||||
|
||||
/** @brief Evaluate the vector coefficient in the element described by @a T
|
||||
at the point @a ip, storing the result in @a V. */
|
||||
/** @note When this method is called, the caller must make sure that the
|
||||
IntegrationPoint associated with @a T is the same as @a ip. This can be
|
||||
achieved by calling T.SetIntPoint(&ip). */
|
||||
virtual void Eval(Vector &V, ElementTransformation &T,
|
||||
const IntegrationPoint &ip) = 0;
|
||||
|
||||
// General implementation using the Eval method for one IntegrationPoint.
|
||||
// Can be overloaded for more efficient implementation.
|
||||
/** @brief Evaluate the vector coefficient in the element described by @a T
|
||||
at all points of @a ir, storing the result in @a M. */
|
||||
/** The dimensions of @a M are GetVDim() by ir.GetNPoints() and they must be
|
||||
set by the implementation of this method.
|
||||
|
||||
The general implementation provided by the base class (using the Eval
|
||||
method for one IntegrationPoint at a time) can be overloaded for more
|
||||
efficient implementation.
|
||||
|
||||
@note The IntegrationPoint associated with @a T is not used, and this
|
||||
method will generally modify this IntegrationPoint associated with @a T.
|
||||
*/
|
||||
virtual void Eval(DenseMatrix &M, ElementTransformation &T,
|
||||
const IntegrationRule &ir);
|
||||
|
||||
@@ -374,9 +400,10 @@ protected:
|
||||
GridFunction *GridFunc;
|
||||
|
||||
public:
|
||||
VectorGridFunctionCoefficient() : VectorCoefficient(0), GridFunc(NULL) { }
|
||||
VectorGridFunctionCoefficient(GridFunction *gf);
|
||||
|
||||
void SetGridFunction(GridFunction *gf) { GridFunc = gf; }
|
||||
void SetGridFunction(GridFunction *gf);
|
||||
GridFunction * GetGridFunction() const { return GridFunc; }
|
||||
|
||||
virtual void Eval(Vector &V, ElementTransformation &T,
|
||||
@@ -388,6 +415,63 @@ public:
|
||||
virtual ~VectorGridFunctionCoefficient() { }
|
||||
};
|
||||
|
||||
/// Vector coefficient defined as the Gradient of a scalar GridFunction
|
||||
class GradientGridFunctionCoefficient : public VectorCoefficient
|
||||
{
|
||||
protected:
|
||||
GridFunction *GridFunc;
|
||||
|
||||
public:
|
||||
GradientGridFunctionCoefficient(GridFunction *gf);
|
||||
|
||||
void SetGridFunction(GridFunction *gf);
|
||||
GridFunction * GetGridFunction() const { return GridFunc; }
|
||||
|
||||
virtual void Eval(Vector &V, ElementTransformation &T,
|
||||
const IntegrationPoint &ip);
|
||||
|
||||
virtual void Eval(DenseMatrix &M, ElementTransformation &T,
|
||||
const IntegrationRule &ir);
|
||||
|
||||
virtual ~GradientGridFunctionCoefficient() { }
|
||||
};
|
||||
|
||||
/// Vector coefficient defined as the Curl of a vector GridFunction
|
||||
class CurlGridFunctionCoefficient : public VectorCoefficient
|
||||
{
|
||||
protected:
|
||||
GridFunction *GridFunc;
|
||||
|
||||
public:
|
||||
CurlGridFunctionCoefficient(GridFunction *gf);
|
||||
|
||||
void SetGridFunction(GridFunction *gf);
|
||||
GridFunction * GetGridFunction() const { return GridFunc; }
|
||||
|
||||
virtual void Eval(Vector &V, ElementTransformation &T,
|
||||
const IntegrationPoint &ip);
|
||||
|
||||
virtual ~CurlGridFunctionCoefficient() { }
|
||||
};
|
||||
|
||||
/// Scalar coefficient defined as the Divergence of a vector GridFunction
|
||||
class DivergenceGridFunctionCoefficient : public Coefficient
|
||||
{
|
||||
protected:
|
||||
GridFunction *GridFunc;
|
||||
|
||||
public:
|
||||
DivergenceGridFunctionCoefficient(GridFunction *gf);
|
||||
|
||||
void SetGridFunction(GridFunction *gf) { GridFunc = gf; }
|
||||
GridFunction * GetGridFunction() const { return GridFunc; }
|
||||
|
||||
virtual double Eval(ElementTransformation &T,
|
||||
const IntegrationPoint &ip);
|
||||
|
||||
virtual ~DivergenceGridFunctionCoefficient() { }
|
||||
};
|
||||
|
||||
/// VectorDeltaCoefficient: DeltaCoefficient with a direction
|
||||
class VectorDeltaCoefficient : public VectorCoefficient
|
||||
{
|
||||
@@ -420,8 +504,8 @@ public:
|
||||
/** @brief Return the specified direction vector multiplied by the value
|
||||
returned by DeltaCoefficient::EvalDelta() of the associated scalar
|
||||
DeltaCoefficient. */
|
||||
void EvalDelta(Vector &V, ElementTransformation &T,
|
||||
const IntegrationPoint &ip);
|
||||
virtual void EvalDelta(Vector &V, ElementTransformation &T,
|
||||
const IntegrationPoint &ip);
|
||||
using VectorCoefficient::Eval;
|
||||
/** @brief A VectorDeltaFunction cannot be evaluated. Calling this method
|
||||
will cause an MFEM error, terminating the application. */
|
||||
@@ -470,6 +554,11 @@ public:
|
||||
// For backward compatibility
|
||||
int GetVDim() const { return width; }
|
||||
|
||||
/** @brief Evaluate the matrix coefficient in the element described by @a T
|
||||
at the point @a ip, storing the result in @a K. */
|
||||
/** @note When this method is called, the caller must make sure that the
|
||||
IntegrationPoint associated with @a T is the same as @a ip. This can be
|
||||
achieved by calling T.SetIntPoint(&ip). */
|
||||
virtual void Eval(DenseMatrix &K, ElementTransformation &T,
|
||||
const IntegrationPoint &ip) = 0;
|
||||
|
||||
@@ -571,6 +660,279 @@ public:
|
||||
const IntegrationPoint &ip);
|
||||
};
|
||||
|
||||
/// Coefficients based on sums and products of other coefficients
|
||||
|
||||
/// Scalar coefficient defined as the sum of two scalar coefficients
|
||||
class SumCoefficient : public Coefficient
|
||||
{
|
||||
private:
|
||||
Coefficient * a;
|
||||
Coefficient * b;
|
||||
|
||||
double alpha;
|
||||
double beta;
|
||||
|
||||
public:
|
||||
// Result is _alpha * A + _beta * B
|
||||
SumCoefficient(Coefficient &A, Coefficient &B,
|
||||
double _alpha = 1.0, double _beta = 1.0)
|
||||
: a(&A), b(&B), alpha(_alpha), beta(_beta) { }
|
||||
|
||||
/// Evaluate the coefficient
|
||||
virtual double Eval(ElementTransformation &T,
|
||||
const IntegrationPoint &ip)
|
||||
{ return alpha * a->Eval(T, ip) + beta * b->Eval(T, ip); }
|
||||
};
|
||||
|
||||
/// Scalar coefficient defined as the product of two scalar coefficients
|
||||
class ProductCoefficient : public Coefficient
|
||||
{
|
||||
private:
|
||||
Coefficient * a;
|
||||
Coefficient * b;
|
||||
|
||||
public:
|
||||
ProductCoefficient(Coefficient &A, Coefficient &B)
|
||||
: a(&A), b(&B) { }
|
||||
|
||||
/// Evaluate the coefficient
|
||||
virtual double Eval(ElementTransformation &T,
|
||||
const IntegrationPoint &ip)
|
||||
{ return a->Eval(T, ip) * b->Eval(T, ip); }
|
||||
};
|
||||
|
||||
/// Scalar coefficient defined as a scalar raised to a power
|
||||
class PowerCoefficient : public Coefficient
|
||||
{
|
||||
private:
|
||||
Coefficient * a;
|
||||
|
||||
double p;
|
||||
|
||||
public:
|
||||
// Result is A^p
|
||||
PowerCoefficient(Coefficient &A, double _p)
|
||||
: a(&A), p(_p) { }
|
||||
|
||||
/// Evaluate the coefficient
|
||||
virtual double Eval(ElementTransformation &T,
|
||||
const IntegrationPoint &ip)
|
||||
{ return pow(a->Eval(T, ip), p); }
|
||||
};
|
||||
|
||||
/// Scalar coefficient defined as the inner product of two vector coefficients
|
||||
class InnerProductCoefficient : public Coefficient
|
||||
{
|
||||
private:
|
||||
VectorCoefficient * a;
|
||||
VectorCoefficient * b;
|
||||
|
||||
mutable Vector va;
|
||||
mutable Vector vb;
|
||||
public:
|
||||
InnerProductCoefficient(VectorCoefficient &A, VectorCoefficient &B);
|
||||
|
||||
/// Evaluate the coefficient
|
||||
virtual double Eval(ElementTransformation &T,
|
||||
const IntegrationPoint &ip);
|
||||
};
|
||||
|
||||
/// Scalar coefficient defined as a cross product of two vectors in 2D
|
||||
class VectorRotProductCoefficient : public Coefficient
|
||||
{
|
||||
private:
|
||||
VectorCoefficient * a;
|
||||
VectorCoefficient * b;
|
||||
|
||||
mutable Vector va;
|
||||
mutable Vector vb;
|
||||
|
||||
public:
|
||||
VectorRotProductCoefficient(VectorCoefficient &A, VectorCoefficient &B);
|
||||
|
||||
virtual double Eval(ElementTransformation &T,
|
||||
const IntegrationPoint &ip);
|
||||
};
|
||||
|
||||
/// Scalar coefficient defined as the determinant of a matrix coefficient
|
||||
class DeterminantCoefficient : public Coefficient
|
||||
{
|
||||
private:
|
||||
MatrixCoefficient * a;
|
||||
|
||||
mutable DenseMatrix ma;
|
||||
|
||||
public:
|
||||
DeterminantCoefficient(MatrixCoefficient &A);
|
||||
|
||||
/// Evaluate the coefficient
|
||||
virtual double Eval(ElementTransformation &T,
|
||||
const IntegrationPoint &ip);
|
||||
};
|
||||
|
||||
/// Vector coefficient defined as the sum of two vector coefficients
|
||||
class VectorSumCoefficient : public VectorCoefficient
|
||||
{
|
||||
private:
|
||||
VectorCoefficient * a;
|
||||
VectorCoefficient * b;
|
||||
|
||||
double alpha;
|
||||
double beta;
|
||||
|
||||
mutable Vector va;
|
||||
|
||||
public:
|
||||
// Result is _alpha * A + _beta * B
|
||||
VectorSumCoefficient(VectorCoefficient &A, VectorCoefficient &B,
|
||||
double _alpha = 1.0, double _beta = 1.0);
|
||||
|
||||
/// Evaluate the coefficient
|
||||
virtual void Eval(Vector &V, ElementTransformation &T,
|
||||
const IntegrationPoint &ip);
|
||||
};
|
||||
|
||||
/// Vector coefficient defined as a product of a scalar and a vector
|
||||
class ScalarVectorProductCoefficient : public VectorCoefficient
|
||||
{
|
||||
private:
|
||||
Coefficient * a;
|
||||
VectorCoefficient * b;
|
||||
|
||||
public:
|
||||
ScalarVectorProductCoefficient(Coefficient &A, VectorCoefficient &B);
|
||||
|
||||
virtual void Eval(Vector &V, ElementTransformation &T,
|
||||
const IntegrationPoint &ip);
|
||||
};
|
||||
|
||||
/// Vector coefficient defined as a cross product of two vectors
|
||||
class VectorCrossProductCoefficient : public VectorCoefficient
|
||||
{
|
||||
private:
|
||||
VectorCoefficient * a;
|
||||
VectorCoefficient * b;
|
||||
|
||||
mutable Vector va;
|
||||
mutable Vector vb;
|
||||
|
||||
public:
|
||||
VectorCrossProductCoefficient(VectorCoefficient &A, VectorCoefficient &B);
|
||||
|
||||
virtual void Eval(Vector &V, ElementTransformation &T,
|
||||
const IntegrationPoint &ip);
|
||||
};
|
||||
|
||||
/// Vector coefficient defined as a matrix vector product
|
||||
class MatVecCoefficient : public VectorCoefficient
|
||||
{
|
||||
private:
|
||||
MatrixCoefficient * a;
|
||||
VectorCoefficient * b;
|
||||
|
||||
mutable DenseMatrix ma;
|
||||
mutable Vector vb;
|
||||
|
||||
public:
|
||||
MatVecCoefficient(MatrixCoefficient &A, VectorCoefficient &B);
|
||||
|
||||
virtual void Eval(Vector &V, ElementTransformation &T,
|
||||
const IntegrationPoint &ip);
|
||||
};
|
||||
|
||||
/// Matrix coefficient defined as the identity of dimension d
|
||||
class IdentityMatrixCoefficient : public MatrixCoefficient
|
||||
{
|
||||
private:
|
||||
int dim;
|
||||
|
||||
public:
|
||||
IdentityMatrixCoefficient(int d)
|
||||
: MatrixCoefficient(d, d), dim(d) { }
|
||||
|
||||
virtual void Eval(DenseMatrix &M, ElementTransformation &T,
|
||||
const IntegrationPoint &ip);
|
||||
};
|
||||
|
||||
/// Matrix coefficient defined as the sum of two matrix coefficients
|
||||
class MatrixSumCoefficient : public MatrixCoefficient
|
||||
{
|
||||
private:
|
||||
MatrixCoefficient * a;
|
||||
MatrixCoefficient * b;
|
||||
|
||||
double alpha;
|
||||
double beta;
|
||||
|
||||
mutable DenseMatrix ma;
|
||||
|
||||
public:
|
||||
// Result is _alpha * A + _beta * B
|
||||
MatrixSumCoefficient(MatrixCoefficient &A, MatrixCoefficient &B,
|
||||
double _alpha = 1.0, double _beta = 1.0);
|
||||
|
||||
/// Evaluate the coefficient
|
||||
virtual void Eval(DenseMatrix &M, ElementTransformation &T,
|
||||
const IntegrationPoint &ip);
|
||||
};
|
||||
|
||||
/// Matrix coefficient defined as a product of a scalar and a matrix
|
||||
class ScalarMatrixProductCoefficient : public MatrixCoefficient
|
||||
{
|
||||
private:
|
||||
Coefficient * a;
|
||||
MatrixCoefficient * b;
|
||||
|
||||
public:
|
||||
ScalarMatrixProductCoefficient(Coefficient &A, MatrixCoefficient &B);
|
||||
|
||||
virtual void Eval(DenseMatrix &M, ElementTransformation &T,
|
||||
const IntegrationPoint &ip);
|
||||
};
|
||||
|
||||
/// Matrix coefficient defined as the transpose a matrix
|
||||
class TransposeMatrixCoefficient : public MatrixCoefficient
|
||||
{
|
||||
private:
|
||||
MatrixCoefficient * a;
|
||||
|
||||
public:
|
||||
TransposeMatrixCoefficient(MatrixCoefficient &A);
|
||||
|
||||
virtual void Eval(DenseMatrix &M, ElementTransformation &T,
|
||||
const IntegrationPoint &ip);
|
||||
};
|
||||
|
||||
/// Matrix coefficient defined as the inverse a matrix
|
||||
class InverseMatrixCoefficient : public MatrixCoefficient
|
||||
{
|
||||
private:
|
||||
MatrixCoefficient * a;
|
||||
|
||||
public:
|
||||
InverseMatrixCoefficient(MatrixCoefficient &A);
|
||||
|
||||
virtual void Eval(DenseMatrix &M, ElementTransformation &T,
|
||||
const IntegrationPoint &ip);
|
||||
};
|
||||
|
||||
/// Matrix coefficient defined as the outer product of two vectors
|
||||
class OuterProductCoefficient : public MatrixCoefficient
|
||||
{
|
||||
private:
|
||||
VectorCoefficient * a;
|
||||
VectorCoefficient * b;
|
||||
|
||||
mutable Vector va;
|
||||
mutable Vector vb;
|
||||
|
||||
public:
|
||||
OuterProductCoefficient(VectorCoefficient &A, VectorCoefficient &B);
|
||||
|
||||
virtual void Eval(DenseMatrix &M, ElementTransformation &T,
|
||||
const IntegrationPoint &ip);
|
||||
};
|
||||
|
||||
/** Compute the Lp norm of a function f.
|
||||
\f$ \| f \|_{Lp} = ( \int_\Omega | f |^p d\Omega)^{1/p} \f$ */
|
||||
double ComputeLpNorm(double p, Coefficient &coeff, Mesh &mesh,
|
||||
|
||||
@@ -304,32 +304,43 @@ ConduitDataCollection::BlueprintMeshToMesh(const Node &n_mesh,
|
||||
if ( n_mesh_topo.has_child("boundary_topology") )
|
||||
{
|
||||
std::string bndry_topo_name = n_mesh_topo["boundary_topology"].as_string();
|
||||
const Node &n_bndry_topo = n_mesh["topologies"][bndry_topo_name];
|
||||
std::string bndry_ele_shape = n_bndry_topo["elements/shape"].as_string();
|
||||
|
||||
bndry_geo = ShapeNameToGeomType(bndry_ele_shape);
|
||||
int num_idxs_per_bndry_ele = Geometry::NumVerts[mesh_geo];
|
||||
// In VisIt, we encountered a case were a mesh specified a boundary
|
||||
// topology, but the boundary topology was omitted from the blueprint
|
||||
// index, so it's data could not be obtained.
|
||||
//
|
||||
// This guard prevents an error in that case, allowing the mesh to be
|
||||
// created without boundary info
|
||||
|
||||
const Node &n_bndry_conn = n_bndry_topo["elements/connectivity"];
|
||||
|
||||
// mfem requires ints, we could have int64s, etc convert if necessary
|
||||
if ( n_bndry_conn.dtype().is_int() &&
|
||||
n_bndry_conn.is_compact())
|
||||
if (n_mesh["topologies"].has_child(bndry_topo_name))
|
||||
{
|
||||
bndry_indices = n_bndry_conn.value();
|
||||
}
|
||||
else
|
||||
{
|
||||
Node &(n_bndry_conn_conv) =
|
||||
n_conv["topologies"][bndry_topo_name]["elements/connectivity"];
|
||||
n_bndry_conn.to_int_array(n_bndry_conn_conv);
|
||||
bndry_indices = (n_bndry_conn_conv).value();
|
||||
const Node &n_bndry_topo = n_mesh["topologies"][bndry_topo_name];
|
||||
std::string bndry_ele_shape = n_bndry_topo["elements/shape"].as_string();
|
||||
|
||||
}
|
||||
bndry_geo = ShapeNameToGeomType(bndry_ele_shape);
|
||||
int num_idxs_per_bndry_ele = Geometry::NumVerts[mesh_geo];
|
||||
|
||||
num_bndry_ele =
|
||||
n_bndry_topo["elements/connectivity"].dtype().number_of_elements();
|
||||
num_bndry_ele = num_bndry_ele / num_idxs_per_bndry_ele;
|
||||
const Node &n_bndry_conn = n_bndry_topo["elements/connectivity"];
|
||||
|
||||
// mfem requires ints, we could have int64s, etc convert if necessary
|
||||
if ( n_bndry_conn.dtype().is_int() &&
|
||||
n_bndry_conn.is_compact())
|
||||
{
|
||||
bndry_indices = n_bndry_conn.value();
|
||||
}
|
||||
else
|
||||
{
|
||||
Node &(n_bndry_conn_conv) =
|
||||
n_conv["topologies"][bndry_topo_name]["elements/connectivity"];
|
||||
n_bndry_conn.to_int_array(n_bndry_conn_conv);
|
||||
bndry_indices = (n_bndry_conn_conv).value();
|
||||
|
||||
}
|
||||
|
||||
num_bndry_ele =
|
||||
n_bndry_topo["elements/connectivity"].dtype().number_of_elements();
|
||||
num_bndry_ele = num_bndry_ele / num_idxs_per_bndry_ele;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -688,8 +699,7 @@ ConduitDataCollection::MeshToBlueprintMesh(Mesh *mesh,
|
||||
n_topo["type"] = "unstructured";
|
||||
n_topo["coordset"] = coordset_name;
|
||||
|
||||
Element::Type ele_type = static_cast<Element::Type>(mesh->GetElement(
|
||||
0)->GetType());
|
||||
Element::Type ele_type = mesh->GetElementType(0);
|
||||
|
||||
std::string ele_shape = ElementTypeToShapeName(ele_type);
|
||||
|
||||
@@ -763,8 +773,7 @@ ConduitDataCollection::MeshToBlueprintMesh(Mesh *mesh,
|
||||
n_bndry_topo["type"] = "unstructured";
|
||||
n_bndry_topo["coordset"] = coordset_name;
|
||||
|
||||
Element::Type bndry_ele_type = static_cast<Element::Type>(mesh->GetBdrElement(
|
||||
0)->GetType());
|
||||
Element::Type bndry_ele_type = mesh->GetBdrElementType(0);
|
||||
|
||||
std::string bndry_ele_shape = ElementTypeToShapeName(bndry_ele_type);
|
||||
|
||||
@@ -1152,6 +1161,8 @@ ConduitDataCollection::ElementTypeToShapeName(Element::Type element_type)
|
||||
case Element::QUADRILATERAL: return "quad";
|
||||
case Element::TETRAHEDRON: return "tet";
|
||||
case Element::HEXAHEDRON: return "hex";
|
||||
case Element::WEDGE:
|
||||
default: ;
|
||||
}
|
||||
|
||||
return "unknown";
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user