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