mirror of
				https://github.com/paboyle/Grid.git
				synced 2025-10-25 02:04:48 +01:00 
			
		
		
		
	Compare commits
	
		
			943 Commits
		
	
	
		
			feature/no
			...
			feature/cl
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | b7f8c5b823 | ||
|  | 3923683e9b | ||
|  | e199fda9dc | ||
| 7bb405e790 | |||
| ec16eacc6a | |||
|  | cf858deb16 | ||
|  | a3affac963 | ||
| d9d1f43ba2 | |||
| b7cd721308 | |||
| 29f026c375 | |||
| 58c7a13d54 | |||
|  | e564d11687 | ||
|  | 0b2162f375 | ||
|  | 5610570182 | ||
|  | 44f65526e0 | ||
|  | 43e48542ab | ||
|  | 0b85f1bfc8 | ||
|  | 9947cfbf14 | ||
|  | 357badce5e | ||
|  | 0091eec23a | ||
|  | 9e9c2962df | ||
|  | bda97212a9 | ||
|  | b91282ad46 | ||
|  | 0a68470f9a | ||
|  | 6ecf280723 | ||
|  | 7eeab7f995 | ||
|  | 9b32d51cd1 | ||
|  | 7b3ed160aa | ||
|  | 1a0163f45c | ||
|  | 9028e278e4 | ||
| dd62f2f371 | |||
| 0d612039ed | |||
| e8ac75055c | |||
| 8b30c5956c | |||
| 185da83454 | |||
| 6718fa8c4f | |||
|  | 4ce63af7d5 | ||
| 67c3fa0f5f | |||
| 65d4f17976 | |||
| e2fe97277b | |||
|  | 84f9c37ed4 | ||
| bcf6f3890c | |||
| 591a38c487 | |||
| 842754bea9 | |||
| 0887566134 | |||
| 61fc50d616 | |||
| a9c8d7dad0 | |||
| 259d504ef0 | |||
| f3a77f4b7f | |||
| 26d7b829a0 | |||
| 64161a8743 | |||
| 2401360784 | |||
|  | 2cfb50cbe5 | ||
| f9aa39e1c4 | |||
| 0fbf445edd | |||
| e78794688a | |||
| 9e31307963 | |||
| 29e2eddea8 | |||
| 0a038ea15a | |||
| 62eb1f0e59 | |||
| 5422251959 | |||
|  | 9579c9c327 | ||
|  | 3729c7a7a6 | ||
|  | c24d4c8d0e | ||
|  | a14038051f | ||
|  | 3e560b9462 | ||
|  | d93c6760ec | ||
|  | ae3b7713a9 | ||
| cbd8fbe771 | |||
| d391f05cb7 | |||
| 3127b52c90 | |||
| 01f00385a4 | |||
| 59aae5f5ec | |||
| 624246409c | |||
| 2a9ebddad5 | |||
| ff7afe6e17 | |||
| 33cb509d4b | |||
| 456c78c233 | |||
| 2fd4989029 | |||
| 2427a21428 | |||
| 514993ed17 | |||
|  | 28ceacec45 | ||
|  | e6a3e375cf | ||
|  | 4987edbd44 | ||
|  | ad140bb6e7 | ||
|  | 1f04e56038 | ||
|  | 4bfc8c85c3 | ||
|  | e55397bc13 | ||
| a3fe874a5b | |||
| f403ab0133 | |||
|  | 94b8fb5686 | ||
|  | 1f1d77b01a | ||
|  | 6a15e2e8ef | ||
| 074d17429f | |||
|  | 25f73018f4 | ||
|  | 1d7ccc6b2c | ||
|  | 59d9ccf70c | ||
|  | 1860b1698c | ||
|  | 9b8d1cc3da | ||
|  | 149c3f9e9c | ||
|  | c519aab19d | ||
|  | 69929f20bb | ||
|  | a493429218 | ||
|  | 915f610da0 | ||
|  | c79606a5dc | ||
|  | 360efd0088 | ||
|  | 7b42ac9982 | ||
|  | c5c647e35e | ||
| a4e5fd1000 | |||
| 682e7d7839 | |||
|  | 8e057721a9 | ||
|  | fa5e4add47 | ||
|  | 27ea2afe86 | ||
|  | 78e8704eac | ||
|  | 67131d82f2 | ||
|  | 615a9448b9 | ||
|  | 00164f5ce5 | ||
|  | a7f72eb994 | ||
|  | 501fa1614a | ||
|  | 5bf42e1e15 | ||
|  | fe4d9b003c | ||
|  | 4a699b4da3 | ||
|  | 689323f4ee | ||
|  | 749189fd72 | ||
|  | f941c4ee18 | ||
|  | 84b441800f | ||
|  | 1ef424b139 | ||
|  | aa66f41c69 | ||
|  | f96c800d25 | ||
|  | 32a52d7583 | ||
|  | fa04b6d3c2 | ||
|  | 7fab183c0e | ||
|  | 9ec9850bdb | ||
|  | 0c4ddaea0b | ||
|  | 00ebc150ad | ||
|  | 0f3e9ae57d | ||
|  | 034de160bf | ||
|  | 76bcf6cd8c | ||
|  | 91b8bf0613 | ||
|  | 14507fd6e4 | ||
|  | 2db05ac214 | ||
|  | 31f99574fa | ||
|  | a34c8a2961 | ||
|  | ccd20df827 | ||
|  | e9be293444 | ||
|  | d577211cc3 | ||
|  | f4336e480a | ||
|  | e4d461cb03 | ||
|  | 3d63b4894e | ||
|  | 08583afaff | ||
|  | b395a312af | ||
|  | 66295b99aa | ||
|  | b8654be0ef | ||
|  | a479325349 | ||
|  | f6c3f6bf2d | ||
|  | d83868fdbb | ||
|  | 303e0b927d | ||
|  | 28ba8a0f48 | ||
|  | f9e28577f3 | ||
|  | e0cae833da | ||
|  | 8a3aae98f6 | ||
|  | 8309f2364b | ||
|  | cac1750078 | ||
|  | e17cd35151 | ||
|  | ccdec7a7ab | ||
|  | 93642d813d | ||
|  | 0bc381f982 | ||
|  | 2986aa76f8 | ||
|  | 657779374b | ||
|  | ec8cd11c1f | ||
|  | cbda4f66e0 | ||
|  | 6579dd30ff | ||
|  | 031c94e02e | ||
|  | 6391b2a1d0 | ||
|  | 2e50b55ae4 | ||
|  | 27936900e6 | ||
|  | cd3e810d25 | ||
|  | 317ddfedee | ||
|  | e325929851 | ||
|  | 47af3565f4 | ||
|  | 4b4d187935 | ||
|  | 9aff354ab5 | ||
|  | cb9ff20249 | ||
|  | 9fe6ac71ea | ||
| 5c392a6ecc | |||
|  | f1fa00b71b | ||
|  | bf58557fb1 | ||
|  | 10cb37f504 | ||
|  | 1374c943d4 | ||
|  | a1d80282ec | ||
|  | 4eb8bbbebe | ||
|  | d1c6288c5f | ||
|  | dd949bc428 | ||
|  | bb7378cfc3 | ||
|  | f0e084a88c | ||
|  | 153672d8ec | ||
|  | 08ca338875 | ||
|  | f7cbf82c04 | ||
|  | 07009c569a | ||
|  | 15d690e9b9 | ||
| 63b2bc1936 | |||
|  | d810e8c8fb | ||
|  | 09f4cdb11e | ||
|  | 1e54882f71 | ||
|  | 27caff92c6 | ||
| d38cee73bf | |||
| 8784f2a88d | |||
| c497864b5d | |||
| 05c1c88440 | |||
|  | d54807b8c0 | ||
|  | f6ba2b95ce | ||
|  | 5625b47c7d | ||
|  | 1edcf902b7 | ||
|  | e5c19e1fd7 | ||
|  | a11d0a33d1 | ||
|  | 4f8b6f26b4 | ||
|  | 073525c5b3 | ||
|  | eb6153080a | ||
|  | f7072d1ac2 | ||
| a021933002 | |||
|  | 56478d63a5 | ||
| df21668f2c | |||
|  | 482368e9de | ||
|  | fddeb29d6b | ||
|  | a9ec5cf564 | ||
|  | 946a8671b9 | ||
|  | a6eeea777b | ||
|  | 771a1b8e79 | ||
|  | bfb68e6f02 | ||
|  | 77f7737ccc | ||
|  | 9a827d0242 | ||
|  | 999c623590 | ||
|  | 18c335198a | ||
|  | f9df685cde | ||
|  | 17c5b0f152 | ||
|  | 5918769f97 | ||
|  | b542d349b8 | ||
|  | 91eaace19d | ||
|  | bbaf1ada91 | ||
|  | 1950ac9294 | ||
|  | 13fa70ac1a | ||
|  | 7cb2b11f26 | ||
|  | 1184ed29ae | ||
|  | 203c7bf6fa | ||
|  | c709883f3f | ||
|  | aed5de4d50 | ||
|  | ba27cc6571 | ||
|  | d856327250 | ||
|  | d75369cb56 | ||
|  | bf973d0d56 | ||
|  | 837bf8a5be | ||
|  | c05b2199f6 | ||
|  | a5fe07c077 | ||
|  | b83b2b1415 | ||
|  | b331be9101 | ||
|  | 49c20a9fa8 | ||
|  | 7359df3501 | ||
|  | 59bd1fe21b | ||
| a56e3b40c4 | |||
|  | 4e907fef2c | ||
|  | 67888b657f | ||
|  | 74af885d4e | ||
|  | d36d2fb40d | ||
|  | 5b9267e88d | ||
|  | 15fd4003ef | ||
|  | 4b4c2a715b | ||
|  | 54a5e6c1d0 | ||
|  | 73aeca7dea | ||
|  | ad89abb018 | ||
|  | 80c5bce5bb | ||
|  | f68b5de9c8 | ||
|  | d0f3d525d5 | ||
|  | f365a83fae | ||
|  | 3a58217405 | ||
|  | c289699d9a | ||
|  | c3b1263e75 | ||
|  | 34a9aeb331 | ||
| 5846566728 | |||
| 102ea9ae66 | |||
| 21b02760c3 | |||
|  | 2bcb704af2 | ||
|  | 5fa386ddc9 | ||
|  | edabb3577f | ||
|  | ce5df177ee | ||
|  | a0bb8e5b46 | ||
|  | 46f88e6d72 | ||
|  | dd8f1ea189 | ||
|  | b61835c1a5 | ||
|  | d9cd4f0273 | ||
|  | 459f70e8d4 | ||
|  | 061e48fd73 | ||
|  | ab50145001 | ||
|  | b49bec0cec | ||
|  | ae56e556c6 | ||
|  | 1cdf999668 | ||
|  | 11062fb686 | ||
|  | 383ca7d392 | ||
|  | a446d95c33 | ||
|  | be66e7dd95 | ||
|  | 6d0d064a6c | ||
|  | bfef525ed2 | ||
|  | 0b0cf62193 | ||
|  | 7d88198387 | ||
|  | 2f619482b8 | ||
|  | d6472eda8d | ||
|  | 9e658de238 | ||
|  | bcefdd7c4e | ||
|  | 9d45fca8bc | ||
|  | ac9e6b63c0 | ||
|  | e140b3f802 | ||
|  | d9d3d30cc7 | ||
|  | 47a12ec7b5 | ||
|  | ec1e2f7a40 | ||
|  | 41f73ec083 | ||
|  | fd367d8bfd | ||
|  | 6d0786ff9d | ||
|  | b7f93aeb4d | ||
|  | 202a7fe900 | ||
|  | 8d168ded4a | ||
|  | 8a3fe60a27 | ||
|  | 44051aecd1 | ||
|  | 06e6f8de00 | ||
|  | dbe4d7850c | ||
|  | 4fe182e5a7 | ||
|  | 75ee6cfc86 | ||
|  | fde71c3c52 | ||
|  | 175f393f9d | ||
|  | 7d867a8134 | ||
|  | 9939b267d2 | ||
|  | 323e9c439a | ||
|  | 28396f1048 | ||
|  | 67b34e5789 | ||
|  | 14d53e1c9e | ||
|  | 8bd869da37 | ||
|  | c7036f6717 | ||
|  | c0485d799d | ||
|  | 7abc5613bd | ||
|  | 237cfd11ab | ||
|  | a4b7dddb67 | ||
|  | 5696781862 | ||
|  | 8f4b3049cd | ||
|  | 2a6e673a91 | ||
|  | 9b6cde173f | ||
|  | 9f280b82c4 | ||
| c3f0889eda | |||
|  | 7a53dc3715 | ||
|  | 0f214ad427 | ||
|  | fe4912880d | ||
|  | 875e1a841f | ||
|  | 0366288b1c | ||
|  | 6293d438cd | ||
|  | 852ade029a | ||
|  | f038c6babe | ||
|  | 169f4b2711 | ||
|  | 2d8aff36fe | ||
|  | 9fa07eecde | ||
|  | 659d7d1a40 | ||
|  | f64fb7bd77 | ||
|  | 2a35449b91 | ||
|  | 184af5bd05 | ||
|  | 097c9637ee | ||
|  | dc6f078246 | ||
|  | 8a4714a4a6 | ||
|  | 40e119c61c | ||
|  | d9593c4b81 | ||
|  | ac740f73ce | ||
|  | 75dc7794b9 | ||
|  | dee68fc728 | ||
|  | a2d3643634 | ||
|  | 57002924bc | ||
|  | 7b0237b081 | ||
|  | b68ad0cc0b | ||
|  | 37263fd9b1 | ||
|  | 3d09e3e9e0 | ||
|  | 1354b46338 | ||
|  | 251a97fe1b | ||
|  | e18929eaa0 | ||
|  | f3b0a92e71 | ||
|  | a0be3f7330 | ||
|  | b5a6e4f1fd | ||
|  | 7a788db3dc | ||
|  | f20eceb6cd | ||
|  | 38325ebbc6 | ||
|  | b73bd151bb | ||
|  | 694b305cab | ||
|  | 2d3737a133 | ||
|  | ac1f1838bc | ||
|  | 09d09d0fe5 | ||
|  | bf630a6821 | ||
|  | 8859a151cc | ||
|  | 688a39cfd9 | ||
|  | 6f5a5cd9b3 | ||
|  | 0933aeefd4 | ||
|  | 322f61acee | ||
|  | 08e04b9676 | ||
| feaa2ac947 | |||
| 07de925127 | |||
|  | a9c816a268 | ||
|  | e43a8b6b8a | ||
|  | bf729766dd | ||
|  | dafb351d38 | ||
| 0b707b861c | |||
| 15e87a4607 | |||
| 7d7220cbd7 | |||
|  | 7d2d5e8d3d | ||
|  | 54e94360ad | ||
| 0af740dc15 | |||
| d2e8372df3 | |||
|  | 869b99ec1e | ||
|  | 4a29ab0d0a | ||
|  | 0165bcb58e | ||
|  | deca1ecc50 | ||
| 4372d04ad4 | |||
|  | 349d75e483 | ||
|  | 56abbdf4c2 | ||
|  | af71c63f4c | ||
|  | e51475703a | ||
|  | 1feddf4ba6 | ||
|  | 600d7ddc2e | ||
|  | e504260f3d | ||
|  | 0440d4ce66 | ||
|  | 08b0e472aa | ||
|  | c11d69787e | ||
|  | dc6b2d30d2 | ||
|  | 7a3bd5c66c | ||
|  | 18211eb5b1 | ||
|  | 863bb2ad10 | ||
|  | 5e4bea8f20 | ||
|  | 6ebf9f15b7 | ||
|  | 1d7aa673a4 | ||
|  | b9104f3072 | ||
| b22eab8c8b | |||
|  | a7d56523ab | ||
|  | 9e56c65730 | ||
|  | ef4f2b8c41 | ||
|  | e8b95bd35b | ||
|  | 7e35286860 | ||
|  | 0486ff8e79 | ||
| 1e8a2e1621 | |||
| 7587df831a | |||
|  | e9cc21900f | ||
|  | 0a8faac271 | ||
|  | abc4de0fd2 | ||
| b672717096 | |||
| 284ee194b1 | |||
|  | cfe3cd76d1 | ||
|  | 3fa5e3109f | ||
|  | 8b7049f737 | ||
|  | c85024683e | ||
|  | 1300b0b04b | ||
|  | e6d984b484 | ||
|  | 1d18d95d4f | ||
|  | ae39ec85a3 | ||
|  | b96daf53a0 | ||
|  | 46879e1658 | ||
|  | ae4de94798 | ||
|  | 0ab555b4f5 | ||
|  | 8e9be9f84f | ||
|  | d572170170 | ||
| 81b18f843a | |||
|  | 1bd311ba9c | ||
|  | 41af8c12d7 | ||
|  | a833f88c32 | ||
|  | 07b2c1b253 | ||
|  | 735cbdb983 | ||
|  | 2ad54c5a02 | ||
|  | 12ccc73cf5 | ||
|  | 3d04dc33c6 | ||
|  | e7564f8330 | ||
|  | 91199a8ea0 | ||
|  | 0494feec98 | ||
|  | a16b1e134e | ||
|  | 5633a2db20 | ||
|  | 2d433ba307 | ||
|  | 769ad578f5 | ||
|  | eaac0044b5 | ||
|  | 56042f002c | ||
|  | 3bfd1f13e6 | ||
|  | 70ab598c96 | ||
|  | 1d0ca65e28 | ||
|  | 2bc4d0a20e | ||
| 2490816297 | |||
| 5f55bca378 | |||
|  | b8e45ae490 | ||
|  | b35fc4e7f9 | ||
|  | 60f11bfd72 | ||
| f6aa82b7f2 | |||
| 22749699a3 | |||
|  | 8d442b502d | ||
|  | e5c8b7369e | ||
| 0503c028be | |||
|  | c504b4dbad | ||
|  | 622a21bec6 | ||
|  | eec79e0a1e | ||
|  | 092dcd4e04 | ||
|  | 4a8c4ccfba | ||
|  | 9b44189d5a | ||
|  | 7da4856e8e | ||
|  | aaf1e33a77 | ||
|  | 094c3d091a | ||
|  | 4b98e524a0 | ||
|  | 1a1f6d55f9 | ||
|  | 21421656ab | ||
|  | 6f687a67cd | ||
|  | b30754e762 | ||
|  | 1e429a0d57 | ||
|  | d38a4de36c | ||
|  | ef1b7db374 | ||
|  | 53a9aeb965 | ||
|  | e30fa9f4b8 | ||
|  | 58e8d0a10d | ||
|  | 62cf9cf638 | ||
|  | 0fb458879d | ||
|  | 725c513d94 | ||
| d8648307ff | |||
| 064315c00b | |||
|  | 7c6cc85df6 | ||
|  | a6691ef87c | ||
|  | 23135aa58a | ||
|  | 8e0ced627a | ||
|  | 0de314870d | ||
|  | ffb91e53d2 | ||
|  | f4e8bf2858 | ||
| a74c34315c | |||
|  | 69470ccc10 | ||
|  | b8b5934193 | ||
|  | 75856f2945 | ||
|  | 3c112a7a25 | ||
|  | ab3596d4d3 | ||
|  | a8c10b1933 | ||
|  | 15e801af3f | ||
|  | 0ffc235741 | ||
|  | 8e19c99c7d | ||
|  | a0bc0ad06f | ||
|  | a8fb2835ca | ||
|  | bc862ce3ab | ||
|  | 08b314fd0f | ||
| 22f4feee7b | |||
| 3f858d6755 | |||
|  | 3267683e22 | ||
|  | f46a67ffb3 | ||
|  | f7b8383ef5 | ||
|  | 10f2872aae | ||
|  | 34332fe393 | ||
|  | c2010f21ab | ||
|  | 98f610ce53 | ||
|  | d44cc204d1 | ||
| 35fa3d1dfd | |||
|  | cd73897b8d | ||
|  | c4435e6beb | ||
|  | 7a8f6af5f8 | ||
|  | 49a5d9bac7 | ||
|  | 2b3fdd4a58 | ||
|  | 34502ec471 | ||
|  | 8a43e88b4f | ||
| d1ece74137 | |||
|  | 238df20370 | ||
|  | 97a32a6145 | ||
|  | 655492a443 | ||
|  | 1cab06f6bd | ||
| 43c817cc67 | |||
|  | f8024c262b | ||
|  | 4cc5f01f4a | ||
|  | 9c12c37aaf | ||
|  | 806eaa0530 | ||
|  | 01d0e54594 | ||
|  | 5aafa335fe | ||
|  | 8ba0494485 | ||
|  | d99d98d9fd | ||
|  | 95a017a4ae | ||
|  | 92f92379e6 | ||
|  | 529e78d43f | ||
|  | 4ec746d262 | ||
|  | 51bf1501fc | ||
|  | 66d819c054 | ||
|  | 3f3686f869 | ||
|  | 26bb829f8c | ||
|  | 67cb04fc66 | ||
|  | a40bd68aed | ||
|  | 36495e0fd2 | ||
|  | 93f6c15772 | ||
|  | cb93eeff21 | ||
|  | c7cc7e6101 | ||
|  | c349aa6511 | ||
|  | 3bae0a2d5c | ||
|  | c1c7566089 | ||
|  | 2439999ec8 | ||
|  | 1d96f662e3 | ||
|  | 41d1889941 | ||
|  | 0c3981e0c3 | ||
|  | c727bd4609 | ||
|  | db23749b67 | ||
|  | 751f2b9703 | ||
|  | 741bc836f6 | ||
|  | 697c0603ce | ||
|  | 14bedebb11 | ||
|  | 8546d01a4c | ||
|  | 47b5c07ffb | ||
|  | da86a2bf54 | ||
|  | c1cb60a0b3 | ||
|  | 5ed5b4bfbf | ||
|  | de84aacdfd | ||
|  | 2888003765 | ||
|  | da06bf5b95 | ||
|  | 20999c1370 | ||
|  | 77e0af9c2e | ||
|  | 33f0ed1a33 | ||
|  | 50be56433b | ||
|  | 43924007db | ||
|  | 78ef10e60f | ||
|  | ca1077c560 | ||
| 679ae98b14 | |||
|  | 90f6bc16bb | ||
|  | 9b5b639546 | ||
|  | 945767c6d8 | ||
|  | 422cdf4979 | ||
|  | 38db174f3b | ||
|  | 92e364a35f | ||
| 58299b8ba2 | |||
| 124bf4d829 | |||
| e8e56b3414 | |||
| 89c430136d | |||
| ea9aef7baa | |||
| c9e9e8061d | |||
|  | 453cf2a1c6 | ||
|  | de7bbfa5f9 | ||
| dda8d77c87 | |||
| aa29f4346a | |||
|  | 86116dbed6 | ||
|  | 7bd31e3f7c | ||
|  | 74f451715f | ||
|  | 655be8ed76 | ||
|  | 4063238943 | ||
|  | 3344788fa1 | ||
|  | 62a64d9108 | ||
|  | 49331a3e72 | ||
|  | 51d84ec057 | ||
|  | db14fb30df | ||
|  | b9356d3866 | ||
|  | 99a73f4287 | ||
|  | f302eea91e | ||
|  | 5553b8d2b8 | ||
|  | a6ccbbe108 | ||
|  | 99220f6531 | ||
|  | d2003f24f4 | ||
|  | 6299dd35f5 | ||
|  | a39daecb62 | ||
|  | 159770e21b | ||
|  | 2a6d093749 | ||
|  | c947947fad | ||
|  | f555b50547 | ||
|  | 738c1a11c2 | ||
|  | f8797e1e3e | ||
|  | fd1eb7de13 | ||
|  | 2ce898efa3 | ||
|  | dc5a6404ea | ||
|  | 44260643f6 | ||
|  | 1425afc72f | ||
|  | ab66bac4e6 | ||
|  | 56277a11c8 | ||
|  | 752048f410 | ||
|  | 916e9e1d3e | ||
|  | 5b55867a7a | ||
|  | 3accb1ef89 | ||
|  | e3d0e31525 | ||
|  | 5812eb8a8c | ||
|  | 4dd3763294 | ||
|  | c429ace748 | ||
|  | ac58565d0a | ||
|  | 3703b718aa | ||
|  | b722889234 | ||
|  | abba44a837 | ||
|  | f301be94ce | ||
|  | 1d1b225497 | ||
|  | 53a785a3dd | ||
|  | 736bf3c866 | ||
|  | b9bbe5d188 | ||
|  | 3844bcf800 | ||
|  | e1a2319d01 | ||
|  | 180c732b4c | ||
|  | 957a706d0b | ||
|  | d2312e9874 | ||
|  | fc4ab9ccd5 | ||
|  | 4a340aa5ca | ||
|  | 3b7de792d5 | ||
|  | 557c3fa109 | ||
|  | ec18e9f7f6 | ||
|  | a839d5bc55 | ||
|  | de41b84c5c | ||
|  | 9e2d29c644 | ||
|  | b694996302 | ||
| 1407418755 | |||
| a6a0da873f | |||
|  | c382c351a5 | ||
|  | af2d6ce2e0 | ||
| 90ec6eda0c | |||
|  | ac1253bb76 | ||
| fe8d625694 | |||
| 53e76b41d2 | |||
|  | 5e477ec553 | ||
|  | 363611ae21 | ||
|  | 3b8a791e28 | ||
|  | 7b03d8d087 | ||
|  | 4b759b8f2a | ||
|  | 8c540333d5 | ||
|  | 6fd82228bf | ||
|  | ca6efc685e | ||
| ff4e54ef80 | |||
|  | cd1bd921bd | ||
|  | b8ae787b5e | ||
|  | fbe2c3b5f9 | ||
|  | 1ed69816b9 | ||
|  | fff5751b1a | ||
|  | 2c81696fdd | ||
|  | c9dc22efa1 | ||
|  | 0ab04a000f | ||
|  | 3750b9ffee | ||
|  | 5e549ebd8b | ||
|  | fff484eca5 | ||
|  | 5fdc05782b | ||
|  | a04eb7df5d | ||
|  | 4c1ea8677e | ||
|  | 120fb59978 | ||
|  | fd56b3ff38 | ||
|  | 0ec6829edc | ||
|  | 18b7845b7b | ||
|  | 3d0fe15374 | ||
|  | 91886068fe | ||
|  | 6d1e9e5f92 | ||
|  | b640230b1e | ||
|  | 038b6ee9cd | ||
|  | 38806343a8 | ||
|  | 831ca4e3bf | ||
|  | b3dede4dd3 | ||
|  | 4e34132f4d | ||
|  | c07cb10247 | ||
|  | d7767a2a62 | ||
|  | ec035983fd | ||
|  | 596dcd85b2 | ||
|  | 7270c6a150 | ||
|  | f8b9ad7d50 | ||
|  | 04a1959895 | ||
|  | 93cc270016 | ||
|  | 29b60f7e1a | ||
|  | 902afcfbaf | ||
|  | 97a6b61551 | ||
|  | f011bdb869 | ||
|  | bafb101e4f | ||
|  | 08fdf05528 | ||
|  | 9e72a6b22e | ||
|  | 1c12c5612c | ||
|  | a8193c4bcb | ||
|  | c3d7ec65fa | ||
|  | 8b6a6c8236 | ||
|  | e0571c872b | ||
|  | c67f41887b | ||
|  | 84687ccf1f | ||
|  | 3274561cf8 | ||
| e08fbb3771 | |||
|  | d7464aa0fe | ||
|  | 00d29153f0 | ||
| 2ce989f220 | |||
|  | d7a1dc85be | ||
|  | fc19503673 | ||
|  | beba824136 | ||
|  | 6ebf8b12b6 | ||
|  | e5a7ed4362 | ||
|  | b9f7ea47c3 | ||
|  | 06f7ee202e | ||
|  | 2b2fc6453f | ||
|  | bdd2765461 | ||
|  | 4a45c06dd7 | ||
|  | d6a7d7d1e0 | ||
|  | 1a122a0dd8 | ||
|  | 20e20733e8 | ||
|  | b7cd1a19e3 | ||
|  | f510002a62 | ||
| eedcaf6470 | |||
|  | 1e257a1251 | ||
|  | 522f6bf91a | ||
|  | d35d87d2c2 | ||
|  | 74a5cda84b | ||
|  | 5be05d85b8 | ||
|  | 35ac85aea8 | ||
|  | fa237401ff | ||
|  | 97053adcb5 | ||
|  | f8fbe4d7a3 | ||
|  | ef31c012bf | ||
|  | 9e9f621d5d | ||
|  | 651e1a7cbc | ||
|  | c4d3672720 | ||
|  | 16be6d378c | ||
|  | f05d0565aa | ||
| b39f0d1fb6 | |||
| 9f1267dfe6 | |||
| 2e90285232 | |||
| e254de982e | |||
| 28d99b5297 | |||
|  | 9bf4108d1f | ||
|  | ee93f0218b | ||
|  | 6929a84c70 | ||
|  | 5c779a789b | ||
| 161ed102a5 | |||
|  | e863a948e3 | ||
|  | f65a585236 | ||
|  | 977f34dca6 | ||
|  | 90ad956340 | ||
|  | 7996f06335 | ||
|  | 7b40a3e3e5 | ||
|  | f7fbbaaca3 | ||
|  | 17629b8d9e | ||
|  | 0baa20d292 | ||
|  | 4571c918a4 | ||
|  | 5251ea4d30 | ||
|  | 7f456b4173 | ||
|  | ae99e99da2 | ||
|  | c291ef77b5 | ||
|  | 7dd2764bb2 | ||
|  | 244f8fb6dc | ||
| f3ca29af6c | |||
| 37988221a8 | |||
|  | 27dfe816fa | ||
|  | af29be2c90 | ||
|  | f96fac0aee | ||
| 7a327a3f28 | |||
|  | 07f2ebea1b | ||
|  | 851f2ad8ef | ||
|  | 23e0561dd6 | ||
|  | 8ae1a95ec6 | ||
|  | 82b7d4eaf0 | ||
|  | 78774fbdc0 | ||
|  | 924130833e | ||
|  | 0157274762 | ||
|  | 87e8aad5a0 | ||
|  | c6f59c2933 | ||
|  | b7f90aa011 | ||
| 92f8950a56 | |||
| 65987a8a58 | |||
| 889d828bc2 | |||
|  | f22b79da8f | ||
|  | 3855673ebf | ||
|  | 4db82da0db | ||
|  | 0cdc3d2fa5 | ||
| ad98b6193d | |||
| fc760016b3 | |||
| 2da86f7dae | |||
|  | 0dfda4bb90 | ||
|  | 1189ebc8b5 | ||
| 97843e2b58 | |||
| 82b3f54697 | |||
|  | 1bb8578173 | ||
| 673994b281 | |||
| bbc0eff078 | |||
| 4c60e31070 | |||
| afbf7d4c37 | |||
| 8c3cc32364 | |||
|  | 5214846341 | ||
| 4c3fd9fa3f | |||
| 17b3a10d46 | |||
| 149a46b92c | |||
|  | ce1a115e0b | ||
| db9c28a773 | |||
| 9ac3ac41df | |||
| 2af9ab9034 | |||
| 6f1ea96293 | |||
| 2e3c5890b6 | |||
| bc6678732f | |||
| b10ae00c8a | |||
|  | 0cd6b1858c | ||
|  | 0bd296dda4 | ||
|  | af0ccdd8e9 | ||
|  | 2fb92dbc6e | ||
|  | 5c74b6028b | ||
|  | e0be2b6e6c | ||
|  | ef72f322d2 | ||
|  | 7bc2065113 | ||
|  | 2bd4233919 | ||
|  | 143c70e29f | ||
|  | b812d5e39c | ||
|  | 01480da0a8 | ||
|  | 6ad73145bc | ||
| f7293f2ddb | |||
|  | 62749d05a6 | ||
|  | 3834feb4b7 | ||
|  | 6b8ee7bae0 | ||
|  | 739c2308b5 | ||
|  | 454302414d | ||
|  | a71b69389b | ||
|  | d49e502f53 | ||
|  | 92ec3404f8 | ||
|  | f4ebea3381 | ||
|  | cf167d0cd1 | ||
|  | 6f8b771a37 | ||
|  | 4e1ffdd17c | ||
|  | a783282b8b | ||
|  | 19b85d8486 | ||
|  | c363bdd784 | ||
|  | c30d96ea50 | ||
|  | 7ffe17ada1 | ||
| 330a9b3f4c | |||
|  | 28ff66a381 | ||
|  | 78c7bcee36 | ||
| 00a7b95631 | |||
| 94d8321d01 | |||
|  | ac24cc9f99 | ||
|  | 1d666771f9 | ||
|  | d50055cd96 | ||
|  | 3ab4c8c0bb | ||
|  | 47c7159177 | ||
|  | f415db583a | ||
|  | f55c16f984 | ||
|  | df67e013ca | ||
|  | 3e990c9d0a | ||
|  | 4b740fc8fd | ||
|  | cccd14b09e | ||
|  | e6acffdfc2 | ||
| 26d124283e | |||
| 0d889b7041 | |||
| ab31ad006a | |||
|  | 392130a537 | ||
|  | deef2673b2 | ||
|  | 977b0a6dd9 | ||
|  | 977d844394 | ||
| 6e4a06e180 | |||
|  | 590675e2ca | ||
|  | 8c65bdf6d3 | ||
|  | 74f1ed3bc5 | ||
|  | 79270ef510 | ||
|  | e250e6b7bb | ||
|  | 261342c15f | ||
|  | eda4dd622e | ||
|  | c68a2b9637 | ||
|  | 293df6cd20 | ||
|  | 65f61bb3bf | ||
|  | 26b9740d53 | ||
|  | 6eb873dd96 | ||
|  | 11b4c80b27 | ||
|  | c065e454c3 | ||
|  | d9b5fbd374 | ||
|  | cfbc1a26b8 | ||
|  | 257f69f931 | ||
|  | e415260961 | ||
|  | 446c768cd3 | 
							
								
								
									
										14
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										14
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -92,6 +92,8 @@ build*/* | |||||||
| ##################### | ##################### | ||||||
| *.xcodeproj/* | *.xcodeproj/* | ||||||
| build.sh | build.sh | ||||||
|  | .vscode | ||||||
|  | *.code-workspace | ||||||
|  |  | ||||||
| # Eigen source # | # Eigen source # | ||||||
| ################ | ################ | ||||||
| @@ -106,6 +108,10 @@ lib/fftw/* | |||||||
| m4/lt* | m4/lt* | ||||||
| m4/libtool.m4 | m4/libtool.m4 | ||||||
|  |  | ||||||
|  | # github pages # | ||||||
|  | ################ | ||||||
|  | gh-pages/ | ||||||
|  |  | ||||||
| # Buck files # | # Buck files # | ||||||
| ############## | ############## | ||||||
| .buck* | .buck* | ||||||
| @@ -116,4 +122,10 @@ make-bin-BUCK.sh | |||||||
| # generated sources # | # generated sources # | ||||||
| ##################### | ##################### | ||||||
| lib/qcd/spin/gamma-gen/*.h | lib/qcd/spin/gamma-gen/*.h | ||||||
| lib/qcd/spin/gamma-gen/*.cc | lib/qcd/spin/gamma-gen/*.cc | ||||||
|  |  | ||||||
|  | # vs code editor files # | ||||||
|  | ######################## | ||||||
|  | .vscode/ | ||||||
|  | .vscode/settings.json | ||||||
|  | settings.json | ||||||
|   | |||||||
							
								
								
									
										66
									
								
								.travis.yml
									
									
									
									
									
								
							
							
						
						
									
										66
									
								
								.travis.yml
									
									
									
									
									
								
							| @@ -9,62 +9,6 @@ matrix: | |||||||
|     - os:        osx |     - os:        osx | ||||||
|       osx_image: xcode8.3 |       osx_image: xcode8.3 | ||||||
|       compiler: clang |       compiler: clang | ||||||
|     - compiler: gcc |  | ||||||
|       addons: |  | ||||||
|         apt: |  | ||||||
|           sources: |  | ||||||
|             - ubuntu-toolchain-r-test |  | ||||||
|           packages: |  | ||||||
|             - g++-4.9 |  | ||||||
|             - libmpfr-dev |  | ||||||
|             - libgmp-dev |  | ||||||
|             - libmpc-dev |  | ||||||
|             - libopenmpi-dev |  | ||||||
|             - openmpi-bin |  | ||||||
|             - binutils-dev |  | ||||||
|       env: VERSION=-4.9 |  | ||||||
|     - compiler: gcc |  | ||||||
|       addons: |  | ||||||
|         apt: |  | ||||||
|           sources: |  | ||||||
|             - ubuntu-toolchain-r-test |  | ||||||
|           packages: |  | ||||||
|             - g++-5 |  | ||||||
|             - libmpfr-dev |  | ||||||
|             - libgmp-dev |  | ||||||
|             - libmpc-dev |  | ||||||
|             - libopenmpi-dev |  | ||||||
|             - openmpi-bin |  | ||||||
|             - binutils-dev |  | ||||||
|       env: VERSION=-5 |  | ||||||
|     - compiler: clang |  | ||||||
|       addons: |  | ||||||
|         apt: |  | ||||||
|           sources: |  | ||||||
|             - ubuntu-toolchain-r-test |  | ||||||
|           packages: |  | ||||||
|             - g++-4.8 |  | ||||||
|             - libmpfr-dev |  | ||||||
|             - libgmp-dev |  | ||||||
|             - libmpc-dev |  | ||||||
|             - libopenmpi-dev |  | ||||||
|             - openmpi-bin |  | ||||||
|             - binutils-dev |  | ||||||
|       env: CLANG_LINK=http://llvm.org/releases/3.8.0/clang+llvm-3.8.0-x86_64-linux-gnu-ubuntu-14.04.tar.xz |  | ||||||
|     - compiler: clang |  | ||||||
|       addons: |  | ||||||
|         apt: |  | ||||||
|           sources: |  | ||||||
|             - ubuntu-toolchain-r-test |  | ||||||
|           packages: |  | ||||||
|             - g++-4.8 |  | ||||||
|             - libmpfr-dev |  | ||||||
|             - libgmp-dev |  | ||||||
|             - libmpc-dev |  | ||||||
|             - libopenmpi-dev |  | ||||||
|             - openmpi-bin |  | ||||||
|             - binutils-dev |  | ||||||
|       env: CLANG_LINK=http://llvm.org/releases/3.7.0/clang+llvm-3.7.0-x86_64-linux-gnu-ubuntu-14.04.tar.xz |  | ||||||
|        |        | ||||||
| before_install: | before_install: | ||||||
|     - export GRIDDIR=`pwd` |     - export GRIDDIR=`pwd` | ||||||
| @@ -78,6 +22,10 @@ install: | |||||||
|     - export CC=$CC$VERSION |     - export CC=$CC$VERSION | ||||||
|     - export CXX=$CXX$VERSION |     - export CXX=$CXX$VERSION | ||||||
|     - echo $PATH |     - echo $PATH | ||||||
|  |     - which autoconf | ||||||
|  |     - autoconf  --version | ||||||
|  |     - which automake | ||||||
|  |     - automake  --version | ||||||
|     - which $CC |     - which $CC | ||||||
|     - $CC  --version |     - $CC  --version | ||||||
|     - which $CXX |     - which $CXX | ||||||
| @@ -95,9 +43,5 @@ script: | |||||||
|     - ../configure --enable-precision=double --enable-simd=SSE4 --enable-comms=none |     - ../configure --enable-precision=double --enable-simd=SSE4 --enable-comms=none | ||||||
|     - make -j4 |     - make -j4 | ||||||
|     - ./benchmarks/Benchmark_dwf --threads 1 --debug-signals |     - ./benchmarks/Benchmark_dwf --threads 1 --debug-signals | ||||||
|     - echo make clean |     - make check | ||||||
|     - if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then ../configure --enable-precision=single --enable-simd=SSE4 --enable-comms=mpi-auto CXXFLAGS='-DMPI_UINT32_T=MPI_UNSIGNED -DMPI_UINT64_T=MPI_UNSIGNED_LONG'; fi |  | ||||||
|     - if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then make -j4; fi |  | ||||||
|     - if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then mpirun.openmpi -n 2 ./benchmarks/Benchmark_dwf --threads 1 --mpi 2.1.1.1; fi |  | ||||||
|  |  | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										11
									
								
								Makefile.am
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								Makefile.am
									
									
									
									
									
								
							| @@ -3,10 +3,15 @@ SUBDIRS = lib benchmarks tests extras | |||||||
|  |  | ||||||
| include $(top_srcdir)/doxygen.inc | include $(top_srcdir)/doxygen.inc | ||||||
|  |  | ||||||
| tests: all | bin_SCRIPTS=grid-config | ||||||
| 	$(MAKE) -C tests tests |  | ||||||
|  |  | ||||||
| .PHONY: tests doxygen-run doxygen-doc $(DX_PS_GOAL) $(DX_PDF_GOAL) |  | ||||||
|  | .PHONY: bench check tests doxygen-run doxygen-doc $(DX_PS_GOAL) $(DX_PDF_GOAL) | ||||||
|  |  | ||||||
|  | tests-local: all | ||||||
|  | bench-local: all | ||||||
|  | check-local: all | ||||||
|  |  | ||||||
| AM_CXXFLAGS += -I$(top_builddir)/include | AM_CXXFLAGS += -I$(top_builddir)/include | ||||||
|  |  | ||||||
| ACLOCAL_AMFLAGS = -I m4 | ACLOCAL_AMFLAGS = -I m4 | ||||||
|   | |||||||
							
								
								
									
										302
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										302
									
								
								README.md
									
									
									
									
									
								
							| @@ -1,41 +1,13 @@ | |||||||
| # Grid | # Grid [),branch:name:develop)/statusIcon.svg)](http://ci.cliath.ph.ed.ac.uk/project.html?projectId=Grid&tab=projectOverview) [](https://travis-ci.org/paboyle/Grid) | ||||||
| <table> |  | ||||||
| <tr> |  | ||||||
|     <td>Last stable release</td> |  | ||||||
|     <td><a href="https://travis-ci.org/paboyle/Grid"> |  | ||||||
|     <img src="https://travis-ci.org/paboyle/Grid.svg?branch=master"></a> |  | ||||||
|     </td> |  | ||||||
| </tr> |  | ||||||
| <tr> |  | ||||||
|     <td>Development branch</td> |  | ||||||
|     <td><a href="https://travis-ci.org/paboyle/Grid"> |  | ||||||
|     <img src="https://travis-ci.org/paboyle/Grid.svg?branch=develop"></a> |  | ||||||
|     </td> |  | ||||||
| </tr> |  | ||||||
| </table> |  | ||||||
|  |  | ||||||
| **Data parallel C++ mathematical object library.** | **Data parallel C++ mathematical object library.** | ||||||
|  |  | ||||||
| License: GPL v2. | License: GPL v2. | ||||||
|  |  | ||||||
| Last update Nov 2016. | Last update June 2017. | ||||||
|  |  | ||||||
| _Please do not send pull requests to the `master` branch which is reserved for releases._ | _Please do not send pull requests to the `master` branch which is reserved for releases._ | ||||||
|  |  | ||||||
| ### Bug report |  | ||||||
|  |  | ||||||
| _To help us tracking and solving more efficiently issues with Grid, please report problems using the issue system of GitHub rather than sending emails to Grid developers._ |  | ||||||
|  |  | ||||||
| When you file an issue, please go though the following checklist: |  | ||||||
|  |  | ||||||
| 1. Check that the code is pointing to the `HEAD` of `develop` or any commit in `master` which is tagged with a version number.  |  | ||||||
| 2. Give a description of the target platform (CPU, network, compiler). Please give the full CPU part description, using for example `cat /proc/cpuinfo | grep 'model name' | uniq` (Linux) or `sysctl machdep.cpu.brand_string` (macOS) and the full output the `--version` option of your compiler. |  | ||||||
| 3. Give the exact `configure` command used. |  | ||||||
| 4. Attach `config.log`. |  | ||||||
| 5. Attach `config.summary`. |  | ||||||
| 6. Attach the output of `make V=1`. |  | ||||||
| 7. Describe the issue and any previous attempt to solve it. If relevant, show how to reproduce the issue using a minimal working example. |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
| ### Description | ### Description | ||||||
| @@ -58,13 +30,68 @@ optimally use MPI, OpenMP and SIMD parallelism under the hood. This is a signifi | |||||||
| for most programmers. | for most programmers. | ||||||
|  |  | ||||||
| The layout transformations are parametrised by the SIMD vector length. This adapts according to the architecture. | The layout transformations are parametrised by the SIMD vector length. This adapts according to the architecture. | ||||||
| Presently SSE4 (128 bit) AVX, AVX2, QPX (256 bit), IMCI, and AVX512 (512 bit) targets are supported (ARM NEON on the way). | Presently SSE4, ARM NEON (128 bits) AVX, AVX2, QPX (256 bits), IMCI and AVX512 (512 bits) targets are supported. | ||||||
|  |  | ||||||
| These are presented as `vRealF`, `vRealD`, `vComplexF`, and `vComplexD` internal vector data types. These may be useful in themselves for other programmers. | These are presented as `vRealF`, `vRealD`, `vComplexF`, and `vComplexD` internal vector data types.  | ||||||
| The corresponding scalar types are named `RealF`, `RealD`, `ComplexF` and `ComplexD`. | The corresponding scalar types are named `RealF`, `RealD`, `ComplexF` and `ComplexD`. | ||||||
|  |  | ||||||
| MPI, OpenMP, and SIMD parallelism are present in the library. | MPI, OpenMP, and SIMD parallelism are present in the library. | ||||||
| Please see https://arxiv.org/abs/1512.03487 for more detail. | Please see [this paper](https://arxiv.org/abs/1512.03487) for more detail. | ||||||
|  |  | ||||||
|  |  | ||||||
|  | ### Compilers | ||||||
|  |  | ||||||
|  | Intel ICPC v16.0.3 and later | ||||||
|  |  | ||||||
|  | Clang v3.5 and later (need 3.8 and later for OpenMP) | ||||||
|  |  | ||||||
|  | GCC   v4.9.x (recommended) | ||||||
|  |  | ||||||
|  | GCC   v6.3 and later | ||||||
|  |  | ||||||
|  | ### Important:  | ||||||
|  |  | ||||||
|  | Some versions of GCC appear to have a bug under high optimisation (-O2, -O3). | ||||||
|  |  | ||||||
|  | The safety of these compiler versions cannot be guaranteed at this time. Follow Issue 100 for details and updates. | ||||||
|  |  | ||||||
|  | GCC   v5.x | ||||||
|  |  | ||||||
|  | GCC   v6.1, v6.2 | ||||||
|  |  | ||||||
|  | ### Bug report | ||||||
|  |  | ||||||
|  | _To help us tracking and solving more efficiently issues with Grid, please report problems using the issue system of GitHub rather than sending emails to Grid developers._ | ||||||
|  |  | ||||||
|  | When you file an issue, please go though the following checklist: | ||||||
|  |  | ||||||
|  | 1. Check that the code is pointing to the `HEAD` of `develop` or any commit in `master` which is tagged with a version number.  | ||||||
|  | 2. Give a description of the target platform (CPU, network, compiler). Please give the full CPU part description, using for example `cat /proc/cpuinfo | grep 'model name' | uniq` (Linux) or `sysctl machdep.cpu.brand_string` (macOS) and the full output the `--version` option of your compiler. | ||||||
|  | 3. Give the exact `configure` command used. | ||||||
|  | 4. Attach `config.log`. | ||||||
|  | 5. Attach `grid.config.summary`. | ||||||
|  | 6. Attach the output of `make V=1`. | ||||||
|  | 7. Describe the issue and any previous attempt to solve it. If relevant, show how to reproduce the issue using a minimal working example. | ||||||
|  |  | ||||||
|  | ### Required libraries | ||||||
|  | Grid requires: | ||||||
|  |  | ||||||
|  | [GMP](https://gmplib.org/),  | ||||||
|  |  | ||||||
|  | [MPFR](http://www.mpfr.org/)  | ||||||
|  |  | ||||||
|  | Bootstrapping grid downloads and uses for internal dense matrix (non-QCD operations) the Eigen library. | ||||||
|  |  | ||||||
|  | Grid optionally uses: | ||||||
|  |  | ||||||
|  | [HDF5](https://support.hdfgroup.org/HDF5/)   | ||||||
|  |  | ||||||
|  | [LIME](http://usqcd-software.github.io/c-lime/) for ILDG and SciDAC file format support.  | ||||||
|  |  | ||||||
|  | [FFTW](http://www.fftw.org) either generic version or via the Intel MKL library. | ||||||
|  |  | ||||||
|  | LAPACK either generic version or Intel MKL library. | ||||||
|  |  | ||||||
|  |  | ||||||
| ### Quick start | ### Quick start | ||||||
| First, start by cloning the repository: | First, start by cloning the repository: | ||||||
| @@ -95,10 +122,10 @@ install Grid. Other options are detailed in the next section, you can also use ` | |||||||
| `CXX`, `CXXFLAGS`, `LDFLAGS`, ... environment variables can be modified to | `CXX`, `CXXFLAGS`, `LDFLAGS`, ... environment variables can be modified to | ||||||
| customise the build. | customise the build. | ||||||
|  |  | ||||||
| Finally, you can build and install Grid: | Finally, you can build, check, and install Grid: | ||||||
|  |  | ||||||
| ``` bash | ``` bash | ||||||
| make; make install | make; make check; make install | ||||||
| ``` | ``` | ||||||
|  |  | ||||||
| To minimise the build time, only the tests at the root of the `tests` directory are built by default. If you want to build tests in the sub-directory `<subdir>` you can execute: | To minimise the build time, only the tests at the root of the `tests` directory are built by default. If you want to build tests in the sub-directory `<subdir>` you can execute: | ||||||
| @@ -121,7 +148,7 @@ If you want to build all the tests at once just use `make tests`. | |||||||
| - `--enable-gen-simd-width=<size>`: select the size (in bytes) of the generic SIMD vector type (default: 32 bytes). | - `--enable-gen-simd-width=<size>`: select the size (in bytes) of the generic SIMD vector type (default: 32 bytes). | ||||||
| - `--enable-precision={single|double}`: set the default precision (default: `double`). | - `--enable-precision={single|double}`: set the default precision (default: `double`). | ||||||
| - `--enable-precision=<comm>`: Use `<comm>` for message passing (default: `none`). A list of possible SIMD targets is detailed in a section below. | - `--enable-precision=<comm>`: Use `<comm>` for message passing (default: `none`). A list of possible SIMD targets is detailed in a section below. | ||||||
| - `--enable-rng={ranlux48|mt19937}`: choose the RNG (default: `ranlux48 `). | - `--enable-rng={sitmo|ranlux48|mt19937}`: choose the RNG (default: `sitmo `). | ||||||
| - `--disable-timers`: disable system dependent high-resolution timers. | - `--disable-timers`: disable system dependent high-resolution timers. | ||||||
| - `--enable-chroma`: enable Chroma regression tests. | - `--enable-chroma`: enable Chroma regression tests. | ||||||
| - `--enable-doxygen-doc`: enable the Doxygen documentation generation (build with `make doxygen-doc`) | - `--enable-doxygen-doc`: enable the Doxygen documentation generation (build with `make doxygen-doc`) | ||||||
| @@ -135,7 +162,6 @@ The following options can be use with the `--enable-comms=` option to target dif | |||||||
| | `none`         | no communications                                             | | | `none`         | no communications                                             | | ||||||
| | `mpi[-auto]`   | MPI communications                                            | | | `mpi[-auto]`   | MPI communications                                            | | ||||||
| | `mpi3[-auto]`  | MPI communications using MPI 3 shared memory                  | | | `mpi3[-auto]`  | MPI communications using MPI 3 shared memory                  | | ||||||
| | `mpi3l[-auto]` | MPI communications using MPI 3 shared memory and leader model | |  | ||||||
| | `shmem `       | Cray SHMEM communications                                     | | | `shmem `       | Cray SHMEM communications                                     | | ||||||
|  |  | ||||||
| For the MPI interfaces the optional `-auto` suffix instructs the `configure` scripts to determine all the necessary compilation and linking flags. This is done by extracting the informations from the MPI wrapper specified in the environment variable `MPICXX` (if not specified `configure` will scan though a list of default names). The `-auto` suffix is not supported by the Cray environment wrapper scripts. Use the standard versions instead.   | For the MPI interfaces the optional `-auto` suffix instructs the `configure` scripts to determine all the necessary compilation and linking flags. This is done by extracting the informations from the MPI wrapper specified in the environment variable `MPICXX` (if not specified `configure` will scan though a list of default names). The `-auto` suffix is not supported by the Cray environment wrapper scripts. Use the standard versions instead.   | ||||||
| @@ -153,13 +179,13 @@ The following options can be use with the `--enable-simd=` option to target diff | |||||||
| | `AVXFMA4`   | AVX (256 bit) + FMA4                   | | | `AVXFMA4`   | AVX (256 bit) + FMA4                   | | ||||||
| | `AVX2`      | AVX 2 (256 bit)                        | | | `AVX2`      | AVX 2 (256 bit)                        | | ||||||
| | `AVX512`    | AVX 512 bit                            | | | `AVX512`    | AVX 512 bit                            | | ||||||
| | `QPX`       | QPX (256 bit)                          | | | `NEONv8`    | [ARM NEON](http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.den0024a/ch07s03.html) (128 bit)                     | | ||||||
|  | | `QPX`       | IBM QPX (256 bit)                      | | ||||||
|  |  | ||||||
| Alternatively, some CPU codenames can be directly used: | Alternatively, some CPU codenames can be directly used: | ||||||
|  |  | ||||||
| | `<code>`    | Description                            | | | `<code>`    | Description                            | | ||||||
| | ----------- | -------------------------------------- | | | ----------- | -------------------------------------- | | ||||||
| | `KNC`       | [Intel Xeon Phi codename Knights Corner](http://ark.intel.com/products/codename/57721/Knights-Corner) | |  | ||||||
| | `KNL`       | [Intel Xeon Phi codename Knights Landing](http://ark.intel.com/products/codename/48999/Knights-Landing) | | | `KNL`       | [Intel Xeon Phi codename Knights Landing](http://ark.intel.com/products/codename/48999/Knights-Landing) | | ||||||
| | `BGQ`       | Blue Gene/Q                            | | | `BGQ`       | Blue Gene/Q                            | | ||||||
|  |  | ||||||
| @@ -176,21 +202,205 @@ The following configuration is recommended for the Intel Knights Landing platfor | |||||||
| ``` bash | ``` bash | ||||||
| ../configure --enable-precision=double\ | ../configure --enable-precision=double\ | ||||||
|              --enable-simd=KNL        \ |              --enable-simd=KNL        \ | ||||||
|              --enable-comms=mpi-auto \ |              --enable-comms=mpi-auto  \ | ||||||
|              --with-gmp=<path>        \ |  | ||||||
|              --with-mpfr=<path>       \ |  | ||||||
|              --enable-mkl             \ |              --enable-mkl             \ | ||||||
|              CXX=icpc MPICXX=mpiicpc |              CXX=icpc MPICXX=mpiicpc | ||||||
| ``` | ``` | ||||||
|  | The MKL flag enables use of BLAS and FFTW from the Intel Math Kernels Library. | ||||||
|  |  | ||||||
| where `<path>` is the UNIX prefix where GMP and MPFR are installed. If you are working on a Cray machine that does not use the `mpiicpc` wrapper, please use: | If you are working on a Cray machine that does not use the `mpiicpc` wrapper, please use: | ||||||
|  |  | ||||||
| ``` bash | ``` bash | ||||||
| ../configure --enable-precision=double\ | ../configure --enable-precision=double\ | ||||||
|              --enable-simd=KNL        \ |              --enable-simd=KNL        \ | ||||||
|              --enable-comms=mpi       \ |              --enable-comms=mpi       \ | ||||||
|              --with-gmp=<path>        \ |  | ||||||
|              --with-mpfr=<path>       \ |  | ||||||
|              --enable-mkl             \ |              --enable-mkl             \ | ||||||
|              CXX=CC CC=cc |              CXX=CC CC=cc | ||||||
| ``` | ``` | ||||||
|  |  | ||||||
|  | If gmp and mpfr are NOT in standard places (/usr/) these flags may be needed: | ||||||
|  | ``` bash | ||||||
|  |                --with-gmp=<path>        \ | ||||||
|  |                --with-mpfr=<path>       \ | ||||||
|  | ``` | ||||||
|  | where `<path>` is the UNIX prefix where GMP and MPFR are installed.  | ||||||
|  |  | ||||||
|  | Knight's Landing with Intel Omnipath adapters with two adapters per node  | ||||||
|  | presently performs better with use of more than one rank per node, using shared memory  | ||||||
|  | for interior communication. This is the mpi3 communications implementation.  | ||||||
|  | We recommend four ranks per node for best performance, but optimum is local volume dependent. | ||||||
|  |  | ||||||
|  | ``` bash | ||||||
|  | ../configure --enable-precision=double\ | ||||||
|  |              --enable-simd=KNL        \ | ||||||
|  |              --enable-comms=mpi3-auto \ | ||||||
|  |              --enable-mkl             \ | ||||||
|  |              CC=icpc MPICXX=mpiicpc  | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | ### Build setup for Intel Haswell Xeon platform | ||||||
|  |  | ||||||
|  | The following configuration is recommended for the Intel Haswell platform: | ||||||
|  |  | ||||||
|  | ``` bash | ||||||
|  | ../configure --enable-precision=double\ | ||||||
|  |              --enable-simd=AVX2       \ | ||||||
|  |              --enable-comms=mpi3-auto \ | ||||||
|  |              --enable-mkl             \ | ||||||
|  |              CXX=icpc MPICXX=mpiicpc | ||||||
|  | ``` | ||||||
|  | The MKL flag enables use of BLAS and FFTW from the Intel Math Kernels Library. | ||||||
|  |  | ||||||
|  | If gmp and mpfr are NOT in standard places (/usr/) these flags may be needed: | ||||||
|  | ``` bash | ||||||
|  |                --with-gmp=<path>        \ | ||||||
|  |                --with-mpfr=<path>       \ | ||||||
|  | ``` | ||||||
|  | where `<path>` is the UNIX prefix where GMP and MPFR are installed.  | ||||||
|  |  | ||||||
|  | If you are working on a Cray machine that does not use the `mpiicpc` wrapper, please use: | ||||||
|  |  | ||||||
|  | ``` bash | ||||||
|  | ../configure --enable-precision=double\ | ||||||
|  |              --enable-simd=AVX2       \ | ||||||
|  |              --enable-comms=mpi3      \ | ||||||
|  |              --enable-mkl             \ | ||||||
|  |              CXX=CC CC=cc | ||||||
|  | ``` | ||||||
|  | Since Dual socket nodes are commonplace, we recommend MPI-3 as the default with the use of  | ||||||
|  | one rank per socket. If using the Intel MPI library, threads should be pinned to NUMA domains using | ||||||
|  | ``` | ||||||
|  |         export I_MPI_PIN=1 | ||||||
|  | ``` | ||||||
|  | This is the default. | ||||||
|  |  | ||||||
|  | ### Build setup for Intel Skylake Xeon platform | ||||||
|  |  | ||||||
|  | The following configuration is recommended for the Intel Skylake platform: | ||||||
|  |  | ||||||
|  | ``` bash | ||||||
|  | ../configure --enable-precision=double\ | ||||||
|  |              --enable-simd=AVX512     \ | ||||||
|  |              --enable-comms=mpi3      \ | ||||||
|  |              --enable-mkl             \ | ||||||
|  |              CXX=mpiicpc | ||||||
|  | ``` | ||||||
|  | The MKL flag enables use of BLAS and FFTW from the Intel Math Kernels Library. | ||||||
|  |  | ||||||
|  | If gmp and mpfr are NOT in standard places (/usr/) these flags may be needed: | ||||||
|  | ``` bash | ||||||
|  |                --with-gmp=<path>        \ | ||||||
|  |                --with-mpfr=<path>       \ | ||||||
|  | ``` | ||||||
|  | where `<path>` is the UNIX prefix where GMP and MPFR are installed.  | ||||||
|  |  | ||||||
|  | If you are working on a Cray machine that does not use the `mpiicpc` wrapper, please use: | ||||||
|  |  | ||||||
|  | ``` bash | ||||||
|  | ../configure --enable-precision=double\ | ||||||
|  |              --enable-simd=AVX512     \ | ||||||
|  |              --enable-comms=mpi3      \ | ||||||
|  |              --enable-mkl             \ | ||||||
|  |              CXX=CC CC=cc | ||||||
|  | ``` | ||||||
|  | Since Dual socket nodes are commonplace, we recommend MPI-3 as the default with the use of  | ||||||
|  | one rank per socket. If using the Intel MPI library, threads should be pinned to NUMA domains using | ||||||
|  | ```  | ||||||
|  |         export I_MPI_PIN=1 | ||||||
|  | ``` | ||||||
|  | This is the default.  | ||||||
|  |  | ||||||
|  | #### Expected Skylake Gold 6148 dual socket (single prec, single node 20+20 cores) performance using NUMA MPI mapping):  | ||||||
|  |  | ||||||
|  | mpirun -n 2 benchmarks/Benchmark_dwf --grid 16.16.16.16 --mpi 2.1.1.1 --cacheblocking 2.2.2.2 --dslash-asm --shm 1024 --threads 18  | ||||||
|  |  | ||||||
|  | TBA | ||||||
|  |  | ||||||
|  |  | ||||||
|  | ### Build setup for AMD EPYC / RYZEN | ||||||
|  |  | ||||||
|  | The AMD EPYC is a multichip module comprising 32 cores spread over four distinct chips each with 8 cores. | ||||||
|  | So, even with a single socket node there is a quad-chip module. Dual socket nodes with 64 cores total | ||||||
|  | are common. Each chip within the module exposes a separate NUMA domain. | ||||||
|  | There are four NUMA domains per socket and we recommend one MPI rank per NUMA domain. | ||||||
|  | MPI-3 is recommended with the use of four ranks per socket, | ||||||
|  | and 8 threads per rank.  | ||||||
|  |  | ||||||
|  | The following configuration is recommended for the AMD EPYC platform. | ||||||
|  |  | ||||||
|  | ``` bash | ||||||
|  | ../configure --enable-precision=double\ | ||||||
|  |              --enable-simd=AVX2       \ | ||||||
|  |              --enable-comms=mpi3 \ | ||||||
|  |              CXX=mpicxx  | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | If gmp and mpfr are NOT in standard places (/usr/) these flags may be needed: | ||||||
|  | ``` bash | ||||||
|  |                --with-gmp=<path>        \ | ||||||
|  |                --with-mpfr=<path>       \ | ||||||
|  | ``` | ||||||
|  | where `<path>` is the UNIX prefix where GMP and MPFR are installed.  | ||||||
|  |  | ||||||
|  | Using MPICH and g++ v4.9.2, best performance can be obtained using explicit GOMP_CPU_AFFINITY flags for each MPI rank. | ||||||
|  | This can be done by invoking MPI on a wrapper script omp_bind.sh to handle this.  | ||||||
|  |  | ||||||
|  | It is recommended to run 8 MPI ranks on a single dual socket AMD EPYC, with 8 threads per rank using MPI3 and | ||||||
|  | shared memory to communicate within this node: | ||||||
|  |  | ||||||
|  | mpirun -np 8 ./omp_bind.sh ./Benchmark_dwf --mpi 2.2.2.1 --dslash-unroll --threads 8 --grid 16.16.16.16 --cacheblocking 4.4.4.4  | ||||||
|  |  | ||||||
|  | Where omp_bind.sh does the following: | ||||||
|  | ``` | ||||||
|  | #!/bin/bash | ||||||
|  |  | ||||||
|  | numanode=` expr $PMI_RANK % 8 ` | ||||||
|  | basecore=`expr $numanode \* 16` | ||||||
|  | core0=`expr $basecore + 0 ` | ||||||
|  | core1=`expr $basecore + 2 ` | ||||||
|  | core2=`expr $basecore + 4 ` | ||||||
|  | core3=`expr $basecore + 6 ` | ||||||
|  | core4=`expr $basecore + 8 ` | ||||||
|  | core5=`expr $basecore + 10 ` | ||||||
|  | core6=`expr $basecore + 12 ` | ||||||
|  | core7=`expr $basecore + 14 ` | ||||||
|  |  | ||||||
|  | export GOMP_CPU_AFFINITY="$core0 $core1 $core2 $core3 $core4 $core5 $core6 $core7" | ||||||
|  | echo GOMP_CUP_AFFINITY $GOMP_CPU_AFFINITY | ||||||
|  |  | ||||||
|  | $@ | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | Performance: | ||||||
|  |  | ||||||
|  | #### Expected AMD EPYC 7601 dual socket (single prec, single node 32+32 cores) performance using NUMA MPI mapping):  | ||||||
|  |  | ||||||
|  | mpirun  -np 8 ./omp_bind.sh ./Benchmark_dwf --threads 8 --mpi 2.2.2.1 --dslash-unroll --grid 16.16.16.16 --cacheblocking 4.4.4.4 | ||||||
|  |  | ||||||
|  | TBA | ||||||
|  |  | ||||||
|  | ### Build setup for BlueGene/Q | ||||||
|  |  | ||||||
|  | To be written... | ||||||
|  |  | ||||||
|  | ### Build setup for ARM Neon | ||||||
|  |  | ||||||
|  | To be written... | ||||||
|  |  | ||||||
|  | ### Build setup for laptops, other compilers, non-cluster builds | ||||||
|  |  | ||||||
|  | Many versions of g++ and clang++ work with Grid, and involve merely replacing CXX (and MPICXX), | ||||||
|  | and omit the enable-mkl flag.  | ||||||
|  |  | ||||||
|  | Single node builds are enabled with  | ||||||
|  | ``` | ||||||
|  |             --enable-comms=none | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | FFTW support that is not in the default search path may then enabled with | ||||||
|  | ``` | ||||||
|  |     --with-fftw=<installpath> | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | BLAS will not be compiled in by default, and Lanczos will default to Eigen diagonalisation. | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										53
									
								
								TODO
									
									
									
									
									
								
							
							
						
						
									
										53
									
								
								TODO
									
									
									
									
									
								
							| @@ -1,26 +1,49 @@ | |||||||
| TODO: | TODO: | ||||||
| --------------- | --------------- | ||||||
|  |  | ||||||
| Peter's work list: | Code item work list | ||||||
|  |  | ||||||
| -- Remove DenseVector, DenseMatrix; Use Eigen instead. <-- started | a) namespaces & indentation | ||||||
| -- Merge high precision reduction into develop         <-- done |  GRID_BEGIN_NAMESPACE(); | ||||||
| -- Precision conversion and sort out localConvert      <--  |  GRID_END_NAMESPACE(); | ||||||
| -- Physical propagator interface | -- delete QCD namespace | ||||||
|  |  | ||||||
| -- multiRHS DWF; benchmark on Cori/BNL for comms elimination | b) GPU branch | ||||||
|    -- slice* linalg routines for multiRHS, BlockCG        <-- started | - start branch | ||||||
|  | - Increase Macro use in core library support; prepare for change | ||||||
|  | - Audit volume of "device" code | ||||||
|  | - Virtual function audit | ||||||
|  | - Start port once Nvidia box is up | ||||||
|  | - Cut down volume of code for first port? How? | ||||||
|  |  | ||||||
| -- Profile CG, BlockCG, etc... Flop count/rate | Physics item work list: | ||||||
| -- Binary I/O speed up & x-strips |  | ||||||
| -- Half-precision comms                                <-- started |  | ||||||
| -- GaugeFix into central location |  | ||||||
| -- FFTfix in sensible place |  | ||||||
| -- Multigrid Wilson and DWF, compare to other Multigrid implementations |  | ||||||
| -- quaternions                 -- Might not need |  | ||||||
|  |  | ||||||
|  | 1)- BG/Q port and check ; Andrew says ok. | ||||||
|  | 2)- Consistent linear solver flop count/rate -- PARTIAL, time but no flop/s yet | ||||||
|  | 3)- Physical propagator interface | ||||||
|  | 4)- Multigrid Wilson and DWF, compare to other Multigrid implementations | ||||||
|  | 5)- HDCR resume | ||||||
|  |  | ||||||
| -- Conserved currents | ---------------------------- | ||||||
|  | Recent DONE  | ||||||
|  | -- RNG I/O in ILDG/SciDAC (minor)  | ||||||
|  | -- Precision conversion and sort out localConvert      <-- partial/easy | ||||||
|  | -- Conserved currents (Andrew) | ||||||
|  | -- Split grid | ||||||
|  | -- Christoph's local basis expansion Lanczos | ||||||
|  | -- MultiRHS with spread out extra dim -- Go through filesystem with SciDAC I/O ; <-- DONE ; bmark cori | ||||||
|  | -- Lanczos Remove DenseVector, DenseMatrix; Use Eigen instead. <-- DONE | ||||||
|  | -- GaugeFix into central location                      <-- DONE | ||||||
|  | -- Scidac and Ildg metadata handling                   <-- DONE | ||||||
|  | -- Binary I/O MPI2 IO                                  <-- DONE | ||||||
|  | -- Binary I/O speed up & x-strips                      <-- DONE | ||||||
|  | -- Cut down the exterior overhead                      <-- DONE | ||||||
|  | -- Interior legs from SHM comms                        <-- DONE | ||||||
|  | -- Half-precision comms                                <-- DONE | ||||||
|  | -- Merge high precision reduction into develop         <-- DONE | ||||||
|  | -- BlockCG, BCGrQ                                      <-- DONE | ||||||
|  | -- multiRHS DWF; benchmark on Cori/BNL for comms elimination <-- DONE | ||||||
|  |    -- slice* linalg routines for multiRHS, BlockCG     | ||||||
|  |  | ||||||
| ----- | ----- | ||||||
| * Forces; the UdSdU  term in gauge force term is half of what I think it should | * Forces; the UdSdU  term in gauge force term is half of what I think it should | ||||||
|   | |||||||
							
								
								
									
										9
									
								
								VERSION
									
									
									
									
									
								
							
							
						
						
									
										9
									
								
								VERSION
									
									
									
									
									
								
							| @@ -1,6 +1,5 @@ | |||||||
| Version : 0.6.0 | Version : 0.7.0 | ||||||
|  |  | ||||||
| - AVX512, AVX2, AVX, SSE good | - Clang 3.5 and above, ICPC v16 and above, GCC 6.3 and above recommended | ||||||
| - Clang 3.5 and above, ICPC v16 and above, GCC 4.9 and above | - MPI and MPI3 comms optimisations for KNL and OPA finished | ||||||
| - MPI and MPI3 | - Half precision comms | ||||||
| - HiRep, Smearing, Generic gauge group |  | ||||||
|   | |||||||
							
								
								
									
										800
									
								
								benchmarks/Benchmark_ITT.cc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										800
									
								
								benchmarks/Benchmark_ITT.cc
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,800 @@ | |||||||
|  |     /************************************************************************************* | ||||||
|  |  | ||||||
|  |     Grid physics library, www.github.com/paboyle/Grid  | ||||||
|  |  | ||||||
|  |     Source file: ./benchmarks/Benchmark_memory_bandwidth.cc | ||||||
|  |  | ||||||
|  |     Copyright (C) 2015 | ||||||
|  |  | ||||||
|  | Author: Peter Boyle <paboyle@ph.ed.ac.uk> | ||||||
|  | Author: paboyle <paboyle@ph.ed.ac.uk> | ||||||
|  |  | ||||||
|  |     This program is free software; you can redistribute it and/or modify | ||||||
|  |     it under the terms of the GNU General Public License as published by | ||||||
|  |     the Free Software Foundation; either version 2 of the License, or | ||||||
|  |     (at your option) any later version. | ||||||
|  |  | ||||||
|  |     This program is distributed in the hope that it will be useful, | ||||||
|  |     but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  |     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||||
|  |     GNU General Public License for more details. | ||||||
|  |  | ||||||
|  |     You should have received a copy of the GNU General Public License along | ||||||
|  |     with this program; if not, write to the Free Software Foundation, Inc., | ||||||
|  |     51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | ||||||
|  |  | ||||||
|  |     See the full license in the file "LICENSE" in the top level distribution directory | ||||||
|  |     *************************************************************************************/ | ||||||
|  |     /*  END LEGAL */ | ||||||
|  | #include <Grid/Grid.h> | ||||||
|  |  | ||||||
|  | using namespace std; | ||||||
|  | using namespace Grid; | ||||||
|  | using namespace Grid::QCD; | ||||||
|  |  | ||||||
|  | typedef WilsonFermion5D<DomainWallVec5dImplR> WilsonFermion5DR; | ||||||
|  | typedef WilsonFermion5D<DomainWallVec5dImplF> WilsonFermion5DF; | ||||||
|  | typedef WilsonFermion5D<DomainWallVec5dImplD> WilsonFermion5DD; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | std::vector<int> L_list; | ||||||
|  | std::vector<int> Ls_list; | ||||||
|  | std::vector<double> mflop_list; | ||||||
|  |  | ||||||
|  | double mflop_ref; | ||||||
|  | double mflop_ref_err; | ||||||
|  |  | ||||||
|  | int NN_global; | ||||||
|  |  | ||||||
|  | struct time_statistics{ | ||||||
|  |   double mean; | ||||||
|  |   double err; | ||||||
|  |   double min; | ||||||
|  |   double max; | ||||||
|  |  | ||||||
|  |   void statistics(std::vector<double> v){ | ||||||
|  |       double sum = std::accumulate(v.begin(), v.end(), 0.0); | ||||||
|  |       mean = sum / v.size(); | ||||||
|  |  | ||||||
|  |       std::vector<double> diff(v.size()); | ||||||
|  |       std::transform(v.begin(), v.end(), diff.begin(), [=](double x) { return x - mean; }); | ||||||
|  |       double sq_sum = std::inner_product(diff.begin(), diff.end(), diff.begin(), 0.0); | ||||||
|  |       err = std::sqrt(sq_sum / (v.size()*(v.size() - 1))); | ||||||
|  |  | ||||||
|  |       auto result = std::minmax_element(v.begin(), v.end()); | ||||||
|  |       min = *result.first; | ||||||
|  |       max = *result.second; | ||||||
|  | } | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | void comms_header(){ | ||||||
|  |   std::cout <<GridLogMessage << " L  "<<"\t"<<" Ls  "<<"\t" | ||||||
|  |             <<std::setw(11)<<"bytes"<<"MB/s uni (err/min/max)"<<"\t\t"<<"MB/s bidi (err/min/max)"<<std::endl; | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | Gamma::Algebra Gmu [] = { | ||||||
|  |   Gamma::Algebra::GammaX, | ||||||
|  |   Gamma::Algebra::GammaY, | ||||||
|  |   Gamma::Algebra::GammaZ, | ||||||
|  |   Gamma::Algebra::GammaT | ||||||
|  | }; | ||||||
|  | struct controls { | ||||||
|  |   int Opt; | ||||||
|  |   int CommsOverlap; | ||||||
|  |   Grid::CartesianCommunicator::CommunicatorPolicy_t CommsAsynch; | ||||||
|  |   //  int HugePages; | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | class Benchmark { | ||||||
|  | public: | ||||||
|  |   static void Decomposition (void ) { | ||||||
|  |  | ||||||
|  |     int threads = GridThread::GetThreads(); | ||||||
|  |     std::cout<<GridLogMessage << "=================================================================================="<<std::endl; | ||||||
|  |     std::cout<<GridLogMessage << "= Grid is setup to use "<<threads<<" threads"<<std::endl; | ||||||
|  |     std::cout<<GridLogMessage << "=================================================================================="<<std::endl; | ||||||
|  |     std::cout<<GridLogMessage<<"Grid Default Decomposition patterns\n"; | ||||||
|  |     std::cout<<GridLogMessage<<"\tOpenMP threads : "<<GridThread::GetThreads()<<std::endl; | ||||||
|  |     std::cout<<GridLogMessage<<"\tMPI tasks      : "<<GridCmdVectorIntToString(GridDefaultMpi())<<std::endl; | ||||||
|  |     std::cout<<GridLogMessage<<"\tvReal          : "<<sizeof(vReal )*8    <<"bits ; " <<GridCmdVectorIntToString(GridDefaultSimd(4,vReal::Nsimd()))<<std::endl; | ||||||
|  |     std::cout<<GridLogMessage<<"\tvRealF         : "<<sizeof(vRealF)*8    <<"bits ; " <<GridCmdVectorIntToString(GridDefaultSimd(4,vRealF::Nsimd()))<<std::endl; | ||||||
|  |     std::cout<<GridLogMessage<<"\tvRealD         : "<<sizeof(vRealD)*8    <<"bits ; " <<GridCmdVectorIntToString(GridDefaultSimd(4,vRealD::Nsimd()))<<std::endl; | ||||||
|  |     std::cout<<GridLogMessage<<"\tvComplex       : "<<sizeof(vComplex )*8 <<"bits ; " <<GridCmdVectorIntToString(GridDefaultSimd(4,vComplex::Nsimd()))<<std::endl; | ||||||
|  |     std::cout<<GridLogMessage<<"\tvComplexF      : "<<sizeof(vComplexF)*8 <<"bits ; " <<GridCmdVectorIntToString(GridDefaultSimd(4,vComplexF::Nsimd()))<<std::endl; | ||||||
|  |     std::cout<<GridLogMessage<<"\tvComplexD      : "<<sizeof(vComplexD)*8 <<"bits ; " <<GridCmdVectorIntToString(GridDefaultSimd(4,vComplexD::Nsimd()))<<std::endl; | ||||||
|  |     std::cout<<GridLogMessage << "=================================================================================="<<std::endl; | ||||||
|  |  | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   static void Comms(void) | ||||||
|  |   { | ||||||
|  |     int Nloop=200; | ||||||
|  |     int nmu=0; | ||||||
|  |     int maxlat=32; | ||||||
|  |  | ||||||
|  |     std::vector<int> simd_layout = GridDefaultSimd(Nd,vComplexD::Nsimd()); | ||||||
|  |     std::vector<int> mpi_layout  = GridDefaultMpi(); | ||||||
|  |  | ||||||
|  |     for(int mu=0;mu<Nd;mu++) if (mpi_layout[mu]>1) nmu++; | ||||||
|  |  | ||||||
|  |     std::vector<double> t_time(Nloop); | ||||||
|  |     time_statistics timestat; | ||||||
|  |  | ||||||
|  |     std::cout<<GridLogMessage << "===================================================================================================="<<std::endl; | ||||||
|  |     std::cout<<GridLogMessage << "= Benchmarking threaded STENCIL halo exchange in "<<nmu<<" dimensions"<<std::endl; | ||||||
|  |     std::cout<<GridLogMessage << "===================================================================================================="<<std::endl; | ||||||
|  |     comms_header(); | ||||||
|  |  | ||||||
|  |     for(int lat=4;lat<=maxlat;lat+=4){ | ||||||
|  |       for(int Ls=8;Ls<=8;Ls*=2){ | ||||||
|  |  | ||||||
|  | 	std::vector<int> latt_size  ({lat*mpi_layout[0], | ||||||
|  | 	      lat*mpi_layout[1], | ||||||
|  | 	      lat*mpi_layout[2], | ||||||
|  | 	      lat*mpi_layout[3]}); | ||||||
|  |  | ||||||
|  | 	GridCartesian     Grid(latt_size,simd_layout,mpi_layout); | ||||||
|  | 	RealD Nrank = Grid._Nprocessors; | ||||||
|  | 	RealD Nnode = Grid.NodeCount(); | ||||||
|  | 	RealD ppn = Nrank/Nnode; | ||||||
|  |  | ||||||
|  | 	std::vector<HalfSpinColourVectorD *> xbuf(8); | ||||||
|  | 	std::vector<HalfSpinColourVectorD *> rbuf(8); | ||||||
|  | 	Grid.ShmBufferFreeAll(); | ||||||
|  | 	for(int d=0;d<8;d++){ | ||||||
|  | 	  xbuf[d] = (HalfSpinColourVectorD *)Grid.ShmBufferMalloc(lat*lat*lat*Ls*sizeof(HalfSpinColourVectorD)); | ||||||
|  | 	  rbuf[d] = (HalfSpinColourVectorD *)Grid.ShmBufferMalloc(lat*lat*lat*Ls*sizeof(HalfSpinColourVectorD)); | ||||||
|  | 	  bzero((void *)xbuf[d],lat*lat*lat*Ls*sizeof(HalfSpinColourVectorD)); | ||||||
|  | 	  bzero((void *)rbuf[d],lat*lat*lat*Ls*sizeof(HalfSpinColourVectorD)); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	int bytes=lat*lat*lat*Ls*sizeof(HalfSpinColourVectorD); | ||||||
|  | 	int ncomm; | ||||||
|  | 	double dbytes; | ||||||
|  | 	std::vector<double> times(Nloop); | ||||||
|  | 	for(int i=0;i<Nloop;i++){ | ||||||
|  |  | ||||||
|  | 	  double start=usecond(); | ||||||
|  |  | ||||||
|  | 	  dbytes=0; | ||||||
|  | 	  ncomm=0; | ||||||
|  |  | ||||||
|  | 	  parallel_for(int dir=0;dir<8;dir++){ | ||||||
|  |  | ||||||
|  | 	    double tbytes; | ||||||
|  | 	    int mu =dir % 4; | ||||||
|  |  | ||||||
|  | 	    if (mpi_layout[mu]>1 ) { | ||||||
|  | 	         | ||||||
|  | 	      int xmit_to_rank; | ||||||
|  | 	      int recv_from_rank; | ||||||
|  | 	      if ( dir == mu ) {  | ||||||
|  | 		int comm_proc=1; | ||||||
|  | 		Grid.ShiftedRanks(mu,comm_proc,xmit_to_rank,recv_from_rank); | ||||||
|  | 	      } else {  | ||||||
|  | 		int comm_proc = mpi_layout[mu]-1; | ||||||
|  | 		Grid.ShiftedRanks(mu,comm_proc,xmit_to_rank,recv_from_rank); | ||||||
|  | 	      } | ||||||
|  | 	      tbytes= Grid.StencilSendToRecvFrom((void *)&xbuf[dir][0], xmit_to_rank, | ||||||
|  | 						 (void *)&rbuf[dir][0], recv_from_rank, | ||||||
|  | 						 bytes,dir); | ||||||
|  | 	   | ||||||
|  | #ifdef GRID_OMP | ||||||
|  | #pragma omp atomic | ||||||
|  | #endif | ||||||
|  | 	      ncomm++; | ||||||
|  |  | ||||||
|  | #ifdef GRID_OMP | ||||||
|  | #pragma omp atomic | ||||||
|  | #endif | ||||||
|  | 	      dbytes+=tbytes; | ||||||
|  | 	    } | ||||||
|  | 	  } | ||||||
|  | 	  Grid.Barrier(); | ||||||
|  | 	  double stop=usecond(); | ||||||
|  | 	  t_time[i] = stop-start; // microseconds | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	timestat.statistics(t_time); | ||||||
|  | 	//	for(int i=0;i<t_time.size();i++){ | ||||||
|  | 	//	  std::cout << i<<" "<<t_time[i]<<std::endl; | ||||||
|  | 	//	} | ||||||
|  |  | ||||||
|  | 	dbytes=dbytes*ppn; | ||||||
|  | 	double xbytes    = dbytes*0.5; | ||||||
|  | 	double rbytes    = dbytes*0.5; | ||||||
|  | 	double bidibytes = dbytes; | ||||||
|  |  | ||||||
|  | 	std::cout<<GridLogMessage << std::setw(4) << lat<<"\t"<<Ls<<"\t" | ||||||
|  | 		 <<std::setw(11) << bytes<< std::fixed << std::setprecision(1) << std::setw(7) | ||||||
|  | 		 <<std::right<< xbytes/timestat.mean<<"  "<< xbytes*timestat.err/(timestat.mean*timestat.mean)<< " " | ||||||
|  | 		 <<xbytes/timestat.max <<" "<< xbytes/timestat.min   | ||||||
|  | 		 << "\t\t"<<std::setw(7)<< bidibytes/timestat.mean<< "  " << bidibytes*timestat.err/(timestat.mean*timestat.mean) << " " | ||||||
|  | 		 << bidibytes/timestat.max << " " << bidibytes/timestat.min << std::endl; | ||||||
|  |  | ||||||
|  |   | ||||||
|  | 	 | ||||||
|  | 	    } | ||||||
|  |     }     | ||||||
|  |  | ||||||
|  |     return; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   static void Memory(void) | ||||||
|  |   { | ||||||
|  |     const int Nvec=8; | ||||||
|  |     typedef Lattice< iVector< vReal,Nvec> > LatticeVec; | ||||||
|  |     typedef iVector<vReal,Nvec> Vec; | ||||||
|  |  | ||||||
|  |     std::vector<int> simd_layout = GridDefaultSimd(Nd,vReal::Nsimd()); | ||||||
|  |     std::vector<int> mpi_layout  = GridDefaultMpi(); | ||||||
|  |  | ||||||
|  |     std::cout<<GridLogMessage << "=================================================================================="<<std::endl; | ||||||
|  |     std::cout<<GridLogMessage << "= Benchmarking a*x + y bandwidth"<<std::endl; | ||||||
|  |     std::cout<<GridLogMessage << "=================================================================================="<<std::endl; | ||||||
|  |     std::cout<<GridLogMessage << "  L  "<<"\t\t"<<"bytes"<<"\t\t\t"<<"GB/s"<<"\t\t"<<"Gflop/s"<<"\t\t seconds"<< "\t\tGB/s / node"<<std::endl; | ||||||
|  |     std::cout<<GridLogMessage << "----------------------------------------------------------"<<std::endl; | ||||||
|  |    | ||||||
|  |     uint64_t NP; | ||||||
|  |     uint64_t NN; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |   uint64_t lmax=48; | ||||||
|  | #define NLOOP (100*lmax*lmax*lmax*lmax/lat/lat/lat/lat) | ||||||
|  |  | ||||||
|  |     GridSerialRNG          sRNG;      sRNG.SeedFixedIntegers(std::vector<int>({45,12,81,9})); | ||||||
|  |     for(int lat=8;lat<=lmax;lat+=4){ | ||||||
|  |  | ||||||
|  |       std::vector<int> latt_size  ({lat*mpi_layout[0],lat*mpi_layout[1],lat*mpi_layout[2],lat*mpi_layout[3]}); | ||||||
|  |       int64_t vol= latt_size[0]*latt_size[1]*latt_size[2]*latt_size[3]; | ||||||
|  |       GridCartesian     Grid(latt_size,simd_layout,mpi_layout); | ||||||
|  |  | ||||||
|  |       NP= Grid.RankCount(); | ||||||
|  |       NN =Grid.NodeCount(); | ||||||
|  |  | ||||||
|  |       Vec rn ; random(sRNG,rn); | ||||||
|  |  | ||||||
|  |       LatticeVec z(&Grid); z=rn; | ||||||
|  |       LatticeVec x(&Grid); x=rn; | ||||||
|  |       LatticeVec y(&Grid); y=rn; | ||||||
|  |       double a=2.0; | ||||||
|  |  | ||||||
|  |       uint64_t Nloop=NLOOP; | ||||||
|  |  | ||||||
|  |       double start=usecond(); | ||||||
|  |       for(int i=0;i<Nloop;i++){ | ||||||
|  | 	z=a*x-y; | ||||||
|  |         x._odata[0]=z._odata[0]; // force serial dependency to prevent optimise away | ||||||
|  |         y._odata[4]=z._odata[4]; | ||||||
|  |       } | ||||||
|  |       double stop=usecond(); | ||||||
|  |       double time = (stop-start)/Nloop*1000; | ||||||
|  |       | ||||||
|  |       double flops=vol*Nvec*2;// mul,add | ||||||
|  |       double bytes=3.0*vol*Nvec*sizeof(Real); | ||||||
|  |       std::cout<<GridLogMessage<<std::setprecision(3)  | ||||||
|  | 	       << lat<<"\t\t"<<bytes<<"   \t\t"<<bytes/time<<"\t\t"<<flops/time<<"\t\t"<<(stop-start)/1000./1000. | ||||||
|  | 	       << "\t\t"<< bytes/time/NN <<std::endl; | ||||||
|  |  | ||||||
|  |     } | ||||||
|  |   }; | ||||||
|  |  | ||||||
|  |   static double DWF5(int Ls,int L) | ||||||
|  |   { | ||||||
|  |     RealD mass=0.1; | ||||||
|  |     RealD M5  =1.8; | ||||||
|  |  | ||||||
|  |     double mflops; | ||||||
|  |     double mflops_best = 0; | ||||||
|  |     double mflops_worst= 0; | ||||||
|  |     std::vector<double> mflops_all; | ||||||
|  |  | ||||||
|  |     /////////////////////////////////////////////////////// | ||||||
|  |     // Set/Get the layout & grid size | ||||||
|  |     /////////////////////////////////////////////////////// | ||||||
|  |     int threads = GridThread::GetThreads(); | ||||||
|  |     std::vector<int> mpi = GridDefaultMpi(); assert(mpi.size()==4); | ||||||
|  |     std::vector<int> local({L,L,L,L}); | ||||||
|  |  | ||||||
|  |     GridCartesian         * TmpGrid   = SpaceTimeGrid::makeFourDimGrid(std::vector<int>({64,64,64,64}),  | ||||||
|  | 								       GridDefaultSimd(Nd,vComplex::Nsimd()),GridDefaultMpi()); | ||||||
|  |     uint64_t NP = TmpGrid->RankCount(); | ||||||
|  |     uint64_t NN = TmpGrid->NodeCount(); | ||||||
|  |     NN_global=NN; | ||||||
|  |     uint64_t SHM=NP/NN; | ||||||
|  |  | ||||||
|  |     std::vector<int> internal; | ||||||
|  |     if      ( SHM == 1 )   internal = std::vector<int>({1,1,1,1}); | ||||||
|  |     else if ( SHM == 2 )   internal = std::vector<int>({2,1,1,1}); | ||||||
|  |     else if ( SHM == 4 )   internal = std::vector<int>({2,2,1,1}); | ||||||
|  |     else if ( SHM == 8 )   internal = std::vector<int>({2,2,2,1}); | ||||||
|  |     else assert(0); | ||||||
|  |  | ||||||
|  |     std::vector<int> nodes({mpi[0]/internal[0],mpi[1]/internal[1],mpi[2]/internal[2],mpi[3]/internal[3]}); | ||||||
|  |     std::vector<int> latt4({local[0]*nodes[0],local[1]*nodes[1],local[2]*nodes[2],local[3]*nodes[3]}); | ||||||
|  |  | ||||||
|  |     ///////// Welcome message //////////// | ||||||
|  |     std::cout<<GridLogMessage << "=================================================================================="<<std::endl; | ||||||
|  |     std::cout<<GridLogMessage << "Benchmark DWF Ls vec on "<<L<<"^4 local volume "<<std::endl; | ||||||
|  |     std::cout<<GridLogMessage << "* Global volume  : "<<GridCmdVectorIntToString(latt4)<<std::endl; | ||||||
|  |     std::cout<<GridLogMessage << "* Ls             : "<<Ls<<std::endl; | ||||||
|  |     std::cout<<GridLogMessage << "* MPI ranks      : "<<GridCmdVectorIntToString(mpi)<<std::endl; | ||||||
|  |     std::cout<<GridLogMessage << "* Intranode      : "<<GridCmdVectorIntToString(internal)<<std::endl; | ||||||
|  |     std::cout<<GridLogMessage << "* nodes          : "<<GridCmdVectorIntToString(nodes)<<std::endl; | ||||||
|  |     std::cout<<GridLogMessage << "* Using "<<threads<<" threads"<<std::endl; | ||||||
|  |     std::cout<<GridLogMessage << "=================================================================================="<<std::endl; | ||||||
|  |  | ||||||
|  |     ///////// Lattice Init //////////// | ||||||
|  |     GridCartesian         * UGrid    = SpaceTimeGrid::makeFourDimGrid(latt4, GridDefaultSimd(Nd,vComplex::Nsimd()),GridDefaultMpi()); | ||||||
|  |     GridRedBlackCartesian * UrbGrid  = SpaceTimeGrid::makeFourDimRedBlackGrid(UGrid); | ||||||
|  |     GridCartesian         * sUGrid   = SpaceTimeGrid::makeFourDimDWFGrid(latt4,GridDefaultMpi()); | ||||||
|  |     GridRedBlackCartesian * sUrbGrid = SpaceTimeGrid::makeFourDimRedBlackGrid(sUGrid); | ||||||
|  |     GridCartesian         * sFGrid   = SpaceTimeGrid::makeFiveDimDWFGrid(Ls,UGrid); | ||||||
|  |     GridRedBlackCartesian * sFrbGrid = SpaceTimeGrid::makeFiveDimDWFRedBlackGrid(Ls,UGrid); | ||||||
|  |  | ||||||
|  |     ///////// RNG Init //////////// | ||||||
|  |     std::vector<int> seeds4({1,2,3,4}); | ||||||
|  |     std::vector<int> seeds5({5,6,7,8}); | ||||||
|  |     GridParallelRNG          RNG4(UGrid);  RNG4.SeedFixedIntegers(seeds4); | ||||||
|  |     GridParallelRNG          RNG5(sFGrid);  RNG5.SeedFixedIntegers(seeds5); | ||||||
|  |     std::cout << GridLogMessage << "Initialised RNGs" << std::endl; | ||||||
|  |  | ||||||
|  |     ///////// Source preparation //////////// | ||||||
|  |     LatticeFermion src   (sFGrid); random(RNG5,src); | ||||||
|  |     LatticeFermion tmp   (sFGrid); | ||||||
|  |  | ||||||
|  |     RealD N2 = 1.0/::sqrt(norm2(src)); | ||||||
|  |     src = src*N2; | ||||||
|  |      | ||||||
|  |     LatticeGaugeField Umu(UGrid);  SU3::HotConfiguration(RNG4,Umu);  | ||||||
|  |  | ||||||
|  |     WilsonFermion5DR sDw(Umu,*sFGrid,*sFrbGrid,*sUGrid,*sUrbGrid,M5); | ||||||
|  |     LatticeFermion src_e (sFrbGrid); | ||||||
|  |     LatticeFermion src_o (sFrbGrid); | ||||||
|  |     LatticeFermion r_e   (sFrbGrid); | ||||||
|  |     LatticeFermion r_o   (sFrbGrid); | ||||||
|  |     LatticeFermion r_eo  (sFGrid); | ||||||
|  |     LatticeFermion err   (sFGrid); | ||||||
|  |     { | ||||||
|  |  | ||||||
|  |       pickCheckerboard(Even,src_e,src); | ||||||
|  |       pickCheckerboard(Odd,src_o,src); | ||||||
|  |  | ||||||
|  | #if defined(AVX512)  | ||||||
|  |       const int num_cases = 6; | ||||||
|  |       std::string fmt("A/S ; A/O ; U/S ; U/O ; G/S ; G/O "); | ||||||
|  | #else | ||||||
|  |       const int num_cases = 4; | ||||||
|  |       std::string fmt("U/S ; U/O ; G/S ; G/O "); | ||||||
|  | #endif | ||||||
|  |       controls Cases [] = { | ||||||
|  | #ifdef AVX512 | ||||||
|  | 	{ QCD::WilsonKernelsStatic::OptInlineAsm , QCD::WilsonKernelsStatic::CommsThenCompute ,CartesianCommunicator::CommunicatorPolicySequential  }, | ||||||
|  | 	{ QCD::WilsonKernelsStatic::OptInlineAsm , QCD::WilsonKernelsStatic::CommsAndCompute  ,CartesianCommunicator::CommunicatorPolicySequential  }, | ||||||
|  | #endif | ||||||
|  | 	{ QCD::WilsonKernelsStatic::OptHandUnroll, QCD::WilsonKernelsStatic::CommsThenCompute ,CartesianCommunicator::CommunicatorPolicySequential  }, | ||||||
|  | 	{ QCD::WilsonKernelsStatic::OptHandUnroll, QCD::WilsonKernelsStatic::CommsAndCompute  ,CartesianCommunicator::CommunicatorPolicySequential  }, | ||||||
|  | 	{ QCD::WilsonKernelsStatic::OptGeneric   , QCD::WilsonKernelsStatic::CommsThenCompute ,CartesianCommunicator::CommunicatorPolicySequential  }, | ||||||
|  | 	{ QCD::WilsonKernelsStatic::OptGeneric   , QCD::WilsonKernelsStatic::CommsAndCompute  ,CartesianCommunicator::CommunicatorPolicySequential  } | ||||||
|  |       };  | ||||||
|  |  | ||||||
|  |       for(int c=0;c<num_cases;c++) { | ||||||
|  |  | ||||||
|  | 	QCD::WilsonKernelsStatic::Comms = Cases[c].CommsOverlap; | ||||||
|  | 	QCD::WilsonKernelsStatic::Opt   = Cases[c].Opt; | ||||||
|  | 	CartesianCommunicator::SetCommunicatorPolicy(Cases[c].CommsAsynch); | ||||||
|  |  | ||||||
|  | 	std::cout<<GridLogMessage << "=================================================================================="<<std::endl; | ||||||
|  | 	if ( WilsonKernelsStatic::Opt == WilsonKernelsStatic::OptGeneric   ) std::cout << GridLogMessage<< "* Using GENERIC Nc WilsonKernels" <<std::endl; | ||||||
|  | 	if ( WilsonKernelsStatic::Opt == WilsonKernelsStatic::OptHandUnroll) std::cout << GridLogMessage<< "* Using Nc=3       WilsonKernels" <<std::endl; | ||||||
|  | 	if ( WilsonKernelsStatic::Opt == WilsonKernelsStatic::OptInlineAsm ) std::cout << GridLogMessage<< "* Using Asm Nc=3   WilsonKernels" <<std::endl; | ||||||
|  | 	if ( WilsonKernelsStatic::Comms == WilsonKernelsStatic::CommsAndCompute ) std::cout << GridLogMessage<< "* Using Overlapped Comms/Compute" <<std::endl; | ||||||
|  | 	if ( WilsonKernelsStatic::Comms == WilsonKernelsStatic::CommsThenCompute) std::cout << GridLogMessage<< "* Using sequential comms compute" <<std::endl; | ||||||
|  | 	if ( sizeof(Real)==4 )   std::cout << GridLogMessage<< "* SINGLE precision "<<std::endl; | ||||||
|  | 	if ( sizeof(Real)==8 )   std::cout << GridLogMessage<< "* DOUBLE precision "<<std::endl; | ||||||
|  | 	std::cout<<GridLogMessage << "=================================================================================="<<std::endl; | ||||||
|  |  | ||||||
|  | 	int nwarm = 100; | ||||||
|  | 	uint64_t ncall = 1000; | ||||||
|  |  | ||||||
|  | 	double t0=usecond(); | ||||||
|  | 	sFGrid->Barrier(); | ||||||
|  | 	for(int i=0;i<nwarm;i++){ | ||||||
|  | 	  sDw.DhopEO(src_o,r_e,DaggerNo); | ||||||
|  | 	} | ||||||
|  | 	sFGrid->Barrier(); | ||||||
|  | 	double t1=usecond(); | ||||||
|  |  | ||||||
|  | 	sDw.ZeroCounters(); | ||||||
|  | 	time_statistics timestat; | ||||||
|  | 	std::vector<double> t_time(ncall); | ||||||
|  | 	for(uint64_t i=0;i<ncall;i++){ | ||||||
|  | 	  t0=usecond(); | ||||||
|  | 	  sDw.DhopEO(src_o,r_e,DaggerNo); | ||||||
|  | 	  t1=usecond(); | ||||||
|  | 	  t_time[i] = t1-t0; | ||||||
|  | 	} | ||||||
|  | 	sFGrid->Barrier(); | ||||||
|  | 	 | ||||||
|  | 	double volume=Ls;  for(int mu=0;mu<Nd;mu++) volume=volume*latt4[mu]; | ||||||
|  | 	double flops=(1344.0*volume)/2; | ||||||
|  | 	double mf_hi, mf_lo, mf_err; | ||||||
|  |  | ||||||
|  | 	timestat.statistics(t_time); | ||||||
|  | 	mf_hi = flops/timestat.min; | ||||||
|  | 	mf_lo = flops/timestat.max; | ||||||
|  | 	mf_err= flops/timestat.min * timestat.err/timestat.mean; | ||||||
|  |  | ||||||
|  | 	mflops = flops/timestat.mean; | ||||||
|  | 	mflops_all.push_back(mflops); | ||||||
|  | 	if ( mflops_best == 0   ) mflops_best = mflops; | ||||||
|  | 	if ( mflops_worst== 0   ) mflops_worst= mflops; | ||||||
|  | 	if ( mflops>mflops_best ) mflops_best = mflops; | ||||||
|  | 	if ( mflops<mflops_worst) mflops_worst= mflops; | ||||||
|  |  | ||||||
|  | 	std::cout<<GridLogMessage << std::fixed << std::setprecision(1)<<"sDeo mflop/s =   "<< mflops << " ("<<mf_err<<") " << mf_lo<<"-"<<mf_hi <<std::endl; | ||||||
|  | 	std::cout<<GridLogMessage << std::fixed << std::setprecision(1)<<"sDeo mflop/s per rank   "<< mflops/NP<<std::endl; | ||||||
|  | 	std::cout<<GridLogMessage << std::fixed << std::setprecision(1)<<"sDeo mflop/s per node   "<< mflops/NN<<std::endl; | ||||||
|  |  | ||||||
|  | 	sDw.Report(); | ||||||
|  |  | ||||||
|  |       } | ||||||
|  |       double robust = mflops_worst/mflops_best;; | ||||||
|  |       std::cout<<GridLogMessage << "=================================================================================="<<std::endl; | ||||||
|  |       std::cout<<GridLogMessage << L<<"^4 x "<<Ls<< " sDeo Best  mflop/s        =   "<< mflops_best << " ; " << mflops_best/NN<<" per node " <<std::endl; | ||||||
|  |       std::cout<<GridLogMessage << L<<"^4 x "<<Ls<< " sDeo Worst mflop/s        =   "<< mflops_worst<< " ; " << mflops_worst/NN<<" per node " <<std::endl; | ||||||
|  |  | ||||||
|  |       std::cout<<GridLogMessage <<std::setprecision(3)<< L<<"^4 x "<<Ls<< " Performance Robustness   =   "<< robust <<std::endl; | ||||||
|  |       std::cout<<GridLogMessage <<fmt << std::endl; | ||||||
|  |       std::cout<<GridLogMessage; | ||||||
|  |  | ||||||
|  |       for(int i=0;i<mflops_all.size();i++){ | ||||||
|  | 	std::cout<<mflops_all[i]/NN<<" ; " ; | ||||||
|  |       } | ||||||
|  |       std::cout<<std::endl; | ||||||
|  |       std::cout<<GridLogMessage << "=================================================================================="<<std::endl; | ||||||
|  |  | ||||||
|  |     } | ||||||
|  |     return mflops_best; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   static double DWF(int Ls,int L, double & robust) | ||||||
|  |   { | ||||||
|  |     RealD mass=0.1; | ||||||
|  |     RealD M5  =1.8; | ||||||
|  |  | ||||||
|  |     double mflops; | ||||||
|  |     double mflops_best = 0; | ||||||
|  |     double mflops_worst= 0; | ||||||
|  |     std::vector<double> mflops_all; | ||||||
|  |  | ||||||
|  |     /////////////////////////////////////////////////////// | ||||||
|  |     // Set/Get the layout & grid size | ||||||
|  |     /////////////////////////////////////////////////////// | ||||||
|  |     int threads = GridThread::GetThreads(); | ||||||
|  |     std::vector<int> mpi = GridDefaultMpi(); assert(mpi.size()==4); | ||||||
|  |     std::vector<int> local({L,L,L,L}); | ||||||
|  |  | ||||||
|  |     GridCartesian         * TmpGrid   = SpaceTimeGrid::makeFourDimGrid(std::vector<int>({64,64,64,64}),  | ||||||
|  | 								       GridDefaultSimd(Nd,vComplex::Nsimd()),GridDefaultMpi()); | ||||||
|  |     uint64_t NP = TmpGrid->RankCount(); | ||||||
|  |     uint64_t NN = TmpGrid->NodeCount(); | ||||||
|  |     NN_global=NN; | ||||||
|  |     uint64_t SHM=NP/NN; | ||||||
|  |  | ||||||
|  |     std::vector<int> internal; | ||||||
|  |     if      ( SHM == 1 )   internal = std::vector<int>({1,1,1,1}); | ||||||
|  |     else if ( SHM == 2 )   internal = std::vector<int>({2,1,1,1}); | ||||||
|  |     else if ( SHM == 4 )   internal = std::vector<int>({2,2,1,1}); | ||||||
|  |     else if ( SHM == 8 )   internal = std::vector<int>({2,2,2,1}); | ||||||
|  |     else assert(0); | ||||||
|  |  | ||||||
|  |     std::vector<int> nodes({mpi[0]/internal[0],mpi[1]/internal[1],mpi[2]/internal[2],mpi[3]/internal[3]}); | ||||||
|  |     std::vector<int> latt4({local[0]*nodes[0],local[1]*nodes[1],local[2]*nodes[2],local[3]*nodes[3]}); | ||||||
|  |  | ||||||
|  |     ///////// Welcome message //////////// | ||||||
|  |     std::cout<<GridLogMessage << "=================================================================================="<<std::endl; | ||||||
|  |     std::cout<<GridLogMessage << "Benchmark DWF on "<<L<<"^4 local volume "<<std::endl; | ||||||
|  |     std::cout<<GridLogMessage << "* Global volume  : "<<GridCmdVectorIntToString(latt4)<<std::endl; | ||||||
|  |     std::cout<<GridLogMessage << "* Ls             : "<<Ls<<std::endl; | ||||||
|  |     std::cout<<GridLogMessage << "* MPI ranks      : "<<GridCmdVectorIntToString(mpi)<<std::endl; | ||||||
|  |     std::cout<<GridLogMessage << "* Intranode      : "<<GridCmdVectorIntToString(internal)<<std::endl; | ||||||
|  |     std::cout<<GridLogMessage << "* nodes          : "<<GridCmdVectorIntToString(nodes)<<std::endl; | ||||||
|  |     std::cout<<GridLogMessage << "* Using "<<threads<<" threads"<<std::endl; | ||||||
|  |     std::cout<<GridLogMessage << "=================================================================================="<<std::endl; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     ///////// Lattice Init //////////// | ||||||
|  |     GridCartesian         * UGrid   = SpaceTimeGrid::makeFourDimGrid(latt4, GridDefaultSimd(Nd,vComplex::Nsimd()),GridDefaultMpi()); | ||||||
|  |     GridRedBlackCartesian * UrbGrid = SpaceTimeGrid::makeFourDimRedBlackGrid(UGrid); | ||||||
|  |     GridCartesian         * FGrid   = SpaceTimeGrid::makeFiveDimGrid(Ls,UGrid); | ||||||
|  |     GridRedBlackCartesian * FrbGrid = SpaceTimeGrid::makeFiveDimRedBlackGrid(Ls,UGrid); | ||||||
|  |  | ||||||
|  |      | ||||||
|  |     ///////// RNG Init //////////// | ||||||
|  |     std::vector<int> seeds4({1,2,3,4}); | ||||||
|  |     std::vector<int> seeds5({5,6,7,8}); | ||||||
|  |     GridParallelRNG          RNG4(UGrid);  RNG4.SeedFixedIntegers(seeds4); | ||||||
|  |     GridParallelRNG          RNG5(FGrid);  RNG5.SeedFixedIntegers(seeds5); | ||||||
|  |     std::cout << GridLogMessage << "Initialised RNGs" << std::endl; | ||||||
|  |  | ||||||
|  |     ///////// Source preparation //////////// | ||||||
|  |     LatticeFermion src   (FGrid); random(RNG5,src); | ||||||
|  |     LatticeFermion ref   (FGrid); | ||||||
|  |     LatticeFermion tmp   (FGrid); | ||||||
|  |  | ||||||
|  |     RealD N2 = 1.0/::sqrt(norm2(src)); | ||||||
|  |     src = src*N2; | ||||||
|  |      | ||||||
|  |     LatticeGaugeField Umu(UGrid);  SU3::HotConfiguration(RNG4,Umu);  | ||||||
|  |  | ||||||
|  |     DomainWallFermionR Dw(Umu,*FGrid,*FrbGrid,*UGrid,*UrbGrid,mass,M5); | ||||||
|  |  | ||||||
|  |     //////////////////////////////////// | ||||||
|  |     // Naive wilson implementation | ||||||
|  |     //////////////////////////////////// | ||||||
|  |     { | ||||||
|  |       LatticeGaugeField Umu5d(FGrid);  | ||||||
|  |       std::vector<LatticeColourMatrix> U(4,FGrid); | ||||||
|  |       for(int ss=0;ss<Umu._grid->oSites();ss++){ | ||||||
|  | 	for(int s=0;s<Ls;s++){ | ||||||
|  | 	  Umu5d._odata[Ls*ss+s] = Umu._odata[ss]; | ||||||
|  | 	} | ||||||
|  |       } | ||||||
|  |       ref = zero; | ||||||
|  |       for(int mu=0;mu<Nd;mu++){ | ||||||
|  | 	U[mu] = PeekIndex<LorentzIndex>(Umu5d,mu); | ||||||
|  |       } | ||||||
|  |       for(int mu=0;mu<Nd;mu++){ | ||||||
|  | 	 | ||||||
|  | 	tmp = U[mu]*Cshift(src,mu+1,1); | ||||||
|  | 	ref=ref + tmp - Gamma(Gmu[mu])*tmp; | ||||||
|  | 	 | ||||||
|  | 	tmp =adj(U[mu])*src; | ||||||
|  | 	tmp =Cshift(tmp,mu+1,-1); | ||||||
|  | 	ref=ref + tmp + Gamma(Gmu[mu])*tmp; | ||||||
|  |       } | ||||||
|  |       ref = -0.5*ref; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     LatticeFermion src_e (FrbGrid); | ||||||
|  |     LatticeFermion src_o (FrbGrid); | ||||||
|  |     LatticeFermion r_e   (FrbGrid); | ||||||
|  |     LatticeFermion r_o   (FrbGrid); | ||||||
|  |     LatticeFermion r_eo  (FGrid); | ||||||
|  |     LatticeFermion err   (FGrid); | ||||||
|  |     { | ||||||
|  |  | ||||||
|  |       pickCheckerboard(Even,src_e,src); | ||||||
|  |       pickCheckerboard(Odd,src_o,src); | ||||||
|  |  | ||||||
|  | #if defined(AVX512)  | ||||||
|  |       const int num_cases = 6; | ||||||
|  |       std::string fmt("A/S ; A/O ; U/S ; U/O ; G/S ; G/O "); | ||||||
|  | #else | ||||||
|  |       const int num_cases = 4; | ||||||
|  |       std::string fmt("U/S ; U/O ; G/S ; G/O "); | ||||||
|  | #endif | ||||||
|  |       controls Cases [] = { | ||||||
|  | #ifdef AVX512 | ||||||
|  | 	{ QCD::WilsonKernelsStatic::OptInlineAsm , QCD::WilsonKernelsStatic::CommsThenCompute ,CartesianCommunicator::CommunicatorPolicySequential  }, | ||||||
|  | 	{ QCD::WilsonKernelsStatic::OptInlineAsm , QCD::WilsonKernelsStatic::CommsAndCompute  ,CartesianCommunicator::CommunicatorPolicySequential  }, | ||||||
|  | #endif | ||||||
|  | 	{ QCD::WilsonKernelsStatic::OptHandUnroll, QCD::WilsonKernelsStatic::CommsThenCompute ,CartesianCommunicator::CommunicatorPolicySequential  }, | ||||||
|  | 	{ QCD::WilsonKernelsStatic::OptHandUnroll, QCD::WilsonKernelsStatic::CommsAndCompute  ,CartesianCommunicator::CommunicatorPolicySequential  }, | ||||||
|  | 	{ QCD::WilsonKernelsStatic::OptGeneric   , QCD::WilsonKernelsStatic::CommsThenCompute ,CartesianCommunicator::CommunicatorPolicySequential  }, | ||||||
|  | 	{ QCD::WilsonKernelsStatic::OptGeneric   , QCD::WilsonKernelsStatic::CommsAndCompute  ,CartesianCommunicator::CommunicatorPolicySequential  } | ||||||
|  |       };  | ||||||
|  |  | ||||||
|  |       for(int c=0;c<num_cases;c++) { | ||||||
|  |  | ||||||
|  | 	QCD::WilsonKernelsStatic::Comms = Cases[c].CommsOverlap; | ||||||
|  | 	QCD::WilsonKernelsStatic::Opt   = Cases[c].Opt; | ||||||
|  | 	CartesianCommunicator::SetCommunicatorPolicy(Cases[c].CommsAsynch); | ||||||
|  |  | ||||||
|  | 	std::cout<<GridLogMessage << "=================================================================================="<<std::endl; | ||||||
|  | 	if ( WilsonKernelsStatic::Opt == WilsonKernelsStatic::OptGeneric   ) std::cout << GridLogMessage<< "* Using GENERIC Nc WilsonKernels" <<std::endl; | ||||||
|  | 	if ( WilsonKernelsStatic::Opt == WilsonKernelsStatic::OptHandUnroll) std::cout << GridLogMessage<< "* Using Nc=3       WilsonKernels" <<std::endl; | ||||||
|  | 	if ( WilsonKernelsStatic::Opt == WilsonKernelsStatic::OptInlineAsm ) std::cout << GridLogMessage<< "* Using Asm Nc=3   WilsonKernels" <<std::endl; | ||||||
|  | 	if ( WilsonKernelsStatic::Comms == WilsonKernelsStatic::CommsAndCompute ) std::cout << GridLogMessage<< "* Using Overlapped Comms/Compute" <<std::endl; | ||||||
|  | 	if ( WilsonKernelsStatic::Comms == WilsonKernelsStatic::CommsThenCompute) std::cout << GridLogMessage<< "* Using sequential comms compute" <<std::endl; | ||||||
|  | 	if ( sizeof(Real)==4 )   std::cout << GridLogMessage<< "* SINGLE precision "<<std::endl; | ||||||
|  | 	if ( sizeof(Real)==8 )   std::cout << GridLogMessage<< "* DOUBLE precision "<<std::endl; | ||||||
|  | 	std::cout<<GridLogMessage << "=================================================================================="<<std::endl; | ||||||
|  |  | ||||||
|  | 	int nwarm = 200; | ||||||
|  | 	double t0=usecond(); | ||||||
|  | 	FGrid->Barrier(); | ||||||
|  | 	for(int i=0;i<nwarm;i++){ | ||||||
|  | 	  Dw.DhopEO(src_o,r_e,DaggerNo); | ||||||
|  | 	} | ||||||
|  | 	FGrid->Barrier(); | ||||||
|  | 	double t1=usecond(); | ||||||
|  | 	//	uint64_t ncall = (uint64_t) 2.5*1000.0*1000.0*nwarm/(t1-t0); | ||||||
|  | 	//	if (ncall < 500) ncall = 500; | ||||||
|  | 	uint64_t ncall = 1000; | ||||||
|  |  | ||||||
|  | 	FGrid->Broadcast(0,&ncall,sizeof(ncall)); | ||||||
|  |  | ||||||
|  | 	//	std::cout << GridLogMessage << " Estimate " << ncall << " calls per second"<<std::endl; | ||||||
|  | 	Dw.ZeroCounters(); | ||||||
|  |  | ||||||
|  | 	time_statistics timestat; | ||||||
|  | 	std::vector<double> t_time(ncall); | ||||||
|  | 	for(uint64_t i=0;i<ncall;i++){ | ||||||
|  | 	  t0=usecond(); | ||||||
|  | 	  Dw.DhopEO(src_o,r_e,DaggerNo); | ||||||
|  | 	  t1=usecond(); | ||||||
|  | 	  t_time[i] = t1-t0; | ||||||
|  | 	} | ||||||
|  | 	FGrid->Barrier(); | ||||||
|  | 	 | ||||||
|  | 	double volume=Ls;  for(int mu=0;mu<Nd;mu++) volume=volume*latt4[mu]; | ||||||
|  | 	double flops=(1344.0*volume)/2; | ||||||
|  | 	double mf_hi, mf_lo, mf_err; | ||||||
|  |  | ||||||
|  | 	timestat.statistics(t_time); | ||||||
|  | 	mf_hi = flops/timestat.min; | ||||||
|  | 	mf_lo = flops/timestat.max; | ||||||
|  | 	mf_err= flops/timestat.min * timestat.err/timestat.mean; | ||||||
|  |  | ||||||
|  | 	mflops = flops/timestat.mean; | ||||||
|  | 	mflops_all.push_back(mflops); | ||||||
|  | 	if ( mflops_best == 0   ) mflops_best = mflops; | ||||||
|  | 	if ( mflops_worst== 0   ) mflops_worst= mflops; | ||||||
|  | 	if ( mflops>mflops_best ) mflops_best = mflops; | ||||||
|  | 	if ( mflops<mflops_worst) mflops_worst= mflops; | ||||||
|  |  | ||||||
|  | 	std::cout<<GridLogMessage << std::fixed << std::setprecision(1)<<"Deo mflop/s =   "<< mflops << " ("<<mf_err<<") " << mf_lo<<"-"<<mf_hi <<std::endl; | ||||||
|  | 	std::cout<<GridLogMessage << std::fixed << std::setprecision(1)<<"Deo mflop/s per rank   "<< mflops/NP<<std::endl; | ||||||
|  | 	std::cout<<GridLogMessage << std::fixed << std::setprecision(1)<<"Deo mflop/s per node   "<< mflops/NN<<std::endl; | ||||||
|  |  | ||||||
|  | 	Dw.Report(); | ||||||
|  |  | ||||||
|  | 	Dw.DhopEO(src_o,r_e,DaggerNo); | ||||||
|  | 	Dw.DhopOE(src_e,r_o,DaggerNo); | ||||||
|  | 	setCheckerboard(r_eo,r_o); | ||||||
|  | 	setCheckerboard(r_eo,r_e); | ||||||
|  | 	err = r_eo-ref;  | ||||||
|  | 	std::cout<<GridLogMessage << "norm diff   "<< norm2(err)<<std::endl; | ||||||
|  | 	assert((norm2(err)<1.0e-4)); | ||||||
|  |  | ||||||
|  |       } | ||||||
|  |       robust = mflops_worst/mflops_best; | ||||||
|  |       std::cout<<GridLogMessage << "=================================================================================="<<std::endl; | ||||||
|  |       std::cout<<GridLogMessage << L<<"^4 x "<<Ls<< " Deo Best  mflop/s        =   "<< mflops_best << " ; " << mflops_best/NN<<" per node " <<std::endl; | ||||||
|  |       std::cout<<GridLogMessage << L<<"^4 x "<<Ls<< " Deo Worst mflop/s        =   "<< mflops_worst<< " ; " << mflops_worst/NN<<" per node " <<std::endl; | ||||||
|  |       std::cout<<GridLogMessage << std::fixed<<std::setprecision(3)<< L<<"^4 x "<<Ls<< " Performance Robustness   =   "<< robust  <<std::endl; | ||||||
|  |       std::cout<<GridLogMessage <<fmt << std::endl; | ||||||
|  |       std::cout<<GridLogMessage ; | ||||||
|  |  | ||||||
|  |       for(int i=0;i<mflops_all.size();i++){ | ||||||
|  | 	std::cout<<mflops_all[i]/NN<<" ; " ; | ||||||
|  |       } | ||||||
|  |       std::cout<<std::endl; | ||||||
|  |       std::cout<<GridLogMessage << "=================================================================================="<<std::endl; | ||||||
|  |  | ||||||
|  |     } | ||||||
|  |     return mflops_best; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | int main (int argc, char ** argv) | ||||||
|  | { | ||||||
|  |   Grid_init(&argc,&argv); | ||||||
|  |  | ||||||
|  |   CartesianCommunicator::SetCommunicatorPolicy(CartesianCommunicator::CommunicatorPolicySequential); | ||||||
|  | #ifdef KNL | ||||||
|  |   LebesgueOrder::Block = std::vector<int>({8,2,2,2}); | ||||||
|  | #else | ||||||
|  |   LebesgueOrder::Block = std::vector<int>({2,2,2,2}); | ||||||
|  | #endif | ||||||
|  |   Benchmark::Decomposition(); | ||||||
|  |  | ||||||
|  |   int do_memory=1; | ||||||
|  |   int do_comms =1; | ||||||
|  |   int do_su3   =0; | ||||||
|  |   int do_wilson=1; | ||||||
|  |   int do_dwf   =1; | ||||||
|  |  | ||||||
|  |   if ( do_su3 ) { | ||||||
|  |     // empty for now | ||||||
|  |   } | ||||||
|  | #if 1 | ||||||
|  |   int sel=2; | ||||||
|  |   std::vector<int> L_list({8,12,16,24}); | ||||||
|  | #else | ||||||
|  |   int sel=1; | ||||||
|  |   std::vector<int> L_list({8,12}); | ||||||
|  | #endif | ||||||
|  |   int selm1=sel-1; | ||||||
|  |   std::vector<double> robust_list; | ||||||
|  |  | ||||||
|  |   std::vector<double> wilson; | ||||||
|  |   std::vector<double> dwf4; | ||||||
|  |   std::vector<double> dwf5; | ||||||
|  |  | ||||||
|  |   if ( do_wilson ) { | ||||||
|  |     int Ls=1; | ||||||
|  |     std::cout<<GridLogMessage << "=================================================================================="<<std::endl; | ||||||
|  |     std::cout<<GridLogMessage << " Wilson dslash 4D vectorised" <<std::endl; | ||||||
|  |     std::cout<<GridLogMessage << "=================================================================================="<<std::endl; | ||||||
|  |     for(int l=0;l<L_list.size();l++){ | ||||||
|  |       double robust; | ||||||
|  |       wilson.push_back(Benchmark::DWF(1,L_list[l],robust)); | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   int Ls=16; | ||||||
|  |   if ( do_dwf ) { | ||||||
|  |     std::cout<<GridLogMessage << "=================================================================================="<<std::endl; | ||||||
|  |     std::cout<<GridLogMessage << " Domain wall dslash 4D vectorised" <<std::endl; | ||||||
|  |     std::cout<<GridLogMessage << "=================================================================================="<<std::endl; | ||||||
|  |     for(int l=0;l<L_list.size();l++){ | ||||||
|  |       double robust; | ||||||
|  |       double result = Benchmark::DWF(Ls,L_list[l],robust) ; | ||||||
|  |       dwf4.push_back(result); | ||||||
|  |       robust_list.push_back(robust); | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   if ( do_dwf ) { | ||||||
|  |     std::cout<<GridLogMessage << "=================================================================================="<<std::endl; | ||||||
|  |     std::cout<<GridLogMessage << " Domain wall dslash 4D vectorised" <<std::endl; | ||||||
|  |     std::cout<<GridLogMessage << "=================================================================================="<<std::endl; | ||||||
|  |     for(int l=0;l<L_list.size();l++){ | ||||||
|  |       dwf5.push_back(Benchmark::DWF5(Ls,L_list[l])); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   if ( do_dwf ) { | ||||||
|  |  | ||||||
|  |   std::cout<<GridLogMessage << "=================================================================================="<<std::endl; | ||||||
|  |   std::cout<<GridLogMessage << " Summary table Ls="<<Ls <<std::endl; | ||||||
|  |   std::cout<<GridLogMessage << "=================================================================================="<<std::endl; | ||||||
|  |   std::cout<<GridLogMessage << "L \t\t Wilson \t DWF4 \t DWF5 " <<std::endl; | ||||||
|  |   for(int l=0;l<L_list.size();l++){ | ||||||
|  |     std::cout<<GridLogMessage << L_list[l] <<" \t\t "<< wilson[l]<<" \t "<<dwf4[l]<<" \t "<<dwf5[l] <<std::endl; | ||||||
|  |   } | ||||||
|  |   std::cout<<GridLogMessage << "=================================================================================="<<std::endl; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   int NN=NN_global; | ||||||
|  |   if ( do_memory ) { | ||||||
|  |     std::cout<<GridLogMessage << "=================================================================================="<<std::endl; | ||||||
|  |     std::cout<<GridLogMessage << " Memory benchmark " <<std::endl; | ||||||
|  |     std::cout<<GridLogMessage << "=================================================================================="<<std::endl; | ||||||
|  |     Benchmark::Memory(); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   if ( do_comms && (NN>1) ) { | ||||||
|  |     std::cout<<GridLogMessage << "=================================================================================="<<std::endl; | ||||||
|  |     std::cout<<GridLogMessage << " Communications benchmark " <<std::endl; | ||||||
|  |     std::cout<<GridLogMessage << "=================================================================================="<<std::endl; | ||||||
|  |     Benchmark::Comms(); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   if ( do_dwf ) { | ||||||
|  |   std::cout<<GridLogMessage << "=================================================================================="<<std::endl; | ||||||
|  |   std::cout<<GridLogMessage << " Per Node Summary table Ls="<<Ls <<std::endl; | ||||||
|  |   std::cout<<GridLogMessage << "=================================================================================="<<std::endl; | ||||||
|  |   std::cout<<GridLogMessage << " L \t\t Wilson\t\t DWF4  \t\t DWF5 " <<std::endl; | ||||||
|  |   for(int l=0;l<L_list.size();l++){ | ||||||
|  |     std::cout<<GridLogMessage << L_list[l] <<" \t\t "<< wilson[l]/NN<<" \t "<<dwf4[l]/NN<<" \t "<<dwf5[l] /NN<<std::endl; | ||||||
|  |   } | ||||||
|  |   std::cout<<GridLogMessage << "=================================================================================="<<std::endl; | ||||||
|  |  | ||||||
|  |   std::cout<<GridLogMessage << "=================================================================================="<<std::endl; | ||||||
|  |   std::cout<<GridLogMessage << " Comparison point     result: "  << 0.5*(dwf4[sel]+dwf4[selm1])/NN << " Mflop/s per node"<<std::endl; | ||||||
|  |   std::cout<<GridLogMessage << " Comparison point is 0.5*("<<dwf4[sel]/NN<<"+"<<dwf4[selm1]/NN << ") "<<std::endl; | ||||||
|  |   std::cout<<std::setprecision(3); | ||||||
|  |   std::cout<<GridLogMessage << " Comparison point robustness: "  << robust_list[sel] <<std::endl; | ||||||
|  |   std::cout<<GridLogMessage << "=================================================================================="<<std::endl; | ||||||
|  |  | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |   Grid_finalize(); | ||||||
|  | } | ||||||
| @@ -31,6 +31,32 @@ using namespace std; | |||||||
| using namespace Grid; | using namespace Grid; | ||||||
| using namespace Grid::QCD; | using namespace Grid::QCD; | ||||||
|  |  | ||||||
|  | struct time_statistics{ | ||||||
|  |   double mean; | ||||||
|  |   double err; | ||||||
|  |   double min; | ||||||
|  |   double max; | ||||||
|  |  | ||||||
|  |   void statistics(std::vector<double> v){ | ||||||
|  |       double sum = std::accumulate(v.begin(), v.end(), 0.0); | ||||||
|  |       mean = sum / v.size(); | ||||||
|  |  | ||||||
|  |       std::vector<double> diff(v.size()); | ||||||
|  |       std::transform(v.begin(), v.end(), diff.begin(), [=](double x) { return x - mean; }); | ||||||
|  |       double sq_sum = std::inner_product(diff.begin(), diff.end(), diff.begin(), 0.0); | ||||||
|  |       err = std::sqrt(sq_sum / (v.size()*(v.size() - 1))); | ||||||
|  |  | ||||||
|  |       auto result = std::minmax_element(v.begin(), v.end()); | ||||||
|  |       min = *result.first; | ||||||
|  |       max = *result.second; | ||||||
|  | } | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | void header(){ | ||||||
|  |   std::cout <<GridLogMessage << " L  "<<"\t"<<" Ls  "<<"\t" | ||||||
|  |             <<std::setw(11)<<"bytes"<<"MB/s uni (err/min/max)"<<"\t\t"<<"MB/s bidi (err/min/max)"<<std::endl; | ||||||
|  | }; | ||||||
|  |  | ||||||
| int main (int argc, char ** argv) | int main (int argc, char ** argv) | ||||||
| { | { | ||||||
|   Grid_init(&argc,&argv); |   Grid_init(&argc,&argv); | ||||||
| @@ -40,17 +66,21 @@ int main (int argc, char ** argv) | |||||||
|   int threads = GridThread::GetThreads(); |   int threads = GridThread::GetThreads(); | ||||||
|   std::cout<<GridLogMessage << "Grid is setup to use "<<threads<<" threads"<<std::endl; |   std::cout<<GridLogMessage << "Grid is setup to use "<<threads<<" threads"<<std::endl; | ||||||
|  |  | ||||||
|   int Nloop=10; |   int Nloop=100; | ||||||
|   int nmu=0; |   int nmu=0; | ||||||
|  |   int maxlat=32; | ||||||
|   for(int mu=0;mu<Nd;mu++) if (mpi_layout[mu]>1) nmu++; |   for(int mu=0;mu<Nd;mu++) if (mpi_layout[mu]>1) nmu++; | ||||||
|  |  | ||||||
|  |   std::cout << GridLogMessage << "Number of iterations to average: "<< Nloop << std::endl; | ||||||
|  |   std::vector<double> t_time(Nloop); | ||||||
|  |   time_statistics timestat; | ||||||
|  |  | ||||||
|   std::cout<<GridLogMessage << "===================================================================================================="<<std::endl; |   std::cout<<GridLogMessage << "===================================================================================================="<<std::endl; | ||||||
|   std::cout<<GridLogMessage << "= Benchmarking concurrent halo exchange in "<<nmu<<" dimensions"<<std::endl; |   std::cout<<GridLogMessage << "= Benchmarking concurrent halo exchange in "<<nmu<<" dimensions"<<std::endl; | ||||||
|   std::cout<<GridLogMessage << "===================================================================================================="<<std::endl; |   std::cout<<GridLogMessage << "===================================================================================================="<<std::endl; | ||||||
|   std::cout<<GridLogMessage << "  L  "<<"\t\t"<<" Ls  "<<"\t\t"<<"bytes"<<"\t\t"<<"MB/s uni"<<"\t\t"<<"MB/s bidi"<<std::endl; |   header(); | ||||||
|   int maxlat=24; |  | ||||||
|   for(int lat=4;lat<=maxlat;lat+=4){ |   for(int lat=4;lat<=maxlat;lat+=4){ | ||||||
|     for(int Ls=8;Ls<=32;Ls*=2){ |     for(int Ls=8;Ls<=8;Ls*=2){ | ||||||
|  |  | ||||||
|       std::vector<int> latt_size  ({lat*mpi_layout[0], |       std::vector<int> latt_size  ({lat*mpi_layout[0], | ||||||
|       				    lat*mpi_layout[1], |       				    lat*mpi_layout[1], | ||||||
| @@ -58,17 +88,25 @@ int main (int argc, char ** argv) | |||||||
|       				    lat*mpi_layout[3]}); |       				    lat*mpi_layout[3]}); | ||||||
|  |  | ||||||
|       GridCartesian     Grid(latt_size,simd_layout,mpi_layout); |       GridCartesian     Grid(latt_size,simd_layout,mpi_layout); | ||||||
|  |       RealD Nrank = Grid._Nprocessors; | ||||||
|  |       RealD Nnode = Grid.NodeCount(); | ||||||
|  |       RealD ppn = Nrank/Nnode; | ||||||
|  |  | ||||||
|       std::vector<std::vector<HalfSpinColourVectorD> > xbuf(8,std::vector<HalfSpinColourVectorD>(lat*lat*lat*Ls)); |       std::vector<Vector<HalfSpinColourVectorD> > xbuf(8);	 | ||||||
|       std::vector<std::vector<HalfSpinColourVectorD> > rbuf(8,std::vector<HalfSpinColourVectorD>(lat*lat*lat*Ls)); |       std::vector<Vector<HalfSpinColourVectorD> > rbuf(8); | ||||||
|  |  | ||||||
|       int ncomm; |       int ncomm; | ||||||
|       int bytes=lat*lat*lat*Ls*sizeof(HalfSpinColourVectorD); |       int bytes=lat*lat*lat*Ls*sizeof(HalfSpinColourVectorD); | ||||||
|  |       for(int mu=0;mu<8;mu++){ | ||||||
|  | 	xbuf[mu].resize(lat*lat*lat*Ls); | ||||||
|  | 	rbuf[mu].resize(lat*lat*lat*Ls); | ||||||
|  | 	//	std::cout << " buffers " << std::hex << (uint64_t)&xbuf[mu][0] <<" " << (uint64_t)&rbuf[mu][0] <<std::endl; | ||||||
|  |       } | ||||||
|  |  | ||||||
|       double start=usecond(); |  | ||||||
|       for(int i=0;i<Nloop;i++){ |       for(int i=0;i<Nloop;i++){ | ||||||
|  |       double start=usecond(); | ||||||
|  |  | ||||||
| 	std::vector<CartesianCommunicator::CommsRequest_t> requests; | 	std::vector<CommsRequest_t> requests; | ||||||
|  |  | ||||||
| 	ncomm=0; | 	ncomm=0; | ||||||
| 	for(int mu=0;mu<4;mu++){ | 	for(int mu=0;mu<4;mu++){ | ||||||
| @@ -79,7 +117,6 @@ int main (int argc, char ** argv) | |||||||
| 	    int comm_proc=1; | 	    int comm_proc=1; | ||||||
| 	    int xmit_to_rank; | 	    int xmit_to_rank; | ||||||
| 	    int recv_from_rank; | 	    int recv_from_rank; | ||||||
| 	     |  | ||||||
| 	    Grid.ShiftedRanks(mu,comm_proc,xmit_to_rank,recv_from_rank); | 	    Grid.ShiftedRanks(mu,comm_proc,xmit_to_rank,recv_from_rank); | ||||||
| 	    Grid.SendToRecvFromBegin(requests, | 	    Grid.SendToRecvFromBegin(requests, | ||||||
| 				   (void *)&xbuf[mu][0], | 				   (void *)&xbuf[mu][0], | ||||||
| @@ -102,18 +139,24 @@ int main (int argc, char ** argv) | |||||||
| 	} | 	} | ||||||
| 	Grid.SendToRecvFromComplete(requests); | 	Grid.SendToRecvFromComplete(requests); | ||||||
| 	Grid.Barrier(); | 	Grid.Barrier(); | ||||||
|  | 	double stop=usecond(); | ||||||
|  | 	t_time[i] = stop-start; // microseconds | ||||||
|       } |       } | ||||||
|       double stop=usecond(); |  | ||||||
|  |  | ||||||
|       double dbytes    = bytes; |       timestat.statistics(t_time); | ||||||
|       double xbytes    = Nloop*dbytes*2.0*ncomm; |  | ||||||
|  |       double dbytes    = bytes*ppn; | ||||||
|  |       double xbytes    = dbytes*2.0*ncomm; | ||||||
|       double rbytes    = xbytes; |       double rbytes    = xbytes; | ||||||
|       double bidibytes = xbytes+rbytes; |       double bidibytes = xbytes+rbytes; | ||||||
|  |  | ||||||
|       double time = stop-start; // microseconds |       std::cout<<GridLogMessage << std::setw(4) << lat<<"\t"<<Ls<<"\t" | ||||||
|  |                <<std::setw(11) << bytes<< std::fixed << std::setprecision(1) << std::setw(7) | ||||||
|  |                <<std::right<< xbytes/timestat.mean<<"  "<< xbytes*timestat.err/(timestat.mean*timestat.mean)<< " " | ||||||
|  |                <<xbytes/timestat.max <<" "<< xbytes/timestat.min   | ||||||
|  |                << "\t\t"<<std::setw(7)<< bidibytes/timestat.mean<< "  " << bidibytes*timestat.err/(timestat.mean*timestat.mean) << " " | ||||||
|  |                << bidibytes/timestat.max << " " << bidibytes/timestat.min << std::endl; | ||||||
|  |  | ||||||
|       std::cout<<GridLogMessage << lat<<"\t\t"<<Ls<<"\t\t"<<bytes<<"\t\t"<<xbytes/time<<"\t\t"<<bidibytes/time<<std::endl; |  | ||||||
|     } |     } | ||||||
|   }     |   }     | ||||||
|  |  | ||||||
| @@ -121,25 +164,32 @@ int main (int argc, char ** argv) | |||||||
|   std::cout<<GridLogMessage << "===================================================================================================="<<std::endl; |   std::cout<<GridLogMessage << "===================================================================================================="<<std::endl; | ||||||
|   std::cout<<GridLogMessage << "= Benchmarking sequential halo exchange in "<<nmu<<" dimensions"<<std::endl; |   std::cout<<GridLogMessage << "= Benchmarking sequential halo exchange in "<<nmu<<" dimensions"<<std::endl; | ||||||
|   std::cout<<GridLogMessage << "===================================================================================================="<<std::endl; |   std::cout<<GridLogMessage << "===================================================================================================="<<std::endl; | ||||||
|   std::cout<<GridLogMessage << "  L  "<<"\t\t"<<" Ls  "<<"\t\t"<<"bytes"<<"\t\t"<<"MB/s uni"<<"\t\t"<<"MB/s bidi"<<std::endl; |   header(); | ||||||
|  |  | ||||||
|  |  | ||||||
|   for(int lat=4;lat<=maxlat;lat+=4){ |   for(int lat=4;lat<=maxlat;lat+=4){ | ||||||
|     for(int Ls=8;Ls<=32;Ls*=2){ |     for(int Ls=8;Ls<=8;Ls*=2){ | ||||||
|  |  | ||||||
|       std::vector<int> latt_size  ({lat,lat,lat,lat}); |       std::vector<int> latt_size  ({lat,lat,lat,lat}); | ||||||
|  |  | ||||||
|       GridCartesian     Grid(latt_size,simd_layout,mpi_layout); |       GridCartesian     Grid(latt_size,simd_layout,mpi_layout); | ||||||
|  |       RealD Nrank = Grid._Nprocessors; | ||||||
|  |       RealD Nnode = Grid.NodeCount(); | ||||||
|  |       RealD ppn = Nrank/Nnode; | ||||||
|  |  | ||||||
|       std::vector<std::vector<HalfSpinColourVectorD> > xbuf(8,std::vector<HalfSpinColourVectorD>(lat*lat*lat*Ls)); |       std::vector<Vector<HalfSpinColourVectorD> > xbuf(8); | ||||||
|       std::vector<std::vector<HalfSpinColourVectorD> > rbuf(8,std::vector<HalfSpinColourVectorD>(lat*lat*lat*Ls)); |       std::vector<Vector<HalfSpinColourVectorD> > rbuf(8); | ||||||
|  |  | ||||||
|  |       for(int mu=0;mu<8;mu++){ | ||||||
|  | 	xbuf[mu].resize(lat*lat*lat*Ls); | ||||||
|  | 	rbuf[mu].resize(lat*lat*lat*Ls); | ||||||
|  | 	//	std::cout << " buffers " << std::hex << (uint64_t)&xbuf[mu][0] <<" " << (uint64_t)&rbuf[mu][0] <<std::endl; | ||||||
|  |       } | ||||||
|  |  | ||||||
|       int ncomm; |       int ncomm; | ||||||
|       int bytes=lat*lat*lat*Ls*sizeof(HalfSpinColourVectorD); |       int bytes=lat*lat*lat*Ls*sizeof(HalfSpinColourVectorD); | ||||||
|  |  | ||||||
|       double start=usecond(); |  | ||||||
|       for(int i=0;i<Nloop;i++){ |       for(int i=0;i<Nloop;i++){ | ||||||
|  |       double start=usecond(); | ||||||
|      |      | ||||||
| 	ncomm=0; | 	ncomm=0; | ||||||
| 	for(int mu=0;mu<4;mu++){ | 	for(int mu=0;mu<4;mu++){ | ||||||
| @@ -152,7 +202,7 @@ int main (int argc, char ** argv) | |||||||
| 	    int recv_from_rank; | 	    int recv_from_rank; | ||||||
| 	     | 	     | ||||||
| 	    { | 	    { | ||||||
| 	      std::vector<CartesianCommunicator::CommsRequest_t> requests; | 	      std::vector<CommsRequest_t> requests; | ||||||
| 	      Grid.ShiftedRanks(mu,comm_proc,xmit_to_rank,recv_from_rank); | 	      Grid.ShiftedRanks(mu,comm_proc,xmit_to_rank,recv_from_rank); | ||||||
| 	      Grid.SendToRecvFromBegin(requests, | 	      Grid.SendToRecvFromBegin(requests, | ||||||
| 				       (void *)&xbuf[mu][0], | 				       (void *)&xbuf[mu][0], | ||||||
| @@ -165,7 +215,7 @@ int main (int argc, char ** argv) | |||||||
|  |  | ||||||
| 	    comm_proc = mpi_layout[mu]-1; | 	    comm_proc = mpi_layout[mu]-1; | ||||||
| 	    { | 	    { | ||||||
| 	      std::vector<CartesianCommunicator::CommsRequest_t> requests; | 	      std::vector<CommsRequest_t> requests; | ||||||
| 	      Grid.ShiftedRanks(mu,comm_proc,xmit_to_rank,recv_from_rank); | 	      Grid.ShiftedRanks(mu,comm_proc,xmit_to_rank,recv_from_rank); | ||||||
| 	      Grid.SendToRecvFromBegin(requests, | 	      Grid.SendToRecvFromBegin(requests, | ||||||
| 				       (void *)&xbuf[mu+4][0], | 				       (void *)&xbuf[mu+4][0], | ||||||
| @@ -178,30 +228,37 @@ int main (int argc, char ** argv) | |||||||
| 	  } | 	  } | ||||||
| 	} | 	} | ||||||
| 	Grid.Barrier(); | 	Grid.Barrier(); | ||||||
|  | 	double stop=usecond(); | ||||||
|  | 	t_time[i] = stop-start; // microseconds | ||||||
|  |  | ||||||
|       } |       } | ||||||
|  |  | ||||||
|       double stop=usecond(); |       timestat.statistics(t_time); | ||||||
|        |        | ||||||
|       double dbytes    = bytes; |       double dbytes    = bytes*ppn; | ||||||
|       double xbytes    = Nloop*dbytes*2.0*ncomm; |       double xbytes    = dbytes*2.0*ncomm; | ||||||
|       double rbytes    = xbytes; |       double rbytes    = xbytes; | ||||||
|       double bidibytes = xbytes+rbytes; |       double bidibytes = xbytes+rbytes; | ||||||
|  |  | ||||||
|       double time = stop-start; |     std::cout<<GridLogMessage << std::setw(4) << lat<<"\t"<<Ls<<"\t" | ||||||
|  |                <<std::setw(11) << bytes<< std::fixed << std::setprecision(1) << std::setw(7) | ||||||
|  |                <<std::right<< xbytes/timestat.mean<<"  "<< xbytes*timestat.err/(timestat.mean*timestat.mean)<< " " | ||||||
|  |                <<xbytes/timestat.max <<" "<< xbytes/timestat.min   | ||||||
|  |                << "\t\t"<<std::setw(7)<< bidibytes/timestat.mean<< "  " << bidibytes*timestat.err/(timestat.mean*timestat.mean) << " " | ||||||
|  |                << bidibytes/timestat.max << " " << bidibytes/timestat.min << std::endl; | ||||||
|  |  | ||||||
|       std::cout<<GridLogMessage << lat<<"\t\t"<<Ls<<"\t\t"<<bytes<<"\t\t"<<xbytes/time<<"\t\t"<<bidibytes/time<<std::endl; |        | ||||||
|     } |     } | ||||||
|   }   |   }   | ||||||
|  |  | ||||||
|  |  | ||||||
|   Nloop=10; |  | ||||||
|   std::cout<<GridLogMessage << "===================================================================================================="<<std::endl; |   std::cout<<GridLogMessage << "===================================================================================================="<<std::endl; | ||||||
|   std::cout<<GridLogMessage << "= Benchmarking concurrent STENCIL halo exchange in "<<nmu<<" dimensions"<<std::endl; |   std::cout<<GridLogMessage << "= Benchmarking concurrent STENCIL halo exchange in "<<nmu<<" dimensions"<<std::endl; | ||||||
|   std::cout<<GridLogMessage << "===================================================================================================="<<std::endl; |   std::cout<<GridLogMessage << "===================================================================================================="<<std::endl; | ||||||
|   std::cout<<GridLogMessage << "  L  "<<"\t\t"<<" Ls  "<<"\t\t"<<"bytes"<<"\t\t"<<"MB/s uni"<<"\t\t"<<"MB/s bidi"<<std::endl; |   header(); | ||||||
|  |  | ||||||
|   for(int lat=4;lat<=maxlat;lat+=4){ |   for(int lat=4;lat<=maxlat;lat+=4){ | ||||||
|     for(int Ls=8;Ls<=32;Ls*=2){ |     for(int Ls=8;Ls<=8;Ls*=2){ | ||||||
|  |  | ||||||
|       std::vector<int> latt_size  ({lat*mpi_layout[0], |       std::vector<int> latt_size  ({lat*mpi_layout[0], | ||||||
|       				    lat*mpi_layout[1], |       				    lat*mpi_layout[1], | ||||||
| @@ -209,6 +266,9 @@ int main (int argc, char ** argv) | |||||||
|       				    lat*mpi_layout[3]}); |       				    lat*mpi_layout[3]}); | ||||||
|  |  | ||||||
|       GridCartesian     Grid(latt_size,simd_layout,mpi_layout); |       GridCartesian     Grid(latt_size,simd_layout,mpi_layout); | ||||||
|  |       RealD Nrank = Grid._Nprocessors; | ||||||
|  |       RealD Nnode = Grid.NodeCount(); | ||||||
|  |       RealD ppn = Nrank/Nnode; | ||||||
|  |  | ||||||
|       std::vector<HalfSpinColourVectorD *> xbuf(8); |       std::vector<HalfSpinColourVectorD *> xbuf(8); | ||||||
|       std::vector<HalfSpinColourVectorD *> rbuf(8); |       std::vector<HalfSpinColourVectorD *> rbuf(8); | ||||||
| @@ -216,73 +276,86 @@ int main (int argc, char ** argv) | |||||||
|       for(int d=0;d<8;d++){ |       for(int d=0;d<8;d++){ | ||||||
| 	xbuf[d] = (HalfSpinColourVectorD *)Grid.ShmBufferMalloc(lat*lat*lat*Ls*sizeof(HalfSpinColourVectorD)); | 	xbuf[d] = (HalfSpinColourVectorD *)Grid.ShmBufferMalloc(lat*lat*lat*Ls*sizeof(HalfSpinColourVectorD)); | ||||||
| 	rbuf[d] = (HalfSpinColourVectorD *)Grid.ShmBufferMalloc(lat*lat*lat*Ls*sizeof(HalfSpinColourVectorD)); | 	rbuf[d] = (HalfSpinColourVectorD *)Grid.ShmBufferMalloc(lat*lat*lat*Ls*sizeof(HalfSpinColourVectorD)); | ||||||
|  | 	bzero((void *)xbuf[d],lat*lat*lat*Ls*sizeof(HalfSpinColourVectorD)); | ||||||
|  | 	bzero((void *)rbuf[d],lat*lat*lat*Ls*sizeof(HalfSpinColourVectorD)); | ||||||
|       } |       } | ||||||
|  |  | ||||||
|       int ncomm; |       int ncomm; | ||||||
|       int bytes=lat*lat*lat*Ls*sizeof(HalfSpinColourVectorD); |       int bytes=lat*lat*lat*Ls*sizeof(HalfSpinColourVectorD); | ||||||
|  |  | ||||||
|       double start=usecond(); |       double dbytes; | ||||||
|       for(int i=0;i<Nloop;i++){ |       for(int i=0;i<Nloop;i++){ | ||||||
|  | 	double start=usecond(); | ||||||
|  |  | ||||||
| 	std::vector<CartesianCommunicator::CommsRequest_t> requests; | 	dbytes=0; | ||||||
|  |  | ||||||
| 	ncomm=0; | 	ncomm=0; | ||||||
|  |  | ||||||
|  | 	std::vector<CommsRequest_t> requests; | ||||||
|  |  | ||||||
| 	for(int mu=0;mu<4;mu++){ | 	for(int mu=0;mu<4;mu++){ | ||||||
| 	 | 	 | ||||||
|  |  | ||||||
| 	  if (mpi_layout[mu]>1 ) { | 	  if (mpi_layout[mu]>1 ) { | ||||||
| 	   | 	   | ||||||
| 	    ncomm++; | 	    ncomm++; | ||||||
| 	    int comm_proc=1; | 	    int comm_proc=1; | ||||||
| 	    int xmit_to_rank; | 	    int xmit_to_rank; | ||||||
| 	    int recv_from_rank; | 	    int recv_from_rank; | ||||||
| 	     |  | ||||||
| 	    Grid.ShiftedRanks(mu,comm_proc,xmit_to_rank,recv_from_rank); | 	    Grid.ShiftedRanks(mu,comm_proc,xmit_to_rank,recv_from_rank); | ||||||
| 	    Grid.StencilSendToRecvFromBegin(requests, | 	    dbytes+= | ||||||
| 					    (void *)&xbuf[mu][0], | 	      Grid.StencilSendToRecvFromBegin(requests, | ||||||
| 					    xmit_to_rank, | 					      (void *)&xbuf[mu][0], | ||||||
| 					    (void *)&rbuf[mu][0], | 					      xmit_to_rank, | ||||||
| 					    recv_from_rank, | 					      (void *)&rbuf[mu][0], | ||||||
| 					    bytes); | 					      recv_from_rank, | ||||||
|  | 					      bytes,mu); | ||||||
| 	 | 	 | ||||||
| 	    comm_proc = mpi_layout[mu]-1; | 	    comm_proc = mpi_layout[mu]-1; | ||||||
| 	   | 	   | ||||||
| 	    Grid.ShiftedRanks(mu,comm_proc,xmit_to_rank,recv_from_rank); | 	    Grid.ShiftedRanks(mu,comm_proc,xmit_to_rank,recv_from_rank); | ||||||
| 	    Grid.StencilSendToRecvFromBegin(requests, | 	    dbytes+= | ||||||
| 					    (void *)&xbuf[mu+4][0], | 	      Grid.StencilSendToRecvFromBegin(requests, | ||||||
| 					    xmit_to_rank, | 					      (void *)&xbuf[mu+4][0], | ||||||
| 					    (void *)&rbuf[mu+4][0], | 					      xmit_to_rank, | ||||||
| 					    recv_from_rank, | 					      (void *)&rbuf[mu+4][0], | ||||||
| 					    bytes); | 					      recv_from_rank, | ||||||
|  | 					      bytes,mu+4); | ||||||
| 	   | 	   | ||||||
| 	  } | 	  } | ||||||
| 	} | 	} | ||||||
| 	Grid.StencilSendToRecvFromComplete(requests); | 	Grid.StencilSendToRecvFromComplete(requests,0); | ||||||
| 	Grid.Barrier(); | 	Grid.Barrier(); | ||||||
|  | 	double stop=usecond(); | ||||||
|  | 	t_time[i] = stop-start; // microseconds | ||||||
|  | 	 | ||||||
|       } |       } | ||||||
|       double stop=usecond(); |  | ||||||
|  |  | ||||||
|       double dbytes    = bytes; |       timestat.statistics(t_time); | ||||||
|       double xbytes    = Nloop*dbytes*2.0*ncomm; |  | ||||||
|       double rbytes    = xbytes; |       dbytes=dbytes*ppn; | ||||||
|       double bidibytes = xbytes+rbytes; |       double xbytes    = dbytes*0.5; | ||||||
|  |       double rbytes    = dbytes*0.5; | ||||||
|  |       double bidibytes = dbytes; | ||||||
|  |  | ||||||
|  |       std::cout<<GridLogMessage << std::setw(4) << lat<<"\t"<<Ls<<"\t" | ||||||
|  |                <<std::setw(11) << bytes<< std::fixed << std::setprecision(1) << std::setw(7) | ||||||
|  |                <<std::right<< xbytes/timestat.mean<<"  "<< xbytes*timestat.err/(timestat.mean*timestat.mean)<< " " | ||||||
|  |                <<xbytes/timestat.max <<" "<< xbytes/timestat.min   | ||||||
|  |                << "\t\t"<<std::setw(7)<< bidibytes/timestat.mean<< "  " << bidibytes*timestat.err/(timestat.mean*timestat.mean) << " " | ||||||
|  |                << bidibytes/timestat.max << " " << bidibytes/timestat.min << std::endl; | ||||||
|  |  | ||||||
|       double time = stop-start; // microseconds |  | ||||||
|  |  | ||||||
|       std::cout<<GridLogMessage << lat<<"\t\t"<<Ls<<"\t\t"<<bytes<<"\t\t"<<xbytes/time<<"\t\t"<<bidibytes/time<<std::endl; |  | ||||||
|     } |     } | ||||||
|   }     |   }     | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|   Nloop=100; |  | ||||||
|   std::cout<<GridLogMessage << "===================================================================================================="<<std::endl; |   std::cout<<GridLogMessage << "===================================================================================================="<<std::endl; | ||||||
|   std::cout<<GridLogMessage << "= Benchmarking sequential STENCIL halo exchange in "<<nmu<<" dimensions"<<std::endl; |   std::cout<<GridLogMessage << "= Benchmarking sequential STENCIL halo exchange in "<<nmu<<" dimensions"<<std::endl; | ||||||
|   std::cout<<GridLogMessage << "===================================================================================================="<<std::endl; |   std::cout<<GridLogMessage << "===================================================================================================="<<std::endl; | ||||||
|   std::cout<<GridLogMessage << "  L  "<<"\t\t"<<" Ls  "<<"\t\t"<<"bytes"<<"\t\t"<<"MB/s uni"<<"\t\t"<<"MB/s bidi"<<std::endl; |   header(); | ||||||
|  |  | ||||||
|   for(int lat=4;lat<=maxlat;lat+=4){ |   for(int lat=4;lat<=maxlat;lat+=4){ | ||||||
|     for(int Ls=8;Ls<=32;Ls*=2){ |     for(int Ls=8;Ls<=8;Ls*=2){ | ||||||
|  |  | ||||||
|       std::vector<int> latt_size  ({lat*mpi_layout[0], |       std::vector<int> latt_size  ({lat*mpi_layout[0], | ||||||
|       				    lat*mpi_layout[1], |       				    lat*mpi_layout[1], | ||||||
| @@ -290,6 +363,9 @@ int main (int argc, char ** argv) | |||||||
|       				    lat*mpi_layout[3]}); |       				    lat*mpi_layout[3]}); | ||||||
|  |  | ||||||
|       GridCartesian     Grid(latt_size,simd_layout,mpi_layout); |       GridCartesian     Grid(latt_size,simd_layout,mpi_layout); | ||||||
|  |       RealD Nrank = Grid._Nprocessors; | ||||||
|  |       RealD Nnode = Grid.NodeCount(); | ||||||
|  |       RealD ppn = Nrank/Nnode; | ||||||
|  |  | ||||||
|       std::vector<HalfSpinColourVectorD *> xbuf(8); |       std::vector<HalfSpinColourVectorD *> xbuf(8); | ||||||
|       std::vector<HalfSpinColourVectorD *> rbuf(8); |       std::vector<HalfSpinColourVectorD *> rbuf(8); | ||||||
| @@ -297,16 +373,18 @@ int main (int argc, char ** argv) | |||||||
|       for(int d=0;d<8;d++){ |       for(int d=0;d<8;d++){ | ||||||
| 	xbuf[d] = (HalfSpinColourVectorD *)Grid.ShmBufferMalloc(lat*lat*lat*Ls*sizeof(HalfSpinColourVectorD)); | 	xbuf[d] = (HalfSpinColourVectorD *)Grid.ShmBufferMalloc(lat*lat*lat*Ls*sizeof(HalfSpinColourVectorD)); | ||||||
| 	rbuf[d] = (HalfSpinColourVectorD *)Grid.ShmBufferMalloc(lat*lat*lat*Ls*sizeof(HalfSpinColourVectorD)); | 	rbuf[d] = (HalfSpinColourVectorD *)Grid.ShmBufferMalloc(lat*lat*lat*Ls*sizeof(HalfSpinColourVectorD)); | ||||||
|  | 	bzero((void *)xbuf[d],lat*lat*lat*Ls*sizeof(HalfSpinColourVectorD)); | ||||||
|  | 	bzero((void *)rbuf[d],lat*lat*lat*Ls*sizeof(HalfSpinColourVectorD)); | ||||||
|       } |       } | ||||||
|  |  | ||||||
|       int ncomm; |       int ncomm; | ||||||
|       int bytes=lat*lat*lat*Ls*sizeof(HalfSpinColourVectorD); |       int bytes=lat*lat*lat*Ls*sizeof(HalfSpinColourVectorD); | ||||||
|  |       double dbytes; | ||||||
|       double start=usecond(); |  | ||||||
|       for(int i=0;i<Nloop;i++){ |       for(int i=0;i<Nloop;i++){ | ||||||
|  | 	double start=usecond(); | ||||||
|  |  | ||||||
| 	std::vector<CartesianCommunicator::CommsRequest_t> requests; | 	std::vector<CommsRequest_t> requests; | ||||||
|  | 	dbytes=0; | ||||||
| 	ncomm=0; | 	ncomm=0; | ||||||
| 	for(int mu=0;mu<4;mu++){ | 	for(int mu=0;mu<4;mu++){ | ||||||
| 	 | 	 | ||||||
| @@ -318,44 +396,146 @@ int main (int argc, char ** argv) | |||||||
| 	    int recv_from_rank; | 	    int recv_from_rank; | ||||||
| 	     | 	     | ||||||
| 	    Grid.ShiftedRanks(mu,comm_proc,xmit_to_rank,recv_from_rank); | 	    Grid.ShiftedRanks(mu,comm_proc,xmit_to_rank,recv_from_rank); | ||||||
| 	    Grid.StencilSendToRecvFromBegin(requests, | 	    dbytes+= | ||||||
| 					    (void *)&xbuf[mu][0], | 	      Grid.StencilSendToRecvFromBegin(requests, | ||||||
| 					    xmit_to_rank, | 					      (void *)&xbuf[mu][0], | ||||||
| 					    (void *)&rbuf[mu][0], | 					      xmit_to_rank, | ||||||
| 					    recv_from_rank, | 					      (void *)&rbuf[mu][0], | ||||||
| 					    bytes); | 					      recv_from_rank, | ||||||
| 	    Grid.StencilSendToRecvFromComplete(requests); | 					      bytes,mu); | ||||||
|  | 	    Grid.StencilSendToRecvFromComplete(requests,mu); | ||||||
| 	    requests.resize(0); | 	    requests.resize(0); | ||||||
|  |  | ||||||
| 	    comm_proc = mpi_layout[mu]-1; | 	    comm_proc = mpi_layout[mu]-1; | ||||||
| 	   | 	   | ||||||
| 	    Grid.ShiftedRanks(mu,comm_proc,xmit_to_rank,recv_from_rank); | 	    Grid.ShiftedRanks(mu,comm_proc,xmit_to_rank,recv_from_rank); | ||||||
| 	    Grid.StencilSendToRecvFromBegin(requests, | 	    dbytes+= | ||||||
| 					    (void *)&xbuf[mu+4][0], | 	      Grid.StencilSendToRecvFromBegin(requests, | ||||||
| 					    xmit_to_rank, | 					      (void *)&xbuf[mu+4][0], | ||||||
| 					    (void *)&rbuf[mu+4][0], | 					      xmit_to_rank, | ||||||
| 					    recv_from_rank, | 					      (void *)&rbuf[mu+4][0], | ||||||
| 					    bytes); | 					      recv_from_rank, | ||||||
| 	    Grid.StencilSendToRecvFromComplete(requests); | 					      bytes,mu+4); | ||||||
|  | 	    Grid.StencilSendToRecvFromComplete(requests,mu+4); | ||||||
| 	    requests.resize(0); | 	    requests.resize(0); | ||||||
| 	   | 	   | ||||||
| 	  } | 	  } | ||||||
| 	} | 	} | ||||||
| 	Grid.Barrier(); | 	Grid.Barrier(); | ||||||
|  | 	double stop=usecond(); | ||||||
|  | 	t_time[i] = stop-start; // microseconds | ||||||
|  | 	 | ||||||
|       } |       } | ||||||
|       double stop=usecond(); |  | ||||||
|  |  | ||||||
|       double dbytes    = bytes; |       timestat.statistics(t_time); | ||||||
|       double xbytes    = Nloop*dbytes*2.0*ncomm; |  | ||||||
|       double rbytes    = xbytes; |  | ||||||
|       double bidibytes = xbytes+rbytes; |  | ||||||
|  |  | ||||||
|       double time = stop-start; // microseconds |       dbytes=dbytes*ppn; | ||||||
|  |       double xbytes    = dbytes*0.5; | ||||||
|  |       double rbytes    = dbytes*0.5; | ||||||
|  |       double bidibytes = dbytes; | ||||||
|  |  | ||||||
|       std::cout<<GridLogMessage << lat<<"\t\t"<<Ls<<"\t\t"<<bytes<<"\t\t"<<xbytes/time<<"\t\t"<<bidibytes/time<<std::endl; |  | ||||||
|  |       std::cout<<GridLogMessage << std::setw(4) << lat<<"\t"<<Ls<<"\t" | ||||||
|  |                <<std::setw(11) << bytes<< std::fixed << std::setprecision(1) << std::setw(7) | ||||||
|  |                <<std::right<< xbytes/timestat.mean<<"  "<< xbytes*timestat.err/(timestat.mean*timestat.mean)<< " " | ||||||
|  |                <<xbytes/timestat.max <<" "<< xbytes/timestat.min   | ||||||
|  |                << "\t\t"<<std::setw(7)<< bidibytes/timestat.mean<< "  " << bidibytes*timestat.err/(timestat.mean*timestat.mean) << " " | ||||||
|  |                << bidibytes/timestat.max << " " << bidibytes/timestat.min << std::endl; | ||||||
|  |   | ||||||
|     } |     } | ||||||
|   }     |   }     | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |   std::cout<<GridLogMessage << "===================================================================================================="<<std::endl; | ||||||
|  |   std::cout<<GridLogMessage << "= Benchmarking threaded STENCIL halo exchange in "<<nmu<<" dimensions"<<std::endl; | ||||||
|  |   std::cout<<GridLogMessage << "===================================================================================================="<<std::endl; | ||||||
|  |   header(); | ||||||
|  |  | ||||||
|  |   for(int lat=4;lat<=maxlat;lat+=4){ | ||||||
|  |     for(int Ls=8;Ls<=8;Ls*=2){ | ||||||
|  |  | ||||||
|  |       std::vector<int> latt_size  ({lat*mpi_layout[0], | ||||||
|  |       				    lat*mpi_layout[1], | ||||||
|  |       				    lat*mpi_layout[2], | ||||||
|  |       				    lat*mpi_layout[3]}); | ||||||
|  |  | ||||||
|  |       GridCartesian     Grid(latt_size,simd_layout,mpi_layout); | ||||||
|  |       RealD Nrank = Grid._Nprocessors; | ||||||
|  |       RealD Nnode = Grid.NodeCount(); | ||||||
|  |       RealD ppn = Nrank/Nnode; | ||||||
|  |  | ||||||
|  |       std::vector<HalfSpinColourVectorD *> xbuf(8); | ||||||
|  |       std::vector<HalfSpinColourVectorD *> rbuf(8); | ||||||
|  |       Grid.ShmBufferFreeAll(); | ||||||
|  |       for(int d=0;d<8;d++){ | ||||||
|  | 	xbuf[d] = (HalfSpinColourVectorD *)Grid.ShmBufferMalloc(lat*lat*lat*Ls*sizeof(HalfSpinColourVectorD)); | ||||||
|  | 	rbuf[d] = (HalfSpinColourVectorD *)Grid.ShmBufferMalloc(lat*lat*lat*Ls*sizeof(HalfSpinColourVectorD)); | ||||||
|  | 	bzero((void *)xbuf[d],lat*lat*lat*Ls*sizeof(HalfSpinColourVectorD)); | ||||||
|  | 	bzero((void *)rbuf[d],lat*lat*lat*Ls*sizeof(HalfSpinColourVectorD)); | ||||||
|  |       } | ||||||
|  |  | ||||||
|  |       int ncomm; | ||||||
|  |       int bytes=lat*lat*lat*Ls*sizeof(HalfSpinColourVectorD); | ||||||
|  |       double dbytes; | ||||||
|  |       for(int i=0;i<Nloop;i++){ | ||||||
|  | 	double start=usecond(); | ||||||
|  |  | ||||||
|  | 	std::vector<CommsRequest_t> requests; | ||||||
|  | 	dbytes=0; | ||||||
|  | 	ncomm=0; | ||||||
|  |  | ||||||
|  | 	parallel_for(int dir=0;dir<8;dir++){ | ||||||
|  |  | ||||||
|  | 	  double tbytes; | ||||||
|  | 	  int mu =dir % 4; | ||||||
|  |  | ||||||
|  | 	  if (mpi_layout[mu]>1 ) { | ||||||
|  | 	   | ||||||
|  | 	    ncomm++; | ||||||
|  | 	    int xmit_to_rank; | ||||||
|  | 	    int recv_from_rank; | ||||||
|  | 	    if ( dir == mu ) {  | ||||||
|  | 	      int comm_proc=1; | ||||||
|  | 	      Grid.ShiftedRanks(mu,comm_proc,xmit_to_rank,recv_from_rank); | ||||||
|  | 	    } else {  | ||||||
|  | 	      int comm_proc = mpi_layout[mu]-1; | ||||||
|  | 	      Grid.ShiftedRanks(mu,comm_proc,xmit_to_rank,recv_from_rank); | ||||||
|  | 	    } | ||||||
|  |  | ||||||
|  | 	    tbytes= Grid.StencilSendToRecvFrom((void *)&xbuf[dir][0], xmit_to_rank, | ||||||
|  | 					       (void *)&rbuf[dir][0], recv_from_rank, bytes,dir); | ||||||
|  |  | ||||||
|  | #pragma omp atomic | ||||||
|  | 	    dbytes+=tbytes; | ||||||
|  | 	  } | ||||||
|  | 	} | ||||||
|  | 	Grid.Barrier(); | ||||||
|  | 	double stop=usecond(); | ||||||
|  | 	t_time[i] = stop-start; // microseconds | ||||||
|  |       } | ||||||
|  |  | ||||||
|  |       timestat.statistics(t_time); | ||||||
|  |  | ||||||
|  |       dbytes=dbytes*ppn; | ||||||
|  |       double xbytes    = dbytes*0.5; | ||||||
|  |       double rbytes    = dbytes*0.5; | ||||||
|  |       double bidibytes = dbytes; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |       std::cout<<GridLogMessage << std::setw(4) << lat<<"\t"<<Ls<<"\t" | ||||||
|  |                <<std::setw(11) << bytes<< std::fixed << std::setprecision(1) << std::setw(7) | ||||||
|  |                <<std::right<< xbytes/timestat.mean<<"  "<< xbytes*timestat.err/(timestat.mean*timestat.mean)<< " " | ||||||
|  |                <<xbytes/timestat.max <<" "<< xbytes/timestat.min   | ||||||
|  |                << "\t\t"<<std::setw(7)<< bidibytes/timestat.mean<< "  " << bidibytes*timestat.err/(timestat.mean*timestat.mean) << " " | ||||||
|  |                << bidibytes/timestat.max << " " << bidibytes/timestat.min << std::endl; | ||||||
|  |   | ||||||
|  |     } | ||||||
|  |   }     | ||||||
|  |  | ||||||
|  |   std::cout<<GridLogMessage << "===================================================================================================="<<std::endl; | ||||||
|  |   std::cout<<GridLogMessage << "= All done; Bye Bye"<<std::endl; | ||||||
|  |   std::cout<<GridLogMessage << "===================================================================================================="<<std::endl; | ||||||
|  |  | ||||||
|   Grid_finalize(); |   Grid_finalize(); | ||||||
| } | } | ||||||
|   | |||||||
| @@ -1,28 +1,22 @@ | |||||||
|     /************************************************************************************* |  /************************************************************************************* | ||||||
|  |  | ||||||
|     Grid physics library, www.github.com/paboyle/Grid  |     Grid physics library, www.github.com/paboyle/Grid  | ||||||
|  |  | ||||||
|     Source file: ./benchmarks/Benchmark_dwf.cc |     Source file: ./benchmarks/Benchmark_dwf.cc | ||||||
|  |  | ||||||
|     Copyright (C) 2015 |     Copyright (C) 2015 | ||||||
|  |  | ||||||
| Author: Peter Boyle <paboyle@ph.ed.ac.uk> |     Author: Peter Boyle <paboyle@ph.ed.ac.uk> | ||||||
| Author: paboyle <paboyle@ph.ed.ac.uk> |     Author: paboyle <paboyle@ph.ed.ac.uk> | ||||||
|  |  | ||||||
|     This program is free software; you can redistribute it and/or modify |     This program is free software; you can redistribute it and/or modify | ||||||
|     it under the terms of the GNU General Public License as published by |     it under the terms of the GNU General Public License as published by | ||||||
|     the Free Software Foundation; either version 2 of the License, or |     the Free Software Foundation; either version 2 of the License, or | ||||||
|     (at your option) any later version. |     (at your option) any later version. | ||||||
|  |  | ||||||
|     This program is distributed in the hope that it will be useful, |     This program is distributed in the hope that it will be useful, | ||||||
|     but WITHOUT ANY WARRANTY; without even the implied warranty of |     but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the |     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||||
|     GNU General Public License for more details. |     GNU General Public License for more details. | ||||||
|  |  | ||||||
|     You should have received a copy of the GNU General Public License along |     You should have received a copy of the GNU General Public License along | ||||||
|     with this program; if not, write to the Free Software Foundation, Inc., |     with this program; if not, write to the Free Software Foundation, Inc., | ||||||
|     51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |     51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | ||||||
|  |  | ||||||
|     See the full license in the file "LICENSE" in the top level distribution directory |     See the full license in the file "LICENSE" in the top level distribution directory | ||||||
|     *************************************************************************************/ |     *************************************************************************************/ | ||||||
|     /*  END LEGAL */ |     /*  END LEGAL */ | ||||||
| @@ -57,7 +51,13 @@ int main (int argc, char ** argv) | |||||||
|   std::cout<<GridLogMessage << "Grid is setup to use "<<threads<<" threads"<<std::endl; |   std::cout<<GridLogMessage << "Grid is setup to use "<<threads<<" threads"<<std::endl; | ||||||
|  |  | ||||||
|   std::vector<int> latt4 = GridDefaultLatt(); |   std::vector<int> latt4 = GridDefaultLatt(); | ||||||
|   const int Ls=16; |   int Ls=16; | ||||||
|  |   for(int i=0;i<argc;i++) | ||||||
|  |     if(std::string(argv[i]) == "-Ls"){ | ||||||
|  |       std::stringstream ss(argv[i+1]); ss >> Ls; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |  | ||||||
|   GridCartesian         * UGrid   = SpaceTimeGrid::makeFourDimGrid(GridDefaultLatt(), GridDefaultSimd(Nd,vComplex::Nsimd()),GridDefaultMpi()); |   GridCartesian         * UGrid   = SpaceTimeGrid::makeFourDimGrid(GridDefaultLatt(), GridDefaultSimd(Nd,vComplex::Nsimd()),GridDefaultMpi()); | ||||||
|   GridRedBlackCartesian * UrbGrid = SpaceTimeGrid::makeFourDimRedBlackGrid(UGrid); |   GridRedBlackCartesian * UrbGrid = SpaceTimeGrid::makeFourDimRedBlackGrid(UGrid); | ||||||
|   GridCartesian         * FGrid   = SpaceTimeGrid::makeFiveDimGrid(Ls,UGrid); |   GridCartesian         * FGrid   = SpaceTimeGrid::makeFiveDimGrid(Ls,UGrid); | ||||||
| @@ -151,9 +151,7 @@ int main (int argc, char ** argv) | |||||||
|   RealD M5  =1.8; |   RealD M5  =1.8; | ||||||
|  |  | ||||||
|   RealD NP = UGrid->_Nprocessors; |   RealD NP = UGrid->_Nprocessors; | ||||||
|  |   RealD NN = UGrid->NodeCount(); | ||||||
|   std::cout << GridLogMessage << "Creating action operator " << std::endl; |  | ||||||
|   DomainWallFermionR Dw(Umu,*FGrid,*FrbGrid,*UGrid,*UrbGrid,mass,M5); |  | ||||||
|  |  | ||||||
|   std::cout << GridLogMessage<< "*****************************************************************" <<std::endl; |   std::cout << GridLogMessage<< "*****************************************************************" <<std::endl; | ||||||
|   std::cout << GridLogMessage<< "* Kernel options --dslash-generic, --dslash-unroll, --dslash-asm" <<std::endl; |   std::cout << GridLogMessage<< "* Kernel options --dslash-generic, --dslash-unroll, --dslash-asm" <<std::endl; | ||||||
| @@ -163,16 +161,22 @@ int main (int argc, char ** argv) | |||||||
|   std::cout << GridLogMessage<< "* Vectorising space-time by "<<vComplex::Nsimd()<<std::endl; |   std::cout << GridLogMessage<< "* Vectorising space-time by "<<vComplex::Nsimd()<<std::endl; | ||||||
|   if ( sizeof(Real)==4 )   std::cout << GridLogMessage<< "* SINGLE precision "<<std::endl; |   if ( sizeof(Real)==4 )   std::cout << GridLogMessage<< "* SINGLE precision "<<std::endl; | ||||||
|   if ( sizeof(Real)==8 )   std::cout << GridLogMessage<< "* DOUBLE precision "<<std::endl; |   if ( sizeof(Real)==8 )   std::cout << GridLogMessage<< "* DOUBLE precision "<<std::endl; | ||||||
|  | #ifdef GRID_OMP | ||||||
|  |   if ( WilsonKernelsStatic::Comms == WilsonKernelsStatic::CommsAndCompute ) std::cout << GridLogMessage<< "* Using Overlapped Comms/Compute" <<std::endl; | ||||||
|  |   if ( WilsonKernelsStatic::Comms == WilsonKernelsStatic::CommsThenCompute) std::cout << GridLogMessage<< "* Using sequential comms compute" <<std::endl; | ||||||
|  | #endif | ||||||
|   if ( WilsonKernelsStatic::Opt == WilsonKernelsStatic::OptGeneric   ) std::cout << GridLogMessage<< "* Using GENERIC Nc WilsonKernels" <<std::endl; |   if ( WilsonKernelsStatic::Opt == WilsonKernelsStatic::OptGeneric   ) std::cout << GridLogMessage<< "* Using GENERIC Nc WilsonKernels" <<std::endl; | ||||||
|   if ( WilsonKernelsStatic::Opt == WilsonKernelsStatic::OptHandUnroll) std::cout << GridLogMessage<< "* Using Nc=3       WilsonKernels" <<std::endl; |   if ( WilsonKernelsStatic::Opt == WilsonKernelsStatic::OptHandUnroll) std::cout << GridLogMessage<< "* Using Nc=3       WilsonKernels" <<std::endl; | ||||||
|   if ( WilsonKernelsStatic::Opt == WilsonKernelsStatic::OptInlineAsm ) std::cout << GridLogMessage<< "* Using Asm Nc=3   WilsonKernels" <<std::endl; |   if ( WilsonKernelsStatic::Opt == WilsonKernelsStatic::OptInlineAsm ) std::cout << GridLogMessage<< "* Using Asm Nc=3   WilsonKernels" <<std::endl; | ||||||
|   std::cout << GridLogMessage<< "*****************************************************************" <<std::endl; |   std::cout << GridLogMessage<< "*****************************************************************" <<std::endl; | ||||||
|  |  | ||||||
|   int ncall =1000; |   DomainWallFermionR Dw(Umu,*FGrid,*FrbGrid,*UGrid,*UrbGrid,mass,M5); | ||||||
|  |   int ncall =500; | ||||||
|   if (1) { |   if (1) { | ||||||
|     FGrid->Barrier(); |     FGrid->Barrier(); | ||||||
|     Dw.ZeroCounters(); |     Dw.ZeroCounters(); | ||||||
|     Dw.Dhop(src,result,0); |     Dw.Dhop(src,result,0); | ||||||
|  |     std::cout<<GridLogMessage<<"Called warmup"<<std::endl; | ||||||
|     double t0=usecond(); |     double t0=usecond(); | ||||||
|     for(int i=0;i<ncall;i++){ |     for(int i=0;i<ncall;i++){ | ||||||
|       __SSC_START; |       __SSC_START; | ||||||
| @@ -190,6 +194,7 @@ int main (int argc, char ** argv) | |||||||
|     //    std::cout<<GridLogMessage << "norm ref    "<< norm2(ref)<<std::endl; |     //    std::cout<<GridLogMessage << "norm ref    "<< norm2(ref)<<std::endl; | ||||||
|     std::cout<<GridLogMessage << "mflop/s =   "<< flops/(t1-t0)<<std::endl; |     std::cout<<GridLogMessage << "mflop/s =   "<< flops/(t1-t0)<<std::endl; | ||||||
|     std::cout<<GridLogMessage << "mflop/s per rank =  "<< flops/(t1-t0)/NP<<std::endl; |     std::cout<<GridLogMessage << "mflop/s per rank =  "<< flops/(t1-t0)/NP<<std::endl; | ||||||
|  |     std::cout<<GridLogMessage << "mflop/s per node =  "<< flops/(t1-t0)/NN<<std::endl; | ||||||
|     err = ref-result;  |     err = ref-result;  | ||||||
|     std::cout<<GridLogMessage << "norm diff   "<< norm2(err)<<std::endl; |     std::cout<<GridLogMessage << "norm diff   "<< norm2(err)<<std::endl; | ||||||
|  |  | ||||||
| @@ -206,6 +211,34 @@ int main (int argc, char ** argv) | |||||||
|     Dw.Report(); |     Dw.Report(); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  |   DomainWallFermionRL DwH(Umu,*FGrid,*FrbGrid,*UGrid,*UrbGrid,mass,M5); | ||||||
|  |   if (1) { | ||||||
|  |     FGrid->Barrier(); | ||||||
|  |     DwH.ZeroCounters(); | ||||||
|  |     DwH.Dhop(src,result,0); | ||||||
|  |     double t0=usecond(); | ||||||
|  |     for(int i=0;i<ncall;i++){ | ||||||
|  |       __SSC_START; | ||||||
|  |       DwH.Dhop(src,result,0); | ||||||
|  |       __SSC_STOP; | ||||||
|  |     } | ||||||
|  |     double t1=usecond(); | ||||||
|  |     FGrid->Barrier(); | ||||||
|  |      | ||||||
|  |     double volume=Ls;  for(int mu=0;mu<Nd;mu++) volume=volume*latt4[mu]; | ||||||
|  |     double flops=1344*volume*ncall; | ||||||
|  |  | ||||||
|  |     std::cout<<GridLogMessage << "Called half prec comms Dw "<<ncall<<" times in "<<t1-t0<<" us"<<std::endl; | ||||||
|  |     std::cout<<GridLogMessage << "mflop/s =   "<< flops/(t1-t0)<<std::endl; | ||||||
|  |     std::cout<<GridLogMessage << "mflop/s per rank =  "<< flops/(t1-t0)/NP<<std::endl; | ||||||
|  |     std::cout<<GridLogMessage << "mflop/s per node =  "<< flops/(t1-t0)/NN<<std::endl; | ||||||
|  |     err = ref-result;  | ||||||
|  |     std::cout<<GridLogMessage << "norm diff   "<< norm2(err)<<std::endl; | ||||||
|  |  | ||||||
|  |     assert (norm2(err)< 1.0e-3 ); | ||||||
|  |     DwH.Report(); | ||||||
|  |   } | ||||||
|  |  | ||||||
|   if (1) |   if (1) | ||||||
|   { |   { | ||||||
|  |  | ||||||
| @@ -214,6 +247,10 @@ int main (int argc, char ** argv) | |||||||
|     std::cout << GridLogMessage<< "* Vectorising fifth dimension by "<<vComplex::Nsimd()<<std::endl; |     std::cout << GridLogMessage<< "* Vectorising fifth dimension by "<<vComplex::Nsimd()<<std::endl; | ||||||
|     if ( sizeof(Real)==4 )   std::cout << GridLogMessage<< "* SINGLE precision "<<std::endl; |     if ( sizeof(Real)==4 )   std::cout << GridLogMessage<< "* SINGLE precision "<<std::endl; | ||||||
|     if ( sizeof(Real)==8 )   std::cout << GridLogMessage<< "* DOUBLE precision "<<std::endl; |     if ( sizeof(Real)==8 )   std::cout << GridLogMessage<< "* DOUBLE precision "<<std::endl; | ||||||
|  | #ifdef GRID_OMP | ||||||
|  |   if ( WilsonKernelsStatic::Comms == WilsonKernelsStatic::CommsAndCompute ) std::cout << GridLogMessage<< "* Using Overlapped Comms/Compute" <<std::endl; | ||||||
|  |   if ( WilsonKernelsStatic::Comms == WilsonKernelsStatic::CommsThenCompute) std::cout << GridLogMessage<< "* Using sequential comms compute" <<std::endl; | ||||||
|  | #endif | ||||||
|     if ( WilsonKernelsStatic::Opt == WilsonKernelsStatic::OptGeneric   ) std::cout << GridLogMessage<< "* Using GENERIC Nc WilsonKernels" <<std::endl; |     if ( WilsonKernelsStatic::Opt == WilsonKernelsStatic::OptGeneric   ) std::cout << GridLogMessage<< "* Using GENERIC Nc WilsonKernels" <<std::endl; | ||||||
|     if ( WilsonKernelsStatic::Opt == WilsonKernelsStatic::OptHandUnroll) std::cout << GridLogMessage<< "* Using Nc=3       WilsonKernels" <<std::endl; |     if ( WilsonKernelsStatic::Opt == WilsonKernelsStatic::OptHandUnroll) std::cout << GridLogMessage<< "* Using Nc=3       WilsonKernels" <<std::endl; | ||||||
|     if ( WilsonKernelsStatic::Opt == WilsonKernelsStatic::OptInlineAsm ) std::cout << GridLogMessage<< "* Using Asm Nc=3   WilsonKernels" <<std::endl; |     if ( WilsonKernelsStatic::Opt == WilsonKernelsStatic::OptInlineAsm ) std::cout << GridLogMessage<< "* Using Asm Nc=3   WilsonKernels" <<std::endl; | ||||||
| @@ -245,6 +282,7 @@ int main (int argc, char ** argv) | |||||||
|     std::cout<<GridLogMessage << "Called Dw s_inner "<<ncall<<" times in "<<t1-t0<<" us"<<std::endl; |     std::cout<<GridLogMessage << "Called Dw s_inner "<<ncall<<" times in "<<t1-t0<<" us"<<std::endl; | ||||||
|     std::cout<<GridLogMessage << "mflop/s =   "<< flops/(t1-t0)<<std::endl; |     std::cout<<GridLogMessage << "mflop/s =   "<< flops/(t1-t0)<<std::endl; | ||||||
|     std::cout<<GridLogMessage << "mflop/s per rank =  "<< flops/(t1-t0)/NP<<std::endl; |     std::cout<<GridLogMessage << "mflop/s per rank =  "<< flops/(t1-t0)/NP<<std::endl; | ||||||
|  |     std::cout<<GridLogMessage << "mflop/s per node =  "<< flops/(t1-t0)/NN<<std::endl; | ||||||
|     //    std::cout<<GridLogMessage<< "res norms "<< norm2(result)<<" " <<norm2(sresult)<<std::endl; |     //    std::cout<<GridLogMessage<< "res norms "<< norm2(result)<<" " <<norm2(sresult)<<std::endl; | ||||||
|     sDw.Report(); |     sDw.Report(); | ||||||
|     RealD sum=0; |     RealD sum=0; | ||||||
| @@ -270,6 +308,7 @@ int main (int argc, char ** argv) | |||||||
|       std::cout<< "sD ERR   \n " << err  <<std::endl; |       std::cout<< "sD ERR   \n " << err  <<std::endl; | ||||||
|     } |     } | ||||||
|     assert(sum < 1.0e-4); |     assert(sum < 1.0e-4); | ||||||
|  |  | ||||||
|      |      | ||||||
|     if(1){ |     if(1){ | ||||||
|       std::cout << GridLogMessage<< "*********************************************************" <<std::endl; |       std::cout << GridLogMessage<< "*********************************************************" <<std::endl; | ||||||
| @@ -277,6 +316,10 @@ int main (int argc, char ** argv) | |||||||
|       std::cout << GridLogMessage<< "* Vectorising fifth dimension by "<<vComplex::Nsimd()<<std::endl; |       std::cout << GridLogMessage<< "* Vectorising fifth dimension by "<<vComplex::Nsimd()<<std::endl; | ||||||
|       if ( sizeof(Real)==4 )   std::cout << GridLogMessage<< "* SINGLE precision "<<std::endl; |       if ( sizeof(Real)==4 )   std::cout << GridLogMessage<< "* SINGLE precision "<<std::endl; | ||||||
|       if ( sizeof(Real)==8 )   std::cout << GridLogMessage<< "* DOUBLE precision "<<std::endl; |       if ( sizeof(Real)==8 )   std::cout << GridLogMessage<< "* DOUBLE precision "<<std::endl; | ||||||
|  | #ifdef GRID_OMP | ||||||
|  |   if ( WilsonKernelsStatic::Comms == WilsonKernelsStatic::CommsAndCompute ) std::cout << GridLogMessage<< "* Using Overlapped Comms/Compute" <<std::endl; | ||||||
|  |   if ( WilsonKernelsStatic::Comms == WilsonKernelsStatic::CommsThenCompute) std::cout << GridLogMessage<< "* Using sequential comms compute" <<std::endl; | ||||||
|  | #endif | ||||||
|       if ( WilsonKernelsStatic::Opt == WilsonKernelsStatic::OptGeneric   )  |       if ( WilsonKernelsStatic::Opt == WilsonKernelsStatic::OptGeneric   )  | ||||||
| 	std::cout << GridLogMessage<< "* Using GENERIC Nc WilsonKernels" <<std::endl; | 	std::cout << GridLogMessage<< "* Using GENERIC Nc WilsonKernels" <<std::endl; | ||||||
|       if ( WilsonKernelsStatic::Opt == WilsonKernelsStatic::OptHandUnroll)  |       if ( WilsonKernelsStatic::Opt == WilsonKernelsStatic::OptHandUnroll)  | ||||||
| @@ -316,6 +359,7 @@ int main (int argc, char ** argv) | |||||||
|  |  | ||||||
|       std::cout<<GridLogMessage << "sDeo mflop/s =   "<< flops/(t1-t0)<<std::endl; |       std::cout<<GridLogMessage << "sDeo mflop/s =   "<< flops/(t1-t0)<<std::endl; | ||||||
|       std::cout<<GridLogMessage << "sDeo mflop/s per rank   "<< flops/(t1-t0)/NP<<std::endl; |       std::cout<<GridLogMessage << "sDeo mflop/s per rank   "<< flops/(t1-t0)/NP<<std::endl; | ||||||
|  |       std::cout<<GridLogMessage << "sDeo mflop/s per node   "<< flops/(t1-t0)/NN<<std::endl; | ||||||
|       sDw.Report(); |       sDw.Report(); | ||||||
|  |  | ||||||
|       sDw.DhopEO(ssrc_o,sr_e,DaggerNo); |       sDw.DhopEO(ssrc_o,sr_e,DaggerNo); | ||||||
| @@ -344,8 +388,23 @@ int main (int argc, char ** argv) | |||||||
|       } |       } | ||||||
|       assert(error<1.0e-4); |       assert(error<1.0e-4); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |   if(0){ | ||||||
|  |     std::cout << "Single cache warm call to sDw.Dhop " <<std::endl; | ||||||
|  |     for(int i=0;i< PerformanceCounter::NumTypes(); i++ ){ | ||||||
|  |       sDw.Dhop(ssrc,sresult,0); | ||||||
|  |       PerformanceCounter Counter(i); | ||||||
|  |       Counter.Start(); | ||||||
|  |       sDw.Dhop(ssrc,sresult,0); | ||||||
|  |       Counter.Stop(); | ||||||
|  |       Counter.Report(); | ||||||
|  |     } | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|   if (1) |   if (1) | ||||||
|   { // Naive wilson dag implementation |   { // Naive wilson dag implementation | ||||||
|     ref = zero; |     ref = zero; | ||||||
| @@ -394,14 +453,15 @@ int main (int argc, char ** argv) | |||||||
|  |  | ||||||
|  |  | ||||||
|   // S-direction is INNERMOST and takes no part in the parity. |   // S-direction is INNERMOST and takes no part in the parity. | ||||||
|   static int Opt;  // these are a temporary hack |  | ||||||
|   static int Comms;  // these are a temporary hack |  | ||||||
|  |  | ||||||
|   std::cout << GridLogMessage<< "*********************************************************" <<std::endl; |   std::cout << GridLogMessage<< "*********************************************************" <<std::endl; | ||||||
|   std::cout << GridLogMessage<< "* Benchmarking DomainWallFermionR::DhopEO                "<<std::endl; |   std::cout << GridLogMessage<< "* Benchmarking DomainWallFermionR::DhopEO                "<<std::endl; | ||||||
|   std::cout << GridLogMessage<< "* Vectorising space-time by "<<vComplex::Nsimd()<<std::endl; |   std::cout << GridLogMessage<< "* Vectorising space-time by "<<vComplex::Nsimd()<<std::endl; | ||||||
|   if ( sizeof(Real)==4 )   std::cout << GridLogMessage<< "* SINGLE precision "<<std::endl; |   if ( sizeof(Real)==4 )   std::cout << GridLogMessage<< "* SINGLE precision "<<std::endl; | ||||||
|   if ( sizeof(Real)==8 )   std::cout << GridLogMessage<< "* DOUBLE precision "<<std::endl; |   if ( sizeof(Real)==8 )   std::cout << GridLogMessage<< "* DOUBLE precision "<<std::endl; | ||||||
|  | #ifdef GRID_OMP | ||||||
|  |   if ( WilsonKernelsStatic::Comms == WilsonKernelsStatic::CommsAndCompute ) std::cout << GridLogMessage<< "* Using Overlapped Comms/Compute" <<std::endl; | ||||||
|  |   if ( WilsonKernelsStatic::Comms == WilsonKernelsStatic::CommsThenCompute) std::cout << GridLogMessage<< "* Using sequential comms compute" <<std::endl; | ||||||
|  | #endif | ||||||
|   if ( WilsonKernelsStatic::Opt == WilsonKernelsStatic::OptGeneric   ) std::cout << GridLogMessage<< "* Using GENERIC Nc WilsonKernels" <<std::endl; |   if ( WilsonKernelsStatic::Opt == WilsonKernelsStatic::OptGeneric   ) std::cout << GridLogMessage<< "* Using GENERIC Nc WilsonKernels" <<std::endl; | ||||||
|   if ( WilsonKernelsStatic::Opt == WilsonKernelsStatic::OptHandUnroll) std::cout << GridLogMessage<< "* Using Nc=3       WilsonKernels" <<std::endl; |   if ( WilsonKernelsStatic::Opt == WilsonKernelsStatic::OptHandUnroll) std::cout << GridLogMessage<< "* Using Nc=3       WilsonKernels" <<std::endl; | ||||||
|   if ( WilsonKernelsStatic::Opt == WilsonKernelsStatic::OptInlineAsm ) std::cout << GridLogMessage<< "* Using Asm Nc=3   WilsonKernels" <<std::endl; |   if ( WilsonKernelsStatic::Opt == WilsonKernelsStatic::OptInlineAsm ) std::cout << GridLogMessage<< "* Using Asm Nc=3   WilsonKernels" <<std::endl; | ||||||
| @@ -422,6 +482,7 @@ int main (int argc, char ** argv) | |||||||
|  |  | ||||||
|     std::cout<<GridLogMessage << "Deo mflop/s =   "<< flops/(t1-t0)<<std::endl; |     std::cout<<GridLogMessage << "Deo mflop/s =   "<< flops/(t1-t0)<<std::endl; | ||||||
|     std::cout<<GridLogMessage << "Deo mflop/s per rank   "<< flops/(t1-t0)/NP<<std::endl; |     std::cout<<GridLogMessage << "Deo mflop/s per rank   "<< flops/(t1-t0)/NP<<std::endl; | ||||||
|  |     std::cout<<GridLogMessage << "Deo mflop/s per node   "<< flops/(t1-t0)/NN<<std::endl; | ||||||
|     Dw.Report(); |     Dw.Report(); | ||||||
|   } |   } | ||||||
|   Dw.DhopEO(src_o,r_e,DaggerNo); |   Dw.DhopEO(src_o,r_e,DaggerNo); | ||||||
| @@ -448,8 +509,9 @@ int main (int argc, char ** argv) | |||||||
|   std::cout<<GridLogMessage << "norm diff even  "<< norm2(src_e)<<std::endl; |   std::cout<<GridLogMessage << "norm diff even  "<< norm2(src_e)<<std::endl; | ||||||
|   std::cout<<GridLogMessage << "norm diff odd   "<< norm2(src_o)<<std::endl; |   std::cout<<GridLogMessage << "norm diff odd   "<< norm2(src_o)<<std::endl; | ||||||
|  |  | ||||||
|   //assert(norm2(src_e)<1.0e-4); |   assert(norm2(src_e)<1.0e-4); | ||||||
|   //assert(norm2(src_o)<1.0e-4); |   assert(norm2(src_o)<1.0e-4); | ||||||
|  |  | ||||||
|   Grid_finalize(); |   Grid_finalize(); | ||||||
|  |   exit(0); | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										190
									
								
								benchmarks/Benchmark_gparity.cc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										190
									
								
								benchmarks/Benchmark_gparity.cc
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,190 @@ | |||||||
|  | #include <Grid/Grid.h> | ||||||
|  | #include <sstream> | ||||||
|  | using namespace std; | ||||||
|  | using namespace Grid; | ||||||
|  | using namespace Grid::QCD; | ||||||
|  |  | ||||||
|  | template<class d> | ||||||
|  | struct scal { | ||||||
|  |   d internal; | ||||||
|  | }; | ||||||
|  |  | ||||||
|  |   Gamma::Algebra Gmu [] = { | ||||||
|  |     Gamma::Algebra::GammaX, | ||||||
|  |     Gamma::Algebra::GammaY, | ||||||
|  |     Gamma::Algebra::GammaZ, | ||||||
|  |     Gamma::Algebra::GammaT | ||||||
|  |   }; | ||||||
|  |  | ||||||
|  | typedef typename GparityDomainWallFermionF::FermionField GparityLatticeFermionF; | ||||||
|  | typedef typename GparityDomainWallFermionD::FermionField GparityLatticeFermionD; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | int main (int argc, char ** argv) | ||||||
|  | { | ||||||
|  |   Grid_init(&argc,&argv); | ||||||
|  |  | ||||||
|  |   int Ls=16; | ||||||
|  |   for(int i=0;i<argc;i++) | ||||||
|  |     if(std::string(argv[i]) == "-Ls"){ | ||||||
|  |       std::stringstream ss(argv[i+1]); ss >> Ls; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |   int threads = GridThread::GetThreads(); | ||||||
|  |   std::cout<<GridLogMessage << "Grid is setup to use "<<threads<<" threads"<<std::endl; | ||||||
|  |   std::cout<<GridLogMessage << "Ls = " << Ls << std::endl; | ||||||
|  |  | ||||||
|  |   std::vector<int> latt4 = GridDefaultLatt(); | ||||||
|  |  | ||||||
|  |   GridCartesian         * UGrid   = SpaceTimeGrid::makeFourDimGrid(GridDefaultLatt(), GridDefaultSimd(Nd,vComplexF::Nsimd()),GridDefaultMpi()); | ||||||
|  |   GridRedBlackCartesian * UrbGrid = SpaceTimeGrid::makeFourDimRedBlackGrid(UGrid); | ||||||
|  |   GridCartesian         * FGrid   = SpaceTimeGrid::makeFiveDimGrid(Ls,UGrid); | ||||||
|  |   GridRedBlackCartesian * FrbGrid = SpaceTimeGrid::makeFiveDimRedBlackGrid(Ls,UGrid); | ||||||
|  |  | ||||||
|  |   std::vector<int> seeds4({1,2,3,4}); | ||||||
|  |   std::vector<int> seeds5({5,6,7,8}); | ||||||
|  |    | ||||||
|  |   std::cout << GridLogMessage << "Initialising 4d RNG" << std::endl; | ||||||
|  |   GridParallelRNG          RNG4(UGrid);  RNG4.SeedFixedIntegers(seeds4); | ||||||
|  |   std::cout << GridLogMessage << "Initialising 5d RNG" << std::endl; | ||||||
|  |   GridParallelRNG          RNG5(FGrid);  RNG5.SeedFixedIntegers(seeds5); | ||||||
|  |   std::cout << GridLogMessage << "Initialised RNGs" << std::endl; | ||||||
|  |  | ||||||
|  |   GparityLatticeFermionF src   (FGrid); random(RNG5,src); | ||||||
|  |   RealD N2 = 1.0/::sqrt(norm2(src)); | ||||||
|  |   src = src*N2; | ||||||
|  |  | ||||||
|  |   GparityLatticeFermionF result(FGrid); result=zero; | ||||||
|  |   GparityLatticeFermionF    ref(FGrid);    ref=zero; | ||||||
|  |   GparityLatticeFermionF    tmp(FGrid); | ||||||
|  |   GparityLatticeFermionF    err(FGrid); | ||||||
|  |  | ||||||
|  |   std::cout << GridLogMessage << "Drawing gauge field" << std::endl; | ||||||
|  |   LatticeGaugeFieldF Umu(UGrid);  | ||||||
|  |   SU3::HotConfiguration(RNG4,Umu);  | ||||||
|  |   std::cout << GridLogMessage << "Random gauge initialised " << std::endl; | ||||||
|  |  | ||||||
|  |   RealD mass=0.1; | ||||||
|  |   RealD M5  =1.8; | ||||||
|  |  | ||||||
|  |   RealD NP = UGrid->_Nprocessors; | ||||||
|  |   RealD NN = UGrid->NodeCount(); | ||||||
|  |  | ||||||
|  |   std::cout << GridLogMessage<< "*****************************************************************" <<std::endl; | ||||||
|  |   std::cout << GridLogMessage<< "* Kernel options --dslash-generic, --dslash-unroll, --dslash-asm" <<std::endl; | ||||||
|  |   std::cout << GridLogMessage<< "*****************************************************************" <<std::endl; | ||||||
|  |   std::cout << GridLogMessage<< "*****************************************************************" <<std::endl; | ||||||
|  |   std::cout << GridLogMessage<< "* Benchmarking DomainWallFermion::Dhop                  "<<std::endl; | ||||||
|  |   std::cout << GridLogMessage<< "* Vectorising space-time by "<<vComplexF::Nsimd()<<std::endl; | ||||||
|  | #ifdef GRID_OMP | ||||||
|  |   if ( WilsonKernelsStatic::Comms == WilsonKernelsStatic::CommsAndCompute ) std::cout << GridLogMessage<< "* Using Overlapped Comms/Compute" <<std::endl; | ||||||
|  |   if ( WilsonKernelsStatic::Comms == WilsonKernelsStatic::CommsThenCompute) std::cout << GridLogMessage<< "* Using sequential comms compute" <<std::endl; | ||||||
|  | #endif | ||||||
|  |   if ( WilsonKernelsStatic::Opt == WilsonKernelsStatic::OptGeneric   ) std::cout << GridLogMessage<< "* Using GENERIC Nc WilsonKernels" <<std::endl; | ||||||
|  |   if ( WilsonKernelsStatic::Opt == WilsonKernelsStatic::OptHandUnroll) std::cout << GridLogMessage<< "* Using Nc=3       WilsonKernels" <<std::endl; | ||||||
|  |   if ( WilsonKernelsStatic::Opt == WilsonKernelsStatic::OptInlineAsm ) std::cout << GridLogMessage<< "* Using Asm Nc=3   WilsonKernels" <<std::endl; | ||||||
|  |   std::cout << GridLogMessage<< "*****************************************************************" <<std::endl; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |   std::cout << GridLogMessage<< "* SINGLE/SINGLE"<<std::endl; | ||||||
|  |   GparityDomainWallFermionF Dw(Umu,*FGrid,*FrbGrid,*UGrid,*UrbGrid,mass,M5); | ||||||
|  |   int ncall =1000; | ||||||
|  |   if (1) { | ||||||
|  |     FGrid->Barrier(); | ||||||
|  |     Dw.ZeroCounters(); | ||||||
|  |     Dw.Dhop(src,result,0); | ||||||
|  |     std::cout<<GridLogMessage<<"Called warmup"<<std::endl; | ||||||
|  |     double t0=usecond(); | ||||||
|  |     for(int i=0;i<ncall;i++){ | ||||||
|  |       __SSC_START; | ||||||
|  |       Dw.Dhop(src,result,0); | ||||||
|  |       __SSC_STOP; | ||||||
|  |     } | ||||||
|  |     double t1=usecond(); | ||||||
|  |     FGrid->Barrier(); | ||||||
|  |      | ||||||
|  |     double volume=Ls;  for(int mu=0;mu<Nd;mu++) volume=volume*latt4[mu]; | ||||||
|  |     double flops=2*1344*volume*ncall; | ||||||
|  |  | ||||||
|  |     std::cout<<GridLogMessage << "Called Dw "<<ncall<<" times in "<<t1-t0<<" us"<<std::endl; | ||||||
|  |     //    std::cout<<GridLogMessage << "norm result "<< norm2(result)<<std::endl; | ||||||
|  |     //    std::cout<<GridLogMessage << "norm ref    "<< norm2(ref)<<std::endl; | ||||||
|  |     std::cout<<GridLogMessage << "mflop/s =   "<< flops/(t1-t0)<<std::endl; | ||||||
|  |     std::cout<<GridLogMessage << "mflop/s per rank =  "<< flops/(t1-t0)/NP<<std::endl; | ||||||
|  |     std::cout<<GridLogMessage << "mflop/s per node =  "<< flops/(t1-t0)/NN<<std::endl; | ||||||
|  |     Dw.Report(); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   std::cout << GridLogMessage<< "* SINGLE/HALF"<<std::endl; | ||||||
|  |   GparityDomainWallFermionFH DwH(Umu,*FGrid,*FrbGrid,*UGrid,*UrbGrid,mass,M5); | ||||||
|  |   if (1) { | ||||||
|  |     FGrid->Barrier(); | ||||||
|  |     DwH.ZeroCounters(); | ||||||
|  |     DwH.Dhop(src,result,0); | ||||||
|  |     double t0=usecond(); | ||||||
|  |     for(int i=0;i<ncall;i++){ | ||||||
|  |       __SSC_START; | ||||||
|  |       DwH.Dhop(src,result,0); | ||||||
|  |       __SSC_STOP; | ||||||
|  |     } | ||||||
|  |     double t1=usecond(); | ||||||
|  |     FGrid->Barrier(); | ||||||
|  |      | ||||||
|  |     double volume=Ls;  for(int mu=0;mu<Nd;mu++) volume=volume*latt4[mu]; | ||||||
|  |     double flops=2*1344*volume*ncall; | ||||||
|  |  | ||||||
|  |     std::cout<<GridLogMessage << "Called half prec comms Dw "<<ncall<<" times in "<<t1-t0<<" us"<<std::endl; | ||||||
|  |     std::cout<<GridLogMessage << "mflop/s =   "<< flops/(t1-t0)<<std::endl; | ||||||
|  |     std::cout<<GridLogMessage << "mflop/s per rank =  "<< flops/(t1-t0)/NP<<std::endl; | ||||||
|  |     std::cout<<GridLogMessage << "mflop/s per node =  "<< flops/(t1-t0)/NN<<std::endl; | ||||||
|  |     DwH.Report(); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   GridCartesian         * UGrid_d   = SpaceTimeGrid::makeFourDimGrid(GridDefaultLatt(), GridDefaultSimd(Nd,vComplexD::Nsimd()),GridDefaultMpi()); | ||||||
|  |   GridRedBlackCartesian * UrbGrid_d = SpaceTimeGrid::makeFourDimRedBlackGrid(UGrid_d); | ||||||
|  |   GridCartesian         * FGrid_d   = SpaceTimeGrid::makeFiveDimGrid(Ls,UGrid_d); | ||||||
|  |   GridRedBlackCartesian * FrbGrid_d = SpaceTimeGrid::makeFiveDimRedBlackGrid(Ls,UGrid_d); | ||||||
|  |  | ||||||
|  |    | ||||||
|  |   std::cout << GridLogMessage<< "* DOUBLE/DOUBLE"<<std::endl; | ||||||
|  |   GparityLatticeFermionD src_d(FGrid_d); | ||||||
|  |   precisionChange(src_d,src); | ||||||
|  |  | ||||||
|  |   LatticeGaugeFieldD Umu_d(UGrid_d);  | ||||||
|  |   precisionChange(Umu_d,Umu); | ||||||
|  |  | ||||||
|  |   GparityLatticeFermionD result_d(FGrid_d); | ||||||
|  |  | ||||||
|  |   GparityDomainWallFermionD DwD(Umu_d,*FGrid_d,*FrbGrid_d,*UGrid_d,*UrbGrid_d,mass,M5); | ||||||
|  |   if (1) { | ||||||
|  |     FGrid_d->Barrier(); | ||||||
|  |     DwD.ZeroCounters(); | ||||||
|  |     DwD.Dhop(src_d,result_d,0); | ||||||
|  |     std::cout<<GridLogMessage<<"Called warmup"<<std::endl; | ||||||
|  |     double t0=usecond(); | ||||||
|  |     for(int i=0;i<ncall;i++){ | ||||||
|  |       __SSC_START; | ||||||
|  |       DwD.Dhop(src_d,result_d,0); | ||||||
|  |       __SSC_STOP; | ||||||
|  |     } | ||||||
|  |     double t1=usecond(); | ||||||
|  |     FGrid_d->Barrier(); | ||||||
|  |      | ||||||
|  |     double volume=Ls;  for(int mu=0;mu<Nd;mu++) volume=volume*latt4[mu]; | ||||||
|  |     double flops=2*1344*volume*ncall; | ||||||
|  |  | ||||||
|  |     std::cout<<GridLogMessage << "Called Dw "<<ncall<<" times in "<<t1-t0<<" us"<<std::endl; | ||||||
|  |     //    std::cout<<GridLogMessage << "norm result "<< norm2(result)<<std::endl; | ||||||
|  |     //    std::cout<<GridLogMessage << "norm ref    "<< norm2(ref)<<std::endl; | ||||||
|  |     std::cout<<GridLogMessage << "mflop/s =   "<< flops/(t1-t0)<<std::endl; | ||||||
|  |     std::cout<<GridLogMessage << "mflop/s per rank =  "<< flops/(t1-t0)/NP<<std::endl; | ||||||
|  |     std::cout<<GridLogMessage << "mflop/s per node =  "<< flops/(t1-t0)/NN<<std::endl; | ||||||
|  |     DwD.Report(); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   Grid_finalize(); | ||||||
|  | } | ||||||
|  |  | ||||||
| @@ -55,21 +55,21 @@ int main (int argc, char ** argv) | |||||||
|   std::cout<<GridLogMessage << "===================================================================================================="<<std::endl; |   std::cout<<GridLogMessage << "===================================================================================================="<<std::endl; | ||||||
|   std::cout<<GridLogMessage << "  L  "<<"\t\t"<<"bytes"<<"\t\t\t"<<"GB/s"<<"\t\t"<<"Gflop/s"<<"\t\t seconds"<<std::endl; |   std::cout<<GridLogMessage << "  L  "<<"\t\t"<<"bytes"<<"\t\t\t"<<"GB/s"<<"\t\t"<<"Gflop/s"<<"\t\t seconds"<<std::endl; | ||||||
|   std::cout<<GridLogMessage << "----------------------------------------------------------"<<std::endl; |   std::cout<<GridLogMessage << "----------------------------------------------------------"<<std::endl; | ||||||
|   uint64_t lmax=44; |   uint64_t lmax=96; | ||||||
| #define NLOOP (1*lmax*lmax*lmax*lmax/vol) | #define NLOOP (10*lmax*lmax*lmax*lmax/vol) | ||||||
|   for(int lat=4;lat<=lmax;lat+=4){ |   for(int lat=8;lat<=lmax;lat+=8){ | ||||||
|  |  | ||||||
|       std::vector<int> latt_size  ({lat*mpi_layout[0],lat*mpi_layout[1],lat*mpi_layout[2],lat*mpi_layout[3]}); |       std::vector<int> latt_size  ({lat*mpi_layout[0],lat*mpi_layout[1],lat*mpi_layout[2],lat*mpi_layout[3]}); | ||||||
|       int vol = latt_size[0]*latt_size[1]*latt_size[2]*latt_size[3]; |       int64_t vol= latt_size[0]*latt_size[1]*latt_size[2]*latt_size[3]; | ||||||
|       GridCartesian     Grid(latt_size,simd_layout,mpi_layout); |       GridCartesian     Grid(latt_size,simd_layout,mpi_layout); | ||||||
|  |  | ||||||
|       uint64_t Nloop=NLOOP; |       uint64_t Nloop=NLOOP; | ||||||
|  |  | ||||||
|       //      GridParallelRNG          pRNG(&Grid);      pRNG.SeedFixedIntegers(std::vector<int>({45,12,81,9}); |       //      GridParallelRNG          pRNG(&Grid);      pRNG.SeedFixedIntegers(std::vector<int>({45,12,81,9})); | ||||||
|  |  | ||||||
|       LatticeVec z(&Grid); //random(pRNG,z); |       LatticeVec z(&Grid);// random(pRNG,z); | ||||||
|       LatticeVec x(&Grid); //random(pRNG,x); |       LatticeVec x(&Grid);// random(pRNG,x); | ||||||
|       LatticeVec y(&Grid); //random(pRNG,y); |       LatticeVec y(&Grid);// random(pRNG,y); | ||||||
|       double a=2.0; |       double a=2.0; | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -83,7 +83,7 @@ int main (int argc, char ** argv) | |||||||
|       double time = (stop-start)/Nloop*1000; |       double time = (stop-start)/Nloop*1000; | ||||||
|        |        | ||||||
|       double flops=vol*Nvec*2;// mul,add |       double flops=vol*Nvec*2;// mul,add | ||||||
|       double bytes=3*vol*Nvec*sizeof(Real); |       double bytes=3.0*vol*Nvec*sizeof(Real); | ||||||
|       std::cout<<GridLogMessage<<std::setprecision(3) << lat<<"\t\t"<<bytes<<"   \t\t"<<bytes/time<<"\t\t"<<flops/time<<"\t\t"<<(stop-start)/1000./1000.<<std::endl; |       std::cout<<GridLogMessage<<std::setprecision(3) << lat<<"\t\t"<<bytes<<"   \t\t"<<bytes/time<<"\t\t"<<flops/time<<"\t\t"<<(stop-start)/1000./1000.<<std::endl; | ||||||
|  |  | ||||||
|     } |     } | ||||||
| @@ -94,17 +94,17 @@ int main (int argc, char ** argv) | |||||||
|   std::cout<<GridLogMessage << "  L  "<<"\t\t"<<"bytes"<<"\t\t\t"<<"GB/s"<<"\t\t"<<"Gflop/s"<<"\t\t seconds"<<std::endl; |   std::cout<<GridLogMessage << "  L  "<<"\t\t"<<"bytes"<<"\t\t\t"<<"GB/s"<<"\t\t"<<"Gflop/s"<<"\t\t seconds"<<std::endl; | ||||||
|   std::cout<<GridLogMessage << "----------------------------------------------------------"<<std::endl; |   std::cout<<GridLogMessage << "----------------------------------------------------------"<<std::endl; | ||||||
|    |    | ||||||
|   for(int lat=4;lat<=lmax;lat+=4){ |   for(int lat=8;lat<=lmax;lat+=8){ | ||||||
|  |  | ||||||
|       std::vector<int> latt_size  ({lat*mpi_layout[0],lat*mpi_layout[1],lat*mpi_layout[2],lat*mpi_layout[3]}); |       std::vector<int> latt_size  ({lat*mpi_layout[0],lat*mpi_layout[1],lat*mpi_layout[2],lat*mpi_layout[3]}); | ||||||
|       int vol = latt_size[0]*latt_size[1]*latt_size[2]*latt_size[3]; |       int64_t vol= latt_size[0]*latt_size[1]*latt_size[2]*latt_size[3]; | ||||||
|       GridCartesian     Grid(latt_size,simd_layout,mpi_layout); |       GridCartesian     Grid(latt_size,simd_layout,mpi_layout); | ||||||
|  |  | ||||||
|       //      GridParallelRNG          pRNG(&Grid);      pRNG.SeedFixedIntegers(std::vector<int>({45,12,81,9}); |       //      GridParallelRNG          pRNG(&Grid);      pRNG.SeedFixedIntegers(std::vector<int>({45,12,81,9})); | ||||||
|  |  | ||||||
|       LatticeVec z(&Grid); //random(pRNG,z); |       LatticeVec z(&Grid);// random(pRNG,z); | ||||||
|       LatticeVec x(&Grid); //random(pRNG,x); |       LatticeVec x(&Grid);// random(pRNG,x); | ||||||
|       LatticeVec y(&Grid); //random(pRNG,y); |       LatticeVec y(&Grid);// random(pRNG,y); | ||||||
|       double a=2.0; |       double a=2.0; | ||||||
|  |  | ||||||
|       uint64_t Nloop=NLOOP; |       uint64_t Nloop=NLOOP; | ||||||
| @@ -119,7 +119,7 @@ int main (int argc, char ** argv) | |||||||
|       double time = (stop-start)/Nloop*1000; |       double time = (stop-start)/Nloop*1000; | ||||||
|       |       | ||||||
|       double flops=vol*Nvec*2;// mul,add |       double flops=vol*Nvec*2;// mul,add | ||||||
|       double bytes=3*vol*Nvec*sizeof(Real); |       double bytes=3.0*vol*Nvec*sizeof(Real); | ||||||
|       std::cout<<GridLogMessage<<std::setprecision(3) << lat<<"\t\t"<<bytes<<"   \t\t"<<bytes/time<<"\t\t"<<flops/time<<"\t\t"<<(stop-start)/1000./1000.<<std::endl; |       std::cout<<GridLogMessage<<std::setprecision(3) << lat<<"\t\t"<<bytes<<"   \t\t"<<bytes/time<<"\t\t"<<flops/time<<"\t\t"<<(stop-start)/1000./1000.<<std::endl; | ||||||
|  |  | ||||||
|     } |     } | ||||||
| @@ -129,20 +129,20 @@ int main (int argc, char ** argv) | |||||||
|   std::cout<<GridLogMessage << "===================================================================================================="<<std::endl; |   std::cout<<GridLogMessage << "===================================================================================================="<<std::endl; | ||||||
|   std::cout<<GridLogMessage << "  L  "<<"\t\t"<<"bytes"<<"\t\t\t"<<"GB/s"<<"\t\t"<<"Gflop/s"<<"\t\t seconds"<<std::endl; |   std::cout<<GridLogMessage << "  L  "<<"\t\t"<<"bytes"<<"\t\t\t"<<"GB/s"<<"\t\t"<<"Gflop/s"<<"\t\t seconds"<<std::endl; | ||||||
|  |  | ||||||
|   for(int lat=4;lat<=lmax;lat+=4){ |   for(int lat=8;lat<=lmax;lat+=8){ | ||||||
|  |  | ||||||
|  |  | ||||||
|       std::vector<int> latt_size  ({lat*mpi_layout[0],lat*mpi_layout[1],lat*mpi_layout[2],lat*mpi_layout[3]}); |       std::vector<int> latt_size  ({lat*mpi_layout[0],lat*mpi_layout[1],lat*mpi_layout[2],lat*mpi_layout[3]}); | ||||||
|       int vol = latt_size[0]*latt_size[1]*latt_size[2]*latt_size[3]; |       int64_t vol= latt_size[0]*latt_size[1]*latt_size[2]*latt_size[3]; | ||||||
|       uint64_t Nloop=NLOOP; |       uint64_t Nloop=NLOOP; | ||||||
|  |  | ||||||
|       GridCartesian     Grid(latt_size,simd_layout,mpi_layout); |       GridCartesian     Grid(latt_size,simd_layout,mpi_layout); | ||||||
|  |  | ||||||
|       //      GridParallelRNG          pRNG(&Grid);      pRNG.SeedFixedIntegers(std::vector<int>({45,12,81,9}); |       //      GridParallelRNG          pRNG(&Grid);      pRNG.SeedFixedIntegers(std::vector<int>({45,12,81,9})); | ||||||
|  |  | ||||||
|       LatticeVec z(&Grid); //random(pRNG,z); |       LatticeVec z(&Grid);// random(pRNG,z); | ||||||
|       LatticeVec x(&Grid); //random(pRNG,x); |       LatticeVec x(&Grid);// random(pRNG,x); | ||||||
|       LatticeVec y(&Grid); //random(pRNG,y); |       LatticeVec y(&Grid);// random(pRNG,y); | ||||||
|       RealD a=2.0; |       RealD a=2.0; | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -154,7 +154,7 @@ int main (int argc, char ** argv) | |||||||
|       double stop=usecond(); |       double stop=usecond(); | ||||||
|       double time = (stop-start)/Nloop*1000; |       double time = (stop-start)/Nloop*1000; | ||||||
|        |        | ||||||
|       double bytes=2*vol*Nvec*sizeof(Real); |       double bytes=2.0*vol*Nvec*sizeof(Real); | ||||||
|       double flops=vol*Nvec*1;// mul |       double flops=vol*Nvec*1;// mul | ||||||
|       std::cout<<GridLogMessage <<std::setprecision(3) << lat<<"\t\t"<<bytes<<"   \t\t"<<bytes/time<<"\t\t"<<flops/time<<"\t\t"<<(stop-start)/1000./1000.<<std::endl; |       std::cout<<GridLogMessage <<std::setprecision(3) << lat<<"\t\t"<<bytes<<"   \t\t"<<bytes/time<<"\t\t"<<flops/time<<"\t\t"<<(stop-start)/1000./1000.<<std::endl; | ||||||
|  |  | ||||||
| @@ -166,17 +166,17 @@ int main (int argc, char ** argv) | |||||||
|   std::cout<<GridLogMessage << "  L  "<<"\t\t"<<"bytes"<<"\t\t\t"<<"GB/s"<<"\t\t"<<"Gflop/s"<<"\t\t seconds"<<std::endl; |   std::cout<<GridLogMessage << "  L  "<<"\t\t"<<"bytes"<<"\t\t\t"<<"GB/s"<<"\t\t"<<"Gflop/s"<<"\t\t seconds"<<std::endl; | ||||||
|   std::cout<<GridLogMessage << "----------------------------------------------------------"<<std::endl; |   std::cout<<GridLogMessage << "----------------------------------------------------------"<<std::endl; | ||||||
|  |  | ||||||
|   for(int lat=4;lat<=lmax;lat+=4){ |   for(int lat=8;lat<=lmax;lat+=8){ | ||||||
|  |  | ||||||
|       std::vector<int> latt_size  ({lat*mpi_layout[0],lat*mpi_layout[1],lat*mpi_layout[2],lat*mpi_layout[3]}); |       std::vector<int> latt_size  ({lat*mpi_layout[0],lat*mpi_layout[1],lat*mpi_layout[2],lat*mpi_layout[3]}); | ||||||
|       int vol = latt_size[0]*latt_size[1]*latt_size[2]*latt_size[3]; |       int64_t vol= latt_size[0]*latt_size[1]*latt_size[2]*latt_size[3]; | ||||||
|       uint64_t Nloop=NLOOP; |       uint64_t Nloop=NLOOP; | ||||||
|       GridCartesian     Grid(latt_size,simd_layout,mpi_layout); |       GridCartesian     Grid(latt_size,simd_layout,mpi_layout); | ||||||
|  |  | ||||||
|       //      GridParallelRNG          pRNG(&Grid);      pRNG.SeedFixedIntegers(std::vector<int>({45,12,81,9}); |       //      GridParallelRNG          pRNG(&Grid);      pRNG.SeedFixedIntegers(std::vector<int>({45,12,81,9})); | ||||||
|       LatticeVec z(&Grid); //random(pRNG,z); |       LatticeVec z(&Grid);// random(pRNG,z); | ||||||
|       LatticeVec x(&Grid); //random(pRNG,x); |       LatticeVec x(&Grid);// random(pRNG,x); | ||||||
|       LatticeVec y(&Grid); //random(pRNG,y); |       LatticeVec y(&Grid);// random(pRNG,y); | ||||||
|       RealD a=2.0; |       RealD a=2.0; | ||||||
|       Real nn;       |       Real nn;       | ||||||
|       double start=usecond(); |       double start=usecond(); | ||||||
| @@ -187,7 +187,7 @@ int main (int argc, char ** argv) | |||||||
|       double stop=usecond(); |       double stop=usecond(); | ||||||
|       double time = (stop-start)/Nloop*1000; |       double time = (stop-start)/Nloop*1000; | ||||||
|        |        | ||||||
|       double bytes=vol*Nvec*sizeof(Real); |       double bytes=1.0*vol*Nvec*sizeof(Real); | ||||||
|       double flops=vol*Nvec*2;// mul,add |       double flops=vol*Nvec*2;// mul,add | ||||||
|       std::cout<<GridLogMessage<<std::setprecision(3) << lat<<"\t\t"<<bytes<<"  \t\t"<<bytes/time<<"\t\t"<<flops/time<< "\t\t"<<(stop-start)/1000./1000.<< "\t\t " <<std::endl; |       std::cout<<GridLogMessage<<std::setprecision(3) << lat<<"\t\t"<<bytes<<"  \t\t"<<bytes/time<<"\t\t"<<flops/time<< "\t\t"<<(stop-start)/1000./1000.<< "\t\t " <<std::endl; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -40,7 +40,7 @@ int main (int argc, char ** argv) | |||||||
|   std::vector<int> simd_layout = GridDefaultSimd(Nd,vComplex::Nsimd()); |   std::vector<int> simd_layout = GridDefaultSimd(Nd,vComplex::Nsimd()); | ||||||
|   std::vector<int> mpi_layout  = GridDefaultMpi(); |   std::vector<int> mpi_layout  = GridDefaultMpi(); | ||||||
|   GridCartesian               Grid(latt_size,simd_layout,mpi_layout); |   GridCartesian               Grid(latt_size,simd_layout,mpi_layout); | ||||||
|   GridRedBlackCartesian     RBGrid(latt_size,simd_layout,mpi_layout); |   GridRedBlackCartesian     RBGrid(&Grid); | ||||||
|  |  | ||||||
|   int threads = GridThread::GetThreads(); |   int threads = GridThread::GetThreads(); | ||||||
|   std::cout<<GridLogMessage << "Grid is setup to use "<<threads<<" threads"<<std::endl; |   std::cout<<GridLogMessage << "Grid is setup to use "<<threads<<" threads"<<std::endl; | ||||||
|   | |||||||
| @@ -35,13 +35,14 @@ using namespace Grid::QCD; | |||||||
| int main (int argc, char ** argv) | int main (int argc, char ** argv) | ||||||
| { | { | ||||||
|   Grid_init(&argc,&argv); |   Grid_init(&argc,&argv); | ||||||
|  | #define LMAX (64) | ||||||
|  |  | ||||||
|   int Nloop=1000; |   int64_t Nloop=20; | ||||||
|  |  | ||||||
|   std::vector<int> simd_layout = GridDefaultSimd(Nd,vComplex::Nsimd()); |   std::vector<int> simd_layout = GridDefaultSimd(Nd,vComplex::Nsimd()); | ||||||
|   std::vector<int> mpi_layout  = GridDefaultMpi(); |   std::vector<int> mpi_layout  = GridDefaultMpi(); | ||||||
|  |  | ||||||
|   int threads = GridThread::GetThreads(); |   int64_t threads = GridThread::GetThreads(); | ||||||
|   std::cout<<GridLogMessage << "Grid is setup to use "<<threads<<" threads"<<std::endl; |   std::cout<<GridLogMessage << "Grid is setup to use "<<threads<<" threads"<<std::endl; | ||||||
|  |  | ||||||
|   std::cout<<GridLogMessage << "===================================================================================================="<<std::endl; |   std::cout<<GridLogMessage << "===================================================================================================="<<std::endl; | ||||||
| @@ -50,19 +51,19 @@ int main (int argc, char ** argv) | |||||||
|   std::cout<<GridLogMessage << "  L  "<<"\t\t"<<"bytes"<<"\t\t\t"<<"GB/s\t\t GFlop/s"<<std::endl; |   std::cout<<GridLogMessage << "  L  "<<"\t\t"<<"bytes"<<"\t\t\t"<<"GB/s\t\t GFlop/s"<<std::endl; | ||||||
|   std::cout<<GridLogMessage << "----------------------------------------------------------"<<std::endl; |   std::cout<<GridLogMessage << "----------------------------------------------------------"<<std::endl; | ||||||
|  |  | ||||||
|   for(int lat=2;lat<=32;lat+=2){ |   for(int lat=2;lat<=LMAX;lat+=2){ | ||||||
|  |  | ||||||
|       std::vector<int> latt_size  ({lat*mpi_layout[0],lat*mpi_layout[1],lat*mpi_layout[2],lat*mpi_layout[3]}); |       std::vector<int> latt_size  ({lat*mpi_layout[0],lat*mpi_layout[1],lat*mpi_layout[2],lat*mpi_layout[3]}); | ||||||
|       int vol = latt_size[0]*latt_size[1]*latt_size[2]*latt_size[3]; |       int64_t vol = latt_size[0]*latt_size[1]*latt_size[2]*latt_size[3]; | ||||||
|       GridCartesian     Grid(latt_size,simd_layout,mpi_layout); |       GridCartesian     Grid(latt_size,simd_layout,mpi_layout); | ||||||
|       //      GridParallelRNG          pRNG(&Grid);      pRNG.SeedFixedIntegers(std::vector<int>({45,12,81,9}); |       GridParallelRNG          pRNG(&Grid);      pRNG.SeedFixedIntegers(std::vector<int>({45,12,81,9})); | ||||||
|  |  | ||||||
|       LatticeColourMatrix z(&Grid);// random(pRNG,z); |       LatticeColourMatrix z(&Grid); random(pRNG,z); | ||||||
|       LatticeColourMatrix x(&Grid);// random(pRNG,x); |       LatticeColourMatrix x(&Grid); random(pRNG,x); | ||||||
|       LatticeColourMatrix y(&Grid);// random(pRNG,y); |       LatticeColourMatrix y(&Grid); random(pRNG,y); | ||||||
|  |  | ||||||
|       double start=usecond(); |       double start=usecond(); | ||||||
|       for(int i=0;i<Nloop;i++){ |       for(int64_t i=0;i<Nloop;i++){ | ||||||
| 	x=x*y; | 	x=x*y; | ||||||
|       } |       } | ||||||
|       double stop=usecond(); |       double stop=usecond(); | ||||||
| @@ -82,20 +83,20 @@ int main (int argc, char ** argv) | |||||||
|   std::cout<<GridLogMessage << "  L  "<<"\t\t"<<"bytes"<<"\t\t\t"<<"GB/s\t\t GFlop/s"<<std::endl; |   std::cout<<GridLogMessage << "  L  "<<"\t\t"<<"bytes"<<"\t\t\t"<<"GB/s\t\t GFlop/s"<<std::endl; | ||||||
|   std::cout<<GridLogMessage << "----------------------------------------------------------"<<std::endl; |   std::cout<<GridLogMessage << "----------------------------------------------------------"<<std::endl; | ||||||
|  |  | ||||||
|   for(int lat=2;lat<=32;lat+=2){ |   for(int lat=2;lat<=LMAX;lat+=2){ | ||||||
|  |  | ||||||
|       std::vector<int> latt_size  ({lat*mpi_layout[0],lat*mpi_layout[1],lat*mpi_layout[2],lat*mpi_layout[3]}); |       std::vector<int> latt_size  ({lat*mpi_layout[0],lat*mpi_layout[1],lat*mpi_layout[2],lat*mpi_layout[3]}); | ||||||
|       int vol = latt_size[0]*latt_size[1]*latt_size[2]*latt_size[3]; |       int64_t vol = latt_size[0]*latt_size[1]*latt_size[2]*latt_size[3]; | ||||||
|  |  | ||||||
|       GridCartesian     Grid(latt_size,simd_layout,mpi_layout); |       GridCartesian     Grid(latt_size,simd_layout,mpi_layout); | ||||||
|       //      GridParallelRNG          pRNG(&Grid);      pRNG.SeedFixedIntegers(std::vector<int>({45,12,81,9}); |       GridParallelRNG          pRNG(&Grid);      pRNG.SeedFixedIntegers(std::vector<int>({45,12,81,9})); | ||||||
|  |  | ||||||
|       LatticeColourMatrix z(&Grid); //random(pRNG,z); |       LatticeColourMatrix z(&Grid); random(pRNG,z); | ||||||
|       LatticeColourMatrix x(&Grid); //random(pRNG,x); |       LatticeColourMatrix x(&Grid); random(pRNG,x); | ||||||
|       LatticeColourMatrix y(&Grid); //random(pRNG,y); |       LatticeColourMatrix y(&Grid); random(pRNG,y); | ||||||
|  |  | ||||||
|       double start=usecond(); |       double start=usecond(); | ||||||
|       for(int i=0;i<Nloop;i++){ |       for(int64_t i=0;i<Nloop;i++){ | ||||||
| 	z=x*y; | 	z=x*y; | ||||||
|       } |       } | ||||||
|       double stop=usecond(); |       double stop=usecond(); | ||||||
| @@ -113,20 +114,20 @@ int main (int argc, char ** argv) | |||||||
|   std::cout<<GridLogMessage << "  L  "<<"\t\t"<<"bytes"<<"\t\t\t"<<"GB/s\t\t GFlop/s"<<std::endl; |   std::cout<<GridLogMessage << "  L  "<<"\t\t"<<"bytes"<<"\t\t\t"<<"GB/s\t\t GFlop/s"<<std::endl; | ||||||
|   std::cout<<GridLogMessage << "----------------------------------------------------------"<<std::endl; |   std::cout<<GridLogMessage << "----------------------------------------------------------"<<std::endl; | ||||||
|  |  | ||||||
|   for(int lat=2;lat<=32;lat+=2){ |   for(int lat=2;lat<=LMAX;lat+=2){ | ||||||
|  |  | ||||||
|       std::vector<int> latt_size  ({lat*mpi_layout[0],lat*mpi_layout[1],lat*mpi_layout[2],lat*mpi_layout[3]}); |       std::vector<int> latt_size  ({lat*mpi_layout[0],lat*mpi_layout[1],lat*mpi_layout[2],lat*mpi_layout[3]}); | ||||||
|       int vol = latt_size[0]*latt_size[1]*latt_size[2]*latt_size[3]; |       int64_t vol = latt_size[0]*latt_size[1]*latt_size[2]*latt_size[3]; | ||||||
|  |  | ||||||
|       GridCartesian     Grid(latt_size,simd_layout,mpi_layout); |       GridCartesian     Grid(latt_size,simd_layout,mpi_layout); | ||||||
|       //      GridParallelRNG          pRNG(&Grid);      pRNG.SeedFixedIntegers(std::vector<int>({45,12,81,9}); |       GridParallelRNG          pRNG(&Grid);      pRNG.SeedFixedIntegers(std::vector<int>({45,12,81,9})); | ||||||
|  |  | ||||||
|       LatticeColourMatrix z(&Grid); //random(pRNG,z); |       LatticeColourMatrix z(&Grid); random(pRNG,z); | ||||||
|       LatticeColourMatrix x(&Grid); //random(pRNG,x); |       LatticeColourMatrix x(&Grid); random(pRNG,x); | ||||||
|       LatticeColourMatrix y(&Grid); //random(pRNG,y); |       LatticeColourMatrix y(&Grid); random(pRNG,y); | ||||||
|  |  | ||||||
|       double start=usecond(); |       double start=usecond(); | ||||||
|       for(int i=0;i<Nloop;i++){ |       for(int64_t i=0;i<Nloop;i++){ | ||||||
| 	mult(z,x,y); | 	mult(z,x,y); | ||||||
|       } |       } | ||||||
|       double stop=usecond(); |       double stop=usecond(); | ||||||
| @@ -144,20 +145,20 @@ int main (int argc, char ** argv) | |||||||
|   std::cout<<GridLogMessage << "  L  "<<"\t\t"<<"bytes"<<"\t\t\t"<<"GB/s\t\t GFlop/s"<<std::endl; |   std::cout<<GridLogMessage << "  L  "<<"\t\t"<<"bytes"<<"\t\t\t"<<"GB/s\t\t GFlop/s"<<std::endl; | ||||||
|   std::cout<<GridLogMessage << "----------------------------------------------------------"<<std::endl; |   std::cout<<GridLogMessage << "----------------------------------------------------------"<<std::endl; | ||||||
|  |  | ||||||
|   for(int lat=2;lat<=32;lat+=2){ |   for(int lat=2;lat<=LMAX;lat+=2){ | ||||||
|  |  | ||||||
|       std::vector<int> latt_size  ({lat*mpi_layout[0],lat*mpi_layout[1],lat*mpi_layout[2],lat*mpi_layout[3]}); |       std::vector<int> latt_size  ({lat*mpi_layout[0],lat*mpi_layout[1],lat*mpi_layout[2],lat*mpi_layout[3]}); | ||||||
|       int vol = latt_size[0]*latt_size[1]*latt_size[2]*latt_size[3]; |       int64_t vol = latt_size[0]*latt_size[1]*latt_size[2]*latt_size[3]; | ||||||
|  |  | ||||||
|       GridCartesian     Grid(latt_size,simd_layout,mpi_layout); |       GridCartesian     Grid(latt_size,simd_layout,mpi_layout); | ||||||
|       //      GridParallelRNG          pRNG(&Grid);      pRNG.SeedFixedIntegers(std::vector<int>({45,12,81,9}); |       GridParallelRNG          pRNG(&Grid);      pRNG.SeedFixedIntegers(std::vector<int>({45,12,81,9})); | ||||||
|  |  | ||||||
|       LatticeColourMatrix z(&Grid); //random(pRNG,z); |       LatticeColourMatrix z(&Grid); random(pRNG,z); | ||||||
|       LatticeColourMatrix x(&Grid); //random(pRNG,x); |       LatticeColourMatrix x(&Grid); random(pRNG,x); | ||||||
|       LatticeColourMatrix y(&Grid); //random(pRNG,y); |       LatticeColourMatrix y(&Grid); random(pRNG,y); | ||||||
|  |  | ||||||
|       double start=usecond(); |       double start=usecond(); | ||||||
|       for(int i=0;i<Nloop;i++){ |       for(int64_t i=0;i<Nloop;i++){ | ||||||
| 	mac(z,x,y); | 	mac(z,x,y); | ||||||
|       } |       } | ||||||
|       double stop=usecond(); |       double stop=usecond(); | ||||||
|   | |||||||
| @@ -58,7 +58,7 @@ int main (int argc, char ** argv) | |||||||
|   std::vector<int> simd_layout = GridDefaultSimd(Nd,vComplex::Nsimd()); |   std::vector<int> simd_layout = GridDefaultSimd(Nd,vComplex::Nsimd()); | ||||||
|   std::vector<int> mpi_layout  = GridDefaultMpi(); |   std::vector<int> mpi_layout  = GridDefaultMpi(); | ||||||
|   GridCartesian               Grid(latt_size,simd_layout,mpi_layout); |   GridCartesian               Grid(latt_size,simd_layout,mpi_layout); | ||||||
|   GridRedBlackCartesian     RBGrid(latt_size,simd_layout,mpi_layout); |   GridRedBlackCartesian     RBGrid(&Grid); | ||||||
|  |  | ||||||
|   int threads = GridThread::GetThreads(); |   int threads = GridThread::GetThreads(); | ||||||
|   std::cout<<GridLogMessage << "Grid is setup to use "<<threads<<" threads"<<std::endl; |   std::cout<<GridLogMessage << "Grid is setup to use "<<threads<<" threads"<<std::endl; | ||||||
|   | |||||||
| @@ -93,7 +93,7 @@ int main (int argc, char ** argv) | |||||||
| 	  std::cout << latt_size.back() << "\t\t"; | 	  std::cout << latt_size.back() << "\t\t"; | ||||||
|  |  | ||||||
| 	  GridCartesian           Grid(latt_size,simd_layout,mpi_layout); | 	  GridCartesian           Grid(latt_size,simd_layout,mpi_layout); | ||||||
| 	  GridRedBlackCartesian RBGrid(latt_size,simd_layout,mpi_layout); | 	  GridRedBlackCartesian RBGrid(&Grid); | ||||||
|  |  | ||||||
| 	  GridParallelRNG  pRNG(&Grid); pRNG.SeedFixedIntegers(seeds); | 	  GridParallelRNG  pRNG(&Grid); pRNG.SeedFixedIntegers(seeds); | ||||||
| 	  LatticeGaugeField Umu(&Grid); random(pRNG,Umu); | 	  LatticeGaugeField Umu(&Grid); random(pRNG,Umu); | ||||||
|   | |||||||
| @@ -1,11 +1,7 @@ | |||||||
| include Make.inc | include Make.inc | ||||||
|  |  | ||||||
| simple: simple_su3_test.o simple_su3_expr.o simple_simd_test.o | bench-local: all | ||||||
|  | 	./Benchmark_su3 | ||||||
| EXTRA_LIBRARIES = libsimple_su3_test.a libsimple_su3_expr.a libsimple_simd_test.a | 	./Benchmark_memory_bandwidth | ||||||
|  | 	./Benchmark_wilson | ||||||
| libsimple_su3_test_a_SOURCES = simple_su3_test.cc | 	./Benchmark_dwf --dslash-unroll | ||||||
|  |  | ||||||
| libsimple_su3_expr_a_SOURCES = simple_su3_expr.cc |  | ||||||
|  |  | ||||||
| libsimple_simd_test_a_SOURCES = simple_simd_test.cc |  | ||||||
| @@ -1,11 +1,9 @@ | |||||||
| #!/usr/bin/env bash | #!/usr/bin/env bash | ||||||
|  |  | ||||||
| EIGEN_URL='http://bitbucket.org/eigen/eigen/get/3.2.9.tar.bz2' | EIGEN_URL='http://bitbucket.org/eigen/eigen/get/3.3.3.tar.bz2' | ||||||
|  |  | ||||||
| echo "-- deploying Eigen source..." | echo "-- deploying Eigen source..." | ||||||
| wget ${EIGEN_URL} --no-check-certificate | wget ${EIGEN_URL} --no-check-certificate && ./scripts/update_eigen.sh `basename ${EIGEN_URL}` && rm `basename ${EIGEN_URL}` | ||||||
| ./scripts/update_eigen.sh `basename ${EIGEN_URL}` |  | ||||||
| rm `basename ${EIGEN_URL}` |  | ||||||
|  |  | ||||||
| echo '-- generating Make.inc files...' | echo '-- generating Make.inc files...' | ||||||
| ./scripts/filelist | ./scripts/filelist | ||||||
|   | |||||||
							
								
								
									
										238
									
								
								configure.ac
									
									
									
									
									
								
							
							
						
						
									
										238
									
								
								configure.ac
									
									
									
									
									
								
							| @@ -1,16 +1,23 @@ | |||||||
| AC_PREREQ([2.63]) | AC_PREREQ([2.63]) | ||||||
| AC_INIT([Grid], [0.6.0], [https://github.com/paboyle/Grid], [Grid]) | AC_INIT([Grid], [0.7.0], [https://github.com/paboyle/Grid], [Grid]) | ||||||
| AC_CANONICAL_BUILD | AC_CANONICAL_BUILD | ||||||
| AC_CANONICAL_HOST | AC_CANONICAL_HOST | ||||||
| AC_CANONICAL_TARGET | AC_CANONICAL_TARGET | ||||||
| AM_INIT_AUTOMAKE(subdir-objects) | AM_INIT_AUTOMAKE([subdir-objects 1.13]) | ||||||
|  | AM_EXTRA_RECURSIVE_TARGETS([tests bench]) | ||||||
| AC_CONFIG_MACRO_DIR([m4]) | AC_CONFIG_MACRO_DIR([m4]) | ||||||
| AC_CONFIG_SRCDIR([lib/Grid.h]) | AC_CONFIG_SRCDIR([lib/Grid.h]) | ||||||
| AC_CONFIG_HEADERS([lib/Config.h],[sed -i 's|PACKAGE_|GRID_|' lib/Config.h]) | AC_CONFIG_HEADERS([lib/Config.h],[sed -i 's|PACKAGE_|GRID_|' lib/Config.h]) | ||||||
| m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])]) | m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])]) | ||||||
|  |  | ||||||
| ############### Checks for programs | ################ Get git info | ||||||
|  | #AC_REVISION([m4_esyscmd_s([./scripts/configure.commit])]) | ||||||
|  |  | ||||||
|  | ################ Set flags | ||||||
|  | # do not move! | ||||||
| CXXFLAGS="-O3 $CXXFLAGS" | CXXFLAGS="-O3 $CXXFLAGS" | ||||||
|  |  | ||||||
|  | ############### Checks for programs | ||||||
| AC_PROG_CXX | AC_PROG_CXX | ||||||
| AC_PROG_RANLIB | AC_PROG_RANLIB | ||||||
|  |  | ||||||
| @@ -24,12 +31,14 @@ AX_GXX_VERSION | |||||||
| AC_DEFINE_UNQUOTED([GXX_VERSION],["$GXX_VERSION"], | AC_DEFINE_UNQUOTED([GXX_VERSION],["$GXX_VERSION"], | ||||||
|       [version of g++ that will compile the code]) |       [version of g++ that will compile the code]) | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
| ############### Checks for typedefs, structures, and compiler characteristics | ############### Checks for typedefs, structures, and compiler characteristics | ||||||
| AC_TYPE_SIZE_T | AC_TYPE_SIZE_T | ||||||
| AC_TYPE_UINT32_T | AC_TYPE_UINT32_T | ||||||
| AC_TYPE_UINT64_T | AC_TYPE_UINT64_T | ||||||
|  |  | ||||||
| ############### OpenMP  | ############### OpenMP | ||||||
| AC_OPENMP | AC_OPENMP | ||||||
| ac_openmp=no | ac_openmp=no | ||||||
| if test "${OPENMP_CXXFLAGS}X" != "X"; then | if test "${OPENMP_CXXFLAGS}X" != "X"; then | ||||||
| @@ -45,9 +54,14 @@ AC_CHECK_HEADERS(malloc/malloc.h) | |||||||
| AC_CHECK_HEADERS(malloc.h) | AC_CHECK_HEADERS(malloc.h) | ||||||
| AC_CHECK_HEADERS(endian.h) | AC_CHECK_HEADERS(endian.h) | ||||||
| AC_CHECK_HEADERS(execinfo.h) | AC_CHECK_HEADERS(execinfo.h) | ||||||
|  | AC_CHECK_HEADERS(numaif.h) | ||||||
| AC_CHECK_DECLS([ntohll],[], [], [[#include <arpa/inet.h>]]) | AC_CHECK_DECLS([ntohll],[], [], [[#include <arpa/inet.h>]]) | ||||||
| AC_CHECK_DECLS([be64toh],[], [], [[#include <arpa/inet.h>]]) | AC_CHECK_DECLS([be64toh],[], [], [[#include <arpa/inet.h>]]) | ||||||
|  |  | ||||||
|  | ############## Standard libraries | ||||||
|  | AC_CHECK_LIB([m],[cos]) | ||||||
|  | AC_CHECK_LIB([stdc++],[abort]) | ||||||
|  |  | ||||||
| ############### GMP and MPFR | ############### GMP and MPFR | ||||||
| AC_ARG_WITH([gmp], | AC_ARG_WITH([gmp], | ||||||
|     [AS_HELP_STRING([--with-gmp=prefix], |     [AS_HELP_STRING([--with-gmp=prefix], | ||||||
| @@ -60,16 +74,23 @@ AC_ARG_WITH([mpfr], | |||||||
|     [AM_CXXFLAGS="-I$with_mpfr/include $AM_CXXFLAGS"] |     [AM_CXXFLAGS="-I$with_mpfr/include $AM_CXXFLAGS"] | ||||||
|     [AM_LDFLAGS="-L$with_mpfr/lib $AM_LDFLAGS"]) |     [AM_LDFLAGS="-L$with_mpfr/lib $AM_LDFLAGS"]) | ||||||
|  |  | ||||||
| ############### FFTW3  | ############### FFTW3 | ||||||
| AC_ARG_WITH([fftw],     | AC_ARG_WITH([fftw], | ||||||
|             [AS_HELP_STRING([--with-fftw=prefix], |             [AS_HELP_STRING([--with-fftw=prefix], | ||||||
|             [try this for a non-standard install prefix of the FFTW3 library])], |             [try this for a non-standard install prefix of the FFTW3 library])], | ||||||
|             [AM_CXXFLAGS="-I$with_fftw/include $AM_CXXFLAGS"] |             [AM_CXXFLAGS="-I$with_fftw/include $AM_CXXFLAGS"] | ||||||
|             [AM_LDFLAGS="-L$with_fftw/lib $AM_LDFLAGS"]) |             [AM_LDFLAGS="-L$with_fftw/lib $AM_LDFLAGS"]) | ||||||
|  |  | ||||||
| ############### lapack  | ############### LIME | ||||||
|  | AC_ARG_WITH([lime], | ||||||
|  |             [AS_HELP_STRING([--with-lime=prefix], | ||||||
|  |             [try this for a non-standard install prefix of the LIME library])], | ||||||
|  |             [AM_CXXFLAGS="-I$with_lime/include $AM_CXXFLAGS"] | ||||||
|  |             [AM_LDFLAGS="-L$with_lime/lib $AM_LDFLAGS"]) | ||||||
|  |  | ||||||
|  | ############### lapack | ||||||
| AC_ARG_ENABLE([lapack], | AC_ARG_ENABLE([lapack], | ||||||
|     [AC_HELP_STRING([--enable-lapack=yes|no|prefix], [enable LAPACK])],  |     [AC_HELP_STRING([--enable-lapack=yes|no|prefix], [enable LAPACK])], | ||||||
|     [ac_LAPACK=${enable_lapack}], [ac_LAPACK=no]) |     [ac_LAPACK=${enable_lapack}], [ac_LAPACK=no]) | ||||||
|  |  | ||||||
| case ${ac_LAPACK} in | case ${ac_LAPACK} in | ||||||
| @@ -84,16 +105,15 @@ case ${ac_LAPACK} in | |||||||
| esac | esac | ||||||
|  |  | ||||||
| ############### FP16 conversions | ############### FP16 conversions | ||||||
| AC_ARG_ENABLE([fp16], | AC_ARG_ENABLE([sfw-fp16], | ||||||
|     [AC_HELP_STRING([--enable-fp16=yes|no], [enable fp16 comms])],  |     [AC_HELP_STRING([--enable-sfw-fp16=yes|no], [enable software fp16 comms])], | ||||||
|     [ac_FP16=${enable_fp16}], [ac_FP16=no]) |     [ac_SFW_FP16=${enable_sfw_fp16}], [ac_SFW_FP16=yes]) | ||||||
| case ${ac_FP16} in | case ${ac_SFW_FP16} in | ||||||
|     no) |  | ||||||
|         ;; |  | ||||||
|     yes) |     yes) | ||||||
|         AC_DEFINE([USE_FP16],[1],[conversion to fp16]);; |       AC_DEFINE([SFW_FP16],[1],[software conversion to fp16]);; | ||||||
|  |     no);; | ||||||
|     *) |     *) | ||||||
| 	;; |       AC_MSG_ERROR(["SFW FP16 option not supported ${ac_SFW_FP16}"]);; | ||||||
| esac | esac | ||||||
|  |  | ||||||
| ############### MKL | ############### MKL | ||||||
| @@ -121,7 +141,7 @@ AC_ARG_WITH([hdf5], | |||||||
|  |  | ||||||
| ############### first-touch | ############### first-touch | ||||||
| AC_ARG_ENABLE([numa], | AC_ARG_ENABLE([numa], | ||||||
|     [AC_HELP_STRING([--enable-numa=yes|no|prefix], [enable first touch numa opt])],  |     [AC_HELP_STRING([--enable-numa=yes|no|prefix], [enable first touch numa opt])], | ||||||
|     [ac_NUMA=${enable_NUMA}],[ac_NUMA=no]) |     [ac_NUMA=${enable_NUMA}],[ac_NUMA=no]) | ||||||
|  |  | ||||||
| case ${ac_NUMA} in | case ${ac_NUMA} in | ||||||
| @@ -147,8 +167,8 @@ if test "${ac_MKL}x" != "nox"; then | |||||||
| fi | fi | ||||||
|  |  | ||||||
| AC_SEARCH_LIBS([__gmpf_init], [gmp], | AC_SEARCH_LIBS([__gmpf_init], [gmp], | ||||||
|                [AC_SEARCH_LIBS([mpfr_init], [mpfr],  |                [AC_SEARCH_LIBS([mpfr_init], [mpfr], | ||||||
|                                [AC_DEFINE([HAVE_LIBMPFR], [1],  |                                [AC_DEFINE([HAVE_LIBMPFR], [1], | ||||||
|                                           [Define to 1 if you have the `MPFR' library])] |                                           [Define to 1 if you have the `MPFR' library])] | ||||||
|                                [have_mpfr=true], [AC_MSG_ERROR([MPFR library not found])])] |                                [have_mpfr=true], [AC_MSG_ERROR([MPFR library not found])])] | ||||||
|                [AC_DEFINE([HAVE_LIBGMP], [1], [Define to 1 if you have the `GMP' library])] |                [AC_DEFINE([HAVE_LIBGMP], [1], [Define to 1 if you have the `GMP' library])] | ||||||
| @@ -157,7 +177,7 @@ AC_SEARCH_LIBS([__gmpf_init], [gmp], | |||||||
| if test "${ac_LAPACK}x" != "nox"; then | if test "${ac_LAPACK}x" != "nox"; then | ||||||
|     AC_SEARCH_LIBS([LAPACKE_sbdsdc], [lapack], [], |     AC_SEARCH_LIBS([LAPACKE_sbdsdc], [lapack], [], | ||||||
|                    [AC_MSG_ERROR("LAPACK enabled but library not found")]) |                    [AC_MSG_ERROR("LAPACK enabled but library not found")]) | ||||||
| fi    | fi | ||||||
|  |  | ||||||
| AC_SEARCH_LIBS([fftw_execute], [fftw3], | AC_SEARCH_LIBS([fftw_execute], [fftw3], | ||||||
|                [AC_SEARCH_LIBS([fftwf_execute], [fftw3f], [], |                [AC_SEARCH_LIBS([fftwf_execute], [fftw3f], [], | ||||||
| @@ -165,6 +185,23 @@ AC_SEARCH_LIBS([fftw_execute], [fftw3], | |||||||
|                [AC_DEFINE([HAVE_FFTW], [1], [Define to 1 if you have the `FFTW' library])] |                [AC_DEFINE([HAVE_FFTW], [1], [Define to 1 if you have the `FFTW' library])] | ||||||
|                [have_fftw=true]) |                [have_fftw=true]) | ||||||
|  |  | ||||||
|  | AC_SEARCH_LIBS([limeCreateReader], [lime], | ||||||
|  |                [AC_DEFINE([HAVE_LIME], [1], [Define to 1 if you have the `LIME' library])] | ||||||
|  |                [have_lime=true], | ||||||
|  | 	       [AC_MSG_WARN(C-LIME library was not found in your system. | ||||||
|  | In order to use ILGG file format please install or provide the correct path to your installation | ||||||
|  | Info at: http://usqcd.jlab.org/usqcd-docs/c-lime/)]) | ||||||
|  |  | ||||||
|  | AC_SEARCH_LIBS([crc32], [z], | ||||||
|  |                [AC_DEFINE([HAVE_ZLIB], [1], [Define to 1 if you have the `LIBZ' library])] | ||||||
|  |                [have_zlib=true] [LIBS="${LIBS} -lz"], | ||||||
|  | 	       [AC_MSG_ERROR(zlib library was not found in your system.)]) | ||||||
|  |  | ||||||
|  | AC_SEARCH_LIBS([move_pages], [numa], | ||||||
|  |                [AC_DEFINE([HAVE_LIBNUMA], [1], [Define to 1 if you have the `LIBNUMA' library])] | ||||||
|  |                [have_libnuma=true] [LIBS="${LIBS} -lnuma"], | ||||||
|  | 	       [AC_MSG_WARN(libnuma library was not found in your system. Some optimisations will not apply)]) | ||||||
|  |  | ||||||
| AC_SEARCH_LIBS([H5Fopen], [hdf5_cpp], | AC_SEARCH_LIBS([H5Fopen], [hdf5_cpp], | ||||||
|                [AC_DEFINE([HAVE_HDF5], [1], [Define to 1 if you have the `HDF5' library])] |                [AC_DEFINE([HAVE_HDF5], [1], [Define to 1 if you have the `HDF5' library])] | ||||||
|                [have_hdf5=true] |                [have_hdf5=true] | ||||||
| @@ -189,7 +226,14 @@ case ${ax_cv_cxx_compiler_vendor} in | |||||||
|     case ${ac_SIMD} in |     case ${ac_SIMD} in | ||||||
|       SSE4) |       SSE4) | ||||||
|         AC_DEFINE([SSE4],[1],[SSE4 intrinsics]) |         AC_DEFINE([SSE4],[1],[SSE4 intrinsics]) | ||||||
|         SIMD_FLAGS='-msse4.2';; | 	case ${ac_SFW_FP16} in | ||||||
|  | 	  yes) | ||||||
|  | 	  SIMD_FLAGS='-msse4.2';; | ||||||
|  | 	  no) | ||||||
|  | 	  SIMD_FLAGS='-msse4.2 -mf16c';; | ||||||
|  | 	  *) | ||||||
|  |           AC_MSG_ERROR(["SFW_FP16 must be either yes or no value ${ac_SFW_FP16} "]);; | ||||||
|  | 	esac;; | ||||||
|       AVX) |       AVX) | ||||||
|         AC_DEFINE([AVX1],[1],[AVX intrinsics]) |         AC_DEFINE([AVX1],[1],[AVX intrinsics]) | ||||||
|         SIMD_FLAGS='-mavx -mf16c';; |         SIMD_FLAGS='-mavx -mf16c';; | ||||||
| @@ -210,6 +254,7 @@ case ${ax_cv_cxx_compiler_vendor} in | |||||||
|         SIMD_FLAGS='';; |         SIMD_FLAGS='';; | ||||||
|       KNL) |       KNL) | ||||||
|         AC_DEFINE([AVX512],[1],[AVX512 intrinsics]) |         AC_DEFINE([AVX512],[1],[AVX512 intrinsics]) | ||||||
|  |         AC_DEFINE([KNL],[1],[Knights landing processor]) | ||||||
|         SIMD_FLAGS='-march=knl';; |         SIMD_FLAGS='-march=knl';; | ||||||
|       GEN) |       GEN) | ||||||
|         AC_DEFINE([GEN],[1],[generic vector code]) |         AC_DEFINE([GEN],[1],[generic vector code]) | ||||||
| @@ -217,6 +262,9 @@ case ${ax_cv_cxx_compiler_vendor} in | |||||||
|                            [generic SIMD vector width (in bytes)]) |                            [generic SIMD vector width (in bytes)]) | ||||||
|         SIMD_GEN_WIDTH_MSG=" (width= $ac_gen_simd_width)" |         SIMD_GEN_WIDTH_MSG=" (width= $ac_gen_simd_width)" | ||||||
|         SIMD_FLAGS='';; |         SIMD_FLAGS='';; | ||||||
|  |       NEONv8) | ||||||
|  |         AC_DEFINE([NEONV8],[1],[ARMv8 NEON]) | ||||||
|  |         SIMD_FLAGS='-march=armv8-a';; | ||||||
|       QPX|BGQ) |       QPX|BGQ) | ||||||
|         AC_DEFINE([QPX],[1],[QPX intrinsics for BG/Q]) |         AC_DEFINE([QPX],[1],[QPX intrinsics for BG/Q]) | ||||||
|         SIMD_FLAGS='';; |         SIMD_FLAGS='';; | ||||||
| @@ -245,6 +293,7 @@ case ${ax_cv_cxx_compiler_vendor} in | |||||||
|         SIMD_FLAGS='';; |         SIMD_FLAGS='';; | ||||||
|       KNL) |       KNL) | ||||||
|         AC_DEFINE([AVX512],[1],[AVX512 intrinsics for Knights Landing]) |         AC_DEFINE([AVX512],[1],[AVX512 intrinsics for Knights Landing]) | ||||||
|  |         AC_DEFINE([KNL],[1],[Knights landing processor]) | ||||||
|         SIMD_FLAGS='-xmic-avx512';; |         SIMD_FLAGS='-xmic-avx512';; | ||||||
|       GEN) |       GEN) | ||||||
|         AC_DEFINE([GEN],[1],[generic vector code]) |         AC_DEFINE([GEN],[1],[generic vector code]) | ||||||
| @@ -282,10 +331,39 @@ case ${ac_PRECISION} in | |||||||
|      double) |      double) | ||||||
|        AC_DEFINE([GRID_DEFAULT_PRECISION_DOUBLE],[1],[GRID_DEFAULT_PRECISION is DOUBLE] ) |        AC_DEFINE([GRID_DEFAULT_PRECISION_DOUBLE],[1],[GRID_DEFAULT_PRECISION is DOUBLE] ) | ||||||
|      ;; |      ;; | ||||||
|  |      *) | ||||||
|  |      AC_MSG_ERROR([${ac_PRECISION} unsupported --enable-precision option]); | ||||||
|  |      ;; | ||||||
| esac | esac | ||||||
|  |  | ||||||
|  | ######################  Shared memory allocation technique under MPI3 | ||||||
|  | AC_ARG_ENABLE([shm],[AC_HELP_STRING([--enable-shm=shmopen|hugetlbfs], | ||||||
|  |               [Select SHM allocation technique])],[ac_SHM=${enable_shm}],[ac_SHM=shmopen]) | ||||||
|  |  | ||||||
|  | case ${ac_SHM} in | ||||||
|  |  | ||||||
|  |      shmopen) | ||||||
|  |      AC_DEFINE([GRID_MPI3_SHMOPEN],[1],[GRID_MPI3_SHMOPEN] ) | ||||||
|  |      ;; | ||||||
|  |  | ||||||
|  |      hugetlbfs) | ||||||
|  |      AC_DEFINE([GRID_MPI3_SHMMMAP],[1],[GRID_MPI3_SHMMMAP] ) | ||||||
|  |      ;; | ||||||
|  |  | ||||||
|  |      *) | ||||||
|  |      AC_MSG_ERROR([${ac_SHM} unsupported --enable-shm option]); | ||||||
|  |      ;; | ||||||
|  | esac | ||||||
|  |  | ||||||
|  | ######################  Shared base path for SHMMMAP | ||||||
|  | AC_ARG_ENABLE([shmpath],[AC_HELP_STRING([--enable-shmpath=path], | ||||||
|  |               [Select SHM mmap base path for hugetlbfs])], | ||||||
|  | 	      [ac_SHMPATH=${enable_shmpath}], | ||||||
|  | 	      [ac_SHMPATH=/var/lib/hugetlbfs/pagesize-2MB/]) | ||||||
|  | AC_DEFINE_UNQUOTED([GRID_SHM_PATH],["$ac_SHMPATH"],[Path to a hugetlbfs filesystem for MMAPing]) | ||||||
|  |  | ||||||
| ############### communication type selection | ############### communication type selection | ||||||
| AC_ARG_ENABLE([comms],[AC_HELP_STRING([--enable-comms=none|mpi|mpi-auto|mpi3|mpi3-auto|shmem], | AC_ARG_ENABLE([comms],[AC_HELP_STRING([--enable-comms=none|mpi|mpi-auto], | ||||||
|               [Select communications])],[ac_COMMS=${enable_comms}],[ac_COMMS=none]) |               [Select communications])],[ac_COMMS=${enable_comms}],[ac_COMMS=none]) | ||||||
|  |  | ||||||
| case ${ac_COMMS} in | case ${ac_COMMS} in | ||||||
| @@ -293,24 +371,12 @@ case ${ac_COMMS} in | |||||||
|         AC_DEFINE([GRID_COMMS_NONE],[1],[GRID_COMMS_NONE] ) |         AC_DEFINE([GRID_COMMS_NONE],[1],[GRID_COMMS_NONE] ) | ||||||
|         comms_type='none' |         comms_type='none' | ||||||
|      ;; |      ;; | ||||||
|      mpi3l*) |      mpi*) | ||||||
|        AC_DEFINE([GRID_COMMS_MPI3L],[1],[GRID_COMMS_MPI3L] ) |  | ||||||
|        comms_type='mpi3l' |  | ||||||
|      ;; |  | ||||||
|      mpi3*) |  | ||||||
|         AC_DEFINE([GRID_COMMS_MPI3],[1],[GRID_COMMS_MPI3] ) |         AC_DEFINE([GRID_COMMS_MPI3],[1],[GRID_COMMS_MPI3] ) | ||||||
|         comms_type='mpi3' |         comms_type='mpi3' | ||||||
|      ;; |      ;; | ||||||
|      mpi*) |  | ||||||
|         AC_DEFINE([GRID_COMMS_MPI],[1],[GRID_COMMS_MPI] ) |  | ||||||
|         comms_type='mpi' |  | ||||||
|      ;; |  | ||||||
|      shmem) |  | ||||||
|         AC_DEFINE([GRID_COMMS_SHMEM],[1],[GRID_COMMS_SHMEM] ) |  | ||||||
|         comms_type='shmem' |  | ||||||
|      ;; |  | ||||||
|      *) |      *) | ||||||
|         AC_MSG_ERROR([${ac_COMMS} unsupported --enable-comms option]);  |         AC_MSG_ERROR([${ac_COMMS} unsupported --enable-comms option]); | ||||||
|      ;; |      ;; | ||||||
| esac | esac | ||||||
| case ${ac_COMMS} in | case ${ac_COMMS} in | ||||||
| @@ -328,7 +394,7 @@ esac | |||||||
| AM_CONDITIONAL(BUILD_COMMS_SHMEM, [ test "${comms_type}X" == "shmemX" ]) | AM_CONDITIONAL(BUILD_COMMS_SHMEM, [ test "${comms_type}X" == "shmemX" ]) | ||||||
| AM_CONDITIONAL(BUILD_COMMS_MPI,   [ test "${comms_type}X" == "mpiX" ]) | AM_CONDITIONAL(BUILD_COMMS_MPI,   [ test "${comms_type}X" == "mpiX" ]) | ||||||
| AM_CONDITIONAL(BUILD_COMMS_MPI3,  [ test "${comms_type}X" == "mpi3X" ] ) | AM_CONDITIONAL(BUILD_COMMS_MPI3,  [ test "${comms_type}X" == "mpi3X" ] ) | ||||||
| AM_CONDITIONAL(BUILD_COMMS_MPI3L, [ test "${comms_type}X" == "mpi3lX" ] ) | AM_CONDITIONAL(BUILD_COMMS_MPIT,  [ test "${comms_type}X" == "mpitX" ] ) | ||||||
| AM_CONDITIONAL(BUILD_COMMS_NONE,  [ test "${comms_type}X" == "noneX" ]) | AM_CONDITIONAL(BUILD_COMMS_NONE,  [ test "${comms_type}X" == "noneX" ]) | ||||||
|  |  | ||||||
| ############### RNG selection | ############### RNG selection | ||||||
| @@ -347,7 +413,7 @@ case ${ac_RNG} in | |||||||
|       AC_DEFINE([RNG_SITMO],[1],[RNG_SITMO] ) |       AC_DEFINE([RNG_SITMO],[1],[RNG_SITMO] ) | ||||||
|      ;; |      ;; | ||||||
|      *) |      *) | ||||||
|       AC_MSG_ERROR([${ac_RNG} unsupported --enable-rng option]);  |       AC_MSG_ERROR([${ac_RNG} unsupported --enable-rng option]); | ||||||
|      ;; |      ;; | ||||||
| esac | esac | ||||||
|  |  | ||||||
| @@ -364,7 +430,7 @@ case ${ac_TIMERS} in | |||||||
|       AC_DEFINE([TIMERS_OFF],[1],[TIMERS_OFF] ) |       AC_DEFINE([TIMERS_OFF],[1],[TIMERS_OFF] ) | ||||||
|      ;; |      ;; | ||||||
|      *) |      *) | ||||||
|       AC_MSG_ERROR([${ac_TIMERS} unsupported --enable-timers option]);  |       AC_MSG_ERROR([${ac_TIMERS} unsupported --enable-timers option]); | ||||||
|      ;; |      ;; | ||||||
| esac | esac | ||||||
|  |  | ||||||
| @@ -376,7 +442,7 @@ case ${ac_CHROMA} in | |||||||
|      yes|no) |      yes|no) | ||||||
|      ;; |      ;; | ||||||
|      *) |      *) | ||||||
|        AC_MSG_ERROR([${ac_CHROMA} unsupported --enable-chroma option]);  |        AC_MSG_ERROR([${ac_CHROMA} unsupported --enable-chroma option]); | ||||||
|      ;; |      ;; | ||||||
| esac | esac | ||||||
|  |  | ||||||
| @@ -397,12 +463,67 @@ DX_INIT_DOXYGEN([$PACKAGE_NAME], [doxygen.cfg]) | |||||||
|  |  | ||||||
| ############### Ouput | ############### Ouput | ||||||
| cwd=`pwd -P`; cd ${srcdir}; abs_srcdir=`pwd -P`; cd ${cwd} | cwd=`pwd -P`; cd ${srcdir}; abs_srcdir=`pwd -P`; cd ${cwd} | ||||||
|  | GRID_CXXFLAGS="$AM_CXXFLAGS $CXXFLAGS" | ||||||
|  | GRID_LDFLAGS="$AM_LDFLAGS $LDFLAGS" | ||||||
|  | GRID_LIBS=$LIBS | ||||||
|  | GRID_SHORT_SHA=`git rev-parse --short HEAD` | ||||||
|  | GRID_SHA=`git rev-parse HEAD` | ||||||
|  | GRID_BRANCH=`git rev-parse --abbrev-ref HEAD` | ||||||
| AM_CXXFLAGS="-I${abs_srcdir}/include $AM_CXXFLAGS" | AM_CXXFLAGS="-I${abs_srcdir}/include $AM_CXXFLAGS" | ||||||
| AM_CFLAGS="-I${abs_srcdir}/include $AM_CFLAGS" | AM_CFLAGS="-I${abs_srcdir}/include $AM_CFLAGS" | ||||||
| AM_LDFLAGS="-L${cwd}/lib $AM_LDFLAGS" | AM_LDFLAGS="-L${cwd}/lib $AM_LDFLAGS" | ||||||
| AC_SUBST([AM_CFLAGS]) | AC_SUBST([AM_CFLAGS]) | ||||||
| AC_SUBST([AM_CXXFLAGS]) | AC_SUBST([AM_CXXFLAGS]) | ||||||
| AC_SUBST([AM_LDFLAGS]) | AC_SUBST([AM_LDFLAGS]) | ||||||
|  | AC_SUBST([GRID_CXXFLAGS]) | ||||||
|  | AC_SUBST([GRID_LDFLAGS]) | ||||||
|  | AC_SUBST([GRID_LIBS]) | ||||||
|  | AC_SUBST([GRID_SHA]) | ||||||
|  | AC_SUBST([GRID_BRANCH]) | ||||||
|  |  | ||||||
|  | git_commit=`cd $srcdir && ./scripts/configure.commit` | ||||||
|  |  | ||||||
|  | echo "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||||||
|  | Summary of configuration for $PACKAGE v$VERSION | ||||||
|  | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||||||
|  | ----- GIT VERSION ------------------------------------- | ||||||
|  | $git_commit | ||||||
|  | ----- PLATFORM ---------------------------------------- | ||||||
|  | architecture (build)        : $build_cpu | ||||||
|  | os (build)                  : $build_os | ||||||
|  | architecture (target)       : $target_cpu | ||||||
|  | os (target)                 : $target_os | ||||||
|  | compiler vendor             : ${ax_cv_cxx_compiler_vendor} | ||||||
|  | compiler version            : ${ax_cv_gxx_version} | ||||||
|  | ----- BUILD OPTIONS ----------------------------------- | ||||||
|  | SIMD                        : ${ac_SIMD}${SIMD_GEN_WIDTH_MSG} | ||||||
|  | Threading                   : ${ac_openmp} | ||||||
|  | Communications type         : ${comms_type} | ||||||
|  | Shared memory allocator     : ${ac_SHM} | ||||||
|  | Shared memory mmap path     : ${ac_SHMPATH} | ||||||
|  | Default precision           : ${ac_PRECISION} | ||||||
|  | Software FP16 conversion    : ${ac_SFW_FP16} | ||||||
|  | RNG choice                  : ${ac_RNG} | ||||||
|  | GMP                         : `if test "x$have_gmp" = xtrue; then echo yes; else echo no; fi` | ||||||
|  | LAPACK                      : ${ac_LAPACK} | ||||||
|  | FFTW                        : `if test "x$have_fftw" = xtrue; then echo yes; else echo no; fi` | ||||||
|  | LIME (ILDG support)         : `if test "x$have_lime" = xtrue; then echo yes; else echo no; fi` | ||||||
|  | HDF5                        : `if test "x$have_hdf5" = xtrue; then echo yes; else echo no; fi` | ||||||
|  | build DOXYGEN documentation : `if test "$DX_FLAG_doc" = '1'; then echo yes; else echo no; fi` | ||||||
|  | ----- BUILD FLAGS ------------------------------------- | ||||||
|  | CXXFLAGS: | ||||||
|  | `echo ${AM_CXXFLAGS} ${CXXFLAGS} | tr ' ' '\n' | sed 's/^-/    -/g'` | ||||||
|  | LDFLAGS: | ||||||
|  | `echo ${AM_LDFLAGS} ${LDFLAGS} | tr ' ' '\n' | sed 's/^-/    -/g'` | ||||||
|  | LIBS: | ||||||
|  | `echo ${LIBS} | tr ' ' '\n' | sed 's/^-/    -/g'` | ||||||
|  | -------------------------------------------------------" > grid.configure.summary | ||||||
|  |  | ||||||
|  | GRID_SUMMARY="`cat grid.configure.summary`" | ||||||
|  | AM_SUBST_NOTMAKE([GRID_SUMMARY]) | ||||||
|  | AC_SUBST([GRID_SUMMARY]) | ||||||
|  |  | ||||||
|  | AC_CONFIG_FILES([grid-config], [chmod +x grid-config]) | ||||||
| AC_CONFIG_FILES(Makefile) | AC_CONFIG_FILES(Makefile) | ||||||
| AC_CONFIG_FILES(lib/Makefile) | AC_CONFIG_FILES(lib/Makefile) | ||||||
| AC_CONFIG_FILES(tests/Makefile) | AC_CONFIG_FILES(tests/Makefile) | ||||||
| @@ -413,6 +534,8 @@ AC_CONFIG_FILES(tests/forces/Makefile) | |||||||
| AC_CONFIG_FILES(tests/hadrons/Makefile) | AC_CONFIG_FILES(tests/hadrons/Makefile) | ||||||
| AC_CONFIG_FILES(tests/hmc/Makefile) | AC_CONFIG_FILES(tests/hmc/Makefile) | ||||||
| AC_CONFIG_FILES(tests/solver/Makefile) | AC_CONFIG_FILES(tests/solver/Makefile) | ||||||
|  | AC_CONFIG_FILES(tests/lanczos/Makefile) | ||||||
|  | AC_CONFIG_FILES(tests/smearing/Makefile) | ||||||
| AC_CONFIG_FILES(tests/qdpxx/Makefile) | AC_CONFIG_FILES(tests/qdpxx/Makefile) | ||||||
| AC_CONFIG_FILES(tests/testu01/Makefile) | AC_CONFIG_FILES(tests/testu01/Makefile) | ||||||
| AC_CONFIG_FILES(benchmarks/Makefile) | AC_CONFIG_FILES(benchmarks/Makefile) | ||||||
| @@ -420,36 +543,7 @@ AC_CONFIG_FILES(extras/Makefile) | |||||||
| AC_CONFIG_FILES(extras/Hadrons/Makefile) | AC_CONFIG_FILES(extras/Hadrons/Makefile) | ||||||
| AC_OUTPUT | AC_OUTPUT | ||||||
|  |  | ||||||
| echo "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | echo "" | ||||||
| Summary of configuration for $PACKAGE v$VERSION | cat grid.configure.summary | ||||||
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | echo "" | ||||||
|  |  | ||||||
| ----- PLATFORM ---------------------------------------- |  | ||||||
| architecture (build)        : $build_cpu |  | ||||||
| os (build)                  : $build_os |  | ||||||
| architecture (target)       : $target_cpu |  | ||||||
| os (target)                 : $target_os |  | ||||||
| compiler vendor             : ${ax_cv_cxx_compiler_vendor} |  | ||||||
| compiler version            : ${ax_cv_gxx_version} |  | ||||||
| ----- BUILD OPTIONS ----------------------------------- |  | ||||||
| SIMD                        : ${ac_SIMD}${SIMD_GEN_WIDTH_MSG} |  | ||||||
| Threading                   : ${ac_openmp}  |  | ||||||
| Communications type         : ${comms_type} |  | ||||||
| Default precision           : ${ac_PRECISION} |  | ||||||
| RNG choice                  : ${ac_RNG}  |  | ||||||
| GMP                         : `if test "x$have_gmp" = xtrue; then echo yes; else echo no; fi` |  | ||||||
| LAPACK                      : ${ac_LAPACK} |  | ||||||
| FFTW                        : `if test "x$have_fftw" = xtrue; then echo yes; else echo no; fi` |  | ||||||
| HDF5                        : `if test "x$have_hdf5" = xtrue; then echo yes; else echo no; fi` |  | ||||||
| build DOXYGEN documentation : `if test "$DX_FLAG_doc" = '1'; then echo yes; else echo no; fi` |  | ||||||
| ----- BUILD FLAGS ------------------------------------- |  | ||||||
| CXXFLAGS: |  | ||||||
| `echo ${AM_CXXFLAGS} ${CXXFLAGS} | tr ' ' '\n' | sed 's/^-/    -/g'` |  | ||||||
| LDFLAGS: |  | ||||||
| `echo ${AM_LDFLAGS} ${LDFLAGS} | tr ' ' '\n' | sed 's/^-/    -/g'` |  | ||||||
| LIBS: |  | ||||||
| `echo ${LIBS} | tr ' ' '\n' | sed 's/^-/    -/g'` |  | ||||||
| -------------------------------------------------------" > config.summary |  | ||||||
| echo "" |  | ||||||
| cat config.summary |  | ||||||
| echo "" |  | ||||||
|   | |||||||
| @@ -4,8 +4,7 @@ Grid physics library, www.github.com/paboyle/Grid | |||||||
|  |  | ||||||
| Source file: extras/Hadrons/Application.cc | Source file: extras/Hadrons/Application.cc | ||||||
|  |  | ||||||
| Copyright (C) 2015 | Copyright (C) 2015-2018 | ||||||
| Copyright (C) 2016 |  | ||||||
|  |  | ||||||
| Author: Antonin Portelli <antonin.portelli@me.com> | Author: Antonin Portelli <antonin.portelli@me.com> | ||||||
|  |  | ||||||
| @@ -43,6 +42,7 @@ using namespace Hadrons; | |||||||
| // constructors //////////////////////////////////////////////////////////////// | // constructors //////////////////////////////////////////////////////////////// | ||||||
| Application::Application(void) | Application::Application(void) | ||||||
| { | { | ||||||
|  |     initLogger(); | ||||||
|     LOG(Message) << "Modules available:" << std::endl; |     LOG(Message) << "Modules available:" << std::endl; | ||||||
|     auto list = ModuleFactory::getInstance().getBuilderList(); |     auto list = ModuleFactory::getInstance().getBuilderList(); | ||||||
|     for (auto &m: list) |     for (auto &m: list) | ||||||
| @@ -73,12 +73,6 @@ Application::Application(const std::string parameterFileName) | |||||||
|     parameterFileName_ = parameterFileName; |     parameterFileName_ = parameterFileName; | ||||||
| } | } | ||||||
|  |  | ||||||
| // environment shortcut //////////////////////////////////////////////////////// |  | ||||||
| Environment & Application::env(void) const |  | ||||||
| { |  | ||||||
|     return Environment::getInstance(); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // access ////////////////////////////////////////////////////////////////////// | // access ////////////////////////////////////////////////////////////////////// | ||||||
| void Application::setPar(const Application::GlobalPar &par) | void Application::setPar(const Application::GlobalPar &par) | ||||||
| { | { | ||||||
| @@ -94,14 +88,13 @@ const Application::GlobalPar & Application::getPar(void) | |||||||
| // execute ///////////////////////////////////////////////////////////////////// | // execute ///////////////////////////////////////////////////////////////////// | ||||||
| void Application::run(void) | void Application::run(void) | ||||||
| { | { | ||||||
|     if (!parameterFileName_.empty() and (env().getNModule() == 0)) |     if (!parameterFileName_.empty() and (vm().getNModule() == 0)) | ||||||
|     { |     { | ||||||
|         parseParameterFile(parameterFileName_); |         parseParameterFile(parameterFileName_); | ||||||
|     } |     } | ||||||
|     if (!scheduled_) |     vm().printContent(); | ||||||
|     { |     env().printContent(); | ||||||
|         schedule(); |     schedule(); | ||||||
|     } |  | ||||||
|     printSchedule(); |     printSchedule(); | ||||||
|     configLoop(); |     configLoop(); | ||||||
| } | } | ||||||
| @@ -124,12 +117,20 @@ void Application::parseParameterFile(const std::string parameterFileName) | |||||||
|     LOG(Message) << "Building application from '" << parameterFileName << "'..." << std::endl; |     LOG(Message) << "Building application from '" << parameterFileName << "'..." << std::endl; | ||||||
|     read(reader, "parameters", par); |     read(reader, "parameters", par); | ||||||
|     setPar(par); |     setPar(par); | ||||||
|     push(reader, "modules"); |     if (!push(reader, "modules")) | ||||||
|     push(reader, "module"); |     { | ||||||
|  |         HADRON_ERROR(Parsing, "Cannot open node 'modules' in parameter file '"  | ||||||
|  |                               + parameterFileName + "'"); | ||||||
|  |     } | ||||||
|  |     if (!push(reader, "module")) | ||||||
|  |     { | ||||||
|  |         HADRON_ERROR(Parsing, "Cannot open node 'modules/module' in parameter file '"  | ||||||
|  |                               + parameterFileName + "'"); | ||||||
|  |     } | ||||||
|     do |     do | ||||||
|     { |     { | ||||||
|         read(reader, "id", id); |         read(reader, "id", id); | ||||||
|         env().createModule(id.name, id.type, reader); |         vm().createModule(id.name, id.type, reader); | ||||||
|     } while (reader.nextElement("module")); |     } while (reader.nextElement("module")); | ||||||
|     pop(reader); |     pop(reader); | ||||||
|     pop(reader); |     pop(reader); | ||||||
| @@ -139,7 +140,7 @@ void Application::saveParameterFile(const std::string parameterFileName) | |||||||
| { | { | ||||||
|     XmlWriter          writer(parameterFileName); |     XmlWriter          writer(parameterFileName); | ||||||
|     ObjectId           id; |     ObjectId           id; | ||||||
|     const unsigned int nMod = env().getNModule(); |     const unsigned int nMod = vm().getNModule(); | ||||||
|      |      | ||||||
|     LOG(Message) << "Saving application to '" << parameterFileName << "'..." << std::endl; |     LOG(Message) << "Saving application to '" << parameterFileName << "'..." << std::endl; | ||||||
|     write(writer, "parameters", getPar()); |     write(writer, "parameters", getPar()); | ||||||
| @@ -147,10 +148,10 @@ void Application::saveParameterFile(const std::string parameterFileName) | |||||||
|     for (unsigned int i = 0; i < nMod; ++i) |     for (unsigned int i = 0; i < nMod; ++i) | ||||||
|     { |     { | ||||||
|         push(writer, "module"); |         push(writer, "module"); | ||||||
|         id.name = env().getModuleName(i); |         id.name = vm().getModuleName(i); | ||||||
|         id.type = env().getModule(i)->getRegisteredName(); |         id.type = vm().getModule(i)->getRegisteredName(); | ||||||
|         write(writer, "id", id); |         write(writer, "id", id); | ||||||
|         env().getModule(i)->saveParameters(writer, "options"); |         vm().getModule(i)->saveParameters(writer, "options"); | ||||||
|         pop(writer); |         pop(writer); | ||||||
|     } |     } | ||||||
|     pop(writer); |     pop(writer); | ||||||
| @@ -158,94 +159,13 @@ void Application::saveParameterFile(const std::string parameterFileName) | |||||||
| } | } | ||||||
|  |  | ||||||
| // schedule computation //////////////////////////////////////////////////////// | // schedule computation //////////////////////////////////////////////////////// | ||||||
| #define MEM_MSG(size)\ |  | ||||||
| sizeString((size)*locVol_) << " (" << sizeString(size)  << "/site)" |  | ||||||
|  |  | ||||||
| #define DEFINE_MEMPEAK \ |  | ||||||
| auto memPeak = [this](const std::vector<unsigned int> &program)\ |  | ||||||
| {\ |  | ||||||
|     unsigned int memPeak;\ |  | ||||||
|     bool         msg;\ |  | ||||||
|     \ |  | ||||||
|     msg = HadronsLogMessage.isActive();\ |  | ||||||
|     HadronsLogMessage.Active(false);\ |  | ||||||
|     env().dryRun(true);\ |  | ||||||
|     memPeak = env().executeProgram(program);\ |  | ||||||
|     env().dryRun(false);\ |  | ||||||
|     env().freeAll();\ |  | ||||||
|     HadronsLogMessage.Active(true);\ |  | ||||||
|     \ |  | ||||||
|     return memPeak;\ |  | ||||||
| } |  | ||||||
|  |  | ||||||
| void Application::schedule(void) | void Application::schedule(void) | ||||||
| { | { | ||||||
|     DEFINE_MEMPEAK; |     if (!scheduled_ and !loadedSchedule_) | ||||||
|      |  | ||||||
|     // build module dependency graph |  | ||||||
|     LOG(Message) << "Building module graph..." << std::endl; |  | ||||||
|     auto graph = env().makeModuleGraph(); |  | ||||||
|     auto con = graph.getConnectedComponents(); |  | ||||||
|      |  | ||||||
|     // constrained topological sort using a genetic algorithm |  | ||||||
|     LOG(Message) << "Scheduling computation..." << std::endl; |  | ||||||
|     LOG(Message) << "               #module= " << graph.size() << std::endl; |  | ||||||
|     LOG(Message) << "       population size= " << par_.genetic.popSize << std::endl; |  | ||||||
|     LOG(Message) << "       max. generation= " << par_.genetic.maxGen << std::endl; |  | ||||||
|     LOG(Message) << "  max. cst. generation= " << par_.genetic.maxCstGen << std::endl; |  | ||||||
|     LOG(Message) << "         mutation rate= " << par_.genetic.mutationRate << std::endl; |  | ||||||
|      |  | ||||||
|     unsigned int                               k = 0, gen, prevPeak, nCstPeak = 0; |  | ||||||
|     std::random_device                         rd; |  | ||||||
|     GeneticScheduler<unsigned int>::Parameters par; |  | ||||||
|      |  | ||||||
|     par.popSize      = par_.genetic.popSize; |  | ||||||
|     par.mutationRate = par_.genetic.mutationRate; |  | ||||||
|     par.seed         = rd(); |  | ||||||
|     memPeak_         = 0; |  | ||||||
|     CartesianCommunicator::BroadcastWorld(0, &(par.seed), sizeof(par.seed)); |  | ||||||
|     for (unsigned int i = 0; i < con.size(); ++i) |  | ||||||
|     { |     { | ||||||
|         GeneticScheduler<unsigned int> scheduler(con[i], memPeak, par); |         program_   = vm().schedule(par_.genetic); | ||||||
|          |         scheduled_ = true; | ||||||
|         gen = 0; |  | ||||||
|         do |  | ||||||
|         { |  | ||||||
|             LOG(Debug) << "Generation " << gen << ":" << std::endl; |  | ||||||
|             scheduler.nextGeneration(); |  | ||||||
|             if (gen != 0) |  | ||||||
|             { |  | ||||||
|                 if (prevPeak == scheduler.getMinValue()) |  | ||||||
|                 { |  | ||||||
|                     nCstPeak++; |  | ||||||
|                 } |  | ||||||
|                 else |  | ||||||
|                 { |  | ||||||
|                     nCstPeak = 0; |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|              |  | ||||||
|             prevPeak = scheduler.getMinValue(); |  | ||||||
|             if (gen % 10 == 0) |  | ||||||
|             { |  | ||||||
|                 LOG(Iterative) << "Generation " << gen << ": " |  | ||||||
|                                << MEM_MSG(scheduler.getMinValue()) << std::endl; |  | ||||||
|             } |  | ||||||
|              |  | ||||||
|             gen++; |  | ||||||
|         } while ((gen < par_.genetic.maxGen) |  | ||||||
|                  and (nCstPeak < par_.genetic.maxCstGen)); |  | ||||||
|         auto &t = scheduler.getMinSchedule(); |  | ||||||
|         if (scheduler.getMinValue() > memPeak_) |  | ||||||
|         { |  | ||||||
|             memPeak_ = scheduler.getMinValue(); |  | ||||||
|         } |  | ||||||
|         for (unsigned int j = 0; j < t.size(); ++j) |  | ||||||
|         { |  | ||||||
|             program_.push_back(t[j]); |  | ||||||
|         } |  | ||||||
|     } |     } | ||||||
|     scheduled_ = true; |  | ||||||
| } | } | ||||||
|  |  | ||||||
| void Application::saveSchedule(const std::string filename) | void Application::saveSchedule(const std::string filename) | ||||||
| @@ -255,21 +175,19 @@ void Application::saveSchedule(const std::string filename) | |||||||
|      |      | ||||||
|     if (!scheduled_) |     if (!scheduled_) | ||||||
|     { |     { | ||||||
|         HADRON_ERROR("Computation not scheduled"); |         HADRON_ERROR(Definition, "Computation not scheduled"); | ||||||
|     } |     } | ||||||
|     LOG(Message) << "Saving current schedule to '" << filename << "'..." |     LOG(Message) << "Saving current schedule to '" << filename << "'..." | ||||||
|                  << std::endl; |                  << std::endl; | ||||||
|     for (auto address: program_) |     for (auto address: program_) | ||||||
|     { |     { | ||||||
|         program.push_back(env().getModuleName(address)); |         program.push_back(vm().getModuleName(address)); | ||||||
|     } |     } | ||||||
|     write(writer, "schedule", program); |     write(writer, "schedule", program); | ||||||
| } | } | ||||||
|  |  | ||||||
| void Application::loadSchedule(const std::string filename) | void Application::loadSchedule(const std::string filename) | ||||||
| { | { | ||||||
|     DEFINE_MEMPEAK; |  | ||||||
|      |  | ||||||
|     TextReader               reader(filename); |     TextReader               reader(filename); | ||||||
|     std::vector<std::string> program; |     std::vector<std::string> program; | ||||||
|      |      | ||||||
| @@ -279,24 +197,24 @@ void Application::loadSchedule(const std::string filename) | |||||||
|     program_.clear(); |     program_.clear(); | ||||||
|     for (auto &name: program) |     for (auto &name: program) | ||||||
|     { |     { | ||||||
|         program_.push_back(env().getModuleAddress(name)); |         program_.push_back(vm().getModuleAddress(name)); | ||||||
|     } |     } | ||||||
|     scheduled_ = true; |     loadedSchedule_ = true; | ||||||
|     memPeak_   = memPeak(program_); |  | ||||||
| } | } | ||||||
|  |  | ||||||
| void Application::printSchedule(void) | void Application::printSchedule(void) | ||||||
| { | { | ||||||
|     if (!scheduled_) |     if (!scheduled_) | ||||||
|     { |     { | ||||||
|         HADRON_ERROR("Computation not scheduled"); |         HADRON_ERROR(Definition, "Computation not scheduled"); | ||||||
|     } |     } | ||||||
|     LOG(Message) << "Schedule (memory peak: " << MEM_MSG(memPeak_) << "):" |     auto peak = vm().memoryNeeded(program_); | ||||||
|  |     LOG(Message) << "Schedule (memory needed: " << sizeString(peak) << "):" | ||||||
|                  << std::endl; |                  << std::endl; | ||||||
|     for (unsigned int i = 0; i < program_.size(); ++i) |     for (unsigned int i = 0; i < program_.size(); ++i) | ||||||
|     { |     { | ||||||
|         LOG(Message) << std::setw(4) << i + 1 << ": " |         LOG(Message) << std::setw(4) << i + 1 << ": " | ||||||
|                      << env().getModuleName(program_[i]) << std::endl; |                      << vm().getModuleName(program_[i]) << std::endl; | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -309,8 +227,8 @@ void Application::configLoop(void) | |||||||
|     { |     { | ||||||
|         LOG(Message) << BIG_SEP << " Starting measurement for trajectory " << t |         LOG(Message) << BIG_SEP << " Starting measurement for trajectory " << t | ||||||
|                      << " " << BIG_SEP << std::endl; |                      << " " << BIG_SEP << std::endl; | ||||||
|         env().setTrajectory(t); |         vm().setTrajectory(t); | ||||||
|         env().executeProgram(program_); |         vm().executeProgram(program_); | ||||||
|     } |     } | ||||||
|     LOG(Message) << BIG_SEP << " End of measurement " << BIG_SEP << std::endl; |     LOG(Message) << BIG_SEP << " End of measurement " << BIG_SEP << std::endl; | ||||||
|     env().freeAll(); |     env().freeAll(); | ||||||
|   | |||||||
| @@ -4,8 +4,7 @@ Grid physics library, www.github.com/paboyle/Grid | |||||||
|  |  | ||||||
| Source file: extras/Hadrons/Application.hpp | Source file: extras/Hadrons/Application.hpp | ||||||
|  |  | ||||||
| Copyright (C) 2015 | Copyright (C) 2015-2018 | ||||||
| Copyright (C) 2016 |  | ||||||
|  |  | ||||||
| Author: Antonin Portelli <antonin.portelli@me.com> | Author: Antonin Portelli <antonin.portelli@me.com> | ||||||
|  |  | ||||||
| @@ -31,8 +30,7 @@ See the full license in the file "LICENSE" in the top level distribution directo | |||||||
| #define Hadrons_Application_hpp_ | #define Hadrons_Application_hpp_ | ||||||
|  |  | ||||||
| #include <Grid/Hadrons/Global.hpp> | #include <Grid/Hadrons/Global.hpp> | ||||||
| #include <Grid/Hadrons/Environment.hpp> | #include <Grid/Hadrons/VirtualMachine.hpp> | ||||||
| #include <Grid/Hadrons/ModuleFactory.hpp> |  | ||||||
| #include <Grid/Hadrons/Modules.hpp> | #include <Grid/Hadrons/Modules.hpp> | ||||||
|  |  | ||||||
| BEGIN_HADRONS_NAMESPACE | BEGIN_HADRONS_NAMESPACE | ||||||
| @@ -51,25 +49,13 @@ public: | |||||||
|                                         unsigned int, end, |                                         unsigned int, end, | ||||||
|                                         unsigned int, step); |                                         unsigned int, step); | ||||||
|     }; |     }; | ||||||
|     class GeneticPar: Serializable |  | ||||||
|     { |  | ||||||
|     public: |  | ||||||
|         GeneticPar(void): |  | ||||||
|             popSize{20}, maxGen{1000}, maxCstGen{100}, mutationRate{.1} {}; |  | ||||||
|     public: |  | ||||||
|         GRID_SERIALIZABLE_CLASS_MEMBERS(GeneticPar, |  | ||||||
|                                         unsigned int, popSize, |  | ||||||
|                                         unsigned int, maxGen, |  | ||||||
|                                         unsigned int, maxCstGen, |  | ||||||
|                                         double      , mutationRate); |  | ||||||
|     }; |  | ||||||
|     class GlobalPar: Serializable |     class GlobalPar: Serializable | ||||||
|     { |     { | ||||||
|     public: |     public: | ||||||
|         GRID_SERIALIZABLE_CLASS_MEMBERS(GlobalPar, |         GRID_SERIALIZABLE_CLASS_MEMBERS(GlobalPar, | ||||||
|                                         TrajRange,   trajCounter, |                                         TrajRange,                  trajCounter, | ||||||
|                                         GeneticPar,  genetic, |                                         VirtualMachine::GeneticPar, genetic, | ||||||
|                                         std::string, seed); |                                         std::string,                seed); | ||||||
|     }; |     }; | ||||||
| public: | public: | ||||||
|     // constructors |     // constructors | ||||||
| @@ -100,14 +86,15 @@ public: | |||||||
|     void configLoop(void); |     void configLoop(void); | ||||||
| private: | private: | ||||||
|     // environment shortcut |     // environment shortcut | ||||||
|     Environment & env(void) const; |     DEFINE_ENV_ALIAS; | ||||||
|  |     // virtual machine shortcut | ||||||
|  |     DEFINE_VM_ALIAS; | ||||||
| private: | private: | ||||||
|     long unsigned int         locVol_; |     long unsigned int       locVol_; | ||||||
|     std::string               parameterFileName_{""}; |     std::string             parameterFileName_{""}; | ||||||
|     GlobalPar                 par_; |     GlobalPar               par_; | ||||||
|     std::vector<unsigned int> program_; |     VirtualMachine::Program program_; | ||||||
|     Environment::Size         memPeak_; |     bool                    scheduled_{false}, loadedSchedule_{false}; | ||||||
|     bool                      scheduled_{false}; |  | ||||||
| }; | }; | ||||||
|  |  | ||||||
| /****************************************************************************** | /****************************************************************************** | ||||||
| @@ -117,14 +104,16 @@ private: | |||||||
| template <typename M> | template <typename M> | ||||||
| void Application::createModule(const std::string name) | void Application::createModule(const std::string name) | ||||||
| { | { | ||||||
|     env().createModule<M>(name); |     vm().createModule<M>(name); | ||||||
|  |     scheduled_ = false; | ||||||
| } | } | ||||||
|  |  | ||||||
| template <typename M> | template <typename M> | ||||||
| void Application::createModule(const std::string name, | void Application::createModule(const std::string name, | ||||||
|                                const typename M::Par &par) |                                const typename M::Par &par) | ||||||
| { | { | ||||||
|     env().createModule<M>(name, par); |     vm().createModule<M>(name, par); | ||||||
|  |     scheduled_ = false; | ||||||
| } | } | ||||||
|  |  | ||||||
| END_HADRONS_NAMESPACE | END_HADRONS_NAMESPACE | ||||||
|   | |||||||
| @@ -4,8 +4,7 @@ Grid physics library, www.github.com/paboyle/Grid | |||||||
|  |  | ||||||
| Source file: extras/Hadrons/Environment.cc | Source file: extras/Hadrons/Environment.cc | ||||||
|  |  | ||||||
| Copyright (C) 2015 | Copyright (C) 2015-2018 | ||||||
| Copyright (C) 2016 |  | ||||||
|  |  | ||||||
| Author: Antonin Portelli <antonin.portelli@me.com> | Author: Antonin Portelli <antonin.portelli@me.com> | ||||||
|  |  | ||||||
| @@ -35,15 +34,19 @@ using namespace Grid; | |||||||
| using namespace QCD; | using namespace QCD; | ||||||
| using namespace Hadrons; | using namespace Hadrons; | ||||||
|  |  | ||||||
|  | #define ERROR_NO_ADDRESS(address)\ | ||||||
|  | HADRON_ERROR(Definition, "no object with address " + std::to_string(address)); | ||||||
|  |  | ||||||
| /****************************************************************************** | /****************************************************************************** | ||||||
|  *                       Environment implementation                           * |  *                       Environment implementation                           * | ||||||
|  ******************************************************************************/ |  ******************************************************************************/ | ||||||
| // constructor ///////////////////////////////////////////////////////////////// | // constructor ///////////////////////////////////////////////////////////////// | ||||||
| Environment::Environment(void) | Environment::Environment(void) | ||||||
| { | { | ||||||
|     nd_ = GridDefaultLatt().size(); |     dim_ = GridDefaultLatt(); | ||||||
|  |     nd_  = dim_.size(); | ||||||
|     grid4d_.reset(SpaceTimeGrid::makeFourDimGrid( |     grid4d_.reset(SpaceTimeGrid::makeFourDimGrid( | ||||||
|         GridDefaultLatt(), GridDefaultSimd(nd_, vComplex::Nsimd()), |         dim_, GridDefaultSimd(nd_, vComplex::Nsimd()), | ||||||
|         GridDefaultMpi())); |         GridDefaultMpi())); | ||||||
|     gridRb4d_.reset(SpaceTimeGrid::makeFourDimRedBlackGrid(grid4d_.get())); |     gridRb4d_.reset(SpaceTimeGrid::makeFourDimRedBlackGrid(grid4d_.get())); | ||||||
|     auto loc = getGrid()->LocalDimensions(); |     auto loc = getGrid()->LocalDimensions(); | ||||||
| @@ -55,28 +58,6 @@ Environment::Environment(void) | |||||||
|     rng4d_.reset(new GridParallelRNG(grid4d_.get())); |     rng4d_.reset(new GridParallelRNG(grid4d_.get())); | ||||||
| } | } | ||||||
|  |  | ||||||
| // dry run ///////////////////////////////////////////////////////////////////// |  | ||||||
| void Environment::dryRun(const bool isDry) |  | ||||||
| { |  | ||||||
|     dryRun_ = isDry; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| bool Environment::isDryRun(void) const |  | ||||||
| { |  | ||||||
|     return dryRun_; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // trajectory number /////////////////////////////////////////////////////////// |  | ||||||
| void Environment::setTrajectory(const unsigned int traj) |  | ||||||
| { |  | ||||||
|     traj_ = traj; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| unsigned int Environment::getTrajectory(void) const |  | ||||||
| { |  | ||||||
|     return traj_; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // grids /////////////////////////////////////////////////////////////////////// | // grids /////////////////////////////////////////////////////////////////////// | ||||||
| void Environment::createGrid(const unsigned int Ls) | void Environment::createGrid(const unsigned int Ls) | ||||||
| { | { | ||||||
| @@ -104,7 +85,7 @@ GridCartesian * Environment::getGrid(const unsigned int Ls) const | |||||||
|     } |     } | ||||||
|     catch(std::out_of_range &) |     catch(std::out_of_range &) | ||||||
|     { |     { | ||||||
|         HADRON_ERROR("no grid with Ls= " << Ls); |         HADRON_ERROR(Definition, "no grid with Ls= " + std::to_string(Ls)); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -123,7 +104,7 @@ GridRedBlackCartesian * Environment::getRbGrid(const unsigned int Ls) const | |||||||
|     } |     } | ||||||
|     catch(std::out_of_range &) |     catch(std::out_of_range &) | ||||||
|     { |     { | ||||||
|         HADRON_ERROR("no red-black 5D grid with Ls= " << Ls); |         HADRON_ERROR(Definition, "no red-black 5D grid with Ls= " + std::to_string(Ls)); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -132,6 +113,21 @@ unsigned int Environment::getNd(void) const | |||||||
|     return nd_; |     return nd_; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | std::vector<int> Environment::getDim(void) const | ||||||
|  | { | ||||||
|  |     return dim_; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | int Environment::getDim(const unsigned int mu) const | ||||||
|  | { | ||||||
|  |     return dim_[mu]; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | unsigned long int Environment::getLocalVolume(void) const | ||||||
|  | { | ||||||
|  |     return locVol_; | ||||||
|  | } | ||||||
|  |  | ||||||
| // random number generator ///////////////////////////////////////////////////// | // random number generator ///////////////////////////////////////////////////// | ||||||
| void Environment::setSeed(const std::vector<int> &seed) | void Environment::setSeed(const std::vector<int> &seed) | ||||||
| { | { | ||||||
| @@ -143,276 +139,6 @@ GridParallelRNG * Environment::get4dRng(void) const | |||||||
|     return rng4d_.get(); |     return rng4d_.get(); | ||||||
| } | } | ||||||
|  |  | ||||||
| // module management /////////////////////////////////////////////////////////// |  | ||||||
| void Environment::pushModule(Environment::ModPt &pt) |  | ||||||
| { |  | ||||||
|     std::string name = pt->getName(); |  | ||||||
|      |  | ||||||
|     if (!hasModule(name)) |  | ||||||
|     { |  | ||||||
|         std::vector<unsigned int> inputAddress; |  | ||||||
|         unsigned int              address; |  | ||||||
|         ModuleInfo                m; |  | ||||||
|          |  | ||||||
|         m.data = std::move(pt); |  | ||||||
|         m.type = typeIdPt(*m.data.get()); |  | ||||||
|         m.name = name; |  | ||||||
|         auto input  = m.data->getInput(); |  | ||||||
|         for (auto &in: input) |  | ||||||
|         { |  | ||||||
|             if (!hasObject(in)) |  | ||||||
|             { |  | ||||||
|                 addObject(in , -1); |  | ||||||
|             } |  | ||||||
|             m.input.push_back(objectAddress_[in]); |  | ||||||
|         } |  | ||||||
|         auto output = m.data->getOutput(); |  | ||||||
|         module_.push_back(std::move(m)); |  | ||||||
|         address              = static_cast<unsigned int>(module_.size() - 1); |  | ||||||
|         moduleAddress_[name] = address; |  | ||||||
|         for (auto &out: output) |  | ||||||
|         { |  | ||||||
|             if (!hasObject(out)) |  | ||||||
|             { |  | ||||||
|                 addObject(out, address); |  | ||||||
|             } |  | ||||||
|             else |  | ||||||
|             { |  | ||||||
|                 if (object_[objectAddress_[out]].module < 0) |  | ||||||
|                 { |  | ||||||
|                     object_[objectAddress_[out]].module = address; |  | ||||||
|                 } |  | ||||||
|                 else |  | ||||||
|                 { |  | ||||||
|                     HADRON_ERROR("object '" + out |  | ||||||
|                                  + "' is already produced by module '" |  | ||||||
|                                  + module_[object_[getObjectAddress(out)].module].name |  | ||||||
|                                  + "' (while pushing module '" + name + "')"); |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|     else |  | ||||||
|     { |  | ||||||
|         HADRON_ERROR("module '" + name + "' already exists"); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| unsigned int Environment::getNModule(void) const |  | ||||||
| { |  | ||||||
|     return module_.size(); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| void Environment::createModule(const std::string name, const std::string type, |  | ||||||
|                                XmlReader &reader) |  | ||||||
| { |  | ||||||
|     auto &factory = ModuleFactory::getInstance(); |  | ||||||
|     auto pt       = factory.create(type, name); |  | ||||||
|      |  | ||||||
|     pt->parseParameters(reader, "options"); |  | ||||||
|     pushModule(pt); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| ModuleBase * Environment::getModule(const unsigned int address) const |  | ||||||
| { |  | ||||||
|     if (hasModule(address)) |  | ||||||
|     { |  | ||||||
|         return module_[address].data.get(); |  | ||||||
|     } |  | ||||||
|     else |  | ||||||
|     { |  | ||||||
|         HADRON_ERROR("no module with address " + std::to_string(address)); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| ModuleBase * Environment::getModule(const std::string name) const |  | ||||||
| { |  | ||||||
|     return getModule(getModuleAddress(name)); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| unsigned int Environment::getModuleAddress(const std::string name) const |  | ||||||
| { |  | ||||||
|     if (hasModule(name)) |  | ||||||
|     { |  | ||||||
|         return moduleAddress_.at(name); |  | ||||||
|     } |  | ||||||
|     else |  | ||||||
|     { |  | ||||||
|         HADRON_ERROR("no module with name '" + name + "'"); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| std::string Environment::getModuleName(const unsigned int address) const |  | ||||||
| { |  | ||||||
|     if (hasModule(address)) |  | ||||||
|     { |  | ||||||
|         return module_[address].name; |  | ||||||
|     } |  | ||||||
|     else |  | ||||||
|     { |  | ||||||
|         HADRON_ERROR("no module with address " + std::to_string(address)); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| std::string Environment::getModuleType(const unsigned int address) const |  | ||||||
| { |  | ||||||
|     if (hasModule(address)) |  | ||||||
|     { |  | ||||||
|         return typeName(module_[address].type); |  | ||||||
|     } |  | ||||||
|     else |  | ||||||
|     { |  | ||||||
|         HADRON_ERROR("no module with address " + std::to_string(address)); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| std::string Environment::getModuleType(const std::string name) const |  | ||||||
| { |  | ||||||
|     return getModuleType(getModuleAddress(name)); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| bool Environment::hasModule(const unsigned int address) const |  | ||||||
| { |  | ||||||
|     return (address < module_.size()); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| bool Environment::hasModule(const std::string name) const |  | ||||||
| { |  | ||||||
|     return (moduleAddress_.find(name) != moduleAddress_.end()); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| Graph<unsigned int> Environment::makeModuleGraph(void) const |  | ||||||
| { |  | ||||||
|     Graph<unsigned int> moduleGraph; |  | ||||||
|      |  | ||||||
|     for (unsigned int i = 0; i < module_.size(); ++i) |  | ||||||
|     { |  | ||||||
|         moduleGraph.addVertex(i); |  | ||||||
|         for (auto &j: module_[i].input) |  | ||||||
|         { |  | ||||||
|             moduleGraph.addEdge(object_[j].module, i); |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|      |  | ||||||
|     return moduleGraph; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| #define BIG_SEP "===============" |  | ||||||
| #define SEP     "---------------" |  | ||||||
| #define MEM_MSG(size)\ |  | ||||||
| sizeString((size)*locVol_) << " (" << sizeString(size)  << "/site)" |  | ||||||
|  |  | ||||||
| Environment::Size |  | ||||||
| Environment::executeProgram(const std::vector<unsigned int> &p) |  | ||||||
| { |  | ||||||
|     Size                                memPeak = 0, sizeBefore, sizeAfter; |  | ||||||
|     std::vector<std::set<unsigned int>> freeProg; |  | ||||||
|     bool                                continueCollect, nothingFreed; |  | ||||||
|      |  | ||||||
|     // build garbage collection schedule |  | ||||||
|     freeProg.resize(p.size()); |  | ||||||
|     for (unsigned int i = 0; i < object_.size(); ++i) |  | ||||||
|     { |  | ||||||
|         auto pred = [i, this](const unsigned int j) |  | ||||||
|         { |  | ||||||
|             auto &in = module_[j].input; |  | ||||||
|             auto it  = std::find(in.begin(), in.end(), i); |  | ||||||
|              |  | ||||||
|             return (it != in.end()) or (j == object_[i].module); |  | ||||||
|         }; |  | ||||||
|         auto it = std::find_if(p.rbegin(), p.rend(), pred); |  | ||||||
|         if (it != p.rend()) |  | ||||||
|         { |  | ||||||
|             freeProg[p.rend() - it - 1].insert(i); |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|      |  | ||||||
|     // program execution |  | ||||||
|     for (unsigned int i = 0; i < p.size(); ++i) |  | ||||||
|     { |  | ||||||
|         // execute module |  | ||||||
|         if (!isDryRun()) |  | ||||||
|         { |  | ||||||
|             LOG(Message) << SEP << " Measurement step " << i+1 << "/" |  | ||||||
|                          << p.size() << " (module '" << module_[p[i]].name |  | ||||||
|                          << "') " << SEP << std::endl; |  | ||||||
|         } |  | ||||||
|         (*module_[p[i]].data)(); |  | ||||||
|         sizeBefore = getTotalSize(); |  | ||||||
|         // print used memory after execution |  | ||||||
|         if (!isDryRun()) |  | ||||||
|         { |  | ||||||
|             LOG(Message) << "Allocated objects: " << MEM_MSG(sizeBefore) |  | ||||||
|                          << std::endl; |  | ||||||
|         } |  | ||||||
|         if (sizeBefore > memPeak) |  | ||||||
|         { |  | ||||||
|             memPeak = sizeBefore; |  | ||||||
|         } |  | ||||||
|         // garbage collection for step i |  | ||||||
|         if (!isDryRun()) |  | ||||||
|         { |  | ||||||
|             LOG(Message) << "Garbage collection..." << std::endl; |  | ||||||
|         } |  | ||||||
|         nothingFreed = true; |  | ||||||
|         do |  | ||||||
|         { |  | ||||||
|             continueCollect = false; |  | ||||||
|             auto toFree = freeProg[i]; |  | ||||||
|             for (auto &j: toFree) |  | ||||||
|             { |  | ||||||
|                 // continue garbage collection while there are still |  | ||||||
|                 // objects without owners |  | ||||||
|                 continueCollect = continueCollect or !hasOwners(j); |  | ||||||
|                 if(freeObject(j)) |  | ||||||
|                 { |  | ||||||
|                     // if an object has been freed, remove it from |  | ||||||
|                     // the garbage collection schedule |  | ||||||
|                     freeProg[i].erase(j); |  | ||||||
|                     nothingFreed = false; |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|         } while (continueCollect); |  | ||||||
|         // any remaining objects in step i garbage collection schedule |  | ||||||
|         // is scheduled for step i + 1 |  | ||||||
|         if (i + 1 < p.size()) |  | ||||||
|         { |  | ||||||
|             for (auto &j: freeProg[i]) |  | ||||||
|             { |  | ||||||
|                 freeProg[i + 1].insert(j); |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|         // print used memory after garbage collection if necessary |  | ||||||
|         if (!isDryRun()) |  | ||||||
|         { |  | ||||||
|             sizeAfter = getTotalSize(); |  | ||||||
|             if (sizeBefore != sizeAfter) |  | ||||||
|             { |  | ||||||
|                 LOG(Message) << "Allocated objects: " << MEM_MSG(sizeAfter) |  | ||||||
|                              << std::endl; |  | ||||||
|             } |  | ||||||
|             else |  | ||||||
|             { |  | ||||||
|                 LOG(Message) << "Nothing to free" << std::endl; |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|      |  | ||||||
|     return memPeak; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| Environment::Size Environment::executeProgram(const std::vector<std::string> &p) |  | ||||||
| { |  | ||||||
|     std::vector<unsigned int> pAddress; |  | ||||||
|      |  | ||||||
|     for (auto &n: p) |  | ||||||
|     { |  | ||||||
|         pAddress.push_back(getModuleAddress(n)); |  | ||||||
|     } |  | ||||||
|      |  | ||||||
|     return executeProgram(pAddress); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // general memory management /////////////////////////////////////////////////// | // general memory management /////////////////////////////////////////////////// | ||||||
| void Environment::addObject(const std::string name, const int moduleAddress) | void Environment::addObject(const std::string name, const int moduleAddress) | ||||||
| { | { | ||||||
| @@ -422,46 +148,25 @@ void Environment::addObject(const std::string name, const int moduleAddress) | |||||||
|          |          | ||||||
|         info.name   = name; |         info.name   = name; | ||||||
|         info.module = moduleAddress; |         info.module = moduleAddress; | ||||||
|  |         info.data   = nullptr; | ||||||
|         object_.push_back(std::move(info)); |         object_.push_back(std::move(info)); | ||||||
|         objectAddress_[name] = static_cast<unsigned int>(object_.size() - 1); |         objectAddress_[name] = static_cast<unsigned int>(object_.size() - 1); | ||||||
|     } |     } | ||||||
|     else |     else | ||||||
|     { |     { | ||||||
|         HADRON_ERROR("object '" + name + "' already exists"); |         HADRON_ERROR(Definition, "object '" + name + "' already exists"); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| void Environment::registerObject(const unsigned int address, | void Environment::setObjectModule(const unsigned int objAddress, | ||||||
|                                  const unsigned int size, const unsigned int Ls) |                                   const int modAddress) | ||||||
| { | { | ||||||
|     if (!hasRegisteredObject(address)) |     object_[objAddress].module = modAddress; | ||||||
|     { |  | ||||||
|         if (hasObject(address)) |  | ||||||
|         { |  | ||||||
|             object_[address].size         = size; |  | ||||||
|             object_[address].Ls           = Ls; |  | ||||||
|             object_[address].isRegistered = true; |  | ||||||
|         } |  | ||||||
|         else |  | ||||||
|         { |  | ||||||
|             HADRON_ERROR("no object with address " + std::to_string(address)); |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|     else |  | ||||||
|     { |  | ||||||
|         HADRON_ERROR("object with address " + std::to_string(address) |  | ||||||
|                      + " already registered"); |  | ||||||
|     } |  | ||||||
| } | } | ||||||
|  |  | ||||||
| void Environment::registerObject(const std::string name, | unsigned int Environment::getMaxAddress(void) const | ||||||
|                                  const unsigned int size, const unsigned int Ls) |  | ||||||
| { | { | ||||||
|     if (!hasObject(name)) |     return object_.size(); | ||||||
|     { |  | ||||||
|         addObject(name); |  | ||||||
|     } |  | ||||||
|     registerObject(getObjectAddress(name), size, Ls); |  | ||||||
| } | } | ||||||
|  |  | ||||||
| unsigned int Environment::getObjectAddress(const std::string name) const | unsigned int Environment::getObjectAddress(const std::string name) const | ||||||
| @@ -472,7 +177,7 @@ unsigned int Environment::getObjectAddress(const std::string name) const | |||||||
|     } |     } | ||||||
|     else |     else | ||||||
|     { |     { | ||||||
|         HADRON_ERROR("no object with name '" + name + "'"); |         HADRON_ERROR(Definition, "no object with name '" + name + "'"); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -484,24 +189,26 @@ std::string Environment::getObjectName(const unsigned int address) const | |||||||
|     } |     } | ||||||
|     else |     else | ||||||
|     { |     { | ||||||
|         HADRON_ERROR("no object with address " + std::to_string(address)); |         ERROR_NO_ADDRESS(address); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| std::string Environment::getObjectType(const unsigned int address) const | std::string Environment::getObjectType(const unsigned int address) const | ||||||
| { | { | ||||||
|     if (hasRegisteredObject(address)) |     if (hasObject(address)) | ||||||
|     { |     { | ||||||
|         return typeName(object_[address].type); |         if (object_[address].type) | ||||||
|     } |         { | ||||||
|     else if (hasObject(address)) |             return typeName(object_[address].type); | ||||||
|     { |         } | ||||||
|         HADRON_ERROR("object with address " + std::to_string(address) |         else | ||||||
|                      + " exists but is not registered"); |         { | ||||||
|  |             return "<no type>"; | ||||||
|  |         } | ||||||
|     } |     } | ||||||
|     else |     else | ||||||
|     { |     { | ||||||
|         HADRON_ERROR("no object with address " + std::to_string(address)); |         ERROR_NO_ADDRESS(address); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -512,18 +219,13 @@ std::string Environment::getObjectType(const std::string name) const | |||||||
|  |  | ||||||
| Environment::Size Environment::getObjectSize(const unsigned int address) const | Environment::Size Environment::getObjectSize(const unsigned int address) const | ||||||
| { | { | ||||||
|     if (hasRegisteredObject(address)) |     if (hasObject(address)) | ||||||
|     { |     { | ||||||
|         return object_[address].size; |         return object_[address].size; | ||||||
|     } |     } | ||||||
|     else if (hasObject(address)) |  | ||||||
|     { |  | ||||||
|         HADRON_ERROR("object with address " + std::to_string(address) |  | ||||||
|                      + " exists but is not registered"); |  | ||||||
|     } |  | ||||||
|     else |     else | ||||||
|     { |     { | ||||||
|         HADRON_ERROR("no object with address " + std::to_string(address)); |         ERROR_NO_ADDRESS(address); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -532,20 +234,49 @@ Environment::Size Environment::getObjectSize(const std::string name) const | |||||||
|     return getObjectSize(getObjectAddress(name)); |     return getObjectSize(getObjectAddress(name)); | ||||||
| } | } | ||||||
|  |  | ||||||
| unsigned int Environment::getObjectLs(const unsigned int address) const | Environment::Storage Environment::getObjectStorage(const unsigned int address) const | ||||||
| { | { | ||||||
|     if (hasRegisteredObject(address)) |     if (hasObject(address)) | ||||||
|     { |     { | ||||||
|         return object_[address].Ls; |         return object_[address].storage; | ||||||
|     } |  | ||||||
|     else if (hasObject(address)) |  | ||||||
|     { |  | ||||||
|         HADRON_ERROR("object with address " + std::to_string(address) |  | ||||||
|                      + " exists but is not registered"); |  | ||||||
|     } |     } | ||||||
|     else |     else | ||||||
|     { |     { | ||||||
|         HADRON_ERROR("no object with address " + std::to_string(address)); |         ERROR_NO_ADDRESS(address); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | Environment::Storage Environment::getObjectStorage(const std::string name) const | ||||||
|  | { | ||||||
|  |     return getObjectStorage(getObjectAddress(name)); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | int Environment::getObjectModule(const unsigned int address) const | ||||||
|  | { | ||||||
|  |     if (hasObject(address)) | ||||||
|  |     { | ||||||
|  |         return object_[address].module; | ||||||
|  |     } | ||||||
|  |     else | ||||||
|  |     { | ||||||
|  |         ERROR_NO_ADDRESS(address); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | int Environment::getObjectModule(const std::string name) const | ||||||
|  | { | ||||||
|  |     return getObjectModule(getObjectAddress(name)); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | unsigned int Environment::getObjectLs(const unsigned int address) const | ||||||
|  | { | ||||||
|  |     if (hasObject(address)) | ||||||
|  |     { | ||||||
|  |         return object_[address].Ls; | ||||||
|  |     } | ||||||
|  |     else | ||||||
|  |     { | ||||||
|  |         ERROR_NO_ADDRESS(address); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -566,30 +297,6 @@ bool Environment::hasObject(const std::string name) const | |||||||
|     return ((it != objectAddress_.end()) and hasObject(it->second)); |     return ((it != objectAddress_.end()) and hasObject(it->second)); | ||||||
| } | } | ||||||
|  |  | ||||||
| bool Environment::hasRegisteredObject(const unsigned int address) const |  | ||||||
| { |  | ||||||
|     if (hasObject(address)) |  | ||||||
|     { |  | ||||||
|         return object_[address].isRegistered; |  | ||||||
|     } |  | ||||||
|     else |  | ||||||
|     { |  | ||||||
|         return false; |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| bool Environment::hasRegisteredObject(const std::string name) const |  | ||||||
| { |  | ||||||
|     if (hasObject(name)) |  | ||||||
|     { |  | ||||||
|         return hasRegisteredObject(getObjectAddress(name)); |  | ||||||
|     } |  | ||||||
|     else |  | ||||||
|     { |  | ||||||
|         return false; |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| bool Environment::hasCreatedObject(const unsigned int address) const | bool Environment::hasCreatedObject(const unsigned int address) const | ||||||
| { | { | ||||||
|     if (hasObject(address)) |     if (hasObject(address)) | ||||||
| @@ -630,92 +337,27 @@ Environment::Size Environment::getTotalSize(void) const | |||||||
|      |      | ||||||
|     for (auto &o: object_) |     for (auto &o: object_) | ||||||
|     { |     { | ||||||
|         if (o.isRegistered) |         size += o.size; | ||||||
|         { |  | ||||||
|             size += o.size; |  | ||||||
|         } |  | ||||||
|     } |     } | ||||||
|      |      | ||||||
|     return size; |     return size; | ||||||
| } | } | ||||||
|  |  | ||||||
| void Environment::addOwnership(const unsigned int owner, | void Environment::freeObject(const unsigned int address) | ||||||
|                                const unsigned int property) |  | ||||||
| { | { | ||||||
|     if (hasObject(property)) |     if (hasCreatedObject(address)) | ||||||
|     { |     { | ||||||
|         object_[property].owners.insert(owner); |         LOG(Message) << "Destroying object '" << object_[address].name | ||||||
|     } |                      << "'" << std::endl; | ||||||
|     else |  | ||||||
|     { |  | ||||||
|         HADRON_ERROR("no object with address " + std::to_string(property)); |  | ||||||
|     } |  | ||||||
|     if (hasObject(owner)) |  | ||||||
|     { |  | ||||||
|         object_[owner].properties.insert(property); |  | ||||||
|     } |  | ||||||
|     else |  | ||||||
|     { |  | ||||||
|         HADRON_ERROR("no object with address " + std::to_string(owner)); |  | ||||||
|     } |     } | ||||||
|  |     object_[address].size = 0; | ||||||
|  |     object_[address].type = nullptr; | ||||||
|  |     object_[address].data.reset(nullptr); | ||||||
| } | } | ||||||
|  |  | ||||||
| void Environment::addOwnership(const std::string owner, | void Environment::freeObject(const std::string name) | ||||||
|                                const std::string property) |  | ||||||
| { | { | ||||||
|     addOwnership(getObjectAddress(owner), getObjectAddress(property)); |     freeObject(getObjectAddress(name)); | ||||||
| } |  | ||||||
|  |  | ||||||
| bool Environment::hasOwners(const unsigned int address) const |  | ||||||
| { |  | ||||||
|      |  | ||||||
|     if (hasObject(address)) |  | ||||||
|     { |  | ||||||
|         return (!object_[address].owners.empty()); |  | ||||||
|     } |  | ||||||
|     else |  | ||||||
|     { |  | ||||||
|         HADRON_ERROR("no object with address " + std::to_string(address)); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| bool Environment::hasOwners(const std::string name) const |  | ||||||
| { |  | ||||||
|     return hasOwners(getObjectAddress(name)); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| bool Environment::freeObject(const unsigned int address) |  | ||||||
| { |  | ||||||
|     if (!hasOwners(address)) |  | ||||||
|     { |  | ||||||
|         if (!isDryRun() and object_[address].isRegistered) |  | ||||||
|         { |  | ||||||
|             LOG(Message) << "Destroying object '" << object_[address].name |  | ||||||
|                          << "'" << std::endl; |  | ||||||
|         } |  | ||||||
|         for (auto &p: object_[address].properties) |  | ||||||
|         { |  | ||||||
|             object_[p].owners.erase(address); |  | ||||||
|         } |  | ||||||
|         object_[address].size         = 0; |  | ||||||
|         object_[address].Ls           = 0; |  | ||||||
|         object_[address].isRegistered = false; |  | ||||||
|         object_[address].type         = nullptr; |  | ||||||
|         object_[address].owners.clear(); |  | ||||||
|         object_[address].properties.clear(); |  | ||||||
|         object_[address].data.reset(nullptr); |  | ||||||
|          |  | ||||||
|         return true; |  | ||||||
|     } |  | ||||||
|     else |  | ||||||
|     { |  | ||||||
|         return false; |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| bool Environment::freeObject(const std::string name) |  | ||||||
| { |  | ||||||
|     return freeObject(getObjectAddress(name)); |  | ||||||
| } | } | ||||||
|  |  | ||||||
| void Environment::freeAll(void) | void Environment::freeAll(void) | ||||||
| @@ -726,18 +368,24 @@ void Environment::freeAll(void) | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| void Environment::printContent(void) | void Environment::protectObjects(const bool protect) | ||||||
| { | { | ||||||
|     LOG(Message) << "Modules: " << std::endl; |     protect_ = protect; | ||||||
|     for (unsigned int i = 0; i < module_.size(); ++i) | } | ||||||
|     { |  | ||||||
|         LOG(Message) << std::setw(4) << i << ": " | bool Environment::objectsProtected(void) const | ||||||
|                      << getModuleName(i) << std::endl; | { | ||||||
|     } |     return protect_; | ||||||
|     LOG(Message) << "Objects: " << std::endl; | } | ||||||
|  |  | ||||||
|  | // print environment content /////////////////////////////////////////////////// | ||||||
|  | void Environment::printContent(void) const | ||||||
|  | { | ||||||
|  |     LOG(Debug) << "Objects: " << std::endl; | ||||||
|     for (unsigned int i = 0; i < object_.size(); ++i) |     for (unsigned int i = 0; i < object_.size(); ++i) | ||||||
|     { |     { | ||||||
|         LOG(Message) << std::setw(4) << i << ": " |         LOG(Debug) << std::setw(4) << i << ": " | ||||||
|                      << getObjectName(i) << std::endl; |                    << getObjectName(i) << " (" | ||||||
|  |                    << sizeString(getObjectSize(i)) << ")" << std::endl; | ||||||
|     } |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -4,8 +4,7 @@ Grid physics library, www.github.com/paboyle/Grid | |||||||
|  |  | ||||||
| Source file: extras/Hadrons/Environment.hpp | Source file: extras/Hadrons/Environment.hpp | ||||||
|  |  | ||||||
| Copyright (C) 2015 | Copyright (C) 2015-2018 | ||||||
| Copyright (C) 2016 |  | ||||||
|  |  | ||||||
| Author: Antonin Portelli <antonin.portelli@me.com> | Author: Antonin Portelli <antonin.portelli@me.com> | ||||||
|  |  | ||||||
| @@ -31,20 +30,12 @@ See the full license in the file "LICENSE" in the top level distribution directo | |||||||
| #define Hadrons_Environment_hpp_ | #define Hadrons_Environment_hpp_ | ||||||
|  |  | ||||||
| #include <Grid/Hadrons/Global.hpp> | #include <Grid/Hadrons/Global.hpp> | ||||||
| #include <Grid/Hadrons/Graph.hpp> |  | ||||||
|  |  | ||||||
| #ifndef SITE_SIZE_TYPE |  | ||||||
| #define SITE_SIZE_TYPE unsigned int |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| BEGIN_HADRONS_NAMESPACE | BEGIN_HADRONS_NAMESPACE | ||||||
|  |  | ||||||
| /****************************************************************************** | /****************************************************************************** | ||||||
|  *                         Global environment                                 * |  *                         Global environment                                 * | ||||||
|  ******************************************************************************/ |  ******************************************************************************/ | ||||||
| // forward declaration of Module |  | ||||||
| class ModuleBase; |  | ||||||
|  |  | ||||||
| class Object | class Object | ||||||
| { | { | ||||||
| public: | public: | ||||||
| @@ -66,137 +57,100 @@ private: | |||||||
|     std::unique_ptr<T> objPt_{nullptr}; |     std::unique_ptr<T> objPt_{nullptr}; | ||||||
| }; | }; | ||||||
|  |  | ||||||
|  | #define DEFINE_ENV_ALIAS \ | ||||||
|  | inline Environment & env(void) const\ | ||||||
|  | {\ | ||||||
|  |     return Environment::getInstance();\ | ||||||
|  | } | ||||||
|  |  | ||||||
| class Environment | class Environment | ||||||
| { | { | ||||||
|     SINGLETON(Environment); |     SINGLETON(Environment); | ||||||
| public: | public: | ||||||
|     typedef SITE_SIZE_TYPE                         Size; |     typedef SITE_SIZE_TYPE                         Size; | ||||||
|     typedef std::unique_ptr<ModuleBase>            ModPt; |  | ||||||
|     typedef std::unique_ptr<GridCartesian>         GridPt; |     typedef std::unique_ptr<GridCartesian>         GridPt; | ||||||
|     typedef std::unique_ptr<GridRedBlackCartesian> GridRbPt; |     typedef std::unique_ptr<GridRedBlackCartesian> GridRbPt; | ||||||
|     typedef std::unique_ptr<GridParallelRNG>       RngPt; |     typedef std::unique_ptr<GridParallelRNG>       RngPt; | ||||||
|     typedef std::unique_ptr<LatticeBase>           LatticePt; |     enum class Storage {object, cache, temporary}; | ||||||
| private: | private: | ||||||
|     struct ModuleInfo |  | ||||||
|     { |  | ||||||
|         const std::type_info      *type{nullptr}; |  | ||||||
|         std::string               name; |  | ||||||
|         ModPt                     data{nullptr}; |  | ||||||
|         std::vector<unsigned int> input; |  | ||||||
|     }; |  | ||||||
|     struct ObjInfo |     struct ObjInfo | ||||||
|     { |     { | ||||||
|         Size                    size{0}; |         Size                    size{0}; | ||||||
|  |         Storage                 storage{Storage::object}; | ||||||
|         unsigned int            Ls{0}; |         unsigned int            Ls{0}; | ||||||
|         bool                    isRegistered{false}; |  | ||||||
|         const std::type_info    *type{nullptr}; |         const std::type_info    *type{nullptr}; | ||||||
|         std::string             name; |         std::string             name; | ||||||
|         int                     module{-1}; |         int                     module{-1}; | ||||||
|         std::set<unsigned int>  owners, properties; |  | ||||||
|         std::unique_ptr<Object> data{nullptr}; |         std::unique_ptr<Object> data{nullptr}; | ||||||
|     }; |     }; | ||||||
| public: | public: | ||||||
|     // dry run |  | ||||||
|     void                    dryRun(const bool isDry); |  | ||||||
|     bool                    isDryRun(void) const; |  | ||||||
|     // trajectory number |  | ||||||
|     void                    setTrajectory(const unsigned int traj); |  | ||||||
|     unsigned int            getTrajectory(void) const; |  | ||||||
|     // grids |     // grids | ||||||
|     void                    createGrid(const unsigned int Ls); |     void                    createGrid(const unsigned int Ls); | ||||||
|     GridCartesian *         getGrid(const unsigned int Ls = 1) const; |     GridCartesian *         getGrid(const unsigned int Ls = 1) const; | ||||||
|     GridRedBlackCartesian * getRbGrid(const unsigned int Ls = 1) const; |     GridRedBlackCartesian * getRbGrid(const unsigned int Ls = 1) const; | ||||||
|  |     std::vector<int>        getDim(void) const; | ||||||
|  |     int                     getDim(const unsigned int mu) const; | ||||||
|  |     unsigned long int       getLocalVolume(void) const; | ||||||
|     unsigned int            getNd(void) const; |     unsigned int            getNd(void) const; | ||||||
|     // random number generator |     // random number generator | ||||||
|     void                    setSeed(const std::vector<int> &seed); |     void                    setSeed(const std::vector<int> &seed); | ||||||
|     GridParallelRNG *       get4dRng(void) const; |     GridParallelRNG *       get4dRng(void) const; | ||||||
|     // module management |  | ||||||
|     void                    pushModule(ModPt &pt); |  | ||||||
|     template <typename M> |  | ||||||
|     void                    createModule(const std::string name); |  | ||||||
|     template <typename M> |  | ||||||
|     void                    createModule(const std::string name, |  | ||||||
|                                          const typename M::Par &par); |  | ||||||
|     void                    createModule(const std::string name, |  | ||||||
|                                          const std::string type, |  | ||||||
|                                          XmlReader &reader); |  | ||||||
|     unsigned int            getNModule(void) const; |  | ||||||
|     ModuleBase *            getModule(const unsigned int address) const; |  | ||||||
|     ModuleBase *            getModule(const std::string name) const; |  | ||||||
|     template <typename M> |  | ||||||
|     M *                     getModule(const unsigned int address) const; |  | ||||||
|     template <typename M> |  | ||||||
|     M *                     getModule(const std::string name) const; |  | ||||||
|     unsigned int            getModuleAddress(const std::string name) const; |  | ||||||
|     std::string             getModuleName(const unsigned int address) const; |  | ||||||
|     std::string             getModuleType(const unsigned int address) const; |  | ||||||
|     std::string             getModuleType(const std::string name) const; |  | ||||||
|     bool                    hasModule(const unsigned int address) const; |  | ||||||
|     bool                    hasModule(const std::string name) const; |  | ||||||
|     Graph<unsigned int>     makeModuleGraph(void) const; |  | ||||||
|     Size                    executeProgram(const std::vector<unsigned int> &p); |  | ||||||
|     Size                    executeProgram(const std::vector<std::string> &p); |  | ||||||
|     // general memory management |     // general memory management | ||||||
|     void                    addObject(const std::string name, |     void                    addObject(const std::string name, | ||||||
|                                       const int moduleAddress = -1); |                                       const int moduleAddress = -1); | ||||||
|     void                    registerObject(const unsigned int address, |     template <typename B, typename T, typename ... Ts> | ||||||
|                                            const unsigned int size, |     void                    createDerivedObject(const std::string name, | ||||||
|                                            const unsigned int Ls = 1); |                                                 const Environment::Storage storage, | ||||||
|     void                    registerObject(const std::string name, |                                                 const unsigned int Ls, | ||||||
|                                            const unsigned int size, |                                                 Ts && ... args); | ||||||
|                                            const unsigned int Ls = 1); |     template <typename T, typename ... Ts> | ||||||
|     template <typename T> |     void                    createObject(const std::string name, | ||||||
|     unsigned int            lattice4dSize(void) const; |                                          const Environment::Storage storage, | ||||||
|     template <typename T> |                                          const unsigned int Ls, | ||||||
|     void                    registerLattice(const unsigned int address, |                                          Ts && ... args); | ||||||
|                                             const unsigned int Ls = 1); |     void                    setObjectModule(const unsigned int objAddress, | ||||||
|     template <typename T> |                                             const int modAddress); | ||||||
|     void                    registerLattice(const std::string name, |  | ||||||
|                                             const unsigned int Ls = 1); |  | ||||||
|     template <typename T> |  | ||||||
|     void                    setObject(const unsigned int address, T *object); |  | ||||||
|     template <typename T> |  | ||||||
|     void                    setObject(const std::string name, T *object); |  | ||||||
|     template <typename T> |     template <typename T> | ||||||
|     T *                     getObject(const unsigned int address) const; |     T *                     getObject(const unsigned int address) const; | ||||||
|     template <typename T> |     template <typename T> | ||||||
|     T *                     getObject(const std::string name) const; |     T *                     getObject(const std::string name) const; | ||||||
|     template <typename T> |     unsigned int            getMaxAddress(void) const; | ||||||
|     T *                     createLattice(const unsigned int address); |  | ||||||
|     template <typename T> |  | ||||||
|     T *                     createLattice(const std::string name); |  | ||||||
|     unsigned int            getObjectAddress(const std::string name) const; |     unsigned int            getObjectAddress(const std::string name) const; | ||||||
|     std::string             getObjectName(const unsigned int address) const; |     std::string             getObjectName(const unsigned int address) const; | ||||||
|     std::string             getObjectType(const unsigned int address) const; |     std::string             getObjectType(const unsigned int address) const; | ||||||
|     std::string             getObjectType(const std::string name) const; |     std::string             getObjectType(const std::string name) const; | ||||||
|     Size                    getObjectSize(const unsigned int address) const; |     Size                    getObjectSize(const unsigned int address) const; | ||||||
|     Size                    getObjectSize(const std::string name) const; |     Size                    getObjectSize(const std::string name) const; | ||||||
|  |     Storage                 getObjectStorage(const unsigned int address) const; | ||||||
|  |     Storage                 getObjectStorage(const std::string name) const; | ||||||
|  |     int                     getObjectModule(const unsigned int address) const; | ||||||
|  |     int                     getObjectModule(const std::string name) const; | ||||||
|     unsigned int            getObjectLs(const unsigned int address) const; |     unsigned int            getObjectLs(const unsigned int address) const; | ||||||
|     unsigned int            getObjectLs(const std::string name) const; |     unsigned int            getObjectLs(const std::string name) const; | ||||||
|     bool                    hasObject(const unsigned int address) const; |     bool                    hasObject(const unsigned int address) const; | ||||||
|     bool                    hasObject(const std::string name) const; |     bool                    hasObject(const std::string name) const; | ||||||
|     bool                    hasRegisteredObject(const unsigned int address) const; |  | ||||||
|     bool                    hasRegisteredObject(const std::string name) const; |  | ||||||
|     bool                    hasCreatedObject(const unsigned int address) const; |     bool                    hasCreatedObject(const unsigned int address) const; | ||||||
|     bool                    hasCreatedObject(const std::string name) const; |     bool                    hasCreatedObject(const std::string name) const; | ||||||
|     bool                    isObject5d(const unsigned int address) const; |     bool                    isObject5d(const unsigned int address) const; | ||||||
|     bool                    isObject5d(const std::string name) const; |     bool                    isObject5d(const std::string name) const; | ||||||
|  |     template <typename T> | ||||||
|  |     bool                    isObjectOfType(const unsigned int address) const; | ||||||
|  |     template <typename T> | ||||||
|  |     bool                    isObjectOfType(const std::string name) const; | ||||||
|     Environment::Size       getTotalSize(void) const; |     Environment::Size       getTotalSize(void) const; | ||||||
|     void                    addOwnership(const unsigned int owner, |     void                    freeObject(const unsigned int address); | ||||||
|                                          const unsigned int property); |     void                    freeObject(const std::string name); | ||||||
|     void                    addOwnership(const std::string owner, |  | ||||||
|                                          const std::string property); |  | ||||||
|     bool                    hasOwners(const unsigned int address) const; |  | ||||||
|     bool                    hasOwners(const std::string name) const; |  | ||||||
|     bool                    freeObject(const unsigned int address); |  | ||||||
|     bool                    freeObject(const std::string name); |  | ||||||
|     void                    freeAll(void); |     void                    freeAll(void); | ||||||
|     void                    printContent(void); |     void                    protectObjects(const bool protect); | ||||||
|  |     bool                    objectsProtected(void) const; | ||||||
|  |     // print environment content | ||||||
|  |     void                    printContent(void) const; | ||||||
| private: | private: | ||||||
|     // general |     // general | ||||||
|     bool                                   dryRun_{false}; |     unsigned long int                      locVol_; | ||||||
|     unsigned int                           traj_, locVol_; |     bool                                   protect_{true}; | ||||||
|     // grids |     // grids | ||||||
|  |     std::vector<int>                       dim_; | ||||||
|     GridPt                                 grid4d_; |     GridPt                                 grid4d_; | ||||||
|     std::map<unsigned int, GridPt>         grid5d_; |     std::map<unsigned int, GridPt>         grid5d_; | ||||||
|     GridRbPt                               gridRb4d_; |     GridRbPt                               gridRb4d_; | ||||||
| @@ -204,11 +158,6 @@ private: | |||||||
|     unsigned int                           nd_; |     unsigned int                           nd_; | ||||||
|     // random number generator |     // random number generator | ||||||
|     RngPt                                  rng4d_; |     RngPt                                  rng4d_; | ||||||
|     // module and related maps |  | ||||||
|     std::vector<ModuleInfo>                module_; |  | ||||||
|     std::map<std::string, unsigned int>    moduleAddress_; |  | ||||||
|     // lattice store |  | ||||||
|     std::map<unsigned int, LatticePt>      lattice_; |  | ||||||
|     // object store |     // object store | ||||||
|     std::vector<ObjInfo>                   object_; |     std::vector<ObjInfo>                   object_; | ||||||
|     std::map<std::string, unsigned int>    objectAddress_; |     std::map<std::string, unsigned int>    objectAddress_; | ||||||
| @@ -245,116 +194,85 @@ void Holder<T>::reset(T *pt) | |||||||
| /****************************************************************************** | /****************************************************************************** | ||||||
|  *                     Environment template implementation                    * |  *                     Environment template implementation                    * | ||||||
|  ******************************************************************************/ |  ******************************************************************************/ | ||||||
| // module management /////////////////////////////////////////////////////////// | // general memory management /////////////////////////////////////////////////// | ||||||
| template <typename M> | template <typename B, typename T, typename ... Ts> | ||||||
| void Environment::createModule(const std::string name) | void Environment::createDerivedObject(const std::string name, | ||||||
|  |                                       const Environment::Storage storage, | ||||||
|  |                                       const unsigned int Ls, | ||||||
|  |                                       Ts && ... args) | ||||||
| { | { | ||||||
|     ModPt pt(new M(name)); |     if (!hasObject(name)) | ||||||
|  |     { | ||||||
|  |         addObject(name); | ||||||
|  |     } | ||||||
|      |      | ||||||
|     pushModule(pt); |     unsigned int address = getObjectAddress(name); | ||||||
| } |  | ||||||
|  |  | ||||||
| template <typename M> |  | ||||||
| void Environment::createModule(const std::string name, |  | ||||||
|                                const typename M::Par &par) |  | ||||||
| { |  | ||||||
|     ModPt pt(new M(name)); |  | ||||||
|      |      | ||||||
|     static_cast<M *>(pt.get())->setPar(par); |     if (!object_[address].data or !objectsProtected()) | ||||||
|     pushModule(pt); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| template <typename M> |  | ||||||
| M * Environment::getModule(const unsigned int address) const |  | ||||||
| { |  | ||||||
|     if (auto *pt = dynamic_cast<M *>(getModule(address))) |  | ||||||
|     { |     { | ||||||
|         return pt; |         MemoryStats memStats; | ||||||
|  |      | ||||||
|  |         if (!MemoryProfiler::stats) | ||||||
|  |         { | ||||||
|  |             MemoryProfiler::stats = &memStats; | ||||||
|  |         } | ||||||
|  |         size_t initMem           = MemoryProfiler::stats->currentlyAllocated; | ||||||
|  |         object_[address].storage = storage; | ||||||
|  |         object_[address].Ls      = Ls; | ||||||
|  |         object_[address].data.reset(new Holder<B>(new T(std::forward<Ts>(args)...))); | ||||||
|  |         object_[address].size    = MemoryProfiler::stats->maxAllocated - initMem; | ||||||
|  |         object_[address].type    = &typeid(T); | ||||||
|  |         if (MemoryProfiler::stats == &memStats) | ||||||
|  |         { | ||||||
|  |             MemoryProfiler::stats = nullptr; | ||||||
|  |         } | ||||||
|     } |     } | ||||||
|     else |     // object already exists, no error if it is a cache, error otherwise | ||||||
|  |     else if ((object_[address].storage != Storage::cache) or  | ||||||
|  |              (object_[address].storage != storage)        or | ||||||
|  |              (object_[address].name    != name)           or | ||||||
|  |              (object_[address].type    != &typeid(T))) | ||||||
|     { |     { | ||||||
|         HADRON_ERROR("module '" + module_[address].name |         HADRON_ERROR(Definition, "object '" + name + "' already allocated"); | ||||||
|                      + "' does not have type " + typeid(M).name() |  | ||||||
|                      + "(object type: " + getModuleType(address) + ")"); |  | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| template <typename M> | template <typename T, typename ... Ts> | ||||||
| M * Environment::getModule(const std::string name) const | void Environment::createObject(const std::string name,  | ||||||
|  |                                const Environment::Storage storage, | ||||||
|  |                                const unsigned int Ls, | ||||||
|  |                                Ts && ... args) | ||||||
| { | { | ||||||
|     return getModule<M>(getModuleAddress(name)); |     createDerivedObject<T, T>(name, storage, Ls, std::forward<Ts>(args)...); | ||||||
| } |  | ||||||
|  |  | ||||||
| template <typename T> |  | ||||||
| unsigned int Environment::lattice4dSize(void) const |  | ||||||
| { |  | ||||||
|     return sizeof(typename T::vector_object)/getGrid()->Nsimd(); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| template <typename T> |  | ||||||
| void Environment::registerLattice(const unsigned int address, |  | ||||||
|                                   const unsigned int Ls) |  | ||||||
| { |  | ||||||
|     createGrid(Ls); |  | ||||||
|     registerObject(address, Ls*lattice4dSize<T>(), Ls); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| template <typename T> |  | ||||||
| void Environment::registerLattice(const std::string name, const unsigned int Ls) |  | ||||||
| { |  | ||||||
|     createGrid(Ls); |  | ||||||
|     registerObject(name, Ls*lattice4dSize<T>(), Ls); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| template <typename T> |  | ||||||
| void Environment::setObject(const unsigned int address, T *object) |  | ||||||
| { |  | ||||||
|     if (hasRegisteredObject(address)) |  | ||||||
|     { |  | ||||||
|         object_[address].data.reset(new Holder<T>(object)); |  | ||||||
|         object_[address].type = &typeid(T); |  | ||||||
|     } |  | ||||||
|     else if (hasObject(address)) |  | ||||||
|     { |  | ||||||
|         HADRON_ERROR("object with address " + std::to_string(address) + |  | ||||||
|                      " exists but is not registered"); |  | ||||||
|     } |  | ||||||
|     else |  | ||||||
|     { |  | ||||||
|         HADRON_ERROR("no object with address " + std::to_string(address)); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| template <typename T> |  | ||||||
| void Environment::setObject(const std::string name, T *object) |  | ||||||
| { |  | ||||||
|     setObject(getObjectAddress(name), object); |  | ||||||
| } | } | ||||||
|  |  | ||||||
| template <typename T> | template <typename T> | ||||||
| T * Environment::getObject(const unsigned int address) const | T * Environment::getObject(const unsigned int address) const | ||||||
| { | { | ||||||
|     if (hasRegisteredObject(address)) |     if (hasObject(address)) | ||||||
|     { |     { | ||||||
|         if (auto h = dynamic_cast<Holder<T> *>(object_[address].data.get())) |         if (hasCreatedObject(address)) | ||||||
|         { |         { | ||||||
|             return h->getPt(); |             if (auto h = dynamic_cast<Holder<T> *>(object_[address].data.get())) | ||||||
|  |             { | ||||||
|  |                 return h->getPt(); | ||||||
|  |             } | ||||||
|  |             else | ||||||
|  |             { | ||||||
|  |                 HADRON_ERROR(Definition, "object with address " + std::to_string(address) + | ||||||
|  |                             " does not have type '" + typeName(&typeid(T)) + | ||||||
|  |                             "' (has type '" + getObjectType(address) + "')"); | ||||||
|  |             } | ||||||
|         } |         } | ||||||
|         else |         else | ||||||
|         { |         { | ||||||
|             HADRON_ERROR("object with address " + std::to_string(address) + |             HADRON_ERROR(Definition, "object with address " + std::to_string(address) + | ||||||
|                          " does not have type '" + typeid(T).name() + |                          " is empty"); | ||||||
|                          "' (has type '" + getObjectType(address) + "')"); |  | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|     else if (hasObject(address)) |  | ||||||
|     { |  | ||||||
|         HADRON_ERROR("object with address " + std::to_string(address) + |  | ||||||
|                      " exists but is not registered"); |  | ||||||
|     } |  | ||||||
|     else |     else | ||||||
|     { |     { | ||||||
|         HADRON_ERROR("no object with address " + std::to_string(address)); |         HADRON_ERROR(Definition, "no object with address " + std::to_string(address)); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -365,19 +283,29 @@ T * Environment::getObject(const std::string name) const | |||||||
| } | } | ||||||
|  |  | ||||||
| template <typename T> | template <typename T> | ||||||
| T * Environment::createLattice(const unsigned int address) | bool Environment::isObjectOfType(const unsigned int address) const | ||||||
| { | { | ||||||
|     GridCartesian *g = getGrid(getObjectLs(address)); |     if (hasObject(address)) | ||||||
|      |     { | ||||||
|     setObject(address, new T(g)); |         if (auto h = dynamic_cast<Holder<T> *>(object_[address].data.get())) | ||||||
|      |         { | ||||||
|     return getObject<T>(address); |             return true; | ||||||
|  |         } | ||||||
|  |         else | ||||||
|  |         { | ||||||
|  |             return false; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |     else | ||||||
|  |     { | ||||||
|  |         HADRON_ERROR(Definition, "no object with address " + std::to_string(address)); | ||||||
|  |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| template <typename T> | template <typename T> | ||||||
| T * Environment::createLattice(const std::string name) | bool Environment::isObjectOfType(const std::string name) const | ||||||
| { | { | ||||||
|     return createLattice<T>(getObjectAddress(name)); |     return isObjectOfType<T>(getObjectAddress(name)); | ||||||
| } | } | ||||||
|  |  | ||||||
| END_HADRONS_NAMESPACE | END_HADRONS_NAMESPACE | ||||||
|   | |||||||
							
								
								
									
										57
									
								
								extras/Hadrons/Exceptions.cc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										57
									
								
								extras/Hadrons/Exceptions.cc
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,57 @@ | |||||||
|  | /************************************************************************************* | ||||||
|  |  | ||||||
|  | Grid physics library, www.github.com/paboyle/Grid  | ||||||
|  |  | ||||||
|  | Source file: extras/Hadrons/Exceptions.cc | ||||||
|  |  | ||||||
|  | Copyright (C) 2015-2018 | ||||||
|  |  | ||||||
|  | Author: Antonin Portelli <antonin.portelli@me.com> | ||||||
|  |  | ||||||
|  | This program is free software; you can redistribute it and/or modify | ||||||
|  | it under the terms of the GNU General Public License as published by | ||||||
|  | the Free Software Foundation; either version 2 of the License, or | ||||||
|  | (at your option) any later version. | ||||||
|  |  | ||||||
|  | This program is distributed in the hope that it will be useful, | ||||||
|  | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||||
|  | GNU General Public License for more details. | ||||||
|  |  | ||||||
|  | You should have received a copy of the GNU General Public License along | ||||||
|  | with this program; if not, write to the Free Software Foundation, Inc., | ||||||
|  | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | ||||||
|  |  | ||||||
|  | See the full license in the file "LICENSE" in the top level distribution directory | ||||||
|  | *************************************************************************************/ | ||||||
|  | /*  END LEGAL */ | ||||||
|  |  | ||||||
|  | #include <Grid/Hadrons/Exceptions.hpp> | ||||||
|  |  | ||||||
|  | #ifndef ERR_SUFF | ||||||
|  | #define ERR_SUFF " (" + loc + ")" | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #define CONST_EXC(name, init) \ | ||||||
|  | name::name(std::string msg, std::string loc)\ | ||||||
|  | :init\ | ||||||
|  | {} | ||||||
|  |  | ||||||
|  | using namespace Grid; | ||||||
|  | using namespace Hadrons; | ||||||
|  | using namespace Exceptions; | ||||||
|  |  | ||||||
|  | // logic errors | ||||||
|  | CONST_EXC(Logic, logic_error(msg + ERR_SUFF)) | ||||||
|  | CONST_EXC(Definition, Logic("definition error: " + msg, loc)) | ||||||
|  | CONST_EXC(Implementation, Logic("implementation error: " + msg, loc)) | ||||||
|  | CONST_EXC(Range, Logic("range error: " + msg, loc)) | ||||||
|  | CONST_EXC(Size, Logic("size error: " + msg, loc)) | ||||||
|  | // runtime errors | ||||||
|  | CONST_EXC(Runtime, runtime_error(msg + ERR_SUFF)) | ||||||
|  | CONST_EXC(Argument, Runtime("argument error: " + msg, loc)) | ||||||
|  | CONST_EXC(Io, Runtime("IO error: " + msg, loc)) | ||||||
|  | CONST_EXC(Memory, Runtime("memory error: " + msg, loc)) | ||||||
|  | CONST_EXC(Parsing, Runtime("parsing error: " + msg, loc)) | ||||||
|  | CONST_EXC(Program, Runtime("program error: " + msg, loc)) | ||||||
|  | CONST_EXC(System, Runtime("system error: " + msg, loc)) | ||||||
							
								
								
									
										72
									
								
								extras/Hadrons/Exceptions.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										72
									
								
								extras/Hadrons/Exceptions.hpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,72 @@ | |||||||
|  | /************************************************************************************* | ||||||
|  |  | ||||||
|  | Grid physics library, www.github.com/paboyle/Grid  | ||||||
|  |  | ||||||
|  | Source file: extras/Hadrons/Exceptions.hpp | ||||||
|  |  | ||||||
|  | Copyright (C) 2015-2018 | ||||||
|  |  | ||||||
|  | Author: Antonin Portelli <antonin.portelli@me.com> | ||||||
|  |  | ||||||
|  | This program is free software; you can redistribute it and/or modify | ||||||
|  | it under the terms of the GNU General Public License as published by | ||||||
|  | the Free Software Foundation; either version 2 of the License, or | ||||||
|  | (at your option) any later version. | ||||||
|  |  | ||||||
|  | This program is distributed in the hope that it will be useful, | ||||||
|  | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||||
|  | GNU General Public License for more details. | ||||||
|  |  | ||||||
|  | You should have received a copy of the GNU General Public License along | ||||||
|  | with this program; if not, write to the Free Software Foundation, Inc., | ||||||
|  | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | ||||||
|  |  | ||||||
|  | See the full license in the file "LICENSE" in the top level distribution directory | ||||||
|  | *************************************************************************************/ | ||||||
|  | /*  END LEGAL */ | ||||||
|  |  | ||||||
|  | #ifndef Hadrons_Exceptions_hpp_ | ||||||
|  | #define Hadrons_Exceptions_hpp_ | ||||||
|  |  | ||||||
|  | #include <stdexcept> | ||||||
|  | #ifndef Hadrons_Global_hpp_ | ||||||
|  | #include <Grid/Hadrons/Global.hpp> | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #define SRC_LOC std::string(__FUNCTION__) + " at " + std::string(__FILE__) + ":"\ | ||||||
|  |                 + std::to_string(__LINE__) | ||||||
|  | #define HADRON_ERROR(exc, msg)\ | ||||||
|  | LOG(Error) << msg << std::endl;\ | ||||||
|  | throw(Exceptions::exc(msg, SRC_LOC)); | ||||||
|  |  | ||||||
|  | #define DECL_EXC(name, base) \ | ||||||
|  | class name: public base\ | ||||||
|  | {\ | ||||||
|  | public:\ | ||||||
|  |     name(std::string msg, std::string loc);\ | ||||||
|  | } | ||||||
|  |  | ||||||
|  | BEGIN_HADRONS_NAMESPACE | ||||||
|  |  | ||||||
|  | namespace Exceptions | ||||||
|  | { | ||||||
|  |     // logic errors | ||||||
|  |     DECL_EXC(Logic, std::logic_error); | ||||||
|  |     DECL_EXC(Definition, Logic); | ||||||
|  |     DECL_EXC(Implementation, Logic); | ||||||
|  |     DECL_EXC(Range, Logic); | ||||||
|  |     DECL_EXC(Size, Logic); | ||||||
|  |     // runtime errors | ||||||
|  |     DECL_EXC(Runtime, std::runtime_error); | ||||||
|  |     DECL_EXC(Argument, Runtime); | ||||||
|  |     DECL_EXC(Io, Runtime); | ||||||
|  |     DECL_EXC(Memory, Runtime); | ||||||
|  |     DECL_EXC(Parsing, Runtime); | ||||||
|  |     DECL_EXC(Program, Runtime); | ||||||
|  |     DECL_EXC(System, Runtime); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | END_HADRONS_NAMESPACE | ||||||
|  |  | ||||||
|  | #endif // Hadrons_Exceptions_hpp_ | ||||||
| @@ -4,8 +4,7 @@ Grid physics library, www.github.com/paboyle/Grid | |||||||
|  |  | ||||||
| Source file: extras/Hadrons/Factory.hpp | Source file: extras/Hadrons/Factory.hpp | ||||||
|  |  | ||||||
| Copyright (C) 2015 | Copyright (C) 2015-2018 | ||||||
| Copyright (C) 2016 |  | ||||||
|  |  | ||||||
| Author: Antonin Portelli <antonin.portelli@me.com> | Author: Antonin Portelli <antonin.portelli@me.com> | ||||||
|  |  | ||||||
| @@ -95,7 +94,7 @@ std::unique_ptr<T> Factory<T>::create(const std::string type, | |||||||
|     } |     } | ||||||
|     catch (std::out_of_range &) |     catch (std::out_of_range &) | ||||||
|     { |     { | ||||||
|         HADRON_ERROR("object of type '" + type + "' unknown"); |         HADRON_ERROR(Argument, "object of type '" + type + "' unknown"); | ||||||
|     } |     } | ||||||
|      |      | ||||||
|     return func(name); |     return func(name); | ||||||
|   | |||||||
| @@ -4,8 +4,7 @@ Grid physics library, www.github.com/paboyle/Grid | |||||||
|  |  | ||||||
| Source file: extras/Hadrons/GeneticScheduler.hpp | Source file: extras/Hadrons/GeneticScheduler.hpp | ||||||
|  |  | ||||||
| Copyright (C) 2015 | Copyright (C) 2015-2018 | ||||||
| Copyright (C) 2016 |  | ||||||
|  |  | ||||||
| Author: Antonin Portelli <antonin.portelli@me.com> | Author: Antonin Portelli <antonin.portelli@me.com> | ||||||
|  |  | ||||||
| @@ -38,13 +37,13 @@ BEGIN_HADRONS_NAMESPACE | |||||||
| /****************************************************************************** | /****************************************************************************** | ||||||
|  *                   Scheduler based on a genetic algorithm                   * |  *                   Scheduler based on a genetic algorithm                   * | ||||||
|  ******************************************************************************/ |  ******************************************************************************/ | ||||||
| template <typename T> | template <typename V, typename T> | ||||||
| class GeneticScheduler | class GeneticScheduler | ||||||
| { | { | ||||||
| public: | public: | ||||||
|     typedef std::vector<T>                   Gene; |     typedef std::vector<T>                 Gene; | ||||||
|     typedef std::pair<Gene *, Gene *>        GenePair; |     typedef std::pair<Gene *, Gene *>      GenePair; | ||||||
|     typedef std::function<int(const Gene &)> ObjFunc; |     typedef std::function<V(const Gene &)> ObjFunc; | ||||||
|     struct Parameters |     struct Parameters | ||||||
|     { |     { | ||||||
|         double       mutationRate; |         double       mutationRate; | ||||||
| @@ -65,7 +64,7 @@ public: | |||||||
|     void benchmarkCrossover(const unsigned int nIt); |     void benchmarkCrossover(const unsigned int nIt); | ||||||
|     // print population |     // print population | ||||||
|     friend std::ostream & operator<<(std::ostream &out, |     friend std::ostream & operator<<(std::ostream &out, | ||||||
|                                      const GeneticScheduler<T> &s) |                                      const GeneticScheduler<V, T> &s) | ||||||
|     { |     { | ||||||
|         out << "["; |         out << "["; | ||||||
|         for (auto &p: s.population_) |         for (auto &p: s.population_) | ||||||
| @@ -87,19 +86,19 @@ private: | |||||||
|     void     mutation(Gene &m, const Gene &c); |     void     mutation(Gene &m, const Gene &c); | ||||||
|      |      | ||||||
| private: | private: | ||||||
|     Graph<T>                 &graph_; |     Graph<T>               &graph_; | ||||||
|     const ObjFunc            &func_; |     const ObjFunc          &func_; | ||||||
|     const Parameters         par_; |     const Parameters       par_; | ||||||
|     std::multimap<int, Gene> population_; |     std::multimap<V, Gene> population_; | ||||||
|     std::mt19937             gen_; |     std::mt19937           gen_; | ||||||
| }; | }; | ||||||
|  |  | ||||||
| /****************************************************************************** | /****************************************************************************** | ||||||
|  *                       template implementation                              * |  *                       template implementation                              * | ||||||
|  ******************************************************************************/ |  ******************************************************************************/ | ||||||
| // constructor ///////////////////////////////////////////////////////////////// | // constructor ///////////////////////////////////////////////////////////////// | ||||||
| template <typename T> | template <typename V, typename T> | ||||||
| GeneticScheduler<T>::GeneticScheduler(Graph<T> &graph, const ObjFunc &func, | GeneticScheduler<V, T>::GeneticScheduler(Graph<T> &graph, const ObjFunc &func, | ||||||
|                                       const Parameters &par) |                                       const Parameters &par) | ||||||
| : graph_(graph) | : graph_(graph) | ||||||
| , func_(func) | , func_(func) | ||||||
| @@ -109,22 +108,22 @@ GeneticScheduler<T>::GeneticScheduler(Graph<T> &graph, const ObjFunc &func, | |||||||
| } | } | ||||||
|  |  | ||||||
| // access ////////////////////////////////////////////////////////////////////// | // access ////////////////////////////////////////////////////////////////////// | ||||||
| template <typename T> | template <typename V, typename T> | ||||||
| const typename GeneticScheduler<T>::Gene & | const typename GeneticScheduler<V, T>::Gene & | ||||||
| GeneticScheduler<T>::getMinSchedule(void) | GeneticScheduler<V, T>::getMinSchedule(void) | ||||||
| { | { | ||||||
|     return population_.begin()->second; |     return population_.begin()->second; | ||||||
| } | } | ||||||
|  |  | ||||||
| template <typename T> | template <typename V, typename T> | ||||||
| int GeneticScheduler<T>::getMinValue(void) | int GeneticScheduler<V, T>::getMinValue(void) | ||||||
| { | { | ||||||
|     return population_.begin()->first; |     return population_.begin()->first; | ||||||
| } | } | ||||||
|  |  | ||||||
| // breed a new generation ////////////////////////////////////////////////////// | // breed a new generation ////////////////////////////////////////////////////// | ||||||
| template <typename T> | template <typename V, typename T> | ||||||
| void GeneticScheduler<T>::nextGeneration(void) | void GeneticScheduler<V, T>::nextGeneration(void) | ||||||
| { | { | ||||||
|     // random initialization of the population if necessary |     // random initialization of the population if necessary | ||||||
|     if (population_.size() != par_.popSize) |     if (population_.size() != par_.popSize) | ||||||
| @@ -158,8 +157,8 @@ void GeneticScheduler<T>::nextGeneration(void) | |||||||
| } | } | ||||||
|  |  | ||||||
| // evolution steps ///////////////////////////////////////////////////////////// | // evolution steps ///////////////////////////////////////////////////////////// | ||||||
| template <typename T> | template <typename V, typename T> | ||||||
| void GeneticScheduler<T>::initPopulation(void) | void GeneticScheduler<V, T>::initPopulation(void) | ||||||
| { | { | ||||||
|     population_.clear(); |     population_.clear(); | ||||||
|     for (unsigned int i = 0; i < par_.popSize; ++i) |     for (unsigned int i = 0; i < par_.popSize; ++i) | ||||||
| @@ -170,8 +169,8 @@ void GeneticScheduler<T>::initPopulation(void) | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| template <typename T> | template <typename V, typename T> | ||||||
| void GeneticScheduler<T>::doCrossover(void) | void GeneticScheduler<V, T>::doCrossover(void) | ||||||
| { | { | ||||||
|     auto p = selectPair(); |     auto p = selectPair(); | ||||||
|     Gene &p1 = *(p.first), &p2 = *(p.second); |     Gene &p1 = *(p.first), &p2 = *(p.second); | ||||||
| @@ -185,8 +184,8 @@ void GeneticScheduler<T>::doCrossover(void) | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| template <typename T> | template <typename V, typename T> | ||||||
| void GeneticScheduler<T>::doMutation(void) | void GeneticScheduler<V, T>::doMutation(void) | ||||||
| { | { | ||||||
|     std::uniform_real_distribution<double>      mdis(0., 1.); |     std::uniform_real_distribution<double>      mdis(0., 1.); | ||||||
|     std::uniform_int_distribution<unsigned int> pdis(0, population_.size() - 1); |     std::uniform_int_distribution<unsigned int> pdis(0, population_.size() - 1); | ||||||
| @@ -206,40 +205,35 @@ void GeneticScheduler<T>::doMutation(void) | |||||||
| } | } | ||||||
|  |  | ||||||
| // genetic operators /////////////////////////////////////////////////////////// | // genetic operators /////////////////////////////////////////////////////////// | ||||||
| template <typename T> | template <typename V, typename T> | ||||||
| typename GeneticScheduler<T>::GenePair GeneticScheduler<T>::selectPair(void) | typename GeneticScheduler<V, T>::GenePair GeneticScheduler<V, T>::selectPair(void) | ||||||
| { | { | ||||||
|     std::vector<double> prob; |     std::vector<double> prob; | ||||||
|     unsigned int        ind; |     unsigned int        ind; | ||||||
|     Gene                *p1, *p2; |     Gene                *p1, *p2; | ||||||
|  |     const double        max = population_.rbegin()->first; | ||||||
|      |      | ||||||
|  |  | ||||||
|     for (auto &c: population_) |     for (auto &c: population_) | ||||||
|     { |     { | ||||||
|         prob.push_back(1./c.first); |         prob.push_back(std::exp((c.first-1.)/max)); | ||||||
|     } |     }         | ||||||
|     do |     std::discrete_distribution<unsigned int> dis1(prob.begin(), prob.end()); | ||||||
|     { |     auto rIt = population_.begin(); | ||||||
|         double probCpy; |     ind = dis1(gen_); | ||||||
|          |     std::advance(rIt, ind); | ||||||
|         std::discrete_distribution<unsigned int> dis1(prob.begin(), prob.end()); |     p1 = &(rIt->second); | ||||||
|         auto rIt = population_.begin(); |     prob[ind] = 0.; | ||||||
|         ind = dis1(gen_); |     std::discrete_distribution<unsigned int> dis2(prob.begin(), prob.end()); | ||||||
|         std::advance(rIt, ind); |     rIt = population_.begin(); | ||||||
|         p1 = &(rIt->second); |     std::advance(rIt, dis2(gen_)); | ||||||
|         probCpy   = prob[ind]; |     p2 = &(rIt->second); | ||||||
|         prob[ind] = 0.; |  | ||||||
|         std::discrete_distribution<unsigned int> dis2(prob.begin(), prob.end()); |  | ||||||
|         rIt = population_.begin(); |  | ||||||
|         std::advance(rIt, dis2(gen_)); |  | ||||||
|         p2 = &(rIt->second); |  | ||||||
|         prob[ind] = probCpy; |  | ||||||
|     } while (p1 == p2); |  | ||||||
|      |      | ||||||
|     return std::make_pair(p1, p2); |     return std::make_pair(p1, p2); | ||||||
| } | } | ||||||
|  |  | ||||||
| template <typename T> | template <typename V, typename T> | ||||||
| void GeneticScheduler<T>::crossover(Gene &c1, Gene &c2, const Gene &p1, | void GeneticScheduler<V, T>::crossover(Gene &c1, Gene &c2, const Gene &p1, | ||||||
|                                     const Gene &p2) |                                     const Gene &p2) | ||||||
| { | { | ||||||
|     Gene                                        buf; |     Gene                                        buf; | ||||||
| @@ -273,8 +267,8 @@ void GeneticScheduler<T>::crossover(Gene &c1, Gene &c2, const Gene &p1, | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| template <typename T> | template <typename V, typename T> | ||||||
| void GeneticScheduler<T>::mutation(Gene &m, const Gene &c) | void GeneticScheduler<V, T>::mutation(Gene &m, const Gene &c) | ||||||
| { | { | ||||||
|     Gene                                        buf; |     Gene                                        buf; | ||||||
|     std::uniform_int_distribution<unsigned int> dis(0, c.size() - 1); |     std::uniform_int_distribution<unsigned int> dis(0, c.size() - 1); | ||||||
| @@ -303,8 +297,8 @@ void GeneticScheduler<T>::mutation(Gene &m, const Gene &c) | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| template <typename T> | template <typename V, typename T> | ||||||
| void GeneticScheduler<T>::benchmarkCrossover(const unsigned int nIt) | void GeneticScheduler<V, T>::benchmarkCrossover(const unsigned int nIt) | ||||||
| { | { | ||||||
|     Gene   p1, p2, c1, c2; |     Gene   p1, p2, c1, c2; | ||||||
|     double neg = 0., eq = 0., pos = 0., total; |     double neg = 0., eq = 0., pos = 0., total; | ||||||
|   | |||||||
| @@ -4,8 +4,7 @@ Grid physics library, www.github.com/paboyle/Grid | |||||||
|  |  | ||||||
| Source file: extras/Hadrons/Global.cc | Source file: extras/Hadrons/Global.cc | ||||||
|  |  | ||||||
| Copyright (C) 2015 | Copyright (C) 2015-2018 | ||||||
| Copyright (C) 2016 |  | ||||||
|  |  | ||||||
| Author: Antonin Portelli <antonin.portelli@me.com> | Author: Antonin Portelli <antonin.portelli@me.com> | ||||||
|  |  | ||||||
| @@ -39,31 +38,19 @@ HadronsLogger Hadrons::HadronsLogMessage(1,"Message"); | |||||||
| HadronsLogger Hadrons::HadronsLogIterative(1,"Iterative"); | HadronsLogger Hadrons::HadronsLogIterative(1,"Iterative"); | ||||||
| HadronsLogger Hadrons::HadronsLogDebug(1,"Debug"); | HadronsLogger Hadrons::HadronsLogDebug(1,"Debug"); | ||||||
|  |  | ||||||
| // pretty size formatting ////////////////////////////////////////////////////// | void Hadrons::initLogger(void) | ||||||
| std::string Hadrons::sizeString(long unsigned int bytes) |  | ||||||
|  |  | ||||||
| { | { | ||||||
|     constexpr unsigned int bufSize = 256; |     auto w = std::string("Hadrons").length(); | ||||||
|     const char             *suffixes[7] = {"", "K", "M", "G", "T", "P", "E"}; |     GridLogError.setTopWidth(w); | ||||||
|     char                   buf[256]; |     GridLogWarning.setTopWidth(w); | ||||||
|     long unsigned int      s     = 0; |     GridLogMessage.setTopWidth(w); | ||||||
|     double                 count = bytes; |     GridLogIterative.setTopWidth(w); | ||||||
|      |     GridLogDebug.setTopWidth(w); | ||||||
|     while (count >= 1024 && s < 7) |     HadronsLogError.Active(GridLogError.isActive()); | ||||||
|     { |     HadronsLogWarning.Active(GridLogWarning.isActive()); | ||||||
|         s++; |     HadronsLogMessage.Active(GridLogMessage.isActive()); | ||||||
|         count /= 1024; |     HadronsLogIterative.Active(GridLogIterative.isActive()); | ||||||
|     } |     HadronsLogDebug.Active(GridLogDebug.isActive()); | ||||||
|     if (count - floor(count) == 0.0) |  | ||||||
|     { |  | ||||||
|         snprintf(buf, bufSize, "%d %sB", (int)count, suffixes[s]); |  | ||||||
|     } |  | ||||||
|     else |  | ||||||
|     { |  | ||||||
|         snprintf(buf, bufSize, "%.1f %sB", count, suffixes[s]); |  | ||||||
|     } |  | ||||||
|      |  | ||||||
|     return std::string(buf); |  | ||||||
| } | } | ||||||
|  |  | ||||||
| // type utilities ////////////////////////////////////////////////////////////// | // type utilities ////////////////////////////////////////////////////////////// | ||||||
| @@ -80,3 +67,10 @@ std::string Hadrons::typeName(const std::type_info *info) | |||||||
|      |      | ||||||
|     return name; |     return name; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | // default writers/readers ///////////////////////////////////////////////////// | ||||||
|  | #ifdef HAVE_HDF5 | ||||||
|  | const std::string Hadrons::resultFileExt = "h5"; | ||||||
|  | #else | ||||||
|  | const std::string Hadrons::resultFileExt = "xml"; | ||||||
|  | #endif | ||||||
|   | |||||||
| @@ -4,10 +4,10 @@ Grid physics library, www.github.com/paboyle/Grid | |||||||
|  |  | ||||||
| Source file: extras/Hadrons/Global.hpp | Source file: extras/Hadrons/Global.hpp | ||||||
|  |  | ||||||
| Copyright (C) 2015 | Copyright (C) 2015-2018 | ||||||
| Copyright (C) 2016 |  | ||||||
|  |  | ||||||
| Author: Antonin Portelli <antonin.portelli@me.com> | Author: Antonin Portelli <antonin.portelli@me.com> | ||||||
|  | Author: Lanny91 <andrew.lawson@gmail.com> | ||||||
|  |  | ||||||
| This program is free software; you can redistribute it and/or modify | This program is free software; you can redistribute it and/or modify | ||||||
| it under the terms of the GNU General Public License as published by | it under the terms of the GNU General Public License as published by | ||||||
| @@ -35,6 +35,10 @@ See the full license in the file "LICENSE" in the top level distribution directo | |||||||
| #include <Grid/Grid.h> | #include <Grid/Grid.h> | ||||||
| #include <cxxabi.h> | #include <cxxabi.h> | ||||||
|  |  | ||||||
|  | #ifndef SITE_SIZE_TYPE | ||||||
|  | #define SITE_SIZE_TYPE size_t | ||||||
|  | #endif | ||||||
|  |  | ||||||
| #define BEGIN_HADRONS_NAMESPACE \ | #define BEGIN_HADRONS_NAMESPACE \ | ||||||
| namespace Grid {\ | namespace Grid {\ | ||||||
| using namespace QCD;\ | using namespace QCD;\ | ||||||
| @@ -51,23 +55,46 @@ using Grid::operator<<; | |||||||
|  * error with GCC 5 (clang & GCC 6 compile fine without it). |  * error with GCC 5 (clang & GCC 6 compile fine without it). | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
| // FIXME: find a way to do that in a more general fashion |  | ||||||
| #ifndef FIMPL | #ifndef FIMPL | ||||||
| #define FIMPL WilsonImplR | #define FIMPL WilsonImplR | ||||||
| #endif | #endif | ||||||
|  | #ifndef SIMPL | ||||||
|  | #define SIMPL ScalarImplCR | ||||||
|  | #endif | ||||||
|  | #ifndef GIMPL | ||||||
|  | #define GIMPL GimplTypesR | ||||||
|  | #endif | ||||||
|  |  | ||||||
| BEGIN_HADRONS_NAMESPACE | BEGIN_HADRONS_NAMESPACE | ||||||
|  |  | ||||||
| // type aliases | // type aliases | ||||||
| #define TYPE_ALIASES(FImpl, suffix)\ | #define FERM_TYPE_ALIASES(FImpl, suffix)\ | ||||||
| typedef FermionOperator<FImpl>                       FMat##suffix;             \ | typedef FermionOperator<FImpl>                        FMat##suffix;            \ | ||||||
| typedef typename FImpl::FermionField                 FermionField##suffix;     \ | typedef typename FImpl::FermionField                  FermionField##suffix;    \ | ||||||
| typedef typename FImpl::PropagatorField              PropagatorField##suffix;  \ | typedef typename FImpl::PropagatorField               PropagatorField##suffix; \ | ||||||
| typedef typename FImpl::SitePropagator               SitePropagator##suffix;   \ | typedef typename FImpl::SitePropagator::scalar_object SitePropagator##suffix;  \ | ||||||
| typedef typename FImpl::DoubledGaugeField            DoubledGaugeField##suffix;\ | typedef std::vector<SitePropagator##suffix>           SlicedPropagator##suffix; | ||||||
| typedef std::function<void(FermionField##suffix &,                             \ |  | ||||||
|  | #define GAUGE_TYPE_ALIASES(FImpl, suffix)\ | ||||||
|  | typedef typename FImpl::DoubledGaugeField DoubledGaugeField##suffix; | ||||||
|  |  | ||||||
|  | #define SCALAR_TYPE_ALIASES(SImpl, suffix)\ | ||||||
|  | typedef typename SImpl::Field ScalarField##suffix;\ | ||||||
|  | typedef typename SImpl::Field PropagatorField##suffix; | ||||||
|  |  | ||||||
|  | #define SOLVER_TYPE_ALIASES(FImpl, suffix)\ | ||||||
|  | typedef std::function<void(FermionField##suffix &,\ | ||||||
|                       const FermionField##suffix &)> SolverFn##suffix; |                       const FermionField##suffix &)> SolverFn##suffix; | ||||||
|  |  | ||||||
|  | #define SINK_TYPE_ALIASES(suffix)\ | ||||||
|  | typedef std::function<SlicedPropagator##suffix\ | ||||||
|  |                       (const PropagatorField##suffix &)> SinkFn##suffix; | ||||||
|  |  | ||||||
|  | #define FGS_TYPE_ALIASES(FImpl, suffix)\ | ||||||
|  | FERM_TYPE_ALIASES(FImpl, suffix)\ | ||||||
|  | GAUGE_TYPE_ALIASES(FImpl, suffix)\ | ||||||
|  | SOLVER_TYPE_ALIASES(FImpl, suffix) | ||||||
|  |  | ||||||
| // logger | // logger | ||||||
| class HadronsLogger: public Logger | class HadronsLogger: public Logger | ||||||
| { | { | ||||||
| @@ -77,11 +104,6 @@ public: | |||||||
| }; | }; | ||||||
|  |  | ||||||
| #define LOG(channel) std::cout << HadronsLog##channel | #define LOG(channel) std::cout << HadronsLog##channel | ||||||
| #define HADRON_ERROR(msg)\ |  | ||||||
| LOG(Error) << msg << " (" << __FUNCTION__ << " at " << __FILE__ << ":"\ |  | ||||||
|            << __LINE__ << ")" << std::endl;\ |  | ||||||
| abort(); |  | ||||||
|  |  | ||||||
| #define DEBUG_VAR(var) LOG(Debug) << #var << "= " << (var) << std::endl; | #define DEBUG_VAR(var) LOG(Debug) << #var << "= " << (var) << std::endl; | ||||||
|  |  | ||||||
| extern HadronsLogger HadronsLogError; | extern HadronsLogger HadronsLogError; | ||||||
| @@ -90,6 +112,8 @@ extern HadronsLogger HadronsLogMessage; | |||||||
| extern HadronsLogger HadronsLogIterative; | extern HadronsLogger HadronsLogIterative; | ||||||
| extern HadronsLogger HadronsLogDebug; | extern HadronsLogger HadronsLogDebug; | ||||||
|  |  | ||||||
|  | void initLogger(void); | ||||||
|  |  | ||||||
| // singleton pattern | // singleton pattern | ||||||
| #define SINGLETON(name)\ | #define SINGLETON(name)\ | ||||||
| public:\ | public:\ | ||||||
| @@ -115,9 +139,6 @@ public:\ | |||||||
| private:\ | private:\ | ||||||
|     name(void) = default; |     name(void) = default; | ||||||
|  |  | ||||||
| // pretty size formating |  | ||||||
| std::string sizeString(long unsigned int bytes); |  | ||||||
|  |  | ||||||
| // type utilities | // type utilities | ||||||
| template <typename T> | template <typename T> | ||||||
| const std::type_info * typeIdPt(const T &x) | const std::type_info * typeIdPt(const T &x) | ||||||
| @@ -145,6 +166,22 @@ std::string typeName(void) | |||||||
|     return typeName(typeIdPt<T>()); |     return typeName(typeIdPt<T>()); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | // default writers/readers | ||||||
|  | extern const std::string resultFileExt; | ||||||
|  |  | ||||||
|  | #ifdef HAVE_HDF5 | ||||||
|  | typedef Hdf5Reader ResultReader; | ||||||
|  | typedef Hdf5Writer ResultWriter; | ||||||
|  | #else | ||||||
|  | typedef XmlReader ResultReader; | ||||||
|  | typedef XmlWriter ResultWriter; | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #define RESULT_FILE_NAME(name) \ | ||||||
|  | name + "." + std::to_string(vm().getTrajectory()) + "." + resultFileExt | ||||||
|  |  | ||||||
| END_HADRONS_NAMESPACE | END_HADRONS_NAMESPACE | ||||||
|  |  | ||||||
|  | #include <Grid/Hadrons/Exceptions.hpp> | ||||||
|  |  | ||||||
| #endif // Hadrons_Global_hpp_ | #endif // Hadrons_Global_hpp_ | ||||||
|   | |||||||
| @@ -4,8 +4,7 @@ Grid physics library, www.github.com/paboyle/Grid | |||||||
|  |  | ||||||
| Source file: extras/Hadrons/Graph.hpp | Source file: extras/Hadrons/Graph.hpp | ||||||
|  |  | ||||||
| Copyright (C) 2015 | Copyright (C) 2015-2018 | ||||||
| Copyright (C) 2016 |  | ||||||
|  |  | ||||||
| Author: Antonin Portelli <antonin.portelli@me.com> | Author: Antonin Portelli <antonin.portelli@me.com> | ||||||
|  |  | ||||||
| @@ -185,7 +184,7 @@ void Graph<T>::removeVertex(const T &value) | |||||||
|     } |     } | ||||||
|     else |     else | ||||||
|     { |     { | ||||||
|         HADRON_ERROR("vertex " << value << " does not exists"); |         HADRON_ERROR(Range, "vertex does not exists"); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     // remove all edges containing the vertex |     // remove all edges containing the vertex | ||||||
| @@ -214,7 +213,7 @@ void Graph<T>::removeEdge(const Edge &e) | |||||||
|     } |     } | ||||||
|     else |     else | ||||||
|     { |     { | ||||||
|         HADRON_ERROR("edge "  << e << " does not exists"); |         HADRON_ERROR(Range, "edge does not exists"); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -260,7 +259,7 @@ void Graph<T>::mark(const T &value, const bool doMark) | |||||||
|     } |     } | ||||||
|     else |     else | ||||||
|     { |     { | ||||||
|         HADRON_ERROR("vertex " << value << " does not exists"); |         HADRON_ERROR(Range, "vertex does not exists"); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -298,7 +297,7 @@ bool Graph<T>::isMarked(const T &value) const | |||||||
|     } |     } | ||||||
|     else |     else | ||||||
|     { |     { | ||||||
|         HADRON_ERROR("vertex " << value << " does not exists"); |         HADRON_ERROR(Range, "vertex does not exists"); | ||||||
|          |          | ||||||
|         return false; |         return false; | ||||||
|     } |     } | ||||||
| @@ -430,7 +429,7 @@ std::vector<T> Graph<T>::getAdjacentVertices(const T &value) const | |||||||
|     { |     { | ||||||
|         return ((e.first == value) or (e.second == value)); |         return ((e.first == value) or (e.second == value)); | ||||||
|     }; |     }; | ||||||
|     auto eIt = find_if(edgeSet_.begin(), edgeSet_.end(), pred); |     auto eIt = std::find_if(edgeSet_.begin(), edgeSet_.end(), pred); | ||||||
|      |      | ||||||
|     while (eIt != edgeSet_.end()) |     while (eIt != edgeSet_.end()) | ||||||
|     { |     { | ||||||
| @@ -442,7 +441,7 @@ std::vector<T> Graph<T>::getAdjacentVertices(const T &value) const | |||||||
|         { |         { | ||||||
|             adjacentVertex.push_back((*eIt).first); |             adjacentVertex.push_back((*eIt).first); | ||||||
|         } |         } | ||||||
|         eIt = find_if(++eIt, edgeSet_.end(), pred); |         eIt = std::find_if(++eIt, edgeSet_.end(), pred); | ||||||
|     } |     } | ||||||
|      |      | ||||||
|     return adjacentVertex; |     return adjacentVertex; | ||||||
| @@ -458,12 +457,12 @@ std::vector<T> Graph<T>::getChildren(const T &value) const | |||||||
|     { |     { | ||||||
|         return (e.first == value); |         return (e.first == value); | ||||||
|     }; |     }; | ||||||
|     auto eIt = find_if(edgeSet_.begin(), edgeSet_.end(), pred); |     auto eIt = std::find_if(edgeSet_.begin(), edgeSet_.end(), pred); | ||||||
|      |      | ||||||
|     while (eIt != edgeSet_.end()) |     while (eIt != edgeSet_.end()) | ||||||
|     { |     { | ||||||
|         child.push_back((*eIt).second); |         child.push_back((*eIt).second); | ||||||
|         eIt = find_if(++eIt, edgeSet_.end(), pred); |         eIt = std::find_if(++eIt, edgeSet_.end(), pred); | ||||||
|     } |     } | ||||||
|      |      | ||||||
|     return child; |     return child; | ||||||
| @@ -479,12 +478,12 @@ std::vector<T> Graph<T>::getParents(const T &value) const | |||||||
|     { |     { | ||||||
|         return (e.second == value); |         return (e.second == value); | ||||||
|     }; |     }; | ||||||
|     auto eIt = find_if(edgeSet_.begin(), edgeSet_.end(), pred); |     auto eIt = std::find_if(edgeSet_.begin(), edgeSet_.end(), pred); | ||||||
|      |      | ||||||
|     while (eIt != edgeSet_.end()) |     while (eIt != edgeSet_.end()) | ||||||
|     { |     { | ||||||
|         parent.push_back((*eIt).first); |         parent.push_back((*eIt).first); | ||||||
|         eIt = find_if(++eIt, edgeSet_.end(), pred); |         eIt = std::find_if(++eIt, edgeSet_.end(), pred); | ||||||
|     } |     } | ||||||
|      |      | ||||||
|     return parent; |     return parent; | ||||||
| @@ -544,7 +543,7 @@ std::vector<T> Graph<T>::topoSort(void) | |||||||
|     { |     { | ||||||
|         if (tmpMarked.at(v)) |         if (tmpMarked.at(v)) | ||||||
|         { |         { | ||||||
|             HADRON_ERROR("cannot topologically sort a cyclic graph"); |             HADRON_ERROR(Range, "cannot topologically sort a cyclic graph"); | ||||||
|         } |         } | ||||||
|         if (!isMarked(v)) |         if (!isMarked(v)) | ||||||
|         { |         { | ||||||
| @@ -603,7 +602,7 @@ std::vector<T> Graph<T>::topoSort(Gen &gen) | |||||||
|     { |     { | ||||||
|         if (tmpMarked.at(v)) |         if (tmpMarked.at(v)) | ||||||
|         { |         { | ||||||
|             HADRON_ERROR("cannot topologically sort a cyclic graph"); |             HADRON_ERROR(Range, "cannot topologically sort a cyclic graph"); | ||||||
|         } |         } | ||||||
|         if (!isMarked(v)) |         if (!isMarked(v)) | ||||||
|         { |         { | ||||||
|   | |||||||
| @@ -4,8 +4,7 @@ Grid physics library, www.github.com/paboyle/Grid | |||||||
|  |  | ||||||
| Source file: extras/Hadrons/HadronsXmlRun.cc | Source file: extras/Hadrons/HadronsXmlRun.cc | ||||||
|  |  | ||||||
| Copyright (C) 2015 | Copyright (C) 2015-2018 | ||||||
| Copyright (C) 2016 |  | ||||||
|  |  | ||||||
| Author: Antonin Portelli <antonin.portelli@me.com> | Author: Antonin Portelli <antonin.portelli@me.com> | ||||||
|  |  | ||||||
| @@ -55,12 +54,6 @@ int main(int argc, char *argv[]) | |||||||
|      |      | ||||||
|     // initialization |     // initialization | ||||||
|     Grid_init(&argc, &argv); |     Grid_init(&argc, &argv); | ||||||
|     HadronsLogError.Active(GridLogError.isActive()); |  | ||||||
|     HadronsLogWarning.Active(GridLogWarning.isActive()); |  | ||||||
|     HadronsLogMessage.Active(GridLogMessage.isActive()); |  | ||||||
|     HadronsLogIterative.Active(GridLogIterative.isActive()); |  | ||||||
|     HadronsLogDebug.Active(GridLogDebug.isActive()); |  | ||||||
|     LOG(Message) << "Grid initialized" << std::endl; |  | ||||||
|      |      | ||||||
|     // execution |     // execution | ||||||
|     Application application(parameterFileName); |     Application application(parameterFileName); | ||||||
|   | |||||||
| @@ -4,8 +4,7 @@ Grid physics library, www.github.com/paboyle/Grid | |||||||
|  |  | ||||||
| Source file: extras/Hadrons/HadronsXmlSchedule.cc | Source file: extras/Hadrons/HadronsXmlSchedule.cc | ||||||
|  |  | ||||||
| Copyright (C) 2015 | Copyright (C) 2015-2018 | ||||||
| Copyright (C) 2016 |  | ||||||
|  |  | ||||||
| Author: Antonin Portelli <antonin.portelli@me.com> | Author: Antonin Portelli <antonin.portelli@me.com> | ||||||
|  |  | ||||||
| @@ -49,12 +48,6 @@ int main(int argc, char *argv[]) | |||||||
|      |      | ||||||
|     // initialization |     // initialization | ||||||
|     Grid_init(&argc, &argv); |     Grid_init(&argc, &argv); | ||||||
|     HadronsLogError.Active(GridLogError.isActive()); |  | ||||||
|     HadronsLogWarning.Active(GridLogWarning.isActive()); |  | ||||||
|     HadronsLogMessage.Active(GridLogMessage.isActive()); |  | ||||||
|     HadronsLogIterative.Active(GridLogIterative.isActive()); |  | ||||||
|     HadronsLogDebug.Active(GridLogDebug.isActive()); |  | ||||||
|     LOG(Message) << "Grid initialized" << std::endl; |  | ||||||
|      |      | ||||||
|     // execution |     // execution | ||||||
|     Application application; |     Application application; | ||||||
|   | |||||||
| @@ -7,20 +7,24 @@ libHadrons_a_SOURCES = \ | |||||||
|     $(modules_cc)      \ |     $(modules_cc)      \ | ||||||
|     Application.cc     \ |     Application.cc     \ | ||||||
|     Environment.cc     \ |     Environment.cc     \ | ||||||
|  | 	Exceptions.cc      \ | ||||||
|     Global.cc          \ |     Global.cc          \ | ||||||
|     Module.cc |     Module.cc		   \ | ||||||
|  | 	VirtualMachine.cc | ||||||
| libHadrons_adir = $(pkgincludedir)/Hadrons | libHadrons_adir = $(pkgincludedir)/Hadrons | ||||||
| nobase_libHadrons_a_HEADERS = \ | nobase_libHadrons_a_HEADERS = \ | ||||||
| 	$(modules_hpp)            \ | 	$(modules_hpp)            \ | ||||||
| 	Application.hpp           \ | 	Application.hpp           \ | ||||||
| 	Environment.hpp           \ | 	Environment.hpp           \ | ||||||
|  | 	Exceptions.hpp            \ | ||||||
| 	Factory.hpp               \ | 	Factory.hpp               \ | ||||||
| 	GeneticScheduler.hpp      \ | 	GeneticScheduler.hpp      \ | ||||||
| 	Global.hpp                \ | 	Global.hpp                \ | ||||||
| 	Graph.hpp                 \ | 	Graph.hpp                 \ | ||||||
| 	Module.hpp                \ | 	Module.hpp                \ | ||||||
| 	Modules.hpp               \ | 	Modules.hpp               \ | ||||||
| 	ModuleFactory.hpp | 	ModuleFactory.hpp         \ | ||||||
|  | 	VirtualMachine.hpp | ||||||
|  |  | ||||||
| HadronsXmlRun_SOURCES = HadronsXmlRun.cc | HadronsXmlRun_SOURCES = HadronsXmlRun.cc | ||||||
| HadronsXmlRun_LDADD   = libHadrons.a -lGrid | HadronsXmlRun_LDADD   = libHadrons.a -lGrid | ||||||
|   | |||||||
| @@ -4,8 +4,7 @@ Grid physics library, www.github.com/paboyle/Grid | |||||||
|  |  | ||||||
| Source file: extras/Hadrons/Module.cc | Source file: extras/Hadrons/Module.cc | ||||||
|  |  | ||||||
| Copyright (C) 2015 | Copyright (C) 2015-2018 | ||||||
| Copyright (C) 2016 |  | ||||||
|  |  | ||||||
| Author: Antonin Portelli <antonin.portelli@me.com> | Author: Antonin Portelli <antonin.portelli@me.com> | ||||||
|  |  | ||||||
| @@ -39,7 +38,6 @@ using namespace Hadrons; | |||||||
| // constructor ///////////////////////////////////////////////////////////////// | // constructor ///////////////////////////////////////////////////////////////// | ||||||
| ModuleBase::ModuleBase(const std::string name) | ModuleBase::ModuleBase(const std::string name) | ||||||
| : name_(name) | : name_(name) | ||||||
| , env_(Environment::getInstance()) |  | ||||||
| {} | {} | ||||||
|  |  | ||||||
| // access ////////////////////////////////////////////////////////////////////// | // access ////////////////////////////////////////////////////////////////////// | ||||||
| @@ -48,15 +46,10 @@ std::string ModuleBase::getName(void) const | |||||||
|     return name_; |     return name_; | ||||||
| } | } | ||||||
|  |  | ||||||
| Environment & ModuleBase::env(void) const |  | ||||||
| { |  | ||||||
|     return env_; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // get factory registration name if available | // get factory registration name if available | ||||||
| std::string ModuleBase::getRegisteredName(void) | std::string ModuleBase::getRegisteredName(void) | ||||||
| { | { | ||||||
|     HADRON_ERROR("module '" + getName() + "' has a type not registered" |     HADRON_ERROR(Definition, "module '" + getName() + "' has no registered type" | ||||||
|                  + " in the factory"); |                  + " in the factory"); | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -64,8 +57,5 @@ std::string ModuleBase::getRegisteredName(void) | |||||||
| void ModuleBase::operator()(void) | void ModuleBase::operator()(void) | ||||||
| { | { | ||||||
|     setup(); |     setup(); | ||||||
|     if (!env().isDryRun()) |     execute(); | ||||||
|     { |  | ||||||
|         execute(); |  | ||||||
|     } |  | ||||||
| } | } | ||||||
|   | |||||||
| @@ -4,8 +4,7 @@ Grid physics library, www.github.com/paboyle/Grid | |||||||
|  |  | ||||||
| Source file: extras/Hadrons/Module.hpp | Source file: extras/Hadrons/Module.hpp | ||||||
|  |  | ||||||
| Copyright (C) 2015 | Copyright (C) 2015-2018 | ||||||
| Copyright (C) 2016 |  | ||||||
|  |  | ||||||
| Author: Antonin Portelli <antonin.portelli@me.com> | Author: Antonin Portelli <antonin.portelli@me.com> | ||||||
|  |  | ||||||
| @@ -31,7 +30,7 @@ See the full license in the file "LICENSE" in the top level distribution directo | |||||||
| #define Hadrons_Module_hpp_ | #define Hadrons_Module_hpp_ | ||||||
|  |  | ||||||
| #include <Grid/Hadrons/Global.hpp> | #include <Grid/Hadrons/Global.hpp> | ||||||
| #include <Grid/Hadrons/Environment.hpp> | #include <Grid/Hadrons/VirtualMachine.hpp> | ||||||
|  |  | ||||||
| BEGIN_HADRONS_NAMESPACE | BEGIN_HADRONS_NAMESPACE | ||||||
|  |  | ||||||
| @@ -87,6 +86,56 @@ public:\ | |||||||
| static ns##mod##ModuleRegistrar ns##mod##ModuleRegistrarInstance; | static ns##mod##ModuleRegistrar ns##mod##ModuleRegistrarInstance; | ||||||
|  |  | ||||||
| #define ARG(...) __VA_ARGS__ | #define ARG(...) __VA_ARGS__ | ||||||
|  | #define MACRO_REDIRECT(arg1, arg2, arg3, macro, ...) macro | ||||||
|  |  | ||||||
|  | #define envGet(type, name)\ | ||||||
|  | *env().template getObject<type>(name) | ||||||
|  |  | ||||||
|  | #define envGetTmp(type, var)\ | ||||||
|  | type &var = *env().template getObject<type>(getName() + "_tmp_" + #var) | ||||||
|  |  | ||||||
|  | #define envHasType(type, name)\ | ||||||
|  | env().template isObjectOfType<type>(name) | ||||||
|  |  | ||||||
|  | #define envCreate(type, name, Ls, ...)\ | ||||||
|  | env().template createObject<type>(name, Environment::Storage::object, Ls, __VA_ARGS__) | ||||||
|  |  | ||||||
|  | #define envCreateDerived(base, type, name, Ls, ...)\ | ||||||
|  | env().template createDerivedObject<base, type>(name, Environment::Storage::object, Ls, __VA_ARGS__) | ||||||
|  |  | ||||||
|  | #define envCreateLat4(type, name)\ | ||||||
|  | envCreate(type, name, 1, env().getGrid()) | ||||||
|  |  | ||||||
|  | #define envCreateLat5(type, name, Ls)\ | ||||||
|  | envCreate(type, name, Ls, env().getGrid(Ls)) | ||||||
|  |  | ||||||
|  | #define envCreateLat(...)\ | ||||||
|  | MACRO_REDIRECT(__VA_ARGS__, envCreateLat5, envCreateLat4)(__VA_ARGS__) | ||||||
|  |  | ||||||
|  | #define envCache(type, name, Ls, ...)\ | ||||||
|  | env().template createObject<type>(name, Environment::Storage::cache, Ls, __VA_ARGS__) | ||||||
|  |  | ||||||
|  | #define envCacheLat4(type, name)\ | ||||||
|  | envCache(type, name, 1, env().getGrid()) | ||||||
|  |  | ||||||
|  | #define envCacheLat5(type, name, Ls)\ | ||||||
|  | envCache(type, name, Ls, env().getGrid(Ls)) | ||||||
|  |  | ||||||
|  | #define envCacheLat(...)\ | ||||||
|  | MACRO_REDIRECT(__VA_ARGS__, envCacheLat5, envCacheLat4)(__VA_ARGS__) | ||||||
|  |  | ||||||
|  | #define envTmp(type, name, Ls, ...)\ | ||||||
|  | env().template createObject<type>(getName() + "_tmp_" + name,         \ | ||||||
|  |                                   Environment::Storage::temporary, Ls, __VA_ARGS__) | ||||||
|  |  | ||||||
|  | #define envTmpLat4(type, name)\ | ||||||
|  | envTmp(type, name, 1, env().getGrid()) | ||||||
|  |  | ||||||
|  | #define envTmpLat5(type, name, Ls)\ | ||||||
|  | envTmp(type, name, Ls, env().getGrid(Ls)) | ||||||
|  |  | ||||||
|  | #define envTmpLat(...)\ | ||||||
|  | MACRO_REDIRECT(__VA_ARGS__, envTmpLat5, envTmpLat4)(__VA_ARGS__) | ||||||
|  |  | ||||||
| /****************************************************************************** | /****************************************************************************** | ||||||
|  *                            Module class                                    * |  *                            Module class                                    * | ||||||
| @@ -101,23 +150,30 @@ public: | |||||||
|     virtual ~ModuleBase(void) = default; |     virtual ~ModuleBase(void) = default; | ||||||
|     // access |     // access | ||||||
|     std::string getName(void) const; |     std::string getName(void) const; | ||||||
|     Environment &env(void) const; |  | ||||||
|     // get factory registration name if available |     // get factory registration name if available | ||||||
|     virtual std::string getRegisteredName(void); |     virtual std::string getRegisteredName(void); | ||||||
|     // dependencies/products |     // dependencies/products | ||||||
|     virtual std::vector<std::string> getInput(void) = 0; |     virtual std::vector<std::string> getInput(void) = 0; | ||||||
|  |     virtual std::vector<std::string> getReference(void) | ||||||
|  |     { | ||||||
|  |         return std::vector<std::string>(0); | ||||||
|  |     }; | ||||||
|     virtual std::vector<std::string> getOutput(void) = 0; |     virtual std::vector<std::string> getOutput(void) = 0; | ||||||
|     // parse parameters |     // parse parameters | ||||||
|     virtual void parseParameters(XmlReader &reader, const std::string name) = 0; |     virtual void parseParameters(XmlReader &reader, const std::string name) = 0; | ||||||
|     virtual void saveParameters(XmlWriter &writer, const std::string name) = 0; |     virtual void saveParameters(XmlWriter &writer, const std::string name) = 0; | ||||||
|     // setup |     // setup | ||||||
|     virtual void setup(void) {}; |     virtual void setup(void) {}; | ||||||
|  |     virtual void execute(void) = 0; | ||||||
|     // execution |     // execution | ||||||
|     void operator()(void); |     void operator()(void); | ||||||
|     virtual void execute(void) = 0; | protected: | ||||||
|  |     // environment shortcut | ||||||
|  |     DEFINE_ENV_ALIAS; | ||||||
|  |     // virtual machine shortcut | ||||||
|  |     DEFINE_VM_ALIAS; | ||||||
| private: | private: | ||||||
|     std::string name_; |     std::string name_; | ||||||
|     Environment &env_; |  | ||||||
| }; | }; | ||||||
|  |  | ||||||
| // derived class, templating the parameter class | // derived class, templating the parameter class | ||||||
|   | |||||||
| @@ -4,8 +4,7 @@ Grid physics library, www.github.com/paboyle/Grid | |||||||
|  |  | ||||||
| Source file: extras/Hadrons/ModuleFactory.hpp | Source file: extras/Hadrons/ModuleFactory.hpp | ||||||
|  |  | ||||||
| Copyright (C) 2015 | Copyright (C) 2015-2018 | ||||||
| Copyright (C) 2016 |  | ||||||
|  |  | ||||||
| Author: Antonin Portelli <antonin.portelli@me.com> | Author: Antonin Portelli <antonin.portelli@me.com> | ||||||
|  |  | ||||||
|   | |||||||
| @@ -4,10 +4,10 @@ Grid physics library, www.github.com/paboyle/Grid | |||||||
|  |  | ||||||
| Source file: extras/Hadrons/Modules.hpp | Source file: extras/Hadrons/Modules.hpp | ||||||
|  |  | ||||||
| Copyright (C) 2015 | Copyright (C) 2015-2018 | ||||||
| Copyright (C) 2016 |  | ||||||
|  |  | ||||||
| Author: Antonin Portelli <antonin.portelli@me.com> | Author: Antonin Portelli <antonin.portelli@me.com> | ||||||
|  | Author: Lanny91 <andrew.lawson@gmail.com> | ||||||
|  |  | ||||||
| This program is free software; you can redistribute it and/or modify | This program is free software; you can redistribute it and/or modify | ||||||
| it under the terms of the GNU General Public License as published by | it under the terms of the GNU General Public License as published by | ||||||
| @@ -26,15 +26,39 @@ with this program; if not, write to the Free Software Foundation, Inc., | |||||||
| See the full license in the file "LICENSE" in the top level distribution directory | See the full license in the file "LICENSE" in the top level distribution directory | ||||||
| *************************************************************************************/ | *************************************************************************************/ | ||||||
| /*  END LEGAL */ | /*  END LEGAL */ | ||||||
| #include <Grid/Hadrons/Modules/MAction/DWF.hpp> |  | ||||||
| #include <Grid/Hadrons/Modules/MAction/Wilson.hpp> |  | ||||||
| #include <Grid/Hadrons/Modules/MContraction/Baryon.hpp> | #include <Grid/Hadrons/Modules/MContraction/Baryon.hpp> | ||||||
| #include <Grid/Hadrons/Modules/MContraction/Meson.hpp> | #include <Grid/Hadrons/Modules/MContraction/Meson.hpp> | ||||||
| #include <Grid/Hadrons/Modules/MGauge/Load.hpp> | #include <Grid/Hadrons/Modules/MContraction/WeakHamiltonian.hpp> | ||||||
| #include <Grid/Hadrons/Modules/MGauge/Random.hpp> | #include <Grid/Hadrons/Modules/MContraction/WeakHamiltonianNonEye.hpp> | ||||||
| #include <Grid/Hadrons/Modules/MGauge/Unit.hpp> | #include <Grid/Hadrons/Modules/MContraction/DiscLoop.hpp> | ||||||
| #include <Grid/Hadrons/Modules/MSolver/RBPrecCG.hpp> | #include <Grid/Hadrons/Modules/MContraction/WeakNeutral4ptDisc.hpp> | ||||||
| #include <Grid/Hadrons/Modules/MSource/Point.hpp> | #include <Grid/Hadrons/Modules/MContraction/Gamma3pt.hpp> | ||||||
|  | #include <Grid/Hadrons/Modules/MContraction/WardIdentity.hpp> | ||||||
|  | #include <Grid/Hadrons/Modules/MContraction/WeakHamiltonianEye.hpp> | ||||||
|  | #include <Grid/Hadrons/Modules/MFermion/GaugeProp.hpp> | ||||||
| #include <Grid/Hadrons/Modules/MSource/SeqGamma.hpp> | #include <Grid/Hadrons/Modules/MSource/SeqGamma.hpp> | ||||||
|  | #include <Grid/Hadrons/Modules/MSource/Point.hpp> | ||||||
|  | #include <Grid/Hadrons/Modules/MSource/Wall.hpp> | ||||||
| #include <Grid/Hadrons/Modules/MSource/Z2.hpp> | #include <Grid/Hadrons/Modules/MSource/Z2.hpp> | ||||||
| #include <Grid/Hadrons/Modules/Quark.hpp> | #include <Grid/Hadrons/Modules/MSource/SeqConserved.hpp> | ||||||
|  | #include <Grid/Hadrons/Modules/MSink/Smear.hpp> | ||||||
|  | #include <Grid/Hadrons/Modules/MSink/Point.hpp> | ||||||
|  | #include <Grid/Hadrons/Modules/MSolver/RBPrecCG.hpp> | ||||||
|  | #include <Grid/Hadrons/Modules/MGauge/Unit.hpp> | ||||||
|  | #include <Grid/Hadrons/Modules/MGauge/Random.hpp> | ||||||
|  | #include <Grid/Hadrons/Modules/MGauge/StochEm.hpp> | ||||||
|  | #include <Grid/Hadrons/Modules/MGauge/FundtoHirep.hpp> | ||||||
|  | #include <Grid/Hadrons/Modules/MUtilities/TestSeqGamma.hpp> | ||||||
|  | #include <Grid/Hadrons/Modules/MUtilities/TestSeqConserved.hpp> | ||||||
|  | #include <Grid/Hadrons/Modules/MLoop/NoiseLoop.hpp> | ||||||
|  | #include <Grid/Hadrons/Modules/MScalar/FreeProp.hpp> | ||||||
|  | #include <Grid/Hadrons/Modules/MScalar/Scalar.hpp> | ||||||
|  | #include <Grid/Hadrons/Modules/MScalar/ChargedProp.hpp> | ||||||
|  | #include <Grid/Hadrons/Modules/MAction/DWF.hpp> | ||||||
|  | #include <Grid/Hadrons/Modules/MAction/Wilson.hpp> | ||||||
|  | #include <Grid/Hadrons/Modules/MAction/WilsonClover.hpp> | ||||||
|  | #include <Grid/Hadrons/Modules/MScalarSUN/TrMag.hpp> | ||||||
|  | #include <Grid/Hadrons/Modules/MScalarSUN/TwoPoint.hpp> | ||||||
|  | #include <Grid/Hadrons/Modules/MScalarSUN/TrPhi.hpp> | ||||||
|  | #include <Grid/Hadrons/Modules/MIO/LoadNersc.hpp> | ||||||
|  | #include <Grid/Hadrons/Modules/MIO/LoadBinary.hpp> | ||||||
|   | |||||||
| @@ -4,10 +4,10 @@ Grid physics library, www.github.com/paboyle/Grid | |||||||
|  |  | ||||||
| Source file: extras/Hadrons/Modules/MAction/DWF.hpp | Source file: extras/Hadrons/Modules/MAction/DWF.hpp | ||||||
|  |  | ||||||
| Copyright (C) 2015 | Copyright (C) 2015-2018 | ||||||
| Copyright (C) 2016 |  | ||||||
|  |  | ||||||
| Author: Antonin Portelli <antonin.portelli@me.com> | Author: Antonin Portelli <antonin.portelli@me.com> | ||||||
|  | Author: Lanny91 <andrew.lawson@gmail.com> | ||||||
|  |  | ||||||
| This program is free software; you can redistribute it and/or modify | This program is free software; you can redistribute it and/or modify | ||||||
| it under the terms of the GNU General Public License as published by | it under the terms of the GNU General Public License as published by | ||||||
| @@ -27,8 +27,8 @@ See the full license in the file "LICENSE" in the top level distribution directo | |||||||
| *************************************************************************************/ | *************************************************************************************/ | ||||||
| /*  END LEGAL */ | /*  END LEGAL */ | ||||||
|  |  | ||||||
| #ifndef Hadrons_DWF_hpp_ | #ifndef Hadrons_MAction_DWF_hpp_ | ||||||
| #define Hadrons_DWF_hpp_ | #define Hadrons_MAction_DWF_hpp_ | ||||||
|  |  | ||||||
| #include <Grid/Hadrons/Global.hpp> | #include <Grid/Hadrons/Global.hpp> | ||||||
| #include <Grid/Hadrons/Module.hpp> | #include <Grid/Hadrons/Module.hpp> | ||||||
| @@ -48,14 +48,15 @@ public: | |||||||
|                                     std::string, gauge, |                                     std::string, gauge, | ||||||
|                                     unsigned int, Ls, |                                     unsigned int, Ls, | ||||||
|                                     double      , mass, |                                     double      , mass, | ||||||
|                                     double      , M5); |                                     double      , M5, | ||||||
|  |                                     std::string , boundary); | ||||||
| }; | }; | ||||||
|  |  | ||||||
| template <typename FImpl> | template <typename FImpl> | ||||||
| class TDWF: public Module<DWFPar> | class TDWF: public Module<DWFPar> | ||||||
| { | { | ||||||
| public: | public: | ||||||
|     TYPE_ALIASES(FImpl,); |     FGS_TYPE_ALIASES(FImpl,); | ||||||
| public: | public: | ||||||
|     // constructor |     // constructor | ||||||
|     TDWF(const std::string name); |     TDWF(const std::string name); | ||||||
| @@ -64,6 +65,7 @@ public: | |||||||
|     // dependency relation |     // dependency relation | ||||||
|     virtual std::vector<std::string> getInput(void); |     virtual std::vector<std::string> getInput(void); | ||||||
|     virtual std::vector<std::string> getOutput(void); |     virtual std::vector<std::string> getOutput(void); | ||||||
|  | protected: | ||||||
|     // setup |     // setup | ||||||
|     virtual void setup(void); |     virtual void setup(void); | ||||||
|     // execution |     // execution | ||||||
| @@ -102,33 +104,32 @@ std::vector<std::string> TDWF<FImpl>::getOutput(void) | |||||||
| template <typename FImpl> | template <typename FImpl> | ||||||
| void TDWF<FImpl>::setup(void) | void TDWF<FImpl>::setup(void) | ||||||
| { | { | ||||||
|     unsigned int size; |     LOG(Message) << "Setting up domain wall fermion matrix with m= " | ||||||
|      |                  << par().mass << ", M5= " << par().M5 << " and Ls= " | ||||||
|     size = 2*env().template lattice4dSize<typename FImpl::DoubledGaugeField>(); |                  << par().Ls << " using gauge field '" << par().gauge << "'" | ||||||
|     env().registerObject(getName(), size, par().Ls); |                  << std::endl; | ||||||
|  |     LOG(Message) << "Fermion boundary conditions: " << par().boundary | ||||||
|  |                  << std::endl; | ||||||
|  |                   | ||||||
|  |     env().createGrid(par().Ls); | ||||||
|  |     auto &U    = envGet(LatticeGaugeField, par().gauge); | ||||||
|  |     auto &g4   = *env().getGrid(); | ||||||
|  |     auto &grb4 = *env().getRbGrid(); | ||||||
|  |     auto &g5   = *env().getGrid(par().Ls); | ||||||
|  |     auto &grb5 = *env().getRbGrid(par().Ls); | ||||||
|  |     std::vector<Complex> boundary = strToVec<Complex>(par().boundary); | ||||||
|  |     typename DomainWallFermion<FImpl>::ImplParams implParams(boundary); | ||||||
|  |     envCreateDerived(FMat, DomainWallFermion<FImpl>, getName(), par().Ls, U, g5, | ||||||
|  |                      grb5, g4, grb4, par().mass, par().M5, implParams); | ||||||
| } | } | ||||||
|  |  | ||||||
| // execution /////////////////////////////////////////////////////////////////// | // execution /////////////////////////////////////////////////////////////////// | ||||||
| template <typename FImpl> | template <typename FImpl> | ||||||
| void TDWF<FImpl>::execute(void) | void TDWF<FImpl>::execute(void) | ||||||
| { | {} | ||||||
|     LOG(Message) << "Setting up domain wall fermion matrix with m= " |  | ||||||
|                  << par().mass << ", M5= " << par().M5 << " and Ls= " |  | ||||||
|                  << par().Ls << " using gauge field '" << par().gauge << "'" |  | ||||||
|                  << std::endl; |  | ||||||
|     env().createGrid(par().Ls); |  | ||||||
|     auto &U      = *env().template getObject<LatticeGaugeField>(par().gauge); |  | ||||||
|     auto &g4     = *env().getGrid(); |  | ||||||
|     auto &grb4   = *env().getRbGrid(); |  | ||||||
|     auto &g5     = *env().getGrid(par().Ls); |  | ||||||
|     auto &grb5   = *env().getRbGrid(par().Ls); |  | ||||||
|     FMat *fMatPt = new DomainWallFermion<FImpl>(U, g5, grb5, g4, grb4, |  | ||||||
|                                                 par().mass, par().M5); |  | ||||||
|     env().setObject(getName(), fMatPt); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| END_MODULE_NAMESPACE | END_MODULE_NAMESPACE | ||||||
|  |  | ||||||
| END_HADRONS_NAMESPACE | END_HADRONS_NAMESPACE | ||||||
|  |  | ||||||
| #endif // Hadrons_DWF_hpp_ | #endif // Hadrons_MAction_DWF_hpp_ | ||||||
|   | |||||||
| @@ -4,10 +4,10 @@ Grid physics library, www.github.com/paboyle/Grid | |||||||
|  |  | ||||||
| Source file: extras/Hadrons/Modules/MAction/Wilson.hpp | Source file: extras/Hadrons/Modules/MAction/Wilson.hpp | ||||||
|  |  | ||||||
| Copyright (C) 2015 | Copyright (C) 2015-2018 | ||||||
| Copyright (C) 2016 |  | ||||||
|  |  | ||||||
| Author: Antonin Portelli <antonin.portelli@me.com> | Author: Antonin Portelli <antonin.portelli@me.com> | ||||||
|  | Author: Lanny91 <andrew.lawson@gmail.com> | ||||||
|  |  | ||||||
| This program is free software; you can redistribute it and/or modify | This program is free software; you can redistribute it and/or modify | ||||||
| it under the terms of the GNU General Public License as published by | it under the terms of the GNU General Public License as published by | ||||||
| @@ -27,8 +27,8 @@ See the full license in the file "LICENSE" in the top level distribution directo | |||||||
| *************************************************************************************/ | *************************************************************************************/ | ||||||
| /*  END LEGAL */ | /*  END LEGAL */ | ||||||
|  |  | ||||||
| #ifndef Hadrons_Wilson_hpp_ | #ifndef Hadrons_MAction_Wilson_hpp_ | ||||||
| #define Hadrons_Wilson_hpp_ | #define Hadrons_MAction_Wilson_hpp_ | ||||||
|  |  | ||||||
| #include <Grid/Hadrons/Global.hpp> | #include <Grid/Hadrons/Global.hpp> | ||||||
| #include <Grid/Hadrons/Module.hpp> | #include <Grid/Hadrons/Module.hpp> | ||||||
| @@ -46,14 +46,15 @@ class WilsonPar: Serializable | |||||||
| public: | public: | ||||||
|     GRID_SERIALIZABLE_CLASS_MEMBERS(WilsonPar, |     GRID_SERIALIZABLE_CLASS_MEMBERS(WilsonPar, | ||||||
|                                     std::string, gauge, |                                     std::string, gauge, | ||||||
|                                     double     , mass); |                                     double     , mass, | ||||||
|  |                                     std::string, boundary); | ||||||
| }; | }; | ||||||
|  |  | ||||||
| template <typename FImpl> | template <typename FImpl> | ||||||
| class TWilson: public Module<WilsonPar> | class TWilson: public Module<WilsonPar> | ||||||
| { | { | ||||||
| public: | public: | ||||||
|     TYPE_ALIASES(FImpl,); |     FGS_TYPE_ALIASES(FImpl,); | ||||||
| public: | public: | ||||||
|     // constructor |     // constructor | ||||||
|     TWilson(const std::string name); |     TWilson(const std::string name); | ||||||
| @@ -62,6 +63,7 @@ public: | |||||||
|     // dependencies/products |     // dependencies/products | ||||||
|     virtual std::vector<std::string> getInput(void); |     virtual std::vector<std::string> getInput(void); | ||||||
|     virtual std::vector<std::string> getOutput(void); |     virtual std::vector<std::string> getOutput(void); | ||||||
|  | protected: | ||||||
|     // setup |     // setup | ||||||
|     virtual void setup(void); |     virtual void setup(void); | ||||||
|     // execution |     // execution | ||||||
| @@ -100,24 +102,24 @@ std::vector<std::string> TWilson<FImpl>::getOutput(void) | |||||||
| template <typename FImpl> | template <typename FImpl> | ||||||
| void TWilson<FImpl>::setup(void) | void TWilson<FImpl>::setup(void) | ||||||
| { | { | ||||||
|     unsigned int size; |     LOG(Message) << "Setting up TWilson fermion matrix with m= " << par().mass | ||||||
|      |                  << " using gauge field '" << par().gauge << "'" << std::endl; | ||||||
|     size = 2*env().template lattice4dSize<typename FImpl::DoubledGaugeField>(); |     LOG(Message) << "Fermion boundary conditions: " << par().boundary | ||||||
|     env().registerObject(getName(), size); |                  << std::endl; | ||||||
|  |                   | ||||||
|  |     auto &U      = envGet(LatticeGaugeField, par().gauge); | ||||||
|  |     auto &grid   = *env().getGrid(); | ||||||
|  |     auto &gridRb = *env().getRbGrid(); | ||||||
|  |     std::vector<Complex> boundary = strToVec<Complex>(par().boundary); | ||||||
|  |     typename WilsonFermion<FImpl>::ImplParams implParams(boundary); | ||||||
|  |     envCreateDerived(FMat, WilsonFermion<FImpl>, getName(), 1, U, grid, gridRb, | ||||||
|  |                      par().mass, implParams); | ||||||
| } | } | ||||||
|  |  | ||||||
| // execution /////////////////////////////////////////////////////////////////// | // execution /////////////////////////////////////////////////////////////////// | ||||||
| template <typename FImpl> | template <typename FImpl> | ||||||
| void TWilson<FImpl>::execute() | void TWilson<FImpl>::execute() | ||||||
| { | {} | ||||||
|     LOG(Message) << "Setting up TWilson fermion matrix with m= " << par().mass |  | ||||||
|                  << " using gauge field '" << par().gauge << "'" << std::endl; |  | ||||||
|     auto &U      = *env().template getObject<LatticeGaugeField>(par().gauge); |  | ||||||
|     auto &grid   = *env().getGrid(); |  | ||||||
|     auto &gridRb = *env().getRbGrid(); |  | ||||||
|     FMat *fMatPt = new WilsonFermion<FImpl>(U, grid, gridRb, par().mass); |  | ||||||
|     env().setObject(getName(), fMatPt); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| END_MODULE_NAMESPACE | END_MODULE_NAMESPACE | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										153
									
								
								extras/Hadrons/Modules/MAction/WilsonClover.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										153
									
								
								extras/Hadrons/Modules/MAction/WilsonClover.hpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,153 @@ | |||||||
|  | /************************************************************************************* | ||||||
|  |  | ||||||
|  | Grid physics library, www.github.com/paboyle/Grid  | ||||||
|  |  | ||||||
|  | Source file: extras/Hadrons/Modules/MAction/Wilson.hpp | ||||||
|  |  | ||||||
|  | Copyright (C) 2015 | ||||||
|  | Copyright (C) 2016 | ||||||
|  |  | ||||||
|  | Author: Antonin Portelli <antonin.portelli@me.com> | ||||||
|  |  | ||||||
|  | This program is free software; you can redistribute it and/or modify | ||||||
|  | it under the terms of the GNU General Public License as published by | ||||||
|  | the Free Software Foundation; either version 2 of the License, or | ||||||
|  | (at your option) any later version. | ||||||
|  |  | ||||||
|  | This program is distributed in the hope that it will be useful, | ||||||
|  | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||||
|  | GNU General Public License for more details. | ||||||
|  |  | ||||||
|  | You should have received a copy of the GNU General Public License along | ||||||
|  | with this program; if not, write to the Free Software Foundation, Inc., | ||||||
|  | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | ||||||
|  |  | ||||||
|  | See the full license in the file "LICENSE" in the top level distribution directory | ||||||
|  | *************************************************************************************/ | ||||||
|  | /*  END LEGAL */ | ||||||
|  |  | ||||||
|  | #ifndef Hadrons_MAction_WilsonClover_hpp_ | ||||||
|  | #define Hadrons_MAction_WilsonClover_hpp_ | ||||||
|  |  | ||||||
|  | #include <Grid/Hadrons/Global.hpp> | ||||||
|  | #include <Grid/Hadrons/Module.hpp> | ||||||
|  | #include <Grid/Hadrons/ModuleFactory.hpp> | ||||||
|  |  | ||||||
|  | BEGIN_HADRONS_NAMESPACE | ||||||
|  |  | ||||||
|  | /****************************************************************************** | ||||||
|  |  *                            TWilson quark action                            * | ||||||
|  |  ******************************************************************************/ | ||||||
|  | BEGIN_MODULE_NAMESPACE(MAction) | ||||||
|  |  | ||||||
|  | class WilsonCloverPar: Serializable | ||||||
|  | { | ||||||
|  | public: | ||||||
|  |     GRID_SERIALIZABLE_CLASS_MEMBERS(WilsonCloverPar, | ||||||
|  |                                     std::string, gauge, | ||||||
|  |                                     double     , mass, | ||||||
|  | 				                    double     , csw_r, | ||||||
|  | 				                    double     , csw_t, | ||||||
|  | 				                    WilsonAnisotropyCoefficients ,clover_anisotropy, | ||||||
|  |                                     std::string, boundary | ||||||
|  | 				    ); | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | template <typename FImpl> | ||||||
|  | class TWilsonClover: public Module<WilsonCloverPar> | ||||||
|  | { | ||||||
|  | public: | ||||||
|  |     FGS_TYPE_ALIASES(FImpl,); | ||||||
|  | public: | ||||||
|  |     // constructor | ||||||
|  |     TWilsonClover(const std::string name); | ||||||
|  |     // destructor | ||||||
|  |     virtual ~TWilsonClover(void) = default; | ||||||
|  |     // dependencies/products | ||||||
|  |     virtual std::vector<std::string> getInput(void); | ||||||
|  |     virtual std::vector<std::string> getOutput(void); | ||||||
|  |     // setup | ||||||
|  |     virtual void setup(void); | ||||||
|  |     // execution | ||||||
|  |     virtual void execute(void); | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | MODULE_REGISTER_NS(WilsonClover, TWilsonClover<FIMPL>, MAction); | ||||||
|  |  | ||||||
|  | /****************************************************************************** | ||||||
|  |  *                     TWilsonClover template implementation                        * | ||||||
|  |  ******************************************************************************/ | ||||||
|  | // constructor ///////////////////////////////////////////////////////////////// | ||||||
|  | template <typename FImpl> | ||||||
|  | TWilsonClover<FImpl>::TWilsonClover(const std::string name) | ||||||
|  | : Module<WilsonCloverPar>(name) | ||||||
|  | {} | ||||||
|  |  | ||||||
|  | // dependencies/products /////////////////////////////////////////////////////// | ||||||
|  | template <typename FImpl> | ||||||
|  | std::vector<std::string> TWilsonClover<FImpl>::getInput(void) | ||||||
|  | { | ||||||
|  |     std::vector<std::string> in = {par().gauge}; | ||||||
|  |  | ||||||
|  |     return in; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | template <typename FImpl> | ||||||
|  | std::vector<std::string> TWilsonClover<FImpl>::getOutput(void) | ||||||
|  | { | ||||||
|  |     std::vector<std::string> out = {getName()}; | ||||||
|  |  | ||||||
|  |     return out; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // setup /////////////////////////////////////////////////////////////////////// | ||||||
|  | template <typename FImpl> | ||||||
|  | void TWilsonClover<FImpl>::setup(void) | ||||||
|  | { | ||||||
|  |     //unsigned int size; | ||||||
|  |  | ||||||
|  |     // size = 2*env().template lattice4dSize<typename FImpl::DoubledGaugeField>(); | ||||||
|  |     // env().registerObject(getName(), size); | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     LOG(Message) << "Setting up TWilsonClover fermion matrix with m= " << par().mass | ||||||
|  |                  << " using gauge field '" << par().gauge << "'" << std::endl; | ||||||
|  |     LOG(Message) << "Fermion boundary conditions: " << par().boundary  | ||||||
|  |                  << std::endl; | ||||||
|  |     LOG(Message) << "Clover term csw_r: " << par().csw_r | ||||||
|  |                  << " csw_t: " << par().csw_t | ||||||
|  |                  << std::endl; | ||||||
|  |     auto &U      = envGet(LatticeGaugeField, par().gauge); | ||||||
|  |     auto &grid   = *env().getGrid(); | ||||||
|  |     auto &gridRb = *env().getRbGrid(); | ||||||
|  |     std::vector<Complex> boundary = strToVec<Complex>(par().boundary); | ||||||
|  |     typename WilsonCloverFermion<FImpl>::ImplParams implParams(boundary); | ||||||
|  |     envCreateDerived(FMat, WilsonCloverFermion<FImpl>, getName(), 1, U, grid, gridRb, par().mass, | ||||||
|  | 						  par().csw_r, | ||||||
|  | 						  par().csw_t, | ||||||
|  | 					      par().clover_anisotropy, | ||||||
|  | 						  implParams);  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     //FMat *fMatPt = new WilsonCloverFermion<FImpl>(U, grid, gridRb, par().mass, | ||||||
|  | 	//					  par().csw_r, | ||||||
|  | 	//					  par().csw_t, | ||||||
|  | 	//				      par().clover_anisotropy, | ||||||
|  | 	//					  implParams); | ||||||
|  |     //env().setObject(getName(), fMatPt); | ||||||
|  |  | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // execution /////////////////////////////////////////////////////////////////// | ||||||
|  | template <typename FImpl> | ||||||
|  | void TWilsonClover<FImpl>::execute() | ||||||
|  | { | ||||||
|  |  | ||||||
|  | } | ||||||
|  |  | ||||||
|  | END_MODULE_NAMESPACE | ||||||
|  |  | ||||||
|  | END_HADRONS_NAMESPACE | ||||||
|  |  | ||||||
|  | #endif // Hadrons_WilsonClover_hpp_ | ||||||
| @@ -4,10 +4,10 @@ Grid physics library, www.github.com/paboyle/Grid | |||||||
|  |  | ||||||
| Source file: extras/Hadrons/Modules/MContraction/Baryon.hpp | Source file: extras/Hadrons/Modules/MContraction/Baryon.hpp | ||||||
|  |  | ||||||
| Copyright (C) 2015 | Copyright (C) 2015-2018 | ||||||
| Copyright (C) 2016 |  | ||||||
|  |  | ||||||
| Author: Antonin Portelli <antonin.portelli@me.com> | Author: Antonin Portelli <antonin.portelli@me.com> | ||||||
|  | Author: Lanny91 <andrew.lawson@gmail.com> | ||||||
|  |  | ||||||
| This program is free software; you can redistribute it and/or modify | This program is free software; you can redistribute it and/or modify | ||||||
| it under the terms of the GNU General Public License as published by | it under the terms of the GNU General Public License as published by | ||||||
| @@ -27,8 +27,8 @@ See the full license in the file "LICENSE" in the top level distribution directo | |||||||
| *************************************************************************************/ | *************************************************************************************/ | ||||||
| /*  END LEGAL */ | /*  END LEGAL */ | ||||||
|  |  | ||||||
| #ifndef Hadrons_Baryon_hpp_ | #ifndef Hadrons_MContraction_Baryon_hpp_ | ||||||
| #define Hadrons_Baryon_hpp_ | #define Hadrons_MContraction_Baryon_hpp_ | ||||||
|  |  | ||||||
| #include <Grid/Hadrons/Global.hpp> | #include <Grid/Hadrons/Global.hpp> | ||||||
| #include <Grid/Hadrons/Module.hpp> | #include <Grid/Hadrons/Module.hpp> | ||||||
| @@ -55,9 +55,9 @@ template <typename FImpl1, typename FImpl2, typename FImpl3> | |||||||
| class TBaryon: public Module<BaryonPar> | class TBaryon: public Module<BaryonPar> | ||||||
| { | { | ||||||
| public: | public: | ||||||
|     TYPE_ALIASES(FImpl1, 1); |     FERM_TYPE_ALIASES(FImpl1, 1); | ||||||
|     TYPE_ALIASES(FImpl2, 2); |     FERM_TYPE_ALIASES(FImpl2, 2); | ||||||
|     TYPE_ALIASES(FImpl3, 3); |     FERM_TYPE_ALIASES(FImpl3, 3); | ||||||
|     class Result: Serializable |     class Result: Serializable | ||||||
|     { |     { | ||||||
|     public: |     public: | ||||||
| @@ -72,6 +72,9 @@ public: | |||||||
|     // dependency relation |     // dependency relation | ||||||
|     virtual std::vector<std::string> getInput(void); |     virtual std::vector<std::string> getInput(void); | ||||||
|     virtual std::vector<std::string> getOutput(void); |     virtual std::vector<std::string> getOutput(void); | ||||||
|  | protected: | ||||||
|  |     // setup | ||||||
|  |     virtual void setup(void); | ||||||
|     // execution |     // execution | ||||||
|     virtual void execute(void); |     virtual void execute(void); | ||||||
| }; | }; | ||||||
| @@ -99,11 +102,18 @@ std::vector<std::string> TBaryon<FImpl1, FImpl2, FImpl3>::getInput(void) | |||||||
| template <typename FImpl1, typename FImpl2, typename FImpl3> | template <typename FImpl1, typename FImpl2, typename FImpl3> | ||||||
| std::vector<std::string> TBaryon<FImpl1, FImpl2, FImpl3>::getOutput(void) | std::vector<std::string> TBaryon<FImpl1, FImpl2, FImpl3>::getOutput(void) | ||||||
| { | { | ||||||
|     std::vector<std::string> out = {getName()}; |     std::vector<std::string> out = {}; | ||||||
|      |      | ||||||
|     return out; |     return out; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | // setup /////////////////////////////////////////////////////////////////////// | ||||||
|  | template <typename FImpl1, typename FImpl2, typename FImpl3> | ||||||
|  | void TBaryon<FImpl1, FImpl2, FImpl3>::setup(void) | ||||||
|  | { | ||||||
|  |     envTmpLat(LatticeComplex, "c"); | ||||||
|  | } | ||||||
|  |  | ||||||
| // execution /////////////////////////////////////////////////////////////////// | // execution /////////////////////////////////////////////////////////////////// | ||||||
| template <typename FImpl1, typename FImpl2, typename FImpl3> | template <typename FImpl1, typename FImpl2, typename FImpl3> | ||||||
| void TBaryon<FImpl1, FImpl2, FImpl3>::execute(void) | void TBaryon<FImpl1, FImpl2, FImpl3>::execute(void) | ||||||
| @@ -112,20 +122,20 @@ void TBaryon<FImpl1, FImpl2, FImpl3>::execute(void) | |||||||
|                  << " quarks '" << par().q1 << "', '" << par().q2 << "', and '" |                  << " quarks '" << par().q1 << "', '" << par().q2 << "', and '" | ||||||
|                  << par().q3 << "'" << std::endl; |                  << par().q3 << "'" << std::endl; | ||||||
|      |      | ||||||
|     XmlWriter             writer(par().output); |     ResultWriter writer(RESULT_FILE_NAME(par().output)); | ||||||
|     PropagatorField1      &q1 = *env().template getObject<PropagatorField1>(par().q1); |     auto       &q1 = envGet(PropagatorField1, par().q1); | ||||||
|     PropagatorField2      &q2 = *env().template getObject<PropagatorField2>(par().q2); |     auto       &q2 = envGet(PropagatorField2, par().q2); | ||||||
|     PropagatorField3      &q3 = *env().template getObject<PropagatorField3>(par().q2); |     auto       &q3 = envGet(PropagatorField3, par().q2); | ||||||
|     LatticeComplex        c(env().getGrid()); |     envGetTmp(LatticeComplex, c); | ||||||
|     Result                result; |     Result     result; | ||||||
|      |      | ||||||
|     // FIXME: do contractions |     // FIXME: do contractions | ||||||
|      |      | ||||||
|     write(writer, "meson", result); |     // write(writer, "meson", result); | ||||||
| } | } | ||||||
|  |  | ||||||
| END_MODULE_NAMESPACE | END_MODULE_NAMESPACE | ||||||
|  |  | ||||||
| END_HADRONS_NAMESPACE | END_HADRONS_NAMESPACE | ||||||
|  |  | ||||||
| #endif // Hadrons_Baryon_hpp_ | #endif // Hadrons_MContraction_Baryon_hpp_ | ||||||
|   | |||||||
							
								
								
									
										146
									
								
								extras/Hadrons/Modules/MContraction/DiscLoop.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										146
									
								
								extras/Hadrons/Modules/MContraction/DiscLoop.hpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,146 @@ | |||||||
|  | /************************************************************************************* | ||||||
|  |  | ||||||
|  | Grid physics library, www.github.com/paboyle/Grid  | ||||||
|  |  | ||||||
|  | Source file: extras/Hadrons/Modules/MContraction/DiscLoop.hpp | ||||||
|  |  | ||||||
|  | Copyright (C) 2015-2018 | ||||||
|  |  | ||||||
|  | Author: Antonin Portelli <antonin.portelli@me.com> | ||||||
|  | Author: Lanny91 <andrew.lawson@gmail.com> | ||||||
|  |  | ||||||
|  | This program is free software; you can redistribute it and/or modify | ||||||
|  | it under the terms of the GNU General Public License as published by | ||||||
|  | the Free Software Foundation; either version 2 of the License, or | ||||||
|  | (at your option) any later version. | ||||||
|  |  | ||||||
|  | This program is distributed in the hope that it will be useful, | ||||||
|  | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||||
|  | GNU General Public License for more details. | ||||||
|  |  | ||||||
|  | You should have received a copy of the GNU General Public License along | ||||||
|  | with this program; if not, write to the Free Software Foundation, Inc., | ||||||
|  | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | ||||||
|  |  | ||||||
|  | See the full license in the file "LICENSE" in the top level distribution directory | ||||||
|  | *************************************************************************************/ | ||||||
|  | /*  END LEGAL */ | ||||||
|  |  | ||||||
|  | #ifndef Hadrons_MContraction_DiscLoop_hpp_ | ||||||
|  | #define Hadrons_MContraction_DiscLoop_hpp_ | ||||||
|  |  | ||||||
|  | #include <Grid/Hadrons/Global.hpp> | ||||||
|  | #include <Grid/Hadrons/Module.hpp> | ||||||
|  | #include <Grid/Hadrons/ModuleFactory.hpp> | ||||||
|  |  | ||||||
|  | BEGIN_HADRONS_NAMESPACE | ||||||
|  |  | ||||||
|  | /****************************************************************************** | ||||||
|  |  *                                DiscLoop                                    * | ||||||
|  |  ******************************************************************************/ | ||||||
|  | BEGIN_MODULE_NAMESPACE(MContraction) | ||||||
|  |  | ||||||
|  | class DiscLoopPar: Serializable | ||||||
|  | { | ||||||
|  | public: | ||||||
|  |     GRID_SERIALIZABLE_CLASS_MEMBERS(DiscLoopPar, | ||||||
|  |                                     std::string,    q_loop, | ||||||
|  |                                     Gamma::Algebra, gamma, | ||||||
|  |                                     std::string,    output); | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | template <typename FImpl> | ||||||
|  | class TDiscLoop: public Module<DiscLoopPar> | ||||||
|  | { | ||||||
|  |     FERM_TYPE_ALIASES(FImpl,); | ||||||
|  |     class Result: Serializable | ||||||
|  |     { | ||||||
|  |     public: | ||||||
|  |         GRID_SERIALIZABLE_CLASS_MEMBERS(Result, | ||||||
|  |                                         Gamma::Algebra, gamma, | ||||||
|  |                                         std::vector<Complex>, corr); | ||||||
|  |     }; | ||||||
|  | public: | ||||||
|  |     // constructor | ||||||
|  |     TDiscLoop(const std::string name); | ||||||
|  |     // destructor | ||||||
|  |     virtual ~TDiscLoop(void) = default; | ||||||
|  |     // dependency relation | ||||||
|  |     virtual std::vector<std::string> getInput(void); | ||||||
|  |     virtual std::vector<std::string> getOutput(void); | ||||||
|  | protected: | ||||||
|  |     // setup | ||||||
|  |     virtual void setup(void); | ||||||
|  |     // execution | ||||||
|  |     virtual void execute(void); | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | MODULE_REGISTER_NS(DiscLoop, TDiscLoop<FIMPL>, MContraction); | ||||||
|  |  | ||||||
|  | /****************************************************************************** | ||||||
|  |  *                       TDiscLoop implementation                             * | ||||||
|  |  ******************************************************************************/ | ||||||
|  | // constructor ///////////////////////////////////////////////////////////////// | ||||||
|  | template <typename FImpl> | ||||||
|  | TDiscLoop<FImpl>::TDiscLoop(const std::string name) | ||||||
|  | : Module<DiscLoopPar>(name) | ||||||
|  | {} | ||||||
|  |  | ||||||
|  | // dependencies/products /////////////////////////////////////////////////////// | ||||||
|  | template <typename FImpl> | ||||||
|  | std::vector<std::string> TDiscLoop<FImpl>::getInput(void) | ||||||
|  | { | ||||||
|  |     std::vector<std::string> in = {par().q_loop}; | ||||||
|  |      | ||||||
|  |     return in; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | template <typename FImpl> | ||||||
|  | std::vector<std::string> TDiscLoop<FImpl>::getOutput(void) | ||||||
|  | { | ||||||
|  |     std::vector<std::string> out = {}; | ||||||
|  |      | ||||||
|  |     return out; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // setup /////////////////////////////////////////////////////////////////////// | ||||||
|  | template <typename FImpl> | ||||||
|  | void TDiscLoop<FImpl>::setup(void) | ||||||
|  | { | ||||||
|  |     envTmpLat(LatticeComplex, "c"); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // execution /////////////////////////////////////////////////////////////////// | ||||||
|  | template <typename FImpl> | ||||||
|  | void TDiscLoop<FImpl>::execute(void) | ||||||
|  | { | ||||||
|  |     LOG(Message) << "Computing disconnected loop contraction '" << getName()  | ||||||
|  |                  << "' using '" << par().q_loop << "' with " << par().gamma  | ||||||
|  |                  << " insertion." << std::endl; | ||||||
|  |  | ||||||
|  |     ResultWriter          writer(RESULT_FILE_NAME(par().output)); | ||||||
|  |     auto                  &q_loop = envGet(PropagatorField, par().q_loop); | ||||||
|  |     Gamma                 gamma(par().gamma); | ||||||
|  |     std::vector<TComplex> buf; | ||||||
|  |     Result                result; | ||||||
|  |  | ||||||
|  |     envGetTmp(LatticeComplex, c); | ||||||
|  |     c = trace(gamma*q_loop); | ||||||
|  |     sliceSum(c, buf, Tp); | ||||||
|  |  | ||||||
|  |     result.gamma = par().gamma; | ||||||
|  |     result.corr.resize(buf.size()); | ||||||
|  |     for (unsigned int t = 0; t < buf.size(); ++t) | ||||||
|  |     { | ||||||
|  |         result.corr[t] = TensorRemove(buf[t]); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     write(writer, "disc", result); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | END_MODULE_NAMESPACE | ||||||
|  |  | ||||||
|  | END_HADRONS_NAMESPACE | ||||||
|  |  | ||||||
|  | #endif // Hadrons_MContraction_DiscLoop_hpp_ | ||||||
							
								
								
									
										186
									
								
								extras/Hadrons/Modules/MContraction/Gamma3pt.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										186
									
								
								extras/Hadrons/Modules/MContraction/Gamma3pt.hpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,186 @@ | |||||||
|  | /************************************************************************************* | ||||||
|  |  | ||||||
|  | Grid physics library, www.github.com/paboyle/Grid  | ||||||
|  |  | ||||||
|  | Source file: extras/Hadrons/Modules/MContraction/Gamma3pt.hpp | ||||||
|  |  | ||||||
|  | Copyright (C) 2015-2018 | ||||||
|  |  | ||||||
|  | Author: Antonin Portelli <antonin.portelli@me.com> | ||||||
|  | Author: Lanny91 <andrew.lawson@gmail.com> | ||||||
|  |  | ||||||
|  | This program is free software; you can redistribute it and/or modify | ||||||
|  | it under the terms of the GNU General Public License as published by | ||||||
|  | the Free Software Foundation; either version 2 of the License, or | ||||||
|  | (at your option) any later version. | ||||||
|  |  | ||||||
|  | This program is distributed in the hope that it will be useful, | ||||||
|  | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||||
|  | GNU General Public License for more details. | ||||||
|  |  | ||||||
|  | You should have received a copy of the GNU General Public License along | ||||||
|  | with this program; if not, write to the Free Software Foundation, Inc., | ||||||
|  | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | ||||||
|  |  | ||||||
|  | See the full license in the file "LICENSE" in the top level distribution directory | ||||||
|  | *************************************************************************************/ | ||||||
|  | /*  END LEGAL */ | ||||||
|  |  | ||||||
|  | #ifndef Hadrons_MContraction_Gamma3pt_hpp_ | ||||||
|  | #define Hadrons_MContraction_Gamma3pt_hpp_ | ||||||
|  |  | ||||||
|  | #include <Grid/Hadrons/Global.hpp> | ||||||
|  | #include <Grid/Hadrons/Module.hpp> | ||||||
|  | #include <Grid/Hadrons/ModuleFactory.hpp> | ||||||
|  |  | ||||||
|  | BEGIN_HADRONS_NAMESPACE | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  * 3pt contraction with gamma matrix insertion. | ||||||
|  |  * | ||||||
|  |  * Schematic: | ||||||
|  |  * | ||||||
|  |  *             q2           q3 | ||||||
|  |  *        /----<------*------<----¬ | ||||||
|  |  *       /          gamma          \ | ||||||
|  |  *      /                           \ | ||||||
|  |  *   i *                            * f | ||||||
|  |  *      \                          / | ||||||
|  |  *       \                        / | ||||||
|  |  *        \----------->----------/ | ||||||
|  |  *                   q1 | ||||||
|  |  * | ||||||
|  |  *      trace(g5*q1*adj(q2)*g5*gamma*q3) | ||||||
|  |  *  | ||||||
|  |  *  options: | ||||||
|  |  *   - q1: sink smeared propagator, source at i | ||||||
|  |  *   - q2: propagator, source at i | ||||||
|  |  *   - q3: propagator, source at f | ||||||
|  |  *   - gamma: gamma matrix to insert | ||||||
|  |  *   - tSnk: sink position for propagator q1. | ||||||
|  |  * | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | /****************************************************************************** | ||||||
|  |  *                               Gamma3pt                                     * | ||||||
|  |  ******************************************************************************/ | ||||||
|  | BEGIN_MODULE_NAMESPACE(MContraction) | ||||||
|  |  | ||||||
|  | class Gamma3ptPar: Serializable | ||||||
|  | { | ||||||
|  | public: | ||||||
|  |     GRID_SERIALIZABLE_CLASS_MEMBERS(Gamma3ptPar, | ||||||
|  |                                     std::string,    q1, | ||||||
|  |                                     std::string,    q2, | ||||||
|  |                                     std::string,    q3, | ||||||
|  |                                     Gamma::Algebra, gamma, | ||||||
|  |                                     unsigned int,   tSnk, | ||||||
|  |                                     std::string,    output); | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | template <typename FImpl1, typename FImpl2, typename FImpl3> | ||||||
|  | class TGamma3pt: public Module<Gamma3ptPar> | ||||||
|  | { | ||||||
|  |     FERM_TYPE_ALIASES(FImpl1, 1); | ||||||
|  |     FERM_TYPE_ALIASES(FImpl2, 2); | ||||||
|  |     FERM_TYPE_ALIASES(FImpl3, 3); | ||||||
|  |     class Result: Serializable | ||||||
|  |     { | ||||||
|  |     public: | ||||||
|  |         GRID_SERIALIZABLE_CLASS_MEMBERS(Result, | ||||||
|  |                                         Gamma::Algebra, gamma, | ||||||
|  |                                         std::vector<Complex>, corr); | ||||||
|  |     }; | ||||||
|  | public: | ||||||
|  |     // constructor | ||||||
|  |     TGamma3pt(const std::string name); | ||||||
|  |     // destructor | ||||||
|  |     virtual ~TGamma3pt(void) = default; | ||||||
|  |     // dependency relation | ||||||
|  |     virtual std::vector<std::string> getInput(void); | ||||||
|  |     virtual std::vector<std::string> getOutput(void); | ||||||
|  | protected: | ||||||
|  |     // setup | ||||||
|  |     virtual void setup(void); | ||||||
|  |     // execution | ||||||
|  |     virtual void execute(void); | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | MODULE_REGISTER_NS(Gamma3pt, ARG(TGamma3pt<FIMPL, FIMPL, FIMPL>), MContraction); | ||||||
|  |  | ||||||
|  | /****************************************************************************** | ||||||
|  |  *                       TGamma3pt implementation                             * | ||||||
|  |  ******************************************************************************/ | ||||||
|  | // constructor ///////////////////////////////////////////////////////////////// | ||||||
|  | template <typename FImpl1, typename FImpl2, typename FImpl3> | ||||||
|  | TGamma3pt<FImpl1, FImpl2, FImpl3>::TGamma3pt(const std::string name) | ||||||
|  | : Module<Gamma3ptPar>(name) | ||||||
|  | {} | ||||||
|  |  | ||||||
|  | // dependencies/products /////////////////////////////////////////////////////// | ||||||
|  | template <typename FImpl1, typename FImpl2, typename FImpl3> | ||||||
|  | std::vector<std::string> TGamma3pt<FImpl1, FImpl2, FImpl3>::getInput(void) | ||||||
|  | { | ||||||
|  |     std::vector<std::string> in = {par().q1, par().q2, par().q3}; | ||||||
|  |      | ||||||
|  |     return in; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | template <typename FImpl1, typename FImpl2, typename FImpl3> | ||||||
|  | std::vector<std::string> TGamma3pt<FImpl1, FImpl2, FImpl3>::getOutput(void) | ||||||
|  | { | ||||||
|  |     std::vector<std::string> out = {}; | ||||||
|  |      | ||||||
|  |     return out; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // setup /////////////////////////////////////////////////////////////////////// | ||||||
|  | template <typename FImpl1, typename FImpl2, typename FImpl3> | ||||||
|  | void TGamma3pt<FImpl1, FImpl2, FImpl3>::setup(void) | ||||||
|  | { | ||||||
|  |     envTmpLat(LatticeComplex, "c"); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // execution /////////////////////////////////////////////////////////////////// | ||||||
|  | template <typename FImpl1, typename FImpl2, typename FImpl3> | ||||||
|  | void TGamma3pt<FImpl1, FImpl2, FImpl3>::execute(void) | ||||||
|  | { | ||||||
|  |     LOG(Message) << "Computing 3pt contractions '" << getName() << "' using" | ||||||
|  |                  << " quarks '" << par().q1 << "', '" << par().q2 << "' and '" | ||||||
|  |                  << par().q3 << "', with " << par().gamma << " insertion."  | ||||||
|  |                  << std::endl; | ||||||
|  |  | ||||||
|  |     // Initialise variables. q2 and q3 are normal propagators, q1 may be  | ||||||
|  |     // sink smeared. | ||||||
|  |     ResultWriter          writer(RESULT_FILE_NAME(par().output)); | ||||||
|  |     auto                  &q1 = envGet(SlicedPropagator1, par().q1); | ||||||
|  |     auto                  &q2 = envGet(PropagatorField2, par().q2); | ||||||
|  |     auto                  &q3 = envGet(PropagatorField2, par().q3); | ||||||
|  |     Gamma                 g5(Gamma::Algebra::Gamma5); | ||||||
|  |     Gamma                 gamma(par().gamma); | ||||||
|  |     std::vector<TComplex> buf; | ||||||
|  |     Result                result; | ||||||
|  |      | ||||||
|  |     // Extract relevant timeslice of sinked propagator q1, then contract & | ||||||
|  |     // sum over all spacial positions of gamma insertion. | ||||||
|  |     SitePropagator1 q1Snk = q1[par().tSnk]; | ||||||
|  |     envGetTmp(LatticeComplex, c); | ||||||
|  |     c = trace(g5*q1Snk*adj(q2)*(g5*gamma)*q3); | ||||||
|  |     sliceSum(c, buf, Tp); | ||||||
|  |  | ||||||
|  |     result.gamma = par().gamma; | ||||||
|  |     result.corr.resize(buf.size()); | ||||||
|  |     for (unsigned int t = 0; t < buf.size(); ++t) | ||||||
|  |     { | ||||||
|  |         result.corr[t] = TensorRemove(buf[t]); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     write(writer, "gamma3pt", result); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | END_MODULE_NAMESPACE | ||||||
|  |  | ||||||
|  | END_HADRONS_NAMESPACE | ||||||
|  |  | ||||||
|  | #endif // Hadrons_MContraction_Gamma3pt_hpp_ | ||||||
| @@ -4,10 +4,10 @@ Grid physics library, www.github.com/paboyle/Grid | |||||||
|  |  | ||||||
| Source file: extras/Hadrons/Modules/MContraction/Meson.hpp | Source file: extras/Hadrons/Modules/MContraction/Meson.hpp | ||||||
|  |  | ||||||
| Copyright (C) 2015 | Copyright (C) 2015-2018 | ||||||
| Copyright (C) 2016 |  | ||||||
|  |  | ||||||
| Author: Antonin Portelli <antonin.portelli@me.com> | Author: Antonin Portelli <antonin.portelli@me.com> | ||||||
|  | Author: Lanny91 <andrew.lawson@gmail.com> | ||||||
|  |  | ||||||
| This program is free software; you can redistribute it and/or modify | This program is free software; you can redistribute it and/or modify | ||||||
| it under the terms of the GNU General Public License as published by | it under the terms of the GNU General Public License as published by | ||||||
| @@ -27,8 +27,8 @@ See the full license in the file "LICENSE" in the top level distribution directo | |||||||
| *************************************************************************************/ | *************************************************************************************/ | ||||||
| /*  END LEGAL */ | /*  END LEGAL */ | ||||||
|  |  | ||||||
| #ifndef Hadrons_Meson_hpp_ | #ifndef Hadrons_MContraction_Meson_hpp_ | ||||||
| #define Hadrons_Meson_hpp_ | #define Hadrons_MContraction_Meson_hpp_ | ||||||
|  |  | ||||||
| #include <Grid/Hadrons/Global.hpp> | #include <Grid/Hadrons/Global.hpp> | ||||||
| #include <Grid/Hadrons/Module.hpp> | #include <Grid/Hadrons/Module.hpp> | ||||||
| @@ -36,32 +36,55 @@ See the full license in the file "LICENSE" in the top level distribution directo | |||||||
|  |  | ||||||
| BEGIN_HADRONS_NAMESPACE | BEGIN_HADRONS_NAMESPACE | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |   | ||||||
|  |  Meson contractions | ||||||
|  |  ----------------------------- | ||||||
|  |   | ||||||
|  |  * options: | ||||||
|  |  - q1: input propagator 1 (string) | ||||||
|  |  - q2: input propagator 2 (string) | ||||||
|  |  - gammas: gamma products to insert at sink & source, pairs of gamma matrices  | ||||||
|  |            (space-separated strings) in angled brackets (i.e. <g_sink g_src>), | ||||||
|  |            in a sequence (e.g. "<Gamma5 Gamma5><Gamma5 GammaT>"). | ||||||
|  |  | ||||||
|  |            Special values: "all" - perform all possible contractions. | ||||||
|  |  - sink: module to compute the sink to use in contraction (string). | ||||||
|  | */ | ||||||
|  |  | ||||||
| /****************************************************************************** | /****************************************************************************** | ||||||
|  *                                TMeson                                       * |  *                                TMeson                                       * | ||||||
|  ******************************************************************************/ |  ******************************************************************************/ | ||||||
| BEGIN_MODULE_NAMESPACE(MContraction) | BEGIN_MODULE_NAMESPACE(MContraction) | ||||||
|  |  | ||||||
|  | typedef std::pair<Gamma::Algebra, Gamma::Algebra> GammaPair; | ||||||
|  |  | ||||||
| class MesonPar: Serializable | class MesonPar: Serializable | ||||||
| { | { | ||||||
| public: | public: | ||||||
|     GRID_SERIALIZABLE_CLASS_MEMBERS(MesonPar, |     GRID_SERIALIZABLE_CLASS_MEMBERS(MesonPar, | ||||||
|                                     std::string,    q1, |                                     std::string, q1, | ||||||
|                                     std::string,    q2, |                                     std::string, q2, | ||||||
|                                     std::string,    output, |                                     std::string, gammas, | ||||||
|                                     Gamma::Algebra, gammaSource, |                                     std::string, sink, | ||||||
|                                     Gamma::Algebra, gammaSink); |                                     std::string, output); | ||||||
| }; | }; | ||||||
|  |  | ||||||
| template <typename FImpl1, typename FImpl2> | template <typename FImpl1, typename FImpl2> | ||||||
| class TMeson: public Module<MesonPar> | class TMeson: public Module<MesonPar> | ||||||
| { | { | ||||||
| public: | public: | ||||||
|     TYPE_ALIASES(FImpl1, 1); |     FERM_TYPE_ALIASES(FImpl1, 1); | ||||||
|     TYPE_ALIASES(FImpl2, 2); |     FERM_TYPE_ALIASES(FImpl2, 2); | ||||||
|  |     FERM_TYPE_ALIASES(ScalarImplCR, Scalar); | ||||||
|  |     SINK_TYPE_ALIASES(Scalar); | ||||||
|     class Result: Serializable |     class Result: Serializable | ||||||
|     { |     { | ||||||
|     public: |     public: | ||||||
|         GRID_SERIALIZABLE_CLASS_MEMBERS(Result, std::vector<Complex>, corr); |         GRID_SERIALIZABLE_CLASS_MEMBERS(Result, | ||||||
|  |                                         Gamma::Algebra, gamma_snk, | ||||||
|  |                                         Gamma::Algebra, gamma_src, | ||||||
|  |                                         std::vector<Complex>, corr); | ||||||
|     }; |     }; | ||||||
| public: | public: | ||||||
|     // constructor |     // constructor | ||||||
| @@ -71,6 +94,10 @@ public: | |||||||
|     // dependencies/products |     // dependencies/products | ||||||
|     virtual std::vector<std::string> getInput(void); |     virtual std::vector<std::string> getInput(void); | ||||||
|     virtual std::vector<std::string> getOutput(void); |     virtual std::vector<std::string> getOutput(void); | ||||||
|  |     virtual void parseGammaString(std::vector<GammaPair> &gammaList); | ||||||
|  | protected: | ||||||
|  |     // execution | ||||||
|  |     virtual void setup(void); | ||||||
|     // execution |     // execution | ||||||
|     virtual void execute(void); |     virtual void execute(void); | ||||||
| }; | }; | ||||||
| @@ -90,7 +117,7 @@ TMeson<FImpl1, FImpl2>::TMeson(const std::string name) | |||||||
| template <typename FImpl1, typename FImpl2> | template <typename FImpl1, typename FImpl2> | ||||||
| std::vector<std::string> TMeson<FImpl1, FImpl2>::getInput(void) | std::vector<std::string> TMeson<FImpl1, FImpl2>::getInput(void) | ||||||
| { | { | ||||||
|     std::vector<std::string> input = {par().q1, par().q2}; |     std::vector<std::string> input = {par().q1, par().q2, par().sink}; | ||||||
|      |      | ||||||
|     return input; |     return input; | ||||||
| } | } | ||||||
| @@ -98,34 +125,119 @@ std::vector<std::string> TMeson<FImpl1, FImpl2>::getInput(void) | |||||||
| template <typename FImpl1, typename FImpl2> | template <typename FImpl1, typename FImpl2> | ||||||
| std::vector<std::string> TMeson<FImpl1, FImpl2>::getOutput(void) | std::vector<std::string> TMeson<FImpl1, FImpl2>::getOutput(void) | ||||||
| { | { | ||||||
|     std::vector<std::string> output = {getName()}; |     std::vector<std::string> output = {}; | ||||||
|      |      | ||||||
|     return output; |     return output; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | template <typename FImpl1, typename FImpl2> | ||||||
|  | void TMeson<FImpl1, FImpl2>::parseGammaString(std::vector<GammaPair> &gammaList) | ||||||
|  | { | ||||||
|  |     gammaList.clear(); | ||||||
|  |     // Determine gamma matrices to insert at source/sink. | ||||||
|  |     if (par().gammas.compare("all") == 0) | ||||||
|  |     { | ||||||
|  |         // Do all contractions. | ||||||
|  |         for (unsigned int i = 1; i < Gamma::nGamma; i += 2) | ||||||
|  |         { | ||||||
|  |             for (unsigned int j = 1; j < Gamma::nGamma; j += 2) | ||||||
|  |             { | ||||||
|  |                 gammaList.push_back(std::make_pair((Gamma::Algebra)i,  | ||||||
|  |                                                    (Gamma::Algebra)j)); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |     else | ||||||
|  |     { | ||||||
|  |         // Parse individual contractions from input string. | ||||||
|  |         gammaList = strToVec<GammaPair>(par().gammas); | ||||||
|  |     }  | ||||||
|  | } | ||||||
|  |  | ||||||
| // execution /////////////////////////////////////////////////////////////////// | // execution /////////////////////////////////////////////////////////////////// | ||||||
|  | template <typename FImpl1, typename FImpl2> | ||||||
|  | void TMeson<FImpl1, FImpl2>::setup(void) | ||||||
|  | { | ||||||
|  |     envTmpLat(LatticeComplex, "c"); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // execution /////////////////////////////////////////////////////////////////// | ||||||
|  | #define mesonConnected(q1, q2, gSnk, gSrc) \ | ||||||
|  | (g5*(gSnk))*(q1)*(adj(gSrc)*g5)*adj(q2) | ||||||
|  |  | ||||||
| template <typename FImpl1, typename FImpl2> | template <typename FImpl1, typename FImpl2> | ||||||
| void TMeson<FImpl1, FImpl2>::execute(void) | void TMeson<FImpl1, FImpl2>::execute(void) | ||||||
| { | { | ||||||
|     LOG(Message) << "Computing meson contractions '" << getName() << "' using" |     LOG(Message) << "Computing meson contractions '" << getName() << "' using" | ||||||
|                  << " quarks '" << par().q1 << "' and '" << par().q2 << "'" |                  << " quarks '" << par().q1 << "' and '" << par().q2 << "'" | ||||||
|                  << std::endl; |                  << std::endl; | ||||||
|  |  | ||||||
|  |     ResultWriter           writer(RESULT_FILE_NAME(par().output)); | ||||||
|  |     std::vector<TComplex>  buf; | ||||||
|  |     std::vector<Result>    result; | ||||||
|  |     Gamma                  g5(Gamma::Algebra::Gamma5); | ||||||
|  |     std::vector<GammaPair> gammaList; | ||||||
|  |     int                    nt = env().getDim(Tp); | ||||||
|      |      | ||||||
|     XmlWriter             writer(par().output); |     parseGammaString(gammaList); | ||||||
|     PropagatorField1      &q1 = *env().template getObject<PropagatorField1>(par().q1); |     result.resize(gammaList.size()); | ||||||
|     PropagatorField2      &q2 = *env().template getObject<PropagatorField2>(par().q2); |     for (unsigned int i = 0; i < result.size(); ++i) | ||||||
|     LatticeComplex        c(env().getGrid()); |  | ||||||
|     Gamma                 gSrc(par().gammaSource), gSnk(par().gammaSink); |  | ||||||
|     Gamma                 g5(Gamma::Algebra::Gamma5); |  | ||||||
|     std::vector<TComplex> buf; |  | ||||||
|     Result                result; |  | ||||||
|      |  | ||||||
|     c = trace(gSnk*q1*adj(gSrc)*g5*adj(q2)*g5); |  | ||||||
|     sliceSum(c, buf, Tp); |  | ||||||
|     result.corr.resize(buf.size()); |  | ||||||
|     for (unsigned int t = 0; t < buf.size(); ++t) |  | ||||||
|     { |     { | ||||||
|         result.corr[t] = TensorRemove(buf[t]); |         result[i].gamma_snk = gammaList[i].first; | ||||||
|  |         result[i].gamma_src = gammaList[i].second; | ||||||
|  |         result[i].corr.resize(nt); | ||||||
|  |     } | ||||||
|  |     if (envHasType(SlicedPropagator1, par().q1) and | ||||||
|  |         envHasType(SlicedPropagator2, par().q2)) | ||||||
|  |     { | ||||||
|  |         auto &q1 = envGet(SlicedPropagator1, par().q1); | ||||||
|  |         auto &q2 = envGet(SlicedPropagator2, par().q2); | ||||||
|  |          | ||||||
|  |         LOG(Message) << "(propagator already sinked)" << std::endl; | ||||||
|  |         for (unsigned int i = 0; i < result.size(); ++i) | ||||||
|  |         { | ||||||
|  |             Gamma gSnk(gammaList[i].first); | ||||||
|  |             Gamma gSrc(gammaList[i].second); | ||||||
|  |              | ||||||
|  |             for (unsigned int t = 0; t < buf.size(); ++t) | ||||||
|  |             { | ||||||
|  |                 result[i].corr[t] = TensorRemove(trace(mesonConnected(q1[t], q2[t], gSnk, gSrc))); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |     else | ||||||
|  |     { | ||||||
|  |         auto &q1 = envGet(PropagatorField1, par().q1); | ||||||
|  |         auto &q2 = envGet(PropagatorField2, par().q2); | ||||||
|  |          | ||||||
|  |         envGetTmp(LatticeComplex, c); | ||||||
|  |         LOG(Message) << "(using sink '" << par().sink << "')" << std::endl; | ||||||
|  |         for (unsigned int i = 0; i < result.size(); ++i) | ||||||
|  |         { | ||||||
|  |             Gamma       gSnk(gammaList[i].first); | ||||||
|  |             Gamma       gSrc(gammaList[i].second); | ||||||
|  |             std::string ns; | ||||||
|  |                  | ||||||
|  |             ns = vm().getModuleNamespace(env().getObjectModule(par().sink)); | ||||||
|  |             if (ns == "MSource") | ||||||
|  |             { | ||||||
|  |                 PropagatorField1 &sink = envGet(PropagatorField1, par().sink); | ||||||
|  |                  | ||||||
|  |                 c = trace(mesonConnected(q1, q2, gSnk, gSrc)*sink); | ||||||
|  |                 sliceSum(c, buf, Tp); | ||||||
|  |             } | ||||||
|  |             else if (ns == "MSink") | ||||||
|  |             { | ||||||
|  |                 SinkFnScalar &sink = envGet(SinkFnScalar, par().sink); | ||||||
|  |                  | ||||||
|  |                 c   = trace(mesonConnected(q1, q2, gSnk, gSrc)); | ||||||
|  |                 buf = sink(c); | ||||||
|  |             } | ||||||
|  |             for (unsigned int t = 0; t < buf.size(); ++t) | ||||||
|  |             { | ||||||
|  |                 result[i].corr[t] = TensorRemove(buf[t]); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|     } |     } | ||||||
|     write(writer, "meson", result); |     write(writer, "meson", result); | ||||||
| } | } | ||||||
| @@ -134,4 +246,4 @@ END_MODULE_NAMESPACE | |||||||
|  |  | ||||||
| END_HADRONS_NAMESPACE | END_HADRONS_NAMESPACE | ||||||
|  |  | ||||||
| #endif // Hadrons_Meson_hpp_ | #endif // Hadrons_MContraction_Meson_hpp_ | ||||||
|   | |||||||
							
								
								
									
										224
									
								
								extras/Hadrons/Modules/MContraction/WardIdentity.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										224
									
								
								extras/Hadrons/Modules/MContraction/WardIdentity.hpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,224 @@ | |||||||
|  | /************************************************************************************* | ||||||
|  |  | ||||||
|  | Grid physics library, www.github.com/paboyle/Grid  | ||||||
|  |  | ||||||
|  | Source file: extras/Hadrons/Modules/MContraction/WardIdentity.hpp | ||||||
|  |  | ||||||
|  | Copyright (C) 2015-2018 | ||||||
|  |  | ||||||
|  | Author: Antonin Portelli <antonin.portelli@me.com> | ||||||
|  | Author: Lanny91 <andrew.lawson@gmail.com> | ||||||
|  |  | ||||||
|  | This program is free software; you can redistribute it and/or modify | ||||||
|  | it under the terms of the GNU General Public License as published by | ||||||
|  | the Free Software Foundation; either version 2 of the License, or | ||||||
|  | (at your option) any later version. | ||||||
|  |  | ||||||
|  | This program is distributed in the hope that it will be useful, | ||||||
|  | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||||
|  | GNU General Public License for more details. | ||||||
|  |  | ||||||
|  | You should have received a copy of the GNU General Public License along | ||||||
|  | with this program; if not, write to the Free Software Foundation, Inc., | ||||||
|  | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | ||||||
|  |  | ||||||
|  | See the full license in the file "LICENSE" in the top level distribution directory | ||||||
|  | *************************************************************************************/ | ||||||
|  | /*  END LEGAL */ | ||||||
|  |  | ||||||
|  | #ifndef Hadrons_MContraction_WardIdentity_hpp_ | ||||||
|  | #define Hadrons_MContraction_WardIdentity_hpp_ | ||||||
|  |  | ||||||
|  | #include <Grid/Hadrons/Global.hpp> | ||||||
|  | #include <Grid/Hadrons/Module.hpp> | ||||||
|  | #include <Grid/Hadrons/ModuleFactory.hpp> | ||||||
|  |  | ||||||
|  | BEGIN_HADRONS_NAMESPACE | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |   Ward Identity contractions | ||||||
|  |  ----------------------------- | ||||||
|  |   | ||||||
|  |  * options: | ||||||
|  |  - q:          propagator, 5D if available (string) | ||||||
|  |  - action:     action module used for propagator solution (string) | ||||||
|  |  - mass:       mass of quark (double) | ||||||
|  |  - test_axial: whether or not to test PCAC relation. | ||||||
|  | */ | ||||||
|  |  | ||||||
|  | /****************************************************************************** | ||||||
|  |  *                              WardIdentity                                  * | ||||||
|  |  ******************************************************************************/ | ||||||
|  | BEGIN_MODULE_NAMESPACE(MContraction) | ||||||
|  |  | ||||||
|  | class WardIdentityPar: Serializable | ||||||
|  | { | ||||||
|  | public: | ||||||
|  |     GRID_SERIALIZABLE_CLASS_MEMBERS(WardIdentityPar, | ||||||
|  |                                     std::string, q, | ||||||
|  |                                     std::string, action, | ||||||
|  |                                     double,      mass, | ||||||
|  |                                     bool,        test_axial); | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | template <typename FImpl> | ||||||
|  | class TWardIdentity: public Module<WardIdentityPar> | ||||||
|  | { | ||||||
|  | public: | ||||||
|  |     FERM_TYPE_ALIASES(FImpl,); | ||||||
|  | public: | ||||||
|  |     // constructor | ||||||
|  |     TWardIdentity(const std::string name); | ||||||
|  |     // destructor | ||||||
|  |     virtual ~TWardIdentity(void) = default; | ||||||
|  |     // dependency relation | ||||||
|  |     virtual std::vector<std::string> getInput(void); | ||||||
|  |     virtual std::vector<std::string> getOutput(void); | ||||||
|  | protected: | ||||||
|  |     // setup | ||||||
|  |     virtual void setup(void); | ||||||
|  |     // execution | ||||||
|  |     virtual void execute(void); | ||||||
|  | private: | ||||||
|  |     unsigned int Ls_; | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | MODULE_REGISTER_NS(WardIdentity, TWardIdentity<FIMPL>, MContraction); | ||||||
|  |  | ||||||
|  | /****************************************************************************** | ||||||
|  |  *                     TWardIdentity implementation                           * | ||||||
|  |  ******************************************************************************/ | ||||||
|  | // constructor ///////////////////////////////////////////////////////////////// | ||||||
|  | template <typename FImpl> | ||||||
|  | TWardIdentity<FImpl>::TWardIdentity(const std::string name) | ||||||
|  | : Module<WardIdentityPar>(name) | ||||||
|  | {} | ||||||
|  |  | ||||||
|  | // dependencies/products /////////////////////////////////////////////////////// | ||||||
|  | template <typename FImpl> | ||||||
|  | std::vector<std::string> TWardIdentity<FImpl>::getInput(void) | ||||||
|  | { | ||||||
|  |     std::vector<std::string> in = {par().q, par().action}; | ||||||
|  |      | ||||||
|  |     return in; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | template <typename FImpl> | ||||||
|  | std::vector<std::string> TWardIdentity<FImpl>::getOutput(void) | ||||||
|  | { | ||||||
|  |     std::vector<std::string> out = {}; | ||||||
|  |      | ||||||
|  |     return out; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // setup /////////////////////////////////////////////////////////////////////// | ||||||
|  | template <typename FImpl> | ||||||
|  | void TWardIdentity<FImpl>::setup(void) | ||||||
|  | { | ||||||
|  |     Ls_ = env().getObjectLs(par().q); | ||||||
|  |     if (Ls_ != env().getObjectLs(par().action)) | ||||||
|  |     { | ||||||
|  |         HADRON_ERROR(Size, "Ls mismatch between quark action and propagator"); | ||||||
|  |     } | ||||||
|  |     envTmpLat(PropagatorField, "tmp"); | ||||||
|  |     envTmpLat(PropagatorField, "vector_WI"); | ||||||
|  |     if (par().test_axial) | ||||||
|  |     { | ||||||
|  |         envTmpLat(PropagatorField, "psi"); | ||||||
|  |         envTmpLat(LatticeComplex,  "PP"); | ||||||
|  |         envTmpLat(LatticeComplex,  "axial_defect"); | ||||||
|  |         envTmpLat(LatticeComplex,  "PJ5q"); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // execution /////////////////////////////////////////////////////////////////// | ||||||
|  | template <typename FImpl> | ||||||
|  | void TWardIdentity<FImpl>::execute(void) | ||||||
|  | { | ||||||
|  |     LOG(Message) << "Performing Ward Identity checks for quark '" << par().q | ||||||
|  |                  << "'." << std::endl; | ||||||
|  |  | ||||||
|  |     auto  &q   = envGet(PropagatorField, par().q); | ||||||
|  |     auto  &act = envGet(FMat, par().action); | ||||||
|  |     Gamma g5(Gamma::Algebra::Gamma5); | ||||||
|  |  | ||||||
|  |     // Compute D_mu V_mu, D here is backward derivative. | ||||||
|  |     envGetTmp(PropagatorField, tmp); | ||||||
|  |     envGetTmp(PropagatorField, vector_WI); | ||||||
|  |     vector_WI    = zero; | ||||||
|  |     for (unsigned int mu = 0; mu < Nd; ++mu) | ||||||
|  |     { | ||||||
|  |         act.ContractConservedCurrent(q, q, tmp, Current::Vector, mu); | ||||||
|  |         tmp -= Cshift(tmp, mu, -1); | ||||||
|  |         vector_WI += tmp; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     // Test ward identity D_mu V_mu = 0; | ||||||
|  |     LOG(Message) << "Vector Ward Identity check Delta_mu V_mu = "  | ||||||
|  |                  << norm2(vector_WI) << std::endl; | ||||||
|  |  | ||||||
|  |     if (par().test_axial) | ||||||
|  |     { | ||||||
|  |         envGetTmp(PropagatorField, psi); | ||||||
|  |         envGetTmp(LatticeComplex, PP); | ||||||
|  |         envGetTmp(LatticeComplex, axial_defect); | ||||||
|  |         envGetTmp(LatticeComplex, PJ5q); | ||||||
|  |         std::vector<TComplex> axial_buf; | ||||||
|  |  | ||||||
|  |         // Compute <P|D_mu A_mu>, D is backwards derivative. | ||||||
|  |         axial_defect = zero; | ||||||
|  |         for (unsigned int mu = 0; mu < Nd; ++mu) | ||||||
|  |         { | ||||||
|  |             act.ContractConservedCurrent(q, q, tmp, Current::Axial, mu); | ||||||
|  |             tmp -= Cshift(tmp, mu, -1); | ||||||
|  |             axial_defect += trace(g5*tmp); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         // Get <P|J5q> for 5D (zero for 4D) and <P|P>. | ||||||
|  |         PJ5q = zero; | ||||||
|  |         if (Ls_ > 1) | ||||||
|  |         { | ||||||
|  |             // <P|P> | ||||||
|  |             ExtractSlice(tmp, q, 0, 0); | ||||||
|  |             psi  = 0.5 * (tmp - g5*tmp); | ||||||
|  |             ExtractSlice(tmp, q, Ls_ - 1, 0); | ||||||
|  |             psi += 0.5 * (tmp + g5*tmp); | ||||||
|  |             PP = trace(adj(psi)*psi); | ||||||
|  |  | ||||||
|  |             // <P|5Jq> | ||||||
|  |             ExtractSlice(tmp, q, Ls_/2 - 1, 0); | ||||||
|  |             psi  = 0.5 * (tmp + g5*tmp); | ||||||
|  |             ExtractSlice(tmp, q, Ls_/2, 0); | ||||||
|  |             psi += 0.5 * (tmp - g5*tmp); | ||||||
|  |             PJ5q = trace(adj(psi)*psi); | ||||||
|  |         } | ||||||
|  |         else | ||||||
|  |         { | ||||||
|  |             PP = trace(adj(q)*q); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         // Test ward identity <P|D_mu A_mu> = 2m<P|P> + 2<P|J5q> | ||||||
|  |         LOG(Message) << "|D_mu A_mu|^2 = " << norm2(axial_defect) << std::endl; | ||||||
|  |         LOG(Message) << "|PP|^2        = " << norm2(PP) << std::endl; | ||||||
|  |         LOG(Message) << "|PJ5q|^2      = " << norm2(PJ5q) << std::endl; | ||||||
|  |         LOG(Message) << "Axial Ward Identity defect Delta_mu A_mu = " | ||||||
|  |                      << norm2(axial_defect) << std::endl; | ||||||
|  |      | ||||||
|  |         // Axial defect by timeslice. | ||||||
|  |         axial_defect -= 2.*(par().mass*PP + PJ5q); | ||||||
|  |         LOG(Message) << "Check Axial defect by timeslice" << std::endl; | ||||||
|  |         sliceSum(axial_defect, axial_buf, Tp); | ||||||
|  |         for (int t = 0; t < axial_buf.size(); ++t) | ||||||
|  |         { | ||||||
|  |             LOG(Message) << "t = " << t << ": "  | ||||||
|  |                          << TensorRemove(axial_buf[t]) << std::endl; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | END_MODULE_NAMESPACE | ||||||
|  |  | ||||||
|  | END_HADRONS_NAMESPACE | ||||||
|  |  | ||||||
|  | #endif // Hadrons_WardIdentity_hpp_ | ||||||
							
								
								
									
										118
									
								
								extras/Hadrons/Modules/MContraction/WeakHamiltonian.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										118
									
								
								extras/Hadrons/Modules/MContraction/WeakHamiltonian.hpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,118 @@ | |||||||
|  | /************************************************************************************* | ||||||
|  |  | ||||||
|  | Grid physics library, www.github.com/paboyle/Grid  | ||||||
|  |  | ||||||
|  | Source file: extras/Hadrons/Modules/MContraction/WeakHamiltonian.hpp | ||||||
|  |  | ||||||
|  | Copyright (C) 2015-2018 | ||||||
|  |  | ||||||
|  | Author: Antonin Portelli <antonin.portelli@me.com> | ||||||
|  | Author: Lanny91 <andrew.lawson@gmail.com> | ||||||
|  |  | ||||||
|  | This program is free software; you can redistribute it and/or modify | ||||||
|  | it under the terms of the GNU General Public License as published by | ||||||
|  | the Free Software Foundation; either version 2 of the License, or | ||||||
|  | (at your option) any later version. | ||||||
|  |  | ||||||
|  | This program is distributed in the hope that it will be useful, | ||||||
|  | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||||
|  | GNU General Public License for more details. | ||||||
|  |  | ||||||
|  | You should have received a copy of the GNU General Public License along | ||||||
|  | with this program; if not, write to the Free Software Foundation, Inc., | ||||||
|  | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | ||||||
|  |  | ||||||
|  | See the full license in the file "LICENSE" in the top level distribution directory | ||||||
|  | *************************************************************************************/ | ||||||
|  | /*  END LEGAL */ | ||||||
|  |  | ||||||
|  | #ifndef Hadrons_MContraction_WeakHamiltonian_hpp_ | ||||||
|  | #define Hadrons_MContraction_WeakHamiltonian_hpp_ | ||||||
|  |  | ||||||
|  | #include <Grid/Hadrons/Global.hpp> | ||||||
|  | #include <Grid/Hadrons/Module.hpp> | ||||||
|  | #include <Grid/Hadrons/ModuleFactory.hpp> | ||||||
|  |  | ||||||
|  | BEGIN_HADRONS_NAMESPACE | ||||||
|  |  | ||||||
|  | /****************************************************************************** | ||||||
|  |  *                         WeakHamiltonian                                    * | ||||||
|  |  ******************************************************************************/ | ||||||
|  | BEGIN_MODULE_NAMESPACE(MContraction) | ||||||
|  |  | ||||||
|  | /******************************************************************************* | ||||||
|  |  * Utilities for contractions involving the Weak Hamiltonian. | ||||||
|  |  ******************************************************************************/ | ||||||
|  | //// Sum and store correlator. | ||||||
|  | #define MAKE_DIAG(exp, buf, res, n)\ | ||||||
|  | sliceSum(exp, buf, Tp);\ | ||||||
|  | res.name = (n);\ | ||||||
|  | res.corr.resize(buf.size());\ | ||||||
|  | for (unsigned int t = 0; t < buf.size(); ++t)\ | ||||||
|  | {\ | ||||||
|  |     res.corr[t] = TensorRemove(buf[t]);\ | ||||||
|  | } | ||||||
|  |  | ||||||
|  | //// Contraction of mu index: use 'mu' variable in exp. | ||||||
|  | #define SUM_MU(buf,exp)\ | ||||||
|  | buf = zero;\ | ||||||
|  | for (unsigned int mu = 0; mu < ndim; ++mu)\ | ||||||
|  | {\ | ||||||
|  |     buf += exp;\ | ||||||
|  | } | ||||||
|  |  | ||||||
|  | enum  | ||||||
|  | { | ||||||
|  |   i_V = 0, | ||||||
|  |   i_A = 1, | ||||||
|  |   n_i = 2 | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | class WeakHamiltonianPar: Serializable | ||||||
|  | { | ||||||
|  | public: | ||||||
|  |     GRID_SERIALIZABLE_CLASS_MEMBERS(WeakHamiltonianPar, | ||||||
|  |                                     std::string, q1, | ||||||
|  |                                     std::string, q2, | ||||||
|  |                                     std::string, q3, | ||||||
|  |                                     std::string, q4, | ||||||
|  |                                     unsigned int, tSnk, | ||||||
|  |                                     std::string, output); | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | #define MAKE_WEAK_MODULE(modname)\ | ||||||
|  | class T##modname: public Module<WeakHamiltonianPar>\ | ||||||
|  | {\ | ||||||
|  | public:\ | ||||||
|  |     FERM_TYPE_ALIASES(FIMPL,)\ | ||||||
|  |     class Result: Serializable\ | ||||||
|  |     {\ | ||||||
|  |     public:\ | ||||||
|  |         GRID_SERIALIZABLE_CLASS_MEMBERS(Result,\ | ||||||
|  |                                         std::string, name,\ | ||||||
|  |                                         std::vector<Complex>, corr);\ | ||||||
|  |     };\ | ||||||
|  | public:\ | ||||||
|  |     /* constructor */ \ | ||||||
|  |     T##modname(const std::string name);\ | ||||||
|  |     /* destructor */ \ | ||||||
|  |     virtual ~T##modname(void) = default;\ | ||||||
|  |     /* dependency relation */ \ | ||||||
|  |     virtual std::vector<std::string> getInput(void);\ | ||||||
|  |     virtual std::vector<std::string> getOutput(void);\ | ||||||
|  | public:\ | ||||||
|  |     std::vector<std::string> VA_label = {"V", "A"};\ | ||||||
|  | protected:\ | ||||||
|  |     /* setup */ \ | ||||||
|  |     virtual void setup(void);\ | ||||||
|  |     /* execution */ \ | ||||||
|  |     virtual void execute(void);\ | ||||||
|  | };\ | ||||||
|  | MODULE_REGISTER_NS(modname, T##modname, MContraction); | ||||||
|  |  | ||||||
|  | END_MODULE_NAMESPACE | ||||||
|  |  | ||||||
|  | END_HADRONS_NAMESPACE | ||||||
|  |  | ||||||
|  | #endif // Hadrons_MContraction_WeakHamiltonian_hpp_ | ||||||
							
								
								
									
										151
									
								
								extras/Hadrons/Modules/MContraction/WeakHamiltonianEye.cc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										151
									
								
								extras/Hadrons/Modules/MContraction/WeakHamiltonianEye.cc
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,151 @@ | |||||||
|  | /************************************************************************************* | ||||||
|  |  | ||||||
|  | Grid physics library, www.github.com/paboyle/Grid  | ||||||
|  |  | ||||||
|  | Source file: extras/Hadrons/Modules/MContraction/WeakHamiltonianEye.cc | ||||||
|  |  | ||||||
|  | Copyright (C) 2015-2018 | ||||||
|  |  | ||||||
|  | Author: Antonin Portelli <antonin.portelli@me.com> | ||||||
|  | Author: Lanny91 <andrew.lawson@gmail.com> | ||||||
|  |  | ||||||
|  | This program is free software; you can redistribute it and/or modify | ||||||
|  | it under the terms of the GNU General Public License as published by | ||||||
|  | the Free Software Foundation; either version 2 of the License, or | ||||||
|  | (at your option) any later version. | ||||||
|  |  | ||||||
|  | This program is distributed in the hope that it will be useful, | ||||||
|  | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||||
|  | GNU General Public License for more details. | ||||||
|  |  | ||||||
|  | You should have received a copy of the GNU General Public License along | ||||||
|  | with this program; if not, write to the Free Software Foundation, Inc., | ||||||
|  | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | ||||||
|  |  | ||||||
|  | See the full license in the file "LICENSE" in the top level distribution directory | ||||||
|  | *************************************************************************************/ | ||||||
|  | /*  END LEGAL */ | ||||||
|  |  | ||||||
|  | #include <Grid/Hadrons/Modules/MContraction/WeakHamiltonianEye.hpp> | ||||||
|  |  | ||||||
|  | using namespace Grid; | ||||||
|  | using namespace Hadrons; | ||||||
|  | using namespace MContraction; | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  * Weak Hamiltonian current-current contractions, Eye-type. | ||||||
|  |  *  | ||||||
|  |  * These contractions are generated by the Q1 and Q2 operators in the physical | ||||||
|  |  * basis (see e.g. Fig 3 of arXiv:1507.03094). | ||||||
|  |  *  | ||||||
|  |  * Schematics:        q4                 |                   | ||||||
|  |  *                  /-<-¬                |                              | ||||||
|  |  *                 /     \               |             q2           q3 | ||||||
|  |  *                 \     /               |        /----<------*------<----¬                         | ||||||
|  |  *            q2    \   /    q3          |       /          /-*-¬          \ | ||||||
|  |  *       /-----<-----* *-----<----¬      |      /          /     \          \ | ||||||
|  |  *    i *            H_W           * f   |   i *           \     /  q4      * f | ||||||
|  |  *       \                        /      |      \           \->-/          /    | ||||||
|  |  *        \                      /       |       \                        /        | ||||||
|  |  *         \---------->---------/        |        \----------->----------/         | ||||||
|  |  *                   q1                  |                   q1                   | ||||||
|  |  *                                       | | ||||||
|  |  *                Saucer (S)             |                  Eye (E) | ||||||
|  |  *  | ||||||
|  |  * S: trace(q3*g5*q1*adj(q2)*g5*gL[mu][p_1]*q4*gL[mu][p_2]) | ||||||
|  |  * E: trace(q3*g5*q1*adj(q2)*g5*gL[mu][p_1])*trace(q4*gL[mu][p_2]) | ||||||
|  |  *  | ||||||
|  |  * Note q1 must be sink smeared. | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | /****************************************************************************** | ||||||
|  |  *                  TWeakHamiltonianEye implementation                        * | ||||||
|  |  ******************************************************************************/ | ||||||
|  | // constructor ///////////////////////////////////////////////////////////////// | ||||||
|  | TWeakHamiltonianEye::TWeakHamiltonianEye(const std::string name) | ||||||
|  | : Module<WeakHamiltonianPar>(name) | ||||||
|  | {} | ||||||
|  |  | ||||||
|  | // dependencies/products /////////////////////////////////////////////////////// | ||||||
|  | std::vector<std::string> TWeakHamiltonianEye::getInput(void) | ||||||
|  | { | ||||||
|  |     std::vector<std::string> in = {par().q1, par().q2, par().q3, par().q4}; | ||||||
|  |      | ||||||
|  |     return in; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | std::vector<std::string> TWeakHamiltonianEye::getOutput(void) | ||||||
|  | { | ||||||
|  |     std::vector<std::string> out = {}; | ||||||
|  |      | ||||||
|  |     return out; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // setup /////////////////////////////////////////////////////////////////////// | ||||||
|  | void TWeakHamiltonianEye::setup(void) | ||||||
|  | { | ||||||
|  |     unsigned int ndim = env().getNd(); | ||||||
|  |  | ||||||
|  |     envTmpLat(LatticeComplex,  "expbuf"); | ||||||
|  |     envTmpLat(PropagatorField, "tmp1"); | ||||||
|  |     envTmpLat(LatticeComplex,  "tmp2"); | ||||||
|  |     envTmp(std::vector<PropagatorField>, "S_body", 1, ndim, PropagatorField(env().getGrid())); | ||||||
|  |     envTmp(std::vector<PropagatorField>, "S_loop", 1, ndim, PropagatorField(env().getGrid())); | ||||||
|  |     envTmp(std::vector<LatticeComplex>,  "E_body", 1, ndim, LatticeComplex(env().getGrid())); | ||||||
|  |     envTmp(std::vector<LatticeComplex>,  "E_loop", 1, ndim, LatticeComplex(env().getGrid())); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // execution /////////////////////////////////////////////////////////////////// | ||||||
|  | void TWeakHamiltonianEye::execute(void) | ||||||
|  | { | ||||||
|  |     LOG(Message) << "Computing Weak Hamiltonian (Eye type) contractions '"  | ||||||
|  |                  << getName() << "' using quarks '" << par().q1 << "', '"  | ||||||
|  |                  << par().q2 << ", '" << par().q3 << "' and '" << par().q4  | ||||||
|  |                  << "'." << std::endl; | ||||||
|  |  | ||||||
|  |     ResultWriter           writer(RESULT_FILE_NAME(par().output)); | ||||||
|  |     auto                   &q1 = envGet(SlicedPropagator, par().q1); | ||||||
|  |     auto                   &q2 = envGet(PropagatorField, par().q2); | ||||||
|  |     auto                   &q3 = envGet(PropagatorField, par().q3); | ||||||
|  |     auto                   &q4 = envGet(PropagatorField, par().q4); | ||||||
|  |     Gamma                  g5  = Gamma(Gamma::Algebra::Gamma5); | ||||||
|  |     std::vector<TComplex>  corrbuf; | ||||||
|  |     std::vector<Result>    result(n_eye_diag); | ||||||
|  |     unsigned int ndim    = env().getNd(); | ||||||
|  |  | ||||||
|  |     envGetTmp(LatticeComplex,               expbuf);  | ||||||
|  |     envGetTmp(PropagatorField,              tmp1); | ||||||
|  |     envGetTmp(LatticeComplex,               tmp2); | ||||||
|  |     envGetTmp(std::vector<PropagatorField>, S_body); | ||||||
|  |     envGetTmp(std::vector<PropagatorField>, S_loop); | ||||||
|  |     envGetTmp(std::vector<LatticeComplex>,  E_body); | ||||||
|  |     envGetTmp(std::vector<LatticeComplex>,  E_loop); | ||||||
|  |  | ||||||
|  |     // Get sink timeslice of q1. | ||||||
|  |     SitePropagator q1Snk = q1[par().tSnk]; | ||||||
|  |  | ||||||
|  |     // Setup for S-type contractions. | ||||||
|  |     for (int mu = 0; mu < ndim; ++mu) | ||||||
|  |     { | ||||||
|  |         S_body[mu] = MAKE_SE_BODY(q1Snk, q2, q3, GammaL(Gamma::gmu[mu])); | ||||||
|  |         S_loop[mu] = MAKE_SE_LOOP(q4, GammaL(Gamma::gmu[mu])); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     // Perform S-type contractions.     | ||||||
|  |     SUM_MU(expbuf, trace(S_body[mu]*S_loop[mu])) | ||||||
|  |     MAKE_DIAG(expbuf, corrbuf, result[S_diag], "HW_S") | ||||||
|  |  | ||||||
|  |     // Recycle sub-expressions for E-type contractions. | ||||||
|  |     for (unsigned int mu = 0; mu < ndim; ++mu) | ||||||
|  |     { | ||||||
|  |         E_body[mu] = trace(S_body[mu]); | ||||||
|  |         E_loop[mu] = trace(S_loop[mu]); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     // Perform E-type contractions. | ||||||
|  |     SUM_MU(expbuf, E_body[mu]*E_loop[mu]) | ||||||
|  |     MAKE_DIAG(expbuf, corrbuf, result[E_diag], "HW_E") | ||||||
|  |  | ||||||
|  |     write(writer, "HW_Eye", result); | ||||||
|  | } | ||||||
							
								
								
									
										59
									
								
								extras/Hadrons/Modules/MContraction/WeakHamiltonianEye.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										59
									
								
								extras/Hadrons/Modules/MContraction/WeakHamiltonianEye.hpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,59 @@ | |||||||
|  | /************************************************************************************* | ||||||
|  |  | ||||||
|  | Grid physics library, www.github.com/paboyle/Grid  | ||||||
|  |  | ||||||
|  | Source file: extras/Hadrons/Modules/MContraction/WeakHamiltonianEye.hpp | ||||||
|  |  | ||||||
|  | Copyright (C) 2015-2018 | ||||||
|  |  | ||||||
|  | Author: Antonin Portelli <antonin.portelli@me.com> | ||||||
|  | Author: Lanny91 <andrew.lawson@gmail.com> | ||||||
|  |  | ||||||
|  | This program is free software; you can redistribute it and/or modify | ||||||
|  | it under the terms of the GNU General Public License as published by | ||||||
|  | the Free Software Foundation; either version 2 of the License, or | ||||||
|  | (at your option) any later version. | ||||||
|  |  | ||||||
|  | This program is distributed in the hope that it will be useful, | ||||||
|  | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||||
|  | GNU General Public License for more details. | ||||||
|  |  | ||||||
|  | You should have received a copy of the GNU General Public License along | ||||||
|  | with this program; if not, write to the Free Software Foundation, Inc., | ||||||
|  | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | ||||||
|  |  | ||||||
|  | See the full license in the file "LICENSE" in the top level distribution directory | ||||||
|  | *************************************************************************************/ | ||||||
|  | /*  END LEGAL */ | ||||||
|  |  | ||||||
|  | #ifndef Hadrons_MContraction_WeakHamiltonianEye_hpp_ | ||||||
|  | #define Hadrons_MContraction_WeakHamiltonianEye_hpp_ | ||||||
|  |  | ||||||
|  | #include <Grid/Hadrons/Modules/MContraction/WeakHamiltonian.hpp> | ||||||
|  |  | ||||||
|  | BEGIN_HADRONS_NAMESPACE | ||||||
|  |  | ||||||
|  | /****************************************************************************** | ||||||
|  |  *                         WeakHamiltonianEye                                 * | ||||||
|  |  ******************************************************************************/ | ||||||
|  | BEGIN_MODULE_NAMESPACE(MContraction) | ||||||
|  |  | ||||||
|  | enum | ||||||
|  | { | ||||||
|  |     S_diag = 0, | ||||||
|  |     E_diag = 1, | ||||||
|  |     n_eye_diag = 2 | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | // Saucer and Eye subdiagram contractions. | ||||||
|  | #define MAKE_SE_BODY(Q_1, Q_2, Q_3, gamma) (Q_3*g5*Q_1*adj(Q_2)*g5*gamma) | ||||||
|  | #define MAKE_SE_LOOP(Q_loop, gamma) (Q_loop*gamma) | ||||||
|  |  | ||||||
|  | MAKE_WEAK_MODULE(WeakHamiltonianEye) | ||||||
|  |  | ||||||
|  | END_MODULE_NAMESPACE | ||||||
|  |  | ||||||
|  | END_HADRONS_NAMESPACE | ||||||
|  |  | ||||||
|  | #endif // Hadrons_MContraction_WeakHamiltonianEye_hpp_ | ||||||
							
								
								
									
										148
									
								
								extras/Hadrons/Modules/MContraction/WeakHamiltonianNonEye.cc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										148
									
								
								extras/Hadrons/Modules/MContraction/WeakHamiltonianNonEye.cc
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,148 @@ | |||||||
|  | /************************************************************************************* | ||||||
|  |  | ||||||
|  | Grid physics library, www.github.com/paboyle/Grid  | ||||||
|  |  | ||||||
|  | Source file: extras/Hadrons/Modules/MContraction/WeakHamiltonianNonEye.cc | ||||||
|  |  | ||||||
|  | Copyright (C) 2015-2018 | ||||||
|  |  | ||||||
|  | Author: Antonin Portelli <antonin.portelli@me.com> | ||||||
|  | Author: Lanny91 <andrew.lawson@gmail.com> | ||||||
|  |  | ||||||
|  | This program is free software; you can redistribute it and/or modify | ||||||
|  | it under the terms of the GNU General Public License as published by | ||||||
|  | the Free Software Foundation; either version 2 of the License, or | ||||||
|  | (at your option) any later version. | ||||||
|  |  | ||||||
|  | This program is distributed in the hope that it will be useful, | ||||||
|  | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||||
|  | GNU General Public License for more details. | ||||||
|  |  | ||||||
|  | You should have received a copy of the GNU General Public License along | ||||||
|  | with this program; if not, write to the Free Software Foundation, Inc., | ||||||
|  | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | ||||||
|  |  | ||||||
|  | See the full license in the file "LICENSE" in the top level distribution directory | ||||||
|  | *************************************************************************************/ | ||||||
|  | /*  END LEGAL */ | ||||||
|  |  | ||||||
|  | #include <Grid/Hadrons/Modules/MContraction/WeakHamiltonianNonEye.hpp> | ||||||
|  |  | ||||||
|  | using namespace Grid; | ||||||
|  | using namespace Hadrons; | ||||||
|  | using namespace MContraction; | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  * Weak Hamiltonian current-current contractions, Non-Eye-type. | ||||||
|  |  *  | ||||||
|  |  * These contractions are generated by the Q1 and Q2 operators in the physical | ||||||
|  |  * basis (see e.g. Fig 3 of arXiv:1507.03094). | ||||||
|  |  *  | ||||||
|  |  * Schematic:      | ||||||
|  |  *            q2             q3          |           q2              q3 | ||||||
|  |  *          /--<--¬       /--<--¬        |        /--<--¬         /--<--¬        | ||||||
|  |  *         /       \     /       \       |       /       \       /       \       | ||||||
|  |  *        /         \   /         \      |      /         \     /         \      | ||||||
|  |  *       /           \ /           \     |     /           \   /           \     | ||||||
|  |  *    i *             * H_W         *  f |  i *             * * H_W         * f  | ||||||
|  |  *      \             *             |    |     \           /   \           / | ||||||
|  |  *       \           / \           /     |      \         /     \         /     | ||||||
|  |  *        \         /   \         /      |       \       /       \       /   | ||||||
|  |  *         \       /     \       /       |        \-->--/         \-->--/       | ||||||
|  |  *          \-->--/       \-->--/        |          q1               q4  | ||||||
|  |  *            q1             q4          | | ||||||
|  |  *                Connected (C)          |                 Wing (W) | ||||||
|  |  * | ||||||
|  |  * C: trace(q1*adj(q2)*g5*gL[mu]*q3*adj(q4)*g5*gL[mu]) | ||||||
|  |  * W: trace(q1*adj(q2)*g5*gL[mu])*trace(q3*adj(q4)*g5*gL[mu]) | ||||||
|  |  *  | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | /****************************************************************************** | ||||||
|  |  *                  TWeakHamiltonianNonEye implementation                     * | ||||||
|  |  ******************************************************************************/ | ||||||
|  | // constructor ///////////////////////////////////////////////////////////////// | ||||||
|  | TWeakHamiltonianNonEye::TWeakHamiltonianNonEye(const std::string name) | ||||||
|  | : Module<WeakHamiltonianPar>(name) | ||||||
|  | {} | ||||||
|  |  | ||||||
|  | // dependencies/products /////////////////////////////////////////////////////// | ||||||
|  | std::vector<std::string> TWeakHamiltonianNonEye::getInput(void) | ||||||
|  | { | ||||||
|  |     std::vector<std::string> in = {par().q1, par().q2, par().q3, par().q4}; | ||||||
|  |      | ||||||
|  |     return in; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | std::vector<std::string> TWeakHamiltonianNonEye::getOutput(void) | ||||||
|  | { | ||||||
|  |     std::vector<std::string> out = {}; | ||||||
|  |      | ||||||
|  |     return out; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // setup /////////////////////////////////////////////////////////////////////// | ||||||
|  | void TWeakHamiltonianNonEye::setup(void) | ||||||
|  | { | ||||||
|  |     unsigned int ndim = env().getNd(); | ||||||
|  |  | ||||||
|  |     envTmpLat(LatticeComplex,  "expbuf"); | ||||||
|  |     envTmpLat(PropagatorField, "tmp1"); | ||||||
|  |     envTmpLat(LatticeComplex,  "tmp2"); | ||||||
|  |     envTmp(std::vector<PropagatorField>, "C_i_side_loop", 1, ndim, PropagatorField(env().getGrid())); | ||||||
|  |     envTmp(std::vector<PropagatorField>, "C_f_side_loop", 1, ndim, PropagatorField(env().getGrid())); | ||||||
|  |     envTmp(std::vector<LatticeComplex>,  "W_i_side_loop", 1, ndim, LatticeComplex(env().getGrid())); | ||||||
|  |     envTmp(std::vector<LatticeComplex>,  "W_f_side_loop", 1, ndim, LatticeComplex(env().getGrid())); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // execution /////////////////////////////////////////////////////////////////// | ||||||
|  | void TWeakHamiltonianNonEye::execute(void) | ||||||
|  | { | ||||||
|  |     LOG(Message) << "Computing Weak Hamiltonian (Non-Eye type) contractions '"  | ||||||
|  |                  << getName() << "' using quarks '" << par().q1 << "', '"  | ||||||
|  |                  << par().q2 << ", '" << par().q3 << "' and '" << par().q4  | ||||||
|  |                  << "'." << std::endl; | ||||||
|  |      | ||||||
|  |     ResultWriter          writer(RESULT_FILE_NAME(par().output)); | ||||||
|  |     auto                  &q1 = envGet(PropagatorField, par().q1); | ||||||
|  |     auto                  &q2 = envGet(PropagatorField, par().q2); | ||||||
|  |     auto                  &q3 = envGet(PropagatorField, par().q3); | ||||||
|  |     auto                  &q4 = envGet(PropagatorField, par().q4); | ||||||
|  |     Gamma                 g5  = Gamma(Gamma::Algebra::Gamma5); | ||||||
|  |     std::vector<TComplex> corrbuf; | ||||||
|  |     std::vector<Result>   result(n_noneye_diag);  | ||||||
|  |     unsigned int          ndim = env().getNd(); | ||||||
|  |  | ||||||
|  |     envGetTmp(LatticeComplex,               expbuf);  | ||||||
|  |     envGetTmp(PropagatorField,              tmp1); | ||||||
|  |     envGetTmp(LatticeComplex,               tmp2); | ||||||
|  |     envGetTmp(std::vector<PropagatorField>, C_i_side_loop); | ||||||
|  |     envGetTmp(std::vector<PropagatorField>, C_f_side_loop); | ||||||
|  |     envGetTmp(std::vector<LatticeComplex>,  W_i_side_loop); | ||||||
|  |     envGetTmp(std::vector<LatticeComplex>,  W_f_side_loop); | ||||||
|  |  | ||||||
|  |     // Setup for C-type contractions. | ||||||
|  |     for (int mu = 0; mu < ndim; ++mu) | ||||||
|  |     { | ||||||
|  |         C_i_side_loop[mu] = MAKE_CW_SUBDIAG(q1, q2, GammaL(Gamma::gmu[mu])); | ||||||
|  |         C_f_side_loop[mu] = MAKE_CW_SUBDIAG(q3, q4, GammaL(Gamma::gmu[mu])); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     // Perform C-type contractions.     | ||||||
|  |     SUM_MU(expbuf, trace(C_i_side_loop[mu]*C_f_side_loop[mu])) | ||||||
|  |     MAKE_DIAG(expbuf, corrbuf, result[C_diag], "HW_C") | ||||||
|  |  | ||||||
|  |     // Recycle sub-expressions for W-type contractions. | ||||||
|  |     for (unsigned int mu = 0; mu < ndim; ++mu) | ||||||
|  |     { | ||||||
|  |         W_i_side_loop[mu] = trace(C_i_side_loop[mu]); | ||||||
|  |         W_f_side_loop[mu] = trace(C_f_side_loop[mu]); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     // Perform W-type contractions. | ||||||
|  |     SUM_MU(expbuf, W_i_side_loop[mu]*W_f_side_loop[mu]) | ||||||
|  |     MAKE_DIAG(expbuf, corrbuf, result[W_diag], "HW_W") | ||||||
|  |  | ||||||
|  |     write(writer, "HW_NonEye", result); | ||||||
|  | } | ||||||
| @@ -0,0 +1,58 @@ | |||||||
|  | /************************************************************************************* | ||||||
|  |  | ||||||
|  | Grid physics library, www.github.com/paboyle/Grid  | ||||||
|  |  | ||||||
|  | Source file: extras/Hadrons/Modules/MContraction/WeakHamiltonianNonEye.hpp | ||||||
|  |  | ||||||
|  | Copyright (C) 2015-2018 | ||||||
|  |  | ||||||
|  | Author: Antonin Portelli <antonin.portelli@me.com> | ||||||
|  | Author: Lanny91 <andrew.lawson@gmail.com> | ||||||
|  |  | ||||||
|  | This program is free software; you can redistribute it and/or modify | ||||||
|  | it under the terms of the GNU General Public License as published by | ||||||
|  | the Free Software Foundation; either version 2 of the License, or | ||||||
|  | (at your option) any later version. | ||||||
|  |  | ||||||
|  | This program is distributed in the hope that it will be useful, | ||||||
|  | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||||
|  | GNU General Public License for more details. | ||||||
|  |  | ||||||
|  | You should have received a copy of the GNU General Public License along | ||||||
|  | with this program; if not, write to the Free Software Foundation, Inc., | ||||||
|  | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | ||||||
|  |  | ||||||
|  | See the full license in the file "LICENSE" in the top level distribution directory | ||||||
|  | *************************************************************************************/ | ||||||
|  | /*  END LEGAL */ | ||||||
|  |  | ||||||
|  | #ifndef Hadrons_MContraction_WeakHamiltonianNonEye_hpp_ | ||||||
|  | #define Hadrons_MContraction_WeakHamiltonianNonEye_hpp_ | ||||||
|  |  | ||||||
|  | #include <Grid/Hadrons/Modules/MContraction/WeakHamiltonian.hpp> | ||||||
|  |  | ||||||
|  | BEGIN_HADRONS_NAMESPACE | ||||||
|  |  | ||||||
|  | /****************************************************************************** | ||||||
|  |  *                         WeakHamiltonianNonEye                              * | ||||||
|  |  ******************************************************************************/ | ||||||
|  | BEGIN_MODULE_NAMESPACE(MContraction) | ||||||
|  |  | ||||||
|  | enum | ||||||
|  | { | ||||||
|  |     W_diag = 0, | ||||||
|  |     C_diag = 1, | ||||||
|  |     n_noneye_diag = 2 | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | // Wing and Connected subdiagram contractions | ||||||
|  | #define MAKE_CW_SUBDIAG(Q_1, Q_2, gamma) (Q_1*adj(Q_2)*g5*gamma) | ||||||
|  |  | ||||||
|  | MAKE_WEAK_MODULE(WeakHamiltonianNonEye) | ||||||
|  |  | ||||||
|  | END_MODULE_NAMESPACE | ||||||
|  |  | ||||||
|  | END_HADRONS_NAMESPACE | ||||||
|  |  | ||||||
|  | #endif // Hadrons_MContraction_WeakHamiltonianNonEye_hpp_ | ||||||
							
								
								
									
										142
									
								
								extras/Hadrons/Modules/MContraction/WeakNeutral4ptDisc.cc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										142
									
								
								extras/Hadrons/Modules/MContraction/WeakNeutral4ptDisc.cc
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,142 @@ | |||||||
|  | /************************************************************************************* | ||||||
|  |  | ||||||
|  | Grid physics library, www.github.com/paboyle/Grid  | ||||||
|  |  | ||||||
|  | Source file: extras/Hadrons/Modules/MContraction/WeakNeutral4ptDisc.cc | ||||||
|  |  | ||||||
|  | Copyright (C) 2015-2018 | ||||||
|  |  | ||||||
|  | Author: Antonin Portelli <antonin.portelli@me.com> | ||||||
|  | Author: Lanny91 <andrew.lawson@gmail.com> | ||||||
|  |  | ||||||
|  | This program is free software; you can redistribute it and/or modify | ||||||
|  | it under the terms of the GNU General Public License as published by | ||||||
|  | the Free Software Foundation; either version 2 of the License, or | ||||||
|  | (at your option) any later version. | ||||||
|  |  | ||||||
|  | This program is distributed in the hope that it will be useful, | ||||||
|  | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||||
|  | GNU General Public License for more details. | ||||||
|  |  | ||||||
|  | You should have received a copy of the GNU General Public License along | ||||||
|  | with this program; if not, write to the Free Software Foundation, Inc., | ||||||
|  | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | ||||||
|  |  | ||||||
|  | See the full license in the file "LICENSE" in the top level distribution directory | ||||||
|  | *************************************************************************************/ | ||||||
|  | /*  END LEGAL */ | ||||||
|  |  | ||||||
|  | #include <Grid/Hadrons/Modules/MContraction/WeakNeutral4ptDisc.hpp> | ||||||
|  |  | ||||||
|  | using namespace Grid; | ||||||
|  | using namespace Hadrons; | ||||||
|  | using namespace MContraction; | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  * Weak Hamiltonian + current contractions, disconnected topology for neutral  | ||||||
|  |  * mesons. | ||||||
|  |  *  | ||||||
|  |  * These contractions are generated by operators Q_1,...,10 of the dS=1 Weak | ||||||
|  |  * Hamiltonian in the physical basis and an additional current J (see e.g.  | ||||||
|  |  * Fig 11 of arXiv:1507.03094). | ||||||
|  |  *  | ||||||
|  |  * Schematic: | ||||||
|  |  *                         | ||||||
|  |  *           q2          q4             q3 | ||||||
|  |  *       /--<--¬     /---<--¬       /---<--¬ | ||||||
|  |  *     /         \ /         \     /        \ | ||||||
|  |  *  i *           * H_W      |  J *          * f | ||||||
|  |  *     \         / \         /     \        / | ||||||
|  |  *      \--->---/   \-------/       \------/ | ||||||
|  |  *          q1  | ||||||
|  |  *  | ||||||
|  |  * options | ||||||
|  |  * - q1: input propagator 1 (string) | ||||||
|  |  * - q2: input propagator 2 (string) | ||||||
|  |  * - q3: input propagator 3 (string), assumed to be sequential propagator  | ||||||
|  |  * - q4: input propagator 4 (string), assumed to be a loop | ||||||
|  |  *  | ||||||
|  |  * type 1: trace(q1*adj(q2)*g5*gL[mu])*trace(loop*gL[mu])*trace(q3*g5) | ||||||
|  |  * type 2: trace(q1*adj(q2)*g5*gL[mu]*loop*gL[mu])*trace(q3*g5) | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | /******************************************************************************* | ||||||
|  |  *                  TWeakNeutral4ptDisc implementation                         * | ||||||
|  |  ******************************************************************************/ | ||||||
|  | // constructor ///////////////////////////////////////////////////////////////// | ||||||
|  | TWeakNeutral4ptDisc::TWeakNeutral4ptDisc(const std::string name) | ||||||
|  | : Module<WeakHamiltonianPar>(name) | ||||||
|  | {} | ||||||
|  |  | ||||||
|  | // dependencies/products /////////////////////////////////////////////////////// | ||||||
|  | std::vector<std::string> TWeakNeutral4ptDisc::getInput(void) | ||||||
|  | { | ||||||
|  |     std::vector<std::string> in = {par().q1, par().q2, par().q3, par().q4}; | ||||||
|  |      | ||||||
|  |     return in; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | std::vector<std::string> TWeakNeutral4ptDisc::getOutput(void) | ||||||
|  | { | ||||||
|  |     std::vector<std::string> out = {}; | ||||||
|  |      | ||||||
|  |     return out; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // setup /////////////////////////////////////////////////////////////////////// | ||||||
|  | void TWeakNeutral4ptDisc::setup(void) | ||||||
|  | { | ||||||
|  |     unsigned int ndim = env().getNd(); | ||||||
|  |  | ||||||
|  |     envTmpLat(LatticeComplex,  "expbuf"); | ||||||
|  |     envTmpLat(PropagatorField, "tmp"); | ||||||
|  |     envTmpLat(LatticeComplex,  "curr"); | ||||||
|  |     envTmp(std::vector<PropagatorField>, "meson", 1, ndim, PropagatorField(env().getGrid())); | ||||||
|  |     envTmp(std::vector<PropagatorField>, "loop", 1, ndim,  PropagatorField(env().getGrid())); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // execution /////////////////////////////////////////////////////////////////// | ||||||
|  | void TWeakNeutral4ptDisc::execute(void) | ||||||
|  | { | ||||||
|  |     LOG(Message) << "Computing Weak Hamiltonian neutral disconnected contractions '"  | ||||||
|  |                  << getName() << "' using quarks '" << par().q1 << "', '"  | ||||||
|  |                  << par().q2 << ", '" << par().q3 << "' and '" << par().q4  | ||||||
|  |                  << "'." << std::endl; | ||||||
|  |  | ||||||
|  |     ResultWriter          writer(RESULT_FILE_NAME(par().output)); | ||||||
|  |     auto                  &q1 = envGet(PropagatorField, par().q1); | ||||||
|  |     auto                  &q2 = envGet(PropagatorField, par().q2); | ||||||
|  |     auto                  &q3 = envGet(PropagatorField, par().q3); | ||||||
|  |     auto                  &q4 = envGet(PropagatorField, par().q4); | ||||||
|  |     Gamma                 g5  = Gamma(Gamma::Algebra::Gamma5); | ||||||
|  |     std::vector<TComplex> corrbuf; | ||||||
|  |     std::vector<Result>   result(n_neut_disc_diag); | ||||||
|  |     unsigned int          ndim = env().getNd(); | ||||||
|  |  | ||||||
|  |     envGetTmp(LatticeComplex,               expbuf);  | ||||||
|  |     envGetTmp(PropagatorField,              tmp); | ||||||
|  |     envGetTmp(LatticeComplex,               curr); | ||||||
|  |     envGetTmp(std::vector<PropagatorField>, meson); | ||||||
|  |     envGetTmp(std::vector<PropagatorField>, loop); | ||||||
|  |  | ||||||
|  |     // Setup for type 1 contractions. | ||||||
|  |     for (int mu = 0; mu < ndim; ++mu) | ||||||
|  |     { | ||||||
|  |         meson[mu] = MAKE_DISC_MESON(q1, q2, GammaL(Gamma::gmu[mu])); | ||||||
|  |         loop[mu] = MAKE_DISC_LOOP(q4, GammaL(Gamma::gmu[mu])); | ||||||
|  |     } | ||||||
|  |     curr = MAKE_DISC_CURR(q3, GammaL(Gamma::Algebra::Gamma5)); | ||||||
|  |  | ||||||
|  |     // Perform type 1 contractions.     | ||||||
|  |     SUM_MU(expbuf, trace(meson[mu]*loop[mu])) | ||||||
|  |     expbuf *= curr; | ||||||
|  |     MAKE_DIAG(expbuf, corrbuf, result[neut_disc_1_diag], "HW_disc0_1") | ||||||
|  |  | ||||||
|  |     // Perform type 2 contractions. | ||||||
|  |     SUM_MU(expbuf, trace(meson[mu])*trace(loop[mu])) | ||||||
|  |     expbuf *= curr; | ||||||
|  |     MAKE_DIAG(expbuf, corrbuf, result[neut_disc_2_diag], "HW_disc0_2") | ||||||
|  |  | ||||||
|  |     write(writer, "HW_disc0", result); | ||||||
|  | } | ||||||
							
								
								
									
										60
									
								
								extras/Hadrons/Modules/MContraction/WeakNeutral4ptDisc.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										60
									
								
								extras/Hadrons/Modules/MContraction/WeakNeutral4ptDisc.hpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,60 @@ | |||||||
|  | /************************************************************************************* | ||||||
|  |  | ||||||
|  | Grid physics library, www.github.com/paboyle/Grid  | ||||||
|  |  | ||||||
|  | Source file: extras/Hadrons/Modules/MContraction/WeakNeutral4ptDisc.hpp | ||||||
|  |  | ||||||
|  | Copyright (C) 2015-2018 | ||||||
|  |  | ||||||
|  | Author: Antonin Portelli <antonin.portelli@me.com> | ||||||
|  | Author: Lanny91 <andrew.lawson@gmail.com> | ||||||
|  |  | ||||||
|  | This program is free software; you can redistribute it and/or modify | ||||||
|  | it under the terms of the GNU General Public License as published by | ||||||
|  | the Free Software Foundation; either version 2 of the License, or | ||||||
|  | (at your option) any later version. | ||||||
|  |  | ||||||
|  | This program is distributed in the hope that it will be useful, | ||||||
|  | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||||
|  | GNU General Public License for more details. | ||||||
|  |  | ||||||
|  | You should have received a copy of the GNU General Public License along | ||||||
|  | with this program; if not, write to the Free Software Foundation, Inc., | ||||||
|  | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | ||||||
|  |  | ||||||
|  | See the full license in the file "LICENSE" in the top level distribution directory | ||||||
|  | *************************************************************************************/ | ||||||
|  | /*  END LEGAL */ | ||||||
|  |  | ||||||
|  | #ifndef Hadrons_MContraction_WeakNeutral4ptDisc_hpp_ | ||||||
|  | #define Hadrons_MContraction_WeakNeutral4ptDisc_hpp_ | ||||||
|  |  | ||||||
|  | #include <Grid/Hadrons/Modules/MContraction/WeakHamiltonian.hpp> | ||||||
|  |  | ||||||
|  | BEGIN_HADRONS_NAMESPACE | ||||||
|  |  | ||||||
|  | /****************************************************************************** | ||||||
|  |  *                         WeakNeutral4ptDisc                                 * | ||||||
|  |  ******************************************************************************/ | ||||||
|  | BEGIN_MODULE_NAMESPACE(MContraction) | ||||||
|  |  | ||||||
|  | enum | ||||||
|  | { | ||||||
|  |     neut_disc_1_diag = 0, | ||||||
|  |     neut_disc_2_diag = 1, | ||||||
|  |     n_neut_disc_diag = 2 | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | // Neutral 4pt disconnected subdiagram contractions. | ||||||
|  | #define MAKE_DISC_MESON(Q_1, Q_2, gamma) (Q_1*adj(Q_2)*g5*gamma) | ||||||
|  | #define MAKE_DISC_LOOP(Q_LOOP, gamma) (Q_LOOP*gamma) | ||||||
|  | #define MAKE_DISC_CURR(Q_c, gamma) (trace(Q_c*gamma)) | ||||||
|  |  | ||||||
|  | MAKE_WEAK_MODULE(WeakNeutral4ptDisc) | ||||||
|  |  | ||||||
|  | END_MODULE_NAMESPACE | ||||||
|  |  | ||||||
|  | END_HADRONS_NAMESPACE | ||||||
|  |  | ||||||
|  | #endif // Hadrons_MContraction_WeakNeutral4ptDisc_hpp_ | ||||||
| @@ -2,12 +2,12 @@ | |||||||
| 
 | 
 | ||||||
| Grid physics library, www.github.com/paboyle/Grid  | Grid physics library, www.github.com/paboyle/Grid  | ||||||
| 
 | 
 | ||||||
| Source file: extras/Hadrons/Modules/Quark.hpp | Source file: extras/Hadrons/Modules/MFermion/GaugeProp.hpp | ||||||
| 
 | 
 | ||||||
| Copyright (C) 2015 | Copyright (C) 2015-2018 | ||||||
| Copyright (C) 2016 |  | ||||||
| 
 | 
 | ||||||
| Author: Antonin Portelli <antonin.portelli@me.com> | Author: Antonin Portelli <antonin.portelli@me.com> | ||||||
|  | Author: Lanny91 <andrew.lawson@gmail.com> | ||||||
| 
 | 
 | ||||||
| This program is free software; you can redistribute it and/or modify | This program is free software; you can redistribute it and/or modify | ||||||
| it under the terms of the GNU General Public License as published by | it under the terms of the GNU General Public License as published by | ||||||
| @@ -27,8 +27,8 @@ See the full license in the file "LICENSE" in the top level distribution directo | |||||||
| *************************************************************************************/ | *************************************************************************************/ | ||||||
| /*  END LEGAL */ | /*  END LEGAL */ | ||||||
| 
 | 
 | ||||||
| #ifndef Hadrons_Quark_hpp_ | #ifndef Hadrons_MFermion_GaugeProp_hpp_ | ||||||
| #define Hadrons_Quark_hpp_ | #define Hadrons_MFermion_GaugeProp_hpp_ | ||||||
| 
 | 
 | ||||||
| #include <Grid/Hadrons/Global.hpp> | #include <Grid/Hadrons/Global.hpp> | ||||||
| #include <Grid/Hadrons/Module.hpp> | #include <Grid/Hadrons/Module.hpp> | ||||||
| @@ -37,29 +37,53 @@ See the full license in the file "LICENSE" in the top level distribution directo | |||||||
| BEGIN_HADRONS_NAMESPACE | BEGIN_HADRONS_NAMESPACE | ||||||
| 
 | 
 | ||||||
| /******************************************************************************
 | /******************************************************************************
 | ||||||
|  *                               TQuark                                       * |  * 5D -> 4D and 4D -> 5D conversions.                                         * | ||||||
|  ******************************************************************************/ |  ******************************************************************************/ | ||||||
| class QuarkPar: Serializable | template<class vobj> // Note that 5D object is modified.
 | ||||||
|  | inline void make_4D(Lattice<vobj> &in_5d, Lattice<vobj> &out_4d, int Ls) | ||||||
|  | { | ||||||
|  |     axpby_ssp_pminus(in_5d, 0., in_5d, 1., in_5d, 0, 0); | ||||||
|  |     axpby_ssp_pplus(in_5d, 1., in_5d, 1., in_5d, 0, Ls-1); | ||||||
|  |     ExtractSlice(out_4d, in_5d, 0, 0); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | template<class vobj> | ||||||
|  | inline void make_5D(Lattice<vobj> &in_4d, Lattice<vobj> &out_5d, int Ls) | ||||||
|  | { | ||||||
|  |     out_5d = zero; | ||||||
|  |     InsertSlice(in_4d, out_5d, 0, 0); | ||||||
|  |     InsertSlice(in_4d, out_5d, Ls-1, 0); | ||||||
|  |     axpby_ssp_pplus(out_5d, 0., out_5d, 1., out_5d, 0, 0); | ||||||
|  |     axpby_ssp_pminus(out_5d, 0., out_5d, 1., out_5d, Ls-1, Ls-1); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /******************************************************************************
 | ||||||
|  |  *                                GaugeProp                                   * | ||||||
|  |  ******************************************************************************/ | ||||||
|  | BEGIN_MODULE_NAMESPACE(MFermion) | ||||||
|  | 
 | ||||||
|  | class GaugePropPar: Serializable | ||||||
| { | { | ||||||
| public: | public: | ||||||
|     GRID_SERIALIZABLE_CLASS_MEMBERS(QuarkPar, |     GRID_SERIALIZABLE_CLASS_MEMBERS(GaugePropPar, | ||||||
|                                     std::string, source, |                                     std::string, source, | ||||||
|                                     std::string, solver); |                                     std::string, solver); | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| template <typename FImpl> | template <typename FImpl> | ||||||
| class TQuark: public Module<QuarkPar> | class TGaugeProp: public Module<GaugePropPar> | ||||||
| { | { | ||||||
| public: | public: | ||||||
|     TYPE_ALIASES(FImpl,); |     FGS_TYPE_ALIASES(FImpl,); | ||||||
| public: | public: | ||||||
|     // constructor
 |     // constructor
 | ||||||
|     TQuark(const std::string name); |     TGaugeProp(const std::string name); | ||||||
|     // destructor
 |     // destructor
 | ||||||
|     virtual ~TQuark(void) = default; |     virtual ~TGaugeProp(void) = default; | ||||||
|     // dependencies/products
 |     // dependency relation
 | ||||||
|     virtual std::vector<std::string> getInput(void); |     virtual std::vector<std::string> getInput(void); | ||||||
|     virtual std::vector<std::string> getOutput(void); |     virtual std::vector<std::string> getOutput(void); | ||||||
|  | protected: | ||||||
|     // setup
 |     // setup
 | ||||||
|     virtual void setup(void); |     virtual void setup(void); | ||||||
|     // execution
 |     // execution
 | ||||||
| @@ -69,20 +93,19 @@ private: | |||||||
|     SolverFn     *solver_{nullptr}; |     SolverFn     *solver_{nullptr}; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| MODULE_REGISTER(Quark, TQuark<FIMPL>); | MODULE_REGISTER_NS(GaugeProp, TGaugeProp<FIMPL>, MFermion); | ||||||
| 
 |  | ||||||
| /******************************************************************************
 | /******************************************************************************
 | ||||||
|  *                          TQuark implementation                             * |  *                      TGaugeProp implementation                             * | ||||||
|  ******************************************************************************/ |  ******************************************************************************/ | ||||||
| // constructor /////////////////////////////////////////////////////////////////
 | // constructor /////////////////////////////////////////////////////////////////
 | ||||||
| template <typename FImpl> | template <typename FImpl> | ||||||
| TQuark<FImpl>::TQuark(const std::string name) | TGaugeProp<FImpl>::TGaugeProp(const std::string name) | ||||||
| : Module(name) | : Module<GaugePropPar>(name) | ||||||
| {} | {} | ||||||
| 
 | 
 | ||||||
| // dependencies/products ///////////////////////////////////////////////////////
 | // dependencies/products ///////////////////////////////////////////////////////
 | ||||||
| template <typename FImpl> | template <typename FImpl> | ||||||
| std::vector<std::string> TQuark<FImpl>::getInput(void) | std::vector<std::string> TGaugeProp<FImpl>::getInput(void) | ||||||
| { | { | ||||||
|     std::vector<std::string> in = {par().source, par().solver}; |     std::vector<std::string> in = {par().source, par().solver}; | ||||||
|      |      | ||||||
| @@ -90,7 +113,7 @@ std::vector<std::string> TQuark<FImpl>::getInput(void) | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| template <typename FImpl> | template <typename FImpl> | ||||||
| std::vector<std::string> TQuark<FImpl>::getOutput(void) | std::vector<std::string> TGaugeProp<FImpl>::getOutput(void) | ||||||
| { | { | ||||||
|     std::vector<std::string> out = {getName(), getName() + "_5d"}; |     std::vector<std::string> out = {getName(), getName() + "_5d"}; | ||||||
|      |      | ||||||
| @@ -99,56 +122,52 @@ std::vector<std::string> TQuark<FImpl>::getOutput(void) | |||||||
| 
 | 
 | ||||||
| // setup ///////////////////////////////////////////////////////////////////////
 | // setup ///////////////////////////////////////////////////////////////////////
 | ||||||
| template <typename FImpl> | template <typename FImpl> | ||||||
| void TQuark<FImpl>::setup(void) | void TGaugeProp<FImpl>::setup(void) | ||||||
| { | { | ||||||
|     Ls_ = env().getObjectLs(par().solver); |     Ls_ = env().getObjectLs(par().solver); | ||||||
|     env().template registerLattice<PropagatorField>(getName()); |     envCreateLat(PropagatorField, getName()); | ||||||
|  |     envTmpLat(FermionField, "source", Ls_); | ||||||
|  |     envTmpLat(FermionField, "sol", Ls_); | ||||||
|  |     envTmpLat(FermionField, "tmp"); | ||||||
|     if (Ls_ > 1) |     if (Ls_ > 1) | ||||||
|     { |     { | ||||||
|         env().template registerLattice<PropagatorField>(getName() + "_5d", Ls_); |         envCreateLat(PropagatorField, getName() + "_5d", Ls_); | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // execution ///////////////////////////////////////////////////////////////////
 | // execution ///////////////////////////////////////////////////////////////////
 | ||||||
| template <typename FImpl> | template <typename FImpl> | ||||||
| void TQuark<FImpl>::execute(void) | void TGaugeProp<FImpl>::execute(void) | ||||||
| { | { | ||||||
|     LOG(Message) << "Computing quark propagator '" << getName() << "'" |     LOG(Message) << "Computing quark propagator '" << getName() << "'" | ||||||
|                  << std::endl; |                  << std::endl; | ||||||
|      |      | ||||||
|     FermionField    source(env().getGrid(Ls_)), sol(env().getGrid(Ls_)), |     std::string propName = (Ls_ == 1) ? getName() : (getName() + "_5d"); | ||||||
|                     tmp(env().getGrid()); |     auto        &prop    = envGet(PropagatorField, propName); | ||||||
|     std::string     propName = (Ls_ == 1) ? getName() : (getName() + "_5d"); |     auto        &fullSrc = envGet(PropagatorField, par().source); | ||||||
|     PropagatorField &prop    = *env().template createLattice<PropagatorField>(propName); |     auto        &solver  = envGet(SolverFn, par().solver); | ||||||
|     PropagatorField &fullSrc = *env().template getObject<PropagatorField>(par().source); |  | ||||||
|     SolverFn        &solver  = *env().template getObject<SolverFn>(par().solver); |  | ||||||
|     if (Ls_ > 1) |  | ||||||
|     { |  | ||||||
|         env().template createLattice<PropagatorField>(getName()); |  | ||||||
|     } |  | ||||||
|      |      | ||||||
|  |     envGetTmp(FermionField, source); | ||||||
|  |     envGetTmp(FermionField, sol); | ||||||
|  |     envGetTmp(FermionField, tmp); | ||||||
|     LOG(Message) << "Inverting using solver '" << par().solver |     LOG(Message) << "Inverting using solver '" << par().solver | ||||||
|                  << "' on source '" << par().source << "'" << std::endl; |                  << "' on source '" << par().source << "'" << std::endl; | ||||||
|     for (unsigned int s = 0; s < Ns; ++s) |     for (unsigned int s = 0; s < Ns; ++s) | ||||||
|     for (unsigned int c = 0; c < Nc; ++c) |       for (unsigned int c = 0; c < FImpl::Dimension; ++c) | ||||||
|     { |     { | ||||||
|         LOG(Message) << "Inversion for spin= " << s << ", color= " << c |         LOG(Message) << "Inversion for spin= " << s << ", color= " << c | ||||||
|         << std::endl; |                      << std::endl; | ||||||
|         // source conversion for 4D sources
 |         // source conversion for 4D sources
 | ||||||
|         if (!env().isObject5d(par().source)) |         if (!env().isObject5d(par().source)) | ||||||
|         { |         { | ||||||
|             if (Ls_ == 1) |             if (Ls_ == 1) | ||||||
|             { |             { | ||||||
|                 PropToFerm(source, fullSrc, s, c); |                PropToFerm<FImpl>(source, fullSrc, s, c); | ||||||
|             } |             } | ||||||
|             else |             else | ||||||
|             { |             { | ||||||
|                 source = zero; |                 PropToFerm<FImpl>(tmp, fullSrc, s, c); | ||||||
|                 PropToFerm(tmp, fullSrc, s, c); |                 make_5D(tmp, source, Ls_); | ||||||
|                 InsertSlice(tmp, source, 0, 0); |  | ||||||
|                 InsertSlice(tmp, source, Ls_-1, 0); |  | ||||||
|                 axpby_ssp_pplus(source, 0., source, 1., source, 0, 0); |  | ||||||
|                 axpby_ssp_pminus(source, 0., source, 1., source, Ls_-1, Ls_-1); |  | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|         // source conversion for 5D sources
 |         // source conversion for 5D sources
 | ||||||
| @@ -156,30 +175,28 @@ void TQuark<FImpl>::execute(void) | |||||||
|         { |         { | ||||||
|             if (Ls_ != env().getObjectLs(par().source)) |             if (Ls_ != env().getObjectLs(par().source)) | ||||||
|             { |             { | ||||||
|                 HADRON_ERROR("Ls mismatch between quark action and source"); |                 HADRON_ERROR(Size, "Ls mismatch between quark action and source"); | ||||||
|             } |             } | ||||||
|             else |             else | ||||||
|             { |             { | ||||||
|                 PropToFerm(source, fullSrc, s, c); |                 PropToFerm<FImpl>(source, fullSrc, s, c); | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|         sol = zero; |         sol = zero; | ||||||
|         solver(sol, source); |         solver(sol, source); | ||||||
|         FermToProp(prop, sol, s, c); |         FermToProp<FImpl>(prop, sol, s, c); | ||||||
|         // create 4D propagators from 5D one if necessary
 |         // create 4D propagators from 5D one if necessary
 | ||||||
|         if (Ls_ > 1) |         if (Ls_ > 1) | ||||||
|         { |         { | ||||||
|             PropagatorField &p4d = |             PropagatorField &p4d = envGet(PropagatorField, getName()); | ||||||
|                 *env().template getObject<PropagatorField>(getName()); |             make_4D(sol, tmp, Ls_); | ||||||
|              |             FermToProp<FImpl>(p4d, tmp, s, c); | ||||||
|             axpby_ssp_pminus(sol, 0., sol, 1., sol, 0, 0); |  | ||||||
|             axpby_ssp_pplus(sol, 0., sol, 1., sol, 0, Ls_-1); |  | ||||||
|             ExtractSlice(tmp, sol, 0, 0); |  | ||||||
|             FermToProp(p4d, tmp, s, c); |  | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | END_MODULE_NAMESPACE | ||||||
|  | 
 | ||||||
| END_HADRONS_NAMESPACE | END_HADRONS_NAMESPACE | ||||||
| 
 | 
 | ||||||
| #endif // Hadrons_Quark_hpp_
 | #endif // Hadrons_MFermion_GaugeProp_hpp_
 | ||||||
							
								
								
									
										75
									
								
								extras/Hadrons/Modules/MGauge/FundtoHirep.cc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										75
									
								
								extras/Hadrons/Modules/MGauge/FundtoHirep.cc
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,75 @@ | |||||||
|  | /************************************************************************************* | ||||||
|  |  | ||||||
|  | Grid physics library, www.github.com/paboyle/Grid  | ||||||
|  |  | ||||||
|  | Source file: extras/Hadrons/Modules/MGauge/FundtoHirep.cc | ||||||
|  |  | ||||||
|  | Copyright (C) 2015 | ||||||
|  | Copyright (C) 2016 | ||||||
|  |  | ||||||
|  |  | ||||||
|  | This program is free software; you can redistribute it and/or modify | ||||||
|  | it under the terms of the GNU General Public License as published by | ||||||
|  | the Free Software Foundation; either version 2 of the License, or | ||||||
|  | (at your option) any later version. | ||||||
|  |  | ||||||
|  | This program is distributed in the hope that it will be useful, | ||||||
|  | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||||
|  | GNU General Public License for more details. | ||||||
|  |  | ||||||
|  | You should have received a copy of the GNU General Public License along | ||||||
|  | with this program; if not, write to the Free Software Foundation, Inc., | ||||||
|  | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | ||||||
|  |  | ||||||
|  | See the full license in the file "LICENSE" in the top level distribution directory | ||||||
|  | *************************************************************************************/ | ||||||
|  | /*  END LEGAL */ | ||||||
|  |  | ||||||
|  | #include <Grid/Hadrons/Modules/MGauge/FundtoHirep.hpp> | ||||||
|  |  | ||||||
|  | using namespace Grid; | ||||||
|  | using namespace Hadrons; | ||||||
|  | using namespace MGauge; | ||||||
|  |  | ||||||
|  | // constructor ///////////////////////////////////////////////////////////////// | ||||||
|  | template <class Rep> | ||||||
|  | TFundtoHirep<Rep>::TFundtoHirep(const std::string name) | ||||||
|  | : Module<FundtoHirepPar>(name) | ||||||
|  | {} | ||||||
|  |  | ||||||
|  | // dependencies/products /////////////////////////////////////////////////////// | ||||||
|  | template <class Rep> | ||||||
|  | std::vector<std::string> TFundtoHirep<Rep>::getInput(void) | ||||||
|  | { | ||||||
|  |     std::vector<std::string> in; | ||||||
|  |     return in; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | template <class Rep> | ||||||
|  | std::vector<std::string> TFundtoHirep<Rep>::getOutput(void) | ||||||
|  | { | ||||||
|  |     std::vector<std::string> out = {getName()}; | ||||||
|  |     return out; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // setup /////////////////////////////////////////////////////////////////////// | ||||||
|  | template <typename Rep> | ||||||
|  | void TFundtoHirep<Rep>::setup(void) | ||||||
|  | { | ||||||
|  |     env().template registerLattice<typename Rep::LatticeField>(getName()); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // execution /////////////////////////////////////////////////////////////////// | ||||||
|  | template <class Rep> | ||||||
|  | void TFundtoHirep<Rep>::execute(void) | ||||||
|  | { | ||||||
|  |     auto &U      = *env().template getObject<LatticeGaugeField>(par().gaugeconf); | ||||||
|  |     LOG(Message) << "Transforming Representation" << std::endl; | ||||||
|  |  | ||||||
|  |     Rep TargetRepresentation(U._grid); | ||||||
|  |     TargetRepresentation.update_representation(U); | ||||||
|  |  | ||||||
|  |    typename Rep::LatticeField &URep = *env().template createLattice<typename Rep::LatticeField>(getName()); | ||||||
|  |     URep = TargetRepresentation.U; | ||||||
|  | } | ||||||
							
								
								
									
										77
									
								
								extras/Hadrons/Modules/MGauge/FundtoHirep.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										77
									
								
								extras/Hadrons/Modules/MGauge/FundtoHirep.hpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,77 @@ | |||||||
|  | /************************************************************************************* | ||||||
|  |  | ||||||
|  | Grid physics library, www.github.com/paboyle/Grid  | ||||||
|  |  | ||||||
|  | Source file: extras/Hadrons/Modules/MGauge/FundtoHirep.hpp | ||||||
|  |  | ||||||
|  | Copyright (C) 2015 | ||||||
|  | Copyright (C) 2016 | ||||||
|  |  | ||||||
|  | Author: David Preti <david.preti@to.infn.it> | ||||||
|  | 	Guido Cossu <guido.cossu@ed.ac.uk> | ||||||
|  |  | ||||||
|  | This program is free software; you can redistribute it and/or modify | ||||||
|  | it under the terms of the GNU General Public License as published by | ||||||
|  | the Free Software Foundation; either version 2 of the License, or | ||||||
|  | (at your option) any later version. | ||||||
|  |  | ||||||
|  | This program is distributed in the hope that it will be useful, | ||||||
|  | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||||
|  | GNU General Public License for more details. | ||||||
|  |  | ||||||
|  | You should have received a copy of the GNU General Public License along | ||||||
|  | with this program; if not, write to the Free Software Foundation, Inc., | ||||||
|  | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | ||||||
|  |  | ||||||
|  | See the full license in the file "LICENSE" in the top level distribution directory | ||||||
|  | *************************************************************************************/ | ||||||
|  | /*  END LEGAL */ | ||||||
|  |  | ||||||
|  | #ifndef Hadrons_MGauge_FundtoHirep_hpp_ | ||||||
|  | #define Hadrons_MGauge_FundtoHirep_hpp_ | ||||||
|  |  | ||||||
|  | #include <Grid/Hadrons/Global.hpp> | ||||||
|  | #include <Grid/Hadrons/Module.hpp> | ||||||
|  | #include <Grid/Hadrons/ModuleFactory.hpp> | ||||||
|  |  | ||||||
|  | BEGIN_HADRONS_NAMESPACE | ||||||
|  |  | ||||||
|  | /****************************************************************************** | ||||||
|  |  *                         Load a NERSC configuration                         * | ||||||
|  |  ******************************************************************************/ | ||||||
|  | BEGIN_MODULE_NAMESPACE(MGauge) | ||||||
|  |  | ||||||
|  | class FundtoHirepPar: Serializable | ||||||
|  | { | ||||||
|  | public: | ||||||
|  |     GRID_SERIALIZABLE_CLASS_MEMBERS(FundtoHirepPar, | ||||||
|  |                                     std::string, gaugeconf); | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | template <class Rep> | ||||||
|  | class TFundtoHirep: public Module<FundtoHirepPar> | ||||||
|  | { | ||||||
|  | public: | ||||||
|  |     // constructor | ||||||
|  |     TFundtoHirep(const std::string name); | ||||||
|  |     // destructor | ||||||
|  |     virtual ~TFundtoHirep(void) = default; | ||||||
|  |     // dependency relation | ||||||
|  |     virtual std::vector<std::string> getInput(void); | ||||||
|  |     virtual std::vector<std::string> getOutput(void); | ||||||
|  |     // setup | ||||||
|  |     void setup(void); | ||||||
|  |     // execution | ||||||
|  |     void execute(void); | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | //MODULE_REGISTER_NS(FundtoAdjoint,   TFundtoHirep<AdjointRepresentation>, MGauge); | ||||||
|  | //MODULE_REGISTER_NS(FundtoTwoIndexSym, TFundtoHirep<TwoIndexSymmetricRepresentation>, MGauge); | ||||||
|  | //MODULE_REGISTER_NS(FundtoTwoIndexAsym, TFundtoHirep<TwoIndexAntiSymmetricRepresentation>, MGauge); | ||||||
|  |  | ||||||
|  | END_MODULE_NAMESPACE | ||||||
|  |  | ||||||
|  | END_HADRONS_NAMESPACE | ||||||
|  |  | ||||||
|  | #endif // Hadrons_MGauge_FundtoHirep_hpp_ | ||||||
| @@ -4,8 +4,7 @@ Grid physics library, www.github.com/paboyle/Grid | |||||||
|  |  | ||||||
| Source file: extras/Hadrons/Modules/MGauge/Random.cc | Source file: extras/Hadrons/Modules/MGauge/Random.cc | ||||||
|  |  | ||||||
| Copyright (C) 2015 | Copyright (C) 2015-2018 | ||||||
| Copyright (C) 2016 |  | ||||||
|  |  | ||||||
| Author: Antonin Portelli <antonin.portelli@me.com> | Author: Antonin Portelli <antonin.portelli@me.com> | ||||||
|  |  | ||||||
| @@ -44,7 +43,9 @@ TRandom::TRandom(const std::string name) | |||||||
| // dependencies/products /////////////////////////////////////////////////////// | // dependencies/products /////////////////////////////////////////////////////// | ||||||
| std::vector<std::string> TRandom::getInput(void) | std::vector<std::string> TRandom::getInput(void) | ||||||
| { | { | ||||||
|     return std::vector<std::string>(); |     std::vector<std::string> in; | ||||||
|  |      | ||||||
|  |     return in; | ||||||
| } | } | ||||||
|  |  | ||||||
| std::vector<std::string> TRandom::getOutput(void) | std::vector<std::string> TRandom::getOutput(void) | ||||||
| @@ -57,13 +58,14 @@ std::vector<std::string> TRandom::getOutput(void) | |||||||
| // setup /////////////////////////////////////////////////////////////////////// | // setup /////////////////////////////////////////////////////////////////////// | ||||||
| void TRandom::setup(void) | void TRandom::setup(void) | ||||||
| { | { | ||||||
|     env().registerLattice<LatticeGaugeField>(getName()); |     envCreateLat(LatticeGaugeField, getName()); | ||||||
| } | } | ||||||
|  |  | ||||||
| // execution /////////////////////////////////////////////////////////////////// | // execution /////////////////////////////////////////////////////////////////// | ||||||
| void TRandom::execute(void) | void TRandom::execute(void) | ||||||
| { | { | ||||||
|     LOG(Message) << "Generating random gauge configuration" << std::endl; |     LOG(Message) << "Generating random gauge configuration" << std::endl; | ||||||
|     LatticeGaugeField &U = *env().createLattice<LatticeGaugeField>(getName()); |      | ||||||
|  |     auto &U = envGet(LatticeGaugeField, getName()); | ||||||
|     SU3::HotConfiguration(*env().get4dRng(), U); |     SU3::HotConfiguration(*env().get4dRng(), U); | ||||||
| } | } | ||||||
|   | |||||||
| @@ -4,8 +4,7 @@ Grid physics library, www.github.com/paboyle/Grid | |||||||
|  |  | ||||||
| Source file: extras/Hadrons/Modules/MGauge/Random.hpp | Source file: extras/Hadrons/Modules/MGauge/Random.hpp | ||||||
|  |  | ||||||
| Copyright (C) 2015 | Copyright (C) 2015-2018 | ||||||
| Copyright (C) 2016 |  | ||||||
|  |  | ||||||
| Author: Antonin Portelli <antonin.portelli@me.com> | Author: Antonin Portelli <antonin.portelli@me.com> | ||||||
|  |  | ||||||
| @@ -27,8 +26,8 @@ See the full license in the file "LICENSE" in the top level distribution directo | |||||||
| *************************************************************************************/ | *************************************************************************************/ | ||||||
| /*  END LEGAL */ | /*  END LEGAL */ | ||||||
|  |  | ||||||
| #ifndef Hadrons_Random_hpp_ | #ifndef Hadrons_MGauge_Random_hpp_ | ||||||
| #define Hadrons_Random_hpp_ | #define Hadrons_MGauge_Random_hpp_ | ||||||
|  |  | ||||||
| #include <Grid/Hadrons/Global.hpp> | #include <Grid/Hadrons/Global.hpp> | ||||||
| #include <Grid/Hadrons/Module.hpp> | #include <Grid/Hadrons/Module.hpp> | ||||||
| @@ -51,6 +50,7 @@ public: | |||||||
|     // dependency relation |     // dependency relation | ||||||
|     virtual std::vector<std::string> getInput(void); |     virtual std::vector<std::string> getInput(void); | ||||||
|     virtual std::vector<std::string> getOutput(void); |     virtual std::vector<std::string> getOutput(void); | ||||||
|  | protected: | ||||||
|     // setup |     // setup | ||||||
|     virtual void setup(void); |     virtual void setup(void); | ||||||
|     // execution |     // execution | ||||||
| @@ -63,4 +63,4 @@ END_MODULE_NAMESPACE | |||||||
|  |  | ||||||
| END_HADRONS_NAMESPACE | END_HADRONS_NAMESPACE | ||||||
|  |  | ||||||
| #endif // Hadrons_Random_hpp_ | #endif // Hadrons_MGauge_Random_hpp_ | ||||||
|   | |||||||
							
								
								
									
										84
									
								
								extras/Hadrons/Modules/MGauge/StochEm.cc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										84
									
								
								extras/Hadrons/Modules/MGauge/StochEm.cc
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,84 @@ | |||||||
|  | /************************************************************************************* | ||||||
|  |  | ||||||
|  | Grid physics library, www.github.com/paboyle/Grid  | ||||||
|  |  | ||||||
|  | Source file: extras/Hadrons/Modules/MGauge/StochEm.cc | ||||||
|  |  | ||||||
|  | Copyright (C) 2015-2018 | ||||||
|  |  | ||||||
|  | Author: Antonin Portelli <antonin.portelli@me.com> | ||||||
|  |  | ||||||
|  | This program is free software; you can redistribute it and/or modify | ||||||
|  | it under the terms of the GNU General Public License as published by | ||||||
|  | the Free Software Foundation; either version 2 of the License, or | ||||||
|  | (at your option) any later version. | ||||||
|  |  | ||||||
|  | This program is distributed in the hope that it will be useful, | ||||||
|  | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||||
|  | GNU General Public License for more details. | ||||||
|  |  | ||||||
|  | You should have received a copy of the GNU General Public License along | ||||||
|  | with this program; if not, write to the Free Software Foundation, Inc., | ||||||
|  | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | ||||||
|  |  | ||||||
|  | See the full license in the file "LICENSE" in the top level distribution directory | ||||||
|  | *************************************************************************************/ | ||||||
|  | /*  END LEGAL */ | ||||||
|  | #include <Grid/Hadrons/Modules/MGauge/StochEm.hpp> | ||||||
|  |  | ||||||
|  | using namespace Grid; | ||||||
|  | using namespace Hadrons; | ||||||
|  | using namespace MGauge; | ||||||
|  |  | ||||||
|  | /****************************************************************************** | ||||||
|  | *                  TStochEm implementation                             * | ||||||
|  | ******************************************************************************/ | ||||||
|  | // constructor ///////////////////////////////////////////////////////////////// | ||||||
|  | TStochEm::TStochEm(const std::string name) | ||||||
|  | : Module<StochEmPar>(name) | ||||||
|  | {} | ||||||
|  |  | ||||||
|  | // dependencies/products /////////////////////////////////////////////////////// | ||||||
|  | std::vector<std::string> TStochEm::getInput(void) | ||||||
|  | { | ||||||
|  |     std::vector<std::string> in; | ||||||
|  |      | ||||||
|  |     return in; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | std::vector<std::string> TStochEm::getOutput(void) | ||||||
|  | { | ||||||
|  |     std::vector<std::string> out = {getName()}; | ||||||
|  |      | ||||||
|  |     return out; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // setup /////////////////////////////////////////////////////////////////////// | ||||||
|  | void TStochEm::setup(void) | ||||||
|  | { | ||||||
|  |     if (!env().hasCreatedObject("_" + getName() + "_weight")) | ||||||
|  |     { | ||||||
|  |         envCacheLat(EmComp, "_" + getName() + "_weight"); | ||||||
|  |     } | ||||||
|  |     envCreateLat(EmField, getName()); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // execution /////////////////////////////////////////////////////////////////// | ||||||
|  | void TStochEm::execute(void) | ||||||
|  | { | ||||||
|  |     LOG(Message) << "Generating stochatic EM potential..." << std::endl; | ||||||
|  |  | ||||||
|  |     PhotonR photon(par().gauge, par().zmScheme); | ||||||
|  |     auto    &a = envGet(EmField, getName()); | ||||||
|  |     auto    &w = envGet(EmComp, "_" + getName() + "_weight"); | ||||||
|  |      | ||||||
|  |     if (!env().hasCreatedObject("_" + getName() + "_weight")) | ||||||
|  |     { | ||||||
|  |         LOG(Message) << "Caching stochatic EM potential weight (gauge: " | ||||||
|  |                      << par().gauge << ", zero-mode scheme: " | ||||||
|  |                      << par().zmScheme << ")..." << std::endl; | ||||||
|  |         photon.StochasticWeight(w); | ||||||
|  |     } | ||||||
|  |     photon.StochasticField(a, *env().get4dRng(), w); | ||||||
|  | } | ||||||
							
								
								
									
										76
									
								
								extras/Hadrons/Modules/MGauge/StochEm.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										76
									
								
								extras/Hadrons/Modules/MGauge/StochEm.hpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,76 @@ | |||||||
|  | /************************************************************************************* | ||||||
|  |  | ||||||
|  | Grid physics library, www.github.com/paboyle/Grid  | ||||||
|  |  | ||||||
|  | Source file: extras/Hadrons/Modules/MGauge/StochEm.hpp | ||||||
|  |  | ||||||
|  | Copyright (C) 2015-2018 | ||||||
|  |  | ||||||
|  | Author: Antonin Portelli <antonin.portelli@me.com> | ||||||
|  |  | ||||||
|  | This program is free software; you can redistribute it and/or modify | ||||||
|  | it under the terms of the GNU General Public License as published by | ||||||
|  | the Free Software Foundation; either version 2 of the License, or | ||||||
|  | (at your option) any later version. | ||||||
|  |  | ||||||
|  | This program is distributed in the hope that it will be useful, | ||||||
|  | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||||
|  | GNU General Public License for more details. | ||||||
|  |  | ||||||
|  | You should have received a copy of the GNU General Public License along | ||||||
|  | with this program; if not, write to the Free Software Foundation, Inc., | ||||||
|  | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | ||||||
|  |  | ||||||
|  | See the full license in the file "LICENSE" in the top level distribution directory | ||||||
|  | *************************************************************************************/ | ||||||
|  | /*  END LEGAL */ | ||||||
|  | #ifndef Hadrons_MGauge_StochEm_hpp_ | ||||||
|  | #define Hadrons_MGauge_StochEm_hpp_ | ||||||
|  |  | ||||||
|  | #include <Grid/Hadrons/Global.hpp> | ||||||
|  | #include <Grid/Hadrons/Module.hpp> | ||||||
|  | #include <Grid/Hadrons/ModuleFactory.hpp> | ||||||
|  |  | ||||||
|  | BEGIN_HADRONS_NAMESPACE | ||||||
|  |  | ||||||
|  | /****************************************************************************** | ||||||
|  |  *                         StochEm                                 * | ||||||
|  |  ******************************************************************************/ | ||||||
|  | BEGIN_MODULE_NAMESPACE(MGauge) | ||||||
|  |  | ||||||
|  | class StochEmPar: Serializable | ||||||
|  | { | ||||||
|  | public: | ||||||
|  |     GRID_SERIALIZABLE_CLASS_MEMBERS(StochEmPar, | ||||||
|  |                                     PhotonR::Gauge,    gauge, | ||||||
|  |                                     PhotonR::ZmScheme, zmScheme); | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | class TStochEm: public Module<StochEmPar> | ||||||
|  | { | ||||||
|  | public: | ||||||
|  |     typedef PhotonR::GaugeField     EmField; | ||||||
|  |     typedef PhotonR::GaugeLinkField EmComp; | ||||||
|  | public: | ||||||
|  |     // constructor | ||||||
|  |     TStochEm(const std::string name); | ||||||
|  |     // destructor | ||||||
|  |     virtual ~TStochEm(void) = default; | ||||||
|  |     // dependency relation | ||||||
|  |     virtual std::vector<std::string> getInput(void); | ||||||
|  |     virtual std::vector<std::string> getOutput(void); | ||||||
|  | protected: | ||||||
|  |     // setup | ||||||
|  |     virtual void setup(void); | ||||||
|  |     // execution | ||||||
|  |     virtual void execute(void); | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | MODULE_REGISTER_NS(StochEm, TStochEm, MGauge); | ||||||
|  |  | ||||||
|  | END_MODULE_NAMESPACE | ||||||
|  |  | ||||||
|  | END_HADRONS_NAMESPACE | ||||||
|  |  | ||||||
|  | #endif // Hadrons_MGauge_StochEm_hpp_ | ||||||
| @@ -4,8 +4,7 @@ Grid physics library, www.github.com/paboyle/Grid | |||||||
|  |  | ||||||
| Source file: extras/Hadrons/Modules/MGauge/Unit.cc | Source file: extras/Hadrons/Modules/MGauge/Unit.cc | ||||||
|  |  | ||||||
| Copyright (C) 2015 | Copyright (C) 2015-2018 | ||||||
| Copyright (C) 2016 |  | ||||||
|  |  | ||||||
| Author: Antonin Portelli <antonin.portelli@me.com> | Author: Antonin Portelli <antonin.portelli@me.com> | ||||||
|  |  | ||||||
| @@ -57,13 +56,14 @@ std::vector<std::string> TUnit::getOutput(void) | |||||||
| // setup /////////////////////////////////////////////////////////////////////// | // setup /////////////////////////////////////////////////////////////////////// | ||||||
| void TUnit::setup(void) | void TUnit::setup(void) | ||||||
| { | { | ||||||
|     env().registerLattice<LatticeGaugeField>(getName()); |     envCreateLat(LatticeGaugeField, getName()); | ||||||
| } | } | ||||||
|  |  | ||||||
| // execution /////////////////////////////////////////////////////////////////// | // execution /////////////////////////////////////////////////////////////////// | ||||||
| void TUnit::execute(void) | void TUnit::execute(void) | ||||||
| { | { | ||||||
|     LOG(Message) << "Creating unit gauge configuration" << std::endl; |     LOG(Message) << "Creating unit gauge configuration" << std::endl; | ||||||
|     LatticeGaugeField &U = *env().createLattice<LatticeGaugeField>(getName()); |      | ||||||
|  |     auto &U = envGet(LatticeGaugeField, getName()); | ||||||
|     SU3::ColdConfiguration(*env().get4dRng(), U); |     SU3::ColdConfiguration(*env().get4dRng(), U); | ||||||
| } | } | ||||||
|   | |||||||
| @@ -4,8 +4,7 @@ Grid physics library, www.github.com/paboyle/Grid | |||||||
|  |  | ||||||
| Source file: extras/Hadrons/Modules/MGauge/Unit.hpp | Source file: extras/Hadrons/Modules/MGauge/Unit.hpp | ||||||
|  |  | ||||||
| Copyright (C) 2015 | Copyright (C) 2015-2018 | ||||||
| Copyright (C) 2016 |  | ||||||
|  |  | ||||||
| Author: Antonin Portelli <antonin.portelli@me.com> | Author: Antonin Portelli <antonin.portelli@me.com> | ||||||
|  |  | ||||||
| @@ -27,8 +26,8 @@ See the full license in the file "LICENSE" in the top level distribution directo | |||||||
| *************************************************************************************/ | *************************************************************************************/ | ||||||
| /*  END LEGAL */ | /*  END LEGAL */ | ||||||
|  |  | ||||||
| #ifndef Hadrons_Unit_hpp_ | #ifndef Hadrons_MGauge_Unit_hpp_ | ||||||
| #define Hadrons_Unit_hpp_ | #define Hadrons_MGauge_Unit_hpp_ | ||||||
|  |  | ||||||
| #include <Grid/Hadrons/Global.hpp> | #include <Grid/Hadrons/Global.hpp> | ||||||
| #include <Grid/Hadrons/Module.hpp> | #include <Grid/Hadrons/Module.hpp> | ||||||
| @@ -51,6 +50,7 @@ public: | |||||||
|     // dependencies/products |     // dependencies/products | ||||||
|     virtual std::vector<std::string> getInput(void); |     virtual std::vector<std::string> getInput(void); | ||||||
|     virtual std::vector<std::string> getOutput(void); |     virtual std::vector<std::string> getOutput(void); | ||||||
|  | protected: | ||||||
|     // setup |     // setup | ||||||
|     virtual void setup(void); |     virtual void setup(void); | ||||||
|     // execution |     // execution | ||||||
| @@ -63,4 +63,4 @@ END_MODULE_NAMESPACE | |||||||
|  |  | ||||||
| END_HADRONS_NAMESPACE | END_HADRONS_NAMESPACE | ||||||
|  |  | ||||||
| #endif // Hadrons_Unit_hpp_ | #endif // Hadrons_MGauge_Unit_hpp_ | ||||||
|   | |||||||
							
								
								
									
										140
									
								
								extras/Hadrons/Modules/MIO/LoadBinary.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										140
									
								
								extras/Hadrons/Modules/MIO/LoadBinary.hpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,140 @@ | |||||||
|  | /************************************************************************************* | ||||||
|  |  | ||||||
|  | Grid physics library, www.github.com/paboyle/Grid  | ||||||
|  |  | ||||||
|  | Source file: extras/Hadrons/Modules/MIO/LoadBinary.hpp | ||||||
|  |  | ||||||
|  | Copyright (C) 2015-2018 | ||||||
|  |  | ||||||
|  | Author: Antonin Portelli <antonin.portelli@me.com> | ||||||
|  |  | ||||||
|  | This program is free software; you can redistribute it and/or modify | ||||||
|  | it under the terms of the GNU General Public License as published by | ||||||
|  | the Free Software Foundation; either version 2 of the License, or | ||||||
|  | (at your option) any later version. | ||||||
|  |  | ||||||
|  | This program is distributed in the hope that it will be useful, | ||||||
|  | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||||
|  | GNU General Public License for more details. | ||||||
|  |  | ||||||
|  | You should have received a copy of the GNU General Public License along | ||||||
|  | with this program; if not, write to the Free Software Foundation, Inc., | ||||||
|  | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | ||||||
|  |  | ||||||
|  | See the full license in the file "LICENSE" in the top level distribution directory | ||||||
|  | *************************************************************************************/ | ||||||
|  | /*  END LEGAL */ | ||||||
|  | #ifndef Hadrons_MIO_LoadBinary_hpp_ | ||||||
|  | #define Hadrons_MIO_LoadBinary_hpp_ | ||||||
|  |  | ||||||
|  | #include <Grid/Hadrons/Global.hpp> | ||||||
|  | #include <Grid/Hadrons/Module.hpp> | ||||||
|  | #include <Grid/Hadrons/ModuleFactory.hpp> | ||||||
|  |  | ||||||
|  | BEGIN_HADRONS_NAMESPACE | ||||||
|  |  | ||||||
|  | /****************************************************************************** | ||||||
|  |  *                       Load a binary configurations                         * | ||||||
|  |  ******************************************************************************/ | ||||||
|  | BEGIN_MODULE_NAMESPACE(MIO) | ||||||
|  |  | ||||||
|  | class LoadBinaryPar: Serializable | ||||||
|  | { | ||||||
|  | public: | ||||||
|  |     GRID_SERIALIZABLE_CLASS_MEMBERS(LoadBinaryPar, | ||||||
|  |                                     std::string, file, | ||||||
|  |                                     std::string, format); | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | template <typename Impl> | ||||||
|  | class TLoadBinary: public Module<LoadBinaryPar> | ||||||
|  | { | ||||||
|  | public: | ||||||
|  |     typedef typename Impl::Field                  Field; | ||||||
|  |     typedef typename Impl::Simd                   Simd; | ||||||
|  |     typedef typename Field::vector_object         vobj; | ||||||
|  |     typedef typename vobj::scalar_object          sobj; | ||||||
|  |     typedef typename sobj::DoublePrecision        sobj_double; | ||||||
|  |     typedef BinarySimpleMunger<sobj_double, sobj> Munger; | ||||||
|  | public: | ||||||
|  |     // constructor | ||||||
|  |     TLoadBinary(const std::string name); | ||||||
|  |     // destructor | ||||||
|  |     virtual ~TLoadBinary(void) = default; | ||||||
|  |     // dependency relation | ||||||
|  |     virtual std::vector<std::string> getInput(void); | ||||||
|  |     virtual std::vector<std::string> getOutput(void); | ||||||
|  |     // setup | ||||||
|  |     virtual void setup(void); | ||||||
|  |     // execution | ||||||
|  |     virtual void execute(void); | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | MODULE_REGISTER_NS(LoadBinary, TLoadBinary<GIMPL>, MIO); | ||||||
|  | MODULE_REGISTER_NS(LoadBinaryScalarSU2, TLoadBinary<ScalarNxNAdjImplR<2>>, MIO); | ||||||
|  | MODULE_REGISTER_NS(LoadBinaryScalarSU3, TLoadBinary<ScalarNxNAdjImplR<3>>, MIO); | ||||||
|  | MODULE_REGISTER_NS(LoadBinaryScalarSU4, TLoadBinary<ScalarNxNAdjImplR<4>>, MIO); | ||||||
|  | MODULE_REGISTER_NS(LoadBinaryScalarSU5, TLoadBinary<ScalarNxNAdjImplR<5>>, MIO); | ||||||
|  | MODULE_REGISTER_NS(LoadBinaryScalarSU6, TLoadBinary<ScalarNxNAdjImplR<6>>, MIO); | ||||||
|  |  | ||||||
|  | /****************************************************************************** | ||||||
|  |  *                         TLoadBinary implementation                         * | ||||||
|  |  ******************************************************************************/ | ||||||
|  | // constructor ///////////////////////////////////////////////////////////////// | ||||||
|  | template <typename Impl> | ||||||
|  | TLoadBinary<Impl>::TLoadBinary(const std::string name) | ||||||
|  | : Module<LoadBinaryPar>(name) | ||||||
|  | {} | ||||||
|  |  | ||||||
|  | // dependencies/products /////////////////////////////////////////////////////// | ||||||
|  | template <typename Impl> | ||||||
|  | std::vector<std::string> TLoadBinary<Impl>::getInput(void) | ||||||
|  | { | ||||||
|  |     std::vector<std::string> in; | ||||||
|  |      | ||||||
|  |     return in; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | template <typename Impl> | ||||||
|  | std::vector<std::string> TLoadBinary<Impl>::getOutput(void) | ||||||
|  | { | ||||||
|  |     std::vector<std::string> out = {getName()}; | ||||||
|  |      | ||||||
|  |     return out; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // setup /////////////////////////////////////////////////////////////////////// | ||||||
|  | template <typename Impl> | ||||||
|  | void TLoadBinary<Impl>::setup(void) | ||||||
|  | { | ||||||
|  |     envCreateLat(Field, getName()); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // execution /////////////////////////////////////////////////////////////////// | ||||||
|  | template <typename Impl> | ||||||
|  | void TLoadBinary<Impl>::execute(void) | ||||||
|  | { | ||||||
|  |     Munger      munge; | ||||||
|  |     uint32_t    nersc_csum, scidac_csuma, scidac_csumb; | ||||||
|  |     auto        &U = envGet(Field, getName()); | ||||||
|  |     std::string filename = par().file + "." | ||||||
|  |                            + std::to_string(vm().getTrajectory()); | ||||||
|  |  | ||||||
|  |     LOG(Message) << "Loading " << par().format  | ||||||
|  |                  << " binary configuration from file '" << filename | ||||||
|  |                  << "'" << std::endl; | ||||||
|  |     BinaryIO::readLatticeObject<vobj, sobj_double>(U, filename, munge, 0,  | ||||||
|  |                                                    par().format, nersc_csum, | ||||||
|  |                                                    scidac_csuma, scidac_csumb); | ||||||
|  |     LOG(Message) << "Checksums:" << std::endl; | ||||||
|  |     LOG(Message) << "  NERSC    " << nersc_csum << std::endl; | ||||||
|  |     LOG(Message) << "  SciDAC A " << scidac_csuma << std::endl; | ||||||
|  |     LOG(Message) << "  SciDAC B " << scidac_csumb << std::endl; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | END_MODULE_NAMESPACE | ||||||
|  |  | ||||||
|  | END_HADRONS_NAMESPACE | ||||||
|  |  | ||||||
|  | #endif // Hadrons_MIO_LoadBinary_hpp_ | ||||||
| @@ -2,10 +2,9 @@ | |||||||
| 
 | 
 | ||||||
| Grid physics library, www.github.com/paboyle/Grid  | Grid physics library, www.github.com/paboyle/Grid  | ||||||
| 
 | 
 | ||||||
| Source file: extras/Hadrons/Modules/MGauge/Load.cc | Source file: extras/Hadrons/Modules/MIO/LoadNersc.cc | ||||||
| 
 | 
 | ||||||
| Copyright (C) 2015 | Copyright (C) 2015-2018 | ||||||
| Copyright (C) 2016 |  | ||||||
| 
 | 
 | ||||||
| Author: Antonin Portelli <antonin.portelli@me.com> | Author: Antonin Portelli <antonin.portelli@me.com> | ||||||
| 
 | 
 | ||||||
| @@ -26,30 +25,29 @@ with this program; if not, write to the Free Software Foundation, Inc., | |||||||
| See the full license in the file "LICENSE" in the top level distribution directory | See the full license in the file "LICENSE" in the top level distribution directory | ||||||
| *************************************************************************************/ | *************************************************************************************/ | ||||||
| /*  END LEGAL */ | /*  END LEGAL */ | ||||||
| 
 | #include <Grid/Hadrons/Modules/MIO/LoadNersc.hpp> | ||||||
| #include <Grid/Hadrons/Modules/MGauge/Load.hpp> |  | ||||||
| 
 | 
 | ||||||
| using namespace Grid; | using namespace Grid; | ||||||
| using namespace Hadrons; | using namespace Hadrons; | ||||||
| using namespace MGauge; | using namespace MIO; | ||||||
| 
 | 
 | ||||||
| /******************************************************************************
 | /******************************************************************************
 | ||||||
| *                           TLoad implementation                               * | *                       TLoadNersc implementation                             * | ||||||
| ******************************************************************************/ | ******************************************************************************/ | ||||||
| // constructor /////////////////////////////////////////////////////////////////
 | // constructor /////////////////////////////////////////////////////////////////
 | ||||||
| TLoad::TLoad(const std::string name) | TLoadNersc::TLoadNersc(const std::string name) | ||||||
| : Module<LoadPar>(name) | : Module<LoadNerscPar>(name) | ||||||
| {} | {} | ||||||
| 
 | 
 | ||||||
| // dependencies/products ///////////////////////////////////////////////////////
 | // dependencies/products ///////////////////////////////////////////////////////
 | ||||||
| std::vector<std::string> TLoad::getInput(void) | std::vector<std::string> TLoadNersc::getInput(void) | ||||||
| { | { | ||||||
|     std::vector<std::string> in; |     std::vector<std::string> in; | ||||||
|      |      | ||||||
|     return in; |     return in; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| std::vector<std::string> TLoad::getOutput(void) | std::vector<std::string> TLoadNersc::getOutput(void) | ||||||
| { | { | ||||||
|     std::vector<std::string> out = {getName()}; |     std::vector<std::string> out = {getName()}; | ||||||
|      |      | ||||||
| @@ -57,22 +55,22 @@ std::vector<std::string> TLoad::getOutput(void) | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // setup ///////////////////////////////////////////////////////////////////////
 | // setup ///////////////////////////////////////////////////////////////////////
 | ||||||
| void TLoad::setup(void) | void TLoadNersc::setup(void) | ||||||
| { | { | ||||||
|     env().registerLattice<LatticeGaugeField>(getName()); |     envCreateLat(LatticeGaugeField, getName()); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // execution ///////////////////////////////////////////////////////////////////
 | // execution ///////////////////////////////////////////////////////////////////
 | ||||||
| void TLoad::execute(void) | void TLoadNersc::execute(void) | ||||||
| { | { | ||||||
|     NerscField  header; |     FieldMetaData header; | ||||||
|     std::string fileName = par().file + "." |     std::string   fileName = par().file + "." | ||||||
|                            + std::to_string(env().getTrajectory()); |                              + std::to_string(vm().getTrajectory()); | ||||||
|      |  | ||||||
|     LOG(Message) << "Loading NERSC configuration from file '" << fileName |     LOG(Message) << "Loading NERSC configuration from file '" << fileName | ||||||
|                  << "'" << std::endl; |                  << "'" << std::endl; | ||||||
|     LatticeGaugeField &U = *env().createLattice<LatticeGaugeField>(getName()); | 
 | ||||||
|  |     auto &U = envGet(LatticeGaugeField, getName()); | ||||||
|     NerscIO::readConfiguration(U, header, fileName); |     NerscIO::readConfiguration(U, header, fileName); | ||||||
|     LOG(Message) << "NERSC header:" << std::endl; |     LOG(Message) << "NERSC header:" << std::endl; | ||||||
|     dump_nersc_header(header, LOG(Message)); |     dump_meta_data(header, LOG(Message)); | ||||||
| } | } | ||||||
| @@ -2,10 +2,9 @@ | |||||||
| 
 | 
 | ||||||
| Grid physics library, www.github.com/paboyle/Grid  | Grid physics library, www.github.com/paboyle/Grid  | ||||||
| 
 | 
 | ||||||
| Source file: extras/Hadrons/Modules/MGauge/Load.hpp | Source file: extras/Hadrons/Modules/MIO/LoadNersc.hpp | ||||||
| 
 | 
 | ||||||
| Copyright (C) 2015 | Copyright (C) 2015-2018 | ||||||
| Copyright (C) 2016 |  | ||||||
| 
 | 
 | ||||||
| Author: Antonin Portelli <antonin.portelli@me.com> | Author: Antonin Portelli <antonin.portelli@me.com> | ||||||
| 
 | 
 | ||||||
| @@ -26,9 +25,8 @@ with this program; if not, write to the Free Software Foundation, Inc., | |||||||
| See the full license in the file "LICENSE" in the top level distribution directory | See the full license in the file "LICENSE" in the top level distribution directory | ||||||
| *************************************************************************************/ | *************************************************************************************/ | ||||||
| /*  END LEGAL */ | /*  END LEGAL */ | ||||||
| 
 | #ifndef Hadrons_MIO_LoadNersc_hpp_ | ||||||
| #ifndef Hadrons_Load_hpp_ | #define Hadrons_MIO_LoadNersc_hpp_ | ||||||
| #define Hadrons_Load_hpp_ |  | ||||||
| 
 | 
 | ||||||
| #include <Grid/Hadrons/Global.hpp> | #include <Grid/Hadrons/Global.hpp> | ||||||
| #include <Grid/Hadrons/Module.hpp> | #include <Grid/Hadrons/Module.hpp> | ||||||
| @@ -37,24 +35,24 @@ See the full license in the file "LICENSE" in the top level distribution directo | |||||||
| BEGIN_HADRONS_NAMESPACE | BEGIN_HADRONS_NAMESPACE | ||||||
| 
 | 
 | ||||||
| /******************************************************************************
 | /******************************************************************************
 | ||||||
|  *                         Load a NERSC configuration                         * |  *                       Load a NERSC configuration                           * | ||||||
|  ******************************************************************************/ |  ******************************************************************************/ | ||||||
| BEGIN_MODULE_NAMESPACE(MGauge) | BEGIN_MODULE_NAMESPACE(MIO) | ||||||
| 
 | 
 | ||||||
| class LoadPar: Serializable | class LoadNerscPar: Serializable | ||||||
| { | { | ||||||
| public: | public: | ||||||
|     GRID_SERIALIZABLE_CLASS_MEMBERS(LoadPar, |     GRID_SERIALIZABLE_CLASS_MEMBERS(LoadNerscPar, | ||||||
|                                     std::string, file); |                                     std::string, file); | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| class TLoad: public Module<LoadPar> | class TLoadNersc: public Module<LoadNerscPar> | ||||||
| { | { | ||||||
| public: | public: | ||||||
|     // constructor
 |     // constructor
 | ||||||
|     TLoad(const std::string name); |     TLoadNersc(const std::string name); | ||||||
|     // destructor
 |     // destructor
 | ||||||
|     virtual ~TLoad(void) = default; |     virtual ~TLoadNersc(void) = default; | ||||||
|     // dependency relation
 |     // dependency relation
 | ||||||
|     virtual std::vector<std::string> getInput(void); |     virtual std::vector<std::string> getInput(void); | ||||||
|     virtual std::vector<std::string> getOutput(void); |     virtual std::vector<std::string> getOutput(void); | ||||||
| @@ -64,10 +62,10 @@ public: | |||||||
|     virtual void execute(void); |     virtual void execute(void); | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| MODULE_REGISTER_NS(Load, TLoad, MGauge); | MODULE_REGISTER_NS(LoadNersc, TLoadNersc, MIO); | ||||||
| 
 | 
 | ||||||
| END_MODULE_NAMESPACE | END_MODULE_NAMESPACE | ||||||
| 
 | 
 | ||||||
| END_HADRONS_NAMESPACE | END_HADRONS_NAMESPACE | ||||||
| 
 | 
 | ||||||
| #endif // Hadrons_Load_hpp_
 | #endif // Hadrons_MIO_LoadNersc_hpp_
 | ||||||
							
								
								
									
										134
									
								
								extras/Hadrons/Modules/MLoop/NoiseLoop.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										134
									
								
								extras/Hadrons/Modules/MLoop/NoiseLoop.hpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,134 @@ | |||||||
|  | /************************************************************************************* | ||||||
|  |  | ||||||
|  | Grid physics library, www.github.com/paboyle/Grid  | ||||||
|  |  | ||||||
|  | Source file: extras/Hadrons/Modules/MLoop/NoiseLoop.hpp | ||||||
|  |  | ||||||
|  | Copyright (C) 2015-2018 | ||||||
|  |  | ||||||
|  | Author: Antonin Portelli <antonin.portelli@me.com> | ||||||
|  | Author: Lanny91 <andrew.lawson@gmail.com> | ||||||
|  |  | ||||||
|  | This program is free software; you can redistribute it and/or modify | ||||||
|  | it under the terms of the GNU General Public License as published by | ||||||
|  | the Free Software Foundation; either version 2 of the License, or | ||||||
|  | (at your option) any later version. | ||||||
|  |  | ||||||
|  | This program is distributed in the hope that it will be useful, | ||||||
|  | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||||
|  | GNU General Public License for more details. | ||||||
|  |  | ||||||
|  | You should have received a copy of the GNU General Public License along | ||||||
|  | with this program; if not, write to the Free Software Foundation, Inc., | ||||||
|  | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | ||||||
|  |  | ||||||
|  | See the full license in the file "LICENSE" in the top level distribution directory | ||||||
|  | *************************************************************************************/ | ||||||
|  | /*  END LEGAL */ | ||||||
|  |  | ||||||
|  | #ifndef Hadrons_MLoop_NoiseLoop_hpp_ | ||||||
|  | #define Hadrons_MLoop_NoiseLoop_hpp_ | ||||||
|  |  | ||||||
|  | #include <Grid/Hadrons/Global.hpp> | ||||||
|  | #include <Grid/Hadrons/Module.hpp> | ||||||
|  | #include <Grid/Hadrons/ModuleFactory.hpp> | ||||||
|  |  | ||||||
|  | BEGIN_HADRONS_NAMESPACE | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |   | ||||||
|  |  Noise loop propagator | ||||||
|  |  ----------------------------- | ||||||
|  |  * loop_x = q_x * adj(eta_x) | ||||||
|  |   | ||||||
|  |  * options: | ||||||
|  |  - q = Result of inversion on noise source. | ||||||
|  |  - eta = noise source. | ||||||
|  |  | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /****************************************************************************** | ||||||
|  |  *                         NoiseLoop                                          * | ||||||
|  |  ******************************************************************************/ | ||||||
|  | BEGIN_MODULE_NAMESPACE(MLoop) | ||||||
|  |  | ||||||
|  | class NoiseLoopPar: Serializable | ||||||
|  | { | ||||||
|  | public: | ||||||
|  |     GRID_SERIALIZABLE_CLASS_MEMBERS(NoiseLoopPar, | ||||||
|  |                                     std::string, q, | ||||||
|  |                                     std::string, eta); | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | template <typename FImpl> | ||||||
|  | class TNoiseLoop: public Module<NoiseLoopPar> | ||||||
|  | { | ||||||
|  | public: | ||||||
|  |     FERM_TYPE_ALIASES(FImpl,); | ||||||
|  | public: | ||||||
|  |     // constructor | ||||||
|  |     TNoiseLoop(const std::string name); | ||||||
|  |     // destructor | ||||||
|  |     virtual ~TNoiseLoop(void) = default; | ||||||
|  |     // dependency relation | ||||||
|  |     virtual std::vector<std::string> getInput(void); | ||||||
|  |     virtual std::vector<std::string> getOutput(void); | ||||||
|  | protected: | ||||||
|  |     // setup | ||||||
|  |     virtual void setup(void); | ||||||
|  |     // execution | ||||||
|  |     virtual void execute(void); | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | MODULE_REGISTER_NS(NoiseLoop, TNoiseLoop<FIMPL>, MLoop); | ||||||
|  |  | ||||||
|  | /****************************************************************************** | ||||||
|  |  *                 TNoiseLoop implementation                                  * | ||||||
|  |  ******************************************************************************/ | ||||||
|  | // constructor ///////////////////////////////////////////////////////////////// | ||||||
|  | template <typename FImpl> | ||||||
|  | TNoiseLoop<FImpl>::TNoiseLoop(const std::string name) | ||||||
|  | : Module<NoiseLoopPar>(name) | ||||||
|  | {} | ||||||
|  |  | ||||||
|  | // dependencies/products /////////////////////////////////////////////////////// | ||||||
|  | template <typename FImpl> | ||||||
|  | std::vector<std::string> TNoiseLoop<FImpl>::getInput(void) | ||||||
|  | { | ||||||
|  |     std::vector<std::string> in = {par().q, par().eta}; | ||||||
|  |      | ||||||
|  |     return in; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | template <typename FImpl> | ||||||
|  | std::vector<std::string> TNoiseLoop<FImpl>::getOutput(void) | ||||||
|  | { | ||||||
|  |     std::vector<std::string> out = {getName()}; | ||||||
|  |      | ||||||
|  |     return out; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // setup /////////////////////////////////////////////////////////////////////// | ||||||
|  | template <typename FImpl> | ||||||
|  | void TNoiseLoop<FImpl>::setup(void) | ||||||
|  | { | ||||||
|  |     envCreateLat(PropagatorField, getName()); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // execution /////////////////////////////////////////////////////////////////// | ||||||
|  | template <typename FImpl> | ||||||
|  | void TNoiseLoop<FImpl>::execute(void) | ||||||
|  | { | ||||||
|  |     auto &loop = envGet(PropagatorField, getName()); | ||||||
|  |     auto &q    = envGet(PropagatorField, par().q); | ||||||
|  |     auto &eta  = envGet(PropagatorField, par().eta); | ||||||
|  |     loop = q*adj(eta); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | END_MODULE_NAMESPACE | ||||||
|  |  | ||||||
|  | END_HADRONS_NAMESPACE | ||||||
|  |  | ||||||
|  | #endif // Hadrons_MLoop_NoiseLoop_hpp_ | ||||||
							
								
								
									
										249
									
								
								extras/Hadrons/Modules/MScalar/ChargedProp.cc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										249
									
								
								extras/Hadrons/Modules/MScalar/ChargedProp.cc
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,249 @@ | |||||||
|  | /************************************************************************************* | ||||||
|  |  | ||||||
|  | Grid physics library, www.github.com/paboyle/Grid  | ||||||
|  |  | ||||||
|  | Source file: extras/Hadrons/Modules/MScalar/ChargedProp.cc | ||||||
|  |  | ||||||
|  | Copyright (C) 2015-2018 | ||||||
|  |  | ||||||
|  | Author: Antonin Portelli <antonin.portelli@me.com> | ||||||
|  | Author: James Harrison <jch1g10@soton.ac.uk> | ||||||
|  |  | ||||||
|  | This program is free software; you can redistribute it and/or modify | ||||||
|  | it under the terms of the GNU General Public License as published by | ||||||
|  | the Free Software Foundation; either version 2 of the License, or | ||||||
|  | (at your option) any later version. | ||||||
|  |  | ||||||
|  | This program is distributed in the hope that it will be useful, | ||||||
|  | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||||
|  | GNU General Public License for more details. | ||||||
|  |  | ||||||
|  | You should have received a copy of the GNU General Public License along | ||||||
|  | with this program; if not, write to the Free Software Foundation, Inc., | ||||||
|  | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | ||||||
|  |  | ||||||
|  | See the full license in the file "LICENSE" in the top level distribution directory | ||||||
|  | *************************************************************************************/ | ||||||
|  | /*  END LEGAL */ | ||||||
|  | #include <Grid/Hadrons/Modules/MScalar/ChargedProp.hpp> | ||||||
|  | #include <Grid/Hadrons/Modules/MScalar/Scalar.hpp> | ||||||
|  |  | ||||||
|  | using namespace Grid; | ||||||
|  | using namespace Hadrons; | ||||||
|  | using namespace MScalar; | ||||||
|  |  | ||||||
|  | /****************************************************************************** | ||||||
|  | *                     TChargedProp implementation                             * | ||||||
|  | ******************************************************************************/ | ||||||
|  | // constructor ///////////////////////////////////////////////////////////////// | ||||||
|  | TChargedProp::TChargedProp(const std::string name) | ||||||
|  | : Module<ChargedPropPar>(name) | ||||||
|  | {} | ||||||
|  |  | ||||||
|  | // dependencies/products /////////////////////////////////////////////////////// | ||||||
|  | std::vector<std::string> TChargedProp::getInput(void) | ||||||
|  | { | ||||||
|  |     std::vector<std::string> in = {par().source, par().emField}; | ||||||
|  |      | ||||||
|  |     return in; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | std::vector<std::string> TChargedProp::getOutput(void) | ||||||
|  | { | ||||||
|  |     std::vector<std::string> out = {getName()}; | ||||||
|  |      | ||||||
|  |     return out; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // setup /////////////////////////////////////////////////////////////////////// | ||||||
|  | void TChargedProp::setup(void) | ||||||
|  | { | ||||||
|  |     freeMomPropName_ = FREEMOMPROP(par().mass); | ||||||
|  |     phaseName_.clear(); | ||||||
|  |     for (unsigned int mu = 0; mu < env().getNd(); ++mu) | ||||||
|  |     { | ||||||
|  |         phaseName_.push_back("_shiftphase_" + std::to_string(mu)); | ||||||
|  |     } | ||||||
|  |     GFSrcName_ = getName() + "_DinvSrc"; | ||||||
|  |     fftName_   = getName() + "_fft"; | ||||||
|  |  | ||||||
|  |     freeMomPropDone_ = env().hasCreatedObject(freeMomPropName_); | ||||||
|  |     GFSrcDone_       = env().hasCreatedObject(GFSrcName_); | ||||||
|  |     phasesDone_      = env().hasCreatedObject(phaseName_[0]); | ||||||
|  |     envCacheLat(ScalarField, freeMomPropName_); | ||||||
|  |     for (unsigned int mu = 0; mu < env().getNd(); ++mu) | ||||||
|  |     { | ||||||
|  |         envCacheLat(ScalarField, phaseName_[mu]); | ||||||
|  |     } | ||||||
|  |     envCacheLat(ScalarField, GFSrcName_); | ||||||
|  |     envCreateLat(ScalarField, getName()); | ||||||
|  |     envTmpLat(ScalarField, "buf"); | ||||||
|  |     envTmpLat(ScalarField, "result"); | ||||||
|  |     envTmpLat(ScalarField, "Amu"); | ||||||
|  |     envCache(FFT, fftName_, 1, env().getGrid()); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // execution /////////////////////////////////////////////////////////////////// | ||||||
|  | void TChargedProp::execute(void) | ||||||
|  | { | ||||||
|  |     // CACHING ANALYTIC EXPRESSIONS | ||||||
|  |     makeCaches(); | ||||||
|  |  | ||||||
|  |     // PROPAGATOR CALCULATION | ||||||
|  |     LOG(Message) << "Computing charged scalar propagator" | ||||||
|  |                  << " (mass= " << par().mass | ||||||
|  |                  << ", charge= " << par().charge << ")..." << std::endl; | ||||||
|  |      | ||||||
|  |     auto   &prop  = envGet(ScalarField, getName()); | ||||||
|  |     auto   &GFSrc = envGet(ScalarField, GFSrcName_); | ||||||
|  |     auto   &G     = envGet(ScalarField, freeMomPropName_); | ||||||
|  |     auto   &fft   = envGet(FFT, fftName_); | ||||||
|  |     double q      = par().charge; | ||||||
|  |     envGetTmp(ScalarField, result);  | ||||||
|  |     envGetTmp(ScalarField, buf);  | ||||||
|  |  | ||||||
|  |     // G*F*Src | ||||||
|  |     prop = GFSrc; | ||||||
|  |  | ||||||
|  |     // - q*G*momD1*G*F*Src (momD1 = F*D1*Finv) | ||||||
|  |     buf = GFSrc; | ||||||
|  |     momD1(buf, fft); | ||||||
|  |     buf = G*buf; | ||||||
|  |     prop = prop - q*buf; | ||||||
|  |  | ||||||
|  |     // + q^2*G*momD1*G*momD1*G*F*Src (here buf = G*momD1*G*F*Src) | ||||||
|  |     momD1(buf, fft); | ||||||
|  |     prop = prop + q*q*G*buf; | ||||||
|  |  | ||||||
|  |     // - q^2*G*momD2*G*F*Src (momD2 = F*D2*Finv) | ||||||
|  |     buf = GFSrc; | ||||||
|  |     momD2(buf, fft); | ||||||
|  |     prop = prop - q*q*G*buf; | ||||||
|  |  | ||||||
|  |     // final FT | ||||||
|  |     fft.FFT_all_dim(prop, prop, FFT::backward); | ||||||
|  |      | ||||||
|  |     // OUTPUT IF NECESSARY | ||||||
|  |     if (!par().output.empty()) | ||||||
|  |     { | ||||||
|  |         std::string           filename = par().output + "." + | ||||||
|  |                                          std::to_string(vm().getTrajectory()); | ||||||
|  |          | ||||||
|  |         LOG(Message) << "Saving zero-momentum projection to '" | ||||||
|  |                      << filename << "'..." << std::endl; | ||||||
|  |          | ||||||
|  |         ResultWriter          writer(RESULT_FILE_NAME(par().output)); | ||||||
|  |         std::vector<TComplex> vecBuf; | ||||||
|  |         std::vector<Complex>  result; | ||||||
|  |          | ||||||
|  |         sliceSum(prop, vecBuf, Tp); | ||||||
|  |         result.resize(vecBuf.size()); | ||||||
|  |         for (unsigned int t = 0; t < vecBuf.size(); ++t) | ||||||
|  |         { | ||||||
|  |             result[t] = TensorRemove(vecBuf[t]); | ||||||
|  |         } | ||||||
|  |         write(writer, "charge", q); | ||||||
|  |         write(writer, "prop", result); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void TChargedProp::makeCaches(void) | ||||||
|  | { | ||||||
|  |     auto &freeMomProp = envGet(ScalarField, freeMomPropName_); | ||||||
|  |     auto &GFSrc       = envGet(ScalarField, GFSrcName_); | ||||||
|  |     auto &fft         = envGet(FFT, fftName_); | ||||||
|  |  | ||||||
|  |     if (!freeMomPropDone_) | ||||||
|  |     { | ||||||
|  |         LOG(Message) << "Caching momentum space free scalar propagator" | ||||||
|  |                      << " (mass= " << par().mass << ")..." << std::endl; | ||||||
|  |         SIMPL::MomentumSpacePropagator(freeMomProp, par().mass); | ||||||
|  |     } | ||||||
|  |     if (!GFSrcDone_) | ||||||
|  |     {    | ||||||
|  |         FFT  fft(env().getGrid()); | ||||||
|  |         auto &source = envGet(ScalarField, par().source); | ||||||
|  |  | ||||||
|  |         LOG(Message) << "Caching G*F*src..." << std::endl; | ||||||
|  |         fft.FFT_all_dim(GFSrc, source, FFT::forward); | ||||||
|  |         GFSrc = freeMomProp*GFSrc; | ||||||
|  |     } | ||||||
|  |     if (!phasesDone_) | ||||||
|  |     { | ||||||
|  |         std::vector<int> &l = env().getGrid()->_fdimensions; | ||||||
|  |         Complex          ci(0.0,1.0); | ||||||
|  |          | ||||||
|  |         LOG(Message) << "Caching shift phases..." << std::endl; | ||||||
|  |         for (unsigned int mu = 0; mu < env().getNd(); ++mu) | ||||||
|  |         { | ||||||
|  |             Real twoPiL = M_PI*2./l[mu]; | ||||||
|  |             auto &phmu  = envGet(ScalarField, phaseName_[mu]); | ||||||
|  |              | ||||||
|  |             LatticeCoordinate(phmu, mu); | ||||||
|  |             phmu = exp(ci*twoPiL*phmu); | ||||||
|  |             phase_.push_back(&phmu); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void TChargedProp::momD1(ScalarField &s, FFT &fft) | ||||||
|  | { | ||||||
|  |     auto        &A = envGet(EmField, par().emField); | ||||||
|  |     Complex     ci(0.0,1.0); | ||||||
|  |  | ||||||
|  |     envGetTmp(ScalarField, buf); | ||||||
|  |     envGetTmp(ScalarField, result); | ||||||
|  |     envGetTmp(ScalarField, Amu); | ||||||
|  |  | ||||||
|  |     result = zero; | ||||||
|  |     for (unsigned int mu = 0; mu < env().getNd(); ++mu) | ||||||
|  |     { | ||||||
|  |         Amu = peekLorentz(A, mu); | ||||||
|  |         buf = (*phase_[mu])*s; | ||||||
|  |         fft.FFT_all_dim(buf, buf, FFT::backward); | ||||||
|  |         buf = Amu*buf; | ||||||
|  |         fft.FFT_all_dim(buf, buf, FFT::forward); | ||||||
|  |         result = result - ci*buf; | ||||||
|  |     } | ||||||
|  |     fft.FFT_all_dim(s, s, FFT::backward); | ||||||
|  |     for (unsigned int mu = 0; mu < env().getNd(); ++mu) | ||||||
|  |     { | ||||||
|  |         Amu = peekLorentz(A, mu); | ||||||
|  |         buf = Amu*s; | ||||||
|  |         fft.FFT_all_dim(buf, buf, FFT::forward); | ||||||
|  |         result = result + ci*adj(*phase_[mu])*buf; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     s = result; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void TChargedProp::momD2(ScalarField &s, FFT &fft) | ||||||
|  | { | ||||||
|  |     auto &A = envGet(EmField, par().emField); | ||||||
|  |  | ||||||
|  |     envGetTmp(ScalarField, buf); | ||||||
|  |     envGetTmp(ScalarField, result); | ||||||
|  |     envGetTmp(ScalarField, Amu); | ||||||
|  |  | ||||||
|  |     result = zero; | ||||||
|  |     for (unsigned int mu = 0; mu < env().getNd(); ++mu) | ||||||
|  |     { | ||||||
|  |         Amu = peekLorentz(A, mu); | ||||||
|  |         buf = (*phase_[mu])*s; | ||||||
|  |         fft.FFT_all_dim(buf, buf, FFT::backward); | ||||||
|  |         buf = Amu*Amu*buf; | ||||||
|  |         fft.FFT_all_dim(buf, buf, FFT::forward); | ||||||
|  |         result = result + .5*buf; | ||||||
|  |     } | ||||||
|  |     fft.FFT_all_dim(s, s, FFT::backward); | ||||||
|  |     for (unsigned int mu = 0; mu < env().getNd(); ++mu) | ||||||
|  |     { | ||||||
|  |         Amu = peekLorentz(A, mu);         | ||||||
|  |         buf = Amu*Amu*s; | ||||||
|  |         fft.FFT_all_dim(buf, buf, FFT::forward); | ||||||
|  |         result = result + .5*adj(*phase_[mu])*buf; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     s = result; | ||||||
|  | } | ||||||
							
								
								
									
										89
									
								
								extras/Hadrons/Modules/MScalar/ChargedProp.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										89
									
								
								extras/Hadrons/Modules/MScalar/ChargedProp.hpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,89 @@ | |||||||
|  | /************************************************************************************* | ||||||
|  |  | ||||||
|  | Grid physics library, www.github.com/paboyle/Grid  | ||||||
|  |  | ||||||
|  | Source file: extras/Hadrons/Modules/MScalar/ChargedProp.hpp | ||||||
|  |  | ||||||
|  | Copyright (C) 2015-2018 | ||||||
|  |  | ||||||
|  | Author: Antonin Portelli <antonin.portelli@me.com> | ||||||
|  |  | ||||||
|  | This program is free software; you can redistribute it and/or modify | ||||||
|  | it under the terms of the GNU General Public License as published by | ||||||
|  | the Free Software Foundation; either version 2 of the License, or | ||||||
|  | (at your option) any later version. | ||||||
|  |  | ||||||
|  | This program is distributed in the hope that it will be useful, | ||||||
|  | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||||
|  | GNU General Public License for more details. | ||||||
|  |  | ||||||
|  | You should have received a copy of the GNU General Public License along | ||||||
|  | with this program; if not, write to the Free Software Foundation, Inc., | ||||||
|  | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | ||||||
|  |  | ||||||
|  | See the full license in the file "LICENSE" in the top level distribution directory | ||||||
|  | *************************************************************************************/ | ||||||
|  | /*  END LEGAL */ | ||||||
|  | #ifndef Hadrons_MScalar_ChargedProp_hpp_ | ||||||
|  | #define Hadrons_MScalar_ChargedProp_hpp_ | ||||||
|  |  | ||||||
|  | #include <Grid/Hadrons/Global.hpp> | ||||||
|  | #include <Grid/Hadrons/Module.hpp> | ||||||
|  | #include <Grid/Hadrons/ModuleFactory.hpp> | ||||||
|  |  | ||||||
|  | BEGIN_HADRONS_NAMESPACE | ||||||
|  |  | ||||||
|  | /****************************************************************************** | ||||||
|  |  *                       Charged scalar propagator                            * | ||||||
|  |  ******************************************************************************/ | ||||||
|  | BEGIN_MODULE_NAMESPACE(MScalar) | ||||||
|  |  | ||||||
|  | class ChargedPropPar: Serializable | ||||||
|  | { | ||||||
|  | public: | ||||||
|  |     GRID_SERIALIZABLE_CLASS_MEMBERS(ChargedPropPar, | ||||||
|  |                                     std::string, emField, | ||||||
|  |                                     std::string, source, | ||||||
|  |                                     double,      mass, | ||||||
|  |                                     double,      charge, | ||||||
|  |                                     std::string, output); | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | class TChargedProp: public Module<ChargedPropPar> | ||||||
|  | { | ||||||
|  | public: | ||||||
|  |     SCALAR_TYPE_ALIASES(SIMPL,); | ||||||
|  |     typedef PhotonR::GaugeField     EmField; | ||||||
|  |     typedef PhotonR::GaugeLinkField EmComp; | ||||||
|  | public: | ||||||
|  |     // constructor | ||||||
|  |     TChargedProp(const std::string name); | ||||||
|  |     // destructor | ||||||
|  |     virtual ~TChargedProp(void) = default; | ||||||
|  |     // dependency relation | ||||||
|  |     virtual std::vector<std::string> getInput(void); | ||||||
|  |     virtual std::vector<std::string> getOutput(void); | ||||||
|  | protected: | ||||||
|  |     // setup | ||||||
|  |     virtual void setup(void); | ||||||
|  |     // execution | ||||||
|  |     virtual void execute(void); | ||||||
|  | private: | ||||||
|  |     void makeCaches(void); | ||||||
|  |     void momD1(ScalarField &s, FFT &fft); | ||||||
|  |     void momD2(ScalarField &s, FFT &fft); | ||||||
|  | private: | ||||||
|  |     bool                       freeMomPropDone_, GFSrcDone_, phasesDone_; | ||||||
|  |     std::string                freeMomPropName_, GFSrcName_, fftName_; | ||||||
|  |     std::vector<std::string>   phaseName_; | ||||||
|  |     std::vector<ScalarField *> phase_; | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | MODULE_REGISTER_NS(ChargedProp, TChargedProp, MScalar); | ||||||
|  |  | ||||||
|  | END_MODULE_NAMESPACE | ||||||
|  |  | ||||||
|  | END_HADRONS_NAMESPACE | ||||||
|  |  | ||||||
|  | #endif // Hadrons_MScalar_ChargedProp_hpp_ | ||||||
							
								
								
									
										99
									
								
								extras/Hadrons/Modules/MScalar/FreeProp.cc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										99
									
								
								extras/Hadrons/Modules/MScalar/FreeProp.cc
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,99 @@ | |||||||
|  | /************************************************************************************* | ||||||
|  |  | ||||||
|  | Grid physics library, www.github.com/paboyle/Grid  | ||||||
|  |  | ||||||
|  | Source file: extras/Hadrons/Modules/MScalar/FreeProp.cc | ||||||
|  |  | ||||||
|  | Copyright (C) 2015-2018 | ||||||
|  |  | ||||||
|  | Author: Antonin Portelli <antonin.portelli@me.com> | ||||||
|  |  | ||||||
|  | This program is free software; you can redistribute it and/or modify | ||||||
|  | it under the terms of the GNU General Public License as published by | ||||||
|  | the Free Software Foundation; either version 2 of the License, or | ||||||
|  | (at your option) any later version. | ||||||
|  |  | ||||||
|  | This program is distributed in the hope that it will be useful, | ||||||
|  | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||||
|  | GNU General Public License for more details. | ||||||
|  |  | ||||||
|  | You should have received a copy of the GNU General Public License along | ||||||
|  | with this program; if not, write to the Free Software Foundation, Inc., | ||||||
|  | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | ||||||
|  |  | ||||||
|  | See the full license in the file "LICENSE" in the top level distribution directory | ||||||
|  | *************************************************************************************/ | ||||||
|  | /*  END LEGAL */ | ||||||
|  | #include <Grid/Hadrons/Modules/MScalar/FreeProp.hpp> | ||||||
|  | #include <Grid/Hadrons/Modules/MScalar/Scalar.hpp> | ||||||
|  |  | ||||||
|  | using namespace Grid; | ||||||
|  | using namespace Hadrons; | ||||||
|  | using namespace MScalar; | ||||||
|  |  | ||||||
|  | /****************************************************************************** | ||||||
|  | *                        TFreeProp implementation                             * | ||||||
|  | ******************************************************************************/ | ||||||
|  | // constructor ///////////////////////////////////////////////////////////////// | ||||||
|  | TFreeProp::TFreeProp(const std::string name) | ||||||
|  | : Module<FreePropPar>(name) | ||||||
|  | {} | ||||||
|  |  | ||||||
|  | // dependencies/products /////////////////////////////////////////////////////// | ||||||
|  | std::vector<std::string> TFreeProp::getInput(void) | ||||||
|  | { | ||||||
|  |     std::vector<std::string> in = {par().source}; | ||||||
|  |      | ||||||
|  |     return in; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | std::vector<std::string> TFreeProp::getOutput(void) | ||||||
|  | { | ||||||
|  |     std::vector<std::string> out = {getName()}; | ||||||
|  |      | ||||||
|  |     return out; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // setup /////////////////////////////////////////////////////////////////////// | ||||||
|  | void TFreeProp::setup(void) | ||||||
|  | { | ||||||
|  |     freeMomPropName_ = FREEMOMPROP(par().mass); | ||||||
|  |      | ||||||
|  |     freePropDone_ = env().hasCreatedObject(freeMomPropName_); | ||||||
|  |     envCacheLat(ScalarField, freeMomPropName_); | ||||||
|  |     envCreateLat(ScalarField, getName()); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // execution /////////////////////////////////////////////////////////////////// | ||||||
|  | void TFreeProp::execute(void) | ||||||
|  | { | ||||||
|  |     auto &freeMomProp = envGet(ScalarField, freeMomPropName_); | ||||||
|  |     auto &prop        = envGet(ScalarField, getName()); | ||||||
|  |     auto &source      = envGet(ScalarField, par().source); | ||||||
|  |  | ||||||
|  |     if (!freePropDone_) | ||||||
|  |     { | ||||||
|  |         LOG(Message) << "Caching momentum space free scalar propagator" | ||||||
|  |                      << " (mass= " << par().mass << ")..." << std::endl; | ||||||
|  |         SIMPL::MomentumSpacePropagator(freeMomProp, par().mass); | ||||||
|  |     } | ||||||
|  |     LOG(Message) << "Computing free scalar propagator..." << std::endl; | ||||||
|  |     SIMPL::FreePropagator(source, prop, freeMomProp); | ||||||
|  |      | ||||||
|  |     if (!par().output.empty()) | ||||||
|  |     { | ||||||
|  |         TextWriter            writer(par().output + "." + | ||||||
|  |                                      std::to_string(vm().getTrajectory())); | ||||||
|  |         std::vector<TComplex> buf; | ||||||
|  |         std::vector<Complex>  result; | ||||||
|  |          | ||||||
|  |         sliceSum(prop, buf, Tp); | ||||||
|  |         result.resize(buf.size()); | ||||||
|  |         for (unsigned int t = 0; t < buf.size(); ++t) | ||||||
|  |         { | ||||||
|  |             result[t] = TensorRemove(buf[t]); | ||||||
|  |         } | ||||||
|  |         write(writer, "prop", result); | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										79
									
								
								extras/Hadrons/Modules/MScalar/FreeProp.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										79
									
								
								extras/Hadrons/Modules/MScalar/FreeProp.hpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,79 @@ | |||||||
|  | /************************************************************************************* | ||||||
|  |  | ||||||
|  | Grid physics library, www.github.com/paboyle/Grid  | ||||||
|  |  | ||||||
|  | Source file: extras/Hadrons/Modules/MScalar/FreeProp.hpp | ||||||
|  |  | ||||||
|  | Copyright (C) 2015-2018 | ||||||
|  |  | ||||||
|  | Author: Antonin Portelli <antonin.portelli@me.com> | ||||||
|  |  | ||||||
|  | This program is free software; you can redistribute it and/or modify | ||||||
|  | it under the terms of the GNU General Public License as published by | ||||||
|  | the Free Software Foundation; either version 2 of the License, or | ||||||
|  | (at your option) any later version. | ||||||
|  |  | ||||||
|  | This program is distributed in the hope that it will be useful, | ||||||
|  | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||||
|  | GNU General Public License for more details. | ||||||
|  |  | ||||||
|  | You should have received a copy of the GNU General Public License along | ||||||
|  | with this program; if not, write to the Free Software Foundation, Inc., | ||||||
|  | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | ||||||
|  |  | ||||||
|  | See the full license in the file "LICENSE" in the top level distribution directory | ||||||
|  | *************************************************************************************/ | ||||||
|  | /*  END LEGAL */ | ||||||
|  | #ifndef Hadrons_MScalar_FreeProp_hpp_ | ||||||
|  | #define Hadrons_MScalar_FreeProp_hpp_ | ||||||
|  |  | ||||||
|  | #include <Grid/Hadrons/Global.hpp> | ||||||
|  | #include <Grid/Hadrons/Module.hpp> | ||||||
|  | #include <Grid/Hadrons/ModuleFactory.hpp> | ||||||
|  |  | ||||||
|  | BEGIN_HADRONS_NAMESPACE | ||||||
|  |  | ||||||
|  | /****************************************************************************** | ||||||
|  |  *                               FreeProp                                     * | ||||||
|  |  ******************************************************************************/ | ||||||
|  | BEGIN_MODULE_NAMESPACE(MScalar) | ||||||
|  |  | ||||||
|  | class FreePropPar: Serializable | ||||||
|  | { | ||||||
|  | public: | ||||||
|  |     GRID_SERIALIZABLE_CLASS_MEMBERS(FreePropPar, | ||||||
|  |                                     std::string, source, | ||||||
|  |                                     double,      mass, | ||||||
|  |                                     std::string, output); | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | class TFreeProp: public Module<FreePropPar> | ||||||
|  | { | ||||||
|  | public: | ||||||
|  |     SCALAR_TYPE_ALIASES(SIMPL,); | ||||||
|  | public: | ||||||
|  |     // constructor | ||||||
|  |     TFreeProp(const std::string name); | ||||||
|  |     // destructor | ||||||
|  |     virtual ~TFreeProp(void) = default; | ||||||
|  |     // dependency relation | ||||||
|  |     virtual std::vector<std::string> getInput(void); | ||||||
|  |     virtual std::vector<std::string> getOutput(void); | ||||||
|  | protected: | ||||||
|  |     // setup | ||||||
|  |     virtual void setup(void); | ||||||
|  |     // execution | ||||||
|  |     virtual void execute(void); | ||||||
|  | private: | ||||||
|  |     std::string freeMomPropName_; | ||||||
|  |     bool        freePropDone_; | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | MODULE_REGISTER_NS(FreeProp, TFreeProp, MScalar); | ||||||
|  |  | ||||||
|  | END_MODULE_NAMESPACE | ||||||
|  |  | ||||||
|  | END_HADRONS_NAMESPACE | ||||||
|  |  | ||||||
|  | #endif // Hadrons_MScalar_FreeProp_hpp_ | ||||||
							
								
								
									
										33
									
								
								extras/Hadrons/Modules/MScalar/Scalar.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								extras/Hadrons/Modules/MScalar/Scalar.hpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,33 @@ | |||||||
|  | /************************************************************************************* | ||||||
|  |  | ||||||
|  | Grid physics library, www.github.com/paboyle/Grid  | ||||||
|  |  | ||||||
|  | Source file: extras/Hadrons/Modules/MScalar/Scalar.hpp | ||||||
|  |  | ||||||
|  | Copyright (C) 2015-2018 | ||||||
|  |  | ||||||
|  | Author: Antonin Portelli <antonin.portelli@me.com> | ||||||
|  |  | ||||||
|  | This program is free software; you can redistribute it and/or modify | ||||||
|  | it under the terms of the GNU General Public License as published by | ||||||
|  | the Free Software Foundation; either version 2 of the License, or | ||||||
|  | (at your option) any later version. | ||||||
|  |  | ||||||
|  | This program is distributed in the hope that it will be useful, | ||||||
|  | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||||
|  | GNU General Public License for more details. | ||||||
|  |  | ||||||
|  | You should have received a copy of the GNU General Public License along | ||||||
|  | with this program; if not, write to the Free Software Foundation, Inc., | ||||||
|  | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | ||||||
|  |  | ||||||
|  | See the full license in the file "LICENSE" in the top level distribution directory | ||||||
|  | *************************************************************************************/ | ||||||
|  | /*  END LEGAL */ | ||||||
|  | #ifndef Hadrons_Scalar_hpp_ | ||||||
|  | #define Hadrons_Scalar_hpp_ | ||||||
|  |  | ||||||
|  | #define FREEMOMPROP(m) "_scalar_mom_prop_" + std::to_string(m) | ||||||
|  |  | ||||||
|  | #endif // Hadrons_Scalar_hpp_ | ||||||
							
								
								
									
										146
									
								
								extras/Hadrons/Modules/MScalarSUN/TrMag.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										146
									
								
								extras/Hadrons/Modules/MScalarSUN/TrMag.hpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,146 @@ | |||||||
|  | /************************************************************************************* | ||||||
|  |  | ||||||
|  | Grid physics library, www.github.com/paboyle/Grid  | ||||||
|  |  | ||||||
|  | Source file: extras/Hadrons/Modules/MScalarSUN/TrMag.hpp | ||||||
|  |  | ||||||
|  | Copyright (C) 2015-2018 | ||||||
|  |  | ||||||
|  | Author: Antonin Portelli <antonin.portelli@me.com> | ||||||
|  |  | ||||||
|  | This program is free software; you can redistribute it and/or modify | ||||||
|  | it under the terms of the GNU General Public License as published by | ||||||
|  | the Free Software Foundation; either version 2 of the License, or | ||||||
|  | (at your option) any later version. | ||||||
|  |  | ||||||
|  | This program is distributed in the hope that it will be useful, | ||||||
|  | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||||
|  | GNU General Public License for more details. | ||||||
|  |  | ||||||
|  | You should have received a copy of the GNU General Public License along | ||||||
|  | with this program; if not, write to the Free Software Foundation, Inc., | ||||||
|  | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | ||||||
|  |  | ||||||
|  | See the full license in the file "LICENSE" in the top level distribution directory | ||||||
|  | *************************************************************************************/ | ||||||
|  | /*  END LEGAL */ | ||||||
|  | #ifndef Hadrons_MScalarSUN_TrMag_hpp_ | ||||||
|  | #define Hadrons_MScalarSUN_TrMag_hpp_ | ||||||
|  |  | ||||||
|  | #include <Grid/Hadrons/Global.hpp> | ||||||
|  | #include <Grid/Hadrons/Module.hpp> | ||||||
|  | #include <Grid/Hadrons/ModuleFactory.hpp> | ||||||
|  |  | ||||||
|  | BEGIN_HADRONS_NAMESPACE | ||||||
|  |  | ||||||
|  | /****************************************************************************** | ||||||
|  |  *                       Module to compute tr(mag^n)                          * | ||||||
|  |  ******************************************************************************/ | ||||||
|  | BEGIN_MODULE_NAMESPACE(MScalarSUN) | ||||||
|  |  | ||||||
|  | class TrMagPar: Serializable | ||||||
|  | { | ||||||
|  | public: | ||||||
|  |     GRID_SERIALIZABLE_CLASS_MEMBERS(TrMagPar, | ||||||
|  |                                     std::string,  field, | ||||||
|  |                                     unsigned int, maxPow, | ||||||
|  |                                     std::string,  output); | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | template <typename SImpl> | ||||||
|  | class TTrMag: public Module<TrMagPar> | ||||||
|  | { | ||||||
|  | public: | ||||||
|  |     typedef typename SImpl::Field        Field; | ||||||
|  |     typedef typename SImpl::ComplexField ComplexField; | ||||||
|  |     class Result: Serializable | ||||||
|  |     { | ||||||
|  |     public: | ||||||
|  |         GRID_SERIALIZABLE_CLASS_MEMBERS(Result, | ||||||
|  |                                         std::string, op, | ||||||
|  |                                         Real,        value); | ||||||
|  |     }; | ||||||
|  | public: | ||||||
|  |     // constructor | ||||||
|  |     TTrMag(const std::string name); | ||||||
|  |     // destructor | ||||||
|  |     virtual ~TTrMag(void) = default; | ||||||
|  |     // dependency relation | ||||||
|  |     virtual std::vector<std::string> getInput(void); | ||||||
|  |     virtual std::vector<std::string> getOutput(void); | ||||||
|  |     // setup | ||||||
|  |     virtual void setup(void); | ||||||
|  |     // execution | ||||||
|  |     virtual void execute(void); | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | MODULE_REGISTER_NS(TrMagSU2, TTrMag<ScalarNxNAdjImplR<2>>, MScalarSUN); | ||||||
|  | MODULE_REGISTER_NS(TrMagSU3, TTrMag<ScalarNxNAdjImplR<3>>, MScalarSUN); | ||||||
|  | MODULE_REGISTER_NS(TrMagSU4, TTrMag<ScalarNxNAdjImplR<4>>, MScalarSUN); | ||||||
|  | MODULE_REGISTER_NS(TrMagSU5, TTrMag<ScalarNxNAdjImplR<5>>, MScalarSUN); | ||||||
|  | MODULE_REGISTER_NS(TrMagSU6, TTrMag<ScalarNxNAdjImplR<6>>, MScalarSUN); | ||||||
|  |  | ||||||
|  | /****************************************************************************** | ||||||
|  |  *                         TTrMag implementation                              * | ||||||
|  |  ******************************************************************************/ | ||||||
|  | // constructor ///////////////////////////////////////////////////////////////// | ||||||
|  | template <typename SImpl> | ||||||
|  | TTrMag<SImpl>::TTrMag(const std::string name) | ||||||
|  | : Module<TrMagPar>(name) | ||||||
|  | {} | ||||||
|  |  | ||||||
|  | // dependencies/products /////////////////////////////////////////////////////// | ||||||
|  | template <typename SImpl> | ||||||
|  | std::vector<std::string> TTrMag<SImpl>::getInput(void) | ||||||
|  | { | ||||||
|  |     std::vector<std::string> in = {par().field}; | ||||||
|  |      | ||||||
|  |     return in; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | template <typename SImpl> | ||||||
|  | std::vector<std::string> TTrMag<SImpl>::getOutput(void) | ||||||
|  | { | ||||||
|  |     std::vector<std::string> out = {}; | ||||||
|  |      | ||||||
|  |     return out; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // setup /////////////////////////////////////////////////////////////////////// | ||||||
|  | template <typename SImpl> | ||||||
|  | void TTrMag<SImpl>::setup(void) | ||||||
|  | {} | ||||||
|  |  | ||||||
|  | // execution /////////////////////////////////////////////////////////////////// | ||||||
|  | template <typename SImpl> | ||||||
|  | void TTrMag<SImpl>::execute(void) | ||||||
|  | { | ||||||
|  |     LOG(Message) << "Computing tr(mag^n) for n even up to " << par().maxPow | ||||||
|  |                  << "..." << std::endl; | ||||||
|  |  | ||||||
|  |     std::vector<Result> result; | ||||||
|  |     ResultWriter        writer(RESULT_FILE_NAME(par().output)); | ||||||
|  |     auto                &phi = envGet(Field, par().field); | ||||||
|  |  | ||||||
|  |     auto m2 = sum(phi), mn = m2; | ||||||
|  |  | ||||||
|  |     m2 = -m2*m2; | ||||||
|  |     mn = 1.; | ||||||
|  |     for (unsigned int n = 2; n <= par().maxPow; n += 2) | ||||||
|  |     { | ||||||
|  |         Result r; | ||||||
|  |  | ||||||
|  |         mn = mn*m2; | ||||||
|  |         r.op    = "tr(mag^" + std::to_string(n) + ")"; | ||||||
|  |         r.value = TensorRemove(trace(mn)).real(); | ||||||
|  |         result.push_back(r); | ||||||
|  |     } | ||||||
|  |     write(writer, "trmag", result); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | END_MODULE_NAMESPACE | ||||||
|  |  | ||||||
|  | END_HADRONS_NAMESPACE | ||||||
|  |  | ||||||
|  | #endif // Hadrons_MScalarSUN_TrMag_hpp_ | ||||||
							
								
								
									
										182
									
								
								extras/Hadrons/Modules/MScalarSUN/TrPhi.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										182
									
								
								extras/Hadrons/Modules/MScalarSUN/TrPhi.hpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,182 @@ | |||||||
|  | /************************************************************************************* | ||||||
|  |  | ||||||
|  | Grid physics library, www.github.com/paboyle/Grid  | ||||||
|  |  | ||||||
|  | Source file: extras/Hadrons/Modules/MScalarSUN/TrPhi.hpp | ||||||
|  |  | ||||||
|  | Copyright (C) 2015-2018 | ||||||
|  |  | ||||||
|  | Author: Antonin Portelli <antonin.portelli@me.com> | ||||||
|  |  | ||||||
|  | This program is free software; you can redistribute it and/or modify | ||||||
|  | it under the terms of the GNU General Public License as published by | ||||||
|  | the Free Software Foundation; either version 2 of the License, or | ||||||
|  | (at your option) any later version. | ||||||
|  |  | ||||||
|  | This program is distributed in the hope that it will be useful, | ||||||
|  | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||||
|  | GNU General Public License for more details. | ||||||
|  |  | ||||||
|  | You should have received a copy of the GNU General Public License along | ||||||
|  | with this program; if not, write to the Free Software Foundation, Inc., | ||||||
|  | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | ||||||
|  |  | ||||||
|  | See the full license in the file "LICENSE" in the top level distribution directory | ||||||
|  | *************************************************************************************/ | ||||||
|  | /*  END LEGAL */ | ||||||
|  | #ifndef Hadrons_MScalarSUN_TrPhi_hpp_ | ||||||
|  | #define Hadrons_MScalarSUN_TrPhi_hpp_ | ||||||
|  |  | ||||||
|  | #include <Grid/Hadrons/Global.hpp> | ||||||
|  | #include <Grid/Hadrons/Module.hpp> | ||||||
|  | #include <Grid/Hadrons/ModuleFactory.hpp> | ||||||
|  |  | ||||||
|  | BEGIN_HADRONS_NAMESPACE | ||||||
|  |  | ||||||
|  | /****************************************************************************** | ||||||
|  |  *                         Module to compute tr(phi^n)                        * | ||||||
|  |  ******************************************************************************/ | ||||||
|  | BEGIN_MODULE_NAMESPACE(MScalarSUN) | ||||||
|  |  | ||||||
|  | class TrPhiPar: Serializable | ||||||
|  | { | ||||||
|  | public: | ||||||
|  |     GRID_SERIALIZABLE_CLASS_MEMBERS(TrPhiPar, | ||||||
|  |                                     std::string,  field, | ||||||
|  |                                     unsigned int, maxPow, | ||||||
|  |                                     std::string,  output); | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | template <typename SImpl> | ||||||
|  | class TTrPhi: public Module<TrPhiPar> | ||||||
|  | { | ||||||
|  | public: | ||||||
|  |     typedef typename SImpl::Field        Field; | ||||||
|  |     typedef typename SImpl::ComplexField ComplexField; | ||||||
|  |     class Result: Serializable | ||||||
|  |     { | ||||||
|  |     public: | ||||||
|  |         GRID_SERIALIZABLE_CLASS_MEMBERS(Result, | ||||||
|  |                                         std::string, op, | ||||||
|  |                                         Real,        value); | ||||||
|  |     }; | ||||||
|  | public: | ||||||
|  |     // constructor | ||||||
|  |     TTrPhi(const std::string name); | ||||||
|  |     // destructor | ||||||
|  |     virtual ~TTrPhi(void) = default; | ||||||
|  |     // dependency relation | ||||||
|  |     virtual std::vector<std::string> getInput(void); | ||||||
|  |     virtual std::vector<std::string> getOutput(void); | ||||||
|  |     // setup | ||||||
|  |     virtual void setup(void); | ||||||
|  |     // execution | ||||||
|  |     virtual void execute(void); | ||||||
|  | private: | ||||||
|  |     // output name generator | ||||||
|  |     std::string outName(const unsigned int n); | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | MODULE_REGISTER_NS(TrPhiSU2, TTrPhi<ScalarNxNAdjImplR<2>>, MScalarSUN); | ||||||
|  | MODULE_REGISTER_NS(TrPhiSU3, TTrPhi<ScalarNxNAdjImplR<3>>, MScalarSUN); | ||||||
|  | MODULE_REGISTER_NS(TrPhiSU4, TTrPhi<ScalarNxNAdjImplR<4>>, MScalarSUN); | ||||||
|  | MODULE_REGISTER_NS(TrPhiSU5, TTrPhi<ScalarNxNAdjImplR<5>>, MScalarSUN); | ||||||
|  | MODULE_REGISTER_NS(TrPhiSU6, TTrPhi<ScalarNxNAdjImplR<6>>, MScalarSUN); | ||||||
|  |  | ||||||
|  | /****************************************************************************** | ||||||
|  |  *                          TTrPhi implementation                             * | ||||||
|  |  ******************************************************************************/ | ||||||
|  | // constructor ///////////////////////////////////////////////////////////////// | ||||||
|  | template <typename SImpl> | ||||||
|  | TTrPhi<SImpl>::TTrPhi(const std::string name) | ||||||
|  | : Module<TrPhiPar>(name) | ||||||
|  | {} | ||||||
|  |  | ||||||
|  | // dependencies/products /////////////////////////////////////////////////////// | ||||||
|  | template <typename SImpl> | ||||||
|  | std::vector<std::string> TTrPhi<SImpl>::getInput(void) | ||||||
|  | { | ||||||
|  |     std::vector<std::string> in = {par().field}; | ||||||
|  |      | ||||||
|  |     return in; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | template <typename SImpl> | ||||||
|  | std::vector<std::string> TTrPhi<SImpl>::getOutput(void) | ||||||
|  | { | ||||||
|  |     std::vector<std::string> out; | ||||||
|  |  | ||||||
|  |     for (unsigned int n = 2; n <= par().maxPow; n += 2) | ||||||
|  |     { | ||||||
|  |         out.push_back(outName(n)); | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     return out; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // setup /////////////////////////////////////////////////////////////////////// | ||||||
|  | template <typename SImpl> | ||||||
|  | void TTrPhi<SImpl>::setup(void) | ||||||
|  | { | ||||||
|  |     if (par().maxPow < 2) | ||||||
|  |     { | ||||||
|  |         HADRON_ERROR(Size, "'maxPow' should be at least equal to 2"); | ||||||
|  |     } | ||||||
|  |     envTmpLat(Field, "phi2"); | ||||||
|  |     envTmpLat(Field, "buf"); | ||||||
|  |     for (unsigned int n = 2; n <= par().maxPow; n += 2) | ||||||
|  |     { | ||||||
|  |         envCreateLat(ComplexField, outName(n)); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // execution /////////////////////////////////////////////////////////////////// | ||||||
|  | template <typename SImpl> | ||||||
|  | void TTrPhi<SImpl>::execute(void) | ||||||
|  | { | ||||||
|  |     LOG(Message) << "Computing tr(phi^n) for n even up to " << par().maxPow | ||||||
|  |                  << "..." << std::endl;  | ||||||
|  |  | ||||||
|  |     std::vector<Result> result; | ||||||
|  |     auto                &phi = envGet(Field, par().field); | ||||||
|  |  | ||||||
|  |     envGetTmp(Field, phi2); | ||||||
|  |     envGetTmp(Field, buf); | ||||||
|  |     buf  = 1.; | ||||||
|  |     phi2 = -phi*phi;  | ||||||
|  |     for (unsigned int n = 2; n <= par().maxPow; n += 2) | ||||||
|  |     { | ||||||
|  |         auto &phin = envGet(ComplexField, outName(n)); | ||||||
|  |  | ||||||
|  |         buf  = buf*phi2; | ||||||
|  |         phin = trace(buf); | ||||||
|  |         if (!par().output.empty()) | ||||||
|  |         { | ||||||
|  |             Result r; | ||||||
|  |  | ||||||
|  |             r.op    = "tr(phi^" + std::to_string(n) + ")"; | ||||||
|  |             r.value = TensorRemove(sum(phin)).real(); | ||||||
|  |             result.push_back(r); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |     if (result.size() > 0) | ||||||
|  |     { | ||||||
|  |         ResultWriter writer(RESULT_FILE_NAME(par().output)); | ||||||
|  |  | ||||||
|  |         write(writer, "trphi", result); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // output name generator /////////////////////////////////////////////////////// | ||||||
|  | template <typename SImpl> | ||||||
|  | std::string TTrPhi<SImpl>::outName(const unsigned int n) | ||||||
|  | { | ||||||
|  |     return getName() + "_" + std::to_string(n); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | END_MODULE_NAMESPACE | ||||||
|  |  | ||||||
|  | END_HADRONS_NAMESPACE | ||||||
|  |  | ||||||
|  | #endif // Hadrons_MScalarSUN_TrPhi_hpp_ | ||||||
							
								
								
									
										184
									
								
								extras/Hadrons/Modules/MScalarSUN/TwoPoint.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										184
									
								
								extras/Hadrons/Modules/MScalarSUN/TwoPoint.hpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,184 @@ | |||||||
|  | /************************************************************************************* | ||||||
|  |  | ||||||
|  | Grid physics library, www.github.com/paboyle/Grid  | ||||||
|  |  | ||||||
|  | Source file: extras/Hadrons/Modules/MScalarSUN/TwoPoint.hpp | ||||||
|  |  | ||||||
|  | Copyright (C) 2015-2018 | ||||||
|  |  | ||||||
|  | Author: Antonin Portelli <antonin.portelli@me.com> | ||||||
|  |  | ||||||
|  | This program is free software; you can redistribute it and/or modify | ||||||
|  | it under the terms of the GNU General Public License as published by | ||||||
|  | the Free Software Foundation; either version 2 of the License, or | ||||||
|  | (at your option) any later version. | ||||||
|  |  | ||||||
|  | This program is distributed in the hope that it will be useful, | ||||||
|  | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||||
|  | GNU General Public License for more details. | ||||||
|  |  | ||||||
|  | You should have received a copy of the GNU General Public License along | ||||||
|  | with this program; if not, write to the Free Software Foundation, Inc., | ||||||
|  | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | ||||||
|  |  | ||||||
|  | See the full license in the file "LICENSE" in the top level distribution directory | ||||||
|  | *************************************************************************************/ | ||||||
|  | /*  END LEGAL */ | ||||||
|  | #ifndef Hadrons_MScalarSUN_TwoPoint_hpp_ | ||||||
|  | #define Hadrons_MScalarSUN_TwoPoint_hpp_ | ||||||
|  |  | ||||||
|  | #include <Grid/Hadrons/Global.hpp> | ||||||
|  | #include <Grid/Hadrons/Module.hpp> | ||||||
|  | #include <Grid/Hadrons/ModuleFactory.hpp> | ||||||
|  |  | ||||||
|  | BEGIN_HADRONS_NAMESPACE | ||||||
|  |  | ||||||
|  | /****************************************************************************** | ||||||
|  |  *                 2-pt functions for a given set of operators                * | ||||||
|  |  ******************************************************************************/ | ||||||
|  | BEGIN_MODULE_NAMESPACE(MScalarSUN) | ||||||
|  |  | ||||||
|  | class TwoPointPar: Serializable | ||||||
|  | { | ||||||
|  | public: | ||||||
|  |     GRID_SERIALIZABLE_CLASS_MEMBERS(TwoPointPar, | ||||||
|  |                                     std::vector<std::string>, op, | ||||||
|  |                                     std::string,              output); | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | template <typename SImpl> | ||||||
|  | class TTwoPoint: public Module<TwoPointPar> | ||||||
|  | { | ||||||
|  | public: | ||||||
|  |     typedef typename SImpl::Field        Field; | ||||||
|  |     typedef typename SImpl::ComplexField ComplexField; | ||||||
|  |     class Result: Serializable | ||||||
|  |     { | ||||||
|  |     public: | ||||||
|  |         GRID_SERIALIZABLE_CLASS_MEMBERS(Result, | ||||||
|  |                                         std::string, sink, | ||||||
|  |                                         std::string, source, | ||||||
|  |                                         std::vector<Complex>, data); | ||||||
|  |     }; | ||||||
|  | public: | ||||||
|  |     // constructor | ||||||
|  |     TTwoPoint(const std::string name); | ||||||
|  |     // destructor | ||||||
|  |     virtual ~TTwoPoint(void) = default; | ||||||
|  |     // dependency relation | ||||||
|  |     virtual std::vector<std::string> getInput(void); | ||||||
|  |     virtual std::vector<std::string> getOutput(void); | ||||||
|  |     // setup | ||||||
|  |     virtual void setup(void); | ||||||
|  |     // execution | ||||||
|  |     virtual void execute(void); | ||||||
|  | private: | ||||||
|  |     // make 2-pt function | ||||||
|  |     template <class SinkSite, class SourceSite> | ||||||
|  |     std::vector<Complex> makeTwoPoint(const std::vector<SinkSite>   &sink, | ||||||
|  |                                       const std::vector<SourceSite> &source); | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | MODULE_REGISTER_NS(TwoPointSU2, TTwoPoint<ScalarNxNAdjImplR<2>>, MScalarSUN); | ||||||
|  | MODULE_REGISTER_NS(TwoPointSU3, TTwoPoint<ScalarNxNAdjImplR<3>>, MScalarSUN); | ||||||
|  | MODULE_REGISTER_NS(TwoPointSU4, TTwoPoint<ScalarNxNAdjImplR<4>>, MScalarSUN); | ||||||
|  | MODULE_REGISTER_NS(TwoPointSU5, TTwoPoint<ScalarNxNAdjImplR<5>>, MScalarSUN); | ||||||
|  | MODULE_REGISTER_NS(TwoPointSU6, TTwoPoint<ScalarNxNAdjImplR<6>>, MScalarSUN); | ||||||
|  |  | ||||||
|  | /****************************************************************************** | ||||||
|  |  *                 TTwoPoint implementation                             * | ||||||
|  |  ******************************************************************************/ | ||||||
|  | // constructor ///////////////////////////////////////////////////////////////// | ||||||
|  | template <typename SImpl> | ||||||
|  | TTwoPoint<SImpl>::TTwoPoint(const std::string name) | ||||||
|  | : Module<TwoPointPar>(name) | ||||||
|  | {} | ||||||
|  |  | ||||||
|  | // dependencies/products /////////////////////////////////////////////////////// | ||||||
|  | template <typename SImpl> | ||||||
|  | std::vector<std::string> TTwoPoint<SImpl>::getInput(void) | ||||||
|  | {    | ||||||
|  |     return par().op; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | template <typename SImpl> | ||||||
|  | std::vector<std::string> TTwoPoint<SImpl>::getOutput(void) | ||||||
|  | { | ||||||
|  |     std::vector<std::string> out = {}; | ||||||
|  |  | ||||||
|  |     return out; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // setup /////////////////////////////////////////////////////////////////////// | ||||||
|  | template <typename SImpl> | ||||||
|  | void TTwoPoint<SImpl>::setup(void) | ||||||
|  | { | ||||||
|  |     const unsigned int nt = env().getDim().back(); | ||||||
|  |     envTmp(std::vector<std::vector<TComplex>>, "slicedOp", 1, par().op.size(),  | ||||||
|  |            std::vector<TComplex>(nt)); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // execution /////////////////////////////////////////////////////////////////// | ||||||
|  | template <typename SImpl> | ||||||
|  | void TTwoPoint<SImpl>::execute(void) | ||||||
|  | { | ||||||
|  |     LOG(Message) << "Computing 2-point functions for operators:" << std::endl; | ||||||
|  |     for (auto &o: par().op) | ||||||
|  |     { | ||||||
|  |         LOG(Message) << "  '" << o << "'" << std::endl; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     ResultWriter        writer(RESULT_FILE_NAME(par().output)); | ||||||
|  |     const unsigned int  nd = env().getDim().size(); | ||||||
|  |     std::vector<Result> result; | ||||||
|  |      | ||||||
|  |     envGetTmp(std::vector<std::vector<TComplex>>, slicedOp); | ||||||
|  |     for (unsigned int i = 0; i < par().op.size(); ++i) | ||||||
|  |     { | ||||||
|  |         auto &op = envGet(ComplexField, par().op[i]); | ||||||
|  |  | ||||||
|  |         sliceSum(op, slicedOp[i], nd - 1); | ||||||
|  |     } | ||||||
|  |     for (unsigned int i = 0; i < par().op.size(); ++i) | ||||||
|  |     for (unsigned int j = 0; j < par().op.size(); ++j) | ||||||
|  |     { | ||||||
|  |         Result r; | ||||||
|  |  | ||||||
|  |         r.sink   = par().op[i]; | ||||||
|  |         r.source = par().op[j]; | ||||||
|  |         r.data   = makeTwoPoint(slicedOp[i], slicedOp[j]); | ||||||
|  |         result.push_back(r); | ||||||
|  |     } | ||||||
|  |     write(writer, "twopt", result); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // make 2-pt function ////////////////////////////////////////////////////////// | ||||||
|  | template <class SImpl> | ||||||
|  | template <class SinkSite, class SourceSite> | ||||||
|  | std::vector<Complex> TTwoPoint<SImpl>::makeTwoPoint( | ||||||
|  |                                   const std::vector<SinkSite>   &sink, | ||||||
|  |                                   const std::vector<SourceSite> &source) | ||||||
|  | { | ||||||
|  |     assert(sink.size() == source.size()); | ||||||
|  |      | ||||||
|  |     unsigned int         nt = sink.size(); | ||||||
|  |     std::vector<Complex> res(nt, 0.); | ||||||
|  |      | ||||||
|  |     for (unsigned int dt = 0; dt < nt; ++dt) | ||||||
|  |     { | ||||||
|  |         for (unsigned int t  = 0; t < nt; ++t) | ||||||
|  |         { | ||||||
|  |             res[dt] += TensorRemove(trace(sink[(t+dt)%nt]*source[t])); | ||||||
|  |         } | ||||||
|  |         res[dt] *= 1./static_cast<double>(nt); | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     return res; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | END_MODULE_NAMESPACE | ||||||
|  |  | ||||||
|  | END_HADRONS_NAMESPACE | ||||||
|  |  | ||||||
|  | #endif // Hadrons_MScalarSUN_TwoPoint_hpp_ | ||||||
							
								
								
									
										155
									
								
								extras/Hadrons/Modules/MSink/Point.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										155
									
								
								extras/Hadrons/Modules/MSink/Point.hpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,155 @@ | |||||||
|  | /************************************************************************************* | ||||||
|  |  | ||||||
|  | Grid physics library, www.github.com/paboyle/Grid  | ||||||
|  |  | ||||||
|  | Source file: extras/Hadrons/Modules/MSink/Point.hpp | ||||||
|  |  | ||||||
|  | Copyright (C) 2015-2018 | ||||||
|  |  | ||||||
|  | Author: Antonin Portelli <antonin.portelli@me.com> | ||||||
|  | Author: Lanny91 <andrew.lawson@gmail.com> | ||||||
|  |  | ||||||
|  | This program is free software; you can redistribute it and/or modify | ||||||
|  | it under the terms of the GNU General Public License as published by | ||||||
|  | the Free Software Foundation; either version 2 of the License, or | ||||||
|  | (at your option) any later version. | ||||||
|  |  | ||||||
|  | This program is distributed in the hope that it will be useful, | ||||||
|  | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||||
|  | GNU General Public License for more details. | ||||||
|  |  | ||||||
|  | You should have received a copy of the GNU General Public License along | ||||||
|  | with this program; if not, write to the Free Software Foundation, Inc., | ||||||
|  | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | ||||||
|  |  | ||||||
|  | See the full license in the file "LICENSE" in the top level distribution directory | ||||||
|  | *************************************************************************************/ | ||||||
|  | /*  END LEGAL */ | ||||||
|  |  | ||||||
|  | #ifndef Hadrons_MSink_Point_hpp_ | ||||||
|  | #define Hadrons_MSink_Point_hpp_ | ||||||
|  |  | ||||||
|  | #include <Grid/Hadrons/Global.hpp> | ||||||
|  | #include <Grid/Hadrons/Module.hpp> | ||||||
|  | #include <Grid/Hadrons/ModuleFactory.hpp> | ||||||
|  |  | ||||||
|  | BEGIN_HADRONS_NAMESPACE | ||||||
|  |  | ||||||
|  | /****************************************************************************** | ||||||
|  |  *                                   Point                                    * | ||||||
|  |  ******************************************************************************/ | ||||||
|  | BEGIN_MODULE_NAMESPACE(MSink) | ||||||
|  |  | ||||||
|  | class PointPar: Serializable | ||||||
|  | { | ||||||
|  | public: | ||||||
|  |     GRID_SERIALIZABLE_CLASS_MEMBERS(PointPar, | ||||||
|  |                                     std::string, mom); | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | template <typename FImpl> | ||||||
|  | class TPoint: public Module<PointPar> | ||||||
|  | { | ||||||
|  | public: | ||||||
|  |     FERM_TYPE_ALIASES(FImpl,); | ||||||
|  |     SINK_TYPE_ALIASES(); | ||||||
|  | public: | ||||||
|  |     // constructor | ||||||
|  |     TPoint(const std::string name); | ||||||
|  |     // destructor | ||||||
|  |     virtual ~TPoint(void) = default; | ||||||
|  |     // dependency relation | ||||||
|  |     virtual std::vector<std::string> getInput(void); | ||||||
|  |     virtual std::vector<std::string> getOutput(void); | ||||||
|  | protected: | ||||||
|  |     // setup | ||||||
|  |     virtual void setup(void); | ||||||
|  |     // execution | ||||||
|  |     virtual void execute(void); | ||||||
|  | private: | ||||||
|  |     bool        hasPhase_{false};  | ||||||
|  |     std::string momphName_; | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | MODULE_REGISTER_NS(Point,       TPoint<FIMPL>,        MSink); | ||||||
|  | MODULE_REGISTER_NS(ScalarPoint, TPoint<ScalarImplCR>, MSink); | ||||||
|  |  | ||||||
|  | /****************************************************************************** | ||||||
|  |  *                          TPoint implementation                             * | ||||||
|  |  ******************************************************************************/ | ||||||
|  | // constructor ///////////////////////////////////////////////////////////////// | ||||||
|  | template <typename FImpl> | ||||||
|  | TPoint<FImpl>::TPoint(const std::string name) | ||||||
|  | : Module<PointPar>(name) | ||||||
|  | , momphName_ (name + "_momph") | ||||||
|  | {} | ||||||
|  |  | ||||||
|  | // dependencies/products /////////////////////////////////////////////////////// | ||||||
|  | template <typename FImpl> | ||||||
|  | std::vector<std::string> TPoint<FImpl>::getInput(void) | ||||||
|  | { | ||||||
|  |     std::vector<std::string> in; | ||||||
|  |      | ||||||
|  |     return in; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | template <typename FImpl> | ||||||
|  | std::vector<std::string> TPoint<FImpl>::getOutput(void) | ||||||
|  | { | ||||||
|  |     std::vector<std::string> out = {getName()}; | ||||||
|  |      | ||||||
|  |     return out; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // setup /////////////////////////////////////////////////////////////////////// | ||||||
|  | template <typename FImpl> | ||||||
|  | void TPoint<FImpl>::setup(void) | ||||||
|  | { | ||||||
|  |     envTmpLat(LatticeComplex, "coor"); | ||||||
|  |     envCacheLat(LatticeComplex, momphName_); | ||||||
|  |     envCreate(SinkFn, getName(), 1, nullptr); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // execution /////////////////////////////////////////////////////////////////// | ||||||
|  | template <typename FImpl> | ||||||
|  | void TPoint<FImpl>::execute(void) | ||||||
|  | {    | ||||||
|  |     LOG(Message) << "Setting up point sink function for momentum [" | ||||||
|  |                  << par().mom << "]" << std::endl; | ||||||
|  |  | ||||||
|  |     auto &ph = envGet(LatticeComplex, momphName_); | ||||||
|  |      | ||||||
|  |     if (!hasPhase_) | ||||||
|  |     { | ||||||
|  |         Complex           i(0.0,1.0); | ||||||
|  |         std::vector<Real> p; | ||||||
|  |  | ||||||
|  |         envGetTmp(LatticeComplex, coor); | ||||||
|  |         p  = strToVec<Real>(par().mom); | ||||||
|  |         ph = zero; | ||||||
|  |         for(unsigned int mu = 0; mu < env().getNd(); mu++) | ||||||
|  |         { | ||||||
|  |             LatticeCoordinate(coor, mu); | ||||||
|  |             ph = ph + (p[mu]/env().getGrid()->_fdimensions[mu])*coor; | ||||||
|  |         } | ||||||
|  |         ph = exp((Real)(2*M_PI)*i*ph); | ||||||
|  |         hasPhase_ = true; | ||||||
|  |     } | ||||||
|  |     auto sink = [&ph](const PropagatorField &field) | ||||||
|  |     { | ||||||
|  |         SlicedPropagator res; | ||||||
|  |         PropagatorField  tmp = ph*field; | ||||||
|  |          | ||||||
|  |         sliceSum(tmp, res, Tp); | ||||||
|  |          | ||||||
|  |         return res; | ||||||
|  |     }; | ||||||
|  |     envGet(SinkFn, getName()) = sink; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | END_MODULE_NAMESPACE | ||||||
|  |  | ||||||
|  | END_HADRONS_NAMESPACE | ||||||
|  |  | ||||||
|  | #endif // Hadrons_MSink_Point_hpp_ | ||||||
							
								
								
									
										127
									
								
								extras/Hadrons/Modules/MSink/Smear.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										127
									
								
								extras/Hadrons/Modules/MSink/Smear.hpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,127 @@ | |||||||
|  | /************************************************************************************* | ||||||
|  |  | ||||||
|  | Grid physics library, www.github.com/paboyle/Grid  | ||||||
|  |  | ||||||
|  | Source file: extras/Hadrons/Modules/MSink/Smear.hpp | ||||||
|  |  | ||||||
|  | Copyright (C) 2015-2018 | ||||||
|  |  | ||||||
|  | Author: Antonin Portelli <antonin.portelli@me.com> | ||||||
|  | Author: Lanny91 <andrew.lawson@gmail.com> | ||||||
|  |  | ||||||
|  | This program is free software; you can redistribute it and/or modify | ||||||
|  | it under the terms of the GNU General Public License as published by | ||||||
|  | the Free Software Foundation; either version 2 of the License, or | ||||||
|  | (at your option) any later version. | ||||||
|  |  | ||||||
|  | This program is distributed in the hope that it will be useful, | ||||||
|  | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||||
|  | GNU General Public License for more details. | ||||||
|  |  | ||||||
|  | You should have received a copy of the GNU General Public License along | ||||||
|  | with this program; if not, write to the Free Software Foundation, Inc., | ||||||
|  | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | ||||||
|  |  | ||||||
|  | See the full license in the file "LICENSE" in the top level distribution directory | ||||||
|  | *************************************************************************************/ | ||||||
|  | /*  END LEGAL */ | ||||||
|  |  | ||||||
|  | #ifndef Hadrons_MSink_Smear_hpp_ | ||||||
|  | #define Hadrons_MSink_Smear_hpp_ | ||||||
|  |  | ||||||
|  | #include <Grid/Hadrons/Global.hpp> | ||||||
|  | #include <Grid/Hadrons/Module.hpp> | ||||||
|  | #include <Grid/Hadrons/ModuleFactory.hpp> | ||||||
|  |  | ||||||
|  | BEGIN_HADRONS_NAMESPACE | ||||||
|  |  | ||||||
|  | /****************************************************************************** | ||||||
|  |  *                                 Smear                                      * | ||||||
|  |  ******************************************************************************/ | ||||||
|  | BEGIN_MODULE_NAMESPACE(MSink) | ||||||
|  |  | ||||||
|  | class SmearPar: Serializable | ||||||
|  | { | ||||||
|  | public: | ||||||
|  |     GRID_SERIALIZABLE_CLASS_MEMBERS(SmearPar, | ||||||
|  |                                     std::string, q, | ||||||
|  |                                     std::string, sink); | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | template <typename FImpl> | ||||||
|  | class TSmear: public Module<SmearPar> | ||||||
|  | { | ||||||
|  | public: | ||||||
|  |     FERM_TYPE_ALIASES(FImpl,); | ||||||
|  |     SINK_TYPE_ALIASES(); | ||||||
|  | public: | ||||||
|  |     // constructor | ||||||
|  |     TSmear(const std::string name); | ||||||
|  |     // destructor | ||||||
|  |     virtual ~TSmear(void) = default; | ||||||
|  |     // dependency relation | ||||||
|  |     virtual std::vector<std::string> getInput(void); | ||||||
|  |     virtual std::vector<std::string> getOutput(void); | ||||||
|  | protected: | ||||||
|  |     // setup | ||||||
|  |     virtual void setup(void); | ||||||
|  |     // execution | ||||||
|  |     virtual void execute(void); | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | MODULE_REGISTER_NS(Smear, TSmear<FIMPL>, MSink); | ||||||
|  |  | ||||||
|  | /****************************************************************************** | ||||||
|  |  *                          TSmear implementation                             * | ||||||
|  |  ******************************************************************************/ | ||||||
|  | // constructor ///////////////////////////////////////////////////////////////// | ||||||
|  | template <typename FImpl> | ||||||
|  | TSmear<FImpl>::TSmear(const std::string name) | ||||||
|  | : Module<SmearPar>(name) | ||||||
|  | {} | ||||||
|  |  | ||||||
|  | // dependencies/products /////////////////////////////////////////////////////// | ||||||
|  | template <typename FImpl> | ||||||
|  | std::vector<std::string> TSmear<FImpl>::getInput(void) | ||||||
|  | { | ||||||
|  |     std::vector<std::string> in = {par().q, par().sink}; | ||||||
|  |      | ||||||
|  |     return in; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | template <typename FImpl> | ||||||
|  | std::vector<std::string> TSmear<FImpl>::getOutput(void) | ||||||
|  | { | ||||||
|  |     std::vector<std::string> out = {getName()}; | ||||||
|  |      | ||||||
|  |     return out; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // setup /////////////////////////////////////////////////////////////////////// | ||||||
|  | template <typename FImpl> | ||||||
|  | void TSmear<FImpl>::setup(void) | ||||||
|  | { | ||||||
|  |     envCreate(SlicedPropagator, getName(), 1, env().getDim(Tp)); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // execution /////////////////////////////////////////////////////////////////// | ||||||
|  | template <typename FImpl> | ||||||
|  | void TSmear<FImpl>::execute(void) | ||||||
|  | { | ||||||
|  |     LOG(Message) << "Sink smearing propagator '" << par().q | ||||||
|  |                  << "' using sink function '" << par().sink << "'." | ||||||
|  |                  << std::endl; | ||||||
|  |  | ||||||
|  |     auto &sink = envGet(SinkFn, par().sink); | ||||||
|  |     auto &q    = envGet(PropagatorField, par().q); | ||||||
|  |     auto &out  = envGet(SlicedPropagator, getName()); | ||||||
|  |      | ||||||
|  |     out = sink(q); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | END_MODULE_NAMESPACE | ||||||
|  |  | ||||||
|  | END_HADRONS_NAMESPACE | ||||||
|  |  | ||||||
|  | #endif // Hadrons_MSink_Smear_hpp_ | ||||||
| @@ -4,8 +4,7 @@ Grid physics library, www.github.com/paboyle/Grid | |||||||
|  |  | ||||||
| Source file: extras/Hadrons/Modules/MSolver/RBPrecCG.hpp | Source file: extras/Hadrons/Modules/MSolver/RBPrecCG.hpp | ||||||
|  |  | ||||||
| Copyright (C) 2015 | Copyright (C) 2015-2018 | ||||||
| Copyright (C) 2016 |  | ||||||
|  |  | ||||||
| Author: Antonin Portelli <antonin.portelli@me.com> | Author: Antonin Portelli <antonin.portelli@me.com> | ||||||
|  |  | ||||||
| @@ -27,8 +26,8 @@ See the full license in the file "LICENSE" in the top level distribution directo | |||||||
| *************************************************************************************/ | *************************************************************************************/ | ||||||
| /*  END LEGAL */ | /*  END LEGAL */ | ||||||
|  |  | ||||||
| #ifndef Hadrons_RBPrecCG_hpp_ | #ifndef Hadrons_MSolver_RBPrecCG_hpp_ | ||||||
| #define Hadrons_RBPrecCG_hpp_ | #define Hadrons_MSolver_RBPrecCG_hpp_ | ||||||
|  |  | ||||||
| #include <Grid/Hadrons/Global.hpp> | #include <Grid/Hadrons/Global.hpp> | ||||||
| #include <Grid/Hadrons/Module.hpp> | #include <Grid/Hadrons/Module.hpp> | ||||||
| @@ -53,7 +52,7 @@ template <typename FImpl> | |||||||
| class TRBPrecCG: public Module<RBPrecCGPar> | class TRBPrecCG: public Module<RBPrecCGPar> | ||||||
| { | { | ||||||
| public: | public: | ||||||
|     TYPE_ALIASES(FImpl,); |     FGS_TYPE_ALIASES(FImpl,); | ||||||
| public: | public: | ||||||
|     // constructor |     // constructor | ||||||
|     TRBPrecCG(const std::string name); |     TRBPrecCG(const std::string name); | ||||||
| @@ -61,7 +60,9 @@ public: | |||||||
|     virtual ~TRBPrecCG(void) = default; |     virtual ~TRBPrecCG(void) = default; | ||||||
|     // dependencies/products |     // dependencies/products | ||||||
|     virtual std::vector<std::string> getInput(void); |     virtual std::vector<std::string> getInput(void); | ||||||
|  |     virtual std::vector<std::string> getReference(void); | ||||||
|     virtual std::vector<std::string> getOutput(void); |     virtual std::vector<std::string> getOutput(void); | ||||||
|  | protected: | ||||||
|     // setup |     // setup | ||||||
|     virtual void setup(void); |     virtual void setup(void); | ||||||
|     // execution |     // execution | ||||||
| @@ -83,11 +84,19 @@ TRBPrecCG<FImpl>::TRBPrecCG(const std::string name) | |||||||
| template <typename FImpl> | template <typename FImpl> | ||||||
| std::vector<std::string> TRBPrecCG<FImpl>::getInput(void) | std::vector<std::string> TRBPrecCG<FImpl>::getInput(void) | ||||||
| { | { | ||||||
|     std::vector<std::string> in = {par().action}; |     std::vector<std::string> in = {}; | ||||||
|      |      | ||||||
|     return in; |     return in; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | template <typename FImpl> | ||||||
|  | std::vector<std::string> TRBPrecCG<FImpl>::getReference(void) | ||||||
|  | { | ||||||
|  |     std::vector<std::string> ref = {par().action}; | ||||||
|  |      | ||||||
|  |     return ref; | ||||||
|  | } | ||||||
|  |  | ||||||
| template <typename FImpl> | template <typename FImpl> | ||||||
| std::vector<std::string> TRBPrecCG<FImpl>::getOutput(void) | std::vector<std::string> TRBPrecCG<FImpl>::getOutput(void) | ||||||
| { | { | ||||||
| @@ -100,17 +109,12 @@ std::vector<std::string> TRBPrecCG<FImpl>::getOutput(void) | |||||||
| template <typename FImpl> | template <typename FImpl> | ||||||
| void TRBPrecCG<FImpl>::setup(void) | void TRBPrecCG<FImpl>::setup(void) | ||||||
| { | { | ||||||
|     auto Ls = env().getObjectLs(par().action); |     LOG(Message) << "setting up Schur red-black preconditioned CG for" | ||||||
|      |                  << " action '" << par().action << "' with residual " | ||||||
|     env().registerObject(getName(), 0, Ls); |                  << par().residual << std::endl; | ||||||
|     env().addOwnership(getName(), par().action); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // execution /////////////////////////////////////////////////////////////////// |     auto Ls     = env().getObjectLs(par().action); | ||||||
| template <typename FImpl> |     auto &mat   = envGet(FMat, par().action); | ||||||
| void TRBPrecCG<FImpl>::execute(void) |  | ||||||
| { |  | ||||||
|     auto &mat   = *(env().template getObject<FMat>(par().action)); |  | ||||||
|     auto solver = [&mat, this](FermionField &sol, const FermionField &source) |     auto solver = [&mat, this](FermionField &sol, const FermionField &source) | ||||||
|     { |     { | ||||||
|         ConjugateGradient<FermionField>           cg(par().residual, 10000); |         ConjugateGradient<FermionField>           cg(par().residual, 10000); | ||||||
| @@ -118,15 +122,16 @@ void TRBPrecCG<FImpl>::execute(void) | |||||||
|          |          | ||||||
|         schurSolver(mat, source, sol); |         schurSolver(mat, source, sol); | ||||||
|     }; |     }; | ||||||
|      |     envCreate(SolverFn, getName(), Ls, solver); | ||||||
|     LOG(Message) << "setting up Schur red-black preconditioned CG for" |  | ||||||
|                  << " action '" << par().action << "' with residual " |  | ||||||
|                  << par().residual << std::endl; |  | ||||||
|     env().setObject(getName(), new SolverFn(solver)); |  | ||||||
| } | } | ||||||
|  |  | ||||||
|  | // execution /////////////////////////////////////////////////////////////////// | ||||||
|  | template <typename FImpl> | ||||||
|  | void TRBPrecCG<FImpl>::execute(void) | ||||||
|  | {} | ||||||
|  |  | ||||||
| END_MODULE_NAMESPACE | END_MODULE_NAMESPACE | ||||||
|  |  | ||||||
| END_HADRONS_NAMESPACE | END_HADRONS_NAMESPACE | ||||||
|  |  | ||||||
| #endif // Hadrons_RBPrecCG_hpp_ | #endif // Hadrons_MSolver_RBPrecCG_hpp_ | ||||||
|   | |||||||
| @@ -4,10 +4,10 @@ Grid physics library, www.github.com/paboyle/Grid | |||||||
|  |  | ||||||
| Source file: extras/Hadrons/Modules/MSource/Point.hpp | Source file: extras/Hadrons/Modules/MSource/Point.hpp | ||||||
|  |  | ||||||
| Copyright (C) 2015 | Copyright (C) 2015-2018 | ||||||
| Copyright (C) 2016 |  | ||||||
|  |  | ||||||
| Author: Antonin Portelli <antonin.portelli@me.com> | Author: Antonin Portelli <antonin.portelli@me.com> | ||||||
|  | Author: Lanny91 <andrew.lawson@gmail.com> | ||||||
|  |  | ||||||
| This program is free software; you can redistribute it and/or modify | This program is free software; you can redistribute it and/or modify | ||||||
| it under the terms of the GNU General Public License as published by | it under the terms of the GNU General Public License as published by | ||||||
| @@ -27,8 +27,8 @@ See the full license in the file "LICENSE" in the top level distribution directo | |||||||
| *************************************************************************************/ | *************************************************************************************/ | ||||||
| /*  END LEGAL */ | /*  END LEGAL */ | ||||||
|  |  | ||||||
| #ifndef Hadrons_Point_hpp_ | #ifndef Hadrons_MSource_Point_hpp_ | ||||||
| #define Hadrons_Point_hpp_ | #define Hadrons_MSource_Point_hpp_ | ||||||
|  |  | ||||||
| #include <Grid/Hadrons/Global.hpp> | #include <Grid/Hadrons/Global.hpp> | ||||||
| #include <Grid/Hadrons/Module.hpp> | #include <Grid/Hadrons/Module.hpp> | ||||||
| @@ -63,7 +63,7 @@ template <typename FImpl> | |||||||
| class TPoint: public Module<PointPar> | class TPoint: public Module<PointPar> | ||||||
| { | { | ||||||
| public: | public: | ||||||
|     TYPE_ALIASES(FImpl,); |     FERM_TYPE_ALIASES(FImpl,); | ||||||
| public: | public: | ||||||
|     // constructor |     // constructor | ||||||
|     TPoint(const std::string name); |     TPoint(const std::string name); | ||||||
| @@ -72,13 +72,15 @@ public: | |||||||
|     // dependency relation |     // dependency relation | ||||||
|     virtual std::vector<std::string> getInput(void); |     virtual std::vector<std::string> getInput(void); | ||||||
|     virtual std::vector<std::string> getOutput(void); |     virtual std::vector<std::string> getOutput(void); | ||||||
|  | protected: | ||||||
|     // setup |     // setup | ||||||
|     virtual void setup(void); |     virtual void setup(void); | ||||||
|     // execution |     // execution | ||||||
|     virtual void execute(void); |     virtual void execute(void); | ||||||
| }; | }; | ||||||
|  |  | ||||||
| MODULE_REGISTER_NS(Point, TPoint<FIMPL>, MSource); | MODULE_REGISTER_NS(Point,       TPoint<FIMPL>,        MSource); | ||||||
|  | MODULE_REGISTER_NS(ScalarPoint, TPoint<ScalarImplCR>, MSource); | ||||||
|  |  | ||||||
| /****************************************************************************** | /****************************************************************************** | ||||||
|  *                       TPoint template implementation                       * |  *                       TPoint template implementation                       * | ||||||
| @@ -110,19 +112,20 @@ std::vector<std::string> TPoint<FImpl>::getOutput(void) | |||||||
| template <typename FImpl> | template <typename FImpl> | ||||||
| void TPoint<FImpl>::setup(void) | void TPoint<FImpl>::setup(void) | ||||||
| { | { | ||||||
|     env().template registerLattice<PropagatorField>(getName()); |     envCreateLat(PropagatorField, getName()); | ||||||
| } | } | ||||||
|  |  | ||||||
| // execution /////////////////////////////////////////////////////////////////// | // execution /////////////////////////////////////////////////////////////////// | ||||||
| template <typename FImpl> | template <typename FImpl> | ||||||
| void TPoint<FImpl>::execute(void) | void TPoint<FImpl>::execute(void) | ||||||
| { | { | ||||||
|     std::vector<int> position = strToVec<int>(par().position); |  | ||||||
|     typename SitePropagator::scalar_object id; |  | ||||||
|      |  | ||||||
|     LOG(Message) << "Creating point source at position [" << par().position |     LOG(Message) << "Creating point source at position [" << par().position | ||||||
|                  << "]" << std::endl; |                 << "]" << std::endl; | ||||||
|     PropagatorField &src = *env().template createLattice<PropagatorField>(getName()); |  | ||||||
|  |     std::vector<int> position = strToVec<int>(par().position); | ||||||
|  |     auto             &src     = envGet(PropagatorField, getName()); | ||||||
|  |     SitePropagator   id; | ||||||
|  |      | ||||||
|     id  = 1.; |     id  = 1.; | ||||||
|     src = zero; |     src = zero; | ||||||
|     pokeSite(id, src, position); |     pokeSite(id, src, position); | ||||||
| @@ -132,4 +135,4 @@ END_MODULE_NAMESPACE | |||||||
|  |  | ||||||
| END_HADRONS_NAMESPACE | END_HADRONS_NAMESPACE | ||||||
|  |  | ||||||
| #endif // Hadrons_Point_hpp_ | #endif // Hadrons_MSource_Point_hpp_ | ||||||
|   | |||||||
							
								
								
									
										160
									
								
								extras/Hadrons/Modules/MSource/SeqConserved.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										160
									
								
								extras/Hadrons/Modules/MSource/SeqConserved.hpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,160 @@ | |||||||
|  | /************************************************************************************* | ||||||
|  |  | ||||||
|  | Grid physics library, www.github.com/paboyle/Grid  | ||||||
|  |  | ||||||
|  | Source file: extras/Hadrons/Modules/MSource/SeqConserved.hpp | ||||||
|  |  | ||||||
|  | Copyright (C) 2015-2018 | ||||||
|  |  | ||||||
|  | Author: Antonin Portelli <antonin.portelli@me.com> | ||||||
|  | Author: Lanny91 <andrew.lawson@gmail.com> | ||||||
|  |  | ||||||
|  | This program is free software; you can redistribute it and/or modify | ||||||
|  | it under the terms of the GNU General Public License as published by | ||||||
|  | the Free Software Foundation; either version 2 of the License, or | ||||||
|  | (at your option) any later version. | ||||||
|  |  | ||||||
|  | This program is distributed in the hope that it will be useful, | ||||||
|  | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||||
|  | GNU General Public License for more details. | ||||||
|  |  | ||||||
|  | You should have received a copy of the GNU General Public License along | ||||||
|  | with this program; if not, write to the Free Software Foundation, Inc., | ||||||
|  | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | ||||||
|  |  | ||||||
|  | See the full license in the file "LICENSE" in the top level distribution directory | ||||||
|  | *************************************************************************************/ | ||||||
|  | /*  END LEGAL */ | ||||||
|  |  | ||||||
|  | #ifndef Hadrons_MSource_SeqConserved_hpp_ | ||||||
|  | #define Hadrons_MSource_SeqConserved_hpp_ | ||||||
|  |  | ||||||
|  | #include <Grid/Hadrons/Global.hpp> | ||||||
|  | #include <Grid/Hadrons/Module.hpp> | ||||||
|  | #include <Grid/Hadrons/ModuleFactory.hpp> | ||||||
|  |  | ||||||
|  | BEGIN_HADRONS_NAMESPACE | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |   | ||||||
|  |  Sequential source | ||||||
|  |  ----------------------------- | ||||||
|  |  * src_x = q_x * theta(x_3 - tA) * theta(tB - x_3) * J_mu * exp(i x.mom) | ||||||
|  |   | ||||||
|  |  * options: | ||||||
|  |  - q: input propagator (string) | ||||||
|  |  - action: fermion action used for propagator q (string) | ||||||
|  |  - tA: begin timeslice (integer) | ||||||
|  |  - tB: end timesilce (integer) | ||||||
|  |  - curr_type: type of conserved current to insert (Current) | ||||||
|  |  - mu: Lorentz index of current to insert (integer) | ||||||
|  |  - mom: momentum insertion, space-separated float sequence (e.g ".1 .2 1. 0.") | ||||||
|  |   | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | /****************************************************************************** | ||||||
|  |  *                              SeqConserved                                  * | ||||||
|  |  ******************************************************************************/ | ||||||
|  | BEGIN_MODULE_NAMESPACE(MSource) | ||||||
|  |  | ||||||
|  | class SeqConservedPar: Serializable | ||||||
|  | { | ||||||
|  | public: | ||||||
|  |     GRID_SERIALIZABLE_CLASS_MEMBERS(SeqConservedPar, | ||||||
|  |                                     std::string,  q, | ||||||
|  |                                     std::string,  action, | ||||||
|  |                                     unsigned int, tA, | ||||||
|  |                                     unsigned int, tB, | ||||||
|  |                                     Current,      curr_type, | ||||||
|  |                                     unsigned int, mu, | ||||||
|  |                                     std::string,  mom); | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | template <typename FImpl> | ||||||
|  | class TSeqConserved: public Module<SeqConservedPar> | ||||||
|  | { | ||||||
|  | public: | ||||||
|  |     FERM_TYPE_ALIASES(FImpl,); | ||||||
|  | public: | ||||||
|  |     // constructor | ||||||
|  |     TSeqConserved(const std::string name); | ||||||
|  |     // destructor | ||||||
|  |     virtual ~TSeqConserved(void) = default; | ||||||
|  |     // dependency relation | ||||||
|  |     virtual std::vector<std::string> getInput(void); | ||||||
|  |     virtual std::vector<std::string> getOutput(void); | ||||||
|  | protected: | ||||||
|  |     // setup | ||||||
|  |     virtual void setup(void); | ||||||
|  |     // execution | ||||||
|  |     virtual void execute(void); | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | MODULE_REGISTER_NS(SeqConserved, TSeqConserved<FIMPL>, MSource); | ||||||
|  |  | ||||||
|  | /****************************************************************************** | ||||||
|  |  *                      TSeqConserved implementation                          * | ||||||
|  |  ******************************************************************************/ | ||||||
|  | // constructor ///////////////////////////////////////////////////////////////// | ||||||
|  | template <typename FImpl> | ||||||
|  | TSeqConserved<FImpl>::TSeqConserved(const std::string name) | ||||||
|  | : Module<SeqConservedPar>(name) | ||||||
|  | {} | ||||||
|  |  | ||||||
|  | // dependencies/products /////////////////////////////////////////////////////// | ||||||
|  | template <typename FImpl> | ||||||
|  | std::vector<std::string> TSeqConserved<FImpl>::getInput(void) | ||||||
|  | { | ||||||
|  |     std::vector<std::string> in = {par().q, par().action}; | ||||||
|  |      | ||||||
|  |     return in; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | template <typename FImpl> | ||||||
|  | std::vector<std::string> TSeqConserved<FImpl>::getOutput(void) | ||||||
|  | { | ||||||
|  |     std::vector<std::string> out = {getName()}; | ||||||
|  |      | ||||||
|  |     return out; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // setup /////////////////////////////////////////////////////////////////////// | ||||||
|  | template <typename FImpl> | ||||||
|  | void TSeqConserved<FImpl>::setup(void) | ||||||
|  | { | ||||||
|  |     auto Ls_ = env().getObjectLs(par().action); | ||||||
|  |     envCreateLat(PropagatorField, getName(), Ls_); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // execution /////////////////////////////////////////////////////////////////// | ||||||
|  | template <typename FImpl> | ||||||
|  | void TSeqConserved<FImpl>::execute(void) | ||||||
|  | { | ||||||
|  |     if (par().tA == par().tB) | ||||||
|  |     { | ||||||
|  |         LOG(Message) << "Generating sequential source with conserved " | ||||||
|  |                      << par().curr_type << " current insertion (mu = "  | ||||||
|  |                      << par().mu << ") at " << "t = " << par().tA << std::endl; | ||||||
|  |     } | ||||||
|  |     else | ||||||
|  |     { | ||||||
|  |         LOG(Message) << "Generating sequential source with conserved " | ||||||
|  |                      << par().curr_type << " current insertion (mu = "  | ||||||
|  |                      << par().mu << ") for " << par().tA << " <= t <= "  | ||||||
|  |                      << par().tB << std::endl; | ||||||
|  |     } | ||||||
|  |     auto &src = envGet(PropagatorField, getName()); | ||||||
|  |     auto &q   = envGet(PropagatorField, par().q); | ||||||
|  |     auto &mat = envGet(FMat, par().action); | ||||||
|  |  | ||||||
|  |     std::vector<Real> mom = strToVec<Real>(par().mom); | ||||||
|  |     mat.SeqConservedCurrent(q, src, par().curr_type, par().mu,  | ||||||
|  |                             mom, par().tA, par().tB); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | END_MODULE_NAMESPACE | ||||||
|  |  | ||||||
|  | END_HADRONS_NAMESPACE | ||||||
|  |  | ||||||
|  | #endif // Hadrons_SeqConserved_hpp_ | ||||||
| @@ -4,10 +4,10 @@ Grid physics library, www.github.com/paboyle/Grid | |||||||
|  |  | ||||||
| Source file: extras/Hadrons/Modules/MSource/SeqGamma.hpp | Source file: extras/Hadrons/Modules/MSource/SeqGamma.hpp | ||||||
|  |  | ||||||
| Copyright (C) 2015 | Copyright (C) 2015-2018 | ||||||
| Copyright (C) 2016 |  | ||||||
|  |  | ||||||
| Author: Antonin Portelli <antonin.portelli@me.com> | Author: Antonin Portelli <antonin.portelli@me.com> | ||||||
|  | Author: Lanny91 <andrew.lawson@gmail.com> | ||||||
|  |  | ||||||
| This program is free software; you can redistribute it and/or modify | This program is free software; you can redistribute it and/or modify | ||||||
| it under the terms of the GNU General Public License as published by | it under the terms of the GNU General Public License as published by | ||||||
| @@ -27,8 +27,8 @@ See the full license in the file "LICENSE" in the top level distribution directo | |||||||
| *************************************************************************************/ | *************************************************************************************/ | ||||||
| /*  END LEGAL */ | /*  END LEGAL */ | ||||||
|  |  | ||||||
| #ifndef Hadrons_SeqGamma_hpp_ | #ifndef Hadrons_MSource_SeqGamma_hpp_ | ||||||
| #define Hadrons_SeqGamma_hpp_ | #define Hadrons_MSource_SeqGamma_hpp_ | ||||||
|  |  | ||||||
| #include <Grid/Hadrons/Global.hpp> | #include <Grid/Hadrons/Global.hpp> | ||||||
| #include <Grid/Hadrons/Module.hpp> | #include <Grid/Hadrons/Module.hpp> | ||||||
| @@ -71,7 +71,7 @@ template <typename FImpl> | |||||||
| class TSeqGamma: public Module<SeqGammaPar> | class TSeqGamma: public Module<SeqGammaPar> | ||||||
| { | { | ||||||
| public: | public: | ||||||
|     TYPE_ALIASES(FImpl,); |     FGS_TYPE_ALIASES(FImpl,); | ||||||
| public: | public: | ||||||
|     // constructor |     // constructor | ||||||
|     TSeqGamma(const std::string name); |     TSeqGamma(const std::string name); | ||||||
| @@ -80,10 +80,14 @@ public: | |||||||
|     // dependency relation |     // dependency relation | ||||||
|     virtual std::vector<std::string> getInput(void); |     virtual std::vector<std::string> getInput(void); | ||||||
|     virtual std::vector<std::string> getOutput(void); |     virtual std::vector<std::string> getOutput(void); | ||||||
|  | protected: | ||||||
|     // setup |     // setup | ||||||
|     virtual void setup(void); |     virtual void setup(void); | ||||||
|     // execution |     // execution | ||||||
|     virtual void execute(void); |     virtual void execute(void); | ||||||
|  | private: | ||||||
|  |     bool        hasPhase_{false}; | ||||||
|  |     std::string momphName_, tName_; | ||||||
| }; | }; | ||||||
|  |  | ||||||
| MODULE_REGISTER_NS(SeqGamma, TSeqGamma<FIMPL>, MSource); | MODULE_REGISTER_NS(SeqGamma, TSeqGamma<FIMPL>, MSource); | ||||||
| @@ -95,6 +99,8 @@ MODULE_REGISTER_NS(SeqGamma, TSeqGamma<FIMPL>, MSource); | |||||||
| template <typename FImpl> | template <typename FImpl> | ||||||
| TSeqGamma<FImpl>::TSeqGamma(const std::string name) | TSeqGamma<FImpl>::TSeqGamma(const std::string name) | ||||||
| : Module<SeqGammaPar>(name) | : Module<SeqGammaPar>(name) | ||||||
|  | , momphName_ (name + "_momph") | ||||||
|  | , tName_ (name + "_t") | ||||||
| {} | {} | ||||||
|  |  | ||||||
| // dependencies/products /////////////////////////////////////////////////////// | // dependencies/products /////////////////////////////////////////////////////// | ||||||
| @@ -118,7 +124,10 @@ std::vector<std::string> TSeqGamma<FImpl>::getOutput(void) | |||||||
| template <typename FImpl> | template <typename FImpl> | ||||||
| void TSeqGamma<FImpl>::setup(void) | void TSeqGamma<FImpl>::setup(void) | ||||||
| { | { | ||||||
|     env().template registerLattice<PropagatorField>(getName()); |     envCreateLat(PropagatorField, getName()); | ||||||
|  |     envCacheLat(Lattice<iScalar<vInteger>>, tName_); | ||||||
|  |     envCacheLat(LatticeComplex, momphName_); | ||||||
|  |     envTmpLat(LatticeComplex, "coor"); | ||||||
| } | } | ||||||
|  |  | ||||||
| // execution /////////////////////////////////////////////////////////////////// | // execution /////////////////////////////////////////////////////////////////// | ||||||
| @@ -136,23 +145,29 @@ void TSeqGamma<FImpl>::execute(void) | |||||||
|                      << " sequential source for " |                      << " sequential source for " | ||||||
|                      << par().tA << " <= t <= " << par().tB << std::endl; |                      << par().tA << " <= t <= " << par().tB << std::endl; | ||||||
|     } |     } | ||||||
|     PropagatorField &src = *env().template createLattice<PropagatorField>(getName()); |     auto  &src = envGet(PropagatorField, getName()); | ||||||
|     PropagatorField &q   = *env().template getObject<PropagatorField>(par().q); |     auto  &q   = envGet(PropagatorField, par().q); | ||||||
|     Lattice<iScalar<vInteger>> t(env().getGrid()); |     auto  &ph  = envGet(LatticeComplex, momphName_); | ||||||
|     LatticeComplex             ph(env().getGrid()), coor(env().getGrid()); |     auto  &t   = envGet(Lattice<iScalar<vInteger>>, tName_); | ||||||
|     Gamma                      g(par().gamma); |     Gamma g(par().gamma); | ||||||
|     std::vector<Real>          p; |  | ||||||
|     Complex                    i(0.0,1.0); |  | ||||||
|      |      | ||||||
|     p  = strToVec<Real>(par().mom); |     if (!hasPhase_) | ||||||
|     ph = zero; |  | ||||||
|     for(unsigned int mu = 0; mu < env().getNd(); mu++) |  | ||||||
|     { |     { | ||||||
|         LatticeCoordinate(coor, mu); |         Complex           i(0.0,1.0); | ||||||
|         ph = ph + p[mu]*coor; |         std::vector<Real> p; | ||||||
|  |  | ||||||
|  |         envGetTmp(LatticeComplex, coor); | ||||||
|  |         p  = strToVec<Real>(par().mom); | ||||||
|  |         ph = zero; | ||||||
|  |         for(unsigned int mu = 0; mu < env().getNd(); mu++) | ||||||
|  |         { | ||||||
|  |             LatticeCoordinate(coor, mu); | ||||||
|  |             ph = ph + (p[mu]/env().getGrid()->_fdimensions[mu])*coor; | ||||||
|  |         } | ||||||
|  |         ph = exp((Real)(2*M_PI)*i*ph); | ||||||
|  |         LatticeCoordinate(t, Tp); | ||||||
|  |         hasPhase_ = true; | ||||||
|     } |     } | ||||||
|     ph = exp(i*ph); |  | ||||||
|     LatticeCoordinate(t, Tp); |  | ||||||
|     src = where((t >= par().tA) and (t <= par().tB), ph*(g*q), 0.*q); |     src = where((t >= par().tA) and (t <= par().tB), ph*(g*q), 0.*q); | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -160,4 +175,4 @@ END_MODULE_NAMESPACE | |||||||
|  |  | ||||||
| END_HADRONS_NAMESPACE | END_HADRONS_NAMESPACE | ||||||
|  |  | ||||||
| #endif // Hadrons_SeqGamma_hpp_ | #endif // Hadrons_MSource_SeqGamma_hpp_ | ||||||
|   | |||||||
							
								
								
									
										161
									
								
								extras/Hadrons/Modules/MSource/Wall.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										161
									
								
								extras/Hadrons/Modules/MSource/Wall.hpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,161 @@ | |||||||
|  | /************************************************************************************* | ||||||
|  |  | ||||||
|  | Grid physics library, www.github.com/paboyle/Grid  | ||||||
|  |  | ||||||
|  | Source file: extras/Hadrons/Modules/MSource/Wall.hpp | ||||||
|  |  | ||||||
|  | Copyright (C) 2015-2018 | ||||||
|  |  | ||||||
|  | Author: Antonin Portelli <antonin.portelli@me.com> | ||||||
|  | Author: Lanny91 <andrew.lawson@gmail.com> | ||||||
|  |  | ||||||
|  | This program is free software; you can redistribute it and/or modify | ||||||
|  | it under the terms of the GNU General Public License as published by | ||||||
|  | the Free Software Foundation; either version 2 of the License, or | ||||||
|  | (at your option) any later version. | ||||||
|  |  | ||||||
|  | This program is distributed in the hope that it will be useful, | ||||||
|  | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||||
|  | GNU General Public License for more details. | ||||||
|  |  | ||||||
|  | You should have received a copy of the GNU General Public License along | ||||||
|  | with this program; if not, write to the Free Software Foundation, Inc., | ||||||
|  | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | ||||||
|  |  | ||||||
|  | See the full license in the file "LICENSE" in the top level distribution directory | ||||||
|  | *************************************************************************************/ | ||||||
|  | /*  END LEGAL */ | ||||||
|  |  | ||||||
|  | #ifndef Hadrons_MSource_WallSource_hpp_ | ||||||
|  | #define Hadrons_MSource_WallSource_hpp_ | ||||||
|  |  | ||||||
|  | #include <Grid/Hadrons/Global.hpp> | ||||||
|  | #include <Grid/Hadrons/Module.hpp> | ||||||
|  | #include <Grid/Hadrons/ModuleFactory.hpp> | ||||||
|  |  | ||||||
|  | BEGIN_HADRONS_NAMESPACE | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |   | ||||||
|  |  Wall source | ||||||
|  |  ----------------------------- | ||||||
|  |  * src_x = delta(x_3 - tW) * exp(i x.mom) | ||||||
|  |   | ||||||
|  |  * options: | ||||||
|  |  - tW: source timeslice (integer) | ||||||
|  |  - mom: momentum insertion, space-separated float sequence (e.g ".1 .2 1. 0.") | ||||||
|  |   | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | /****************************************************************************** | ||||||
|  |  *                         Wall                                               * | ||||||
|  |  ******************************************************************************/ | ||||||
|  | BEGIN_MODULE_NAMESPACE(MSource) | ||||||
|  |  | ||||||
|  | class WallPar: Serializable | ||||||
|  | { | ||||||
|  | public: | ||||||
|  |     GRID_SERIALIZABLE_CLASS_MEMBERS(WallPar, | ||||||
|  |                                     unsigned int, tW, | ||||||
|  |                                     std::string, mom); | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | template <typename FImpl> | ||||||
|  | class TWall: public Module<WallPar> | ||||||
|  | { | ||||||
|  | public: | ||||||
|  |     FERM_TYPE_ALIASES(FImpl,); | ||||||
|  | public: | ||||||
|  |     // constructor | ||||||
|  |     TWall(const std::string name); | ||||||
|  |     // destructor | ||||||
|  |     virtual ~TWall(void) = default; | ||||||
|  |     // dependency relation | ||||||
|  |     virtual std::vector<std::string> getInput(void); | ||||||
|  |     virtual std::vector<std::string> getOutput(void); | ||||||
|  | protected: | ||||||
|  |     // setup | ||||||
|  |     virtual void setup(void); | ||||||
|  |     // execution | ||||||
|  |     virtual void execute(void); | ||||||
|  | private: | ||||||
|  |     bool        hasPhase_{false}; | ||||||
|  |     std::string momphName_, tName_; | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | MODULE_REGISTER_NS(Wall, TWall<FIMPL>, MSource); | ||||||
|  |  | ||||||
|  | /****************************************************************************** | ||||||
|  |  *                 TWall implementation                                       * | ||||||
|  |  ******************************************************************************/ | ||||||
|  | // constructor ///////////////////////////////////////////////////////////////// | ||||||
|  | template <typename FImpl> | ||||||
|  | TWall<FImpl>::TWall(const std::string name) | ||||||
|  | : Module<WallPar>(name) | ||||||
|  | , momphName_ (name + "_momph") | ||||||
|  | , tName_ (name + "_t") | ||||||
|  | {} | ||||||
|  |  | ||||||
|  | // dependencies/products /////////////////////////////////////////////////////// | ||||||
|  | template <typename FImpl> | ||||||
|  | std::vector<std::string> TWall<FImpl>::getInput(void) | ||||||
|  | { | ||||||
|  |     std::vector<std::string> in = {}; | ||||||
|  |      | ||||||
|  |     return in; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | template <typename FImpl> | ||||||
|  | std::vector<std::string> TWall<FImpl>::getOutput(void) | ||||||
|  | { | ||||||
|  |     std::vector<std::string> out = {getName()}; | ||||||
|  |      | ||||||
|  |     return out; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // setup /////////////////////////////////////////////////////////////////////// | ||||||
|  | template <typename FImpl> | ||||||
|  | void TWall<FImpl>::setup(void) | ||||||
|  | { | ||||||
|  |     envCreateLat(PropagatorField, getName()); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // execution /////////////////////////////////////////////////////////////////// | ||||||
|  | template <typename FImpl> | ||||||
|  | void TWall<FImpl>::execute(void) | ||||||
|  | {     | ||||||
|  |     LOG(Message) << "Generating wall source at t = " << par().tW  | ||||||
|  |                  << " with momentum " << par().mom << std::endl; | ||||||
|  |      | ||||||
|  |     auto  &src = envGet(PropagatorField, getName()); | ||||||
|  |     auto  &ph  = envGet(LatticeComplex, momphName_); | ||||||
|  |     auto  &t   = envGet(Lattice<iScalar<vInteger>>, tName_); | ||||||
|  |      | ||||||
|  |     if (!hasPhase_) | ||||||
|  |     { | ||||||
|  |         Complex           i(0.0,1.0); | ||||||
|  |         std::vector<Real> p; | ||||||
|  |  | ||||||
|  |         envGetTmp(LatticeComplex, coor); | ||||||
|  |         p  = strToVec<Real>(par().mom); | ||||||
|  |         ph = zero; | ||||||
|  |         for(unsigned int mu = 0; mu < env().getNd(); mu++) | ||||||
|  |         { | ||||||
|  |             LatticeCoordinate(coor, mu); | ||||||
|  |             ph = ph + (p[mu]/env().getGrid()->_fdimensions[mu])*coor; | ||||||
|  |         } | ||||||
|  |         ph = exp((Real)(2*M_PI)*i*ph); | ||||||
|  |         LatticeCoordinate(t, Tp); | ||||||
|  |         hasPhase_ = true; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     src = 1.; | ||||||
|  |     src = where((t == par().tW), src*ph, 0.*src); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | END_MODULE_NAMESPACE | ||||||
|  |  | ||||||
|  | END_HADRONS_NAMESPACE | ||||||
|  |  | ||||||
|  | #endif // Hadrons_MSource_WallSource_hpp_ | ||||||
| @@ -4,8 +4,7 @@ Grid physics library, www.github.com/paboyle/Grid | |||||||
|  |  | ||||||
| Source file: extras/Hadrons/Modules/MSource/Z2.hpp | Source file: extras/Hadrons/Modules/MSource/Z2.hpp | ||||||
|  |  | ||||||
| Copyright (C) 2015 | Copyright (C) 2015-2018 | ||||||
| Copyright (C) 2016 |  | ||||||
|  |  | ||||||
| Author: Antonin Portelli <antonin.portelli@me.com> | Author: Antonin Portelli <antonin.portelli@me.com> | ||||||
|  |  | ||||||
| @@ -27,8 +26,8 @@ See the full license in the file "LICENSE" in the top level distribution directo | |||||||
| *************************************************************************************/ | *************************************************************************************/ | ||||||
| /*  END LEGAL */ | /*  END LEGAL */ | ||||||
|  |  | ||||||
| #ifndef Hadrons_Z2_hpp_ | #ifndef Hadrons_MSource_Z2_hpp_ | ||||||
| #define Hadrons_Z2_hpp_ | #define Hadrons_MSource_Z2_hpp_ | ||||||
|  |  | ||||||
| #include <Grid/Hadrons/Global.hpp> | #include <Grid/Hadrons/Global.hpp> | ||||||
| #include <Grid/Hadrons/Module.hpp> | #include <Grid/Hadrons/Module.hpp> | ||||||
| @@ -67,7 +66,7 @@ template <typename FImpl> | |||||||
| class TZ2: public Module<Z2Par> | class TZ2: public Module<Z2Par> | ||||||
| { | { | ||||||
| public: | public: | ||||||
|     TYPE_ALIASES(FImpl,); |     FERM_TYPE_ALIASES(FImpl,); | ||||||
| public: | public: | ||||||
|     // constructor |     // constructor | ||||||
|     TZ2(const std::string name); |     TZ2(const std::string name); | ||||||
| @@ -76,13 +75,18 @@ public: | |||||||
|     // dependency relation |     // dependency relation | ||||||
|     virtual std::vector<std::string> getInput(void); |     virtual std::vector<std::string> getInput(void); | ||||||
|     virtual std::vector<std::string> getOutput(void); |     virtual std::vector<std::string> getOutput(void); | ||||||
|  | protected: | ||||||
|     // setup |     // setup | ||||||
|     virtual void setup(void); |     virtual void setup(void); | ||||||
|     // execution |     // execution | ||||||
|     virtual void execute(void); |     virtual void execute(void); | ||||||
|  | private: | ||||||
|  |     bool        hasT_{false}; | ||||||
|  |     std::string tName_; | ||||||
| }; | }; | ||||||
|  |  | ||||||
| MODULE_REGISTER_NS(Z2, TZ2<FIMPL>, MSource); | MODULE_REGISTER_NS(Z2,       TZ2<FIMPL>,        MSource); | ||||||
|  | MODULE_REGISTER_NS(ScalarZ2, TZ2<ScalarImplCR>, MSource); | ||||||
|  |  | ||||||
| /****************************************************************************** | /****************************************************************************** | ||||||
|  *                       TZ2 template implementation                          * |  *                       TZ2 template implementation                          * | ||||||
| @@ -91,6 +95,7 @@ MODULE_REGISTER_NS(Z2, TZ2<FIMPL>, MSource); | |||||||
| template <typename FImpl> | template <typename FImpl> | ||||||
| TZ2<FImpl>::TZ2(const std::string name) | TZ2<FImpl>::TZ2(const std::string name) | ||||||
| : Module<Z2Par>(name) | : Module<Z2Par>(name) | ||||||
|  | , tName_ (name + "_t") | ||||||
| {} | {} | ||||||
|  |  | ||||||
| // dependencies/products /////////////////////////////////////////////////////// | // dependencies/products /////////////////////////////////////////////////////// | ||||||
| @@ -114,29 +119,36 @@ std::vector<std::string> TZ2<FImpl>::getOutput(void) | |||||||
| template <typename FImpl> | template <typename FImpl> | ||||||
| void TZ2<FImpl>::setup(void) | void TZ2<FImpl>::setup(void) | ||||||
| { | { | ||||||
|     env().template registerLattice<PropagatorField>(getName()); |     envCreateLat(PropagatorField, getName()); | ||||||
|  |     envCacheLat(Lattice<iScalar<vInteger>>, tName_); | ||||||
|  |     envTmpLat(LatticeComplex, "eta"); | ||||||
| } | } | ||||||
|  |  | ||||||
| // execution /////////////////////////////////////////////////////////////////// | // execution /////////////////////////////////////////////////////////////////// | ||||||
| template <typename FImpl> | template <typename FImpl> | ||||||
| void TZ2<FImpl>::execute(void) | void TZ2<FImpl>::execute(void) | ||||||
| { | { | ||||||
|     Lattice<iScalar<vInteger>> t(env().getGrid()); |  | ||||||
|     LatticeComplex             eta(env().getGrid()); |  | ||||||
|     Complex                    shift(1., 1.); |  | ||||||
|      |  | ||||||
|     if (par().tA == par().tB) |     if (par().tA == par().tB) | ||||||
|     { |     { | ||||||
|         LOG(Message) << "Generating Z_2 wall source at t= " << par().tA |         LOG(Message) << "Generating Z_2 wall source at t= " << par().tA | ||||||
|         << std::endl; |                      << std::endl; | ||||||
|     } |     } | ||||||
|     else |     else | ||||||
|     { |     { | ||||||
|         LOG(Message) << "Generating Z_2 band for " << par().tA << " <= t <= " |         LOG(Message) << "Generating Z_2 band for " << par().tA << " <= t <= " | ||||||
|         << par().tB << std::endl; |                      << par().tB << std::endl; | ||||||
|     } |     } | ||||||
|     PropagatorField &src = *env().template createLattice<PropagatorField>(getName()); |      | ||||||
|     LatticeCoordinate(t, Tp); |     auto    &src = envGet(PropagatorField, getName()); | ||||||
|  |     auto    &t   = envGet(Lattice<iScalar<vInteger>>, tName_); | ||||||
|  |     Complex shift(1., 1.); | ||||||
|  |  | ||||||
|  |     if (!hasT_) | ||||||
|  |     { | ||||||
|  |         LatticeCoordinate(t, Tp); | ||||||
|  |         hasT_ = true; | ||||||
|  |     } | ||||||
|  |     envGetTmp(LatticeComplex, eta); | ||||||
|     bernoulli(*env().get4dRng(), eta); |     bernoulli(*env().get4dRng(), eta); | ||||||
|     eta = (2.*eta - shift)*(1./::sqrt(2.)); |     eta = (2.*eta - shift)*(1./::sqrt(2.)); | ||||||
|     eta = where((t >= par().tA) and (t <= par().tB), eta, 0.*eta); |     eta = where((t >= par().tA) and (t <= par().tB), eta, 0.*eta); | ||||||
| @@ -148,4 +160,4 @@ END_MODULE_NAMESPACE | |||||||
|  |  | ||||||
| END_HADRONS_NAMESPACE | END_HADRONS_NAMESPACE | ||||||
|  |  | ||||||
| #endif // Hadrons_Z2_hpp_ | #endif // Hadrons_MSource_Z2_hpp_ | ||||||
|   | |||||||
							
								
								
									
										186
									
								
								extras/Hadrons/Modules/MUtilities/TestSeqConserved.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										186
									
								
								extras/Hadrons/Modules/MUtilities/TestSeqConserved.hpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,186 @@ | |||||||
|  | /************************************************************************************* | ||||||
|  |  | ||||||
|  | Grid physics library, www.github.com/paboyle/Grid  | ||||||
|  |  | ||||||
|  | Source file: extras/Hadrons/Modules/MUtilities/TestSeqConserved.hpp | ||||||
|  |  | ||||||
|  | Copyright (C) 2015-2018 | ||||||
|  |  | ||||||
|  | Author: Antonin Portelli <antonin.portelli@me.com> | ||||||
|  | Author: Lanny91 <andrew.lawson@gmail.com> | ||||||
|  |  | ||||||
|  | This program is free software; you can redistribute it and/or modify | ||||||
|  | it under the terms of the GNU General Public License as published by | ||||||
|  | the Free Software Foundation; either version 2 of the License, or | ||||||
|  | (at your option) any later version. | ||||||
|  |  | ||||||
|  | This program is distributed in the hope that it will be useful, | ||||||
|  | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||||
|  | GNU General Public License for more details. | ||||||
|  |  | ||||||
|  | You should have received a copy of the GNU General Public License along | ||||||
|  | with this program; if not, write to the Free Software Foundation, Inc., | ||||||
|  | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | ||||||
|  |  | ||||||
|  | See the full license in the file "LICENSE" in the top level distribution directory | ||||||
|  | *************************************************************************************/ | ||||||
|  | /*  END LEGAL */ | ||||||
|  |  | ||||||
|  | #ifndef Hadrons_MUtilities_TestSeqConserved_hpp_ | ||||||
|  | #define Hadrons_MUtilities_TestSeqConserved_hpp_ | ||||||
|  |  | ||||||
|  | #include <Grid/Hadrons/Global.hpp> | ||||||
|  | #include <Grid/Hadrons/Module.hpp> | ||||||
|  | #include <Grid/Hadrons/ModuleFactory.hpp> | ||||||
|  |  | ||||||
|  | BEGIN_HADRONS_NAMESPACE | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |   Ward Identity contractions using sequential propagators. | ||||||
|  |  ----------------------------- | ||||||
|  |   | ||||||
|  |  * options: | ||||||
|  |  - q:      point source propagator, 5D if available (string) | ||||||
|  |  - qSeq:   result of sequential insertion of conserved current using q (string) | ||||||
|  |  - action: action used for computation of q (string) | ||||||
|  |  - origin: string giving point source origin of q (string) | ||||||
|  |  - t_J:    time at which sequential current is inserted (int) | ||||||
|  |  - mu:     Lorentz index of current inserted (int) | ||||||
|  |  - curr:   current type, e.g. vector/axial (Current) | ||||||
|  | */ | ||||||
|  |  | ||||||
|  | /****************************************************************************** | ||||||
|  |  *                            TestSeqConserved                                * | ||||||
|  |  ******************************************************************************/ | ||||||
|  | BEGIN_MODULE_NAMESPACE(MUtilities) | ||||||
|  |  | ||||||
|  | class TestSeqConservedPar: Serializable | ||||||
|  | { | ||||||
|  | public: | ||||||
|  |     GRID_SERIALIZABLE_CLASS_MEMBERS(TestSeqConservedPar, | ||||||
|  |                                     std::string,  q, | ||||||
|  |                                     std::string,  qSeq, | ||||||
|  |                                     std::string,  action, | ||||||
|  |                                     std::string,  origin, | ||||||
|  |                                     unsigned int, t_J, | ||||||
|  |                                     unsigned int, mu, | ||||||
|  |                                     Current,      curr); | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | template <typename FImpl> | ||||||
|  | class TTestSeqConserved: public Module<TestSeqConservedPar> | ||||||
|  | { | ||||||
|  | public: | ||||||
|  |     FERM_TYPE_ALIASES(FImpl,); | ||||||
|  | public: | ||||||
|  |     // constructor | ||||||
|  |     TTestSeqConserved(const std::string name); | ||||||
|  |     // destructor | ||||||
|  |     virtual ~TTestSeqConserved(void) = default; | ||||||
|  |     // dependency relation | ||||||
|  |     virtual std::vector<std::string> getInput(void); | ||||||
|  |     virtual std::vector<std::string> getOutput(void); | ||||||
|  | protected: | ||||||
|  |     // setup | ||||||
|  |     virtual void setup(void); | ||||||
|  |     // execution | ||||||
|  |     virtual void execute(void); | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | MODULE_REGISTER_NS(TestSeqConserved, TTestSeqConserved<FIMPL>, MUtilities); | ||||||
|  |  | ||||||
|  | /****************************************************************************** | ||||||
|  |  *                     TTestSeqConserved implementation                       * | ||||||
|  |  ******************************************************************************/ | ||||||
|  | // constructor ///////////////////////////////////////////////////////////////// | ||||||
|  | template <typename FImpl> | ||||||
|  | TTestSeqConserved<FImpl>::TTestSeqConserved(const std::string name) | ||||||
|  | : Module<TestSeqConservedPar>(name) | ||||||
|  | {} | ||||||
|  |  | ||||||
|  | // dependencies/products /////////////////////////////////////////////////////// | ||||||
|  | template <typename FImpl> | ||||||
|  | std::vector<std::string> TTestSeqConserved<FImpl>::getInput(void) | ||||||
|  | { | ||||||
|  |     std::vector<std::string> in = {par().q, par().qSeq, par().action}; | ||||||
|  |      | ||||||
|  |     return in; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | template <typename FImpl> | ||||||
|  | std::vector<std::string> TTestSeqConserved<FImpl>::getOutput(void) | ||||||
|  | { | ||||||
|  |     std::vector<std::string> out = {getName()}; | ||||||
|  |      | ||||||
|  |     return out; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // setup /////////////////////////////////////////////////////////////////////// | ||||||
|  | template <typename FImpl> | ||||||
|  | void TTestSeqConserved<FImpl>::setup(void) | ||||||
|  | { | ||||||
|  |     auto Ls = env().getObjectLs(par().q); | ||||||
|  |     if (Ls != env().getObjectLs(par().action)) | ||||||
|  |     { | ||||||
|  |         HADRON_ERROR(Size, "Ls mismatch between quark action and propagator"); | ||||||
|  |     } | ||||||
|  |     envTmpLat(PropagatorField, "tmp"); | ||||||
|  |     envTmpLat(LatticeComplex, "c"); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // execution /////////////////////////////////////////////////////////////////// | ||||||
|  | template <typename FImpl> | ||||||
|  | void TTestSeqConserved<FImpl>::execute(void) | ||||||
|  | { | ||||||
|  |     // Check sequential insertion of current gives same result as conserved  | ||||||
|  |     // current sink upon contraction. Assume q uses a point source. | ||||||
|  |  | ||||||
|  |     auto                  &q    = envGet(PropagatorField, par().q); | ||||||
|  |     auto                  &qSeq = envGet(PropagatorField, par().qSeq); | ||||||
|  |     auto                  &act  = envGet(FMat, par().action); | ||||||
|  |     Gamma                 g5(Gamma::Algebra::Gamma5); | ||||||
|  |     Gamma::Algebra        gA = (par().curr == Current::Axial) ? | ||||||
|  |                                   Gamma::Algebra::Gamma5 : | ||||||
|  |                                   Gamma::Algebra::Identity; | ||||||
|  |     Gamma                 g(gA); | ||||||
|  |     SitePropagator        qSite; | ||||||
|  |     Complex               test_S, test_V, check_S, check_V; | ||||||
|  |     std::vector<TComplex> check_buf; | ||||||
|  |     std::vector<int>      siteCoord; | ||||||
|  |  | ||||||
|  |     envGetTmp(PropagatorField, tmp); | ||||||
|  |     envGetTmp(LatticeComplex, c); | ||||||
|  |     siteCoord = strToVec<int>(par().origin); | ||||||
|  |     peekSite(qSite, qSeq, siteCoord); | ||||||
|  |     test_S = trace(qSite*g); | ||||||
|  |     test_V = trace(qSite*g*Gamma::gmu[par().mu]); | ||||||
|  |     act.ContractConservedCurrent(q, q, tmp, par().curr, par().mu); | ||||||
|  |     c = trace(tmp*g); | ||||||
|  |     sliceSum(c, check_buf, Tp); | ||||||
|  |     check_S = TensorRemove(check_buf[par().t_J]); | ||||||
|  |  | ||||||
|  |     c = trace(tmp*g*Gamma::gmu[par().mu]); | ||||||
|  |     sliceSum(c, check_buf, Tp); | ||||||
|  |     check_V = TensorRemove(check_buf[par().t_J]); | ||||||
|  |  | ||||||
|  |     LOG(Message) << "Test S  = " << abs(test_S)   << std::endl; | ||||||
|  |     LOG(Message) << "Test V  = " << abs(test_V) << std::endl; | ||||||
|  |     LOG(Message) << "Check S = " << abs(check_S) << std::endl; | ||||||
|  |     LOG(Message) << "Check V = " << abs(check_V) << std::endl; | ||||||
|  |  | ||||||
|  |     // Check difference = 0 | ||||||
|  |     check_S -= test_S; | ||||||
|  |     check_V -= test_V; | ||||||
|  |  | ||||||
|  |     LOG(Message) << "Consistency check for sequential conserved "  | ||||||
|  |                  << par().curr << " current insertion: " << std::endl;  | ||||||
|  |     LOG(Message) << "Diff S  = " << abs(check_S) << std::endl; | ||||||
|  |     LOG(Message) << "Diff V  = " << abs(check_V) << std::endl; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | END_MODULE_NAMESPACE | ||||||
|  |  | ||||||
|  | END_HADRONS_NAMESPACE | ||||||
|  |  | ||||||
|  | #endif // Hadrons_TestSeqConserved_hpp_ | ||||||
							
								
								
									
										150
									
								
								extras/Hadrons/Modules/MUtilities/TestSeqGamma.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										150
									
								
								extras/Hadrons/Modules/MUtilities/TestSeqGamma.hpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,150 @@ | |||||||
|  | /************************************************************************************* | ||||||
|  |  | ||||||
|  | Grid physics library, www.github.com/paboyle/Grid  | ||||||
|  |  | ||||||
|  | Source file: extras/Hadrons/Modules/MUtilities/TestSeqGamma.hpp | ||||||
|  |  | ||||||
|  | Copyright (C) 2015-2018 | ||||||
|  |  | ||||||
|  | Author: Antonin Portelli <antonin.portelli@me.com> | ||||||
|  | Author: Lanny91 <andrew.lawson@gmail.com> | ||||||
|  |  | ||||||
|  | This program is free software; you can redistribute it and/or modify | ||||||
|  | it under the terms of the GNU General Public License as published by | ||||||
|  | the Free Software Foundation; either version 2 of the License, or | ||||||
|  | (at your option) any later version. | ||||||
|  |  | ||||||
|  | This program is distributed in the hope that it will be useful, | ||||||
|  | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||||
|  | GNU General Public License for more details. | ||||||
|  |  | ||||||
|  | You should have received a copy of the GNU General Public License along | ||||||
|  | with this program; if not, write to the Free Software Foundation, Inc., | ||||||
|  | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | ||||||
|  |  | ||||||
|  | See the full license in the file "LICENSE" in the top level distribution directory | ||||||
|  | *************************************************************************************/ | ||||||
|  | /*  END LEGAL */ | ||||||
|  |  | ||||||
|  | #ifndef Hadrons_MUtilities_TestSeqGamma_hpp_ | ||||||
|  | #define Hadrons_MUtilities_TestSeqGamma_hpp_ | ||||||
|  |  | ||||||
|  | #include <Grid/Hadrons/Global.hpp> | ||||||
|  | #include <Grid/Hadrons/Module.hpp> | ||||||
|  | #include <Grid/Hadrons/ModuleFactory.hpp> | ||||||
|  |  | ||||||
|  | BEGIN_HADRONS_NAMESPACE | ||||||
|  |  | ||||||
|  | /****************************************************************************** | ||||||
|  |  *                              TestSeqGamma                                  * | ||||||
|  |  ******************************************************************************/ | ||||||
|  | BEGIN_MODULE_NAMESPACE(MUtilities) | ||||||
|  |  | ||||||
|  | class TestSeqGammaPar: Serializable | ||||||
|  | { | ||||||
|  | public: | ||||||
|  |     GRID_SERIALIZABLE_CLASS_MEMBERS(TestSeqGammaPar, | ||||||
|  |                                     std::string,    q, | ||||||
|  |                                     std::string,    qSeq, | ||||||
|  |                                     std::string,    origin, | ||||||
|  |                                     Gamma::Algebra, gamma, | ||||||
|  |                                     unsigned int,   t_g); | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | template <typename FImpl> | ||||||
|  | class TTestSeqGamma: public Module<TestSeqGammaPar> | ||||||
|  | { | ||||||
|  | public: | ||||||
|  |     FERM_TYPE_ALIASES(FImpl,); | ||||||
|  | public: | ||||||
|  |     // constructor | ||||||
|  |     TTestSeqGamma(const std::string name); | ||||||
|  |     // destructor | ||||||
|  |     virtual ~TTestSeqGamma(void) = default; | ||||||
|  |     // dependency relation | ||||||
|  |     virtual std::vector<std::string> getInput(void); | ||||||
|  |     virtual std::vector<std::string> getOutput(void); | ||||||
|  | protected: | ||||||
|  |     // setup | ||||||
|  |     virtual void setup(void); | ||||||
|  |     // execution | ||||||
|  |     virtual void execute(void); | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | MODULE_REGISTER_NS(TestSeqGamma, TTestSeqGamma<FIMPL>, MUtilities); | ||||||
|  |  | ||||||
|  | /****************************************************************************** | ||||||
|  |  *                      TTestSeqGamma implementation                          * | ||||||
|  |  ******************************************************************************/ | ||||||
|  | // constructor ///////////////////////////////////////////////////////////////// | ||||||
|  | template <typename FImpl> | ||||||
|  | TTestSeqGamma<FImpl>::TTestSeqGamma(const std::string name) | ||||||
|  | : Module<TestSeqGammaPar>(name) | ||||||
|  | {} | ||||||
|  |  | ||||||
|  | // dependencies/products /////////////////////////////////////////////////////// | ||||||
|  | template <typename FImpl> | ||||||
|  | std::vector<std::string> TTestSeqGamma<FImpl>::getInput(void) | ||||||
|  | { | ||||||
|  |     std::vector<std::string> in = {par().q, par().qSeq}; | ||||||
|  |      | ||||||
|  |     return in; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | template <typename FImpl> | ||||||
|  | std::vector<std::string> TTestSeqGamma<FImpl>::getOutput(void) | ||||||
|  | { | ||||||
|  |     std::vector<std::string> out = {getName()}; | ||||||
|  |      | ||||||
|  |     return out; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // setup /////////////////////////////////////////////////////////////////////// | ||||||
|  | template <typename FImpl> | ||||||
|  | void TTestSeqGamma<FImpl>::setup(void) | ||||||
|  | { | ||||||
|  |     envTmpLat(LatticeComplex, "c"); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // execution /////////////////////////////////////////////////////////////////// | ||||||
|  | template <typename FImpl> | ||||||
|  | void TTestSeqGamma<FImpl>::execute(void) | ||||||
|  | { | ||||||
|  |     auto                  &q    = envGet(PropagatorField, par().q); | ||||||
|  |     auto                  &qSeq = envGet(PropagatorField, par().qSeq); | ||||||
|  |     Gamma                 g5(Gamma::Algebra::Gamma5); | ||||||
|  |     Gamma                 g(par().gamma); | ||||||
|  |     SitePropagator        qSite; | ||||||
|  |     Complex               test, check; | ||||||
|  |     std::vector<TComplex> check_buf; | ||||||
|  |     std::vector<int>      siteCoord; | ||||||
|  |  | ||||||
|  |     // Check sequential insertion of gamma matrix gives same result as  | ||||||
|  |     // insertion of gamma at sink upon contraction. Assume q uses a point  | ||||||
|  |     // source. | ||||||
|  |      | ||||||
|  |     envGetTmp(LatticeComplex, c); | ||||||
|  |     siteCoord = strToVec<int>(par().origin); | ||||||
|  |     peekSite(qSite, qSeq, siteCoord); | ||||||
|  |     test = trace(g*qSite); | ||||||
|  |  | ||||||
|  |     c = trace(adj(g)*g5*adj(q)*g5*g*q); | ||||||
|  |     sliceSum(c, check_buf, Tp); | ||||||
|  |     check = TensorRemove(check_buf[par().t_g]); | ||||||
|  |  | ||||||
|  |     LOG(Message) << "Seq Result = " << abs(test)  << std::endl; | ||||||
|  |     LOG(Message) << "Reference  = " << abs(check) << std::endl; | ||||||
|  |  | ||||||
|  |     // Check difference = 0 | ||||||
|  |     check -= test; | ||||||
|  |  | ||||||
|  |     LOG(Message) << "Consistency check for sequential " << par().gamma   | ||||||
|  |                  << " insertion = " << abs(check) << std::endl; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | END_MODULE_NAMESPACE | ||||||
|  |  | ||||||
|  | END_HADRONS_NAMESPACE | ||||||
|  |  | ||||||
|  | #endif // Hadrons_TestSeqGamma_hpp_ | ||||||
| @@ -1,5 +1,5 @@ | |||||||
| #ifndef Hadrons____FILEBASENAME____hpp_ | #ifndef Hadrons____NAMESPACE_______FILEBASENAME____hpp_ | ||||||
| #define Hadrons____FILEBASENAME____hpp_ | #define Hadrons____NAMESPACE_______FILEBASENAME____hpp_ | ||||||
|  |  | ||||||
| #include <Grid/Hadrons/Global.hpp> | #include <Grid/Hadrons/Global.hpp> | ||||||
| #include <Grid/Hadrons/Module.hpp> | #include <Grid/Hadrons/Module.hpp> | ||||||
| @@ -41,4 +41,4 @@ END_MODULE_NAMESPACE | |||||||
|  |  | ||||||
| END_HADRONS_NAMESPACE | END_HADRONS_NAMESPACE | ||||||
|  |  | ||||||
| #endif // Hadrons____FILEBASENAME____hpp_ | #endif // Hadrons____NAMESPACE_______FILEBASENAME____hpp_ | ||||||
|   | |||||||
| @@ -1,5 +1,5 @@ | |||||||
| #ifndef Hadrons____FILEBASENAME____hpp_ | #ifndef Hadrons____NAMESPACE_______FILEBASENAME____hpp_ | ||||||
| #define Hadrons____FILEBASENAME____hpp_ | #define Hadrons____NAMESPACE_______FILEBASENAME____hpp_ | ||||||
|  |  | ||||||
| #include <Grid/Hadrons/Global.hpp> | #include <Grid/Hadrons/Global.hpp> | ||||||
| #include <Grid/Hadrons/Module.hpp> | #include <Grid/Hadrons/Module.hpp> | ||||||
| @@ -82,4 +82,4 @@ END_MODULE_NAMESPACE | |||||||
|  |  | ||||||
| END_HADRONS_NAMESPACE | END_HADRONS_NAMESPACE | ||||||
|  |  | ||||||
| #endif // Hadrons____FILEBASENAME____hpp_ | #endif // Hadrons____NAMESPACE_______FILEBASENAME____hpp_ | ||||||
|   | |||||||
							
								
								
									
										622
									
								
								extras/Hadrons/VirtualMachine.cc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										622
									
								
								extras/Hadrons/VirtualMachine.cc
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,622 @@ | |||||||
|  | /************************************************************************************* | ||||||
|  |  | ||||||
|  | Grid physics library, www.github.com/paboyle/Grid  | ||||||
|  |  | ||||||
|  | Source file: extras/Hadrons/VirtualMachine.cc | ||||||
|  |  | ||||||
|  | Copyright (C) 2015-2018 | ||||||
|  |  | ||||||
|  | Author: Antonin Portelli <antonin.portelli@me.com> | ||||||
|  |  | ||||||
|  | This program is free software; you can redistribute it and/or modify | ||||||
|  | it under the terms of the GNU General Public License as published by | ||||||
|  | the Free Software Foundation; either version 2 of the License, or | ||||||
|  | (at your option) any later version. | ||||||
|  |  | ||||||
|  | This program is distributed in the hope that it will be useful, | ||||||
|  | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||||
|  | GNU General Public License for more details. | ||||||
|  |  | ||||||
|  | You should have received a copy of the GNU General Public License along | ||||||
|  | with this program; if not, write to the Free Software Foundation, Inc., | ||||||
|  | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | ||||||
|  |  | ||||||
|  | See the full license in the file "LICENSE" in the top level distribution directory | ||||||
|  | *************************************************************************************/ | ||||||
|  | /*  END LEGAL */ | ||||||
|  |  | ||||||
|  | #include <Grid/Hadrons/VirtualMachine.hpp> | ||||||
|  | #include <Grid/Hadrons/GeneticScheduler.hpp> | ||||||
|  | #include <Grid/Hadrons/ModuleFactory.hpp> | ||||||
|  |  | ||||||
|  | using namespace Grid; | ||||||
|  | using namespace QCD; | ||||||
|  | using namespace Hadrons; | ||||||
|  |  | ||||||
|  | /****************************************************************************** | ||||||
|  |  *                      VirtualMachine implementation                         * | ||||||
|  |  ******************************************************************************/ | ||||||
|  | // trajectory counter ////////////////////////////////////////////////////////// | ||||||
|  | void VirtualMachine::setTrajectory(const unsigned int traj) | ||||||
|  | { | ||||||
|  |     traj_ = traj; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | unsigned int VirtualMachine::getTrajectory(void) const | ||||||
|  | { | ||||||
|  |     return traj_; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // module management /////////////////////////////////////////////////////////// | ||||||
|  | void VirtualMachine::pushModule(VirtualMachine::ModPt &pt) | ||||||
|  | { | ||||||
|  |     std::string name = pt->getName(); | ||||||
|  |      | ||||||
|  |     if (!hasModule(name)) | ||||||
|  |     { | ||||||
|  |         std::vector<unsigned int> inputAddress; | ||||||
|  |         unsigned int              address; | ||||||
|  |         ModuleInfo                m; | ||||||
|  |          | ||||||
|  |         // module registration ------------------------------------------------- | ||||||
|  |         m.data = std::move(pt); | ||||||
|  |         m.type = typeIdPt(*m.data.get()); | ||||||
|  |         m.name = name; | ||||||
|  |         // input dependencies | ||||||
|  |         for (auto &in: m.data->getInput()) | ||||||
|  |         { | ||||||
|  |             if (!env().hasObject(in)) | ||||||
|  |             { | ||||||
|  |                 // if object does not exist, add it with no creator module | ||||||
|  |                 env().addObject(in , -1); | ||||||
|  |             } | ||||||
|  |             m.input.push_back(env().getObjectAddress(in)); | ||||||
|  |         } | ||||||
|  |         // reference dependencies | ||||||
|  |         for (auto &ref: m.data->getReference()) | ||||||
|  |         { | ||||||
|  |             if (!env().hasObject(ref)) | ||||||
|  |             { | ||||||
|  |                 // if object does not exist, add it with no creator module | ||||||
|  |                 env().addObject(ref , -1); | ||||||
|  |             } | ||||||
|  |             m.input.push_back(env().getObjectAddress(ref)); | ||||||
|  |         } | ||||||
|  |         auto inCopy = m.input; | ||||||
|  |         // if module has inputs with references, they need to be added as | ||||||
|  |         // an input | ||||||
|  |         for (auto &in: inCopy) | ||||||
|  |         { | ||||||
|  |             int inm = env().getObjectModule(in); | ||||||
|  |  | ||||||
|  |             if (inm > 0) | ||||||
|  |             { | ||||||
|  |                 if (getModule(inm)->getReference().size() > 0) | ||||||
|  |                 { | ||||||
|  |                     for (auto &rin: getModule(inm)->getReference()) | ||||||
|  |                     { | ||||||
|  |                         m.input.push_back(env().getObjectAddress(rin)); | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         module_.push_back(std::move(m)); | ||||||
|  |         address              = static_cast<unsigned int>(module_.size() - 1); | ||||||
|  |         moduleAddress_[name] = address; | ||||||
|  |         // connecting outputs to potential inputs ------------------------------ | ||||||
|  |         for (auto &out: getModule(address)->getOutput()) | ||||||
|  |         { | ||||||
|  |             if (!env().hasObject(out)) | ||||||
|  |             { | ||||||
|  |                 // output does not exists, add it | ||||||
|  |                 env().addObject(out, address); | ||||||
|  |             } | ||||||
|  |             else | ||||||
|  |             { | ||||||
|  |                 if (env().getObjectModule(env().getObjectAddress(out)) < 0) | ||||||
|  |                 { | ||||||
|  |                     // output exists but without creator, correct it | ||||||
|  |                     env().setObjectModule(env().getObjectAddress(out), address); | ||||||
|  |                 } | ||||||
|  |                 else | ||||||
|  |                 { | ||||||
|  |                     // output already fully registered, error | ||||||
|  |                     HADRON_ERROR(Definition, "object '" + out | ||||||
|  |                                  + "' is already produced by module '" | ||||||
|  |                                  + module_[env().getObjectModule(out)].name | ||||||
|  |                                  + "' (while pushing module '" + name + "')"); | ||||||
|  |                 } | ||||||
|  |                 if (getModule(address)->getReference().size() > 0) | ||||||
|  |                 { | ||||||
|  |                     // module has references, dependency should be propagated | ||||||
|  |                     // to children modules; find module with `out` as an input | ||||||
|  |                     // and add references to their input | ||||||
|  |                     auto pred = [this, out](const ModuleInfo &n) | ||||||
|  |                     { | ||||||
|  |                         auto &in = n.input; | ||||||
|  |                         auto it  = std::find(in.begin(), in.end(),  | ||||||
|  |                                              env().getObjectAddress(out)); | ||||||
|  |                          | ||||||
|  |                         return (it != in.end()); | ||||||
|  |                     }; | ||||||
|  |                     auto it = std::find_if(module_.begin(), module_.end(), pred); | ||||||
|  |                     while (it != module_.end()) | ||||||
|  |                     { | ||||||
|  |                         for (auto &ref: getModule(address)->getReference()) | ||||||
|  |                         { | ||||||
|  |                             it->input.push_back(env().getObjectAddress(ref)); | ||||||
|  |                         } | ||||||
|  |                         it = std::find_if(++it, module_.end(), pred); | ||||||
|  |                     }    | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         graphOutdated_         = true; | ||||||
|  |         memoryProfileOutdated_ = true; | ||||||
|  |     } | ||||||
|  |     else | ||||||
|  |     { | ||||||
|  |         HADRON_ERROR(Definition, "module '" + name + "' already exists"); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | unsigned int VirtualMachine::getNModule(void) const | ||||||
|  | { | ||||||
|  |     return module_.size(); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void VirtualMachine::createModule(const std::string name, const std::string type, | ||||||
|  |                                   XmlReader &reader) | ||||||
|  | { | ||||||
|  |     auto &factory = ModuleFactory::getInstance(); | ||||||
|  |     auto pt       = factory.create(type, name); | ||||||
|  |      | ||||||
|  |     pt->parseParameters(reader, "options"); | ||||||
|  |     pushModule(pt); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | ModuleBase * VirtualMachine::getModule(const unsigned int address) const | ||||||
|  | { | ||||||
|  |     if (hasModule(address)) | ||||||
|  |     { | ||||||
|  |         return module_[address].data.get(); | ||||||
|  |     } | ||||||
|  |     else | ||||||
|  |     { | ||||||
|  |         HADRON_ERROR(Definition, "no module with address " + std::to_string(address)); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | ModuleBase * VirtualMachine::getModule(const std::string name) const | ||||||
|  | { | ||||||
|  |     return getModule(getModuleAddress(name)); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | unsigned int VirtualMachine::getModuleAddress(const std::string name) const | ||||||
|  | { | ||||||
|  |     if (hasModule(name)) | ||||||
|  |     { | ||||||
|  |         return moduleAddress_.at(name); | ||||||
|  |     } | ||||||
|  |     else | ||||||
|  |     { | ||||||
|  |         HADRON_ERROR(Definition, "no module with name '" + name + "'"); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | std::string VirtualMachine::getModuleName(const unsigned int address) const | ||||||
|  | { | ||||||
|  |     if (hasModule(address)) | ||||||
|  |     { | ||||||
|  |         return module_[address].name; | ||||||
|  |     } | ||||||
|  |     else | ||||||
|  |     { | ||||||
|  |         HADRON_ERROR(Definition, "no module with address " + std::to_string(address)); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | std::string VirtualMachine::getModuleType(const unsigned int address) const | ||||||
|  | { | ||||||
|  |     if (hasModule(address)) | ||||||
|  |     { | ||||||
|  |         return typeName(module_[address].type); | ||||||
|  |     } | ||||||
|  |     else | ||||||
|  |     { | ||||||
|  |         HADRON_ERROR(Definition, "no module with address " + std::to_string(address)); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | std::string VirtualMachine::getModuleType(const std::string name) const | ||||||
|  | { | ||||||
|  |     return getModuleType(getModuleAddress(name)); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | std::string VirtualMachine::getModuleNamespace(const unsigned int address) const | ||||||
|  | { | ||||||
|  |     std::string type = getModuleType(address), ns; | ||||||
|  |      | ||||||
|  |     auto pos2 = type.rfind("::"); | ||||||
|  |     auto pos1 = type.rfind("::", pos2 - 2); | ||||||
|  |      | ||||||
|  |     return type.substr(pos1 + 2, pos2 - pos1 - 2); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | std::string VirtualMachine::getModuleNamespace(const std::string name) const | ||||||
|  | { | ||||||
|  |     return getModuleNamespace(getModuleAddress(name)); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | bool VirtualMachine::hasModule(const unsigned int address) const | ||||||
|  | { | ||||||
|  |     return (address < module_.size()); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | bool VirtualMachine::hasModule(const std::string name) const | ||||||
|  | { | ||||||
|  |     return (moduleAddress_.find(name) != moduleAddress_.end()); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // print VM content //////////////////////////////////////////////////////////// | ||||||
|  | void VirtualMachine::printContent(void) const | ||||||
|  | { | ||||||
|  |     LOG(Debug) << "Modules: " << std::endl; | ||||||
|  |     for (unsigned int i = 0; i < module_.size(); ++i) | ||||||
|  |     { | ||||||
|  |         LOG(Debug) << std::setw(4) << i << ": " | ||||||
|  |                    << getModuleName(i) << std::endl; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // module graph //////////////////////////////////////////////////////////////// | ||||||
|  | Graph<unsigned int> VirtualMachine::getModuleGraph(void) | ||||||
|  | { | ||||||
|  |     if (graphOutdated_) | ||||||
|  |     { | ||||||
|  |         makeModuleGraph(); | ||||||
|  |         graphOutdated_ = false; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     return graph_; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void VirtualMachine::makeModuleGraph(void) | ||||||
|  | { | ||||||
|  |     Graph<unsigned int> graph; | ||||||
|  |      | ||||||
|  |     // create vertices | ||||||
|  |     for (unsigned int m = 0; m < module_.size(); ++m) | ||||||
|  |     { | ||||||
|  |         graph.addVertex(m); | ||||||
|  |     } | ||||||
|  |     // create edges | ||||||
|  |     for (unsigned int m = 0; m < module_.size(); ++m) | ||||||
|  |     { | ||||||
|  |         for (auto &in: module_[m].input) | ||||||
|  |         { | ||||||
|  |             graph.addEdge(env().getObjectModule(in), m); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |     graph_ = graph; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // memory profile ////////////////////////////////////////////////////////////// | ||||||
|  | const VirtualMachine::MemoryProfile & VirtualMachine::getMemoryProfile(void) | ||||||
|  | { | ||||||
|  |     if (memoryProfileOutdated_) | ||||||
|  |     { | ||||||
|  |         makeMemoryProfile(); | ||||||
|  |         memoryProfileOutdated_ = false; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     return profile_; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void VirtualMachine::makeMemoryProfile(void) | ||||||
|  | { | ||||||
|  |     bool protect = env().objectsProtected(); | ||||||
|  |     bool hmsg    = HadronsLogMessage.isActive(); | ||||||
|  |     bool gmsg    = GridLogMessage.isActive(); | ||||||
|  |     bool err     = HadronsLogError.isActive(); | ||||||
|  |     auto program = getModuleGraph().topoSort(); | ||||||
|  |  | ||||||
|  |     resetProfile(); | ||||||
|  |     profile_.module.resize(getNModule()); | ||||||
|  |     env().protectObjects(false); | ||||||
|  |     GridLogMessage.Active(false); | ||||||
|  |     HadronsLogMessage.Active(false); | ||||||
|  |     HadronsLogError.Active(false); | ||||||
|  |     for (auto it = program.rbegin(); it != program.rend(); ++it)  | ||||||
|  |     { | ||||||
|  |         auto a = *it; | ||||||
|  |  | ||||||
|  |         if (profile_.module[a].empty()) | ||||||
|  |         { | ||||||
|  |             LOG(Debug) << "Profiling memory for module '" << module_[a].name | ||||||
|  |                        << "' (" << a << ")..." << std::endl; | ||||||
|  |             memoryProfile(a); | ||||||
|  |             env().freeAll(); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |     env().protectObjects(protect); | ||||||
|  |     GridLogMessage.Active(gmsg); | ||||||
|  |     HadronsLogMessage.Active(hmsg); | ||||||
|  |     HadronsLogError.Active(err); | ||||||
|  |     LOG(Debug) << "Memory profile:" << std::endl; | ||||||
|  |     LOG(Debug) << "----------------" << std::endl; | ||||||
|  |     for (unsigned int a = 0; a < profile_.module.size(); ++a) | ||||||
|  |     { | ||||||
|  |         LOG(Debug) << getModuleName(a) << " (" << a << ")" << std::endl; | ||||||
|  |         for (auto &o: profile_.module[a]) | ||||||
|  |         { | ||||||
|  |             LOG(Debug) << "|__ " << env().getObjectName(o.first) << " (" | ||||||
|  |                        << sizeString(o.second) << ")" << std::endl; | ||||||
|  |         } | ||||||
|  |         LOG(Debug) << std::endl; | ||||||
|  |     } | ||||||
|  |     LOG(Debug) << "----------------" << std::endl; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void VirtualMachine::resetProfile(void) | ||||||
|  | { | ||||||
|  |     profile_.module.clear(); | ||||||
|  |     profile_.object.clear(); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void VirtualMachine::resizeProfile(void) | ||||||
|  | { | ||||||
|  |     if (env().getMaxAddress() > profile_.object.size()) | ||||||
|  |     { | ||||||
|  |         MemoryPrint empty; | ||||||
|  |  | ||||||
|  |         empty.size   = 0; | ||||||
|  |         empty.module = -1; | ||||||
|  |         profile_.object.resize(env().getMaxAddress(), empty); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void VirtualMachine::updateProfile(const unsigned int address) | ||||||
|  | { | ||||||
|  |     resizeProfile(); | ||||||
|  |     for (unsigned int a = 0; a < env().getMaxAddress(); ++a) | ||||||
|  |     { | ||||||
|  |         if (env().hasCreatedObject(a) and (profile_.object[a].module == -1)) | ||||||
|  |         { | ||||||
|  |             profile_.object[a].size     = env().getObjectSize(a); | ||||||
|  |             profile_.object[a].storage  = env().getObjectStorage(a); | ||||||
|  |             profile_.object[a].module   = address; | ||||||
|  |             profile_.module[address][a] = profile_.object[a].size; | ||||||
|  |             if (env().getObjectModule(a) < 0) | ||||||
|  |             { | ||||||
|  |                 env().setObjectModule(a, address); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void VirtualMachine::cleanEnvironment(void) | ||||||
|  | { | ||||||
|  |     resizeProfile(); | ||||||
|  |     for (unsigned int a = 0; a < env().getMaxAddress(); ++a) | ||||||
|  |     { | ||||||
|  |         if (env().hasCreatedObject(a) and (profile_.object[a].module == -1)) | ||||||
|  |         { | ||||||
|  |             env().freeObject(a); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void VirtualMachine::memoryProfile(const unsigned int address) | ||||||
|  | { | ||||||
|  |     auto m = getModule(address); | ||||||
|  |  | ||||||
|  |     LOG(Debug) << "Setting up module '" << m->getName()  | ||||||
|  |                << "' (" << address << ")..." << std::endl; | ||||||
|  |     try | ||||||
|  |     { | ||||||
|  |         m->setup(); | ||||||
|  |         updateProfile(address); | ||||||
|  |     } | ||||||
|  |     catch (Exceptions::Definition &) | ||||||
|  |     { | ||||||
|  |         cleanEnvironment(); | ||||||
|  |         for (auto &in: m->getInput()) | ||||||
|  |         { | ||||||
|  |             memoryProfile(env().getObjectModule(in)); | ||||||
|  |         } | ||||||
|  |         for (auto &ref: m->getReference()) | ||||||
|  |         { | ||||||
|  |             memoryProfile(env().getObjectModule(ref)); | ||||||
|  |         } | ||||||
|  |         m->setup(); | ||||||
|  |         updateProfile(address); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void VirtualMachine::memoryProfile(const std::string name) | ||||||
|  | { | ||||||
|  |     memoryProfile(getModuleAddress(name)); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // garbage collector /////////////////////////////////////////////////////////// | ||||||
|  | VirtualMachine::GarbageSchedule  | ||||||
|  | VirtualMachine::makeGarbageSchedule(const Program &p) const | ||||||
|  | { | ||||||
|  |     GarbageSchedule freeProg; | ||||||
|  |      | ||||||
|  |     freeProg.resize(p.size()); | ||||||
|  |     for (unsigned int a = 0; a < env().getMaxAddress(); ++a) | ||||||
|  |     { | ||||||
|  |         if (env().getObjectStorage(a) == Environment::Storage::temporary) | ||||||
|  |         { | ||||||
|  |             auto it = std::find(p.begin(), p.end(), env().getObjectModule(a)); | ||||||
|  |  | ||||||
|  |             if (it != p.end()) | ||||||
|  |             { | ||||||
|  |                 freeProg[std::distance(p.begin(), it)].insert(a); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         else if (env().getObjectStorage(a) == Environment::Storage::object) | ||||||
|  |         { | ||||||
|  |             auto pred = [a, this](const unsigned int b) | ||||||
|  |             { | ||||||
|  |                 auto &in = module_[b].input; | ||||||
|  |                 auto it  = std::find(in.begin(), in.end(), a); | ||||||
|  |                  | ||||||
|  |                 return (it != in.end()) or (b == env().getObjectModule(a)); | ||||||
|  |             }; | ||||||
|  |             auto it = std::find_if(p.rbegin(), p.rend(), pred); | ||||||
|  |             if (it != p.rend()) | ||||||
|  |             { | ||||||
|  |                 freeProg[std::distance(it, p.rend()) - 1].insert(a); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     return freeProg; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // high-water memory function ////////////////////////////////////////////////// | ||||||
|  | VirtualMachine::Size VirtualMachine::memoryNeeded(const Program &p) | ||||||
|  | { | ||||||
|  |     const MemoryProfile &profile = getMemoryProfile(); | ||||||
|  |     GarbageSchedule     freep    = makeGarbageSchedule(p); | ||||||
|  |     Size                current = 0, max = 0; | ||||||
|  |  | ||||||
|  |     for (unsigned int i = 0; i < p.size(); ++i) | ||||||
|  |     { | ||||||
|  |         for (auto &o: profile.module[p[i]]) | ||||||
|  |         { | ||||||
|  |             current += o.second; | ||||||
|  |         } | ||||||
|  |         max = std::max(current, max); | ||||||
|  |         for (auto &o: freep[i]) | ||||||
|  |         { | ||||||
|  |             current -= profile.object[o].size; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     return max; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // genetic scheduler /////////////////////////////////////////////////////////// | ||||||
|  | VirtualMachine::Program VirtualMachine::schedule(const GeneticPar &par) | ||||||
|  | { | ||||||
|  |     typedef GeneticScheduler<Size, unsigned int> Scheduler; | ||||||
|  |  | ||||||
|  |     auto graph = getModuleGraph(); | ||||||
|  |  | ||||||
|  |     //constrained topological sort using a genetic algorithm | ||||||
|  |     LOG(Message) << "Scheduling computation..." << std::endl; | ||||||
|  |     LOG(Message) << "               #module= " << graph.size() << std::endl; | ||||||
|  |     LOG(Message) << "       population size= " << par.popSize << std::endl; | ||||||
|  |     LOG(Message) << "       max. generation= " << par.maxGen << std::endl; | ||||||
|  |     LOG(Message) << "  max. cst. generation= " << par.maxCstGen << std::endl; | ||||||
|  |     LOG(Message) << "         mutation rate= " << par.mutationRate << std::endl; | ||||||
|  |      | ||||||
|  |     unsigned int          k = 0, gen, prevPeak, nCstPeak = 0; | ||||||
|  |     std::random_device    rd; | ||||||
|  |     Scheduler::Parameters gpar; | ||||||
|  |      | ||||||
|  |     gpar.popSize      = par.popSize; | ||||||
|  |     gpar.mutationRate = par.mutationRate; | ||||||
|  |     gpar.seed         = rd(); | ||||||
|  |     CartesianCommunicator::BroadcastWorld(0, &(gpar.seed), sizeof(gpar.seed)); | ||||||
|  |     Scheduler::ObjFunc memPeak = [this](const Program &p)->Size | ||||||
|  |     { | ||||||
|  |         return memoryNeeded(p); | ||||||
|  |     }; | ||||||
|  |     Scheduler scheduler(graph, memPeak, gpar); | ||||||
|  |     gen = 0; | ||||||
|  |     do | ||||||
|  |     { | ||||||
|  |         LOG(Debug) << "Generation " << gen << ":" << std::endl; | ||||||
|  |         scheduler.nextGeneration(); | ||||||
|  |         if (gen != 0) | ||||||
|  |         { | ||||||
|  |             if (prevPeak == scheduler.getMinValue()) | ||||||
|  |             { | ||||||
|  |                 nCstPeak++; | ||||||
|  |             } | ||||||
|  |             else | ||||||
|  |             { | ||||||
|  |                 nCstPeak = 0; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         prevPeak = scheduler.getMinValue(); | ||||||
|  |         if (gen % 10 == 0) | ||||||
|  |         { | ||||||
|  |             LOG(Iterative) << "Generation " << gen << ": " | ||||||
|  |                            << sizeString(scheduler.getMinValue()) << std::endl; | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         gen++; | ||||||
|  |     } while ((gen < par.maxGen) and (nCstPeak < par.maxCstGen)); | ||||||
|  |      | ||||||
|  |     return scheduler.getMinSchedule(); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // general execution /////////////////////////////////////////////////////////// | ||||||
|  | #define BIG_SEP "===============" | ||||||
|  | #define SEP     "---------------" | ||||||
|  | #define MEM_MSG(size) sizeString(size) | ||||||
|  |  | ||||||
|  | void VirtualMachine::executeProgram(const Program &p) const | ||||||
|  | { | ||||||
|  |     Size            memPeak = 0, sizeBefore, sizeAfter; | ||||||
|  |     GarbageSchedule freeProg; | ||||||
|  |      | ||||||
|  |     // build garbage collection schedule | ||||||
|  |     LOG(Debug) << "Building garbage collection schedule..." << std::endl; | ||||||
|  |     freeProg = makeGarbageSchedule(p); | ||||||
|  |  | ||||||
|  |     // program execution | ||||||
|  |     LOG(Debug) << "Executing program..." << std::endl; | ||||||
|  |     for (unsigned int i = 0; i < p.size(); ++i) | ||||||
|  |     { | ||||||
|  |         // execute module | ||||||
|  |         LOG(Message) << SEP << " Measurement step " << i + 1 << "/" | ||||||
|  |                      << p.size() << " (module '" << module_[p[i]].name | ||||||
|  |                      << "') " << SEP << std::endl; | ||||||
|  |         (*module_[p[i]].data)(); | ||||||
|  |         sizeBefore = env().getTotalSize(); | ||||||
|  |         // print used memory after execution | ||||||
|  |         LOG(Message) << "Allocated objects: " << MEM_MSG(sizeBefore) | ||||||
|  |                      << std::endl; | ||||||
|  |         if (sizeBefore > memPeak) | ||||||
|  |         { | ||||||
|  |             memPeak = sizeBefore; | ||||||
|  |         } | ||||||
|  |         // garbage collection for step i | ||||||
|  |         LOG(Message) << "Garbage collection..." << std::endl; | ||||||
|  |         for (auto &j: freeProg[i]) | ||||||
|  |         { | ||||||
|  |             env().freeObject(j); | ||||||
|  |         } | ||||||
|  |         // print used memory after garbage collection if necessary | ||||||
|  |         sizeAfter = env().getTotalSize(); | ||||||
|  |         if (sizeBefore != sizeAfter) | ||||||
|  |         { | ||||||
|  |             LOG(Message) << "Allocated objects: " << MEM_MSG(sizeAfter) | ||||||
|  |                             << std::endl; | ||||||
|  |         } | ||||||
|  |         else | ||||||
|  |         { | ||||||
|  |             LOG(Message) << "Nothing to free" << std::endl; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void VirtualMachine::executeProgram(const std::vector<std::string> &p) const | ||||||
|  | { | ||||||
|  |     Program pAddress; | ||||||
|  |      | ||||||
|  |     for (auto &n: p) | ||||||
|  |     { | ||||||
|  |         pAddress.push_back(getModuleAddress(n)); | ||||||
|  |     } | ||||||
|  |     executeProgram(pAddress); | ||||||
|  | } | ||||||
							
								
								
									
										207
									
								
								extras/Hadrons/VirtualMachine.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										207
									
								
								extras/Hadrons/VirtualMachine.hpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,207 @@ | |||||||
|  | /************************************************************************************* | ||||||
|  |  | ||||||
|  | Grid physics library, www.github.com/paboyle/Grid  | ||||||
|  |  | ||||||
|  | Source file: extras/Hadrons/VirtualMachine.hpp | ||||||
|  |  | ||||||
|  | Copyright (C) 2015-2018 | ||||||
|  |  | ||||||
|  | Author: Antonin Portelli <antonin.portelli@me.com> | ||||||
|  |  | ||||||
|  | This program is free software; you can redistribute it and/or modify | ||||||
|  | it under the terms of the GNU General Public License as published by | ||||||
|  | the Free Software Foundation; either version 2 of the License, or | ||||||
|  | (at your option) any later version. | ||||||
|  |  | ||||||
|  | This program is distributed in the hope that it will be useful, | ||||||
|  | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||||
|  | GNU General Public License for more details. | ||||||
|  |  | ||||||
|  | You should have received a copy of the GNU General Public License along | ||||||
|  | with this program; if not, write to the Free Software Foundation, Inc., | ||||||
|  | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | ||||||
|  |  | ||||||
|  | See the full license in the file "LICENSE" in the top level distribution directory | ||||||
|  | *************************************************************************************/ | ||||||
|  | /*  END LEGAL */ | ||||||
|  |  | ||||||
|  | #ifndef Hadrons_VirtualMachine_hpp_ | ||||||
|  | #define Hadrons_VirtualMachine_hpp_ | ||||||
|  |  | ||||||
|  | #include <Grid/Hadrons/Global.hpp> | ||||||
|  | #include <Grid/Hadrons/Graph.hpp> | ||||||
|  | #include <Grid/Hadrons/Environment.hpp> | ||||||
|  |  | ||||||
|  | BEGIN_HADRONS_NAMESPACE | ||||||
|  |  | ||||||
|  | #define DEFINE_VM_ALIAS \ | ||||||
|  | inline VirtualMachine & vm(void) const\ | ||||||
|  | {\ | ||||||
|  |     return VirtualMachine::getInstance();\ | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /****************************************************************************** | ||||||
|  |  *                   Virtual machine for module execution                     * | ||||||
|  |  ******************************************************************************/ | ||||||
|  | // forward declaration of Module | ||||||
|  | class ModuleBase; | ||||||
|  |  | ||||||
|  | class VirtualMachine | ||||||
|  | { | ||||||
|  |     SINGLETON_DEFCTOR(VirtualMachine); | ||||||
|  | public: | ||||||
|  |     typedef SITE_SIZE_TYPE                      Size; | ||||||
|  |     typedef std::unique_ptr<ModuleBase>         ModPt; | ||||||
|  |     typedef std::vector<std::set<unsigned int>> GarbageSchedule; | ||||||
|  |     typedef std::vector<unsigned int>           Program; | ||||||
|  |     struct MemoryPrint | ||||||
|  |     { | ||||||
|  |         Size                 size; | ||||||
|  |         Environment::Storage storage; | ||||||
|  |         int                  module; | ||||||
|  |     }; | ||||||
|  |     struct MemoryProfile | ||||||
|  |     { | ||||||
|  |         std::vector<std::map<unsigned int, Size>> module; | ||||||
|  |         std::vector<MemoryPrint>                  object; | ||||||
|  |     }; | ||||||
|  |     class GeneticPar: Serializable | ||||||
|  |     { | ||||||
|  |     public: | ||||||
|  |         GeneticPar(void): | ||||||
|  |             popSize{20}, maxGen{1000}, maxCstGen{100}, mutationRate{.1} {}; | ||||||
|  |     public: | ||||||
|  |         GRID_SERIALIZABLE_CLASS_MEMBERS(GeneticPar, | ||||||
|  |                                         unsigned int, popSize, | ||||||
|  |                                         unsigned int, maxGen, | ||||||
|  |                                         unsigned int, maxCstGen, | ||||||
|  |                                         double      , mutationRate); | ||||||
|  |     }; | ||||||
|  | private: | ||||||
|  |     struct ModuleInfo | ||||||
|  |     { | ||||||
|  |         const std::type_info      *type{nullptr}; | ||||||
|  |         std::string               name; | ||||||
|  |         ModPt                     data{nullptr}; | ||||||
|  |         std::vector<unsigned int> input; | ||||||
|  |         size_t                    maxAllocated; | ||||||
|  |     }; | ||||||
|  | public: | ||||||
|  |     // trajectory counter | ||||||
|  |     void                setTrajectory(const unsigned int traj); | ||||||
|  |     unsigned int        getTrajectory(void) const; | ||||||
|  |     // module management | ||||||
|  |     void                pushModule(ModPt &pt); | ||||||
|  |     template <typename M> | ||||||
|  |     void                createModule(const std::string name); | ||||||
|  |     template <typename M> | ||||||
|  |     void                createModule(const std::string name, | ||||||
|  |                                          const typename M::Par &par); | ||||||
|  |     void                createModule(const std::string name, | ||||||
|  |                                          const std::string type, | ||||||
|  |                                          XmlReader &reader); | ||||||
|  |     unsigned int        getNModule(void) const; | ||||||
|  |     ModuleBase *        getModule(const unsigned int address) const; | ||||||
|  |     ModuleBase *        getModule(const std::string name) const; | ||||||
|  |     template <typename M> | ||||||
|  |     M *                 getModule(const unsigned int address) const; | ||||||
|  |     template <typename M> | ||||||
|  |     M *                 getModule(const std::string name) const; | ||||||
|  |     unsigned int        getModuleAddress(const std::string name) const; | ||||||
|  |     std::string         getModuleName(const unsigned int address) const; | ||||||
|  |     std::string         getModuleType(const unsigned int address) const; | ||||||
|  |     std::string         getModuleType(const std::string name) const; | ||||||
|  |     std::string         getModuleNamespace(const unsigned int address) const; | ||||||
|  |     std::string         getModuleNamespace(const std::string name) const; | ||||||
|  |     bool                hasModule(const unsigned int address) const; | ||||||
|  |     bool                hasModule(const std::string name) const; | ||||||
|  |     // print VM content | ||||||
|  |     void                printContent(void) const; | ||||||
|  |     // module graph (could be a const reference if topoSort was const) | ||||||
|  |     Graph<unsigned int> getModuleGraph(void); | ||||||
|  |     // memory profile | ||||||
|  |     const MemoryProfile &getMemoryProfile(void); | ||||||
|  |     // garbage collector | ||||||
|  |     GarbageSchedule     makeGarbageSchedule(const Program &p) const; | ||||||
|  |     // high-water memory function | ||||||
|  |     Size                memoryNeeded(const Program &p); | ||||||
|  |     // genetic scheduler | ||||||
|  |     Program             schedule(const GeneticPar &par); | ||||||
|  |     // general execution | ||||||
|  |     void                executeProgram(const Program &p) const; | ||||||
|  |     void                executeProgram(const std::vector<std::string> &p) const; | ||||||
|  | private: | ||||||
|  |     // environment shortcut | ||||||
|  |     DEFINE_ENV_ALIAS; | ||||||
|  |     // module graph | ||||||
|  |     void makeModuleGraph(void); | ||||||
|  |     // memory profile | ||||||
|  |     void makeMemoryProfile(void); | ||||||
|  |     void resetProfile(void); | ||||||
|  |     void resizeProfile(void); | ||||||
|  |     void updateProfile(const unsigned int address); | ||||||
|  |     void cleanEnvironment(void); | ||||||
|  |     void memoryProfile(const std::string name); | ||||||
|  |     void memoryProfile(const unsigned int address); | ||||||
|  | private: | ||||||
|  |     // general | ||||||
|  |     unsigned int                        traj_; | ||||||
|  |     // module and related maps | ||||||
|  |     std::vector<ModuleInfo>             module_; | ||||||
|  |     std::map<std::string, unsigned int> moduleAddress_; | ||||||
|  |     std::string                         currentModule_{""}; | ||||||
|  |     // module graph | ||||||
|  |     bool                                graphOutdated_{true}; | ||||||
|  |     Graph<unsigned int>                 graph_; | ||||||
|  |     // memory profile | ||||||
|  |     bool                                memoryProfileOutdated_{true}; | ||||||
|  |     MemoryProfile                       profile_; | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | /****************************************************************************** | ||||||
|  |  *                   VirtualMachine template implementation                   * | ||||||
|  |  ******************************************************************************/ | ||||||
|  | // module management /////////////////////////////////////////////////////////// | ||||||
|  | template <typename M> | ||||||
|  | void VirtualMachine::createModule(const std::string name) | ||||||
|  | { | ||||||
|  |     ModPt pt(new M(name)); | ||||||
|  |      | ||||||
|  |     pushModule(pt); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | template <typename M> | ||||||
|  | void VirtualMachine::createModule(const std::string name, | ||||||
|  |                                const typename M::Par &par) | ||||||
|  | { | ||||||
|  |     ModPt pt(new M(name)); | ||||||
|  |      | ||||||
|  |     static_cast<M *>(pt.get())->setPar(par); | ||||||
|  |     pushModule(pt); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | template <typename M> | ||||||
|  | M * VirtualMachine::getModule(const unsigned int address) const | ||||||
|  | { | ||||||
|  |     if (auto *pt = dynamic_cast<M *>(getModule(address))) | ||||||
|  |     { | ||||||
|  |         return pt; | ||||||
|  |     } | ||||||
|  |     else | ||||||
|  |     { | ||||||
|  |         HADRON_ERROR(Definition, "module '" + module_[address].name | ||||||
|  |                      + "' does not have type " + typeid(M).name() | ||||||
|  |                      + "(has type: " + getModuleType(address) + ")"); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | template <typename M> | ||||||
|  | M * VirtualMachine::getModule(const std::string name) const | ||||||
|  | { | ||||||
|  |     return getModule<M>(getModuleAddress(name)); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | END_HADRONS_NAMESPACE | ||||||
|  |  | ||||||
|  | #endif // Hadrons_VirtualMachine_hpp_ | ||||||
| @@ -1,19 +1,52 @@ | |||||||
| modules_cc =\ | modules_cc =\ | ||||||
|   Modules/MGauge/Load.cc \ |   Modules/MScalar/ChargedProp.cc \ | ||||||
|  |   Modules/MScalar/FreeProp.cc \ | ||||||
|  |   Modules/MContraction/WeakHamiltonianEye.cc \ | ||||||
|  |   Modules/MContraction/WeakNeutral4ptDisc.cc \ | ||||||
|  |   Modules/MContraction/WeakHamiltonianNonEye.cc \ | ||||||
|  |   Modules/MGauge/Unit.cc \ | ||||||
|  |   Modules/MGauge/StochEm.cc \ | ||||||
|   Modules/MGauge/Random.cc \ |   Modules/MGauge/Random.cc \ | ||||||
|   Modules/MGauge/Unit.cc |   Modules/MGauge/FundtoHirep.cc \ | ||||||
|  |   Modules/MScalar/FreeProp.cc \ | ||||||
|  |   Modules/MScalar/ChargedProp.cc \ | ||||||
|  |   Modules/MIO/LoadNersc.cc | ||||||
|  |  | ||||||
| modules_hpp =\ | modules_hpp =\ | ||||||
|   Modules/MAction/DWF.hpp \ |  | ||||||
|   Modules/MAction/Wilson.hpp \ |  | ||||||
|   Modules/MContraction/Baryon.hpp \ |   Modules/MContraction/Baryon.hpp \ | ||||||
|   Modules/MContraction/Meson.hpp \ |   Modules/MContraction/Meson.hpp \ | ||||||
|   Modules/MGauge/Load.hpp \ |   Modules/MContraction/WeakHamiltonian.hpp \ | ||||||
|   Modules/MGauge/Random.hpp \ |   Modules/MContraction/WeakHamiltonianNonEye.hpp \ | ||||||
|   Modules/MGauge/Unit.hpp \ |   Modules/MContraction/DiscLoop.hpp \ | ||||||
|   Modules/MSolver/RBPrecCG.hpp \ |   Modules/MContraction/WeakNeutral4ptDisc.hpp \ | ||||||
|   Modules/MSource/Point.hpp \ |   Modules/MContraction/Gamma3pt.hpp \ | ||||||
|  |   Modules/MContraction/WardIdentity.hpp \ | ||||||
|  |   Modules/MContraction/WeakHamiltonianEye.hpp \ | ||||||
|  |   Modules/MFermion/GaugeProp.hpp \ | ||||||
|   Modules/MSource/SeqGamma.hpp \ |   Modules/MSource/SeqGamma.hpp \ | ||||||
|  |   Modules/MSource/Point.hpp \ | ||||||
|  |   Modules/MSource/Wall.hpp \ | ||||||
|   Modules/MSource/Z2.hpp \ |   Modules/MSource/Z2.hpp \ | ||||||
|   Modules/Quark.hpp |   Modules/MSource/SeqConserved.hpp \ | ||||||
|  |   Modules/MSink/Smear.hpp \ | ||||||
|  |   Modules/MSink/Point.hpp \ | ||||||
|  |   Modules/MSolver/RBPrecCG.hpp \ | ||||||
|  |   Modules/MGauge/Unit.hpp \ | ||||||
|  |   Modules/MGauge/Random.hpp \ | ||||||
|  |   Modules/MGauge/StochEm.hpp \ | ||||||
|  |   Modules/MGauge/FundtoHirep.hpp \ | ||||||
|  |   Modules/MUtilities/TestSeqGamma.hpp \ | ||||||
|  |   Modules/MUtilities/TestSeqConserved.hpp \ | ||||||
|  |   Modules/MLoop/NoiseLoop.hpp \ | ||||||
|  |   Modules/MScalar/FreeProp.hpp \ | ||||||
|  |   Modules/MScalar/Scalar.hpp \ | ||||||
|  |   Modules/MScalar/ChargedProp.hpp \ | ||||||
|  |   Modules/MAction/DWF.hpp \ | ||||||
|  |   Modules/MAction/Wilson.hpp \ | ||||||
|  |   Modules/MAction/WilsonClover.hpp \ | ||||||
|  |   Modules/MScalarSUN/TrMag.hpp \ | ||||||
|  |   Modules/MScalarSUN/TwoPoint.hpp \ | ||||||
|  |   Modules/MScalarSUN/TrPhi.hpp \ | ||||||
|  |   Modules/MIO/LoadNersc.hpp \ | ||||||
|  |   Modules/MIO/LoadBinary.hpp | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										11
									
								
								extras/qed-fvol/Global.cc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								extras/qed-fvol/Global.cc
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,11 @@ | |||||||
|  | #include <qed-fvol/Global.hpp> | ||||||
|  |  | ||||||
|  | using namespace Grid; | ||||||
|  | using namespace QCD; | ||||||
|  | using namespace QedFVol; | ||||||
|  |  | ||||||
|  | QedFVolLogger QedFVol::QedFVolLogError(1,"Error"); | ||||||
|  | QedFVolLogger QedFVol::QedFVolLogWarning(1,"Warning"); | ||||||
|  | QedFVolLogger QedFVol::QedFVolLogMessage(1,"Message"); | ||||||
|  | QedFVolLogger QedFVol::QedFVolLogIterative(1,"Iterative"); | ||||||
|  | QedFVolLogger QedFVol::QedFVolLogDebug(1,"Debug"); | ||||||
							
								
								
									
										42
									
								
								extras/qed-fvol/Global.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								extras/qed-fvol/Global.hpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,42 @@ | |||||||
|  | #ifndef QedFVol_Global_hpp_ | ||||||
|  | #define QedFVol_Global_hpp_ | ||||||
|  |  | ||||||
|  | #include <Grid/Grid.h> | ||||||
|  |  | ||||||
|  | #define BEGIN_QEDFVOL_NAMESPACE \ | ||||||
|  | namespace Grid {\ | ||||||
|  | using namespace QCD;\ | ||||||
|  | namespace QedFVol {\ | ||||||
|  | using Grid::operator<<; | ||||||
|  | #define END_QEDFVOL_NAMESPACE }} | ||||||
|  |  | ||||||
|  | /* the 'using Grid::operator<<;' statement prevents a very nasty compilation | ||||||
|  |  * error with GCC (clang compiles fine without it). | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | BEGIN_QEDFVOL_NAMESPACE | ||||||
|  |  | ||||||
|  | class QedFVolLogger: public Logger | ||||||
|  | { | ||||||
|  | public: | ||||||
|  |     QedFVolLogger(int on, std::string nm): Logger("QedFVol", on, nm, | ||||||
|  |                                                   GridLogColours, "BLACK"){}; | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | #define LOG(channel) std::cout << QedFVolLog##channel | ||||||
|  | #define QEDFVOL_ERROR(msg)\ | ||||||
|  | LOG(Error) << msg << " (" << __FUNCTION__ << " at " << __FILE__ << ":"\ | ||||||
|  |            << __LINE__ << ")" << std::endl;\ | ||||||
|  | abort(); | ||||||
|  |  | ||||||
|  | #define DEBUG_VAR(var) LOG(Debug) << #var << "= " << (var) << std::endl; | ||||||
|  |  | ||||||
|  | extern QedFVolLogger QedFVolLogError; | ||||||
|  | extern QedFVolLogger QedFVolLogWarning; | ||||||
|  | extern QedFVolLogger QedFVolLogMessage; | ||||||
|  | extern QedFVolLogger QedFVolLogIterative; | ||||||
|  | extern QedFVolLogger QedFVolLogDebug; | ||||||
|  |  | ||||||
|  | END_QEDFVOL_NAMESPACE | ||||||
|  |  | ||||||
|  | #endif // QedFVol_Global_hpp_ | ||||||
							
								
								
									
										9
									
								
								extras/qed-fvol/Makefile.am
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								extras/qed-fvol/Makefile.am
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,9 @@ | |||||||
|  | AM_CXXFLAGS += -I$(top_srcdir)/extras | ||||||
|  |  | ||||||
|  | bin_PROGRAMS = qed-fvol | ||||||
|  |  | ||||||
|  | qed_fvol_SOURCES =   \ | ||||||
|  |     qed-fvol.cc      \ | ||||||
|  |     Global.cc | ||||||
|  |  | ||||||
|  | qed_fvol_LDADD   = -lGrid | ||||||
							
								
								
									
										265
									
								
								extras/qed-fvol/WilsonLoops.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										265
									
								
								extras/qed-fvol/WilsonLoops.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,265 @@ | |||||||
|  | #ifndef QEDFVOL_WILSONLOOPS_H | ||||||
|  | #define QEDFVOL_WILSONLOOPS_H | ||||||
|  |  | ||||||
|  | #include <Global.hpp> | ||||||
|  |  | ||||||
|  | BEGIN_QEDFVOL_NAMESPACE | ||||||
|  |  | ||||||
|  | template <class Gimpl> class NewWilsonLoops : public Gimpl { | ||||||
|  | public: | ||||||
|  |   INHERIT_GIMPL_TYPES(Gimpl); | ||||||
|  |  | ||||||
|  |   typedef typename Gimpl::GaugeLinkField GaugeMat; | ||||||
|  |   typedef typename Gimpl::GaugeField GaugeLorentz; | ||||||
|  |  | ||||||
|  |   ////////////////////////////////////////////////// | ||||||
|  |   // directed plaquette oriented in mu,nu plane | ||||||
|  |   ////////////////////////////////////////////////// | ||||||
|  |   static void dirPlaquette(GaugeMat &plaq, const std::vector<GaugeMat> &U, | ||||||
|  |                            const int mu, const int nu) { | ||||||
|  |     // Annoyingly, must use either scope resolution to find dependent base | ||||||
|  |     // class, | ||||||
|  |     // or this-> ; there is no "this" in a static method. This forces explicit | ||||||
|  |     // Gimpl scope | ||||||
|  |     // resolution throughout the usage in this file, and rather defeats the | ||||||
|  |     // purpose of deriving | ||||||
|  |     // from Gimpl. | ||||||
|  |     plaq = Gimpl::CovShiftBackward( | ||||||
|  |         U[mu], mu, Gimpl::CovShiftBackward( | ||||||
|  |                        U[nu], nu, Gimpl::CovShiftForward(U[mu], mu, U[nu]))); | ||||||
|  |   } | ||||||
|  |   ////////////////////////////////////////////////// | ||||||
|  |   // trace of directed plaquette oriented in mu,nu plane | ||||||
|  |   ////////////////////////////////////////////////// | ||||||
|  |   static void traceDirPlaquette(LatticeComplex &plaq, | ||||||
|  |                                 const std::vector<GaugeMat> &U, const int mu, | ||||||
|  |                                 const int nu) { | ||||||
|  |     GaugeMat sp(U[0]._grid); | ||||||
|  |     dirPlaquette(sp, U, mu, nu); | ||||||
|  |     plaq = trace(sp); | ||||||
|  |   } | ||||||
|  |   ////////////////////////////////////////////////// | ||||||
|  |   // sum over all planes of plaquette | ||||||
|  |   ////////////////////////////////////////////////// | ||||||
|  |   static void sitePlaquette(LatticeComplex &Plaq, | ||||||
|  |                             const std::vector<GaugeMat> &U) { | ||||||
|  |     LatticeComplex sitePlaq(U[0]._grid); | ||||||
|  |     Plaq = zero; | ||||||
|  |     for (int mu = 1; mu < U[0]._grid->_ndimension; mu++) { | ||||||
|  |       for (int nu = 0; nu < mu; nu++) { | ||||||
|  |         traceDirPlaquette(sitePlaq, U, mu, nu); | ||||||
|  |         Plaq = Plaq + sitePlaq; | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  |   ////////////////////////////////////////////////// | ||||||
|  |   // sum over all x,y,z,t and over all planes of plaquette | ||||||
|  |   ////////////////////////////////////////////////// | ||||||
|  |   static Real sumPlaquette(const GaugeLorentz &Umu) { | ||||||
|  |     std::vector<GaugeMat> U(4, Umu._grid); | ||||||
|  |  | ||||||
|  |     for (int mu = 0; mu < Umu._grid->_ndimension; mu++) { | ||||||
|  |       U[mu] = PeekIndex<LorentzIndex>(Umu, mu); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     LatticeComplex Plaq(Umu._grid); | ||||||
|  |  | ||||||
|  |     sitePlaquette(Plaq, U); | ||||||
|  |  | ||||||
|  |     TComplex Tp = sum(Plaq); | ||||||
|  |     Complex p = TensorRemove(Tp); | ||||||
|  |     return p.real(); | ||||||
|  |   } | ||||||
|  |   ////////////////////////////////////////////////// | ||||||
|  |   // average over all x,y,z,t and over all planes of plaquette | ||||||
|  |   ////////////////////////////////////////////////// | ||||||
|  |   static Real avgPlaquette(const GaugeLorentz &Umu) { | ||||||
|  |     int ndim = Umu._grid->_ndimension; | ||||||
|  |     Real sumplaq = sumPlaquette(Umu); | ||||||
|  |     Real vol = Umu._grid->gSites(); | ||||||
|  |     Real faces = (1.0 * ndim * (ndim - 1)) / 2.0; | ||||||
|  |     return sumplaq / vol / faces / Nc; // Nc dependent... FIXME | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   ////////////////////////////////////////////////// | ||||||
|  |   // Wilson loop of size (R1, R2), oriented in mu,nu plane | ||||||
|  |   ////////////////////////////////////////////////// | ||||||
|  |   static void wilsonLoop(GaugeMat &wl, const std::vector<GaugeMat> &U, | ||||||
|  |                            const int Rmu, const int Rnu, | ||||||
|  |                            const int mu, const int nu) { | ||||||
|  |     wl = U[nu]; | ||||||
|  |  | ||||||
|  |     for(int i = 0; i < Rnu-1; i++){ | ||||||
|  |       wl = Gimpl::CovShiftForward(U[nu], nu, wl); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     for(int i = 0; i < Rmu; i++){ | ||||||
|  |       wl = Gimpl::CovShiftForward(U[mu], mu, wl); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     for(int i = 0; i < Rnu; i++){ | ||||||
|  |       wl = Gimpl::CovShiftBackward(U[nu], nu, wl); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     for(int i = 0; i < Rmu; i++){ | ||||||
|  |       wl = Gimpl::CovShiftBackward(U[mu], mu, wl); | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  |   ////////////////////////////////////////////////// | ||||||
|  |   // trace of Wilson Loop oriented in mu,nu plane | ||||||
|  |   ////////////////////////////////////////////////// | ||||||
|  |   static void traceWilsonLoop(LatticeComplex &wl, | ||||||
|  |                                 const std::vector<GaugeMat> &U, | ||||||
|  |                                 const int Rmu, const int Rnu, | ||||||
|  |                                 const int mu, const int nu) { | ||||||
|  |     GaugeMat sp(U[0]._grid); | ||||||
|  |     wilsonLoop(sp, U, Rmu, Rnu, mu, nu); | ||||||
|  |     wl = trace(sp); | ||||||
|  |   } | ||||||
|  |   ////////////////////////////////////////////////// | ||||||
|  |   // sum over all planes of Wilson loop | ||||||
|  |   ////////////////////////////////////////////////// | ||||||
|  |   static void siteWilsonLoop(LatticeComplex &Wl, | ||||||
|  |                             const std::vector<GaugeMat> &U, | ||||||
|  |                             const int R1, const int R2) { | ||||||
|  |     LatticeComplex siteWl(U[0]._grid); | ||||||
|  |     Wl = zero; | ||||||
|  |     for (int mu = 1; mu < U[0]._grid->_ndimension; mu++) { | ||||||
|  |       for (int nu = 0; nu < mu; nu++) { | ||||||
|  |         traceWilsonLoop(siteWl, U, R1, R2, mu, nu); | ||||||
|  |         Wl = Wl + siteWl; | ||||||
|  |         traceWilsonLoop(siteWl, U, R2, R1, mu, nu); | ||||||
|  |         Wl = Wl + siteWl; | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  |   ////////////////////////////////////////////////// | ||||||
|  |   // sum over planes of Wilson loop with length R1 | ||||||
|  |   // in the time direction | ||||||
|  |   ////////////////////////////////////////////////// | ||||||
|  |   static void siteTimelikeWilsonLoop(LatticeComplex &Wl, | ||||||
|  |                             const std::vector<GaugeMat> &U, | ||||||
|  |                             const int R1, const int R2) { | ||||||
|  |     LatticeComplex siteWl(U[0]._grid); | ||||||
|  |  | ||||||
|  |     int ndim = U[0]._grid->_ndimension; | ||||||
|  |  | ||||||
|  |     Wl = zero; | ||||||
|  |     for (int nu = 0; nu < ndim - 1; nu++) { | ||||||
|  |       traceWilsonLoop(siteWl, U, R1, R2, ndim-1, nu); | ||||||
|  |       Wl = Wl + siteWl; | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  |   ////////////////////////////////////////////////// | ||||||
|  |   // sum Wilson loop over all planes orthogonal to the time direction | ||||||
|  |   ////////////////////////////////////////////////// | ||||||
|  |   static void siteSpatialWilsonLoop(LatticeComplex &Wl, | ||||||
|  |                             const std::vector<GaugeMat> &U, | ||||||
|  |                             const int R1, const int R2) { | ||||||
|  |     LatticeComplex siteWl(U[0]._grid); | ||||||
|  |  | ||||||
|  |     Wl = zero; | ||||||
|  |     for (int mu = 1; mu < U[0]._grid->_ndimension - 1; mu++) { | ||||||
|  |       for (int nu = 0; nu < mu; nu++) { | ||||||
|  |         traceWilsonLoop(siteWl, U, R1, R2, mu, nu); | ||||||
|  |         Wl = Wl + siteWl; | ||||||
|  |         traceWilsonLoop(siteWl, U, R2, R1, mu, nu); | ||||||
|  |         Wl = Wl + siteWl; | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  |   ////////////////////////////////////////////////// | ||||||
|  |   // sum over all x,y,z,t and over all planes of Wilson loop | ||||||
|  |   ////////////////////////////////////////////////// | ||||||
|  |   static Real sumWilsonLoop(const GaugeLorentz &Umu, | ||||||
|  |                             const int R1, const int R2) { | ||||||
|  |     std::vector<GaugeMat> U(4, Umu._grid); | ||||||
|  |  | ||||||
|  |     for (int mu = 0; mu < Umu._grid->_ndimension; mu++) { | ||||||
|  |       U[mu] = PeekIndex<LorentzIndex>(Umu, mu); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     LatticeComplex Wl(Umu._grid); | ||||||
|  |  | ||||||
|  |     siteWilsonLoop(Wl, U, R1, R2); | ||||||
|  |  | ||||||
|  |     TComplex Tp = sum(Wl); | ||||||
|  |     Complex p = TensorRemove(Tp); | ||||||
|  |     return p.real(); | ||||||
|  |   } | ||||||
|  |   ////////////////////////////////////////////////// | ||||||
|  |   // sum over all x,y,z,t and over all planes of timelike Wilson loop | ||||||
|  |   ////////////////////////////////////////////////// | ||||||
|  |   static Real sumTimelikeWilsonLoop(const GaugeLorentz &Umu, | ||||||
|  |                             const int R1, const int R2) { | ||||||
|  |     std::vector<GaugeMat> U(4, Umu._grid); | ||||||
|  |  | ||||||
|  |     for (int mu = 0; mu < Umu._grid->_ndimension; mu++) { | ||||||
|  |       U[mu] = PeekIndex<LorentzIndex>(Umu, mu); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     LatticeComplex Wl(Umu._grid); | ||||||
|  |  | ||||||
|  |     siteTimelikeWilsonLoop(Wl, U, R1, R2); | ||||||
|  |  | ||||||
|  |     TComplex Tp = sum(Wl); | ||||||
|  |     Complex p = TensorRemove(Tp); | ||||||
|  |     return p.real(); | ||||||
|  |   } | ||||||
|  |   ////////////////////////////////////////////////// | ||||||
|  |   // sum over all x,y,z,t and over all planes of spatial Wilson loop | ||||||
|  |   ////////////////////////////////////////////////// | ||||||
|  |   static Real sumSpatialWilsonLoop(const GaugeLorentz &Umu, | ||||||
|  |                             const int R1, const int R2) { | ||||||
|  |     std::vector<GaugeMat> U(4, Umu._grid); | ||||||
|  |  | ||||||
|  |     for (int mu = 0; mu < Umu._grid->_ndimension; mu++) { | ||||||
|  |       U[mu] = PeekIndex<LorentzIndex>(Umu, mu); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     LatticeComplex Wl(Umu._grid); | ||||||
|  |  | ||||||
|  |     siteSpatialWilsonLoop(Wl, U, R1, R2); | ||||||
|  |  | ||||||
|  |     TComplex Tp = sum(Wl); | ||||||
|  |     Complex p = TensorRemove(Tp); | ||||||
|  |     return p.real(); | ||||||
|  |   } | ||||||
|  |   ////////////////////////////////////////////////// | ||||||
|  |   // average over all x,y,z,t and over all planes of Wilson loop | ||||||
|  |   ////////////////////////////////////////////////// | ||||||
|  |   static Real avgWilsonLoop(const GaugeLorentz &Umu, | ||||||
|  |                             const int R1, const int R2) { | ||||||
|  |     int ndim = Umu._grid->_ndimension; | ||||||
|  |     Real sumWl = sumWilsonLoop(Umu, R1, R2); | ||||||
|  |     Real vol = Umu._grid->gSites(); | ||||||
|  |     Real faces = 1.0 * ndim * (ndim - 1); | ||||||
|  |     return sumWl / vol / faces / Nc; // Nc dependent... FIXME | ||||||
|  |   } | ||||||
|  |   ////////////////////////////////////////////////// | ||||||
|  |   // average over all x,y,z,t and over all planes of timelike Wilson loop | ||||||
|  |   ////////////////////////////////////////////////// | ||||||
|  |   static Real avgTimelikeWilsonLoop(const GaugeLorentz &Umu, | ||||||
|  |                             const int R1, const int R2) { | ||||||
|  |     int ndim = Umu._grid->_ndimension; | ||||||
|  |     Real sumWl = sumTimelikeWilsonLoop(Umu, R1, R2); | ||||||
|  |     Real vol = Umu._grid->gSites(); | ||||||
|  |     Real faces = 1.0 * (ndim - 1); | ||||||
|  |     return sumWl / vol / faces / Nc; // Nc dependent... FIXME | ||||||
|  |   } | ||||||
|  |   ////////////////////////////////////////////////// | ||||||
|  |   // average over all x,y,z,t and over all planes of spatial Wilson loop | ||||||
|  |   ////////////////////////////////////////////////// | ||||||
|  |   static Real avgSpatialWilsonLoop(const GaugeLorentz &Umu, | ||||||
|  |                             const int R1, const int R2) { | ||||||
|  |     int ndim = Umu._grid->_ndimension; | ||||||
|  |     Real sumWl = sumSpatialWilsonLoop(Umu, R1, R2); | ||||||
|  |     Real vol = Umu._grid->gSites(); | ||||||
|  |     Real faces = 1.0 * (ndim - 1) * (ndim - 2); | ||||||
|  |     return sumWl / vol / faces / Nc; // Nc dependent... FIXME | ||||||
|  |   } | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | END_QEDFVOL_NAMESPACE | ||||||
|  |  | ||||||
|  | #endif // QEDFVOL_WILSONLOOPS_H | ||||||
							
								
								
									
										88
									
								
								extras/qed-fvol/qed-fvol.cc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										88
									
								
								extras/qed-fvol/qed-fvol.cc
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,88 @@ | |||||||
|  | #include <Global.hpp> | ||||||
|  | #include <WilsonLoops.h> | ||||||
|  |  | ||||||
|  | using namespace Grid; | ||||||
|  | using namespace QCD; | ||||||
|  | using namespace QedFVol; | ||||||
|  |  | ||||||
|  | typedef PeriodicGaugeImpl<QedGimplR>    QedPeriodicGimplR; | ||||||
|  | typedef PhotonR::GaugeField             EmField; | ||||||
|  | typedef PhotonR::GaugeLinkField         EmComp; | ||||||
|  |  | ||||||
|  | const int NCONFIGS = 10; | ||||||
|  | const int NWILSON = 10; | ||||||
|  |  | ||||||
|  | int main(int argc, char *argv[]) | ||||||
|  | { | ||||||
|  |     // parse command line | ||||||
|  |     std::string parameterFileName; | ||||||
|  |      | ||||||
|  |     if (argc < 2) | ||||||
|  |     { | ||||||
|  |         std::cerr << "usage: " << argv[0] << " <parameter file> [Grid options]"; | ||||||
|  |         std::cerr << std::endl; | ||||||
|  |         std::exit(EXIT_FAILURE); | ||||||
|  |     } | ||||||
|  |     parameterFileName = argv[1]; | ||||||
|  |      | ||||||
|  |     // initialization | ||||||
|  |     Grid_init(&argc, &argv); | ||||||
|  |     QedFVolLogError.Active(GridLogError.isActive()); | ||||||
|  |     QedFVolLogWarning.Active(GridLogWarning.isActive()); | ||||||
|  |     QedFVolLogMessage.Active(GridLogMessage.isActive()); | ||||||
|  |     QedFVolLogIterative.Active(GridLogIterative.isActive()); | ||||||
|  |     QedFVolLogDebug.Active(GridLogDebug.isActive()); | ||||||
|  |     LOG(Message) << "Grid initialized" << std::endl; | ||||||
|  |      | ||||||
|  |     // QED stuff | ||||||
|  |     std::vector<int> latt_size   = GridDefaultLatt(); | ||||||
|  |     std::vector<int> simd_layout = GridDefaultSimd(4, vComplex::Nsimd()); | ||||||
|  |     std::vector<int> mpi_layout  = GridDefaultMpi(); | ||||||
|  |     GridCartesian    grid(latt_size,simd_layout,mpi_layout); | ||||||
|  |     GridParallelRNG  pRNG(&grid); | ||||||
|  |     PhotonR          photon(PhotonR::Gauge::feynman, | ||||||
|  |                             PhotonR::ZmScheme::qedL); | ||||||
|  |     EmField          a(&grid); | ||||||
|  |     EmField          expA(&grid); | ||||||
|  |  | ||||||
|  |     Complex imag_unit(0, 1); | ||||||
|  |  | ||||||
|  |     Real wlA; | ||||||
|  |     std::vector<Real> logWlAvg(NWILSON, 0.0), logWlTime(NWILSON, 0.0), logWlSpace(NWILSON, 0.0); | ||||||
|  |  | ||||||
|  |     pRNG.SeedRandomDevice(); | ||||||
|  |  | ||||||
|  |     LOG(Message) << "Wilson loop calculation beginning" << std::endl; | ||||||
|  |     for(int ic = 0; ic < NCONFIGS; ic++){ | ||||||
|  |         LOG(Message) << "Configuration " << ic <<std::endl; | ||||||
|  |         photon.StochasticField(a, pRNG); | ||||||
|  |  | ||||||
|  |         // Exponentiate photon field | ||||||
|  |         expA = exp(imag_unit*a); | ||||||
|  |  | ||||||
|  |         // Calculate Wilson loops | ||||||
|  |         for(int iw=1; iw<=NWILSON; iw++){ | ||||||
|  |             wlA = NewWilsonLoops<QedPeriodicGimplR>::avgWilsonLoop(expA, iw, iw) * 3; | ||||||
|  |             logWlAvg[iw-1] -= 2*log(wlA); | ||||||
|  |             wlA = NewWilsonLoops<QedPeriodicGimplR>::avgTimelikeWilsonLoop(expA, iw, iw) * 3; | ||||||
|  |             logWlTime[iw-1] -= 2*log(wlA); | ||||||
|  |             wlA = NewWilsonLoops<QedPeriodicGimplR>::avgSpatialWilsonLoop(expA, iw, iw) * 3; | ||||||
|  |             logWlSpace[iw-1] -= 2*log(wlA); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |     LOG(Message) << "Wilson loop calculation completed" << std::endl; | ||||||
|  |      | ||||||
|  |     // Calculate Wilson loops | ||||||
|  |     for(int iw=1; iw<=10; iw++){ | ||||||
|  |         LOG(Message) << iw << 'x' << iw << " Wilson loop" << std::endl; | ||||||
|  |         LOG(Message) << "-2log(W) average: " << logWlAvg[iw-1]/NCONFIGS << std::endl; | ||||||
|  |         LOG(Message) << "-2log(W) timelike: " << logWlTime[iw-1]/NCONFIGS << std::endl; | ||||||
|  |         LOG(Message) << "-2log(W) spatial: " << logWlSpace[iw-1]/NCONFIGS << std::endl; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     // epilogue | ||||||
|  |     LOG(Message) << "Grid is finalizing now" << std::endl; | ||||||
|  |     Grid_finalize(); | ||||||
|  |      | ||||||
|  |     return EXIT_SUCCESS; | ||||||
|  | } | ||||||
| @@ -20,4 +20,17 @@ The simple testcase in this directory is the submitted bug report that encapsula | |||||||
| problem. The test case works with icpc and with clang++, but fails consistently on g++ | problem. The test case works with icpc and with clang++, but fails consistently on g++ | ||||||
| current variants. | current variants. | ||||||
|  |  | ||||||
| Peter | Peter | ||||||
|  |  | ||||||
|  |  | ||||||
|  | ************ | ||||||
|  |  | ||||||
|  | Second GCC bug reported, see Issue 100. | ||||||
|  |  | ||||||
|  | https://wandbox.org/permlink/tzssJza6R9XnqANw | ||||||
|  | https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80652 | ||||||
|  |  | ||||||
|  | Getting Travis fails under gcc-5 for Test_simd, now that I added more comprehensive testing to the | ||||||
|  | CI test suite. The limitations of Travis runtime limits & weak cores are being shown. | ||||||
|  |  | ||||||
|  | Travis uses 5.4.1 for g++-5. | ||||||
|   | |||||||
							
								
								
									
										86
									
								
								grid-config.in
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										86
									
								
								grid-config.in
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,86 @@ | |||||||
|  | #! /bin/sh | ||||||
|  |  | ||||||
|  | prefix=@prefix@ | ||||||
|  | exec_prefix=@exec_prefix@ | ||||||
|  | includedir=@includedir@ | ||||||
|  |  | ||||||
|  | usage() | ||||||
|  | { | ||||||
|  |   cat <<EOF | ||||||
|  | Usage: grid-config [OPTION] | ||||||
|  |  | ||||||
|  | Known values for OPTION are: | ||||||
|  |  | ||||||
|  |   --prefix     show Grid installation prefix | ||||||
|  |   --cxxflags   print pre-processor and compiler flags | ||||||
|  |   --ldflags    print library linking flags | ||||||
|  |   --libs       print library linking information | ||||||
|  |   --summary    print full build summary | ||||||
|  |   --help       display this help and exit | ||||||
|  |   --version    output version information | ||||||
|  |   --git        print git revision | ||||||
|  |  | ||||||
|  | EOF | ||||||
|  |    | ||||||
|  |   exit $1 | ||||||
|  | } | ||||||
|  |  | ||||||
|  | if test $# -eq 0; then | ||||||
|  |   usage 1 | ||||||
|  | fi | ||||||
|  |  | ||||||
|  | cflags=false | ||||||
|  | libs=false | ||||||
|  |  | ||||||
|  | while test $# -gt 0; do | ||||||
|  |   case "$1" in | ||||||
|  |     -*=*) optarg=`echo "$1" | sed 's/[-_a-zA-Z0-9]*=//'` ;; | ||||||
|  |     *) optarg= ;; | ||||||
|  |   esac | ||||||
|  |    | ||||||
|  |   case "$1" in | ||||||
|  |     --prefix) | ||||||
|  |       echo $prefix | ||||||
|  |     ;; | ||||||
|  |      | ||||||
|  |     --version) | ||||||
|  |       echo @VERSION@ | ||||||
|  |       exit 0 | ||||||
|  |     ;; | ||||||
|  |      | ||||||
|  |     --git) | ||||||
|  |       echo "@GRID_BRANCH@ @GRID_SHA@" | ||||||
|  |       exit 0 | ||||||
|  |     ;; | ||||||
|  |      | ||||||
|  |     --help) | ||||||
|  |       usage 0 | ||||||
|  |     ;; | ||||||
|  |      | ||||||
|  |     --cxxflags) | ||||||
|  |       echo @GRID_CXXFLAGS@ | ||||||
|  |     ;; | ||||||
|  |      | ||||||
|  |     --ldflags) | ||||||
|  |       echo @GRID_LDFLAGS@ | ||||||
|  |     ;; | ||||||
|  |      | ||||||
|  |     --libs) | ||||||
|  |       echo @GRID_LIBS@ | ||||||
|  |     ;; | ||||||
|  |      | ||||||
|  |     --summary) | ||||||
|  |       echo "" | ||||||
|  |       echo "@GRID_SUMMARY@" | ||||||
|  |       echo "" | ||||||
|  |     ;; | ||||||
|  |      | ||||||
|  |     *) | ||||||
|  |       usage | ||||||
|  |       exit 1 | ||||||
|  |     ;; | ||||||
|  |   esac | ||||||
|  |   shift | ||||||
|  | done | ||||||
|  |  | ||||||
|  | exit 0 | ||||||
							
								
								
									
										37
									
								
								lib/DisableWarnings.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								lib/DisableWarnings.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,37 @@ | |||||||
|  | /************************************************************************************* | ||||||
|  |  | ||||||
|  | Grid physics library, www.github.com/paboyle/Grid | ||||||
|  |  | ||||||
|  | Source file: ./lib/DisableWarnings.h | ||||||
|  |  | ||||||
|  | Copyright (C) 2016 | ||||||
|  |  | ||||||
|  | Author: Guido Cossu <guido.cossu@ed.ac.uk> | ||||||
|  |  | ||||||
|  | This program is free software; you can redistribute it and/or modify | ||||||
|  | it under the terms of the GNU General Public License as published by | ||||||
|  | the Free Software Foundation; either version 2 of the License, or | ||||||
|  | (at your option) any later version. | ||||||
|  |  | ||||||
|  | This program is distributed in the hope that it will be useful, | ||||||
|  | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||||
|  | GNU General Public License for more details. | ||||||
|  |  | ||||||
|  | You should have received a copy of the GNU General Public License along | ||||||
|  | with this program; if not, write to the Free Software Foundation, Inc., | ||||||
|  | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | ||||||
|  |  | ||||||
|  | See the full license in the file "LICENSE" in the top level distribution | ||||||
|  | directory | ||||||
|  | *************************************************************************************/ | ||||||
|  | /*  END LEGAL */ | ||||||
|  |  | ||||||
|  | #ifndef DISABLE_WARNINGS_H | ||||||
|  | #define DISABLE_WARNINGS_H | ||||||
|  |  | ||||||
|  |  //disables and intel compiler specific warning (in json.hpp) | ||||||
|  | #pragma warning disable 488   | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #endif | ||||||
| @@ -41,7 +41,9 @@ Author: paboyle <paboyle@ph.ed.ac.uk> | |||||||
| #include <Grid/GridCore.h> | #include <Grid/GridCore.h> | ||||||
| #include <Grid/GridQCDcore.h> | #include <Grid/GridQCDcore.h> | ||||||
| #include <Grid/qcd/action/Action.h> | #include <Grid/qcd/action/Action.h> | ||||||
|  | #include <Grid/qcd/utils/GaugeFix.h> | ||||||
| #include <Grid/qcd/smearing/Smearing.h> | #include <Grid/qcd/smearing/Smearing.h> | ||||||
|  | #include <Grid/parallelIO/MetaData.h> | ||||||
| #include <Grid/qcd/hmc/HMC_aggregate.h> | #include <Grid/qcd/hmc/HMC_aggregate.h> | ||||||
|  |  | ||||||
| #endif | #endif | ||||||
|   | |||||||
| @@ -38,28 +38,7 @@ Author: paboyle <paboyle@ph.ed.ac.uk> | |||||||
| #ifndef GRID_BASE_H | #ifndef GRID_BASE_H | ||||||
| #define GRID_BASE_H | #define GRID_BASE_H | ||||||
|  |  | ||||||
| /////////////////// | #include <Grid/GridStd.h> | ||||||
| // Std C++ dependencies |  | ||||||
| /////////////////// |  | ||||||
| #include <cassert> |  | ||||||
| #include <complex> |  | ||||||
| #include <vector> |  | ||||||
| #include <iostream> |  | ||||||
| #include <iomanip> |  | ||||||
| #include <random> |  | ||||||
| #include <functional> |  | ||||||
| #include <stdio.h> |  | ||||||
| #include <stdlib.h> |  | ||||||
| #include <stdio.h> |  | ||||||
| #include <signal.h> |  | ||||||
| #include <ctime> |  | ||||||
| #include <sys/time.h> |  | ||||||
| #include <chrono> |  | ||||||
|  |  | ||||||
| /////////////////// |  | ||||||
| // Grid headers |  | ||||||
| /////////////////// |  | ||||||
| #include "Config.h" |  | ||||||
|  |  | ||||||
| #include <Grid/perfmon/Timer.h> | #include <Grid/perfmon/Timer.h> | ||||||
| #include <Grid/perfmon/PerfCount.h> | #include <Grid/perfmon/PerfCount.h> | ||||||
|   | |||||||
							
								
								
									
										29
									
								
								lib/GridStd.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								lib/GridStd.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,29 @@ | |||||||
|  | #ifndef GRID_STD_H | ||||||
|  | #define GRID_STD_H | ||||||
|  |  | ||||||
|  | /////////////////// | ||||||
|  | // Std C++ dependencies | ||||||
|  | /////////////////// | ||||||
|  | #include <cassert> | ||||||
|  | #include <complex> | ||||||
|  | #include <vector> | ||||||
|  | #include <string> | ||||||
|  | #include <iostream> | ||||||
|  | #include <iomanip> | ||||||
|  | #include <random> | ||||||
|  | #include <functional> | ||||||
|  | #include <stdio.h> | ||||||
|  | #include <stdlib.h> | ||||||
|  | #include <stdio.h> | ||||||
|  | #include <signal.h> | ||||||
|  | #include <ctime> | ||||||
|  | #include <sys/time.h> | ||||||
|  | #include <chrono> | ||||||
|  | #include <zlib.h> | ||||||
|  |  | ||||||
|  | /////////////////// | ||||||
|  | // Grid config | ||||||
|  | /////////////////// | ||||||
|  | #include "Config.h" | ||||||
|  |  | ||||||
|  | #endif /* GRID_STD_H */ | ||||||
							
								
								
									
										9
									
								
								lib/Grid_Eigen_Dense.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								lib/Grid_Eigen_Dense.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,9 @@ | |||||||
|  | #pragma once | ||||||
|  | #if defined __GNUC__ | ||||||
|  | #pragma GCC diagnostic push | ||||||
|  | #pragma GCC diagnostic ignored "-Wdeprecated-declarations" | ||||||
|  | #endif | ||||||
|  | #include <Grid/Eigen/Dense> | ||||||
|  | #if defined __GNUC__ | ||||||
|  | #pragma GCC diagnostic pop | ||||||
|  | #endif | ||||||
| @@ -1,28 +1,18 @@ | |||||||
| extra_sources= | extra_sources= | ||||||
| extra_headers= | extra_headers= | ||||||
| if BUILD_COMMS_MPI |  | ||||||
|   extra_sources+=communicator/Communicator_mpi.cc |  | ||||||
|   extra_sources+=communicator/Communicator_base.cc |  | ||||||
| endif |  | ||||||
|  |  | ||||||
| if BUILD_COMMS_MPI3 | if BUILD_COMMS_MPI3 | ||||||
|   extra_sources+=communicator/Communicator_mpi3.cc |   extra_sources+=communicator/Communicator_mpi3.cc | ||||||
|   extra_sources+=communicator/Communicator_base.cc |   extra_sources+=communicator/Communicator_base.cc | ||||||
| endif |   extra_sources+=communicator/SharedMemoryMPI.cc | ||||||
|  |   extra_sources+=communicator/SharedMemory.cc | ||||||
| if BUILD_COMMS_MPI3L |  | ||||||
|   extra_sources+=communicator/Communicator_mpi3_leader.cc |  | ||||||
|   extra_sources+=communicator/Communicator_base.cc |  | ||||||
| endif |  | ||||||
|  |  | ||||||
| if BUILD_COMMS_SHMEM |  | ||||||
|   extra_sources+=communicator/Communicator_shmem.cc |  | ||||||
|   extra_sources+=communicator/Communicator_base.cc |  | ||||||
| endif | endif | ||||||
|  |  | ||||||
| if BUILD_COMMS_NONE | if BUILD_COMMS_NONE | ||||||
|   extra_sources+=communicator/Communicator_none.cc |   extra_sources+=communicator/Communicator_none.cc | ||||||
|   extra_sources+=communicator/Communicator_base.cc |   extra_sources+=communicator/Communicator_base.cc | ||||||
|  |   extra_sources+=communicator/SharedMemoryNone.cc | ||||||
|  |   extra_sources+=communicator/SharedMemory.cc | ||||||
| endif | endif | ||||||
|  |  | ||||||
| if BUILD_HDF5 | if BUILD_HDF5 | ||||||
|   | |||||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user