diff --git a/README.md b/README.md new file mode 100644 index 0000000..ae12d0d --- /dev/null +++ b/README.md @@ -0,0 +1,12 @@ +### Compile + +```shell +g++ main.cpp --std=c++11 -o a.exe +``` + +### Run + +```shell +./a.exe +``` + diff --git a/cube.geo b/cube.geo new file mode 100644 index 0000000..9c5fe79 --- /dev/null +++ b/cube.geo @@ -0,0 +1,24 @@ +//+ +Point(1) = {40, 40, -20, 5}; +//+ +Point(2) = {60, 40, -20, 5}; +//+ +Point(3) = {60, 60, -20, 5}; +//+ +Point(4) = {40, 60, -20, 5}; +//+ +Line(1) = {4, 1}; +//+ +Line(2) = {1, 2}; +//+ +Line(3) = {2, 3}; +//+ +Line(4) = {3, 4}; +//+ +Curve Loop(1) = {1, 2, 3, 4}; +//+ +Plane Surface(1) = {1}; +//+ +Extrude {0, 0, -40} { + Surface{1}; +} diff --git a/cube.msh b/cube.msh new file mode 100644 index 0000000..34fd66c --- /dev/null +++ b/cube.msh @@ -0,0 +1,1503 @@ +$MeshFormat +2.2 0 8 +$EndMeshFormat +$Nodes +247 +1 40 40 -20 +2 60 40 -20 +3 60 60 -20 +4 40 60 -20 +5 40 60 -60 +6 40 40 -60 +7 60 40 -60 +8 60 60 -60 +9 40 55 -20 +10 40 50 -20 +11 40 45 -20 +12 45 40 -20 +13 50 40 -20 +14 55 40 -20 +15 60 45 -20 +16 60 50 -20 +17 60 55 -20 +18 55 60 -20 +19 50 60 -20 +20 45 60 -20 +21 40 55 -60 +22 40 50 -60 +23 40 45 -60 +24 45 40 -60 +25 50 40 -60 +26 55 40 -60 +27 60 45 -60 +28 60 50 -60 +29 60 55 -60 +30 55 60 -60 +31 50 60 -60 +32 45 60 -60 +33 40 60 -25 +34 40 60 -30 +35 40 60 -35 +36 40 60 -40 +37 40 60 -45 +38 40 60 -50 +39 40 60 -55 +40 40 40 -25 +41 40 40 -30 +42 40 40 -35 +43 40 40 -40 +44 40 40 -45 +45 40 40 -50 +46 40 40 -55 +47 60 40 -25 +48 60 40 -30 +49 60 40 -35 +50 60 40 -40 +51 60 40 -45 +52 60 40 -50 +53 60 40 -55 +54 60 60 -25 +55 60 60 -30 +56 60 60 -35 +57 60 60 -40 +58 60 60 -45 +59 60 60 -50 +60 60 60 -55 +61 44.33012701892219 52.5 -20 +62 52.47881315359561 44.23386022527915 -20 +63 55.90776374537427 52.7192820837686 -20 +64 47.5198999874148 44.22801311682172 -20 +65 49.99999999999999 48.66025403784437 -20 +66 44.25171350736355 47.34142019875174 -20 +67 49.59311491861806 54.16545355279478 -20 +68 55.26848172135622 47.98009581137518 -20 +69 46.20627653014991 56.4630216184953 -20 +70 52.5 56.89419619426319 -20 +71 56.33974596215563 43.66025403784438 -20 +72 43.6602540378444 43.6602540378444 -20 +73 56.43804438938708 56.50081586651419 -20 +74 52.33556481836142 51.7680829920907 -20 +75 42.91853012842775 57.0303908070383 -20 +76 40 55.66987300184925 -32.5000000113757 +77 40 55.62170870995391 -42.90931182020138 +78 40 44.28061564305696 -36.95381400428283 +79 40 44.33012698467979 -47.49999995820747 +80 40 47.1646564400433 -24.04676791925302 +81 40 52.83534355618719 -55.95323209459164 +82 40 55.88256244991806 -27.64857961057699 +83 40 51.69103168957512 -29.9802887870698 +84 40 51.55835657225984 -34.81330442472456 +85 40 47.04374159621546 -32.37826512039101 +86 40 44.27686232938436 -42.44414598262877 +87 40 48.70521004731255 -44.60371484044391 +88 40 48.33831241568355 -49.95002364727866 +89 40 52.99038105676659 -47.49999999999999 +90 40 44.08544538699604 -52.33925909231164 +91 40 55.66987300385073 -37.50000003944386 +92 40 51.33974597354208 -40 +93 40 47.88173635212868 -55.39941370770136 +94 40 52.11960011707489 -24.59321271353804 +95 40 55.9280185310072 -52.09709342192372 +96 40 44.07194985585959 -27.88440185934383 +97 40 47.38912057247744 -40 +98 40 43.05899356297641 -32.5 +99 40 56.94100645286218 -47.5 +100 40 51.78984602866008 -52.15065348669999 +101 40 48.22054812287348 -27.80171904995707 +102 40 43.66025412577325 -56.33974592196372 +103 40 56.3397459891188 -23.66025403149145 +104 40 43.63479633112006 -23.63479631400501 +105 40 56.42743424998783 -56.38577081329036 +106 40 52.17254085305474 -43.75578226254463 +107 40 48.17257024927211 -36.82230670823676 +108 44.33012699815075 40 -32.5000000113757 +109 44.37829129004609 40 -42.90931182020138 +110 55.71938435694304 40 -36.95381400428283 +111 55.66987301532021 40 -47.49999995820747 +112 52.8353435599567 40 -24.04676791925302 +113 47.16465644381281 40 -55.95323209459164 +114 44.11743755008194 40 -27.64857961057699 +115 48.30896831042488 40 -29.9802887870698 +116 48.44164342774016 40 -34.81330442472456 +117 52.95625840378454 40 -32.37826512039101 +118 55.72313767061564 40 -42.44414598262877 +119 51.29478995268745 40 -44.60371484044391 +120 51.66168758431645 40 -49.95002364727866 +121 47.00961894323341 40 -47.49999999999999 +122 55.91455461300396 40 -52.33925909231164 +123 44.33012699614927 40 -37.50000003944386 +124 48.66025402645792 40 -40 +125 52.11826364787132 40 -55.39941370770136 +126 47.88039988292511 40 -24.59321271353804 +127 44.0719814689928 40 -52.09709342192372 +128 55.92805014414041 40 -27.88440185934383 +129 52.61087942752256 40 -40 +130 56.94100643702359 40 -32.5 +131 43.05899354713782 40 -47.5 +132 48.21015397133992 40 -52.15065348669999 +133 51.77945187712652 40 -27.80171904995707 +134 56.33974587422675 40 -56.33974592196372 +135 43.6602540108812 40 -23.66025403149145 +136 56.36520366887994 40 -23.63479631400501 +137 43.57256575001217 40 -56.38577081329036 +138 47.82745914694526 40 -43.75578226254463 +139 51.82742975072789 40 -36.82230670823676 +140 60 44.33012700605263 -32.50000000471823 +141 60 44.33012699445203 -42.5 +142 60 55.66987298107781 -37.5 +143 60 55.71938435792165 -46.95381401949891 +144 60 52.8353435599567 -24.04676791925302 +145 60 47.35826575822929 -55.52838173624344 +146 60 44.11743755105241 -27.64857958872926 +147 60 48.30896829913632 -29.98028879029709 +148 60 48.44351857372245 -35.0291993408116 +149 60 52.99038105676657 -32.49999995441897 +150 60 44.3054727228573 -37.50154334149975 +151 60 48.47225937672385 -39.98544079704492 +152 60 48.48045836888323 -44.80860071953228 +153 60 52.94956421487052 -42.40161663732587 +154 60 44.28506986625315 -47.40769188154377 +155 60 48.79818897320219 -50.31013430041553 +156 60 56.02555683118558 -52.20072988807124 +157 60 47.8803998822573 -24.59321271221484 +158 60 52.25753251776506 -54.97591875371555 +159 60 44.04226656570481 -52.37793612776303 +160 60 55.92801853614489 -27.90290659461775 +161 60 52.94469114109066 -50.1705338945121 +162 60 51.71924744343475 -37.49999999665486 +163 60 56.94100643702359 -32.5 +164 60 56.94100645286215 -42.5 +165 60 51.78798964422036 -27.83535444102185 +166 60 43.66025411008142 -56.33974599979055 +167 60 56.47071433308309 -56.32866992217807 +168 60 43.6602540108812 -23.66025403149145 +169 60 56.42743425936698 -23.61422920812387 +170 60 51.91665707246482 -46.92602593271548 +171 44.33012701892219 60 -32.5 +172 44.33012701892219 60 -42.5 +173 55.61996731431292 60 -37.89146707269787 +174 55.66987298107781 60 -47.5 +175 52.61203526571141 60 -24.48889096502612 +176 47.97911138856856 60 -55.04485433888402 +177 44.2966062193063 60 -47.44036854247502 +178 48.52431381016081 60 -45.01579850674338 +179 48.68856906401597 60 -39.59210032102931 +180 52.99038105676658 60 -42.50000000000001 +181 48.19074011839159 60 -49.82846372714855 +182 55.66987298107781 60 -32.5 +183 51.28379784994524 60 -34.93605795615464 +184 51.63053685382478 60 -29.03680488696708 +185 47.61885779336686 60 -24.77211774092532 +186 44.33012702246549 60 -37.50000000613717 +187 52.81246698787066 60 -55.83591635732334 +188 43.92860008791197 60 -27.73420645626334 +189 56.07724696086309 60 -52.66898975647958 +190 44.03835678945791 60 -52.19999919973692 +191 56.01265127952331 60 -27.51787485116947 +192 47.24360505315122 60 -34.76404293826551 +193 51.5879555981803 60 -47.38956125792095 +194 56.9410064370236 60 -42.5 +195 47.64397458143291 60 -30.60020102426505 +196 56.33974589387547 60 -23.66025400249396 +197 43.5244910606049 60 -56.33991180018198 +198 56.33974590004345 60 -56.33974600991542 +199 43.66025409222772 60 -23.66025398859716 +200 52.06925431505151 60 -51.46187697446322 +201 52.12549207681533 60 -38.63904780755954 +202 44.33012701892219 52.5 -60 +203 52.47881315359561 44.23386022527915 -60 +204 55.90776374537427 52.7192820837686 -60 +205 47.5198999874148 44.22801311682172 -60 +206 49.99999999999999 48.66025403784437 -60 +207 44.25171350736355 47.34142019875174 -60 +208 49.59311491861806 54.16545355279478 -60 +209 55.26848172135622 47.98009581137518 -60 +210 46.20627653014991 56.4630216184953 -60 +211 52.5 56.89419619426319 -60 +212 56.33974596215563 43.66025403784438 -60 +213 43.6602540378444 43.6602540378444 -60 +214 56.43804438938708 56.50081586651419 -60 +215 52.33556481836142 51.7680829920907 -60 +216 42.91853012842775 57.0303908070383 -60 +217 50.01803159593382 50.01159507963293 -42.2712908972233 +218 50.00000000072515 50.00000000051538 -31.94146346738128 +219 51.26551367934412 51.05817870465192 -51.10736997493392 +220 53.25548702053861 53.3238619370227 -37.09698571136107 +221 53.56600118884175 46.53875433776545 -37.60797615692348 +222 46.73385460825654 46.8997135802337 -37.11558078911261 +223 46.53896617174052 53.62178144230245 -37.74541746890722 +224 46.56513225094761 47.04955421450057 -47.6776905304442 +225 46.76462307536552 53.74553490257823 -46.8564252489737 +226 53.19204874828513 46.22299982806753 -46.83999982537482 +227 46.79151837298514 46.69314454729436 -26.58297807343957 +228 53.26479612987021 53.3988262158795 -26.75322037781508 +229 46.46022358298769 53.65811657271762 -27.37580697922912 +230 53.62108582292984 46.56590038458154 -27.128135089467 +231 53.88307508376627 53.82604437725152 -45.84190272590563 +232 48.06394071145723 46.20483199036511 -53.88931513590841 +233 45.97667532147319 53.87831539114678 -53.62145674852533 +234 54.14957890906827 45.9179841997307 -52.92571297286233 +235 47.04840023745955 45.32884540816536 -42.42635609402375 +236 44.68272215822243 50.10856785015773 -42.24321914995893 +237 54.61710312470041 54.57626826908758 -54.43002135983722 +238 55.17373641321365 48.46910986569141 -42.36810651716949 +239 45.3606470573152 45.4764703152153 -31.86749104860974 +240 49.02362737977172 55.3075121578932 -42.22012041977568 +241 44.8017701987516 53.00343763991406 -32.57127447478628 +242 55.20952500567148 47.04000765194006 -32.37781286483231 +243 50.31372507016954 44.86921150182091 -33.73284711521017 +244 49.60028457974536 55.0192704218029 -33.63493656433332 +245 52.00167200309098 44.58666085460386 -41.97092906790815 +246 54.73031109158702 54.28143908978858 -31.93309435386986 +247 55.35453682351761 55.35453681530334 -41.23912975451476 +$EndNodes +$Elements +1247 +1 15 2 0 1 1 +2 15 2 0 2 2 +3 15 2 0 3 3 +4 15 2 0 4 4 +5 15 2 0 5 5 +6 15 2 0 6 6 +7 15 2 0 10 7 +8 15 2 0 14 8 +9 1 2 0 1 4 9 +10 1 2 0 1 9 10 +11 1 2 0 1 10 11 +12 1 2 0 1 11 1 +13 1 2 0 2 1 12 +14 1 2 0 2 12 13 +15 1 2 0 2 13 14 +16 1 2 0 2 14 2 +17 1 2 0 3 2 15 +18 1 2 0 3 15 16 +19 1 2 0 3 16 17 +20 1 2 0 3 17 3 +21 1 2 0 4 3 18 +22 1 2 0 4 18 19 +23 1 2 0 4 19 20 +24 1 2 0 4 20 4 +25 1 2 0 6 5 21 +26 1 2 0 6 21 22 +27 1 2 0 6 22 23 +28 1 2 0 6 23 6 +29 1 2 0 7 6 24 +30 1 2 0 7 24 25 +31 1 2 0 7 25 26 +32 1 2 0 7 26 7 +33 1 2 0 8 7 27 +34 1 2 0 8 27 28 +35 1 2 0 8 28 29 +36 1 2 0 8 29 8 +37 1 2 0 9 8 30 +38 1 2 0 9 30 31 +39 1 2 0 9 31 32 +40 1 2 0 9 32 5 +41 1 2 0 11 4 33 +42 1 2 0 11 33 34 +43 1 2 0 11 34 35 +44 1 2 0 11 35 36 +45 1 2 0 11 36 37 +46 1 2 0 11 37 38 +47 1 2 0 11 38 39 +48 1 2 0 11 39 5 +49 1 2 0 12 1 40 +50 1 2 0 12 40 41 +51 1 2 0 12 41 42 +52 1 2 0 12 42 43 +53 1 2 0 12 43 44 +54 1 2 0 12 44 45 +55 1 2 0 12 45 46 +56 1 2 0 12 46 6 +57 1 2 0 16 2 47 +58 1 2 0 16 47 48 +59 1 2 0 16 48 49 +60 1 2 0 16 49 50 +61 1 2 0 16 50 51 +62 1 2 0 16 51 52 +63 1 2 0 16 52 53 +64 1 2 0 16 53 7 +65 1 2 0 20 3 54 +66 1 2 0 20 54 55 +67 1 2 0 20 55 56 +68 1 2 0 20 56 57 +69 1 2 0 20 57 58 +70 1 2 0 20 58 59 +71 1 2 0 20 59 60 +72 1 2 0 20 60 8 +73 2 2 0 1 11 1 72 +74 2 2 0 1 1 12 72 +75 2 2 0 1 14 2 71 +76 2 2 0 1 2 15 71 +77 2 2 0 1 17 3 73 +78 2 2 0 1 3 18 73 +79 2 2 0 1 4 9 75 +80 2 2 0 1 20 4 75 +81 2 2 0 1 9 10 61 +82 2 2 0 1 9 61 75 +83 2 2 0 1 10 11 66 +84 2 2 0 1 61 10 66 +85 2 2 0 1 66 11 72 +86 2 2 0 1 12 13 64 +87 2 2 0 1 12 64 72 +88 2 2 0 1 13 14 62 +89 2 2 0 1 13 62 64 +90 2 2 0 1 62 14 71 +91 2 2 0 1 15 16 68 +92 2 2 0 1 15 68 71 +93 2 2 0 1 16 17 63 +94 2 2 0 1 16 63 68 +95 2 2 0 1 63 17 73 +96 2 2 0 1 18 19 70 +97 2 2 0 1 18 70 73 +98 2 2 0 1 19 20 69 +99 2 2 0 1 67 19 69 +100 2 2 0 1 19 67 70 +101 2 2 0 1 69 20 75 +102 2 2 0 1 65 61 66 +103 2 2 0 1 61 65 67 +104 2 2 0 1 61 67 69 +105 2 2 0 1 61 69 75 +106 2 2 0 1 64 62 65 +107 2 2 0 1 65 62 68 +108 2 2 0 1 68 62 71 +109 2 2 0 1 68 63 74 +110 2 2 0 1 70 63 73 +111 2 2 0 1 63 70 74 +112 2 2 0 1 64 65 66 +113 2 2 0 1 64 66 72 +114 2 2 0 1 67 65 74 +115 2 2 0 1 65 68 74 +116 2 2 0 1 70 67 74 +117 2 2 0 13 1 104 11 +118 2 2 0 13 40 104 1 +119 2 2 0 13 9 103 4 +120 2 2 0 13 4 103 33 +121 2 2 0 13 5 105 21 +122 2 2 0 13 39 105 5 +123 2 2 0 13 23 102 6 +124 2 2 0 13 6 102 46 +125 2 2 0 13 10 94 9 +126 2 2 0 13 94 103 9 +127 2 2 0 13 11 80 10 +128 2 2 0 13 80 94 10 +129 2 2 0 13 11 104 80 +130 2 2 0 13 21 81 22 +131 2 2 0 13 21 105 81 +132 2 2 0 13 22 93 23 +133 2 2 0 13 81 93 22 +134 2 2 0 13 93 102 23 +135 2 2 0 13 33 82 34 +136 2 2 0 13 33 103 82 +137 2 2 0 13 34 76 35 +138 2 2 0 13 34 82 76 +139 2 2 0 13 35 91 36 +140 2 2 0 13 76 91 35 +141 2 2 0 13 36 77 37 +142 2 2 0 13 36 91 77 +143 2 2 0 13 37 99 38 +144 2 2 0 13 77 99 37 +145 2 2 0 13 38 95 39 +146 2 2 0 13 38 99 95 +147 2 2 0 13 95 105 39 +148 2 2 0 13 41 96 40 +149 2 2 0 13 96 104 40 +150 2 2 0 13 42 98 41 +151 2 2 0 13 41 98 96 +152 2 2 0 13 43 78 42 +153 2 2 0 13 78 98 42 +154 2 2 0 13 44 86 43 +155 2 2 0 13 43 86 78 +156 2 2 0 13 45 79 44 +157 2 2 0 13 79 86 44 +158 2 2 0 13 46 90 45 +159 2 2 0 13 45 90 79 +160 2 2 0 13 46 102 90 +161 2 2 0 13 82 83 76 +162 2 2 0 13 83 84 76 +163 2 2 0 13 84 91 76 +164 2 2 0 13 89 99 77 +165 2 2 0 13 77 106 89 +166 2 2 0 13 91 92 77 +167 2 2 0 13 92 106 77 +168 2 2 0 13 85 98 78 +169 2 2 0 13 78 107 85 +170 2 2 0 13 86 97 78 +171 2 2 0 13 97 107 78 +172 2 2 0 13 79 87 86 +173 2 2 0 13 79 88 87 +174 2 2 0 13 79 90 88 +175 2 2 0 13 80 101 94 +176 2 2 0 13 96 101 80 +177 2 2 0 13 80 104 96 +178 2 2 0 13 81 100 93 +179 2 2 0 13 95 100 81 +180 2 2 0 13 81 105 95 +181 2 2 0 13 82 94 83 +182 2 2 0 13 82 103 94 +183 2 2 0 13 83 85 84 +184 2 2 0 13 83 101 85 +185 2 2 0 13 94 101 83 +186 2 2 0 13 85 107 84 +187 2 2 0 13 84 92 91 +188 2 2 0 13 84 107 92 +189 2 2 0 13 96 98 85 +190 2 2 0 13 85 101 96 +191 2 2 0 13 87 97 86 +192 2 2 0 13 88 89 87 +193 2 2 0 13 89 106 87 +194 2 2 0 13 92 97 87 +195 2 2 0 13 87 106 92 +196 2 2 0 13 88 100 89 +197 2 2 0 13 90 93 88 +198 2 2 0 13 93 100 88 +199 2 2 0 13 95 99 89 +200 2 2 0 13 89 100 95 +201 2 2 0 13 90 102 93 +202 2 2 0 13 92 107 97 +203 2 2 0 17 12 135 1 +204 2 2 0 17 1 135 40 +205 2 2 0 17 2 136 14 +206 2 2 0 17 47 136 2 +207 2 2 0 17 6 137 24 +208 2 2 0 17 46 137 6 +209 2 2 0 17 26 134 7 +210 2 2 0 17 7 134 53 +211 2 2 0 17 13 126 12 +212 2 2 0 17 126 135 12 +213 2 2 0 17 14 112 13 +214 2 2 0 17 112 126 13 +215 2 2 0 17 14 136 112 +216 2 2 0 17 24 113 25 +217 2 2 0 17 24 137 113 +218 2 2 0 17 25 125 26 +219 2 2 0 17 113 125 25 +220 2 2 0 17 125 134 26 +221 2 2 0 17 40 114 41 +222 2 2 0 17 40 135 114 +223 2 2 0 17 41 108 42 +224 2 2 0 17 41 114 108 +225 2 2 0 17 42 123 43 +226 2 2 0 17 108 123 42 +227 2 2 0 17 43 109 44 +228 2 2 0 17 43 123 109 +229 2 2 0 17 44 131 45 +230 2 2 0 17 109 131 44 +231 2 2 0 17 45 127 46 +232 2 2 0 17 45 131 127 +233 2 2 0 17 127 137 46 +234 2 2 0 17 48 128 47 +235 2 2 0 17 128 136 47 +236 2 2 0 17 49 130 48 +237 2 2 0 17 48 130 128 +238 2 2 0 17 50 110 49 +239 2 2 0 17 110 130 49 +240 2 2 0 17 51 118 50 +241 2 2 0 17 50 118 110 +242 2 2 0 17 52 111 51 +243 2 2 0 17 111 118 51 +244 2 2 0 17 53 122 52 +245 2 2 0 17 52 122 111 +246 2 2 0 17 53 134 122 +247 2 2 0 17 114 115 108 +248 2 2 0 17 115 116 108 +249 2 2 0 17 116 123 108 +250 2 2 0 17 121 131 109 +251 2 2 0 17 109 138 121 +252 2 2 0 17 123 124 109 +253 2 2 0 17 124 138 109 +254 2 2 0 17 117 130 110 +255 2 2 0 17 110 139 117 +256 2 2 0 17 118 129 110 +257 2 2 0 17 129 139 110 +258 2 2 0 17 111 119 118 +259 2 2 0 17 111 120 119 +260 2 2 0 17 111 122 120 +261 2 2 0 17 112 133 126 +262 2 2 0 17 128 133 112 +263 2 2 0 17 112 136 128 +264 2 2 0 17 113 132 125 +265 2 2 0 17 127 132 113 +266 2 2 0 17 113 137 127 +267 2 2 0 17 114 126 115 +268 2 2 0 17 114 135 126 +269 2 2 0 17 115 117 116 +270 2 2 0 17 115 133 117 +271 2 2 0 17 126 133 115 +272 2 2 0 17 117 139 116 +273 2 2 0 17 116 124 123 +274 2 2 0 17 116 139 124 +275 2 2 0 17 128 130 117 +276 2 2 0 17 117 133 128 +277 2 2 0 17 119 129 118 +278 2 2 0 17 120 121 119 +279 2 2 0 17 121 138 119 +280 2 2 0 17 124 129 119 +281 2 2 0 17 119 138 124 +282 2 2 0 17 120 132 121 +283 2 2 0 17 122 125 120 +284 2 2 0 17 125 132 120 +285 2 2 0 17 127 131 121 +286 2 2 0 17 121 132 127 +287 2 2 0 17 122 134 125 +288 2 2 0 17 124 139 129 +289 2 2 0 21 15 168 2 +290 2 2 0 21 2 168 47 +291 2 2 0 21 3 169 17 +292 2 2 0 21 54 169 3 +293 2 2 0 21 7 166 27 +294 2 2 0 21 53 166 7 +295 2 2 0 21 29 167 8 +296 2 2 0 21 8 167 60 +297 2 2 0 21 16 157 15 +298 2 2 0 21 157 168 15 +299 2 2 0 21 17 144 16 +300 2 2 0 21 144 157 16 +301 2 2 0 21 17 169 144 +302 2 2 0 21 27 145 28 +303 2 2 0 21 27 166 145 +304 2 2 0 21 28 158 29 +305 2 2 0 21 145 158 28 +306 2 2 0 21 158 167 29 +307 2 2 0 21 47 146 48 +308 2 2 0 21 47 168 146 +309 2 2 0 21 48 140 49 +310 2 2 0 21 48 146 140 +311 2 2 0 21 49 150 50 +312 2 2 0 21 140 150 49 +313 2 2 0 21 50 141 51 +314 2 2 0 21 50 150 141 +315 2 2 0 21 51 154 52 +316 2 2 0 21 141 154 51 +317 2 2 0 21 52 159 53 +318 2 2 0 21 154 159 52 +319 2 2 0 21 159 166 53 +320 2 2 0 21 55 160 54 +321 2 2 0 21 160 169 54 +322 2 2 0 21 56 163 55 +323 2 2 0 21 55 163 160 +324 2 2 0 21 57 142 56 +325 2 2 0 21 142 163 56 +326 2 2 0 21 58 164 57 +327 2 2 0 21 57 164 142 +328 2 2 0 21 59 143 58 +329 2 2 0 21 143 164 58 +330 2 2 0 21 60 156 59 +331 2 2 0 21 59 156 143 +332 2 2 0 21 60 167 156 +333 2 2 0 21 146 147 140 +334 2 2 0 21 147 148 140 +335 2 2 0 21 148 150 140 +336 2 2 0 21 150 151 141 +337 2 2 0 21 151 152 141 +338 2 2 0 21 152 154 141 +339 2 2 0 21 142 162 149 +340 2 2 0 21 149 163 142 +341 2 2 0 21 153 162 142 +342 2 2 0 21 142 164 153 +343 2 2 0 21 153 164 143 +344 2 2 0 21 143 170 153 +345 2 2 0 21 156 161 143 +346 2 2 0 21 161 170 143 +347 2 2 0 21 144 165 157 +348 2 2 0 21 160 165 144 +349 2 2 0 21 144 169 160 +350 2 2 0 21 155 158 145 +351 2 2 0 21 145 159 155 +352 2 2 0 21 145 166 159 +353 2 2 0 21 146 157 147 +354 2 2 0 21 146 168 157 +355 2 2 0 21 147 149 148 +356 2 2 0 21 147 165 149 +357 2 2 0 21 157 165 147 +358 2 2 0 21 149 162 148 +359 2 2 0 21 148 151 150 +360 2 2 0 21 148 162 151 +361 2 2 0 21 160 163 149 +362 2 2 0 21 149 165 160 +363 2 2 0 21 151 153 152 +364 2 2 0 21 151 162 153 +365 2 2 0 21 153 170 152 +366 2 2 0 21 152 155 154 +367 2 2 0 21 152 170 155 +368 2 2 0 21 155 159 154 +369 2 2 0 21 155 161 158 +370 2 2 0 21 155 170 161 +371 2 2 0 21 158 161 156 +372 2 2 0 21 156 167 158 +373 2 2 0 25 18 196 3 +374 2 2 0 25 3 196 54 +375 2 2 0 25 4 199 20 +376 2 2 0 25 33 199 4 +377 2 2 0 25 32 197 5 +378 2 2 0 25 5 197 39 +379 2 2 0 25 8 198 30 +380 2 2 0 25 60 198 8 +381 2 2 0 25 19 175 18 +382 2 2 0 25 175 196 18 +383 2 2 0 25 20 185 19 +384 2 2 0 25 19 185 175 +385 2 2 0 25 20 199 185 +386 2 2 0 25 30 187 31 +387 2 2 0 25 30 198 187 +388 2 2 0 25 31 176 32 +389 2 2 0 25 31 187 176 +390 2 2 0 25 176 197 32 +391 2 2 0 25 34 188 33 +392 2 2 0 25 188 199 33 +393 2 2 0 25 35 171 34 +394 2 2 0 25 171 188 34 +395 2 2 0 25 36 186 35 +396 2 2 0 25 35 186 171 +397 2 2 0 25 37 172 36 +398 2 2 0 25 172 186 36 +399 2 2 0 25 38 177 37 +400 2 2 0 25 37 177 172 +401 2 2 0 25 39 190 38 +402 2 2 0 25 38 190 177 +403 2 2 0 25 39 197 190 +404 2 2 0 25 54 191 55 +405 2 2 0 25 54 196 191 +406 2 2 0 25 55 182 56 +407 2 2 0 25 55 191 182 +408 2 2 0 25 56 173 57 +409 2 2 0 25 56 182 173 +410 2 2 0 25 57 194 58 +411 2 2 0 25 173 194 57 +412 2 2 0 25 58 174 59 +413 2 2 0 25 58 194 174 +414 2 2 0 25 59 189 60 +415 2 2 0 25 174 189 59 +416 2 2 0 25 189 198 60 +417 2 2 0 25 186 192 171 +418 2 2 0 25 171 195 188 +419 2 2 0 25 192 195 171 +420 2 2 0 25 177 178 172 +421 2 2 0 25 178 179 172 +422 2 2 0 25 179 186 172 +423 2 2 0 25 180 194 173 +424 2 2 0 25 173 201 180 +425 2 2 0 25 182 183 173 +426 2 2 0 25 183 201 173 +427 2 2 0 25 180 193 174 +428 2 2 0 25 174 194 180 +429 2 2 0 25 174 200 189 +430 2 2 0 25 193 200 174 +431 2 2 0 25 175 185 184 +432 2 2 0 25 184 191 175 +433 2 2 0 25 191 196 175 +434 2 2 0 25 181 190 176 +435 2 2 0 25 176 200 181 +436 2 2 0 25 187 200 176 +437 2 2 0 25 190 197 176 +438 2 2 0 25 177 181 178 +439 2 2 0 25 177 190 181 +440 2 2 0 25 178 180 179 +441 2 2 0 25 178 193 180 +442 2 2 0 25 181 193 178 +443 2 2 0 25 180 201 179 +444 2 2 0 25 183 192 179 +445 2 2 0 25 179 201 183 +446 2 2 0 25 179 192 186 +447 2 2 0 25 181 200 193 +448 2 2 0 25 182 184 183 +449 2 2 0 25 182 191 184 +450 2 2 0 25 184 195 183 +451 2 2 0 25 183 195 192 +452 2 2 0 25 185 195 184 +453 2 2 0 25 188 195 185 +454 2 2 0 25 185 199 188 +455 2 2 0 25 187 198 189 +456 2 2 0 25 189 200 187 +457 2 2 0 26 5 21 216 +458 2 2 0 26 32 5 216 +459 2 2 0 26 23 6 213 +460 2 2 0 26 6 24 213 +461 2 2 0 26 26 7 212 +462 2 2 0 26 7 27 212 +463 2 2 0 26 29 8 214 +464 2 2 0 26 8 30 214 +465 2 2 0 26 21 22 202 +466 2 2 0 26 21 202 216 +467 2 2 0 26 22 23 207 +468 2 2 0 26 202 22 207 +469 2 2 0 26 207 23 213 +470 2 2 0 26 24 25 205 +471 2 2 0 26 24 205 213 +472 2 2 0 26 25 26 203 +473 2 2 0 26 25 203 205 +474 2 2 0 26 203 26 212 +475 2 2 0 26 27 28 209 +476 2 2 0 26 27 209 212 +477 2 2 0 26 28 29 204 +478 2 2 0 26 28 204 209 +479 2 2 0 26 204 29 214 +480 2 2 0 26 30 31 211 +481 2 2 0 26 30 211 214 +482 2 2 0 26 31 32 210 +483 2 2 0 26 208 31 210 +484 2 2 0 26 31 208 211 +485 2 2 0 26 210 32 216 +486 2 2 0 26 206 202 207 +487 2 2 0 26 202 206 208 +488 2 2 0 26 202 208 210 +489 2 2 0 26 202 210 216 +490 2 2 0 26 205 203 206 +491 2 2 0 26 206 203 209 +492 2 2 0 26 209 203 212 +493 2 2 0 26 209 204 215 +494 2 2 0 26 211 204 214 +495 2 2 0 26 204 211 215 +496 2 2 0 26 205 206 207 +497 2 2 0 26 205 207 213 +498 2 2 0 26 208 206 215 +499 2 2 0 26 206 209 215 +500 2 2 0 26 211 208 215 +501 4 2 0 1 217 221 220 222 +502 4 2 0 1 193 225 219 231 +503 4 2 0 1 181 219 193 225 +504 4 2 0 1 217 222 220 223 +505 4 2 0 1 224 232 88 233 +506 4 2 0 1 100 88 232 233 +507 4 2 0 1 215 219 234 237 +508 4 2 0 1 93 100 232 233 +509 4 2 0 1 219 226 155 231 +510 4 2 0 1 200 193 181 219 +511 4 2 0 1 220 221 218 222 +512 4 2 0 1 170 155 226 231 +513 4 2 0 1 219 225 181 233 +514 4 2 0 1 200 193 219 231 +515 4 2 0 1 107 223 222 236 +516 4 2 0 1 112 126 62 230 +517 4 2 0 1 220 222 218 223 +518 4 2 0 1 219 224 217 225 +519 4 2 0 1 100 88 93 232 +520 4 2 0 1 161 219 155 231 +521 4 2 0 1 217 224 219 226 +522 4 2 0 1 170 161 155 231 +523 4 2 0 1 77 223 236 240 +524 4 2 0 1 107 239 222 241 +525 4 2 0 1 200 219 181 233 +526 4 2 0 1 126 227 62 230 +527 4 2 0 1 219 225 217 231 +528 4 2 0 1 217 226 219 231 +529 4 2 0 1 219 233 200 237 +530 4 2 0 1 156 161 231 237 +531 4 2 0 1 170 231 226 238 +532 4 2 0 1 227 239 101 241 +533 4 2 0 1 101 229 227 241 +534 4 2 0 1 139 243 221 245 +535 4 2 0 1 215 234 209 237 +536 4 2 0 1 120 224 226 232 +537 4 2 0 1 77 236 225 240 +538 4 2 0 1 219 231 161 237 +539 4 2 0 1 200 231 219 237 +540 4 2 0 1 219 232 224 233 +541 4 2 0 1 221 243 222 245 +542 4 2 0 1 138 119 121 235 +543 4 2 0 1 155 234 219 237 +544 4 2 0 1 201 223 220 244 +545 4 2 0 1 207 93 232 233 +546 4 2 0 1 101 83 229 241 +547 4 2 0 1 127 90 224 232 +548 4 2 0 1 155 219 161 237 +549 4 2 0 1 64 62 126 227 +550 4 2 0 1 143 156 161 231 +551 4 2 0 1 65 228 227 229 +552 4 2 0 1 88 224 90 232 +553 4 2 0 1 224 225 219 233 +554 4 2 0 1 107 92 223 236 +555 4 2 0 1 78 97 222 235 +556 4 2 0 1 79 131 224 235 +557 4 2 0 1 174 156 231 237 +558 4 2 0 1 165 230 228 242 +559 4 2 0 1 107 84 239 241 +560 4 2 0 1 157 63 144 228 +561 4 2 0 1 87 224 225 236 +562 4 2 0 1 106 225 77 236 +563 4 2 0 1 148 220 221 242 +564 4 2 0 1 227 230 115 243 +565 4 2 0 1 227 228 218 229 +566 4 2 0 1 139 124 243 245 +567 4 2 0 1 120 232 226 234 +568 4 2 0 1 209 234 158 237 +569 4 2 0 1 218 228 227 230 +570 4 2 0 1 77 172 223 240 +571 4 2 0 1 119 226 224 235 +572 4 2 0 1 215 206 219 233 +573 4 2 0 1 155 226 219 234 +574 4 2 0 1 190 225 95 233 +575 4 2 0 1 170 226 152 238 +576 4 2 0 1 68 228 157 230 +577 4 2 0 1 222 243 124 245 +578 4 2 0 1 115 230 133 243 +579 4 2 0 1 162 221 220 238 +580 4 2 0 1 206 232 219 233 +581 4 2 0 1 90 137 102 232 +582 4 2 0 1 118 221 141 245 +583 4 2 0 1 78 222 123 235 +584 4 2 0 1 120 132 224 232 +585 4 2 0 1 227 228 65 230 +586 4 2 0 1 133 115 227 230 +587 4 2 0 1 145 158 209 234 +588 4 2 0 1 85 107 84 239 +589 4 2 0 1 221 238 141 245 +590 4 2 0 1 88 90 93 232 +591 4 2 0 1 118 150 141 221 +592 4 2 0 1 87 225 89 236 +593 4 2 0 1 147 230 165 242 +594 4 2 0 1 215 219 206 234 +595 4 2 0 1 165 242 228 246 +596 4 2 0 1 112 133 126 230 +597 4 2 0 1 148 220 162 221 +598 4 2 0 1 148 220 242 246 +599 4 2 0 1 143 174 156 231 +600 4 2 0 1 68 63 157 228 +601 4 2 0 1 201 179 223 244 +602 4 2 0 1 77 225 172 240 +603 4 2 0 1 219 226 224 232 +604 4 2 0 1 174 231 200 237 +605 4 2 0 1 127 137 90 232 +606 4 2 0 1 133 227 126 230 +607 4 2 0 1 141 238 226 245 +608 4 2 0 1 89 224 88 225 +609 4 2 0 1 119 226 235 245 +610 4 2 0 1 174 189 156 237 +611 4 2 0 1 176 200 233 237 +612 4 2 0 1 226 232 219 234 +613 4 2 0 1 101 94 227 229 +614 4 2 0 1 188 82 76 241 +615 4 2 0 1 94 66 80 227 +616 4 2 0 1 78 86 97 235 +617 4 2 0 1 206 219 232 234 +618 4 2 0 1 119 224 121 235 +619 4 2 0 1 172 186 91 223 +620 4 2 0 1 155 158 234 237 +621 4 2 0 1 76 186 171 241 +622 4 2 0 1 85 239 84 241 +623 4 2 0 1 188 229 82 241 +624 4 2 0 1 227 218 239 241 +625 4 2 0 1 188 76 171 241 +626 4 2 0 1 157 228 165 230 +627 4 2 0 1 137 213 102 232 +628 4 2 0 1 176 233 208 237 +629 4 2 0 1 68 74 228 230 +630 4 2 0 1 162 220 148 246 +631 4 2 0 1 87 224 89 225 +632 4 2 0 1 118 141 226 245 +633 4 2 0 1 102 93 90 232 +634 4 2 0 1 121 224 119 226 +635 4 2 0 1 172 91 77 223 +636 4 2 0 1 120 224 121 226 +637 4 2 0 1 185 228 67 229 +638 4 2 0 1 227 229 218 241 +639 4 2 0 1 97 222 235 236 +640 4 2 0 1 89 225 106 236 +641 4 2 0 1 157 144 165 228 +642 4 2 0 1 162 151 221 238 +643 4 2 0 1 181 225 190 233 +644 4 2 0 1 78 123 86 235 +645 4 2 0 1 65 67 228 229 +646 4 2 0 1 132 127 224 232 +647 4 2 0 1 190 181 177 225 +648 4 2 0 1 121 224 131 235 +649 4 2 0 1 150 118 110 221 +650 4 2 0 1 92 77 223 236 +651 4 2 0 1 162 238 220 247 +652 4 2 0 1 94 80 101 227 +653 4 2 0 1 221 222 217 245 +654 4 2 0 1 91 223 186 241 +655 4 2 0 1 122 111 159 234 +656 4 2 0 1 61 227 94 229 +657 4 2 0 1 188 171 229 241 +658 4 2 0 1 192 186 223 241 +659 4 2 0 1 107 222 97 236 +660 4 2 0 1 129 221 110 245 +661 4 2 0 1 91 186 76 241 +662 4 2 0 1 110 150 221 242 +663 4 2 0 1 121 120 132 224 +664 4 2 0 1 215 208 206 233 +665 4 2 0 1 218 221 220 242 +666 4 2 0 1 84 107 92 223 +667 4 2 0 1 74 65 67 228 +668 4 2 0 1 154 111 226 234 +669 4 2 0 1 118 141 154 226 +670 4 2 0 1 124 235 222 245 +671 4 2 0 1 170 155 152 226 +672 4 2 0 1 185 175 67 228 +673 4 2 0 1 87 235 224 236 +674 4 2 0 1 189 174 200 237 +675 4 2 0 1 218 230 227 243 +676 4 2 0 1 87 89 106 236 +677 4 2 0 1 95 99 89 225 +678 4 2 0 1 165 147 242 246 +679 4 2 0 1 220 221 217 238 +680 4 2 0 1 141 221 150 238 +681 4 2 0 1 228 230 218 242 +682 4 2 0 1 192 171 186 241 +683 4 2 0 1 225 231 193 240 +684 4 2 0 1 95 225 89 233 +685 4 2 0 1 204 209 158 237 +686 4 2 0 1 220 240 201 247 +687 4 2 0 1 217 220 238 247 +688 4 2 0 1 140 130 128 242 +689 4 2 0 1 227 115 239 243 +690 4 2 0 1 130 140 110 242 +691 4 2 0 1 222 223 217 236 +692 4 2 0 1 222 235 217 245 +693 4 2 0 1 118 154 111 226 +694 4 2 0 1 110 140 150 242 +695 4 2 0 1 133 230 117 243 +696 4 2 0 1 218 223 222 241 +697 4 2 0 1 224 226 217 235 +698 4 2 0 1 140 128 146 242 +699 4 2 0 1 230 242 117 243 +700 4 2 0 1 158 155 161 237 +701 4 2 0 1 218 222 221 243 +702 4 2 0 1 213 207 102 232 +703 4 2 0 1 128 230 146 242 +704 4 2 0 1 154 159 111 234 +705 4 2 0 1 65 228 74 230 +706 4 2 0 1 215 209 204 237 +707 4 2 0 1 228 229 184 244 +708 4 2 0 1 109 86 123 235 +709 4 2 0 1 93 81 100 233 +710 4 2 0 1 112 62 71 230 +711 4 2 0 1 109 121 131 235 +712 4 2 0 1 199 82 188 229 +713 4 2 0 1 169 73 196 228 +714 4 2 0 1 71 136 112 230 +715 4 2 0 1 131 121 127 224 +716 4 2 0 1 226 231 217 238 +717 4 2 0 1 135 114 104 227 +718 4 2 0 1 127 121 132 224 +719 4 2 0 1 217 225 224 236 +720 4 2 0 1 222 239 218 241 +721 4 2 0 1 63 68 74 228 +722 4 2 0 1 228 242 218 246 +723 4 2 0 1 65 62 227 230 +724 4 2 0 1 70 67 175 228 +725 4 2 0 1 102 207 93 232 +726 4 2 0 1 117 230 128 242 +727 4 2 0 1 71 168 136 230 +728 4 2 0 1 110 221 118 245 +729 4 2 0 1 110 221 139 243 +730 4 2 0 1 151 150 221 238 +731 4 2 0 1 217 235 226 245 +732 4 2 0 1 203 232 125 234 +733 4 2 0 1 137 113 213 232 +734 4 2 0 1 116 124 222 243 +735 4 2 0 1 220 223 218 244 +736 4 2 0 1 176 187 200 237 +737 4 2 0 1 162 148 149 246 +738 4 2 0 1 71 157 168 230 +739 4 2 0 1 215 206 209 234 +740 4 2 0 1 123 222 78 239 +741 4 2 0 1 196 191 169 228 +742 4 2 0 1 217 223 220 240 +743 4 2 0 1 93 202 81 233 +744 4 2 0 1 114 96 104 227 +745 4 2 0 1 129 110 118 245 +746 4 2 0 1 120 121 119 226 +747 4 2 0 1 176 200 181 233 +748 4 2 0 1 117 128 130 242 +749 4 2 0 1 184 228 185 229 +750 4 2 0 1 141 154 226 238 +751 4 2 0 1 207 202 93 233 +752 4 2 0 1 72 135 104 227 +753 4 2 0 1 136 168 146 230 +754 4 2 0 1 116 139 124 243 +755 4 2 0 1 63 169 144 228 +756 4 2 0 1 87 88 89 224 +757 4 2 0 1 79 90 88 224 +758 4 2 0 1 89 77 106 225 +759 4 2 0 1 169 63 73 228 +760 4 2 0 1 130 110 117 242 +761 4 2 0 1 220 217 240 247 +762 4 2 0 1 205 125 203 232 +763 4 2 0 1 199 103 82 229 +764 4 2 0 1 65 227 61 229 +765 4 2 0 1 72 104 80 227 +766 4 2 0 1 151 141 150 238 +767 4 2 0 1 61 66 94 227 +768 4 2 0 1 173 220 142 246 +769 4 2 0 1 178 225 193 240 +770 4 2 0 1 113 125 205 232 +771 4 2 0 1 213 113 205 232 +772 4 2 0 1 78 222 107 239 +773 4 2 0 1 95 89 100 233 +774 4 2 0 1 200 174 193 231 +775 4 2 0 1 70 196 73 228 +776 4 2 0 1 72 64 135 227 +777 4 2 0 1 218 242 220 246 +778 4 2 0 1 92 77 91 223 +779 4 2 0 1 125 232 132 234 +780 4 2 0 1 217 238 231 247 +781 4 2 0 1 132 232 120 234 +782 4 2 0 1 86 235 87 236 +783 4 2 0 1 65 62 64 227 +784 4 2 0 1 160 169 191 228 +785 4 2 0 1 116 222 123 239 +786 4 2 0 1 148 242 149 246 +787 4 2 0 1 148 162 151 221 +788 4 2 0 1 128 136 146 230 +789 4 2 0 1 98 108 78 239 +790 4 2 0 1 123 222 124 235 +791 4 2 0 1 75 61 103 229 +792 4 2 0 1 188 171 195 229 +793 4 2 0 1 71 68 157 230 +794 4 2 0 1 109 138 121 235 +795 4 2 0 1 75 69 61 229 +796 4 2 0 1 218 229 228 244 +797 4 2 0 1 154 226 155 234 +798 4 2 0 1 145 155 158 234 +799 4 2 0 1 186 35 76 171 +800 4 2 0 1 70 175 196 228 +801 4 2 0 1 133 128 117 230 +802 4 2 0 1 86 97 235 236 +803 4 2 0 1 218 227 239 243 +804 4 2 0 1 184 175 185 228 +805 4 2 0 1 92 106 77 236 +806 4 2 0 1 126 135 64 227 +807 4 2 0 1 101 83 94 229 +808 4 2 0 1 217 231 225 240 +809 4 2 0 1 179 223 172 240 +810 4 2 0 1 195 229 171 241 +811 4 2 0 1 172 179 186 223 +812 4 2 0 1 152 226 154 238 +813 4 2 0 1 162 153 238 247 +814 4 2 0 1 120 226 111 234 +815 4 2 0 1 117 110 139 243 +816 4 2 0 1 127 113 137 232 +817 4 2 0 1 141 152 154 238 +818 4 2 0 1 212 203 134 234 +819 4 2 0 1 107 97 92 236 +820 4 2 0 1 126 133 115 227 +821 4 2 0 1 108 123 78 239 +822 4 2 0 1 69 185 67 229 +823 4 2 0 1 96 227 114 239 +824 4 2 0 1 231 240 217 247 +825 4 2 0 1 170 153 231 238 +826 4 2 0 1 186 35 91 76 +827 4 2 0 1 77 89 99 225 +828 4 2 0 1 125 132 120 234 +829 4 2 0 1 194 231 143 247 +830 4 2 0 1 206 232 203 234 +831 4 2 0 1 122 120 111 234 +832 4 2 0 1 222 217 235 236 +833 4 2 0 1 125 134 203 234 +834 4 2 0 1 105 216 197 233 +835 4 2 0 1 199 185 69 229 +836 4 2 0 1 98 114 108 239 +837 4 2 0 1 72 80 66 227 +838 4 2 0 1 224 235 217 236 +839 4 2 0 1 195 184 229 244 +840 4 2 0 1 147 157 165 230 +841 4 2 0 1 124 123 116 222 +842 4 2 0 1 188 34 76 82 +843 4 2 0 1 173 183 220 246 +844 4 2 0 1 142 220 162 246 +845 4 2 0 1 116 222 239 243 +846 4 2 0 1 192 241 223 244 +847 4 2 0 1 71 62 68 230 +848 4 2 0 1 68 65 74 230 +849 4 2 0 1 212 166 145 234 +850 4 2 0 1 114 227 115 239 +851 4 2 0 1 171 34 76 188 +852 4 2 0 1 67 65 61 229 +853 4 2 0 1 139 221 129 245 +854 4 2 0 1 150 148 221 242 +855 4 2 0 1 201 220 183 244 +856 4 2 0 1 194 143 164 247 +857 4 2 0 1 108 116 123 239 +858 4 2 0 1 118 226 119 245 +859 4 2 0 1 197 216 210 233 +860 4 2 0 1 212 134 166 234 +861 4 2 0 1 178 172 225 240 +862 4 2 0 1 201 183 179 244 +863 4 2 0 1 70 67 185 175 +864 4 2 0 1 172 177 178 225 +865 4 2 0 1 104 96 80 227 +866 4 2 0 1 78 107 85 239 +867 4 2 0 1 98 96 114 239 +868 4 2 0 1 122 111 52 159 +869 4 2 0 1 70 73 63 228 +870 4 2 0 1 36 172 186 91 +871 4 2 0 1 209 212 145 234 +872 4 2 0 1 228 244 184 246 +873 4 2 0 1 160 144 169 228 +874 4 2 0 1 97 107 78 222 +875 4 2 0 1 105 197 190 233 +876 4 2 0 1 124 139 129 245 +877 4 2 0 1 150 50 118 141 +878 4 2 0 1 225 236 217 240 +879 4 2 0 1 154 155 159 234 +880 4 2 0 1 183 201 173 220 +881 4 2 0 1 103 94 82 229 +882 4 2 0 1 149 242 147 246 +883 4 2 0 1 223 217 236 240 +884 4 2 0 1 141 51 118 154 +885 4 2 0 1 191 160 228 246 +886 4 2 0 1 135 126 114 227 +887 4 2 0 1 103 61 94 229 +888 4 2 0 1 230 218 242 243 +889 4 2 0 1 128 112 136 230 +890 4 2 0 1 155 154 152 226 +891 4 2 0 1 62 13 126 112 +892 4 2 0 1 201 173 220 247 +893 4 2 0 1 194 174 143 231 +894 4 2 0 1 196 175 191 228 +895 4 2 0 1 101 227 96 239 +896 4 2 0 1 162 153 151 238 +897 4 2 0 1 193 231 180 240 +898 4 2 0 1 179 192 223 244 +899 4 2 0 1 64 13 126 62 +900 4 2 0 1 208 176 210 233 +901 4 2 0 1 205 113 25 125 +902 4 2 0 1 206 203 209 234 +903 4 2 0 1 37 99 177 172 +904 4 2 0 1 151 150 148 221 +905 4 2 0 1 144 157 16 63 +906 4 2 0 1 181 193 178 225 +907 4 2 0 1 119 118 111 226 +908 4 2 0 1 125 25 205 203 +909 4 2 0 1 165 149 147 246 +910 4 2 0 1 115 114 126 227 +911 4 2 0 1 172 36 77 91 +912 4 2 0 1 173 182 183 246 +913 4 2 0 1 111 118 51 154 +914 4 2 0 1 56 163 182 173 +915 4 2 0 1 159 134 122 234 +916 4 2 0 1 105 190 95 233 +917 4 2 0 1 83 82 229 241 +918 4 2 0 1 209 203 212 234 +919 4 2 0 1 195 229 241 244 +920 4 2 0 1 143 161 170 231 +921 4 2 0 1 168 157 146 230 +922 4 2 0 1 91 84 223 241 +923 4 2 0 1 153 231 238 247 +924 4 2 0 1 50 110 150 118 +925 4 2 0 1 92 91 84 223 +926 4 2 0 1 111 154 52 159 +927 4 2 0 1 218 221 242 243 +928 4 2 0 1 173 142 220 247 +929 4 2 0 1 147 146 230 242 +930 4 2 0 1 63 74 70 228 +931 4 2 0 1 66 61 65 227 +932 4 2 0 1 213 205 207 232 +933 4 2 0 1 180 201 240 247 +934 4 2 0 1 218 244 228 246 +935 4 2 0 1 114 98 108 41 +936 4 2 0 1 171 241 192 244 +937 4 2 0 1 37 77 99 172 +938 4 2 0 1 56 142 163 173 +939 4 2 0 1 66 10 94 80 +940 4 2 0 1 142 162 149 246 +941 4 2 0 1 115 133 117 243 +942 4 2 0 1 80 96 101 227 +943 4 2 0 1 166 134 159 234 +944 4 2 0 1 182 163 191 246 +945 4 2 0 1 199 188 185 229 +946 4 2 0 1 191 163 160 246 +947 4 2 0 1 79 86 44 131 +948 4 2 0 1 170 152 153 238 +949 4 2 0 1 86 43 109 123 +950 4 2 0 1 82 94 83 229 +951 4 2 0 1 223 241 218 244 +952 4 2 0 1 65 68 62 230 +953 4 2 0 1 139 110 129 221 +954 4 2 0 1 86 43 123 78 +955 4 2 0 1 109 44 86 131 +956 4 2 0 1 132 113 127 232 +957 4 2 0 1 157 68 16 63 +958 4 2 0 1 86 87 97 236 +959 4 2 0 1 123 124 109 235 +960 4 2 0 1 194 180 231 247 +961 4 2 0 1 144 160 165 228 +962 4 2 0 1 79 88 87 224 +963 4 2 0 1 132 125 113 232 +964 4 2 0 1 114 96 98 41 +965 4 2 0 1 191 228 184 246 +966 4 2 0 1 195 184 185 229 +967 4 2 0 1 202 206 208 233 +968 4 2 0 1 217 238 221 245 +969 4 2 0 1 150 140 148 242 +970 4 2 0 1 79 45 90 131 +971 4 2 0 1 179 192 186 223 +972 4 2 0 1 112 128 133 230 +973 4 2 0 1 146 157 147 230 +974 4 2 0 1 165 228 160 246 +975 4 2 0 1 66 64 72 227 +976 4 2 0 1 45 127 90 131 +977 4 2 0 1 195 241 171 244 +978 4 2 0 1 70 74 67 228 +979 4 2 0 1 210 176 197 233 +980 4 2 0 1 28 158 204 209 +981 4 2 0 1 218 239 222 243 +982 4 2 0 1 209 28 158 145 +983 4 2 0 1 217 226 238 245 +984 4 2 0 1 190 177 38 99 +985 4 2 0 1 69 67 61 229 +986 4 2 0 1 162 220 142 247 +987 4 2 0 1 83 76 82 241 +988 4 2 0 1 176 181 190 233 +989 4 2 0 1 180 240 231 247 +990 4 2 0 1 191 182 55 163 +991 4 2 0 1 183 244 220 246 +992 4 2 0 1 55 160 191 163 +993 4 2 0 1 218 241 229 244 +994 4 2 0 1 119 111 120 226 +995 4 2 0 1 85 84 83 241 +996 4 2 0 1 181 178 177 225 +997 4 2 0 1 143 231 153 247 +998 4 2 0 1 178 193 180 240 +999 4 2 0 1 98 78 85 239 +1000 4 2 0 1 180 174 194 231 +1001 4 2 0 1 59 174 189 156 +1002 4 2 0 1 38 95 190 99 +1003 4 2 0 1 174 59 143 156 +1004 4 2 0 1 195 185 188 229 +1005 4 2 0 1 147 140 146 242 +1006 4 2 0 1 184 191 175 228 +1007 4 2 0 1 120 122 125 234 +1008 4 2 0 1 153 143 170 231 +1009 4 2 0 1 179 183 192 244 +1010 4 2 0 1 205 203 206 232 +1011 4 2 0 1 147 149 148 242 +1012 4 2 0 1 81 93 22 202 +1013 4 2 0 1 91 76 84 241 +1014 4 2 0 1 108 114 115 239 +1015 4 2 0 1 210 216 202 233 +1016 4 2 0 1 164 143 153 247 +1017 4 2 0 1 125 122 134 234 +1018 4 2 0 1 116 239 115 243 +1019 4 2 0 1 85 101 96 239 +1020 4 2 0 1 142 149 163 246 +1021 4 2 0 1 193 174 180 231 +1022 4 2 0 1 176 190 197 233 +1023 4 2 0 1 194 58 164 143 +1024 4 2 0 1 70 185 19 175 +1025 4 2 0 1 195 171 192 244 +1026 4 2 0 1 81 21 105 216 +1027 4 2 0 1 67 185 19 70 +1028 4 2 0 1 191 184 182 246 +1029 4 2 0 1 218 220 244 246 +1030 4 2 0 1 183 184 244 246 +1031 4 2 0 1 81 105 95 233 +1032 4 2 0 1 194 58 143 174 +1033 4 2 0 1 116 108 115 239 +1034 4 2 0 1 109 124 138 235 +1035 4 2 0 1 66 65 64 227 +1036 4 2 0 1 31 176 208 211 +1037 4 2 0 1 183 182 184 246 +1038 4 2 0 1 94 61 10 66 +1039 4 2 0 1 214 204 167 237 +1040 4 2 0 1 211 208 215 237 +1041 4 2 0 1 31 187 176 211 +1042 4 2 0 1 105 197 39 190 +1043 4 2 0 1 145 159 155 234 +1044 4 2 0 1 208 210 176 31 +1045 4 2 0 1 168 71 15 157 +1046 4 2 0 1 185 19 69 67 +1047 4 2 0 1 166 159 145 234 +1048 4 2 0 1 93 207 22 202 +1049 4 2 0 1 198 211 214 237 +1050 4 2 0 1 187 211 198 237 +1051 4 2 0 1 90 102 137 46 +1052 4 2 0 1 104 135 40 114 +1053 4 2 0 1 136 47 146 168 +1054 4 2 0 1 167 204 158 237 +1055 4 2 0 1 167 156 189 237 +1056 4 2 0 1 98 85 96 239 +1057 4 2 0 1 81 95 100 233 +1058 4 2 0 1 198 167 189 237 +1059 4 2 0 1 39 95 105 190 +1060 4 2 0 1 207 205 206 232 +1061 4 2 0 1 68 15 71 157 +1062 4 2 0 1 114 40 104 96 +1063 4 2 0 1 146 128 47 136 +1064 4 2 0 1 127 90 137 46 +1065 4 2 0 1 53 122 159 134 +1066 4 2 0 1 57 142 173 247 +1067 4 2 0 1 214 167 198 237 +1068 4 2 0 1 179 180 201 240 +1069 4 2 0 1 165 160 149 246 +1070 4 2 0 1 156 158 161 237 +1071 4 2 0 1 215 204 211 237 +1072 4 2 0 1 173 194 57 247 +1073 4 2 0 1 57 164 142 247 +1074 4 2 0 1 166 53 159 134 +1075 4 2 0 1 202 208 210 233 +1076 4 2 0 1 169 196 54 191 +1077 4 2 0 1 194 164 57 247 +1078 4 2 0 1 126 135 12 64 +1079 4 2 0 1 212 203 26 134 +1080 4 2 0 1 135 72 12 64 +1081 4 2 0 1 203 125 26 134 +1082 4 2 0 1 54 160 169 191 +1083 4 2 0 1 162 142 153 247 +1084 4 2 0 1 214 211 204 237 +1085 4 2 0 1 145 209 27 212 +1086 4 2 0 1 169 63 17 73 +1087 4 2 0 1 63 169 17 144 +1088 4 2 0 1 200 187 189 237 +1089 4 2 0 1 112 62 14 71 +1090 4 2 0 1 166 145 27 212 +1091 4 2 0 1 24 213 113 205 +1092 4 2 0 1 178 179 172 240 +1093 4 2 0 1 116 115 117 243 +1094 4 2 0 1 92 87 106 236 +1095 4 2 0 1 213 137 24 113 +1096 4 2 0 1 136 112 14 71 +1097 4 2 0 1 104 80 11 72 +1098 4 2 0 1 151 152 141 238 +1099 4 2 0 1 153 152 151 238 +1100 4 2 0 1 21 81 202 216 +1101 4 2 0 1 34 76 35 171 +1102 4 2 0 1 160 163 149 246 +1103 4 2 0 1 201 180 173 247 +1104 4 2 0 1 189 60 156 167 +1105 4 2 0 1 214 167 204 29 +1106 4 2 0 1 87 92 97 236 +1107 4 2 0 1 189 60 167 198 +1108 4 2 0 1 116 117 139 243 +1109 4 2 0 1 129 119 124 245 +1110 4 2 0 1 158 204 167 29 +1111 4 2 0 1 68 16 15 157 +1112 4 2 0 1 23 102 207 93 +1113 4 2 0 1 183 184 195 244 +1114 4 2 0 1 102 213 23 207 +1115 4 2 0 1 80 66 11 72 +1116 4 2 0 1 12 13 126 64 +1117 4 2 0 1 103 75 9 61 +1118 4 2 0 1 125 26 25 203 +1119 4 2 0 1 179 178 180 240 +1120 4 2 0 1 148 140 147 242 +1121 4 2 0 1 36 186 35 91 +1122 4 2 0 1 198 189 187 237 +1123 4 2 0 1 154 51 111 52 +1124 4 2 0 1 77 37 36 172 +1125 4 2 0 1 150 110 50 49 +1126 4 2 0 1 14 13 62 112 +1127 4 2 0 1 34 188 33 82 +1128 4 2 0 1 113 25 24 205 +1129 4 2 0 1 51 118 50 141 +1130 4 2 0 1 84 76 83 241 +1131 4 2 0 1 167 158 156 237 +1132 4 2 0 1 9 103 61 94 +1133 4 2 0 1 118 119 129 245 +1134 4 2 0 1 30 214 198 211 +1135 4 2 0 1 209 27 28 145 +1136 4 2 0 1 18 70 196 73 +1137 4 2 0 1 153 142 164 247 +1138 4 2 0 1 52 53 122 159 +1139 4 2 0 1 212 7 166 134 +1140 4 2 0 1 71 2 136 168 +1141 4 2 0 1 72 1 104 135 +1142 4 2 0 1 198 187 30 211 +1143 4 2 0 1 43 44 86 109 +1144 4 2 0 1 6 137 213 102 +1145 4 2 0 1 48 146 128 47 +1146 4 2 0 1 96 114 40 41 +1147 4 2 0 1 123 43 42 78 +1148 4 2 0 1 173 56 142 57 +1149 4 2 0 1 8 214 167 198 +1150 4 2 0 1 3 196 169 73 +1151 4 2 0 1 46 127 90 45 +1152 4 2 0 1 59 143 58 174 +1153 4 2 0 1 18 70 175 196 +1154 4 2 0 1 29 158 204 28 +1155 4 2 0 1 190 39 95 38 +1156 4 2 0 1 210 176 32 197 +1157 4 2 0 1 207 22 23 93 +1158 4 2 0 1 144 16 17 63 +1159 4 2 0 1 192 183 195 244 +1160 4 2 0 1 173 180 194 247 +1161 4 2 0 1 191 54 160 55 +1162 4 2 0 1 66 11 10 80 +1163 4 2 0 1 103 4 75 199 +1164 4 2 0 1 98 108 41 42 +1165 4 2 0 1 130 48 49 140 +1166 4 2 0 1 105 5 197 216 +1167 4 2 0 1 177 38 99 37 +1168 4 2 0 1 32 176 210 31 +1169 4 2 0 1 45 79 44 131 +1170 4 2 0 1 69 199 20 185 +1171 4 2 0 1 61 10 9 94 +1172 4 2 0 1 7 53 166 134 +1173 4 2 0 1 33 4 103 199 +1174 4 2 0 1 59 189 60 156 +1175 4 2 0 1 136 14 2 71 +1176 4 2 0 1 104 11 1 72 +1177 4 2 0 1 136 2 47 168 +1178 4 2 0 1 1 104 135 40 +1179 4 2 0 1 24 6 137 213 +1180 4 2 0 1 69 20 19 185 +1181 4 2 0 1 169 196 3 54 +1182 4 2 0 1 102 6 137 46 +1183 4 2 0 1 167 60 8 198 +1184 4 2 0 1 105 197 5 39 +1185 4 2 0 1 169 17 3 73 +1186 4 2 0 1 8 214 198 30 +1187 4 2 0 1 22 21 81 202 +1188 4 2 0 1 196 3 18 73 +1189 4 2 0 1 12 1 72 135 +1190 4 2 0 1 213 23 6 102 +1191 4 2 0 1 212 26 7 134 +1192 4 2 0 1 15 2 71 168 +1193 4 2 0 1 166 27 7 212 +1194 4 2 0 1 182 55 163 56 +1195 4 2 0 1 167 214 8 29 +1196 4 2 0 1 20 75 199 69 +1197 4 2 0 1 197 32 210 216 +1198 4 2 0 1 19 18 70 175 +1199 4 2 0 1 105 21 5 216 +1200 4 2 0 1 4 20 75 199 +1201 4 2 0 1 31 30 187 211 +1202 4 2 0 1 75 9 4 103 +1203 4 2 0 1 5 32 197 216 +1204 4 2 0 1 58 57 194 164 +1205 4 2 0 1 233 225 88 224 +1206 4 2 0 1 233 215 237 219 +1207 4 2 0 1 233 237 215 208 +1208 4 2 0 1 223 201 240 179 +1209 4 2 0 1 223 240 201 220 +1210 4 2 0 1 241 107 223 222 +1211 4 2 0 1 241 223 107 84 +1212 4 2 0 1 101 241 85 83 +1213 4 2 0 1 85 241 101 239 +1214 4 2 0 1 229 75 199 103 +1215 4 2 0 1 229 199 75 69 +1216 4 2 0 1 235 79 87 224 +1217 4 2 0 1 235 87 79 86 +1218 4 2 0 1 233 89 88 225 +1219 4 2 0 1 233 88 89 100 +1220 4 2 0 1 190 99 225 177 +1221 4 2 0 1 225 99 190 95 +1222 4 2 0 1 233 207 206 232 +1223 4 2 0 1 233 206 207 202 +1224 4 2 0 1 243 110 242 117 +1225 4 2 0 1 243 242 110 221 +1226 4 2 0 1 140 128 48 146 +1227 4 2 0 1 48 128 140 130 +1228 4 2 0 1 235 119 124 138 +1229 4 2 0 1 235 124 119 245 +1230 4 2 0 1 211 176 237 187 +1231 4 2 0 1 211 237 176 208 +1232 4 2 0 1 90 131 224 79 +1233 4 2 0 1 224 131 90 127 +1234 4 2 0 1 172 99 225 77 +1235 4 2 0 1 172 225 99 177 +1236 4 2 0 1 131 86 235 79 +1237 4 2 0 1 131 235 86 109 +1238 4 2 0 1 110 140 49 150 +1239 4 2 0 1 49 140 110 130 +1240 4 2 0 1 173 163 246 142 +1241 4 2 0 1 173 246 163 182 +1242 4 2 0 1 82 199 33 103 +1243 4 2 0 1 33 199 82 188 +1244 4 2 0 1 108 78 42 98 +1245 4 2 0 1 42 78 108 123 +1246 4 2 0 1 216 81 233 105 +1247 4 2 0 1 216 233 81 202 +$EndElements diff --git a/equations.pptx b/equations.pptx new file mode 100644 index 0000000..afe3dd0 Binary files /dev/null and b/equations.pptx differ diff --git a/main.cpp b/main.cpp new file mode 100644 index 0000000..03bef6a --- /dev/null +++ b/main.cpp @@ -0,0 +1,42 @@ +#include "tetra_vz.h" +#include "iostream" + +int main(int argc, char *argv[]) +{ + // Declare a tetrahedron + point3d p[4]; + p[0].x = 20; p[0].y = 50; p[0].z = -5; + p[1].x = 80; p[1].y = 20; p[1].z = -10; + p[2].x = 50; p[2].y = 80; p[2].z = -15; + p[3].x = 50; p[3].y = 50; p[3].z = -40; + + tetrahedron t; + t.rho = 1.0; + for (int i = 0; i < 4; i++) + { + t.vec_ptr[i] = &p[i]; + } + t.initialize_tensors(); + + // Declare the observation stations + double xmin = 0, dx = 2.5; // 41 + double ymin = 0, dy = 2.5; // 41 + point3d obs[1681]; // 41*41 + for (int i = 0; i < 41; i++) + { + for (int j = 0; j < 41; j++) + { + obs[i*41+j].x = xmin + dx*j; + obs[i*41+j].y = ymin + dy*i; + obs[i*41+j].z = 0.0; + } + } + + // Calculate the gravity values + for (int i = 0; i < 1681; i++) + { + std::cout << obs[i].x << " " << obs[i].y << " "; + std::cout << tetra_vz(&t, &obs[i]) << std::endl; + } + return 0; +} \ No newline at end of file diff --git a/main_msh.cpp b/main_msh.cpp new file mode 100644 index 0000000..cd382ff --- /dev/null +++ b/main_msh.cpp @@ -0,0 +1,138 @@ +#include "tetra_vz.h" +#include "string" +#include "sstream" +#include "iostream" +#include "fstream" + +std::stringstream str2ss(std::string in) +{ + std::stringstream tmp_ss; + tmp_ss.clear(); + tmp_ss.str(in); + return tmp_ss; +} + +int main(int argc, char *argv[]) +{ + int pnum, tnum; // Size of the vertexes and tetrahedrons + point3d *modelp = nullptr; // vertex class + tetrahedron *modelt = nullptr; // tetrahedron class + + // file object + std::ifstream infile("cube.msh"); + + int tmp_i; + int tmp_tnum; + std::string line_str; + std::stringstream line_ss; + while (getline(infile, line_str)) + { + if (line_str == "$Nodes") // Read vertexes + { + // Get vertex size firstly + getline(infile, line_str); + line_ss = str2ss(line_str); + line_ss >> pnum; + // Allocate memories + modelp = new point3d [pnum]; + for (int i = 0; i < pnum; i++) + { + getline(infile, line_str); + line_ss = str2ss(line_str); + line_ss >> tmp_i >> modelp[i].x >> modelp[i].y >> modelp[i].z; + } + } + else if (line_str == "$Elements") // Read tetrahedral indexes + { + // Get tetrahedron's sizes + getline(infile, line_str); + line_ss = str2ss(line_str); + line_ss >> tmp_tnum; + tnum = tmp_tnum; + + for (int i = 0; i < tmp_tnum; i++) + { + getline(infile, line_str); + line_ss = str2ss(line_str); + line_ss >> tmp_i >> tmp_i; + if (tmp_i != 4) // The tag for tetrahedron is 4 + { + tnum--; + } + else break; + } + + // Allocate memories + modelt = new tetrahedron [tnum]; + + line_ss = str2ss(line_str); + + for (int j = 0; j < 5; j++) // Skip the first 5 numbers + line_ss >> tmp_i; + for (int j = 0; j < 4; j++) + { + line_ss >> tmp_i; + modelt[0].vec_ptr[j] = &modelp[tmp_i-1]; + } + + for (int i = 1; i < tnum; i++) + { + getline(infile, line_str); + line_ss = str2ss(line_str); + + for (int j = 0; j < 5; j++) // Skip the first 5 numbers + line_ss >> tmp_i; + for (int j = 0; j < 4; j++) + { + line_ss >> tmp_i; + modelt[i].vec_ptr[j] = &modelp[tmp_i-1]; + } + } + } + } + + infile.close(); + + // Output for hunman validation + std::clog << "node number = " << pnum << std::endl; + std::clog << "tetra number = " << tnum << std::endl; + + // Set tetrahedron's density and initialize it + for (int i = 0; i < tnum; i++) + { + modelt[i].rho = 1.0; + modelt[i].initialize_tensors(); + } + + // Declare observation stations + double xmin = 0, dx = 2.5; // 41 + double ymin = 0, dy = 2.5; // 41 + point3d obs[1681]; // 41*41 + for (int i = 0; i < 41; i++) + { + for (int j = 0; j < 41; j++) + { + obs[i*41+j].x = xmin + dx*j; + obs[i*41+j].y = ymin + dy*i; + obs[i*41+j].z = 0.0; + } + } + + // Calculate the gravity value + double sum; + for (int i = 0; i < 1681; i++) + { + std::cout << obs[i].x << " " << obs[i].y << " "; + + sum = 0.0; + for (int t = 0; t < tnum; t++) + { + sum += tetra_vz(&modelt[t], &obs[i]); + } + std::cout << sum << std::endl; + } + + if (modelp != nullptr) delete[] modelp; + if (modelt != nullptr) delete[] modelt; + return 0; +} \ No newline at end of file diff --git a/out.txt b/out.txt new file mode 100644 index 0000000..06669ec Binary files /dev/null and b/out.txt differ diff --git a/out_msh.txt b/out_msh.txt new file mode 100644 index 0000000..a35056d Binary files /dev/null and b/out_msh.txt differ diff --git a/tetra_vz.h b/tetra_vz.h new file mode 100644 index 0000000..d416666 --- /dev/null +++ b/tetra_vz.h @@ -0,0 +1,244 @@ +#ifndef _TETRA_VZ_H +#define _TETRA_VZ_H + +#include "cmath" + +#define ZERO 1e-20 +#define G0 6.67408e-11 + +/** + * Define the point structure in 3D space + */ + +struct point3d +{ + double x, y, z; + double module() const; // module + point3d normal() const; // normal vector +}; + +double point3d::module() const +{ + return sqrt(x*x + y*y + z*z); +} + +point3d point3d::normal() const +{ + point3d nor_v; + double length = module(); + if (length <= ZERO) + { + nor_v.x = nor_v.y = nor_v.z = 0.0; + } + else + { + nor_v.x = x/length; + nor_v.y = y/length; + nor_v.z = z/length; + } + return nor_v; +} + +point3d operator+(const point3d &a, const point3d &b) // Add +{ + point3d m; + m.x = a.x+b.x; + m.y = a.y+b.y; + m.z = a.z+b.z; + return m; +} + +point3d operator-(const point3d &a, const point3d &b) // Minus +{ + point3d m; + m.x = a.x-b.x; + m.y = a.y-b.y; + m.z = a.z-b.z; + return m; +} + +point3d operator*(double scale, const point3d &b) // Multiply +{ + point3d m; + m.x = scale*b.x; + m.y = scale*b.y; + m.z = scale*b.z; + return m; +} + +double dot(const point3d &a, const point3d &b) // Dot +{ + return a.x*b.x+a.y*b.y+a.z*b.z; +} + +double distance(const point3d &a, const point3d &b) // Distance +{ + return (a - b).module(); +} + +point3d cross(const point3d &a, const point3d &b) // Cross +{ + point3d v; + v.x = a.y*b.z-a.z*b.y; + v.y = a.z*b.x-a.x*b.z; + v.z = a.x*b.y-a.y*b.x; + if (fabs(v.x) <= ZERO) v.x = 0; + if (fabs(v.y) <= ZERO) v.y = 0; + if (fabs(v.z) <= ZERO) v.z = 0; + return v; +} + +/** + * Define the tensor structure + */ + +struct tensor +{ + double val[3][3]; +}; + +tensor kron(const point3d &a, const point3d &b) // tensor product +{ + tensor t; + t.val[0][0]=a.x*b.x; t.val[0][1]=a.x*b.y; t.val[0][2]=a.x*b.z; + t.val[1][0]=a.y*b.x; t.val[1][1]=a.y*b.y; t.val[1][2]=a.y*b.z; + t.val[2][0]=a.z*b.x; t.val[2][1]=a.z*b.y; t.val[2][2]=a.z*b.z; + return t; +} + +/** + * Define the tetrahedron structure + * + * regular type of tetrahedron + * 3 + * /|\ + * / | \ y + * z / | \ / + * | / 1 \ + * | / / \ \ + * |/ / \ \ + * 0-------------2----> x + * + * triangle list (anti-clockwise) + * 0 1 2 + * 0 2 3 + * 0 3 1 + * 1 3 2 + * + * inverse type of tetrahedron + * 3 + * /|\ + * / | \ y + * z / | \ / + * | / 2 \ + * | / / \ \ + * |/ / \ \ + * 0-------------1----> x + * + * triangle list (anti-clockwise) + * 0 1 3 + * 0 2 1 + * 0 3 2 + * 1 2 3 + */ +static int regular_order[12] = {0,1,2,0,2,3,0,3,1,1,3,2}; +static int inverse_order[12] = {0,1,3,0,2,1,0,3,2,1,2,3}; + +struct tetrahedron +{ + bool regular_type; + point3d *vec_ptr[4]; + tensor F[4]; + tensor E[12]; + double rho; + double edglen[12]; + void initialize_tensors(); +}; + +void tetrahedron::initialize_tensors() +{ + point3d v1, v2, v3, nf, ne; + + v1 = *vec_ptr[1] - *vec_ptr[0]; + v2 = *vec_ptr[2] - *vec_ptr[0]; + v3 = *vec_ptr[3] - *vec_ptr[0]; + + int *triangle_order; + if (dot(v3, cross(v1, v2)) <= 0.0) + { + regular_type = true; + triangle_order = regular_order; + } + else + { + regular_type = false; + triangle_order = inverse_order; + } + + for (int i = 0; i < 4; i++) + { + v1 = *vec_ptr[triangle_order[1+i*3]] - *vec_ptr[triangle_order[i*3]]; + v2 = *vec_ptr[triangle_order[2+i*3]] - *vec_ptr[triangle_order[i*3]]; + nf = cross(v1, v2).normal(); + F[i] = kron(nf, nf); + + for (int j = 0; j < 3; j++) + { + edglen[j+i*3] = distance(*vec_ptr[triangle_order[j+i*3]], *vec_ptr[triangle_order[(j+1)%3+i*3]]); + + v3 = *vec_ptr[triangle_order[(j+1)%3+i*3]] - *vec_ptr[triangle_order[j+i*3]]; + ne = cross(v3, nf).normal(); + E[j+i*3] = kron(nf, ne); + } + } + return; +} + +double tetra_vz(tetrahedron *ele_ptr, point3d *op_ptr) +{ + int f,e; + double Le,wf; + double dv1,dv2; + double face_sum,edge_sum; + point3d re; + point3d r_ijk[3]; + double L_ijk[3]; + + int *triangle_order; + if (ele_ptr->regular_type) + triangle_order = regular_order; + else + triangle_order = inverse_order; + + face_sum = edge_sum = 0.0; + for (f = 0; f < 4; f++) + { + r_ijk[0] = *ele_ptr->vec_ptr[triangle_order[3*f]] - *op_ptr; + r_ijk[1] = *ele_ptr->vec_ptr[triangle_order[3*f+1]] - *op_ptr; + r_ijk[2] = *ele_ptr->vec_ptr[triangle_order[3*f+2]] - *op_ptr; + + L_ijk[0] = r_ijk[0].module(); + L_ijk[1] = r_ijk[1].module(); + L_ijk[2] = r_ijk[2].module(); + + wf =2*atan2(dot(r_ijk[0], cross(r_ijk[1],r_ijk[2])), + L_ijk[0]*L_ijk[1]*L_ijk[2] + L_ijk[0]*dot(r_ijk[1],r_ijk[2]) + + L_ijk[1]*dot(r_ijk[2],r_ijk[0]) + L_ijk[2]*dot(r_ijk[0],r_ijk[1])); + + face_sum += (ele_ptr->F[f].val[2][0]*r_ijk[0].x + ele_ptr->F[f].val[2][1]*r_ijk[0].y + ele_ptr->F[f].val[2][2]*r_ijk[0].z) * wf; + + for (e = 0; e < 3; e++) + { + dv1 = distance(*ele_ptr->vec_ptr[triangle_order[e+3*f]], *op_ptr); + dv2 = distance(*ele_ptr->vec_ptr[triangle_order[(e+1)%3+3*f]], *op_ptr); + + re = 0.5*(*ele_ptr->vec_ptr[triangle_order[e+3*f]] + *ele_ptr->vec_ptr[triangle_order[(e+1)%3+3*f]]) - *op_ptr; + Le = log((dv1+dv2+ele_ptr->edglen[e+3*f])/(dv1+dv2-ele_ptr->edglen[e+3*f])); + + edge_sum += (ele_ptr->E[e+3*f].val[2][0]*re.x + ele_ptr->E[e+3*f].val[2][1]*re.y + ele_ptr->E[e+3*f].val[2][2]*re.z) * Le; + } + } + return 1.0e+8*G0*(ele_ptr->rho)*(edge_sum - face_sum); +} + +#endif // _TETRA_VZ_H \ No newline at end of file