From 7a6183b1d3c8cc243a7f86ed49efc7935b35d37b Mon Sep 17 00:00:00 2001 From: Tom Gustafsson Date: Tue, 6 Aug 2024 12:09:23 +0300 Subject: [PATCH] preserve order of Mesh.boundaries during loading (#1152) * add test case for 2d orientation * add test case for 3d orientation --- docs/examples/meshes/cube_oriented_sub.msh | 607 ++++++++++++++++++ docs/examples/meshes/oriented_squares.msh | 680 +++++++++++++++++++++ skfem/io/meshio.py | 7 +- tests/test_autodiff.py | 7 +- tests/test_mesh.py | 36 +- 5 files changed, 1333 insertions(+), 4 deletions(-) create mode 100644 docs/examples/meshes/cube_oriented_sub.msh create mode 100644 docs/examples/meshes/oriented_squares.msh diff --git a/docs/examples/meshes/cube_oriented_sub.msh b/docs/examples/meshes/cube_oriented_sub.msh new file mode 100644 index 00000000..eeeb9367 --- /dev/null +++ b/docs/examples/meshes/cube_oriented_sub.msh @@ -0,0 +1,607 @@ +$MeshFormat +4.1 0 8 +$EndMeshFormat +$PhysicalNames +2 +2 26 "subdomif" +3 25 "subdom" +$EndPhysicalNames +$Entities +16 24 12 2 +9 0.1 0.1 0.6 0 +10 0.1 0.1 0.1 0 +11 0.1 0.6 0.6 0 +12 0.1 0.6 0.1 0 +13 0.6 0.1 0.6 0 +14 0.6 0.1 0.1 0 +15 0.6 0.6 0.6 0 +16 0.6 0.6 0.1 0 +17 0 0 1 0 +18 0 0 0 0 +19 0 1 1 0 +20 0 1 0 0 +21 1 0 0 0 +22 1 0 1 0 +23 1 1 1 0 +24 1 1 0 0 +13 0.0999999 0.0999999 0.09999990000000003 0.1000001 0.1000001 0.6000000999999999 0 2 10 -9 +14 0.0999999 0.09999990000000003 0.5999999 0.1000001 0.6000000999999999 0.6000000999999999 0 2 9 -11 +15 0.0999999 0.5999999 0.09999990000000003 0.1000001 0.6000000999999999 0.6000000999999999 0 2 12 -11 +16 0.0999999 0.09999990000000003 0.0999999 0.1000001 0.6000000999999999 0.1000001 0 2 10 -12 +17 0.5999999 0.0999999 0.09999990000000003 0.6000000999999999 0.1000001 0.6000000999999999 0 2 14 -13 +18 0.5999999 0.09999990000000003 0.5999999 0.6000000999999999 0.6000000999999999 0.6000000999999999 0 2 13 -15 +19 0.5999999 0.5999999 0.09999990000000003 0.6000000999999999 0.6000000999999999 0.6000000999999999 0 2 16 -15 +20 0.5999999 0.09999990000000003 0.0999999 0.6000000999999999 0.6000000999999999 0.1000001 0 2 14 -16 +21 0.09999990000000003 0.0999999 0.0999999 0.6000000999999999 0.1000001 0.1000001 0 2 10 -14 +22 0.09999990000000003 0.0999999 0.5999999 0.6000000999999999 0.1000001 0.6000000999999999 0 2 9 -13 +23 0.09999990000000003 0.5999999 0.0999999 0.6000000999999999 0.6000000999999999 0.1000001 0 2 12 -16 +24 0.09999990000000003 0.5999999 0.5999999 0.6000000999999999 0.6000000999999999 0.6000000999999999 0 2 11 -15 +25 -1e-07 -1e-07 -9.999999994736442e-08 1e-07 1e-07 1.0000001 0 2 18 -17 +26 -1e-07 -9.999999994736442e-08 0.9999999000000001 1e-07 1.0000001 1.0000001 0 2 17 -19 +27 -1e-07 0.9999999000000001 -9.999999994736442e-08 1e-07 1.0000001 1.0000001 0 2 20 -19 +28 -1e-07 -9.999999994736442e-08 -1e-07 1e-07 1.0000001 1e-07 0 2 18 -20 +29 -9.999999994736442e-08 -1e-07 -1e-07 1.0000001 1e-07 1e-07 0 2 18 -21 +30 0.9999999000000001 -1e-07 -9.999999994736442e-08 1.0000001 1e-07 1.0000001 0 2 21 -22 +31 -9.999999994736442e-08 -1e-07 0.9999999000000001 1.0000001 1e-07 1.0000001 0 2 17 -22 +32 -9.999999994736442e-08 0.9999999000000001 0.9999999000000001 1.0000001 1.0000001 1.0000001 0 2 19 -23 +33 0.9999999000000001 -9.999999994736442e-08 0.9999999000000001 1.0000001 1.0000001 1.0000001 0 2 22 -23 +34 -9.999999994736442e-08 0.9999999000000001 -1e-07 1.0000001 1.0000001 1e-07 0 2 20 -24 +35 0.9999999000000001 0.9999999000000001 -9.999999994736442e-08 1.0000001 1.0000001 1.0000001 0 2 24 -23 +36 0.9999999000000001 -9.999999994736442e-08 -1e-07 1.0000001 1.0000001 1e-07 0 2 21 -24 +7 0.0999999 0.09999990000000003 0.09999990000000003 0.1000001 0.6000000999999999 0.6000000999999999 1 26 4 -13 16 15 -14 +8 0.5999999 0.09999990000000003 0.09999990000000003 0.6000000999999999 0.6000000999999999 0.6000000999999999 1 26 4 -17 20 19 -18 +9 0.09999990000000003 0.0999999 0.09999990000000003 0.6000000999999999 0.1000001 0.6000000999999999 1 26 4 -21 13 22 -17 +10 0.09999990000000003 0.5999999 0.09999990000000003 0.6000000999999999 0.6000000999999999 0.6000000999999999 1 26 4 -23 15 24 -19 +11 0.09999990000000003 0.09999990000000003 0.0999999 0.6000000999999999 0.6000000999999999 0.1000001 1 26 4 -16 21 20 -23 +12 0.09999990000000003 0.09999990000000003 0.5999999 0.6000000999999999 0.6000000999999999 0.6000000999999999 1 26 4 -14 22 18 -24 +13 -1e-07 -9.999999994736442e-08 -9.999999994736442e-08 1e-07 1.0000001 1.0000001 0 4 -25 28 27 -26 +14 -9.999999994736442e-08 -1e-07 -9.999999994736442e-08 1.0000001 1e-07 1.0000001 0 4 -29 25 31 -30 +15 -9.999999994736442e-08 -9.999999994736442e-08 0.9999999000000001 1.0000001 1.0000001 1.0000001 0 4 -26 31 33 -32 +16 -9.999999994736442e-08 0.9999999000000001 -9.999999994736442e-08 1.0000001 1.0000001 1.0000001 0 4 -34 27 32 -35 +17 -9.999999994736442e-08 -9.999999994736442e-08 -1e-07 1.0000001 1.0000001 1e-07 0 4 -28 29 36 -34 +18 0.9999999000000001 -9.999999994736442e-08 -9.999999994736442e-08 1.0000001 1.0000001 1.0000001 0 4 -30 36 35 -33 +2 0.09999990000000003 0.09999990000000003 0.09999990000000003 0.6000000999999999 0.6000000999999999 0.6000000999999999 1 25 6 -7 8 -9 10 -11 12 +3 -9.999999994736442e-08 -9.999999994736442e-08 -9.999999994736442e-08 1.0000001 1.0000001 1.0000001 0 12 -13 -14 15 16 -17 18 7 9 -12 -10 11 -8 +$EndEntities +$Nodes +27 81 1 81 +0 9 0 1 +1 +0.1 0.1 0.6 +0 10 0 1 +2 +0.1 0.1 0.1 +0 11 0 1 +3 +0.1 0.6 0.6 +0 12 0 1 +4 +0.1 0.6 0.1 +0 13 0 1 +5 +0.6 0.1 0.6 +0 14 0 1 +6 +0.6 0.1 0.1 +0 15 0 1 +7 +0.6 0.6 0.6 +0 16 0 1 +8 +0.6 0.6 0.1 +1 13 0 2 +9 +10 +0.1 0.1 0.2666666666666662 +0.1 0.1 0.4333333333333323 +1 14 0 2 +11 +12 +0.1 0.2666666666666662 0.6 +0.1 0.4333333333333323 0.6 +1 15 0 2 +13 +14 +0.1 0.6 0.2666666666666662 +0.1 0.6 0.4333333333333323 +1 16 0 2 +15 +16 +0.1 0.2666666666666662 0.1 +0.1 0.4333333333333323 0.1 +1 17 0 2 +17 +18 +0.6 0.1 0.2666666666666662 +0.6 0.1 0.4333333333333323 +1 18 0 2 +19 +20 +0.6 0.2666666666666662 0.6 +0.6 0.4333333333333323 0.6 +1 19 0 2 +21 +22 +0.6 0.6 0.2666666666666662 +0.6 0.6 0.4333333333333323 +1 20 0 2 +23 +24 +0.6 0.2666666666666662 0.1 +0.6 0.4333333333333323 0.1 +1 21 0 2 +25 +26 +0.2666666666666662 0.1 0.1 +0.4333333333333323 0.1 0.1 +1 22 0 2 +27 +28 +0.2666666666666662 0.1 0.6 +0.4333333333333323 0.1 0.6 +1 23 0 2 +29 +30 +0.2666666666666662 0.6 0.1 +0.4333333333333323 0.6 0.1 +1 24 0 2 +31 +32 +0.2666666666666662 0.6 0.6 +0.4333333333333323 0.6 0.6 +2 7 0 8 +33 +34 +35 +36 +37 +38 +39 +40 +0.1 0.3499999999999994 0.2488991674885991 +0.1 0.3499999999999993 0.4513383169028623 +0.1 0.4762800408580521 0.3500395807319098 +0.1 0.2237199591419473 0.35003958073191 +0.1 0.478840122574157 0.478840122574157 +0.1 0.2211598774258424 0.4788401225741573 +0.1 0.2211598774258429 0.2211598774258429 +0.1 0.4788401225741574 0.2211598774258422 +2 8 0 8 +41 +42 +43 +44 +45 +46 +47 +48 +0.6 0.2488991674885991 0.3499999999999994 +0.6 0.4513383169028623 0.3499999999999994 +0.6 0.3500395807319099 0.4762800408580521 +0.6 0.35003958073191 0.2237199591419473 +0.6 0.4788401225741571 0.4788401225741571 +0.6 0.4788401225741572 0.2211598774258423 +0.6 0.2211598774258429 0.2211598774258429 +0.6 0.2211598774258422 0.4788401225741574 +2 9 0 8 +49 +50 +51 +52 +53 +54 +55 +56 +0.3499999999999994 0.1 0.2507238075650762 +0.3499999999999994 0.1 0.4514333106594469 +0.4762800408580521 0.1 0.3503595197040867 +0.2237199591419473 0.1 0.3503595197040867 +0.478840122574157 0.1 0.478840122574157 +0.2211598774258428 0.1 0.4788401225741568 +0.4788401225741573 0.1 0.2211598774258422 +0.2211598774258424 0.1 0.2211598774258424 +2 10 0 8 +57 +58 +59 +60 +61 +62 +63 +64 +0.3499999999999994 0.6 0.2507238075650763 +0.3499999999999994 0.6 0.4514333106594469 +0.4762800408580522 0.6 0.3503595197040867 +0.2237199591419473 0.6 0.350359519704087 +0.478840122574157 0.6 0.478840122574157 +0.2211598774258424 0.6 0.4788401225741573 +0.2211598774258429 0.6 0.2211598774258429 +0.4788401225741573 0.6 0.2211598774258422 +2 11 0 8 +65 +66 +67 +68 +69 +70 +71 +72 +0.2507238075650763 0.3499999999999994 0.1 +0.4514333106594469 0.3499999999999994 0.1 +0.3503595197040867 0.4762800408580522 0.1 +0.350359519704087 0.2237199591419473 0.1 +0.478840122574157 0.478840122574157 0.1 +0.4788401225741573 0.2211598774258424 0.1 +0.2211598774258429 0.2211598774258429 0.1 +0.2211598774258422 0.4788401225741573 0.1 +2 12 0 8 +73 +74 +75 +76 +77 +78 +79 +80 +0.2488991674885991 0.3499999999999994 0.6 +0.4513383169028623 0.3499999999999994 0.6 +0.3500395807319099 0.4762800408580521 0.6 +0.35003958073191 0.2237199591419473 0.6 +0.4788401225741571 0.4788401225741571 0.6 +0.4788401225741572 0.2211598774258423 0.6 +0.2211598774258429 0.2211598774258429 0.6 +0.2211598774258422 0.4788401225741574 0.6 +3 2 0 1 +81 +0.3266943114439441 0.3733035451788688 0.351028391219303 +$EndNodes +$Elements +7 340 1 340 +2 7 2 26 +1 10 1 38 +2 1 11 38 +3 2 9 39 +4 15 2 39 +5 12 3 37 +6 3 14 37 +7 13 4 40 +8 4 16 40 +9 9 10 36 +10 9 36 39 +11 36 10 38 +12 11 12 34 +13 11 34 38 +14 34 12 37 +15 14 13 35 +16 35 13 40 +17 14 35 37 +18 16 15 33 +19 33 15 39 +20 16 33 40 +21 33 34 35 +22 34 33 36 +23 33 35 40 +24 36 33 39 +25 35 34 37 +26 34 36 38 +2 8 2 26 +27 18 48 5 +28 5 48 19 +29 6 47 17 +30 23 47 6 +31 20 45 7 +32 7 45 22 +33 21 46 8 +34 8 46 24 +35 17 41 18 +36 17 47 41 +37 41 48 18 +38 19 43 20 +39 19 48 43 +40 43 45 20 +41 22 42 21 +42 42 46 21 +43 22 45 42 +44 24 44 23 +45 44 47 23 +46 24 46 44 +47 42 43 41 +48 41 44 42 +49 43 48 41 +50 41 47 44 +51 42 45 43 +52 44 46 42 +2 9 2 26 +53 1 10 54 +54 27 1 54 +55 9 2 56 +56 2 25 56 +57 18 5 53 +58 5 28 53 +59 6 17 55 +60 26 6 55 +61 10 9 52 +62 52 9 56 +63 10 52 54 +64 17 18 51 +65 17 51 55 +66 51 18 53 +67 25 26 49 +68 25 49 56 +69 49 26 55 +70 28 27 50 +71 50 27 54 +72 28 50 53 +73 50 49 51 +74 49 50 52 +75 51 49 55 +76 49 52 56 +77 50 51 53 +78 52 50 54 +2 10 2 26 +79 3 62 14 +80 31 62 3 +81 13 63 4 +82 4 63 29 +83 22 61 7 +84 7 61 32 +85 8 64 21 +86 30 64 8 +87 14 60 13 +88 60 63 13 +89 14 62 60 +90 21 59 22 +91 21 64 59 +92 59 61 22 +93 29 57 30 +94 29 63 57 +95 57 64 30 +96 32 58 31 +97 58 62 31 +98 32 61 58 +99 58 59 57 +100 57 60 58 +101 59 64 57 +102 57 63 60 +103 58 61 59 +104 60 62 58 +2 11 2 26 +105 2 15 71 +106 25 2 71 +107 16 4 72 +108 4 29 72 +109 23 6 70 +110 6 26 70 +111 8 24 69 +112 30 8 69 +113 15 16 65 +114 15 65 71 +115 65 16 72 +116 24 23 66 +117 66 23 70 +118 24 66 69 +119 26 25 68 +120 68 25 71 +121 26 68 70 +122 29 30 67 +123 29 67 72 +124 67 30 69 +125 66 65 67 +126 65 66 68 +127 67 65 72 +128 65 68 71 +129 66 67 69 +130 68 66 70 +2 12 2 26 +131 1 79 11 +132 27 79 1 +133 12 80 3 +134 3 80 31 +135 19 78 5 +136 5 78 28 +137 7 77 20 +138 32 77 7 +139 11 73 12 +140 11 79 73 +141 73 80 12 +142 20 74 19 +143 74 78 19 +144 20 77 74 +145 28 76 27 +146 76 79 27 +147 28 78 76 +148 31 75 32 +149 31 80 75 +150 75 77 32 +151 74 75 73 +152 73 76 74 +153 75 80 73 +154 73 79 76 +155 74 77 75 +156 76 78 74 +3 2 4 184 +157 70 55 47 81 +158 78 48 53 81 +159 44 66 47 81 +160 70 68 49 81 +161 43 48 74 81 +162 56 36 52 81 +163 70 49 55 81 +164 70 47 66 81 +165 36 38 52 81 +166 49 51 55 81 +167 50 53 51 81 +168 74 48 78 81 +169 44 47 41 81 +170 41 48 43 81 +171 69 46 64 81 +172 71 39 56 81 +173 36 56 39 81 +174 38 54 52 81 +175 61 45 77 81 +176 79 54 38 81 +177 70 66 68 81 +178 78 76 74 81 +179 59 42 61 81 +180 46 44 42 81 +181 56 52 49 81 +182 45 42 43 81 +183 69 57 67 81 +184 45 61 42 81 +185 50 52 54 81 +186 77 75 58 81 +187 69 64 57 81 +188 71 65 39 81 +189 68 65 71 81 +190 77 58 61 81 +191 79 38 34 81 +192 62 75 80 81 +193 73 76 79 81 +194 69 67 66 81 +195 40 72 63 81 +196 63 60 35 81 +197 80 37 62 81 +198 37 35 60 81 +199 77 74 75 81 +200 35 40 63 81 +201 37 60 62 81 +202 64 59 57 81 +203 39 33 36 81 +204 58 59 61 81 +205 49 50 51 81 +206 36 34 38 81 +207 39 65 33 81 +208 72 67 57 81 +209 42 44 41 81 +210 34 73 79 81 +211 43 42 41 81 +212 58 75 62 81 +213 50 49 52 81 +214 72 57 63 81 +215 72 40 65 81 +216 34 37 80 81 +217 72 65 67 81 +218 80 75 73 81 +219 66 65 68 81 +220 33 65 40 81 +221 74 76 73 81 +222 80 73 34 81 +223 67 65 66 81 +224 57 60 63 81 +225 75 74 73 81 +226 40 35 33 81 +227 62 60 58 81 +228 37 34 35 81 +229 58 57 59 81 +230 34 36 33 81 +231 58 60 57 81 +232 34 33 35 81 +233 36 9 56 52 +234 63 13 35 60 +235 38 10 36 52 +236 14 37 35 60 +237 40 65 16 72 +238 65 39 15 71 +239 34 37 12 80 +240 34 11 38 79 +241 56 39 9 36 +242 13 35 40 63 +243 37 14 62 60 +244 10 38 54 52 +245 59 64 21 46 +246 55 51 17 47 +247 80 62 31 75 +248 79 27 54 76 +249 78 53 28 76 +250 46 69 24 44 +251 45 20 77 43 +252 51 53 18 48 +253 25 71 56 68 +254 65 40 16 33 +255 39 65 15 33 +256 80 12 34 73 +257 79 34 11 73 +258 62 58 31 75 +259 50 54 27 76 +260 69 66 24 44 +261 53 50 28 76 +262 49 25 56 68 +263 42 59 21 46 +264 41 17 51 47 +265 74 77 20 43 +266 41 51 18 48 +267 77 61 7 45 +268 39 2 71 56 +269 70 55 6 47 +270 3 37 62 80 +271 54 38 1 79 +272 64 69 8 46 +273 5 53 78 48 +274 72 4 40 63 +275 65 16 15 33 +276 12 11 34 73 +277 49 26 25 68 +278 67 30 29 57 +279 32 31 58 75 +280 27 28 50 76 +281 66 23 24 44 +282 51 18 17 41 +283 21 22 59 42 +284 20 19 74 43 +285 13 14 35 60 +286 10 9 36 52 +287 9 2 39 56 +288 40 4 13 63 +289 37 14 3 62 +290 38 1 10 54 +291 61 7 32 77 +292 54 1 27 79 +293 53 28 5 78 +294 69 24 8 46 +295 6 23 70 47 +296 31 3 62 80 +297 61 22 7 45 +298 7 20 77 45 +299 19 5 78 48 +300 8 21 64 46 +301 55 17 6 47 +302 37 3 12 80 +303 11 1 38 79 +304 53 5 18 48 +305 71 15 2 39 +306 69 8 30 64 +307 29 4 72 63 +308 71 2 25 56 +309 55 6 26 70 +310 40 16 4 72 +311 49 70 26 68 +312 26 70 49 55 +313 69 57 30 67 +314 30 57 69 64 +315 51 48 81 53 +316 81 48 51 41 +317 61 42 22 45 +318 22 42 61 59 +319 72 57 29 63 +320 29 57 72 67 +321 56 68 81 49 +322 81 68 56 71 +323 69 44 81 66 +324 81 44 69 46 +325 53 76 81 50 +326 81 76 53 78 +327 58 77 32 75 +328 32 77 58 61 +329 76 54 81 50 +330 76 81 54 79 +331 47 66 23 70 +332 47 23 66 44 +333 43 77 81 74 +334 43 81 77 45 +335 48 74 19 43 +336 48 19 74 78 +337 47 51 81 55 +338 47 81 51 41 +339 59 46 81 64 +340 81 46 59 42 +$EndElements diff --git a/docs/examples/meshes/oriented_squares.msh b/docs/examples/meshes/oriented_squares.msh new file mode 100644 index 00000000..27e06755 --- /dev/null +++ b/docs/examples/meshes/oriented_squares.msh @@ -0,0 +1,680 @@ +$MeshFormat +4.1 0 8 +$EndMeshFormat +$PhysicalNames +5 +0 2 "poly_exterior_points" +1 1 "poly_exterior" +1 5 "poly_box___background" +2 3 "poly_box" +2 4 "background" +$EndPhysicalNames +$Entities +12 12 2 0 +1 0.8 0.6 0 1 2 +2 0.8 0.8 0 1 2 +3 0.6 0.8 0 1 2 +4 0.6 0.6 0 1 2 +5 0.2 0.2 0 0 +6 0.4 0.2 0 0 +7 0.4 0.4 0 0 +8 0.2 0.4 0 0 +9 0 1 0 0 +10 1 1 0 0 +11 1 0 0 0 +12 0 0 0 0 +1 0.7999999000000001 0.5999999 -1e-07 0.8000001 0.8000001 1e-07 1 1 2 1 -2 +2 0.5999999 0.7999999000000001 -1e-07 0.8000001 0.8000001 1e-07 1 1 2 2 -3 +3 0.5999999 0.5999999 -1e-07 0.6000000999999999 0.8000001 1e-07 1 1 2 3 -4 +4 0.5999999 0.5999999 -1e-07 0.8000001 0.6000000999999999 1e-07 1 1 2 4 -1 +5 0.1999999 0.1999999 -1e-07 0.4000001 0.2000001 1e-07 1 5 2 5 -6 +6 0.3999999 0.1999999 -1e-07 0.4000001 0.4000001 1e-07 1 5 2 6 -7 +7 0.1999999 0.3999999 -1e-07 0.4000001 0.4000001 1e-07 1 5 2 7 -8 +8 0.1999999 0.1999999 -1e-07 0.2000001 0.4000001 1e-07 1 5 2 8 -5 +9 -9.999999994736442e-08 0.9999999000000001 -1e-07 1.0000001 1.0000001 1e-07 0 2 9 -10 +10 0.9999999000000001 -9.999999994736442e-08 -1e-07 1.0000001 1.0000001 1e-07 0 2 10 -11 +11 -9.999999994736442e-08 -1e-07 -1e-07 1.0000001 1e-07 1e-07 0 2 11 -12 +12 -1e-07 -9.999999994736442e-08 -1e-07 1e-07 1.0000001 1e-07 0 2 12 -9 +1 0.1999999 0.1999999 -1e-07 0.4000001 0.4000001 1e-07 1 3 4 5 6 7 8 +2 -9.999999994736442e-08 -9.999999994736442e-08 -1e-07 1.0000001 1.0000001 1e-07 1 4 8 9 10 11 12 -8 -7 -6 -5 +$EndEntities +$Nodes +26 154 1 154 +0 1 0 1 +1 +0.8 0.6 0 +0 2 0 1 +2 +0.8 0.8 0 +0 3 0 1 +3 +0.6 0.8 0 +0 4 0 1 +4 +0.6 0.6 0 +0 5 0 1 +5 +0.2 0.2 0 +0 6 0 1 +6 +0.4 0.2 0 +0 7 0 1 +7 +0.4 0.4 0 +0 8 0 1 +8 +0.2 0.4 0 +0 9 0 1 +9 +0 1 0 +0 10 0 1 +10 +1 1 0 +0 11 0 1 +11 +1 0 0 +0 12 0 1 +12 +0 0 0 +1 1 0 1 +13 +0.8 0.7000000000000001 0 +1 2 0 1 +14 +0.7 0.8 0 +1 3 0 1 +15 +0.6 0.7 0 +1 4 0 1 +16 +0.7000000000000001 0.6 0 +1 5 0 1 +17 +0.3000000000000001 0.2 0 +1 6 0 1 +18 +0.4 0.3000000000000001 0 +1 7 0 1 +19 +0.2999999999999999 0.4 0 +1 8 0 1 +20 +0.2 0.2999999999999999 0 +1 9 0 9 +21 +22 +23 +24 +25 +26 +27 +28 +29 +0.1 1 0 +0.2 1 0 +0.3 1 0 +0.4 1 0 +0.5 1 0 +0.6 1 0 +0.7 1 0 +0.8 1 0 +0.9 1 0 +1 10 0 9 +30 +31 +32 +33 +34 +35 +36 +37 +38 +1 0.9 0 +1 0.8 0 +1 0.7 0 +1 0.6 0 +1 0.5 0 +1 0.4 0 +1 0.3 0 +1 0.2 0 +1 0.09999999999999998 0 +1 11 0 9 +39 +40 +41 +42 +43 +44 +45 +46 +47 +0.9 0 0 +0.8 0 0 +0.7 0 0 +0.6 0 0 +0.5 0 0 +0.4 0 0 +0.3 0 0 +0.2 0 0 +0.09999999999999998 0 0 +1 12 0 9 +48 +49 +50 +51 +52 +53 +54 +55 +56 +0 0.1 0 +0 0.2 0 +0 0.3 0 +0 0.4 0 +0 0.5 0 +0 0.6 0 +0 0.7 0 +0 0.8 0 +0 0.9 0 +2 1 0 5 +57 +58 +59 +60 +61 +0.3 0.3 0 +0.2500000000000001 0.25 0 +0.25 0.35 0 +0.35 0.2500000000000001 0 +0.35 0.35 0 +2 2 0 93 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +0.2857087140542529 0.7027965854483386 0 +0.7072948847680665 0.3187895852654751 0 +0.4277460647222577 0.5699188359186236 0 +0.5699289219764908 0.1690462656218427 0 +0.1719125819342891 0.8246965130311307 0 +0.1800209612164645 0.5682954065864039 0 +0.8307754756233028 0.4295511566551835 0 +0.4319734785939261 0.8252241278787211 0 +0.5658443445579024 0.4174479462631396 0 +0.8293074968412237 0.1861345036917084 0 +0.5321428571428571 0.3 0 +0.3 0.8678571428571429 0 +0.7 0.4678571428571428 0 +0.2966129924991471 0.5302528716154167 0 +0.4678571428571428 0.7 0 +0.7 0.1321428571428572 0 +0.8678571428571429 0.3 0 +0.1321428571428573 0.7000000000000001 0 +0.8717443885448917 0.8720965557275543 0 +0.1282556114551083 0.1279034442724458 0 +0.1198972467622004 0.4836715461396731 0 +0.4712631291821714 0.1161521909480822 0 +0.8813880433377719 0.5160720923414683 0 +0.5289309933250139 0.8832631553274856 0 +0.2562091503267974 0.09550653594771247 0 +0.09518654307323382 0.3431508639242452 0 +0.9048134569267663 0.6568491360757548 0 +0.7437908496732026 0.9044934640522876 0 +0.5277668024946996 0.5270258945067953 0 +0.0941173478221472 0.2528570153324035 0 +0.3604771828738277 0.09893391628664749 0 +0.9058826521778528 0.7471429846675965 0 +0.6395329234624481 0.9010356456810518 0 +0.1053436668628609 0.8942324700078166 0 +0.8948088429840781 0.1071214070825383 0 +0.7000000000000001 0.7 0 +0.2160714285714286 0.6589285714285714 0 +0.3859804878598561 0.651097795464882 0 +0.2671262071068797 0.7974992900944085 0 +0.6589285714285714 0.3839285714285714 0 +0.6649938479458437 0.2128554129427227 0 +0.7898575390102307 0.3430836387384822 0 +0.5172493520752131 0.782700156340127 0 +0.477672328049083 0.3782057846822828 0 +0.6162553648068669 0.09160790925812384 0 +0.09354803699150605 0.7876399052772201 0 +0.383744635193133 0.4916079092581239 0 +0.2184345614416494 0.4807765204082488 0 +0.2142499099706442 0.904159903881121 0 +0.6162553648068669 0.5083920907418761 0 +0.9083920907418761 0.3837446351931331 0 +0.4916079092581239 0.216255364806867 0 +0.7887776618071094 0.09467664510370433 0 +0.0916079092581239 0.616255364806867 0 +0.7837446351931331 0.5083920907418761 0 +0.5083920907418762 0.6162553648068669 0 +0.383744635193133 0.9083920907418761 0 +0.9083920907418761 0.216255364806867 0 +0.7686675196895753 0.257172466604094 0 +0.3652233728645003 0.7490743566500291 0 +0.2862077840221911 0.615513718218897 0 +0.6184859307688352 0.3133615659946519 0 +0.4625032761265737 0.4625032761265737 0 +0.07139555937582542 0.54566128235992 0 +0.4563166857361401 0.9301740338153175 0 +0.5463928074582963 0.07147832926346143 0 +0.9265269168055481 0.4496000491029589 0 +0.1902710641778834 0.7499172677920727 0 +0.7499172677920727 0.4097289358221165 0 +0.8210784313725492 0.9269607843137255 0 +0.1789215686274509 0.07303921568627458 0 +0.9304824561403509 0.8260087719298248 0 +0.06951754385964914 0.1739912280701753 0 +0.07520175285026293 0.07499212952724954 0 +0.9247982471497371 0.9250078704727506 0 +0.9258506391273172 0.5806328811226138 0 +0.07421627518442653 0.4193537722760295 0 +0.7518396507899463 0.1801398507175316 0 +0.3511224373459358 0.8238390862335242 0 +0.5785074127741883 0.2446763707849486 0 +0.3544879734663441 0.5765922763847793 0 +0.5702142377697096 0.9420922324263443 0 +0.4298222316666228 0.05779792975995335 0 +0.9508002334314886 0.1558441929723514 0 +0.04972292596359174 0.8454680938212591 0 +0.8458966261977969 0.0504495130465607 0 +0.1548983942083763 0.9495980934722343 0 +0.05133591671571514 0.9485581175019542 0 +0.9487022107460195 0.05178035177063461 0 +0.65 0.75 0 +0.65 0.6499999999999999 0 +0.75 0.65 0 +0.75 0.75 0 +$EndNodes +$Elements +14 286 1 286 +0 1 15 1 +1 1 +0 2 15 1 +2 2 +0 3 15 1 +3 3 +0 4 15 1 +4 4 +1 1 1 2 +5 1 13 +6 13 2 +1 2 1 2 +7 2 14 +8 14 3 +1 3 1 2 +9 3 15 +10 15 4 +1 4 1 2 +11 4 16 +12 16 1 +1 5 1 2 +13 5 17 +14 17 6 +1 6 1 2 +15 6 18 +16 18 7 +1 7 1 2 +17 7 19 +18 19 8 +1 8 1 2 +19 8 20 +20 20 5 +2 1 2 16 +21 17 58 5 +22 18 60 6 +23 19 61 7 +24 20 59 8 +25 57 58 17 +26 17 60 57 +27 57 59 58 +28 57 60 18 +29 18 61 57 +30 59 61 19 +31 58 59 20 +32 57 61 59 +33 5 58 20 +34 6 60 17 +35 7 61 18 +36 8 59 19 +2 2 2 250 +37 79 115 54 +38 76 104 15 +39 74 111 16 +40 72 113 18 +41 54 107 79 +42 19 109 75 +43 75 108 19 +44 23 118 73 +45 78 112 36 +46 41 106 77 +47 77 114 41 +48 18 105 72 +49 36 119 78 +50 15 117 76 +51 16 116 74 +52 73 110 23 +53 67 122 75 +54 70 123 72 +55 81 134 5 +56 80 133 2 +57 5 134 91 +58 2 133 93 +59 71 120 78 +60 76 121 69 +61 83 92 6 +62 85 94 3 +63 72 105 70 +64 75 109 67 +65 69 104 76 +66 78 119 71 +67 100 110 73 +68 99 117 64 +69 102 106 65 +70 76 117 99 +71 77 106 102 +72 70 111 101 +73 103 112 78 +74 67 115 98 +75 68 112 103 +76 98 115 79 +77 66 110 100 +78 101 111 74 +79 1 137 84 +80 8 138 82 +81 5 132 81 +82 2 131 80 +83 88 137 1 +84 87 138 8 +85 83 144 92 +86 85 143 94 +87 87 91 50 +88 17 92 86 +89 20 91 87 +90 13 93 88 +91 86 92 45 +92 14 94 89 +93 88 93 32 +94 89 94 27 +95 89 131 2 +96 86 132 5 +97 18 113 6 +98 1 116 16 +99 15 104 3 +100 16 111 4 +101 24 118 23 +102 37 119 36 +103 19 108 7 +104 54 115 53 +105 55 107 54 +106 36 112 35 +107 41 114 40 +108 8 109 19 +109 7 105 18 +110 42 106 41 +111 23 110 22 +112 4 117 15 +113 2 93 13 +114 3 94 14 +115 27 94 26 +116 50 91 49 +117 5 91 20 +118 6 92 17 +119 32 93 31 +120 45 92 44 +121 14 89 2 +122 17 86 5 +123 51 87 50 +124 46 86 45 +125 20 87 8 +126 33 88 32 +127 13 88 1 +128 28 89 27 +129 90 124 64 +130 70 124 90 +131 100 121 62 +132 63 120 102 +133 98 129 62 +134 101 130 63 +135 100 140 121 +136 120 139 102 +137 6 113 83 +138 83 113 65 +139 82 109 8 +140 68 116 84 +141 84 116 1 +142 85 104 69 +143 3 104 85 +144 67 109 82 +145 69 126 85 +146 82 125 67 +147 65 127 83 +148 84 128 68 +149 101 123 70 +150 98 122 67 +151 95 110 66 +152 66 107 95 +153 71 119 96 +154 96 114 71 +155 62 129 100 +156 63 130 103 +157 95 148 110 +158 107 146 95 +159 96 147 114 +160 119 145 96 +161 82 138 52 +162 84 137 34 +163 105 124 70 +164 64 124 108 +165 47 135 132 +166 29 136 131 +167 25 143 85 +168 43 144 83 +169 132 135 81 +170 131 136 80 +171 90 117 4 +172 64 117 90 +173 4 111 90 +174 90 111 70 +175 34 128 84 +176 52 125 82 +177 83 127 43 +178 85 126 25 +179 67 125 115 +180 118 126 69 +181 106 127 65 +182 68 128 112 +183 51 138 87 +184 33 137 88 +185 134 135 48 +186 133 136 30 +187 34 137 33 +188 52 138 51 +189 46 132 86 +190 28 131 89 +191 47 132 46 +192 29 131 28 +193 78 120 103 +194 99 121 76 +195 81 135 134 +196 80 136 133 +197 99 122 62 +198 102 123 63 +199 92 144 44 +200 94 143 26 +201 44 144 43 +202 26 143 25 +203 91 134 49 +204 93 133 31 +205 49 134 48 +206 31 133 30 +207 116 130 74 +208 68 130 116 +209 66 129 107 +210 107 129 79 +211 62 121 99 +212 103 120 63 +213 35 128 34 +214 25 126 24 +215 43 127 42 +216 53 125 52 +217 99 142 122 +218 102 141 123 +219 73 140 100 +220 102 139 77 +221 10 136 29 +222 48 135 12 +223 12 135 47 +224 30 136 10 +225 74 130 101 +226 79 129 98 +227 39 147 96 +228 96 145 38 +229 21 148 95 +230 95 146 56 +231 96 150 39 +232 95 149 21 +233 38 150 96 +234 56 149 95 +235 7 124 105 +236 108 124 7 +237 114 139 71 +238 69 140 118 +239 77 139 114 +240 118 140 73 +241 72 141 113 +242 108 142 64 +243 113 141 65 +244 75 142 108 +245 63 123 101 +246 62 122 98 +247 115 125 53 +248 24 126 118 +249 112 128 35 +250 42 127 106 +251 22 148 21 +252 40 147 39 +253 38 145 37 +254 56 146 55 +255 21 149 9 +256 11 150 38 +257 9 149 56 +258 39 150 11 +259 1 153 13 +260 2 154 14 +261 14 151 3 +262 3 151 15 +263 15 152 4 +264 4 152 16 +265 13 153 97 +266 97 154 13 +267 97 151 14 +268 14 154 97 +269 151 152 15 +270 97 152 151 +271 97 153 152 +272 16 153 1 +273 13 154 2 +274 152 153 16 +275 64 142 99 +276 65 141 102 +277 100 129 66 +278 103 130 68 +279 37 145 119 +280 55 146 107 +281 114 147 40 +282 110 148 22 +283 71 139 120 +284 121 140 69 +285 122 142 75 +286 123 141 72 +$EndElements diff --git a/skfem/io/meshio.py b/skfem/io/meshio.py index f9913531..d16d1b53 100644 --- a/skfem/io/meshio.py +++ b/skfem/io/meshio.py @@ -136,7 +136,10 @@ def from_meshio(m, ind = p2f[:, sorted_facets[0]] for itr in range(sorted_facets.shape[0] - 1): ind = ind.multiply(p2f[:, sorted_facets[itr + 1]]) - boundaries[k] = np.nonzero(ind)[0].astype(np.int32) + # does not preserve order: + # boundaries[k] = np.nonzero(ind)[0].astype(np.int32) + ii, jj = ind.nonzero() + boundaries[k] = ii[np.argsort(jj)] if not ignore_orientation: try: @@ -154,6 +157,8 @@ def from_meshio(m, normals = -np.cross(tangents1.T, tangents2.T).T else: raise NotImplementedError + # perform a dot product between the proposed normal + # and the edges of the element to fix the orientation for itr in range(mtmp.t.shape[0]): ori += np.sum(normals * (mtmp.p[:, facets[0]] diff --git a/tests/test_autodiff.py b/tests/test_autodiff.py index f39af4b5..262193fd 100644 --- a/tests/test_autodiff.py +++ b/tests/test_autodiff.py @@ -2,6 +2,7 @@ import numpy as np from numpy.testing import (assert_array_almost_equal, assert_almost_equal) + try: import jax.numpy as jnp from skfem.experimental.autodiff import NonlinearForm @@ -10,8 +11,10 @@ div, sym_grad, transpose, eye, trace) -except: - pass +except Exception: + def NonlinearForm(x): + raise Exception("jax failed to import") + from skfem.assembly import Basis from skfem.mesh import MeshTri, MeshQuad from skfem.element import (ElementTriP1, ElementTriP2, diff --git a/tests/test_mesh.py b/tests/test_mesh.py index 8d7c1ef3..abf42c65 100644 --- a/tests/test_mesh.py +++ b/tests/test_mesh.py @@ -11,9 +11,10 @@ MeshTri1DG, MeshTri2, MeshQuad2, MeshTet2, MeshHex2) from skfem.assembly import Basis, LinearForm, Functional, FacetBasis from skfem.element import (ElementTetP1, ElementTriP0, ElementQuad0, - ElementHex0) + ElementHex0, ElementTriP1) from skfem.utils import projection from skfem.io.meshio import to_meshio, from_meshio +from skfem.helpers import dot MESH_PATH = Path(__file__).parents[1] / 'docs' / 'examples' / 'meshes' @@ -866,3 +867,36 @@ def test_restrict_reverse_map(): p2 = p2[:, I] assert_array_equal(p1, p2) + + +HELPER_TETMESH = MeshTet().refined(2).with_subdomains({'sub': lambda x: ((x[0] < 0.75) + * (x[1] < 0.75) + * (x[2] < 0.75) + * (x[0] > 0.25) + * (x[1] > 0.25) + * (x[2] > 0.25))}) + + +@pytest.mark.parametrize( + "mesh, volume, etype", + [ + (MeshTri.load(MESH_PATH / 'oriented_squares.msh'), 0.2 ** 2, ElementTriP1), + (HELPER_TETMESH.with_boundaries({'subif': HELPER_TETMESH.facets_around('sub')}), + 0.5 ** 3, ElementTetP1), + (MeshTet.load(MESH_PATH / 'cube_oriented_sub.msh'), + 0.5 ** 3, ElementTetP1), + ] +) +def test_load_orientation(mesh, volume, etype): + + for k, v in mesh.boundaries.items(): + fbasis = FacetBasis(mesh, etype(), facets=k) + + @Functional + def form(w): + # calculate volume using Gauss divergence theorem + return dot(w.x / 2, w.n) + + np.testing.assert_almost_equal(form.assemble(fbasis), + volume, + 1e-10)