From 13eafeeaed3c0bc4bdb44c79f41147c8177972da Mon Sep 17 00:00:00 2001 From: Pascal Engeler <engelerp@phys.ethz.ch> Date: Thu, 16 Jan 2020 17:01:57 +0100 Subject: [PATCH] Added braiding project --- .../braidingTightBinding/bin/Frequencies.pdf | Bin 0 -> 17656 bytes .../bin/Frequencies_zoomed.pdf | Bin 0 -> 13396 bytes projects/braidingTightBinding/bin/Makefile | 15 + projects/braidingTightBinding/bin/ev.txt | 1860 +++++++++++++++++ .../braidingTightBinding/bin/main_braiding | Bin 0 -> 76780 bytes .../bin/main_braiding.cpp | 86 + projects/braidingTightBinding/bin/plot_ev.py | 17 + .../include/coupler_braid.hpp | 57 + .../include/driver_braid.hpp | 27 + .../include/drum_parameters_braid.hpp | 65 + .../include/drum_variables_braid.hpp | 23 + .../include/force_braid.hpp | 44 + .../matrix_element_calculator_braid.hpp | 35 + .../include/rbcomb_generator_braid.hpp | 301 +++ .../braidingTightBinding/include/vortex.hpp | 46 + projects/braidingTightBinding/lib/coupler.hpp | 17 + .../braidingTightBinding/lib/diagonalizer.hpp | 90 + projects/braidingTightBinding/lib/driver.hpp | 18 + projects/braidingTightBinding/lib/drum.hpp | 76 + projects/braidingTightBinding/lib/force.hpp | 22 + projects/braidingTightBinding/lib/grabber.hpp | 143 ++ .../lib/lattice_generator.hpp | 20 + .../lib/matrix_element_calculator.hpp | 21 + .../braidingTightBinding/lib/rk4_buffer.hpp | 16 + .../braidingTightBinding/lib/rk4_stepper.hpp | 95 + projects/braidingTightBinding/lib/system.hpp | 115 + .../lib/system_parameters.hpp | 18 + projects/braidingTightBinding/lib/vec2.hpp | 150 ++ 28 files changed, 3377 insertions(+) create mode 100644 projects/braidingTightBinding/bin/Frequencies.pdf create mode 100644 projects/braidingTightBinding/bin/Frequencies_zoomed.pdf create mode 100644 projects/braidingTightBinding/bin/Makefile create mode 100644 projects/braidingTightBinding/bin/ev.txt create mode 100755 projects/braidingTightBinding/bin/main_braiding create mode 100644 projects/braidingTightBinding/bin/main_braiding.cpp create mode 100644 projects/braidingTightBinding/bin/plot_ev.py create mode 100644 projects/braidingTightBinding/include/coupler_braid.hpp create mode 100644 projects/braidingTightBinding/include/driver_braid.hpp create mode 100644 projects/braidingTightBinding/include/drum_parameters_braid.hpp create mode 100644 projects/braidingTightBinding/include/drum_variables_braid.hpp create mode 100644 projects/braidingTightBinding/include/force_braid.hpp create mode 100644 projects/braidingTightBinding/include/matrix_element_calculator_braid.hpp create mode 100644 projects/braidingTightBinding/include/rbcomb_generator_braid.hpp create mode 100644 projects/braidingTightBinding/include/vortex.hpp create mode 100644 projects/braidingTightBinding/lib/coupler.hpp create mode 100644 projects/braidingTightBinding/lib/diagonalizer.hpp create mode 100644 projects/braidingTightBinding/lib/driver.hpp create mode 100644 projects/braidingTightBinding/lib/drum.hpp create mode 100644 projects/braidingTightBinding/lib/force.hpp create mode 100644 projects/braidingTightBinding/lib/grabber.hpp create mode 100644 projects/braidingTightBinding/lib/lattice_generator.hpp create mode 100644 projects/braidingTightBinding/lib/matrix_element_calculator.hpp create mode 100644 projects/braidingTightBinding/lib/rk4_buffer.hpp create mode 100644 projects/braidingTightBinding/lib/rk4_stepper.hpp create mode 100644 projects/braidingTightBinding/lib/system.hpp create mode 100644 projects/braidingTightBinding/lib/system_parameters.hpp create mode 100644 projects/braidingTightBinding/lib/vec2.hpp diff --git a/projects/braidingTightBinding/bin/Frequencies.pdf b/projects/braidingTightBinding/bin/Frequencies.pdf new file mode 100644 index 0000000000000000000000000000000000000000..e6be3f66ea472caa0f961a1bbeeac0a1869f54bd GIT binary patch literal 17656 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 F3jiaNI&1&{ literal 0 HcmV?d00001 diff --git a/projects/braidingTightBinding/bin/Frequencies_zoomed.pdf b/projects/braidingTightBinding/bin/Frequencies_zoomed.pdf new file mode 100644 index 0000000000000000000000000000000000000000..35dd75c002d035c662af1186e58c32ba65336d74 GIT binary patch literal 13396 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 literal 0 HcmV?d00001 diff --git a/projects/braidingTightBinding/bin/Makefile b/projects/braidingTightBinding/bin/Makefile new file mode 100644 index 0000000..745727b --- /dev/null +++ b/projects/braidingTightBinding/bin/Makefile @@ -0,0 +1,15 @@ +INCLUDEDIR = /Users/pascal/rbcomb_simulation/projects/braidingTightBinding/include +LIBDIR = /Users/pascal/rbcomb_simulation/projects/braidingTightBinding/lib + +CXX = /usr/local/bin/g++-9 +CXXFLAGS = -std=c++2a -Wall -Wpedantic -I$(INCLUDEDIR) -I$(LIBDIR) -O5 -mtune=native -march=native -framework Accelerate -lblas + +run: all + +all: main_braiding + +main_braiding: main_braiding.cpp ${LIBDIR}/diagonalizer.hpp ${LIBDIR}/drum.hpp ${LIBDIR}/grabber.hpp ${LIBDIR}/rk4_buffer.hpp ${LIBDIR}/rk4_stepper.hpp ${LIBDIR}/system.hpp ${LIBDIR}/system_parameters.hpp ${LIBDIR}/vec2.hpp ${INCLUDEDIR}/coupler_braid.hpp ${INCLUDEDIR}/driver_braid.hpp ${INCLUDEDIR}/drum_parameters_braid.hpp ${INCLUDEDIR}/drum_variables_braid.hpp ${INCLUDEDIR}/force_braid.hpp ${INCLUDEDIR}/matrix_element_calculator_braid.hpp ${INCLUDEDIR}/rbcomb_generator_braid.hpp ${INCLUDEDIR}/vortex.hpp + $(CXX) $< $(CXXFLAGS) -o $@ + +clean: + rm -rf main_braiding diff --git a/projects/braidingTightBinding/bin/ev.txt b/projects/braidingTightBinding/bin/ev.txt new file mode 100644 index 0000000..e403dee --- /dev/null +++ b/projects/braidingTightBinding/bin/ev.txt @@ -0,0 +1,1860 @@ +0 21653.4 +1 21662 +2 21665.9 +3 21673 +4 21675.3 +5 21682.6 +6 21686.2 +7 21690.1 +8 21691.2 +9 21700.9 +10 21704.9 +11 21707.5 +12 21710.2 +13 21713.6 +14 21720.3 +15 21724.7 +16 21728.3 +17 21734.5 +18 21736 +19 21737.9 +20 21742.7 +21 21747.6 +22 21752.1 +23 21755.7 +24 21761.4 +25 21764.1 +26 21766.5 +27 21770 +28 21772.7 +29 21776.6 +30 21782.5 +31 21788.5 +32 21790.9 +33 21792.4 +34 21796.3 +35 21799.6 +36 21803.9 +37 21807.2 +38 21809.3 +39 21814.4 +40 21817.4 +41 21823.9 +42 21826.3 +43 21827.3 +44 21831 +45 21835.3 +46 21840.2 +47 21842.4 +48 21846.5 +49 21849.2 +50 21850.2 +51 21852.1 +52 21858.1 +53 21861.9 +54 21865.3 +55 21869.8 +56 21874.5 +57 21875.3 +58 21878.5 +59 21879.7 +60 21883.5 +61 21888 +62 21889.5 +63 21892.7 +64 21894.4 +65 21900.8 +66 21903.2 +67 21906.7 +68 21910 +69 21911.5 +70 21914 +71 21917 +72 21919 +73 21921.6 +74 21926 +75 21929.4 +76 21933.1 +77 21937.5 +78 21938.8 +79 21940.2 +80 21943.3 +81 21944.2 +82 21947.5 +83 21948.8 +84 21951.2 +85 21955.2 +86 21958 +87 21961.5 +88 21966.1 +89 21966.6 +90 21968.3 +91 21972.6 +92 21976 +93 21977.9 +94 21979 +95 21981.2 +96 21982.5 +97 21984 +98 21985.8 +99 21989.3 +100 21991.8 +101 21996.5 +102 21997 +103 21998.3 +104 22001.1 +105 22004.7 +106 22005.5 +107 22009.4 +108 22011.3 +109 22012.5 +110 22014.3 +111 22016.9 +112 22017.4 +113 22019.3 +114 22023 +115 22024.2 +116 22024.9 +117 22025.9 +118 22026.7 +119 22027.9 +120 22032.3 +121 22034.4 +122 22035.3 +123 22037.6 +124 22039.1 +125 22041.3 +126 22042.4 +127 22044.4 +128 22045.1 +129 22048.2 +130 22048.7 +131 22052 +132 22054.2 +133 22055.5 +134 22057.1 +135 22058.8 +136 22059.9 +137 22061.2 +138 22062 +139 22065.2 +140 22067.2 +141 22069.6 +142 22071.5 +143 22073.9 +144 22077.6 +145 22079.5 +146 22081.7 +147 22084.6 +148 22087.4 +149 22088.2 +150 22090.8 +151 22092.1 +152 22095.1 +153 22098.4 +154 22101.8 +155 22102.4 +156 22104.2 +157 22107.4 +158 22108.4 +159 22115.5 +160 22117 +161 22119.7 +162 22120.8 +163 22123.5 +164 22124.9 +165 22126 +166 22127.8 +167 22131.1 +168 22131.9 +169 22138.3 +170 22139.6 +171 22143.3 +172 22146.7 +173 22147.7 +174 22155 +175 22155.3 +176 22160.2 +177 22163.8 +178 22165.9 +179 22168.7 +180 22170.3 +181 22171.9 +182 22177.8 +183 22178.6 +184 22181.6 +185 22184.9 +186 22190.4 +187 22191.2 +188 22193.4 +189 22196.1 +190 22199.3 +191 22206.3 +192 22208.6 +193 22211.1 +194 22216.8 +195 22221 +196 22224.1 +197 22224.8 +198 22227.9 +199 22231.6 +200 22237.1 +201 22242.3 +202 22248.6 +203 22251.5 +204 22259.9 +205 22261.7 +206 22266.1 +207 22269.3 +208 22276.9 +209 22278.8 +210 22281.1 +211 22282.2 +212 22284.1 +213 22286.6 +214 22290.1 +215 22294.5 +216 22298.9 +217 22301.2 +218 22304 +219 22310.2 +220 22316.4 +221 22326 +222 22328.3 +223 22333.7 +224 22339.4 +225 22344.9 +226 22348.7 +227 22350.8 +228 22353.3 +229 22355.2 +230 22359.8 +231 22361.2 +232 22366 +233 22370.9 +234 22378.2 +235 22392.7 +236 22396.9 +237 22399.1 +238 22400.3 +239 22406.6 +240 22410 +241 22412.1 +242 22417.8 +243 22429.8 +244 22432.9 +245 22439.5 +246 22443.7 +247 22455.1 +248 22458.3 +249 22467.6 +250 22469.9 +251 22474 +252 22485.5 +253 22487 +254 22497.7 +255 22504.8 +256 22520.2 +257 22527.7 +258 22529.7 +259 22535.8 +260 22540.2 +261 22546.4 +262 22554.3 +263 22582.9 +264 22586 +265 22603.4 +266 22606.6 +267 22610.5 +268 22612.4 +269 22619.8 +270 22625.6 +271 22627.9 +272 22631.2 +273 22635.3 +274 22657.6 +275 22658.7 +276 22670.9 +277 22672.6 +278 22681.6 +279 22692.7 +280 22698.2 +281 22711.7 +282 22717.5 +283 22734.1 +284 22737.3 +285 22745.9 +286 22748.2 +287 22755.3 +288 22763.2 +289 22782.9 +290 22787 +291 22799.6 +292 22809.2 +293 22820.2 +294 22822.2 +295 22836.9 +296 22860.1 +297 22862.3 +298 22881 +299 22883.5 +300 22899.3 +301 22905.3 +302 22915 +303 22930.6 +304 22968.7 +305 22983.9 +306 22999.1 +307 23014.8 +308 23056.8 +309 23082 +310 23091 +311 23105.1 +312 23127.8 +313 23153.4 +314 23165.6 +315 23190.6 +316 23214.4 +317 23227.3 +318 23250.8 +319 23260.1 +320 23263.5 +321 23270 +322 23278.1 +323 23286.3 +324 23292.7 +325 23300.1 +326 23300.6 +327 23308.8 +328 23311.9 +329 23319.2 +330 23326.6 +331 23329.8 +332 23333.1 +333 23365.6 +334 23375.2 +335 23380.1 +336 23413.8 +337 23415.2 +338 23433.6 +339 23440.5 +340 23445.7 +341 23450.1 +342 23460.6 +343 23465.5 +344 23467.5 +345 23477.1 +346 23486.5 +347 23488.7 +348 23498.6 +349 23499.8 +350 23513.1 +351 23520.5 +352 23523.1 +353 23530.8 +354 23535.3 +355 23539.5 +356 23552.8 +357 23560.3 +358 23569.3 +359 23573.3 +360 23582.5 +361 23587 +362 23597.7 +363 23603.9 +364 23606.3 +365 23607.5 +366 23621.4 +367 23626.4 +368 23630.2 +369 23634.1 +370 23642.6 +371 23644 +372 23649.2 +373 23652.4 +374 23656.4 +375 23660.2 +376 23670 +377 23676.6 +378 23680.1 +379 23683.9 +380 23692.9 +381 23703.9 +382 23707.8 +383 23715.6 +384 23718.5 +385 23719.6 +386 23722.4 +387 23729.5 +388 23732.5 +389 23737.7 +390 23739.8 +391 23742.4 +392 23747.6 +393 23750.6 +394 23756.9 +395 23761.8 +396 23763.2 +397 23769.1 +398 23773.4 +399 23781.3 +400 23789.6 +401 23792.4 +402 23793.7 +403 23795.9 +404 23799.3 +405 23805.6 +406 23807.7 +407 23808.6 +408 23811.1 +409 23814.6 +410 23820.1 +411 23824.6 +412 23828.2 +413 23834.8 +414 23841.6 +415 23846.6 +416 23847.2 +417 23849.6 +418 23855.5 +419 23857.1 +420 23857.8 +421 23864.6 +422 23865.1 +423 23869.6 +424 23870.9 +425 23875.8 +426 23879 +427 23879.9 +428 23882.6 +429 23885.5 +430 23886 +431 23889.2 +432 23895.5 +433 23899.2 +434 23900.5 +435 23902.8 +436 23904.1 +437 23907.7 +438 23908.7 +439 23913.8 +440 23917.5 +441 23920.6 +442 23925.1 +443 23926.2 +444 23930.8 +445 23932.9 +446 23934 +447 23937.9 +448 23940.3 +449 23941.6 +450 23942.6 +451 23947.9 +452 23952.4 +453 23953.7 +454 23957.2 +455 23959.7 +456 23961.1 +457 23963.1 +458 23965.9 +459 23967.3 +460 23968.6 +461 23970.4 +462 23971.9 +463 23973.2 +464 23976 +465 23978.8 +466 23980 +467 23981 +468 23982.6 +469 23983.7 +470 23985.1 +471 23986.1 +472 23986.9 +473 23987.7 +474 23989.1 +475 23990.9 +476 23991.8 +477 23993.2 +478 23993.9 +479 23997.6 +480 23999.4 +481 24001.9 +482 24004 +483 24004.4 +484 24007.1 +485 24008.8 +486 24012.6 +487 24013.6 +488 24015 +489 24016.3 +490 24016.6 +491 24017.1 +492 24019.6 +493 24020 +494 24024.3 +495 24026.1 +496 24027.4 +497 24029.3 +498 24030.9 +499 24031.7 +500 24032.2 +501 24033.6 +502 24035.9 +503 24038.5 +504 24039 +505 24039.5 +506 24040.2 +507 24046 +508 24046.4 +509 24047.3 +510 24049.5 +511 24050.1 +512 24052.1 +513 24052.4 +514 24055.4 +515 24057.1 +516 24057.3 +517 24058.7 +518 24059 +519 24061.3 +520 24062.7 +521 24063.7 +522 24066.3 +523 24067.7 +524 24069.1 +525 24070.2 +526 24072.8 +527 24073.8 +528 24075.2 +529 24075.9 +530 24076.5 +531 24078 +532 24078.7 +533 24079.8 +534 24082.9 +535 24083.6 +536 24085.3 +537 24085.5 +538 24086.9 +539 24088.3 +540 24090.1 +541 24091.1 +542 24093 +543 24093.8 +544 24095.1 +545 24097.5 +546 24098.4 +547 24100.2 +548 24101.7 +549 24102.8 +550 24103.1 +551 24104.8 +552 24105.3 +553 24109 +554 24110.9 +555 24111.5 +556 24111.8 +557 24113.3 +558 24113.6 +559 24116 +560 24116.4 +561 24118.2 +562 24119.4 +563 24121.5 +564 24122 +565 24122.5 +566 24124.4 +567 24126.5 +568 24126.7 +569 24127.4 +570 24128.9 +571 24129.7 +572 24132.4 +573 24132.8 +574 24133.6 +575 24135.5 +576 24136.1 +577 24137.7 +578 24139.5 +579 24141.9 +580 24142.6 +581 24143.5 +582 24144.4 +583 24145.6 +584 24145.9 +585 24147.6 +586 24149.1 +587 24150.7 +588 24152.1 +589 24152.7 +590 24153.4 +591 24155.5 +592 24156.3 +593 24157.2 +594 24158.9 +595 24160.6 +596 24162.4 +597 24162.5 +598 24163.1 +599 24163.6 +600 24164.1 +601 24164.8 +602 24167.3 +603 24167.9 +604 24168.9 +605 24170.6 +606 24171.4 +607 24172.7 +608 24173.2 +609 24174.9 +610 24175.9 +611 24177 +612 24178.1 +613 24178.8 +614 24180 +615 24181.3 +616 24181.7 +617 24184.2 +618 24185.1 +619 24186.3 +620 24187.1 +621 24188.3 +622 24188.7 +623 24189.3 +624 24190.3 +625 24191 +626 24191.2 +627 24193 +628 24193.9 +629 24194.2 +630 24194.9 +631 24196.8 +632 24198 +633 24198.8 +634 24199.9 +635 24200.5 +636 24201 +637 24201.8 +638 24203.7 +639 24204.3 +640 24205.8 +641 24208.1 +642 24208.4 +643 24209.4 +644 24209.8 +645 24210.6 +646 24211.2 +647 24212 +648 24212.7 +649 24213.4 +650 24216.3 +651 24217 +652 24217.9 +653 24218.4 +654 24219.8 +655 24220.3 +656 24220.6 +657 24221.8 +658 24224.4 +659 24224.8 +660 24226 +661 24226.9 +662 24227.2 +663 24229 +664 24230.3 +665 24231.9 +666 24232 +667 24232.2 +668 24232.7 +669 24235 +670 24235.5 +671 24236 +672 24236.5 +673 24238.1 +674 24239.3 +675 24240.4 +676 24241.1 +677 24242 +678 24242.9 +679 24243.4 +680 24244.2 +681 24245.5 +682 24245.6 +683 24247.3 +684 24247.9 +685 24248.9 +686 24249.9 +687 24250.1 +688 24251.6 +689 24252.1 +690 24252.8 +691 24254.2 +692 24255.1 +693 24256.6 +694 24257.1 +695 24258.2 +696 24259.8 +697 24260.1 +698 24261.2 +699 24261.7 +700 24262.9 +701 24263.6 +702 24264.1 +703 24265.5 +704 24268.1 +705 24268.5 +706 24269.6 +707 24270.8 +708 24271.1 +709 24272 +710 24272.8 +711 24274.2 +712 24275.5 +713 24275.7 +714 24277.3 +715 24278.2 +716 24279.2 +717 24280 +718 24280.9 +719 24281.9 +720 24282.1 +721 24283.2 +722 24284.8 +723 24285.9 +724 24286.4 +725 24287.4 +726 24287.8 +727 24289.4 +728 24290.2 +729 24291.7 +730 24292.1 +731 24293.2 +732 24294.2 +733 24294.8 +734 24295.9 +735 24296.8 +736 24298.5 +737 24299.4 +738 24299.9 +739 24301.7 +740 24302.4 +741 24303.4 +742 24303.6 +743 24304.6 +744 24305.2 +745 24306.2 +746 24308 +747 24308.7 +748 24309 +749 24311.8 +750 24312.2 +751 24313.4 +752 24314.6 +753 24316.3 +754 24316.8 +755 24316.9 +756 24318.2 +757 24319 +758 24320.5 +759 24321.8 +760 24322 +761 24322.7 +762 24323.5 +763 24324.7 +764 24325.6 +765 24327.6 +766 24328.4 +767 24329.4 +768 24330.4 +769 24331.4 +770 24332.6 +771 24333 +772 24334.4 +773 24335.6 +774 24336.9 +775 24337.3 +776 24338.7 +777 24339.7 +778 24340.4 +779 24341.3 +780 24342.9 +781 24343.6 +782 24344.3 +783 24345.1 +784 24346.7 +785 24347.4 +786 24348.1 +787 24349.7 +788 24351.4 +789 24352.3 +790 24353.7 +791 24354.3 +792 24354.7 +793 24357.2 +794 24358.5 +795 24359.1 +796 24360.2 +797 24362.3 +798 24362.6 +799 24363.3 +800 24364.1 +801 24365.5 +802 24366.8 +803 24367.8 +804 24369.5 +805 24371.1 +806 24371.4 +807 24372.1 +808 24373.5 +809 24375.1 +810 24376.9 +811 24378.1 +812 24378.8 +813 24381.4 +814 24382.5 +815 24383 +816 24383.2 +817 24385.1 +818 24387.1 +819 24388.8 +820 24389.2 +821 24390.2 +822 24393.9 +823 24394.9 +824 24395.6 +825 24397.5 +826 24398.4 +827 24399.1 +828 24400.7 +829 24401.8 +830 24402.4 +831 24403.7 +832 24406.2 +833 24406.2 +834 24409.6 +835 24411.3 +836 24411.9 +837 24412.4 +838 24413.2 +839 24414.8 +840 24416.7 +841 24418.8 +842 24419.9 +843 24421.7 +844 24423.3 +845 24425.7 +846 24427.4 +847 24428.2 +848 24430.4 +849 24430.9 +850 24435.3 +851 24436.1 +852 24438.4 +853 24438.9 +854 24440.2 +855 24441.8 +856 24444.7 +857 24450.2 +858 24451.9 +859 24457.7 +860 24458.4 +861 24460.3 +862 24461.4 +863 24463.1 +864 24465.8 +865 24466.4 +866 24470.3 +867 24472.3 +868 24475.4 +869 24479.6 +870 24485.2 +871 24486.7 +872 24489.3 +873 24491.5 +874 24493.4 +875 24497.6 +876 24502.1 +877 24504 +878 24508.1 +879 24509.6 +880 24511.9 +881 24513.9 +882 24516.8 +883 24519.8 +884 24525.2 +885 24529 +886 24539 +887 24542.2 +888 24545.4 +889 24558.8 +890 24565 +891 24570.9 +892 24572.1 +893 24588.9 +894 24593.2 +895 24606.4 +896 24630.6 +897 24641.5 +898 24641.9 +899 24646.3 +900 24655 +901 24670.7 +902 24726.3 +903 24730.2 +904 24736.5 +905 24813.4 +906 24831.7 +907 24862.3 +908 24864.3 +909 24903.1 +910 24903.2 +911 25005.2 +912 25138.5 +913 25211.9 +914 25212.2 +915 26339.1 +916 26339.1 +917 26339.1 +918 26339.1 +919 26339.1 +920 26339.1 +921 26339.1 +922 26339.1 +923 26339.1 +924 26339.1 +925 26339.1 +926 26339.1 +927 26339.1 +928 26339.1 +929 26339.1 +930 26339.1 +931 26339.1 +932 26339.1 +933 26339.1 +934 26339.1 +935 26339.1 +936 26339.1 +937 26339.1 +938 26339.1 +939 26339.1 +940 26339.1 +941 26339.1 +942 26339.1 +943 26339.1 +944 26339.1 +945 27419.8 +946 27420.1 +947 27487.3 +948 27608.7 +949 27700.7 +950 27700.8 +951 27735.7 +952 27737.5 +953 27764.8 +954 27781.2 +955 27849.7 +956 27855.3 +957 27858.7 +958 27908 +959 27921.9 +960 27929.5 +961 27933.5 +962 27933.8 +963 27943.4 +964 27964.7 +965 27976.3 +966 27980.1 +967 27994.8 +968 27995.9 +969 28001.1 +970 28006.5 +971 28018.3 +972 28021 +973 28023.8 +974 28032.7 +975 28035.9 +976 28040.7 +977 28043.3 +978 28045.8 +979 28047.6 +980 28049.6 +981 28050.9 +982 28054.5 +983 28056.2 +984 28060.1 +985 28063.8 +986 28065.4 +987 28067.3 +988 28069.6 +989 28070.9 +990 28075.8 +991 28079.5 +992 28082.1 +993 28083.9 +994 28087.3 +995 28087.8 +996 28090.1 +997 28091.6 +998 28092.6 +999 28094.3 +1000 28094.8 +1001 28099.9 +1002 28101.4 +1003 28106.2 +1004 28108.7 +1005 28110.1 +1006 28111.2 +1007 28111.6 +1008 28113.6 +1009 28114.3 +1010 28118.2 +1011 28118.6 +1012 28120.5 +1013 28121.2 +1014 28122.7 +1015 28124.7 +1016 28126.2 +1017 28127.7 +1018 28128.7 +1019 28130.5 +1020 28132.1 +1021 28133.5 +1022 28134.2 +1023 28134.7 +1024 28135.2 +1025 28136.7 +1026 28139.6 +1027 28139.6 +1028 28141.7 +1029 28142.9 +1030 28143.5 +1031 28144.4 +1032 28145.8 +1033 28146.4 +1034 28147.1 +1035 28148.8 +1036 28149.4 +1037 28150.3 +1038 28153.5 +1039 28154.3 +1040 28154.7 +1041 28156.1 +1042 28157.9 +1043 28159.5 +1044 28159.7 +1045 28160.2 +1046 28161.1 +1047 28163.3 +1048 28164 +1049 28165 +1050 28166.5 +1051 28168 +1052 28169.1 +1053 28169.7 +1054 28170 +1055 28171.4 +1056 28172.9 +1057 28173.7 +1058 28174.9 +1059 28176.1 +1060 28176.8 +1061 28177.3 +1062 28177.6 +1063 28179.5 +1064 28180.4 +1065 28180.9 +1066 28182 +1067 28184.2 +1068 28184.5 +1069 28185 +1070 28186.2 +1071 28187 +1072 28188.5 +1073 28189.9 +1074 28190.5 +1075 28191.1 +1076 28192.5 +1077 28193.2 +1078 28193.8 +1079 28194.4 +1080 28195.8 +1081 28196.5 +1082 28197.2 +1083 28198 +1084 28199.2 +1085 28199.6 +1086 28200.7 +1087 28201.7 +1088 28202.9 +1089 28203.3 +1090 28204.3 +1091 28205.1 +1092 28206 +1093 28206.9 +1094 28207.6 +1095 28209.3 +1096 28210.1 +1097 28211.1 +1098 28211.8 +1099 28212.4 +1100 28212.6 +1101 28213.7 +1102 28215 +1103 28215.7 +1104 28216.8 +1105 28216.9 +1106 28217.4 +1107 28218.8 +1108 28219.9 +1109 28220.9 +1110 28221.2 +1111 28223.6 +1112 28223.9 +1113 28224.5 +1114 28226 +1115 28226.9 +1116 28227.4 +1117 28228.2 +1118 28228.4 +1119 28229.3 +1120 28229.9 +1121 28231.5 +1122 28231.9 +1123 28232.7 +1124 28234.1 +1125 28234.9 +1126 28235.8 +1127 28236.3 +1128 28237.2 +1129 28238.1 +1130 28238.5 +1131 28239.8 +1132 28240.5 +1133 28241.9 +1134 28242.2 +1135 28243.1 +1136 28243.5 +1137 28244.5 +1138 28245.8 +1139 28246.8 +1140 28247 +1141 28247.8 +1142 28248.5 +1143 28249.2 +1144 28250.1 +1145 28250.9 +1146 28252.3 +1147 28252.4 +1148 28253.6 +1149 28254.8 +1150 28255.4 +1151 28256.2 +1152 28256.5 +1153 28257.5 +1154 28258.5 +1155 28258.8 +1156 28261 +1157 28262.2 +1158 28262.7 +1159 28263.2 +1160 28264.3 +1161 28264.8 +1162 28265.7 +1163 28265.9 +1164 28267.3 +1165 28268.2 +1166 28268.6 +1167 28270 +1168 28270.7 +1169 28272 +1170 28272.5 +1171 28273 +1172 28274.3 +1173 28274.4 +1174 28275.3 +1175 28276.1 +1176 28276.6 +1177 28278.1 +1178 28278.2 +1179 28279.3 +1180 28280 +1181 28280.4 +1182 28281.2 +1183 28282 +1184 28282.6 +1185 28283.5 +1186 28284.5 +1187 28285.9 +1188 28286.3 +1189 28286.8 +1190 28287.2 +1191 28289.2 +1192 28289.6 +1193 28289.7 +1194 28289.8 +1195 28291.2 +1196 28292.3 +1197 28293.9 +1198 28294.1 +1199 28294.9 +1200 28295.9 +1201 28296.3 +1202 28298.5 +1203 28299.5 +1204 28299.7 +1205 28300.2 +1206 28301.4 +1207 28301.8 +1208 28302.6 +1209 28303.2 +1210 28305.7 +1211 28306.2 +1212 28306.9 +1213 28307.5 +1214 28308 +1215 28308.8 +1216 28309.1 +1217 28309.9 +1218 28310.2 +1219 28312.1 +1220 28313.5 +1221 28314 +1222 28315.6 +1223 28316.2 +1224 28316.7 +1225 28317.2 +1226 28318.2 +1227 28318.9 +1228 28319.9 +1229 28321.5 +1230 28322.1 +1231 28322.3 +1232 28323.1 +1233 28324.7 +1234 28324.8 +1235 28325.4 +1236 28326.2 +1237 28326.7 +1238 28327.1 +1239 28328.2 +1240 28328.9 +1241 28329.9 +1242 28330.6 +1243 28332.7 +1244 28333.1 +1245 28334.2 +1246 28335.2 +1247 28335.8 +1248 28336.8 +1249 28337.7 +1250 28338.6 +1251 28340 +1252 28340.4 +1253 28341.6 +1254 28342.3 +1255 28343.6 +1256 28344.5 +1257 28345 +1258 28347.2 +1259 28347.7 +1260 28348.2 +1261 28348.7 +1262 28349.1 +1263 28349.3 +1264 28350.7 +1265 28352.2 +1266 28353.7 +1267 28354.4 +1268 28355.1 +1269 28356.9 +1270 28357.4 +1271 28358 +1272 28359.2 +1273 28360.5 +1274 28361.8 +1275 28363.2 +1276 28363.6 +1277 28364.6 +1278 28365.3 +1279 28366.1 +1280 28366.7 +1281 28368.7 +1282 28370.3 +1283 28371.6 +1284 28372.1 +1285 28373.8 +1286 28374.4 +1287 28374.7 +1288 28377.1 +1289 28377.8 +1290 28379 +1291 28379.6 +1292 28379.8 +1293 28381.5 +1294 28383.2 +1295 28383.6 +1296 28384 +1297 28385.8 +1298 28386.8 +1299 28388.3 +1300 28388.7 +1301 28390.8 +1302 28391 +1303 28392.2 +1304 28392.6 +1305 28393 +1306 28394.7 +1307 28397.8 +1308 28398.2 +1309 28399.6 +1310 28399.9 +1311 28400.8 +1312 28402.1 +1313 28403.7 +1314 28404.4 +1315 28406.5 +1316 28407.6 +1317 28408.2 +1318 28409.9 +1319 28410.7 +1320 28412.2 +1321 28413.4 +1322 28414.6 +1323 28414.8 +1324 28416.2 +1325 28416.8 +1326 28419.4 +1327 28420.3 +1328 28421 +1329 28422.2 +1330 28422.7 +1331 28423.4 +1332 28424.5 +1333 28425.4 +1334 28427.5 +1335 28428.4 +1336 28429.6 +1337 28430.8 +1338 28433 +1339 28433.9 +1340 28435.1 +1341 28437.1 +1342 28437.3 +1343 28438.4 +1344 28438.7 +1345 28440 +1346 28442.6 +1347 28442.9 +1348 28444.6 +1349 28445.1 +1350 28446.9 +1351 28447.7 +1352 28448 +1353 28452.9 +1354 28453.6 +1355 28454 +1356 28454.3 +1357 28456.6 +1358 28458.5 +1359 28459.7 +1360 28460.1 +1361 28460.8 +1362 28462.1 +1363 28463.8 +1364 28464.8 +1365 28466.3 +1366 28469.9 +1367 28470.3 +1368 28472.4 +1369 28472.8 +1370 28473.1 +1371 28474.2 +1372 28475.3 +1373 28476.2 +1374 28479.4 +1375 28480.9 +1376 28483.1 +1377 28483.5 +1378 28485.2 +1379 28487.3 +1380 28488.9 +1381 28492 +1382 28492.6 +1383 28493.8 +1384 28494.5 +1385 28496 +1386 28497.2 +1387 28497.9 +1388 28498.6 +1389 28499.4 +1390 28500.5 +1391 28501.5 +1392 28502.8 +1393 28503.7 +1394 28504.7 +1395 28507 +1396 28509.4 +1397 28510.5 +1398 28511.8 +1399 28513.2 +1400 28514.3 +1401 28515.5 +1402 28517.9 +1403 28519.6 +1404 28520.8 +1405 28522.8 +1406 28525.8 +1407 28526.9 +1408 28530.7 +1409 28535.1 +1410 28535.9 +1411 28537 +1412 28539.1 +1413 28542.4 +1414 28543.2 +1415 28545 +1416 28548.8 +1417 28549.8 +1418 28553.6 +1419 28556.1 +1420 28559.3 +1421 28563.5 +1422 28564.3 +1423 28567.3 +1424 28568.4 +1425 28570.4 +1426 28571.5 +1427 28574.6 +1428 28579.8 +1429 28582.5 +1430 28582.9 +1431 28585.3 +1432 28587.6 +1433 28588.3 +1434 28591 +1435 28595.1 +1436 28596.2 +1437 28599.9 +1438 28600.3 +1439 28606 +1440 28606.6 +1441 28607.9 +1442 28612.8 +1443 28614.9 +1444 28615.4 +1445 28619.5 +1446 28625.2 +1447 28630.7 +1448 28633.7 +1449 28637.5 +1450 28642 +1451 28644.9 +1452 28647 +1453 28647.7 +1454 28649.5 +1455 28654.7 +1456 28657.5 +1457 28659.4 +1458 28660.4 +1459 28662.8 +1460 28669.6 +1461 28676.2 +1462 28679.8 +1463 28684.6 +1464 28685.8 +1465 28689.9 +1466 28695.1 +1467 28697.6 +1468 28701.9 +1469 28704.1 +1470 28705.8 +1471 28710.1 +1472 28712.5 +1473 28718.4 +1474 28720.7 +1475 28721.6 +1476 28724.1 +1477 28730.5 +1478 28733.7 +1479 28742.8 +1480 28750.2 +1481 28753.3 +1482 28756.2 +1483 28761.6 +1484 28769.7 +1485 28772.8 +1486 28776.1 +1487 28778.8 +1488 28783 +1489 28784.2 +1490 28791.1 +1491 28794.3 +1492 28797.5 +1493 28801.6 +1494 28813 +1495 28813.9 +1496 28815.9 +1497 28821 +1498 28829.7 +1499 28833.4 +1500 28841 +1501 28844.2 +1502 28851.6 +1503 28857.7 +1504 28868.5 +1505 28871.9 +1506 28875.6 +1507 28881.9 +1508 28884 +1509 28890.1 +1510 28900.8 +1511 28901.9 +1512 28909.9 +1513 28911.7 +1514 28919.3 +1515 28927.1 +1516 28928.7 +1517 28932.7 +1518 28941.2 +1519 28944.8 +1520 28949 +1521 28954.6 +1522 28969.4 +1523 28970.6 +1524 28997.8 +1525 29001.7 +1526 29009.5 +1527 29035.6 +1528 29038.2 +1529 29040.9 +1530 29046.8 +1531 29052.6 +1532 29055.1 +1533 29061.7 +1534 29062.1 +1535 29068 +1536 29073.2 +1537 29079.7 +1538 29086.2 +1539 29091.4 +1540 29094.1 +1541 29101.5 +1542 29120.3 +1543 29130.6 +1544 29149.6 +1545 29169.4 +1546 29179.1 +1547 29199.4 +1548 29217.4 +1549 29228.5 +1550 29235.6 +1551 29255.5 +1552 29288.6 +1553 29300.9 +1554 29312.8 +1555 29324.7 +1556 29354.5 +1557 29366.7 +1558 29374.3 +1559 29379 +1560 29391.2 +1561 29393.2 +1562 29407.7 +1563 29409.4 +1564 29427.5 +1565 29438.8 +1566 29440.5 +1567 29449 +1568 29456.4 +1569 29466.1 +1570 29469.3 +1571 29484.5 +1572 29490.6 +1573 29496.1 +1574 29497.9 +1575 29504.5 +1576 29506.9 +1577 29519.8 +1578 29524.2 +1579 29534.6 +1580 29538.8 +1581 29547.4 +1582 29554.2 +1583 29555.5 +1584 29564.9 +1585 29565.7 +1586 29582.8 +1587 29585.9 +1588 29588.5 +1589 29590.2 +1590 29594.7 +1591 29600.3 +1592 29601.8 +1593 29604.7 +1594 29607.2 +1595 29620.5 +1596 29622.9 +1597 29644.6 +1598 29650.6 +1599 29655.3 +1600 29658.7 +1601 29663.3 +1602 29664.8 +1603 29670.5 +1604 29682.3 +1605 29687.6 +1606 29695.7 +1607 29696.8 +1608 29705.5 +1609 29708.6 +1610 29710.4 +1611 29717.4 +1612 29719.8 +1613 29728.4 +1614 29731.6 +1615 29736.6 +1616 29738.9 +1617 29747.9 +1618 29752.3 +1619 29753.9 +1620 29756.4 +1621 29761.1 +1622 29762 +1623 29763.8 +1624 29766.9 +1625 29777.8 +1626 29783.3 +1627 29786.9 +1628 29790.5 +1629 29791.6 +1630 29795 +1631 29796.5 +1632 29798.4 +1633 29799.9 +1634 29802.8 +1635 29806.9 +1636 29811.1 +1637 29815.2 +1638 29816.9 +1639 29824.1 +1640 29828.8 +1641 29833.4 +1642 29835.5 +1643 29837.2 +1644 29840.5 +1645 29843.8 +1646 29846.4 +1647 29848.3 +1648 29849.7 +1649 29850.5 +1650 29852.3 +1651 29853.7 +1652 29859.3 +1653 29861.7 +1654 29865 +1655 29866.3 +1656 29872.5 +1657 29874.7 +1658 29879.4 +1659 29883.3 +1660 29887.4 +1661 29890.1 +1662 29892.5 +1663 29892.9 +1664 29895.3 +1665 29898.4 +1666 29902.7 +1667 29904.5 +1668 29906.2 +1669 29911.4 +1670 29913.8 +1671 29915.8 +1672 29917.4 +1673 29918 +1674 29922 +1675 29924.5 +1676 29926.8 +1677 29927.3 +1678 29931.7 +1679 29932.9 +1680 29934.1 +1681 29936.2 +1682 29937.7 +1683 29940.4 +1684 29944 +1685 29944.2 +1686 29949.6 +1687 29950.3 +1688 29952.9 +1689 29955.6 +1690 29956.6 +1691 29961.3 +1692 29961.9 +1693 29964.3 +1694 29965.6 +1695 29966.5 +1696 29967.5 +1697 29969.5 +1698 29970.3 +1699 29972.3 +1700 29973.4 +1701 29978.6 +1702 29979.4 +1703 29981.7 +1704 29983.1 +1705 29983.5 +1706 29986 +1707 29988.4 +1708 29990.6 +1709 29991.6 +1710 29993.6 +1711 29994.1 +1712 29996.1 +1713 29998.3 +1714 29999.9 +1715 30001.3 +1716 30004 +1717 30005.8 +1718 30007.2 +1719 30009 +1720 30010.4 +1721 30012.8 +1722 30013.4 +1723 30014.4 +1724 30015.1 +1725 30016.4 +1726 30017.6 +1727 30018.6 +1728 30020.1 +1729 30022.6 +1730 30023 +1731 30025.2 +1732 30025.7 +1733 30027.2 +1734 30028 +1735 30029.6 +1736 30030.7 +1737 30032.4 +1738 30033 +1739 30034.6 +1740 30037.8 +1741 30038.7 +1742 30039.3 +1743 30040 +1744 30040.6 +1745 30041.4 +1746 30044.1 +1747 30045.6 +1748 30045.9 +1749 30047.8 +1750 30049.2 +1751 30050 +1752 30051.4 +1753 30054.3 +1754 30054.8 +1755 30057.5 +1756 30059.5 +1757 30060.4 +1758 30060.8 +1759 30064.3 +1760 30066.1 +1761 30068.7 +1762 30070 +1763 30071.1 +1764 30072 +1765 30073.6 +1766 30074.4 +1767 30075.8 +1768 30078.3 +1769 30081.4 +1770 30082.7 +1771 30083 +1772 30086.4 +1773 30088.9 +1774 30091 +1775 30094 +1776 30095.7 +1777 30096.6 +1778 30099 +1779 30099.7 +1780 30102 +1781 30103 +1782 30103.9 +1783 30107.1 +1784 30109.8 +1785 30112.3 +1786 30115.5 +1787 30117.4 +1788 30118.9 +1789 30121.1 +1790 30122.8 +1791 30124 +1792 30126.3 +1793 30128.9 +1794 30130.6 +1795 30135.3 +1796 30136.6 +1797 30138.8 +1798 30140 +1799 30143.2 +1800 30146 +1801 30146.9 +1802 30149.2 +1803 30149.7 +1804 30153.1 +1805 30156.4 +1806 30158.9 +1807 30161.6 +1808 30166 +1809 30167.4 +1810 30168.1 +1811 30170 +1812 30173 +1813 30174.6 +1814 30178.2 +1815 30181.2 +1816 30183.9 +1817 30184.7 +1818 30186.4 +1819 30191 +1820 30193.3 +1821 30196.9 +1822 30198.4 +1823 30200.8 +1824 30204 +1825 30206.3 +1826 30209.1 +1827 30210.2 +1828 30212 +1829 30216.2 +1830 30220.5 +1831 30223.4 +1832 30225.3 +1833 30227.8 +1834 30229.5 +1835 30231.5 +1836 30235.5 +1837 30238.2 +1838 30241.4 +1839 30244.9 +1840 30248.4 +1841 30249.7 +1842 30250.8 +1843 30255.3 +1844 30257.9 +1845 30261 +1846 30265.8 +1847 30268.2 +1848 30270.2 +1849 30272 +1850 30274.9 +1851 30281.9 +1852 30282.7 +1853 30285.5 +1854 30288.1 +1855 30293.3 +1856 30294.9 +1857 30300 +1858 30302.8 +1859 30308.9 diff --git a/projects/braidingTightBinding/bin/main_braiding b/projects/braidingTightBinding/bin/main_braiding new file mode 100755 index 0000000000000000000000000000000000000000..0c7b9140900c8d3e643fccd497a1ec1bfb96f37c GIT binary patch literal 76780 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 F3;?q5`jP+u literal 0 HcmV?d00001 diff --git a/projects/braidingTightBinding/bin/main_braiding.cpp b/projects/braidingTightBinding/bin/main_braiding.cpp new file mode 100644 index 0000000..3573326 --- /dev/null +++ b/projects/braidingTightBinding/bin/main_braiding.cpp @@ -0,0 +1,86 @@ +#include <coupler.hpp> +#include <diagonalizer.hpp> +#include <driver.hpp> +#include <drum.hpp> +#include <force.hpp> +#include <grabber.hpp> +#include <lattice_generator.hpp> +#include <rk4_buffer.hpp> +#include <rk4_stepper.hpp> +#include <system.hpp> +#include <system_parameters.hpp> +#include <vec2.hpp> +#include <coupler_braid.hpp> +#include <driver_braid.hpp> +#include <drum_parameters_braid.hpp> +#include <drum_variables_braid.hpp> +#include <force_braid.hpp> +#include <matrix_element_calculator_braid.hpp> +#include <rbcomb_generator_braid.hpp> +#include <vortex.hpp> + +int main(){ + //shorthands + using value_t = double; + using params_t = DrumParametersBraid<value_t>; + using vars_t = DrumVariablesBraid<value_t>; + using buffer_t = RK4Buffer<value_t>; + using drum_t = Drum<value_t, params_t, vars_t, buffer_t>; + using coupler_t = CouplerBraid<value_t, drum_t, params_t>; + using driver_t = DriverBraid<value_t, drum_t>; + using sysparams_t = SystemParameters<coupler_t, driver_t>; + using force_t = ForceBraid<value_t, params_t, vars_t, buffer_t>; + using stepper_t = Rk4Stepper<value_t, params_t, vars_t, buffer_t, force_t>; + using generator_t = RbcombGeneratorBraid<value_t, params_t, vars_t, buffer_t>; + using grabber_t = Grabber<value_t, drum_t>; + using matelecalc_t = MatrixElementCalculatorBraid<value_t, params_t, vars_t, drum_t>; + using system_t = System<value_t, drum_t, grabber_t, sysparams_t, force_t, coupler_t, driver_t, stepper_t, matelecalc_t>; + using vortex_t = Vortex<value_t>; + using vec2_t = Vec2<value_t>; + + value_t k0 = 27388152213.022964; + value_t k1 = 493480220.0544679; + value_t k2 = 2467401100.2723393; + value_t c = 5.235987755982988; + + vortex_t vortex (vec2_t(17.,25.), 5., 1., 1., 1.); //as Eliska did it + std::vector<vortex_t> vortices ({vortex}); + + params_t drum_parameters (k0, k1, k2, c, vec2_t (0., 0.), 'A'); + generator_t lattice_generator (30,15); + auto lat_pair = lattice_generator(drum_parameters); + + //fix B site + for(auto d: lat_pair.first) + if(d.get_parameters().sublattice == 'B') + d.get_parameters().k0 = 21959869792.42382; + + sysparams_t system_parameters (coupler_t(vortices), driver_t(), lat_pair.second); + force_t force; + stepper_t stepper; + + //generate grabber + size_t save_every = 10; + std::string parameters_file = "PARAMS.TXT"; + std::string adjacency_file = "ADJACENCY.TXT"; + std::string dynamics_file = "DYNAMICS.TXT"; + grabber_t grabber (save_every, parameters_file, adjacency_file, dynamics_file); + + system_t system (1., 0.00001, lat_pair.first, stepper, force, system_parameters, grabber); + + //set up matrix element calculator + matelecalc_t mec; + + //set up diagonalizer + Diagonalizer diagonalizer; + //calculate eigenvalues + std::cout << "Getting matrix\n"; + std::vector<value_t> matrix = system.get_matrix(mec); + std::cout << "Diaging\n"; + std::vector<value_t> evals = diagonalizer.ev(system.get_matrix(mec), lat_pair.first.size()-1); + + for(size_t i = 0; i < evals.size(); ++i) + std::cout << i << " \t" << std::sqrt(evals[i])/(2.*M_PI) << std::endl; + + +} diff --git a/projects/braidingTightBinding/bin/plot_ev.py b/projects/braidingTightBinding/bin/plot_ev.py new file mode 100644 index 0000000..55b694a --- /dev/null +++ b/projects/braidingTightBinding/bin/plot_ev.py @@ -0,0 +1,17 @@ +import matplotlib.pyplot as plt +import numpy as np + +data = np.loadtxt('ev.txt') + +plt.plot(data[900:960,0],data[900:960,1],'o', ms=1) +plt.title("Frequency levels under vortex Kekule") +plt.xlabel("Level index") +plt.ylabel("Frequency [Hz]") +plt.savefig("Frequencies_zoomed.pdf", dpi = 500) + +plt.clf() +plt.plot(data[:,0],data[:,1],'o', ms=1) +plt.title("Frequency levels under vortex Kekule") +plt.xlabel("Level index") +plt.ylabel("Frequency [Hz]") +plt.savefig("Frequencies.pdf", dpi = 500) diff --git a/projects/braidingTightBinding/include/coupler_braid.hpp b/projects/braidingTightBinding/include/coupler_braid.hpp new file mode 100644 index 0000000..9408009 --- /dev/null +++ b/projects/braidingTightBinding/include/coupler_braid.hpp @@ -0,0 +1,57 @@ +#ifndef COUPLER_BRAID_HPP_INCLUDED +#define COUPLER_BRAID_HPP_INCLUDED +#include <vector> +#include <vortex.hpp> + +template <typename value_t, typename drum_t, typename params_t> +class CouplerBraid: public Coupler<value_t, drum_t>{ + public: + //constructors + CouplerBraid(const std::vector<Vortex<value_t> >& vortices): vortices_(vortices) {} + ~CouplerBraid() = default; + + void precompute(const value_t t_end, const value_t dt, const std::vector<drum_t>& drum_vec) noexcept final override + { + //we need the drum parameters later on, so extract it + params_.reserve(drum_vec.size()); + for(auto d: drum_vec) + params_.push_back(d.get_parameters()); + + //we also need the neighbour vectors nicely indexed + for(auto d: drum_vec){ + if(d.get_parameters().sublattice == 'A'){ + n_vecs_.push_back(d.get_parameters().s0); + n_vecs_.push_back(d.get_parameters().s1); + n_vecs_.push_back(d.get_parameters().s2); + break; + } + } + } + void step(value_t dt) noexcept final + { + //move vortices or alpha here + } + value_t operator()(const size_t drum_index, const size_t neighbour_index) const noexcept final override + { + Vec2<value_t> v = params_[drum_index].position; + Vec2<value_t> s = n_vecs_[neighbour_index]; + + //the formula is only valid on the 'A' sublattice + if(params_[drum_index].sublattice == 'B') + v = v - s; + + value_t ret_val = 1.; //vortices are multiplicative + for(auto tex: vortices_){ + ret_val *= tex(v, s); + } + + return 1. + ret_val; //return with added offset, as in eliska's code + } + + private: + std::vector<Vortex<value_t> > vortices_; + std::vector<params_t> params_; + std::vector<Vec2<value_t> > n_vecs_; +}; + +#endif diff --git a/projects/braidingTightBinding/include/driver_braid.hpp b/projects/braidingTightBinding/include/driver_braid.hpp new file mode 100644 index 0000000..e36a2ad --- /dev/null +++ b/projects/braidingTightBinding/include/driver_braid.hpp @@ -0,0 +1,27 @@ +#ifndef DRIVER_BRAID_HPP_INCLUDED +#define DRIVER_BRAID_HPP_INCLUDED +#include <vector> +#include <drum.hpp> + +template <typename value_t, typename drum_t> +class DriverBraid: public Driver<value_t, drum_t>{ + public: + //constructors + DriverBraid() = default; + ~DriverBraid() = default; + + void precompute(const value_t t_end, const value_t dt, const std::vector<drum_t>& drum_vec) noexcept final override + { + + } + void step(value_t dt) noexcept final + { + + } + value_t operator()(const size_t drum_index) const noexcept final override + { + return 0; + } +}; + +#endif diff --git a/projects/braidingTightBinding/include/drum_parameters_braid.hpp b/projects/braidingTightBinding/include/drum_parameters_braid.hpp new file mode 100644 index 0000000..7211663 --- /dev/null +++ b/projects/braidingTightBinding/include/drum_parameters_braid.hpp @@ -0,0 +1,65 @@ +#ifndef DRUM_PARAMETERS_BRAID_HPP_INCLUDED +#define DRUM_PARAMETERS_BRAID_HPP_INCLUDED +#include <vec2.hpp> +#include <cmath> +#include <iostream> + +//TODO: Create an interface. It would be a trivial one, though. +template <typename value_t> +class DrumParametersBraid{ + public: + /* Arguments: + * k0: diagonal matrix element + * k1: coupling matrix element prefactor 1 + * k2: coupling matrix element prefactor 2 + * c: damping coefficient + * position: position of the drum in real space + * sublattice: 'A'/'a' or 'B'/'b', identifies sublattice drum is part of + */ + DrumParametersBraid(const value_t k0, const value_t k1, const value_t k2, const value_t c, const Vec2<value_t>& position, char sublattice) noexcept + : k0(k0), k1(k1), k2(k2), c(c), position(position), sublattice(sublattice) + { + generate_sublattice(sublattice, value_t(1.)); + } + DrumParametersBraid() = delete; //no default initialization allowed + DrumParametersBraid(const DrumParametersBraid&) = default; + DrumParametersBraid& operator=(const DrumParametersBraid&) = default; + ~DrumParametersBraid() = default; + + private: + int generate_sublattice(char sublattice, value_t lc) noexcept{ + if(sublattice == 'A' or sublattice == 'a'){ + s0 = Vec2<value_t> (0, -lc); + s1 = Vec2<value_t> (-std::sqrt(3)*lc/2., lc/2.); + s2 = Vec2<value_t> (std::sqrt(3)*lc/2., lc/2.); + return 0; + } + else if(sublattice == 'B' or sublattice == 'b'){ + s0 = -1*(Vec2<value_t> (0, -lc)); + s1 = -1*(Vec2<value_t> (-std::sqrt(3)*lc/2., lc/2.)); + s2 = -1*(Vec2<value_t> (std::sqrt(3)*lc/2., lc/2.)); + return 0; + } + else + return -1; //invalid sublattice identifier + } + + public: + value_t k0; //onsite prefactor + value_t k1; //coupling prefactor 1 + value_t k2; //coupling prefactor 2 + value_t c; //damping coefficient + char sublattice; //sublattice the drum is part of (governs electrode geometry) + Vec2<value_t> s0, s1, s2; //vectors connecting to neighbours, ordered according to drum.hpp + Vec2<value_t> position; //position of the drum in real space + +}; + +template<typename value_t> +std::ostream& operator<<(std::ostream& os, const DrumParametersBraid<value_t>& dp) +{ + return os << "Sublattice: " << dp.sublattice << ", k0: " << dp.k0 << ", k1: " << dp.k1 << ", k2: " << dp.k2 << std::endl << "s0: " << dp.s0 << ", s1: " << dp.s1 << ", s2: " << dp.s2; + +} + +#endif diff --git a/projects/braidingTightBinding/include/drum_variables_braid.hpp b/projects/braidingTightBinding/include/drum_variables_braid.hpp new file mode 100644 index 0000000..d8a7170 --- /dev/null +++ b/projects/braidingTightBinding/include/drum_variables_braid.hpp @@ -0,0 +1,23 @@ +#ifndef DRUM_VARIABLES_BRAID_HPP_INCLUDED +#define DRUM_VARIABLES_BRAID_HPP_INCLUDED + +/* + * Stores all dynamic variables of a drum + */ + +//TODO: Generate an interface. It would be trivial, though. +template <typename value_t> +class DrumVariablesBraid{ + public: + //constructors + DrumVariablesBraid() = default; + DrumVariablesBraid& operator=(const DrumVariablesBraid&) = default; + ~DrumVariablesBraid() = default; + + value_t t0, t1, t2; //t + dt, i.e. baseline plus vortices along bond 0,1,2 + value_t V; //Coupling to central electrode + value_t x, xdot; //Current Elongation (position) and velocity + value_t x_temp, xdot_temp; //used as calculation arguments in rk steps +}; + +#endif diff --git a/projects/braidingTightBinding/include/force_braid.hpp b/projects/braidingTightBinding/include/force_braid.hpp new file mode 100644 index 0000000..6274813 --- /dev/null +++ b/projects/braidingTightBinding/include/force_braid.hpp @@ -0,0 +1,44 @@ +#ifndef FORCE_BRAID_HPP_INCLUDED +#define FORCE_BRAID_HPP_INDLUDED +#include <force.hpp> +#include <drum_parameters_braid.hpp> +#include <drum_variables_braid.hpp> +#include <drum.hpp> + +//This force is to be used with params_t = DrumParametersBraid, vars_t = DrumVariablesBraid. + +template <typename value_t, typename params_t, typename vars_t, typename buffer_t> +class ForceBraid: public Force<value_t, params_t, vars_t, buffer_t>{ + public: + ForceBraid() = default; + ~ForceBraid() = default; + + value_t operator()( + const Drum<value_t, params_t, vars_t, buffer_t>& drum, //Drum we're calculating the force on + const Drum<value_t, params_t, vars_t, buffer_t>& neighbour0, //Neighbour 0 + const Drum<value_t, params_t, vars_t, buffer_t>& neighbour1, //Neighbour 1 + const Drum<value_t, params_t, vars_t, buffer_t>& neighbour2, //Neighbour 2 + const value_t time) const noexcept final override + { + //fetch data + //note that no copying is done here, these are all references + //TODO: implement drive + const params_t& drum_params = drum.get_parameters(); //parameters of drum + const vars_t& drum_vars = drum.get_variables(); //variables of drum + const vars_t& n0_vars = neighbour0.get_variables(); //variables of neighbour 0 + const vars_t& n1_vars = neighbour1.get_variables(); //variables of neighbour 1 + const vars_t& n2_vars = neighbour2.get_variables(); //variables of neighbour 2 + + value_t part1 = - drum_params.k0 * drum_vars.x_temp; + value_t part2 = - drum_params.c * drum_vars.xdot_temp; + value_t part3 = 0.; + part3 -= drum_params.k1 + drum_params.k2 * n0_vars.t0 * n0_vars.x_temp; + part3 -= drum_params.k1 + drum_params.k2 * n1_vars.t1 * n1_vars.x_temp; + part3 -= drum_params.k1 + drum_params.k2 * n2_vars.t2 * n2_vars.x_temp; + + return part1 + part2 + part3; + } +}; + + +#endif diff --git a/projects/braidingTightBinding/include/matrix_element_calculator_braid.hpp b/projects/braidingTightBinding/include/matrix_element_calculator_braid.hpp new file mode 100644 index 0000000..e094551 --- /dev/null +++ b/projects/braidingTightBinding/include/matrix_element_calculator_braid.hpp @@ -0,0 +1,35 @@ +#ifndef MATRIX_ELEMENT_CALCULATOR_BRAID_HPP_INCLUDED +#define MATRIX_ELEMENT_CALCULATOR_BRAID_HPP_INCLUDED +#include <matrix_element_calculator.hpp> + +template <typename value_t, typename params_t, typename vars_t, typename drum_t> +class MatrixElementCalculatorBraid: public MatrixElementCalculator<value_t, params_t, vars_t, drum_t>{ + public: + MatrixElementCalculatorBraid() = default; + ~MatrixElementCalculatorBraid() = default; + + //diagonal element at (index, index) + value_t operator()(const size_t index, const std::vector<drum_t>& drums) const noexcept final override + { + return drums[index].get_parameters().k0; + } + + //coupling elements at (index1, index2) + //for neighbour 0 + value_t operator()(const size_t index1, const size_t index2, const std::vector<drum_t>& drums) const noexcept final override + { + return drums[index1].get_parameters().k1 + drums[index1].get_parameters().k2 * drums[index2].get_variables().t0; + } + //for neighbour 1 + value_t operator()(const size_t index1, const size_t index2, const std::vector<drum_t>& drums, const int) const noexcept final override + { + return drums[index1].get_parameters().k1 + drums[index1].get_parameters().k2 * drums[index2].get_variables().t1; + } + //for neighbour 2 + value_t operator()(const size_t index1, const size_t index2, const std::vector<drum_t>& drums, const int, const int) const noexcept final override + { + return drums[index1].get_parameters().k1 + drums[index1].get_parameters().k2 * drums[index2].get_variables().t2; + } +}; + +#endif diff --git a/projects/braidingTightBinding/include/rbcomb_generator_braid.hpp b/projects/braidingTightBinding/include/rbcomb_generator_braid.hpp new file mode 100644 index 0000000..761ec39 --- /dev/null +++ b/projects/braidingTightBinding/include/rbcomb_generator_braid.hpp @@ -0,0 +1,301 @@ +#ifndef RBCOMB_GENERATOR_BRAID_HPP_INCLUDED +#define RBCOMB_GENERATOR_BRAID_HPP_INCLUDED +#include <lattice_generator.hpp> +#include <vec2.hpp> +#include <utility> +#include <vector> + +template <typename value_t, typename params_t, typename vars_t, typename sbuffer_t> +class RbcombGeneratorBraid: public LatticeGenerator<value_t, params_t, vars_t, sbuffer_t> { + public: + RbcombGeneratorBraid(size_t x_extent, size_t y_extent) noexcept : x_extent_(x_extent), y_extent_(y_extent) {} + RbcombGeneratorBraid() = delete; + ~RbcombGeneratorBraid() = default; + + //the params_t argument shall contain the position of the first drum that is placed. + //the last drum (return.first.back()) signifies inexistent neighbours, it is not part of the lattice. + //It shall be of sublattice 'A'. + std::pair<std::vector<Drum<value_t, params_t, vars_t, sbuffer_t> >, std::vector<std::vector<int> > > + operator()(const params_t& drum_params) noexcept final override + { + using drum_t = Drum<value_t, params_t, vars_t, sbuffer_t>; + std::vector<drum_t> current_line, next_line; + current_line.reserve(x_extent_); + next_line.reserve(x_extent_); + + //calculate vectors to next drums + Vec2<value_t> vec_right = drum_params.s2 - drum_params.s1; //drum to the right in same row + Vec2<value_t> vec_down = drum_params.s0; //drum below + Vec2<value_t> vec_upleft = drum_params.s1; //drum at top left + Vec2<value_t> vec_upright = drum_params.s2; //drum at top right + + //prepare memory + drums_.reserve(x_extent_); + adjacency_vector_.reserve(x_extent_); + //push first drum + drums_.push_back(drum_t(drum_params)); + adjacency_vector_.push_back(std::vector<int>(3,-1)); //initialized with 'no neighbour here' + + //initialize the first line to bootstrap the algorithm + for(size_t i = 1; i < x_extent_; ++i){ + params_t new_params (drum_params); + new_params.position = drums_.back().get_parameters().position + vec_right; + drums_.push_back(drum_t(new_params)); + adjacency_vector_.push_back(std::vector<int>(3,-1)); + } + + //add y_extent_ inequivalent hexagon rows + for(size_t i = 0; i < y_extent_; ++i){ + generate_layer(vec_down, vec_upleft, vec_upright); + } + + //push a drum to the end that has no neighbours and signifies the inexistent neighbour + drums_.push_back(drum_t(drum_params)); + adjacency_vector_.push_back(std::vector<int>(3,-1)); + //make no-neighbours point here + for(size_t i = 0; i < adjacency_vector_.size()-1; ++i){ + for(size_t j = 0; j < 3; ++j){ + if(adjacency_vector_[i][j] == -1){ + adjacency_vector_[i][j] = drums_.size()-1; + } + } + } + + /* Deploy without consistency check + if(check_consistency() == false) + std::cout << "INCONSISTENT LATTICE DETECTED!\n"; + */ + + return std::pair<std::vector<drum_t>, std::vector<std::vector<int> > > (drums_, adjacency_vector_); + } + + private: + //check if there exists a drum in drum_vec that is close to drum_pos. + //returns the index of the first close drum or -1. + int find_close( + const Vec2<value_t>& drum_pos, + const std::vector<Drum<value_t, params_t, vars_t, sbuffer_t> >& drum_vec) const noexcept + { + for(int i = 0; i < drum_vec.size(); ++i){ + auto test_drum = drum_vec[i]; + if(test_drum.get_parameters().position.r_wrt(drum_pos) < 1.e-8) + return i; + } + return -1; //no close drum found + } + + //checks sanity of generated lattice + //returns true if lattice passed the test + bool check_consistency() noexcept + { + //check for duplicate drums + for(size_t i = 0; i < drums_.size(); ++i){ + if(i != find_close(drums_[i].get_parameters().position, drums_)) + return false; + } + return true; + } + + //arguments are the neighbour vectors down, upleft, upright. + //adds a new layer of drums to drums_, filling in the adjency_vector_ as well. + // + // 4: | x_extent_ drums + // 3: \/ x_extent_ + 1 drums + // 2: | x_extent_ + 1 drums + // 1: \/ x_extent_ drums + void generate_layer(const Vec2<value_t>& v_d, const Vec2<value_t>& v_ul, const Vec2<value_t>& v_ur) noexcept + { + //shorten syntax + using drum_t = Drum<value_t, params_t, vars_t, sbuffer_t>; + + //prepare vector to hold new row + std::vector<drum_t> new_row; + new_row.reserve(x_extent_); + + //prepare parameter templates for both sublattices + params_t params_A(drums_[0].get_parameters()); //first drum will always be of sublattice 'A' + params_t params_B(params_A.k0, params_A.k1, params_A.k2, params_A.c, params_A.position, 'B'); //generate sublattice 'B' type of parameters + + //row 1 + //prepare iterator + auto drum_it = drums_.end(); + drum_it -= x_extent_; + + while(drum_it != drums_.end()){ + Vec2<value_t> new_pos1 = drum_it->get_parameters().position + v_ul; + Vec2<value_t> new_pos2 = drum_it->get_parameters().position + v_ur; + + //see if these drums already exist and add them to the list + int index_1 = find_close(new_pos1, new_row); + if(index_1 == -1){ //not in there yet, so push it + params_t new_params (params_B); + new_params.position = new_pos1; + new_row.push_back(drum_t(new_params)); + index_1 = drums_.size()+new_row.size()-1; + //make adjacency vector longer + adjacency_vector_.push_back(std::vector<int>(3,-1)); + } + else + index_1 += drums_.size(); + int index_2 = find_close(new_pos2, new_row); + if(index_2 == -1){ //not in there yet, so push it + params_t new_params (params_B); + new_params.position = new_pos2; + new_row.push_back(drum_t(new_params)); + index_2 = drums_.size()+new_row.size()-1; + //make adjacency vector longer + adjacency_vector_.push_back(std::vector<int>(3,-1)); + } + else + index_2 += drums_.size(); + + //add new bonds to the adjacency vector + int old_index = std::distance(drums_.begin(), drum_it); + adjacency_vector_[old_index][1] = index_1; + adjacency_vector_[old_index][2] = index_2; + adjacency_vector_[index_1][1] = old_index; + adjacency_vector_[index_2][2] = old_index; + + ++drum_it; + } + + //push new drums + for(auto d: new_row) + drums_.push_back(d); + + //clear new_row + new_row.clear(); + + //row 2 + //prepare iterator + drum_it = drums_.end(); + drum_it -= static_cast<int>(x_extent_ + 1); //this row has one drum more + + while(drum_it != drums_.end()){ + //These drums are guaranteed to be unique, hence inexistent. + params_t new_params (params_A); + new_params.position = drum_it->get_parameters().position - v_d; + new_row.push_back(drum_t(new_params)); + int index = drums_.size() + new_row.size() - 1; + adjacency_vector_.push_back(std::vector<int>(3,-1)); + + int old_index = std::distance(drums_.begin(), drum_it); + adjacency_vector_[old_index][0] = index; + adjacency_vector_[index][0] = old_index; + + ++drum_it; + } + + //push new drums + for(auto d: new_row) + drums_.push_back(d); + + //clear new_row + new_row.clear(); + + //row 3 + drum_it = drums_.end(); + drum_it -= static_cast<int>(x_extent_ + 1); //this row has one drum more + + //first drum is special (only goes to ur) + params_t new_params (params_B); + new_params.position = drum_it->get_parameters().position + v_ur; + new_row.push_back(drum_t(new_params)); + int indexx = drums_.size(); + adjacency_vector_.push_back(std::vector<int>(3,-1)); + int old_indexx = std::distance(drums_.begin(), drum_it); //avoid naming conflicts + adjacency_vector_[old_indexx][2] = indexx; + adjacency_vector_[indexx][2] = old_indexx; + ++drum_it; + + + //make an iterator that points to the last element + auto it_last_element = drums_.end(); + --it_last_element; + + //now the unspecial ones + while(drum_it != it_last_element){ + Vec2<value_t> new_pos1 = drum_it->get_parameters().position + v_ul; + Vec2<value_t> new_pos2 = drum_it->get_parameters().position + v_ur; + + //see if these drums already exist and add them to the list + int index_1 = find_close(new_pos1, new_row); + if(index_1 == -1){ //not in there yet, so push it + params_t new_params (params_B); + new_params.position = new_pos1; + new_row.push_back(drum_t(new_params)); + index_1 = drums_.size()+new_row.size()-1; + //make adjacency vector longer + adjacency_vector_.push_back(std::vector<int>(3,-1)); + } + else + index_1 += drums_.size(); + int index_2 = find_close(new_pos2, new_row); + if(index_2 == -1){ //not in there yet, so push it + params_t new_params (params_B); + new_params.position = new_pos2; + new_row.push_back(drum_t(new_params)); + index_2 = drums_.size()+new_row.size()-1; + //make adjacency vector longer + adjacency_vector_.push_back(std::vector<int>(3,-1)); + } + else + index_2 += drums_.size(); + + //add new bonds to the adjacency vector + int old_index = std::distance(drums_.begin(), drum_it); + adjacency_vector_[old_index][1] = index_1; + adjacency_vector_[old_index][2] = index_2; + adjacency_vector_[index_1][1] = old_index; + adjacency_vector_[index_2][2] = old_index; + + ++drum_it; + } + + //the last drum is special too (only goes to ul, which already exists. only update adjacency.) + adjacency_vector_.back()[1] = drums_.size() - 1; + adjacency_vector_[drums_.size() - 1][1] = drums_.size() + new_row.size() - 1; + + //push new drums + for(auto d: new_row) + drums_.push_back(d); + + //clear new_row + new_row.clear(); + + + + //row 4 + //prepare iterator + drum_it = drums_.end(); + drum_it -= static_cast<int>(x_extent_); + + while(drum_it != drums_.end()){ + //These drums are guaranteed to be unique, hence inexistent. + params_t new_params (params_A); + new_params.position = drum_it->get_parameters().position - v_d; + new_row.push_back(drum_t(new_params)); + int index = drums_.size() + new_row.size() - 1; + adjacency_vector_.push_back(std::vector<int>(3,-1)); + + int old_index = std::distance(drums_.begin(), drum_it); + adjacency_vector_[old_index][0] = index; + adjacency_vector_[index][0] = old_index; + + ++drum_it; + } + + //push new drums + for(auto d: new_row) + drums_.push_back(d); + + //clear new_row + new_row.clear(); + } + + size_t x_extent_, y_extent_; //Number of equivalent hexagon rows in x and y direction + std::vector<Drum<value_t, params_t, vars_t, sbuffer_t> > drums_; + std::vector<std::vector<int> > adjacency_vector_; +}; + +#endif diff --git a/projects/braidingTightBinding/include/vortex.hpp b/projects/braidingTightBinding/include/vortex.hpp new file mode 100644 index 0000000..196e2c1 --- /dev/null +++ b/projects/braidingTightBinding/include/vortex.hpp @@ -0,0 +1,46 @@ +#ifndef VORTEX_HPP_INCLUDED +#define VORTEX_HPP_INCLUDED +#include <vec2.hpp> +#include <cmath> + +template <typename value_t> +class Vortex{ + public: + //constructors + Vortex(const Vec2<value_t> position, const value_t l0, const value_t alpha, const value_t delta, const value_t a) noexcept: position_(position), l0_(l0), alpha_(alpha), delta_(delta), K_(value_t(4.*3.141592653589793/(3.*std::sqrt(3)*a)), value_t(0.)) {} + Vortex(const Vec2<value_t> position, const Vortex& o) noexcept: position_(position), l0_(o.l0_), alpha_(o.alpha_), delta_(o.delta_), K_(o.K_) {} + Vortex() = default; + Vortex(const Vortex&) = default; + Vortex& operator=(const Vortex&) = default; + ~Vortex() = default; + + //access + value_t l0() const noexcept { return l0_; } + value_t alpha() const noexcept { return alpha_; } + value_t delta() const noexcept { return delta_; } + Vec2<value_t>& position() noexcept { return position_; } + const Vec2<value_t>& position() const noexcept { return position_; } + + //modifiers + void set_l0(value_t l0) noexcept { l0_ = l0; } + void set_alpha(value_t alpha) noexcept { alpha_ = alpha; } + void set_delta(value_t delta) noexcept { delta_ = delta; } + void set_position(const Vec2<value_t>& position) noexcept { position_ = position; } + void move_by(const Vec2<value_t>& translation) noexcept { position_ += translation; } + void move_to(const Vec2<value_t>& position) noexcept { position_ = position; } + + //functional + //there is no divide_by_zero check for efficiency reasons. l0_ can not be zero upon call. + value_t operator()(const Vec2<value_t>& v, const Vec2<value_t>& s) + { + value_t prefactor = delta_*std::tanh(v.r_wrt(position_)/l0_); + value_t cosine = std::cos(alpha_ - v.phi_wrt(position_) + K_*(s + 2.*(v - position_))); + return prefactor*cosine; + } + private: + Vec2<value_t> position_; + const Vec2<value_t> K_; + value_t l0_, alpha_, delta_; +}; + +#endif diff --git a/projects/braidingTightBinding/lib/coupler.hpp b/projects/braidingTightBinding/lib/coupler.hpp new file mode 100644 index 0000000..ed35420 --- /dev/null +++ b/projects/braidingTightBinding/lib/coupler.hpp @@ -0,0 +1,17 @@ +#ifndef COUPLER_HPP_INCLUDED +#define COUPLER_HPP_INCLUDED +#include <vector> + +template <typename value_t, typename drum_t> +class Coupler{ + public: + //constructors + Coupler() = default; + ~Coupler() = default; + + virtual void precompute(const value_t t_end, const value_t dt, const std::vector<drum_t>& drum_vec) noexcept = 0; + virtual void step(value_t dt) noexcept = 0; + virtual value_t operator()(const size_t drum_index, const size_t neighbour_index) const noexcept = 0; +}; + +#endif diff --git a/projects/braidingTightBinding/lib/diagonalizer.hpp b/projects/braidingTightBinding/lib/diagonalizer.hpp new file mode 100644 index 0000000..5d5a856 --- /dev/null +++ b/projects/braidingTightBinding/lib/diagonalizer.hpp @@ -0,0 +1,90 @@ +#ifndef DIAGONALIZER_HPP_INCLUDED +#define DIAGONALIZER_HPP_INCLUDED +#include <vector> +#include <iostream> + +extern "C" void dsyev_( + char const & JOBZ, // 'N': Only eigenvalues, 'V': Eigenvalues and -vectors + char const & UPLO, // 'U': Upper triangular, 'V': Lower triangular + int const & N, // Matrix order + double * A, // Matrix and Eigenvector output + int const & LDA, // Matrix order (for my purposes) + double * W, // Eigenvalue output + double * WORK, // Workspace + int const & LWORK, // Size of workspace + int & INFO // Info + ); + +//TODO: Rule of 7 conformity (nontrivial heap resource) +class Diagonalizer{ + public: + Diagonalizer() = default; + ~Diagonalizer() { delete[] work_; } + + std::vector<double> ev(const std::vector<double>& matrix, const size_t N){ + //prepare memory + matrix_ = matrix; + if(eigenvalues_.size() != N){ + eigenvalues_.clear(); + eigenvalues_.reserve(N - eigenvalues_.capacity()); + } + for(size_t i = 0; i < N; ++i) + eigenvalues_.push_back(0.); + + //prepare workspace if not done yet + if(N != N_ || dwork_ == 0.){ + N_ = N; + prepare_workspace('N'); + } + + dsyev_('N', 'L', N_, matrix_.data(), N_, eigenvalues_.data(), work_, lwork_, info_); + + if(info_ != 0) + throw("Diagonalization failed!"); + + return eigenvalues_; + } + + std::pair<std::vector<double>, std::vector<double> > evv(const std::vector<double>& matrix, const size_t N){ + //prepare memory + matrix_.clear(); + matrix_.reserve(N*N - matrix_.capacity()); + matrix_ = matrix; + if(eigenvalues_.size() != N) + eigenvalues_.clear(); + eigenvalues_.reserve(N - eigenvalues_.capacity()); + for(size_t i = 0; i < N; ++i) + eigenvalues_.push_back(0.); + + //prepare workspace if not done yet + if(dwork_ == 0.){ + N_ = N; + prepare_workspace('V'); + } + + dsyev_('V', 'L', N_, matrix_.data(), N_, eigenvalues_.data(), work_, lwork_, info_); + + if(info_ != 0) + throw("Diagonalization failed!"); + + return std::pair<std::vector<double>, std::vector<double> > (eigenvalues_, matrix_); + } + + private: + void prepare_workspace(char type){ + dsyev_(type, 'L', N_, matrix_.data(), N_, eigenvalues_.data(), &dwork_, -1, info_); + lwork_ = static_cast<int>(dwork_); + std::cout << "Allocating " << lwork_ << " doubles\n"; + work_ = new double[lwork_]; + } + + int info_; + double dwork_; + int lwork_; + int N_; //linear matrix dimension + std::vector<double> matrix_; //the matrix + std::vector<double> eigenvalues_; //eigenvalues + double* work_; +}; + +#endif diff --git a/projects/braidingTightBinding/lib/driver.hpp b/projects/braidingTightBinding/lib/driver.hpp new file mode 100644 index 0000000..b1d4217 --- /dev/null +++ b/projects/braidingTightBinding/lib/driver.hpp @@ -0,0 +1,18 @@ +#ifndef DRIVER_HPP_INCLUDED +#define DRIVER_HPP_INCLUDED +#include <vector> +#include <drum.hpp> + +template <typename value_t, typename drum_t> +class Driver{ + public: + //constructors + Driver() = default; + ~Driver() = default; + + virtual void precompute(const value_t t_end, const value_t dt, const std::vector<drum_t>& drum_vec) noexcept = 0; + virtual void step(value_t dt) noexcept = 0; + virtual value_t operator()(const size_t drum_index) const noexcept = 0; +}; + +#endif diff --git a/projects/braidingTightBinding/lib/drum.hpp b/projects/braidingTightBinding/lib/drum.hpp new file mode 100644 index 0000000..ee5f3f7 --- /dev/null +++ b/projects/braidingTightBinding/lib/drum.hpp @@ -0,0 +1,76 @@ +#ifndef DRUM_HPP_INCLUDED +#define DRUM_HPP_INCLUDED +#include <cmath> + +/* Neighbour enumeration: + * For drums in sublattice 'A', neighbour 0 is straight down, then clockwise. + * For drums in sublattice 'B', neighbour 0 is straight up, then clockwise. + * Hence neighbouring drums see each other as the same number neighbour. + */ + +template <typename value_t, typename params_t, typename vars_t, typename sbuffer_t> +class Drum{ + public: + //'structors + Drum(const params_t& dp) noexcept: params_(dp) {} + Drum() = delete; //default construction not allowed + Drum(const Drum&) = default; + Drum& operator=(const Drum&) = default; + ~Drum() = default; + + //access + params_t& get_parameters() noexcept + { + return params_; + } + + const params_t& get_parameters() const noexcept + { + return params_; + } + + vars_t& get_variables() noexcept + { + return vars_; + } + + const vars_t& get_variables() const noexcept + { + return vars_; + } + + sbuffer_t& get_sbuffer() noexcept + { + return sbuffer_; + } + + const sbuffer_t& get_sbuffer() const noexcept + { + return sbuffer_; + } + + //modifiers + void set_coupling_0(value_t t0) + { + vars_.t0 = t0; + } + void set_coupling_1(value_t t1) + { + vars_.t1 = t1; + } + void set_coupling_2(value_t t2) + { + vars_.t2 = t2; + } + void set_drive(value_t V) + { + vars_.V = V; + } + + private: + params_t params_; // constant drum parameters + vars_t vars_; // drum variables + sbuffer_t sbuffer_; //stepper buffer +}; + +#endif diff --git a/projects/braidingTightBinding/lib/force.hpp b/projects/braidingTightBinding/lib/force.hpp new file mode 100644 index 0000000..094fffc --- /dev/null +++ b/projects/braidingTightBinding/lib/force.hpp @@ -0,0 +1,22 @@ +#ifndef FORCE_HPP_INCLUDED +#define FORCE_HPP_INCLUDED +#include <drum.hpp> + +//Force evaluation interface +template <typename value_t, typename params_t, typename vars_t, typename buffer_t> +class Force{ + public: + //constructors + Force() = default; + ~Force() = default; + + //virtual functional + virtual value_t operator()( + const Drum<value_t, params_t, vars_t, buffer_t>& drum, //Drum we're calculating the force on + const Drum<value_t, params_t, vars_t, buffer_t>& neighbour0, //Neighbour 0 + const Drum<value_t, params_t, vars_t, buffer_t>& neighbour1, //Neighbour 1 + const Drum<value_t, params_t, vars_t, buffer_t>& neighbour2, //Neighbour 2 + const value_t time) const noexcept = 0; +}; + +#endif diff --git a/projects/braidingTightBinding/lib/grabber.hpp b/projects/braidingTightBinding/lib/grabber.hpp new file mode 100644 index 0000000..911bd48 --- /dev/null +++ b/projects/braidingTightBinding/lib/grabber.hpp @@ -0,0 +1,143 @@ +#ifndef GRABBER_HPP_INCLUDED +#define GRABBER_HPP_INCLUDED +#include <vector> +#include <list> +#include <fstream> +#include <string> + +template<typename value_t> +struct DataStorage{ + DataStorage(const size_t num_drums) + { + x.reserve(num_drums); + xdot.reserve(num_drums); + t0.reserve(num_drums); + t1.reserve(num_drums); + t2.reserve(num_drums); + drive.reserve(num_drums); + } + + ~DataStorage() = default; + + value_t time; + std::vector<value_t> x; + std::vector<value_t> xdot; + std::vector<value_t> t0; + std::vector<value_t> t1; + std::vector<value_t> t2; + std::vector<value_t> drive; +}; + +template <typename value_t, typename drum_t> +class Grabber{ + public: + Grabber(const size_t grab_every, const std::string params_file, const std::string adjacency_file, const std::string dynamic_file) + : grab_every_(grab_every), grab_cnt_(0), par_f_(params_file), adj_f_(adjacency_file), dyn_f_(dynamic_file) {} + Grabber() = delete; //no default initialization + Grabber(const Grabber&) = default; + ~Grabber() = default; + + //call in system constructor + void init(const value_t t_end, const value_t dt, const std::vector<drum_t>& drums, const std::vector<std::vector<int> >& adjacency) noexcept + { + drums_ = drums; + adjacency_ = adjacency; + t_end_ = t_end; + dt_ = dt; + } + + //call after each simulation step, checks itself if it should save + bool grab(const std::vector<drum_t>& drums, const value_t time) + { + if(grab_cnt_++ % grab_every_ == 0){ + data_.push_back(DataStorage<value_t>(drums_.size())); + data_.back().time = time; + for(auto d: drums){ + data_.back().x.push_back(d.get_variables().x); + data_.back().xdot.push_back(d.get_variables().xdot); + data_.back().t0.push_back(d.get_variables().t0); + data_.back().t1.push_back(d.get_variables().t1); + data_.back().t2.push_back(d.get_variables().t2); + data_.back().drive.push_back(d.get_variables().V); + } + return true; + } + else + return false; + } + + //prints the data out. call at end of it all. + bool save(){ + //TODO: Check for file open + //TODO: Overload operator<< for DrumParameters and DataStorage. + //print parameters + std::fstream par (par_f_, par.out); + par << "# The last drum is to be ignored\n"; + par << "# a \t c \t f \t m \t Q \t gap \t coulomb_pref \t pos_x \t pos_y \t sublattice\n"; + for(auto d: drums_){ + par << d.get_parameters().a << " \t"; + par << d.get_parameters().c << " \t"; + par << d.get_parameters().f << " \t"; + par << d.get_parameters().m << " \t"; + par << d.get_parameters().Q << " \t"; + par << d.get_parameters().gap << " \t"; + par << d.get_parameters().coulomb_prefactor << " \t"; + par << d.get_parameters().position.x() << " \t"; + par << d.get_parameters().position.y() << " \t"; + par << d.get_parameters().sublattice << "\n"; + } + par.close(); + + //print adjacency vectors + std::fstream adj (adj_f_, adj.out); + adj << "# <-1> means <no neighbour here>\n"; + adj << "# The last drum is to be ignored\n"; + adj << "# n0 \t n1 \t n2\n"; + for(auto v: adjacency_){ + for(auto i: v){ + if(i == drums_.size()-1) + adj << -1 << " \t"; //no neighbour present + else + adj << i << " \t"; //neighbour + } + adj << "\n"; + } + adj.close(); + + std::fstream dyn (dyn_f_, dyn.out); + dyn << "# If adjacency of a bond is -1 in " << adj_f_; + dyn << ", the coupling is to be ignored\n"; + dyn << "# The last drum is to be ignored\n"; + dyn << "# Number of drums : " << drums_.size() << "\n"; + dyn << "# t \t drum_index \t x \t xdot \t t0 \t t1 \t t2 \t drive\n"; + for(auto entry: data_){ + for(size_t i = 0; i < entry.x.size(); ++i){ + dyn << entry.time << " \t"; + dyn << i << " \t"; + dyn << entry.x[i] << " \t"; + dyn << entry.xdot[i] << " \t"; + dyn << entry.t0[i] << " \t"; + dyn << entry.t1[i] << " \t"; + dyn << entry.t2[i] << " \t"; + dyn << entry.drive[i] << "\n"; + } + } + dyn.close(); + + return true; + } + + private: + size_t grab_every_; //grab data every grab_every_ steps + size_t grab_cnt_; //grab count + value_t t_end_, dt_; //maximal simulation time and timestep + std::vector<std::vector<int> > adjacency_; //adjacency vector + std::vector<drum_t> drums_; //drums in initial configuration, grab params from here + std::list<DataStorage<value_t> > data_; //here goes the dynamical data + //filenames + std::string par_f_; //parameters file + std::string adj_f_; //adjacency file + std::string dyn_f_; //dynamics file (this is the gold) +}; + +#endif diff --git a/projects/braidingTightBinding/lib/lattice_generator.hpp b/projects/braidingTightBinding/lib/lattice_generator.hpp new file mode 100644 index 0000000..20819df --- /dev/null +++ b/projects/braidingTightBinding/lib/lattice_generator.hpp @@ -0,0 +1,20 @@ +#ifndef LATTICE_GENERATOR_HPP_INCLUDED +#define LATTICE_GENERATOR_HPP_INCLUDED +#include <utility> +#include <vector> +#include <drum.hpp> + +template <typename value_t, typename params_t, typename vars_t, typename sbuffer_t> +class LatticeGenerator{ + public: + LatticeGenerator() = default; + ~LatticeGenerator() = default; + + //returns a std::pair of a std::vector of drums in the system and an adjacency vector of size_t. + //the last drum (.back()) is the drum seen when no neighbour is present. + //TODO: later, overload with a vector of drum parameters to set each drum's properties individually + virtual std::pair<std::vector<Drum<value_t, params_t, vars_t, sbuffer_t> >, std::vector<std::vector<int> > > + operator()(const params_t&) noexcept = 0; +}; + +#endif diff --git a/projects/braidingTightBinding/lib/matrix_element_calculator.hpp b/projects/braidingTightBinding/lib/matrix_element_calculator.hpp new file mode 100644 index 0000000..05aaa4b --- /dev/null +++ b/projects/braidingTightBinding/lib/matrix_element_calculator.hpp @@ -0,0 +1,21 @@ +#ifndef MATRIX_ELEMENT_CALCULATOR_HPP_INCLUDED +#define MATRIX_ELEMENT_CALCULATOR_HPP_INCLUDED + +template <typename value_t, typename params_t, typename vars_t, typename drum_t> +class MatrixElementCalculator{ + public: + MatrixElementCalculator() = default; + ~MatrixElementCalculator() = default; + + //diagonal element at (index, index) + virtual value_t operator()(const size_t index, const std::vector<drum_t>& drums) const noexcept = 0; + //coupling elements at (index1, index2) + //for neighbour 0 + virtual value_t operator()(const size_t index1, const size_t index2, const std::vector<drum_t>& drums) const noexcept = 0; + //for neighbour 1 + virtual value_t operator()(const size_t index1, const size_t index2, const std::vector<drum_t>& drums, const int) const noexcept = 0; + //for neighbour 2 + virtual value_t operator()(const size_t index1, const size_t index2, const std::vector<drum_t>& drums, const int, const int) const noexcept = 0; +}; + +#endif diff --git a/projects/braidingTightBinding/lib/rk4_buffer.hpp b/projects/braidingTightBinding/lib/rk4_buffer.hpp new file mode 100644 index 0000000..5e46622 --- /dev/null +++ b/projects/braidingTightBinding/lib/rk4_buffer.hpp @@ -0,0 +1,16 @@ +#ifndef RK4_BUFFER_HPP_INCLUDED +#define RK4_BUFFER_HPP_INCLUDED + +template <typename value_t> +class RK4Buffer{ + public: + RK4Buffer() = default; + ~RK4Buffer() = default; + + public: + value_t k1, k2, k3, k4; //for velocity + value_t l1, l2, l3, l4; //for position + +}; + +#endif diff --git a/projects/braidingTightBinding/lib/rk4_stepper.hpp b/projects/braidingTightBinding/lib/rk4_stepper.hpp new file mode 100644 index 0000000..1951a33 --- /dev/null +++ b/projects/braidingTightBinding/lib/rk4_stepper.hpp @@ -0,0 +1,95 @@ +#ifndef RK4_STEPPER_HPP_INCLUDED +#define RK4_STEPPER_HPP_INCLUDED + +template <typename value_t, typename params_t, typename vars_t, typename buffer_t, + typename force_t> +class Rk4Stepper{ + public: + Rk4Stepper() = default; + ~Rk4Stepper() = default; + + //time signifies the state of the system, i.e. the time when the complete step was started. + //operations performed at t + void step_1(const force_t& force, + std::vector<Drum<value_t, params_t, vars_t, buffer_t> >& drums, + const std::vector<std::vector<int> >& adj_vec, + const value_t dt, + const value_t time) const noexcept + { + //step 1: calculate k1 and l1 for all drums + for(size_t i = 0; i < drums.size()-1; ++i){ + //TODO: Empty neighbours are now signified by adj_vec[i][j] == -1. We could also push a 0-drum to the end and point to that. + drums[i].get_sbuffer().k1 = dt*(force(drums[i], drums[adj_vec[i][0]], drums[adj_vec[i][1]], drums[adj_vec[i][2]], time)); + drums[i].get_sbuffer().l1 = dt*drums[i].get_variables().xdot; + } + //update x_temp, xdot_temp + for(size_t i = 0; i < drums.size()-1; ++i){ + drums[i].get_variables().xdot_temp = drums[i].get_variables().xdot + drums[i].get_sbuffer().k1/2.; + drums[i].get_variables().x_temp = drums[i].get_variables().x + drums[i].get_sbuffer().l1/2.; + } + //now it's time for the owner to update the coupler and driver to t+dt/2. + + + } + + + //operations performed at t+dt/2 + void step_2(const force_t& force, + std::vector<Drum<value_t, params_t, vars_t, buffer_t> >& drums, + const std::vector<std::vector<int> >& adj_vec, + const value_t dt, + const value_t time) const noexcept + { + //step 2: calculate k2 and l2 for all drums + for(size_t i = 0; i < drums.size()-1; ++i){ + //TODO: Empty neighbours are now signified by adj_vec[i][j] == -1. We could also push a 0-drum to the end and point to that. + drums[i].get_sbuffer().k2 = dt*(force(drums[i], drums[adj_vec[i][0]], drums[adj_vec[i][1]], drums[adj_vec[i][2]], time)); + drums[i].get_sbuffer().l2 = dt*drums[i].get_variables().xdot_temp; + } + //update x_temp, xdot_temp + for(size_t i = 0; i < drums.size()-1; ++i){ + drums[i].get_variables().xdot_temp = drums[i].get_variables().xdot + drums[i].get_sbuffer().k2/2.; + drums[i].get_variables().x_temp = drums[i].get_variables().x + drums[i].get_sbuffer().l2/2.; + } + + + + //step 3: calculate k3 and l3 for all drums + for(size_t i = 0; i < drums.size()-1; ++i){ + //TODO: Empty neighbours are now signified by adj_vec[i][j] == -1. We could also push a 0-drum to the end and point to that. + drums[i].get_sbuffer().k3 = dt*(force(drums[i], drums[adj_vec[i][0]], drums[adj_vec[i][1]], drums[adj_vec[i][2]], time)); + drums[i].get_sbuffer().l3 = dt*drums[i].get_variables().xdot_temp; + } + //update x_temp, xdot_temp + for(size_t i = 0; i < drums.size()-1; ++i){ + drums[i].get_variables().xdot_temp = drums[i].get_variables().xdot + drums[i].get_sbuffer().k3; + drums[i].get_variables().x_temp = drums[i].get_variables().x + drums[i].get_sbuffer().l3; + } + //now it's time for the owner to update the coupler and driver to t+dt/2. + } + + + //operations performed at t+dt + void step_3(const force_t& force, + std::vector<Drum<value_t, params_t, vars_t, buffer_t> >& drums, + const std::vector<std::vector<int> >& adj_vec, + const value_t dt, + const value_t time) const noexcept + { + //step 4: calculate k4 and l4 for all drums + for(size_t i = 0; i < drums.size()-1; ++i){ + //TODO: Empty neighbours are now signified by adj_vec[i][j] == -1. We could also push a 0-drum to the end and point to that. + drums[i].get_sbuffer().k4 = dt*(force(drums[i], drums[adj_vec[i][0]], drums[adj_vec[i][1]], drums[adj_vec[i][2]], time)); + drums[i].get_sbuffer().l4 = dt*drums[i].get_variables().xdot_temp; + } + //update x, xdot, x_temp, xdot_temp to t+dt + for(size_t i = 0; i < drums.size()-1; ++i){ + drums[i].get_variables().xdot_temp = drums[i].get_variables().xdot + drums[i].get_sbuffer().k4; + drums[i].get_variables().x_temp = drums[i].get_variables().x + drums[i].get_sbuffer().l4; + drums[i].get_variables().xdot = drums[i].get_variables().xdot + drums[i].get_sbuffer().k4; + drums[i].get_variables().x = drums[i].get_variables().x + drums[i].get_sbuffer().l4; + } + } +}; + +#endif diff --git a/projects/braidingTightBinding/lib/system.hpp b/projects/braidingTightBinding/lib/system.hpp new file mode 100644 index 0000000..37855c1 --- /dev/null +++ b/projects/braidingTightBinding/lib/system.hpp @@ -0,0 +1,115 @@ +#ifndef SYSTEM_HPP_INCLUDED +#define SYSTEM_HPP_INCLUDED +#include <vector> +#include <iostream> + +template<typename value_t, typename drum_t, typename grabber_t, typename sysparams_t, typename force_t, typename coupler_t, typename driver_t, typename stepper_t, typename matelecalc_t> +class System{ + public: + System(const value_t t_end, const value_t dt, const std::vector<drum_t>& drums, const stepper_t stepper, const force_t force, const sysparams_t sysparams, const grabber_t grabber) + : drums_(drums), stepper_(stepper), force_(force), sysparams_(sysparams), grabber_(grabber), t_end_(t_end), dt_(dt), time_(0.) + { + sysparams_.coupler.precompute(t_end, dt, drums); + sysparams_.driver.precompute(t_end, dt, drums); + grabber_.init(t_end, dt, drums, sysparams.adjacency_vector); + + push_dc(); //push the initial values + + } + ~System() = default; + + void simulate(){ + while(time_ <= t_end_){ + grabber_.grab(drums_, time_); + step(); + } + } + + void step(){ + push_dc(); + stepper_.step_1(force_, drums_, sysparams_.adjacency_vector, dt_, time_); + step_dc(dt_/2.); + push_dc(); + stepper_.step_2(force_, drums_, sysparams_.adjacency_vector, dt_, time_); + step_dc(dt_/2.); + push_dc(); + stepper_.step_3(force_, drums_, sysparams_.adjacency_vector, dt_, time_); + + time_ += dt_; + } + + void reset_time(){ + time_ = value_t(0.); + } + + void set_step(value_t dt){ + dt_ = dt; + } + + bool save(){ + return grabber_.save(); + } + + std::vector<value_t> get_matrix(const matelecalc_t& mec){ + calculate_matrix(mec); + return matrix_; + } + + private: + void step_dc(const value_t dt){ + sysparams_.coupler.step(dt); + sysparams_.driver.step(dt); + } + + void push_dc(){ + for(size_t i = 0; i < drums_.size()-1; ++i){ + drums_[i].get_variables().V = sysparams_.driver(i); + drums_[i].get_variables().t0 = sysparams_.coupler(i,0); + drums_[i].get_variables().t1 = sysparams_.coupler(i,1); + drums_[i].get_variables().t2 = sysparams_.coupler(i,2); + } + } + + //Calculates dynamical matrix for the currently pushed values + void calculate_matrix(const matelecalc_t& mec){ + //for convenience + size_t N = drums_.size()-1; + //clear the matrix + matrix_.clear(); + //prepare memory + matrix_.reserve((drums_.size()-1)*(drums_.size()-1) - matrix_.capacity()); + //initialize + for(size_t i = 0; i < (drums_.size()-1) * (drums_.size()-1); ++i) + matrix_.push_back(value_t(0.)); + + for(size_t i = 0; i < drums_.size()-1; ++i){ + size_t n0_index = sysparams_.adjacency_vector[i][0]; + size_t n1_index = sysparams_.adjacency_vector[i][1]; + size_t n2_index = sysparams_.adjacency_vector[i][2]; + //diagonal + matrix_[N*i + i] = mec(i, drums_); + //couplings + //neighbour 0 + if(n0_index != drums_.size()-1) [[likely]] //actually a neighbour + matrix_[N*i + n0_index] = mec(i, n0_index, drums_); + //neighbour 1 + if(n1_index != drums_.size()-1) [[likely]] //actually a neighbour + matrix_[N*i + n1_index] = mec(i, n1_index, drums_, 1); + //neighbour 2 + if(n2_index != drums_.size()-1) [[likely]] //actually a neighbour + matrix_[N*i + n2_index] = mec(i, n2_index, drums_, 2, 2); + } + } + + std::vector<drum_t> drums_; //The last drum is NOT TO BE TOUCHED! + sysparams_t sysparams_; + grabber_t grabber_; + stepper_t stepper_; + force_t force_; + value_t dt_, t_end_; + value_t time_; + + std::vector<value_t> matrix_; //Matrix of this problem +}; + +#endif diff --git a/projects/braidingTightBinding/lib/system_parameters.hpp b/projects/braidingTightBinding/lib/system_parameters.hpp new file mode 100644 index 0000000..637d779 --- /dev/null +++ b/projects/braidingTightBinding/lib/system_parameters.hpp @@ -0,0 +1,18 @@ +#ifndef SYSTEM_PARAMETERS_HPP_INCLUDED +#define SYSTEM_PARAMETERS_HPP_INCLUDED +#include <vector> + +template <typename coupler_t, typename driver_t> +class SystemParameters{ + public: + //constructors + SystemParameters(coupler_t coupler, driver_t driver, std::vector< std::vector<int> > adjacency_vector) noexcept: coupler(coupler), driver(driver), adjacency_vector(adjacency_vector) {} + + + public: + coupler_t coupler; + driver_t driver; + std::vector< std::vector<int> > adjacency_vector; +}; + +#endif diff --git a/projects/braidingTightBinding/lib/vec2.hpp b/projects/braidingTightBinding/lib/vec2.hpp new file mode 100644 index 0000000..a2bb4c3 --- /dev/null +++ b/projects/braidingTightBinding/lib/vec2.hpp @@ -0,0 +1,150 @@ +#ifndef VEC2_HPP_INCLUDED +#define VEC2_HPP_INCLUDED +#include <cmath> +#include <iostream> + +template <typename value_t> +class Vec2{ + public: + //constructors + Vec2(const value_t x, const value_t y) noexcept: x_(x), y_(y) {} + Vec2(const Vec2<value_t>& other) = default; + Vec2& operator=(const Vec2&) = default; + Vec2() = default; + ~Vec2() = default; + + + //access + value_t x() const noexcept { return x_; } + value_t y() const noexcept { return y_; } + Vec2 normalized() const { return *this/this->norm(); } + + //TODO: Precalculate these and flag when recomputation is needed + value_t r() const noexcept { return this->norm(); } + value_t phi() const + { + value_t angle (0); + angle = std::atan2(y_, x_); + if(std::isnan(angle)){ + throw("ATAN2 NAN OCCURRED"); + return 0.; + } + return angle; + } + + //function members + value_t r_wrt(const Vec2& origin) const noexcept { return (*this - origin).r(); } + value_t phi_wrt(const Vec2& origin) const { return (*this - origin).phi(); } + + value_t norm() const noexcept { return std::sqrt(x_*x_ + y_*y_); } + value_t norm_sq() const noexcept { return x_*x_ + y_* y_; } + + //modifiers + Vec2& rotate(const Vec2& center, const value_t degrees) + { + *this -= center; + value_t temp = x_; + const value_t radians = degrees*3.141592653589793/180.; + + x_ = std::cos(radians)*x_ - std::sin(radians)*y_; + y_ = std::sin(radians)*temp + std::cos(radians)*y_; + + *this += center; + + return *this; + } + + Vec2& normalize() + { + value_t length = norm(); + if(length == value_t(0)) + throw("NORMALIZE ZERO VEC2 ATTEMPTED"); + x_ /= length; + y_ /= length; + return *this; + } + + //overloading + Vec2& operator+=(const Vec2& rhs) noexcept + { + x_ += rhs.x_; + y_ += rhs.y_; + return *this; + } + Vec2& operator-=(const Vec2& rhs) noexcept + { + x_ -= rhs.x_; + y_ -= rhs.y_; + return *this; + } + Vec2& operator*=(const value_t s) noexcept + { + x_ *= s; + y_ *= s; + return *this; + } + Vec2& operator/=(const value_t s) + { + if(x_ == value_t(0) and y_ == value_t(0)) + return *this; + else if(s == value_t(0)) + throw("DIVISION BY ZERO ATTEMPTED"); + x_ /= s; + y_ /= s; + return *this; + } + + value_t& operator[](std::size_t i) noexcept + { + if(i == 0) + return x_; + else + return y_; + } + value_t operator[](std::size_t i) const noexcept + { + if(i == 0) + return x_; + else + return y_; + } + + //non-ADL hidden friends + friend Vec2 operator+(const Vec2& lhs, Vec2 rhs) noexcept + { + rhs += lhs; + return rhs; + } + friend Vec2 operator-(Vec2 lhs, const Vec2& rhs) noexcept + { + lhs -= rhs; + return lhs; + } + friend Vec2 operator*(const value_t s, Vec2 v) noexcept + { + v *= s; + return v; + } + friend Vec2 operator*(Vec2 v, const value_t s) noexcept + { + v *= s; + return v; + } + friend Vec2 operator/(Vec2 v, const value_t s) + { + v /= s; + return v; + } + friend value_t operator*(const Vec2& v, const Vec2& w) noexcept { return v.x_*w.x_ + v.y_*w.y_; }//dot product + + private: + value_t x_, y_; +}; + +template <typename value_t> +std::ostream& operator<<(std::ostream& os, const Vec2<value_t>& v) +{ + return os << "(" << v.x() << ", " << v.y() << ")"; +} + +#endif -- GitLab