diff --git a/runs/1D_Cathode/input.json b/runs/1D_Cathode/input.json new file mode 100644 index 0000000..21a85b9 --- /dev/null +++ b/runs/1D_Cathode/input.json @@ -0,0 +1,45 @@ + +{ + "output": { + "path": "./runs/1D_Cathode/", + "trigger": 100, + "cpuTime": false, + "numColl": false, + "EMField": true + }, + "reference": { + "density": 1.0e16, + "mass": 9.109e-31, + "temperature": 2500.0 + }, + "geometry": { + "type": "1DCart", + "meshType": "gmsh", + "meshFile": "mesh.msh" + }, + "species": [ + {"name": "Electron", "type": "charged", "mass": 9.109e-31, "charge":-1.0, "weight": 1.0e1} + ], + "boundary": [ + {"name": "Cathode", "type": "absorption", "physicalSurface": 1}, + {"name": "Infinite", "type": "absorption", "physicalSurface": 2} + ], + "boundaryEM": [ + {"name": "Cathode", "type": "dirichlet", "potential": 0.0, "physicalSurface": 1}, + {"name": "Infinite", "type": "dirichlet", "potential": 600.0, "physicalSurface": 2} + ], + "inject": [ + {"name": "Cathode Electron", "species": "Electron", "flow": 9.0e-5, "units": "A", "v": 27500.0, "T": [2500.0, 2500.0, 2500.0], "n": [ 1, 0, 0], "physicalSurface": 1} + ], + "case": { + "tau": [1.0e-11], + "time": 1.0e-6, + "pusher": ["1DCartCharged"], + "EMSolver": "Electrostatic" + }, + "parallel": { + "OpenMP":{ + "nThreads": 1 + } + } +} diff --git a/runs/1D_Cathode/mesh.msh b/runs/1D_Cathode/mesh.msh new file mode 100644 index 0000000..c02b45d --- /dev/null +++ b/runs/1D_Cathode/mesh.msh @@ -0,0 +1,2012 @@ +$MeshFormat +2.2 0 8 +$EndMeshFormat +$Nodes +1001 +1 0 0 0 +2 0.1 0 0 +3 9.999999999981703e-05 0 0 +4 0.0001999999999996341 0 0 +5 0.0002999999999994512 0 0 +6 0.0003999999999992681 0 0 +7 0.0004999999999990853 0 0 +8 0.0005999999999989023 0 0 +9 0.0006999999999987193 0 0 +10 0.0007999999999985371 0 0 +11 0.0008999999999983584 0 0 +12 0.0009999999999981796 0 0 +13 0.001099999999998001 0 0 +14 0.001199999999997822 0 0 +15 0.001299999999997643 0 0 +16 0.001399999999997465 0 0 +17 0.001499999999997286 0 0 +18 0.001599999999997107 0 0 +19 0.001699999999996928 0 0 +20 0.00179999999999675 0 0 +21 0.001899999999996571 0 0 +22 0.001999999999996392 0 0 +23 0.002099999999996213 0 0 +24 0.002199999999996035 0 0 +25 0.002299999999995856 0 0 +26 0.002399999999995671 0 0 +27 0.002499999999995482 0 0 +28 0.002599999999995292 0 0 +29 0.002699999999995102 0 0 +30 0.002799999999994912 0 0 +31 0.002899999999994723 0 0 +32 0.002999999999994533 0 0 +33 0.003099999999994344 0 0 +34 0.003199999999994146 0 0 +35 0.003299999999993945 0 0 +36 0.003399999999993746 0 0 +37 0.003499999999993545 0 0 +38 0.003599999999993345 0 0 +39 0.003699999999993145 0 0 +40 0.003799999999992943 0 0 +41 0.003899999999992743 0 0 +42 0.003999999999992523 0 0 +43 0.0040999999999923 0 0 +44 0.004199999999992078 0 0 +45 0.004299999999991856 0 0 +46 0.004399999999991634 0 0 +47 0.004499999999991412 0 0 +48 0.00459999999999119 0 0 +49 0.004699999999990968 0 0 +50 0.004799999999990746 0 0 +51 0.004899999999990523 0 0 +52 0.004999999999990301 0 0 +53 0.005099999999990079 0 0 +54 0.005199999999989857 0 0 +55 0.005299999999989635 0 0 +56 0.005399999999989413 0 0 +57 0.005499999999989204 0 0 +58 0.005599999999989026 0 0 +59 0.005699999999988847 0 0 +60 0.005799999999988668 0 0 +61 0.005899999999988489 0 0 +62 0.005999999999988311 0 0 +63 0.006099999999988132 0 0 +64 0.006199999999987954 0 0 +65 0.006299999999987785 0 0 +66 0.006399999999987628 0 0 +67 0.006499999999987472 0 0 +68 0.006599999999987315 0 0 +69 0.006699999999987158 0 0 +70 0.006799999999987001 0 0 +71 0.006899999999986845 0 0 +72 0.006999999999986687 0 0 +73 0.007099999999986545 0 0 +74 0.007199999999986409 0 0 +75 0.007299999999986275 0 0 +76 0.007399999999986139 0 0 +77 0.007499999999986003 0 0 +78 0.007599999999985867 0 0 +79 0.007699999999985732 0 0 +80 0.007799999999985596 0 0 +81 0.007899999999985479 0 0 +82 0.007999999999985366 0 0 +83 0.008099999999985253 0 0 +84 0.008199999999985141 0 0 +85 0.008299999999985026 0 0 +86 0.008399999999984913 0 0 +87 0.008499999999984799 0 0 +88 0.008599999999984682 0 0 +89 0.008699999999984526 0 0 +90 0.008799999999984369 0 0 +91 0.00889999999998421 0 0 +92 0.008999999999984054 0 0 +93 0.009099999999983897 0 0 +94 0.00919999999998374 0 0 +95 0.009299999999983584 0 0 +96 0.009399999999983429 0 0 +97 0.009499999999983272 0 0 +98 0.009599999999983113 0 0 +99 0.009699999999982955 0 0 +100 0.009799999999982798 0 0 +101 0.009899999999982641 0 0 +102 0.009999999999982485 0 0 +103 0.01009999999998233 0 0 +104 0.01019999999998219 0 0 +105 0.01029999999998208 0 0 +106 0.01039999999998196 0 0 +107 0.01049999999998185 0 0 +108 0.01059999999998174 0 0 +109 0.01069999999998162 0 0 +110 0.01079999999998151 0 0 +111 0.0108999999999814 0 0 +112 0.01099999999998125 0 0 +113 0.0110999999999811 0 0 +114 0.01119999999998094 0 0 +115 0.01129999999998078 0 0 +116 0.01139999999998063 0 0 +117 0.01149999999998047 0 0 +118 0.01159999999998031 0 0 +119 0.01169999999998016 0 0 +120 0.01179999999997996 0 0 +121 0.01189999999997976 0 0 +122 0.01199999999997956 0 0 +123 0.01209999999997936 0 0 +124 0.01219999999997916 0 0 +125 0.01229999999997896 0 0 +126 0.01239999999997876 0 0 +127 0.01249999999997856 0 0 +128 0.01259999999997832 0 0 +129 0.01269999999997807 0 0 +130 0.01279999999997783 0 0 +131 0.01289999999997759 0 0 +132 0.01299999999997734 0 0 +133 0.0130999999999771 0 0 +134 0.01319999999997685 0 0 +135 0.0132999999999766 0 0 +136 0.01339999999997631 0 0 +137 0.01349999999997603 0 0 +138 0.01359999999997574 0 0 +139 0.01369999999997545 0 0 +140 0.01379999999997517 0 0 +141 0.01389999999997488 0 0 +142 0.0139999999999746 0 0 +143 0.01409999999997431 0 0 +144 0.01419999999997402 0 0 +145 0.01429999999997373 0 0 +146 0.01439999999997345 0 0 +147 0.01449999999997316 0 0 +148 0.01459999999997287 0 0 +149 0.01469999999997259 0 0 +150 0.0147999999999723 0 0 +151 0.01489999999997201 0 0 +152 0.01499999999997172 0 0 +153 0.01509999999997143 0 0 +154 0.01519999999997115 0 0 +155 0.01529999999997086 0 0 +156 0.01539999999997057 0 0 +157 0.01549999999997029 0 0 +158 0.01559999999997 0 0 +159 0.01569999999996971 0 0 +160 0.01579999999996943 0 0 +161 0.01589999999996914 0 0 +162 0.01599999999996885 0 0 +163 0.01609999999996857 0 0 +164 0.01619999999996828 0 0 +165 0.01629999999996799 0 0 +166 0.0163999999999677 0 0 +167 0.01649999999996742 0 0 +168 0.01659999999996713 0 0 +169 0.01669999999996684 0 0 +170 0.01679999999996656 0 0 +171 0.01689999999996627 0 0 +172 0.01699999999996598 0 0 +173 0.01709999999996569 0 0 +174 0.01719999999996541 0 0 +175 0.01729999999996512 0 0 +176 0.01739999999996483 0 0 +177 0.01749999999996455 0 0 +178 0.01759999999996426 0 0 +179 0.01769999999996397 0 0 +180 0.01779999999996369 0 0 +181 0.0178999999999634 0 0 +182 0.01799999999996308 0 0 +183 0.01809999999996271 0 0 +184 0.01819999999996234 0 0 +185 0.01829999999996196 0 0 +186 0.01839999999996159 0 0 +187 0.01849999999996122 0 0 +188 0.01859999999996084 0 0 +189 0.01869999999996047 0 0 +190 0.0187999999999601 0 0 +191 0.01889999999995972 0 0 +192 0.01899999999995935 0 0 +193 0.01909999999995898 0 0 +194 0.0191999999999586 0 0 +195 0.01929999999995823 0 0 +196 0.01939999999995785 0 0 +197 0.01949999999995748 0 0 +198 0.01959999999995717 0 0 +199 0.01969999999995688 0 0 +200 0.01979999999995659 0 0 +201 0.0198999999999563 0 0 +202 0.01999999999995601 0 0 +203 0.02009999999995573 0 0 +204 0.02019999999995544 0 0 +205 0.02029999999995516 0 0 +206 0.02039999999995487 0 0 +207 0.02049999999995458 0 0 +208 0.02059999999995429 0 0 +209 0.02069999999995401 0 0 +210 0.02079999999995372 0 0 +211 0.02089999999995343 0 0 +212 0.02099999999995315 0 0 +213 0.02109999999995286 0 0 +214 0.02119999999995257 0 0 +215 0.02129999999995229 0 0 +216 0.021399999999952 0 0 +217 0.02149999999995171 0 0 +218 0.02159999999995142 0 0 +219 0.02169999999995114 0 0 +220 0.02179999999995085 0 0 +221 0.02189999999995056 0 0 +222 0.02199999999995028 0 0 +223 0.02209999999994999 0 0 +224 0.0221999999999497 0 0 +225 0.02229999999994942 0 0 +226 0.02239999999994913 0 0 +227 0.02249999999994884 0 0 +228 0.02259999999994855 0 0 +229 0.02269999999994827 0 0 +230 0.02279999999994798 0 0 +231 0.02289999999994769 0 0 +232 0.02299999999994741 0 0 +233 0.02309999999994712 0 0 +234 0.02319999999994683 0 0 +235 0.02329999999994654 0 0 +236 0.02339999999994626 0 0 +237 0.02349999999994597 0 0 +238 0.02359999999994568 0 0 +239 0.0236999999999454 0 0 +240 0.02379999999994511 0 0 +241 0.02389999999994482 0 0 +242 0.02399999999994453 0 0 +243 0.02409999999994425 0 0 +244 0.02419999999994396 0 0 +245 0.02429999999994367 0 0 +246 0.02439999999994339 0 0 +247 0.0244999999999431 0 0 +248 0.02459999999994281 0 0 +249 0.02469999999994252 0 0 +250 0.02479999999994224 0 0 +251 0.02489999999994195 0 0 +252 0.02499999999994167 0 0 +253 0.02509999999994138 0 0 +254 0.02519999999994109 0 0 +255 0.0252999999999408 0 0 +256 0.02539999999994052 0 0 +257 0.02549999999994023 0 0 +258 0.02559999999993995 0 0 +259 0.02569999999993966 0 0 +260 0.02579999999993937 0 0 +261 0.02589999999993908 0 0 +262 0.02599999999993879 0 0 +263 0.02609999999993851 0 0 +264 0.02619999999993822 0 0 +265 0.02629999999993794 0 0 +266 0.02639999999993765 0 0 +267 0.02649999999993736 0 0 +268 0.02659999999993708 0 0 +269 0.02669999999993679 0 0 +270 0.0267999999999365 0 0 +271 0.02689999999993621 0 0 +272 0.02699999999993593 0 0 +273 0.02709999999993564 0 0 +274 0.02719999999993535 0 0 +275 0.02729999999993507 0 0 +276 0.02739999999993478 0 0 +277 0.02749999999993449 0 0 +278 0.0275999999999342 0 0 +279 0.02769999999993392 0 0 +280 0.02779999999993363 0 0 +281 0.02789999999993334 0 0 +282 0.02799999999993306 0 0 +283 0.02809999999993277 0 0 +284 0.02819999999993248 0 0 +285 0.0282999999999322 0 0 +286 0.02839999999993191 0 0 +287 0.02849999999993162 0 0 +288 0.02859999999993133 0 0 +289 0.02869999999993105 0 0 +290 0.02879999999993076 0 0 +291 0.02889999999993047 0 0 +292 0.02899999999993019 0 0 +293 0.0290999999999299 0 0 +294 0.02919999999992961 0 0 +295 0.02929999999992932 0 0 +296 0.02939999999992904 0 0 +297 0.02949999999992875 0 0 +298 0.02959999999992846 0 0 +299 0.02969999999992818 0 0 +300 0.02979999999992789 0 0 +301 0.0298999999999276 0 0 +302 0.02999999999992731 0 0 +303 0.03009999999992703 0 0 +304 0.03019999999992674 0 0 +305 0.03029999999992645 0 0 +306 0.03039999999992617 0 0 +307 0.03049999999992588 0 0 +308 0.03059999999992559 0 0 +309 0.0306999999999253 0 0 +310 0.03079999999992502 0 0 +311 0.03089999999992473 0 0 +312 0.03099999999992444 0 0 +313 0.03109999999992416 0 0 +314 0.03119999999992387 0 0 +315 0.03129999999992358 0 0 +316 0.03139999999992329 0 0 +317 0.03149999999992301 0 0 +318 0.03159999999992272 0 0 +319 0.03169999999992243 0 0 +320 0.03179999999992215 0 0 +321 0.03189999999992186 0 0 +322 0.03199999999992157 0 0 +323 0.03209999999992128 0 0 +324 0.032199999999921 0 0 +325 0.03229999999992071 0 0 +326 0.03239999999992042 0 0 +327 0.03249999999992014 0 0 +328 0.03259999999991985 0 0 +329 0.03269999999991956 0 0 +330 0.03279999999991928 0 0 +331 0.03289999999991899 0 0 +332 0.0329999999999187 0 0 +333 0.03309999999991841 0 0 +334 0.03319999999991813 0 0 +335 0.03329999999991784 0 0 +336 0.03339999999991755 0 0 +337 0.03349999999991726 0 0 +338 0.03359999999991698 0 0 +339 0.03369999999991669 0 0 +340 0.0337999999999164 0 0 +341 0.03389999999991612 0 0 +342 0.03399999999991583 0 0 +343 0.03409999999991555 0 0 +344 0.03419999999991526 0 0 +345 0.03429999999991497 0 0 +346 0.03439999999991469 0 0 +347 0.0344999999999144 0 0 +348 0.03459999999991411 0 0 +349 0.03469999999991382 0 0 +350 0.03479999999991353 0 0 +351 0.03489999999991325 0 0 +352 0.03499999999991296 0 0 +353 0.03509999999991267 0 0 +354 0.03519999999991238 0 0 +355 0.0352999999999121 0 0 +356 0.03539999999991181 0 0 +357 0.03549999999991153 0 0 +358 0.03559999999991124 0 0 +359 0.03569999999991096 0 0 +360 0.03579999999991067 0 0 +361 0.03589999999991038 0 0 +362 0.0359999999999101 0 0 +363 0.03609999999990981 0 0 +364 0.03619999999990952 0 0 +365 0.03629999999990923 0 0 +366 0.03639999999990894 0 0 +367 0.03649999999990865 0 0 +368 0.03659999999990837 0 0 +369 0.03669999999990808 0 0 +370 0.03679999999990766 0 0 +371 0.03689999999990719 0 0 +372 0.03699999999990674 0 0 +373 0.03709999999990628 0 0 +374 0.03719999999990582 0 0 +375 0.03729999999990535 0 0 +376 0.03739999999990489 0 0 +377 0.03749999999990444 0 0 +378 0.03759999999990397 0 0 +379 0.03769999999990351 0 0 +380 0.03779999999990305 0 0 +381 0.03789999999990259 0 0 +382 0.03799999999990213 0 0 +383 0.03809999999990167 0 0 +384 0.03819999999990121 0 0 +385 0.03829999999990078 0 0 +386 0.0383999999999005 0 0 +387 0.0384999999999002 0 0 +388 0.03859999999989992 0 0 +389 0.03869999999989963 0 0 +390 0.03879999999989935 0 0 +391 0.03889999999989906 0 0 +392 0.03899999999989877 0 0 +393 0.03909999999989849 0 0 +394 0.0391999999998982 0 0 +395 0.03929999999989791 0 0 +396 0.03939999999989762 0 0 +397 0.03949999999989734 0 0 +398 0.03959999999989705 0 0 +399 0.03969999999989676 0 0 +400 0.03979999999989647 0 0 +401 0.03989999999989619 0 0 +402 0.0399999999998959 0 0 +403 0.04009999999989561 0 0 +404 0.04019999999989533 0 0 +405 0.04029999999989504 0 0 +406 0.04039999999989475 0 0 +407 0.04049999999989447 0 0 +408 0.04059999999989418 0 0 +409 0.04069999999989389 0 0 +410 0.04079999999989361 0 0 +411 0.04089999999989332 0 0 +412 0.04099999999989303 0 0 +413 0.04109999999989274 0 0 +414 0.04119999999989246 0 0 +415 0.04129999999989217 0 0 +416 0.04139999999989188 0 0 +417 0.0414999999998916 0 0 +418 0.04159999999989131 0 0 +419 0.04169999999989102 0 0 +420 0.04179999999989073 0 0 +421 0.04189999999989045 0 0 +422 0.04199999999989016 0 0 +423 0.04209999999988987 0 0 +424 0.04219999999988959 0 0 +425 0.0422999999998893 0 0 +426 0.04239999999988901 0 0 +427 0.04249999999988872 0 0 +428 0.04259999999988844 0 0 +429 0.04269999999988815 0 0 +430 0.04279999999988787 0 0 +431 0.04289999999988758 0 0 +432 0.0429999999998873 0 0 +433 0.04309999999988701 0 0 +434 0.04319999999988672 0 0 +435 0.04329999999988643 0 0 +436 0.04339999999988614 0 0 +437 0.04349999999988585 0 0 +438 0.04359999999988557 0 0 +439 0.04369999999988528 0 0 +440 0.04379999999988499 0 0 +441 0.0438999999998847 0 0 +442 0.04399999999988442 0 0 +443 0.04409999999988413 0 0 +444 0.04419999999988385 0 0 +445 0.04429999999988356 0 0 +446 0.04439999999988328 0 0 +447 0.04449999999988299 0 0 +448 0.0445999999998827 0 0 +449 0.04469999999988242 0 0 +450 0.04479999999988213 0 0 +451 0.04489999999988184 0 0 +452 0.04499999999988155 0 0 +453 0.04509999999988126 0 0 +454 0.04519999999988097 0 0 +455 0.04529999999988069 0 0 +456 0.0453999999998804 0 0 +457 0.04549999999988012 0 0 +458 0.04559999999987983 0 0 +459 0.04569999999987955 0 0 +460 0.04579999999987926 0 0 +461 0.04589999999987897 0 0 +462 0.04599999999987868 0 0 +463 0.0460999999998784 0 0 +464 0.04619999999987811 0 0 +465 0.04629999999987782 0 0 +466 0.04639999999987754 0 0 +467 0.04649999999987725 0 0 +468 0.04659999999987696 0 0 +469 0.04669999999987667 0 0 +470 0.04679999999987638 0 0 +471 0.0468999999998761 0 0 +472 0.04699999999987581 0 0 +473 0.04709999999987552 0 0 +474 0.04719999999987523 0 0 +475 0.04729999999987494 0 0 +476 0.04739999999987466 0 0 +477 0.04749999999987437 0 0 +478 0.04759999999987408 0 0 +479 0.04769999999987379 0 0 +480 0.04779999999987351 0 0 +481 0.04789999999987322 0 0 +482 0.04799999999987294 0 0 +483 0.04809999999987265 0 0 +484 0.04819999999987237 0 0 +485 0.04829999999987208 0 0 +486 0.04839999999987179 0 0 +487 0.04849999999987151 0 0 +488 0.04859999999987122 0 0 +489 0.04869999999987093 0 0 +490 0.04879999999987064 0 0 +491 0.04889999999987035 0 0 +492 0.04899999999987006 0 0 +493 0.04909999999986978 0 0 +494 0.04919999999986949 0 0 +495 0.04929999999986934 0 0 +496 0.04939999999986924 0 0 +497 0.04949999999986912 0 0 +498 0.04959999999986901 0 0 +499 0.04969999999986889 0 0 +500 0.04979999999986878 0 0 +501 0.04989999999986866 0 0 +502 0.04999999999986855 0 0 +503 0.05009999999986861 0 0 +504 0.05019999999986868 0 0 +505 0.05029999999986873 0 0 +506 0.0503999999998688 0 0 +507 0.05049999999986885 0 0 +508 0.05059999999986891 0 0 +509 0.05069999999986897 0 0 +510 0.05079999999986906 0 0 +511 0.0508999999998693 0 0 +512 0.05099999999986953 0 0 +513 0.05109999999986976 0 0 +514 0.05119999999987 0 0 +515 0.05129999999987023 0 0 +516 0.05139999999987047 0 0 +517 0.0514999999998707 0 0 +518 0.051599999999871 0 0 +519 0.0516999999998714 0 0 +520 0.05179999999987181 0 0 +521 0.05189999999987222 0 0 +522 0.05199999999987262 0 0 +523 0.05209999999987303 0 0 +524 0.05219999999987343 0 0 +525 0.05229999999987384 0 0 +526 0.05239999999987415 0 0 +527 0.05249999999987438 0 0 +528 0.05259999999987462 0 0 +529 0.05269999999987485 0 0 +530 0.05279999999987509 0 0 +531 0.05289999999987532 0 0 +532 0.05299999999987555 0 0 +533 0.05309999999987578 0 0 +534 0.05319999999987601 0 0 +535 0.05329999999987625 0 0 +536 0.05339999999987648 0 0 +537 0.05349999999987672 0 0 +538 0.05359999999987695 0 0 +539 0.05369999999987718 0 0 +540 0.05379999999987742 0 0 +541 0.05389999999987765 0 0 +542 0.05399999999987788 0 0 +543 0.05409999999987811 0 0 +544 0.05419999999987835 0 0 +545 0.05429999999987858 0 0 +546 0.05439999999987882 0 0 +547 0.05449999999987905 0 0 +548 0.05459999999987928 0 0 +549 0.05469999999987951 0 0 +550 0.05479999999987975 0 0 +551 0.05489999999987998 0 0 +552 0.05499999999988021 0 0 +553 0.05509999999988045 0 0 +554 0.05519999999988068 0 0 +555 0.05529999999988092 0 0 +556 0.05539999999988115 0 0 +557 0.05549999999988142 0 0 +558 0.05559999999988183 0 0 +559 0.05569999999988225 0 0 +560 0.05579999999988264 0 0 +561 0.05589999999988306 0 0 +562 0.05599999999988346 0 0 +563 0.05609999999988387 0 0 +564 0.05619999999988428 0 0 +565 0.05629999999988459 0 0 +566 0.05639999999988482 0 0 +567 0.05649999999988506 0 0 +568 0.05659999999988529 0 0 +569 0.05669999999988552 0 0 +570 0.05679999999988575 0 0 +571 0.05689999999988599 0 0 +572 0.05699999999988623 0 0 +573 0.05709999999988646 0 0 +574 0.05719999999988669 0 0 +575 0.05729999999988692 0 0 +576 0.05739999999988715 0 0 +577 0.05749999999988739 0 0 +578 0.05759999999988762 0 0 +579 0.05769999999988785 0 0 +580 0.05779999999988809 0 0 +581 0.05789999999988832 0 0 +582 0.05799999999988856 0 0 +583 0.05809999999988879 0 0 +584 0.05819999999988902 0 0 +585 0.05829999999988925 0 0 +586 0.05839999999988948 0 0 +587 0.05849999999988972 0 0 +588 0.05859999999988996 0 0 +589 0.05869999999989019 0 0 +590 0.05879999999989042 0 0 +591 0.05889999999989065 0 0 +592 0.05899999999989089 0 0 +593 0.05909999999989112 0 0 +594 0.05919999999989135 0 0 +595 0.05929999999989159 0 0 +596 0.05939999999989187 0 0 +597 0.05949999999989228 0 0 +598 0.05959999999989268 0 0 +599 0.05969999999989309 0 0 +600 0.05979999999989349 0 0 +601 0.05989999999989389 0 0 +602 0.0599999999998943 0 0 +603 0.0600999999998947 0 0 +604 0.06019999999989503 0 0 +605 0.06029999999989526 0 0 +606 0.0603999999998955 0 0 +607 0.06049999999989573 0 0 +608 0.06059999999989596 0 0 +609 0.0606999999998962 0 0 +610 0.06079999999989643 0 0 +611 0.06089999999989666 0 0 +612 0.06099999999989689 0 0 +613 0.06109999999989713 0 0 +614 0.06119999999989736 0 0 +615 0.0612999999998976 0 0 +616 0.06139999999989783 0 0 +617 0.06149999999989806 0 0 +618 0.06159999999989829 0 0 +619 0.06169999999989853 0 0 +620 0.06179999999989876 0 0 +621 0.06189999999989899 0 0 +622 0.06199999999989923 0 0 +623 0.06209999999989946 0 0 +624 0.0621999999998997 0 0 +625 0.06229999999989993 0 0 +626 0.06239999999990016 0 0 +627 0.06249999999990039 0 0 +628 0.06259999999990062 0 0 +629 0.06269999999990086 0 0 +630 0.06279999999990109 0 0 +631 0.06289999999990133 0 0 +632 0.06299999999990157 0 0 +633 0.06309999999990179 0 0 +634 0.06319999999990203 0 0 +635 0.0632999999999023 0 0 +636 0.06339999999990269 0 0 +637 0.06349999999990311 0 0 +638 0.06359999999990351 0 0 +639 0.06369999999990392 0 0 +640 0.06379999999990432 0 0 +641 0.06389999999990474 0 0 +642 0.06399999999990513 0 0 +643 0.06409999999990555 0 0 +644 0.06419999999990594 0 0 +645 0.06429999999990636 0 0 +646 0.06439999999990677 0 0 +647 0.06449999999990717 0 0 +648 0.06459999999990758 0 0 +649 0.06469999999990798 0 0 +650 0.06479999999990839 0 0 +651 0.0648999999999086 0 0 +652 0.06499999999990866 0 0 +653 0.06509999999990872 0 0 +654 0.06519999999990878 0 0 +655 0.06529999999990885 0 0 +656 0.06539999999990891 0 0 +657 0.06549999999990895 0 0 +658 0.06559999999990902 0 0 +659 0.06569999999990908 0 0 +660 0.06579999999990914 0 0 +661 0.0658999999999092 0 0 +662 0.06599999999990926 0 0 +663 0.06609999999990933 0 0 +664 0.06619999999990937 0 0 +665 0.06629999999990943 0 0 +666 0.0663999999999095 0 0 +667 0.06649999999990988 0 0 +668 0.06659999999991029 0 0 +669 0.06669999999991071 0 0 +670 0.0667999999999111 0 0 +671 0.06689999999991152 0 0 +672 0.06699999999991191 0 0 +673 0.06709999999991233 0 0 +674 0.06719999999991273 0 0 +675 0.06729999999991314 0 0 +676 0.06739999999991354 0 0 +677 0.06749999999991395 0 0 +678 0.06759999999991435 0 0 +679 0.06769999999991476 0 0 +680 0.06779999999991516 0 0 +681 0.06789999999991557 0 0 +682 0.06799999999991597 0 0 +683 0.06809999999991638 0 0 +684 0.0681999999999168 0 0 +685 0.06829999999991719 0 0 +686 0.06839999999991761 0 0 +687 0.068499999999918 0 0 +688 0.06859999999991842 0 0 +689 0.06869999999991883 0 0 +690 0.06879999999991906 0 0 +691 0.06889999999991912 0 0 +692 0.06899999999991917 0 0 +693 0.06909999999991924 0 0 +694 0.0691999999999193 0 0 +695 0.06929999999991936 0 0 +696 0.06939999999991942 0 0 +697 0.06949999999991947 0 0 +698 0.06959999999991955 0 0 +699 0.06969999999991959 0 0 +700 0.06979999999991965 0 0 +701 0.06989999999991972 0 0 +702 0.06999999999991978 0 0 +703 0.07009999999991984 0 0 +704 0.0701999999999199 0 0 +705 0.07029999999991995 0 0 +706 0.07039999999992032 0 0 +707 0.07049999999992072 0 0 +708 0.07059999999992113 0 0 +709 0.07069999999992153 0 0 +710 0.07079999999992194 0 0 +711 0.07089999999992234 0 0 +712 0.07099999999992276 0 0 +713 0.07109999999992316 0 0 +714 0.07119999999992357 0 0 +715 0.07129999999992398 0 0 +716 0.07139999999992439 0 0 +717 0.07149999999992479 0 0 +718 0.0715999999999252 0 0 +719 0.0716999999999256 0 0 +720 0.07179999999992602 0 0 +721 0.07189999999992641 0 0 +722 0.07199999999992683 0 0 +723 0.07209999999992722 0 0 +724 0.07219999999992764 0 0 +725 0.07229999999992805 0 0 +726 0.07239999999992845 0 0 +727 0.07249999999992886 0 0 +728 0.07259999999992926 0 0 +729 0.07269999999992952 0 0 +730 0.07279999999992957 0 0 +731 0.07289999999992963 0 0 +732 0.07299999999992969 0 0 +733 0.07309999999992976 0 0 +734 0.07319999999992981 0 0 +735 0.07329999999992988 0 0 +736 0.07339999999992994 0 0 +737 0.07349999999993 0 0 +738 0.07359999999993005 0 0 +739 0.07369999999993011 0 0 +740 0.07379999999993017 0 0 +741 0.07389999999993023 0 0 +742 0.07399999999993029 0 0 +743 0.07409999999993036 0 0 +744 0.07419999999993042 0 0 +745 0.07429999999993075 0 0 +746 0.07439999999993116 0 0 +747 0.07449999999993157 0 0 +748 0.07459999999993198 0 0 +749 0.07469999999993238 0 0 +750 0.0747999999999328 0 0 +751 0.07489999999993319 0 0 +752 0.07499999999993361 0 0 +753 0.07509999999993401 0 0 +754 0.07519999999993442 0 0 +755 0.07529999999993482 0 0 +756 0.07539999999993523 0 0 +757 0.07549999999993563 0 0 +758 0.07559999999993605 0 0 +759 0.07569999999993644 0 0 +760 0.07579999999993679 0 0 +761 0.07589999999993685 0 0 +762 0.07599999999993691 0 0 +763 0.07609999999993697 0 0 +764 0.07619999999993704 0 0 +765 0.07629999999993708 0 0 +766 0.07639999999993714 0 0 +767 0.07649999999993722 0 0 +768 0.07659999999993727 0 0 +769 0.07669999999993732 0 0 +770 0.07679999999993739 0 0 +771 0.07689999999993744 0 0 +772 0.07699999999993751 0 0 +773 0.07709999999993755 0 0 +774 0.07719999999993761 0 0 +775 0.07729999999993768 0 0 +776 0.07739999999993794 0 0 +777 0.07749999999993834 0 0 +778 0.07759999999993875 0 0 +779 0.07769999999993915 0 0 +780 0.07779999999993956 0 0 +781 0.07789999999993996 0 0 +782 0.07799999999994037 0 0 +783 0.07809999999994077 0 0 +784 0.07819999999994118 0 0 +785 0.07829999999994158 0 0 +786 0.078399999999942 0 0 +787 0.07849999999994239 0 0 +788 0.07859999999994281 0 0 +789 0.0786999999999432 0 0 +790 0.07879999999994362 0 0 +791 0.07889999999994403 0 0 +792 0.07899999999994443 0 0 +793 0.07909999999994484 0 0 +794 0.07919999999994526 0 0 +795 0.07929999999994565 0 0 +796 0.07939999999994607 0 0 +797 0.07949999999994646 0 0 +798 0.07959999999994688 0 0 +799 0.07969999999994724 0 0 +800 0.0797999999999473 0 0 +801 0.07989999999994735 0 0 +802 0.07999999999994742 0 0 +803 0.08009999999994748 0 0 +804 0.08019999999994754 0 0 +805 0.08029999999994759 0 0 +806 0.08039999999994765 0 0 +807 0.08049999999994772 0 0 +808 0.08059999999994777 0 0 +809 0.08069999999994783 0 0 +810 0.0807999999999479 0 0 +811 0.08089999999994796 0 0 +812 0.08099999999994802 0 0 +813 0.08109999999994807 0 0 +814 0.08119999999994813 0 0 +815 0.08129999999994836 0 0 +816 0.08139999999994878 0 0 +817 0.08149999999994918 0 0 +818 0.08159999999994959 0 0 +819 0.08169999999994999 0 0 +820 0.0817999999999504 0 0 +821 0.0818999999999508 0 0 +822 0.08199999999995122 0 0 +823 0.08209999999995161 0 0 +824 0.08219999999995203 0 0 +825 0.08229999999995243 0 0 +826 0.08239999999995284 0 0 +827 0.08249999999995325 0 0 +828 0.08259999999995365 0 0 +829 0.08269999999995406 0 0 +830 0.08279999999995447 0 0 +831 0.08289999999995487 0 0 +832 0.08299999999995528 0 0 +833 0.08309999999995568 0 0 +834 0.08319999999995609 0 0 +835 0.08329999999995649 0 0 +836 0.0833999999999569 0 0 +837 0.08349999999995732 0 0 +838 0.08359999999995769 0 0 +839 0.08369999999995775 0 0 +840 0.08379999999995781 0 0 +841 0.08389999999995787 0 0 +842 0.08399999999995794 0 0 +843 0.08409999999995799 0 0 +844 0.08419999999995806 0 0 +845 0.08429999999995812 0 0 +846 0.08439999999995818 0 0 +847 0.08449999999995823 0 0 +848 0.08459999999995829 0 0 +849 0.08469999999995835 0 0 +850 0.08479999999995841 0 0 +851 0.08489999999995847 0 0 +852 0.08499999999995854 0 0 +853 0.0850999999999586 0 0 +854 0.08519999999995881 0 0 +855 0.08529999999995921 0 0 +856 0.08539999999995962 0 0 +857 0.08549999999996002 0 0 +858 0.08559999999996043 0 0 +859 0.08569999999996084 0 0 +860 0.08579999999996124 0 0 +861 0.08589999999996165 0 0 +862 0.08599999999996205 0 0 +863 0.08609999999996246 0 0 +864 0.08619999999996286 0 0 +865 0.08629999999996328 0 0 +866 0.08639999999996367 0 0 +867 0.08649999999996409 0 0 +868 0.0865999999999645 0 0 +869 0.0866999999999649 0 0 +870 0.08679999999996531 0 0 +871 0.08689999999996571 0 0 +872 0.08699999999996612 0 0 +873 0.08709999999996654 0 0 +874 0.08719999999996693 0 0 +875 0.08729999999996735 0 0 +876 0.08739999999996774 0 0 +877 0.08749999999996816 0 0 +878 0.0875999999999682 0 0 +879 0.08769999999996828 0 0 +880 0.08779999999996833 0 0 +881 0.08789999999996839 0 0 +882 0.08799999999996845 0 0 +883 0.08809999999996851 0 0 +884 0.08819999999996858 0 0 +885 0.08829999999996863 0 0 +886 0.08839999999996868 0 0 +887 0.08849999999996876 0 0 +888 0.08859999999996881 0 0 +889 0.08869999999996887 0 0 +890 0.08879999999996893 0 0 +891 0.08889999999996899 0 0 +892 0.08899999999996905 0 0 +893 0.08909999999996925 0 0 +894 0.08919999999996964 0 0 +895 0.08929999999997006 0 0 +896 0.08939999999997046 0 0 +897 0.08949999999997087 0 0 +898 0.08959999999997127 0 0 +899 0.08969999999997168 0 0 +900 0.08979999999997208 0 0 +901 0.0898999999999725 0 0 +902 0.08999999999997289 0 0 +903 0.09009999999997331 0 0 +904 0.0901999999999737 0 0 +905 0.09029999999997412 0 0 +906 0.09039999999997453 0 0 +907 0.09049999999997493 0 0 +908 0.09059999999997534 0 0 +909 0.09069999999997574 0 0 +910 0.09079999999997615 0 0 +911 0.09089999999997656 0 0 +912 0.09099999999997696 0 0 +913 0.09109999999997737 0 0 +914 0.09119999999997777 0 0 +915 0.09129999999997818 0 0 +916 0.0913999999999786 0 0 +917 0.09149999999997867 0 0 +918 0.09159999999997873 0 0 +919 0.0916999999999788 0 0 +920 0.09179999999997884 0 0 +921 0.09189999999997892 0 0 +922 0.09199999999997897 0 0 +923 0.09209999999997903 0 0 +924 0.09219999999997909 0 0 +925 0.09229999999997915 0 0 +926 0.09239999999997921 0 0 +927 0.09249999999997927 0 0 +928 0.09259999999997932 0 0 +929 0.0926999999999794 0 0 +930 0.09279999999997945 0 0 +931 0.0928999999999795 0 0 +932 0.09299999999997967 0 0 +933 0.09309999999998009 0 0 +934 0.09319999999998049 0 0 +935 0.0932999999999809 0 0 +936 0.0933999999999813 0 0 +937 0.09349999999998171 0 0 +938 0.09359999999998211 0 0 +939 0.09369999999998252 0 0 +940 0.09379999999998292 0 0 +941 0.09389999999998333 0 0 +942 0.09399999999998374 0 0 +943 0.09409999999998414 0 0 +944 0.09419999999998455 0 0 +945 0.09429999999998495 0 0 +946 0.09439999999998536 0 0 +947 0.09449999999998576 0 0 +948 0.09459999999998617 0 0 +949 0.09469999999998657 0 0 +950 0.09479999999998698 0 0 +951 0.09489999999998738 0 0 +952 0.0949999999999878 0 0 +953 0.09509999999998819 0 0 +954 0.09519999999998861 0 0 +955 0.095299999999989 0 0 +956 0.09539999999998912 0 0 +957 0.09549999999998918 0 0 +958 0.09559999999998924 0 0 +959 0.09569999999998929 0 0 +960 0.09579999999998935 0 0 +961 0.09589999999998942 0 0 +962 0.09599999999998948 0 0 +963 0.09609999999998953 0 0 +964 0.0961999999999896 0 0 +965 0.09629999999998966 0 0 +966 0.09639999999998972 0 0 +967 0.09649999999998977 0 0 +968 0.09659999999998983 0 0 +969 0.09669999999998991 0 0 +970 0.09679999999998995 0 0 +971 0.09689999999999011 0 0 +972 0.09699999999999051 0 0 +973 0.09709999999999092 0 0 +974 0.09719999999999132 0 0 +975 0.09729999999999173 0 0 +976 0.09739999999999213 0 0 +977 0.09749999999999254 0 0 +978 0.09759999999999294 0 0 +979 0.09769999999999335 0 0 +980 0.09779999999999377 0 0 +981 0.09789999999999416 0 0 +982 0.09799999999999458 0 0 +983 0.09809999999999497 0 0 +984 0.09819999999999539 0 0 +985 0.09829999999999579 0 0 +986 0.0983999999999962 0 0 +987 0.0984999999999966 0 0 +988 0.09859999999999701 0 0 +989 0.09869999999999741 0 0 +990 0.09879999999999783 0 0 +991 0.09889999999999823 0 0 +992 0.09899999999999864 0 0 +993 0.09909999999999905 0 0 +994 0.09919999999999946 0 0 +995 0.09929999999999957 0 0 +996 0.09939999999999964 0 0 +997 0.0994999999999997 0 0 +998 0.09959999999999976 0 0 +999 0.09969999999999982 0 0 +1000 0.09979999999999989 0 0 +1001 0.09989999999999993 0 0 +$EndNodes +$Elements +1002 +1 15 2 1 1 1 +2 15 2 2 2 2 +3 1 2 1 1 1 3 +4 1 2 1 1 3 4 +5 1 2 1 1 4 5 +6 1 2 1 1 5 6 +7 1 2 1 1 6 7 +8 1 2 1 1 7 8 +9 1 2 1 1 8 9 +10 1 2 1 1 9 10 +11 1 2 1 1 10 11 +12 1 2 1 1 11 12 +13 1 2 1 1 12 13 +14 1 2 1 1 13 14 +15 1 2 1 1 14 15 +16 1 2 1 1 15 16 +17 1 2 1 1 16 17 +18 1 2 1 1 17 18 +19 1 2 1 1 18 19 +20 1 2 1 1 19 20 +21 1 2 1 1 20 21 +22 1 2 1 1 21 22 +23 1 2 1 1 22 23 +24 1 2 1 1 23 24 +25 1 2 1 1 24 25 +26 1 2 1 1 25 26 +27 1 2 1 1 26 27 +28 1 2 1 1 27 28 +29 1 2 1 1 28 29 +30 1 2 1 1 29 30 +31 1 2 1 1 30 31 +32 1 2 1 1 31 32 +33 1 2 1 1 32 33 +34 1 2 1 1 33 34 +35 1 2 1 1 34 35 +36 1 2 1 1 35 36 +37 1 2 1 1 36 37 +38 1 2 1 1 37 38 +39 1 2 1 1 38 39 +40 1 2 1 1 39 40 +41 1 2 1 1 40 41 +42 1 2 1 1 41 42 +43 1 2 1 1 42 43 +44 1 2 1 1 43 44 +45 1 2 1 1 44 45 +46 1 2 1 1 45 46 +47 1 2 1 1 46 47 +48 1 2 1 1 47 48 +49 1 2 1 1 48 49 +50 1 2 1 1 49 50 +51 1 2 1 1 50 51 +52 1 2 1 1 51 52 +53 1 2 1 1 52 53 +54 1 2 1 1 53 54 +55 1 2 1 1 54 55 +56 1 2 1 1 55 56 +57 1 2 1 1 56 57 +58 1 2 1 1 57 58 +59 1 2 1 1 58 59 +60 1 2 1 1 59 60 +61 1 2 1 1 60 61 +62 1 2 1 1 61 62 +63 1 2 1 1 62 63 +64 1 2 1 1 63 64 +65 1 2 1 1 64 65 +66 1 2 1 1 65 66 +67 1 2 1 1 66 67 +68 1 2 1 1 67 68 +69 1 2 1 1 68 69 +70 1 2 1 1 69 70 +71 1 2 1 1 70 71 +72 1 2 1 1 71 72 +73 1 2 1 1 72 73 +74 1 2 1 1 73 74 +75 1 2 1 1 74 75 +76 1 2 1 1 75 76 +77 1 2 1 1 76 77 +78 1 2 1 1 77 78 +79 1 2 1 1 78 79 +80 1 2 1 1 79 80 +81 1 2 1 1 80 81 +82 1 2 1 1 81 82 +83 1 2 1 1 82 83 +84 1 2 1 1 83 84 +85 1 2 1 1 84 85 +86 1 2 1 1 85 86 +87 1 2 1 1 86 87 +88 1 2 1 1 87 88 +89 1 2 1 1 88 89 +90 1 2 1 1 89 90 +91 1 2 1 1 90 91 +92 1 2 1 1 91 92 +93 1 2 1 1 92 93 +94 1 2 1 1 93 94 +95 1 2 1 1 94 95 +96 1 2 1 1 95 96 +97 1 2 1 1 96 97 +98 1 2 1 1 97 98 +99 1 2 1 1 98 99 +100 1 2 1 1 99 100 +101 1 2 1 1 100 101 +102 1 2 1 1 101 102 +103 1 2 1 1 102 103 +104 1 2 1 1 103 104 +105 1 2 1 1 104 105 +106 1 2 1 1 105 106 +107 1 2 1 1 106 107 +108 1 2 1 1 107 108 +109 1 2 1 1 108 109 +110 1 2 1 1 109 110 +111 1 2 1 1 110 111 +112 1 2 1 1 111 112 +113 1 2 1 1 112 113 +114 1 2 1 1 113 114 +115 1 2 1 1 114 115 +116 1 2 1 1 115 116 +117 1 2 1 1 116 117 +118 1 2 1 1 117 118 +119 1 2 1 1 118 119 +120 1 2 1 1 119 120 +121 1 2 1 1 120 121 +122 1 2 1 1 121 122 +123 1 2 1 1 122 123 +124 1 2 1 1 123 124 +125 1 2 1 1 124 125 +126 1 2 1 1 125 126 +127 1 2 1 1 126 127 +128 1 2 1 1 127 128 +129 1 2 1 1 128 129 +130 1 2 1 1 129 130 +131 1 2 1 1 130 131 +132 1 2 1 1 131 132 +133 1 2 1 1 132 133 +134 1 2 1 1 133 134 +135 1 2 1 1 134 135 +136 1 2 1 1 135 136 +137 1 2 1 1 136 137 +138 1 2 1 1 137 138 +139 1 2 1 1 138 139 +140 1 2 1 1 139 140 +141 1 2 1 1 140 141 +142 1 2 1 1 141 142 +143 1 2 1 1 142 143 +144 1 2 1 1 143 144 +145 1 2 1 1 144 145 +146 1 2 1 1 145 146 +147 1 2 1 1 146 147 +148 1 2 1 1 147 148 +149 1 2 1 1 148 149 +150 1 2 1 1 149 150 +151 1 2 1 1 150 151 +152 1 2 1 1 151 152 +153 1 2 1 1 152 153 +154 1 2 1 1 153 154 +155 1 2 1 1 154 155 +156 1 2 1 1 155 156 +157 1 2 1 1 156 157 +158 1 2 1 1 157 158 +159 1 2 1 1 158 159 +160 1 2 1 1 159 160 +161 1 2 1 1 160 161 +162 1 2 1 1 161 162 +163 1 2 1 1 162 163 +164 1 2 1 1 163 164 +165 1 2 1 1 164 165 +166 1 2 1 1 165 166 +167 1 2 1 1 166 167 +168 1 2 1 1 167 168 +169 1 2 1 1 168 169 +170 1 2 1 1 169 170 +171 1 2 1 1 170 171 +172 1 2 1 1 171 172 +173 1 2 1 1 172 173 +174 1 2 1 1 173 174 +175 1 2 1 1 174 175 +176 1 2 1 1 175 176 +177 1 2 1 1 176 177 +178 1 2 1 1 177 178 +179 1 2 1 1 178 179 +180 1 2 1 1 179 180 +181 1 2 1 1 180 181 +182 1 2 1 1 181 182 +183 1 2 1 1 182 183 +184 1 2 1 1 183 184 +185 1 2 1 1 184 185 +186 1 2 1 1 185 186 +187 1 2 1 1 186 187 +188 1 2 1 1 187 188 +189 1 2 1 1 188 189 +190 1 2 1 1 189 190 +191 1 2 1 1 190 191 +192 1 2 1 1 191 192 +193 1 2 1 1 192 193 +194 1 2 1 1 193 194 +195 1 2 1 1 194 195 +196 1 2 1 1 195 196 +197 1 2 1 1 196 197 +198 1 2 1 1 197 198 +199 1 2 1 1 198 199 +200 1 2 1 1 199 200 +201 1 2 1 1 200 201 +202 1 2 1 1 201 202 +203 1 2 1 1 202 203 +204 1 2 1 1 203 204 +205 1 2 1 1 204 205 +206 1 2 1 1 205 206 +207 1 2 1 1 206 207 +208 1 2 1 1 207 208 +209 1 2 1 1 208 209 +210 1 2 1 1 209 210 +211 1 2 1 1 210 211 +212 1 2 1 1 211 212 +213 1 2 1 1 212 213 +214 1 2 1 1 213 214 +215 1 2 1 1 214 215 +216 1 2 1 1 215 216 +217 1 2 1 1 216 217 +218 1 2 1 1 217 218 +219 1 2 1 1 218 219 +220 1 2 1 1 219 220 +221 1 2 1 1 220 221 +222 1 2 1 1 221 222 +223 1 2 1 1 222 223 +224 1 2 1 1 223 224 +225 1 2 1 1 224 225 +226 1 2 1 1 225 226 +227 1 2 1 1 226 227 +228 1 2 1 1 227 228 +229 1 2 1 1 228 229 +230 1 2 1 1 229 230 +231 1 2 1 1 230 231 +232 1 2 1 1 231 232 +233 1 2 1 1 232 233 +234 1 2 1 1 233 234 +235 1 2 1 1 234 235 +236 1 2 1 1 235 236 +237 1 2 1 1 236 237 +238 1 2 1 1 237 238 +239 1 2 1 1 238 239 +240 1 2 1 1 239 240 +241 1 2 1 1 240 241 +242 1 2 1 1 241 242 +243 1 2 1 1 242 243 +244 1 2 1 1 243 244 +245 1 2 1 1 244 245 +246 1 2 1 1 245 246 +247 1 2 1 1 246 247 +248 1 2 1 1 247 248 +249 1 2 1 1 248 249 +250 1 2 1 1 249 250 +251 1 2 1 1 250 251 +252 1 2 1 1 251 252 +253 1 2 1 1 252 253 +254 1 2 1 1 253 254 +255 1 2 1 1 254 255 +256 1 2 1 1 255 256 +257 1 2 1 1 256 257 +258 1 2 1 1 257 258 +259 1 2 1 1 258 259 +260 1 2 1 1 259 260 +261 1 2 1 1 260 261 +262 1 2 1 1 261 262 +263 1 2 1 1 262 263 +264 1 2 1 1 263 264 +265 1 2 1 1 264 265 +266 1 2 1 1 265 266 +267 1 2 1 1 266 267 +268 1 2 1 1 267 268 +269 1 2 1 1 268 269 +270 1 2 1 1 269 270 +271 1 2 1 1 270 271 +272 1 2 1 1 271 272 +273 1 2 1 1 272 273 +274 1 2 1 1 273 274 +275 1 2 1 1 274 275 +276 1 2 1 1 275 276 +277 1 2 1 1 276 277 +278 1 2 1 1 277 278 +279 1 2 1 1 278 279 +280 1 2 1 1 279 280 +281 1 2 1 1 280 281 +282 1 2 1 1 281 282 +283 1 2 1 1 282 283 +284 1 2 1 1 283 284 +285 1 2 1 1 284 285 +286 1 2 1 1 285 286 +287 1 2 1 1 286 287 +288 1 2 1 1 287 288 +289 1 2 1 1 288 289 +290 1 2 1 1 289 290 +291 1 2 1 1 290 291 +292 1 2 1 1 291 292 +293 1 2 1 1 292 293 +294 1 2 1 1 293 294 +295 1 2 1 1 294 295 +296 1 2 1 1 295 296 +297 1 2 1 1 296 297 +298 1 2 1 1 297 298 +299 1 2 1 1 298 299 +300 1 2 1 1 299 300 +301 1 2 1 1 300 301 +302 1 2 1 1 301 302 +303 1 2 1 1 302 303 +304 1 2 1 1 303 304 +305 1 2 1 1 304 305 +306 1 2 1 1 305 306 +307 1 2 1 1 306 307 +308 1 2 1 1 307 308 +309 1 2 1 1 308 309 +310 1 2 1 1 309 310 +311 1 2 1 1 310 311 +312 1 2 1 1 311 312 +313 1 2 1 1 312 313 +314 1 2 1 1 313 314 +315 1 2 1 1 314 315 +316 1 2 1 1 315 316 +317 1 2 1 1 316 317 +318 1 2 1 1 317 318 +319 1 2 1 1 318 319 +320 1 2 1 1 319 320 +321 1 2 1 1 320 321 +322 1 2 1 1 321 322 +323 1 2 1 1 322 323 +324 1 2 1 1 323 324 +325 1 2 1 1 324 325 +326 1 2 1 1 325 326 +327 1 2 1 1 326 327 +328 1 2 1 1 327 328 +329 1 2 1 1 328 329 +330 1 2 1 1 329 330 +331 1 2 1 1 330 331 +332 1 2 1 1 331 332 +333 1 2 1 1 332 333 +334 1 2 1 1 333 334 +335 1 2 1 1 334 335 +336 1 2 1 1 335 336 +337 1 2 1 1 336 337 +338 1 2 1 1 337 338 +339 1 2 1 1 338 339 +340 1 2 1 1 339 340 +341 1 2 1 1 340 341 +342 1 2 1 1 341 342 +343 1 2 1 1 342 343 +344 1 2 1 1 343 344 +345 1 2 1 1 344 345 +346 1 2 1 1 345 346 +347 1 2 1 1 346 347 +348 1 2 1 1 347 348 +349 1 2 1 1 348 349 +350 1 2 1 1 349 350 +351 1 2 1 1 350 351 +352 1 2 1 1 351 352 +353 1 2 1 1 352 353 +354 1 2 1 1 353 354 +355 1 2 1 1 354 355 +356 1 2 1 1 355 356 +357 1 2 1 1 356 357 +358 1 2 1 1 357 358 +359 1 2 1 1 358 359 +360 1 2 1 1 359 360 +361 1 2 1 1 360 361 +362 1 2 1 1 361 362 +363 1 2 1 1 362 363 +364 1 2 1 1 363 364 +365 1 2 1 1 364 365 +366 1 2 1 1 365 366 +367 1 2 1 1 366 367 +368 1 2 1 1 367 368 +369 1 2 1 1 368 369 +370 1 2 1 1 369 370 +371 1 2 1 1 370 371 +372 1 2 1 1 371 372 +373 1 2 1 1 372 373 +374 1 2 1 1 373 374 +375 1 2 1 1 374 375 +376 1 2 1 1 375 376 +377 1 2 1 1 376 377 +378 1 2 1 1 377 378 +379 1 2 1 1 378 379 +380 1 2 1 1 379 380 +381 1 2 1 1 380 381 +382 1 2 1 1 381 382 +383 1 2 1 1 382 383 +384 1 2 1 1 383 384 +385 1 2 1 1 384 385 +386 1 2 1 1 385 386 +387 1 2 1 1 386 387 +388 1 2 1 1 387 388 +389 1 2 1 1 388 389 +390 1 2 1 1 389 390 +391 1 2 1 1 390 391 +392 1 2 1 1 391 392 +393 1 2 1 1 392 393 +394 1 2 1 1 393 394 +395 1 2 1 1 394 395 +396 1 2 1 1 395 396 +397 1 2 1 1 396 397 +398 1 2 1 1 397 398 +399 1 2 1 1 398 399 +400 1 2 1 1 399 400 +401 1 2 1 1 400 401 +402 1 2 1 1 401 402 +403 1 2 1 1 402 403 +404 1 2 1 1 403 404 +405 1 2 1 1 404 405 +406 1 2 1 1 405 406 +407 1 2 1 1 406 407 +408 1 2 1 1 407 408 +409 1 2 1 1 408 409 +410 1 2 1 1 409 410 +411 1 2 1 1 410 411 +412 1 2 1 1 411 412 +413 1 2 1 1 412 413 +414 1 2 1 1 413 414 +415 1 2 1 1 414 415 +416 1 2 1 1 415 416 +417 1 2 1 1 416 417 +418 1 2 1 1 417 418 +419 1 2 1 1 418 419 +420 1 2 1 1 419 420 +421 1 2 1 1 420 421 +422 1 2 1 1 421 422 +423 1 2 1 1 422 423 +424 1 2 1 1 423 424 +425 1 2 1 1 424 425 +426 1 2 1 1 425 426 +427 1 2 1 1 426 427 +428 1 2 1 1 427 428 +429 1 2 1 1 428 429 +430 1 2 1 1 429 430 +431 1 2 1 1 430 431 +432 1 2 1 1 431 432 +433 1 2 1 1 432 433 +434 1 2 1 1 433 434 +435 1 2 1 1 434 435 +436 1 2 1 1 435 436 +437 1 2 1 1 436 437 +438 1 2 1 1 437 438 +439 1 2 1 1 438 439 +440 1 2 1 1 439 440 +441 1 2 1 1 440 441 +442 1 2 1 1 441 442 +443 1 2 1 1 442 443 +444 1 2 1 1 443 444 +445 1 2 1 1 444 445 +446 1 2 1 1 445 446 +447 1 2 1 1 446 447 +448 1 2 1 1 447 448 +449 1 2 1 1 448 449 +450 1 2 1 1 449 450 +451 1 2 1 1 450 451 +452 1 2 1 1 451 452 +453 1 2 1 1 452 453 +454 1 2 1 1 453 454 +455 1 2 1 1 454 455 +456 1 2 1 1 455 456 +457 1 2 1 1 456 457 +458 1 2 1 1 457 458 +459 1 2 1 1 458 459 +460 1 2 1 1 459 460 +461 1 2 1 1 460 461 +462 1 2 1 1 461 462 +463 1 2 1 1 462 463 +464 1 2 1 1 463 464 +465 1 2 1 1 464 465 +466 1 2 1 1 465 466 +467 1 2 1 1 466 467 +468 1 2 1 1 467 468 +469 1 2 1 1 468 469 +470 1 2 1 1 469 470 +471 1 2 1 1 470 471 +472 1 2 1 1 471 472 +473 1 2 1 1 472 473 +474 1 2 1 1 473 474 +475 1 2 1 1 474 475 +476 1 2 1 1 475 476 +477 1 2 1 1 476 477 +478 1 2 1 1 477 478 +479 1 2 1 1 478 479 +480 1 2 1 1 479 480 +481 1 2 1 1 480 481 +482 1 2 1 1 481 482 +483 1 2 1 1 482 483 +484 1 2 1 1 483 484 +485 1 2 1 1 484 485 +486 1 2 1 1 485 486 +487 1 2 1 1 486 487 +488 1 2 1 1 487 488 +489 1 2 1 1 488 489 +490 1 2 1 1 489 490 +491 1 2 1 1 490 491 +492 1 2 1 1 491 492 +493 1 2 1 1 492 493 +494 1 2 1 1 493 494 +495 1 2 1 1 494 495 +496 1 2 1 1 495 496 +497 1 2 1 1 496 497 +498 1 2 1 1 497 498 +499 1 2 1 1 498 499 +500 1 2 1 1 499 500 +501 1 2 1 1 500 501 +502 1 2 1 1 501 502 +503 1 2 1 1 502 503 +504 1 2 1 1 503 504 +505 1 2 1 1 504 505 +506 1 2 1 1 505 506 +507 1 2 1 1 506 507 +508 1 2 1 1 507 508 +509 1 2 1 1 508 509 +510 1 2 1 1 509 510 +511 1 2 1 1 510 511 +512 1 2 1 1 511 512 +513 1 2 1 1 512 513 +514 1 2 1 1 513 514 +515 1 2 1 1 514 515 +516 1 2 1 1 515 516 +517 1 2 1 1 516 517 +518 1 2 1 1 517 518 +519 1 2 1 1 518 519 +520 1 2 1 1 519 520 +521 1 2 1 1 520 521 +522 1 2 1 1 521 522 +523 1 2 1 1 522 523 +524 1 2 1 1 523 524 +525 1 2 1 1 524 525 +526 1 2 1 1 525 526 +527 1 2 1 1 526 527 +528 1 2 1 1 527 528 +529 1 2 1 1 528 529 +530 1 2 1 1 529 530 +531 1 2 1 1 530 531 +532 1 2 1 1 531 532 +533 1 2 1 1 532 533 +534 1 2 1 1 533 534 +535 1 2 1 1 534 535 +536 1 2 1 1 535 536 +537 1 2 1 1 536 537 +538 1 2 1 1 537 538 +539 1 2 1 1 538 539 +540 1 2 1 1 539 540 +541 1 2 1 1 540 541 +542 1 2 1 1 541 542 +543 1 2 1 1 542 543 +544 1 2 1 1 543 544 +545 1 2 1 1 544 545 +546 1 2 1 1 545 546 +547 1 2 1 1 546 547 +548 1 2 1 1 547 548 +549 1 2 1 1 548 549 +550 1 2 1 1 549 550 +551 1 2 1 1 550 551 +552 1 2 1 1 551 552 +553 1 2 1 1 552 553 +554 1 2 1 1 553 554 +555 1 2 1 1 554 555 +556 1 2 1 1 555 556 +557 1 2 1 1 556 557 +558 1 2 1 1 557 558 +559 1 2 1 1 558 559 +560 1 2 1 1 559 560 +561 1 2 1 1 560 561 +562 1 2 1 1 561 562 +563 1 2 1 1 562 563 +564 1 2 1 1 563 564 +565 1 2 1 1 564 565 +566 1 2 1 1 565 566 +567 1 2 1 1 566 567 +568 1 2 1 1 567 568 +569 1 2 1 1 568 569 +570 1 2 1 1 569 570 +571 1 2 1 1 570 571 +572 1 2 1 1 571 572 +573 1 2 1 1 572 573 +574 1 2 1 1 573 574 +575 1 2 1 1 574 575 +576 1 2 1 1 575 576 +577 1 2 1 1 576 577 +578 1 2 1 1 577 578 +579 1 2 1 1 578 579 +580 1 2 1 1 579 580 +581 1 2 1 1 580 581 +582 1 2 1 1 581 582 +583 1 2 1 1 582 583 +584 1 2 1 1 583 584 +585 1 2 1 1 584 585 +586 1 2 1 1 585 586 +587 1 2 1 1 586 587 +588 1 2 1 1 587 588 +589 1 2 1 1 588 589 +590 1 2 1 1 589 590 +591 1 2 1 1 590 591 +592 1 2 1 1 591 592 +593 1 2 1 1 592 593 +594 1 2 1 1 593 594 +595 1 2 1 1 594 595 +596 1 2 1 1 595 596 +597 1 2 1 1 596 597 +598 1 2 1 1 597 598 +599 1 2 1 1 598 599 +600 1 2 1 1 599 600 +601 1 2 1 1 600 601 +602 1 2 1 1 601 602 +603 1 2 1 1 602 603 +604 1 2 1 1 603 604 +605 1 2 1 1 604 605 +606 1 2 1 1 605 606 +607 1 2 1 1 606 607 +608 1 2 1 1 607 608 +609 1 2 1 1 608 609 +610 1 2 1 1 609 610 +611 1 2 1 1 610 611 +612 1 2 1 1 611 612 +613 1 2 1 1 612 613 +614 1 2 1 1 613 614 +615 1 2 1 1 614 615 +616 1 2 1 1 615 616 +617 1 2 1 1 616 617 +618 1 2 1 1 617 618 +619 1 2 1 1 618 619 +620 1 2 1 1 619 620 +621 1 2 1 1 620 621 +622 1 2 1 1 621 622 +623 1 2 1 1 622 623 +624 1 2 1 1 623 624 +625 1 2 1 1 624 625 +626 1 2 1 1 625 626 +627 1 2 1 1 626 627 +628 1 2 1 1 627 628 +629 1 2 1 1 628 629 +630 1 2 1 1 629 630 +631 1 2 1 1 630 631 +632 1 2 1 1 631 632 +633 1 2 1 1 632 633 +634 1 2 1 1 633 634 +635 1 2 1 1 634 635 +636 1 2 1 1 635 636 +637 1 2 1 1 636 637 +638 1 2 1 1 637 638 +639 1 2 1 1 638 639 +640 1 2 1 1 639 640 +641 1 2 1 1 640 641 +642 1 2 1 1 641 642 +643 1 2 1 1 642 643 +644 1 2 1 1 643 644 +645 1 2 1 1 644 645 +646 1 2 1 1 645 646 +647 1 2 1 1 646 647 +648 1 2 1 1 647 648 +649 1 2 1 1 648 649 +650 1 2 1 1 649 650 +651 1 2 1 1 650 651 +652 1 2 1 1 651 652 +653 1 2 1 1 652 653 +654 1 2 1 1 653 654 +655 1 2 1 1 654 655 +656 1 2 1 1 655 656 +657 1 2 1 1 656 657 +658 1 2 1 1 657 658 +659 1 2 1 1 658 659 +660 1 2 1 1 659 660 +661 1 2 1 1 660 661 +662 1 2 1 1 661 662 +663 1 2 1 1 662 663 +664 1 2 1 1 663 664 +665 1 2 1 1 664 665 +666 1 2 1 1 665 666 +667 1 2 1 1 666 667 +668 1 2 1 1 667 668 +669 1 2 1 1 668 669 +670 1 2 1 1 669 670 +671 1 2 1 1 670 671 +672 1 2 1 1 671 672 +673 1 2 1 1 672 673 +674 1 2 1 1 673 674 +675 1 2 1 1 674 675 +676 1 2 1 1 675 676 +677 1 2 1 1 676 677 +678 1 2 1 1 677 678 +679 1 2 1 1 678 679 +680 1 2 1 1 679 680 +681 1 2 1 1 680 681 +682 1 2 1 1 681 682 +683 1 2 1 1 682 683 +684 1 2 1 1 683 684 +685 1 2 1 1 684 685 +686 1 2 1 1 685 686 +687 1 2 1 1 686 687 +688 1 2 1 1 687 688 +689 1 2 1 1 688 689 +690 1 2 1 1 689 690 +691 1 2 1 1 690 691 +692 1 2 1 1 691 692 +693 1 2 1 1 692 693 +694 1 2 1 1 693 694 +695 1 2 1 1 694 695 +696 1 2 1 1 695 696 +697 1 2 1 1 696 697 +698 1 2 1 1 697 698 +699 1 2 1 1 698 699 +700 1 2 1 1 699 700 +701 1 2 1 1 700 701 +702 1 2 1 1 701 702 +703 1 2 1 1 702 703 +704 1 2 1 1 703 704 +705 1 2 1 1 704 705 +706 1 2 1 1 705 706 +707 1 2 1 1 706 707 +708 1 2 1 1 707 708 +709 1 2 1 1 708 709 +710 1 2 1 1 709 710 +711 1 2 1 1 710 711 +712 1 2 1 1 711 712 +713 1 2 1 1 712 713 +714 1 2 1 1 713 714 +715 1 2 1 1 714 715 +716 1 2 1 1 715 716 +717 1 2 1 1 716 717 +718 1 2 1 1 717 718 +719 1 2 1 1 718 719 +720 1 2 1 1 719 720 +721 1 2 1 1 720 721 +722 1 2 1 1 721 722 +723 1 2 1 1 722 723 +724 1 2 1 1 723 724 +725 1 2 1 1 724 725 +726 1 2 1 1 725 726 +727 1 2 1 1 726 727 +728 1 2 1 1 727 728 +729 1 2 1 1 728 729 +730 1 2 1 1 729 730 +731 1 2 1 1 730 731 +732 1 2 1 1 731 732 +733 1 2 1 1 732 733 +734 1 2 1 1 733 734 +735 1 2 1 1 734 735 +736 1 2 1 1 735 736 +737 1 2 1 1 736 737 +738 1 2 1 1 737 738 +739 1 2 1 1 738 739 +740 1 2 1 1 739 740 +741 1 2 1 1 740 741 +742 1 2 1 1 741 742 +743 1 2 1 1 742 743 +744 1 2 1 1 743 744 +745 1 2 1 1 744 745 +746 1 2 1 1 745 746 +747 1 2 1 1 746 747 +748 1 2 1 1 747 748 +749 1 2 1 1 748 749 +750 1 2 1 1 749 750 +751 1 2 1 1 750 751 +752 1 2 1 1 751 752 +753 1 2 1 1 752 753 +754 1 2 1 1 753 754 +755 1 2 1 1 754 755 +756 1 2 1 1 755 756 +757 1 2 1 1 756 757 +758 1 2 1 1 757 758 +759 1 2 1 1 758 759 +760 1 2 1 1 759 760 +761 1 2 1 1 760 761 +762 1 2 1 1 761 762 +763 1 2 1 1 762 763 +764 1 2 1 1 763 764 +765 1 2 1 1 764 765 +766 1 2 1 1 765 766 +767 1 2 1 1 766 767 +768 1 2 1 1 767 768 +769 1 2 1 1 768 769 +770 1 2 1 1 769 770 +771 1 2 1 1 770 771 +772 1 2 1 1 771 772 +773 1 2 1 1 772 773 +774 1 2 1 1 773 774 +775 1 2 1 1 774 775 +776 1 2 1 1 775 776 +777 1 2 1 1 776 777 +778 1 2 1 1 777 778 +779 1 2 1 1 778 779 +780 1 2 1 1 779 780 +781 1 2 1 1 780 781 +782 1 2 1 1 781 782 +783 1 2 1 1 782 783 +784 1 2 1 1 783 784 +785 1 2 1 1 784 785 +786 1 2 1 1 785 786 +787 1 2 1 1 786 787 +788 1 2 1 1 787 788 +789 1 2 1 1 788 789 +790 1 2 1 1 789 790 +791 1 2 1 1 790 791 +792 1 2 1 1 791 792 +793 1 2 1 1 792 793 +794 1 2 1 1 793 794 +795 1 2 1 1 794 795 +796 1 2 1 1 795 796 +797 1 2 1 1 796 797 +798 1 2 1 1 797 798 +799 1 2 1 1 798 799 +800 1 2 1 1 799 800 +801 1 2 1 1 800 801 +802 1 2 1 1 801 802 +803 1 2 1 1 802 803 +804 1 2 1 1 803 804 +805 1 2 1 1 804 805 +806 1 2 1 1 805 806 +807 1 2 1 1 806 807 +808 1 2 1 1 807 808 +809 1 2 1 1 808 809 +810 1 2 1 1 809 810 +811 1 2 1 1 810 811 +812 1 2 1 1 811 812 +813 1 2 1 1 812 813 +814 1 2 1 1 813 814 +815 1 2 1 1 814 815 +816 1 2 1 1 815 816 +817 1 2 1 1 816 817 +818 1 2 1 1 817 818 +819 1 2 1 1 818 819 +820 1 2 1 1 819 820 +821 1 2 1 1 820 821 +822 1 2 1 1 821 822 +823 1 2 1 1 822 823 +824 1 2 1 1 823 824 +825 1 2 1 1 824 825 +826 1 2 1 1 825 826 +827 1 2 1 1 826 827 +828 1 2 1 1 827 828 +829 1 2 1 1 828 829 +830 1 2 1 1 829 830 +831 1 2 1 1 830 831 +832 1 2 1 1 831 832 +833 1 2 1 1 832 833 +834 1 2 1 1 833 834 +835 1 2 1 1 834 835 +836 1 2 1 1 835 836 +837 1 2 1 1 836 837 +838 1 2 1 1 837 838 +839 1 2 1 1 838 839 +840 1 2 1 1 839 840 +841 1 2 1 1 840 841 +842 1 2 1 1 841 842 +843 1 2 1 1 842 843 +844 1 2 1 1 843 844 +845 1 2 1 1 844 845 +846 1 2 1 1 845 846 +847 1 2 1 1 846 847 +848 1 2 1 1 847 848 +849 1 2 1 1 848 849 +850 1 2 1 1 849 850 +851 1 2 1 1 850 851 +852 1 2 1 1 851 852 +853 1 2 1 1 852 853 +854 1 2 1 1 853 854 +855 1 2 1 1 854 855 +856 1 2 1 1 855 856 +857 1 2 1 1 856 857 +858 1 2 1 1 857 858 +859 1 2 1 1 858 859 +860 1 2 1 1 859 860 +861 1 2 1 1 860 861 +862 1 2 1 1 861 862 +863 1 2 1 1 862 863 +864 1 2 1 1 863 864 +865 1 2 1 1 864 865 +866 1 2 1 1 865 866 +867 1 2 1 1 866 867 +868 1 2 1 1 867 868 +869 1 2 1 1 868 869 +870 1 2 1 1 869 870 +871 1 2 1 1 870 871 +872 1 2 1 1 871 872 +873 1 2 1 1 872 873 +874 1 2 1 1 873 874 +875 1 2 1 1 874 875 +876 1 2 1 1 875 876 +877 1 2 1 1 876 877 +878 1 2 1 1 877 878 +879 1 2 1 1 878 879 +880 1 2 1 1 879 880 +881 1 2 1 1 880 881 +882 1 2 1 1 881 882 +883 1 2 1 1 882 883 +884 1 2 1 1 883 884 +885 1 2 1 1 884 885 +886 1 2 1 1 885 886 +887 1 2 1 1 886 887 +888 1 2 1 1 887 888 +889 1 2 1 1 888 889 +890 1 2 1 1 889 890 +891 1 2 1 1 890 891 +892 1 2 1 1 891 892 +893 1 2 1 1 892 893 +894 1 2 1 1 893 894 +895 1 2 1 1 894 895 +896 1 2 1 1 895 896 +897 1 2 1 1 896 897 +898 1 2 1 1 897 898 +899 1 2 1 1 898 899 +900 1 2 1 1 899 900 +901 1 2 1 1 900 901 +902 1 2 1 1 901 902 +903 1 2 1 1 902 903 +904 1 2 1 1 903 904 +905 1 2 1 1 904 905 +906 1 2 1 1 905 906 +907 1 2 1 1 906 907 +908 1 2 1 1 907 908 +909 1 2 1 1 908 909 +910 1 2 1 1 909 910 +911 1 2 1 1 910 911 +912 1 2 1 1 911 912 +913 1 2 1 1 912 913 +914 1 2 1 1 913 914 +915 1 2 1 1 914 915 +916 1 2 1 1 915 916 +917 1 2 1 1 916 917 +918 1 2 1 1 917 918 +919 1 2 1 1 918 919 +920 1 2 1 1 919 920 +921 1 2 1 1 920 921 +922 1 2 1 1 921 922 +923 1 2 1 1 922 923 +924 1 2 1 1 923 924 +925 1 2 1 1 924 925 +926 1 2 1 1 925 926 +927 1 2 1 1 926 927 +928 1 2 1 1 927 928 +929 1 2 1 1 928 929 +930 1 2 1 1 929 930 +931 1 2 1 1 930 931 +932 1 2 1 1 931 932 +933 1 2 1 1 932 933 +934 1 2 1 1 933 934 +935 1 2 1 1 934 935 +936 1 2 1 1 935 936 +937 1 2 1 1 936 937 +938 1 2 1 1 937 938 +939 1 2 1 1 938 939 +940 1 2 1 1 939 940 +941 1 2 1 1 940 941 +942 1 2 1 1 941 942 +943 1 2 1 1 942 943 +944 1 2 1 1 943 944 +945 1 2 1 1 944 945 +946 1 2 1 1 945 946 +947 1 2 1 1 946 947 +948 1 2 1 1 947 948 +949 1 2 1 1 948 949 +950 1 2 1 1 949 950 +951 1 2 1 1 950 951 +952 1 2 1 1 951 952 +953 1 2 1 1 952 953 +954 1 2 1 1 953 954 +955 1 2 1 1 954 955 +956 1 2 1 1 955 956 +957 1 2 1 1 956 957 +958 1 2 1 1 957 958 +959 1 2 1 1 958 959 +960 1 2 1 1 959 960 +961 1 2 1 1 960 961 +962 1 2 1 1 961 962 +963 1 2 1 1 962 963 +964 1 2 1 1 963 964 +965 1 2 1 1 964 965 +966 1 2 1 1 965 966 +967 1 2 1 1 966 967 +968 1 2 1 1 967 968 +969 1 2 1 1 968 969 +970 1 2 1 1 969 970 +971 1 2 1 1 970 971 +972 1 2 1 1 971 972 +973 1 2 1 1 972 973 +974 1 2 1 1 973 974 +975 1 2 1 1 974 975 +976 1 2 1 1 975 976 +977 1 2 1 1 976 977 +978 1 2 1 1 977 978 +979 1 2 1 1 978 979 +980 1 2 1 1 979 980 +981 1 2 1 1 980 981 +982 1 2 1 1 981 982 +983 1 2 1 1 982 983 +984 1 2 1 1 983 984 +985 1 2 1 1 984 985 +986 1 2 1 1 985 986 +987 1 2 1 1 986 987 +988 1 2 1 1 987 988 +989 1 2 1 1 988 989 +990 1 2 1 1 989 990 +991 1 2 1 1 990 991 +992 1 2 1 1 991 992 +993 1 2 1 1 992 993 +994 1 2 1 1 993 994 +995 1 2 1 1 994 995 +996 1 2 1 1 995 996 +997 1 2 1 1 996 997 +998 1 2 1 1 997 998 +999 1 2 1 1 998 999 +1000 1 2 1 1 999 1000 +1001 1 2 1 1 1000 1001 +1002 1 2 1 1 1001 2 +$EndElements diff --git a/src/makefile b/src/makefile index f9b4928..6f00e3a 100644 --- a/src/makefile +++ b/src/makefile @@ -4,7 +4,8 @@ OBJECTS = $(OBJDIR)/moduleMesh.o $(OBJDIR)/moduleCompTime.o $(OBJDIR)/moduleSolv $(OBJDIR)/moduleMeshCyl.o $(OBJDIR)/moduleMeshCylRead.o $(OBJDIR)/moduleMeshCylBoundary.o \ $(OBJDIR)/moduleBoundary.o $(OBJDIR)/moduleCaseParam.o $(OBJDIR)/moduleRefParam.o \ $(OBJDIR)/moduleCollisions.o $(OBJDIR)/moduleTable.o $(OBJDIR)/moduleParallel.o \ - $(OBJDIR)/moduleEM.o + $(OBJDIR)/moduleEM.o $(OBJDIR)/moduleMesh1D.o $(OBJDIR)/moduleMesh1DRead.o \ + $(OBJDIR)/moduleMesh1DBoundary.o all: $(OUTPUT) diff --git a/src/modules/makefile b/src/modules/makefile index b035f30..4249278 100644 --- a/src/modules/makefile +++ b/src/modules/makefile @@ -3,14 +3,15 @@ OBJS = moduleCaseParam.o moduleCompTime.o moduleList.o\ moduleMesh.o moduleMeshCyl.o moduleMeshCylBoundary.o\ moduleMeshCylRead.o moduleOutput.o moduleInput.o \ moduleSolver.o moduleCollisions.o moduleTable.o \ - moduleParallel.o moduleEM.o + moduleParallel.o moduleEM.o moduleMesh1D.o \ + moduleMesh1DBoundary.o moduleMesh1DRead.o all: $(OBJS) moduleCollisions.o: moduleTable.o moduleSpecies.o moduleRefParam.o moduleConstParam.o moduleMeshCyl.f95 $(FC) $(FCFLAGS) -c $(subst .o,.f95,$@) -o $(OBJDIR)/$@ -moduleInput.o: moduleParallel.o moduleRefParam.o moduleCaseParam.o moduleSolver.o moduleInject.o moduleBoundary.o moduleMesh.o moduleMeshCylRead.o moduleErrors.o moduleSpecies.o moduleInput.f95 +moduleInput.o: moduleParallel.o moduleRefParam.o moduleCaseParam.o moduleSolver.o moduleInject.o moduleBoundary.o moduleMesh.o moduleMeshCylRead.o moduleMesh1DRead.o moduleErrors.o moduleSpecies.o moduleInput.f95 $(FC) $(FCFLAGS) -c $(subst .o,.f95,$@) -o $(OBJDIR)/$@ moduleInject.o: moduleSpecies.o moduleSolver.o moduleMesh.o moduleMeshCyl.o moduleInject.f95 @@ -19,7 +20,7 @@ moduleInject.o: moduleSpecies.o moduleSolver.o moduleMesh.o moduleMeshCyl.o modu moduleList.o: moduleSpecies.o moduleErrors.o moduleList.f95 $(FC) $(FCFLAGS) -c $(subst .o,.f95,$@) -o $(OBJDIR)/$@ -moduleMesh.o: moduleOutput.o moduleList.o moduleSpecies.o moduleMesh.f95 +moduleMesh.o: moduleCollisions.o moduleOutput.o moduleList.o moduleSpecies.o moduleMesh.f95 $(FC) $(FCFLAGS) -c $(subst .o,.f95,$@) -o $(OBJDIR)/$@ moduleMeshCyl.o: moduleRefParam.o moduleCollisions.o moduleOutput.o moduleMesh.o moduleMeshCyl.f95 @@ -31,6 +32,15 @@ moduleMeshCylBoundary.o: moduleMeshCyl.o moduleMeshCylBoundary.f95 moduleMeshCylRead.o: moduleBoundary.o moduleMeshCyl.o moduleMeshCylBoundary.o moduleMeshCylRead.f95 $(FC) $(FCFLAGS) -c $(subst .o,.f95,$@) -o $(OBJDIR)/$@ +moduleMesh1D.o: moduleRefParam.o moduleCollisions.o moduleOutput.o moduleMesh.o moduleMesh1D.f95 + $(FC) $(FCFLAGS) -c $(subst .o,.f95,$@) -o $(OBJDIR)/$@ + +moduleMesh1DBoundary.o: moduleMesh1D.o moduleMesh1DBoundary.f95 + $(FC) $(FCFLAGS) -c $(subst .o,.f95,$@) -o $(OBJDIR)/$@ + +moduleMesh1DRead.o: moduleBoundary.o moduleMesh1D.o moduleMesh1DBoundary.o moduleMesh1DRead.f95 + $(FC) $(FCFLAGS) -c $(subst .o,.f95,$@) -o $(OBJDIR)/$@ + moduleOutput.o: moduleSpecies.o moduleRefParam.o moduleOutput.f95 $(FC) $(FCFLAGS) -c $(subst .o,.f95,$@) -o $(OBJDIR)/$@ diff --git a/src/modules/moduleEM.f95 b/src/modules/moduleEM.f95 index d013064..876093e 100644 --- a/src/modules/moduleEM.f95 +++ b/src/modules/moduleEM.f95 @@ -93,22 +93,17 @@ MODULE moduleEM END DO - !If there is charge in the nodes, compute the local F vector - IF (ANY(rho > 0.D0)) THEN - !Calculates local F vector - localF = mesh%vols(e)%obj%elemF(rho) + !Calculates local F vector + localF = mesh%vols(e)%obj%elemF(rho) - !Assign local F to global F - DO i = 1, nNodes - ni = nodes(i) - vectorF(ni) = vectorF(ni) + localF(i) + !Assign local F to global F + DO i = 1, nNodes + ni = nodes(i) + vectorF(ni) = vectorF(ni) + localF(i) - END DO - - DEALLOCATE(localF) - - END IF + END DO + DEALLOCATE(localF) DEALLOCATE(nodes, rho) END DO diff --git a/src/modules/moduleInject.f95 b/src/modules/moduleInject.f95 index f004b32..c524257 100644 --- a/src/modules/moduleInject.f95 +++ b/src/modules/moduleInject.f95 @@ -28,7 +28,6 @@ MODULE moduleInject !Initialize an injection of particles SUBROUTINE initInject(self, i, v, n, T, flow, units, sp, physicalSurface) USE moduleMesh - USE moduleMeshCyl USE moduleRefParam USE moduleConstParam USE moduleSpecies @@ -67,7 +66,7 @@ MODULE moduleInject self%nParticles = self%nParticles * solver%pusher(sp)%every self%sp = sp - self%v = self%v * self%n + self%v = self%vMod * self%n self%vTh = DSQRT(self%T/species(self%sp)%obj%m) !Gets the edge elements from which particles are injected @@ -85,11 +84,6 @@ MODULE moduleInject IF (mesh%edges(e)%obj%physicalSurface == physicalSurface) THEN et = et + 1 self%edges(et) = mesh%edges(e)%obj%n - ! SELECT TYPE(edge => mesh%edges(e)%obj) - ! CLASS IS (meshEdgeCyl) - ! self%weight(et) = (edge%r(1)+edge%r(2))/2.D0 - ! - ! END SELECT END IF @@ -143,7 +137,6 @@ MODULE moduleInject USE moduleSpecies USE moduleSolver USE moduleMesh - USE moduleMeshCyl IMPLICIT NONE CLASS(injectGeneric), INTENT(in):: self @@ -178,13 +171,6 @@ MODULE moduleInject !$OMP DO DO n = nMin, nMax - !Select edge randomly from which inject particle - ! randomX = RAND()*self%sumWeight - ! DO j = 1, self%nEdges - ! IF (randomX < self%weight(j)) EXIT - ! randomX = randomX - self%weight(j) - ! - ! END DO randomX = INT(DBLE(self%nEdges-1)*RAND()) + 1 randomEdge => mesh%edges(self%edges(randomX))%obj @@ -203,11 +189,8 @@ MODULE moduleInject vBC(self%v(2), self%vTh(2)), & vBC(self%v(3), self%vTh(3)) /) - IF (solver%pusher(self%sp)%pushSpecies) THEN - !Push new particle - CALL solver%pusher(self%sp)%pushParticle(partInj(n)) - - END IF + !Push new particle + CALL solver%pusher(self%sp)%pushParticle(partInj(n)) !Assign cell to new particle CALL solver%updateParticleCell(partInj(n)) diff --git a/src/modules/moduleInput.f95 b/src/modules/moduleInput.f95 index 21da1c0..5618df4 100644 --- a/src/modules/moduleInput.f95 +++ b/src/modules/moduleInput.f95 @@ -45,9 +45,6 @@ MODULE moduleInput CALL verboseError('Reading Case Parameters...') CALL readCase(config) - !Read boundary for EM field - CALL readEMBoundary(config) - !Read injection of particles CALL verboseError('Reading Interactions between species...') CALL readInject(config) @@ -164,6 +161,11 @@ MODULE moduleInput !Gets the solver for the electromagnetic field CALL config%get(object // '.EMSolver', EMType, found) CALL solver%initEM(EMType) + SELECT CASE(EMType) + CASE("Electrostatic") + CALL readEMBoundary(config) + + END SELECT !Gest the non-analogue scheme CALL config%get(object // '.NAScheme', NAType, found) @@ -351,7 +353,8 @@ MODULE moduleInput !Read the geometry (mesh) for the case SUBROUTINE readGeometry(config) USE moduleMesh - USE moduleMeshCylRead + USE moduleMeshCylRead, ONLY: meshCylGeneric + USE moduleMesh1DRead, ONLY: mesh1DGeneric USE moduleErrors USE moduleOutput USE json_module @@ -369,26 +372,31 @@ MODULE moduleInput !Creates a 2D cylindrical mesh ALLOCATE(meshCylGeneric:: mesh) - !Gets the type of mesh - CALL config%get('geometry.meshType', meshType, found) - SELECT CASE(meshType) - CASE ("gmsh") - !Gets the gmsh file - CALL config%get('geometry.meshFile', meshFile, found) - - CASE DEFAULT - CALL criticalError("Mesh type " // meshType // " not supported.", "readGeometry") - - END SELECT - !Reads the mesh - fullpath = path // meshFile - CALL mesh%readMesh(fullPath) + CASE ("1DCart") + !Creates a 1D cartesian mesh + ALLOCATE(mesh1DGeneric:: mesh) CASE DEFAULT CALL criticalError("Geometry type " // geometryType // " not supported.", "readGeometry") END SELECT + !Gets the type of mesh + CALL config%get('geometry.meshType', meshType, found) + SELECT CASE(meshType) + CASE ("gmsh") + !Gets the gmsh file + CALL config%get('geometry.meshFile', meshFile, found) + + CASE DEFAULT + CALL criticalError("Mesh type " // meshType // " not supported.", "readGeometry") + + END SELECT + + !Reads the mesh + fullpath = path // meshFile + CALL mesh%readMesh(fullPath) + END SUBROUTINE readGeometry SUBROUTINE readEMBoundary(config) diff --git a/src/modules/moduleMesh.f95 b/src/modules/moduleMesh.f95 index 65389a7..319210b 100644 --- a/src/modules/moduleMesh.f95 +++ b/src/modules/moduleMesh.f95 @@ -130,11 +130,11 @@ MODULE moduleMesh PROCEDURE(gatherEF_interface), DEFERRED, PASS:: gatherEF PROCEDURE(getNodesVol_interface), DEFERRED, PASS:: getNodes PROCEDURE(elemF_interface), DEFERRED, PASS:: elemF - PROCEDURE(findCell_interface), DEFERRED, PASS:: findCell + PROCEDURE, PASS:: findCell PROCEDURE(phy2log_interface), DEFERRED, PASS:: phy2log PROCEDURE(inside_interface), DEFERRED, NOPASS:: inside PROCEDURE(nextElement_interface), DEFERRED, PASS:: nextElement - PROCEDURE(collision_interface), DEFERRED, PASS:: collision + PROCEDURE, PASS:: collision PROCEDURE(resetOutput_interface), DEFERRED, PASS:: resetOutput END TYPE meshVol @@ -189,16 +189,6 @@ MODULE moduleMesh END SUBROUTINE nextElement_interface - SUBROUTINE findCell_interface(self, part, oldCell) - USE moduleSpecies - - IMPORT:: meshVol - CLASS(meshVol), INTENT(inout):: self - CLASS(meshVol), OPTIONAL, INTENT(in):: oldCell - CLASS(particle), INTENT(inout), TARGET:: part - - END SUBROUTINE findCell_interface - PURE FUNCTION phy2log_interface(self,r) RESULT(xN) IMPORT:: meshVol CLASS(meshVol), INTENT(in):: self @@ -249,10 +239,10 @@ MODULE moduleMesh INTEGER, ALLOCATABLE, DIMENSION(:,:):: IPIV CONTAINS - PROCEDURE(readMesh_interface), PASS, DEFERRED:: readMesh - PROCEDURE(printOutput_interface), PASS, DEFERRED:: printOutput - PROCEDURE(printColl_interface), PASS, DEFERRED:: printColl - PROCEDURE(printEM_interface), PASS, DEFERRED:: printEM + PROCEDURE(readMesh_interface), DEFERRED, PASS:: readMesh + PROCEDURE, PASS:: printOutput + PROCEDURE, PASS:: printColl + PROCEDURE, PASS:: printEM END TYPE meshGeneric @@ -266,15 +256,6 @@ MODULE moduleMesh END SUBROUTINE readMesh_interface - !Prints output variables - SUBROUTINE printOutput_interface(self, t) - IMPORT meshGeneric - - CLASS(meshGeneric), INTENT(in):: self - INTEGER, INTENT(in):: t - - END SUBROUTINE printOutput_interface - !Prints number of collisions SUBROUTINE printColl_interface(self, t) IMPORT meshGeneric @@ -297,4 +278,309 @@ MODULE moduleMesh !Generic mesh CLASS(meshGeneric), ALLOCATABLE, TARGET:: mesh + CONTAINS + !Find next cell for particle + RECURSIVE SUBROUTINE findCell(self, part, oldCell) + USE moduleSpecies + USE OMP_LIB + IMPLICIT NONE + + CLASS(meshVol), INTENT(inout):: self + CLASS(meshVol), OPTIONAL, INTENT(in):: oldCell + CLASS(particle), INTENT(inout), TARGET:: part + REAL(8):: xi(1:3) + CLASS(*), POINTER:: nextElement + + xi = self%phy2log(part%r) + !Checks if particle is inside 'self' cell + IF (self%inside(xi)) THEN + part%vol = self%n + part%xi = xi + part%n_in = .TRUE. + !Assign particle to listPart_in + CALL OMP_SET_LOCK(self%lock) + CALL self%listPart_in%add(part) + self%totalWeight = self%totalWeight + part%weight + CALL OMP_UNSET_LOCK(self%lock) + + ELSE + !If not, searches for a neighbour and repeats the process. + CALL self%nextElement(xi, nextElement) + !Defines the next step + SELECT TYPE(nextElement) + CLASS IS(meshVol) + !Particle moved to new cell, repeat find procedure + CALL nextElement%findCell(part, self) + + CLASS IS (meshEdge) + !Particle encountered an edge, execute boundary + CALL nextElement%fBoundary(part) + !If particle is still inside the domain, call findCell + IF (part%n_in) THEN + IF(PRESENT(oldCell)) THEN + CALL self%findCell(part, oldCell) + + ELSE + CALL self%findCell(part) + + END IF + END IF + + CLASS DEFAULT + WRITE(*,*) "ERROR, CHECK findCell" + + END SELECT + END IF + + END SUBROUTINE findCell + + !Computes collisions in element + SUBROUTINE collision(self) + USE moduleCollisions + USE moduleSpecies + USE moduleList + use moduleRefParam + IMPLICIT NONE + + CLASS(meshVol), INTENT(inout):: self + INTEGER:: nPart !Number of particles inside the cell + REAL(8):: pMax !Maximum probability of collision + INTEGER:: rnd !random index + TYPE(particle), POINTER:: part_i, part_j + INTEGER:: n !collision + INTEGER:: ij, k + REAL(8):: sigmaVrelMaxNew + TYPE(pointerArray), ALLOCATABLE:: partTemp(:) + + self%nColl = 0 + nPart = self%listPart_in%amount + IF (nPart > 1) THEN + pMax = self%totalWeight*self%sigmaVrelMax*tauMin/self%volume + self%nColl = INT(REAL(nPart)*pMax*0.5D0) + + !Converts the list of particles to an array for easy access + IF (self%nColl > 0) THEN + partTemp = self%listPart_in%convert2Array() + + END IF + + DO n = 1, self%nColl + !Select random numbers + rnd = 1 + FLOOR(nPart*RAND()) + part_i => partTemp(rnd)%part + rnd = 1 + FLOOR(nPart*RAND()) + part_j => partTemp(rnd)%part + ij = interactionIndex(part_i%sp, part_j%sp) + sigmaVrelMaxNew = 0.D0 + DO k = 1, interactionMatrix(ij)%amount + CALL interactionMatrix(ij)%collisions(k)%obj%collide(self%sigmaVrelMax, sigmaVrelMaxNew, part_i, part_j) + + END DO + + !Update maximum cross section*v_rel per each collision + IF (sigmaVrelMaxNew > self%sigmaVrelMax) THEN + self%sigmaVrelMax = sigmaVrelMaxNew + + END IF + + END DO + + END IF + + self%totalWeight = 0.D0 + + !Reset output in nodes + CALL self%resetOutput() + + !Erase the list of particles inside the cell + CALL self%listPart_in%erase() + + END SUBROUTINE collision + + SUBROUTINE printOutput(self, t) + USE moduleRefParam + USE moduleSpecies + USE moduleOutput + IMPLICIT NONE + + CLASS(meshGeneric), INTENT(in):: self + INTEGER, INTENT(in):: t + INTEGER:: n, i + TYPE(outputFormat):: output(1:self%numNodes) + REAL(8):: time + CHARACTER(:), ALLOCATABLE:: fileName + CHARACTER (LEN=6):: tstring !TODO: Review to allow any number of iterations + + time = DBLE(t)*tauMin*ti_ref + + DO i = 1, nSpecies + WRITE(tstring, '(I6.6)') t + fileName='OUTPUT_' // tstring// '_' // species(i)%obj%name // '.msh' + WRITE(*, "(6X,A15,A)") "Creating file: ", fileName + OPEN (60, file = path // folder // '/' // fileName) + WRITE(60, "(A)") '$MeshFormat' + WRITE(60, "(A)") '2.2 0 8' + WRITE(60, "(A)") '$EndMeshFormat' + WRITE(60, "(A)") '$NodeData' + WRITE(60, "(A)") '1' + WRITE(60, "(A)") '"Density (m^-3)"' + WRITE(60, *) 1 + WRITE(60, *) time + WRITE(60, *) 3 + WRITE(60, *) t + WRITE(60, *) 1 + WRITE(60, *) self%numNodes + DO n=1, self%numNodes + CALL calculateOutput(self%nodes(n)%obj%output(i), output(n), self%nodes(n)%obj%v, species(i)%obj) + WRITE(60, "(I6,ES20.6E3)") n, output(n)%density + END DO + WRITE(60, "(A)") '$EndNodeData' + WRITE(60, "(A)") '$NodeData' + WRITE(60, "(A)") '1' + WRITE(60, "(A)") '"Velocity (m/s)"' + WRITE(60, *) 1 + WRITE(60, *) time + WRITE(60, *) 3 + WRITE(60, *) t + WRITE(60, *) 3 + WRITE(60, *) self%numNodes + DO n=1, self%numNodes + WRITE(60, "(I6,3(ES20.6E3))") n, output(n)%velocity + END DO + WRITE(60, "(A)") '$EndNodeData' + WRITE(60, "(A)") '$NodeData' + WRITE(60, "(A)") '1' + WRITE(60, "(A)") '"Pressure (Pa)"' + WRITE(60, *) 1 + WRITE(60, *) time + WRITE(60, *) 3 + WRITE(60, *) t + WRITE(60, *) 1 + WRITE(60, *) self%numNodes + DO n=1, self%numNodes + WRITE(60, "(I6,3(ES20.6E3))") n, output(n)%pressure + END DO + WRITE(60, "(A)") '$EndNodeData' + WRITE(60, "(A)") '$NodeData' + WRITE(60, "(A)") '1' + WRITE(60, "(A)") '"Temperature (K)"' + WRITE(60, *) 1 + WRITE(60, *) time + WRITE(60, *) 3 + WRITE(60, *) t + WRITE(60, *) 1 + WRITE(60, *) self%numNodes + DO n=1, self%numNodes + WRITE(60, "(I6,3(ES20.6E3))") n, output(n)%temperature + END DO + WRITE(60, "(A)") '$EndNodeData' + CLOSE (60) + + END DO + + END SUBROUTINE printOutput + + SUBROUTINE printColl(self, t) + USE moduleRefParam + USE moduleCaseParam + USE moduleOutput + IMPLICIT NONE + + CLASS(meshGeneric), INTENT(in):: self + INTEGER, INTENT(in):: t + INTEGER:: n + REAL(8):: time + CHARACTER(:), ALLOCATABLE:: fileName + CHARACTER (LEN=6):: tstring !TODO: Review to allow any number of iterations + + + IF (collOutput) THEN + time = DBLE(t)*tauMin*ti_ref + WRITE(tstring, '(I6.6)') t + + fileName='OUTPUT_' // tstring// '_Collisions.msh' + WRITE(*, "(6X,A15,A)") "Creating file: ", fileName + OPEN (60, file = path // folder // '/' // fileName) + WRITE(60, "(A)") '$MeshFormat' + WRITE(60, "(A)") '2.2 0 8' + WRITE(60, "(A)") '$EndMeshFormat' + WRITE(60, "(A)") '$ElementData' + WRITE(60, "(A)") '1' + WRITE(60, "(A)") '"Collisions"' + WRITE(60, *) 1 + WRITE(60, *) time + WRITE(60, *) 3 + WRITE(60, *) t + WRITE(60, *) 1 + WRITE(60, *) self%numVols + DO n=1, self%numVols + WRITE(60, "(I6,I10)") n + self%numEdges, self%vols(n)%obj%nColl + END DO + WRITE(60, "(A)") '$EndElementData' + + CLOSE(60) + + END IF + + END SUBROUTINE printColl + + SUBROUTINE printEM(self, t) + USE moduleRefParam + USE moduleCaseParam + USE moduleOutput + IMPLICIT NONE + + CLASS(meshGeneric), INTENT(in):: self + INTEGER, INTENT(in):: t + INTEGER:: n, e + REAL(8):: time + CHARACTER(:), ALLOCATABLE:: fileName + CHARACTER (LEN=6):: tstring !TODO: Review to allow any number of iterations + REAL(8):: xi(1:3) + + xi = (/ 0.D0, 0.D0, 0.D0 /) + + IF (emOutput) THEN + time = DBLE(t)*tauMin*ti_ref + WRITE(tstring, '(I6.6)') t + + fileName='OUTPUT_' // tstring// '_EMField.msh' + WRITE(*, "(6X,A15,A)") "Creating file: ", fileName + OPEN (20, file = path // folder // '/' // fileName) + WRITE(20, "(A)") '$MeshFormat' + WRITE(20, "(A)") '2.2 0 8' + WRITE(20, "(A)") '$EndMeshFormat' + WRITE(20, "(A)") '$NodeData' + WRITE(20, "(A)") '1' + WRITE(20, "(A)") '"Potential (V)"' + WRITE(20, *) 1 + WRITE(20, *) time + WRITE(20, *) 3 + WRITE(20, *) t + WRITE(20, *) 1 + WRITE(20, *) self%numNodes + DO n=1, self%numNodes + WRITE(20, *) n, self%nodes(n)%obj%emData%phi*Volt_ref + END DO + WRITE(20, "(A)") '$EndNodeData' + + WRITE(20, "(A)") '$ElementData' + WRITE(20, "(A)") '1' + WRITE(20, "(A)") '"Electric Field (V/m)"' + WRITE(20, *) 1 + WRITE(20, *) time + WRITE(20, *) 3 + WRITE(20, *) t + WRITE(20, *) 3 + WRITE(20, *) self%numVols + DO e=1, self%numVols + WRITE(20, *) e+self%numEdges, self%vols(e)%obj%gatherEF(xi)*EF_ref + END DO + WRITE(20, "(A)") '$EndElementData' + CLOSE(20) + + END IF + + END SUBROUTINE printEM + END MODULE moduleMesh diff --git a/src/modules/moduleMesh1D.f95 b/src/modules/moduleMesh1D.f95 new file mode 100644 index 0000000..e151e98 --- /dev/null +++ b/src/modules/moduleMesh1D.f95 @@ -0,0 +1,489 @@ +!moduleMesh1D: 1D cartesian module +! x == x +! y == unused +! z == unused +MODULE moduleMesh1D + USE moduleMesh + IMPLICIT NONE + + TYPE, PUBLIC, EXTENDS(meshNode):: meshNode1D + !Element coordinates + REAL(8):: x = 0.D0 + CONTAINS + PROCEDURE, PASS:: init => initNode1D + PROCEDURE, PASS:: getCoordinates => getCoord1D + + END TYPE meshNode1D + + TYPE, PUBLIC, ABSTRACT, EXTENDS(meshEdge):: meshEdge1D + !Element coordinates + REAL(8):: x = 0.D0 + !Connectivity to nodes + CLASS(meshNode), POINTER:: n1 => NULL() + CONTAINS + PROCEDURE, PASS:: init => initEdge1D + PROCEDURE, PASS:: getNodes => getNodes1D + PROCEDURE, PASS:: randPos => randPos1D + + END TYPE meshEdge1D + + TYPE, PUBLIC, ABSTRACT, EXTENDS(meshVol):: meshVol1D + CONTAINS + PROCEDURE, PASS:: detJac => detJ1D + PROCEDURE, PASS:: invJac => invJ1D + PROCEDURE(fPsi_interface), DEFERRED, NOPASS:: fPsi + PROCEDURE(dPsi_interface), DEFERRED, NOPASS:: dPsi + PROCEDURE(partialDer_interface), DEFERRED, PASS:: partialDer + + END TYPE meshVol1D + + ABSTRACT INTERFACE + PURE FUNCTION fPsi_interface(xi) RESULT(fPsi) + REAL(8), INTENT(in):: xi(1:3) + REAL(8), ALLOCATABLE:: fPsi(:) + + END FUNCTION fPsi_interface + + PURE FUNCTION dPsi_interface(xi) RESULT(dPsi) + REAL(8), INTENT(in):: xi(1:3) + REAL(8), ALLOCATABLE:: dPsi(:,:) + + END FUNCTION dPsi_interface + + PURE SUBROUTINE partialDer_interface(self, dPsi, dx) + IMPORT meshVol1D + CLASS(meshVol1D), INTENT(in):: self + REAL(8), INTENT(in):: dPsi(1:,1:) + REAL(8), INTENT(out), DIMENSION(1):: dx + + END SUBROUTINE partialDer_interface + + END INTERFACE + + TYPE, PUBLIC, EXTENDS(meshVol1D):: meshVol1DSegm + !Element coordinates + REAL(8):: x(1:2) + !Connectivity to nodes + CLASS(meshNode), POINTER:: n1 => NULL(), n2 => NULL() + !Connectivity to adjacent elements + CLASS(*), POINTER:: e1 => NULL(), e2 => NULL() + REAL(8):: arNodes(1:2) + CONTAINS + PROCEDURE, PASS:: init => initVol1DSegm + PROCEDURE, PASS:: area => areaSegm + PROCEDURE, NOPASS:: fPsi => fPsiSegm + PROCEDURE, NOPASS:: dPsi => dPsiSegm + PROCEDURE, PASS:: partialDer => partialDerSegm + PROCEDURE, PASS:: elemK => elemKSegm + PROCEDURE, PASS:: elemF => elemFSegm + PROCEDURE, NOPASS:: weight => weightSegm + PROCEDURE, NOPASS:: inside => insideSegm + PROCEDURE, PASS:: scatter => scatterSegm + PROCEDURE, PASS:: gatherEF => gatherEFSegm + PROCEDURE, PASS:: getNodes => getNodesSegm + PROCEDURE, PASS:: phy2log => phy2logSegm + PROCEDURE, PASS:: nextElement => nextElementSegm + PROCEDURE, PASS:: resetOutput => resetOutputSegm + + END TYPE meshVol1DSegm + + CONTAINS + !NODE FUNCTIONS + !Init node element + SUBROUTINE initNode1D(self, n, r) + USE moduleSpecies + USE moduleRefParam + IMPLICIT NONE + + CLASS(meshNode1D), INTENT(out):: self + INTEGER, INTENT(in):: n + REAL(8), INTENT(in):: r(1:3) + + self%n = n + self%x = r(1)/L_ref + !Node volume, to be determined in mesh + self%v = 0.D0 + + !Allocates output + ALLOCATE(self%output(1:nSpecies)) + + END SUBROUTINE initNode1D + + FUNCTION getCoord1D(self) RESULT(r) + IMPLICIT NONE + + CLASS(meshNode1D):: self + REAL(8):: r(1:3) + + r = (/ self%x, 0.D0, 0.D0 /) + + END FUNCTION getCoord1D + + !EDGE FUNCTIONS + !Inits edge element + SUBROUTINE initEdge1D(self, n, p, bt, physicalSurface) + IMPLICIT NONE + + CLASS(meshEdge1D), INTENT(out):: self + INTEGER, INTENT(in):: n + INTEGER, INTENT(in):: p(:) + INTEGER, INTENT(in):: bt + INTEGER, INTENT(in):: physicalSurface + REAL(8), DIMENSION(1:3):: r1 + + self%n = n + self%n1 => mesh%nodes(p(1))%obj + !Get element coordinates + r1 = self%n1%getCoordinates() + + self%x = r1(1) + + self%normal = (/ 1.D0, 0.D0, 0.D0 /) + + !Boundary index + self%bt = bt + !Physical Surface + self%physicalSurface = physicalSurface + + END SUBROUTINE initEdge1D + + !Get nodes from edge + PURE FUNCTION getNodes1D(self) RESULT(n) + IMPLICIT NONE + + CLASS(meshEdge1D), INTENT(in):: self + INTEGER, ALLOCATABLE:: n(:) + + ALLOCATE(n(1)) + n = (/ self%n1%n /) + + END FUNCTION getNodes1D + + !Calculates a 'random' position in edge + FUNCTION randPos1D(self) RESULT(r) + CLASS(meshEdge1D), INTENT(in):: self + REAL(8):: r(1:3) + + r = (/ self%x, 0.D0, 0.D0 /) + + END FUNCTION randPos1D + + !VOLUME FUNCTIONS + !SEGMENT FUNCTIONS + !Init segment element + SUBROUTINE initVol1DSegm(self, n, p) + USE moduleRefParam + IMPLICIT NONE + + CLASS(meshVol1DSegm), INTENT(out):: self + INTEGER, INTENT(in):: n + INTEGER, INTENT(in):: p(:) + REAL(8), DIMENSION(1:3):: r1, r2 + + self%n = n + self%n1 => mesh%nodes(p(1))%obj + self%n2 => mesh%nodes(p(2))%obj + !Get element coordinates + r1 = self%n1%getCoordinates() + r2 = self%n2%getCoordinates() + self%x = (/ r1(1), r2(1) /) + + !Assign node volume + CALL self%area() + self%n1%v = self%n1%v + self%arNodes(1) + self%n2%v = self%n2%v + self%arNodes(2) + + self%sigmaVrelMax = sigma_ref/L_ref**2 + + CALL OMP_INIT_LOCK(self%lock) + + END SUBROUTINE initVol1DSegm + + !Computes element area + PURE SUBROUTINE areaSegm(self) + IMPLICIT NONE + + CLASS(meshVol1DSegm), INTENT(inout):: self + REAL(8):: l !element length + REAL(8):: fPsi(1:2) + REAL(8):: detJ + REAL(8):: Xii(1:3) + + self%volume = 0.D0 + self%arNodes = 0.D0 + !1 point Gauss integral + Xii = 0.D0 + fPsi = self%fPsi(Xii) + detJ = self%detJac(Xii) + l = 2.D0*detJ + self%volume = l + self%arNodes = fPsi*l + + END SUBROUTINE areaSegm + + !Computes element functions at point xii + PURE FUNCTION fPsiSegm(xi) RESULT(fPsi) + IMPLICIT NONE + + REAL(8), INTENT(in):: xi(1:3) + REAL(8), ALLOCATABLE:: fPsi(:) + + ALLOCATE(fPsi(1:2)) + + fPsi(1) = 1.D0 - xi(1) + fPsi(2) = 1.D0 + xi(1) + fPsi = fPsi * 5.D-1 + + END FUNCTION fPsiSegm + + !Computes element derivative shape function at Xii + PURE FUNCTION dPsiSegm(xi) RESULT(dPsi) + IMPLICIT NONE + + REAL(8), INTENT(in):: xi(1:3) + REAL(8), ALLOCATABLE:: dPsi(:,:) + + ALLOCATE(dPsi(1:1, 1:2)) + + dPsi(1, 1) = -5.D-1 + dPsi(1, 2) = 5.D-1 + + END FUNCTION dPsiSegm + + !Computes partial derivatives of coordinates + PURE SUBROUTINE partialDerSegm(self, dPsi, dx) + IMPLICIT NONE + + CLASS(meshVol1DSegm), INTENT(in):: self + REAL(8), INTENT(in):: dPsi(1:,1:) + REAL(8), INTENT(out), DIMENSION(1):: dx + + dx(1) = DOT_PRODUCT(dPsi(1,:), self%x) + + END SUBROUTINE partialDerSegm + + !Computes local stiffness matrix + PURE FUNCTION elemKSegm(self) RESULT(ke) + IMPLICIT NONE + + CLASS(meshVol1DSegm), INTENT(in):: self + REAL(8):: ke(1:2,1:2) + REAL(8):: Xii(1:3) + REAL(8):: dPsi(1:1, 1:2) + REAL(8):: invJ + + ke = 0.D0 + Xii = (/ 0.D0, 0.D0, 0.D0 /) + dPsi = self%dPsi(Xii) + invJ = self%invJac(Xii, dPsi) + ke(1,:) = (/ dPsi(1,1)*dPsi(1,1), dPsi(1,1)*dPsi(1,2) /) + ke(2,:) = (/ dPsi(1,2)*dPsi(1,1), dPsi(1,2)*dPsi(1,2) /) + ke = 2.D0*ke*invJ + + END FUNCTION elemKSegm + + PURE FUNCTION elemFSegm(self, source) RESULT(localF) + IMPLICIT NONE + + CLASS(meshVol1DSegm), INTENT(in):: self + REAL(8), INTENT(in):: source(1:) + REAL(8), ALLOCATABLE:: localF(:) + REAL(8):: fPsi(1:2) + REAL(8):: detJ + REAL(8):: Xii(1:3) + + Xii = 0.D0 + fPsi = self%fPsi(Xii) + detJ = self%detJac(Xii) + ALLOCATE(localF(1:2)) + localF = 2.D0*DOT_PRODUCT(fPsi, source)*detJ + + END FUNCTION elemFSegm + + PURE FUNCTION weightSegm(xi) RESULT(w) + IMPLICIT NONE + + REAL(8), INTENT(in):: xi(1:3) + REAL(8):: w(1:3) + + w = fPsiSegm(xi) + + END FUNCTION weightSegm + + PURE FUNCTION insideSegm(xi) RESULT(ins) + IMPLICIT NONE + + REAL(8), INTENT(in):: xi(1:3) + LOGICAL:: ins + + ins = xi(1) >=-1.D0 .AND. & + xi(1) <= 1.D0 + + END FUNCTION insideSegm + + SUBROUTINE scatterSegm(self, part) + USE moduleOutput + USE moduleSpecies + IMPLICIT NONE + + CLASS(meshVol1DSegm), INTENT(in):: self + CLASS(particle), INTENT(in):: part + TYPE(outputNode), POINTER:: vertex + REAL(8):: w_p(1:2) + REAL(8):: tensorS(1:3,1:3) + + w_p = self%weight(part%xi) + tensorS = outerProduct(part%v, part%v) + + vertex => self%n1%output(part%sp) + vertex%den = vertex%den + part%weight*w_p(1) + vertex%mom(:) = vertex%mom(:) + part%weight*w_p(1)*part%v(:) + vertex%tensorS(:,:) = vertex%tensorS(:,:) + part%weight*w_p(1)*tensorS + + vertex => self%n2%output(part%sp) + vertex%den = vertex%den + part%weight*w_p(2) + vertex%mom(:) = vertex%mom(:) + part%weight*w_p(2)*part%v(:) + vertex%tensorS(:,:) = vertex%tensorS(:,:) + part%weight*w_p(2)*tensorS + + END SUBROUTINE scatterSegm + + !Gathers EF at position Xii + PURE FUNCTION gatherEFSegm(self, xi) RESULT(EF) + IMPLICIT NONE + + CLASS(meshVol1DSegm), INTENT(in):: self + REAL(8), INTENT(in):: xi(1:3) + REAL(8):: dPsi(1, 1:2) + REAL(8):: phi(1:2) + REAL(8):: EF(1:3) + REAL(8):: invJ + + phi = (/ self%n1%emData%phi, & + self%n2%emData%phi /) + + dPsi = self%dPsi(xi) + invJ = self%invJac(xi, dPsi) + EF(1) = -DOT_PRODUCT(dPsi(1, :), phi)*invJ + EF(2) = 0.D0 + EF(3) = 0.D0 + + END FUNCTION gatherEFSegm + + !Get nodes from segment + PURE FUNCTION getNodesSegm(self) RESULT(n) + IMPLICIT NONE + + CLASS(meshVol1DSegm), INTENT(in):: self + INTEGER, ALLOCATABLE:: n(:) + + ALLOCATE(n(1:2)) + n = (/ self%n1%n, self%n2%n /) + + END FUNCTION getNodesSegm + + PURE FUNCTION phy2logSegm(self, r) RESULT(xN) + IMPLICIT NONE + + CLASS(meshVol1DSegm), INTENT(in):: self + REAL(8), INTENT(in):: r(1:3) + REAL(8):: xN(1:3) + + xN = 0.D0 + xN(1) = 2.D0*(r(1) - self%x(1))/(self%x(2) - self%x(1)) - 1.D0 + + END FUNCTION phy2logSegm + + !Get next element for a logical position xi + SUBROUTINE nextElementSegm(self, xi, nextElement) + IMPLICIT NONE + + CLASS(meshVol1DSegm), INTENT(in):: self + REAL(8), INTENT(in):: xi(1:3) + CLASS(*), POINTER, INTENT(out):: nextElement + + NULLIFY(nextElement) + IF (xi(1) < -1.D0) THEN + nextElement => self%e2 + + ELSEIF (xi(1) > 1.D0) THEN + nextElement => self%e1 + + END IF + + END SUBROUTINE nextElementSegm + + !Reset the output of nodes in element + PURE SUBROUTINE resetOutputSegm(self) + USE moduleSpecies + USE moduleOutput + IMPLICIT NONE + + CLASS(meshVol1DSegm), INTENT(inout):: self + INTEGER:: k + + DO k = 1, nSpecies + self%n1%output(k)%den = 0.D0 + self%n1%output(k)%mom = 0.D0 + self%n1%output(k)%tensorS = 0.D0 + + self%n2%output(k)%den = 0.D0 + self%n2%output(k)%mom = 0.D0 + self%n2%output(k)%tensorS = 0.D0 + + END DO + + END SUBROUTINE resetOutputSegm + + + !COMMON FUNCTIONS FOR 1D VOLUME ELEMENTS + !Computes the element Jacobian determinant + PURE FUNCTION detJ1D(self, xi, dPsi_in) RESULT(dJ) + IMPLICIT NONE + + CLASS(meshVol1D), INTENT(in):: self + REAL(8), INTENT(in):: xi(1:3) + REAL(8), INTENT(in), OPTIONAL:: dPsi_in(1:,1:) + REAL(8), ALLOCATABLE:: dPsi(:,:) + REAL(8):: dJ + REAL(8):: dx(1) + + IF (PRESENT(dPsi_in)) THEN + dPsi = dPsi_in + + ELSE + dPsi = self%dPsi(xi) + + END IF + + CALL self%partialDer(dPsi, dx) + dJ = dx(1) + + END FUNCTION detJ1D + + !Computes the invers Jacobian + PURE FUNCTION invJ1D(self, xi, dPsi_in) RESULT(invJ) + IMPLICIT NONE + + CLASS(meshVol1D), INTENT(in):: self + REAL(8), INTENT(in):: xi(1:3) + REAL(8), INTENT(in), OPTIONAL:: dPsi_in(1:,1:) + REAL(8), ALLOCATABLE:: dPsi(:,:) + REAL(8):: dx(1) + REAL(8):: invJ + + IF (PRESENT(dPsi_in)) THEN + dPsi = dPsi_in + + ELSE + dPsi = self%dPsi(xi) + + END IF + + CALL self%partialDer(dPsi, dx) + invJ = 1.D0/dx(1) + + END FUNCTION invJ1D + + +END MODULE moduleMesh1D + diff --git a/src/modules/moduleMesh1DBoundary.f95 b/src/modules/moduleMesh1DBoundary.f95 new file mode 100644 index 0000000..bd4e6d6 --- /dev/null +++ b/src/modules/moduleMesh1DBoundary.f95 @@ -0,0 +1,40 @@ +MODULE moduleMesh1DBoundary + USE moduleMesh1D + + TYPE, PUBLIC, EXTENDS(meshEdge1D):: meshEdge1DRef + CONTAINS + PROCEDURE, PASS:: fBoundary => reflection + + END TYPE meshEdge1DRef + + TYPE, PUBLIC, EXTENDS(meshEdge1D):: meshEdge1DAbs + CONTAINS + PROCEDURE, PASS:: fBoundary => absorption + + END TYPE meshEdge1DAbs + + CONTAINS + SUBROUTINE reflection(self, part) + USE moduleSpecies + IMPLICIT NONE + + CLASS(meshEdge1DRef), INTENT(inout):: self + CLASS(particle), INTENT(inout):: part + + part%v(1) = -part%v(1) + part%r(1) = 2.D0*self%x - part%r(1) + + END SUBROUTINE reflection + + SUBROUTINE absorption(self, part) + USE moduleSpecies + IMPLICIT NONE + + CLASS(meshEdge1DAbs), INTENT(inout):: self + CLASS(particle), INTENT(inout):: part + + part%n_in = .FALSE. + + END SUBROUTINE absorption + +END MODULE moduleMesh1DBoundary diff --git a/src/modules/moduleMesh1DRead.f95 b/src/modules/moduleMesh1DRead.f95 new file mode 100644 index 0000000..4b26d2d --- /dev/null +++ b/src/modules/moduleMesh1DRead.f95 @@ -0,0 +1,243 @@ +MODULE moduleMesh1DRead + USE moduleMesh + USE moduleMesh1D + USE moduleMesh1DBoundary + + TYPE, EXTENDS(meshGeneric):: mesh1DGeneric + CONTAINS + PROCEDURE, PASS:: readMesh => readMesh1D + + END TYPE + + INTERFACE connected + MODULE PROCEDURE connectedVolVol, connectedVolEdge + + END INTERFACE connected + + CONTAINS + SUBROUTINE readMesh1D(self, filename) + USE moduleBoundary + IMPLICIT NONE + + CLASS(mesh1DGeneric), INTENT(out):: self + CHARACTER(:), ALLOCATABLE, INTENT(in):: filename + REAL(8):: x + INTEGER:: p(1:2) + INTEGER:: e, et, n, eTemp, elemType, bt + INTEGER:: totalNumElem + INTEGER:: boundaryType + + !Open file mesh + OPEN(10, FILE=TRIM(filename)) + !Skip header + READ(10, *) + READ(10, *) + READ(10, *) + READ(10, *) + !Read number of nodes + READ(10, *) self%numNodes + !Allocate required matrices and vectors + ALLOCATE(self%nodes(1:self%numNodes)) + ALLOCATE(self%K(1:self%numNodes, 1:self%numNodes)) + ALLOCATE(self%IPIV(1:self%numNodes, 1:self%numNodes)) + self%K = 0.D0 + self%IPIV = 0 + !Read nodes coordinates. Only relevant for x + DO e = 1, self%numNodes + READ(10, *) n, x + ALLOCATE(meshNode1D:: self%nodes(n)%obj) + CALL self%nodes(n)%obj%init(n, (/ x, 0.D0, 0.D0 /)) + + END DO + !Skips comments + READ(10, *) + READ(10, *) + !Reads the total number of elements (edges+vol) + READ(10, *) totalNumElem + self%numEdges = 0 + DO e = 1, totalNumElem + READ(10, *) eTemp, elemType + IF (elemType == 15) THEN !15 is physical node in GMSH + self%numEdges = e + + END IF + + END DO + + !Substract the number of edges to the total number of elements + !to obtain the number of volume elements + self%numVols = totalNumelem - self%numEdges + !Allocates arrays + ALLOCATE(self%edges(1:self%numEdges)) + ALLOCATE(self%vols(1:self%numVols)) + + !Go back to the beginning of reading elements + DO e = 1, totalNumelem + BACKSPACE(10) + + END DO + + !Reads edges + DO e = 1, self%numEdges + READ(10, *) n, elemType, eTemp, boundaryType, eTemp, p(1) + !Associate boundary condition + bt = getBoundaryId(boundaryType) + SELECT CASE(boundary(bt)%obj%boundaryType) + CASE ('reflection') + ALLOCATE(meshEdge1DRef:: self%edges(e)%obj) + + CASE ('absorption') + ALLOCATE(meshEdge1DAbs:: self%edges(e)%obj) + + END SELECT + + CALL self%edges(e)%obj%init(n, p(1:1), bt, boundaryType) + + END DO + + !Read and initialize volumes + DO e = 1, self%numVols + READ(10, *) n, elemType, eTemp, eTemp, eTemp, p(1:2) + ALLOCATE(meshVol1DSegm:: self%vols(e)%obj) + CALL self%vols(e)%obj%init(n - self%numEdges, p(1:2)) + + END DO + + CLOSE(10) + + !Build connectivity between elements + DO e = 1, self%numVols + !Connectivity between volumes + DO et = 1, self%numVols + IF (e /= et) THEN + CALL connected(self%vols(e)%obj, self%vols(et)%obj) + + END IF + + END DO + + !Connectivity betwen vols and edges + DO et = 1, self%numEdges + CALL connected(self%vols(e)%obj, self%edges(et)%obj) + + END DO + + !Constructs the global K matrix + CALL constructGlobalK(self%K, self%vols(e)%obj) + + END DO + + END SUBROUTINE readMesh1D + + SUBROUTINE connectedVolVol(elemA, elemB) + IMPLICIT NONE + + CLASS(meshVol), INTENT(inout):: elemA + CLASS(meshVol), INTENT(inout):: elemB + + SELECT TYPE(elemA) + TYPE IS(meshVol1DSegm) + SELECT TYPE(elemB) + TYPE IS(meshVol1DSegm) + CALL connectedSegmSegm(elemA, elemB) + + END SELECT + + END SELECT + + END SUBROUTINE connectedVolVol + + SUBROUTINE connectedSegmSegm(elemA, elemB) + IMPLICIT NONE + + CLASS(meshVol1DSegm), INTENT(inout), TARGET:: elemA + CLASS(meshVol1DSegm), INTENT(inout), TARGET:: elemB + + IF (.NOT. ASSOCIATED(elemA%e1) .AND. & + elemA%n2%n == elemB%n1%n) THEN + elemA%e1 => elemB + elemB%e2 => elemA + + END IF + + IF (.NOT. ASSOCIATED(elemA%e2) .AND. & + elemA%n1%n == elemB%n2%n) THEN + + elemA%e2 => elemB + elemB%e1 => elemA + + END IF + + END SUBROUTINE connectedSegmSegm + + SUBROUTINE connectedVolEdge(elemA, elemB) + IMPLICIT NONE + + CLASS(meshVol), INTENT(inout):: elemA + CLASS(meshEdge), INTENT(inout):: elemB + + SELECT TYPE(elemA) + TYPE IS (meshVol1DSegm) + SELECT TYPE(elemB) + CLASS IS(meshEdge1D) + CALL connectedSegmEdge(elemA, elemB) + + END SELECT + + END SELECT + + END SUBROUTINE connectedVolEdge + + SUBROUTINE connectedSegmEdge(elemA, elemB) + IMPLICIT NONE + + CLASS(meshVol1DSegm), INTENT(inout), TARGET:: elemA + CLASS(meshEdge1D), INTENT(inout), TARGET:: elemB + + IF (.NOT. ASSOCIATED(elemA%e1) .AND. & + elemA%n2%n == elemB%n1%n) THEN + + elemA%e1 => elemB + elemB%e2 => elemA + + END IF + + IF (.NOT. ASSOCIATED(elemA%e2) .AND. & + elemA%n1%n == elemB%n1%n) THEN + + elemA%e2 => elemB + elemB%e1 => elemA + + END IF + + END SUBROUTINE connectedSegmEdge + + SUBROUTINE constructGlobalK(K, elem) + IMPLICIT NONE + + REAL(8), INTENT(inout):: K(1:,1:) + CLASS(meshVol), INTENT(in):: elem + REAL(8):: localK(1:2,1:2) + INTEGER:: i, j + INTEGER:: n(1:2) + + SELECT TYPE(elem) + TYPE IS(meshVol1DSegm) + localK = elem%elemK() + n = (/ elem%n1%n, elem%n2%n /) + + CLASS DEFAULT + n = 0 + localK = 0.D0 + + END SELECT + + DO i = 1, 2 + DO j = 1, 2 + K(n(i), n(j)) = K(n(i), n(j)) + localK(i, j) + END DO + END DO + + END SUBROUTINE constructGlobalK + +END MODULE moduleMesh1DRead diff --git a/src/modules/moduleMeshCyl.f95 b/src/modules/moduleMeshCyl.f95 index 6c68c64..ded8b5e 100644 --- a/src/modules/moduleMeshCyl.f95 +++ b/src/modules/moduleMeshCyl.f95 @@ -37,8 +37,6 @@ MODULE moduleMeshCyl TYPE, PUBLIC, ABSTRACT, EXTENDS(meshVol):: meshVolCyl CONTAINS - PROCEDURE, PASS:: collision => collision2DCyl - PROCEDURE, PASS:: findCell => findCellCyl PROCEDURE, PASS:: detJac => detJCyl PROCEDURE, PASS:: invJac => invJCyl PROCEDURE(fPsi_interface), DEFERRED, NOPASS:: fPsi @@ -176,7 +174,7 @@ MODULE moduleMeshCyl INTEGER, INTENT(in):: p(:) INTEGER, INTENT(in):: bt INTEGER, INTENT(in):: physicalSurface - REAL(8):: r1(1:3), r2(1:3) + REAL(8), DIMENSION(1:3):: r1, r2 self%n = n self%n1 => mesh%nodes(p(1))%obj @@ -581,7 +579,7 @@ MODULE moduleMeshCyl END SUBROUTINE nextElementQuad - !Reset the output of nodes in tria element + !Reset the output of nodes in quad element PURE SUBROUTINE resetOutputQuad(self) USE moduleSpecies USE moduleOutput @@ -1021,122 +1019,4 @@ MODULE moduleMeshCyl END FUNCTION invJCyl - !Find next cell for particle - RECURSIVE SUBROUTINE findCellCyl(self, part, oldCell) - USE moduleSpecies - USE OMP_LIB - IMPLICIT NONE - - CLASS(meshVolCyl), INTENT(inout):: self - CLASS(meshVol), OPTIONAL, INTENT(in):: oldCell - CLASS(particle), INTENT(inout), TARGET:: part - REAL(8):: xi(1:3) - CLASS(*), POINTER:: nextElement - - xi = self%phy2log(part%r) - !Checks if particle is inside 'self' cell - IF (self%inside(xi)) THEN - part%vol = self%n - part%xi = xi - part%n_in = .TRUE. - !Assign particle to listPart_in - CALL OMP_SET_LOCK(self%lock) - CALL self%listPart_in%add(part) - self%totalWeight = self%totalWeight + part%weight - CALL OMP_UNSET_LOCK(self%lock) - - ELSE - !If not, searches for a neighbour and repeats the process. - CALL self%nextElement(xi, nextElement) - !Defines the next step - SELECT TYPE(nextElement) - CLASS IS(meshVolCyl) - !Particle moved to new cell, repeat find procedure - CALL nextElement%findCell(part, self) - - CLASS IS (meshEdgeCyl) - !Particle encountered an edge, execute boundary - CALL nextElement%fBoundary(part) - !If particle is still inside the domain, call findCell - IF (part%n_in) THEN - IF(PRESENT(oldCell)) THEN - CALL self%findCell(part, oldCell) - - ELSE - CALL self%findCell(part) - - END IF - END IF - - CLASS DEFAULT - WRITE(*,*) "ERROR, CHECK findCellCylQuad" - - END SELECT - END IF - - END SUBROUTINE findCellCyl - - !Computes collisions in element - SUBROUTINE collision2DCyl(self) - USE moduleCollisions - USE moduleSpecies - USE moduleList - use moduleRefParam - IMPLICIT NONE - - CLASS(meshVolCyl), INTENT(inout):: self - INTEGER:: nPart !Number of particles inside the cell - REAL(8):: pMax !Maximum probability of collision - INTEGER:: rnd !random index - TYPE(particle), POINTER:: part_i, part_j - INTEGER:: n !collision - INTEGER:: ij, k - REAL(8):: sigmaVrelMaxNew - TYPE(pointerArray), ALLOCATABLE:: partTemp(:) - - self%nColl = 0 - nPart = self%listPart_in%amount - IF (nPart > 1) THEN - pMax = self%totalWeight*self%sigmaVrelMax*tauMin/self%volume - self%nColl = INT(REAL(nPart)*pMax*0.5D0) - - !Converts the list of particles to an array for easy access - IF (self%nColl > 0) THEN - partTemp = self%listPart_in%convert2Array() - - END IF - - DO n = 1, self%nColl - !Select random numbers - rnd = 1 + FLOOR(nPart*RAND()) - part_i => partTemp(rnd)%part - rnd = 1 + FLOOR(nPart*RAND()) - part_j => partTemp(rnd)%part - ij = interactionIndex(part_i%sp, part_j%sp) - sigmaVrelMaxNew = 0.D0 - DO k = 1, interactionMatrix(ij)%amount - CALL interactionMatrix(ij)%collisions(k)%obj%collide(self%sigmaVrelMax, sigmaVrelMaxNew, part_i, part_j) - - END DO - - !Update maximum cross section*v_rel per each collision - IF (sigmaVrelMaxNew > self%sigmaVrelMax) THEN - self%sigmaVrelMax = sigmaVrelMaxNew - - END IF - - END DO - - END IF - - self%totalWeight = 0.D0 - - !Reset output in nodes - CALL self%resetOutput() - - !Erase the list of particles inside the cell - CALL self%listPart_in%erase() - - END SUBROUTINE collision2DCyl - END MODULE moduleMeshCyl diff --git a/src/modules/moduleMeshCylRead.f95 b/src/modules/moduleMeshCylRead.f95 index 86b10e2..b3fa0df 100644 --- a/src/modules/moduleMeshCylRead.f95 +++ b/src/modules/moduleMeshCylRead.f95 @@ -5,10 +5,7 @@ MODULE moduleMeshCylRead TYPE, EXTENDS(meshGeneric):: meshCylGeneric CONTAINS - PROCEDURE, PASS:: readMesh => readMeshCyl - PROCEDURE, PASS:: printOutput => printOutputCyl - PROCEDURE, PASS:: printColl => printCollisionsCyl - PROCEDURE, PASS:: printEM => printEMCyl + PROCEDURE, PASS:: readMesh => readMeshCyl END TYPE @@ -19,7 +16,6 @@ MODULE moduleMeshCylRead CONTAINS SUBROUTINE readMeshCyl(self, filename) - USE moduleRefParam USE moduleBoundary IMPLICIT NONE @@ -82,7 +78,6 @@ MODULE moduleMeshCylRead DO e=1, self%numEdges READ(10,*) n, elemType, eTemp, boundaryType, eTemp, p(1:2) !Associate boundary condition procedure. - !TODO: move to subroutine bt = getBoundaryId(boundaryType) SELECT CASE(boundary(bt)%obj%boundaryType) CASE ('reflection') @@ -120,7 +115,6 @@ MODULE moduleMeshCylRead END SELECT - END DO CLOSE(10) @@ -128,12 +122,12 @@ MODULE moduleMeshCylRead !Build connectivity between elements DO e = 1, self%numVols !Connectivity between volumes - IF (e /= et) THEN - DO et = 1, self%numVols + DO et = 1, self%numVols + IF (e /= et) THEN CALL connected(self%vols(e)%obj, self%vols(et)%obj) - END DO - END IF + END IF + END DO !Connectivity between vols and edges DO et = 1, self%numEdges @@ -588,194 +582,4 @@ MODULE moduleMeshCylRead END SUBROUTINE constructGlobalK - SUBROUTINE printOutputCyl(self, t) - USE moduleRefParam - USE moduleSpecies - USE moduleOutput - IMPLICIT NONE - - CLASS(meshCylGeneric), INTENT(in):: self - INTEGER, INTENT(in):: t - INTEGER:: n, i - TYPE(outputFormat):: output(1:self%numNodes) - REAL(8):: time - CHARACTER(:), ALLOCATABLE:: fileName - CHARACTER (LEN=6):: tstring !TODO: Review to allow any number of iterations - - time = DBLE(t)*tauMin*ti_ref - - DO i = 1, nSpecies - WRITE(tstring, '(I6.6)') t - fileName='OUTPUT_' // tstring// '_' // species(i)%obj%name // '.msh' - WRITE(*, "(6X,A15,A)") "Creating file: ", fileName - OPEN (60, file = path // folder // '/' // fileName) - WRITE(60, "(A)") '$MeshFormat' - WRITE(60, "(A)") '2.2 0 8' - WRITE(60, "(A)") '$EndMeshFormat' - WRITE(60, "(A)") '$NodeData' - WRITE(60, "(A)") '1' - WRITE(60, "(A)") '"Density (m^-3)"' - WRITE(60, *) 1 - WRITE(60, *) time - WRITE(60, *) 3 - WRITE(60, *) t - WRITE(60, *) 1 - WRITE(60, *) self%numNodes - DO n=1, self%numNodes - CALL calculateOutput(self%nodes(n)%obj%output(i), output(n), self%nodes(n)%obj%v, species(i)%obj) - WRITE(60, "(I6,ES20.6E3)") n, output(n)%density - END DO - WRITE(60, "(A)") '$EndNodeData' - WRITE(60, "(A)") '$NodeData' - WRITE(60, "(A)") '1' - WRITE(60, "(A)") '"Velocity (m/s)"' - WRITE(60, *) 1 - WRITE(60, *) time - WRITE(60, *) 3 - WRITE(60, *) t - WRITE(60, *) 3 - WRITE(60, *) self%numNodes - DO n=1, self%numNodes - WRITE(60, "(I6,3(ES20.6E3))") n, output(n)%velocity - END DO - WRITE(60, "(A)") '$EndNodeData' - WRITE(60, "(A)") '$NodeData' - WRITE(60, "(A)") '1' - WRITE(60, "(A)") '"Pressure (Pa)"' - WRITE(60, *) 1 - WRITE(60, *) time - WRITE(60, *) 3 - WRITE(60, *) t - WRITE(60, *) 1 - WRITE(60, *) self%numNodes - DO n=1, self%numNodes - WRITE(60, "(I6,3(ES20.6E3))") n, output(n)%pressure - END DO - WRITE(60, "(A)") '$EndNodeData' - WRITE(60, "(A)") '$NodeData' - WRITE(60, "(A)") '1' - WRITE(60, "(A)") '"Temperature (K)"' - WRITE(60, *) 1 - WRITE(60, *) time - WRITE(60, *) 3 - WRITE(60, *) t - WRITE(60, *) 1 - WRITE(60, *) self%numNodes - DO n=1, self%numNodes - WRITE(60, "(I6,3(ES20.6E3))") n, output(n)%temperature - END DO - WRITE(60, "(A)") '$EndNodeData' - CLOSE (60) - - END DO - - END SUBROUTINE printOutputCyl - - SUBROUTINE printCollisionsCyl(self, t) - USE moduleRefParam - USE moduleCaseParam - USE moduleOutput - IMPLICIT NONE - - CLASS(meshCylGeneric), INTENT(in):: self - INTEGER, INTENT(in):: t - INTEGER:: n - REAL(8):: time - CHARACTER(:), ALLOCATABLE:: fileName - CHARACTER (LEN=6):: tstring !TODO: Review to allow any number of iterations - - - IF (collOutput) THEN - time = DBLE(t)*tauMin*ti_ref - WRITE(tstring, '(I6.6)') t - - fileName='OUTPUT_' // tstring// '_Collisions.msh' - WRITE(*, "(6X,A15,A)") "Creating file: ", fileName - OPEN (60, file = path // folder // '/' // fileName) - WRITE(60, "(A)") '$MeshFormat' - WRITE(60, "(A)") '2.2 0 8' - WRITE(60, "(A)") '$EndMeshFormat' - WRITE(60, "(A)") '$ElementData' - WRITE(60, "(A)") '1' - WRITE(60, "(A)") '"Collisions"' - WRITE(60, *) 1 - WRITE(60, *) time - WRITE(60, *) 3 - WRITE(60, *) t - WRITE(60, *) 1 - WRITE(60, *) self%numVols - DO n=1, self%numVols - WRITE(60, "(I6,I10)") n + self%numEdges, self%vols(n)%obj%nColl - END DO - WRITE(60, "(A)") '$EndElementData' - - CLOSE(60) - - END IF - - END SUBROUTINE printCollisionsCyl - - SUBROUTINE printEMCyl(self, t) - USE moduleRefParam - USE moduleCaseParam - USE moduleOutput - IMPLICIT NONE - - CLASS(meshCylGeneric), INTENT(in):: self - INTEGER, INTENT(in):: t - INTEGER:: n, e - REAL(8):: time - CHARACTER(:), ALLOCATABLE:: fileName - CHARACTER (LEN=6):: tstring !TODO: Review to allow any number of iterations - REAL(8):: xi(1:3) - - IF (emOutput) THEN - time = DBLE(t)*tauMin*ti_ref - WRITE(tstring, '(I6.6)') t - - fileName='OUTPUT_' // tstring// '_EMField.msh' - WRITE(*, "(6X,A15,A)") "Creating file: ", fileName - OPEN (20, file = path // folder // '/' // fileName) - WRITE(20, "(A)") '$MeshFormat' - WRITE(20, "(A)") '2.2 0 8' - WRITE(20, "(A)") '$EndMeshFormat' - WRITE(20, "(A)") '$NodeData' - WRITE(20, "(A)") '1' - WRITE(20, "(A)") '"Potential (V)"' - WRITE(20, *) 1 - WRITE(20, *) time - WRITE(20, *) 3 - WRITE(20, *) t - WRITE(20, *) 1 - WRITE(20, *) self%numNodes - DO n=1, self%numNodes - WRITE(20, *) n, self%nodes(n)%obj%emData%phi*Volt_ref - END DO - WRITE(20, "(A)") '$EndNodeData' - - WRITE(20, "(A)") '$ElementData' - WRITE(20, "(A)") '1' - WRITE(20, "(A)") '"Electric Field (V/m)"' - WRITE(20, *) 1 - WRITE(20, *) time - WRITE(20, *) 3 - WRITE(20, *) t - WRITE(20, *) 3 - WRITE(20, *) self%numVols - DO e=1, self%numVols - SELECT TYPE(elem=>self%vols(e)%obj) - TYPE IS(meshVolCylQuad) - xi = (/ 0.D0, 0.D0, 0.D0 /) - TYPE IS(meshVolCylTria) - xi = (/ 1.D0/3.D0, 1.D0/3.D0, 0.D0 /) - END SELECT - WRITE(20, *) e+self%numEdges, self%vols(e)%obj%gatherEF(xi)*EF_ref - END DO - WRITE(20, "(A)") '$EndElementData' - CLOSE(20) - - END IF - - END SUBROUTINE printEMCyl - END MODULE moduleMeshCylRead diff --git a/src/modules/moduleSolver.f95 b/src/modules/moduleSolver.f95 index c7fda88..b05bc59 100644 --- a/src/modules/moduleSolver.f95 +++ b/src/modules/moduleSolver.f95 @@ -72,6 +72,9 @@ MODULE moduleSolver CASE('2DCylCharged') self%pushParticle => pushCylCharged + CASE('1DCartCharged') + self%pushParticle => push1DCharged + CASE DEFAULT CALL criticalError('Solver ' // pusherType // ' not found','readCase') @@ -227,6 +230,33 @@ MODULE moduleSolver END SUBROUTINE pushCylCharged + !Push charged particles in 1D cartesian coordinates + PURE SUBROUTINE push1DCharged(part) + USE moduleSPecies + USE moduleEM + IMPLICIT NONE + + TYPE(particle), INTENT(inout):: part + TYPE(particle):: part_temp + REAL(8):: tauSp + REAL(8):: qmEFt(1:3) + + part_temp = part + !Time step for particle species + tauSp = tau(part_temp%sp) + !Get the electric field at particle position + qmEFt = part_temp%qm*gatherElecField(part_temp)*tauSp + + !x + part_temp%v(1) = part%v(1) + qmEFt(1) + part_temp%r(1) = part%r(1) + part_temp%v(1)*tauSp + + part_temp%n_in = .FALSE. + + part = part_temp + + END SUBROUTINE push1DCharged + !Do the collisions in all the cells SUBROUTINE doCollisions() USE moduleMesh