mirror of
				https://github.com/paboyle/Grid.git
				synced 2025-10-30 19:44:32 +00:00 
			
		
		
		
	Compare commits
	
		
			20 Commits
		
	
	
		
			feature/cl
			...
			feature/CG
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | 70068cff51 | ||
|  | 85c055fa30 | ||
|  | 90fedbd2af | ||
|  | ec0c53fa68 | ||
|  | 6ceee102e8 | ||
|  | 6e57bdb6b3 | ||
|  | 4c11e36d3d | ||
|  | 9977c53035 | ||
|  | 3a74fec62f | ||
|  | 8fb0a13f39 | ||
|  | 14a1406f54 | ||
|  | 538e64e5b4 | ||
|  | b2dc17e160 | ||
|  | afbbcd2194 | ||
|  | d4e0b11bb1 | ||
|  | 7144ee7ae8 | ||
|  | f1908c7bc9 | ||
|  | 036ec31c48 | ||
|  | 53f240200e | ||
|  | 9720c9ba3f | 
							
								
								
									
										27
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										27
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -9,7 +9,6 @@ | |||||||
| ################ | ################ | ||||||
| *~ | *~ | ||||||
| *# | *# | ||||||
| *.sublime-* |  | ||||||
|  |  | ||||||
| # Precompiled Headers # | # Precompiled Headers # | ||||||
| ####################### | ####################### | ||||||
| @@ -92,8 +91,6 @@ build*/* | |||||||
| ##################### | ##################### | ||||||
| *.xcodeproj/* | *.xcodeproj/* | ||||||
| build.sh | build.sh | ||||||
| .vscode |  | ||||||
| *.code-workspace |  | ||||||
|  |  | ||||||
| # Eigen source # | # Eigen source # | ||||||
| ################ | ################ | ||||||
| @@ -106,26 +103,4 @@ lib/fftw/* | |||||||
| # libtool macros # | # libtool macros # | ||||||
| ################## | ################## | ||||||
| m4/lt* | m4/lt* | ||||||
| m4/libtool.m4 | m4/libtool.m4 | ||||||
|  |  | ||||||
| # github pages # |  | ||||||
| ################ |  | ||||||
| gh-pages/ |  | ||||||
|  |  | ||||||
| # Buck files # |  | ||||||
| ############## |  | ||||||
| .buck* |  | ||||||
| buck-out |  | ||||||
| BUCK |  | ||||||
| make-bin-BUCK.sh |  | ||||||
|  |  | ||||||
| # generated sources # |  | ||||||
| ##################### |  | ||||||
| lib/qcd/spin/gamma-gen/*.h |  | ||||||
| lib/qcd/spin/gamma-gen/*.cc |  | ||||||
|  |  | ||||||
| # vs code editor files # |  | ||||||
| ######################## |  | ||||||
| .vscode/ |  | ||||||
| .vscode/settings.json |  | ||||||
| settings.json |  | ||||||
							
								
								
									
										75
									
								
								.travis.yml
									
									
									
									
									
								
							
							
						
						
									
										75
									
								
								.travis.yml
									
									
									
									
									
								
							| @@ -7,8 +7,64 @@ cache: | |||||||
| matrix: | matrix: | ||||||
|   include: |   include: | ||||||
|     - os:        osx |     - os:        osx | ||||||
|       osx_image: xcode8.3 |       osx_image: xcode7.2 | ||||||
|       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` | ||||||
| @@ -17,15 +73,13 @@ before_install: | |||||||
|     - if [[ "$TRAVIS_OS_NAME" == "linux" ]] && [[ "$CC" == "clang" ]]; then export LD_LIBRARY_PATH="${GRIDDIR}/clang/lib:${LD_LIBRARY_PATH}"; fi |     - if [[ "$TRAVIS_OS_NAME" == "linux" ]] && [[ "$CC" == "clang" ]]; then export LD_LIBRARY_PATH="${GRIDDIR}/clang/lib:${LD_LIBRARY_PATH}"; fi | ||||||
|     - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew update; fi |     - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew update; fi | ||||||
|     - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew install libmpc; fi |     - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew install libmpc; fi | ||||||
|  |     - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew install openmpi; fi | ||||||
|  |     - if [[ "$TRAVIS_OS_NAME" == "osx" ]] && [[ "$CC" == "gcc" ]]; then brew install gcc5; fi | ||||||
|      |      | ||||||
| install: | 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 | ||||||
| @@ -38,10 +92,15 @@ script: | |||||||
|     - cd build |     - cd build | ||||||
|     - ../configure --enable-precision=single --enable-simd=SSE4 --enable-comms=none |     - ../configure --enable-precision=single --enable-simd=SSE4 --enable-comms=none | ||||||
|     - make -j4  |     - make -j4  | ||||||
|     - ./benchmarks/Benchmark_dwf --threads 1 --debug-signals |     - ./benchmarks/Benchmark_dwf --threads 1 | ||||||
|     - echo make clean |     - echo make clean | ||||||
|     - ../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 | ||||||
|     - make check |     - echo make clean | ||||||
|  |     - if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then export CXXFLAGS='-DMPI_UINT32_T=MPI_UNSIGNED -DMPI_UINT64_T=MPI_UNSIGNED_LONG'; fi | ||||||
|  |     - ../configure --enable-precision=single --enable-simd=SSE4 --enable-comms=mpi-auto | ||||||
|  |     - make -j4 | ||||||
|  |     - if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then mpirun.openmpi -n 2 ./benchmarks/Benchmark_dwf --threads 1 --mpi 2.1.1.1; fi | ||||||
|  |     - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then mpirun -n 2 ./benchmarks/Benchmark_dwf --threads 1 --mpi 2.1.1.1; fi | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										13
									
								
								Makefile.am
									
									
									
									
									
								
							
							
						
						
									
										13
									
								
								Makefile.am
									
									
									
									
									
								
							| @@ -1,17 +1,12 @@ | |||||||
| # additional include paths necessary to compile the C++ library | # additional include paths necessary to compile the C++ library | ||||||
| SUBDIRS = lib benchmarks tests extras | SUBDIRS = lib benchmarks tests | ||||||
|  |  | ||||||
| include $(top_srcdir)/doxygen.inc | include $(top_srcdir)/doxygen.inc | ||||||
|  |  | ||||||
| bin_SCRIPTS=grid-config | tests: all | ||||||
|  | 	$(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,13 +1,41 @@ | |||||||
| # 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) | # 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 June 2017. | Last update Nov 2016. | ||||||
|  |  | ||||||
| _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 | ||||||
| @@ -30,68 +58,13 @@ 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, ARM NEON (128 bits) AVX, AVX2, QPX (256 bits), IMCI and AVX512 (512 bits) targets are supported. | Presently SSE4 (128 bit) AVX, AVX2, QPX (256 bit), IMCI, and AVX512 (512 bit) targets are supported (ARM NEON on the way). | ||||||
|  |  | ||||||
| These are presented as `vRealF`, `vRealD`, `vComplexF`, and `vComplexD` internal vector data types.  | These are presented as `vRealF`, `vRealD`, `vComplexF`, and `vComplexD` internal vector data types. These may be useful in themselves for other programmers. | ||||||
| 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 [this paper](https://arxiv.org/abs/1512.03487) for more detail. | Please see 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: | ||||||
| @@ -122,10 +95,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, check, and install Grid: | Finally, you can build and install Grid: | ||||||
|  |  | ||||||
| ``` bash | ``` bash | ||||||
| make; make check; make install | make; 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: | ||||||
| @@ -148,7 +121,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={sitmo|ranlux48|mt19937}`: choose the RNG (default: `sitmo `). | - `--enable-rng={ranlux48|mt19937}`: choose the RNG (default: `ranlux48 `). | ||||||
| - `--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`) | ||||||
| @@ -162,6 +135,7 @@ 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.   | ||||||
| @@ -179,13 +153,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                            | | ||||||
| | `NEONv8`    | [ARM NEON](http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.den0024a/ch07s03.html) (128 bit)                     | | | `QPX`       | QPX (256 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                            | | ||||||
|  |  | ||||||
| @@ -202,205 +176,21 @@ 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. |  | ||||||
|  |  | ||||||
| If you are working on a Cray machine that does not use the `mpiicpc` wrapper, please use: | 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 | ``` 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. |  | ||||||
|  |  | ||||||
							
								
								
									
										86
									
								
								TODO
									
									
									
									
									
								
							
							
						
						
									
										86
									
								
								TODO
									
									
									
									
									
								
							| @@ -1,51 +1,6 @@ | |||||||
| TODO: | TODO: | ||||||
| --------------- | --------------- | ||||||
|  |  | ||||||
| Code item work list |  | ||||||
|  |  | ||||||
| a) namespaces & indentation |  | ||||||
|  GRID_BEGIN_NAMESPACE(); |  | ||||||
|  GRID_END_NAMESPACE(); |  | ||||||
| -- delete QCD namespace |  | ||||||
|  |  | ||||||
| b) GPU branch |  | ||||||
| - 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? |  | ||||||
|  |  | ||||||
| Physics item work list: |  | ||||||
|  |  | ||||||
| 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 |  | ||||||
|  |  | ||||||
| ---------------------------- |  | ||||||
| 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 | ||||||
|   be. This is a consequence of taking ONLY the first term in: |   be. This is a consequence of taking ONLY the first term in: | ||||||
|  |  | ||||||
| @@ -66,8 +21,16 @@ Recent DONE | |||||||
|   This means we must double the force in the Test_xxx_force routines, and is the origin of the factor of two. |   This means we must double the force in the Test_xxx_force routines, and is the origin of the factor of two. | ||||||
|   This 2x is applied by hand in the fermion routines and in the Test_rect_force routine. |   This 2x is applied by hand in the fermion routines and in the Test_rect_force routine. | ||||||
|  |  | ||||||
|  |  | ||||||
|  | Policies: | ||||||
|  |  | ||||||
|  | * Link smearing/boundary conds; Policy class based implementation ; framework more in place | ||||||
|  |  | ||||||
| * Support different boundary conditions (finite temp, chem. potential ... ) | * Support different boundary conditions (finite temp, chem. potential ... ) | ||||||
|  |  | ||||||
|  | * Support different fermion representations?  | ||||||
|  |   - contained entirely within the integrator presently | ||||||
|  |  | ||||||
| - Sign of force term. | - Sign of force term. | ||||||
|  |  | ||||||
| - Reversibility test. | - Reversibility test. | ||||||
| @@ -78,6 +41,11 @@ Recent DONE | |||||||
|  |  | ||||||
| - Audit oIndex usage for cb behaviour | - Audit oIndex usage for cb behaviour | ||||||
|  |  | ||||||
|  | - Rectangle gauge actions. | ||||||
|  |   Iwasaki, | ||||||
|  |   Symanzik, | ||||||
|  |   ... etc... | ||||||
|  |  | ||||||
| - Prepare multigrid for HMC. - Alternate setup schemes. | - Prepare multigrid for HMC. - Alternate setup schemes. | ||||||
|  |  | ||||||
| - Support for ILDG --- ugly, not done | - Support for ILDG --- ugly, not done | ||||||
| @@ -87,11 +55,9 @@ Recent DONE | |||||||
| - FFTnD ? | - FFTnD ? | ||||||
|  |  | ||||||
| - Gparity; hand opt use template specialisation elegance to enable the optimised paths ? | - Gparity; hand opt use template specialisation elegance to enable the optimised paths ? | ||||||
|  |  | ||||||
| - Gparity force term; Gparity (R)HMC. | - Gparity force term; Gparity (R)HMC. | ||||||
|  | - Random number state save restore | ||||||
| - Mobius implementation clean up to rmove #if 0 stale code sequences | - Mobius implementation clean up to rmove #if 0 stale code sequences | ||||||
|  |  | ||||||
| - CG -- profile carefully, kernel fusion, whole CG performance measurements. | - CG -- profile carefully, kernel fusion, whole CG performance measurements. | ||||||
|  |  | ||||||
| ================================================================ | ================================================================ | ||||||
| @@ -124,7 +90,6 @@ Insert/Extract | |||||||
| Not sure of status of this -- reverify. Things are working nicely now though. | Not sure of status of this -- reverify. Things are working nicely now though. | ||||||
|  |  | ||||||
| * Make the Tensor types and Complex etc... play more nicely. | * Make the Tensor types and Complex etc... play more nicely. | ||||||
|  |  | ||||||
|   - TensorRemove is a hack, come up with a long term rationalised approach to Complex vs. Scalar<Scalar<Scalar<Complex > > > |   - TensorRemove is a hack, come up with a long term rationalised approach to Complex vs. Scalar<Scalar<Scalar<Complex > > > | ||||||
|     QDP forces use of "toDouble" to get back to non tensor scalar. This role is presently taken TensorRemove, but I |     QDP forces use of "toDouble" to get back to non tensor scalar. This role is presently taken TensorRemove, but I | ||||||
|     want to introduce a syntax that does not require this. |     want to introduce a syntax that does not require this. | ||||||
| @@ -147,8 +112,6 @@ Not sure of status of this -- reverify. Things are working nicely now though. | |||||||
| RECENT | RECENT | ||||||
| --------------- | --------------- | ||||||
|  |  | ||||||
|   - Support different fermion representations? -- DONE |  | ||||||
|   - contained entirely within the integrator presently |  | ||||||
|   - Clean up HMC                                                             -- DONE |   - Clean up HMC                                                             -- DONE | ||||||
|   - LorentzScalar<GaugeField> gets Gauge link type (cleaner).                -- DONE |   - LorentzScalar<GaugeField> gets Gauge link type (cleaner).                -- DONE | ||||||
|   - Simplified the integrators a bit.                                        -- DONE |   - Simplified the integrators a bit.                                        -- DONE | ||||||
| @@ -160,26 +123,6 @@ RECENT | |||||||
|   - Parallel io improvements                                  -- DONE |   - Parallel io improvements                                  -- DONE | ||||||
|   - Plaquette and link trace checks into nersc reader from the Grid_nersc_io.cc test. -- DONE |   - Plaquette and link trace checks into nersc reader from the Grid_nersc_io.cc test. -- DONE | ||||||
|  |  | ||||||
|  |  | ||||||
| DONE: |  | ||||||
| - MultiArray -- MultiRHS done |  | ||||||
| - ConjugateGradientMultiShift -- DONE |  | ||||||
| - MCR                         -- DONE |  | ||||||
| - Remez -- Mike or Boost?     -- DONE |  | ||||||
| - Proto (ET)                  -- DONE |  | ||||||
| - uBlas                       -- DONE ; Eigen |  | ||||||
| - Potentially Useful Boost libraries -- DONE ; Eigen |  | ||||||
| - Aligned allocator; memory pool -- DONE |  | ||||||
| - Multiprecision              -- DONE |  | ||||||
| - Serialization               -- DONE |  | ||||||
| - Regex -- Not needed |  | ||||||
| - Tokenize -- Why? |  | ||||||
|  |  | ||||||
| - Random number state save restore -- DONE |  | ||||||
| - Rectangle gauge actions. -- DONE |  | ||||||
|   Iwasaki, |  | ||||||
|   Symanzik, |  | ||||||
|   ... etc... |  | ||||||
| Done: Cayley, Partial , ContFrac force terms. | Done: Cayley, Partial , ContFrac force terms. | ||||||
|  |  | ||||||
| DONE | DONE | ||||||
| @@ -264,7 +207,6 @@ Done | |||||||
| FUNCTIONALITY: it pleases me to keep track of things I have done (keeps me arguably sane) | FUNCTIONALITY: it pleases me to keep track of things I have done (keeps me arguably sane) | ||||||
| ====================================================================================================== | ====================================================================================================== | ||||||
|  |  | ||||||
| * Link smearing/boundary conds; Policy class based implementation ; framework more in place -- DONE |  | ||||||
| * Command line args for geometry, simd, etc. layout. Is it necessary to have -- DONE | * Command line args for geometry, simd, etc. layout. Is it necessary to have -- DONE | ||||||
|   user pass these? Is this a QCD specific? |   user pass these? Is this a QCD specific? | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										9
									
								
								VERSION
									
									
									
									
									
								
							
							
						
						
									
										9
									
								
								VERSION
									
									
									
									
									
								
							| @@ -1,5 +1,6 @@ | |||||||
| Version : 0.7.0 | Version : 0.6.0 | ||||||
|  |  | ||||||
| - Clang 3.5 and above, ICPC v16 and above, GCC 6.3 and above recommended | - AVX512, AVX2, AVX, SSE good | ||||||
| - MPI and MPI3 comms optimisations for KNL and OPA finished | - Clang 3.5 and above, ICPC v16 and above, GCC 4.9 and above | ||||||
| - Half precision comms | - MPI and MPI3 | ||||||
|  | - HiRep, Smearing, Generic gauge group | ||||||
|   | |||||||
| @@ -1,800 +0,0 @@ | |||||||
|     /************************************************************************************* |  | ||||||
|  |  | ||||||
|     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,32 +31,6 @@ 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); | ||||||
| @@ -66,21 +40,17 @@ 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=100; |   int Nloop=10; | ||||||
|   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; | ||||||
|   header(); |   std::cout<<GridLogMessage << "  L  "<<"\t\t"<<" Ls  "<<"\t\t"<<"bytes"<<"\t\t"<<"MB/s uni"<<"\t\t"<<"MB/s bidi"<<std::endl; | ||||||
|   for(int lat=4;lat<=maxlat;lat+=4){ |   int maxlat=16; | ||||||
|     for(int Ls=8;Ls<=8;Ls*=2){ |   for(int lat=4;lat<=maxlat;lat+=2){ | ||||||
|  |     for(int Ls=1;Ls<=16;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], | ||||||
| @@ -88,25 +58,17 @@ 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<Vector<HalfSpinColourVectorD> > xbuf(8);	 |       std::vector<std::vector<HalfSpinColourVectorD> > xbuf(8,std::vector<HalfSpinColourVectorD>(lat*lat*lat*Ls)); | ||||||
|       std::vector<Vector<HalfSpinColourVectorD> > rbuf(8); |       std::vector<std::vector<HalfSpinColourVectorD> > rbuf(8,std::vector<HalfSpinColourVectorD>(lat*lat*lat*Ls)); | ||||||
|  |  | ||||||
|       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; |  | ||||||
|       } |  | ||||||
|  |  | ||||||
|       for(int i=0;i<Nloop;i++){ |  | ||||||
|       double start=usecond(); |       double start=usecond(); | ||||||
|  |       for(int i=0;i<Nloop;i++){ | ||||||
|  |  | ||||||
| 	std::vector<CommsRequest_t> requests; | 	std::vector<CartesianCommunicator::CommsRequest_t> requests; | ||||||
|  |  | ||||||
| 	ncomm=0; | 	ncomm=0; | ||||||
| 	for(int mu=0;mu<4;mu++){ | 	for(int mu=0;mu<4;mu++){ | ||||||
| @@ -117,6 +79,7 @@ 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], | ||||||
| @@ -139,24 +102,18 @@ 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(); | ||||||
|  |  | ||||||
|       timestat.statistics(t_time); |       double dbytes    = bytes; | ||||||
|  |       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; | ||||||
|  |  | ||||||
|       std::cout<<GridLogMessage << std::setw(4) << lat<<"\t"<<Ls<<"\t" |       double time = stop-start; // microseconds | ||||||
|                <<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; | ||||||
|     } |     } | ||||||
|   }     |   }     | ||||||
|  |  | ||||||
| @@ -164,32 +121,25 @@ 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; | ||||||
|   header(); |   std::cout<<GridLogMessage << "  L  "<<"\t\t"<<" Ls  "<<"\t\t"<<"bytes"<<"\t\t"<<"MB/s uni"<<"\t\t"<<"MB/s bidi"<<std::endl; | ||||||
|  |  | ||||||
|   for(int lat=4;lat<=maxlat;lat+=4){ |  | ||||||
|     for(int Ls=8;Ls<=8;Ls*=2){ |   for(int lat=4;lat<=maxlat;lat+=2){ | ||||||
|  |     for(int Ls=1;Ls<=16;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<Vector<HalfSpinColourVectorD> > xbuf(8); |       std::vector<std::vector<HalfSpinColourVectorD> > xbuf(8,std::vector<HalfSpinColourVectorD>(lat*lat*lat*Ls)); | ||||||
|       std::vector<Vector<HalfSpinColourVectorD> > rbuf(8); |       std::vector<std::vector<HalfSpinColourVectorD> > rbuf(8,std::vector<HalfSpinColourVectorD>(lat*lat*lat*Ls)); | ||||||
|  |  | ||||||
|       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); | ||||||
|  |  | ||||||
|       for(int i=0;i<Nloop;i++){ |  | ||||||
|       double start=usecond(); |       double start=usecond(); | ||||||
|  |       for(int i=0;i<Nloop;i++){ | ||||||
|      |      | ||||||
| 	ncomm=0; | 	ncomm=0; | ||||||
| 	for(int mu=0;mu<4;mu++){ | 	for(int mu=0;mu<4;mu++){ | ||||||
| @@ -202,7 +152,7 @@ int main (int argc, char ** argv) | |||||||
| 	    int recv_from_rank; | 	    int recv_from_rank; | ||||||
| 	     | 	     | ||||||
| 	    { | 	    { | ||||||
| 	      std::vector<CommsRequest_t> requests; | 	      std::vector<CartesianCommunicator::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], | ||||||
| @@ -215,7 +165,7 @@ int main (int argc, char ** argv) | |||||||
|  |  | ||||||
| 	    comm_proc = mpi_layout[mu]-1; | 	    comm_proc = mpi_layout[mu]-1; | ||||||
| 	    { | 	    { | ||||||
| 	      std::vector<CommsRequest_t> requests; | 	      std::vector<CartesianCommunicator::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], | ||||||
| @@ -228,37 +178,30 @@ int main (int argc, char ** argv) | |||||||
| 	  } | 	  } | ||||||
| 	} | 	} | ||||||
| 	Grid.Barrier(); | 	Grid.Barrier(); | ||||||
| 	double stop=usecond(); |  | ||||||
| 	t_time[i] = stop-start; // microseconds |  | ||||||
|  |  | ||||||
|       } |       } | ||||||
|  |  | ||||||
|       timestat.statistics(t_time); |       double stop=usecond(); | ||||||
|        |        | ||||||
|       double dbytes    = bytes*ppn; |       double dbytes    = bytes; | ||||||
|       double xbytes    = dbytes*2.0*ncomm; |       double xbytes    = Nloop*dbytes*2.0*ncomm; | ||||||
|       double rbytes    = xbytes; |       double rbytes    = xbytes; | ||||||
|       double bidibytes = xbytes+rbytes; |       double bidibytes = xbytes+rbytes; | ||||||
|  |  | ||||||
|     std::cout<<GridLogMessage << std::setw(4) << lat<<"\t"<<Ls<<"\t" |       double time = stop-start; | ||||||
|                <<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=100; | ||||||
|   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; | ||||||
|   header(); |   std::cout<<GridLogMessage << "  L  "<<"\t\t"<<" Ls  "<<"\t\t"<<"bytes"<<"\t\t"<<"MB/s uni"<<"\t\t"<<"MB/s bidi"<<std::endl; | ||||||
|  |  | ||||||
|   for(int lat=4;lat<=maxlat;lat+=4){ |   for(int lat=4;lat<=maxlat;lat+=2){ | ||||||
|     for(int Ls=8;Ls<=8;Ls*=2){ |     for(int Ls=1;Ls<=16;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], | ||||||
| @@ -266,9 +209,6 @@ 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); | ||||||
| @@ -276,115 +216,16 @@ 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(); |  | ||||||
|  |  | ||||||
| 	dbytes=0; | 	std::vector<CartesianCommunicator::CommsRequest_t> requests; | ||||||
| 	ncomm=0; |  | ||||||
|  |  | ||||||
| 	std::vector<CommsRequest_t> requests; |  | ||||||
|  |  | ||||||
| 	for(int mu=0;mu<4;mu++){ |  | ||||||
| 	 |  | ||||||
|  |  | ||||||
| 	  if (mpi_layout[mu]>1 ) { |  | ||||||
| 	   |  | ||||||
| 	    ncomm++; |  | ||||||
| 	    int comm_proc=1; |  | ||||||
| 	    int xmit_to_rank; |  | ||||||
| 	    int recv_from_rank; |  | ||||||
| 	    Grid.ShiftedRanks(mu,comm_proc,xmit_to_rank,recv_from_rank); |  | ||||||
| 	    dbytes+= |  | ||||||
| 	      Grid.StencilSendToRecvFromBegin(requests, |  | ||||||
| 					      (void *)&xbuf[mu][0], |  | ||||||
| 					      xmit_to_rank, |  | ||||||
| 					      (void *)&rbuf[mu][0], |  | ||||||
| 					      recv_from_rank, |  | ||||||
| 					      bytes,mu); |  | ||||||
| 	 |  | ||||||
| 	    comm_proc = mpi_layout[mu]-1; |  | ||||||
| 	   |  | ||||||
| 	    Grid.ShiftedRanks(mu,comm_proc,xmit_to_rank,recv_from_rank); |  | ||||||
| 	    dbytes+= |  | ||||||
| 	      Grid.StencilSendToRecvFromBegin(requests, |  | ||||||
| 					      (void *)&xbuf[mu+4][0], |  | ||||||
| 					      xmit_to_rank, |  | ||||||
| 					      (void *)&rbuf[mu+4][0], |  | ||||||
| 					      recv_from_rank, |  | ||||||
| 					      bytes,mu+4); |  | ||||||
| 	   |  | ||||||
| 	  } |  | ||||||
| 	} |  | ||||||
| 	Grid.StencilSendToRecvFromComplete(requests,0); |  | ||||||
| 	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 << "= Benchmarking sequential 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; | 	ncomm=0; | ||||||
| 	for(int mu=0;mu<4;mu++){ | 	for(int mu=0;mu<4;mu++){ | ||||||
| 	 | 	 | ||||||
| @@ -396,64 +237,52 @@ 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); | ||||||
| 	    dbytes+= | 	    Grid.StencilSendToRecvFromBegin(requests, | ||||||
| 	      Grid.StencilSendToRecvFromBegin(requests, | 					    (void *)&xbuf[mu][0], | ||||||
| 					      (void *)&xbuf[mu][0], | 					    xmit_to_rank, | ||||||
| 					      xmit_to_rank, | 					    (void *)&rbuf[mu][0], | ||||||
| 					      (void *)&rbuf[mu][0], | 					    recv_from_rank, | ||||||
| 					      recv_from_rank, | 					    bytes); | ||||||
| 					      bytes,mu); | 	 | ||||||
| 	    Grid.StencilSendToRecvFromComplete(requests,mu); |  | ||||||
| 	    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); | ||||||
| 	    dbytes+= | 	    Grid.StencilSendToRecvFromBegin(requests, | ||||||
| 	      Grid.StencilSendToRecvFromBegin(requests, | 					    (void *)&xbuf[mu+4][0], | ||||||
| 					      (void *)&xbuf[mu+4][0], | 					    xmit_to_rank, | ||||||
| 					      xmit_to_rank, | 					    (void *)&rbuf[mu+4][0], | ||||||
| 					      (void *)&rbuf[mu+4][0], | 					    recv_from_rank, | ||||||
| 					      recv_from_rank, | 					    bytes); | ||||||
| 					      bytes,mu+4); |  | ||||||
| 	    Grid.StencilSendToRecvFromComplete(requests,mu+4); |  | ||||||
| 	    requests.resize(0); |  | ||||||
| 	   | 	   | ||||||
| 	  } | 	  } | ||||||
| 	} | 	} | ||||||
|  | 	Grid.StencilSendToRecvFromComplete(requests); | ||||||
| 	Grid.Barrier(); | 	Grid.Barrier(); | ||||||
| 	double stop=usecond(); |  | ||||||
| 	t_time[i] = stop-start; // microseconds |  | ||||||
| 	 |  | ||||||
|       } |       } | ||||||
|  |       double stop=usecond(); | ||||||
|  |  | ||||||
|       timestat.statistics(t_time); |       double dbytes    = bytes; | ||||||
|  |       double xbytes    = Nloop*dbytes*2.0*ncomm; | ||||||
|  |       double rbytes    = xbytes; | ||||||
|  |       double bidibytes = xbytes+rbytes; | ||||||
|  |  | ||||||
|       dbytes=dbytes*ppn; |       double time = stop-start; // microseconds | ||||||
|       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; |  | ||||||
|   |  | ||||||
|     } |     } | ||||||
|   }     |   }     | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |   Nloop=100; | ||||||
|   std::cout<<GridLogMessage << "===================================================================================================="<<std::endl; |   std::cout<<GridLogMessage << "===================================================================================================="<<std::endl; | ||||||
|   std::cout<<GridLogMessage << "= Benchmarking threaded 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; | ||||||
|   header(); |   std::cout<<GridLogMessage << "  L  "<<"\t\t"<<" Ls  "<<"\t\t"<<"bytes"<<"\t\t"<<"MB/s uni"<<"\t\t"<<"MB/s bidi"<<std::endl; | ||||||
|  |  | ||||||
|   for(int lat=4;lat<=maxlat;lat+=4){ |   for(int lat=4;lat<=maxlat;lat+=2){ | ||||||
|     for(int Ls=8;Ls<=8;Ls*=2){ |     for(int Ls=1;Ls<=16;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], | ||||||
| @@ -461,9 +290,6 @@ 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); | ||||||
| @@ -471,71 +297,65 @@ 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<CommsRequest_t> requests; | 	std::vector<CartesianCommunicator::CommsRequest_t> requests; | ||||||
| 	dbytes=0; |  | ||||||
| 	ncomm=0; | 	ncomm=0; | ||||||
|  | 	for(int mu=0;mu<4;mu++){ | ||||||
| 	parallel_for(int dir=0;dir<8;dir++){ | 	 | ||||||
|  |  | ||||||
| 	  double tbytes; |  | ||||||
| 	  int mu =dir % 4; |  | ||||||
|  |  | ||||||
| 	  if (mpi_layout[mu]>1 ) { | 	  if (mpi_layout[mu]>1 ) { | ||||||
| 	   | 	   | ||||||
| 	    ncomm++; | 	    ncomm++; | ||||||
|  | 	    int comm_proc=1; | ||||||
| 	    int xmit_to_rank; | 	    int xmit_to_rank; | ||||||
| 	    int recv_from_rank; | 	    int recv_from_rank; | ||||||
| 	    if ( dir == mu ) {  | 	     | ||||||
| 	      int comm_proc=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, | ||||||
| 	    } else {  | 					    (void *)&xbuf[mu][0], | ||||||
| 	      int comm_proc = mpi_layout[mu]-1; | 					    xmit_to_rank, | ||||||
| 	      Grid.ShiftedRanks(mu,comm_proc,xmit_to_rank,recv_from_rank); | 					    (void *)&rbuf[mu][0], | ||||||
| 	    } | 					    recv_from_rank, | ||||||
|  | 					    bytes); | ||||||
|  | 	    //	    Grid.StencilSendToRecvFromComplete(requests); | ||||||
|  | 	    //	    requests.resize(0); | ||||||
|  |  | ||||||
| 	    tbytes= Grid.StencilSendToRecvFrom((void *)&xbuf[dir][0], xmit_to_rank, | 	    comm_proc = mpi_layout[mu]-1; | ||||||
| 					       (void *)&rbuf[dir][0], recv_from_rank, bytes,dir); | 	   | ||||||
|  | 	    Grid.ShiftedRanks(mu,comm_proc,xmit_to_rank,recv_from_rank); | ||||||
| #pragma omp atomic | 	    Grid.StencilSendToRecvFromBegin(requests, | ||||||
| 	    dbytes+=tbytes; | 					    (void *)&xbuf[mu+4][0], | ||||||
|  | 					    xmit_to_rank, | ||||||
|  | 					    (void *)&rbuf[mu+4][0], | ||||||
|  | 					    recv_from_rank, | ||||||
|  | 					    bytes); | ||||||
|  | 	    Grid.StencilSendToRecvFromComplete(requests); | ||||||
|  | 	    requests.resize(0); | ||||||
|  | 	   | ||||||
| 	  } | 	  } | ||||||
| 	} | 	} | ||||||
| 	Grid.Barrier(); | 	Grid.Barrier(); | ||||||
| 	double stop=usecond(); |  | ||||||
| 	t_time[i] = stop-start; // microseconds |  | ||||||
|       } |       } | ||||||
|  |       double stop=usecond(); | ||||||
|  |  | ||||||
|       timestat.statistics(t_time); |       double dbytes    = bytes; | ||||||
|  |       double xbytes    = Nloop*dbytes*2.0*ncomm; | ||||||
|  |       double rbytes    = xbytes; | ||||||
|  |       double bidibytes = xbytes+rbytes; | ||||||
|  |  | ||||||
|       dbytes=dbytes*ppn; |       double time = stop-start; // microseconds | ||||||
|       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 << "= All done; Bye Bye"<<std::endl; |  | ||||||
|   std::cout<<GridLogMessage << "===================================================================================================="<<std::endl; |  | ||||||
|  |  | ||||||
|   Grid_finalize(); |   Grid_finalize(); | ||||||
| } | } | ||||||
|   | |||||||
| @@ -1,22 +1,28 @@ | |||||||
|  /************************************************************************************* |     /************************************************************************************* | ||||||
|  |  | ||||||
|     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 */ | ||||||
| @@ -31,33 +37,27 @@ struct scal { | |||||||
|   d internal; |   d internal; | ||||||
| }; | }; | ||||||
|  |  | ||||||
|   Gamma::Algebra Gmu [] = { |   Gamma::GammaMatrix Gmu [] = { | ||||||
|     Gamma::Algebra::GammaX, |     Gamma::GammaX, | ||||||
|     Gamma::Algebra::GammaY, |     Gamma::GammaY, | ||||||
|     Gamma::Algebra::GammaZ, |     Gamma::GammaZ, | ||||||
|     Gamma::Algebra::GammaT |     Gamma::GammaT | ||||||
|   }; |   }; | ||||||
|  |  | ||||||
| typedef WilsonFermion5D<DomainWallVec5dImplR> WilsonFermion5DR; | typedef WilsonFermion5D<DomainWallVec5dImplR> WilsonFermion5DR; | ||||||
| typedef WilsonFermion5D<DomainWallVec5dImplF> WilsonFermion5DF; | typedef WilsonFermion5D<DomainWallVec5dImplF> WilsonFermion5DF; | ||||||
| typedef WilsonFermion5D<DomainWallVec5dImplD> WilsonFermion5DD; | typedef WilsonFermion5D<DomainWallVec5dImplD> WilsonFermion5DD; | ||||||
|  |  | ||||||
|  |  | ||||||
| int main (int argc, char ** argv) | int main (int argc, char ** argv) | ||||||
| { | { | ||||||
|   Grid_init(&argc,&argv); |   Grid_init(&argc,&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; | ||||||
|  |  | ||||||
|   std::vector<int> latt4 = GridDefaultLatt(); |   std::vector<int> latt4 = GridDefaultLatt(); | ||||||
|   int Ls=16; |   const int Ls=8; | ||||||
|   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); | ||||||
| @@ -71,66 +71,35 @@ int main (int argc, char ** argv) | |||||||
|  |  | ||||||
|   std::vector<int> seeds4({1,2,3,4}); |   std::vector<int> seeds4({1,2,3,4}); | ||||||
|   std::vector<int> seeds5({5,6,7,8}); |   std::vector<int> seeds5({5,6,7,8}); | ||||||
|    |  | ||||||
|   std::cout << GridLogMessage << "Initialising 4d RNG" << std::endl; |  | ||||||
|   GridParallelRNG          RNG4(UGrid);  RNG4.SeedFixedIntegers(seeds4); |   GridParallelRNG          RNG4(UGrid);  RNG4.SeedFixedIntegers(seeds4); | ||||||
|   std::cout << GridLogMessage << "Initialising 5d RNG" << std::endl; |  | ||||||
|   GridParallelRNG          RNG5(FGrid);  RNG5.SeedFixedIntegers(seeds5); |   GridParallelRNG          RNG5(FGrid);  RNG5.SeedFixedIntegers(seeds5); | ||||||
|   std::cout << GridLogMessage << "Initialised RNGs" << std::endl; |  | ||||||
|  |  | ||||||
|   LatticeFermion src   (FGrid); random(RNG5,src); |   LatticeFermion src   (FGrid); random(RNG5,src); | ||||||
| #if 0 |  | ||||||
|   src = zero; |  | ||||||
|   { |  | ||||||
|     std::vector<int> origin({0,0,0,latt4[2]-1,0}); |  | ||||||
|     SpinColourVectorF tmp; |  | ||||||
|     tmp=zero; |  | ||||||
|     tmp()(0)(0)=Complex(-2.0,0.0); |  | ||||||
|     std::cout << " source site 0 " << tmp<<std::endl; |  | ||||||
|     pokeSite(tmp,src,origin); |  | ||||||
|   } |  | ||||||
| #else |  | ||||||
|   RealD N2 = 1.0/::sqrt(norm2(src)); |  | ||||||
|   src = src*N2; |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
|  |  | ||||||
|   LatticeFermion result(FGrid); result=zero; |   LatticeFermion result(FGrid); result=zero; | ||||||
|   LatticeFermion    ref(FGrid);    ref=zero; |   LatticeFermion    ref(FGrid);    ref=zero; | ||||||
|   LatticeFermion    tmp(FGrid); |   LatticeFermion    tmp(FGrid); | ||||||
|   LatticeFermion    err(FGrid); |   LatticeFermion    err(FGrid); | ||||||
|  |  | ||||||
|   std::cout << GridLogMessage << "Drawing gauge field" << std::endl; |  | ||||||
|   LatticeGaugeField Umu(UGrid);  |   LatticeGaugeField Umu(UGrid);  | ||||||
|   SU3::HotConfiguration(RNG4,Umu);  |   random(RNG4,Umu); | ||||||
|   std::cout << GridLogMessage << "Random gauge initialised " << std::endl; |  | ||||||
| #if 0 |  | ||||||
|   Umu=1.0; |  | ||||||
|   for(int mu=0;mu<Nd;mu++){ |  | ||||||
|     LatticeColourMatrix ttmp(UGrid); |  | ||||||
|     ttmp = PeekIndex<LorentzIndex>(Umu,mu); |  | ||||||
|     //    if (mu !=2 ) ttmp = 0; |  | ||||||
|     //    ttmp = ttmp* pow(10.0,mu); |  | ||||||
|     PokeIndex<LorentzIndex>(Umu,ttmp,mu); |  | ||||||
|   } |  | ||||||
|   std::cout << GridLogMessage << "Forced to diagonal " << std::endl; |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
|   //////////////////////////////////// |  | ||||||
|   // Naive wilson implementation |  | ||||||
|   //////////////////////////////////// |  | ||||||
|   // replicate across fifth dimension |  | ||||||
|   LatticeGaugeField Umu5d(FGrid);  |   LatticeGaugeField Umu5d(FGrid);  | ||||||
|   std::vector<LatticeColourMatrix> U(4,FGrid); |  | ||||||
|  |   // replicate across fifth dimension | ||||||
|   for(int ss=0;ss<Umu._grid->oSites();ss++){ |   for(int ss=0;ss<Umu._grid->oSites();ss++){ | ||||||
|     for(int s=0;s<Ls;s++){ |     for(int s=0;s<Ls;s++){ | ||||||
|       Umu5d._odata[Ls*ss+s] = Umu._odata[ss]; |       Umu5d._odata[Ls*ss+s] = Umu._odata[ss]; | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  |   //////////////////////////////////// | ||||||
|  |   // Naive wilson implementation | ||||||
|  |   //////////////////////////////////// | ||||||
|  |   std::vector<LatticeColourMatrix> U(4,FGrid); | ||||||
|   for(int mu=0;mu<Nd;mu++){ |   for(int mu=0;mu<Nd;mu++){ | ||||||
|     U[mu] = PeekIndex<LorentzIndex>(Umu5d,mu); |     U[mu] = PeekIndex<LorentzIndex>(Umu5d,mu); | ||||||
|   } |   } | ||||||
|   std::cout << GridLogMessage << "Setting up Cshift based reference " << std::endl; |  | ||||||
|  |  | ||||||
|   if (1) |   if (1) | ||||||
|   { |   { | ||||||
| @@ -151,7 +120,8 @@ 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(); |  | ||||||
|  |   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; | ||||||
| @@ -161,22 +131,15 @@ 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; | ||||||
|  |  | ||||||
|   DomainWallFermionR Dw(Umu,*FGrid,*FrbGrid,*UGrid,*UrbGrid,mass,M5); |   int ncall =100; | ||||||
|   int ncall =500; |  | ||||||
|   if (1) { |   if (1) { | ||||||
|     FGrid->Barrier(); |     FGrid->Barrier(); | ||||||
|     Dw.ZeroCounters(); |     Dw.ZeroCounters(); | ||||||
|     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,55 +153,16 @@ int main (int argc, char ** argv) | |||||||
|     double flops=1344*volume*ncall; |     double flops=1344*volume*ncall; | ||||||
|  |  | ||||||
|     std::cout<<GridLogMessage << "Called Dw "<<ncall<<" times in "<<t1-t0<<" us"<<std::endl; |     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 result "<< norm2(result)<<std::endl; | ||||||
|     //    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; | ||||||
|  |  | ||||||
|     /* |  | ||||||
|     if(( norm2(err)>1.0e-4) ) {  |  | ||||||
|       std::cout << "RESULT\n " << result<<std::endl; |  | ||||||
|       std::cout << "REF   \n " << ref   <<std::endl; |  | ||||||
|       std::cout << "ERR   \n " << err   <<std::endl; |  | ||||||
|       FGrid->Barrier(); |  | ||||||
|       exit(-1); |  | ||||||
|     } |  | ||||||
|     */ |  | ||||||
|     assert (norm2(err)< 1.0e-4 ); |     assert (norm2(err)< 1.0e-4 ); | ||||||
|     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) | ||||||
|   { |   { | ||||||
|  |  | ||||||
| @@ -247,10 +171,6 @@ 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; | ||||||
| @@ -262,13 +182,21 @@ int main (int argc, char ** argv) | |||||||
|     LatticeFermion sresult(sFGrid); |     LatticeFermion sresult(sFGrid); | ||||||
|  |  | ||||||
|     WilsonFermion5DR sDw(Umu,*sFGrid,*sFrbGrid,*sUGrid,*sUrbGrid,M5); |     WilsonFermion5DR sDw(Umu,*sFGrid,*sFrbGrid,*sUGrid,*sUrbGrid,M5); | ||||||
|  |    | ||||||
|     localConvert(src,ssrc); |     for(int x=0;x<latt4[0];x++){ | ||||||
|  |     for(int y=0;y<latt4[1];y++){ | ||||||
|  |     for(int z=0;z<latt4[2];z++){ | ||||||
|  |     for(int t=0;t<latt4[3];t++){ | ||||||
|  |     for(int s=0;s<Ls;s++){ | ||||||
|  |       std::vector<int> site({s,x,y,z,t}); | ||||||
|  |       SpinColourVector tmp; | ||||||
|  |       peekSite(tmp,src,site); | ||||||
|  |       pokeSite(tmp,ssrc,site); | ||||||
|  |     }}}}} | ||||||
|     std::cout<<GridLogMessage<< "src norms "<< norm2(src)<<" " <<norm2(ssrc)<<std::endl; |     std::cout<<GridLogMessage<< "src norms "<< norm2(src)<<" " <<norm2(ssrc)<<std::endl; | ||||||
|     FGrid->Barrier(); |     FGrid->Barrier(); | ||||||
|     sDw.Dhop(ssrc,sresult,0); |  | ||||||
|     sDw.ZeroCounters(); |  | ||||||
|     double t0=usecond(); |     double t0=usecond(); | ||||||
|  |     sDw.ZeroCounters(); | ||||||
|     for(int i=0;i<ncall;i++){ |     for(int i=0;i<ncall;i++){ | ||||||
|       __SSC_START; |       __SSC_START; | ||||||
|       sDw.Dhop(ssrc,sresult,0); |       sDw.Dhop(ssrc,sresult,0); | ||||||
| @@ -282,53 +210,46 @@ 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; |  | ||||||
|     sDw.Report(); |     sDw.Report(); | ||||||
|  |    | ||||||
|  |     if(0){ | ||||||
|  |       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(); | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     std::cout<<GridLogMessage<< "res norms "<< norm2(result)<<" " <<norm2(sresult)<<std::endl; | ||||||
|  |  | ||||||
|     RealD sum=0; |     RealD sum=0; | ||||||
|  |     for(int x=0;x<latt4[0];x++){ | ||||||
|  |     for(int y=0;y<latt4[1];y++){ | ||||||
|  |     for(int z=0;z<latt4[2];z++){ | ||||||
|  |     for(int t=0;t<latt4[3];t++){ | ||||||
|  |     for(int s=0;s<Ls;s++){ | ||||||
|  |       std::vector<int> site({s,x,y,z,t}); | ||||||
|  |       SpinColourVector normal, simd; | ||||||
|  |       peekSite(normal,result,site); | ||||||
|  |       peekSite(simd,sresult,site); | ||||||
|  |       sum=sum+norm2(normal-simd); | ||||||
|  |       if (norm2(normal-simd) > 1.0e-6 ) { | ||||||
|  | 	std::cout << "site "<<x<<","<<y<<","<<z<<","<<t<<","<<s<<" "<<norm2(normal-simd)<<std::endl; | ||||||
|  | 	std::cout << "site "<<x<<","<<y<<","<<z<<","<<t<<","<<s<<" normal "<<normal<<std::endl; | ||||||
|  | 	std::cout << "site "<<x<<","<<y<<","<<z<<","<<t<<","<<s<<" simd   "<<simd<<std::endl; | ||||||
|  |       } | ||||||
|  |     }}}}} | ||||||
|  |     std::cout<<GridLogMessage<<" difference between normal and simd is "<<sum<<std::endl; | ||||||
|  |     assert (sum< 1.0e-4 ); | ||||||
|  |  | ||||||
|     err=zero; |  | ||||||
|     localConvert(sresult,err); |  | ||||||
|     err = err - ref; |  | ||||||
|     sum = norm2(err); |  | ||||||
|     std::cout<<GridLogMessage<<" difference between normal ref and simd is "<<sum<<std::endl; |  | ||||||
|     if(sum > 1.0e-4 ){ |  | ||||||
|       std::cout<< "sD REF\n " <<ref << std::endl; |  | ||||||
|       std::cout<< "sD ERR   \n " <<err  <<std::endl; |  | ||||||
|     } |  | ||||||
|     //    assert(sum < 1.0e-4); |  | ||||||
|  |  | ||||||
|     err=zero; |     if (1) { | ||||||
|     localConvert(sresult,err); |  | ||||||
|     err = err - result; |  | ||||||
|     sum = norm2(err); |  | ||||||
|     std::cout<<GridLogMessage<<" difference between normal result and simd is "<<sum<<std::endl; |  | ||||||
|     if(sum > 1.0e-4 ){ |  | ||||||
|       std::cout<< "sD REF\n " <<result << std::endl; |  | ||||||
|       std::cout<< "sD ERR   \n " << err  <<std::endl; |  | ||||||
|     } |  | ||||||
|     assert(sum < 1.0e-4); |  | ||||||
|  |  | ||||||
|      |  | ||||||
|     if(1){ |  | ||||||
|       std::cout << GridLogMessage<< "*********************************************************" <<std::endl; |  | ||||||
|       std::cout << GridLogMessage<< "* Benchmarking WilsonFermion5D<DomainWallVec5dImplR>::DhopEO "<<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)==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::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; |  | ||||||
|  |  | ||||||
|       LatticeFermion sr_eo(sFGrid); |       LatticeFermion sr_eo(sFGrid); | ||||||
|  |  | ||||||
|       LatticeFermion ssrc_e (sFrbGrid); |       LatticeFermion ssrc_e (sFrbGrid); | ||||||
|       LatticeFermion ssrc_o (sFrbGrid); |       LatticeFermion ssrc_o (sFrbGrid); | ||||||
|       LatticeFermion sr_e   (sFrbGrid); |       LatticeFermion sr_e   (sFrbGrid); | ||||||
| @@ -336,30 +257,39 @@ int main (int argc, char ** argv) | |||||||
|  |  | ||||||
|       pickCheckerboard(Even,ssrc_e,ssrc); |       pickCheckerboard(Even,ssrc_e,ssrc); | ||||||
|       pickCheckerboard(Odd,ssrc_o,ssrc); |       pickCheckerboard(Odd,ssrc_o,ssrc); | ||||||
|       //      setCheckerboard(sr_eo,ssrc_o); |  | ||||||
|       //      setCheckerboard(sr_eo,ssrc_e); |       setCheckerboard(sr_eo,ssrc_o); | ||||||
|  |       setCheckerboard(sr_eo,ssrc_e); | ||||||
|  |  | ||||||
|       sr_e = zero; |       sr_e = zero; | ||||||
|       sr_o = zero; |       sr_o = zero; | ||||||
|  |  | ||||||
|  |       std::cout << GridLogMessage<< "*********************************************************" <<std::endl; | ||||||
|  |       std::cout << GridLogMessage<< "* Benchmarking WilsonFermion5D<DomainWallVec5dImplR>::DhopEO "<<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)==8 )   std::cout << GridLogMessage<< "* DOUBLE precision "<<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; | ||||||
|  |       std::cout << GridLogMessage<< "*********************************************************" <<std::endl; | ||||||
|  |  | ||||||
|       FGrid->Barrier(); |       FGrid->Barrier(); | ||||||
|       sDw.DhopEO(ssrc_o, sr_e, DaggerNo); |  | ||||||
|       sDw.ZeroCounters(); |       sDw.ZeroCounters(); | ||||||
|       //      sDw.stat.init("DhopEO"); |       sDw.stat.init("DhopEO"); | ||||||
|       double t0=usecond(); |       double t0=usecond(); | ||||||
|       for (int i = 0; i < ncall; i++) { |       for (int i = 0; i < ncall; i++) { | ||||||
|         sDw.DhopEO(ssrc_o, sr_e, DaggerNo); |         sDw.DhopEO(ssrc_o, sr_e, DaggerNo); | ||||||
|       } |       } | ||||||
|       double t1=usecond(); |       double t1=usecond(); | ||||||
|       FGrid->Barrier(); |       FGrid->Barrier(); | ||||||
|       //      sDw.stat.print(); |       sDw.stat.print(); | ||||||
|  |  | ||||||
|       double volume=Ls;  for(int mu=0;mu<Nd;mu++) volume=volume*latt4[mu]; |       double volume=Ls;  for(int mu=0;mu<Nd;mu++) volume=volume*latt4[mu]; | ||||||
|       double flops=(1344.0*volume*ncall)/2; |       double flops=(1344.0*volume*ncall)/2; | ||||||
|  |  | ||||||
|       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); | ||||||
| @@ -368,75 +298,51 @@ int main (int argc, char ** argv) | |||||||
|  |  | ||||||
|       pickCheckerboard(Even,ssrc_e,sresult); |       pickCheckerboard(Even,ssrc_e,sresult); | ||||||
|       pickCheckerboard(Odd ,ssrc_o,sresult); |       pickCheckerboard(Odd ,ssrc_o,sresult); | ||||||
|  |  | ||||||
|       ssrc_e = ssrc_e - sr_e; |       ssrc_e = ssrc_e - sr_e; | ||||||
|       RealD error = norm2(ssrc_e); |       RealD error = norm2(ssrc_e); | ||||||
|       std::cout<<GridLogMessage << "sE norm diff   "<< norm2(ssrc_e)<< "  vec nrm"<<norm2(sr_e) <<std::endl; |  | ||||||
|  |  | ||||||
|  |       std::cout<<GridLogMessage << "sE norm diff   "<< norm2(ssrc_e)<< "  vec nrm"<<norm2(sr_e) <<std::endl; | ||||||
|       ssrc_o = ssrc_o - sr_o; |       ssrc_o = ssrc_o - sr_o; | ||||||
|  |  | ||||||
|       error+= norm2(ssrc_o); |       error+= norm2(ssrc_o); | ||||||
|       std::cout<<GridLogMessage << "sO norm diff   "<< norm2(ssrc_o)<< "  vec nrm"<<norm2(sr_o) <<std::endl; |       std::cout<<GridLogMessage << "sO norm diff   "<< norm2(ssrc_o)<< "  vec nrm"<<norm2(sr_o) <<std::endl; | ||||||
|  |       if(error>1.0e-4) {  | ||||||
|       if(( error>1.0e-4) ) {  |  | ||||||
| 	setCheckerboard(ssrc,ssrc_o); | 	setCheckerboard(ssrc,ssrc_o); | ||||||
| 	setCheckerboard(ssrc,ssrc_e); | 	setCheckerboard(ssrc,ssrc_e); | ||||||
| 	std::cout<< "DIFF\n " <<ssrc << std::endl; | 	std::cout<< ssrc << std::endl; | ||||||
| 	setCheckerboard(ssrc,sr_o); |  | ||||||
| 	setCheckerboard(ssrc,sr_e); |  | ||||||
| 	std::cout<< "CBRESULT\n " <<ssrc << std::endl; |  | ||||||
| 	std::cout<< "RESULT\n " <<sresult<< std::endl; |  | ||||||
|       } |       } | ||||||
|       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; | ||||||
|     for(int mu=0;mu<Nd;mu++){ |     for(int mu=0;mu<Nd;mu++){ | ||||||
|  |  | ||||||
|       //    ref =  src - Gamma(Gamma::Algebra::GammaX)* src ; // 1+gamma_x |       //    ref =  src - Gamma(Gamma::GammaX)* src ; // 1+gamma_x | ||||||
|       tmp = U[mu]*Cshift(src,mu+1,1); |       tmp = U[mu]*Cshift(src,mu+1,1); | ||||||
|       for(int i=0;i<ref._odata.size();i++){ |       for(int i=0;i<ref._odata.size();i++){ | ||||||
| 	ref._odata[i]+= tmp._odata[i] + Gamma(Gmu[mu])*tmp._odata[i]; ; |   ref._odata[i]+= tmp._odata[i] + Gamma(Gmu[mu])*tmp._odata[i]; ; | ||||||
|       } |       } | ||||||
|  |  | ||||||
|       tmp =adj(U[mu])*src; |       tmp =adj(U[mu])*src; | ||||||
|       tmp =Cshift(tmp,mu+1,-1); |       tmp =Cshift(tmp,mu+1,-1); | ||||||
|       for(int i=0;i<ref._odata.size();i++){ |       for(int i=0;i<ref._odata.size();i++){ | ||||||
| 	ref._odata[i]+= tmp._odata[i] - Gamma(Gmu[mu])*tmp._odata[i]; ; |   ref._odata[i]+= tmp._odata[i] - Gamma(Gmu[mu])*tmp._odata[i]; ; | ||||||
|       } |       } | ||||||
|     } |     } | ||||||
|     ref = -0.5*ref; |     ref = -0.5*ref; | ||||||
|   } |   } | ||||||
|   //  dump=1; |  | ||||||
|   Dw.Dhop(src,result,1); |   Dw.Dhop(src,result,1); | ||||||
|   std::cout << GridLogMessage << "Compare to naive wilson implementation Dag to verify correctness" << std::endl; |   std::cout << GridLogMessage << "Compare to naive wilson implementation Dag to verify correctness" << std::endl; | ||||||
|   std::cout<<GridLogMessage << "Called DwDag"<<std::endl; |   std::cout<<GridLogMessage << "Called DwDag"<<std::endl; | ||||||
|   std::cout<<GridLogMessage << "norm dag result "<< norm2(result)<<std::endl; |   std::cout<<GridLogMessage << "norm result "<< norm2(result)<<std::endl; | ||||||
|   std::cout<<GridLogMessage << "norm dag ref    "<< norm2(ref)<<std::endl; |   std::cout<<GridLogMessage << "norm ref    "<< norm2(ref)<<std::endl; | ||||||
|   err = ref-result;  |   err = ref-result;  | ||||||
|   std::cout<<GridLogMessage << "norm dag diff   "<< norm2(err)<<std::endl; |   std::cout<<GridLogMessage << "norm diff   "<< norm2(err)<<std::endl; | ||||||
|   if((norm2(err)>1.0e-4)){ |   assert(norm2(err)<1.0e-4); | ||||||
| 	std::cout<< "DAG RESULT\n "  <<ref     << std::endl; |  | ||||||
| 	std::cout<< "DAG sRESULT\n " <<result  << std::endl; |  | ||||||
| 	std::cout<< "DAG ERR   \n "  << err    <<std::endl; |  | ||||||
|   } |  | ||||||
|   LatticeFermion src_e (FrbGrid); |   LatticeFermion src_e (FrbGrid); | ||||||
|   LatticeFermion src_o (FrbGrid); |   LatticeFermion src_o (FrbGrid); | ||||||
|   LatticeFermion r_e   (FrbGrid); |   LatticeFermion r_e   (FrbGrid); | ||||||
| @@ -444,24 +350,18 @@ int main (int argc, char ** argv) | |||||||
|   LatticeFermion r_eo  (FGrid); |   LatticeFermion r_eo  (FGrid); | ||||||
|  |  | ||||||
|  |  | ||||||
|   std::cout<<GridLogMessage << "Calling Deo and Doe and //assert Deo+Doe == Dunprec"<<std::endl; |   std::cout<<GridLogMessage << "Calling Deo and Doe and assert Deo+Doe == Dunprec"<<std::endl; | ||||||
|   pickCheckerboard(Even,src_e,src); |   pickCheckerboard(Even,src_e,src); | ||||||
|   pickCheckerboard(Odd,src_o,src); |   pickCheckerboard(Odd,src_o,src); | ||||||
|  |  | ||||||
|   std::cout<<GridLogMessage << "src_e"<<norm2(src_e)<<std::endl; |   std::cout<<GridLogMessage << "src_e"<<norm2(src_e)<<std::endl; | ||||||
|   std::cout<<GridLogMessage << "src_o"<<norm2(src_o)<<std::endl; |   std::cout<<GridLogMessage << "src_o"<<norm2(src_o)<<std::endl; | ||||||
|  |  | ||||||
|  |  | ||||||
|   // S-direction is INNERMOST and takes no part in the parity. |  | ||||||
|   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; | ||||||
| @@ -469,7 +369,6 @@ int main (int argc, char ** argv) | |||||||
|   { |   { | ||||||
|     Dw.ZeroCounters(); |     Dw.ZeroCounters(); | ||||||
|     FGrid->Barrier(); |     FGrid->Barrier(); | ||||||
|     Dw.DhopEO(src_o,r_e,DaggerNo); |  | ||||||
|     double t0=usecond(); |     double t0=usecond(); | ||||||
|     for(int i=0;i<ncall;i++){ |     for(int i=0;i<ncall;i++){ | ||||||
|       Dw.DhopEO(src_o,r_e,DaggerNo); |       Dw.DhopEO(src_o,r_e,DaggerNo); | ||||||
| @@ -482,7 +381,6 @@ 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); | ||||||
| @@ -498,20 +396,14 @@ int main (int argc, char ** argv) | |||||||
|  |  | ||||||
|   err = r_eo-result;  |   err = r_eo-result;  | ||||||
|   std::cout<<GridLogMessage << "norm diff   "<< norm2(err)<<std::endl; |   std::cout<<GridLogMessage << "norm diff   "<< norm2(err)<<std::endl; | ||||||
|   if((norm2(err)>1.0e-4)){ |   assert(norm2(err)<1.0e-4); | ||||||
| 	std::cout<< "Deo RESULT\n " <<r_eo << std::endl; |  | ||||||
| 	std::cout<< "Deo REF\n " <<result  << std::endl; |  | ||||||
| 	std::cout<< "Deo ERR   \n " << err <<std::endl; |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   pickCheckerboard(Even,src_e,err); |   pickCheckerboard(Even,src_e,err); | ||||||
|   pickCheckerboard(Odd,src_o,err); |   pickCheckerboard(Odd,src_o,err); | ||||||
|   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(); |  | ||||||
|   exit(0); |  | ||||||
| } |  | ||||||
|  |  | ||||||
|  |   Grid_finalize(); | ||||||
|  | } | ||||||
|   | |||||||
| @@ -37,11 +37,11 @@ struct scal { | |||||||
|   d internal; |   d internal; | ||||||
| }; | }; | ||||||
|  |  | ||||||
|   Gamma::Algebra Gmu [] = { |   Gamma::GammaMatrix Gmu [] = { | ||||||
|     Gamma::Algebra::GammaX, |     Gamma::GammaX, | ||||||
|     Gamma::Algebra::GammaY, |     Gamma::GammaY, | ||||||
|     Gamma::Algebra::GammaZ, |     Gamma::GammaZ, | ||||||
|     Gamma::Algebra::GammaT |     Gamma::GammaT | ||||||
|   }; |   }; | ||||||
|  |  | ||||||
| void benchDw(std::vector<int> & L, int Ls, int threads, int report =0 ); | void benchDw(std::vector<int> & L, int Ls, int threads, int report =0 ); | ||||||
|   | |||||||
| @@ -1,190 +0,0 @@ | |||||||
| #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(); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| @@ -66,8 +66,7 @@ int main (int argc, char ** argv) | |||||||
|  |  | ||||||
|     Vec tsum; tsum = zero; |     Vec tsum; tsum = zero; | ||||||
|  |  | ||||||
|     GridParallelRNG          pRNG(&Grid);       |     GridParallelRNG          pRNG(&Grid);      pRNG.SeedRandomDevice(); | ||||||
|     pRNG.SeedFixedIntegers(std::vector<int>({56,17,89,101})); |  | ||||||
|  |  | ||||||
|     std::vector<double> stop(threads); |     std::vector<double> stop(threads); | ||||||
|     Vector<Vec> sum(threads); |     Vector<Vec> sum(threads); | ||||||
| @@ -78,7 +77,8 @@ int main (int argc, char ** argv) | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     double start=usecond(); |     double start=usecond(); | ||||||
|     parallel_for(int t=0;t<threads;t++){ | PARALLEL_FOR_LOOP | ||||||
|  |     for(int t=0;t<threads;t++){ | ||||||
|  |  | ||||||
|       sum[t] = x[t]._odata[0]; |       sum[t] = x[t]._odata[0]; | ||||||
|       for(int i=0;i<Nloop;i++){ |       for(int i=0;i<Nloop;i++){ | ||||||
|   | |||||||
| @@ -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=96; |   uint64_t lmax=44; | ||||||
| #define NLOOP (10*lmax*lmax*lmax*lmax/vol) | #define NLOOP (1*lmax*lmax*lmax*lmax/vol) | ||||||
|   for(int lat=8;lat<=lmax;lat+=8){ |   for(int lat=4;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]}); |       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]; |       int 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.SeedRandomDevice(); | ||||||
|  |  | ||||||
|       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.0*vol*Nvec*sizeof(Real); |       double bytes=3*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=8;lat<=lmax;lat+=8){ |   for(int lat=4;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]}); |       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]; |       int 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.SeedRandomDevice(); | ||||||
|  |  | ||||||
|       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.0*vol*Nvec*sizeof(Real); |       double bytes=3*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=8;lat<=lmax;lat+=8){ |   for(int lat=4;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]}); |       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]; |       int 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.SeedRandomDevice(); | ||||||
|  |  | ||||||
|       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.0*vol*Nvec*sizeof(Real); |       double bytes=2*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=8;lat<=lmax;lat+=8){ |   for(int lat=4;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]}); |       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]; |       int 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.SeedRandomDevice(); | ||||||
|       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=1.0*vol*Nvec*sizeof(Real); |       double bytes=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; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -113,36 +113,6 @@ int main (int argc, char ** argv) | |||||||
|     std::cout<<GridLogMessage << "Called " #A " "<< (t1-t0)/ncall<<" us"<<std::endl;\ |     std::cout<<GridLogMessage << "Called " #A " "<< (t1-t0)/ncall<<" us"<<std::endl;\ | ||||||
|     std::cout<<GridLogMessage << "******************"<<std::endl; |     std::cout<<GridLogMessage << "******************"<<std::endl; | ||||||
|  |  | ||||||
| #define BENCH_ZDW(A,in,out)			\ |  | ||||||
|     zDw.CayleyZeroCounters();			\ |  | ||||||
|     zDw. A (in,out);				\ |  | ||||||
|     FGrid->Barrier();				\ |  | ||||||
|     t0=usecond();				\ |  | ||||||
|     for(int i=0;i<ncall;i++){			\ |  | ||||||
|       zDw. A (in,out);				\ |  | ||||||
|     }						\ |  | ||||||
|     t1=usecond();				\ |  | ||||||
|     FGrid->Barrier();				\ |  | ||||||
|     zDw.CayleyReport();							\ |  | ||||||
|     std::cout<<GridLogMessage << "Called ZDw " #A " "<< (t1-t0)/ncall<<" us"<<std::endl;\ |  | ||||||
|     std::cout<<GridLogMessage << "******************"<<std::endl; |  | ||||||
|  |  | ||||||
| #define BENCH_DW_SSC(A,in,out)			\ |  | ||||||
|     Dw.CayleyZeroCounters();			\ |  | ||||||
|     Dw. A (in,out);				\ |  | ||||||
|     FGrid->Barrier();				\ |  | ||||||
|     t0=usecond();				\ |  | ||||||
|     for(int i=0;i<ncall;i++){			\ |  | ||||||
|       __SSC_START ;				\ |  | ||||||
|       Dw. A (in,out);				\ |  | ||||||
|       __SSC_STOP ;				\ |  | ||||||
|     }						\ |  | ||||||
|     t1=usecond();				\ |  | ||||||
|     FGrid->Barrier();				\ |  | ||||||
|     Dw.CayleyReport();					\ |  | ||||||
|     std::cout<<GridLogMessage << "Called " #A " "<< (t1-t0)/ncall<<" us"<<std::endl;\ |  | ||||||
|     std::cout<<GridLogMessage << "******************"<<std::endl; |  | ||||||
|  |  | ||||||
| #define BENCH_DW_MEO(A,in,out)			\ | #define BENCH_DW_MEO(A,in,out)			\ | ||||||
|     Dw.CayleyZeroCounters();			\ |     Dw.CayleyZeroCounters();			\ | ||||||
|     Dw. A (in,out,0);				\ |     Dw. A (in,out,0);				\ | ||||||
| @@ -178,15 +148,9 @@ int main (int argc, char ** argv) | |||||||
|     LatticeFermion sref(sFGrid); |     LatticeFermion sref(sFGrid); | ||||||
|     LatticeFermion result(sFGrid); |     LatticeFermion result(sFGrid); | ||||||
|  |  | ||||||
|  |  | ||||||
|     std::cout<<GridLogMessage << "Constructing Vec5D Dw "<<std::endl; |     std::cout<<GridLogMessage << "Constructing Vec5D Dw "<<std::endl; | ||||||
|     DomainWallFermionVec5dR Dw(Umu,*sFGrid,*sFrbGrid,*sUGrid,*sUrbGrid,mass,M5); |     DomainWallFermionVec5dR Dw(Umu,*sFGrid,*sFrbGrid,*sUGrid,*sUrbGrid,mass,M5); | ||||||
|  |  | ||||||
|     RealD b=1.5;// Scale factor b+c=2, b-c=1 |  | ||||||
|     RealD c=0.5; |  | ||||||
|     std::vector<ComplexD> gamma(Ls,std::complex<double>(1.0,0.0)); |  | ||||||
|     ZMobiusFermionVec5dR zDw(Umu,*sFGrid,*sFrbGrid,*sUGrid,*sUrbGrid,mass,M5,gamma,b,c); |  | ||||||
|  |  | ||||||
|     std::cout<<GridLogMessage << "Calling Dhop "<<std::endl; |     std::cout<<GridLogMessage << "Calling Dhop "<<std::endl; | ||||||
|     FGrid->Barrier(); |     FGrid->Barrier(); | ||||||
|  |  | ||||||
| @@ -209,13 +173,10 @@ int main (int argc, char ** argv) | |||||||
|  |  | ||||||
|     BENCH_DW_MEO(Dhop    ,src,result); |     BENCH_DW_MEO(Dhop    ,src,result); | ||||||
|     BENCH_DW_MEO(DhopEO  ,src_o,r_e); |     BENCH_DW_MEO(DhopEO  ,src_o,r_e); | ||||||
|     BENCH_DW_SSC(Meooe   ,src_o,r_e); |     BENCH_DW(Meooe   ,src_o,r_e); | ||||||
|     BENCH_DW(Mooee   ,src_o,r_o); |     BENCH_DW(Mooee   ,src_o,r_o); | ||||||
|     BENCH_DW(MooeeInv,src_o,r_o); |     BENCH_DW(MooeeInv,src_o,r_o); | ||||||
|  |  | ||||||
|     BENCH_ZDW(Mooee   ,src_o,r_o); |  | ||||||
|     BENCH_ZDW(MooeeInv,src_o,r_o); |  | ||||||
|  |  | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   Grid_finalize(); |   Grid_finalize(); | ||||||
|   | |||||||
| @@ -1,134 +0,0 @@ | |||||||
|     /************************************************************************************* |  | ||||||
|  |  | ||||||
|     Grid physics library, www.github.com/paboyle/Grid  |  | ||||||
|  |  | ||||||
|     Source file: ./benchmarks/Benchmark_staggered.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; |  | ||||||
|  |  | ||||||
| int main (int argc, char ** argv) |  | ||||||
| { |  | ||||||
|   Grid_init(&argc,&argv); |  | ||||||
|  |  | ||||||
|   std::vector<int> latt_size   = GridDefaultLatt(); |  | ||||||
|   std::vector<int> simd_layout = GridDefaultSimd(Nd,vComplex::Nsimd()); |  | ||||||
|   std::vector<int> mpi_layout  = GridDefaultMpi(); |  | ||||||
|   GridCartesian               Grid(latt_size,simd_layout,mpi_layout); |  | ||||||
|   GridRedBlackCartesian     RBGrid(&Grid); |  | ||||||
|  |  | ||||||
|   int threads = GridThread::GetThreads(); |  | ||||||
|   std::cout<<GridLogMessage << "Grid is setup to use "<<threads<<" threads"<<std::endl; |  | ||||||
|   std::cout<<GridLogMessage << "Grid floating point word size is REALF"<< sizeof(RealF)<<std::endl; |  | ||||||
|   std::cout<<GridLogMessage << "Grid floating point word size is REALD"<< sizeof(RealD)<<std::endl; |  | ||||||
|   std::cout<<GridLogMessage << "Grid floating point word size is REAL"<< sizeof(Real)<<std::endl; |  | ||||||
|  |  | ||||||
|   std::vector<int> seeds({1,2,3,4}); |  | ||||||
|   GridParallelRNG          pRNG(&Grid); |  | ||||||
|   pRNG.SeedFixedIntegers(seeds); |  | ||||||
|   //  pRNG.SeedFixedIntegers(std::vector<int>({45,12,81,9}); |  | ||||||
|  |  | ||||||
|   typedef typename ImprovedStaggeredFermionR::FermionField FermionField;  |  | ||||||
|   typename ImprovedStaggeredFermionR::ImplParams params;  |  | ||||||
|  |  | ||||||
|   FermionField src   (&Grid); random(pRNG,src); |  | ||||||
|   FermionField result(&Grid); result=zero; |  | ||||||
|   FermionField    ref(&Grid);    ref=zero; |  | ||||||
|   FermionField    tmp(&Grid);    tmp=zero; |  | ||||||
|   FermionField    err(&Grid);    tmp=zero; |  | ||||||
|   LatticeGaugeField Umu(&Grid); random(pRNG,Umu); |  | ||||||
|   std::vector<LatticeColourMatrix> U(4,&Grid); |  | ||||||
|  |  | ||||||
|   double volume=1; |  | ||||||
|   for(int mu=0;mu<Nd;mu++){ |  | ||||||
|     volume=volume*latt_size[mu]; |  | ||||||
|   }   |  | ||||||
|  |  | ||||||
|   // Only one non-zero (y) |  | ||||||
| #if 0 |  | ||||||
|   Umu=zero; |  | ||||||
|   Complex cone(1.0,0.0); |  | ||||||
|   for(int nn=0;nn<Nd;nn++){ |  | ||||||
|     random(pRNG,U[nn]); |  | ||||||
|     if(1) { |  | ||||||
|       if (nn!=2) { U[nn]=zero; std::cout<<GridLogMessage << "zeroing gauge field in dir "<<nn<<std::endl; } |  | ||||||
|       //      else       { U[nn]= cone;std::cout<<GridLogMessage << "unit gauge field in dir "<<nn<<std::endl; } |  | ||||||
|       else       { std::cout<<GridLogMessage << "random gauge field in dir "<<nn<<std::endl; } |  | ||||||
|     } |  | ||||||
|     PokeIndex<LorentzIndex>(Umu,U[nn],nn); |  | ||||||
|   } |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
|   for(int mu=0;mu<Nd;mu++){ |  | ||||||
|     U[mu] = PeekIndex<LorentzIndex>(Umu,mu); |  | ||||||
|   } |  | ||||||
|   ref = zero; |  | ||||||
|   /*   |  | ||||||
|   { // Naive wilson implementation |  | ||||||
|     ref = zero; |  | ||||||
|     for(int mu=0;mu<Nd;mu++){ |  | ||||||
|       //    ref =  src + Gamma(Gamma::GammaX)* src ; // 1-gamma_x |  | ||||||
|       tmp = U[mu]*Cshift(src,mu,1); |  | ||||||
|       for(int i=0;i<ref._odata.size();i++){ |  | ||||||
| 	ref._odata[i]+= tmp._odata[i] - Gamma(Gmu[mu])*tmp._odata[i]; ; |  | ||||||
|       } |  | ||||||
|  |  | ||||||
|       tmp =adj(U[mu])*src; |  | ||||||
|       tmp =Cshift(tmp,mu,-1); |  | ||||||
|       for(int i=0;i<ref._odata.size();i++){ |  | ||||||
| 	ref._odata[i]+= tmp._odata[i] + Gamma(Gmu[mu])*tmp._odata[i]; ; |  | ||||||
|       } |  | ||||||
|     } |  | ||||||
|   } |  | ||||||
|   ref = -0.5*ref; |  | ||||||
|   */ |  | ||||||
|  |  | ||||||
|   RealD mass=0.1; |  | ||||||
|   RealD c1=9.0/8.0; |  | ||||||
|   RealD c2=-1.0/24.0; |  | ||||||
|   RealD u0=1.0; |  | ||||||
|   ImprovedStaggeredFermionR Ds(Umu,Umu,Grid,RBGrid,mass,c1,c2,u0,params); |  | ||||||
|    |  | ||||||
|   std::cout<<GridLogMessage << "Calling Ds"<<std::endl; |  | ||||||
|   int ncall=1000; |  | ||||||
|   double t0=usecond(); |  | ||||||
|   for(int i=0;i<ncall;i++){ |  | ||||||
|     Ds.Dhop(src,result,0); |  | ||||||
|   } |  | ||||||
|   double t1=usecond(); |  | ||||||
|   double flops=(16*(3*(6+8+8)) + 15*3*2)*volume*ncall; // == 66*16 +  == 1146 |  | ||||||
|    |  | ||||||
|   std::cout<<GridLogMessage << "Called Ds"<<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; |  | ||||||
|   err = ref-result;  |  | ||||||
|   std::cout<<GridLogMessage << "norm diff   "<< norm2(err)<<std::endl; |  | ||||||
|  |  | ||||||
|   Grid_finalize(); |  | ||||||
| } |  | ||||||
| @@ -35,14 +35,13 @@ 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) |  | ||||||
|  |  | ||||||
|   int64_t Nloop=20; |   int Nloop=1000; | ||||||
|  |  | ||||||
|   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(); | ||||||
|  |  | ||||||
|   int64_t 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; | ||||||
|  |  | ||||||
|   std::cout<<GridLogMessage << "===================================================================================================="<<std::endl; |   std::cout<<GridLogMessage << "===================================================================================================="<<std::endl; | ||||||
| @@ -51,19 +50,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<=LMAX;lat+=2){ |   for(int lat=2;lat<=32;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]}); | ||||||
|       int64_t vol = latt_size[0]*latt_size[1]*latt_size[2]*latt_size[3]; |       int 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.SeedRandomDevice(); | ||||||
|  |  | ||||||
|       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(int64_t i=0;i<Nloop;i++){ |       for(int i=0;i<Nloop;i++){ | ||||||
| 	x=x*y; | 	x=x*y; | ||||||
|       } |       } | ||||||
|       double stop=usecond(); |       double stop=usecond(); | ||||||
| @@ -83,20 +82,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<=LMAX;lat+=2){ |   for(int lat=2;lat<=32;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]}); | ||||||
|       int64_t vol = latt_size[0]*latt_size[1]*latt_size[2]*latt_size[3]; |       int 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.SeedRandomDevice(); | ||||||
|  |  | ||||||
|       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(int64_t i=0;i<Nloop;i++){ |       for(int i=0;i<Nloop;i++){ | ||||||
| 	z=x*y; | 	z=x*y; | ||||||
|       } |       } | ||||||
|       double stop=usecond(); |       double stop=usecond(); | ||||||
| @@ -114,20 +113,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<=LMAX;lat+=2){ |   for(int lat=2;lat<=32;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]}); | ||||||
|       int64_t vol = latt_size[0]*latt_size[1]*latt_size[2]*latt_size[3]; |       int 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.SeedRandomDevice(); | ||||||
|  |  | ||||||
|       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(int64_t i=0;i<Nloop;i++){ |       for(int i=0;i<Nloop;i++){ | ||||||
| 	mult(z,x,y); | 	mult(z,x,y); | ||||||
|       } |       } | ||||||
|       double stop=usecond(); |       double stop=usecond(); | ||||||
| @@ -145,20 +144,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<=LMAX;lat+=2){ |   for(int lat=2;lat<=32;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]}); | ||||||
|       int64_t vol = latt_size[0]*latt_size[1]*latt_size[2]*latt_size[3]; |       int 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.SeedRandomDevice(); | ||||||
|  |  | ||||||
|       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(int64_t i=0;i<Nloop;i++){ |       for(int i=0;i<Nloop;i++){ | ||||||
| 	mac(z,x,y); | 	mac(z,x,y); | ||||||
|       } |       } | ||||||
|       double stop=usecond(); |       double stop=usecond(); | ||||||
|   | |||||||
| @@ -37,11 +37,11 @@ struct scal { | |||||||
|   d internal; |   d internal; | ||||||
| }; | }; | ||||||
|  |  | ||||||
|   Gamma::Algebra Gmu [] = { |   Gamma::GammaMatrix Gmu [] = { | ||||||
|     Gamma::Algebra::GammaX, |     Gamma::GammaX, | ||||||
|     Gamma::Algebra::GammaY, |     Gamma::GammaY, | ||||||
|     Gamma::Algebra::GammaZ, |     Gamma::GammaZ, | ||||||
|     Gamma::Algebra::GammaT |     Gamma::GammaT | ||||||
|   }; |   }; | ||||||
|  |  | ||||||
| bool overlapComms = false; | bool overlapComms = false; | ||||||
| @@ -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(&Grid); |   GridRedBlackCartesian     RBGrid(latt_size,simd_layout,mpi_layout); | ||||||
|  |  | ||||||
|   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; | ||||||
| @@ -69,7 +69,7 @@ int main (int argc, char ** argv) | |||||||
|   std::vector<int> seeds({1,2,3,4}); |   std::vector<int> seeds({1,2,3,4}); | ||||||
|   GridParallelRNG          pRNG(&Grid); |   GridParallelRNG          pRNG(&Grid); | ||||||
|   pRNG.SeedFixedIntegers(seeds); |   pRNG.SeedFixedIntegers(seeds); | ||||||
|   //  pRNG.SeedFixedIntegers(std::vector<int>({45,12,81,9}); |   //  pRNG.SeedRandomDevice(); | ||||||
|  |  | ||||||
|   LatticeFermion src   (&Grid); random(pRNG,src); |   LatticeFermion src   (&Grid); random(pRNG,src); | ||||||
|   LatticeFermion result(&Grid); result=zero; |   LatticeFermion result(&Grid); result=zero; | ||||||
| @@ -106,7 +106,7 @@ int main (int argc, char ** argv) | |||||||
|   { // Naive wilson implementation |   { // Naive wilson implementation | ||||||
|     ref = zero; |     ref = zero; | ||||||
|     for(int mu=0;mu<Nd;mu++){ |     for(int mu=0;mu<Nd;mu++){ | ||||||
|       //    ref =  src + Gamma(Gamma::Algebra::GammaX)* src ; // 1-gamma_x |       //    ref =  src + Gamma(Gamma::GammaX)* src ; // 1-gamma_x | ||||||
|       tmp = U[mu]*Cshift(src,mu,1); |       tmp = U[mu]*Cshift(src,mu,1); | ||||||
|       for(int i=0;i<ref._odata.size();i++){ |       for(int i=0;i<ref._odata.size();i++){ | ||||||
| 	ref._odata[i]+= tmp._odata[i] - Gamma(Gmu[mu])*tmp._odata[i]; ; | 	ref._odata[i]+= tmp._odata[i] - Gamma(Gmu[mu])*tmp._odata[i]; ; | ||||||
| @@ -159,7 +159,7 @@ int main (int argc, char ** argv) | |||||||
|     ref = zero; |     ref = zero; | ||||||
|     for(int mu=0;mu<Nd;mu++){ |     for(int mu=0;mu<Nd;mu++){ | ||||||
|  |  | ||||||
|       //    ref =  src - Gamma(Gamma::Algebra::GammaX)* src ; // 1+gamma_x |       //    ref =  src - Gamma(Gamma::GammaX)* src ; // 1+gamma_x | ||||||
|       tmp = U[mu]*Cshift(src,mu,1); |       tmp = U[mu]*Cshift(src,mu,1); | ||||||
|       for(int i=0;i<ref._odata.size();i++){ |       for(int i=0;i<ref._odata.size();i++){ | ||||||
| 	ref._odata[i]+= tmp._odata[i] + Gamma(Gmu[mu])*tmp._odata[i]; ; | 	ref._odata[i]+= tmp._odata[i] + Gamma(Gmu[mu])*tmp._odata[i]; ; | ||||||
|   | |||||||
| @@ -30,11 +30,11 @@ struct scal { | |||||||
|   d internal; |   d internal; | ||||||
| }; | }; | ||||||
|  |  | ||||||
| Gamma::Algebra Gmu [] = { | Gamma::GammaMatrix Gmu [] = { | ||||||
|     Gamma::Algebra::GammaX, |   Gamma::GammaX, | ||||||
|     Gamma::Algebra::GammaY, |   Gamma::GammaY, | ||||||
|     Gamma::Algebra::GammaZ, |   Gamma::GammaZ, | ||||||
|     Gamma::Algebra::GammaT |   Gamma::GammaT | ||||||
| }; | }; | ||||||
|  |  | ||||||
| bool overlapComms = false; | bool overlapComms = false; | ||||||
| @@ -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(&Grid); | 	  GridRedBlackCartesian RBGrid(latt_size,simd_layout,mpi_layout); | ||||||
|  |  | ||||||
| 	  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,7 +1,11 @@ | |||||||
| include Make.inc | include Make.inc | ||||||
|  |  | ||||||
| bench-local: all | simple: simple_su3_test.o simple_su3_expr.o simple_simd_test.o | ||||||
| 	./Benchmark_su3 |  | ||||||
| 	./Benchmark_memory_bandwidth | EXTRA_LIBRARIES = libsimple_su3_test.a libsimple_su3_expr.a libsimple_simd_test.a | ||||||
| 	./Benchmark_wilson |  | ||||||
| 	./Benchmark_dwf --dslash-unroll | libsimple_su3_test_a_SOURCES = simple_su3_test.cc | ||||||
|  |  | ||||||
|  | libsimple_su3_expr_a_SOURCES = simple_su3_expr.cc | ||||||
|  |  | ||||||
|  | libsimple_simd_test_a_SOURCES = simple_simd_test.cc | ||||||
|   | |||||||
| @@ -1,9 +1,11 @@ | |||||||
| #!/usr/bin/env bash | #!/usr/bin/env bash | ||||||
|  |  | ||||||
| EIGEN_URL='http://bitbucket.org/eigen/eigen/get/3.3.3.tar.bz2' | EIGEN_URL='http://bitbucket.org/eigen/eigen/get/3.2.9.tar.bz2' | ||||||
|  |  | ||||||
| echo "-- deploying Eigen source..." | echo "-- deploying Eigen source..." | ||||||
| wget ${EIGEN_URL} --no-check-certificate && ./scripts/update_eigen.sh `basename ${EIGEN_URL}` && rm `basename ${EIGEN_URL}` | wget ${EIGEN_URL} --no-check-certificate | ||||||
|  | ./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 | ||||||
|   | |||||||
							
								
								
									
										240
									
								
								configure.ac
									
									
									
									
									
								
							
							
						
						
									
										240
									
								
								configure.ac
									
									
									
									
									
								
							| @@ -1,23 +1,16 @@ | |||||||
| AC_PREREQ([2.63]) | AC_PREREQ([2.63]) | ||||||
| AC_INIT([Grid], [0.7.0], [https://github.com/paboyle/Grid], [Grid]) | AC_INIT([Grid], [0.6.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 1.13]) | AM_INIT_AUTOMAKE(subdir-objects) | ||||||
| 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]) | ||||||
| m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])]) | m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])]) | ||||||
|  |  | ||||||
| ################ Get git info |  | ||||||
| #AC_REVISION([m4_esyscmd_s([./scripts/configure.commit])]) |  | ||||||
|  |  | ||||||
| ################ Set flags |  | ||||||
| # do not move! |  | ||||||
| CXXFLAGS="-O3 $CXXFLAGS" |  | ||||||
|  |  | ||||||
| ############### Checks for programs | ############### Checks for programs | ||||||
|  | CXXFLAGS="-O3 $CXXFLAGS" | ||||||
| AC_PROG_CXX | AC_PROG_CXX | ||||||
| AC_PROG_RANLIB | AC_PROG_RANLIB | ||||||
|  |  | ||||||
| @@ -31,14 +24,12 @@ 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 | ||||||
| @@ -54,14 +45,9 @@ 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], | ||||||
| @@ -74,23 +60,16 @@ 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"]) | ||||||
|  |  | ||||||
| ############### LIME | ############### lapack  | ||||||
| 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 | ||||||
| @@ -104,18 +83,6 @@ case ${ac_LAPACK} in | |||||||
|         AC_DEFINE([USE_LAPACK],[1],[use LAPACK]);; |         AC_DEFINE([USE_LAPACK],[1],[use LAPACK]);; | ||||||
| esac | esac | ||||||
|  |  | ||||||
| ############### FP16 conversions |  | ||||||
| AC_ARG_ENABLE([sfw-fp16], |  | ||||||
|     [AC_HELP_STRING([--enable-sfw-fp16=yes|no], [enable software fp16 comms])], |  | ||||||
|     [ac_SFW_FP16=${enable_sfw_fp16}], [ac_SFW_FP16=yes]) |  | ||||||
| case ${ac_SFW_FP16} in |  | ||||||
|     yes) |  | ||||||
|       AC_DEFINE([SFW_FP16],[1],[software conversion to fp16]);; |  | ||||||
|     no);; |  | ||||||
|     *) |  | ||||||
|       AC_MSG_ERROR(["SFW FP16 option not supported ${ac_SFW_FP16}"]);; |  | ||||||
| esac |  | ||||||
|  |  | ||||||
| ############### MKL | ############### MKL | ||||||
| AC_ARG_ENABLE([mkl], | AC_ARG_ENABLE([mkl], | ||||||
|     [AC_HELP_STRING([--enable-mkl=yes|no|prefix], [enable Intel MKL for LAPACK & FFTW])], |     [AC_HELP_STRING([--enable-mkl=yes|no|prefix], [enable Intel MKL for LAPACK & FFTW])], | ||||||
| @@ -132,16 +99,9 @@ case ${ac_MKL} in | |||||||
|         AC_DEFINE([USE_MKL], [1], [Define to 1 if you use the Intel MKL]);; |         AC_DEFINE([USE_MKL], [1], [Define to 1 if you use the Intel MKL]);; | ||||||
| esac | esac | ||||||
|  |  | ||||||
| ############### HDF5 |  | ||||||
| AC_ARG_WITH([hdf5], |  | ||||||
|     [AS_HELP_STRING([--with-hdf5=prefix], |  | ||||||
|     [try this for a non-standard install prefix of the HDF5 library])], |  | ||||||
|     [AM_CXXFLAGS="-I$with_hdf5/include $AM_CXXFLAGS"] |  | ||||||
|     [AM_LDFLAGS="-L$with_hdf5/lib $AM_LDFLAGS"]) |  | ||||||
|  |  | ||||||
| ############### 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 | ||||||
| @@ -167,8 +127,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])] | ||||||
| @@ -177,7 +137,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], [], | ||||||
| @@ -185,29 +145,6 @@ 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_DEFINE([HAVE_HDF5], [1], [Define to 1 if you have the `HDF5' library])] |  | ||||||
|                [have_hdf5=true] |  | ||||||
|                [LIBS="${LIBS} -lhdf5"], [], [-lhdf5]) |  | ||||||
| AM_CONDITIONAL(BUILD_HDF5, [ test "${have_hdf5}X" == "trueX" ]) |  | ||||||
|  |  | ||||||
| CXXFLAGS=$CXXFLAGS_CPY | CXXFLAGS=$CXXFLAGS_CPY | ||||||
| LDFLAGS=$LDFLAGS_CPY | LDFLAGS=$LDFLAGS_CPY | ||||||
|  |  | ||||||
| @@ -226,26 +163,19 @@ 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]) | ||||||
| 	case ${ac_SFW_FP16} in |         SIMD_FLAGS='-msse4.2';; | ||||||
| 	  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';; | ||||||
|       AVXFMA4) |       AVXFMA4) | ||||||
|         AC_DEFINE([AVXFMA4],[1],[AVX intrinsics with FMA4]) |         AC_DEFINE([AVXFMA4],[1],[AVX intrinsics with FMA4]) | ||||||
|         SIMD_FLAGS='-mavx -mfma4 -mf16c';; |         SIMD_FLAGS='-mavx -mfma4';; | ||||||
|       AVXFMA) |       AVXFMA) | ||||||
|         AC_DEFINE([AVXFMA],[1],[AVX intrinsics with FMA3]) |         AC_DEFINE([AVXFMA],[1],[AVX intrinsics with FMA3]) | ||||||
|         SIMD_FLAGS='-mavx -mfma -mf16c';; |         SIMD_FLAGS='-mavx -mfma';; | ||||||
|       AVX2) |       AVX2) | ||||||
|         AC_DEFINE([AVX2],[1],[AVX2 intrinsics]) |         AC_DEFINE([AVX2],[1],[AVX2 intrinsics]) | ||||||
|         SIMD_FLAGS='-mavx2 -mfma -mf16c';; |         SIMD_FLAGS='-mavx2 -mfma';; | ||||||
|       AVX512) |       AVX512) | ||||||
|         AC_DEFINE([AVX512],[1],[AVX512 intrinsics]) |         AC_DEFINE([AVX512],[1],[AVX512 intrinsics]) | ||||||
|         SIMD_FLAGS='-mavx512f -mavx512pf -mavx512er -mavx512cd';; |         SIMD_FLAGS='-mavx512f -mavx512pf -mavx512er -mavx512cd';; | ||||||
| @@ -254,7 +184,6 @@ 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]) | ||||||
| @@ -262,9 +191,6 @@ 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='';; | ||||||
| @@ -293,7 +219,6 @@ 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]) | ||||||
| @@ -331,39 +256,10 @@ 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], | AC_ARG_ENABLE([comms],[AC_HELP_STRING([--enable-comms=none|mpi|mpi-auto|mpi3|mpi3-auto|shmem], | ||||||
|               [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 | ||||||
| @@ -371,12 +267,24 @@ 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' | ||||||
|      ;; |      ;; | ||||||
|      mpi*) |      mpi3l*) | ||||||
|  |        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 | ||||||
| @@ -394,13 +302,13 @@ 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_MPIT,  [ test "${comms_type}X" == "mpitX" ] ) | AM_CONDITIONAL(BUILD_COMMS_MPI3L, [ test "${comms_type}X" == "mpi3lX" ] ) | ||||||
| AM_CONDITIONAL(BUILD_COMMS_NONE,  [ test "${comms_type}X" == "noneX" ]) | AM_CONDITIONAL(BUILD_COMMS_NONE,  [ test "${comms_type}X" == "noneX" ]) | ||||||
|  |  | ||||||
| ############### RNG selection | ############### RNG selection | ||||||
| AC_ARG_ENABLE([rng],[AC_HELP_STRING([--enable-rng=ranlux48|mt19937|sitmo],\ | AC_ARG_ENABLE([rng],[AC_HELP_STRING([--enable-rng=ranlux48|mt19937],\ | ||||||
| 	            [Select Random Number Generator to be used])],\ | 	            [Select Random Number Generator to be used])],\ | ||||||
| 	            [ac_RNG=${enable_rng}],[ac_RNG=sitmo]) | 	            [ac_RNG=${enable_rng}],[ac_RNG=ranlux48]) | ||||||
|  |  | ||||||
| case ${ac_RNG} in | case ${ac_RNG} in | ||||||
|      ranlux48) |      ranlux48) | ||||||
| @@ -409,11 +317,8 @@ case ${ac_RNG} in | |||||||
|      mt19937) |      mt19937) | ||||||
|       AC_DEFINE([RNG_MT19937],[1],[RNG_MT19937] ) |       AC_DEFINE([RNG_MT19937],[1],[RNG_MT19937] ) | ||||||
|      ;; |      ;; | ||||||
|      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 | ||||||
|  |  | ||||||
| @@ -430,7 +335,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 | ||||||
|  |  | ||||||
| @@ -442,7 +347,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 | ||||||
|  |  | ||||||
| @@ -463,31 +368,29 @@ 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_CONFIG_FILES(Makefile) | ||||||
| AC_SUBST([GRID_LDFLAGS]) | AC_CONFIG_FILES(lib/Makefile) | ||||||
| AC_SUBST([GRID_LIBS]) | AC_CONFIG_FILES(tests/Makefile) | ||||||
| AC_SUBST([GRID_SHA]) | AC_CONFIG_FILES(tests/IO/Makefile) | ||||||
| AC_SUBST([GRID_BRANCH]) | AC_CONFIG_FILES(tests/core/Makefile) | ||||||
|  | AC_CONFIG_FILES(tests/debug/Makefile) | ||||||
| git_commit=`cd $srcdir && ./scripts/configure.commit` | AC_CONFIG_FILES(tests/forces/Makefile) | ||||||
|  | AC_CONFIG_FILES(tests/hmc/Makefile) | ||||||
|  | AC_CONFIG_FILES(tests/solver/Makefile) | ||||||
|  | AC_CONFIG_FILES(tests/qdpxx/Makefile) | ||||||
|  | AC_CONFIG_FILES(benchmarks/Makefile) | ||||||
|  | AC_OUTPUT | ||||||
|  |  | ||||||
| echo "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | echo "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||||||
| Summary of configuration for $PACKAGE v$VERSION | Summary of configuration for $PACKAGE v$VERSION | ||||||
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||||||
| ----- GIT VERSION ------------------------------------- |  | ||||||
| $git_commit |  | ||||||
| ----- PLATFORM ---------------------------------------- | ----- PLATFORM ---------------------------------------- | ||||||
| architecture (build)        : $build_cpu | architecture (build)        : $build_cpu | ||||||
| os (build)                  : $build_os | os (build)                  : $build_os | ||||||
| @@ -497,18 +400,13 @@ compiler vendor             : ${ax_cv_cxx_compiler_vendor} | |||||||
| compiler version            : ${ax_cv_gxx_version} | compiler version            : ${ax_cv_gxx_version} | ||||||
| ----- BUILD OPTIONS ----------------------------------- | ----- BUILD OPTIONS ----------------------------------- | ||||||
| SIMD                        : ${ac_SIMD}${SIMD_GEN_WIDTH_MSG} | SIMD                        : ${ac_SIMD}${SIMD_GEN_WIDTH_MSG} | ||||||
| Threading                   : ${ac_openmp} | Threading                   : ${ac_openmp}  | ||||||
| Communications type         : ${comms_type} | Communications type         : ${comms_type} | ||||||
| Shared memory allocator     : ${ac_SHM} |  | ||||||
| Shared memory mmap path     : ${ac_SHMPATH} |  | ||||||
| Default precision           : ${ac_PRECISION} | Default precision           : ${ac_PRECISION} | ||||||
| Software FP16 conversion    : ${ac_SFW_FP16} | RNG choice                  : ${ac_RNG}  | ||||||
| RNG choice                  : ${ac_RNG} |  | ||||||
| GMP                         : `if test "x$have_gmp" = xtrue; then echo yes; else echo no; fi` | GMP                         : `if test "x$have_gmp" = xtrue; then echo yes; else echo no; fi` | ||||||
| LAPACK                      : ${ac_LAPACK} | LAPACK                      : ${ac_LAPACK} | ||||||
| FFTW                        : `if test "x$have_fftw" = xtrue; then echo yes; else echo no; fi` | 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 DOXYGEN documentation : `if test "$DX_FLAG_doc" = '1'; then echo yes; else echo no; fi` | ||||||
| ----- BUILD FLAGS ------------------------------------- | ----- BUILD FLAGS ------------------------------------- | ||||||
| CXXFLAGS: | CXXFLAGS: | ||||||
| @@ -517,33 +415,7 @@ LDFLAGS: | |||||||
| `echo ${AM_LDFLAGS} ${LDFLAGS} | tr ' ' '\n' | sed 's/^-/    -/g'` | `echo ${AM_LDFLAGS} ${LDFLAGS} | tr ' ' '\n' | sed 's/^-/    -/g'` | ||||||
| LIBS: | LIBS: | ||||||
| `echo ${LIBS} | tr ' ' '\n' | sed 's/^-/    -/g'` | `echo ${LIBS} | tr ' ' '\n' | sed 's/^-/    -/g'` | ||||||
| -------------------------------------------------------" > grid.configure.summary | -------------------------------------------------------" > config.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(lib/Makefile) |  | ||||||
| AC_CONFIG_FILES(tests/Makefile) |  | ||||||
| AC_CONFIG_FILES(tests/IO/Makefile) |  | ||||||
| AC_CONFIG_FILES(tests/core/Makefile) |  | ||||||
| AC_CONFIG_FILES(tests/debug/Makefile) |  | ||||||
| AC_CONFIG_FILES(tests/forces/Makefile) |  | ||||||
| AC_CONFIG_FILES(tests/hadrons/Makefile) |  | ||||||
| AC_CONFIG_FILES(tests/hmc/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/testu01/Makefile) |  | ||||||
| AC_CONFIG_FILES(benchmarks/Makefile) |  | ||||||
| AC_CONFIG_FILES(extras/Makefile) |  | ||||||
| AC_CONFIG_FILES(extras/Hadrons/Makefile) |  | ||||||
| AC_OUTPUT |  | ||||||
|  |  | ||||||
| echo "" | echo "" | ||||||
| cat grid.configure.summary | cat config.summary | ||||||
| echo "" | echo "" | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,235 +0,0 @@ | |||||||
| /************************************************************************************* |  | ||||||
|  |  | ||||||
| Grid physics library, www.github.com/paboyle/Grid  |  | ||||||
|  |  | ||||||
| Source file: extras/Hadrons/Application.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/Application.hpp> |  | ||||||
| #include <Grid/Hadrons/GeneticScheduler.hpp> |  | ||||||
|  |  | ||||||
| using namespace Grid; |  | ||||||
| using namespace QCD; |  | ||||||
| using namespace Hadrons; |  | ||||||
|  |  | ||||||
| #define BIG_SEP "===============" |  | ||||||
| #define SEP     "---------------" |  | ||||||
|  |  | ||||||
| /****************************************************************************** |  | ||||||
|  *                       Application implementation                           * |  | ||||||
|  ******************************************************************************/ |  | ||||||
| // constructors //////////////////////////////////////////////////////////////// |  | ||||||
| Application::Application(void) |  | ||||||
| { |  | ||||||
|     initLogger(); |  | ||||||
|     LOG(Message) << "Modules available:" << std::endl; |  | ||||||
|     auto list = ModuleFactory::getInstance().getBuilderList(); |  | ||||||
|     for (auto &m: list) |  | ||||||
|     { |  | ||||||
|         LOG(Message) << "  " << m << std::endl; |  | ||||||
|     } |  | ||||||
|     auto dim = GridDefaultLatt(), mpi = GridDefaultMpi(), loc(dim); |  | ||||||
|     locVol_ = 1; |  | ||||||
|     for (unsigned int d = 0; d < dim.size(); ++d) |  | ||||||
|     { |  | ||||||
|         loc[d]  /= mpi[d]; |  | ||||||
|         locVol_ *= loc[d]; |  | ||||||
|     } |  | ||||||
|     LOG(Message) << "Global lattice: " << dim << std::endl; |  | ||||||
|     LOG(Message) << "MPI partition : " << mpi << std::endl; |  | ||||||
|     LOG(Message) << "Local lattice : " << loc << std::endl; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| Application::Application(const Application::GlobalPar &par) |  | ||||||
| : Application() |  | ||||||
| { |  | ||||||
|     setPar(par); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| Application::Application(const std::string parameterFileName) |  | ||||||
| : Application() |  | ||||||
| { |  | ||||||
|     parameterFileName_ = parameterFileName; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // access ////////////////////////////////////////////////////////////////////// |  | ||||||
| void Application::setPar(const Application::GlobalPar &par) |  | ||||||
| { |  | ||||||
|     par_ = par; |  | ||||||
|     env().setSeed(strToVec<int>(par_.seed)); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| const Application::GlobalPar & Application::getPar(void) |  | ||||||
| { |  | ||||||
|     return par_; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // execute ///////////////////////////////////////////////////////////////////// |  | ||||||
| void Application::run(void) |  | ||||||
| { |  | ||||||
|     if (!parameterFileName_.empty() and (vm().getNModule() == 0)) |  | ||||||
|     { |  | ||||||
|         parseParameterFile(parameterFileName_); |  | ||||||
|     } |  | ||||||
|     vm().printContent(); |  | ||||||
|     env().printContent(); |  | ||||||
|     schedule(); |  | ||||||
|     printSchedule(); |  | ||||||
|     configLoop(); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // parse parameter file //////////////////////////////////////////////////////// |  | ||||||
| class ObjectId: Serializable |  | ||||||
| { |  | ||||||
| public: |  | ||||||
|     GRID_SERIALIZABLE_CLASS_MEMBERS(ObjectId, |  | ||||||
|                                     std::string, name, |  | ||||||
|                                     std::string, type); |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| void Application::parseParameterFile(const std::string parameterFileName) |  | ||||||
| { |  | ||||||
|     XmlReader reader(parameterFileName); |  | ||||||
|     GlobalPar par; |  | ||||||
|     ObjectId  id; |  | ||||||
|      |  | ||||||
|     LOG(Message) << "Building application from '" << parameterFileName << "'..." << std::endl; |  | ||||||
|     read(reader, "parameters", par); |  | ||||||
|     setPar(par); |  | ||||||
|     if (!push(reader, "modules")) |  | ||||||
|     { |  | ||||||
|         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 |  | ||||||
|     { |  | ||||||
|         read(reader, "id", id); |  | ||||||
|         vm().createModule(id.name, id.type, reader); |  | ||||||
|     } while (reader.nextElement("module")); |  | ||||||
|     pop(reader); |  | ||||||
|     pop(reader); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| void Application::saveParameterFile(const std::string parameterFileName) |  | ||||||
| { |  | ||||||
|     XmlWriter          writer(parameterFileName); |  | ||||||
|     ObjectId           id; |  | ||||||
|     const unsigned int nMod = vm().getNModule(); |  | ||||||
|      |  | ||||||
|     LOG(Message) << "Saving application to '" << parameterFileName << "'..." << std::endl; |  | ||||||
|     write(writer, "parameters", getPar()); |  | ||||||
|     push(writer, "modules"); |  | ||||||
|     for (unsigned int i = 0; i < nMod; ++i) |  | ||||||
|     { |  | ||||||
|         push(writer, "module"); |  | ||||||
|         id.name = vm().getModuleName(i); |  | ||||||
|         id.type = vm().getModule(i)->getRegisteredName(); |  | ||||||
|         write(writer, "id", id); |  | ||||||
|         vm().getModule(i)->saveParameters(writer, "options"); |  | ||||||
|         pop(writer); |  | ||||||
|     } |  | ||||||
|     pop(writer); |  | ||||||
|     pop(writer); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // schedule computation //////////////////////////////////////////////////////// |  | ||||||
| void Application::schedule(void) |  | ||||||
| { |  | ||||||
|     if (!scheduled_ and !loadedSchedule_) |  | ||||||
|     { |  | ||||||
|         program_   = vm().schedule(par_.genetic); |  | ||||||
|         scheduled_ = true; |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| void Application::saveSchedule(const std::string filename) |  | ||||||
| { |  | ||||||
|     TextWriter               writer(filename); |  | ||||||
|     std::vector<std::string> program; |  | ||||||
|      |  | ||||||
|     if (!scheduled_) |  | ||||||
|     { |  | ||||||
|         HADRON_ERROR(Definition, "Computation not scheduled"); |  | ||||||
|     } |  | ||||||
|     LOG(Message) << "Saving current schedule to '" << filename << "'..." |  | ||||||
|                  << std::endl; |  | ||||||
|     for (auto address: program_) |  | ||||||
|     { |  | ||||||
|         program.push_back(vm().getModuleName(address)); |  | ||||||
|     } |  | ||||||
|     write(writer, "schedule", program); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| void Application::loadSchedule(const std::string filename) |  | ||||||
| { |  | ||||||
|     TextReader               reader(filename); |  | ||||||
|     std::vector<std::string> program; |  | ||||||
|      |  | ||||||
|     LOG(Message) << "Loading schedule from '" << filename << "'..." |  | ||||||
|                  << std::endl; |  | ||||||
|     read(reader, "schedule", program); |  | ||||||
|     program_.clear(); |  | ||||||
|     for (auto &name: program) |  | ||||||
|     { |  | ||||||
|         program_.push_back(vm().getModuleAddress(name)); |  | ||||||
|     } |  | ||||||
|     loadedSchedule_ = true; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| void Application::printSchedule(void) |  | ||||||
| { |  | ||||||
|     if (!scheduled_) |  | ||||||
|     { |  | ||||||
|         HADRON_ERROR(Definition, "Computation not scheduled"); |  | ||||||
|     } |  | ||||||
|     auto peak = vm().memoryNeeded(program_); |  | ||||||
|     LOG(Message) << "Schedule (memory needed: " << sizeString(peak) << "):" |  | ||||||
|                  << std::endl; |  | ||||||
|     for (unsigned int i = 0; i < program_.size(); ++i) |  | ||||||
|     { |  | ||||||
|         LOG(Message) << std::setw(4) << i + 1 << ": " |  | ||||||
|                      << vm().getModuleName(program_[i]) << std::endl; |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // loop on configurations ////////////////////////////////////////////////////// |  | ||||||
| void Application::configLoop(void) |  | ||||||
| { |  | ||||||
|     auto range = par_.trajCounter; |  | ||||||
|      |  | ||||||
|     for (unsigned int t = range.start; t < range.end; t += range.step) |  | ||||||
|     { |  | ||||||
|         LOG(Message) << BIG_SEP << " Starting measurement for trajectory " << t |  | ||||||
|                      << " " << BIG_SEP << std::endl; |  | ||||||
|         vm().setTrajectory(t); |  | ||||||
|         vm().executeProgram(program_); |  | ||||||
|     } |  | ||||||
|     LOG(Message) << BIG_SEP << " End of measurement " << BIG_SEP << std::endl; |  | ||||||
|     env().freeAll(); |  | ||||||
| } |  | ||||||
| @@ -1,121 +0,0 @@ | |||||||
| /************************************************************************************* |  | ||||||
|  |  | ||||||
| Grid physics library, www.github.com/paboyle/Grid  |  | ||||||
|  |  | ||||||
| Source file: extras/Hadrons/Application.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_Application_hpp_ |  | ||||||
| #define Hadrons_Application_hpp_ |  | ||||||
|  |  | ||||||
| #include <Grid/Hadrons/Global.hpp> |  | ||||||
| #include <Grid/Hadrons/VirtualMachine.hpp> |  | ||||||
| #include <Grid/Hadrons/Modules.hpp> |  | ||||||
|  |  | ||||||
| BEGIN_HADRONS_NAMESPACE |  | ||||||
|  |  | ||||||
| /****************************************************************************** |  | ||||||
|  *                         Main program manager                               * |  | ||||||
|  ******************************************************************************/ |  | ||||||
| class Application |  | ||||||
| { |  | ||||||
| public: |  | ||||||
|     class TrajRange: Serializable |  | ||||||
|     { |  | ||||||
|     public: |  | ||||||
|         GRID_SERIALIZABLE_CLASS_MEMBERS(TrajRange, |  | ||||||
|                                         unsigned int, start, |  | ||||||
|                                         unsigned int, end, |  | ||||||
|                                         unsigned int, step); |  | ||||||
|     }; |  | ||||||
|     class GlobalPar: Serializable |  | ||||||
|     { |  | ||||||
|     public: |  | ||||||
|         GRID_SERIALIZABLE_CLASS_MEMBERS(GlobalPar, |  | ||||||
|                                         TrajRange,                  trajCounter, |  | ||||||
|                                         VirtualMachine::GeneticPar, genetic, |  | ||||||
|                                         std::string,                seed); |  | ||||||
|     }; |  | ||||||
| public: |  | ||||||
|     // constructors |  | ||||||
|     Application(void); |  | ||||||
|     Application(const GlobalPar &par); |  | ||||||
|     Application(const std::string parameterFileName); |  | ||||||
|     // destructor |  | ||||||
|     virtual ~Application(void) = default; |  | ||||||
|     // access |  | ||||||
|     void              setPar(const GlobalPar &par); |  | ||||||
|     const GlobalPar & getPar(void); |  | ||||||
|     // module creation |  | ||||||
|     template <typename M> |  | ||||||
|     void createModule(const std::string name); |  | ||||||
|     template <typename M> |  | ||||||
|     void createModule(const std::string name, const typename M::Par &par); |  | ||||||
|     // execute |  | ||||||
|     void run(void); |  | ||||||
|     // XML parameter file I/O |  | ||||||
|     void parseParameterFile(const std::string parameterFileName); |  | ||||||
|     void saveParameterFile(const std::string parameterFileName); |  | ||||||
|     // schedule computation |  | ||||||
|     void schedule(void); |  | ||||||
|     void saveSchedule(const std::string filename); |  | ||||||
|     void loadSchedule(const std::string filename); |  | ||||||
|     void printSchedule(void); |  | ||||||
|     // loop on configurations |  | ||||||
|     void configLoop(void); |  | ||||||
| private: |  | ||||||
|     // environment shortcut |  | ||||||
|     DEFINE_ENV_ALIAS; |  | ||||||
|     // virtual machine shortcut |  | ||||||
|     DEFINE_VM_ALIAS; |  | ||||||
| private: |  | ||||||
|     long unsigned int       locVol_; |  | ||||||
|     std::string             parameterFileName_{""}; |  | ||||||
|     GlobalPar               par_; |  | ||||||
|     VirtualMachine::Program program_; |  | ||||||
|     bool                    scheduled_{false}, loadedSchedule_{false}; |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| /****************************************************************************** |  | ||||||
|  *                     Application template implementation                    * |  | ||||||
|  ******************************************************************************/ |  | ||||||
| // module creation ///////////////////////////////////////////////////////////// |  | ||||||
| template <typename M> |  | ||||||
| void Application::createModule(const std::string name) |  | ||||||
| { |  | ||||||
|     vm().createModule<M>(name); |  | ||||||
|     scheduled_ = false; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| template <typename M> |  | ||||||
| void Application::createModule(const std::string name, |  | ||||||
|                                const typename M::Par &par) |  | ||||||
| { |  | ||||||
|     vm().createModule<M>(name, par); |  | ||||||
|     scheduled_ = false; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| END_HADRONS_NAMESPACE |  | ||||||
|  |  | ||||||
| #endif // Hadrons_Application_hpp_ |  | ||||||
| @@ -1,391 +0,0 @@ | |||||||
| /************************************************************************************* |  | ||||||
|  |  | ||||||
| Grid physics library, www.github.com/paboyle/Grid  |  | ||||||
|  |  | ||||||
| Source file: extras/Hadrons/Environment.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/Environment.hpp> |  | ||||||
| #include <Grid/Hadrons/Module.hpp> |  | ||||||
| #include <Grid/Hadrons/ModuleFactory.hpp> |  | ||||||
|  |  | ||||||
| using namespace Grid; |  | ||||||
| using namespace QCD; |  | ||||||
| using namespace Hadrons; |  | ||||||
|  |  | ||||||
| #define ERROR_NO_ADDRESS(address)\ |  | ||||||
| HADRON_ERROR(Definition, "no object with address " + std::to_string(address)); |  | ||||||
|  |  | ||||||
| /****************************************************************************** |  | ||||||
|  *                       Environment implementation                           * |  | ||||||
|  ******************************************************************************/ |  | ||||||
| // constructor ///////////////////////////////////////////////////////////////// |  | ||||||
| Environment::Environment(void) |  | ||||||
| { |  | ||||||
|     dim_ = GridDefaultLatt(); |  | ||||||
|     nd_  = dim_.size(); |  | ||||||
|     grid4d_.reset(SpaceTimeGrid::makeFourDimGrid( |  | ||||||
|         dim_, GridDefaultSimd(nd_, vComplex::Nsimd()), |  | ||||||
|         GridDefaultMpi())); |  | ||||||
|     gridRb4d_.reset(SpaceTimeGrid::makeFourDimRedBlackGrid(grid4d_.get())); |  | ||||||
|     auto loc = getGrid()->LocalDimensions(); |  | ||||||
|     locVol_ = 1; |  | ||||||
|     for (unsigned int d = 0; d < loc.size(); ++d) |  | ||||||
|     { |  | ||||||
|         locVol_ *= loc[d]; |  | ||||||
|     } |  | ||||||
|     rng4d_.reset(new GridParallelRNG(grid4d_.get())); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // grids /////////////////////////////////////////////////////////////////////// |  | ||||||
| void Environment::createGrid(const unsigned int Ls) |  | ||||||
| { |  | ||||||
|     if (grid5d_.find(Ls) == grid5d_.end()) |  | ||||||
|     { |  | ||||||
|         auto g = getGrid(); |  | ||||||
|          |  | ||||||
|         grid5d_[Ls].reset(SpaceTimeGrid::makeFiveDimGrid(Ls, g)); |  | ||||||
|         gridRb5d_[Ls].reset(SpaceTimeGrid::makeFiveDimRedBlackGrid(Ls, g)); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| GridCartesian * Environment::getGrid(const unsigned int Ls) const |  | ||||||
| { |  | ||||||
|     try |  | ||||||
|     { |  | ||||||
|         if (Ls == 1) |  | ||||||
|         { |  | ||||||
|             return grid4d_.get(); |  | ||||||
|         } |  | ||||||
|         else |  | ||||||
|         { |  | ||||||
|             return grid5d_.at(Ls).get(); |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|     catch(std::out_of_range &) |  | ||||||
|     { |  | ||||||
|         HADRON_ERROR(Definition, "no grid with Ls= " + std::to_string(Ls)); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| GridRedBlackCartesian * Environment::getRbGrid(const unsigned int Ls) const |  | ||||||
| { |  | ||||||
|     try |  | ||||||
|     { |  | ||||||
|         if (Ls == 1) |  | ||||||
|         { |  | ||||||
|             return gridRb4d_.get(); |  | ||||||
|         } |  | ||||||
|         else |  | ||||||
|         { |  | ||||||
|             return gridRb5d_.at(Ls).get(); |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|     catch(std::out_of_range &) |  | ||||||
|     { |  | ||||||
|         HADRON_ERROR(Definition, "no red-black 5D grid with Ls= " + std::to_string(Ls)); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| unsigned int Environment::getNd(void) const |  | ||||||
| { |  | ||||||
|     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 ///////////////////////////////////////////////////// |  | ||||||
| void Environment::setSeed(const std::vector<int> &seed) |  | ||||||
| { |  | ||||||
|     rng4d_->SeedFixedIntegers(seed); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| GridParallelRNG * Environment::get4dRng(void) const |  | ||||||
| { |  | ||||||
|     return rng4d_.get(); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // general memory management /////////////////////////////////////////////////// |  | ||||||
| void Environment::addObject(const std::string name, const int moduleAddress) |  | ||||||
| { |  | ||||||
|     if (!hasObject(name)) |  | ||||||
|     { |  | ||||||
|         ObjInfo info; |  | ||||||
|          |  | ||||||
|         info.name   = name; |  | ||||||
|         info.module = moduleAddress; |  | ||||||
|         info.data   = nullptr; |  | ||||||
|         object_.push_back(std::move(info)); |  | ||||||
|         objectAddress_[name] = static_cast<unsigned int>(object_.size() - 1); |  | ||||||
|     } |  | ||||||
|     else |  | ||||||
|     { |  | ||||||
|         HADRON_ERROR(Definition, "object '" + name + "' already exists"); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| void Environment::setObjectModule(const unsigned int objAddress, |  | ||||||
|                                   const int modAddress) |  | ||||||
| { |  | ||||||
|     object_[objAddress].module = modAddress; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| unsigned int Environment::getMaxAddress(void) const |  | ||||||
| { |  | ||||||
|     return object_.size(); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| unsigned int Environment::getObjectAddress(const std::string name) const |  | ||||||
| { |  | ||||||
|     if (hasObject(name)) |  | ||||||
|     { |  | ||||||
|         return objectAddress_.at(name); |  | ||||||
|     } |  | ||||||
|     else |  | ||||||
|     { |  | ||||||
|         HADRON_ERROR(Definition, "no object with name '" + name + "'"); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| std::string Environment::getObjectName(const unsigned int address) const |  | ||||||
| { |  | ||||||
|     if (hasObject(address)) |  | ||||||
|     { |  | ||||||
|         return object_[address].name; |  | ||||||
|     } |  | ||||||
|     else |  | ||||||
|     { |  | ||||||
|         ERROR_NO_ADDRESS(address); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| std::string Environment::getObjectType(const unsigned int address) const |  | ||||||
| { |  | ||||||
|     if (hasObject(address)) |  | ||||||
|     { |  | ||||||
|         if (object_[address].type) |  | ||||||
|         { |  | ||||||
|             return typeName(object_[address].type); |  | ||||||
|         } |  | ||||||
|         else |  | ||||||
|         { |  | ||||||
|             return "<no type>"; |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|     else |  | ||||||
|     { |  | ||||||
|         ERROR_NO_ADDRESS(address); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| std::string Environment::getObjectType(const std::string name) const |  | ||||||
| { |  | ||||||
|     return getObjectType(getObjectAddress(name)); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| Environment::Size Environment::getObjectSize(const unsigned int address) const |  | ||||||
| { |  | ||||||
|     if (hasObject(address)) |  | ||||||
|     { |  | ||||||
|         return object_[address].size; |  | ||||||
|     } |  | ||||||
|     else |  | ||||||
|     { |  | ||||||
|         ERROR_NO_ADDRESS(address); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| Environment::Size Environment::getObjectSize(const std::string name) const |  | ||||||
| { |  | ||||||
|     return getObjectSize(getObjectAddress(name)); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| Environment::Storage Environment::getObjectStorage(const unsigned int address) const |  | ||||||
| { |  | ||||||
|     if (hasObject(address)) |  | ||||||
|     { |  | ||||||
|         return object_[address].storage; |  | ||||||
|     } |  | ||||||
|     else |  | ||||||
|     { |  | ||||||
|         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); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| unsigned int Environment::getObjectLs(const std::string name) const |  | ||||||
| { |  | ||||||
|     return getObjectLs(getObjectAddress(name)); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| bool Environment::hasObject(const unsigned int address) const |  | ||||||
| { |  | ||||||
|     return (address < object_.size()); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| bool Environment::hasObject(const std::string name) const |  | ||||||
| { |  | ||||||
|     auto it = objectAddress_.find(name); |  | ||||||
|      |  | ||||||
|     return ((it != objectAddress_.end()) and hasObject(it->second)); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| bool Environment::hasCreatedObject(const unsigned int address) const |  | ||||||
| { |  | ||||||
|     if (hasObject(address)) |  | ||||||
|     { |  | ||||||
|         return (object_[address].data != nullptr); |  | ||||||
|     } |  | ||||||
|     else |  | ||||||
|     { |  | ||||||
|         return false; |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| bool Environment::hasCreatedObject(const std::string name) const |  | ||||||
| { |  | ||||||
|     if (hasObject(name)) |  | ||||||
|     { |  | ||||||
|         return hasCreatedObject(getObjectAddress(name)); |  | ||||||
|     } |  | ||||||
|     else |  | ||||||
|     { |  | ||||||
|         return false; |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| bool Environment::isObject5d(const unsigned int address) const |  | ||||||
| { |  | ||||||
|     return (getObjectLs(address) > 1); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| bool Environment::isObject5d(const std::string name) const |  | ||||||
| { |  | ||||||
|     return (getObjectLs(name) > 1); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| Environment::Size Environment::getTotalSize(void) const |  | ||||||
| { |  | ||||||
|     Environment::Size size = 0; |  | ||||||
|      |  | ||||||
|     for (auto &o: object_) |  | ||||||
|     { |  | ||||||
|         size += o.size; |  | ||||||
|     } |  | ||||||
|      |  | ||||||
|     return size; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| void Environment::freeObject(const unsigned int address) |  | ||||||
| { |  | ||||||
|     if (hasCreatedObject(address)) |  | ||||||
|     { |  | ||||||
|         LOG(Message) << "Destroying object '" << object_[address].name |  | ||||||
|                      << "'" << std::endl; |  | ||||||
|     } |  | ||||||
|     object_[address].size = 0; |  | ||||||
|     object_[address].type = nullptr; |  | ||||||
|     object_[address].data.reset(nullptr); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| void Environment::freeObject(const std::string name) |  | ||||||
| { |  | ||||||
|     freeObject(getObjectAddress(name)); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| void Environment::freeAll(void) |  | ||||||
| { |  | ||||||
|     for (unsigned int i = 0; i < object_.size(); ++i) |  | ||||||
|     { |  | ||||||
|         freeObject(i); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| void Environment::protectObjects(const bool protect) |  | ||||||
| { |  | ||||||
|     protect_ = protect; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| bool Environment::objectsProtected(void) const |  | ||||||
| { |  | ||||||
|     return protect_; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // print environment content /////////////////////////////////////////////////// |  | ||||||
| void Environment::printContent(void) const |  | ||||||
| { |  | ||||||
|     LOG(Debug) << "Objects: " << std::endl; |  | ||||||
|     for (unsigned int i = 0; i < object_.size(); ++i) |  | ||||||
|     { |  | ||||||
|         LOG(Debug) << std::setw(4) << i << ": " |  | ||||||
|                    << getObjectName(i) << " (" |  | ||||||
|                    << sizeString(getObjectSize(i)) << ")" << std::endl; |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| @@ -1,313 +0,0 @@ | |||||||
| /************************************************************************************* |  | ||||||
|  |  | ||||||
| Grid physics library, www.github.com/paboyle/Grid  |  | ||||||
|  |  | ||||||
| Source file: extras/Hadrons/Environment.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_Environment_hpp_ |  | ||||||
| #define Hadrons_Environment_hpp_ |  | ||||||
|  |  | ||||||
| #include <Grid/Hadrons/Global.hpp> |  | ||||||
|  |  | ||||||
| BEGIN_HADRONS_NAMESPACE |  | ||||||
|  |  | ||||||
| /****************************************************************************** |  | ||||||
|  *                         Global environment                                 * |  | ||||||
|  ******************************************************************************/ |  | ||||||
| class Object |  | ||||||
| { |  | ||||||
| public: |  | ||||||
|     Object(void) = default; |  | ||||||
|     virtual ~Object(void) = default; |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| template <typename T> |  | ||||||
| class Holder: public Object |  | ||||||
| { |  | ||||||
| public: |  | ||||||
|     Holder(void) = default; |  | ||||||
|     Holder(T *pt); |  | ||||||
|     virtual ~Holder(void) = default; |  | ||||||
|     T &       get(void) const; |  | ||||||
|     T *       getPt(void) const; |  | ||||||
|     void      reset(T *pt); |  | ||||||
| private: |  | ||||||
|     std::unique_ptr<T> objPt_{nullptr}; |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| #define DEFINE_ENV_ALIAS \ |  | ||||||
| inline Environment & env(void) const\ |  | ||||||
| {\ |  | ||||||
|     return Environment::getInstance();\ |  | ||||||
| } |  | ||||||
|  |  | ||||||
| class Environment |  | ||||||
| { |  | ||||||
|     SINGLETON(Environment); |  | ||||||
| public: |  | ||||||
|     typedef SITE_SIZE_TYPE                         Size; |  | ||||||
|     typedef std::unique_ptr<GridCartesian>         GridPt; |  | ||||||
|     typedef std::unique_ptr<GridRedBlackCartesian> GridRbPt; |  | ||||||
|     typedef std::unique_ptr<GridParallelRNG>       RngPt; |  | ||||||
|     enum class Storage {object, cache, temporary}; |  | ||||||
| private: |  | ||||||
|     struct ObjInfo |  | ||||||
|     { |  | ||||||
|         Size                    size{0}; |  | ||||||
|         Storage                 storage{Storage::object}; |  | ||||||
|         unsigned int            Ls{0}; |  | ||||||
|         const std::type_info    *type{nullptr}; |  | ||||||
|         std::string             name; |  | ||||||
|         int                     module{-1}; |  | ||||||
|         std::unique_ptr<Object> data{nullptr}; |  | ||||||
|     }; |  | ||||||
| public: |  | ||||||
|     // grids |  | ||||||
|     void                    createGrid(const unsigned int Ls); |  | ||||||
|     GridCartesian *         getGrid(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; |  | ||||||
|     // random number generator |  | ||||||
|     void                    setSeed(const std::vector<int> &seed); |  | ||||||
|     GridParallelRNG *       get4dRng(void) const; |  | ||||||
|     // general memory management |  | ||||||
|     void                    addObject(const std::string name, |  | ||||||
|                                       const int moduleAddress = -1); |  | ||||||
|     template <typename B, typename T, typename ... Ts> |  | ||||||
|     void                    createDerivedObject(const std::string name, |  | ||||||
|                                                 const Environment::Storage storage, |  | ||||||
|                                                 const unsigned int Ls, |  | ||||||
|                                                 Ts && ... args); |  | ||||||
|     template <typename T, typename ... Ts> |  | ||||||
|     void                    createObject(const std::string name, |  | ||||||
|                                          const Environment::Storage storage, |  | ||||||
|                                          const unsigned int Ls, |  | ||||||
|                                          Ts && ... args); |  | ||||||
|     void                    setObjectModule(const unsigned int objAddress, |  | ||||||
|                                             const int modAddress); |  | ||||||
|     template <typename T> |  | ||||||
|     T *                     getObject(const unsigned int address) const; |  | ||||||
|     template <typename T> |  | ||||||
|     T *                     getObject(const std::string name) const; |  | ||||||
|     unsigned int            getMaxAddress(void) const; |  | ||||||
|     unsigned int            getObjectAddress(const std::string name) const; |  | ||||||
|     std::string             getObjectName(const unsigned int address) const; |  | ||||||
|     std::string             getObjectType(const unsigned int address) const; |  | ||||||
|     std::string             getObjectType(const std::string name) const; |  | ||||||
|     Size                    getObjectSize(const unsigned int address) 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 std::string name) const; |  | ||||||
|     bool                    hasObject(const unsigned int address) const; |  | ||||||
|     bool                    hasObject(const std::string name) const; |  | ||||||
|     bool                    hasCreatedObject(const unsigned int address) const; |  | ||||||
|     bool                    hasCreatedObject(const std::string name) const; |  | ||||||
|     bool                    isObject5d(const unsigned int address) 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; |  | ||||||
|     void                    freeObject(const unsigned int address); |  | ||||||
|     void                    freeObject(const std::string name); |  | ||||||
|     void                    freeAll(void); |  | ||||||
|     void                    protectObjects(const bool protect); |  | ||||||
|     bool                    objectsProtected(void) const; |  | ||||||
|     // print environment content |  | ||||||
|     void                    printContent(void) const; |  | ||||||
| private: |  | ||||||
|     // general |  | ||||||
|     unsigned long int                      locVol_; |  | ||||||
|     bool                                   protect_{true}; |  | ||||||
|     // grids |  | ||||||
|     std::vector<int>                       dim_; |  | ||||||
|     GridPt                                 grid4d_; |  | ||||||
|     std::map<unsigned int, GridPt>         grid5d_; |  | ||||||
|     GridRbPt                               gridRb4d_; |  | ||||||
|     std::map<unsigned int, GridRbPt>       gridRb5d_; |  | ||||||
|     unsigned int                           nd_; |  | ||||||
|     // random number generator |  | ||||||
|     RngPt                                  rng4d_; |  | ||||||
|     // object store |  | ||||||
|     std::vector<ObjInfo>                   object_; |  | ||||||
|     std::map<std::string, unsigned int>    objectAddress_; |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| /****************************************************************************** |  | ||||||
|  *                       Holder template implementation                       * |  | ||||||
|  ******************************************************************************/ |  | ||||||
| // constructor ///////////////////////////////////////////////////////////////// |  | ||||||
| template <typename T> |  | ||||||
| Holder<T>::Holder(T *pt) |  | ||||||
| : objPt_(pt) |  | ||||||
| {} |  | ||||||
|  |  | ||||||
| // access ////////////////////////////////////////////////////////////////////// |  | ||||||
| template <typename T> |  | ||||||
| T & Holder<T>::get(void) const |  | ||||||
| { |  | ||||||
|     return &objPt_.get(); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| template <typename T> |  | ||||||
| T * Holder<T>::getPt(void) const |  | ||||||
| { |  | ||||||
|     return objPt_.get(); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| template <typename T> |  | ||||||
| void Holder<T>::reset(T *pt) |  | ||||||
| { |  | ||||||
|     objPt_.reset(pt); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| /****************************************************************************** |  | ||||||
|  *                     Environment template implementation                    * |  | ||||||
|  ******************************************************************************/ |  | ||||||
| // general memory management /////////////////////////////////////////////////// |  | ||||||
| template <typename B, typename T, typename ... Ts> |  | ||||||
| void Environment::createDerivedObject(const std::string name, |  | ||||||
|                                       const Environment::Storage storage, |  | ||||||
|                                       const unsigned int Ls, |  | ||||||
|                                       Ts && ... args) |  | ||||||
| { |  | ||||||
|     if (!hasObject(name)) |  | ||||||
|     { |  | ||||||
|         addObject(name); |  | ||||||
|     } |  | ||||||
|      |  | ||||||
|     unsigned int address = getObjectAddress(name); |  | ||||||
|      |  | ||||||
|     if (!object_[address].data or !objectsProtected()) |  | ||||||
|     { |  | ||||||
|         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; |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|     // 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(Definition, "object '" + name + "' already allocated"); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| template <typename T, typename ... Ts> |  | ||||||
| void Environment::createObject(const std::string name,  |  | ||||||
|                                const Environment::Storage storage, |  | ||||||
|                                const unsigned int Ls, |  | ||||||
|                                Ts && ... args) |  | ||||||
| { |  | ||||||
|     createDerivedObject<T, T>(name, storage, Ls, std::forward<Ts>(args)...); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| template <typename T> |  | ||||||
| T * Environment::getObject(const unsigned int address) const |  | ||||||
| { |  | ||||||
|     if (hasObject(address)) |  | ||||||
|     { |  | ||||||
|         if (hasCreatedObject(address)) |  | ||||||
|         { |  | ||||||
|             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 |  | ||||||
|         { |  | ||||||
|             HADRON_ERROR(Definition, "object with address " + std::to_string(address) + |  | ||||||
|                          " is empty"); |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|     else |  | ||||||
|     { |  | ||||||
|         HADRON_ERROR(Definition, "no object with address " + std::to_string(address)); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| template <typename T> |  | ||||||
| T * Environment::getObject(const std::string name) const |  | ||||||
| { |  | ||||||
|     return getObject<T>(getObjectAddress(name)); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| template <typename T> |  | ||||||
| bool Environment::isObjectOfType(const unsigned int address) const |  | ||||||
| { |  | ||||||
|     if (hasObject(address)) |  | ||||||
|     { |  | ||||||
|         if (auto h = dynamic_cast<Holder<T> *>(object_[address].data.get())) |  | ||||||
|         { |  | ||||||
|             return true; |  | ||||||
|         } |  | ||||||
|         else |  | ||||||
|         { |  | ||||||
|             return false; |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|     else |  | ||||||
|     { |  | ||||||
|         HADRON_ERROR(Definition, "no object with address " + std::to_string(address)); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| template <typename T> |  | ||||||
| bool Environment::isObjectOfType(const std::string name) const |  | ||||||
| { |  | ||||||
|     return isObjectOfType<T>(getObjectAddress(name)); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| END_HADRONS_NAMESPACE |  | ||||||
|  |  | ||||||
| #endif // Hadrons_Environment_hpp_ |  | ||||||
| @@ -1,57 +0,0 @@ | |||||||
| /************************************************************************************* |  | ||||||
|  |  | ||||||
| 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)) |  | ||||||
| @@ -1,72 +0,0 @@ | |||||||
| /************************************************************************************* |  | ||||||
|  |  | ||||||
| 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_ |  | ||||||
| @@ -1,105 +0,0 @@ | |||||||
| /************************************************************************************* |  | ||||||
|  |  | ||||||
| Grid physics library, www.github.com/paboyle/Grid  |  | ||||||
|  |  | ||||||
| Source file: extras/Hadrons/Factory.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_Factory_hpp_ |  | ||||||
| #define Hadrons_Factory_hpp_ |  | ||||||
|  |  | ||||||
| #include <Grid/Hadrons/Global.hpp> |  | ||||||
|  |  | ||||||
| BEGIN_HADRONS_NAMESPACE |  | ||||||
|  |  | ||||||
| /****************************************************************************** |  | ||||||
|  *                        abstract factory class                              * |  | ||||||
|  ******************************************************************************/ |  | ||||||
| template <typename T> |  | ||||||
| class Factory |  | ||||||
| { |  | ||||||
| public: |  | ||||||
|     typedef std::function<std::unique_ptr<T>(const std::string)> Func; |  | ||||||
| public: |  | ||||||
|     // constructor |  | ||||||
|     Factory(void) = default; |  | ||||||
|     // destructor |  | ||||||
|     virtual ~Factory(void) = default; |  | ||||||
|     // registration |  | ||||||
|     void registerBuilder(const std::string type, const Func &f); |  | ||||||
|     // get builder list |  | ||||||
|     std::vector<std::string> getBuilderList(void) const; |  | ||||||
|     // factory |  | ||||||
|     std::unique_ptr<T> create(const std::string type, |  | ||||||
|                               const std::string name) const; |  | ||||||
| private: |  | ||||||
|     std::map<std::string, Func> builder_; |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| /****************************************************************************** |  | ||||||
|  *                         template implementation                            * |  | ||||||
|  ******************************************************************************/ |  | ||||||
| // registration //////////////////////////////////////////////////////////////// |  | ||||||
| template <typename T> |  | ||||||
| void Factory<T>::registerBuilder(const std::string type, const Func &f) |  | ||||||
| { |  | ||||||
|     builder_[type] = f; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // get module list ///////////////////////////////////////////////////////////// |  | ||||||
| template <typename T> |  | ||||||
| std::vector<std::string> Factory<T>::getBuilderList(void) const |  | ||||||
| { |  | ||||||
|     std::vector<std::string> list; |  | ||||||
|      |  | ||||||
|     for (auto &b: builder_) |  | ||||||
|     { |  | ||||||
|         list.push_back(b.first); |  | ||||||
|     } |  | ||||||
|      |  | ||||||
|     return list; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // factory ///////////////////////////////////////////////////////////////////// |  | ||||||
| template <typename T> |  | ||||||
| std::unique_ptr<T> Factory<T>::create(const std::string type, |  | ||||||
|                                       const std::string name) const |  | ||||||
| { |  | ||||||
|     Func func; |  | ||||||
|      |  | ||||||
|     try |  | ||||||
|     { |  | ||||||
|         func = builder_.at(type); |  | ||||||
|     } |  | ||||||
|     catch (std::out_of_range &) |  | ||||||
|     { |  | ||||||
|         HADRON_ERROR(Argument, "object of type '" + type + "' unknown"); |  | ||||||
|     } |  | ||||||
|      |  | ||||||
|     return func(name); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| END_HADRONS_NAMESPACE |  | ||||||
|  |  | ||||||
| #endif // Hadrons_Factory_hpp_ |  | ||||||
| @@ -1,323 +0,0 @@ | |||||||
| /************************************************************************************* |  | ||||||
|  |  | ||||||
| Grid physics library, www.github.com/paboyle/Grid  |  | ||||||
|  |  | ||||||
| Source file: extras/Hadrons/GeneticScheduler.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_GeneticScheduler_hpp_ |  | ||||||
| #define Hadrons_GeneticScheduler_hpp_ |  | ||||||
|  |  | ||||||
| #include <Grid/Hadrons/Global.hpp> |  | ||||||
| #include <Grid/Hadrons/Graph.hpp> |  | ||||||
|  |  | ||||||
| BEGIN_HADRONS_NAMESPACE |  | ||||||
|  |  | ||||||
| /****************************************************************************** |  | ||||||
|  *                   Scheduler based on a genetic algorithm                   * |  | ||||||
|  ******************************************************************************/ |  | ||||||
| template <typename V, typename T> |  | ||||||
| class GeneticScheduler |  | ||||||
| { |  | ||||||
| public: |  | ||||||
|     typedef std::vector<T>                 Gene; |  | ||||||
|     typedef std::pair<Gene *, Gene *>      GenePair; |  | ||||||
|     typedef std::function<V(const Gene &)> ObjFunc; |  | ||||||
|     struct Parameters |  | ||||||
|     { |  | ||||||
|         double       mutationRate; |  | ||||||
|         unsigned int popSize, seed; |  | ||||||
|     }; |  | ||||||
| public: |  | ||||||
|     // constructor |  | ||||||
|     GeneticScheduler(Graph<T> &graph, const ObjFunc &func, |  | ||||||
|                      const Parameters &par); |  | ||||||
|     // destructor |  | ||||||
|     virtual ~GeneticScheduler(void) = default; |  | ||||||
|     // access |  | ||||||
|     const Gene & getMinSchedule(void); |  | ||||||
|     int          getMinValue(void); |  | ||||||
|     // breed a new generation |  | ||||||
|     void nextGeneration(void); |  | ||||||
|     // heuristic benchmarks |  | ||||||
|     void benchmarkCrossover(const unsigned int nIt); |  | ||||||
|     // print population |  | ||||||
|     friend std::ostream & operator<<(std::ostream &out, |  | ||||||
|                                      const GeneticScheduler<V, T> &s) |  | ||||||
|     { |  | ||||||
|         out << "["; |  | ||||||
|         for (auto &p: s.population_) |  | ||||||
|         { |  | ||||||
|             out << p.first << ", "; |  | ||||||
|         } |  | ||||||
|         out << "\b\b]"; |  | ||||||
|          |  | ||||||
|         return out; |  | ||||||
|     } |  | ||||||
| private: |  | ||||||
|     // evolution steps |  | ||||||
|     void initPopulation(void); |  | ||||||
|     void doCrossover(void); |  | ||||||
|     void doMutation(void); |  | ||||||
|     // genetic operators |  | ||||||
|     GenePair selectPair(void); |  | ||||||
|     void     crossover(Gene &c1, Gene &c2, const Gene &p1, const Gene &p2); |  | ||||||
|     void     mutation(Gene &m, const Gene &c); |  | ||||||
|      |  | ||||||
| private: |  | ||||||
|     Graph<T>               &graph_; |  | ||||||
|     const ObjFunc          &func_; |  | ||||||
|     const Parameters       par_; |  | ||||||
|     std::multimap<V, Gene> population_; |  | ||||||
|     std::mt19937           gen_; |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| /****************************************************************************** |  | ||||||
|  *                       template implementation                              * |  | ||||||
|  ******************************************************************************/ |  | ||||||
| // constructor ///////////////////////////////////////////////////////////////// |  | ||||||
| template <typename V, typename T> |  | ||||||
| GeneticScheduler<V, T>::GeneticScheduler(Graph<T> &graph, const ObjFunc &func, |  | ||||||
|                                       const Parameters &par) |  | ||||||
| : graph_(graph) |  | ||||||
| , func_(func) |  | ||||||
| , par_(par) |  | ||||||
| { |  | ||||||
|     gen_.seed(par_.seed); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // access ////////////////////////////////////////////////////////////////////// |  | ||||||
| template <typename V, typename T> |  | ||||||
| const typename GeneticScheduler<V, T>::Gene & |  | ||||||
| GeneticScheduler<V, T>::getMinSchedule(void) |  | ||||||
| { |  | ||||||
|     return population_.begin()->second; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| template <typename V, typename T> |  | ||||||
| int GeneticScheduler<V, T>::getMinValue(void) |  | ||||||
| { |  | ||||||
|     return population_.begin()->first; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // breed a new generation ////////////////////////////////////////////////////// |  | ||||||
| template <typename V, typename T> |  | ||||||
| void GeneticScheduler<V, T>::nextGeneration(void) |  | ||||||
| { |  | ||||||
|     // random initialization of the population if necessary |  | ||||||
|     if (population_.size() != par_.popSize) |  | ||||||
|     { |  | ||||||
|         initPopulation(); |  | ||||||
|     } |  | ||||||
|     LOG(Debug) << "Starting population:\n" << *this << std::endl; |  | ||||||
|      |  | ||||||
|     // random mutations |  | ||||||
|     //PARALLEL_FOR_LOOP |  | ||||||
|     for (unsigned int i = 0; i < par_.popSize; ++i) |  | ||||||
|     { |  | ||||||
|         doMutation(); |  | ||||||
|     } |  | ||||||
|     LOG(Debug) << "After mutations:\n" << *this << std::endl; |  | ||||||
|      |  | ||||||
|     // mating |  | ||||||
|     //PARALLEL_FOR_LOOP |  | ||||||
|     for (unsigned int i = 0; i < par_.popSize/2; ++i) |  | ||||||
|     { |  | ||||||
|         doCrossover(); |  | ||||||
|     } |  | ||||||
|     LOG(Debug) << "After mating:\n" << *this << std::endl; |  | ||||||
|      |  | ||||||
|     // grim reaper |  | ||||||
|     auto it = population_.begin(); |  | ||||||
|      |  | ||||||
|     std::advance(it, par_.popSize); |  | ||||||
|     population_.erase(it, population_.end()); |  | ||||||
|     LOG(Debug) << "After grim reaper:\n" << *this << std::endl; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // evolution steps ///////////////////////////////////////////////////////////// |  | ||||||
| template <typename V, typename T> |  | ||||||
| void GeneticScheduler<V, T>::initPopulation(void) |  | ||||||
| { |  | ||||||
|     population_.clear(); |  | ||||||
|     for (unsigned int i = 0; i < par_.popSize; ++i) |  | ||||||
|     { |  | ||||||
|         auto p = graph_.topoSort(gen_); |  | ||||||
|          |  | ||||||
|         population_.insert(std::make_pair(func_(p), p)); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| template <typename V, typename T> |  | ||||||
| void GeneticScheduler<V, T>::doCrossover(void) |  | ||||||
| { |  | ||||||
|     auto p = selectPair(); |  | ||||||
|     Gene &p1 = *(p.first), &p2 = *(p.second); |  | ||||||
|     Gene c1, c2; |  | ||||||
|      |  | ||||||
|     crossover(c1, c2, p1, p2); |  | ||||||
|     PARALLEL_CRITICAL |  | ||||||
|     { |  | ||||||
|         population_.insert(std::make_pair(func_(c1), c1)); |  | ||||||
|         population_.insert(std::make_pair(func_(c2), c2)); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| template <typename V, typename T> |  | ||||||
| void GeneticScheduler<V, T>::doMutation(void) |  | ||||||
| { |  | ||||||
|     std::uniform_real_distribution<double>      mdis(0., 1.); |  | ||||||
|     std::uniform_int_distribution<unsigned int> pdis(0, population_.size() - 1); |  | ||||||
|      |  | ||||||
|     if (mdis(gen_) < par_.mutationRate) |  | ||||||
|     { |  | ||||||
|         Gene m; |  | ||||||
|         auto it = population_.begin(); |  | ||||||
|          |  | ||||||
|         std::advance(it, pdis(gen_)); |  | ||||||
|         mutation(m, it->second); |  | ||||||
|         PARALLEL_CRITICAL |  | ||||||
|         { |  | ||||||
|             population_.insert(std::make_pair(func_(m), m)); |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // genetic operators /////////////////////////////////////////////////////////// |  | ||||||
| template <typename V, typename T> |  | ||||||
| typename GeneticScheduler<V, T>::GenePair GeneticScheduler<V, T>::selectPair(void) |  | ||||||
| { |  | ||||||
|     std::vector<double> prob; |  | ||||||
|     unsigned int        ind; |  | ||||||
|     Gene                *p1, *p2; |  | ||||||
|     const double        max = population_.rbegin()->first; |  | ||||||
|      |  | ||||||
|  |  | ||||||
|     for (auto &c: population_) |  | ||||||
|     { |  | ||||||
|         prob.push_back(std::exp((c.first-1.)/max)); |  | ||||||
|     }         |  | ||||||
|     std::discrete_distribution<unsigned int> dis1(prob.begin(), prob.end()); |  | ||||||
|     auto rIt = population_.begin(); |  | ||||||
|     ind = dis1(gen_); |  | ||||||
|     std::advance(rIt, ind); |  | ||||||
|     p1 = &(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); |  | ||||||
|      |  | ||||||
|     return std::make_pair(p1, p2); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| template <typename V, typename T> |  | ||||||
| void GeneticScheduler<V, T>::crossover(Gene &c1, Gene &c2, const Gene &p1, |  | ||||||
|                                     const Gene &p2) |  | ||||||
| { |  | ||||||
|     Gene                                        buf; |  | ||||||
|     std::uniform_int_distribution<unsigned int> dis(0, p1.size() - 1); |  | ||||||
|     unsigned int                                cut = dis(gen_); |  | ||||||
|      |  | ||||||
|     c1.clear(); |  | ||||||
|     buf = p2; |  | ||||||
|     for (unsigned int i = 0; i < cut; ++i) |  | ||||||
|     { |  | ||||||
|         c1.push_back(p1[i]); |  | ||||||
|         buf.erase(std::find(buf.begin(), buf.end(), p1[i])); |  | ||||||
|     } |  | ||||||
|     for (unsigned int i = 0; i < buf.size(); ++i) |  | ||||||
|     { |  | ||||||
|         c1.push_back(buf[i]); |  | ||||||
|     } |  | ||||||
|     c2.clear(); |  | ||||||
|     buf = p2; |  | ||||||
|     for (unsigned int i = cut; i < p1.size(); ++i) |  | ||||||
|     { |  | ||||||
|         buf.erase(std::find(buf.begin(), buf.end(), p1[i])); |  | ||||||
|     } |  | ||||||
|     for (unsigned int i = 0; i < buf.size(); ++i) |  | ||||||
|     { |  | ||||||
|         c2.push_back(buf[i]); |  | ||||||
|     } |  | ||||||
|     for (unsigned int i = cut; i < p1.size(); ++i) |  | ||||||
|     { |  | ||||||
|         c2.push_back(p1[i]); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| template <typename V, typename T> |  | ||||||
| void GeneticScheduler<V, T>::mutation(Gene &m, const Gene &c) |  | ||||||
| { |  | ||||||
|     Gene                                        buf; |  | ||||||
|     std::uniform_int_distribution<unsigned int> dis(0, c.size() - 1); |  | ||||||
|     unsigned int                                cut = dis(gen_); |  | ||||||
|     Graph<T>                                    g1 = graph_, g2 = graph_; |  | ||||||
|      |  | ||||||
|     for (unsigned int i = 0; i < cut; ++i) |  | ||||||
|     { |  | ||||||
|         g1.removeVertex(c[i]); |  | ||||||
|     } |  | ||||||
|     for (unsigned int i = cut; i < c.size(); ++i) |  | ||||||
|     { |  | ||||||
|         g2.removeVertex(c[i]); |  | ||||||
|     } |  | ||||||
|     if (g1.size() > 0) |  | ||||||
|     { |  | ||||||
|         buf = g1.topoSort(gen_); |  | ||||||
|     } |  | ||||||
|     if (g2.size() > 0) |  | ||||||
|     { |  | ||||||
|         m = g2.topoSort(gen_); |  | ||||||
|     } |  | ||||||
|     for (unsigned int i = cut; i < c.size(); ++i) |  | ||||||
|     { |  | ||||||
|         m.push_back(buf[i - cut]); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| template <typename V, typename T> |  | ||||||
| void GeneticScheduler<V, T>::benchmarkCrossover(const unsigned int nIt) |  | ||||||
| { |  | ||||||
|     Gene   p1, p2, c1, c2; |  | ||||||
|     double neg = 0., eq = 0., pos = 0., total; |  | ||||||
|     int    improvement; |  | ||||||
|      |  | ||||||
|     LOG(Message) << "Benchmarking crossover..." << std::endl; |  | ||||||
|     for (unsigned int i = 0; i < nIt; ++i) |  | ||||||
|     { |  | ||||||
|         p1 = graph_.topoSort(gen_); |  | ||||||
|         p2 = graph_.topoSort(gen_); |  | ||||||
|         crossover(c1, c2, p1, p2); |  | ||||||
|         improvement = (func_(c1) + func_(c2) - func_(p1) - func_(p2))/2; |  | ||||||
|         if (improvement < 0) neg++; else if (improvement == 0) eq++; else pos++; |  | ||||||
|     } |  | ||||||
|     total = neg + eq + pos; |  | ||||||
|     LOG(Message) << "  -: " << neg/total << "  =: " << eq/total |  | ||||||
|                  << "  +: " << pos/total << std::endl; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| END_HADRONS_NAMESPACE |  | ||||||
|  |  | ||||||
| #endif // Hadrons_GeneticScheduler_hpp_ |  | ||||||
| @@ -1,76 +0,0 @@ | |||||||
| /************************************************************************************* |  | ||||||
|  |  | ||||||
| Grid physics library, www.github.com/paboyle/Grid  |  | ||||||
|  |  | ||||||
| Source file: extras/Hadrons/Global.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/Global.hpp> |  | ||||||
|  |  | ||||||
| using namespace Grid; |  | ||||||
| using namespace QCD; |  | ||||||
| using namespace Hadrons; |  | ||||||
|  |  | ||||||
| HadronsLogger Hadrons::HadronsLogError(1,"Error"); |  | ||||||
| HadronsLogger Hadrons::HadronsLogWarning(1,"Warning"); |  | ||||||
| HadronsLogger Hadrons::HadronsLogMessage(1,"Message"); |  | ||||||
| HadronsLogger Hadrons::HadronsLogIterative(1,"Iterative"); |  | ||||||
| HadronsLogger Hadrons::HadronsLogDebug(1,"Debug"); |  | ||||||
|  |  | ||||||
| void Hadrons::initLogger(void) |  | ||||||
| { |  | ||||||
|     auto w = std::string("Hadrons").length(); |  | ||||||
|     GridLogError.setTopWidth(w); |  | ||||||
|     GridLogWarning.setTopWidth(w); |  | ||||||
|     GridLogMessage.setTopWidth(w); |  | ||||||
|     GridLogIterative.setTopWidth(w); |  | ||||||
|     GridLogDebug.setTopWidth(w); |  | ||||||
|     HadronsLogError.Active(GridLogError.isActive()); |  | ||||||
|     HadronsLogWarning.Active(GridLogWarning.isActive()); |  | ||||||
|     HadronsLogMessage.Active(GridLogMessage.isActive()); |  | ||||||
|     HadronsLogIterative.Active(GridLogIterative.isActive()); |  | ||||||
|     HadronsLogDebug.Active(GridLogDebug.isActive()); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // type utilities ////////////////////////////////////////////////////////////// |  | ||||||
| constexpr unsigned int maxNameSize = 1024u; |  | ||||||
|  |  | ||||||
| std::string Hadrons::typeName(const std::type_info *info) |  | ||||||
| { |  | ||||||
|     char        *buf; |  | ||||||
|     std::string name; |  | ||||||
|      |  | ||||||
|     buf  = abi::__cxa_demangle(info->name(), nullptr, nullptr, nullptr); |  | ||||||
|     name = buf; |  | ||||||
|     free(buf); |  | ||||||
|      |  | ||||||
|     return name; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // default writers/readers ///////////////////////////////////////////////////// |  | ||||||
| #ifdef HAVE_HDF5 |  | ||||||
| const std::string Hadrons::resultFileExt = "h5"; |  | ||||||
| #else |  | ||||||
| const std::string Hadrons::resultFileExt = "xml"; |  | ||||||
| #endif |  | ||||||
| @@ -1,187 +0,0 @@ | |||||||
| /************************************************************************************* |  | ||||||
|  |  | ||||||
| Grid physics library, www.github.com/paboyle/Grid  |  | ||||||
|  |  | ||||||
| Source file: extras/Hadrons/Global.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_Global_hpp_ |  | ||||||
| #define Hadrons_Global_hpp_ |  | ||||||
|  |  | ||||||
| #include <set> |  | ||||||
| #include <stack> |  | ||||||
| #include <Grid/Grid.h> |  | ||||||
| #include <cxxabi.h> |  | ||||||
|  |  | ||||||
| #ifndef SITE_SIZE_TYPE |  | ||||||
| #define SITE_SIZE_TYPE size_t |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| #define BEGIN_HADRONS_NAMESPACE \ |  | ||||||
| namespace Grid {\ |  | ||||||
| using namespace QCD;\ |  | ||||||
| namespace Hadrons {\ |  | ||||||
| using Grid::operator<<; |  | ||||||
| #define END_HADRONS_NAMESPACE }} |  | ||||||
|  |  | ||||||
| #define BEGIN_MODULE_NAMESPACE(name)\ |  | ||||||
| namespace name {\ |  | ||||||
| using Grid::operator<<; |  | ||||||
| #define END_MODULE_NAMESPACE } |  | ||||||
|  |  | ||||||
| /* the 'using Grid::operator<<;' statement prevents a very nasty compilation |  | ||||||
|  * error with GCC 5 (clang & GCC 6 compile fine without it). |  | ||||||
|  */ |  | ||||||
|  |  | ||||||
| #ifndef FIMPL |  | ||||||
| #define FIMPL WilsonImplR |  | ||||||
| #endif |  | ||||||
| #ifndef SIMPL |  | ||||||
| #define SIMPL ScalarImplCR |  | ||||||
| #endif |  | ||||||
| #ifndef GIMPL |  | ||||||
| #define GIMPL GimplTypesR |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| BEGIN_HADRONS_NAMESPACE |  | ||||||
|  |  | ||||||
| // type aliases |  | ||||||
| #define FERM_TYPE_ALIASES(FImpl, suffix)\ |  | ||||||
| typedef FermionOperator<FImpl>                        FMat##suffix;            \ |  | ||||||
| typedef typename FImpl::FermionField                  FermionField##suffix;    \ |  | ||||||
| typedef typename FImpl::PropagatorField               PropagatorField##suffix; \ |  | ||||||
| typedef typename FImpl::SitePropagator::scalar_object SitePropagator##suffix;  \ |  | ||||||
| typedef std::vector<SitePropagator##suffix>           SlicedPropagator##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; |  | ||||||
|  |  | ||||||
| #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 |  | ||||||
| class HadronsLogger: public Logger |  | ||||||
| { |  | ||||||
| public: |  | ||||||
|     HadronsLogger(int on, std::string nm): Logger("Hadrons", on, nm, |  | ||||||
|                                                   GridLogColours, "BLACK"){}; |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| #define LOG(channel) std::cout << HadronsLog##channel |  | ||||||
| #define DEBUG_VAR(var) LOG(Debug) << #var << "= " << (var) << std::endl; |  | ||||||
|  |  | ||||||
| extern HadronsLogger HadronsLogError; |  | ||||||
| extern HadronsLogger HadronsLogWarning; |  | ||||||
| extern HadronsLogger HadronsLogMessage; |  | ||||||
| extern HadronsLogger HadronsLogIterative; |  | ||||||
| extern HadronsLogger HadronsLogDebug; |  | ||||||
|  |  | ||||||
| void initLogger(void); |  | ||||||
|  |  | ||||||
| // singleton pattern |  | ||||||
| #define SINGLETON(name)\ |  | ||||||
| public:\ |  | ||||||
|     name(const name &e) = delete;\ |  | ||||||
|     void operator=(const name &e) = delete;\ |  | ||||||
|     static name & getInstance(void)\ |  | ||||||
|     {\ |  | ||||||
|         static name e;\ |  | ||||||
|         return e;\ |  | ||||||
|     }\ |  | ||||||
| private:\ |  | ||||||
|     name(void); |  | ||||||
|  |  | ||||||
| #define SINGLETON_DEFCTOR(name)\ |  | ||||||
| public:\ |  | ||||||
|     name(const name &e) = delete;\ |  | ||||||
|     void operator=(const name &e) = delete;\ |  | ||||||
|     static name & getInstance(void)\ |  | ||||||
|     {\ |  | ||||||
|         static name e;\ |  | ||||||
|         return e;\ |  | ||||||
|     }\ |  | ||||||
| private:\ |  | ||||||
|     name(void) = default; |  | ||||||
|  |  | ||||||
| // type utilities |  | ||||||
| template <typename T> |  | ||||||
| const std::type_info * typeIdPt(const T &x) |  | ||||||
| { |  | ||||||
|     return &typeid(x); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| std::string typeName(const std::type_info *info); |  | ||||||
|  |  | ||||||
| template <typename T> |  | ||||||
| const std::type_info * typeIdPt(void) |  | ||||||
| { |  | ||||||
|     return &typeid(T); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| template <typename T> |  | ||||||
| std::string typeName(const T &x) |  | ||||||
| { |  | ||||||
|     return typeName(typeIdPt(x)); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| template <typename T> |  | ||||||
| std::string typeName(void) |  | ||||||
| { |  | ||||||
|     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 |  | ||||||
|  |  | ||||||
| #include <Grid/Hadrons/Exceptions.hpp> |  | ||||||
|  |  | ||||||
| #endif // Hadrons_Global_hpp_ |  | ||||||
| @@ -1,759 +0,0 @@ | |||||||
| /************************************************************************************* |  | ||||||
|  |  | ||||||
| Grid physics library, www.github.com/paboyle/Grid  |  | ||||||
|  |  | ||||||
| Source file: extras/Hadrons/Graph.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_Graph_hpp_ |  | ||||||
| #define Hadrons_Graph_hpp_ |  | ||||||
|  |  | ||||||
| #include <Grid/Hadrons/Global.hpp> |  | ||||||
|  |  | ||||||
| BEGIN_HADRONS_NAMESPACE |  | ||||||
|  |  | ||||||
| /****************************************************************************** |  | ||||||
|  *                          Oriented graph class                              * |  | ||||||
|  ******************************************************************************/ |  | ||||||
| // I/O for edges |  | ||||||
| template <typename T> |  | ||||||
| std::ostream & operator<<(std::ostream &out, const std::pair<T, T> &e) |  | ||||||
| { |  | ||||||
|     out << "\""  << e.first << "\" -> \"" << e.second << "\""; |  | ||||||
|      |  | ||||||
|     return out; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // main class |  | ||||||
| template <typename T> |  | ||||||
| class Graph |  | ||||||
| { |  | ||||||
| public: |  | ||||||
|     typedef std::pair<T, T> Edge; |  | ||||||
| public: |  | ||||||
|     // constructor |  | ||||||
|     Graph(void); |  | ||||||
|     // destructor |  | ||||||
|     virtual ~Graph(void) = default; |  | ||||||
|     // access |  | ||||||
|     void           addVertex(const T &value); |  | ||||||
|     void           addEdge(const Edge &e); |  | ||||||
|     void           addEdge(const T &start, const T &end); |  | ||||||
|     std::vector<T> getVertices(void) const; |  | ||||||
|     void           removeVertex(const T &value); |  | ||||||
|     void           removeEdge(const Edge &e); |  | ||||||
|     void           removeEdge(const T &start, const T &end); |  | ||||||
|     unsigned int   size(void) const; |  | ||||||
|     // tests |  | ||||||
|     bool gotValue(const T &value) const; |  | ||||||
|     // graph topological manipulations |  | ||||||
|     std::vector<T>              getAdjacentVertices(const T &value) const; |  | ||||||
|     std::vector<T>              getChildren(const T &value) const; |  | ||||||
|     std::vector<T>              getParents(const T &value) const; |  | ||||||
|     std::vector<T>              getRoots(void) const; |  | ||||||
|     std::vector<Graph<T>>       getConnectedComponents(void) const; |  | ||||||
|     std::vector<T>              topoSort(void); |  | ||||||
|     template <typename Gen> |  | ||||||
|     std::vector<T>              topoSort(Gen &gen); |  | ||||||
|     std::vector<std::vector<T>> allTopoSort(void); |  | ||||||
|     // I/O |  | ||||||
|     friend std::ostream & operator<<(std::ostream &out, const Graph<T> &g) |  | ||||||
|     { |  | ||||||
|         out << "{"; |  | ||||||
|         for (auto &e: g.edgeSet_) |  | ||||||
|         { |  | ||||||
|             out << e << ", "; |  | ||||||
|         } |  | ||||||
|         if (g.edgeSet_.size() != 0) |  | ||||||
|         { |  | ||||||
|             out << "\b\b"; |  | ||||||
|         } |  | ||||||
|         out << "}"; |  | ||||||
|          |  | ||||||
|         return out; |  | ||||||
|     } |  | ||||||
| private: |  | ||||||
|     // vertex marking |  | ||||||
|     void      mark(const T &value, const bool doMark = true); |  | ||||||
|     void      markAll(const bool doMark = true); |  | ||||||
|     void      unmark(const T &value); |  | ||||||
|     void      unmarkAll(void); |  | ||||||
|     bool      isMarked(const T &value) const; |  | ||||||
|     const T * getFirstMarked(const bool isMarked = true) const; |  | ||||||
|     template <typename Gen> |  | ||||||
|     const T * getRandomMarked(const bool isMarked, Gen &gen); |  | ||||||
|     const T * getFirstUnmarked(void) const; |  | ||||||
|     template <typename Gen> |  | ||||||
|     const T * getRandomUnmarked(Gen &gen); |  | ||||||
|     // prune marked/unmarked vertices |  | ||||||
|     void removeMarked(const bool isMarked = true); |  | ||||||
|     void removeUnmarked(void); |  | ||||||
|     // depth-first search marking |  | ||||||
|     void depthFirstSearch(void); |  | ||||||
|     void depthFirstSearch(const T &root); |  | ||||||
| private: |  | ||||||
|     std::map<T, bool>  isMarked_; |  | ||||||
|     std::set<Edge>     edgeSet_; |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| // build depedency matrix from topological sorts |  | ||||||
| template <typename T> |  | ||||||
| std::map<T, std::map<T, bool>> |  | ||||||
| makeDependencyMatrix(const std::vector<std::vector<T>> &topSort); |  | ||||||
|  |  | ||||||
| /****************************************************************************** |  | ||||||
|  *                       template implementation                              * |  | ||||||
|  ****************************************************************************** |  | ||||||
|  * in all the following V is the number of vertex and E is the number of edge |  | ||||||
|  * in the worst case E = V^2 |  | ||||||
|  */ |  | ||||||
|  |  | ||||||
| // constructor ///////////////////////////////////////////////////////////////// |  | ||||||
| template <typename T> |  | ||||||
| Graph<T>::Graph(void) |  | ||||||
| {} |  | ||||||
|  |  | ||||||
| // access ////////////////////////////////////////////////////////////////////// |  | ||||||
| // complexity: log(V) |  | ||||||
| template <typename T> |  | ||||||
| void Graph<T>::addVertex(const T &value) |  | ||||||
| { |  | ||||||
|     isMarked_[value] = false; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // complexity: O(log(V)) |  | ||||||
| template <typename T> |  | ||||||
| void Graph<T>::addEdge(const Edge &e) |  | ||||||
| { |  | ||||||
|     addVertex(e.first); |  | ||||||
|     addVertex(e.second); |  | ||||||
|     edgeSet_.insert(e); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // complexity: O(log(V)) |  | ||||||
| template <typename T> |  | ||||||
| void Graph<T>::addEdge(const T &start, const T &end) |  | ||||||
| { |  | ||||||
|     addEdge(Edge(start, end)); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| template <typename T> |  | ||||||
| std::vector<T> Graph<T>::getVertices(void) const |  | ||||||
| { |  | ||||||
|     std::vector<T> vertex; |  | ||||||
|      |  | ||||||
|     for (auto &v: isMarked_) |  | ||||||
|     { |  | ||||||
|         vertex.push_back(v.first); |  | ||||||
|     } |  | ||||||
|      |  | ||||||
|     return vertex; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // complexity: O(V*log(V)) |  | ||||||
| template <typename T> |  | ||||||
| void Graph<T>::removeVertex(const T &value) |  | ||||||
| { |  | ||||||
|     // remove vertex from the mark table |  | ||||||
|     auto vIt = isMarked_.find(value); |  | ||||||
|      |  | ||||||
|     if (vIt != isMarked_.end()) |  | ||||||
|     { |  | ||||||
|         isMarked_.erase(vIt); |  | ||||||
|     } |  | ||||||
|     else |  | ||||||
|     { |  | ||||||
|         HADRON_ERROR(Range, "vertex does not exists"); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     // remove all edges containing the vertex |  | ||||||
|     auto pred = [&value](const Edge &e) |  | ||||||
|     { |  | ||||||
|         return ((e.first == value) or (e.second == value)); |  | ||||||
|     }; |  | ||||||
|     auto eIt = find_if(edgeSet_.begin(), edgeSet_.end(), pred); |  | ||||||
|      |  | ||||||
|     while (eIt != edgeSet_.end()) |  | ||||||
|     { |  | ||||||
|         edgeSet_.erase(eIt); |  | ||||||
|         eIt = find_if(edgeSet_.begin(), edgeSet_.end(), pred); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // complexity: O(log(V)) |  | ||||||
| template <typename T> |  | ||||||
| void Graph<T>::removeEdge(const Edge &e) |  | ||||||
| { |  | ||||||
|     auto eIt = edgeSet_.find(e); |  | ||||||
|      |  | ||||||
|     if (eIt != edgeSet_.end()) |  | ||||||
|     { |  | ||||||
|         edgeSet_.erase(eIt); |  | ||||||
|     } |  | ||||||
|     else |  | ||||||
|     { |  | ||||||
|         HADRON_ERROR(Range, "edge does not exists"); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // complexity: O(log(V)) |  | ||||||
| template <typename T> |  | ||||||
| void Graph<T>::removeEdge(const T &start, const T &end) |  | ||||||
| { |  | ||||||
|     removeEdge(Edge(start, end)); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // complexity: O(1) |  | ||||||
| template <typename T> |  | ||||||
| unsigned int Graph<T>::size(void) const |  | ||||||
| { |  | ||||||
|     return isMarked_.size(); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // tests /////////////////////////////////////////////////////////////////////// |  | ||||||
| // complexity: O(log(V)) |  | ||||||
| template <typename T> |  | ||||||
| bool Graph<T>::gotValue(const T &value) const |  | ||||||
| { |  | ||||||
|     auto it = isMarked_.find(value); |  | ||||||
|      |  | ||||||
|     if (it == isMarked_.end()) |  | ||||||
|     { |  | ||||||
|         return false; |  | ||||||
|     } |  | ||||||
|     else |  | ||||||
|     { |  | ||||||
|         return true; |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // vertex marking ////////////////////////////////////////////////////////////// |  | ||||||
| // complexity: O(log(V)) |  | ||||||
| template <typename T> |  | ||||||
| void Graph<T>::mark(const T &value, const bool doMark) |  | ||||||
| { |  | ||||||
|     if (gotValue(value)) |  | ||||||
|     { |  | ||||||
|         isMarked_[value] = doMark; |  | ||||||
|     } |  | ||||||
|     else |  | ||||||
|     { |  | ||||||
|         HADRON_ERROR(Range, "vertex does not exists"); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // complexity: O(V*log(V)) |  | ||||||
| template <typename T> |  | ||||||
| void Graph<T>::markAll(const bool doMark) |  | ||||||
| { |  | ||||||
|     for (auto &v: isMarked_) |  | ||||||
|     { |  | ||||||
|         mark(v.first, doMark); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // complexity: O(log(V)) |  | ||||||
| template <typename T> |  | ||||||
| void Graph<T>::unmark(const T &value) |  | ||||||
| { |  | ||||||
|     mark(value, false); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // complexity: O(V*log(V)) |  | ||||||
| template <typename T> |  | ||||||
| void Graph<T>::unmarkAll(void) |  | ||||||
| { |  | ||||||
|     markAll(false); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // complexity: O(log(V)) |  | ||||||
| template <typename T> |  | ||||||
| bool Graph<T>::isMarked(const T &value) const |  | ||||||
| { |  | ||||||
|     if (gotValue(value)) |  | ||||||
|     { |  | ||||||
|         return isMarked_.at(value); |  | ||||||
|     } |  | ||||||
|     else |  | ||||||
|     { |  | ||||||
|         HADRON_ERROR(Range, "vertex does not exists"); |  | ||||||
|          |  | ||||||
|         return false; |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // complexity: O(log(V)) |  | ||||||
| template <typename T> |  | ||||||
| const T * Graph<T>::getFirstMarked(const bool isMarked) const |  | ||||||
| { |  | ||||||
|     auto pred = [&isMarked](const std::pair<T, bool> &v) |  | ||||||
|     { |  | ||||||
|         return (v.second == isMarked); |  | ||||||
|     }; |  | ||||||
|     auto vIt = std::find_if(isMarked_.begin(), isMarked_.end(), pred); |  | ||||||
|      |  | ||||||
|     if (vIt != isMarked_.end()) |  | ||||||
|     { |  | ||||||
|         return &(vIt->first); |  | ||||||
|     } |  | ||||||
|     else |  | ||||||
|     { |  | ||||||
|         return nullptr; |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // complexity: O(log(V)) |  | ||||||
| template <typename T> |  | ||||||
| template <typename Gen> |  | ||||||
| const T * Graph<T>::getRandomMarked(const bool isMarked, Gen &gen) |  | ||||||
| { |  | ||||||
|     auto pred = [&isMarked](const std::pair<T, bool> &v) |  | ||||||
|     { |  | ||||||
|         return (v.second == isMarked); |  | ||||||
|     }; |  | ||||||
|     std::uniform_int_distribution<unsigned int> dis(0, size() - 1); |  | ||||||
|     auto                                        rIt = isMarked_.begin(); |  | ||||||
|      |  | ||||||
|     std::advance(rIt, dis(gen)); |  | ||||||
|     auto vIt = std::find_if(rIt, isMarked_.end(), pred); |  | ||||||
|     if (vIt != isMarked_.end()) |  | ||||||
|     { |  | ||||||
|         return &(vIt->first); |  | ||||||
|     } |  | ||||||
|     else |  | ||||||
|     { |  | ||||||
|         vIt = std::find_if(isMarked_.begin(), rIt, pred); |  | ||||||
|         if (vIt != rIt) |  | ||||||
|         { |  | ||||||
|             return &(vIt->first); |  | ||||||
|         } |  | ||||||
|         else |  | ||||||
|         { |  | ||||||
|             return nullptr; |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // complexity: O(log(V)) |  | ||||||
| template <typename T> |  | ||||||
| const T * Graph<T>::getFirstUnmarked(void) const |  | ||||||
| { |  | ||||||
|     return getFirstMarked(false); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // complexity: O(log(V)) |  | ||||||
| template <typename T> |  | ||||||
| template <typename Gen> |  | ||||||
| const T * Graph<T>::getRandomUnmarked(Gen &gen) |  | ||||||
| { |  | ||||||
|     return getRandomMarked(false, gen); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // prune marked/unmarked vertices ////////////////////////////////////////////// |  | ||||||
| // complexity: O(V^2*log(V)) |  | ||||||
| template <typename T> |  | ||||||
| void Graph<T>::removeMarked(const bool isMarked) |  | ||||||
| { |  | ||||||
|     auto isMarkedCopy = isMarked_; |  | ||||||
|      |  | ||||||
|     for (auto &v: isMarkedCopy) |  | ||||||
|     { |  | ||||||
|         if (v.second == isMarked) |  | ||||||
|         { |  | ||||||
|             removeVertex(v.first); |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // complexity: O(V^2*log(V)) |  | ||||||
| template <typename T> |  | ||||||
| void Graph<T>::removeUnmarked(void) |  | ||||||
| { |  | ||||||
|     removeMarked(false); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // depth-first search marking ////////////////////////////////////////////////// |  | ||||||
| // complexity: O(V*log(V)) |  | ||||||
| template <typename T> |  | ||||||
| void Graph<T>::depthFirstSearch(void) |  | ||||||
| { |  | ||||||
|     depthFirstSearch(isMarked_.begin()->first); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // complexity: O(V*log(V)) |  | ||||||
| template <typename T> |  | ||||||
| void Graph<T>::depthFirstSearch(const T &root) |  | ||||||
| { |  | ||||||
|     std::vector<T> adjacentVertex; |  | ||||||
|      |  | ||||||
|     mark(root); |  | ||||||
|     adjacentVertex = getAdjacentVertices(root); |  | ||||||
|     for (auto &v: adjacentVertex) |  | ||||||
|     { |  | ||||||
|         if (!isMarked(v)) |  | ||||||
|         { |  | ||||||
|             depthFirstSearch(v); |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // graph topological manipulations ///////////////////////////////////////////// |  | ||||||
| // complexity: O(V*log(V)) |  | ||||||
| template <typename T> |  | ||||||
| std::vector<T> Graph<T>::getAdjacentVertices(const T &value) const |  | ||||||
| { |  | ||||||
|     std::vector<T> adjacentVertex; |  | ||||||
|      |  | ||||||
|     auto pred = [&value](const Edge &e) |  | ||||||
|     { |  | ||||||
|         return ((e.first == value) or (e.second == value)); |  | ||||||
|     }; |  | ||||||
|     auto eIt = std::find_if(edgeSet_.begin(), edgeSet_.end(), pred); |  | ||||||
|      |  | ||||||
|     while (eIt != edgeSet_.end()) |  | ||||||
|     { |  | ||||||
|         if (eIt->first == value) |  | ||||||
|         { |  | ||||||
|             adjacentVertex.push_back((*eIt).second); |  | ||||||
|         } |  | ||||||
|         else if (eIt->second == value) |  | ||||||
|         { |  | ||||||
|             adjacentVertex.push_back((*eIt).first); |  | ||||||
|         } |  | ||||||
|         eIt = std::find_if(++eIt, edgeSet_.end(), pred); |  | ||||||
|     } |  | ||||||
|      |  | ||||||
|     return adjacentVertex; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // complexity: O(V*log(V)) |  | ||||||
| template <typename T> |  | ||||||
| std::vector<T> Graph<T>::getChildren(const T &value) const |  | ||||||
| { |  | ||||||
|     std::vector<T> child; |  | ||||||
|      |  | ||||||
|     auto pred = [&value](const Edge &e) |  | ||||||
|     { |  | ||||||
|         return (e.first == value); |  | ||||||
|     }; |  | ||||||
|     auto eIt = std::find_if(edgeSet_.begin(), edgeSet_.end(), pred); |  | ||||||
|      |  | ||||||
|     while (eIt != edgeSet_.end()) |  | ||||||
|     { |  | ||||||
|         child.push_back((*eIt).second); |  | ||||||
|         eIt = std::find_if(++eIt, edgeSet_.end(), pred); |  | ||||||
|     } |  | ||||||
|      |  | ||||||
|     return child; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // complexity: O(V*log(V)) |  | ||||||
| template <typename T> |  | ||||||
| std::vector<T> Graph<T>::getParents(const T &value) const |  | ||||||
| { |  | ||||||
|     std::vector<T> parent; |  | ||||||
|      |  | ||||||
|     auto pred = [&value](const Edge &e) |  | ||||||
|     { |  | ||||||
|         return (e.second == value); |  | ||||||
|     }; |  | ||||||
|     auto eIt = std::find_if(edgeSet_.begin(), edgeSet_.end(), pred); |  | ||||||
|      |  | ||||||
|     while (eIt != edgeSet_.end()) |  | ||||||
|     { |  | ||||||
|         parent.push_back((*eIt).first); |  | ||||||
|         eIt = std::find_if(++eIt, edgeSet_.end(), pred); |  | ||||||
|     } |  | ||||||
|      |  | ||||||
|     return parent; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // complexity: O(V^2*log(V)) |  | ||||||
| template <typename T> |  | ||||||
| std::vector<T> Graph<T>::getRoots(void) const |  | ||||||
| { |  | ||||||
|     std::vector<T> root; |  | ||||||
|      |  | ||||||
|     for (auto &v: isMarked_) |  | ||||||
|     { |  | ||||||
|         auto parent = getParents(v.first); |  | ||||||
|          |  | ||||||
|         if (parent.size() == 0) |  | ||||||
|         { |  | ||||||
|             root.push_back(v.first); |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|      |  | ||||||
|     return root; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // complexity: O(V^2*log(V)) |  | ||||||
| template <typename T> |  | ||||||
| std::vector<Graph<T>> Graph<T>::getConnectedComponents(void) const |  | ||||||
| { |  | ||||||
|     std::vector<Graph<T>> res; |  | ||||||
|     Graph<T>              copy(*this); |  | ||||||
|      |  | ||||||
|     while (copy.size() > 0) |  | ||||||
|     { |  | ||||||
|         copy.depthFirstSearch(); |  | ||||||
|         res.push_back(copy); |  | ||||||
|         res.back().removeUnmarked(); |  | ||||||
|         res.back().unmarkAll(); |  | ||||||
|         copy.removeMarked(); |  | ||||||
|         copy.unmarkAll(); |  | ||||||
|     } |  | ||||||
|      |  | ||||||
|     return res; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // topological sort using a directed DFS algorithm |  | ||||||
| // complexity: O(V*log(V)) |  | ||||||
| template <typename T> |  | ||||||
| std::vector<T> Graph<T>::topoSort(void) |  | ||||||
| { |  | ||||||
|     std::stack<T>     buf; |  | ||||||
|     std::vector<T>    res; |  | ||||||
|     const T           *vPt; |  | ||||||
|     std::map<T, bool> tmpMarked(isMarked_); |  | ||||||
|  |  | ||||||
|     // visit function |  | ||||||
|     std::function<void(const T &)> visit = [&](const T &v) |  | ||||||
|     { |  | ||||||
|         if (tmpMarked.at(v)) |  | ||||||
|         { |  | ||||||
|             HADRON_ERROR(Range, "cannot topologically sort a cyclic graph"); |  | ||||||
|         } |  | ||||||
|         if (!isMarked(v)) |  | ||||||
|         { |  | ||||||
|             std::vector<T> child = getChildren(v); |  | ||||||
|  |  | ||||||
|             tmpMarked[v] = true; |  | ||||||
|             for (auto &c: child) |  | ||||||
|             { |  | ||||||
|                 visit(c); |  | ||||||
|             } |  | ||||||
|             mark(v); |  | ||||||
|             tmpMarked[v] = false; |  | ||||||
|             buf.push(v); |  | ||||||
|         } |  | ||||||
|     }; |  | ||||||
|      |  | ||||||
|     // reset temporary marks |  | ||||||
|     for (auto &v: tmpMarked) |  | ||||||
|     { |  | ||||||
|         tmpMarked.at(v.first) = false; |  | ||||||
|     } |  | ||||||
|      |  | ||||||
|     // loop on unmarked vertices |  | ||||||
|     unmarkAll(); |  | ||||||
|     vPt = getFirstUnmarked(); |  | ||||||
|     while (vPt) |  | ||||||
|     { |  | ||||||
|         visit(*vPt); |  | ||||||
|         vPt = getFirstUnmarked(); |  | ||||||
|     } |  | ||||||
|     unmarkAll(); |  | ||||||
|      |  | ||||||
|     // create result vector |  | ||||||
|     while (!buf.empty()) |  | ||||||
|     { |  | ||||||
|         res.push_back(buf.top()); |  | ||||||
|         buf.pop(); |  | ||||||
|     } |  | ||||||
|      |  | ||||||
|     return res; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // random version of the topological sort |  | ||||||
| // complexity: O(V*log(V)) |  | ||||||
| template <typename T> |  | ||||||
| template <typename Gen> |  | ||||||
| std::vector<T> Graph<T>::topoSort(Gen &gen) |  | ||||||
| { |  | ||||||
|     std::stack<T>     buf; |  | ||||||
|     std::vector<T>    res; |  | ||||||
|     const T           *vPt; |  | ||||||
|     std::map<T, bool> tmpMarked(isMarked_); |  | ||||||
|      |  | ||||||
|     // visit function |  | ||||||
|     std::function<void(const T &)> visit = [&](const T &v) |  | ||||||
|     { |  | ||||||
|         if (tmpMarked.at(v)) |  | ||||||
|         { |  | ||||||
|             HADRON_ERROR(Range, "cannot topologically sort a cyclic graph"); |  | ||||||
|         } |  | ||||||
|         if (!isMarked(v)) |  | ||||||
|         { |  | ||||||
|             std::vector<T> child = getChildren(v); |  | ||||||
|              |  | ||||||
|             tmpMarked[v] = true; |  | ||||||
|             std::shuffle(child.begin(), child.end(), gen); |  | ||||||
|             for (auto &c: child) |  | ||||||
|             { |  | ||||||
|                 visit(c); |  | ||||||
|             } |  | ||||||
|             mark(v); |  | ||||||
|             tmpMarked[v] = false; |  | ||||||
|             buf.push(v); |  | ||||||
|         } |  | ||||||
|     }; |  | ||||||
|      |  | ||||||
|     // reset temporary marks |  | ||||||
|     for (auto &v: tmpMarked) |  | ||||||
|     { |  | ||||||
|         tmpMarked.at(v.first) = false; |  | ||||||
|     } |  | ||||||
|      |  | ||||||
|     // loop on unmarked vertices |  | ||||||
|     unmarkAll(); |  | ||||||
|     vPt = getRandomUnmarked(gen); |  | ||||||
|     while (vPt) |  | ||||||
|     { |  | ||||||
|         visit(*vPt); |  | ||||||
|         vPt = getRandomUnmarked(gen); |  | ||||||
|     } |  | ||||||
|     unmarkAll(); |  | ||||||
|      |  | ||||||
|     // create result vector |  | ||||||
|     while (!buf.empty()) |  | ||||||
|     { |  | ||||||
|         res.push_back(buf.top()); |  | ||||||
|         buf.pop(); |  | ||||||
|     } |  | ||||||
|      |  | ||||||
|     return res; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // generate all possible topological sorts |  | ||||||
| // Y. L. Varol & D. Rotem, Comput. J. 24(1), pp. 83–84, 1981 |  | ||||||
| // http://comjnl.oupjournals.org/cgi/doi/10.1093/comjnl/24.1.83 |  | ||||||
| // complexity: O(V*log(V)) (from the paper, but really ?) |  | ||||||
| template <typename T> |  | ||||||
| std::vector<std::vector<T>> Graph<T>::allTopoSort(void) |  | ||||||
| { |  | ||||||
|     std::vector<std::vector<T>>    res; |  | ||||||
|     std::map<T, std::map<T, bool>> iMat; |  | ||||||
|      |  | ||||||
|     // create incidence matrix |  | ||||||
|     for (auto &v1: isMarked_) |  | ||||||
|     for (auto &v2: isMarked_) |  | ||||||
|     { |  | ||||||
|         iMat[v1.first][v2.first] = false; |  | ||||||
|     } |  | ||||||
|     for (auto &v: isMarked_) |  | ||||||
|     { |  | ||||||
|         auto cVec = getChildren(v.first); |  | ||||||
|          |  | ||||||
|         for (auto &c: cVec) |  | ||||||
|         { |  | ||||||
|             iMat[v.first][c] = true; |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|      |  | ||||||
|     // generate initial topological sort |  | ||||||
|     res.push_back(topoSort()); |  | ||||||
|      |  | ||||||
|     // generate all other topological sorts by permutation |  | ||||||
|     std::vector<T>            p = res[0]; |  | ||||||
|     const unsigned int        n = size(); |  | ||||||
|     std::vector<unsigned int> loc(n); |  | ||||||
|     unsigned int              i, k, k1; |  | ||||||
|     T                         obj_k, obj_k1; |  | ||||||
|     bool                      isFinal; |  | ||||||
|      |  | ||||||
|     for (unsigned int j = 0; j < n; ++j) |  | ||||||
|     { |  | ||||||
|         loc[j] = j; |  | ||||||
|     } |  | ||||||
|     i = 0; |  | ||||||
|     while (i < n-1) |  | ||||||
|     { |  | ||||||
|         k      = loc[i]; |  | ||||||
|         k1     = k + 1; |  | ||||||
|         obj_k  = p[k]; |  | ||||||
|         if (k1 >= n) |  | ||||||
|         { |  | ||||||
|             isFinal = true; |  | ||||||
|             obj_k1  = obj_k; |  | ||||||
|         } |  | ||||||
|         else |  | ||||||
|         { |  | ||||||
|             isFinal = false; |  | ||||||
|             obj_k1  = p[k1]; |  | ||||||
|         } |  | ||||||
|         if (iMat[res[0][i]][obj_k1] or isFinal) |  | ||||||
|         { |  | ||||||
|             for (unsigned int l = k; l >= i + 1; --l) |  | ||||||
|             { |  | ||||||
|                 p[l]   = p[l-1]; |  | ||||||
|             } |  | ||||||
|             p[i]   = obj_k; |  | ||||||
|             loc[i] = i; |  | ||||||
|             i++; |  | ||||||
|         } |  | ||||||
|         else |  | ||||||
|         { |  | ||||||
|             p[k]   = obj_k1; |  | ||||||
|             p[k1]  = obj_k; |  | ||||||
|             loc[i] = k1; |  | ||||||
|             i      = 0; |  | ||||||
|             res.push_back(p); |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|      |  | ||||||
|     return res; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // build depedency matrix from topological sorts /////////////////////////////// |  | ||||||
| // complexity: something like O(V^2*log(V!)) |  | ||||||
| template <typename T> |  | ||||||
| std::map<T, std::map<T, bool>> |  | ||||||
| makeDependencyMatrix(const std::vector<std::vector<T>> &topSort) |  | ||||||
| { |  | ||||||
|     std::map<T, std::map<T, bool>> m; |  | ||||||
|     const std::vector<T>           &vList = topSort[0]; |  | ||||||
|      |  | ||||||
|     for (auto &v1: vList) |  | ||||||
|     for (auto &v2: vList) |  | ||||||
|     { |  | ||||||
|         bool dep = true; |  | ||||||
|          |  | ||||||
|         for (auto &t: topSort) |  | ||||||
|         { |  | ||||||
|             auto i1 = std::find(t.begin(), t.end(), v1); |  | ||||||
|             auto i2 = std::find(t.begin(), t.end(), v2); |  | ||||||
|              |  | ||||||
|             dep = dep and (i1 - i2 > 0); |  | ||||||
|             if (!dep) break; |  | ||||||
|         } |  | ||||||
|         m[v1][v2] = dep; |  | ||||||
|     } |  | ||||||
|      |  | ||||||
|     return m; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| END_HADRONS_NAMESPACE |  | ||||||
|  |  | ||||||
| #endif // Hadrons_Graph_hpp_ |  | ||||||
| @@ -1,73 +0,0 @@ | |||||||
| /************************************************************************************* |  | ||||||
|  |  | ||||||
| Grid physics library, www.github.com/paboyle/Grid  |  | ||||||
|  |  | ||||||
| Source file: extras/Hadrons/HadronsXmlRun.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/Application.hpp> |  | ||||||
|  |  | ||||||
| using namespace Grid; |  | ||||||
| using namespace QCD; |  | ||||||
| using namespace Hadrons; |  | ||||||
|  |  | ||||||
| int main(int argc, char *argv[]) |  | ||||||
| { |  | ||||||
|     // parse command line |  | ||||||
|     std::string parameterFileName, scheduleFileName = ""; |  | ||||||
|      |  | ||||||
|     if (argc < 2) |  | ||||||
|     { |  | ||||||
|         std::cerr << "usage: " << argv[0] << " <parameter file> [<precomputed schedule>] [Grid options]"; |  | ||||||
|         std::cerr << std::endl; |  | ||||||
|         std::exit(EXIT_FAILURE); |  | ||||||
|     } |  | ||||||
|     parameterFileName = argv[1]; |  | ||||||
|     if (argc > 2) |  | ||||||
|     { |  | ||||||
|         if (argv[2][0] != '-') |  | ||||||
|         { |  | ||||||
|             scheduleFileName = argv[2]; |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|      |  | ||||||
|     // initialization |  | ||||||
|     Grid_init(&argc, &argv); |  | ||||||
|      |  | ||||||
|     // execution |  | ||||||
|     Application application(parameterFileName); |  | ||||||
|      |  | ||||||
|     application.parseParameterFile(parameterFileName); |  | ||||||
|     if (!scheduleFileName.empty()) |  | ||||||
|     { |  | ||||||
|         application.loadSchedule(scheduleFileName); |  | ||||||
|     } |  | ||||||
|     application.run(); |  | ||||||
|      |  | ||||||
|     // epilogue |  | ||||||
|     LOG(Message) << "Grid is finalizing now" << std::endl; |  | ||||||
|     Grid_finalize(); |  | ||||||
|      |  | ||||||
|     return EXIT_SUCCESS; |  | ||||||
| } |  | ||||||
| @@ -1,65 +0,0 @@ | |||||||
| /************************************************************************************* |  | ||||||
|  |  | ||||||
| Grid physics library, www.github.com/paboyle/Grid  |  | ||||||
|  |  | ||||||
| Source file: extras/Hadrons/HadronsXmlSchedule.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/Application.hpp> |  | ||||||
|  |  | ||||||
| using namespace Grid; |  | ||||||
| using namespace QCD; |  | ||||||
| using namespace Hadrons; |  | ||||||
|  |  | ||||||
| int main(int argc, char *argv[]) |  | ||||||
| { |  | ||||||
|     // parse command line |  | ||||||
|     std::string parameterFileName, scheduleFileName; |  | ||||||
|      |  | ||||||
|     if (argc < 3) |  | ||||||
|     { |  | ||||||
|         std::cerr << "usage: " << argv[0] << " <parameter file> <schedule output> [Grid options]"; |  | ||||||
|         std::cerr << std::endl; |  | ||||||
|         std::exit(EXIT_FAILURE); |  | ||||||
|     } |  | ||||||
|     parameterFileName = argv[1]; |  | ||||||
|     scheduleFileName  = argv[2]; |  | ||||||
|      |  | ||||||
|     // initialization |  | ||||||
|     Grid_init(&argc, &argv); |  | ||||||
|      |  | ||||||
|     // execution |  | ||||||
|     Application application; |  | ||||||
|      |  | ||||||
|     application.parseParameterFile(parameterFileName); |  | ||||||
|     application.schedule(); |  | ||||||
|     application.printSchedule(); |  | ||||||
|     application.saveSchedule(scheduleFileName); |  | ||||||
|      |  | ||||||
|     // epilogue |  | ||||||
|     LOG(Message) << "Grid is finalizing now" << std::endl; |  | ||||||
|     Grid_finalize(); |  | ||||||
|      |  | ||||||
|     return EXIT_SUCCESS; |  | ||||||
| } |  | ||||||
| @@ -1,33 +0,0 @@ | |||||||
| lib_LIBRARIES = libHadrons.a |  | ||||||
| bin_PROGRAMS  = HadronsXmlRun HadronsXmlSchedule |  | ||||||
|  |  | ||||||
| include modules.inc |  | ||||||
|  |  | ||||||
| libHadrons_a_SOURCES = \ |  | ||||||
|     $(modules_cc)      \ |  | ||||||
|     Application.cc     \ |  | ||||||
|     Environment.cc     \ |  | ||||||
| 	Exceptions.cc      \ |  | ||||||
|     Global.cc          \ |  | ||||||
|     Module.cc		   \ |  | ||||||
| 	VirtualMachine.cc |  | ||||||
| libHadrons_adir = $(pkgincludedir)/Hadrons |  | ||||||
| nobase_libHadrons_a_HEADERS = \ |  | ||||||
| 	$(modules_hpp)            \ |  | ||||||
| 	Application.hpp           \ |  | ||||||
| 	Environment.hpp           \ |  | ||||||
| 	Exceptions.hpp            \ |  | ||||||
| 	Factory.hpp               \ |  | ||||||
| 	GeneticScheduler.hpp      \ |  | ||||||
| 	Global.hpp                \ |  | ||||||
| 	Graph.hpp                 \ |  | ||||||
| 	Module.hpp                \ |  | ||||||
| 	Modules.hpp               \ |  | ||||||
| 	ModuleFactory.hpp         \ |  | ||||||
| 	VirtualMachine.hpp |  | ||||||
|  |  | ||||||
| HadronsXmlRun_SOURCES = HadronsXmlRun.cc |  | ||||||
| HadronsXmlRun_LDADD   = libHadrons.a -lGrid |  | ||||||
|  |  | ||||||
| HadronsXmlSchedule_SOURCES = HadronsXmlSchedule.cc |  | ||||||
| HadronsXmlSchedule_LDADD   = libHadrons.a -lGrid |  | ||||||
| @@ -1,61 +0,0 @@ | |||||||
| /************************************************************************************* |  | ||||||
|  |  | ||||||
| Grid physics library, www.github.com/paboyle/Grid  |  | ||||||
|  |  | ||||||
| Source file: extras/Hadrons/Module.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/Module.hpp> |  | ||||||
|  |  | ||||||
| using namespace Grid; |  | ||||||
| using namespace QCD; |  | ||||||
| using namespace Hadrons; |  | ||||||
|  |  | ||||||
| /****************************************************************************** |  | ||||||
|  *                       ModuleBase implementation                            * |  | ||||||
|  ******************************************************************************/ |  | ||||||
| // constructor ///////////////////////////////////////////////////////////////// |  | ||||||
| ModuleBase::ModuleBase(const std::string name) |  | ||||||
| : name_(name) |  | ||||||
| {} |  | ||||||
|  |  | ||||||
| // access ////////////////////////////////////////////////////////////////////// |  | ||||||
| std::string ModuleBase::getName(void) const |  | ||||||
| { |  | ||||||
|     return name_; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // get factory registration name if available |  | ||||||
| std::string ModuleBase::getRegisteredName(void) |  | ||||||
| { |  | ||||||
|     HADRON_ERROR(Definition, "module '" + getName() + "' has no registered type" |  | ||||||
|                  + " in the factory"); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // execution /////////////////////////////////////////////////////////////////// |  | ||||||
| void ModuleBase::operator()(void) |  | ||||||
| { |  | ||||||
|     setup(); |  | ||||||
|     execute(); |  | ||||||
| } |  | ||||||
| @@ -1,254 +0,0 @@ | |||||||
| /************************************************************************************* |  | ||||||
|  |  | ||||||
| Grid physics library, www.github.com/paboyle/Grid  |  | ||||||
|  |  | ||||||
| Source file: extras/Hadrons/Module.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_Module_hpp_ |  | ||||||
| #define Hadrons_Module_hpp_ |  | ||||||
|  |  | ||||||
| #include <Grid/Hadrons/Global.hpp> |  | ||||||
| #include <Grid/Hadrons/VirtualMachine.hpp> |  | ||||||
|  |  | ||||||
| BEGIN_HADRONS_NAMESPACE |  | ||||||
|  |  | ||||||
| // module registration macros |  | ||||||
| #define MODULE_REGISTER(mod, base)\ |  | ||||||
| class mod: public base\ |  | ||||||
| {\ |  | ||||||
| public:\ |  | ||||||
|     typedef base Base;\ |  | ||||||
|     using Base::Base;\ |  | ||||||
|     virtual std::string getRegisteredName(void)\ |  | ||||||
|     {\ |  | ||||||
|         return std::string(#mod);\ |  | ||||||
|     }\ |  | ||||||
| };\ |  | ||||||
| class mod##ModuleRegistrar\ |  | ||||||
| {\ |  | ||||||
| public:\ |  | ||||||
|     mod##ModuleRegistrar(void)\ |  | ||||||
|     {\ |  | ||||||
|         ModuleFactory &modFac = ModuleFactory::getInstance();\ |  | ||||||
|         modFac.registerBuilder(#mod, [&](const std::string name)\ |  | ||||||
|                               {\ |  | ||||||
|                                   return std::unique_ptr<mod>(new mod(name));\ |  | ||||||
|                               });\ |  | ||||||
|     }\ |  | ||||||
| };\ |  | ||||||
| static mod##ModuleRegistrar mod##ModuleRegistrarInstance; |  | ||||||
|  |  | ||||||
| #define MODULE_REGISTER_NS(mod, base, ns)\ |  | ||||||
| class mod: public base\ |  | ||||||
| {\ |  | ||||||
| public:\ |  | ||||||
|     typedef base Base;\ |  | ||||||
|     using Base::Base;\ |  | ||||||
|     virtual std::string getRegisteredName(void)\ |  | ||||||
|     {\ |  | ||||||
|         return std::string(#ns "::" #mod);\ |  | ||||||
|     }\ |  | ||||||
| };\ |  | ||||||
| class ns##mod##ModuleRegistrar\ |  | ||||||
| {\ |  | ||||||
| public:\ |  | ||||||
|     ns##mod##ModuleRegistrar(void)\ |  | ||||||
|     {\ |  | ||||||
|         ModuleFactory &modFac = ModuleFactory::getInstance();\ |  | ||||||
|         modFac.registerBuilder(#ns "::" #mod, [&](const std::string name)\ |  | ||||||
|                               {\ |  | ||||||
|                                   return std::unique_ptr<ns::mod>(new ns::mod(name));\ |  | ||||||
|                               });\ |  | ||||||
|     }\ |  | ||||||
| };\ |  | ||||||
| static ns##mod##ModuleRegistrar ns##mod##ModuleRegistrarInstance; |  | ||||||
|  |  | ||||||
| #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                                    * |  | ||||||
|  ******************************************************************************/ |  | ||||||
| // base class |  | ||||||
| class ModuleBase |  | ||||||
| { |  | ||||||
| public: |  | ||||||
|     // constructor |  | ||||||
|     ModuleBase(const std::string name); |  | ||||||
|     // destructor |  | ||||||
|     virtual ~ModuleBase(void) = default; |  | ||||||
|     // access |  | ||||||
|     std::string getName(void) const; |  | ||||||
|     // get factory registration name if available |  | ||||||
|     virtual std::string getRegisteredName(void); |  | ||||||
|     // dependencies/products |  | ||||||
|     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; |  | ||||||
|     // parse parameters |  | ||||||
|     virtual void parseParameters(XmlReader &reader, const std::string name) = 0; |  | ||||||
|     virtual void saveParameters(XmlWriter &writer, const std::string name) = 0; |  | ||||||
|     // setup |  | ||||||
|     virtual void setup(void) {}; |  | ||||||
|     virtual void execute(void) = 0; |  | ||||||
|     // execution |  | ||||||
|     void operator()(void); |  | ||||||
| protected: |  | ||||||
|     // environment shortcut |  | ||||||
|     DEFINE_ENV_ALIAS; |  | ||||||
|     // virtual machine shortcut |  | ||||||
|     DEFINE_VM_ALIAS; |  | ||||||
| private: |  | ||||||
|     std::string name_; |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| // derived class, templating the parameter class |  | ||||||
| template <typename P> |  | ||||||
| class Module: public ModuleBase |  | ||||||
| { |  | ||||||
| public: |  | ||||||
|     typedef P Par; |  | ||||||
| public: |  | ||||||
|     // constructor |  | ||||||
|     Module(const std::string name); |  | ||||||
|     // destructor |  | ||||||
|     virtual ~Module(void) = default; |  | ||||||
|     // parse parameters |  | ||||||
|     virtual void parseParameters(XmlReader &reader, const std::string name); |  | ||||||
|     virtual void saveParameters(XmlWriter &writer, const std::string name); |  | ||||||
|     // parameter access |  | ||||||
|     const P & par(void) const; |  | ||||||
|     void      setPar(const P &par); |  | ||||||
| private: |  | ||||||
|     P par_; |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| // no parameter type |  | ||||||
| class NoPar {}; |  | ||||||
|  |  | ||||||
| template <> |  | ||||||
| class Module<NoPar>: public ModuleBase |  | ||||||
| { |  | ||||||
| public: |  | ||||||
|     // constructor |  | ||||||
|     Module(const std::string name): ModuleBase(name) {}; |  | ||||||
|     // destructor |  | ||||||
|     virtual ~Module(void) = default; |  | ||||||
|     // parse parameters (do nothing) |  | ||||||
|     virtual void parseParameters(XmlReader &reader, const std::string name) {}; |  | ||||||
|     virtual void saveParameters(XmlWriter &writer, const std::string name) |  | ||||||
|     { |  | ||||||
|         push(writer, "options"); |  | ||||||
|         pop(writer); |  | ||||||
|     }; |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| /****************************************************************************** |  | ||||||
|  *                           Template implementation                          * |  | ||||||
|  ******************************************************************************/ |  | ||||||
| template <typename P> |  | ||||||
| Module<P>::Module(const std::string name) |  | ||||||
| : ModuleBase(name) |  | ||||||
| {} |  | ||||||
|  |  | ||||||
| template <typename P> |  | ||||||
| void Module<P>::parseParameters(XmlReader &reader, const std::string name) |  | ||||||
| { |  | ||||||
|     read(reader, name, par_); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| template <typename P> |  | ||||||
| void Module<P>::saveParameters(XmlWriter &writer, const std::string name) |  | ||||||
| { |  | ||||||
|     write(writer, name, par_); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| template <typename P> |  | ||||||
| const P & Module<P>::par(void) const |  | ||||||
| { |  | ||||||
|     return par_; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| template <typename P> |  | ||||||
| void Module<P>::setPar(const P &par) |  | ||||||
| { |  | ||||||
|     par_ = par; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| END_HADRONS_NAMESPACE |  | ||||||
|  |  | ||||||
| #endif // Hadrons_Module_hpp_ |  | ||||||
| @@ -1,48 +0,0 @@ | |||||||
| /************************************************************************************* |  | ||||||
|  |  | ||||||
| Grid physics library, www.github.com/paboyle/Grid  |  | ||||||
|  |  | ||||||
| Source file: extras/Hadrons/ModuleFactory.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_ModuleFactory_hpp_ |  | ||||||
| #define Hadrons_ModuleFactory_hpp_ |  | ||||||
|  |  | ||||||
| #include <Grid/Hadrons/Global.hpp> |  | ||||||
| #include <Grid/Hadrons/Factory.hpp> |  | ||||||
| #include <Grid/Hadrons/Module.hpp> |  | ||||||
|  |  | ||||||
| BEGIN_HADRONS_NAMESPACE |  | ||||||
|  |  | ||||||
| /****************************************************************************** |  | ||||||
|  *                            ModuleFactory                                   * |  | ||||||
|  ******************************************************************************/ |  | ||||||
| class ModuleFactory: public Factory<ModuleBase> |  | ||||||
| { |  | ||||||
|     SINGLETON_DEFCTOR(ModuleFactory) |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| END_HADRONS_NAMESPACE |  | ||||||
|  |  | ||||||
| #endif // Hadrons_ModuleFactory_hpp_ |  | ||||||
| @@ -1,64 +0,0 @@ | |||||||
| /************************************************************************************* |  | ||||||
|  |  | ||||||
| Grid physics library, www.github.com/paboyle/Grid  |  | ||||||
|  |  | ||||||
| Source file: extras/Hadrons/Modules.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 */ |  | ||||||
| #include <Grid/Hadrons/Modules/MContraction/Baryon.hpp> |  | ||||||
| #include <Grid/Hadrons/Modules/MContraction/Meson.hpp> |  | ||||||
| #include <Grid/Hadrons/Modules/MContraction/WeakHamiltonian.hpp> |  | ||||||
| #include <Grid/Hadrons/Modules/MContraction/WeakHamiltonianNonEye.hpp> |  | ||||||
| #include <Grid/Hadrons/Modules/MContraction/DiscLoop.hpp> |  | ||||||
| #include <Grid/Hadrons/Modules/MContraction/WeakNeutral4ptDisc.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/Point.hpp> |  | ||||||
| #include <Grid/Hadrons/Modules/MSource/Wall.hpp> |  | ||||||
| #include <Grid/Hadrons/Modules/MSource/Z2.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> |  | ||||||
| @@ -1,135 +0,0 @@ | |||||||
| /************************************************************************************* |  | ||||||
|  |  | ||||||
| Grid physics library, www.github.com/paboyle/Grid  |  | ||||||
|  |  | ||||||
| Source file: extras/Hadrons/Modules/MAction/DWF.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_MAction_DWF_hpp_ |  | ||||||
| #define Hadrons_MAction_DWF_hpp_ |  | ||||||
|  |  | ||||||
| #include <Grid/Hadrons/Global.hpp> |  | ||||||
| #include <Grid/Hadrons/Module.hpp> |  | ||||||
| #include <Grid/Hadrons/ModuleFactory.hpp> |  | ||||||
|  |  | ||||||
| BEGIN_HADRONS_NAMESPACE |  | ||||||
|  |  | ||||||
| /****************************************************************************** |  | ||||||
|  *                     Domain wall quark action                               * |  | ||||||
|  ******************************************************************************/ |  | ||||||
| BEGIN_MODULE_NAMESPACE(MAction) |  | ||||||
|  |  | ||||||
| class DWFPar: Serializable |  | ||||||
| { |  | ||||||
| public: |  | ||||||
|     GRID_SERIALIZABLE_CLASS_MEMBERS(DWFPar, |  | ||||||
|                                     std::string, gauge, |  | ||||||
|                                     unsigned int, Ls, |  | ||||||
|                                     double      , mass, |  | ||||||
|                                     double      , M5, |  | ||||||
|                                     std::string , boundary); |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| template <typename FImpl> |  | ||||||
| class TDWF: public Module<DWFPar> |  | ||||||
| { |  | ||||||
| public: |  | ||||||
|     FGS_TYPE_ALIASES(FImpl,); |  | ||||||
| public: |  | ||||||
|     // constructor |  | ||||||
|     TDWF(const std::string name); |  | ||||||
|     // destructor |  | ||||||
|     virtual ~TDWF(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(DWF, TDWF<FIMPL>, MAction); |  | ||||||
|  |  | ||||||
| /****************************************************************************** |  | ||||||
|  *                        DWF template implementation                         * |  | ||||||
|  ******************************************************************************/ |  | ||||||
| // constructor ///////////////////////////////////////////////////////////////// |  | ||||||
| template <typename FImpl> |  | ||||||
| TDWF<FImpl>::TDWF(const std::string name) |  | ||||||
| : Module<DWFPar>(name) |  | ||||||
| {} |  | ||||||
|  |  | ||||||
| // dependencies/products /////////////////////////////////////////////////////// |  | ||||||
| template <typename FImpl> |  | ||||||
| std::vector<std::string> TDWF<FImpl>::getInput(void) |  | ||||||
| { |  | ||||||
|     std::vector<std::string> in = {par().gauge}; |  | ||||||
|      |  | ||||||
|     return in; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| template <typename FImpl> |  | ||||||
| std::vector<std::string> TDWF<FImpl>::getOutput(void) |  | ||||||
| { |  | ||||||
|     std::vector<std::string> out = {getName()}; |  | ||||||
|      |  | ||||||
|     return out; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // setup /////////////////////////////////////////////////////////////////////// |  | ||||||
| template <typename FImpl> |  | ||||||
| void TDWF<FImpl>::setup(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; |  | ||||||
|     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 /////////////////////////////////////////////////////////////////// |  | ||||||
| template <typename FImpl> |  | ||||||
| void TDWF<FImpl>::execute(void) |  | ||||||
| {} |  | ||||||
|  |  | ||||||
| END_MODULE_NAMESPACE |  | ||||||
|  |  | ||||||
| END_HADRONS_NAMESPACE |  | ||||||
|  |  | ||||||
| #endif // Hadrons_MAction_DWF_hpp_ |  | ||||||
| @@ -1,128 +0,0 @@ | |||||||
| /************************************************************************************* |  | ||||||
|  |  | ||||||
| Grid physics library, www.github.com/paboyle/Grid  |  | ||||||
|  |  | ||||||
| Source file: extras/Hadrons/Modules/MAction/Wilson.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_MAction_Wilson_hpp_ |  | ||||||
| #define Hadrons_MAction_Wilson_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 WilsonPar: Serializable |  | ||||||
| { |  | ||||||
| public: |  | ||||||
|     GRID_SERIALIZABLE_CLASS_MEMBERS(WilsonPar, |  | ||||||
|                                     std::string, gauge, |  | ||||||
|                                     double     , mass, |  | ||||||
|                                     std::string, boundary); |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| template <typename FImpl> |  | ||||||
| class TWilson: public Module<WilsonPar> |  | ||||||
| { |  | ||||||
| public: |  | ||||||
|     FGS_TYPE_ALIASES(FImpl,); |  | ||||||
| public: |  | ||||||
|     // constructor |  | ||||||
|     TWilson(const std::string name); |  | ||||||
|     // destructor |  | ||||||
|     virtual ~TWilson(void) = default; |  | ||||||
|     // dependencies/products |  | ||||||
|     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(Wilson, TWilson<FIMPL>, MAction); |  | ||||||
|  |  | ||||||
| /****************************************************************************** |  | ||||||
|  *                     TWilson template implementation                        * |  | ||||||
|  ******************************************************************************/ |  | ||||||
| // constructor ///////////////////////////////////////////////////////////////// |  | ||||||
| template <typename FImpl> |  | ||||||
| TWilson<FImpl>::TWilson(const std::string name) |  | ||||||
| : Module<WilsonPar>(name) |  | ||||||
| {} |  | ||||||
|  |  | ||||||
| // dependencies/products /////////////////////////////////////////////////////// |  | ||||||
| template <typename FImpl> |  | ||||||
| std::vector<std::string> TWilson<FImpl>::getInput(void) |  | ||||||
| { |  | ||||||
|     std::vector<std::string> in = {par().gauge}; |  | ||||||
|      |  | ||||||
|     return in; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| template <typename FImpl> |  | ||||||
| std::vector<std::string> TWilson<FImpl>::getOutput(void) |  | ||||||
| { |  | ||||||
|     std::vector<std::string> out = {getName()}; |  | ||||||
|      |  | ||||||
|     return out; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // setup /////////////////////////////////////////////////////////////////////// |  | ||||||
| template <typename FImpl> |  | ||||||
| void TWilson<FImpl>::setup(void) |  | ||||||
| { |  | ||||||
|     LOG(Message) << "Setting up TWilson fermion matrix with m= " << par().mass |  | ||||||
|                  << " using gauge field '" << par().gauge << "'" << std::endl; |  | ||||||
|     LOG(Message) << "Fermion boundary conditions: " << par().boundary |  | ||||||
|                  << 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 /////////////////////////////////////////////////////////////////// |  | ||||||
| template <typename FImpl> |  | ||||||
| void TWilson<FImpl>::execute() |  | ||||||
| {} |  | ||||||
|  |  | ||||||
| END_MODULE_NAMESPACE |  | ||||||
|  |  | ||||||
| END_HADRONS_NAMESPACE |  | ||||||
|  |  | ||||||
| #endif // Hadrons_Wilson_hpp_ |  | ||||||
| @@ -1,153 +0,0 @@ | |||||||
| /************************************************************************************* |  | ||||||
|  |  | ||||||
| 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_ |  | ||||||
| @@ -1,141 +0,0 @@ | |||||||
| /************************************************************************************* |  | ||||||
|  |  | ||||||
| Grid physics library, www.github.com/paboyle/Grid  |  | ||||||
|  |  | ||||||
| Source file: extras/Hadrons/Modules/MContraction/Baryon.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_Baryon_hpp_ |  | ||||||
| #define Hadrons_MContraction_Baryon_hpp_ |  | ||||||
|  |  | ||||||
| #include <Grid/Hadrons/Global.hpp> |  | ||||||
| #include <Grid/Hadrons/Module.hpp> |  | ||||||
| #include <Grid/Hadrons/ModuleFactory.hpp> |  | ||||||
|  |  | ||||||
| BEGIN_HADRONS_NAMESPACE |  | ||||||
|  |  | ||||||
| /****************************************************************************** |  | ||||||
|  *                               Baryon                                       * |  | ||||||
|  ******************************************************************************/ |  | ||||||
| BEGIN_MODULE_NAMESPACE(MContraction) |  | ||||||
|  |  | ||||||
| class BaryonPar: Serializable |  | ||||||
| { |  | ||||||
| public: |  | ||||||
|     GRID_SERIALIZABLE_CLASS_MEMBERS(BaryonPar, |  | ||||||
|                                     std::string, q1, |  | ||||||
|                                     std::string, q2, |  | ||||||
|                                     std::string, q3, |  | ||||||
|                                     std::string, output); |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| template <typename FImpl1, typename FImpl2, typename FImpl3> |  | ||||||
| class TBaryon: public Module<BaryonPar> |  | ||||||
| { |  | ||||||
| public: |  | ||||||
|     FERM_TYPE_ALIASES(FImpl1, 1); |  | ||||||
|     FERM_TYPE_ALIASES(FImpl2, 2); |  | ||||||
|     FERM_TYPE_ALIASES(FImpl3, 3); |  | ||||||
|     class Result: Serializable |  | ||||||
|     { |  | ||||||
|     public: |  | ||||||
|         GRID_SERIALIZABLE_CLASS_MEMBERS(Result, |  | ||||||
|                                         std::vector<std::vector<std::vector<Complex>>>, corr); |  | ||||||
|     }; |  | ||||||
| public: |  | ||||||
|     // constructor |  | ||||||
|     TBaryon(const std::string name); |  | ||||||
|     // destructor |  | ||||||
|     virtual ~TBaryon(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(Baryon, ARG(TBaryon<FIMPL, FIMPL, FIMPL>), MContraction); |  | ||||||
|  |  | ||||||
| /****************************************************************************** |  | ||||||
|  *                         TBaryon implementation                             * |  | ||||||
|  ******************************************************************************/ |  | ||||||
| // constructor ///////////////////////////////////////////////////////////////// |  | ||||||
| template <typename FImpl1, typename FImpl2, typename FImpl3> |  | ||||||
| TBaryon<FImpl1, FImpl2, FImpl3>::TBaryon(const std::string name) |  | ||||||
| : Module<BaryonPar>(name) |  | ||||||
| {} |  | ||||||
|  |  | ||||||
| // dependencies/products /////////////////////////////////////////////////////// |  | ||||||
| template <typename FImpl1, typename FImpl2, typename FImpl3> |  | ||||||
| std::vector<std::string> TBaryon<FImpl1, FImpl2, FImpl3>::getInput(void) |  | ||||||
| { |  | ||||||
|     std::vector<std::string> input = {par().q1, par().q2, par().q3}; |  | ||||||
|      |  | ||||||
|     return input; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| template <typename FImpl1, typename FImpl2, typename FImpl3> |  | ||||||
| std::vector<std::string> TBaryon<FImpl1, FImpl2, FImpl3>::getOutput(void) |  | ||||||
| { |  | ||||||
|     std::vector<std::string> out = {}; |  | ||||||
|      |  | ||||||
|     return out; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // setup /////////////////////////////////////////////////////////////////////// |  | ||||||
| template <typename FImpl1, typename FImpl2, typename FImpl3> |  | ||||||
| void TBaryon<FImpl1, FImpl2, FImpl3>::setup(void) |  | ||||||
| { |  | ||||||
|     envTmpLat(LatticeComplex, "c"); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // execution /////////////////////////////////////////////////////////////////// |  | ||||||
| template <typename FImpl1, typename FImpl2, typename FImpl3> |  | ||||||
| void TBaryon<FImpl1, FImpl2, FImpl3>::execute(void) |  | ||||||
| { |  | ||||||
|     LOG(Message) << "Computing baryon contractions '" << getName() << "' using" |  | ||||||
|                  << " quarks '" << par().q1 << "', '" << par().q2 << "', and '" |  | ||||||
|                  << par().q3 << "'" << std::endl; |  | ||||||
|      |  | ||||||
|     ResultWriter writer(RESULT_FILE_NAME(par().output)); |  | ||||||
|     auto       &q1 = envGet(PropagatorField1, par().q1); |  | ||||||
|     auto       &q2 = envGet(PropagatorField2, par().q2); |  | ||||||
|     auto       &q3 = envGet(PropagatorField3, par().q2); |  | ||||||
|     envGetTmp(LatticeComplex, c); |  | ||||||
|     Result     result; |  | ||||||
|      |  | ||||||
|     // FIXME: do contractions |  | ||||||
|      |  | ||||||
|     // write(writer, "meson", result); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| END_MODULE_NAMESPACE |  | ||||||
|  |  | ||||||
| END_HADRONS_NAMESPACE |  | ||||||
|  |  | ||||||
| #endif // Hadrons_MContraction_Baryon_hpp_ |  | ||||||
| @@ -1,146 +0,0 @@ | |||||||
| /************************************************************************************* |  | ||||||
|  |  | ||||||
| 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_ |  | ||||||
| @@ -1,186 +0,0 @@ | |||||||
| /************************************************************************************* |  | ||||||
|  |  | ||||||
| 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_ |  | ||||||
| @@ -1,249 +0,0 @@ | |||||||
| /************************************************************************************* |  | ||||||
|  |  | ||||||
| Grid physics library, www.github.com/paboyle/Grid  |  | ||||||
|  |  | ||||||
| Source file: extras/Hadrons/Modules/MContraction/Meson.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_Meson_hpp_ |  | ||||||
| #define Hadrons_MContraction_Meson_hpp_ |  | ||||||
|  |  | ||||||
| #include <Grid/Hadrons/Global.hpp> |  | ||||||
| #include <Grid/Hadrons/Module.hpp> |  | ||||||
| #include <Grid/Hadrons/ModuleFactory.hpp> |  | ||||||
|  |  | ||||||
| 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                                       * |  | ||||||
|  ******************************************************************************/ |  | ||||||
| BEGIN_MODULE_NAMESPACE(MContraction) |  | ||||||
|  |  | ||||||
| typedef std::pair<Gamma::Algebra, Gamma::Algebra> GammaPair; |  | ||||||
|  |  | ||||||
| class MesonPar: Serializable |  | ||||||
| { |  | ||||||
| public: |  | ||||||
|     GRID_SERIALIZABLE_CLASS_MEMBERS(MesonPar, |  | ||||||
|                                     std::string, q1, |  | ||||||
|                                     std::string, q2, |  | ||||||
|                                     std::string, gammas, |  | ||||||
|                                     std::string, sink, |  | ||||||
|                                     std::string, output); |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| template <typename FImpl1, typename FImpl2> |  | ||||||
| class TMeson: public Module<MesonPar> |  | ||||||
| { |  | ||||||
| public: |  | ||||||
|     FERM_TYPE_ALIASES(FImpl1, 1); |  | ||||||
|     FERM_TYPE_ALIASES(FImpl2, 2); |  | ||||||
|     FERM_TYPE_ALIASES(ScalarImplCR, Scalar); |  | ||||||
|     SINK_TYPE_ALIASES(Scalar); |  | ||||||
|     class Result: Serializable |  | ||||||
|     { |  | ||||||
|     public: |  | ||||||
|         GRID_SERIALIZABLE_CLASS_MEMBERS(Result, |  | ||||||
|                                         Gamma::Algebra, gamma_snk, |  | ||||||
|                                         Gamma::Algebra, gamma_src, |  | ||||||
|                                         std::vector<Complex>, corr); |  | ||||||
|     }; |  | ||||||
| public: |  | ||||||
|     // constructor |  | ||||||
|     TMeson(const std::string name); |  | ||||||
|     // destructor |  | ||||||
|     virtual ~TMeson(void) = default; |  | ||||||
|     // dependencies/products |  | ||||||
|     virtual std::vector<std::string> getInput(void); |  | ||||||
|     virtual std::vector<std::string> getOutput(void); |  | ||||||
|     virtual void parseGammaString(std::vector<GammaPair> &gammaList); |  | ||||||
| protected: |  | ||||||
|     // execution |  | ||||||
|     virtual void setup(void); |  | ||||||
|     // execution |  | ||||||
|     virtual void execute(void); |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| MODULE_REGISTER_NS(Meson, ARG(TMeson<FIMPL, FIMPL>), MContraction); |  | ||||||
|  |  | ||||||
| /****************************************************************************** |  | ||||||
|  *                           TMeson implementation                            * |  | ||||||
|  ******************************************************************************/ |  | ||||||
| // constructor ///////////////////////////////////////////////////////////////// |  | ||||||
| template <typename FImpl1, typename FImpl2> |  | ||||||
| TMeson<FImpl1, FImpl2>::TMeson(const std::string name) |  | ||||||
| : Module<MesonPar>(name) |  | ||||||
| {} |  | ||||||
|  |  | ||||||
| // dependencies/products /////////////////////////////////////////////////////// |  | ||||||
| template <typename FImpl1, typename FImpl2> |  | ||||||
| std::vector<std::string> TMeson<FImpl1, FImpl2>::getInput(void) |  | ||||||
| { |  | ||||||
|     std::vector<std::string> input = {par().q1, par().q2, par().sink}; |  | ||||||
|      |  | ||||||
|     return input; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| template <typename FImpl1, typename FImpl2> |  | ||||||
| std::vector<std::string> TMeson<FImpl1, FImpl2>::getOutput(void) |  | ||||||
| { |  | ||||||
|     std::vector<std::string> 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 /////////////////////////////////////////////////////////////////// |  | ||||||
| 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> |  | ||||||
| void TMeson<FImpl1, FImpl2>::execute(void) |  | ||||||
| { |  | ||||||
|     LOG(Message) << "Computing meson contractions '" << getName() << "' using" |  | ||||||
|                  << " quarks '" << par().q1 << "' and '" << par().q2 << "'" |  | ||||||
|                  << 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); |  | ||||||
|      |  | ||||||
|     parseGammaString(gammaList); |  | ||||||
|     result.resize(gammaList.size()); |  | ||||||
|     for (unsigned int i = 0; i < result.size(); ++i) |  | ||||||
|     { |  | ||||||
|         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); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| END_MODULE_NAMESPACE |  | ||||||
|  |  | ||||||
| END_HADRONS_NAMESPACE |  | ||||||
|  |  | ||||||
| #endif // Hadrons_MContraction_Meson_hpp_ |  | ||||||
| @@ -1,224 +0,0 @@ | |||||||
| /************************************************************************************* |  | ||||||
|  |  | ||||||
| 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_ |  | ||||||
| @@ -1,118 +0,0 @@ | |||||||
| /************************************************************************************* |  | ||||||
|  |  | ||||||
| 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_ |  | ||||||
| @@ -1,151 +0,0 @@ | |||||||
| /************************************************************************************* |  | ||||||
|  |  | ||||||
| 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); |  | ||||||
| } |  | ||||||
| @@ -1,59 +0,0 @@ | |||||||
| /************************************************************************************* |  | ||||||
|  |  | ||||||
| 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_ |  | ||||||
| @@ -1,148 +0,0 @@ | |||||||
| /************************************************************************************* |  | ||||||
|  |  | ||||||
| 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); |  | ||||||
| } |  | ||||||
| @@ -1,58 +0,0 @@ | |||||||
| /************************************************************************************* |  | ||||||
|  |  | ||||||
| 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_ |  | ||||||
| @@ -1,142 +0,0 @@ | |||||||
| /************************************************************************************* |  | ||||||
|  |  | ||||||
| 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); |  | ||||||
| } |  | ||||||
| @@ -1,60 +0,0 @@ | |||||||
| /************************************************************************************* |  | ||||||
|  |  | ||||||
| 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_ |  | ||||||
| @@ -1,202 +0,0 @@ | |||||||
| /************************************************************************************* |  | ||||||
|  |  | ||||||
| Grid physics library, www.github.com/paboyle/Grid  |  | ||||||
|  |  | ||||||
| Source file: extras/Hadrons/Modules/MFermion/GaugeProp.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_MFermion_GaugeProp_hpp_ |  | ||||||
| #define Hadrons_MFermion_GaugeProp_hpp_ |  | ||||||
|  |  | ||||||
| #include <Grid/Hadrons/Global.hpp> |  | ||||||
| #include <Grid/Hadrons/Module.hpp> |  | ||||||
| #include <Grid/Hadrons/ModuleFactory.hpp> |  | ||||||
|  |  | ||||||
| BEGIN_HADRONS_NAMESPACE |  | ||||||
|  |  | ||||||
| /****************************************************************************** |  | ||||||
|  * 5D -> 4D and 4D -> 5D conversions.                                         * |  | ||||||
|  ******************************************************************************/ |  | ||||||
| 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: |  | ||||||
|     GRID_SERIALIZABLE_CLASS_MEMBERS(GaugePropPar, |  | ||||||
|                                     std::string, source, |  | ||||||
|                                     std::string, solver); |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| template <typename FImpl> |  | ||||||
| class TGaugeProp: public Module<GaugePropPar> |  | ||||||
| { |  | ||||||
| public: |  | ||||||
|     FGS_TYPE_ALIASES(FImpl,); |  | ||||||
| public: |  | ||||||
|     // constructor |  | ||||||
|     TGaugeProp(const std::string name); |  | ||||||
|     // destructor |  | ||||||
|     virtual ~TGaugeProp(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_; |  | ||||||
|     SolverFn     *solver_{nullptr}; |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| MODULE_REGISTER_NS(GaugeProp, TGaugeProp<FIMPL>, MFermion); |  | ||||||
| /****************************************************************************** |  | ||||||
|  *                      TGaugeProp implementation                             * |  | ||||||
|  ******************************************************************************/ |  | ||||||
| // constructor ///////////////////////////////////////////////////////////////// |  | ||||||
| template <typename FImpl> |  | ||||||
| TGaugeProp<FImpl>::TGaugeProp(const std::string name) |  | ||||||
| : Module<GaugePropPar>(name) |  | ||||||
| {} |  | ||||||
|  |  | ||||||
| // dependencies/products /////////////////////////////////////////////////////// |  | ||||||
| template <typename FImpl> |  | ||||||
| std::vector<std::string> TGaugeProp<FImpl>::getInput(void) |  | ||||||
| { |  | ||||||
|     std::vector<std::string> in = {par().source, par().solver}; |  | ||||||
|      |  | ||||||
|     return in; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| template <typename FImpl> |  | ||||||
| std::vector<std::string> TGaugeProp<FImpl>::getOutput(void) |  | ||||||
| { |  | ||||||
|     std::vector<std::string> out = {getName(), getName() + "_5d"}; |  | ||||||
|      |  | ||||||
|     return out; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // setup /////////////////////////////////////////////////////////////////////// |  | ||||||
| template <typename FImpl> |  | ||||||
| void TGaugeProp<FImpl>::setup(void) |  | ||||||
| { |  | ||||||
|     Ls_ = env().getObjectLs(par().solver); |  | ||||||
|     envCreateLat(PropagatorField, getName()); |  | ||||||
|     envTmpLat(FermionField, "source", Ls_); |  | ||||||
|     envTmpLat(FermionField, "sol", Ls_); |  | ||||||
|     envTmpLat(FermionField, "tmp"); |  | ||||||
|     if (Ls_ > 1) |  | ||||||
|     { |  | ||||||
|         envCreateLat(PropagatorField, getName() + "_5d", Ls_); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // execution /////////////////////////////////////////////////////////////////// |  | ||||||
| template <typename FImpl> |  | ||||||
| void TGaugeProp<FImpl>::execute(void) |  | ||||||
| { |  | ||||||
|     LOG(Message) << "Computing quark propagator '" << getName() << "'" |  | ||||||
|                  << std::endl; |  | ||||||
|      |  | ||||||
|     std::string propName = (Ls_ == 1) ? getName() : (getName() + "_5d"); |  | ||||||
|     auto        &prop    = envGet(PropagatorField, propName); |  | ||||||
|     auto        &fullSrc = envGet(PropagatorField, par().source); |  | ||||||
|     auto        &solver  = envGet(SolverFn, par().solver); |  | ||||||
|      |  | ||||||
|     envGetTmp(FermionField, source); |  | ||||||
|     envGetTmp(FermionField, sol); |  | ||||||
|     envGetTmp(FermionField, tmp); |  | ||||||
|     LOG(Message) << "Inverting using solver '" << par().solver |  | ||||||
|                  << "' on source '" << par().source << "'" << std::endl; |  | ||||||
|     for (unsigned int s = 0; s < Ns; ++s) |  | ||||||
|       for (unsigned int c = 0; c < FImpl::Dimension; ++c) |  | ||||||
|     { |  | ||||||
|         LOG(Message) << "Inversion for spin= " << s << ", color= " << c |  | ||||||
|                      << std::endl; |  | ||||||
|         // source conversion for 4D sources |  | ||||||
|         if (!env().isObject5d(par().source)) |  | ||||||
|         { |  | ||||||
|             if (Ls_ == 1) |  | ||||||
|             { |  | ||||||
|                PropToFerm<FImpl>(source, fullSrc, s, c); |  | ||||||
|             } |  | ||||||
|             else |  | ||||||
|             { |  | ||||||
|                 PropToFerm<FImpl>(tmp, fullSrc, s, c); |  | ||||||
|                 make_5D(tmp, source, Ls_); |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|         // source conversion for 5D sources |  | ||||||
|         else |  | ||||||
|         { |  | ||||||
|             if (Ls_ != env().getObjectLs(par().source)) |  | ||||||
|             { |  | ||||||
|                 HADRON_ERROR(Size, "Ls mismatch between quark action and source"); |  | ||||||
|             } |  | ||||||
|             else |  | ||||||
|             { |  | ||||||
|                 PropToFerm<FImpl>(source, fullSrc, s, c); |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|         sol = zero; |  | ||||||
|         solver(sol, source); |  | ||||||
|         FermToProp<FImpl>(prop, sol, s, c); |  | ||||||
|         // create 4D propagators from 5D one if necessary |  | ||||||
|         if (Ls_ > 1) |  | ||||||
|         { |  | ||||||
|             PropagatorField &p4d = envGet(PropagatorField, getName()); |  | ||||||
|             make_4D(sol, tmp, Ls_); |  | ||||||
|             FermToProp<FImpl>(p4d, tmp, s, c); |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| END_MODULE_NAMESPACE |  | ||||||
|  |  | ||||||
| END_HADRONS_NAMESPACE |  | ||||||
|  |  | ||||||
| #endif // Hadrons_MFermion_GaugeProp_hpp_ |  | ||||||
| @@ -1,75 +0,0 @@ | |||||||
| /************************************************************************************* |  | ||||||
|  |  | ||||||
| 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; |  | ||||||
| } |  | ||||||
| @@ -1,77 +0,0 @@ | |||||||
| /************************************************************************************* |  | ||||||
|  |  | ||||||
| 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_ |  | ||||||
| @@ -1,71 +0,0 @@ | |||||||
| /************************************************************************************* |  | ||||||
|  |  | ||||||
| Grid physics library, www.github.com/paboyle/Grid  |  | ||||||
|  |  | ||||||
| Source file: extras/Hadrons/Modules/MGauge/Random.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/Random.hpp> |  | ||||||
|  |  | ||||||
| using namespace Grid; |  | ||||||
| using namespace Hadrons; |  | ||||||
| using namespace MGauge; |  | ||||||
|  |  | ||||||
| /****************************************************************************** |  | ||||||
| *                           TRandom implementation                            * |  | ||||||
| ******************************************************************************/ |  | ||||||
| // constructor ///////////////////////////////////////////////////////////////// |  | ||||||
| TRandom::TRandom(const std::string name) |  | ||||||
| : Module<NoPar>(name) |  | ||||||
| {} |  | ||||||
|  |  | ||||||
| // dependencies/products /////////////////////////////////////////////////////// |  | ||||||
| std::vector<std::string> TRandom::getInput(void) |  | ||||||
| { |  | ||||||
|     std::vector<std::string> in; |  | ||||||
|      |  | ||||||
|     return in; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| std::vector<std::string> TRandom::getOutput(void) |  | ||||||
| { |  | ||||||
|     std::vector<std::string> out = {getName()}; |  | ||||||
|      |  | ||||||
|     return out; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // setup /////////////////////////////////////////////////////////////////////// |  | ||||||
| void TRandom::setup(void) |  | ||||||
| { |  | ||||||
|     envCreateLat(LatticeGaugeField, getName()); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // execution /////////////////////////////////////////////////////////////////// |  | ||||||
| void TRandom::execute(void) |  | ||||||
| { |  | ||||||
|     LOG(Message) << "Generating random gauge configuration" << std::endl; |  | ||||||
|      |  | ||||||
|     auto &U = envGet(LatticeGaugeField, getName()); |  | ||||||
|     SU3::HotConfiguration(*env().get4dRng(), U); |  | ||||||
| } |  | ||||||
| @@ -1,66 +0,0 @@ | |||||||
| /************************************************************************************* |  | ||||||
|  |  | ||||||
| Grid physics library, www.github.com/paboyle/Grid  |  | ||||||
|  |  | ||||||
| Source file: extras/Hadrons/Modules/MGauge/Random.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_Random_hpp_ |  | ||||||
| #define Hadrons_MGauge_Random_hpp_ |  | ||||||
|  |  | ||||||
| #include <Grid/Hadrons/Global.hpp> |  | ||||||
| #include <Grid/Hadrons/Module.hpp> |  | ||||||
| #include <Grid/Hadrons/ModuleFactory.hpp> |  | ||||||
|  |  | ||||||
| BEGIN_HADRONS_NAMESPACE |  | ||||||
|  |  | ||||||
| /****************************************************************************** |  | ||||||
|  *                             Random gauge                                   * |  | ||||||
|  ******************************************************************************/ |  | ||||||
| BEGIN_MODULE_NAMESPACE(MGauge) |  | ||||||
|  |  | ||||||
| class TRandom: public Module<NoPar> |  | ||||||
| { |  | ||||||
| public: |  | ||||||
|     // constructor |  | ||||||
|     TRandom(const std::string name); |  | ||||||
|     // destructor |  | ||||||
|     virtual ~TRandom(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(Random, TRandom, MGauge); |  | ||||||
|  |  | ||||||
| END_MODULE_NAMESPACE |  | ||||||
|  |  | ||||||
| END_HADRONS_NAMESPACE |  | ||||||
|  |  | ||||||
| #endif // Hadrons_MGauge_Random_hpp_ |  | ||||||
| @@ -1,84 +0,0 @@ | |||||||
| /************************************************************************************* |  | ||||||
|  |  | ||||||
| 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); |  | ||||||
| } |  | ||||||
| @@ -1,76 +0,0 @@ | |||||||
| /************************************************************************************* |  | ||||||
|  |  | ||||||
| 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_ |  | ||||||
| @@ -1,69 +0,0 @@ | |||||||
| /************************************************************************************* |  | ||||||
|  |  | ||||||
| Grid physics library, www.github.com/paboyle/Grid  |  | ||||||
|  |  | ||||||
| Source file: extras/Hadrons/Modules/MGauge/Unit.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/Unit.hpp> |  | ||||||
|  |  | ||||||
| using namespace Grid; |  | ||||||
| using namespace Hadrons; |  | ||||||
| using namespace MGauge; |  | ||||||
|  |  | ||||||
| /****************************************************************************** |  | ||||||
| *                            TUnit implementation                             * |  | ||||||
| ******************************************************************************/ |  | ||||||
| // constructor ///////////////////////////////////////////////////////////////// |  | ||||||
| TUnit::TUnit(const std::string name) |  | ||||||
| : Module<NoPar>(name) |  | ||||||
| {} |  | ||||||
|  |  | ||||||
| // dependencies/products /////////////////////////////////////////////////////// |  | ||||||
| std::vector<std::string> TUnit::getInput(void) |  | ||||||
| { |  | ||||||
|     return std::vector<std::string>(); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| std::vector<std::string> TUnit::getOutput(void) |  | ||||||
| { |  | ||||||
|     std::vector<std::string> out = {getName()}; |  | ||||||
|      |  | ||||||
|     return out; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // setup /////////////////////////////////////////////////////////////////////// |  | ||||||
| void TUnit::setup(void) |  | ||||||
| { |  | ||||||
|     envCreateLat(LatticeGaugeField, getName()); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // execution /////////////////////////////////////////////////////////////////// |  | ||||||
| void TUnit::execute(void) |  | ||||||
| { |  | ||||||
|     LOG(Message) << "Creating unit gauge configuration" << std::endl; |  | ||||||
|      |  | ||||||
|     auto &U = envGet(LatticeGaugeField, getName()); |  | ||||||
|     SU3::ColdConfiguration(*env().get4dRng(), U); |  | ||||||
| } |  | ||||||
| @@ -1,66 +0,0 @@ | |||||||
| /************************************************************************************* |  | ||||||
|  |  | ||||||
| Grid physics library, www.github.com/paboyle/Grid  |  | ||||||
|  |  | ||||||
| Source file: extras/Hadrons/Modules/MGauge/Unit.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_Unit_hpp_ |  | ||||||
| #define Hadrons_MGauge_Unit_hpp_ |  | ||||||
|  |  | ||||||
| #include <Grid/Hadrons/Global.hpp> |  | ||||||
| #include <Grid/Hadrons/Module.hpp> |  | ||||||
| #include <Grid/Hadrons/ModuleFactory.hpp> |  | ||||||
|  |  | ||||||
| BEGIN_HADRONS_NAMESPACE |  | ||||||
|  |  | ||||||
| /****************************************************************************** |  | ||||||
|  *                              Unit gauge                                    * |  | ||||||
|  ******************************************************************************/ |  | ||||||
| BEGIN_MODULE_NAMESPACE(MGauge) |  | ||||||
|  |  | ||||||
| class TUnit: public Module<NoPar> |  | ||||||
| { |  | ||||||
| public: |  | ||||||
|     // constructor |  | ||||||
|     TUnit(const std::string name); |  | ||||||
|     // destructor |  | ||||||
|     virtual ~TUnit(void) = default; |  | ||||||
|     // dependencies/products |  | ||||||
|     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(Unit, TUnit, MGauge); |  | ||||||
|  |  | ||||||
| END_MODULE_NAMESPACE |  | ||||||
|  |  | ||||||
| END_HADRONS_NAMESPACE |  | ||||||
|  |  | ||||||
| #endif // Hadrons_MGauge_Unit_hpp_ |  | ||||||
| @@ -1,140 +0,0 @@ | |||||||
| /************************************************************************************* |  | ||||||
|  |  | ||||||
| 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_ |  | ||||||
| @@ -1,76 +0,0 @@ | |||||||
| /************************************************************************************* |  | ||||||
|  |  | ||||||
| Grid physics library, www.github.com/paboyle/Grid  |  | ||||||
|  |  | ||||||
| Source file: extras/Hadrons/Modules/MIO/LoadNersc.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/MIO/LoadNersc.hpp> |  | ||||||
|  |  | ||||||
| using namespace Grid; |  | ||||||
| using namespace Hadrons; |  | ||||||
| using namespace MIO; |  | ||||||
|  |  | ||||||
| /****************************************************************************** |  | ||||||
| *                       TLoadNersc implementation                             * |  | ||||||
| ******************************************************************************/ |  | ||||||
| // constructor ///////////////////////////////////////////////////////////////// |  | ||||||
| TLoadNersc::TLoadNersc(const std::string name) |  | ||||||
| : Module<LoadNerscPar>(name) |  | ||||||
| {} |  | ||||||
|  |  | ||||||
| // dependencies/products /////////////////////////////////////////////////////// |  | ||||||
| std::vector<std::string> TLoadNersc::getInput(void) |  | ||||||
| { |  | ||||||
|     std::vector<std::string> in; |  | ||||||
|      |  | ||||||
|     return in; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| std::vector<std::string> TLoadNersc::getOutput(void) |  | ||||||
| { |  | ||||||
|     std::vector<std::string> out = {getName()}; |  | ||||||
|      |  | ||||||
|     return out; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // setup /////////////////////////////////////////////////////////////////////// |  | ||||||
| void TLoadNersc::setup(void) |  | ||||||
| { |  | ||||||
|     envCreateLat(LatticeGaugeField, getName()); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // execution /////////////////////////////////////////////////////////////////// |  | ||||||
| void TLoadNersc::execute(void) |  | ||||||
| { |  | ||||||
|     FieldMetaData header; |  | ||||||
|     std::string   fileName = par().file + "." |  | ||||||
|                              + std::to_string(vm().getTrajectory()); |  | ||||||
|     LOG(Message) << "Loading NERSC configuration from file '" << fileName |  | ||||||
|                  << "'" << std::endl; |  | ||||||
|  |  | ||||||
|     auto &U = envGet(LatticeGaugeField, getName()); |  | ||||||
|     NerscIO::readConfiguration(U, header, fileName); |  | ||||||
|     LOG(Message) << "NERSC header:" << std::endl; |  | ||||||
|     dump_meta_data(header, LOG(Message)); |  | ||||||
| } |  | ||||||
| @@ -1,71 +0,0 @@ | |||||||
| /************************************************************************************* |  | ||||||
|  |  | ||||||
| Grid physics library, www.github.com/paboyle/Grid  |  | ||||||
|  |  | ||||||
| Source file: extras/Hadrons/Modules/MIO/LoadNersc.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_LoadNersc_hpp_ |  | ||||||
| #define Hadrons_MIO_LoadNersc_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(MIO) |  | ||||||
|  |  | ||||||
| class LoadNerscPar: Serializable |  | ||||||
| { |  | ||||||
| public: |  | ||||||
|     GRID_SERIALIZABLE_CLASS_MEMBERS(LoadNerscPar, |  | ||||||
|                                     std::string, file); |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| class TLoadNersc: public Module<LoadNerscPar> |  | ||||||
| { |  | ||||||
| public: |  | ||||||
|     // constructor |  | ||||||
|     TLoadNersc(const std::string name); |  | ||||||
|     // destructor |  | ||||||
|     virtual ~TLoadNersc(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(LoadNersc, TLoadNersc, MIO); |  | ||||||
|  |  | ||||||
| END_MODULE_NAMESPACE |  | ||||||
|  |  | ||||||
| END_HADRONS_NAMESPACE |  | ||||||
|  |  | ||||||
| #endif // Hadrons_MIO_LoadNersc_hpp_ |  | ||||||
| @@ -1,134 +0,0 @@ | |||||||
| /************************************************************************************* |  | ||||||
|  |  | ||||||
| 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_ |  | ||||||
| @@ -1,249 +0,0 @@ | |||||||
| /************************************************************************************* |  | ||||||
|  |  | ||||||
| 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; |  | ||||||
| } |  | ||||||
| @@ -1,89 +0,0 @@ | |||||||
| /************************************************************************************* |  | ||||||
|  |  | ||||||
| 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_ |  | ||||||
| @@ -1,99 +0,0 @@ | |||||||
| /************************************************************************************* |  | ||||||
|  |  | ||||||
| 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); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| @@ -1,79 +0,0 @@ | |||||||
| /************************************************************************************* |  | ||||||
|  |  | ||||||
| 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_ |  | ||||||
| @@ -1,33 +0,0 @@ | |||||||
| /************************************************************************************* |  | ||||||
|  |  | ||||||
| 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_ |  | ||||||
| @@ -1,146 +0,0 @@ | |||||||
| /************************************************************************************* |  | ||||||
|  |  | ||||||
| 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_ |  | ||||||
| @@ -1,182 +0,0 @@ | |||||||
| /************************************************************************************* |  | ||||||
|  |  | ||||||
| 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_ |  | ||||||
| @@ -1,184 +0,0 @@ | |||||||
| /************************************************************************************* |  | ||||||
|  |  | ||||||
| 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_ |  | ||||||
| @@ -1,155 +0,0 @@ | |||||||
| /************************************************************************************* |  | ||||||
|  |  | ||||||
| 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_ |  | ||||||
| @@ -1,127 +0,0 @@ | |||||||
| /************************************************************************************* |  | ||||||
|  |  | ||||||
| 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_ |  | ||||||
| @@ -1,137 +0,0 @@ | |||||||
| /************************************************************************************* |  | ||||||
|  |  | ||||||
| Grid physics library, www.github.com/paboyle/Grid  |  | ||||||
|  |  | ||||||
| Source file: extras/Hadrons/Modules/MSolver/RBPrecCG.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_MSolver_RBPrecCG_hpp_ |  | ||||||
| #define Hadrons_MSolver_RBPrecCG_hpp_ |  | ||||||
|  |  | ||||||
| #include <Grid/Hadrons/Global.hpp> |  | ||||||
| #include <Grid/Hadrons/Module.hpp> |  | ||||||
| #include <Grid/Hadrons/ModuleFactory.hpp> |  | ||||||
|  |  | ||||||
| BEGIN_HADRONS_NAMESPACE |  | ||||||
|  |  | ||||||
| /****************************************************************************** |  | ||||||
|  *                     Schur red-black preconditioned CG                      * |  | ||||||
|  ******************************************************************************/ |  | ||||||
| BEGIN_MODULE_NAMESPACE(MSolver) |  | ||||||
|  |  | ||||||
| class RBPrecCGPar: Serializable |  | ||||||
| { |  | ||||||
| public: |  | ||||||
|     GRID_SERIALIZABLE_CLASS_MEMBERS(RBPrecCGPar, |  | ||||||
|                                     std::string, action, |  | ||||||
|                                     double     , residual); |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| template <typename FImpl> |  | ||||||
| class TRBPrecCG: public Module<RBPrecCGPar> |  | ||||||
| { |  | ||||||
| public: |  | ||||||
|     FGS_TYPE_ALIASES(FImpl,); |  | ||||||
| public: |  | ||||||
|     // constructor |  | ||||||
|     TRBPrecCG(const std::string name); |  | ||||||
|     // destructor |  | ||||||
|     virtual ~TRBPrecCG(void) = default; |  | ||||||
|     // dependencies/products |  | ||||||
|     virtual std::vector<std::string> getInput(void); |  | ||||||
|     virtual std::vector<std::string> getReference(void); |  | ||||||
|     virtual std::vector<std::string> getOutput(void); |  | ||||||
| protected: |  | ||||||
|     // setup |  | ||||||
|     virtual void setup(void); |  | ||||||
|     // execution |  | ||||||
|     virtual void execute(void); |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| MODULE_REGISTER_NS(RBPrecCG, TRBPrecCG<FIMPL>, MSolver); |  | ||||||
|  |  | ||||||
| /****************************************************************************** |  | ||||||
|  *                      TRBPrecCG template implementation                     * |  | ||||||
|  ******************************************************************************/ |  | ||||||
| // constructor ///////////////////////////////////////////////////////////////// |  | ||||||
| template <typename FImpl> |  | ||||||
| TRBPrecCG<FImpl>::TRBPrecCG(const std::string name) |  | ||||||
| : Module(name) |  | ||||||
| {} |  | ||||||
|  |  | ||||||
| // dependencies/products /////////////////////////////////////////////////////// |  | ||||||
| template <typename FImpl> |  | ||||||
| std::vector<std::string> TRBPrecCG<FImpl>::getInput(void) |  | ||||||
| { |  | ||||||
|     std::vector<std::string> 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> |  | ||||||
| std::vector<std::string> TRBPrecCG<FImpl>::getOutput(void) |  | ||||||
| { |  | ||||||
|     std::vector<std::string> out = {getName()}; |  | ||||||
|      |  | ||||||
|     return out; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // setup /////////////////////////////////////////////////////////////////////// |  | ||||||
| template <typename FImpl> |  | ||||||
| void TRBPrecCG<FImpl>::setup(void) |  | ||||||
| { |  | ||||||
|     LOG(Message) << "setting up Schur red-black preconditioned CG for" |  | ||||||
|                  << " action '" << par().action << "' with residual " |  | ||||||
|                  << par().residual << std::endl; |  | ||||||
|  |  | ||||||
|     auto Ls     = env().getObjectLs(par().action); |  | ||||||
|     auto &mat   = envGet(FMat, par().action); |  | ||||||
|     auto solver = [&mat, this](FermionField &sol, const FermionField &source) |  | ||||||
|     { |  | ||||||
|         ConjugateGradient<FermionField>           cg(par().residual, 10000); |  | ||||||
|         SchurRedBlackDiagMooeeSolve<FermionField> schurSolver(cg); |  | ||||||
|          |  | ||||||
|         schurSolver(mat, source, sol); |  | ||||||
|     }; |  | ||||||
|     envCreate(SolverFn, getName(), Ls, solver); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // execution /////////////////////////////////////////////////////////////////// |  | ||||||
| template <typename FImpl> |  | ||||||
| void TRBPrecCG<FImpl>::execute(void) |  | ||||||
| {} |  | ||||||
|  |  | ||||||
| END_MODULE_NAMESPACE |  | ||||||
|  |  | ||||||
| END_HADRONS_NAMESPACE |  | ||||||
|  |  | ||||||
| #endif // Hadrons_MSolver_RBPrecCG_hpp_ |  | ||||||
| @@ -1,138 +0,0 @@ | |||||||
| /************************************************************************************* |  | ||||||
|  |  | ||||||
| Grid physics library, www.github.com/paboyle/Grid  |  | ||||||
|  |  | ||||||
| Source file: extras/Hadrons/Modules/MSource/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_MSource_Point_hpp_ |  | ||||||
| #define Hadrons_MSource_Point_hpp_ |  | ||||||
|  |  | ||||||
| #include <Grid/Hadrons/Global.hpp> |  | ||||||
| #include <Grid/Hadrons/Module.hpp> |  | ||||||
| #include <Grid/Hadrons/ModuleFactory.hpp> |  | ||||||
|  |  | ||||||
| BEGIN_HADRONS_NAMESPACE |  | ||||||
|  |  | ||||||
| /* |  | ||||||
|   |  | ||||||
|  Point source |  | ||||||
|  ------------ |  | ||||||
|  * src_x = delta_x,position |  | ||||||
|   |  | ||||||
|  * options: |  | ||||||
|  - position: space-separated integer sequence (e.g. "0 1 1 0") |  | ||||||
|   |  | ||||||
|  */ |  | ||||||
|  |  | ||||||
| /****************************************************************************** |  | ||||||
|  *                                  TPoint                                     * |  | ||||||
|  ******************************************************************************/ |  | ||||||
| BEGIN_MODULE_NAMESPACE(MSource) |  | ||||||
|  |  | ||||||
| class PointPar: Serializable |  | ||||||
| { |  | ||||||
| public: |  | ||||||
|     GRID_SERIALIZABLE_CLASS_MEMBERS(PointPar, |  | ||||||
|                                     std::string, position); |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| template <typename FImpl> |  | ||||||
| class TPoint: public Module<PointPar> |  | ||||||
| { |  | ||||||
| public: |  | ||||||
|     FERM_TYPE_ALIASES(FImpl,); |  | ||||||
| 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); |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| MODULE_REGISTER_NS(Point,       TPoint<FIMPL>,        MSource); |  | ||||||
| MODULE_REGISTER_NS(ScalarPoint, TPoint<ScalarImplCR>, MSource); |  | ||||||
|  |  | ||||||
| /****************************************************************************** |  | ||||||
|  *                       TPoint template implementation                       * |  | ||||||
|  ******************************************************************************/ |  | ||||||
| // constructor ///////////////////////////////////////////////////////////////// |  | ||||||
| template <typename FImpl> |  | ||||||
| TPoint<FImpl>::TPoint(const std::string name) |  | ||||||
| : Module<PointPar>(name) |  | ||||||
| {} |  | ||||||
|  |  | ||||||
| // 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) |  | ||||||
| { |  | ||||||
|     envCreateLat(PropagatorField, getName()); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // execution /////////////////////////////////////////////////////////////////// |  | ||||||
| template <typename FImpl> |  | ||||||
| void TPoint<FImpl>::execute(void) |  | ||||||
| { |  | ||||||
|     LOG(Message) << "Creating point source at position [" << par().position |  | ||||||
|                 << "]" << std::endl; |  | ||||||
|  |  | ||||||
|     std::vector<int> position = strToVec<int>(par().position); |  | ||||||
|     auto             &src     = envGet(PropagatorField, getName()); |  | ||||||
|     SitePropagator   id; |  | ||||||
|      |  | ||||||
|     id  = 1.; |  | ||||||
|     src = zero; |  | ||||||
|     pokeSite(id, src, position); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| END_MODULE_NAMESPACE |  | ||||||
|  |  | ||||||
| END_HADRONS_NAMESPACE |  | ||||||
|  |  | ||||||
| #endif // Hadrons_MSource_Point_hpp_ |  | ||||||
| @@ -1,160 +0,0 @@ | |||||||
| /************************************************************************************* |  | ||||||
|  |  | ||||||
| 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_ |  | ||||||
| @@ -1,178 +0,0 @@ | |||||||
| /************************************************************************************* |  | ||||||
|  |  | ||||||
| Grid physics library, www.github.com/paboyle/Grid  |  | ||||||
|  |  | ||||||
| Source file: extras/Hadrons/Modules/MSource/SeqGamma.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_SeqGamma_hpp_ |  | ||||||
| #define Hadrons_MSource_SeqGamma_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) * gamma * exp(i x.mom) |  | ||||||
|   |  | ||||||
|  * options: |  | ||||||
|  - q: input propagator (string) |  | ||||||
|  - tA: begin timeslice (integer) |  | ||||||
|  - tB: end timesilce (integer) |  | ||||||
|  - gamma: gamma product to insert (integer) |  | ||||||
|  - mom: momentum insertion, space-separated float sequence (e.g ".1 .2 1. 0.") |  | ||||||
|   |  | ||||||
|  */ |  | ||||||
|  |  | ||||||
| /****************************************************************************** |  | ||||||
|  *                         SeqGamma                                 * |  | ||||||
|  ******************************************************************************/ |  | ||||||
| BEGIN_MODULE_NAMESPACE(MSource) |  | ||||||
|  |  | ||||||
| class SeqGammaPar: Serializable |  | ||||||
| { |  | ||||||
| public: |  | ||||||
|     GRID_SERIALIZABLE_CLASS_MEMBERS(SeqGammaPar, |  | ||||||
|                                     std::string,    q, |  | ||||||
|                                     unsigned int,   tA, |  | ||||||
|                                     unsigned int,   tB, |  | ||||||
|                                     Gamma::Algebra, gamma, |  | ||||||
|                                     std::string,    mom); |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| template <typename FImpl> |  | ||||||
| class TSeqGamma: public Module<SeqGammaPar> |  | ||||||
| { |  | ||||||
| public: |  | ||||||
|     FGS_TYPE_ALIASES(FImpl,); |  | ||||||
| public: |  | ||||||
|     // constructor |  | ||||||
|     TSeqGamma(const std::string name); |  | ||||||
|     // destructor |  | ||||||
|     virtual ~TSeqGamma(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(SeqGamma, TSeqGamma<FIMPL>, MSource); |  | ||||||
|  |  | ||||||
| /****************************************************************************** |  | ||||||
|  *                         TSeqGamma implementation                           * |  | ||||||
|  ******************************************************************************/ |  | ||||||
| // constructor ///////////////////////////////////////////////////////////////// |  | ||||||
| template <typename FImpl> |  | ||||||
| TSeqGamma<FImpl>::TSeqGamma(const std::string name) |  | ||||||
| : Module<SeqGammaPar>(name) |  | ||||||
| , momphName_ (name + "_momph") |  | ||||||
| , tName_ (name + "_t") |  | ||||||
| {} |  | ||||||
|  |  | ||||||
| // dependencies/products /////////////////////////////////////////////////////// |  | ||||||
| template <typename FImpl> |  | ||||||
| std::vector<std::string> TSeqGamma<FImpl>::getInput(void) |  | ||||||
| { |  | ||||||
|     std::vector<std::string> in = {par().q}; |  | ||||||
|      |  | ||||||
|     return in; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| template <typename FImpl> |  | ||||||
| std::vector<std::string> TSeqGamma<FImpl>::getOutput(void) |  | ||||||
| { |  | ||||||
|     std::vector<std::string> out = {getName()}; |  | ||||||
|      |  | ||||||
|     return out; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // setup /////////////////////////////////////////////////////////////////////// |  | ||||||
| template <typename FImpl> |  | ||||||
| void TSeqGamma<FImpl>::setup(void) |  | ||||||
| { |  | ||||||
|     envCreateLat(PropagatorField, getName()); |  | ||||||
|     envCacheLat(Lattice<iScalar<vInteger>>, tName_); |  | ||||||
|     envCacheLat(LatticeComplex, momphName_); |  | ||||||
|     envTmpLat(LatticeComplex, "coor"); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // execution /////////////////////////////////////////////////////////////////// |  | ||||||
| template <typename FImpl> |  | ||||||
| void TSeqGamma<FImpl>::execute(void) |  | ||||||
| { |  | ||||||
|     if (par().tA == par().tB) |  | ||||||
|     { |  | ||||||
|         LOG(Message) << "Generating gamma_" << par().gamma |  | ||||||
|                      << " sequential source at t= " << par().tA << std::endl; |  | ||||||
|     } |  | ||||||
|     else |  | ||||||
|     { |  | ||||||
|         LOG(Message) << "Generating gamma_" << par().gamma |  | ||||||
|                      << " sequential source for " |  | ||||||
|                      << par().tA << " <= t <= " << par().tB << std::endl; |  | ||||||
|     } |  | ||||||
|     auto  &src = envGet(PropagatorField, getName()); |  | ||||||
|     auto  &q   = envGet(PropagatorField, par().q); |  | ||||||
|     auto  &ph  = envGet(LatticeComplex, momphName_); |  | ||||||
|     auto  &t   = envGet(Lattice<iScalar<vInteger>>, tName_); |  | ||||||
|     Gamma g(par().gamma); |  | ||||||
|      |  | ||||||
|     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 = where((t >= par().tA) and (t <= par().tB), ph*(g*q), 0.*q); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| END_MODULE_NAMESPACE |  | ||||||
|  |  | ||||||
| END_HADRONS_NAMESPACE |  | ||||||
|  |  | ||||||
| #endif // Hadrons_MSource_SeqGamma_hpp_ |  | ||||||
| @@ -1,161 +0,0 @@ | |||||||
| /************************************************************************************* |  | ||||||
|  |  | ||||||
| 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_ |  | ||||||
| @@ -1,163 +0,0 @@ | |||||||
| /************************************************************************************* |  | ||||||
|  |  | ||||||
| Grid physics library, www.github.com/paboyle/Grid  |  | ||||||
|  |  | ||||||
| Source file: extras/Hadrons/Modules/MSource/Z2.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_MSource_Z2_hpp_ |  | ||||||
| #define Hadrons_MSource_Z2_hpp_ |  | ||||||
|  |  | ||||||
| #include <Grid/Hadrons/Global.hpp> |  | ||||||
| #include <Grid/Hadrons/Module.hpp> |  | ||||||
| #include <Grid/Hadrons/ModuleFactory.hpp> |  | ||||||
|  |  | ||||||
| BEGIN_HADRONS_NAMESPACE |  | ||||||
|  |  | ||||||
| /* |  | ||||||
|   |  | ||||||
|  Z_2 stochastic source |  | ||||||
|  ----------------------------- |  | ||||||
|  * src_x = eta_x * theta(x_3 - tA) * theta(tB - x_3) |  | ||||||
|   |  | ||||||
|  the eta_x are independent uniform random numbers in {+/- 1 +/- i} |  | ||||||
|   |  | ||||||
|  * options: |  | ||||||
|  - tA: begin timeslice (integer) |  | ||||||
|  - tB: end timesilce (integer) |  | ||||||
|   |  | ||||||
|  */ |  | ||||||
|   |  | ||||||
| /****************************************************************************** |  | ||||||
|  *                          Z2 stochastic source                              * |  | ||||||
|  ******************************************************************************/ |  | ||||||
| BEGIN_MODULE_NAMESPACE(MSource) |  | ||||||
|  |  | ||||||
| class Z2Par: Serializable |  | ||||||
| { |  | ||||||
| public: |  | ||||||
|     GRID_SERIALIZABLE_CLASS_MEMBERS(Z2Par, |  | ||||||
|                                     unsigned int, tA, |  | ||||||
|                                     unsigned int, tB); |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| template <typename FImpl> |  | ||||||
| class TZ2: public Module<Z2Par> |  | ||||||
| { |  | ||||||
| public: |  | ||||||
|     FERM_TYPE_ALIASES(FImpl,); |  | ||||||
| public: |  | ||||||
|     // constructor |  | ||||||
|     TZ2(const std::string name); |  | ||||||
|     // destructor |  | ||||||
|     virtual ~TZ2(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        hasT_{false}; |  | ||||||
|     std::string tName_; |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| MODULE_REGISTER_NS(Z2,       TZ2<FIMPL>,        MSource); |  | ||||||
| MODULE_REGISTER_NS(ScalarZ2, TZ2<ScalarImplCR>, MSource); |  | ||||||
|  |  | ||||||
| /****************************************************************************** |  | ||||||
|  *                       TZ2 template implementation                          * |  | ||||||
|  ******************************************************************************/ |  | ||||||
| // constructor ///////////////////////////////////////////////////////////////// |  | ||||||
| template <typename FImpl> |  | ||||||
| TZ2<FImpl>::TZ2(const std::string name) |  | ||||||
| : Module<Z2Par>(name) |  | ||||||
| , tName_ (name + "_t") |  | ||||||
| {} |  | ||||||
|  |  | ||||||
| // dependencies/products /////////////////////////////////////////////////////// |  | ||||||
| template <typename FImpl> |  | ||||||
| std::vector<std::string> TZ2<FImpl>::getInput(void) |  | ||||||
| { |  | ||||||
|     std::vector<std::string> in; |  | ||||||
|      |  | ||||||
|     return in; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| template <typename FImpl> |  | ||||||
| std::vector<std::string> TZ2<FImpl>::getOutput(void) |  | ||||||
| { |  | ||||||
|     std::vector<std::string> out = {getName()}; |  | ||||||
|      |  | ||||||
|     return out; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // setup /////////////////////////////////////////////////////////////////////// |  | ||||||
| template <typename FImpl> |  | ||||||
| void TZ2<FImpl>::setup(void) |  | ||||||
| { |  | ||||||
|     envCreateLat(PropagatorField, getName()); |  | ||||||
|     envCacheLat(Lattice<iScalar<vInteger>>, tName_); |  | ||||||
|     envTmpLat(LatticeComplex, "eta"); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // execution /////////////////////////////////////////////////////////////////// |  | ||||||
| template <typename FImpl> |  | ||||||
| void TZ2<FImpl>::execute(void) |  | ||||||
| { |  | ||||||
|     if (par().tA == par().tB) |  | ||||||
|     { |  | ||||||
|         LOG(Message) << "Generating Z_2 wall source at t= " << par().tA |  | ||||||
|                      << std::endl; |  | ||||||
|     } |  | ||||||
|     else |  | ||||||
|     { |  | ||||||
|         LOG(Message) << "Generating Z_2 band for " << par().tA << " <= t <= " |  | ||||||
|                      << par().tB << std::endl; |  | ||||||
|     } |  | ||||||
|      |  | ||||||
|     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); |  | ||||||
|     eta = (2.*eta - shift)*(1./::sqrt(2.)); |  | ||||||
|     eta = where((t >= par().tA) and (t <= par().tB), eta, 0.*eta); |  | ||||||
|     src = 1.; |  | ||||||
|     src = src*eta; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| END_MODULE_NAMESPACE |  | ||||||
|  |  | ||||||
| END_HADRONS_NAMESPACE |  | ||||||
|  |  | ||||||
| #endif // Hadrons_MSource_Z2_hpp_ |  | ||||||
| @@ -1,186 +0,0 @@ | |||||||
| /************************************************************************************* |  | ||||||
|  |  | ||||||
| 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_ |  | ||||||
| @@ -1,150 +0,0 @@ | |||||||
| /************************************************************************************* |  | ||||||
|  |  | ||||||
| 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,39 +0,0 @@ | |||||||
| #include <Grid/Hadrons/Modules/___FILEBASENAME___.hpp> |  | ||||||
|  |  | ||||||
| using namespace Grid; |  | ||||||
| using namespace Hadrons; |  | ||||||
|  |  | ||||||
| /****************************************************************************** |  | ||||||
| *                  T___FILEBASENAME___ implementation                             * |  | ||||||
| ******************************************************************************/ |  | ||||||
| // constructor ///////////////////////////////////////////////////////////////// |  | ||||||
| T___FILEBASENAME___::T___FILEBASENAME___(const std::string name) |  | ||||||
| : Module<___FILEBASENAME___Par>(name) |  | ||||||
| {} |  | ||||||
|  |  | ||||||
| // dependencies/products /////////////////////////////////////////////////////// |  | ||||||
| std::vector<std::string> T___FILEBASENAME___::getInput(void) |  | ||||||
| { |  | ||||||
|     std::vector<std::string> in; |  | ||||||
|      |  | ||||||
|     return in; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| std::vector<std::string> T___FILEBASENAME___::getOutput(void) |  | ||||||
| { |  | ||||||
|     std::vector<std::string> out = {getName()}; |  | ||||||
|      |  | ||||||
|     return out; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // setup /////////////////////////////////////////////////////////////////////// |  | ||||||
| void T___FILEBASENAME___::setup(void) |  | ||||||
| { |  | ||||||
|  |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // execution /////////////////////////////////////////////////////////////////// |  | ||||||
| void T___FILEBASENAME___::execute(void) |  | ||||||
| { |  | ||||||
|  |  | ||||||
| } |  | ||||||
| @@ -1,40 +0,0 @@ | |||||||
| #ifndef Hadrons____FILEBASENAME____hpp_ |  | ||||||
| #define Hadrons____FILEBASENAME____hpp_ |  | ||||||
|  |  | ||||||
| #include <Grid/Hadrons/Global.hpp> |  | ||||||
| #include <Grid/Hadrons/Module.hpp> |  | ||||||
| #include <Grid/Hadrons/ModuleFactory.hpp> |  | ||||||
|  |  | ||||||
| BEGIN_HADRONS_NAMESPACE |  | ||||||
|  |  | ||||||
| /****************************************************************************** |  | ||||||
|  *                         ___FILEBASENAME___                                 * |  | ||||||
|  ******************************************************************************/ |  | ||||||
| class ___FILEBASENAME___Par: Serializable |  | ||||||
| { |  | ||||||
| public: |  | ||||||
|     GRID_SERIALIZABLE_CLASS_MEMBERS(___FILEBASENAME___Par,  |  | ||||||
|                                     unsigned int, i); |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| class T___FILEBASENAME___: public Module<___FILEBASENAME___Par> |  | ||||||
| { |  | ||||||
| public: |  | ||||||
|     // constructor |  | ||||||
|     T___FILEBASENAME___(const std::string name); |  | ||||||
|     // destructor |  | ||||||
|     virtual ~T___FILEBASENAME___(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(___FILEBASENAME___, T___FILEBASENAME___); |  | ||||||
|  |  | ||||||
| END_HADRONS_NAMESPACE |  | ||||||
|  |  | ||||||
| #endif // Hadrons____FILEBASENAME____hpp_ |  | ||||||
| @@ -1,40 +0,0 @@ | |||||||
| #include <Grid/Hadrons/Modules/___NAMESPACE___/___FILEBASENAME___.hpp> |  | ||||||
|  |  | ||||||
| using namespace Grid; |  | ||||||
| using namespace Hadrons; |  | ||||||
| using namespace ___NAMESPACE___; |  | ||||||
|  |  | ||||||
| /****************************************************************************** |  | ||||||
| *                  T___FILEBASENAME___ implementation                             * |  | ||||||
| ******************************************************************************/ |  | ||||||
| // constructor ///////////////////////////////////////////////////////////////// |  | ||||||
| T___FILEBASENAME___::T___FILEBASENAME___(const std::string name) |  | ||||||
| : Module<___FILEBASENAME___Par>(name) |  | ||||||
| {} |  | ||||||
|  |  | ||||||
| // dependencies/products /////////////////////////////////////////////////////// |  | ||||||
| std::vector<std::string> T___FILEBASENAME___::getInput(void) |  | ||||||
| { |  | ||||||
|     std::vector<std::string> in; |  | ||||||
|      |  | ||||||
|     return in; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| std::vector<std::string> T___FILEBASENAME___::getOutput(void) |  | ||||||
| { |  | ||||||
|     std::vector<std::string> out = {getName()}; |  | ||||||
|      |  | ||||||
|     return out; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // setup /////////////////////////////////////////////////////////////////////// |  | ||||||
| void T___FILEBASENAME___::setup(void) |  | ||||||
| { |  | ||||||
|  |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // execution /////////////////////////////////////////////////////////////////// |  | ||||||
| void T___FILEBASENAME___::execute(void) |  | ||||||
| { |  | ||||||
|  |  | ||||||
| } |  | ||||||
| @@ -1,44 +0,0 @@ | |||||||
| #ifndef Hadrons____NAMESPACE_______FILEBASENAME____hpp_ |  | ||||||
| #define Hadrons____NAMESPACE_______FILEBASENAME____hpp_ |  | ||||||
|  |  | ||||||
| #include <Grid/Hadrons/Global.hpp> |  | ||||||
| #include <Grid/Hadrons/Module.hpp> |  | ||||||
| #include <Grid/Hadrons/ModuleFactory.hpp> |  | ||||||
|  |  | ||||||
| BEGIN_HADRONS_NAMESPACE |  | ||||||
|  |  | ||||||
| /****************************************************************************** |  | ||||||
|  *                         ___FILEBASENAME___                                 * |  | ||||||
|  ******************************************************************************/ |  | ||||||
| BEGIN_MODULE_NAMESPACE(___NAMESPACE___) |  | ||||||
|  |  | ||||||
| class ___FILEBASENAME___Par: Serializable |  | ||||||
| { |  | ||||||
| public: |  | ||||||
|     GRID_SERIALIZABLE_CLASS_MEMBERS(___FILEBASENAME___Par, |  | ||||||
|                                     unsigned int, i); |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| class T___FILEBASENAME___: public Module<___FILEBASENAME___Par> |  | ||||||
| { |  | ||||||
| public: |  | ||||||
|     // constructor |  | ||||||
|     T___FILEBASENAME___(const std::string name); |  | ||||||
|     // destructor |  | ||||||
|     virtual ~T___FILEBASENAME___(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(___FILEBASENAME___, T___FILEBASENAME___, ___NAMESPACE___); |  | ||||||
|  |  | ||||||
| END_MODULE_NAMESPACE |  | ||||||
|  |  | ||||||
| END_HADRONS_NAMESPACE |  | ||||||
|  |  | ||||||
| #endif // Hadrons____NAMESPACE_______FILEBASENAME____hpp_ |  | ||||||
| @@ -1,81 +0,0 @@ | |||||||
| #ifndef Hadrons____FILEBASENAME____hpp_ |  | ||||||
| #define Hadrons____FILEBASENAME____hpp_ |  | ||||||
|  |  | ||||||
| #include <Grid/Hadrons/Global.hpp> |  | ||||||
| #include <Grid/Hadrons/Module.hpp> |  | ||||||
| #include <Grid/Hadrons/ModuleFactory.hpp> |  | ||||||
|  |  | ||||||
| BEGIN_HADRONS_NAMESPACE |  | ||||||
|  |  | ||||||
| /****************************************************************************** |  | ||||||
|  *                         ___FILEBASENAME___                                 * |  | ||||||
|  ******************************************************************************/ |  | ||||||
| class ___FILEBASENAME___Par: Serializable |  | ||||||
| { |  | ||||||
| public: |  | ||||||
|     GRID_SERIALIZABLE_CLASS_MEMBERS(___FILEBASENAME___Par, |  | ||||||
|                                     unsigned int, i); |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| template <typename FImpl> |  | ||||||
| class T___FILEBASENAME___: public Module<___FILEBASENAME___Par> |  | ||||||
| { |  | ||||||
| public: |  | ||||||
|     // constructor |  | ||||||
|     T___FILEBASENAME___(const std::string name); |  | ||||||
|     // destructor |  | ||||||
|     virtual ~T___FILEBASENAME___(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(___FILEBASENAME___, T___FILEBASENAME___<FIMPL>); |  | ||||||
|  |  | ||||||
| /****************************************************************************** |  | ||||||
|  *                 T___FILEBASENAME___ implementation                             * |  | ||||||
|  ******************************************************************************/ |  | ||||||
| // constructor ///////////////////////////////////////////////////////////////// |  | ||||||
| template <typename FImpl> |  | ||||||
| T___FILEBASENAME___<FImpl>::T___FILEBASENAME___(const std::string name) |  | ||||||
| : Module<___FILEBASENAME___Par>(name) |  | ||||||
| {} |  | ||||||
|  |  | ||||||
| // dependencies/products /////////////////////////////////////////////////////// |  | ||||||
| template <typename FImpl> |  | ||||||
| std::vector<std::string> T___FILEBASENAME___<FImpl>::getInput(void) |  | ||||||
| { |  | ||||||
|     std::vector<std::string> in; |  | ||||||
|      |  | ||||||
|     return in; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| template <typename FImpl> |  | ||||||
| std::vector<std::string> T___FILEBASENAME___<FImpl>::getOutput(void) |  | ||||||
| { |  | ||||||
|     std::vector<std::string> out = {getName()}; |  | ||||||
|      |  | ||||||
|     return out; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // setup /////////////////////////////////////////////////////////////////////// |  | ||||||
| template <typename FImpl> |  | ||||||
| void T___FILEBASENAME___<FImpl>::setup(void) |  | ||||||
| { |  | ||||||
|      |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // execution /////////////////////////////////////////////////////////////////// |  | ||||||
| template <typename FImpl> |  | ||||||
| void T___FILEBASENAME___<FImpl>::execute(void) |  | ||||||
| { |  | ||||||
|      |  | ||||||
| } |  | ||||||
|  |  | ||||||
| END_HADRONS_NAMESPACE |  | ||||||
|  |  | ||||||
| #endif // Hadrons____FILEBASENAME____hpp_ |  | ||||||
| @@ -1,85 +0,0 @@ | |||||||
| #ifndef Hadrons____NAMESPACE_______FILEBASENAME____hpp_ |  | ||||||
| #define Hadrons____NAMESPACE_______FILEBASENAME____hpp_ |  | ||||||
|  |  | ||||||
| #include <Grid/Hadrons/Global.hpp> |  | ||||||
| #include <Grid/Hadrons/Module.hpp> |  | ||||||
| #include <Grid/Hadrons/ModuleFactory.hpp> |  | ||||||
|  |  | ||||||
| BEGIN_HADRONS_NAMESPACE |  | ||||||
|  |  | ||||||
| /****************************************************************************** |  | ||||||
|  *                         ___FILEBASENAME___                                 * |  | ||||||
|  ******************************************************************************/ |  | ||||||
| BEGIN_MODULE_NAMESPACE(___NAMESPACE___) |  | ||||||
|  |  | ||||||
| class ___FILEBASENAME___Par: Serializable |  | ||||||
| { |  | ||||||
| public: |  | ||||||
|     GRID_SERIALIZABLE_CLASS_MEMBERS(___FILEBASENAME___Par, |  | ||||||
|                                     unsigned int, i); |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| template <typename FImpl> |  | ||||||
| class T___FILEBASENAME___: public Module<___FILEBASENAME___Par> |  | ||||||
| { |  | ||||||
| public: |  | ||||||
|     // constructor |  | ||||||
|     T___FILEBASENAME___(const std::string name); |  | ||||||
|     // destructor |  | ||||||
|     virtual ~T___FILEBASENAME___(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(___FILEBASENAME___, T___FILEBASENAME___<FIMPL>, ___NAMESPACE___); |  | ||||||
|  |  | ||||||
| /****************************************************************************** |  | ||||||
|  *                 T___FILEBASENAME___ implementation                             * |  | ||||||
|  ******************************************************************************/ |  | ||||||
| // constructor ///////////////////////////////////////////////////////////////// |  | ||||||
| template <typename FImpl> |  | ||||||
| T___FILEBASENAME___<FImpl>::T___FILEBASENAME___(const std::string name) |  | ||||||
| : Module<___FILEBASENAME___Par>(name) |  | ||||||
| {} |  | ||||||
|  |  | ||||||
| // dependencies/products /////////////////////////////////////////////////////// |  | ||||||
| template <typename FImpl> |  | ||||||
| std::vector<std::string> T___FILEBASENAME___<FImpl>::getInput(void) |  | ||||||
| { |  | ||||||
|     std::vector<std::string> in; |  | ||||||
|      |  | ||||||
|     return in; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| template <typename FImpl> |  | ||||||
| std::vector<std::string> T___FILEBASENAME___<FImpl>::getOutput(void) |  | ||||||
| { |  | ||||||
|     std::vector<std::string> out = {getName()}; |  | ||||||
|      |  | ||||||
|     return out; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // setup /////////////////////////////////////////////////////////////////////// |  | ||||||
| template <typename FImpl> |  | ||||||
| void T___FILEBASENAME___<FImpl>::setup(void) |  | ||||||
| { |  | ||||||
|      |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // execution /////////////////////////////////////////////////////////////////// |  | ||||||
| template <typename FImpl> |  | ||||||
| void T___FILEBASENAME___<FImpl>::execute(void) |  | ||||||
| { |  | ||||||
|      |  | ||||||
| } |  | ||||||
|  |  | ||||||
| END_MODULE_NAMESPACE |  | ||||||
|  |  | ||||||
| END_HADRONS_NAMESPACE |  | ||||||
|  |  | ||||||
| #endif // Hadrons____NAMESPACE_______FILEBASENAME____hpp_ |  | ||||||
| @@ -1,622 +0,0 @@ | |||||||
| /************************************************************************************* |  | ||||||
|  |  | ||||||
| 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); |  | ||||||
| } |  | ||||||
| @@ -1,207 +0,0 @@ | |||||||
| /************************************************************************************* |  | ||||||
|  |  | ||||||
| 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,31 +0,0 @@ | |||||||
| #!/usr/bin/env bash |  | ||||||
|  |  | ||||||
| if (( $# != 1 && $# != 2)); then |  | ||||||
|     echo "usage: `basename $0` <module name> [<namespace>]" 1>&2 |  | ||||||
|     exit 1 |  | ||||||
| fi |  | ||||||
| NAME=$1 |  | ||||||
| NS=$2 |  | ||||||
|  |  | ||||||
| if (( $# == 1 )); then |  | ||||||
| 	if [ -e "Modules/${NAME}.cc" ] || [ -e "Modules/${NAME}.hpp" ]; then |  | ||||||
| 	    echo "error: files Modules/${NAME}.* already exists" 1>&2 |  | ||||||
| 	    exit 1 |  | ||||||
| 	fi |  | ||||||
| 	sed "s/___FILEBASENAME___/${NAME}/g" Modules/templates/Module.cc.template > Modules/${NAME}.cc |  | ||||||
| 	sed "s/___FILEBASENAME___/${NAME}/g" Modules/templates/Module.hpp.template > Modules/${NAME}.hpp |  | ||||||
| elif (( $# == 2 )); then |  | ||||||
| 	mkdir -p Modules/${NS} |  | ||||||
| 	if [ -e "Modules/${NS}/${NAME}.cc" ] || [ -e "Modules/${NS}/${NAME}.hpp" ]; then |  | ||||||
| 	    echo "error: files Modules/${NS}/${NAME}.* already exists" 1>&2 |  | ||||||
| 	    exit 1 |  | ||||||
| 	fi |  | ||||||
| 	TMPCC=".${NS}.${NAME}.tmp.cc" |  | ||||||
| 	TMPHPP=".${NS}.${NAME}.tmp.hpp" |  | ||||||
| 	sed "s/___FILEBASENAME___/${NAME}/g" Modules/templates/Module_in_NS.cc.template  > ${TMPCC} |  | ||||||
| 	sed "s/___FILEBASENAME___/${NAME}/g" Modules/templates/Module_in_NS.hpp.template > ${TMPHPP} |  | ||||||
| 	sed "s/___NAMESPACE___/${NS}/g" ${TMPCC}  > Modules/${NS}/${NAME}.cc |  | ||||||
| 	sed "s/___NAMESPACE___/${NS}/g" ${TMPHPP} > Modules/${NS}/${NAME}.hpp |  | ||||||
| 	rm -f ${TMPCC} ${TMPHPP} |  | ||||||
| fi |  | ||||||
| ./make_module_list.sh |  | ||||||
| @@ -1,28 +0,0 @@ | |||||||
| #!/usr/bin/env bash |  | ||||||
|  |  | ||||||
| if (( $# != 1 && $# != 2)); then |  | ||||||
|     echo "usage: `basename $0` <module name> [<namespace>]" 1>&2 |  | ||||||
|     exit 1 |  | ||||||
| fi |  | ||||||
| NAME=$1 |  | ||||||
| NS=$2 |  | ||||||
|  |  | ||||||
| if (( $# == 1 )); then |  | ||||||
| 	if [ -e "Modules/${NAME}.cc" ] || [ -e "Modules/${NAME}.hpp" ]; then |  | ||||||
| 	    echo "error: files Modules/${NAME}.* already exists" 1>&2 |  | ||||||
| 	    exit 1 |  | ||||||
| 	fi |  | ||||||
| 	sed "s/___FILEBASENAME___/${NAME}/g" Modules/templates/Module_tmp.hpp.template > Modules/${NAME}.hpp |  | ||||||
| elif (( $# == 2 )); then |  | ||||||
| 	mkdir -p Modules/${NS} |  | ||||||
| 	if [ -e "Modules/${NS}/${NAME}.cc" ] || [ -e "Modules/${NS}/${NAME}.hpp" ]; then |  | ||||||
| 	    echo "error: files Modules/${NS}/${NAME}.* already exists" 1>&2 |  | ||||||
| 	    exit 1 |  | ||||||
| 	fi |  | ||||||
| 	TMPCC=".${NS}.${NAME}.tmp.cc" |  | ||||||
| 	TMPHPP=".${NS}.${NAME}.tmp.hpp" |  | ||||||
| 	sed "s/___FILEBASENAME___/${NAME}/g" Modules/templates/Module_tmp_in_NS.hpp.template > ${TMPHPP} |  | ||||||
| 	sed "s/___NAMESPACE___/${NS}/g" ${TMPHPP} > Modules/${NS}/${NAME}.hpp |  | ||||||
| 	rm -f ${TMPCC} ${TMPHPP} |  | ||||||
| fi |  | ||||||
| ./make_module_list.sh |  | ||||||
| @@ -1,12 +0,0 @@ | |||||||
| #!/usr/bin/env bash |  | ||||||
|  |  | ||||||
| echo 'modules_cc =\' > modules.inc |  | ||||||
| find Modules -name '*.cc' -type f -print | sed 's/^/  /;$q;s/$/ \\/' >> modules.inc |  | ||||||
| echo '' >> modules.inc |  | ||||||
| echo 'modules_hpp =\' >> modules.inc |  | ||||||
| find Modules -name '*.hpp' -type f -print | sed 's/^/  /;$q;s/$/ \\/' >> modules.inc |  | ||||||
| echo '' >> modules.inc |  | ||||||
| rm -f Modules.hpp |  | ||||||
| for f in `find Modules -name '*.hpp'`; do |  | ||||||
| 	echo "#include <Grid/Hadrons/${f}>" >> Modules.hpp |  | ||||||
| done |  | ||||||
| @@ -1,52 +0,0 @@ | |||||||
| modules_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/FundtoHirep.cc \ |  | ||||||
|   Modules/MScalar/FreeProp.cc \ |  | ||||||
|   Modules/MScalar/ChargedProp.cc \ |  | ||||||
|   Modules/MIO/LoadNersc.cc |  | ||||||
|  |  | ||||||
| modules_hpp =\ |  | ||||||
|   Modules/MContraction/Baryon.hpp \ |  | ||||||
|   Modules/MContraction/Meson.hpp \ |  | ||||||
|   Modules/MContraction/WeakHamiltonian.hpp \ |  | ||||||
|   Modules/MContraction/WeakHamiltonianNonEye.hpp \ |  | ||||||
|   Modules/MContraction/DiscLoop.hpp \ |  | ||||||
|   Modules/MContraction/WeakNeutral4ptDisc.hpp \ |  | ||||||
|   Modules/MContraction/Gamma3pt.hpp \ |  | ||||||
|   Modules/MContraction/WardIdentity.hpp \ |  | ||||||
|   Modules/MContraction/WeakHamiltonianEye.hpp \ |  | ||||||
|   Modules/MFermion/GaugeProp.hpp \ |  | ||||||
|   Modules/MSource/SeqGamma.hpp \ |  | ||||||
|   Modules/MSource/Point.hpp \ |  | ||||||
|   Modules/MSource/Wall.hpp \ |  | ||||||
|   Modules/MSource/Z2.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 |  | ||||||
|  |  | ||||||
| @@ -1 +0,0 @@ | |||||||
| SUBDIRS = Hadrons |  | ||||||
| @@ -1,11 +0,0 @@ | |||||||
| #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"); |  | ||||||
| @@ -1,42 +0,0 @@ | |||||||
| #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_ |  | ||||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user